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.

test: verify async dispose waits for streaming tasks

+23 -1
+16 -1
test/async-dispose.test.ts
··· 1 1 import { describe, it } from 'node:test'; 2 2 import assert from 'node:assert/strict'; 3 3 import { workers } from 'moroutine'; 4 - import { slowTask, waitForAbort } from './fixtures/async-dispose.ts'; 4 + import { slowTask, waitForAbort, slowStream } from './fixtures/async-dispose.ts'; 5 5 6 6 describe('async dispose', () => { 7 7 it('waits for in-flight tasks to complete', async () => { ··· 40 40 await run[Symbol.asyncDispose](); 41 41 const elapsed = performance.now() - start; 42 42 assert.ok(elapsed < 500, `Expected fast teardown, took ${elapsed}ms`); 43 + }); 44 + 45 + it('waits for streaming task to finish', async () => { 46 + const run = workers(1); 47 + const results: number[] = []; 48 + const iterating = (async () => { 49 + for await (const n of run(slowStream(5))) { 50 + results.push(n); 51 + } 52 + })(); 53 + // Let a couple items flow before disposing 54 + await new Promise((r) => setTimeout(r, 60)); 55 + await run[Symbol.asyncDispose](); 56 + await iterating; 57 + assert.equal(results.length, 5); 43 58 }); 44 59 });
+7
test/fixtures/async-dispose.ts
··· 11 11 signal.addEventListener('abort', () => resolve('aborted')); 12 12 }); 13 13 }); 14 + 15 + export const slowStream = mo(import.meta, async function* (n: number) { 16 + for (let i = 0; i < n; i++) { 17 + await new Promise((r) => setTimeout(r, 20)); 18 + yield i; 19 + } 20 + });