comlink
comlink copied to clipboard
Is there an event that says the worker has loaded ?
I have this worker.
main.mjs
let worker = Comlink.wrap(new Worker(new URL('./worker.mjs', import.meta.url), { type: "module" }));
worker.mjs
(async () => {
let obj = {
list: {
dir: list
},
read: {
dir: readdir,
file: readFile,
},
write: {
files: mount,
},
stream: {
img: read
},
call: (call) => {
console.log('ssss', call('test'))
},
_health: () => {
console.log('health')
}
}
Comlink.expose(obj)
})()
These methods don't work right away.
It is not work.
let worker = Comlink.wrap(new Worker(new URL('./worker.mjs', import.meta.url), { type: "module" }));
worker._health()
How can I figure out when the worker code has loaded ?
I've found it necessary to postMessage from worker to main to signal that the obj has been exposed. In the main module you can wrap worker construction in a Promise that resolves when the ready message is received:
// main.js
const readyWorker = await new Promise((resolve, reject) => {
const worker = new Worker(new URL("./worker.js", import.meta.url), { type: "module" });
worker.addEventListener("error", reject);
worker.addEventListener(
"message",
(msg) => {
worker.removeEventListener("error", reject);
msg.data === "ready" ? resolve(worker) : reject(msg);
},
{ once: true }
);
});
const obj = Comlink.wrap(readyWorker);
// worker.js
const obj = await getObj();
Comlink.expose(obj);
self.postMessage("ready");