Skip to content

Commit fc979d3

Browse files
committed
feat: leave multiple rooms at once
1 parent 5474363 commit fc979d3

File tree

2 files changed

+36
-5
lines changed

2 files changed

+36
-5
lines changed

packages/socket.io/lib/socket.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -476,16 +476,30 @@ export class Socket<
476476
* socket.leave("room1");
477477
*
478478
* // leave multiple rooms
479-
* socket.leave("room1").leave("room2");
479+
* socket.leave(["room1", "room2"]);
480480
* });
481481
*
482-
* @param {String} room
482+
* @param {String|Array} rooms - room or array of rooms
483483
* @return a Promise or nothing, depending on the adapter
484484
*/
485-
public leave(room: string): Promise<void> | void {
486-
debug("leave room %s", room);
485+
public leave(rooms: Room | Array<Room>): Promise<void> | void {
486+
const roomsSet = new Set(Array.isArray(rooms) ? rooms : [rooms]);
487+
const promises: Array<Promise<void>> = [];
488+
489+
roomsSet.forEach((room) => {
490+
debug("leave room %s", room);
491+
const maybePromise = this.adapter.del(this.id, room);
492+
if (
493+
maybePromise &&
494+
typeof (maybePromise as Promise<void>).then === "function"
495+
) {
496+
promises.push(maybePromise as Promise<void>);
497+
}
498+
});
487499

488-
return this.adapter.del(this.id, room);
500+
if (promises.length) {
501+
return Promise.all(promises).then(() => undefined);
502+
}
489503
}
490504

491505
/**

packages/socket.io/test/socket.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -941,6 +941,23 @@ describe("socket", () => {
941941
});
942942
});
943943

944+
it("should leave multiple rooms at once", (done) => {
945+
const io = new Server(0);
946+
const client = createClient(io, "/");
947+
948+
io.on("connection", (socket) => {
949+
Promise.resolve(socket.join(["room1", "room2"]))
950+
.then(() => Promise.resolve(socket.leave(["room1", "room2"])))
951+
.then(() => {
952+
const adapter = io.of("/").adapter;
953+
expect(adapter.rooms.has("room1")).to.be(false);
954+
expect(adapter.rooms.has("room2")).to.be(false);
955+
success(done, io, client);
956+
})
957+
.catch(done);
958+
});
959+
});
960+
944961
describe("onAny", () => {
945962
it("should call listener", (done) => {
946963
const io = new Server(0);

0 commit comments

Comments
 (0)