Browse Source

cleaned up source code

Michelle Bu 12 years ago
parent
commit
4dc344bb31
4 changed files with 142 additions and 45 deletions
  1. 44 17
      public/js/sink.js
  2. 69 27
      public/js/source.js
  3. 15 0
      public/sink.html
  4. 14 1
      public/source.html

+ 44 - 17
public/js/sink.js

@@ -1,4 +1,7 @@
 function SinkPeer(options, readyfn) {
+  if (!browserisms) {
+    readyfn({ error: 'RTC-incompatible browser' });
+  }
   this._config = options.config || {};
   this._source = options.source || 'StreamAPI';
   this._pc = null;
@@ -8,11 +11,13 @@ function SinkPeer(options, readyfn) {
   this.socketInit(readyfn);
 };
 
+
 SinkPeer.prototype.socketInit = function(cb) {
   self = this;
-  this._socket.emit('sink', { source: this._source }, function(data) {
+  this._socket.emit('sink', { source: this._source, isms: browserisms },
+      function(data) {
     self._id = data.id;
-    self._pc = new window.mozRTCPeerConnection(self._config);
+    self._pc = new RTCPeerConnection(self._config);
 
     //FIREFOX
     self._pc.onaddstream = function(obj) {
@@ -23,9 +28,8 @@ SinkPeer.prototype.socketInit = function(cb) {
 
     self._socket.on('offer', function(offer) {
       self._pc.setRemoteDescription(offer.sdp, function() {
-
         //Firefox
-        navigator.mozGetUserMedia({ audio: true, fake: true }, function(s) {
+        getUserMedia({ audio: true, fake: true }, function(s) {
           self._pc.addStream(s);
 
           self._pc.createAnswer(function(answer) {
@@ -35,9 +39,12 @@ SinkPeer.prototype.socketInit = function(cb) {
                     'sdp': answer,
                     'source': offer.source });
               // Firefoxism
-              console.log('FIREFOX');
-              self._pc.connectDataConnection(5001, 5000);
-              console.log('FIREFOX-2');
+              if (browserisms && browserisms == 'Firefox') {
+                self._pc.connectDataConnection(5001, 5000);
+              }
+              if (cb) {
+                cb({ response: 'done' });
+              }
             }, function(err) {
               console.log('failed to setLocalDescription, ', err)
             });
@@ -50,25 +57,29 @@ SinkPeer.prototype.socketInit = function(cb) {
       });
     });
   });
+
 };
 
+
 SinkPeer.prototype.setupDataChannel = function() {
   self = this;
-  this._pc.ondatachannel = function(dc) {
-    console.log('SINK: ondatachannel triggered');
-    dc.binaryType = "arraybuffer";
-    dc.onmessage = function(e) {
-      self.handleDataMessage(e);
+  if (browserisms != 'Webkit') {
+    this._pc.ondatachannel = function(dc) {
+      console.log('SINK: ondatachannel triggered');
+      dc.binaryType = 'arraybuffer';
+      dc.onmessage = function(e) {
+        self.handleDataMessage(e);
+      };
+      self._dc = dc;
     };
-    self._dc = dc;
-  };
 
-  this._pc.onconnection = function() {
-    console.log('SINK: onconnection triggered');
+    this._pc.onconnection = function() {
+      console.log('SINK: onconnection triggered');
+    }
   }
 
   this._pc.onclosedconnection = function() {
-    // ??
+    // Remove socket handlers perhaps.
   };
 };
 
@@ -77,9 +88,25 @@ SinkPeer.prototype.send = function(data) {
   this._dc.send(ab);
 }
 
+
 // Handles a DataChannel message.
 // TODO: have these extend Peer, which will impl these generic handlers.
 SinkPeer.prototype.handleDataMessage = function(e) {
   data = MsgPack.decode(e.data);
   console.log(data);
+
+  if (!!this._dataHandler) {
+    this._dataHandler(data);
+  }
+}
+
+
+SinkPeer.prototype.on = function(code, cb) {
+  if (code === 'stream') {
+    this._streamHandler = cb;
+  } else if (code === 'disconnect') {
+    this._disconnectHandler = cb;
+  } else if (code === 'data') {
+    this._dataHandler = cb;
+  }
 }

+ 69 - 27
public/js/source.js

@@ -12,42 +12,31 @@ function SourcePeer(options) {
   this.socketInit();
 };
 
+
 SourcePeer.prototype.socketInit = function() {
-  self = this;
+  var self = this;
   this._socket.emit('source', function(data) {
     self._id = data.id;
 
+    if (!!self._readyHandler) {
+      self._readyHandler(self._id);
+    }
+
     self._socket.on('sink-connected', function(data) {
-      console.log('SINK CONNECTED');
-      // TODO: not just moz.
       target = data.sink;
-      var pc = new window.mozRTCPeerConnection(self._config);
+      var pc = new RTCPeerConnection(self._config);
       self._pcs[target] = pc;
-      // Setups will create streams--then the callback sets up the offers.
-      self.handleStream(pc, target, function() {
-        // 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': offer,
-                    'sink': target,
-                    'source': self._id });
-            }, function(err) {
-              console.log('failed to setLocalDescription, ', err);
-            });
-          });
-        }, function(err) { console.log('crap'); });
+      self.handleStream(pc, target, function(pc, target) {
+        self.maybeBrowserisms(pc, target);
       });
     });
 
     self._socket.on('answer', function(data) {
       self._pcs[data.sink].setRemoteDescription(data.sdp, function() {
         // Firefoxism
-        console.log('FIREFOX', new Date());
-        self._pcs[data.sink].connectDataConnection(5000, 5001);
-        console.log('FIREFOX-2');
+        if (browserisms == 'Firefox') {
+          self._pcs[data.sink].connectDataConnection(5000, 5001);
+        }
         console.log('SOURCE: PeerConnection success');
       }, function(err) {
         console.log('failed to setRemoteDescription, ', err)
@@ -56,6 +45,39 @@ SourcePeer.prototype.socketInit = function() {
   });
 };
 
+
+// Stream Firefoxism... can be removed when DataChannel no longer requires
+// a stream.
+SourcePeer.prototype.maybeBrowserisms = function(pc, target) {
+  var self = this;
+  if (browserisms == 'Firefox') {
+    getUserMedia({ audio: true, fake: true }, function(s) {
+      pc.addStream(s);
+      self.makeOffer(target);
+    }, function(err) { console.log('crap'); });
+  } else {
+    this.makeOffer(target);
+  }
+};
+
+
+// Make an offer.
+SourcePeer.prototype.makeOffer = function(target) {
+  var pc = this._pcs[target];
+  var self = this;
+  pc.createOffer(function(offer) {
+    pc.setLocalDescription(offer, function() {
+      self._socket.emit('offer',
+          { 'sdp': offer,
+            'sink': target,
+            'source': self._id });
+    }, function(err) {
+      console.log('failed to setLocalDescription, ', err);
+    });
+  });
+};
+
+
 // Based on stream type requested, sets up the stream for PC.
 SourcePeer.prototype.handleStream = function(pc, target, cb) {
   pc.onaddstream = function(obj) {
@@ -77,13 +99,20 @@ SourcePeer.prototype.handleStream = function(pc, target, cb) {
   }*/
 };
 
+
 SourcePeer.prototype.setupDataChannel = function(pc, target, cb) {
-  self = this;
+  var self = this;
   pc.onconnection = function() {
     console.log('SOURCE: onconnection triggered.');
     var dc = pc.createDataChannel(self._name, {}, target);
     self._dcs[target] = dc;
     dc.binaryType = 'arraybuffer';
+
+    // User handler
+    if (!!self._sinkHandler) {
+      self._sinkHandler(target);
+    }
+
     dc.onmessage = function(e) {
       self.handleDataMessage(e);
     };
@@ -96,9 +125,10 @@ SourcePeer.prototype.setupDataChannel = function(pc, target, cb) {
   pc.onclosedconnection = function() {
     // ??
   };
-  cb();
+  cb(pc, target);
 };
 
+
 SourcePeer.prototype.send = function(data, sink) {
   // TODO: try/catch
   var ab = MsgPack.encode(data);
@@ -110,12 +140,12 @@ SourcePeer.prototype.send = function(data, sink) {
 
   for (var key in this._dcs) {
     if (this._dcs.hasOwnProperty(key)) {
-      this._dcs[key].send(blob);
+      this._dcs[key].send(ab);
     }
   }
-
 }
 
+
 // Handles a DataChannel message.
 SourcePeer.prototype.handleDataMessage = function(e) {
   var data = MsgPack.decode(e.data);
@@ -126,10 +156,22 @@ SourcePeer.prototype.handleDataMessage = function(e) {
   }
 }
 
+
 SourcePeer.prototype.on = function(code, cb) {
   // For enduser.
   if (code === 'data') {
     this._dataHandler = cb;
+  } else if (code === 'sink') {
+    // SUCCESSFUL sink connection.
+    this._sinkHandler = cb;
+  } else if (code === 'stream') {
+    this._streamHandler = cb;
+  } else if (code === 'ready') {
+    // Source has set up socket.
+    this._readyHandler = cb;
+  } else if (code == 'disconnect') {
+    // A sink has disconnected.
+    this._disconnectHandler = cb;
   }
 };
 

+ 15 - 0
public/sink.html

@@ -11,8 +11,19 @@
 <script src="/socket.io/socket.io.js"></script>
 <script type="text/javascript" src="/js/msgpack/msgpack.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/sink.js"></script>
 <script>
+$(document).ready(function() {
+  $('#connect').click(function() {
+    var source = $('#source').val();
+    sink = new SinkPeer({ source: source });
+    sink.on('data', function(data) {
+      console.log(data);
+      sink.send('I am so scared.');
+    });
+  });
+});
 
 </script>
 
@@ -20,5 +31,9 @@
  
 <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> 

+ 14 - 1
public/source.html

@@ -11,9 +11,22 @@
 <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/msgpack/msgpack.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) {
+    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>