From d9f395fc73b0b6bc5311fccc774daa93dad10662 Mon Sep 17 00:00:00 2001 From: Vipin Date: Fri, 5 Jun 2026 18:09:05 +0530 Subject: [PATCH] feat(socket.io): allow passing a Set to to(), in(), and except() --- packages/socket.io/lib/broadcast-operator.ts | 20 +++++------ packages/socket.io/lib/index.ts | 10 +++--- packages/socket.io/lib/namespace.ts | 10 +++--- packages/socket.io/lib/socket.ts | 10 +++--- packages/socket.io/test/messaging-many.ts | 35 ++++++++++++++++++++ 5 files changed, 60 insertions(+), 25 deletions(-) diff --git a/packages/socket.io/lib/broadcast-operator.ts b/packages/socket.io/lib/broadcast-operator.ts index ca7eccf2f4..bcdd1ba87d 100644 --- a/packages/socket.io/lib/broadcast-operator.ts +++ b/packages/socket.io/lib/broadcast-operator.ts @@ -45,9 +45,9 @@ export class BroadcastOperator * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public to(room: Room | Room[]) { + public to(room: Room | Room[] | Set) { const rooms = new Set(this.rooms); - if (Array.isArray(room)) { + if (room instanceof Set || Array.isArray(room)) { room.forEach((r) => rooms.add(r)); } else { rooms.add(room); @@ -70,7 +70,7 @@ export class BroadcastOperator * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public in(room: Room | Room[]) { + public in(room: Room | Room[] | Set) { return this.to(room); } @@ -90,9 +90,9 @@ export class BroadcastOperator * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public except(room: Room | Room[]) { + public except(room: Room | Room[] | Set) { const exceptRooms = new Set(this.exceptRooms); - if (Array.isArray(room)) { + if (room instanceof Set || Array.isArray(room)) { room.forEach((r) => exceptRooms.add(r)); } else { exceptRooms.add(room); @@ -413,14 +413,14 @@ export class BroadcastOperator * * @param room - a room, or an array of rooms */ - public socketsJoin(room: Room | Room[]): void { + public socketsJoin(room: Room | Room[] | Set): void { this.adapter.addSockets( { rooms: this.rooms, except: this.exceptRooms, flags: this.flags, }, - Array.isArray(room) ? room : [room], + room instanceof Set ? [...room] : Array.isArray(room) ? room : [room], ); } @@ -438,14 +438,14 @@ export class BroadcastOperator * * @param room - a room, or an array of rooms */ - public socketsLeave(room: Room | Room[]): void { + public socketsLeave(room: Room | Room[] | Set): void { this.adapter.delSockets( { rooms: this.rooms, except: this.exceptRooms, flags: this.flags, }, - Array.isArray(room) ? room : [room], + room instanceof Set ? [...room] : Array.isArray(room) ? room : [room], ); } @@ -554,7 +554,7 @@ export class RemoteSocket * * @param {String|Array} room - room or array of rooms */ - public join(room: Room | Room[]): void { + public join(room: Room | Room[] | Set): void { return this.operator.socketsJoin(room); } diff --git a/packages/socket.io/lib/index.ts b/packages/socket.io/lib/index.ts index 0cebc92544..8e216f4379 100644 --- a/packages/socket.io/lib/index.ts +++ b/packages/socket.io/lib/index.ts @@ -887,7 +887,7 @@ export class Server< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public to(room: Room | Room[]) { + public to(room: Room | Room[] | Set) { return this.sockets.to(room); } @@ -901,7 +901,7 @@ export class Server< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public in(room: Room | Room[]) { + public in(room: Room | Room[] | Set) { return this.sockets.in(room); } @@ -921,7 +921,7 @@ export class Server< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public except(room: Room | Room[]) { + public except(room: Room | Room[] | Set) { return this.sockets.except(room); } @@ -1129,7 +1129,7 @@ export class Server< * * @param room - a room, or an array of rooms */ - public socketsJoin(room: Room | Room[]) { + public socketsJoin(room: Room | Room[] | Set) { return this.sockets.socketsJoin(room); } @@ -1147,7 +1147,7 @@ export class Server< * * @param room - a room, or an array of rooms */ - public socketsLeave(room: Room | Room[]) { + public socketsLeave(room: Room | Room[] | Set) { return this.sockets.socketsLeave(room); } diff --git a/packages/socket.io/lib/namespace.ts b/packages/socket.io/lib/namespace.ts index 72df7301e3..2de659db0c 100644 --- a/packages/socket.io/lib/namespace.ts +++ b/packages/socket.io/lib/namespace.ts @@ -275,7 +275,7 @@ export class Namespace< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public to(room: Room | Room[]) { + public to(room: Room | Room[] | Set) { return new BroadcastOperator< DecorateAcknowledgementsWithMultipleResponses, SocketData @@ -294,7 +294,7 @@ export class Namespace< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public in(room: Room | Room[]) { + public in(room: Room | Room[] | Set) { return new BroadcastOperator< DecorateAcknowledgementsWithMultipleResponses, SocketData @@ -319,7 +319,7 @@ export class Namespace< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public except(room: Room | Room[]) { + public except(room: Room | Room[] | Set) { return new BroadcastOperator< DecorateAcknowledgementsWithMultipleResponses, SocketData @@ -735,7 +735,7 @@ export class Namespace< * * @param room - a room, or an array of rooms */ - public socketsJoin(room: Room | Room[]) { + public socketsJoin(room: Room | Room[] | Set) { return new BroadcastOperator( this.adapter, ).socketsJoin(room); @@ -757,7 +757,7 @@ export class Namespace< * * @param room - a room, or an array of rooms */ - public socketsLeave(room: Room | Room[]) { + public socketsLeave(room: Room | Room[] | Set) { return new BroadcastOperator( this.adapter, ).socketsLeave(room); diff --git a/packages/socket.io/lib/socket.ts b/packages/socket.io/lib/socket.ts index 55131fcee7..2d702addfc 100644 --- a/packages/socket.io/lib/socket.ts +++ b/packages/socket.io/lib/socket.ts @@ -352,7 +352,7 @@ export class Socket< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public to(room: Room | Room[]) { + public to(room: Room | Room[] | Set) { return this.newBroadcastOperator().to(room); } @@ -368,7 +368,7 @@ export class Socket< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public in(room: Room | Room[]) { + public in(room: Room | Room[] | Set) { return this.newBroadcastOperator().in(room); } @@ -391,7 +391,7 @@ export class Socket< * @param room - a room, or an array of rooms * @return a new {@link BroadcastOperator} instance for chaining */ - public except(room: Room | Room[]) { + public except(room: Room | Room[] | Set) { return this.newBroadcastOperator().except(room); } @@ -458,12 +458,12 @@ export class Socket< * @param {String|Array} rooms - room or array of rooms * @return a Promise or nothing, depending on the adapter */ - public join(rooms: Room | Array): Promise | void { + public join(rooms: Room | Array | Set): Promise | void { debug("join room %s", rooms); return this.adapter.addAll( this.id, - new Set(Array.isArray(rooms) ? rooms : [rooms]), + new Set(rooms instanceof Set ? rooms : Array.isArray(rooms) ? rooms : [rooms]), ); } diff --git a/packages/socket.io/test/messaging-many.ts b/packages/socket.io/test/messaging-many.ts index 87407a2f82..9c586e8137 100644 --- a/packages/socket.io/test/messaging-many.ts +++ b/packages/socket.io/test/messaging-many.ts @@ -170,6 +170,41 @@ describe("messaging many", () => { }); }); + it("emits to rooms with a Set", (done) => { + const io = new Server(0); + const socket1 = createClient(io, "/", { multiplex: false }); + const socket2 = createClient(io, "/", { multiplex: false }); + + const partialDone = createPartialDone( + 2, + successFn(done, io, socket1, socket2), + ); + + socket2.on("a", () => { + done(new Error("not")); + }); + socket1.on("a", partialDone); + socket2.on("b", partialDone); + + socket1.emit("join", "woot"); + socket1.emit("join", "test"); + socket2.emit("join", "third", () => { + socket2.emit("emit"); + }); + + io.on("connection", (socket) => { + socket.on("join", (room, fn) => { + socket.join(room); + fn && fn(); + }); + + socket.on("emit", () => { + io.in(new Set(["woot", "test"])).emit("a"); + io.in(new Set(["third"])).emit("b"); + }); + }); + }); + it("broadcasts to rooms", (done) => { const io = new Server(0); const socket1 = createClient(io, "/", { multiplex: false });