From 78674714b110c5cd52dbb87dd83127b7725f0de8 Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Sun, 22 Mar 2026 02:41:52 -0400 Subject: [PATCH] Enhance WebSocket keep-alive mechanism to include bridge connections and handle stale connections --- web/server/server.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/web/server/server.js b/web/server/server.js index dee8df0..7c4715c 100644 --- a/web/server/server.js +++ b/web/server/server.js @@ -744,6 +744,7 @@ wss.on('connection', (ws, req) => { if (url.startsWith('/ws/bridge')) { console.log('🌉 CC:Tweaked bridge connected via WebSocket'); bridgeClients.add(ws); + ws.isAlive = true; // Notify web clients that the bridge is now connected broadcastToClients({ @@ -789,6 +790,8 @@ wss.on('connection', (ws, req) => { bridgeConnected: bridgeClients.size > 0, }); }); + + ws.on('pong', () => { ws.isAlive = true; }); ws.on('error', (error) => { console.error('❌ Bridge WS error:', error); @@ -859,7 +862,7 @@ wss.on('connection', (ws, req) => { }); // ========== WebSocket Keep-Alive ========== -// Ping all web clients every 25s to keep connections alive through reverse proxies +// Ping all web clients and bridge connections every 25s to keep connections alive const WS_PING_INTERVAL = setInterval(() => { webClients.forEach((ws) => { if (!ws.isAlive) { @@ -869,6 +872,16 @@ const WS_PING_INTERVAL = setInterval(() => { ws.isAlive = false; ws.ping(); }); + bridgeClients.forEach((ws) => { + if (!ws.isAlive) { + console.log('🌉 Bridge connection stale — terminating'); + bridgeClients.delete(ws); + broadcastToClients({ type: 'state_update', bridgeConnected: bridgeClients.size > 0 }); + return ws.terminate(); + } + ws.isAlive = false; + ws.ping(); + }); }, 25000); wss.on('close', () => {