server.js 2.0 KB

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