var currentBrowser; var browserVersion; var isAndroid; var RTCBrowserType = { RTC_BROWSER_CHROME: "rtc_browser.chrome", RTC_BROWSER_OPERA: "rtc_browser.opera", RTC_BROWSER_FIREFOX: "rtc_browser.firefox", RTC_BROWSER_IEXPLORER: "rtc_browser.iexplorer", RTC_BROWSER_SAFARI: "rtc_browser.safari", getBrowserType: function () { return currentBrowser; }, isChrome: function () { return currentBrowser === RTCBrowserType.RTC_BROWSER_CHROME; }, isOpera: function () { return currentBrowser === RTCBrowserType.RTC_BROWSER_OPERA; }, isFirefox: function () { return currentBrowser === RTCBrowserType.RTC_BROWSER_FIREFOX; }, isIExplorer: function () { return currentBrowser === RTCBrowserType.RTC_BROWSER_IEXPLORER; }, isSafari: function () { return currentBrowser === RTCBrowserType.RTC_BROWSER_SAFARI; }, isTemasysPluginUsed: function () { return RTCBrowserType.isIExplorer() || RTCBrowserType.isSafari(); }, getFirefoxVersion: function () { return RTCBrowserType.isFirefox() ? browserVersion : null; }, getChromeVersion: function () { return RTCBrowserType.isChrome() ? browserVersion : null; }, usesPlanB: function() { return RTCBrowserType.isChrome() || RTCBrowserType.isOpera() || RTCBrowserType.isTemasysPluginUsed(); }, usesUnifiedPlan: function() { return RTCBrowserType.isFirefox(); }, /** * Whether the browser is running on an android device. */ isAndroid: function() { return isAndroid; } // Add version getters for other browsers when needed }; // detectOpera() must be called before detectChrome() !!! // otherwise Opera wil be detected as Chrome function detectChrome() { if (navigator.webkitGetUserMedia) { currentBrowser = RTCBrowserType.RTC_BROWSER_CHROME; var userAgent = navigator.userAgent.toLowerCase(); // We can assume that user agent is chrome, because it's // enforced when 'ext' streaming method is set var ver = parseInt(userAgent.match(/chrome\/(\d+)\./)[1], 10); console.log("This appears to be Chrome, ver: " + ver); return ver; } return null; } function detectOpera() { var userAgent = navigator.userAgent; if (userAgent.match(/Opera|OPR/)) { currentBrowser = RTCBrowserType.RTC_BROWSER_OPERA; var version = userAgent.match(/(Opera|OPR) ?\/?(\d+)\.?/)[2]; console.info("This appears to be Opera, ver: " + version); return version; } return null; } function detectFirefox() { if (navigator.mozGetUserMedia) { currentBrowser = RTCBrowserType.RTC_BROWSER_FIREFOX; var version = parseInt( navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10); console.log('This appears to be Firefox, ver: ' + version); return version; } return null; } function detectSafari() { if ((/^((?!chrome).)*safari/i.test(navigator.userAgent))) { currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI; console.info("This appears to be Safari"); // FIXME detect Safari version when needed return 1; } return null; } function detectIE() { var version; var ua = window.navigator.userAgent; var msie = ua.indexOf('MSIE '); if (msie > 0) { // IE 10 or older => return version number version = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); } var trident = ua.indexOf('Trident/'); if (!version && trident > 0) { // IE 11 => return version number var rv = ua.indexOf('rv:'); version = parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); } var edge = ua.indexOf('Edge/'); if (!version && edge > 0) { // IE 12 => return version number version = parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); } if (version) { currentBrowser = RTCBrowserType.RTC_BROWSER_IEXPLORER; console.info("This appears to be IExplorer, ver: " + version); } return version; } function detectBrowser() { var version; var detectors = [ detectOpera, detectChrome, detectFirefox, detectIE, detectSafari ]; // Try all browser detectors for (var i = 0; i < detectors.length; i++) { version = detectors[i](); if (version) return version; } console.error("Failed to detect browser type"); return undefined; } browserVersion = detectBrowser(); isAndroid = navigator.userAgent.indexOf('Android') != -1; module.exports = RTCBrowserType;