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

  1. Wait for the shared worker's ready/subscribe promise or 'available' notification before calling post().
  2. Move post() calls out of module top-level code into test bodies or async setup that awaits readiness.
  3. Check the shared worker for startup errors (its error would surface via the channel error branch).
  4. 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

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


AI-assisted analysis of avajs/ava@bbfd946322 (2026-09-02). Data as JSON: /api/errors/34391048c0fbdf70. Report an issue: GitHub.