avajs/ava · error · Error
Shared worker is not yet available
Error message
Shared worker is not yet available
What it means
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.
Source
Thrown at lib/worker/channel.js:229
messageEmitters.add(emitter);
try {
sharedWorkerHandle.ref();
for await (const [message] of events.on(emitter, 'message')) {
yield message;
}
} finally {
sharedWorkerHandle.unref();
messageEmitters.delete(emitter);
}
},
post(data, replyTo) {
if (error !== null) {
throw error;
}
if (!currentlyAvailable) {
throw new Error('Shared worker is not yet available');
}
const messageId = `${channelId}/message/${++messageCounter}`;
ourPort.postMessage({
type: 'message',
messageId,
replyTo,
data,
});
return messageId;
},
},
};
}
View on GitHub (pinned to bbfd946322)
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.
Example fix
// before
import {worker} from '../fixtures/my-shared-worker.mjs';
worker.post({type: 'ping'}); // may run before worker is available
// after
import {worker} from '../fixtures/my-shared-worker.mjs';
await worker.available(); // or subscribe/await readiness
worker.post({type: 'ping'}); Defensive patterns
Strategy: retry
Validate before calling
function postWhenReady(worker, data, {timeoutMs = 5000, intervalMs = 50} = {}) {
const deadline = Date.now() + timeoutMs;
return new Promise((resolve, reject) => {
(function attemptPost() {
try { resolve(worker.post(data)); }
catch (err) {
if (err.message === 'Shared worker is not yet available' && Date.now() < deadline) {
setTimeout(attemptPost, intervalMs);
} else reject(err);
}
})();
});
} Type guard
const isWorkerReady = (worker) => worker.available === true;
Try / catch
try {
worker.post(message);
} catch (err) {
if (err.message === 'Shared worker is not yet available') {
await workerReady; // await readiness, then post
worker.post(message);
} else throw err;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Options have not yet been set
- Options have already been set
- Shared workers can be used only when worker threads are enab
- This version of AVA (${pkg.version}) does not support any of
- The `any` property of the second argument to `${assertion}`
AI-assisted analysis of avajs/ava@bbfd946322 (2026-09-02).
Data as JSON: /api/errors/34391048c0fbdf70.
Report an issue: GitHub.