From f7df98967989e9a10eaff8b036dc75cb7f544b10 Mon Sep 17 00:00:00 2001 From: Ignas Kiela Date: Tue, 23 May 2023 10:39:42 +0300 Subject: [PATCH] fix: stop sending pings on every pong This resulted in endless ping-pong traffic on the websocket, happening every interval of network latency to the server (e.g. for me, with 40ms latency to my server, it was about every 40ms). On my server this ended up taking about 20% of foundkey's CPU usage. Now, just send pings every 30s, and check if we have received any pong's in last 60 seconds to check that the connection is still alive. Changelog: Fixed --- packages/backend/src/server/api/streaming.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/backend/src/server/api/streaming.ts b/packages/backend/src/server/api/streaming.ts index eefbcc216..5a1c79831 100644 --- a/packages/backend/src/server/api/streaming.ts +++ b/packages/backend/src/server/api/streaming.ts @@ -44,18 +44,21 @@ export const initializeStreamingServer = (server: http.Server): void => { const main = new Connection(socket, ev, user, app); // ping/pong mechanism - let pingTimeout = null; - function startHeartbeat() { - if (pingTimeout) clearTimeout(pingTimeout); - + let pingTimeout: NodeJS.Timeout | null = null; + let disconnectTimeout = setTimeout(() => { + socket.terminate(); + }, 60 * SECOND);; + function sendPing() { socket.ping(); pingTimeout = setTimeout(() => { - socket.terminate(); + sendPing(); }, 30 * SECOND); } - startHeartbeat(); - socket.on('ping', () => { startHeartbeat(); }); - socket.on('pong', () => { startHeartbeat(); }); + function onPong() { + disconnectTimeout.refresh() + } + sendPing(); + socket.on('pong', onPong); // keep user "online" while a stream is connected const intervalId = user ? setInterval(() => { @@ -75,6 +78,7 @@ export const initializeStreamingServer = (server: http.Server): void => { redisClient.off('message', onRedisMessage); if (intervalId) clearInterval(intervalId); if (pingTimeout) clearTimeout(pingTimeout); + if (disconnectTimeout) clearTimeout(disconnectTimeout); }); }); }); -- 2.34.1