@xylabs/threads
Version:
Web workers & worker threads as simple as a function call
89 lines (88 loc) • 3.03 kB
JavaScript
// 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