'use strict'; import { ENVIRONMENT_TYPE_POPUP, PLATFORM_BRAVE, PLATFORM_FIREFOX, } from '../../../shared/constants/app'; import { getEnvironmentType, getPlatform } from '../../../app/scripts/lib/util'; class WebcamUtils { static async checkStatus() { const isPopup = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP; const isFirefoxOrBrave = getPlatform() === (PLATFORM_FIREFOX || PLATFORM_BRAVE); const devices = await window.navigator.mediaDevices.enumerateDevices(); const webcams = devices.filter((device) => device.kind === 'videoinput'); const hasWebcam = webcams.length > 0; // A non-empty-string label implies that the webcam has been granted permission, as // otherwise the label is kept blank to prevent fingerprinting const hasWebcamPermissions = webcams.some( (webcam) => webcam.label && webcam.label.length > 0, ); if (hasWebcam) { let environmentReady = true; if ((isFirefoxOrBrave && isPopup) || (isPopup && !hasWebcamPermissions)) { environmentReady = false; } return { permissions: hasWebcamPermissions, environmentReady, }; } const error = new Error('No webcam found'); error.type = 'NO_WEBCAM_FOUND'; throw error; } } export default WebcamUtils;