comlink icon indicating copy to clipboard operation
comlink copied to clipboard

Is there an event that says the worker has loaded ?

Open zababurinsv opened this issue 3 years ago • 1 comments

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 ?

zababurinsv avatar Nov 06 '21 01:11 zababurinsv

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");

lrowe avatar Mar 23 '22 01:03 lrowe