Uma solução mais elegante seria fazer com que cada socket se conectasse ao userID do canal, por exemplo:
io.sockets.on('connection', function (socket) {
socket.join(userID);
});
// when you want somebody to send a message to userID you can do:
io.sockets.in(userID).emit(message);
Há duas coisas que você precisa cuidar aqui:
- Certifique-se de que apenas userID possa se conectar ao seu canal, portanto, verifique a sessão ( leia mais aqui:http://www.danielbaulig.de/socket-ioexpress/ )
- Na conexão, aumente o valor de userID em redis (para que você saiba que uma nova conexão para esse usuário está escutando) e na desconexão, diminua o valor de userID (para que você saiba o número de conexões que ainda estão escutando). Se o valor for 0, você emite uma mensagem para o chat informando que o userID saiu (já que o número de conexões que escutam o canal userID é 0).
Quando outros usuários quiserem enviar uma mensagem para userID, eles não precisam se conectar ao canal userID, eles podem enviar uma mensagem para o
chat
channel e passe userID como uma propriedade. Por exemplo:var chat = io
.of('/chat')
.on('connection', function (socket) {
// connected to public chat
})
.on('message', function (data) {
if (data.userID && data.message) {
io.sockets.in(userID).emit('UserX: ' + data.message);
}
});