server.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. delete self.clients[message.src];
  43. // Offer or answer from src to sink.
  44. case 'OFFER':
  45. case 'ANSWER':
  46. case 'CANDIDATE':
  47. case 'PORT':
  48. self.clients[message.dst].send(JSON.stringify(message));
  49. break;
  50. default:
  51. prettyError('message unrecognized');
  52. }
  53. });
  54. });
  55. };
  56. exports.PeerServer = PeerServer;