v3: code quality pass, various bug fixes
This commit is contained in:
@@ -3,6 +3,7 @@ import type {
|
||||
Dump,
|
||||
OnlineUser,
|
||||
Playlist,
|
||||
User,
|
||||
} from "../model/interfaces.ts";
|
||||
|
||||
export interface WsClient {
|
||||
@@ -11,6 +12,7 @@ export interface WsClient {
|
||||
username?: string;
|
||||
avatarMime?: string;
|
||||
avatarVersion?: number;
|
||||
pongReceived?: boolean;
|
||||
}
|
||||
|
||||
const clients = new Set<WsClient>();
|
||||
@@ -151,6 +153,12 @@ export function broadcastPlaylistDumpsUpdated(
|
||||
});
|
||||
}
|
||||
|
||||
export function broadcastUserUpdated(user: Omit<User, "passwordHash">): void {
|
||||
for (const client of clients) {
|
||||
send(client.socket, { type: "user_updated", user });
|
||||
}
|
||||
}
|
||||
|
||||
export function broadcastCommentCreated(comment: Comment): void {
|
||||
for (const client of clients) {
|
||||
send(client.socket, { type: "comment_created", comment });
|
||||
@@ -172,7 +180,11 @@ export function broadcastCommentUpdated(comment: Comment): void {
|
||||
}
|
||||
}
|
||||
|
||||
// Keepalive: ping all clients every 30s, remove non-responsive ones
|
||||
export function handleClientPong(client: WsClient): void {
|
||||
client.pongReceived = true;
|
||||
}
|
||||
|
||||
// Keepalive: ping all clients every 30s, disconnect non-responsive ones
|
||||
const PING_INTERVAL = 30_000;
|
||||
|
||||
setInterval(() => {
|
||||
@@ -181,7 +193,13 @@ setInterval(() => {
|
||||
clients.delete(client);
|
||||
continue;
|
||||
}
|
||||
// Disconnect if no pong since last ping (pongReceived starts undefined, skip first cycle)
|
||||
if (client.pongReceived === false) {
|
||||
client.socket.close(1001, "Ping timeout");
|
||||
clients.delete(client);
|
||||
continue;
|
||||
}
|
||||
client.pongReceived = false;
|
||||
send(client.socket, { type: "ping" });
|
||||
// Schedule removal if no pong (tracked via heartbeat flag)
|
||||
}
|
||||
}, PING_INTERVAL);
|
||||
|
||||
Reference in New Issue
Block a user