PageRenderTime 42ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/node/socket.js

https://github.com/ggouv/elgg-nodejs
JavaScript | 126 lines | 66 code | 32 blank | 28 comment | 13 complexity | 443c0a4446b0d848741a80f12c64220e MD5 | raw file
  1. module.exports = function (io) {
  2. // Middleware. Prevent unknow connexion.
  3. io.use(function(socket, next){
  4. if (socket.handshake.query.user) return next();
  5. next(new Error('Authentication error'));
  6. });
  7. /**
  8. * Called when socket connect for the first time and socket.io ask for authorization token.
  9. */
  10. io.sockets.on('connect', function(socket) {
  11. /*
  12. * Event at first connect
  13. */
  14. var user = JSON.parse(socket.handshake.query.user),
  15. sessionCookie = getElggSession(socket);
  16. // delete timeout if exist (prevent disconnect message)
  17. clearTimeout(timeouts[sessionCookie]);
  18. // Check if user is already online ? (a user can open more than one tab, so we check for guid and session cookie)
  19. if (!Users[sessionCookie]) {
  20. // emit to all sockets except sender
  21. socket.broadcast.emit('add_online_user', user);
  22. // add new user to Users
  23. Users[sessionCookie] = new User(user, sessionCookie);
  24. }
  25. Users[sessionCookie].sockets[socket.id] = socket; // add socket to User
  26. // If there is rooms, that's mean it's a reconnection. Reconnect this socket to all rooms
  27. _.each(Users[sessionCookie].rooms, function(room) {
  28. _.invoke(Users[sessionCookie].sockets, 'join', room); // join room for all sockets of this user
  29. _.invoke(Users[sessionCookie].sockets, 'emit', 'join_room', Rooms[room]); // send data of this room
  30. if (!_.contains(Users[sessionCookie].rooms, room)) Users[sessionCookie].rooms.push(room);
  31. });
  32. // free memory
  33. delete user;
  34. delete sessionCookie;
  35. /*
  36. * Event when socket is disconnected
  37. */
  38. socket.on('disconnect', function () {
  39. var sessionCookie = getElggSession(socket);
  40. if (Users[sessionCookie]) {
  41. delete Users[sessionCookie].sockets[socket.id];
  42. }
  43. timeouts[sessionCookie] = setTimeout(function() {
  44. if (Users[sessionCookie] && _.size(Users[sessionCookie].sockets) == 0) { // no socket ? -> all tabs/socket are closed.
  45. var user = Users[sessionCookie].guid;
  46. _.each(Users[sessionCookie].rooms, function(room) {
  47. if (findClientsSocketByRoomId(room).length == 0) delete Rooms[room];
  48. });
  49. delete Users[sessionCookie];
  50. socket.broadcast.emit('remove_online_user', user); // emit to all socket
  51. }
  52. }, 5000); // we wait 5s to see if user will reconnect.
  53. });
  54. /*
  55. * Event when socket join a room
  56. */
  57. socket.on('join_room', function(data, callback) {
  58. socket.join(data.room);
  59. callback();
  60. });
  61. /*
  62. * Event when socket leave a room
  63. */
  64. socket.on('leave_room', function(room) {
  65. Users[getElggSession(socket)].rooms = _.without(Users[getElggSession(socket)].rooms, room) ;
  66. if (findClientsSocketByRoomId(room).length == 0) delete Rooms[room];
  67. socket.leave(room);
  68. });
  69. socket.on('get_rooms', function() {
  70. var rooms = io.sockets.manager.roomClients[socket.id];
  71. socket.emit('get_rooms', rooms);
  72. });
  73. socket.on('location', function(data, callback) {
  74. socket.broadcast.emit('broadcast', data);
  75. callback();
  76. });
  77. });
  78. // socket.broadcast.emit('remove_online_user', user); // emit to all clients except sender
  79. // io.emit('users_count', clients); // emit to all clients
  80. // findClientsSocketByRoomId('room'); // get all clients from room `room`
  81. // io.sockets.manager.rooms; //get all rooms
  82. // io.sockets.manager.roomClients[socket.id]; // get all rooms of a client
  83. // socket.rooms ?
  84. function findClientsSocketByRoomId(roomId) {
  85. var res = []
  86. , room = io.sockets.adapter.rooms[roomId];
  87. if (room) {
  88. for (var id in room) {
  89. res.push(io.sockets.adapter.nsp.connected[id]);
  90. }
  91. }
  92. return res;
  93. }
  94. }