UNPKG

@xylabs/threads

Version:

Web workers & worker threads as simple as a function call

89 lines (88 loc) 3.03 kB
// src/master/get-bundle-url.browser.ts var bundleURL; function getBundleURLCached() { if (!bundleURL) { bundleURL = getBundleURL(); } return bundleURL; } function getBundleURL() { try { throw new Error("getBundleURL failed"); } catch (ex) { const err = ex; const matches = ("" + err.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\/\/[^\n)]+/g); if (matches) { return getBaseURL(matches[0]); } } return "/"; } function getBaseURL(url) { return ("" + url).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\/\/.+)?\/[^/]+(?:\?.*)?$/, "$1") + "/"; } // src/master/implementation.browser.ts var defaultPoolSize = typeof navigator !== "undefined" && navigator.hardwareConcurrency ? navigator.hardwareConcurrency : 4; var isAbsoluteURL = (value) => /^[A-Za-z][\d+.A-Za-z\-]*:/.test(value); function createSourceBlobURL(code) { const blob = new Blob([code], { type: "application/javascript" }); return URL.createObjectURL(blob); } function selectWorkerImplementation() { if (typeof Worker === "undefined") { return class NoWebWorker { constructor() { throw new Error( "No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers." ); } }; } class WebWorker extends Worker { constructor(url, options) { if (typeof url === "string" && options && options._baseURL) { url = new URL(url, options._baseURL); } else if (typeof url === "string" && !isAbsoluteURL(url) && /^file:\/\//i.test(getBundleURLCached())) { url = new URL(url, getBundleURLCached().replace(/\/[^/]+$/, "/")); if (options?.CORSWorkaround ?? true) { url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`); } } if (typeof url === "string" && isAbsoluteURL(url) && (options?.CORSWorkaround ?? true)) { url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`); } super(url, options); } } class BlobWorker extends WebWorker { constructor(blob, options) { const url = globalThis.URL.createObjectURL(blob); super(url, options); } static fromText(source, options) { const blob = new globalThis.Blob([source], { type: "text/javascript" }); return new BlobWorker(blob, options); } } return { blob: BlobWorker, default: WebWorker }; } var implementation; function getWorkerImplementation() { if (!implementation) { implementation = selectWorkerImplementation(); } return implementation; } function isWorkerRuntime() { const isWindowContext = typeof globalThis !== "undefined" && typeof Window !== "undefined" && globalThis instanceof Window; return typeof globalThis !== "undefined" && self["postMessage"] && !isWindowContext ? true : false; } export { defaultPoolSize, getWorkerImplementation, isWorkerRuntime }; //# sourceMappingURL=implementation.browser.mjs.map