Browse Source

why, firefoxisms? :(

Michelle Bu 12 years ago
parent
commit
4d64c8f9b3
8 changed files with 146 additions and 42 deletions
  1. 2 1
      package.json
  2. 28 8
      public/js/sink.js
  3. 39 22
      public/js/source.js
  4. 22 0
      public/sink.html
  5. 22 0
      public/source.html
  6. 10 11
      server.js
  7. 0 0
      views/index.ejs
  8. 23 0
      views/layout.ejs

+ 2 - 1
package.json

@@ -12,6 +12,7 @@
   "license": "BSD",
   "dependencies": {
     "express": "~2.5.11",
-    "socket.io": "~0.9.13"
+    "socket.io": "~0.9.13",
+    "ejs": "~0.8.3"
   }
 }

+ 28 - 8
public/js/sink.js

@@ -12,35 +12,55 @@ SinkPeer.prototype.socketInit = function(cb) {
   self = this;
   this._socket.emit('sink', { source: this._source }, function(data) {
     self._id = data.id;
-    self._pc = new mozRTCPeerConnection(self._config);
+    self._pc = new window.mozRTCPeerConnection(self._config);
 
-    this.setupDataChannel();
+    //FIREFOX
+    self._pc.onaddstream = function(obj) {
+      console.log('SINK: data stream get');
+    };
+
+    self.setupDataChannel();
 
-    self._socket.on('offer', function(data) {
-      self._pc.setRemoteDescription(data.sdp, function() {
+    self._socket.on('offer', function(offer) {
+      self._pc.setRemoteDescription(JSON.parse(offer.sdp), function() {
         self._pc.createAnswer(function(answer) {
           self._pc.setLocalDescription(answer, function() {
             self._socket.emit('answer',
-                { 'sink' = this._id,'sdp': answer, 'source': data.source });
+                { 'sink': self._id,
+                  'sdp': JSON.stringify(answer),
+                  'source': offer.source });
             // Firefoxism
-            self._pc.connectDataConnection(5001,5000);
+            console.log('FIREFOX', new Date());
+            self._pc.connectDataConnection(5001, 5000);
+            console.log('FIREFOX-2');
+          }, function(err) {
+            console.log('failed to setLocalDescription, ', err)
           });
+        }, function(err) {
+          console.log('failed to create answer, ', err)
         });
+      }, function(err) {
+        console.log('failed to setRemoteDescription with offer, ', err);
       });
     });
     cb(self._id);
   });
-});
+};
 
 SinkPeer.prototype.setupDataChannel = function() {
   this._pc.ondatachannel = function(dc) {
+    console.log('SINK: ondatachannel triggered');
     dc.binaryType = "blob";
     dc.onmessage = function(e) {
 
     };
-    this._dc = dc;
+    self._dc = dc;
   };
 
+  this._pc.onconnection = function() {
+    console.log('SINK: onconnection triggered');
+  }
+
   this._pc.onclosedconnection = function() {
     // ??
   };

+ 39 - 22
public/js/source.js

@@ -1,4 +1,5 @@
 function SourcePeer(options) {
+  // TODO: Allow passing in own ID.
   this._config = options.config || {};
   this._streams = options.streamType || 'd';
   this._name = options.name || 'StreamAPI';
@@ -17,37 +18,54 @@ SourcePeer.prototype.socketInit = function() {
     self._id = data.id;
 
     self._socket.on('sink-connected', function(data) {
+      console.log('SINK CONNECTED');
       // TODO: not just moz.
       target = data.sink;
-      var pc = new mozRTCPeerConnection(self._config);
+      var pc = new window.mozRTCPeerConnection(self._config);
       self._pcs[target] = pc;
-
       // Setups will create streams--then the callback sets up the offers.
       self.handleStream(pc, target, function() {
-        pc.createOffer(function(offer) {
-          pc.setLocalDescription(offer);
-          self._socket.emit('offer',
-              { 'sdp': offer, 'sink': target, 'source': this._id });
-        });
+        // Firefoxisms, or just dumb?
+        navigator.mozGetUserMedia({ audio: true, fake: true }, function(s) {
+          pc.addStream(s);
+          pc.createOffer(function(offer) {
+            pc.setLocalDescription(offer, function() {
+              self._socket.emit('offer',
+                  { 'sdp': JSON.stringify(offer),
+                    'sink': target,
+                    'source': self._id });
+            }, function(err) {
+              console.log('failed to setLocalDescription, ', err);
+            });
+          });
+        }, function(err) { console.log('crap'); });
       });
     });
 
-    self._socket.on('answer', function(data, fn) {
-      self._pcs[data.sink].setRemoteDescription(data.sdp);
-      fn();
-      // Firefoxism
-      self._pcs[data.sink].connectDataConnection(5000,5001);
+    self._socket.on('answer', function(data) {
+      self._pcs[data.sink].setRemoteDescription(JSON.parse(data.sdp), function() {
+        // Firefoxism
+        console.log('FIREFOX', new Date());
+        self._pcs[data.sink].connectDataConnection(5000, 5001);
+        console.log('FIREFOX-2');
+        console.log('SOURCE: PeerConnection success');
+      }, function(err) {
+        console.log('failed to setRemoteDescription, ', err)
+      });
     });
   });
 };
 
 // Based on stream type requested, sets up the stream for PC.
-SourcePeer.prototype.handleStream(pc, target, cb) {
+SourcePeer.prototype.handleStream = function(pc, target, cb) {
+  pc.onaddstream = function(obj) {
+    console.log('SOURCE: data stream get');
+  };
   /*if (this._streams === 'v') {
   } else if (this._streams === 'a') {
   } else if (this._streams === 'av') {
   } else if (this._streams === 'd') {*/
-    this.setupDataChannel(pc, target);
+    this.setupDataChannel(pc, target, cb);
   /*} else if (this._streams === 'dav') {
     this.setupDataChannel(pc, target);
   } else if (this._streams === 'da') {
@@ -59,13 +77,15 @@ SourcePeer.prototype.handleStream(pc, target, cb) {
   }*/
 };
 
-SourcePeer.prototype.setupDataChannel = function(pc, target) {
+SourcePeer.prototype.setupDataChannel = function(pc, target, cb) {
+  self = this;
   pc.onconnection = function() {
-    var dc = pc.createDataChannel(this._name, {}, target);
-    this._dc[target] = dc;
+    console.log('SOURCE: onconnection triggered.');
+    var dc = pc.createDataChannel(self._name, {}, target);
+    self._dc[target] = dc;
     dc.binaryType = 'blob';
     dc.onmessage = function(e) {
-      this.handleDataMessage(pc, e);
+      self.handleDataMessage(pc, e);
       // process e.data
     };
   };
@@ -73,12 +93,9 @@ SourcePeer.prototype.setupDataChannel = function(pc, target) {
   pc.onclosedconnection = function() {
     // ??
   };
+  cb();
 };
 
 SourcePeer.prototype.on = function(code, cb) {
   // For enduser.
 };
-
-SourcePeer.prototype.gotDescription = function(desc) {
-  this._pc
-};

+ 22 - 0
public/sink.html

@@ -0,0 +1,22 @@
+<!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="/js/sink.js"></script>
+<script src="/socket.io/socket.io.js"></script>
+<script>
+
+</script>
+
+</head> 
+ 
+<body> 
+  This is a P2P sink.
+</body> 
+</html> 

+ 22 - 0
public/source.html

@@ -0,0 +1,22 @@
+<!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/source.js"></script>
+<script>
+
+</script>
+
+</head> 
+ 
+<body> 
+  This is the P2P source.
+</body> 
+</html> 

+ 10 - 11
server.js

@@ -26,9 +26,9 @@ io.sockets.on('connection', function(socket) {
   clients[socket.id] = socket;
 
   // Source connected.
-  socket.on('source', function(msg, fn) {
+  socket.on('source', function(fn) {
     fn({ 'id': socket.id });
-    connections(socket.id) = [];
+    connections[socket.id] = [];
   });
   // Sink connected.
   socket.on('sink', function(msg, fn) {
@@ -41,17 +41,18 @@ io.sockets.on('connection', function(socket) {
 
   // 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) {
-    source = msg.source;
-    source.emit('answer', msg, function() {
-      // Add to list of successful connections.
-      connections[msg.source].append(msg.sink);
-      console.log('Successful Offer/Answer between ', msg.source, ' and ', msg.sink);
-    });
+    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() {
@@ -68,6 +69,4 @@ app.get('/', function(req, res){
 });
 
 
-app.listen(80);
-
-
+app.listen(process.env.PORT || 8000);

+ 0 - 0
views/index.ejs


+ 23 - 0
views/layout.ejs

@@ -0,0 +1,23 @@
+<!DOCTYPE HTML> 
+<html lang="en"> 
+<head> 
+<title></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=""> 
+ 
+ 
+<link href="/css/style.css" rel="stylesheet" type="text/css"> 
+
+<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
+<script type="text/javascript" src="/js/server.js"></script>
+<script type="text/javascript" src="/js/client.js"></script>
+<script type="text/javascript" src="/js/index.js"></script>
+
+</head> 
+ 
+<body> 
+<%-body%>
+</body> 
+</html>