libs/voicefocus/support.js (134 lines of code) (raw):

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.isOldChrome = exports.supportsWASMStreaming = exports.supportsSharedArrayBuffer = exports.supportsWASM = exports.supportsAudioWorklet = exports.supportsWorker = exports.supportsVoiceFocusWorker = exports.supportsWASMPostMessage = exports.isSafari = void 0; const loader_js_1 = require("./loader.js"); const isChrome = (global = globalThis) => { const ua = global.navigator.userAgent; return !!ua.match(/Chrom(?:e|ium)\/([0-9]+)/); }; const isSafari = (global = globalThis) => { const ua = global.navigator.userAgent; const hasSafari = ua.match(/Safari\//); const hasChrome = ua.match(/Chrom(?:e|ium)\//); return !!(hasSafari && !hasChrome); }; exports.isSafari = isSafari; const supportsWASMPostMessage = (global = globalThis) => { if (exports.isSafari(global)) { return false; } if (isChrome(global)) { const version = chromeVersion(global) || 0; return version < 95; } return true; }; exports.supportsWASMPostMessage = supportsWASMPostMessage; const supportsVoiceFocusWorker = (scope = globalThis, fetchConfig, logger) => __awaiter(void 0, void 0, void 0, function* () { if (!exports.supportsWorker(scope, logger)) { return false; } const workerURL = `${fetchConfig.paths.workers}worker-v1.js`; try { const worker = yield loader_js_1.loadWorker(workerURL, 'VoiceFocusTestWorker', fetchConfig, logger); try { worker.terminate(); } catch (e) { logger === null || logger === void 0 ? void 0 : logger.debug('Failed to terminate worker.', e); } return true; } catch (e) { logger === null || logger === void 0 ? void 0 : logger.info('Failed to fetch and instantiate test worker', e); return false; } }); exports.supportsVoiceFocusWorker = supportsVoiceFocusWorker; const supportsWorker = (scope = globalThis, logger) => { try { return !!scope.Worker; } catch (e) { logger === null || logger === void 0 ? void 0 : logger.info('Does not support Worker', e); return false; } }; exports.supportsWorker = supportsWorker; const supportsAudioWorklet = (scope = globalThis, logger) => { try { return !!scope.AudioWorklet && !!scope.AudioWorkletNode; } catch (e) { logger === null || logger === void 0 ? void 0 : logger.info('Does not support Audio Worklet', e); return false; } }; exports.supportsAudioWorklet = supportsAudioWorklet; const supportsWASM = (scope = globalThis, logger) => { try { return !!scope.WebAssembly && (!!scope.WebAssembly.compile || !!scope.WebAssembly.compileStreaming); } catch (e) { logger === null || logger === void 0 ? void 0 : logger.info('Does not support WASM', e); return false; } }; exports.supportsWASM = supportsWASM; const supportsSharedArrayBuffer = (scope = globalThis, window = globalThis, logger) => { try { return !!scope.SharedArrayBuffer && (!!window.chrome || !!scope.crossOriginIsolated); } catch (e) { logger === null || logger === void 0 ? void 0 : logger.info('Does not support SharedArrayBuffer.'); return false; } }; exports.supportsSharedArrayBuffer = supportsSharedArrayBuffer; const supportsWASMStreaming = (scope = globalThis, logger) => { var _a; try { return !!((_a = scope.WebAssembly) === null || _a === void 0 ? void 0 : _a.compileStreaming); } catch (e) { logger === null || logger === void 0 ? void 0 : logger.info('Does not support WASM streaming compilation', e); return false; } }; exports.supportsWASMStreaming = supportsWASMStreaming; const SUPPORTED_CHROME_VERSION = 90; const chromeVersion = (global = globalThis) => { try { if (!global.chrome) { return undefined; } } catch (e) { } const versionCheck = global.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9]+)/); if (!versionCheck) { return undefined; } return parseInt(versionCheck[1], 10); }; const isOldChrome = (global = globalThis, logger) => { const version = chromeVersion(global); if (!version) { return false; } if (version < SUPPORTED_CHROME_VERSION) { logger === null || logger === void 0 ? void 0 : logger.debug(`Chrome ${version} has incomplete SIMD support.`); return true; } return false; }; exports.isOldChrome = isOldChrome;