function waitForMsgType(target, type) {
return new Promise(resolve => {
target.addEventListener('message', function onMsg({ data }) {
if (data?.type !== type) return;
target.removeEventListener('message', onMsg);
resolve(data);
});
});
}
waitForMsgType(self, 'wasm_bindgen_worker_init').then(async ({ init, receiver }) => {
const pkg = await import('../../..');
await pkg.default(init);
postMessage({ type: 'wasm_bindgen_worker_ready' });
pkg.wbg_rayon_start_worker(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',
init: { module_or_path: module, memory },
receiver: builder.receiver()
};
_workers = await Promise.all(
Array.from({ length: builder.numThreads() }, async () => {
const worker = new Worker(new URL('./workerHelpers.js', import.meta.url), {
type: 'module'
});
worker.postMessage(workerInit);
await waitForMsgType(worker, 'wasm_bindgen_worker_ready');
return worker;
})
);
builder.build();
}