Reputation: 3183
I would like to guarantee that a user is only in one room at a time, but I am having trouble implimenting this. I have boiled the issue down to not being able to get a list of all the rooms a socket is currently in.
My current strategy is to do something like this:
io.on('connection', function(socket) {
console.log('A user just connected with id ' + socket.id);
socket.on("change room", function(data) {
// this SHOULD return a list of all rooms this user is in
var socketsRooms = socket.rooms;
console.log(socket.rooms) //{ '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' }
console.log(typeof socket.rooms) // object
// Loop through the rooms and leave them
for (var room in socketsRooms) {
console.log('LEAVING ROOM: ', room);
socket.leave(room);
}
// Join the new room
socket.join(data.newroom);
});
socket.on('disconnect', function() {
console.log('user ' + socket.id + ' disconnected');
});
})
Is there an issue in the docs with socket.rooms? It says it should return an array of rooms that a socket is connected to, but I get back data as an id object. EX: { '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' }
... In my case I would expect something like ['issues']
On the Socket.io github page the socket.rooms description stated:
A hash of strings identifying the rooms this socket is in, indexed by room name.
BEFORE MARKING AS A DUPLICATE:
I have already checked out the folowing questions:
The answer to the first question seems the most hacked together solution the I am pretty sure it will work because it assumes the solution as maintaining our own list, but I would prefer a working solution using socket.io over that method.
I am using the latest verion of socket.io v1.4.5 with angular2 beta on the client (if that helps out at all)
Upvotes: 0
Views: 2552
Reputation: 17498
In socket.io, each socket is also connected to its own room. This room has the same name of socket.id
. So when leaving the rooms, make sure you don't leave its own room.
for(room in socket.rooms){
if(socket.id !== room) socket.leave(room);
}
socket.join(data.newroom, function(){
console.log('rooms', socket.rooms); // here you'll see two rooms: one with socket.id and another with data.newroom
});
Upvotes: 3