diff --git a/lib/socket.ts b/lib/socket.ts index c14b9d4fc7..541e15f58b 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -71,7 +71,6 @@ export class Socket extends EventEmitter { public readonly id: SocketId; public readonly handshake: Handshake; - public rooms = {}; public connected: boolean; public disconnected: boolean; @@ -242,24 +241,14 @@ export class Socket extends EventEmitter { * @param {Function} fn - optional, callback * @return {Socket} self */ - public join(rooms, fn?: (err: Error) => void): Socket { + public join(rooms: Room | Array, fn?: (err: Error) => void): Socket { debug("joining room %s", rooms); - if (!Array.isArray(rooms)) { - rooms = [rooms]; - } - rooms = rooms.filter(room => { - return !this.rooms.hasOwnProperty(room); - }); - if (!rooms.length) { - fn && fn(null); - return this; - } - this.adapter.addAll(this.id, rooms); + this.adapter.addAll( + this.id, + new Set(Array.isArray(rooms) ? rooms : [rooms]) + ); debug("joined room %s", rooms); - rooms.forEach(room => { - this.rooms[room] = room; - }); fn && fn(null); return this; } @@ -276,7 +265,6 @@ export class Socket extends EventEmitter { this.adapter.del(this.id, room); debug("left room %s", room); - delete this.rooms[room]; fn && fn(null); return this; @@ -287,7 +275,6 @@ export class Socket extends EventEmitter { */ private leaveAll(): void { this.adapter.delAll(this.id); - this.rooms = {}; } /** @@ -584,4 +571,8 @@ export class Socket extends EventEmitter { public get conn() { return this.client.conn; } + + public get rooms(): Set { + return this.adapter.socketRooms(this.id) || new Set(); + } } diff --git a/test/socket.io.js b/test/socket.io.js index 216ae7bed3..2edbdb40ed 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -682,12 +682,12 @@ describe("socket.io", () => { let total = 2; s.on("disconnecting", reason => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); + expect(s.rooms).to.contain(s.id, "a"); total--; }); s.on("disconnect", reason => { - expect(Object.keys(s.rooms)).to.eql([]); + expect(s.rooms.size).to.eql(0); --total || done(); }); }); @@ -2150,15 +2150,15 @@ describe("socket.io", () => { const socket = client(srv); sio.on("connection", s => { s.join("a", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); + expect(s.rooms).to.contain(s.id, "a"); s.join("b", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); + expect(s.rooms).to.contain(s.id, "a", "b"); s.join("c", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b", "c"]); + expect(s.rooms).to.contain(s.id, "a", "b", "c"); s.leave("b", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "c"]); + expect(s.rooms).to.contain(s.id, "a", "c"); s.leaveAll(); - expect(Object.keys(s.rooms)).to.eql([]); + expect(s.rooms.size).to.eql(0); done(); }); }); @@ -2194,13 +2194,13 @@ describe("socket.io", () => { const socket = client(srv); sio.on("connection", s => { s.join("a", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); + expect(s.rooms).to.contain(s.id, "a"); s.join("b", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); + expect(s.rooms).to.contain(s.id, "a", "b"); s.leave("unknown", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); + expect(s.rooms).to.contain(s.id, "a", "b"); s.leaveAll(); - expect(Object.keys(s.rooms)).to.eql([]); + expect(s.rooms.size).to.eql(0); done(); }); }); @@ -2217,7 +2217,7 @@ describe("socket.io", () => { const socket = client(srv); sio.on("connection", s => { s.join(["a", "b", "c"], () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b", "c"]); + expect(s.rooms).to.contain(s.id, "a", "b", "c"); done(); }); });