Skip to content

Commit 01a4623

Browse files
[feat] Allow to join several rooms at once (socketio#2879)
1 parent 2d5b002 commit 01a4623

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed

docs/API.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
- [socket.emit(eventName[, ...args][, ack])](#socketemiteventname-args-ack)
4141
- [socket.on(eventName, callback)](#socketoneventname-callback)
4242
- [socket.join(room[, callback])](#socketjoinroom-callback)
43+
- [socket.join(rooms[, callback])](#socketjoinrooms-callback)
4344
- [socket.leave(room[, callback])](#socketleaveroom-callback)
4445
- [socket.to(room)](#sockettoroom)
4546
- [socket.in(room)](#socketinroom)
@@ -476,6 +477,14 @@ io.on('connection', function(client){
476477
});
477478
```
478479

480+
#### socket.join(rooms[, callback])
481+
482+
- `rooms` _(Array)_
483+
- `callback` _(Function)_
484+
- **Returns** `Socket` for chaining
485+
486+
Adds the client to the list of room, and fires optionally a callback with `err` signature (if any).
487+
479488
#### socket.leave(room[, callback])
480489

481490
- `room` _(String)_

lib/socket.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,23 +223,31 @@ Socket.prototype.packet = function(packet, opts){
223223
/**
224224
* Joins a room.
225225
*
226-
* @param {String} room
226+
* @param {String|Array} room or array of rooms
227227
* @param {Function} fn optional, callback
228228
* @return {Socket} self
229229
* @api private
230230
*/
231231

232-
Socket.prototype.join = function(room, fn){
233-
debug('joining room %s', room);
232+
Socket.prototype.join = function(rooms, fn){
233+
debug('joining room %s', rooms);
234234
var self = this;
235-
if (this.rooms.hasOwnProperty(room)) {
235+
if (!Array.isArray(rooms)) {
236+
rooms = [rooms];
237+
}
238+
rooms = rooms.filter(function (room) {
239+
return !self.rooms.hasOwnProperty(room);
240+
});
241+
if (!rooms.length) {
236242
fn && fn(null);
237243
return this;
238244
}
239-
this.adapter.add(this.id, room, function(err){
245+
this.adapter.addAll(this.id, rooms, function(err){
240246
if (err) return fn && fn(err);
241-
debug('joined room %s', room);
242-
self.rooms[room] = room;
247+
debug('joined room %s', rooms);
248+
rooms.forEach(function (room) {
249+
self.rooms[room] = room;
250+
});
243251
fn && fn(null);
244252
});
245253
return this;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"engine.io": "2.0.2",
2929
"has-binary": "0.1.7",
3030
"object-assign": "4.1.0",
31-
"socket.io-adapter": "1.0.0",
31+
"socket.io-adapter": "~1.1.0",
3232
"socket.io-client": "socketio/socket.io-client",
3333
"socket.io-parser": "2.3.1"
3434
},

test/socket.io.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2083,6 +2083,21 @@ describe('socket.io', function(){
20832083
});
20842084
});
20852085
});
2086+
2087+
it('allows to join several rooms at once', function(done) {
2088+
var srv = http();
2089+
var sio = io(srv);
2090+
2091+
srv.listen(function(){
2092+
var socket = client(srv);
2093+
sio.on('connection', function(s){
2094+
s.join(['a', 'b', 'c'], function(){
2095+
expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b', 'c']);
2096+
done();
2097+
});
2098+
});
2099+
});
2100+
});
20862101
});
20872102

20882103
describe('middleware', function(done){

0 commit comments

Comments
 (0)