Skip to content

Commit 155fa63

Browse files
feat: add room events
The adapter will now emit the following events: - create-room (arg: room) - delete-room (arg: room) - join-room (args: room, sid) - leave-room (args: room, sid) Related: socketio/socket.io#2897
1 parent 313c5a9 commit 155fa63

File tree

2 files changed

+102
-7
lines changed

2 files changed

+102
-7
lines changed

lib/index.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,12 @@ export class Adapter extends EventEmitter {
5959

6060
if (!this.rooms.has(room)) {
6161
this.rooms.set(room, new Set());
62+
this.emit("create-room", room);
63+
}
64+
if (!this.rooms.get(room).has(id)) {
65+
this.rooms.get(room).add(id);
66+
this.emit("join-room", room, id);
6267
}
63-
this.rooms.get(room).add(id);
6468
}
6569
}
6670

@@ -75,9 +79,19 @@ export class Adapter extends EventEmitter {
7579
this.sids.get(id).delete(room);
7680
}
7781

82+
this._del(room, id);
83+
}
84+
85+
private _del(room, id) {
7886
if (this.rooms.has(room)) {
79-
this.rooms.get(room).delete(id);
80-
if (this.rooms.get(room).size === 0) this.rooms.delete(room);
87+
const deleted = this.rooms.get(room).delete(id);
88+
if (deleted) {
89+
this.emit("leave-room", room, id);
90+
}
91+
if (this.rooms.get(room).size === 0) {
92+
this.rooms.delete(room);
93+
this.emit("delete-room", room);
94+
}
8195
}
8296
}
8397

@@ -92,10 +106,7 @@ export class Adapter extends EventEmitter {
92106
}
93107

94108
for (const room of this.sids.get(id)) {
95-
if (this.rooms.has(room)) {
96-
this.rooms.get(room).delete(id);
97-
if (this.rooms.get(room).size === 0) this.rooms.delete(room);
98-
}
109+
this._del(room, id);
99110
}
100111

101112
this.sids.delete(id);

test/index.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,88 @@ describe("socket.io-adapter", () => {
5757
expect(rooms.size).to.be(2);
5858
expect(adapter.socketRooms("s4")).to.be(undefined);
5959
});
60+
61+
describe("events", () => {
62+
it("should emit a 'create-room' event", done => {
63+
const adapter = new Adapter({ server: { encoder: null } });
64+
adapter.on("create-room", room => {
65+
expect(room).to.eql("r1");
66+
done();
67+
});
68+
adapter.addAll("s1", new Set(["r1"]));
69+
});
70+
71+
it("should not emit a 'create-room' event if the room already exists", done => {
72+
const adapter = new Adapter({ server: { encoder: null } });
73+
adapter.addAll("s1", new Set(["r1"]));
74+
adapter.on("create-room", room => {
75+
done(new Error("should not happen"));
76+
});
77+
adapter.addAll("s2", new Set(["r1"]));
78+
done();
79+
});
80+
81+
it("should emit a 'join-room' event", done => {
82+
const adapter = new Adapter({ server: { encoder: null } });
83+
adapter.on("join-room", (room, sid) => {
84+
expect(room).to.eql("r1");
85+
expect(sid).to.eql("s1");
86+
done();
87+
});
88+
adapter.addAll("s1", new Set(["r1"]));
89+
});
90+
91+
it("should not emit a 'join-room' event if the sid is already in the room", done => {
92+
const adapter = new Adapter({ server: { encoder: null } });
93+
adapter.addAll("s1", new Set(["r1", "r2"]));
94+
adapter.on("join-room", () => {
95+
done(new Error("should not happen"));
96+
});
97+
adapter.addAll("s1", new Set(["r1"]));
98+
done();
99+
});
100+
101+
it("should emit a 'leave-room' event with del method", done => {
102+
const adapter = new Adapter({ server: { encoder: null } });
103+
adapter.on("leave-room", (room, sid) => {
104+
expect(room).to.eql("r1");
105+
expect(sid).to.eql("s1");
106+
done();
107+
});
108+
adapter.addAll("s1", new Set(["r1"]));
109+
adapter.del("s1", "r1");
110+
});
111+
112+
it("should emit a 'leave-room' event with delAll method", done => {
113+
const adapter = new Adapter({ server: { encoder: null } });
114+
adapter.on("leave-room", (room, sid) => {
115+
expect(room).to.eql("r1");
116+
expect(sid).to.eql("s1");
117+
done();
118+
});
119+
adapter.addAll("s1", new Set(["r1"]));
120+
adapter.delAll("s1");
121+
});
122+
123+
it("should emit a 'delete-room' event", done => {
124+
const adapter = new Adapter({ server: { encoder: null } });
125+
adapter.on("delete-room", room => {
126+
expect(room).to.eql("r1");
127+
done();
128+
});
129+
adapter.addAll("s1", new Set(["r1"]));
130+
adapter.delAll("s1");
131+
});
132+
133+
it("should not emit a 'delete-room' event if there is another sid in the room", done => {
134+
const adapter = new Adapter({ server: { encoder: null } });
135+
adapter.on("delete-room", room => {
136+
done(new Error("should not happen"));
137+
});
138+
adapter.addAll("s1", new Set(["r1"]));
139+
adapter.addAll("s2", new Set(["r1", "r2"]));
140+
adapter.delAll("s1");
141+
done();
142+
});
143+
});
60144
});

0 commit comments

Comments
 (0)