import { get } from '../../util'; export type Browser = 'Chrome' | 'Firefox' | 'not a browser' | 'unsupported browser' | 'WebKit browser without WebRTC support' | 'Safari' | 'Internet Explorer' | 'Edge' | 'non-Chromium Edge' | 'Opera'; function detectBrowser(): Browser { const navigator = window && window.navigator; // Fail early if it's not a browser if (typeof window === 'undefined' || !window.navigator) { return 'not a browser'; } // Firefox. if (get('mozGetUserMedia', navigator)) { return 'Firefox'; } if (get('webkitGetUserMedia', navigator)) { // Chrome, Chromium, Webview, Opera, and Edge 79+ all use the chrome shim // eslint-disable-next-line no-prototype-builtins if (window.hasOwnProperty('webkitRTCPeerConnection')) { if (navigator.userAgent.match(/Edg/)) { return 'Edge'; } if (navigator.userAgent.match(/Opera|OPR\//)) { return 'Opera'; } return 'Chrome'; } if (navigator.userAgent.match(/Version\/(\d+).(\d+)/)) { return 'Safari'; } return 'WebKit browser without WebRTC support'; } if (navigator.mediaDevices && navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)) { // Edge. return 'non-Chromium Edge'; } if (navigator.userAgent.indexOf('MSIE ') > 0 || !!navigator.userAgent.match(/Trident.*rv:11\./)) { return 'Internet Explorer'; } if (navigator.mediaDevices && navigator.userAgent.match(/AppleWebKit\/(\d+)\./)) { // Safari, with webkitGetUserMedia removed. return 'Safari'; } // Default fallthrough: not supported. return 'unsupported browser'; } export default function isSupportedBrowser(): { supported: boolean; browser: Browser } { const supportedBrowsers = ['Chrome', 'Safari', 'Edge', 'Opera']; const browser = detectBrowser(); const supported = supportedBrowsers.indexOf(browser) > -1; return { browser, supported }; }