1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import db from "@server/db";
- import { MessageHandler } from "../ws";
- import { clients, Newt } from "@server/db/schema";
- import { eq } from "drizzle-orm";
- import logger from "@server/logger";
- interface PeerBandwidth {
- publicKey: string;
- bytesIn: number;
- bytesOut: number;
- }
- export const handleReceiveBandwidthMessage: MessageHandler = async (context) => {
- const { message, client, sendToClient } = context;
- const newt = client as Newt;
- const bandwidthData: PeerBandwidth[] = message.data;
- if (!Array.isArray(bandwidthData)) {
- throw new Error("Invalid bandwidth data");
- }
- await db.transaction(async (trx) => {
- for (const peer of bandwidthData) {
- const { publicKey, bytesIn, bytesOut } = peer;
- // Find the site by public key
- const [client] = await trx
- .select()
- .from(clients)
- .where(eq(clients.pubKey, publicKey))
- .limit(1);
- if (!client) {
- continue;
- }
- let online = client.online;
- // if the bandwidth for the site is > 0 then set it to online. if it has been less than 0 (no update) for 5 minutes then set it to offline
- if (bytesIn > 0 || bytesOut > 0) {
- online = true;
- } else if (client.lastBandwidthUpdate) {
- const lastBandwidthUpdate = new Date(
- client.lastBandwidthUpdate
- );
- const currentTime = new Date();
- const diff =
- currentTime.getTime() - lastBandwidthUpdate.getTime();
- if (diff < 300000) {
- online = false;
- }
- }
- // Update the site's bandwidth usage
- await trx
- .update(clients)
- .set({
- megabytesOut: (client.megabytesIn || 0) + bytesIn,
- megabytesIn: (client.megabytesOut || 0) + bytesOut,
- lastBandwidthUpdate: new Date().toISOString(),
- online
- })
- .where(eq(clients.clientId, client.clientId));
- }
- });
- logger.info("Handling register olm message!");
- };
|