From eee3d6a7ecb78b28eedef6f5df756ae34e2113ad Mon Sep 17 00:00:00 2001 From: HF Date: Sat, 2 Jul 2022 13:24:09 +0200 Subject: [PATCH] add error notice on online counter broadcast --- src/socket/SocketClient.js | 6 +++- src/socket/SocketServer.js | 58 ++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/socket/SocketClient.js b/src/socket/SocketClient.js index 8911bf40..a207273e 100644 --- a/src/socket/SocketClient.js +++ b/src/socket/SocketClient.js @@ -207,11 +207,15 @@ class SocketClient extends EventEmitter { this.emit('pixelUpdate', PixelUpdate.hydrate(data)); break; case PixelReturn.OP_CODE: + /* + * using online counter and pxlReturn as sign-of-life ping + */ + this.timeLastPing = Date.now(); this.emit('pixelReturn', PixelReturn.hydrate(data)); break; case OnlineCounter.OP_CODE: /* - * using online counter as sign-of-life ping + * using online counter and pxlReturn as sign-of-life ping */ this.timeLastPing = Date.now(); this.emit('onlineCounter', OnlineCounter.hydrate(data)); diff --git a/src/socket/SocketServer.js b/src/socket/SocketServer.js index 34eb52ee..95a5b7b5 100644 --- a/src/socket/SocketServer.js +++ b/src/socket/SocketServer.js @@ -361,36 +361,40 @@ class SocketServer { } onlineCounterBroadcast() { - const online = {}; - online.total = ipCounter.amount() || 0; - const ipsPerCanvas = {}; - const it = this.wss.clients.keys(); - let client = it.next(); - while (!client.done) { - const ws = client.value; - if (ws.readyState === WebSocket.OPEN - && ws.user - ) { - const canvasId = ws.canvasId || 0; - const { ip } = ws.user; - // only count unique IPs per canvas - if (!ipsPerCanvas[canvasId]) { - ipsPerCanvas[canvasId] = [ip]; - } else if (ipsPerCanvas[canvasId].includes(ip)) { - client = it.next(); - continue; - } else { - ipsPerCanvas[canvasId].push(ip); + try { + const online = {}; + online.total = ipCounter.amount() || 0; + const ipsPerCanvas = {}; + const it = this.wss.clients.keys(); + let client = it.next(); + while (!client.done) { + const ws = client.value; + if (ws.readyState === WebSocket.OPEN + && ws.user + ) { + const canvasId = ws.canvasId || 0; + const { ip } = ws.user; + // only count unique IPs per canvas + if (!ipsPerCanvas[canvasId]) { + ipsPerCanvas[canvasId] = [ip]; + } else if (ipsPerCanvas[canvasId].includes(ip)) { + client = it.next(); + continue; + } else { + ipsPerCanvas[canvasId].push(ip); + } + //-- + if (!online[canvasId]) { + online[canvasId] = 0; + } + online[canvasId] += 1; } - //-- - if (!online[canvasId]) { - online[canvasId] = 0; - } - online[canvasId] += 1; + client = it.next(); } - client = it.next(); + socketEvents.broadcastOnlineCounter(online); + } catch (err) { + logger.error(`WebSocket online broadcast error: ${err.message}`); } - socketEvents.broadcastOnlineCounter(online); } async onTextMessage(text, ws) {