From 91da10a4de440381b7725bf49aa52926c674dfb9 Mon Sep 17 00:00:00 2001 From: Dmytro Drachov Date: Tue, 9 Nov 2021 02:01:01 +0200 Subject: [PATCH] feat: add broadcast-packet send-socket-packet events --- lib/index.ts | 3 +++ test/index.js | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/lib/index.ts b/lib/index.ts index f9266b9..d69135a 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -133,6 +133,8 @@ export class Adapter extends EventEmitter { }; packet.nsp = this.nsp.name; + this.emit("broadcast-packet", packet, basePacketOpts); + const encodedPackets = this.encoder.encode(packet); const packetOpts = encodedPackets.map(encodedPacket => { @@ -147,6 +149,7 @@ export class Adapter extends EventEmitter { }); this.apply(opts, socket => { + this.emit("send-socket-packet", socket, packet); for (let i = 0; i < encodedPackets.length; i++) { socket.client.writeToEngine(encodedPackets[i], packetOpts[i]); } diff --git a/test/index.js b/test/index.js index f4729c4..d0e5caa 100644 --- a/test/index.js +++ b/test/index.js @@ -230,6 +230,68 @@ describe("socket.io-adapter", () => { adapter.del("s1", "r1"); }); + it("should emit a 'broadcast-packet' event with broadcast method", done => { + const nsp = { + server: { + encoder: { + encode() { + return [Buffer.from([1, 2, 3])]; + } + } + }, + sockets: new Map() + }; + const packet = []; + const adapter = new Adapter(nsp); + adapter.on("broadcast-packet", (p, o) => { + expect(p).to.equal(packet); + expect(o).to.eql({ + preEncoded: true, + volatile: undefined, + compress: undefined + }); + done(); + }); + adapter.broadcast(packet, { rooms: new Set() }); + }); + + it("should emit a 'send-socket-packet' event with broadcast method", done => { + const doneCb = ((c = 2, i = 0) => () => ++i === c && done())(); + function socket(id) { + return [ + id, + { + id, + client: { + writeToEngine(payload, opts) { + expect(payload).to.be.a(Buffer); + } + } + } + ]; + } + const nsp = { + server: { + encoder: { + encode() { + return [Buffer.from([1, 2, 3])]; + } + } + }, + sockets: new Map([socket("s1"), socket("s2")]) + }; + const packet = []; + const adapter = new Adapter(nsp); + adapter.on("send-socket-packet", (s, p) => { + expect(nsp.sockets.get(s.id)).to.equal(s); + expect(p).to.eql(packet); + doneCb(); + }); + adapter.addAll("s1", new Set()); + adapter.addAll("s2", new Set()); + adapter.broadcast(packet, { rooms: new Set() }); + }); + it("should not throw when calling del twice", done => { const adapter = new Adapter({ server: { encoder: null } }); adapter.on("leave-room", (room, sid) => {