Offload functions to worker threads with shared memory primitives for Node.js.
8
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: formatting fixes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+12 -10
+1 -1
.changeset/async-worker-cleanup.md
··· 1 1 --- 2 - "moroutine": minor 2 + 'moroutine': minor 3 3 --- 4 4 5 5 Graceful async worker pool shutdown
+1 -1
.changeset/per-worker-dispatch.md
··· 1 1 --- 2 - "moroutine": minor 2 + 'moroutine': minor 3 3 --- 4 4 5 5 Per-worker dispatch with `assign()` and `run.workers`
+2 -2
README.md
··· 74 74 { 75 75 await using run = workers(4); 76 76 77 - run(longTask(run.signal)); // task can react to abort 78 - run(otherTask()); // runs to completion 77 + run(longTask(run.signal)); // task can react to abort 78 + run(otherTask()); // runs to completion 79 79 } 80 80 // signal fired, waited for both tasks, then workers terminated 81 81 ```
+3 -1
src/execute.ts
··· 170 170 worker.postMessage(msg, [...extracted.transfer, ...ports, port2] as any[]); 171 171 172 172 let resolveDone: () => void; 173 - const donePromise = new Promise<void>((r) => { resolveDone = r; }); 173 + const donePromise = new Promise<void>((r) => { 174 + resolveDone = r; 175 + }); 174 176 175 177 const queue: T[] = []; 176 178 let done = false;
+4 -1
test/fixtures/async-dispose.ts
··· 8 8 9 9 export const waitForAbort = mo(import.meta, (signal: AbortSignal): Promise<string> => { 10 10 return new Promise((resolve) => { 11 - if (signal.aborted) { resolve('aborted'); return; } 11 + if (signal.aborted) { 12 + resolve('aborted'); 13 + return; 14 + } 12 15 signal.addEventListener('abort', () => resolve('aborted')); 13 16 }); 14 17 });
+1 -4
test/worker-handle.test.ts
··· 50 50 it('assign() works in a batch', async () => { 51 51 const run = workers(2); 52 52 try { 53 - const results = await run([ 54 - assign(run.workers[0], identity(1)), 55 - assign(run.workers[1], identity(2)), 56 - ]); 53 + const results = await run([assign(run.workers[0], identity(1)), assign(run.workers[1], identity(2))]); 57 54 assert.deepEqual(results, [1, 2]); 58 55 } finally { 59 56 run[Symbol.dispose]();