Przeglądaj źródła

refactoring
remove opera from supported browsers

afrokick 5 lat temu
rodzic
commit
dd1f88d84a
12 zmienionych plików z 176 dodań i 114 usunięć
  1. 3 3
      README.md
  2. 0 0
      dist/peerjs.min.js
  3. 0 0
      dist/peerjs.min.js.map
  4. 6 3
      index.d.ts
  5. 3 1
      lib/adapter.ts
  6. 2 2
      lib/dataconnection.ts
  7. 16 13
      lib/negotiator.ts
  8. 1 0
      lib/socket.ts
  9. 72 0
      lib/supports.ts
  10. 57 92
      lib/util.ts
  11. 1 0
      package.json
  12. 15 0
      webrtc-adapter.d.ts

+ 3 - 3
README.md

@@ -79,9 +79,9 @@ npm test
 
 
 ## Browsers support
 ## Browsers support
 
 
-| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png" alt="Opera" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Opera |
-| --------- | --------- | --------- | --------- |
-| last 4 versions| last 4 versions| 12.1+| last 4 versions
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
+| --------- | --------- | --------- |
+| last 4 versions| last 4 versions| 12.1+
 
 
 ## FAQ
 ## FAQ
 
 

Plik diff jest za duży
+ 0 - 0
dist/peerjs.min.js


Plik diff jest za duży
+ 0 - 0
dist/peerjs.min.js.map


+ 6 - 3
index.d.ts

@@ -192,15 +192,18 @@ declare namespace Peer {
     type: string;
     type: string;
   }
   }
 
 
-  interface utilSupportsObj {
+  interface UtilSupportsObj {
+    browser: boolean,
+    webRTC: boolean;
     audioVideo: boolean;
     audioVideo: boolean;
     data: boolean;
     data: boolean;
-    binary: boolean;
+    binaryBlob: boolean;
     reliable: boolean;
     reliable: boolean;
+    sctp: boolean;
   }
   }
 
 
   interface util {
   interface util {
     browser: string;
     browser: string;
-    supports: utilSupportsObj;
+    supports: UtilSupportsObj;
   }
   }
 }
 }

+ 3 - 1
lib/adapter.ts

@@ -1 +1,3 @@
-export { adapter } from "webrtc-adapter";
+export {webRTCAdapter} from "webrtc-adapter";
+
+// export { webRTCAdapter };

+ 2 - 2
lib/dataconnection.ts

@@ -72,7 +72,7 @@ export class DataConnection extends BaseConnection {
   }
   }
 
 
   private _configureDataChannel(): void {
   private _configureDataChannel(): void {
-    if (util.supports.sctp) {
+    if (!util.supports.binaryBlob || util.supports.reliable) {
       this.dataChannel.binaryType = "arraybuffer";
       this.dataChannel.binaryType = "arraybuffer";
     }
     }
 
 
@@ -83,7 +83,7 @@ export class DataConnection extends BaseConnection {
     };
     };
 
 
     // Use the Reliable shim for non Firefox browsers
     // Use the Reliable shim for non Firefox browsers
-    if (!util.supports.sctp && this.reliable) {
+    if (!util.supports.reliable && this.reliable) {
       const isLoggingEnable = logger.logLevel > LogLevel.Disabled;
       const isLoggingEnable = logger.logLevel > LogLevel.Disabled;
       this._reliable = new Reliable(this.dataChannel, isLoggingEnable);
       this._reliable = new Reliable(this.dataChannel, isLoggingEnable);
     }
     }

+ 16 - 13
lib/negotiator.ts

@@ -1,5 +1,5 @@
 import * as Reliable from "reliable";
 import * as Reliable from "reliable";
-import { adapter as _ } from './adapter';
+import { webRTCAdapter as _ } from './adapter';
 import { util } from "./util";
 import { util } from "./util";
 import logger from "./logger";
 import logger from "./logger";
 import { MediaConnection } from "./mediaconnection";
 import { MediaConnection } from "./mediaconnection";
@@ -72,18 +72,19 @@ export class Negotiator {
     logger.log("Listening for ICE candidates.");
     logger.log("Listening for ICE candidates.");
 
 
     peerConnection.onicecandidate = (evt) => {
     peerConnection.onicecandidate = (evt) => {
-      if (evt.candidate) {
-        logger.log("Received ICE candidates for:", peerId);
-        provider.socket.send({
-          type: ServerMessageType.Candidate,
-          payload: {
-            candidate: evt.candidate,
-            type: connectionType,
-            connectionId: connectionId
-          },
-          dst: peerId
-        });
-      }
+      if (!evt.candidate || !evt.candidate.candidate) return;
+
+      logger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);
+
+      provider.socket.send({
+        type: ServerMessageType.Candidate,
+        payload: {
+          candidate: evt.candidate,
+          type: connectionType,
+          connectionId: connectionId
+        },
+        dst: peerId
+      });
     };
     };
 
 
     peerConnection.oniceconnectionstatechange = () => {
     peerConnection.oniceconnectionstatechange = () => {
@@ -330,6 +331,8 @@ export class Negotiator {
 
 
   /** Handle a candidate. */
   /** Handle a candidate. */
   async handleCandidate(ice: any): Promise<void> {
   async handleCandidate(ice: any): Promise<void> {
+    logger.log(`handleCandidate:`, ice);
+
     const candidate = ice.candidate;
     const candidate = ice.candidate;
     const sdpMLineIndex = ice.sdpMLineIndex;
     const sdpMLineIndex = ice.sdpMLineIndex;
     const sdpMid = ice.sdpMid;
     const sdpMid = ice.sdpMid;

+ 1 - 0
lib/socket.ts

@@ -51,6 +51,7 @@ export class Socket extends EventEmitter {
 
 
       try {
       try {
         data = JSON.parse(event.data);
         data = JSON.parse(event.data);
+        logger.log("Server message received:", data);
       } catch (e) {
       } catch (e) {
         logger.log("Invalid server message", event.data);
         logger.log("Invalid server message", event.data);
         return;
         return;

+ 72 - 0
lib/supports.ts

@@ -0,0 +1,72 @@
+import { webRTCAdapter } from './adapter';
+
+export const Supports = new class {
+  readonly isIOS = ['iPad', 'iPhone', 'iPod'].includes(navigator.platform);
+  readonly supportedBrowsers = ['firefox', 'chrome', 'safari'];
+
+  readonly minFirefoxVersion = 59;
+  readonly minChromeVersion = 72;
+  readonly minSafariVersion = 605;
+
+  isWebRTCSupported(): boolean {
+    return typeof RTCPeerConnection !== 'undefined';
+  };
+
+  isBrowserSupported(): boolean {
+    const browser = this.getBrowser();
+    const version = this.getVersion();
+
+    const validBrowser = this.supportedBrowsers.includes(browser);
+
+    if (!validBrowser) return false;
+
+    if (browser === 'chrome') return version >= this.minChromeVersion;
+    if (browser === 'firefox') return version >= this.minFirefoxVersion;
+    if (browser === 'safari') return !this.isIOS && version >= this.minSafariVersion;
+
+    return false;
+  }
+
+  getBrowser(): string {
+    return webRTCAdapter.browserDetails.browser;
+  }
+
+  getVersion(): number {
+    return webRTCAdapter.browserDetails.version || 0;
+  }
+
+  isUnifiedPlanSupported(): boolean {
+    const browser = this.getBrowser();
+    const version = webRTCAdapter.browserDetails.version || 0;
+
+    if (browser === 'chrome' && version < 72) return false;
+    if (browser === 'firefox' && version >= 59) return true;
+    if (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false;
+
+    let tempPc: RTCPeerConnection;
+    let supported = false;
+
+    try {
+      tempPc = new RTCPeerConnection();
+      tempPc.addTransceiver('audio');
+      supported = true;
+    } catch (e) { }
+    finally {
+      if (tempPc) {
+        tempPc.close();
+      }
+    }
+
+    return supported;
+  }
+
+  toString(): string {
+    return `Supports: 
+    browser:${this.getBrowser()} 
+    version:${this.getVersion()} 
+    isIOS:${this.isIOS} 
+    isWebRTCSupported:${this.isWebRTCSupported()} 
+    isBrowserSupported:${this.isBrowserSupported()} 
+    isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;
+  }
+}

+ 57 - 92
lib/util.ts

@@ -1,5 +1,6 @@
 import * as BinaryPack from "js-binarypack";
 import * as BinaryPack from "js-binarypack";
-import { adapter as _ } from './adapter';
+import { Supports } from './supports';
+import { UtilSupportsObj } from '..';
 
 
 const DEFAULT_CONFIG = {
 const DEFAULT_CONFIG = {
   iceServers: [
   iceServers: [
@@ -9,124 +10,88 @@ const DEFAULT_CONFIG = {
   sdpSemantics: "unified-plan"
   sdpSemantics: "unified-plan"
 };
 };
 
 
-export class util {
-  static noop(): void { }
+export const util = new class {
+  noop(): void { }
 
 
-  static readonly CLOUD_HOST = "0.peerjs.com";
-  static readonly CLOUD_PORT = 443;
+  readonly CLOUD_HOST = "0.peerjs.com";
+  readonly CLOUD_PORT = 443;
 
 
   // Browsers that need chunking:
   // Browsers that need chunking:
-  static readonly chunkedBrowsers = { Chrome: 1 };
-  static readonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is "cut off" after 16384 bytes and delivered individually.
+  readonly chunkedBrowsers = { Chrome: 1, chrome: 1 };
+  readonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is "cut off" after 16384 bytes and delivered individually.
 
 
   // Returns browser-agnostic default config
   // Returns browser-agnostic default config
-  static readonly defaultConfig = DEFAULT_CONFIG;
+  readonly defaultConfig = DEFAULT_CONFIG;
 
 
-  // Returns the current browser.
-  static readonly browser: string = (function (global) {
-    // @ts-ignore
-    if (global.mozRTCPeerConnection) {
-      return "Firefox";
-    }
-    // @ts-ignore
-    if (global.webkitRTCPeerConnection) {
-      return "Chrome";
-    }
-
-    if (global.RTCPeerConnection) {
-      return "Supported";
-    }
-
-    return "Unsupported";
-  })(window);
+  readonly browser = Supports.getBrowser();
+  readonly browserVersion = Supports.getVersion();
 
 
   // Lists which features are supported
   // Lists which features are supported
-  static readonly supports = (function () {
-    if (typeof RTCPeerConnection === "undefined") {
-      return {};
-    }
-
-    let data = true;
-    let audioVideo = true;
-
-    let binaryBlob = false;
-    let sctp = false;
+  readonly supports = (function () {
+    const supported: UtilSupportsObj = {
+      browser: Supports.isBrowserSupported(),
+      webRTC: Supports.isWebRTCSupported(),
+      audioVideo: false,
+      data: false,
+      binaryBlob: false,
+      reliable: false,
+      sctp: false,
+    };
 
 
-    const onnegotiationneeded = !!window.webkitRTCPeerConnection;
+    if (!supported.webRTC) return supported;
 
 
-    let pc, dc;
+    let pc: RTCPeerConnection;
 
 
     try {
     try {
       pc = new RTCPeerConnection(DEFAULT_CONFIG);
       pc = new RTCPeerConnection(DEFAULT_CONFIG);
-    } catch (e) {
-      data = false;
-      audioVideo = false;
-    }
 
 
-    if (data) {
+      supported.audioVideo = true;
+
+      let dc: RTCDataChannel;
+
       try {
       try {
         dc = pc.createDataChannel("_PEERJSTEST");
         dc = pc.createDataChannel("_PEERJSTEST");
+        supported.data = true;
+        supported.reliable = !!dc.ordered;
+        supported.sctp = !!pc.sctp;
+
+        // Binary test
+        try {
+          dc.binaryType = "blob";
+          supported.binaryBlob = !Supports.isIOS;
+        } catch (e) {
+        }
       } catch (e) {
       } catch (e) {
-        data = false;
+      } finally {
+        if (dc) {
+          dc.close();
+        }
+      }
+    } catch (e) {
+    } finally {
+      if (pc) {
+        pc.close();
       }
       }
     }
     }
 
 
-    if (data) {
-      // Binary test
-      try {
-        dc.binaryType = "blob";
-        binaryBlob = true;
-      } catch (e) { }
-
-      // Reliable test.
-      // Unfortunately Chrome is a bit unreliable about whether or not they
-      // support reliable.
-      const reliablePC = new RTCPeerConnection(DEFAULT_CONFIG);
-      try {
-        const reliableDC = reliablePC.createDataChannel(
-          "_PEERJSRELIABLETEST",
-          {}
-        );
-        sctp = reliableDC.ordered;
-      } catch (e) { }
-      reliablePC.close();
-    }
-
-    // FIXME: not really the best check...
-    if (audioVideo) {
-      audioVideo = !!pc.addStream;
-    }
-
-    if (pc) {
-      pc.close();
-    }
-
-    return {
-      audioVideo: audioVideo,
-      data: data,
-      binaryBlob: binaryBlob,
-      binary: sctp, // deprecated; sctp implies binary support.
-      reliable: sctp, // deprecated; sctp implies reliable data.
-      sctp: sctp,
-      onnegotiationneeded: onnegotiationneeded
-    };
+    return supported;
   })();
   })();
 
 
   // Ensure alphanumeric ids
   // Ensure alphanumeric ids
-  static validateId(id: string): boolean {
+  validateId(id: string): boolean {
     // Allow empty ids
     // Allow empty ids
     return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);
     return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);
   }
   }
 
 
-  static pack = BinaryPack.pack;
-  static unpack = BinaryPack.unpack;
+  pack = BinaryPack.pack;
+  unpack = BinaryPack.unpack;
 
 
   // Binary stuff
   // Binary stuff
 
 
-  private static _dataCount = 1;
+  private _dataCount = 1;
 
 
   // chunks a blob.
   // chunks a blob.
-  static chunk(bl: Blob): any[] {
+  chunk(bl: Blob): any[] {
     const chunks = [];
     const chunks = [];
     const size = bl.size;
     const size = bl.size;
     const total = Math.ceil(size / util.chunkedMTU);
     const total = Math.ceil(size / util.chunkedMTU);
@@ -156,7 +121,7 @@ export class util {
     return chunks;
     return chunks;
   }
   }
 
 
-  static blobToArrayBuffer(blob: Blob, cb: (arg: string | ArrayBuffer | null) => void): void {
+  blobToArrayBuffer(blob: Blob, cb: (arg: string | ArrayBuffer | null) => void): void {
     const fr = new FileReader();
     const fr = new FileReader();
 
 
     fr.onload = function (evt) {
     fr.onload = function (evt) {
@@ -168,7 +133,7 @@ export class util {
     fr.readAsArrayBuffer(blob);
     fr.readAsArrayBuffer(blob);
   }
   }
 
 
-  static blobToBinaryString(blob: Blob, cb: (arg: string | ArrayBuffer | null) => void): void {
+  blobToBinaryString(blob: Blob, cb: (arg: string | ArrayBuffer | null) => void): void {
     const fr = new FileReader();
     const fr = new FileReader();
 
 
     fr.onload = function (evt) {
     fr.onload = function (evt) {
@@ -180,7 +145,7 @@ export class util {
     fr.readAsBinaryString(blob);
     fr.readAsBinaryString(blob);
   }
   }
 
 
-  static binaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {
+  binaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {
     let byteArray = new Uint8Array(binary.length);
     let byteArray = new Uint8Array(binary.length);
 
 
     for (let i = 0; i < binary.length; i++) {
     for (let i = 0; i < binary.length; i++) {
@@ -190,13 +155,13 @@ export class util {
     return byteArray.buffer;
     return byteArray.buffer;
   }
   }
 
 
-  static randomToken(): string {
+  randomToken(): string {
     return Math.random()
     return Math.random()
       .toString(36)
       .toString(36)
       .substr(2);
       .substr(2);
   }
   }
 
 
-  static isSecure(): boolean {
+  isSecure(): boolean {
     return location.protocol === "https:";
     return location.protocol === "https:";
   }
   }
 }
 }

+ 1 - 0
package.json

@@ -18,6 +18,7 @@
   "release": {
   "release": {
     "branch": "master"
     "branch": "master"
   },
   },
+  "types": "./index.d.ts",
   "devDependencies": {
   "devDependencies": {
     "@types/chai": "^4.2.2",
     "@types/chai": "^4.2.2",
     "@types/mocha": "^5.2.7",
     "@types/mocha": "^5.2.7",

+ 15 - 0
webrtc-adapter.d.ts

@@ -0,0 +1,15 @@
+declare module 'webrtc-adapter' {
+  interface BrowserDetails {
+    browser: 'Not a browser.' | 'Not a supported browser.' | 'firefox' | 'chrome' | 'safari' | 'edge',
+    version: number | null,
+    supportsUnifiedPlan?: boolean
+  }
+
+  interface Adapter {
+    browserDetails: BrowserDetails;
+  }
+
+  var adapter: Adapter;
+
+  export default adapter;
+}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików