Des conseils pour mettre en place la «présence» sur un site web?

Idéalement, j’aimerais trouver un code simple et léger qui permette à tous les clients Web connectés à mon site de conserver en temps réel le statut des personnes actuellement connectées.

Je sais que ejabberd fait cela, mais il fait aussi beaucoup d’autres choses, et je préférerais une faible empreinte de code pour pouvoir personnaliser et comprendre ses caractéristiques de performance.

J’aime l’aspect non bloquant de node.js, et je me demandais s’il y avait un projet open source qui exécute toute cette logique.

J’aimerais également voir une implémentation JavaScript de la maintenance de ce modèle côté client.

Pour le statut en temps réel, utilisez socket.io . Chaque fois que quelqu’un se connecte, ajoutez-le à la liste des utilisateurs connectés. Pour des statistiques précises, vous devez suivre les sessions des utilisateurs. Voir http://www.danielbaulig.de/socket-ioexpress/

var onlineUsers = {}; var online = 0; io.sockets.on('connection', function (socket) { onlineUsers[socket.handshake.sessionID] = socket.handshake.session; online = Object.keys(onlineUsers).length; socket.broadcast.emit('online', online); socket.on('disconnect', function () { delete onlineUsers[socket.handshake.sessionID]; online--; socket.broadcast.emit('online', online); }); }); 

Pour tous ceux qui liront ceci dans le futur. J’ai commencé avec la réponse écrite par fent , mais j’avais besoin de quelques modifications car les choses ont changé depuis six ans que sa réponse a été publiée.

J’ai utilisé une Map plutôt qu’un Object pour stocker les informations de session. cela signifie que l’ sessionID n’est plus requirejs.

 const onlineUsers = new Map(); io.on('connection', function (socket) { console.log('connection initiated'); socket.on('userInfo', userInfo => { console.log('userInfo', userInfo); onlineUsers.set(socket, userInfo); io.emit('onlineUsers', Array.from(onlineUsers.values())); }); socket.on('disconnect', function () { console.log(onlineUsers.get(socket)); onlineUsers.delete(socket); io.emit('onlineUsers', Array.from(onlineUsers.values())); }); });