From 14aaa3211dc662664af8d3ccf03c1dd9fc5a4611 Mon Sep 17 00:00:00 2001 From: HF Date: Sun, 3 Jul 2022 22:56:00 +0200 Subject: [PATCH] test deregistering chunks --- src/client.js | 2 +- src/socket/SocketClient.js | 1 + src/socket/SocketServer.js | 89 +++++++++++++++++--------------------- src/ui/ChunkLoader2D.js | 1 - src/ui/ChunkRGB.js | 1 + 5 files changed, 42 insertions(+), 52 deletions(-) diff --git a/src/client.js b/src/client.js index 71e25a5..6d5c5a2 100644 --- a/src/client.js +++ b/src/client.js @@ -141,9 +141,9 @@ document.addEventListener('DOMContentLoaded', () => { let cnt = 0; chunks.forEach((value, key) => { if (curTime > value.timestamp + 300000) { - cnt++; const [zc, xc, yc] = value.cell; if (!renderer.isChunkInView(zc, xc, yc)) { + cnt++; if (value.isBasechunk) { SocketClient.deRegisterChunk([xc, yc]); } diff --git a/src/socket/SocketClient.js b/src/socket/SocketClient.js index eed9296..46a51b2 100644 --- a/src/socket/SocketClient.js +++ b/src/socket/SocketClient.js @@ -69,6 +69,7 @@ class SocketClient extends EventEmitter { if (now - 23000 > this.timeLastSent) { // make sure we send something at least all 25s this.send(Ping.dehydrate()); + this.timeLastSent = now; } } } diff --git a/src/socket/SocketServer.js b/src/socket/SocketServer.js index ed26af0..6e959ae 100644 --- a/src/socket/SocketServer.js +++ b/src/socket/SocketServer.js @@ -145,13 +145,13 @@ class SocketServer { country, ) => { const text = JSON.stringify([name, message, country, channelId, id]); + const clientArray = []; this.wss.clients.forEach((ws) => { - if (ws.readyState === WebSocket.OPEN && ws.user) { - if (chatProvider.userHasChannelAccess(ws.user, channelId)) { - ws.send(text); - } + if (ws.user && chatProvider.userHasChannelAccess(ws.user, channelId)) { + clientArray.push(ws); } }); + SocketServer.broadcastSelected(clientArray, text); }); socketEvents.on('addChatChannel', (userId, channelId, channelArray) => { @@ -219,34 +219,46 @@ class SocketServer { * https://github.com/websockets/ws/issues/617 * @param data */ - broadcast(data) { + static broadcastSelected(clients, data) { + let frames; + if (typeof data === 'string') { - this.wss.clients.forEach((ws) => { - if (ws.readyState === WebSocket.OPEN) { - ws.send(data); - } + frames = WebSocket.Sender.frame(Buffer.from(data), { + readOnly: false, + mask: false, + rsv1: false, + opcode: 1, + fin: true, }); } else { - const frame = WebSocket.Sender.frame(data, { - readOnly: true, + frames = WebSocket.Sender.frame(data, { + readOnly: false, mask: false, rsv1: false, opcode: 2, fin: true, }); - this.wss.clients.forEach((ws) => { - if (ws.readyState === WebSocket.OPEN) { - frame.forEach((buffer) => { - try { - // eslint-disable-next-line no-underscore-dangle - ws._socket.write(buffer); - } catch (error) { - logger.error(`WebSocket broadcast error: ${error.message}`); - } - }); - } - }); } + + return clients.map((ws) => new Promise((resolve) => { + if (ws.readyState === WebSocket.OPEN) { + // eslint-disable-next-line no-underscore-dangle + ws._sender.sendFrame(frames, (err) => { + if (err) { + logger.error(`WebSocket broadcast error: ${err.message}`); + } + }); + } + resolve(); + })); + } + + broadcast(data) { + const clientArray = []; + this.wss.clients.forEach((ws) => { + clientArray.push(ws); + }); + SocketServer.broadcastSelected(clientArray, data); } /* @@ -305,34 +317,11 @@ class SocketServer { } broadcastPixelBuffer(canvasId: number, chunkid, data: Buffer) { - const frame = WebSocket.Sender.frame(data, { - readOnly: true, - mask: false, - rsv1: false, - opcode: 2, - fin: true, - }); if (this.CHUNK_CLIENTS.has(chunkid)) { - const clients = this.CHUNK_CLIENTS.get(chunkid); - clients.forEach((client) => { - if (client.readyState === WebSocket.OPEN - // canvasId can be number or string, caused by - // js disctionaries not being able to have numbers as keys - // eslint-disable-next-line eqeqeq - && client.canvasId == canvasId - ) { - frame.forEach((buffer) => { - try { - // eslint-disable-next-line no-underscore-dangle - client._socket.write(buffer); - } catch (error) { - logger.error( - `WebSocket broadcast pixelbuffer error: ${error.message}`, - ); - } - }); - } - }); + const clients = this.CHUNK_CLIENTS.get(chunkid) + // eslint-disable-next-line eqeqeq + .filter((ws) => ws.canvasId == canvasId); + SocketServer.broadcastSelected(clients, data); } } diff --git a/src/ui/ChunkLoader2D.js b/src/ui/ChunkLoader2D.js index 40d8869..3fa14f1 100644 --- a/src/ui/ChunkLoader2D.js +++ b/src/ui/ChunkLoader2D.js @@ -278,7 +278,6 @@ class ChunkLoader { async fetchBaseChunk(zoom, cx, cy, chunkRGB) { const center = [zoom, cx, cy]; this.store.dispatch(requestBigChunk(center)); - chunkRGB.isBasechunk = true; try { const url = `chunks/${this.canvasId}/${cx}/${cy}.bmp`; const response = await fetch(url); diff --git a/src/ui/ChunkRGB.js b/src/ui/ChunkRGB.js index 00b1f98..1da4417 100644 --- a/src/ui/ChunkRGB.js +++ b/src/ui/ChunkRGB.js @@ -41,6 +41,7 @@ class ChunkRGB { // from Uint8Array fromBuffer(chunkBuffer) { + this.isBasechunk = true; const imageData = new ImageData(TILE_SIZE, TILE_SIZE); const imageView = new Uint32Array(imageData.data.buffer); const { abgr } = this.palette;