server.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. var WebSocketServer = require('ws').Server;
  2. function randomId() {
  3. return Math.random().toString(36).substr(2);
  4. }
  5. function prettyError(msg) {
  6. console.log('PeerServer: ', msg);
  7. }
  8. function PeerServer(options) {
  9. var wss = new WebSocketServer({ port: options.port || 80 });
  10. this.clients = {};
  11. var self = this;
  12. // For connecting clients:
  13. // Src will connect upon creating a link.
  14. // Receivers will connect after clicking a button and entering an optional key.
  15. wss.on('connection', function(socket) {
  16. var clientId = randomId();
  17. while (!!self.clients[clientId]) {
  18. clientId = randomId();
  19. }
  20. self.clients[clientId] = socket;
  21. socket.on('message', function(data) {
  22. var message = JSON.parse(data);
  23. if (options.debug) {
  24. console.log('PeerServer: ', message);
  25. }
  26. switch (message.type) {
  27. // Source connected -- send back its ID.
  28. case 'SOURCE':
  29. socket.send(JSON.stringify({ type: 'SOURCE-ID', id: clientId }));
  30. break;
  31. // Sink connected -- send back its ID and notify src.
  32. case 'SINK':
  33. if (!!message.source && !!self.clients[message.source]) {
  34. self.clients[message.source].send(JSON.stringify({
  35. type: 'SINK-CONNECTED', sink: clientId }));
  36. socket.send(JSON.stringify({ type: 'SINK-ID', id: clientId }));
  37. } else {
  38. prettyError('source invalid');
  39. }
  40. break;
  41. case 'LEAVE':
  42. if (!!self.clients[message.dst]) {
  43. try {
  44. self.clients[message.dst].send(data);
  45. } catch (e) {
  46. if (options.debug) {
  47. console.log('Error', e);
  48. }
  49. }
  50. delete self.clients[message.src];
  51. }
  52. break;
  53. // Offer or answer from src to sink.
  54. case 'OFFER':
  55. case 'ANSWER':
  56. case 'CANDIDATE':
  57. case 'PORT':
  58. if (!!self.clients[message.dst]) {
  59. try {
  60. self.clients[message.dst].send(data);
  61. } catch (e) {
  62. if (options.debug) {
  63. console.log('Error', e);
  64. }
  65. }
  66. }
  67. break;
  68. default:
  69. prettyError('message unrecognized');
  70. }
  71. });
  72. });
  73. };
  74. exports.PeerServer = PeerServer;