supports.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import webRTCAdapter_import from "webrtc-adapter";
  2. const webRTCAdapter: typeof webRTCAdapter_import =
  3. //@ts-ignore
  4. webRTCAdapter_import.default || webRTCAdapter_import;
  5. export const Supports = new (class {
  6. readonly isIOS = ["iPad", "iPhone", "iPod"].includes(navigator.platform);
  7. readonly supportedBrowsers = ["firefox", "chrome", "safari"];
  8. readonly minFirefoxVersion = 59;
  9. readonly minChromeVersion = 72;
  10. readonly minSafariVersion = 605;
  11. isWebRTCSupported(): boolean {
  12. return typeof RTCPeerConnection !== "undefined";
  13. }
  14. isBrowserSupported(): boolean {
  15. const browser = this.getBrowser();
  16. const version = this.getVersion();
  17. const validBrowser = this.supportedBrowsers.includes(browser);
  18. if (!validBrowser) return false;
  19. if (browser === "chrome") return version >= this.minChromeVersion;
  20. if (browser === "firefox") return version >= this.minFirefoxVersion;
  21. if (browser === "safari")
  22. return !this.isIOS && version >= this.minSafariVersion;
  23. return false;
  24. }
  25. getBrowser(): string {
  26. return webRTCAdapter.browserDetails.browser;
  27. }
  28. getVersion(): number {
  29. return webRTCAdapter.browserDetails.version || 0;
  30. }
  31. isUnifiedPlanSupported(): boolean {
  32. const browser = this.getBrowser();
  33. const version = webRTCAdapter.browserDetails.version || 0;
  34. if (browser === "chrome" && version < this.minChromeVersion) return false;
  35. if (browser === "firefox" && version >= this.minFirefoxVersion) return true;
  36. if (
  37. !window.RTCRtpTransceiver ||
  38. !("currentDirection" in RTCRtpTransceiver.prototype)
  39. )
  40. return false;
  41. let tempPc: RTCPeerConnection;
  42. let supported = false;
  43. try {
  44. tempPc = new RTCPeerConnection();
  45. tempPc.addTransceiver("audio");
  46. supported = true;
  47. } catch (e) {
  48. } finally {
  49. if (tempPc) {
  50. tempPc.close();
  51. }
  52. }
  53. return supported;
  54. }
  55. toString(): string {
  56. return `Supports:
  57. browser:${this.getBrowser()}
  58. version:${this.getVersion()}
  59. isIOS:${this.isIOS}
  60. isWebRTCSupported:${this.isWebRTCSupported()}
  61. isBrowserSupported:${this.isBrowserSupported()}
  62. isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;
  63. }
  64. })();