41 lines
1.3 KiB
JavaScript
41 lines
1.3 KiB
JavaScript
|
|
import { parentPort, Worker as NodeWorker } from "node:worker_threads";
|
||
|
|
|
||
|
|
if (!parentPort) throw new Error("browser-worker-node-shim requires a worker_threads parent port.");
|
||
|
|
|
||
|
|
class BrowserStyleNestedWorker {
|
||
|
|
constructor(url) {
|
||
|
|
const moduleUrl = url instanceof URL ? url.href : new URL(String(url), import.meta.url).href;
|
||
|
|
this.onmessage = null;
|
||
|
|
this.onerror = null;
|
||
|
|
this._worker = new NodeWorker(new URL("./browser-nested-worker-node-shim.mjs", import.meta.url), {
|
||
|
|
type: "module",
|
||
|
|
workerData: { moduleUrl },
|
||
|
|
});
|
||
|
|
this._worker.on("message", (data) => this.onmessage?.({ data }));
|
||
|
|
this._worker.on("error", (error) => this.onerror?.({ message: error?.message || String(error), error }));
|
||
|
|
}
|
||
|
|
|
||
|
|
postMessage(message, transfer = []) {
|
||
|
|
this._worker.postMessage(message, transfer);
|
||
|
|
}
|
||
|
|
|
||
|
|
terminate() {
|
||
|
|
return this._worker.terminate();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
globalThis.Worker = BrowserStyleNestedWorker;
|
||
|
|
globalThis.self = {
|
||
|
|
onmessage: null,
|
||
|
|
postMessage(message, transfer = []) {
|
||
|
|
parentPort.postMessage(message, transfer);
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
await import("../src/mapPatchWorker.js");
|
||
|
|
|
||
|
|
if (typeof globalThis.self.onmessage !== "function") {
|
||
|
|
throw new Error("mapPatchWorker did not install its browser Worker message handler.");
|
||
|
|
}
|
||
|
|
|
||
|
|
parentPort.on("message", (data) => globalThis.self.onmessage({ data }));
|