From 78ad2d2aa2544ab519808e867bb83c6409fef8d7 Mon Sep 17 00:00:00 2001 From: Alex Potsides Date: Wed, 12 Aug 2020 11:53:18 +0100 Subject: [PATCH] feat: detect support for WebRTC data channels (#56) The use of WebRTC in IPFS is only as a data channel, we don't use getUserMedia and sometimes the user has restricted access to this API so add a 'supports' test that is just for data channels. Fixes #50 --- src/supports.js | 3 ++- test/supports.spec.js | 42 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/supports.js b/src/supports.js index 3861448..3affb98 100644 --- a/src/supports.js +++ b/src/supports.js @@ -5,5 +5,6 @@ const globalThis = require('./globalthis') module.exports = { supportsFileReader: typeof self !== 'undefined' && 'FileReader' in self, supportsWebRTC: 'RTCPeerConnection' in globalThis && - (typeof navigator !== 'undefined' && typeof navigator.mediaDevices !== 'undefined' && 'getUserMedia' in navigator.mediaDevices) + (typeof navigator !== 'undefined' && typeof navigator.mediaDevices !== 'undefined' && 'getUserMedia' in navigator.mediaDevices), + supportsWebRTCDataChannels: 'RTCPeerConnection' in globalThis } diff --git a/test/supports.spec.js b/test/supports.spec.js index 2cf178d..c4e11b4 100644 --- a/test/supports.spec.js +++ b/test/supports.spec.js @@ -62,7 +62,7 @@ describe('supports', function () { } }) - it('supportsWebRTC should return true in Web Worker', function () { + it('supportsWebRTC should return false in Web Worker', function () { if (env.isWebWorker) { expect(supports.supportsWebRTC).to.be.false() } else { @@ -85,4 +85,44 @@ describe('supports', function () { this.skip() } }) + + it('supportsWebRTCDataChannels should return false in node', function () { + if (env.isNode) { + expect(supports.supportsWebRTCDataChannels).to.be.false() + } else { + this.skip() + } + }) + + it('supportsWebRTCDataChannels should return true in browser', function () { + if (env.isBrowser) { + expect(supports.supportsWebRTCDataChannels).to.be.true() + } else { + this.skip() + } + }) + + it('supportsWebRTCDataChannels should return false in Web Worker', function () { + if (env.isWebWorker) { + expect(supports.supportsWebRTCDataChannels).to.be.false() + } else { + this.skip() + } + }) + + it('supportsWebRTCDataChannels should return false in Electron main', function () { + if (env.isElectron && !env.isElectronRenderer) { + expect(supports.supportsWebRTCDataChannels).to.be.false() + } else { + this.skip() + } + }) + + it('supportsWebRTCDataChannels should return true in Electron renderer', function () { + if (env.isElectronRenderer) { + expect(supports.supportsWebRTCDataChannels).to.be.true() + } else { + this.skip() + } + }) })