opentok-network-test-js
Version:
Precall network test for applications using the OpenTok platform.
69 lines (59 loc) • 1.93 kB
text/typescript
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 };
}