diff --git a/src/utils/browserCheck.ts b/src/utils/browserCheck.ts index 276dc1589ad..5354100e0be 100644 --- a/src/utils/browserCheck.ts +++ b/src/utils/browserCheck.ts @@ -77,3 +77,29 @@ export function checkBrowser() { showError(unsupportedWarning, { timeout: TOAST_PERMANENT_TIMEOUT }) } } + +/** + * Check if the browser supports WebRTC Encoded Transform (i.e. Firefox). + */ +export function supportsEncodedTransform() { + return (window.RTCRtpScriptTransform && window.RTCRtpSender && 'transform' in RTCRtpSender.prototype) +} + +/** + * Check if the browser supports insertable streams (i.e. Chromium). + */ +export function supportsInsertableStreams() { + if (!(window.RTCRtpReceiver && 'createEncodedStreams' in RTCRtpReceiver.prototype && window.RTCRtpSender && 'createEncodedStreams' in RTCRtpSender.prototype)) { + return false + } + + // Feature-detect transferable streams which we need to operate in a worker. + // See https://groups.google.com/a/chromium.org/g/blink-dev/c/1LStSgBt6AM/m/hj0odB8pCAAJ + const stream = new ReadableStream() + try { + window.postMessage(stream, '*', [stream]) + return true + } catch { + return false + } +} diff --git a/src/utils/e2ee/encryption.js b/src/utils/e2ee/encryption.js index 36e0629350b..3d4384e0664 100644 --- a/src/utils/e2ee/encryption.js +++ b/src/utils/e2ee/encryption.js @@ -14,16 +14,11 @@ import Deferred from './JitsiDeferred.js' import E2EEcontext from './JitsiE2EEContext.js' import initializeOlm from './olm.js' import { hasTalkFeature, getTalkConfig } from '../../services/CapabilitiesManager.ts' +import { supportsEncodedTransform, supportsInsertableStreams } from '../browserCheck.ts' import Signaling from '../signaling.js' import Peer from '../webrtc/simplewebrtc/peer.js' import SimpleWebRTC from '../webrtc/simplewebrtc/simplewebrtc.js' -const supportsTransform - // Firefox - = (window.RTCRtpScriptTransform && window.RTCRtpSender && 'transform' in RTCRtpSender.prototype) - // Chrome - || (window.RTCRtpReceiver && 'createEncodedStreams' in RTCRtpReceiver.prototype && window.RTCRtpSender && 'createEncodedStreams' in RTCRtpSender.prototype) - // Period which we'll wait before updating / rotating our keys when a participant // joins or leaves. const DEBOUNCE_PERIOD = 5000 @@ -45,7 +40,7 @@ class Encryption { * @async */ static async isSupported() { - if (!supportsTransform) { + if (!supportsEncodedTransform() && !supportsInsertableStreams()) { throw new Error('stream transform is not supported') } diff --git a/src/utils/webrtc/simplewebrtc/webrtc.js b/src/utils/webrtc/simplewebrtc/webrtc.js index f1c4feb0bdd..34d3218c746 100644 --- a/src/utils/webrtc/simplewebrtc/webrtc.js +++ b/src/utils/webrtc/simplewebrtc/webrtc.js @@ -10,6 +10,7 @@ import webrtcSupport from 'webrtcsupport' import localMedia from './localmedia.js' import Peer from './peer.js' +import { supportsInsertableStreams } from '../../browserCheck.ts' /** * @param {object} opts the options object. @@ -37,6 +38,10 @@ export default function WebRTC(opts) { } let item + if (supportsInsertableStreams()) { + this.config.peerConnectionConfig.encodedInsertableStreams = true + } + // We also allow a 'logger' option. It can be any object that implements // log, warn, and error methods. // We log nothing by default, following "the rule of silence":