Something went wrong. Try again.
Offload functions to worker threads with shared memory primitives for Node.js.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172import { describe, it } from 'node:test';import assert from 'node:assert/strict';import { workers, transfer } from 'moroutine';import { sumBuffer, sumUint8, makeBuffer } from './fixtures/transfer.ts';
describe('transfer', () => { it('transfers an ArrayBuffer to a worker (zero-copy)', async () => { const buf = new ArrayBuffer(4); const view = new Uint8Array(buf); view[0] = 1; view[1] = 2; view[2] = 3; view[3] = 4;
const run = workers(1); try { const sum = await run(sumBuffer(transfer(buf))); assert.equal(sum, 10); // Original buffer should be detached after transfer assert.equal(buf.byteLength, 0); } finally { run[Symbol.dispose](); } });
it('transfers a Uint8Array to a worker via its buffer', async () => { const arr = new Uint8Array([5, 10, 15, 20]); const originalBuffer = arr.buffer;
const run = workers(1); try { const sum = await run(sumUint8(transfer(arr))); assert.equal(sum, 50); // Underlying buffer should be detached after transfer assert.equal(originalBuffer.byteLength, 0); } finally { run[Symbol.dispose](); } });
it('auto-transfers return values from worker (zero-copy)', async () => { const run = workers(1); try { const buf = await run(makeBuffer(4)); const view = new Uint8Array(buf); assert.equal(buf.byteLength, 4); assert.deepEqual([...view], [1, 2, 3, 4]); } finally { run[Symbol.dispose](); } });
it('without transfer, buffer is copied (not detached)', async () => { const buf = new ArrayBuffer(4); const view = new Uint8Array(buf); view[0] = 1; view[1] = 2; view[2] = 3; view[3] = 4;
const run = workers(1); try { const sum = await run(sumBuffer(buf)); assert.equal(sum, 10); // Original buffer should NOT be detached (it was copied) assert.equal(buf.byteLength, 4); } finally { run[Symbol.dispose](); } });});