From 2da82103d22b69a8684b5831517a89e722bf090b Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 16 Nov 2021 15:43:58 +0100 Subject: [PATCH] test: add test for volatile packet with binary See also: https://github.com/socketio/socket.io-adapter/commit/88eee5948aba94f999405239025f29c754a002e2 --- lib/uws.ts | 4 +--- package-lock.json | 6 +++--- package.json | 2 +- test/socket.io.ts | 48 +++++++++++++++++++++++++---------------------- test/uws.ts | 14 ++++++++++++++ 5 files changed, 45 insertions(+), 29 deletions(-) diff --git a/lib/uws.ts b/lib/uws.ts index 7fdde31565..1abc6a0184 100644 --- a/lib/uws.ts +++ b/lib/uws.ts @@ -81,9 +81,7 @@ export function patchAdapter(app /* : TemplatedApp */) { this.apply(opts, (socket) => { if (socket.conn.transport.name !== "websocket") { // classic publish for clients connected with HTTP long-polling - for (let i = 0; i < encodedPackets.length; i++) { - socket.client.writeToEngine(encodedPackets[i], basePacketOpts); - } + socket.client.writeToEngine(encodedPackets, basePacketOpts); } }); }; diff --git a/package-lock.json b/package-lock.json index 0724d4814b..768115e4e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2431,9 +2431,9 @@ "dev": true }, "socket.io-adapter": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz", - "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==" }, "socket.io-client": { "version": "4.3.2", diff --git a/package.json b/package.json index 376a111767..44573a6a63 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "base64id": "~2.0.0", "debug": "~4.3.2", "engine.io": "~6.1.0", - "socket.io-adapter": "~2.3.2", + "socket.io-adapter": "~2.3.3", "socket.io-parser": "~4.0.4" }, "devDependencies": { diff --git a/test/socket.io.ts b/test/socket.io.ts index d9ab53e9c8..f670e2ea4d 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -1453,6 +1453,32 @@ describe("socket.io", () => { }, 200); }); + it("should broadcast only one consecutive volatile event with binary (ws)", (done) => { + const srv = createServer(); + const sio = new Server(srv, { transports: ["websocket"] }); + + let counter = 0; + srv.listen(() => { + sio.on("connection", (s) => { + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(() => { + sio.volatile.emit("ev", Buffer.from([1, 2, 3])); + sio.volatile.emit("ev", Buffer.from([4, 5, 6])); + }, 20); + }); + + const socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", () => { + counter++; + }); + }); + + setTimeout(() => { + expect(counter).to.be(1); + done(); + }, 200); + }); + it("should emit regular events after trying a failed volatile event (polling)", (done) => { const srv = createServer(); const sio = new Server(srv, { transports: ["polling"] }); @@ -2516,28 +2542,6 @@ describe("socket.io", () => { }); }); }); - - it("should pre encode a broadcast packet", (done) => { - const srv = createServer(); - const sio = new Server(srv); - - srv.listen(() => { - const clientSocket = client(srv, { multiplex: false }); - - sio.on("connection", (socket) => { - socket.conn.on("packetCreate", (packet) => { - expect(packet.data).to.eql('2["hello","world"]'); - expect(packet.options.wsPreEncoded).to.eql('42["hello","world"]'); - - clientSocket.close(); - sio.close(); - done(); - }); - - sio.emit("hello", "world"); - }); - }); - }); }); describe("middleware", () => { diff --git a/test/uws.ts b/test/uws.ts index 7a7438a0aa..771f229cbb 100644 --- a/test/uws.ts +++ b/test/uws.ts @@ -103,6 +103,20 @@ describe("socket.io with uWebSocket.js-based engine", () => { io.emit("hello", Buffer.from([1, 2, 3])); }); + it("should broadcast volatile packet with binary content", (done) => { + const partialDone = createPartialDone(done, 3); + + client.on("hello", partialDone); + clientWSOnly.on("hello", partialDone); + clientPollingOnly.on("hello", partialDone); + clientCustomNamespace.on("hello", shouldNotHappen(done)); + + // wait to make sure there are no packets being sent for opening the connection + setTimeout(() => { + io.volatile.emit("hello", Buffer.from([1, 2, 3])); + }, 20); + }); + it("should broadcast in a room", (done) => { const partialDone = createPartialDone(done, 2);