UNPKG

@aktivco-it/rutoken-plugin-bootstrap

Version:
131 lines (96 loc) 4.42 kB
import Bowser from 'bowser'; import { NoSupportOsError, NoSupportPlatformError, NoSupportBrowserError, NoSupportBrowserVersionError, NoSupportPluginVersionError, } from './supportError'; import supportedBrowsersConfig from './supportedBrowsersConfig'; class BrowserCompatibility { constructor() { const detectedBrowser = Bowser.getParser(window.navigator.userAgent); if (window.navigator.userAgent.includes('SputnikBrowser')) { detectedBrowser.parsedResult.browser = { name: 'SputnikBrowser', version: window.navigator.userAgent.split('SputnikBrowser/')[1].split(' ')[0], }; } if (window.navigator.userAgent.includes('Chromium GOST')) { detectedBrowser.parsedResult.browser = { name: 'Chromium', version: window.navigator.userAgent.split('Chrome/')[1].split(' ')[0], }; } this.detectedBrowser = detectedBrowser; this.defaultOS = "Default"; this.browser = detectedBrowser.getBrowser(); this.os = detectedBrowser.getOS(); this.platform = detectedBrowser.getPlatform(); } getBrs() { const os = supportedBrowsersConfig[this.platform.type]; if (!os) throw new NoSupportPlatformError(); if (window.navigator.maxTouchPoints > 0 && this.os.name === 'macOS') { //detect ios safari with userAgent as desctop setting throw new NoSupportPlatformError(); } const browsers = !os[this.os.name] ? os[this.defaultOS] : os[this.os.name]; if (!browsers) throw new NoSupportOsError(Object.keys(os)); const brs = !browsers[this.browser.name] ? os[this.defaultOS][this.browser.name] : browsers[this.browser.name]; if (!brs) throw new NoSupportBrowserError(this.browser.name, Object.keys(browsers)); this.brs = Array.isArray(brs) ? brs : brs.versions; const detector = this.detectedBrowser; const browserName = this.browser.name; const lastVersion = this.brs.reduce((previous, current) => { if (previous.pluginVersion >= current.pluginVersion) { if (detector.satisfies({ [browserName]: previous.browserSupportedVersions })) { return previous; } return current; } return current; }); if (this.brs != null && lastVersion != null) { this.browserConfigVersion = lastVersion; this.brs = [lastVersion]; } else { throw new NoSupportPluginVersionError(this.os.name); } } needToCheckInstalledExtension() { return this.browserConfigVersion.extensionCheck; } isCurrentBrowserSupported() { this.getBrs(); } isVersionValid(currentVersion, minVersion) { const splitVersions = (val) => val.replace(/[^0-9.]/g, '').split('.').map(Number); const current = splitVersions(currentVersion); const minimum = splitVersions(minVersion); for (let i = 0; i < Math.max(current.length, minimum.length); i++) { const curr = current[i] || 0, min = minimum[i] || 0; if (curr != min) { return curr > min; } } return true; } getSupportedBrowsersByPluginVersion(version) { const versions = this.brs; for (let index = 0; index < versions.length; index += 1) { const x = versions[index]; if (this.isVersionValid(version, x.pluginVersion)) { const brs = { [this.browser.name]: x.browserSupportedVersions }; const isValid = this.detectedBrowser.satisfies(brs); if (isValid) return; if(!this.browser.version && x.allowUnknownBrowserVersion) return; if (index != versions.length - 1) continue; const os = supportedBrowsersConfig[this.platform.type]; const browsers = os[this.os.name]; throw new NoSupportBrowserVersionError(this.browser, Object.keys(browsers)); } } throw new NoSupportPluginVersionError(this.os.name); } } export default BrowserCompatibility;