{"record":{"id":"34391048c0fbdf70","repo":"avajs/ava","slug":"shared-worker-is-not-yet-available","errorCode":null,"errorMessage":"Shared worker is not yet available","messagePattern":"Shared worker is not yet available","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"lib/worker/channel.js","lineNumber":229,"sourceCode":"\t\t\t\tmessageEmitters.add(emitter);\n\t\t\t\ttry {\n\t\t\t\t\tsharedWorkerHandle.ref();\n\t\t\t\t\tfor await (const [message] of events.on(emitter, 'message')) {\n\t\t\t\t\t\tyield message;\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tsharedWorkerHandle.unref();\n\t\t\t\t\tmessageEmitters.delete(emitter);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tpost(data, replyTo) {\n\t\t\t\tif (error !== null) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\n\t\t\t\tif (!currentlyAvailable) {\n\t\t\t\t\tthrow new Error('Shared worker is not yet available');\n\t\t\t\t}\n\n\t\t\t\tconst messageId = `${channelId}/message/${++messageCounter}`;\n\t\t\t\tourPort.postMessage({\n\t\t\t\t\ttype: 'message',\n\t\t\t\t\tmessageId,\n\t\t\t\t\treplyTo,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\n\t\t\t\treturn messageId;\n\t\t\t},\n\t\t},\n\t};\n}\n","sourceCodeStart":211,"sourceCodeEnd":245,"githubUrl":"https://github.com/avajs/ava/blob/bbfd946322fdeca2b547a691d947fb4e18c0c67f/lib/worker/channel.js#L211-L245","documentation":"In AVA's worker channel for shared workers, the post() method on the exposed API throws if the channel's error is set or if the shared worker has not finished becoming available yet. Posting a message before the shared worker module has loaded and signaled availability is rejected with this Error rather than silently queueing.","triggerScenarios":"Calling worker.post()/the shared worker's exposed post() during module top-level evaluation before the 'available' event; sending messages immediately after creating the channel without awaiting readiness; a shared worker that failed to subscribe leaving currentlyAvailable false.","commonSituations":"Test or shared-worker code that fires messages at import time; race between shared worker startup and first use in parallel test files; shared worker crashed on initialization so availability never flips to true.","solutions":["Wait for the shared worker's ready/subscribe promise or 'available' notification before calling post().","Move post() calls out of module top-level code into test bodies or async setup that awaits readiness.","Check the shared worker for startup errors (its error would surface via the channel error branch).","Add a readiness gate/queue in your code: buffer messages until availability is confirmed."],"exampleFix":"// before\nimport {worker} from '../fixtures/my-shared-worker.mjs';\nworker.post({type: 'ping'}); // may run before worker is available\n\n// after\nimport {worker} from '../fixtures/my-shared-worker.mjs';\nawait worker.available(); // or subscribe/await readiness\nworker.post({type: 'ping'});","handlingStrategy":"retry","validationCode":"function postWhenReady(worker, data, {timeoutMs = 5000, intervalMs = 50} = {}) {\n  const deadline = Date.now() + timeoutMs;\n  return new Promise((resolve, reject) => {\n    (function attemptPost() {\n      try { resolve(worker.post(data)); }\n      catch (err) {\n        if (err.message === 'Shared worker is not yet available' && Date.now() < deadline) {\n          setTimeout(attemptPost, intervalMs);\n        } else reject(err);\n      }\n    })();\n  });\n}","typeGuard":"const isWorkerReady = (worker) => worker.available === true;","tryCatchPattern":"try {\n  worker.post(message);\n} catch (err) {\n  if (err.message === 'Shared worker is not yet available') {\n    await workerReady; // await readiness, then post\n    worker.post(message);\n  } else throw err;\n}","preventionTips":["Never post() at module top-level; await worker readiness first","Subscribe to the shared worker's ready/subscribe handshake before messaging","Log and handle shared-worker startup errors, which leave availability false"],"tags":["ava","shared-worker","race-condition","initialization"],"backgroundTag":"resource-not-ready","analyzedSha":"bbfd946322fdeca2b547a691d947fb4e18c0c67f","analyzedAt":"2026-09-02T01:24:43.834Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}