mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-23 06:10:02 +08:00
- Add native worker execution with isolated module state, structured messages, and lifecycle controls. - Support shared buffers and integer atomics with coordinated runtime ownership and cancellation. - Extend compiler, runtime-pack, differential, and compatibility coverage for native concurrency.
26 lines
1.3 KiB
TypeScript
26 lines
1.3 KiB
TypeScript
import { Worker, isMainThread, parentPort, workerData } from "node:worker_threads";
|
|
if (isMainThread) {
|
|
const buffer = new SharedArrayBuffer(32);
|
|
const values = new Int32Array(buffer);
|
|
const view = new DataView(buffer, 16, 8);
|
|
view.setInt32(0, 123, true);
|
|
const worker = new Worker(new URL(import.meta.url), {workerData: {buffer, values, view}});
|
|
worker.on("message", (value: unknown) => {
|
|
if (value === "ready") {
|
|
for (let i = 0; i < 10000; i++) Atomics.add(values, 0, 1);
|
|
Atomics.store(values, 1, 1);
|
|
Atomics.notify(values, 1);
|
|
} else console.log(JSON.stringify(value));
|
|
});
|
|
worker.on("exit", (code: number) => console.log("exit", code, values[0], view.getInt32(0, true), buffer.byteLength));
|
|
} else {
|
|
const data = workerData as {buffer: SharedArrayBuffer, values: Int32Array, view: DataView};
|
|
const values = data.values;
|
|
parentPort!.postMessage("ready");
|
|
for (let i = 0; i < 10000; i++) Atomics.add(values, 0, 1);
|
|
while (Atomics.load(values, 1) === 0) Atomics.wait(values, 1, 0);
|
|
data.view.setInt32(0, data.view.getInt32(0, true) + 1, true);
|
|
const alias = new Int32Array(data.buffer, 16, 1);
|
|
parentPort!.postMessage({shared: data.buffer instanceof SharedArrayBuffer, alias: alias[0], same: data.values.buffer === data.buffer, offset: data.view.byteOffset});
|
|
}
|