¿Cómo usar socketio para mostrar usuarios en línea / fuera de línea en tiempo real usando Sails?

Mi aplicación de chat en tiempo real se basa en Sails y SocketIO . Muestra a todos los usuarios junto con los usuarios en línea disponibles. Cuando un usuario ha iniciado sesión, se emite un socket UserConnected y cuando se desconecta un usuario, se emite un socket UserDisconnected, socket del lado de Mi servidor El código en config / sockets.js es

onConnect: function(session, socket) { if (session.passport) { if (session.passport.user && socket.id) { sails.io.sockets.emit('UserConnected', {userID : session.passport.user}); } } } //// By default: do nothing //// This is a good place to broadcast a disconnect message, or any other custom socket.io logic }, onDisconnect: function(session, socket) { if (session.passport) { if (session.passport.user && socket.id) { sails.io.sockets.emit('UserDisconnected', {userID : session.passport.user}); } } //// By default: do nothing //// This is a good place to broadcast a disconnect message, or any other custom socket.io logic } 

El problema es que cuando un usuario actualiza la página, se muestra conectado y desconectado de otro usuario y un problema importante es que si un usuario inició sesión en dos navegadores diferentes y si alguno de ellos está cerrado, muestra que el usuario está desconectado de otros usuarios, pero el usuario está realmente disponible en otro navegador.
¿Cómo modificaría / codificar para que estos problemas se solucionen?
Gracias por adelantado

@InternalFX publicó un buen método; una alternativa que puede usar en Sails v0.10.x sería:

  onConnect: function(session, socket) { // If this is a logged in user, subscribe the socket to a // custom "loggedInCount" room if (session.user) { var roomName = 'loggedIn'+session.user.id; sails.sockets.join(socket, roomName); // If this is the first subscriber, the user is just coming online, // so notify any subscribers about the state change. if (sails.sockets.subscribers(roomName).length == 1) { User.message(session.user.id, {state: 'online'}, socket); } } }, onDisconnect: function(session, socket) { if (session.user) { var roomName = 'loggedIn'+session.user.id; sails.sockets.leave(socket, roomName); // If this was the last subscriber, the user is going offline, // so notify any subscribers about the state change. if (sails.sockets.subscribers(roomName).length == 0) { User.message(session.user.id, {state: 'offline'}, socket); } } }, 

Esto utiliza la architecture pubsub incorporada de Sails para notificar a los sockets conectados cada vez que un usuario en particular se conecta o se desconecta. Requiere sockets para suscribirse a las instancias de usuario que desean conocer (utilizando algo como socket.get('/user') en el cliente), lo cual es una buena práctica. De esta manera, solo puede recibir notificaciones sobre los usuarios que le interesan (por ejemplo, si tiene una “lista de amigos”).

Aquí está el método que estoy usando para un propósito similar.

 var online_users = {}; module.exports.sockets = { onConnect: function(session, socket) { if (_.isString(session.user_id)) { if (_.has(online_users, session.user_id)) { online_users[session.user_id] += 1; } else { online_users[session.user_id] = 1; } } sails.io.sockets.emit('crm/online_users', online_users); }, onDisconnect: function(session, socket) { if (_.isString(session.user_id)) { if (_.has(online_users, session.user_id)) { online_users[session.user_id] -= 1; } else { online_users[session.user_id] = 0; } } sails.io.sockets.emit('crm/online_users', online_users); }, } 

Mantiene un registro de cuántos navegadores han iniciado sesión como un usuario específico. Así que podrías usar lo siguiente.

 if (online_users[session.user_id] > 0) { console.log('USER IS LOGGED IN'); }`