···11+// Zero-copy transfer of large buffers to and from workers.
22+// The input is transferred (moved) to the worker — no copy on send.
33+// The result is auto-transferred back — no copy on return.
44+// Requires Node v24+.
55+//
66+// Run: node examples/transfer/main.ts
77+88+import { workers, transfer } from '../../src/index.ts';
99+import { processImage } from './process-image.ts';
1010+1111+// Simulate a 1MB image
1212+const size = 1_000_000;
1313+const pixels = new Uint8Array(size);
1414+for (let i = 0; i < size; i++) {
1515+ pixels[i] = i % 256;
1616+}
1717+1818+console.log(`Image size: ${size} bytes`);
1919+console.log(`First 5 pixels: [${[...pixels.slice(0, 5)]}]`);
2020+2121+{
2222+ using run = workers(1);
2323+2424+ const start = performance.now();
2525+ const result = await run(processImage(transfer(pixels)));
2626+ const elapsed = (performance.now() - start).toFixed(1);
2727+2828+ console.log(`\nProcessed in ${elapsed}ms (zero-copy transfer)`);
2929+ console.log(`First 5 result: [${[...result.slice(0, 5)]}]`);
3030+ console.log(`\nOriginal buffer detached: ${pixels.buffer.byteLength === 0}`);
3131+}
+10
examples/transfer/process-image.ts
···11+import { mo } from '../../src/index.ts';
22+33+export const processImage = mo(import.meta, (pixels: Uint8Array): Uint8Array => {
44+ // Invert each pixel (simulate image processing)
55+ const result = new Uint8Array(pixels.length);
66+ for (let i = 0; i < pixels.length; i++) {
77+ result[i] = 255 - pixels[i];
88+ }
99+ return result;
1010+});