Browse Source

refactor to use ws instead of socketio

Michelle Bu 12 năm trước cách đây
mục cha
commit
fa65f7663c
4 tập tin đã thay đổi với 184 bổ sung79 xóa
  1. 43 0
      demo/sink.html
  2. 42 0
      demo/sinkoriginator.html
  3. 37 0
      demo/source.html
  4. 62 79
      server.js

+ 43 - 0
demo/sink.html

@@ -0,0 +1,43 @@
+<!DOCTYPE HTML> 
+<html lang="en"> 
+<head>
+<title>Sink Test</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
+<meta http-equiv="Content-Language" content="en-us"> 
+<meta name="description" content=""> 
+<meta name="keywords" content=""> 
+
+<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
+<script type="text/javascript" src="../lib/binarypack.js"></script>
+<script type="text/javascript" src="../lib/adapter.js"></script>
+<script type="text/javascript" src="../lib/sink.js"></script>
+<script>
+$(document).ready(function() {
+  $('#connect').click(function() {
+    var source = $('#source').val();
+    sink = new SinkPeer({ source: source, audio: true, video: true });
+    sink.on('data', function(data) {
+      console.log(data);
+      sink.send('I am so scared.');
+    });
+    sink.on('localstream', function(type, stream) {
+      console.log('Local stream: ', type);
+    });
+    sink.on('remotestream', function(type, stream) {
+      console.log('Remote stream: ', type);
+    });
+  });
+});
+
+</script>
+
+</head> 
+ 
+<body> 
+  This is a P2P sink.
+  <br><br>
+  Enter source ID to connect to:
+  <br><input type="text" id="source"></input>
+  <button id="connect">Connect</button>
+</body> 
+</html> 

+ 42 - 0
demo/sinkoriginator.html

@@ -0,0 +1,42 @@
+<!DOCTYPE HTML> 
+<html lang="en"> 
+<head>
+<title>Sink Test</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
+<meta http-equiv="Content-Language" content="en-us"> 
+<meta name="description" content=""> 
+<meta name="keywords" content=""> 
+
+<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
+<script type="text/javascript" src="../lib/binarypack.js"></script>
+<script type="text/javascript" src="../lib/adapter.js"></script>
+<script type="text/javascript" src="../lib/sink.js"></script>
+<script>
+$(document).ready(function() {
+  originator = new SinkPeer({ video: false });
+  originator.on('ready', function(id) {
+    console.log(id);
+  });
+  originator.on('connection', function(recipient) {
+    console.log('connection');
+    originator.send('Hi there!');
+  });
+  originator.on('data', function(data) {
+    console.log(data);
+  });
+  originator.on('localstream', function(type, stream) {
+    console.log('Local stream: ', type);
+  });
+  originator.on('remotestream', function(type, stream) {
+    console.log('Remote stream: ', type);
+  });
+});
+
+</script>
+
+</head> 
+ 
+<body> 
+  This is a P2P originator sink.
+</body> 
+</html> 

+ 37 - 0
demo/source.html

@@ -0,0 +1,37 @@
+<!DOCTYPE HTML> 
+<html lang="en"> 
+<head>
+<title>Source Test</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
+<meta http-equiv="Content-Language" content="en-us"> 
+<meta name="description" content=""> 
+<meta name="keywords" content=""> 
+
+<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
+<script src="/socket.io/socket.io.js"></script>
+<script type="text/javascript" src="/js/binarypack/dist/binarypack.js"></script>
+<script type="text/javascript" src="/js/adapter.js"></script>
+<script type="text/javascript" src="/js/source.js"></script>
+<script>
+$(document).ready(function() {
+  source = new SourcePeer({});
+  source.on('ready', function(source_id) {
+    console.log(source_id);
+  });
+  source.on('sink', function(sink_id) {
+    console.log('Creepy message sent to sink');
+    source.send('I see you, ' + sink_id, sink_id);
+    source.send('Guys, ' + sink_id + ' just joined us!');
+  });
+  source.on('data', function(data) {
+    console.log(data);
+  });
+});
+</script>
+
+</head> 
+ 
+<body> 
+  This is the P2P source.
+</body> 
+</html> 

+ 62 - 79
server.js

@@ -1,82 +1,65 @@
-var express = require('express');
-var fs = require('fs');
-var app =  express.createServer();
-var io = require('socket.io').listen(app);
-
-// Initialize main server.
-app.use(express.bodyParser());
-
-app.use(express.static(__dirname + '/public'));
-
-app.set('view engine', 'ejs');
-app.set('views', __dirname + '/views');
-
-// P2P sources: { socket id => url }.
-sources = {};
-// socket.io clients.
-clients = {};
-
-// P2Ps. { source id => group members }
-connections = {};
-
-// For connecting clients:
-// Src will connect upon creating a link.
-// Receivers will connect after clicking a button and entering an optional key.
-io.sockets.on('connection', function(socket) {
-  clients[socket.id] = socket;
-
-  // Source connected.
-  socket.on('source', function(fn) {
-    fn({ 'id': socket.id });
-    connections[socket.id] = [];
+var WebSocketServer = require('ws').Server;
+
+function randomId() {
+  return Math.random().toString(36).substr(2);
+}
+
+function prettyError(msg) {
+  console.log('PeerServer: ', msg);
+}
+
+function PeerServer(options) {
+  var wss = new WebSocketServer({ port: options.port || 80 });
+  this.clients = {};
+  var self = this;
+
+  // For connecting clients:
+  // Src will connect upon creating a link.
+  // Receivers will connect after clicking a button and entering an optional key.
+  wss.on('connection', function(socket) {
+    var clientId = randomId();
+    while (!!self.clients[clientId]) {
+      clientId = randomId();
+    }
+    self.clients[clientId] = socket;
+
+    socket.on('message', function(data) {
+      var message = JSON.parse(data);
+      if (options.debug) {
+        console.log('PeerServer: ', message);
+      }
+
+      switch (message.type) {
+        // Source connected -- send back its ID.
+        case 'SOURCE':
+          socket.send(JSON.stringify({ type: 'SOURCE-ID', id: clientId }));
+          break;
+        // Sink connected -- send back its ID and notify src.
+        case 'SINK':
+          if (!!message.source && !!self.clients[message.source]) {
+            self.clients[message.source].send(JSON.stringify({
+              type: 'SINK-CONNECTED', sink: clientId }));
+
+            socket.send(JSON.stringify({ type: 'SINK-ID', id: clientId }));
+          } else {
+            prettyError('source invalid');
+          }
+          break;
+        case 'LEAVE':
+          delete self.clients[message.src];
+        // Offer or answer from src to sink.
+        case 'OFFER':
+        case 'ANSWER':
+        case 'CANDIDATE':
+        case 'PORT':
+          self.clients[message.dst].send(JSON.stringify(message));
+          break;
+        default:
+          prettyError('message unrecognized');
+      }
+    });
   });
 
-  // Sink connected.
-  socket.on('sink', function(msg, fn) {
-    var source_id = msg.source;
-    var sink_id = socket.id;
-    var source = clients[source_id];
-    if (!!source) {
-      source.emit('sink-connected', { 'sink': sink_id });
-      fn({ 'id': sink_id });
-    } else {
-      fn({ 'error': 'Source ID not found.' });
-    };
-  });
-
-  // Offer from src to dest.
-  socket.on('offer', function (msg) {
-    console.log('OFFER MADE');
-    sink = clients[msg.sink];
-    sink.emit('offer', msg);
-  });
-
-  // Answer from dest to src.
-  socket.on('answer', function (msg) {
-    console.log('ANSWER MADE');
-    source = clients[msg.source];
-    // Add to list of successful connections.
-    // May want to move this to another message soon.
-    connections[msg.source].push(msg.sink);
-    source.emit('answer', msg);
-  });
-
-  socket.on('disconnect', function() {
-    // Handle on client side?
-    socket.broadcast.to(connections[socket.id]).emit('Host disconnected');
-    delete connections[socket.id];
-    delete clients[socket.id];
-  });
-
-  socket.on('port', function(msg) {
-    clients[msg.sink].emit('port', msg);
-  });
-});
-
-
-app.get('/', function(req, res){
-  res.render('index');
-});
-
+};
 
-app.listen(process.env.PORT || 8000);
+exports.PeerServer = PeerServer;