diff --git a/src/wasi.ts b/src/wasi.ts
index 2ed7aab..6d9c742 100644
--- a/src/wasi.ts
+++ b/src/wasi.ts
@@ -817,6 +817,7 @@ export default class WASI {
in_ptr: number,
out_ptr: number,
nsubscriptions: number,
+ stored_events_count_ptr: number,
): number {
if (nsubscriptions === 0) {
return wasi.ERRNO_INVAL;
@@ -852,9 +853,9 @@ export default class WASI {
// Perform the wait
const endTime =
- (s.flags & wasi.SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME) !== 0
+ ((s.flags & wasi.SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME) !== 0
? timeout
- : getNow() + timeout;
+ : getNow() + timeout) - s.precision;
while (endTime > getNow()) {
// block until the timeout is reached
}
@@ -863,6 +864,8 @@ export default class WASI {
const event = new wasi.Event(s.userdata, wasi.ERRNO_SUCCESS, eventtype);
event.write_bytes(buffer, out_ptr);
+ buffer.setUint32(stored_events_count_ptr, 1, true);
+
return wasi.ERRNO_SUCCESS;
},
proc_exit(exit_code: number) {
diff --git a/src/wasi_defs.ts b/src/wasi_defs.ts
index e90f1a1..ce3b7e1 100644
--- a/src/wasi_defs.ts
+++ b/src/wasi_defs.ts
@@ -306,6 +306,7 @@ export class Subscription {
public eventtype: number,
public clockid: number,
public timeout: bigint,
+ public precision: bigint,
public flags: number,
) {}
@@ -315,7 +316,8 @@ export class Subscription {
view.getUint8(ptr + 8),
view.getUint32(ptr + 16, true),
view.getBigUint64(ptr + 24, true),
- view.getUint16(ptr + 36, true),
+ view.getBigUint64(ptr + 32, true),
+ view.getUint16(ptr + 40, true),
);
}
}
@@ -325,12 +327,19 @@ export class Event {
public userdata: bigint,
public error: number,
public eventtype: number,
+ // `eventtype::clock` events ignore this fields
+ public fd_readwrite_nbytes: bigint = 0n,
+ public fd_readwrite_flags: number = 0,
) {}
write_bytes(view: DataView, ptr: number) {
view.setBigUint64(ptr, this.userdata, true);
view.setUint16(ptr + 8, this.error, true);
view.setUint8(ptr + 10, this.eventtype);
+ if (this.eventtype !== EVENTTYPE_CLOCK) {
+ view.setBigUint64(ptr + 16, this.fd_readwrite_nbytes, true);
+ view.setUint16(ptr + 24, this.fd_readwrite_flags, true);
+ }
}
}
diff --git a/threads/bun.lockb b/threads/bun.lockb
index 645c083..1d9492c 100644
Binary files a/threads/bun.lockb and b/threads/bun.lockb differ
diff --git a/threads/examples/bun.lockb b/threads/examples/bun.lockb
index 005949e..9181711 100644
Binary files a/threads/examples/bun.lockb and b/threads/examples/bun.lockb differ
diff --git a/threads/examples/common_check/common.wasm b/threads/examples/common_check/common.wasm
new file mode 100644
index 0000000..37eb6e7
Binary files /dev/null and b/threads/examples/common_check/common.wasm differ
diff --git a/threads/examples/common_check/index.html b/threads/examples/common_check/index.html
new file mode 100644
index 0000000..49d5d4d
--- /dev/null
+++ b/threads/examples/common_check/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/threads/examples/common_check/index.ts b/threads/examples/common_check/index.ts
new file mode 100644
index 0000000..6badb84
--- /dev/null
+++ b/threads/examples/common_check/index.ts
@@ -0,0 +1,60 @@
+import { Fd } from "@bjorn3/browser_wasi_shim";
+import { Terminal } from "@xterm/xterm";
+import { FitAddon } from "xterm-addon-fit";
+import { WASIFarm } from "../../src";
+import { wait_async_polyfill } from "../../src";
+
+import "@xterm/xterm/css/xterm.css";
+
+wait_async_polyfill();
+
+const term = new Terminal({
+ convertEol: true,
+});
+const terminalElement = document.getElementById("terminal");
+
+if (!terminalElement) {
+ throw new Error("No terminal element found");
+}
+
+term.open(terminalElement);
+
+const fitAddon = new FitAddon();
+term.loadAddon(fitAddon);
+fitAddon.fit();
+
+term.writeln("Initializing...");
+
+class XtermStdio extends Fd {
+ term: Terminal;
+
+ constructor(term: Terminal) {
+ super();
+ this.term = term;
+ }
+ fd_write(data: Uint8Array) /*: {ret: number, nwritten: number}*/ {
+ const str = new TextDecoder().decode(data);
+ this.term.write(str);
+ console.log(str);
+ return { ret: 0, nwritten: data.byteLength };
+ }
+}
+
+const farm = new WASIFarm(
+ new XtermStdio(term),
+ new XtermStdio(term),
+ new XtermStdio(term),
+ [],
+);
+
+const worker = new Worker("./worker.ts", { type: "module" });
+
+worker.postMessage({
+ wasi_ref: farm.get_ref(),
+});
+
+worker.onmessage = (e) => {
+ if (e.data.done) {
+ term.writeln("All Done!!");
+ }
+};
diff --git a/threads/examples/common_check/main.rs b/threads/examples/common_check/main.rs
new file mode 100644
index 0000000..a48c7da
--- /dev/null
+++ b/threads/examples/common_check/main.rs
@@ -0,0 +1,51 @@
+// https://doc.rust-lang.org/book/ch16-02-message-passing.html
+// rustc +nightly --target wasm32-wasip1-threads main.rs -o common.wasm -Cstrip=debuginfo -Clto=fat
+// wasm-opt -Oz --enable-multivalue -o common_opt.wasm common.wasm
+
+use std::thread;
+
+fn main() {
+ let args = std::env::args().collect::>();
+ match args[0].as_str() {
+ "unreachable" => {
+ unreachable!();
+ }
+ "unreachable_child" => {
+ thread::spawn(|| {
+ unreachable!();
+ });
+ loop {}
+ }
+ "exit" => {
+ println!("exit {}", args[1]);
+ std::process::exit(args[1].parse().unwrap());
+ }
+ "exit_child" => {
+ thread::spawn(move || {
+ println!("exit {}", args[1]);
+ std::process::exit(args[1].parse().unwrap());
+ });
+ loop {}
+ }
+ "panic" => {
+ panic!("panic!");
+ }
+ "panic_child" => {
+ thread::spawn(|| {
+ panic!("panic!");
+ });
+ loop {}
+ }
+ "ok" => {
+ println!("ok");
+ }
+ "ok_child" => {
+ thread::spawn(|| {
+ println!("ok");
+ })
+ .join()
+ .unwrap();
+ }
+ _ => unreachable!(),
+ }
+}
diff --git a/threads/examples/common_check/thread_spawn.ts b/threads/examples/common_check/thread_spawn.ts
new file mode 100644
index 0000000..3bb3a39
--- /dev/null
+++ b/threads/examples/common_check/thread_spawn.ts
@@ -0,0 +1,5 @@
+import { thread_spawn_on_worker } from "../../src";
+
+self.onmessage = (event) => {
+ thread_spawn_on_worker(event.data);
+};
diff --git a/threads/examples/common_check/worker.ts b/threads/examples/common_check/worker.ts
new file mode 100644
index 0000000..14c063a
--- /dev/null
+++ b/threads/examples/common_check/worker.ts
@@ -0,0 +1,78 @@
+import { WASIFarmAnimal } from "../../src";
+
+import { wait_async_polyfill } from "../../src/index.js";
+
+wait_async_polyfill();
+
+self.onmessage = async (e) => {
+ const { wasi_ref } = e.data;
+
+ const wasm = await WebAssembly.compileStreaming(fetch("./common.wasm"));
+
+ const run = async (args: string[]) => {
+ const wasi = new WASIFarmAnimal(
+ wasi_ref,
+ args, // args\
+ [], // env
+ {
+ can_thread_spawn: true,
+ thread_spawn_worker_url: new URL("./thread_spawn.ts", import.meta.url)
+ .href,
+ // thread_spawn_worker_url: "./thread_spawn.ts",
+ thread_spawn_wasm: wasm,
+ worker_background_worker_url: new URL(
+ "./worker_background.ts",
+ import.meta.url,
+ ).href,
+ },
+ );
+
+ await wasi.wait_worker_background_worker();
+
+ try {
+ const code = await wasi.async_start_on_thread();
+ console.log(`"${args[0]}" exit code:`, code);
+ return code;
+ } catch (e) {
+ console.error(`"${args[0]}" error:`, e);
+ return "error";
+ }
+ };
+
+ const code = await run(["unreachable"]);
+ if (code !== "error") {
+ throw new Error("unreachable test failed");
+ }
+ const code2 = await run(["unreachable_child"]);
+ if (code2 !== "error") {
+ throw new Error("exit test failed");
+ }
+ const code3 = await run(["exit", "42"]);
+ if (code3 !== 42) {
+ throw new Error("exit test failed");
+ }
+ const code4 = await run(["exit_child", "43"]);
+ if (code4 !== 43) {
+ throw new Error("exit test failed");
+ }
+ const code5 = await run(["panic"]);
+ if (code5 !== "error") {
+ throw new Error("panic test failed");
+ }
+ const code6 = await run(["panic_child"]);
+ if (code6 !== "error") {
+ throw new Error("panic test failed");
+ }
+ const code7 = await run(["ok"]);
+ if (code7 !== 0) {
+ throw new Error("ok test failed");
+ }
+ const code8 = await run(["ok_child"]);
+ if (code8 !== 0) {
+ throw new Error("ok test failed");
+ }
+
+ console.log("All tests passed");
+
+ self.postMessage({ done: true });
+};
diff --git a/threads/examples/common_check/worker_background.ts b/threads/examples/common_check/worker_background.ts
new file mode 100644
index 0000000..582821e
--- /dev/null
+++ b/threads/examples/common_check/worker_background.ts
@@ -0,0 +1,8 @@
+// @ts-ignore
+import worker_background_worker from "../node_modules/@oligami/browser_wasi_shim-threads/dist/worker_background_worker.min.js";
+
+import { wait_async_polyfill } from "../../src/index.js";
+
+wait_async_polyfill();
+
+worker_background_worker();
diff --git a/threads/examples/package-lock.json b/threads/examples/package-lock.json
new file mode 100644
index 0000000..3fc1a9d
--- /dev/null
+++ b/threads/examples/package-lock.json
@@ -0,0 +1,812 @@
+{
+ "name": "examples",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@bjorn3/browser_wasi_shim": "^0.3.0",
+ "@oligami/browser_wasi_shim-threads": "file:../",
+ "@oligami/shared-object": "^0.1.1",
+ "@swc-node/register": "^1.11.1",
+ "@xterm/xterm": "^5.5",
+ "xterm-addon-fit": "^0.8.0"
+ }
+ },
+ "..": {
+ "name": "@oligami/browser_wasi_shim-threads",
+ "version": "0.2.1",
+ "license": "MIT OR Apache-2.0",
+ "dependencies": {
+ "@bjorn3/browser_wasi_shim": "^0.4.2"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "2.2.4",
+ "@swc/cli": "^0.7.8",
+ "@swc/core": "^1.13.5",
+ "better-typescript-lib": "^2.12.0",
+ "npm-watch": "^0.13.0",
+ "typescript": "^5.9.2",
+ "unplugin-swc": "^1.5.7",
+ "vite": "^7.1.6",
+ "vite-plugin-dts": "^4.5.4"
+ },
+ "peerDependencies": {
+ "@bjorn3/browser_wasi_shim": "^0.4.2"
+ }
+ },
+ "../..": {
+ "name": "@bjorn3/browser_wasi_shim",
+ "version": "0.4.2",
+ "license": "MIT OR Apache-2.0",
+ "devDependencies": {
+ "@swc/cli": "^0.1.62",
+ "@swc/core": "^1.3.37",
+ "@typescript-eslint/eslint-plugin": "^6.7.4",
+ "@typescript-eslint/parser": "^6.7.4",
+ "eslint": "^8.50.0",
+ "playwright": "^1.40.1",
+ "prettier": "^3.0.3",
+ "typescript": "^4.9.5"
+ }
+ },
+ "node_modules/@bjorn3/browser_wasi_shim": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@bjorn3/browser_wasi_shim/-/browser_wasi_shim-0.3.0.tgz",
+ "integrity": "sha512-FlRBYttPRLcWORzBe6g8nmYTafBkOEFeOqMYM4tAHJzFsQy4+xJA94z85a9BCs8S+Uzfh9LrkpII7DXr2iUVFg==",
+ "license": "MIT OR Apache-2.0"
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz",
+ "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
+ "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.5.tgz",
+ "integrity": "sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.5.0",
+ "@emnapi/runtime": "^1.5.0",
+ "@tybys/wasm-util": "^0.10.1"
+ }
+ },
+ "node_modules/@oligami/browser_wasi_shim-threads": {
+ "resolved": "..",
+ "link": true
+ },
+ "node_modules/@oligami/shared-object": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@oligami/shared-object/-/shared-object-0.1.1.tgz",
+ "integrity": "sha512-1N5k8IL+JjD0lPiLR+NXT7BFzvnlPaBioMry9RZOL+4YI54TpW4fmkgys9rlyVo4hZB0DL5t8pgzXxq+IIO7fg==",
+ "license": "MIT",
+ "dependencies": {
+ "shared-object": "file:"
+ }
+ },
+ "node_modules/@oxc-resolver/binding-android-arm-eabi": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.8.2.tgz",
+ "integrity": "sha512-7hykBf8S24IRbO4ueulT9SfYQjTeSOOimKc/CQrWXIWQy1WTePXSNcPq2RkVHO7DdLM8p8X4DVPYy+850Bo93g==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-android-arm64": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.8.2.tgz",
+ "integrity": "sha512-y41bxENMjlFuLSLCPWd4A+1PR7T5rU9+e7+4alje3sHgrpRmS3hIU+b1Cvck4qmcUgd0I98NmYxRM65kXGEObQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-darwin-arm64": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.8.2.tgz",
+ "integrity": "sha512-P/Zobk9OwQAblAMeiVyOtuX2LjGN8oq5HonvN3mp9S6Kx1GKxREbf5qW+g24Rvhf5WS7et+EmopUGRHSdAItGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-darwin-x64": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.8.2.tgz",
+ "integrity": "sha512-EMAQoO9uTiz2H0z71bVzTL77eoBAlN5+KD7HUc9ayYJ5TprU+Oeaml4y4fmsFyspSPN/vGJzEvOWl5GR0adwtw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-freebsd-x64": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.8.2.tgz",
+ "integrity": "sha512-Fzeupf4tH9woMm6O/pirEtuzO5docwTrs747Nxqh33OSkz7GbrevyDpx1Q1pc2l3JA2BlDX4zm18tW5ys65bjA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.8.2.tgz",
+ "integrity": "sha512-r9IiPTwc5STC2JahU/rfkbO2BE14MqAVmFbtF7uW7KFaZX/lUnFltkQ5jpwAgKqcef5aIZTJI95qJ03XZw08Rg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.8.2.tgz",
+ "integrity": "sha512-Q5D8FbxOyQYcWn5s9yv+DyFvcMSUXE87hmL9WG6ICdNZiMUA8DmIbzK1xEnOtDjorEFU44bwH3I9SnqL1kyOsg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-arm64-gnu": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.8.2.tgz",
+ "integrity": "sha512-8g2Y72gavZ8fesZD22cKo0Z8g8epynwShu7M+wpAoOq432IGUyUxPUKB2/nvyogPToaAlb1OsRiX/za8W4h8Aw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-arm64-musl": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.8.2.tgz",
+ "integrity": "sha512-N3BPWnIDRmHn/xPDZGKnzFwWxwH1hvs3aVnw4jvMAYarPNDZfbAY+fjHSIwkypV+ozMoJ5lK5PzRO5BOtEx2oQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.8.2.tgz",
+ "integrity": "sha512-AXW2AyjENmzNuZD3Z2TO1QWoZzfULWR1otDzw/+MAVMRXBy3W50XxDqNAflRiLB4o0aI0oDTwMfeyuhVv9Ur8Q==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.8.2.tgz",
+ "integrity": "sha512-oX+qxJdqOfrJUkGWmcNpu7wiFs6E7KH6hqUORkMAgl4yW+LZxPTz5P4DHvTqTFMywbs9hXVu2KQrdD8ROrdhMQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-riscv64-musl": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.8.2.tgz",
+ "integrity": "sha512-TG7LpxXjqlpD1aWnAXw6vMgY74KNV92exPixzEj4AKm4LdGsfnSWYTTJcTQ7deFMYxvBGrZ+qEy8DjGx+5w9GQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-s390x-gnu": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.8.2.tgz",
+ "integrity": "sha512-1PpXMq0KMD3CQPn3v/UqU4NM2JFjry+mLIH1d3iNVL2vlwRt9lxRfpXTiyiFJrtroUIyeKhw0QbHbF2UfnZVKQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-x64-gnu": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.8.2.tgz",
+ "integrity": "sha512-V1iYhEDbjQzj+o7JgTYVllRgNZ56Tjw0rPBWw03KJQ8Nphy00Vf7AySf22vV0K/93V1lPCgOSbI5/iunRnIfAw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-linux-x64-musl": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.8.2.tgz",
+ "integrity": "sha512-2hYNXEZSUM7qLEk4uuY3GmMqLU+860v+8PzbloVvRRjTWtHsLZyB5w+5p2gel38eaTcSYfZ2zvp3xcSpKDAbaw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-wasm32-wasi": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.8.2.tgz",
+ "integrity": "sha512-TjFqB+1siSqhd+S64Hf2qbxqWqtFIlld4DDEVotxOjj5//rX/6uwAL1HWnUHSNIni+wpcyQoXPhO3fBgppCvuA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@oxc-resolver/binding-win32-arm64-msvc": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.8.2.tgz",
+ "integrity": "sha512-fs0X6RcAC/khWbXIhPaYQjFHkrFVUtC2IOw1QEx2unRoe6M11tlYbY9NHr3VFBC3nwVpodX+b14A7jGMkAQK8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-win32-ia32-msvc": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.8.2.tgz",
+ "integrity": "sha512-7oEl1ThswVePprRQFc3tzW9IZgVi5xaus/KP3k56eKi2tYpAM0hBvehD8WBsmpgBEb7pe2pI08h9OZveAddt3Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@oxc-resolver/binding-win32-x64-msvc": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.8.2.tgz",
+ "integrity": "sha512-MngRjE/gpQpg3QcnWRqxX5Nbr/vZJSG7oxhXeHUeOhdFgg+0xCuGpDtwqFmGGVKnd6FQg0gKVo1MqDAERLkEPA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@swc-node/core": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.14.1.tgz",
+ "integrity": "sha512-jrt5GUaZUU6cmMS+WTJEvGvaB6j1YNKPHPzC2PUi2BjaFbtxURHj6641Az6xN7b665hNniAIdvjxWcRml5yCnw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@swc/core": ">= 1.13.3",
+ "@swc/types": ">= 0.1"
+ }
+ },
+ "node_modules/@swc-node/register": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.11.1.tgz",
+ "integrity": "sha512-VQ0hJ5jX31TVv/fhZx4xJRzd8pwn6VvzYd2tGOHHr2TfXGCBixZoqdPDXTiEoJLCTS2MmvBf6zyQZZ0M8aGQCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@swc-node/core": "^1.14.1",
+ "@swc-node/sourcemap-support": "^0.6.1",
+ "colorette": "^2.0.20",
+ "debug": "^4.4.1",
+ "oxc-resolver": "^11.6.1",
+ "pirates": "^4.0.7",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@swc/core": ">= 1.4.13",
+ "typescript": ">= 4.3"
+ }
+ },
+ "node_modules/@swc-node/sourcemap-support": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.6.1.tgz",
+ "integrity": "sha512-ovltDVH5QpdHXZkW138vG4+dgcNsxfwxHVoV6BtmTbz2KKl1A8ZSlbdtxzzfNjCjbpayda8Us9eMtcHobm38dA==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map-support": "^0.5.21",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@swc/core": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.5.tgz",
+ "integrity": "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "@swc/types": "^0.1.24"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.13.5",
+ "@swc/core-darwin-x64": "1.13.5",
+ "@swc/core-linux-arm-gnueabihf": "1.13.5",
+ "@swc/core-linux-arm64-gnu": "1.13.5",
+ "@swc/core-linux-arm64-musl": "1.13.5",
+ "@swc/core-linux-x64-gnu": "1.13.5",
+ "@swc/core-linux-x64-musl": "1.13.5",
+ "@swc/core-win32-arm64-msvc": "1.13.5",
+ "@swc/core-win32-ia32-msvc": "1.13.5",
+ "@swc/core-win32-x64-msvc": "1.13.5"
+ },
+ "peerDependencies": {
+ "@swc/helpers": ">=0.5.17"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.5.tgz",
+ "integrity": "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.13.5.tgz",
+ "integrity": "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.5.tgz",
+ "integrity": "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.5.tgz",
+ "integrity": "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.5.tgz",
+ "integrity": "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.5.tgz",
+ "integrity": "sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.5.tgz",
+ "integrity": "sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.5.tgz",
+ "integrity": "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.5.tgz",
+ "integrity": "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.5.tgz",
+ "integrity": "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "license": "Apache-2.0",
+ "peer": true
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.25",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz",
+ "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@xterm/xterm": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz",
+ "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==",
+ "license": "MIT"
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/napi-postinstall": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz",
+ "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==",
+ "license": "MIT",
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
+ }
+ },
+ "node_modules/oxc-resolver": {
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.8.2.tgz",
+ "integrity": "sha512-SM31gnF1l4T8YA7dkAcBhA+jc336bc8scy0Tetz6ndzGmV6c0R99SRnx6In0V5ffwvn1Isjo9I9EGSLF4xi3TA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "napi-postinstall": "^0.3.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ },
+ "optionalDependencies": {
+ "@oxc-resolver/binding-android-arm-eabi": "11.8.2",
+ "@oxc-resolver/binding-android-arm64": "11.8.2",
+ "@oxc-resolver/binding-darwin-arm64": "11.8.2",
+ "@oxc-resolver/binding-darwin-x64": "11.8.2",
+ "@oxc-resolver/binding-freebsd-x64": "11.8.2",
+ "@oxc-resolver/binding-linux-arm-gnueabihf": "11.8.2",
+ "@oxc-resolver/binding-linux-arm-musleabihf": "11.8.2",
+ "@oxc-resolver/binding-linux-arm64-gnu": "11.8.2",
+ "@oxc-resolver/binding-linux-arm64-musl": "11.8.2",
+ "@oxc-resolver/binding-linux-ppc64-gnu": "11.8.2",
+ "@oxc-resolver/binding-linux-riscv64-gnu": "11.8.2",
+ "@oxc-resolver/binding-linux-riscv64-musl": "11.8.2",
+ "@oxc-resolver/binding-linux-s390x-gnu": "11.8.2",
+ "@oxc-resolver/binding-linux-x64-gnu": "11.8.2",
+ "@oxc-resolver/binding-linux-x64-musl": "11.8.2",
+ "@oxc-resolver/binding-wasm32-wasi": "11.8.2",
+ "@oxc-resolver/binding-win32-arm64-msvc": "11.8.2",
+ "@oxc-resolver/binding-win32-ia32-msvc": "11.8.2",
+ "@oxc-resolver/binding-win32-x64-msvc": "11.8.2"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/shared-object": {
+ "resolved": "node_modules/@oligami/shared-object",
+ "link": true
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/typescript": {
+ "version": "5.9.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
+ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/xterm": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.3.0.tgz",
+ "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==",
+ "deprecated": "This package is now deprecated. Move to @xterm/xterm instead.",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/xterm-addon-fit": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz",
+ "integrity": "sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==",
+ "deprecated": "This package is now deprecated. Move to @xterm/addon-fit instead.",
+ "license": "MIT",
+ "peerDependencies": {
+ "xterm": "^5.0.0"
+ }
+ }
+ }
+}
diff --git a/threads/examples/package.json b/threads/examples/package.json
index 440b91e..a732069 100644
--- a/threads/examples/package.json
+++ b/threads/examples/package.json
@@ -3,6 +3,9 @@
"@oligami/shared-object": "^0.1.1",
"@xterm/xterm": "^5.5",
"xterm-addon-fit": "^0.8.0",
- "@bjorn3/browser_wasi_shim": "^0.3.0"
- }
+ "@bjorn3/browser_wasi_shim": "^0.3.0",
+ "@swc-node/register": "^1.11.1",
+ "@oligami/browser_wasi_shim-threads": "file:../"
+ },
+ "type": "module"
}
diff --git a/threads/examples/wasi_multi_threads/index.ts b/threads/examples/wasi_multi_threads/index.ts
index f9f27af..41ff502 100644
--- a/threads/examples/wasi_multi_threads/index.ts
+++ b/threads/examples/wasi_multi_threads/index.ts
@@ -1,10 +1,13 @@
-import { WASIFarm, WASIFarmAnimal } from "../../src";
import {
+ ConsoleStdout,
File,
OpenFile,
- ConsoleStdout,
PreopenDirectory,
} from "@bjorn3/browser_wasi_shim";
+import { WASIFarm } from "../../src";
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
const farm = new WASIFarm(
new OpenFile(new File([])), // stdin
diff --git a/threads/examples/wasi_multi_threads/worker.ts b/threads/examples/wasi_multi_threads/worker.ts
index 96bb99b..7723020 100644
--- a/threads/examples/wasi_multi_threads/worker.ts
+++ b/threads/examples/wasi_multi_threads/worker.ts
@@ -16,6 +16,10 @@ self.onmessage = async (e) => {
thread_spawn_worker_url: new URL("./thread_spawn.ts", import.meta.url)
.href,
thread_spawn_wasm: wasm,
+ worker_background_worker_url: new URL(
+ "./worker_background.ts",
+ import.meta.url,
+ ).href,
},
);
@@ -23,7 +27,7 @@ self.onmessage = async (e) => {
const inst = await WebAssembly.instantiate(wasm, {
env: {
- memory: wasi.get_share_memory(),
+ ...wasi.get_share_memory(),
},
wasi: wasi.wasiThreadImport,
wasi_snapshot_preview1: wasi.wasiImport,
diff --git a/threads/examples/wasi_multi_threads/worker_background.ts b/threads/examples/wasi_multi_threads/worker_background.ts
new file mode 100644
index 0000000..4438110
--- /dev/null
+++ b/threads/examples/wasi_multi_threads/worker_background.ts
@@ -0,0 +1,8 @@
+// @ts-ignore
+import worker_background_worker from "../node_modules/@oligami/browser_wasi_shim-threads/dist/worker_background_worker.min.js";
+
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
+
+worker_background_worker();
diff --git a/threads/examples/wasi_multi_threads_channel/channel.wasm b/threads/examples/wasi_multi_threads_channel/channel.wasm
index 369c3b5..8068068 100644
Binary files a/threads/examples/wasi_multi_threads_channel/channel.wasm and b/threads/examples/wasi_multi_threads_channel/channel.wasm differ
diff --git a/threads/examples/wasi_multi_threads_channel/index.ts b/threads/examples/wasi_multi_threads_channel/index.ts
index 1eca130..3365cf5 100644
--- a/threads/examples/wasi_multi_threads_channel/index.ts
+++ b/threads/examples/wasi_multi_threads_channel/index.ts
@@ -1,5 +1,8 @@
-import { OpenFile, File, ConsoleStdout } from "@bjorn3/browser_wasi_shim";
+import { ConsoleStdout, File, OpenFile } from "@bjorn3/browser_wasi_shim";
import { WASIFarm } from "../../src";
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
const farm = new WASIFarm(
new OpenFile(new File([])), // stdin
diff --git a/threads/examples/wasi_multi_threads_channel/main.rs b/threads/examples/wasi_multi_threads_channel/main.rs
index 216800c..8be1405 100644
--- a/threads/examples/wasi_multi_threads_channel/main.rs
+++ b/threads/examples/wasi_multi_threads_channel/main.rs
@@ -1,4 +1,6 @@
// https://doc.rust-lang.org/book/ch16-02-message-passing.html
+// rustc +nightly --target wasm32-wasip1-threads main.rs -o channel_base.wasm -Cstrip=debuginfo -Clto=fat
+// wasm-opt -Oz --enable-multivalue -o channel.wasm channel_base.wasm
use std::sync::mpsc;
use std::thread;
diff --git a/threads/examples/wasi_multi_threads_channel/worker.ts b/threads/examples/wasi_multi_threads_channel/worker.ts
index 0b926e0..c935edb 100644
--- a/threads/examples/wasi_multi_threads_channel/worker.ts
+++ b/threads/examples/wasi_multi_threads_channel/worker.ts
@@ -15,6 +15,10 @@ self.onmessage = async (e) => {
.href,
// thread_spawn_worker_url: "./thread_spawn.ts",
thread_spawn_wasm: wasm,
+ worker_background_worker_url: new URL(
+ "./worker_background.ts",
+ import.meta.url,
+ ).href,
},
);
@@ -22,7 +26,7 @@ self.onmessage = async (e) => {
const inst = await WebAssembly.instantiate(wasm, {
env: {
- memory: wasi.get_share_memory(),
+ ...wasi.get_share_memory(),
},
wasi: wasi.wasiThreadImport,
wasi_snapshot_preview1: wasi.wasiImport,
diff --git a/threads/examples/wasi_multi_threads_channel/worker_background.ts b/threads/examples/wasi_multi_threads_channel/worker_background.ts
new file mode 100644
index 0000000..4fcd999
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_channel/worker_background.ts
@@ -0,0 +1,8 @@
+// @ts-ignore
+import run from "../node_modules/@oligami/browser_wasi_shim-threads/dist/worker_background_worker.min.js";
+
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
+
+run();
diff --git a/threads/examples/wasi_multi_threads_channel_node/channel.wasm b/threads/examples/wasi_multi_threads_channel_node/channel.wasm
new file mode 100644
index 0000000..8068068
Binary files /dev/null and b/threads/examples/wasi_multi_threads_channel_node/channel.wasm differ
diff --git a/threads/examples/wasi_multi_threads_channel_node/common.ts b/threads/examples/wasi_multi_threads_channel_node/common.ts
new file mode 100644
index 0000000..e193573
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_channel_node/common.ts
@@ -0,0 +1,39 @@
+import { Worker, isMainThread, parentPort } from "node:worker_threads";
+
+class WorkerWrapper {
+ worker: Worker;
+ onmessage?: (event: any) => void;
+ constructor(path: string) {
+ this.worker = new Worker(path);
+ this.worker.on("message", (event) => {
+ this.onmessage?.(event);
+ });
+ }
+ postMessage(msg: any) {
+ this.worker.postMessage({
+ data: msg,
+ });
+ }
+ terminate() {
+ return this.worker.terminate();
+ }
+}
+
+const set_fake_worker = () => {
+ if (isMainThread) {
+ throw new Error("not main thread");
+ }
+
+ globalThis.postMessage = (msg: any) => {
+ parentPort.postMessage({
+ data: msg,
+ });
+ };
+ parentPort.on("message", (event) => {
+ (globalThis as any).onmessage?.(event);
+ });
+
+ (globalThis as any).Worker = WorkerWrapper;
+};
+
+export { set_fake_worker };
diff --git a/threads/examples/wasi_multi_threads_channel_node/index.ts b/threads/examples/wasi_multi_threads_channel_node/index.ts
new file mode 100644
index 0000000..522b8f4
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_channel_node/index.ts
@@ -0,0 +1,20 @@
+// node --import @swc-node/register/esm-register --enable-source-maps index.ts
+// npx ts-node index.ts
+
+import { Worker } from "node:worker_threads";
+import { ConsoleStdout, File, OpenFile } from "@bjorn3/browser_wasi_shim";
+import { WASIFarm } from "../../src/index.ts";
+
+const farm = new WASIFarm(
+ // @ts-ignore
+ new OpenFile(new File([])), // stdin
+ ConsoleStdout.lineBuffered((msg) => console.log(`[WASI stdout] ${msg}`)),
+ ConsoleStdout.lineBuffered((msg) => console.warn(`[WASI stderr] ${msg}`)),
+ [],
+);
+
+const worker = new Worker("./worker.ts");
+
+worker.postMessage({
+ wasi_ref: farm.get_ref(),
+});
diff --git a/threads/examples/wasi_multi_threads_channel_node/main.rs b/threads/examples/wasi_multi_threads_channel_node/main.rs
new file mode 100644
index 0000000..6c44fe3
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_channel_node/main.rs
@@ -0,0 +1,21 @@
+// https://doc.rust-lang.org/book/ch16-02-message-passing.html
+// rustc +nightly --target wasm32-wasip1-threads main.rs -o channel.wasm
+
+use std::sync::mpsc;
+use std::thread;
+
+fn main() {
+ let (tx, rx) = mpsc::channel();
+
+ thread::spawn(move || {
+ println!("Thread: sleeping for 5 seconds...");
+ let val = String::from("hi");
+
+ std::thread::sleep(std::time::Duration::from_secs(5));
+
+ tx.send(val).unwrap();
+ });
+
+ let received = rx.recv().unwrap();
+ println!("Got: {received}");
+}
diff --git a/threads/examples/wasi_multi_threads_channel_node/thread_spawn.ts b/threads/examples/wasi_multi_threads_channel_node/thread_spawn.ts
new file mode 100644
index 0000000..1c40fd5
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_channel_node/thread_spawn.ts
@@ -0,0 +1,8 @@
+import { thread_spawn_on_worker } from "../../src/index.ts";
+import { set_fake_worker } from "./common.ts";
+
+set_fake_worker();
+
+globalThis.onmessage = (event) => {
+ thread_spawn_on_worker(event.data);
+};
diff --git a/threads/examples/wasi_multi_threads_channel_node/tsconfig.json b/threads/examples/wasi_multi_threads_channel_node/tsconfig.json
new file mode 100644
index 0000000..dcb29c2
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_channel_node/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "NodeNext",
+ "moduleResolution": "nodenext",
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "allowImportingTsExtensions": true
+ },
+ "include": ["**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/threads/examples/wasi_multi_threads_channel_node/worker.ts b/threads/examples/wasi_multi_threads_channel_node/worker.ts
new file mode 100644
index 0000000..bfe22f7
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_channel_node/worker.ts
@@ -0,0 +1,45 @@
+import { readFileSync } from "node:fs";
+import { exit } from "node:process";
+import { Worker, isMainThread, parentPort } from "node:worker_threads";
+import { WASIFarmAnimal } from "../../src/index.ts";
+import { set_fake_worker } from "./common.ts";
+
+set_fake_worker();
+
+parentPort.on("message", async (e) => {
+ const { wasi_ref } = e;
+
+ const wasm = await WebAssembly.compile(
+ readFileSync("./channel.wasm") as BufferSource,
+ );
+
+ const wasi = new WASIFarmAnimal(
+ wasi_ref,
+ [], // args
+ [], // env
+ {
+ can_thread_spawn: true,
+ thread_spawn_worker_url: "./thread_spawn.ts",
+ thread_spawn_wasm: wasm,
+ worker_background_worker_url: "./worker_background_worker.ts",
+ },
+ );
+
+ await wasi.wait_worker_background_worker();
+
+ const inst = await WebAssembly.instantiate(wasm, {
+ env: {
+ ...wasi.get_share_memory(),
+ },
+ wasi: wasi.wasiThreadImport,
+ wasi_snapshot_preview1: wasi.wasiImport,
+ });
+
+ wasi.start(
+ inst as unknown as {
+ exports: { memory: WebAssembly.Memory; _start: () => unknown };
+ },
+ );
+
+ exit(0);
+});
diff --git a/threads/examples/wasi_multi_threads_channel_node/worker_background_worker.ts b/threads/examples/wasi_multi_threads_channel_node/worker_background_worker.ts
new file mode 100644
index 0000000..5cac554
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_channel_node/worker_background_worker.ts
@@ -0,0 +1,8 @@
+// @ts-ignore
+import worker_background_worker from "../node_modules/@oligami/browser_wasi_shim-threads/dist/worker_background_worker.min.js";
+
+import { set_fake_worker } from "./common.ts";
+
+set_fake_worker();
+
+worker_background_worker();
diff --git a/threads/examples/wasi_multi_threads_rustc/clang.ts b/threads/examples/wasi_multi_threads_rustc/clang.ts
index 6b43ac2..c2f0296 100644
--- a/threads/examples/wasi_multi_threads_rustc/clang.ts
+++ b/threads/examples/wasi_multi_threads_rustc/clang.ts
@@ -1,6 +1,6 @@
import { strace } from "@bjorn3/browser_wasi_shim";
-import { WASIFarmAnimal } from "../../src";
import { SharedObject } from "@oligami/shared-object";
+import { WASIFarmAnimal } from "../../src";
let wasi: WASIFarmAnimal;
let inst: {
@@ -24,6 +24,12 @@ globalThis.onmessage = async (e) => {
wasi_refs,
["llvm"], // args
[], // env
+ {
+ worker_background_worker_url: new URL(
+ "./worker_background.ts",
+ import.meta.url,
+ ).href,
+ },
);
// Memory is rewritten at this time.
diff --git a/threads/examples/wasi_multi_threads_rustc/depend_clang_files.ts b/threads/examples/wasi_multi_threads_rustc/depend_clang_files.ts
index 5f3a3a6..f532d52 100644
--- a/threads/examples/wasi_multi_threads_rustc/depend_clang_files.ts
+++ b/threads/examples/wasi_multi_threads_rustc/depend_clang_files.ts
@@ -1,10 +1,13 @@
-import { WASIFarm } from "../../src";
import {
Directory,
File,
type Inode,
PreopenDirectory,
} from "@bjorn3/browser_wasi_shim";
+import { WASIFarm } from "../../src";
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
async function load_external_file(path) {
return new File(await (await (await fetch(path)).blob()).arrayBuffer());
diff --git a/threads/examples/wasi_multi_threads_rustc/depend_rustc_files.ts b/threads/examples/wasi_multi_threads_rustc/depend_rustc_files.ts
index 4dc8153..6618b71 100644
--- a/threads/examples/wasi_multi_threads_rustc/depend_rustc_files.ts
+++ b/threads/examples/wasi_multi_threads_rustc/depend_rustc_files.ts
@@ -1,10 +1,13 @@
import {
Directory,
- PreopenDirectory,
File,
type Inode,
+ PreopenDirectory,
} from "@bjorn3/browser_wasi_shim";
import { WASIFarm } from "../../src";
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
async function load_external_file(path) {
return new File(await (await (await fetch(path)).blob()).arrayBuffer());
diff --git a/threads/examples/wasi_multi_threads_rustc/depend_rustc_with_lld.ts b/threads/examples/wasi_multi_threads_rustc/depend_rustc_with_lld.ts
index 9dac3a1..aba8c40 100644
--- a/threads/examples/wasi_multi_threads_rustc/depend_rustc_with_lld.ts
+++ b/threads/examples/wasi_multi_threads_rustc/depend_rustc_with_lld.ts
@@ -1,11 +1,14 @@
import { WASIFarm } from "../../src";
import {
- File,
Directory,
- PreopenDirectory,
+ File,
type Inode,
+ PreopenDirectory,
} from "@bjorn3/browser_wasi_shim";
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
async function load_external_file(path) {
return new File(await (await (await fetch(path)).blob()).arrayBuffer());
diff --git a/threads/examples/wasi_multi_threads_rustc/index.ts b/threads/examples/wasi_multi_threads_rustc/index.ts
index 20cd1db..2735e25 100644
--- a/threads/examples/wasi_multi_threads_rustc/index.ts
+++ b/threads/examples/wasi_multi_threads_rustc/index.ts
@@ -1,8 +1,11 @@
+import { Fd } from "@bjorn3/browser_wasi_shim";
+import { SharedObject } from "@oligami/shared-object";
import { Terminal } from "@xterm/xterm";
-import { WASIFarm } from "../../src";
import { FitAddon } from "xterm-addon-fit";
-import { SharedObject } from "@oligami/shared-object";
-import { Fd } from "@bjorn3/browser_wasi_shim";
+import { WASIFarm } from "../../src";
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
import "@xterm/xterm/css/xterm.css";
diff --git a/threads/examples/wasi_multi_threads_rustc/rustc.ts b/threads/examples/wasi_multi_threads_rustc/rustc.ts
index b5683d6..7994b17 100644
--- a/threads/examples/wasi_multi_threads_rustc/rustc.ts
+++ b/threads/examples/wasi_multi_threads_rustc/rustc.ts
@@ -27,12 +27,16 @@ globalThis.onmessage = async (e) => {
.href,
// thread_spawn_worker_url: "./thread_spawn.ts",
thread_spawn_wasm: wasm,
+ worker_background_worker_url: new URL(
+ "./worker_background.ts",
+ import.meta.url,
+ ).href,
},
);
await wasi.wait_worker_background_worker();
- wasi.get_share_memory().grow(200);
+ wasi.get_share_memory().memory.grow(200);
console.log("Waiting for worker background worker...");
diff --git a/threads/examples/wasi_multi_threads_rustc/rustc_with_lld.ts b/threads/examples/wasi_multi_threads_rustc/rustc_with_lld.ts
index defb5ae..f846835 100644
--- a/threads/examples/wasi_multi_threads_rustc/rustc_with_lld.ts
+++ b/threads/examples/wasi_multi_threads_rustc/rustc_with_lld.ts
@@ -24,12 +24,17 @@ globalThis.onmessage = async (e) => {
.href,
// thread_spawn_worker_url: "./thread_spawn.ts",
thread_spawn_wasm: wasm,
+
+ worker_background_worker_url: new URL(
+ "./worker_background.ts",
+ import.meta.url,
+ ).href,
},
);
await wasi.wait_worker_background_worker();
- wasi.get_share_memory().grow(200);
+ wasi.get_share_memory().memory.grow(200);
console.log("Waiting for worker background worker...");
diff --git a/threads/examples/wasi_multi_threads_rustc/save_stdout.ts b/threads/examples/wasi_multi_threads_rustc/save_stdout.ts
index 4aa4819..44429f9 100644
--- a/threads/examples/wasi_multi_threads_rustc/save_stdout.ts
+++ b/threads/examples/wasi_multi_threads_rustc/save_stdout.ts
@@ -1,7 +1,10 @@
+import { resolve } from "node:path";
+import { Fd } from "@bjorn3/browser_wasi_shim";
import { SharedObject, SharedObjectRef } from "@oligami/shared-object";
import { WASIFarm } from "../../src";
-import { Fd } from "@bjorn3/browser_wasi_shim";
-import { resolve } from "node:path";
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
const term = new SharedObjectRef("term").proxy<{
writeln: (data) => Promise;
diff --git a/threads/examples/wasi_multi_threads_rustc/tmp_dir.ts b/threads/examples/wasi_multi_threads_rustc/tmp_dir.ts
index 0ca6152..25bd362 100644
--- a/threads/examples/wasi_multi_threads_rustc/tmp_dir.ts
+++ b/threads/examples/wasi_multi_threads_rustc/tmp_dir.ts
@@ -1,11 +1,14 @@
import {
+ Directory,
+ File,
type Inode,
PreopenDirectory,
- File,
- Directory,
} from "@bjorn3/browser_wasi_shim";
-import { WASIFarm } from "../../src";
import { SharedObject } from "@oligami/shared-object";
+import { WASIFarm } from "../../src";
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
const toMap = (arr: Array<[string, Inode]>) => new Map(arr);
diff --git a/threads/examples/wasi_multi_threads_rustc/tree.ts b/threads/examples/wasi_multi_threads_rustc/tree.ts
index c748799..f63d397 100644
--- a/threads/examples/wasi_multi_threads_rustc/tree.ts
+++ b/threads/examples/wasi_multi_threads_rustc/tree.ts
@@ -17,6 +17,12 @@ globalThis.onmessage = async (e) => {
wasi_refs,
["tre"], // args
[], // env
+ {
+ worker_background_worker_url: new URL(
+ "./worker_background.ts",
+ import.meta.url,
+ ).href,
+ },
);
// Memory is rewritten at this time.
diff --git a/threads/examples/wasi_multi_threads_rustc/worker.ts b/threads/examples/wasi_multi_threads_rustc/worker.ts
index 3777a60..3968218 100644
--- a/threads/examples/wasi_multi_threads_rustc/worker.ts
+++ b/threads/examples/wasi_multi_threads_rustc/worker.ts
@@ -354,6 +354,12 @@ self.onmessage = async (e) => {
wasi_refs,
[], // args
[], // env
+ {
+ worker_background_worker_url: new URL(
+ "./worker_background.ts",
+ import.meta.url,
+ ).href,
+ },
);
// Memory is rewritten at this time.
diff --git a/threads/examples/wasi_multi_threads_rustc/worker_background.ts b/threads/examples/wasi_multi_threads_rustc/worker_background.ts
new file mode 100644
index 0000000..4438110
--- /dev/null
+++ b/threads/examples/wasi_multi_threads_rustc/worker_background.ts
@@ -0,0 +1,8 @@
+// @ts-ignore
+import worker_background_worker from "../node_modules/@oligami/browser_wasi_shim-threads/dist/worker_background_worker.min.js";
+
+import { wait_async_polyfill } from "../../src";
+
+wait_async_polyfill();
+
+worker_background_worker();
diff --git a/threads/import-module-test/package-lock.json b/threads/import-module-test/package-lock.json
index c8be983..f0683e8 100644
--- a/threads/import-module-test/package-lock.json
+++ b/threads/import-module-test/package-lock.json
@@ -18,22 +18,22 @@
},
"..": {
"name": "@oligami/browser_wasi_shim-threads",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "MIT OR Apache-2.0",
"dependencies": {
"@bjorn3/browser_wasi_shim": "^0.3.0",
"@oligami/browser_wasi_shim-threads": "file:"
},
"devDependencies": {
- "@biomejs/biome": "1.9.3",
- "@swc/cli": "^0.4.0",
- "@swc/core": "^1.7.28",
- "better-typescript-lib": "^2.8.0",
+ "@biomejs/biome": "1.9.4",
+ "@swc/cli": "^0.5.1",
+ "@swc/core": "^1.9.3",
+ "better-typescript-lib": "^2.10.0",
"npm-watch": "^0.13.0",
- "typescript": "^5.6.2",
+ "typescript": "^5.7.2",
"unplugin-swc": "^1.5.1",
- "vite": "^5.4.8",
- "vite-plugin-dts": "^4.2.3"
+ "vite": "^6.0.1",
+ "vite-plugin-dts": "^4.3.0"
},
"peerDependencies": {
"@bjorn3/browser_wasi_shim": "^0.3.0"
diff --git a/threads/index.html b/threads/index.html
index 9fe0595..422a829 100644
--- a/threads/index.html
+++ b/threads/index.html
@@ -42,6 +42,7 @@ all link
wasi_workers
wasi_workers_rustc
wasi_workers_single
+ common_check