function waitForMsgType(target, type) {
return new Promise(resolve => {
target.addEventListener('message', function onMsg({ data }) {
if (data == null || data.type !== type) return;
target.removeEventListener('message', onMsg);
resolve(data);
});
});
}
waitForMsgType(self, 'wasm_bindgen_worker_init').then(async data => {
const pkg = await import(data.mainJS);
await pkg.default(data.module, data.memory);
postMessage({ type: 'wasm_bindgen_worker_ready' });
pkg.wbg_rayon_start_worker(data.receiver);
});
let _workers;
export async function startWorkers(module, memory, builder) {
if (builder.numThreads() === 0) {
throw new Error(`num_threads must be > 0.`);
}
const workerInit = {
type: 'wasm_bindgen_worker_init',
module,
memory,
receiver: builder.receiver(),
mainJS: builder.mainJS()
};
_workers = await Promise.all(
Array.from({ length: builder.numThreads() }, async () => {
let scriptBlob = await fetch(import.meta.url).then(r => r.blob());
let url = URL.createObjectURL(scriptBlob);
const worker = new Worker(url, {
type: 'module'
});
worker.postMessage(workerInit);
await waitForMsgType(worker, 'wasm_bindgen_worker_ready');
URL.revokeObjectURL(url);
return worker;
})
);
builder.build();
}