Browse Source

all util.supports except interop

Michelle Bu 11 năm trước cách đây
mục cha
commit
b698f0ea03
3 tập tin đã thay đổi với 160 bổ sung14 xóa
  1. 80 7
      dist/peer.js
  2. 0 0
      dist/peer.min.js
  3. 80 7
      lib/util.js

+ 80 - 7
dist/peer.js

@@ -1086,23 +1086,96 @@ var util = {
 
   // Lists which features are supported
   // Temporarily set everything to true
-  supports: (function(){
+  supports: (function() {
+    var data = true;
+    var audioVideo = true;
+
+    var pc, dc;
+    try {
+      pc = new RTCPeerConnection(defaultConfig, {optional: [{RtpDataChannels: true}]});
+    } catch (e) {
+      data = false;
+      audioVideo = false;
+    }
+
+    if (data) {
+      try {
+        dc = pc.createDataChannel('_PEERJSDATATEST');
+      } catch (e) {
+        data = false;
+      }
+    }
+    // FIXME: not really the best check...
+    if (audioVideo) {
+      audioVideo = !!pc.addStream;
+    }
+
+    pc.close();
+    dc.close();
+
     return {
-      audioVideo: true,
-      data: true,
-      binary: false,
-      reliable: (function() {
+      audioVideo: audioVideo,
+      data: data,
+      binary: data && (function() {
+        var pc = new RTCPeerConnection(defaultConfig, {optional: [{RtpDataChannels: true}]});
+        var dc = pc.createDataChannel('_PEERJSBINARYTEST');
+
+        try {
+          dc.binaryType = 'blob';
+        } catch (e) {
+          pc.close();
+          if (e.name === 'NotSupportedError') {
+            return false
+          }
+        }
+        pc.close();
+        dc.close();
+
+        return true;
+      })(),
+
+      reliable: data && (function() {
         // Reliable (not RTP).
         var pc = new RTCPeerConnection(defaultConfig, {});
+        var dc;
         try {
-          pc.createDataChannel('PEERJSRELIABLETEST');
+          dc = pc.createDataChannel('_PEERJSRELIABLETEST');
         } catch (e) {
+          pc.close();
           if (e.name === 'NotSupportedError') {
             return false
           }
         }
+        pc.close();
+        dc.close();
+
+        return true;
+      })(),
+
+      onnegotiationneeded: (data || audioVideo) && (function() {
+        var pc = new RTCPeerConnection(defaultConfig, {});
+        // sync default check.
+        var called = false;
+        var pc = new RTCPeerConnection(defaultConfig, {optional: [{RtpDataChannels: true}]});
+        pc.onnegotiationneeded = function() {
+          called = true;
+          // async check.
+          if (util && util.supports) {
+            util.supports.onnegotiationneeded = true;
+          }
+        };
+        // FIXME: this is not great because it doesn't work for audio-only
+        // browsers (?).
+        var dc = pc.createDataChannel('_PEERJSRELIABLETEST');
+
+        pc.close();
+        dc.close();
+
+        return called;
       })(),
-      onnegotiationneeded: true,
+
+      // TODO(michelle): whether this browser can interop with a different
+      // browser. But the two browsers both have to support interop.
       interop: false
     };
   }()),

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist/peer.min.js


+ 80 - 7
lib/util.js

@@ -61,23 +61,96 @@ var util = {
 
   // Lists which features are supported
   // Temporarily set everything to true
-  supports: (function(){
+  supports: (function() {
+    var data = true;
+    var audioVideo = true;
+
+    var pc, dc;
+    try {
+      pc = new RTCPeerConnection(defaultConfig, {optional: [{RtpDataChannels: true}]});
+    } catch (e) {
+      data = false;
+      audioVideo = false;
+    }
+
+    if (data) {
+      try {
+        dc = pc.createDataChannel('_PEERJSDATATEST');
+      } catch (e) {
+        data = false;
+      }
+    }
+    // FIXME: not really the best check...
+    if (audioVideo) {
+      audioVideo = !!pc.addStream;
+    }
+
+    pc.close();
+    dc.close();
+
     return {
-      audioVideo: true,
-      data: true,
-      binary: false,
-      reliable: (function() {
+      audioVideo: audioVideo,
+      data: data,
+      binary: data && (function() {
+        var pc = new RTCPeerConnection(defaultConfig, {optional: [{RtpDataChannels: true}]});
+        var dc = pc.createDataChannel('_PEERJSBINARYTEST');
+
+        try {
+          dc.binaryType = 'blob';
+        } catch (e) {
+          pc.close();
+          if (e.name === 'NotSupportedError') {
+            return false
+          }
+        }
+        pc.close();
+        dc.close();
+
+        return true;
+      })(),
+
+      reliable: data && (function() {
         // Reliable (not RTP).
         var pc = new RTCPeerConnection(defaultConfig, {});
+        var dc;
         try {
-          pc.createDataChannel('PEERJSRELIABLETEST');
+          dc = pc.createDataChannel('_PEERJSRELIABLETEST');
         } catch (e) {
+          pc.close();
           if (e.name === 'NotSupportedError') {
             return false
           }
         }
+        pc.close();
+        dc.close();
+
+        return true;
       })(),
-      onnegotiationneeded: true,
+
+      onnegotiationneeded: (data || audioVideo) && (function() {
+        var pc = new RTCPeerConnection(defaultConfig, {});
+        // sync default check.
+        var called = false;
+        var pc = new RTCPeerConnection(defaultConfig, {optional: [{RtpDataChannels: true}]});
+        pc.onnegotiationneeded = function() {
+          called = true;
+          // async check.
+          if (util && util.supports) {
+            util.supports.onnegotiationneeded = true;
+          }
+        };
+        // FIXME: this is not great because it doesn't work for audio-only
+        // browsers (?).
+        var dc = pc.createDataChannel('_PEERJSRELIABLETEST');
+
+        pc.close();
+        dc.close();
+
+        return called;
+      })(),
+
+      // TODO(michelle): whether this browser can interop with a different
+      // browser. But the two browsers both have to support interop.
       interop: false
     };
   }()),

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác