index.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. const
  2. {Server} = require('socket.io'),
  3. io = new Server(3030, {
  4. cors: {
  5. origin: function (origin, callback)
  6. {
  7. if (/\.draw\.io$/.test(origin) || /\.diagrams\.io$/.test(origin))
  8. {
  9. callback(null, true); // allow all draw.io domains
  10. }
  11. else
  12. {
  13. callback(new Error('Now allowed')); // block others
  14. }
  15. }
  16. }
  17. });
  18. const SOCKET = '_socket', P2P = '_p2p';
  19. let rooms = {}
  20. io.on('connection', function (socket)
  21. {
  22. //TODO Review P2P and SOCKET rooms transitions and interaction
  23. let room = null, isP2P = false;
  24. function leaveRoom()
  25. {
  26. if (!room) return;
  27. room.clientCount--;
  28. socket.leave(room.name + (isP2P? P2P : SOCKET));
  29. if (room.clientCount == 0)
  30. {
  31. delete rooms[room.name];
  32. }
  33. else
  34. {
  35. if (isP2P)
  36. {
  37. delete room.p2pClients[socket.id];
  38. }
  39. else
  40. {
  41. delete room.socketClients[socket.id];
  42. }
  43. }
  44. room = null;
  45. }
  46. socket.on('message', function (data)
  47. {
  48. if (!room) return;
  49. socket.broadcast.to(room.name + SOCKET).emit('message', data);
  50. if (room.socketClients[socket.id] != null)
  51. {
  52. socket.broadcast.to(room.name + P2P).emit('message', data);
  53. }
  54. })
  55. socket.on('join', function (msg) {
  56. leaveRoom(); //If currently in a room, leave it
  57. let name = msg.name;
  58. if (!name) return;
  59. if (rooms[name])
  60. {
  61. room = rooms[name];
  62. }
  63. else
  64. {
  65. room = {p2pClients: {}, socketClients: {}, clientCount: 0, name: name}
  66. rooms[name] = room;
  67. }
  68. socket.join(room.name + SOCKET);
  69. room.clientCount++;
  70. let allClientsIds = [];
  71. Object.keys(room.p2pClients).forEach(id => allClientsIds.push(id));
  72. Object.keys(room.socketClients).forEach(id => allClientsIds.push(id));
  73. room.socketClients[socket.id] = socket;
  74. socket.emit('clientsList', {list: allClientsIds, cId: socket.id});
  75. socket.broadcast.to(room.name + P2P).emit('newClient', socket.id);
  76. });
  77. socket.on('movedToP2P', function()
  78. {
  79. if (!room) return;
  80. socket.join(room.name + P2P);
  81. room.p2pClients[socket.id] = socket;
  82. socket.leave(room.name + SOCKET);
  83. delete room.socketClients[socket.id];
  84. isP2P = true;
  85. });
  86. socket.on('sendSignal', function(data)
  87. {
  88. if (!room) return;
  89. cSocket = room.p2pClients[data.to] || room.socketClients[data.to];
  90. if (cSocket)
  91. {
  92. cSocket.emit('signal', data);
  93. }
  94. else
  95. {
  96. socket.emit('sendSignalFailed', {to: data.to});
  97. }
  98. });
  99. socket.on('disconnect', leaveRoom);
  100. });