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
  • diff --git a/threads/package-lock.json b/threads/package-lock.json index c54d0b2..9f39db8 100644 --- a/threads/package-lock.json +++ b/threads/package-lock.json @@ -9,28 +9,27 @@ "version": "0.1.1", "license": "MIT OR Apache-2.0", "dependencies": { - "@bjorn3/browser_wasi_shim": "^0.3.0", - "@oligami/browser_wasi_shim-threads": "file:" + "@bjorn3/browser_wasi_shim": "^0.4.2" }, "devDependencies": { - "@biomejs/biome": "1.9.4", - "@swc/cli": "^0.5.1", - "@swc/core": "^1.9.3", - "better-typescript-lib": "^2.10.0", + "@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.7.2", - "unplugin-swc": "^1.5.1", - "vite": "^6.0.1", - "vite-plugin-dts": "^4.3.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.3.0" + "@bjorn3/browser_wasi_shim": "^0.4.2" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -38,9 +37,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -48,13 +47,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -64,26 +63,24 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@biomejs/biome": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", - "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.4.tgz", + "integrity": "sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==", "dev": true, - "hasInstallScript": true, "license": "MIT OR Apache-2.0", "bin": { "biome": "bin/biome" @@ -96,20 +93,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "1.9.4", - "@biomejs/cli-darwin-x64": "1.9.4", - "@biomejs/cli-linux-arm64": "1.9.4", - "@biomejs/cli-linux-arm64-musl": "1.9.4", - "@biomejs/cli-linux-x64": "1.9.4", - "@biomejs/cli-linux-x64-musl": "1.9.4", - "@biomejs/cli-win32-arm64": "1.9.4", - "@biomejs/cli-win32-x64": "1.9.4" + "@biomejs/cli-darwin-arm64": "2.2.4", + "@biomejs/cli-darwin-x64": "2.2.4", + "@biomejs/cli-linux-arm64": "2.2.4", + "@biomejs/cli-linux-arm64-musl": "2.2.4", + "@biomejs/cli-linux-x64": "2.2.4", + "@biomejs/cli-linux-x64-musl": "2.2.4", + "@biomejs/cli-win32-arm64": "2.2.4", + "@biomejs/cli-win32-x64": "2.2.4" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", - "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.4.tgz", + "integrity": "sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA==", "cpu": [ "arm64" ], @@ -124,9 +121,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", - "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.4.tgz", + "integrity": "sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg==", "cpu": [ "x64" ], @@ -141,9 +138,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", - "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.4.tgz", + "integrity": "sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw==", "cpu": [ "arm64" ], @@ -158,9 +155,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", - "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.4.tgz", + "integrity": "sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ==", "cpu": [ "arm64" ], @@ -175,9 +172,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", - "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.4.tgz", + "integrity": "sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ==", "cpu": [ "x64" ], @@ -192,9 +189,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", - "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.4.tgz", + "integrity": "sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg==", "cpu": [ "x64" ], @@ -209,9 +206,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", - "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.4.tgz", + "integrity": "sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ==", "cpu": [ "arm64" ], @@ -226,9 +223,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", - "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.4.tgz", + "integrity": "sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg==", "cpu": [ "x64" ], @@ -243,15 +240,26 @@ } }, "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==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@bjorn3/browser_wasi_shim/-/browser_wasi_shim-0.4.2.tgz", + "integrity": "sha512-/iHkCVUG3VbcbmEHn5iIUpIrh7a7WPiwZ3sHy4HZKZzBdSadwdddYDZAII2zBvQYV0Lfi8naZngPCN7WPHI/hA==", "license": "MIT OR Apache-2.0" }, + "node_modules/@borewit/text-codec": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz", + "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", "cpu": [ "ppc64" ], @@ -266,9 +274,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "cpu": [ "arm" ], @@ -283,9 +291,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", "cpu": [ "arm64" ], @@ -300,9 +308,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "cpu": [ "x64" ], @@ -317,9 +325,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", "cpu": [ "arm64" ], @@ -334,9 +342,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "cpu": [ "x64" ], @@ -351,9 +359,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", "cpu": [ "arm64" ], @@ -368,9 +376,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", "cpu": [ "x64" ], @@ -385,9 +393,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", "cpu": [ "arm" ], @@ -402,9 +410,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", "cpu": [ "arm64" ], @@ -419,9 +427,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", "cpu": [ "ia32" ], @@ -436,9 +444,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", "cpu": [ "loong64" ], @@ -453,9 +461,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", "cpu": [ "mips64el" ], @@ -470,9 +478,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "cpu": [ "ppc64" ], @@ -487,9 +495,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "cpu": [ "riscv64" ], @@ -504,9 +512,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", "cpu": [ "s390x" ], @@ -521,9 +529,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "cpu": [ "x64" ], @@ -537,10 +545,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "cpu": [ "x64" ], @@ -555,9 +580,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "cpu": [ "arm64" ], @@ -572,9 +597,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "cpu": [ "x64" ], @@ -588,10 +613,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], @@ -606,9 +648,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "cpu": [ "arm64" ], @@ -623,9 +665,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "cpu": [ "ia32" ], @@ -640,9 +682,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "cpu": [ "x64" ], @@ -656,85 +698,130 @@ "node": ">=18" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@microsoft/api-extractor": { - "version": "7.48.0", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.48.0.tgz", - "integrity": "sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ==", + "version": "7.52.13", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.52.13.tgz", + "integrity": "sha512-K6/bBt8zZfn9yc06gNvA+/NlBGJC/iJlObpdufXHEJtqcD4Dln4ITCLZpwP3DNZ5NyBFeTkKdv596go3V72qlA==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.30.0", + "@microsoft/api-extractor-model": "7.30.7", "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.10.0", + "@rushstack/node-core-library": "5.14.0", "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.14.3", - "@rushstack/ts-command-line": "4.23.1", + "@rushstack/terminal": "0.16.0", + "@rushstack/ts-command-line": "5.0.3", "lodash": "~4.17.15", - "minimatch": "~3.0.3", + "minimatch": "10.0.3", "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "5.4.2" + "typescript": "5.8.2" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.0.tgz", - "integrity": "sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug==", + "version": "7.30.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.7.tgz", + "integrity": "sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==", "dev": true, "license": "MIT", "dependencies": { "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.10.0" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@rushstack/node-core-library": "5.14.0" } }, "node_modules/@microsoft/api-extractor/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@microsoft/api-extractor/node_modules/semver": { @@ -764,9 +851,9 @@ } }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -777,13 +864,6 @@ "node": ">=14.17" } }, - "node_modules/@microsoft/api-extractor/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, "node_modules/@microsoft/tsdoc": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", @@ -805,9 +885,9 @@ } }, "node_modules/@napi-rs/nice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", - "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", "dev": true, "license": "MIT", "optional": true, @@ -819,28 +899,29 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.1", - "@napi-rs/nice-android-arm64": "1.0.1", - "@napi-rs/nice-darwin-arm64": "1.0.1", - "@napi-rs/nice-darwin-x64": "1.0.1", - "@napi-rs/nice-freebsd-x64": "1.0.1", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", - "@napi-rs/nice-linux-arm64-gnu": "1.0.1", - "@napi-rs/nice-linux-arm64-musl": "1.0.1", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", - "@napi-rs/nice-linux-s390x-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-musl": "1.0.1", - "@napi-rs/nice-win32-arm64-msvc": "1.0.1", - "@napi-rs/nice-win32-ia32-msvc": "1.0.1", - "@napi-rs/nice-win32-x64-msvc": "1.0.1" + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" } }, "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", - "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", "cpu": [ "arm" ], @@ -855,9 +936,9 @@ } }, "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", - "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", "cpu": [ "arm64" ], @@ -872,9 +953,9 @@ } }, "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", - "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", "cpu": [ "arm64" ], @@ -889,9 +970,9 @@ } }, "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", - "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", "cpu": [ "x64" ], @@ -906,9 +987,9 @@ } }, "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", - "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", "cpu": [ "x64" ], @@ -923,9 +1004,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", - "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", "cpu": [ "arm" ], @@ -940,9 +1021,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", - "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", "cpu": [ "arm64" ], @@ -957,9 +1038,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", - "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", "cpu": [ "arm64" ], @@ -974,9 +1055,9 @@ } }, "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", - "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", "cpu": [ "ppc64" ], @@ -991,9 +1072,9 @@ } }, "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", - "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", "cpu": [ "riscv64" ], @@ -1008,9 +1089,9 @@ } }, "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", - "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", "cpu": [ "s390x" ], @@ -1025,9 +1106,9 @@ } }, "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", - "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", "cpu": [ "x64" ], @@ -1042,9 +1123,9 @@ } }, "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", - "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", "cpu": [ "x64" ], @@ -1058,10 +1139,27 @@ "node": ">= 10" } }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", - "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", "cpu": [ "arm64" ], @@ -1076,9 +1174,9 @@ } }, "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", - "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", "cpu": [ "ia32" ], @@ -1093,9 +1191,9 @@ } }, "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", - "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", "cpu": [ "x64" ], @@ -1109,58 +1207,16 @@ "node": ">= 10" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@oligami/browser_wasi_shim-threads": { - "resolved": "", - "link": true - }, "node_modules/@rollup/pluginutils": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", - "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -1174,10 +1230,23 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.0.tgz", + "integrity": "sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==", "cpu": [ "arm" ], @@ -1189,9 +1258,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.0.tgz", + "integrity": "sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==", "cpu": [ "arm64" ], @@ -1203,9 +1272,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.0.tgz", + "integrity": "sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==", "cpu": [ "arm64" ], @@ -1217,9 +1286,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.0.tgz", + "integrity": "sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==", "cpu": [ "x64" ], @@ -1230,10 +1299,38 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.0.tgz", + "integrity": "sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.0.tgz", + "integrity": "sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.0.tgz", + "integrity": "sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==", "cpu": [ "arm" ], @@ -1245,9 +1342,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.0.tgz", + "integrity": "sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==", "cpu": [ "arm" ], @@ -1259,9 +1356,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.0.tgz", + "integrity": "sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==", "cpu": [ "arm64" ], @@ -1273,9 +1370,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.0.tgz", + "integrity": "sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==", "cpu": [ "arm64" ], @@ -1286,10 +1383,24 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.0.tgz", + "integrity": "sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.0.tgz", + "integrity": "sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==", "cpu": [ "ppc64" ], @@ -1301,9 +1412,23 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.0.tgz", + "integrity": "sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.0.tgz", + "integrity": "sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==", "cpu": [ "riscv64" ], @@ -1315,9 +1440,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.0.tgz", + "integrity": "sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==", "cpu": [ "s390x" ], @@ -1329,9 +1454,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.0.tgz", + "integrity": "sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==", "cpu": [ "x64" ], @@ -1343,9 +1468,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.0.tgz", + "integrity": "sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==", "cpu": [ "x64" ], @@ -1356,10 +1481,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.0.tgz", + "integrity": "sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.0.tgz", + "integrity": "sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==", "cpu": [ "arm64" ], @@ -1371,9 +1510,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.0.tgz", + "integrity": "sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==", "cpu": [ "ia32" ], @@ -1384,10 +1523,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.0.tgz", + "integrity": "sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.0.tgz", + "integrity": "sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==", "cpu": [ "x64" ], @@ -1399,16 +1552,16 @@ ] }, "node_modules/@rushstack/node-core-library": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.0.tgz", - "integrity": "sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.14.0.tgz", + "integrity": "sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==", "dev": true, "license": "MIT", "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", - "fs-extra": "~7.0.1", + "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", @@ -1440,19 +1593,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@rushstack/node-core-library/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -1469,13 +1609,6 @@ "node": ">=10" } }, - "node_modules/@rushstack/node-core-library/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, "node_modules/@rushstack/rig-package": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", @@ -1488,13 +1621,13 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.3.tgz", - "integrity": "sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.16.0.tgz", + "integrity": "sha512-WEvNuKkoR1PXorr9SxO0dqFdSp1BA+xzDrIm/Bwlc5YHg2FFg6oS+uCTYjerOhFuqCW+A3vKBm6EmKWSHfgx/A==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.10.0", + "@rushstack/node-core-library": "5.14.0", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -1533,25 +1666,18 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.1.tgz", - "integrity": "sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.0.3.tgz", + "integrity": "sha512-bgPhQEqLVv/2hwKLYv/XvsTWNZ9B/+X1zJ7WgQE9rO5oiLzrOZvkIW4pk13yOQBhHyjcND5qMOa6p83t+Z66iQ==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.14.3", + "@rushstack/terminal": "0.16.0", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" } }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true, - "license": "MIT" - }, "node_modules/@sindresorhus/is": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", @@ -1566,21 +1692,21 @@ } }, "node_modules/@swc/cli": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.5.1.tgz", - "integrity": "sha512-sxSXyjqFImYrqjhZSPymjmM/9V6auZG67UsDwbe7FZaBlyfW8ka3QG/zRjpJJ9+8Ahns/kKb8bXPKQq7V2MtBw==", + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.7.8.tgz", + "integrity": "sha512-27Ov4rm0s2C6LLX+NDXfDVB69LGs8K94sXtFhgeUyQ4DBywZuCgTBu2loCNHRr8JhT9DeQvJM5j9FAu/THbo4w==", "dev": true, "license": "MIT", "dependencies": { "@swc/counter": "^0.1.3", "@xhmikosr/bin-wrapper": "^13.0.5", "commander": "^8.3.0", - "fast-glob": "^3.2.5", "minimatch": "^9.0.3", - "piscina": "^4.3.0", + "piscina": "^4.3.1", "semver": "^7.3.8", "slash": "3.0.0", - "source-map": "^0.7.3" + "source-map": "^0.7.3", + "tinyglobby": "^0.2.13" }, "bin": { "spack": "bin/spack.js", @@ -1592,7 +1718,7 @@ }, "peerDependencies": { "@swc/core": "^1.2.66", - "chokidar": "^3.5.1" + "chokidar": "^4.0.1" }, "peerDependenciesMeta": { "chokidar": { @@ -1601,15 +1727,15 @@ } }, "node_modules/@swc/core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.9.3.tgz", - "integrity": "sha512-oRj0AFePUhtatX+BscVhnzaAmWjpfAeySpM1TCbxA1rtBDeH/JDhi5yYzAKneDYtVtBvA7ApfeuzhMC9ye4xSg==", + "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==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.17" + "@swc/types": "^0.1.24" }, "engines": { "node": ">=10" @@ -1619,19 +1745,19 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.9.3", - "@swc/core-darwin-x64": "1.9.3", - "@swc/core-linux-arm-gnueabihf": "1.9.3", - "@swc/core-linux-arm64-gnu": "1.9.3", - "@swc/core-linux-arm64-musl": "1.9.3", - "@swc/core-linux-x64-gnu": "1.9.3", - "@swc/core-linux-x64-musl": "1.9.3", - "@swc/core-win32-arm64-msvc": "1.9.3", - "@swc/core-win32-ia32-msvc": "1.9.3", - "@swc/core-win32-x64-msvc": "1.9.3" + "@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": "*" + "@swc/helpers": ">=0.5.17" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -1640,9 +1766,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.9.3.tgz", - "integrity": "sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w==", + "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" ], @@ -1657,9 +1783,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.9.3.tgz", - "integrity": "sha512-IaRq05ZLdtgF5h9CzlcgaNHyg4VXuiStnOFpfNEMuI5fm5afP2S0FHq8WdakUz5WppsbddTdplL+vpeApt/WCQ==", + "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" ], @@ -1674,9 +1800,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.9.3.tgz", - "integrity": "sha512-Pbwe7xYprj/nEnZrNBvZfjnTxlBIcfApAGdz2EROhjpPj+FBqBa3wOogqbsuGGBdCphf8S+KPprL1z+oDWkmSQ==", + "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" ], @@ -1691,9 +1817,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.9.3.tgz", - "integrity": "sha512-AQ5JZiwNGVV/2K2TVulg0mw/3LYfqpjZO6jDPtR2evNbk9Yt57YsVzS+3vHSlUBQDRV9/jqMuZYVU3P13xrk+g==", + "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" ], @@ -1708,9 +1834,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.9.3.tgz", - "integrity": "sha512-tzVH480RY6RbMl/QRgh5HK3zn1ZTFsThuxDGo6Iuk1MdwIbdFYUY034heWUTI4u3Db97ArKh0hNL0xhO3+PZdg==", + "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" ], @@ -1725,9 +1851,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.9.3.tgz", - "integrity": "sha512-ivXXBRDXDc9k4cdv10R21ccBmGebVOwKXT/UdH1PhxUn9m/h8erAWjz5pcELwjiMf27WokqPgaWVfaclDbgE+w==", + "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" ], @@ -1742,9 +1868,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.9.3.tgz", - "integrity": "sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg==", + "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" ], @@ -1759,9 +1885,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.9.3.tgz", - "integrity": "sha512-e+XmltDVIHieUnNJHtspn6B+PCcFOMYXNJB1GqoCcyinkEIQNwC8KtWgMqUucUbEWJkPc35NHy9k8aCXRmw9Kg==", + "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" ], @@ -1776,9 +1902,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.9.3.tgz", - "integrity": "sha512-rqpzNfpAooSL4UfQnHhkW8aL+oyjqJniDP0qwZfGnjDoJSbtPysHg2LpcOBEdSnEH+uIZq6J96qf0ZFD8AGfXA==", + "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" ], @@ -1793,9 +1919,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.9.3.tgz", - "integrity": "sha512-3YJJLQ5suIEHEKc1GHtqVq475guiyqisKSoUnoaRtxkDaW5g1yvPt9IoSLOe2mRs7+FFhGGU693RsBUSwOXSdQ==", + "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" ], @@ -1817,9 +1943,9 @@ "license": "Apache-2.0" }, "node_modules/@swc/types": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", - "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1839,6 +1965,25 @@ "node": ">=14.16" } }, + "node_modules/@tokenizer/inflate": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", + "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fflate": "^0.8.2", + "token-types": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -1854,9 +1999,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -1867,23 +2012,11 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, "node_modules/@typescript/lib-decorators": { "name": "@better-typescript-lib/decorators", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/decorators/-/decorators-2.10.0.tgz", - "integrity": "sha512-b8l2W9ubtpQsKLxRpHOVT2yISoOyrNJQk/wFRJAeAfknjowl7os7hql4UcwSvAx7xXF2YbJpEwBGqaxMPLQ85g==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/decorators/-/decorators-2.12.0.tgz", + "integrity": "sha512-/m9Q5Xk66ThUJidTsxmXJH0+49iCLl5PFmue0HkNSGrcPU96oaoKNY5sH1AslwA/OWVvBg3hE58ZwSGm6TQFuQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1892,9 +2025,9 @@ }, "node_modules/@typescript/lib-dom": { "name": "@better-typescript-lib/dom", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/dom/-/dom-2.10.0.tgz", - "integrity": "sha512-0h4IuFOVmAEgGyG1thCptGyozProuQPFd+K7ldKSBPr2K6lsDnbbUNev8IMmUGCiGa5ylsKXiFWLA19T3bPV6w==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/dom/-/dom-2.12.0.tgz", + "integrity": "sha512-via7EW6RKBeUcE9JBS3lNoQeCfghGZoRhBMXOsgOyvBskTdP45MUi6hM7RZMYbTcOh2tzg3j70uhe+1MajCJXw==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1903,9 +2036,9 @@ }, "node_modules/@typescript/lib-es2015": { "name": "@better-typescript-lib/es2015", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2015/-/es2015-2.10.0.tgz", - "integrity": "sha512-IfdGK/mVBwbeaiZL7MiS6GaZNAy15Hk4kZ8WPD3CHGGWhmR3CqpKMsZZ5KFzi9vq9aHVpeVXpkYH0B/zh+9oeg==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2015/-/es2015-2.12.0.tgz", + "integrity": "sha512-woXTAKb6yUSdy8hm2NQPnvvE0PVQeFLp1rfHrwHlFF/5vG9EjltI9+jdaSN2jtS5sW8SeSQiKCtIZ/AYK/YxQA==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1914,9 +2047,9 @@ }, "node_modules/@typescript/lib-es2016": { "name": "@better-typescript-lib/es2016", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2016/-/es2016-2.10.0.tgz", - "integrity": "sha512-PDfqN2tCLUYIeAQSVXELMBuzoeRGHuqYbPvILkbaXF6UitO8BE7g5vvrcUoXePfnMeowG8nhjwjtJ/8VIZGuUA==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2016/-/es2016-2.12.0.tgz", + "integrity": "sha512-8V5jFi+qpJbop+xdSEX7PtA6KxUzNXxoN3Lt5MrUB3TLpb/vh6uzphQmYULnkcn1ScdXTzbpHwG4rdNFY36wTA==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1925,9 +2058,9 @@ }, "node_modules/@typescript/lib-es2017": { "name": "@better-typescript-lib/es2017", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2017/-/es2017-2.10.0.tgz", - "integrity": "sha512-iOIXEj3ZrMFknfYZnHxDta9InS7WClYn193mJOnEdoxAzvojsqJ7MSlVkPem6YaTURgbjdZBW/bGj7fOQZ0S9A==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2017/-/es2017-2.12.0.tgz", + "integrity": "sha512-iCUQOIylZwFt+NrkH0LTYzc+LmqRpLkDGLR7zvZs4PlgjONjyYcbyYar2LVbX3XcBsnx7vVW7andI4+aXb+AZQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1936,9 +2069,9 @@ }, "node_modules/@typescript/lib-es2018": { "name": "@better-typescript-lib/es2018", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2018/-/es2018-2.10.0.tgz", - "integrity": "sha512-LGpdHX5ymEhRdtgW816OW4L0MG8os8zJZxLzMhyGEUl4iUOen9GGE+55eMRGXmc5pGMop3T7jzAlvjudrT9cUQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2018/-/es2018-2.12.0.tgz", + "integrity": "sha512-mch+ACDNKYI8rKBM2AeebejyoI0cK3lpmc7m1yMoPzDOronjGk5sLYryCheLWXeMhUguO13tN5RnlJDyhV1E1A==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1947,9 +2080,9 @@ }, "node_modules/@typescript/lib-es2019": { "name": "@better-typescript-lib/es2019", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2019/-/es2019-2.10.0.tgz", - "integrity": "sha512-1LeECJX9Buv2JIM7OKGHhBGnDNbwcyViy1CJXsRyV0CC/GZCQK98v0GISto4W3QTZnK1wrdx3J6JTijxyR1vfw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2019/-/es2019-2.12.0.tgz", + "integrity": "sha512-x/+BqehInEYoILfItuHXJdX6hLEOHAUhNlN/x99uN48o6HCKi4teoOaUWlxclcPeS2LmlE4RLzXUylEvd+DPtQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1958,9 +2091,9 @@ }, "node_modules/@typescript/lib-es2020": { "name": "@better-typescript-lib/es2020", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2020/-/es2020-2.10.0.tgz", - "integrity": "sha512-43ljO93zZh/qYU9SlqO3nBawtZT9v+/uAfAwHsI5VaMq4ulKhtqq3kWrDM1nUvhPiQtgiTyWrQ3B8c10Hlerag==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2020/-/es2020-2.12.0.tgz", + "integrity": "sha512-Kc5OPXfLwYnkS+Oa4h8+iPYNdktxMvOum/cW/5WHU4UTtgmShceahbc/9dDsp04fvgTGiT47KHEMuxQYdbx/mQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1969,9 +2102,9 @@ }, "node_modules/@typescript/lib-es2021": { "name": "@better-typescript-lib/es2021", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2021/-/es2021-2.10.0.tgz", - "integrity": "sha512-olTKpT9cFXywIK71xyfqhWcSu2li2n7jKlF6snWBrPu46x0GluhxzKMCG7hFKb/DeYrYpQc4he9/KZ+ZKJtrAQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2021/-/es2021-2.12.0.tgz", + "integrity": "sha512-oc9FxQuHPLYoiNPo0oAAm5PRQEuoLJ39BI1e2jaPLfC1zdc5QbMk517NfKmNb4enlUGKoOhC3uSrpS/OjkSPWw==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1980,9 +2113,9 @@ }, "node_modules/@typescript/lib-es2022": { "name": "@better-typescript-lib/es2022", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2022/-/es2022-2.10.0.tgz", - "integrity": "sha512-LW9fe94THNnEHML9g/tgumUaqfYaBKH2Rq8KkpSlkpEZyQIfCpFq27OagZZpJ2I5JSxrOjvrPs0Z0Yo941pHGQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2022/-/es2022-2.12.0.tgz", + "integrity": "sha512-MnqVGp9hmwnCDXv7O8V50rynt+4CU9fPTx2EJ39r0PibzW1dKT7bLdlFNS0+hDFLkJZlV2kgoctP3e5wEBLu7w==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1991,9 +2124,9 @@ }, "node_modules/@typescript/lib-es2023": { "name": "@better-typescript-lib/es2023", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2023/-/es2023-2.10.0.tgz", - "integrity": "sha512-jk18W6Y31tLfdCr13k/1WrfhhidJYAl02jT43buVJKkDd5zNjOy1TN43JYaMA9d/e0asscm6DLVNdpyPcKO5zA==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2023/-/es2023-2.12.0.tgz", + "integrity": "sha512-rB7pbtaxNy9ReKV22lfXfXCfQFCdtxbas+oxcjiTNRYkCcSgc5B3nA3v+NQcbNk1MukhnQca7bmw2tqvKaV8OQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2002,9 +2135,9 @@ }, "node_modules/@typescript/lib-es2024": { "name": "@better-typescript-lib/es2024", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2024/-/es2024-2.10.0.tgz", - "integrity": "sha512-vorWk7njdt0z28jBjsT0tWQPvnW/mbqsSFa5ZMkIf5ZEYTmPwZPaA7kqU0oIOZ2sazO3tjFitjg34dC4MAsRyQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es2024/-/es2024-2.12.0.tgz", + "integrity": "sha512-zNCgAaV0hFW1SNeEfvjO7EX35w+Ja16PRP4TFL7ZyENcs93mghQEH9l437Pixya+sG3a2m7GbkFjzv+Z6Bkf5w==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2013,9 +2146,9 @@ }, "node_modules/@typescript/lib-es5": { "name": "@better-typescript-lib/es5", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es5/-/es5-2.10.0.tgz", - "integrity": "sha512-/VxVSom29tFdSyd/vVyDOHul1WOcRDN7PpWyZYTYeGS3acZyKsjPGEAWUUH30ykU782U0BC2ABAHn7MH7kz7Aw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es5/-/es5-2.12.0.tgz", + "integrity": "sha512-TueHgCcwn6QX8MFzC/kx6p7Y9AJUDIwsRz4klOSxGU3l0oUnqSv0uYOrZuLOldeVuVHHfKHKP11I5ELVmWQSNg==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2024,9 +2157,9 @@ }, "node_modules/@typescript/lib-es6": { "name": "@better-typescript-lib/es6", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/es6/-/es6-2.10.0.tgz", - "integrity": "sha512-GK9C5S38ADAowEb0oe7563G7R/a34zOwJ9sJmsVBz3x3Z6x2Ydqslu65eu0j4e4EspsEM7oDVi3YGBHrrSaDyw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/es6/-/es6-2.12.0.tgz", + "integrity": "sha512-zBPoQsg5a1pc2Um5udWadmJRPtH3wR6Z7PMk4q1vQnAn5N3RyzKcvFvNqiQWQXIl0ptSaKN4IVxMzJ+OKi9dUg==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2035,9 +2168,9 @@ }, "node_modules/@typescript/lib-esnext": { "name": "@better-typescript-lib/esnext", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/esnext/-/esnext-2.10.0.tgz", - "integrity": "sha512-cdjsZW4qiumcGhCT+tsJWRyOYchUsgheU2KSXOVHoeMIxVRJZMlbHOamgZ2zIWNHqzTvJt2TyBpVUC1wGg7WVA==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/esnext/-/esnext-2.12.0.tgz", + "integrity": "sha512-fOBovlfESsE6bHG8ITAvW3o5qQztryc+8onzRRpDS8gZCOjWX7eNoeM8FlMHplEgWfL0FknKh/o1y7xDXRYhLA==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2046,9 +2179,9 @@ }, "node_modules/@typescript/lib-scripthost": { "name": "@better-typescript-lib/scripthost", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/scripthost/-/scripthost-2.10.0.tgz", - "integrity": "sha512-vtcfAd3FVJ3Al9cCMQJbzE9xtoQeHhJrv6a327lyUEcTLl80sjkpfqzOhZh2cxge4q9iMRRXx9HijCY1ALGODw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/scripthost/-/scripthost-2.12.0.tgz", + "integrity": "sha512-B5Fz5HARk9G7ntuRawvT+VMwdhN/+OUIuBRW+7IBq3Jk8lzwu53aLSmKK38suGpPikfVhaC1EmA8nPcgHFMlCQ==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2057,9 +2190,9 @@ }, "node_modules/@typescript/lib-webworker": { "name": "@better-typescript-lib/webworker", - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@better-typescript-lib/webworker/-/webworker-2.10.0.tgz", - "integrity": "sha512-YC2LdrTzL6r6Aw0NvfFMAEnCe3oMSqoDm1IS/5wSvbVeYPwHf/RsaRdE77mN8zbwDl82SMbwKE+7zTiGCjB0uQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@better-typescript-lib/webworker/-/webworker-2.12.0.tgz", + "integrity": "sha512-YktWJCUYdrRORhd4NgnPZCEzElDglPZzVnfkxGNmEhPpFE1W6ThKDQqkvMZapf3T+0xGeDqJx9V4xhFNnv56Xw==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2067,57 +2200,57 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.6.tgz", - "integrity": "sha512-FxUfxaB8sCqvY46YjyAAV6c3mMIq/NWQMVvJ+uS4yxr1KzOvyg61gAuOnNvgCvO4TZ7HcLExBEsWcDu4+K4E8A==", + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.23.tgz", + "integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.6" + "@volar/source-map": "2.4.23" } }, "node_modules/@volar/source-map": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.6.tgz", - "integrity": "sha512-Nsh7UW2ruK+uURIPzjJgF0YRGP5CX9nQHypA2OMqdM2FKy7rh+uv3XgPnWPw30JADbKvZ5HuBzG4gSbVDYVtiw==", + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.23.tgz", + "integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==", "dev": true, "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.6.tgz", - "integrity": "sha512-NMIrA7y5OOqddL9VtngPWYmdQU03htNKFtAYidbYfWA0TOhyGVd9tfcP4TsLWQ+RBWDZCbBqsr8xzU0ZOxYTCQ==", + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.23.tgz", + "integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.6", + "@volar/language-core": "2.4.23", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.11.tgz", - "integrity": "sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.21.tgz", + "integrity": "sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.11", + "@babel/parser": "^7.28.3", + "@vue/shared": "3.5.21", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz", - "integrity": "sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.21.tgz", + "integrity": "sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-core": "3.5.21", + "@vue/shared": "3.5.21" } }, "node_modules/@vue/compiler-vue2": { @@ -2132,17 +2265,17 @@ } }, "node_modules/@vue/language-core": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.6.tgz", - "integrity": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "~2.4.1", - "@vue/compiler-dom": "^3.4.0", + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.4.0", - "computeds": "^0.0.1", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" @@ -2157,29 +2290,29 @@ } }, "node_modules/@vue/shared": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.11.tgz", - "integrity": "sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.21.tgz", + "integrity": "sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==", "dev": true, "license": "MIT" }, "node_modules/@xhmikosr/archive-type": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@xhmikosr/archive-type/-/archive-type-7.0.0.tgz", - "integrity": "sha512-sIm84ZneCOJuiy3PpWR5bxkx3HaNt1pqaN+vncUBZIlPZCq8ASZH+hBVdu5H8znR7qYC6sKwx+ie2Q7qztJTxA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/archive-type/-/archive-type-7.1.0.tgz", + "integrity": "sha512-xZEpnGplg1sNPyEgFh0zbHxqlw5dtYg6viplmWSxUj12+QjU9SKu3U/2G73a15pEjLaOqTefNSZ1fOPUOT4Xgg==", "dev": true, "license": "MIT", "dependencies": { - "file-type": "^19.0.0" + "file-type": "^20.5.0" }, "engines": { - "node": "^14.14.0 || >=16.0.0" + "node": ">=18" } }, "node_modules/@xhmikosr/bin-check": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@xhmikosr/bin-check/-/bin-check-7.0.3.tgz", - "integrity": "sha512-4UnCLCs8DB+itHJVkqFp9Zjg+w/205/J2j2wNBsCEAm/BuBmtua2hhUOdAMQE47b1c7P9Xmddj0p+X1XVsfHsA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/bin-check/-/bin-check-7.1.0.tgz", + "integrity": "sha512-y1O95J4mnl+6MpVmKfMYXec17hMEwE/yeCglFNdx+QvLLtP0yN4rSYcbkXnth+lElBuKKek2NbvOfOGPpUXCvw==", "dev": true, "license": "MIT", "dependencies": { @@ -2191,14 +2324,14 @@ } }, "node_modules/@xhmikosr/bin-wrapper": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@xhmikosr/bin-wrapper/-/bin-wrapper-13.0.5.tgz", - "integrity": "sha512-DT2SAuHDeOw0G5bs7wZbQTbf4hd8pJ14tO0i4cWhRkIJfgRdKmMfkDilpaJ8uZyPA0NVRwasCNAmMJcWA67osw==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/bin-wrapper/-/bin-wrapper-13.2.0.tgz", + "integrity": "sha512-t9U9X0sDPRGDk5TGx4dv5xiOvniVJpXnfTuynVKwHgtib95NYEw4MkZdJqhoSiz820D9m0o6PCqOPMXz0N9fIw==", "dev": true, "license": "MIT", "dependencies": { - "@xhmikosr/bin-check": "^7.0.3", - "@xhmikosr/downloader": "^15.0.1", + "@xhmikosr/bin-check": "^7.1.0", + "@xhmikosr/downloader": "^15.2.0", "@xhmikosr/os-filter-obj": "^3.0.0", "bin-version-check": "^5.1.0" }, @@ -2207,18 +2340,17 @@ } }, "node_modules/@xhmikosr/decompress": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress/-/decompress-10.0.1.tgz", - "integrity": "sha512-6uHnEEt5jv9ro0CDzqWlFgPycdE+H+kbJnwyxgZregIMLQ7unQSCNVsYG255FoqU8cP46DyggI7F7LohzEl8Ag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/decompress/-/decompress-10.2.0.tgz", + "integrity": "sha512-MmDBvu0+GmADyQWHolcZuIWffgfnuTo4xpr2I/Qw5Ox0gt+e1Be7oYqJM4te5ylL6mzlcoicnHVDvP27zft8tg==", "dev": true, "license": "MIT", "dependencies": { - "@xhmikosr/decompress-tar": "^8.0.1", - "@xhmikosr/decompress-tarbz2": "^8.0.1", - "@xhmikosr/decompress-targz": "^8.0.1", - "@xhmikosr/decompress-unzip": "^7.0.0", + "@xhmikosr/decompress-tar": "^8.1.0", + "@xhmikosr/decompress-tarbz2": "^8.1.0", + "@xhmikosr/decompress-targz": "^8.1.0", + "@xhmikosr/decompress-unzip": "^7.1.0", "graceful-fs": "^4.2.11", - "make-dir": "^4.0.0", "strip-dirs": "^3.0.0" }, "engines": { @@ -2226,13 +2358,13 @@ } }, "node_modules/@xhmikosr/decompress-tar": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tar/-/decompress-tar-8.0.1.tgz", - "integrity": "sha512-dpEgs0cQKJ2xpIaGSO0hrzz3Kt8TQHYdizHsgDtLorWajuHJqxzot9Hbi0huRxJuAGG2qiHSQkwyvHHQtlE+fg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tar/-/decompress-tar-8.1.0.tgz", + "integrity": "sha512-m0q8x6lwxenh1CrsTby0Jrjq4vzW/QU1OLhTHMQLEdHpmjR1lgahGz++seZI0bXF3XcZw3U3xHfqZSz+JPP2Gg==", "dev": true, "license": "MIT", "dependencies": { - "file-type": "^19.0.0", + "file-type": "^20.5.0", "is-stream": "^2.0.1", "tar-stream": "^3.1.7" }, @@ -2241,14 +2373,14 @@ } }, "node_modules/@xhmikosr/decompress-tarbz2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tarbz2/-/decompress-tarbz2-8.0.1.tgz", - "integrity": "sha512-OF+6DysDZP5YTDO8uHuGG6fMGZjc+HszFPBkVltjoje2Cf60hjBg/YP5OQndW1hfwVWOdP7f3CnJiPZHJUTtEg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tarbz2/-/decompress-tarbz2-8.1.0.tgz", + "integrity": "sha512-aCLfr3A/FWZnOu5eqnJfme1Z1aumai/WRw55pCvBP+hCGnTFrcpsuiaVN5zmWTR53a8umxncY2JuYsD42QQEbw==", "dev": true, "license": "MIT", "dependencies": { "@xhmikosr/decompress-tar": "^8.0.1", - "file-type": "^19.0.0", + "file-type": "^20.5.0", "is-stream": "^2.0.1", "seek-bzip": "^2.0.0", "unbzip2-stream": "^1.4.3" @@ -2258,14 +2390,14 @@ } }, "node_modules/@xhmikosr/decompress-targz": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-targz/-/decompress-targz-8.0.1.tgz", - "integrity": "sha512-mvy5AIDIZjQ2IagMI/wvauEiSNHhu/g65qpdM4EVoYHUJBAmkQWqcPJa8Xzi1aKVTmOA5xLJeDk7dqSjlHq8Mg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-targz/-/decompress-targz-8.1.0.tgz", + "integrity": "sha512-fhClQ2wTmzxzdz2OhSQNo9ExefrAagw93qaG1YggoIz/QpI7atSRa7eOHv4JZkpHWs91XNn8Hry3CwUlBQhfPA==", "dev": true, "license": "MIT", "dependencies": { "@xhmikosr/decompress-tar": "^8.0.1", - "file-type": "^19.0.0", + "file-type": "^20.5.0", "is-stream": "^2.0.1" }, "engines": { @@ -2273,13 +2405,13 @@ } }, "node_modules/@xhmikosr/decompress-unzip": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-unzip/-/decompress-unzip-7.0.0.tgz", - "integrity": "sha512-GQMpzIpWTsNr6UZbISawsGI0hJ4KA/mz5nFq+cEoPs12UybAqZWKbyIaZZyLbJebKl5FkLpsGBkrplJdjvUoSQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-unzip/-/decompress-unzip-7.1.0.tgz", + "integrity": "sha512-oqTYAcObqTlg8owulxFTqiaJkfv2SHsxxxz9Wg4krJAHVzGWlZsU8tAB30R6ow+aHrfv4Kub6WQ8u04NWVPUpA==", "dev": true, "license": "MIT", "dependencies": { - "file-type": "^19.0.0", + "file-type": "^20.5.0", "get-stream": "^6.0.1", "yauzl": "^3.1.2" }, @@ -2288,18 +2420,18 @@ } }, "node_modules/@xhmikosr/downloader": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@xhmikosr/downloader/-/downloader-15.0.1.tgz", - "integrity": "sha512-fiuFHf3Dt6pkX8HQrVBsK0uXtkgkVlhrZEh8b7VgoDqFf+zrgFBPyrwCqE/3nDwn3hLeNz+BsrS7q3mu13Lp1g==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@xhmikosr/downloader/-/downloader-15.2.0.tgz", + "integrity": "sha512-lAqbig3uRGTt0sHNIM4vUG9HoM+mRl8K28WuYxyXLCUT6pyzl4Y4i0LZ3jMEsCYZ6zjPZbO9XkG91OSTd4si7g==", "dev": true, "license": "MIT", "dependencies": { - "@xhmikosr/archive-type": "^7.0.0", - "@xhmikosr/decompress": "^10.0.1", + "@xhmikosr/archive-type": "^7.1.0", + "@xhmikosr/decompress": "^10.2.0", "content-disposition": "^0.5.4", - "defaults": "^3.0.0", + "defaults": "^2.0.2", "ext-name": "^5.0.0", - "file-type": "^19.0.0", + "file-type": "^20.5.0", "filenamify": "^6.0.0", "get-stream": "^6.0.1", "got": "^13.0.0" @@ -2322,9 +2454,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -2384,6 +2516,13 @@ } } }, + "node_modules/alien-signals": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "dev": true, + "license": "MIT" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2429,13 +2568,21 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true, - "license": "Apache-2.0" - }, + "node_modules/b4a": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", + "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2444,9 +2591,9 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, "license": "Apache-2.0", "optional": true @@ -2473,29 +2620,29 @@ "license": "MIT" }, "node_modules/better-typescript-lib": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/better-typescript-lib/-/better-typescript-lib-2.10.0.tgz", - "integrity": "sha512-ZimEfuBVHq7r+k1dJ/qBh69VKbFgyzc1dY1DDOHtOrtCyn8Yaa6GWedScTjQPqBQieDiCPpoPi+AxJWYDA8UDA==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/better-typescript-lib/-/better-typescript-lib-2.12.0.tgz", + "integrity": "sha512-f7eO5Xs6Cczfx5eDRuDw/JYCrsdiC6gXdleB2KFZ5ZYgU/RRoev9swjt/eD0xo9PRDqNDwyjKx0n27CDHRZwvQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@typescript/lib-decorators": "npm:@better-typescript-lib/decorators@2.10.0", - "@typescript/lib-dom": "npm:@better-typescript-lib/dom@2.10.0", - "@typescript/lib-es2015": "npm:@better-typescript-lib/es2015@2.10.0", - "@typescript/lib-es2016": "npm:@better-typescript-lib/es2016@2.10.0", - "@typescript/lib-es2017": "npm:@better-typescript-lib/es2017@2.10.0", - "@typescript/lib-es2018": "npm:@better-typescript-lib/es2018@2.10.0", - "@typescript/lib-es2019": "npm:@better-typescript-lib/es2019@2.10.0", - "@typescript/lib-es2020": "npm:@better-typescript-lib/es2020@2.10.0", - "@typescript/lib-es2021": "npm:@better-typescript-lib/es2021@2.10.0", - "@typescript/lib-es2022": "npm:@better-typescript-lib/es2022@2.10.0", - "@typescript/lib-es2023": "npm:@better-typescript-lib/es2023@2.10.0", - "@typescript/lib-es2024": "npm:@better-typescript-lib/es2024@2.10.0", - "@typescript/lib-es5": "npm:@better-typescript-lib/es5@2.10.0", - "@typescript/lib-es6": "npm:@better-typescript-lib/es6@2.10.0", - "@typescript/lib-esnext": "npm:@better-typescript-lib/esnext@2.10.0", - "@typescript/lib-scripthost": "npm:@better-typescript-lib/scripthost@2.10.0", - "@typescript/lib-webworker": "npm:@better-typescript-lib/webworker@2.10.0" + "@typescript/lib-decorators": "npm:@better-typescript-lib/decorators@2.12.0", + "@typescript/lib-dom": "npm:@better-typescript-lib/dom@2.12.0", + "@typescript/lib-es2015": "npm:@better-typescript-lib/es2015@2.12.0", + "@typescript/lib-es2016": "npm:@better-typescript-lib/es2016@2.12.0", + "@typescript/lib-es2017": "npm:@better-typescript-lib/es2017@2.12.0", + "@typescript/lib-es2018": "npm:@better-typescript-lib/es2018@2.12.0", + "@typescript/lib-es2019": "npm:@better-typescript-lib/es2019@2.12.0", + "@typescript/lib-es2020": "npm:@better-typescript-lib/es2020@2.12.0", + "@typescript/lib-es2021": "npm:@better-typescript-lib/es2021@2.12.0", + "@typescript/lib-es2022": "npm:@better-typescript-lib/es2022@2.12.0", + "@typescript/lib-es2023": "npm:@better-typescript-lib/es2023@2.12.0", + "@typescript/lib-es2024": "npm:@better-typescript-lib/es2024@2.12.0", + "@typescript/lib-es5": "npm:@better-typescript-lib/es5@2.12.0", + "@typescript/lib-es6": "npm:@better-typescript-lib/es6@2.12.0", + "@typescript/lib-esnext": "npm:@better-typescript-lib/esnext@2.12.0", + "@typescript/lib-scripthost": "npm:@better-typescript-lib/scripthost@2.12.0", + "@typescript/lib-webworker": "npm:@better-typescript-lib/webworker@2.12.0" }, "peerDependencies": { "typescript": ">=4.5.2" @@ -2550,9 +2697,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2678,13 +2825,6 @@ "dev": true, "license": "MIT" }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", - "dev": true, - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2693,9 +2833,9 @@ "license": "MIT" }, "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", "dev": true, "license": "MIT" }, @@ -2735,9 +2875,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2782,13 +2922,13 @@ } }, "node_modules/defaults": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-3.0.0.tgz", - "integrity": "sha512-RsqXDEAALjfRTro+IFNKpcPCt0/Cy2FqHSIlnomiJp9YGadpQnrtbRpSgN2+np21qHcIKiva4fiOQGjS9/qR/A==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-2.0.2.tgz", + "integrity": "sha512-cuIw0PImdp76AOfgkjbW4VhQODRmNNcKR73vdCH5cLd/ifj7aamfoXvYgfGkEAjNJZ3ozMIy9Gu2LutUkGEPbA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2818,9 +2958,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2831,30 +2971,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/estree-walker": { @@ -2888,6 +3030,13 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "dev": true, + "license": "MIT" + }, "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -2929,44 +3078,24 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, "node_modules/file-type": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.6.0.tgz", - "integrity": "sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.5.0.tgz", + "integrity": "sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==", "dev": true, "license": "MIT", "dependencies": { - "get-stream": "^9.0.1", - "strtok3": "^9.0.1", + "@tokenizer/inflate": "^0.2.6", + "strtok3": "^10.2.0", "token-types": "^6.0.0", - "uint8array-extras": "^1.3.0" + "uint8array-extras": "^1.4.0" }, "engines": { "node": ">=18" @@ -2975,36 +3104,6 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/file-type/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-type/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/filename-reserved-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", @@ -3074,18 +3173,18 @@ } }, "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.14" } }, "node_modules/fsevents": { @@ -3206,9 +3305,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, @@ -3305,9 +3404,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -3405,11 +3504,14 @@ "license": "MIT" }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -3452,14 +3554,15 @@ } }, "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", "dev": true, "license": "MIT", "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" }, "engines": { "node": ">=14" @@ -3488,30 +3591,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/merge-stream": { @@ -3521,34 +3621,10 @@ "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/mime-db": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { @@ -3595,16 +3671,35 @@ } }, "node_modules/mlly": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz", - "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.12.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "ufo": "^1.5.4" + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, "node_modules/ms": { @@ -3622,9 +3717,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -3641,9 +3736,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", - "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", "dev": true, "license": "MIT", "dependencies": { @@ -3670,9 +3765,9 @@ } }, "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -3704,9 +3799,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", "dev": true, "license": "MIT", "engines": { @@ -3794,26 +3889,12 @@ "license": "MIT" }, "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, - "node_modules/peek-readable": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.3.1.tgz", - "integrity": "sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -3842,9 +3923,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.9.2.tgz", + "integrity": "sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -3852,21 +3933,21 @@ } }, "node_modules/pkg-types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", - "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", - "pathe": "^1.1.2" + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -3884,7 +3965,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -3909,34 +3990,23 @@ "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://github.com/sponsors/antfu" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://github.com/sponsors/sxzz" } ], "license": "MIT" }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true, - "license": "MIT" - }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -3989,19 +4059,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4029,25 +4102,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.0.tgz", + "integrity": "sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -4057,49 +4119,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.52.0", + "@rollup/rollup-android-arm64": "4.52.0", + "@rollup/rollup-darwin-arm64": "4.52.0", + "@rollup/rollup-darwin-x64": "4.52.0", + "@rollup/rollup-freebsd-arm64": "4.52.0", + "@rollup/rollup-freebsd-x64": "4.52.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.0", + "@rollup/rollup-linux-arm-musleabihf": "4.52.0", + "@rollup/rollup-linux-arm64-gnu": "4.52.0", + "@rollup/rollup-linux-arm64-musl": "4.52.0", + "@rollup/rollup-linux-loong64-gnu": "4.52.0", + "@rollup/rollup-linux-ppc64-gnu": "4.52.0", + "@rollup/rollup-linux-riscv64-gnu": "4.52.0", + "@rollup/rollup-linux-riscv64-musl": "4.52.0", + "@rollup/rollup-linux-s390x-gnu": "4.52.0", + "@rollup/rollup-linux-x64-gnu": "4.52.0", + "@rollup/rollup-linux-x64-musl": "4.52.0", + "@rollup/rollup-openharmony-arm64": "4.52.0", + "@rollup/rollup-win32-arm64-msvc": "4.52.0", + "@rollup/rollup-win32-ia32-msvc": "4.52.0", + "@rollup/rollup-win32-x64-gnu": "4.52.0", + "@rollup/rollup-win32-x64-msvc": "4.52.0", "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4146,9 +4190,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -4267,13 +4311,13 @@ } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-js": { @@ -4294,14 +4338,13 @@ "license": "BSD-3-Clause" }, "node_modules/streamx": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", - "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", "dev": true, "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" }, "optionalDependencies": { @@ -4363,17 +4406,16 @@ } }, "node_modules/strtok3": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-9.1.1.tgz", - "integrity": "sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==", + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", + "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", "dev": true, "license": "MIT", "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.3.1" + "@tokenizer/token": "^0.3.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "type": "github", @@ -4419,11 +4461,14 @@ } }, "node_modules/text-decoder": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", - "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } }, "node_modules/through": { "version": "2.3.8", @@ -4442,14 +4487,52 @@ "readable-stream": "3" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, "engines": { - "node": ">=4" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/to-regex-range": { @@ -4466,12 +4549,13 @@ } }, "node_modules/token-types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", - "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz", + "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==", "dev": true, "license": "MIT", "dependencies": { + "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" }, @@ -4494,9 +4578,9 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4508,16 +4592,16 @@ } }, "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "dev": true, "license": "MIT" }, "node_modules/uint8array-extras": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", - "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", "dev": true, "license": "MIT", "engines": { @@ -4545,62 +4629,60 @@ "dev": true, "license": "MIT" }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/unplugin": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", - "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz", + "integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.12.1", + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "webpack-sources": "^3" - }, - "peerDependenciesMeta": { - "webpack-sources": { - "optional": true - } + "node": ">=18.12.0" } }, "node_modules/unplugin-swc": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/unplugin-swc/-/unplugin-swc-1.5.1.tgz", - "integrity": "sha512-/ZLrPNjChhGx3Z95pxJ4tQgfI6rWqukgYHKflrNB4zAV1izOQuDhkTn55JWeivpBxDCoK7M/TStb2aS/14PS/g==", + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/unplugin-swc/-/unplugin-swc-1.5.7.tgz", + "integrity": "sha512-Ng4uuLAodZToA0kQk3+oY8b0C/Q9oV0ohRMixH2nqWMhCF/wNuMYZXZznYpwRLmF7wC36TFIOywBAxCLOReoeg==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^5.1.0", + "@rollup/pluginutils": "^5.2.0", "load-tsconfig": "^0.2.5", - "unplugin": "^1.11.0" + "unplugin": "^2.3.8" }, "peerDependencies": { "@swc/core": "^1.2.108" } }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4619,21 +4701,24 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.1.tgz", - "integrity": "sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.6.tgz", + "integrity": "sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.24.0", - "postcss": "^8.4.49", - "rollup": "^4.23.0" + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -4642,14 +4727,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -4691,24 +4776,21 @@ } }, "node_modules/vite-plugin-dts": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.3.0.tgz", - "integrity": "sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", + "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor": "^7.47.11", - "@rollup/pluginutils": "^5.1.0", - "@volar/typescript": "^2.4.4", - "@vue/language-core": "2.1.6", + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", "compare-versions": "^6.1.1", - "debug": "^4.3.6", + "debug": "^4.4.0", "kolorist": "^1.8.0", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.11" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" }, "peerDependencies": { "typescript": "*", @@ -4720,10 +4802,41 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, "license": "MIT" }, @@ -4750,6 +4863,13 @@ "node": ">= 8" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/yauzl": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", diff --git a/threads/package.json b/threads/package.json index 99386c1..56e9c21 100644 --- a/threads/package.json +++ b/threads/package.json @@ -1,10 +1,10 @@ { "name": "@oligami/browser_wasi_shim-threads", - "version": "0.1.1", + "version": "0.2.3", "type": "module", "scripts": { "dev": "vite", - "build": "npm run worker && vite build", + "build": "npm run worker && vite build && node ./scripts/post_build.js", "prepare": "npm run build", "fmt": "biome format --write .", "lint": "biome lint src examples import-module-test", @@ -16,22 +16,21 @@ "worker": "src/shared_array_buffer/worker_background/*.ts" }, "devDependencies": { - "@biomejs/biome": "1.9.4", - "@swc/cli": "^0.5.1", - "@swc/core": "^1.9.3", - "better-typescript-lib": "^2.10.0", + "@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.7.2", - "unplugin-swc": "^1.5.1", - "vite": "^6.0.1", - "vite-plugin-dts": "^4.3.0" + "typescript": "^5.9.2", + "unplugin-swc": "^1.5.7", + "vite": "^7.1.6", + "vite-plugin-dts": "^4.5.4" }, "dependencies": { - "@bjorn3/browser_wasi_shim": "^0.3.0", - "@oligami/browser_wasi_shim-threads": "file:" + "@bjorn3/browser_wasi_shim": "^0.4.2" }, "peerDependencies": { - "@bjorn3/browser_wasi_shim": "^0.3.0" + "@bjorn3/browser_wasi_shim": "^0.4.2" }, "private": false, "publishConfig": { diff --git a/threads/scripts/post_build.js b/threads/scripts/post_build.js new file mode 100644 index 0000000..71518ab --- /dev/null +++ b/threads/scripts/post_build.js @@ -0,0 +1,10 @@ +import fs from "node:fs"; +import path from "node:path"; + +const worker_background_worker_url = + "./src/shared_array_buffer/worker_background/worker_background_worker_minify.js"; + +fs.copyFileSync( + worker_background_worker_url, + "./dist/worker_background_worker.min.js", +); diff --git a/threads/src/animals.ts b/threads/src/animals.ts index 1282977..cdaaee4 100644 --- a/threads/src/animals.ts +++ b/threads/src/animals.ts @@ -1,11 +1,11 @@ import { WASIProcExit } from "@bjorn3/browser_wasi_shim"; -import type { WASIFarmRef } from "./ref.js"; -import type { WASIFarmRefObject } from "./ref.js"; -import type { FdCloseSender } from "./sender.js"; -import { WASIFarmRefUseArrayBuffer } from "./shared_array_buffer/index.js"; -import type { WASIFarmRefUseArrayBufferObject } from "./shared_array_buffer/index.js"; -import { ThreadSpawner } from "./shared_array_buffer/index.js"; import { wasi } from "@bjorn3/browser_wasi_shim"; +import type { WASIFarmRef } from "./ref.ts"; +import type { WASIFarmRefObject } from "./ref.ts"; +import type { FdCloseSender } from "./sender.ts"; +import { WASIFarmRefUseArrayBuffer } from "./shared_array_buffer/index.ts"; +import type { WASIFarmRefUseArrayBufferObject } from "./shared_array_buffer/index.ts"; +import { ThreadSpawner } from "./shared_array_buffer/index.ts"; export class WASIFarmAnimal { args: Array; @@ -70,11 +70,16 @@ export class WASIFarmAnimal { return [mapped_fd, wasi_ref_n]; } - /// Start a WASI command + /** Start a WASI command + When this function is executed, the WebAssembly (Wasm) code runs on that thread. + If the Wasm code throws an error or calls process_exit, + the main thread would need to be forcibly terminated. However, since this is not possible, if the Wasm code aborts in a child thread, it will be thrown from the worker_background_worker function. By default, this function is hidden. For detailed usage, please refer to the examples/worker_background_worker.ts file. + If you are dealing with programs that may abort, + consider using async_start_on_thread or block_start_on_thread instead. */ start(instance: { // FIXME v0.3: close opened Fds after execution exports: { memory: WebAssembly.Memory; _start: () => unknown }; - }) { + }): number { this.inst = instance; try { @@ -101,15 +106,26 @@ export class WASIFarmAnimal { } } - /// Start a WASI command on a thread - /// If a module has child threads and a child thread throws an error, - /// the main thread should also be stopped, - /// but there is no way to stop it, - /// so the entire worker is stopped. - /// If it is not necessary, do not use it. - /// Custom imports are not implemented, - /// function because it cannot be passed to other threads. - /// If the sharedObject library someday supports synchronization, it could be used to support this. + /** + * This function is similar to start, but it does not handle error and exit code. + */ + start_only(instance: { + exports: { memory: WebAssembly.Memory; _start: () => unknown }; + }) { + this.inst = instance; + instance.exports._start(); + } + + /** Start a WASI command on a thread. + If the module has child threads and one of them throws an error, + the main thread should normally also be stopped. + However, since there is no way to stop it, + the entire worker will be stopped instead. + Do not use this if it is not necessary. + If you want to use custom imports, + pass the optional instantiate function as an argument + to the thread_spawn_on_worker function. + */ async async_start_on_thread(): Promise { if (!this.can_thread_spawn || !this.thread_spawner) { throw new Error("thread_spawn is not supported"); @@ -121,8 +137,13 @@ export class WASIFarmAnimal { throw new Error("what happened?"); } - const view = new Uint8Array(this.get_share_memory().buffer); - view.fill(0); + const memories = this.thread_spawner.get_share_memory(); + for (const share_memory in memories) { + const view = new Uint8Array(memories[share_memory].buffer); + view.fill(0); + } + + const code_promise = this.thread_spawner.async_wait_done_or_error(); await this.thread_spawner.async_start_on_thread( this.args, @@ -130,11 +151,21 @@ export class WASIFarmAnimal { this.fd_map, ); - const code = await this.thread_spawner.async_wait_done_or_error(); + const code = await code_promise; return code; } + /** Start a WASI command on a thread. + If the module has child threads and one of them throws an error, + the main thread should normally also be stopped. + However, since there is no way to stop it, + the entire worker will be stopped instead. + Do not use this if it is not necessary. + If you want to use custom imports, + pass the optional instantiate function as an argument + to the thread_spawn_on_worker function. + */ block_start_on_thread(): number { if (!this.can_thread_spawn || !this.thread_spawner) { throw new Error("thread_spawn is not supported"); @@ -150,8 +181,11 @@ export class WASIFarmAnimal { throw new Error("what happened?"); } - const view = new Uint8Array(this.get_share_memory().buffer); - view.fill(0); + const memories = this.thread_spawner.get_share_memory(); + for (const share_memory in memories) { + const view = new Uint8Array(memories[share_memory].buffer); + view.fill(0); + } console.log("block_start_on_thread: start"); @@ -177,15 +211,7 @@ export class WASIFarmAnimal { start_arg: number, ) { this.inst = instance; - try { - instance.exports.wasi_thread_start(thread_id, start_arg); - return 0; - } catch (e) { - if (e instanceof WASIProcExit) { - return e.code; - } - throw e; - } + instance.exports.wasi_thread_start(thread_id, start_arg); } /// Initialize a WASI reactor @@ -249,6 +275,7 @@ export class WASIFarmAnimal { } this.map_new_fd(j, i); } + wasi_farm_ref.set_park_fds_map(override_fd_map); // console.log("this.fd_map", this.fd_map); @@ -333,7 +360,9 @@ export class WASIFarmAnimal { } } - get_share_memory(): WebAssembly.Memory { + get_share_memory(): { + [key: string]: WebAssembly.Memory; + } { if (!this.thread_spawner) { throw new Error("thread_spawner is not defined"); } @@ -350,6 +379,10 @@ export class WASIFarmAnimal { thread_spawn_worker_url?: string; thread_spawn_wasm?: WebAssembly.Module; hand_override_fd_map?: Array<[number, number]>; + worker_background_worker_url?: string; + share_memory?: { + [key: string]: WebAssembly.Memory; + }; } = {}, override_fd_maps?: Array, thread_spawner?: ThreadSpawner, @@ -406,10 +439,11 @@ export class WASIFarmAnimal { this.thread_spawner = new ThreadSpawner( options.thread_spawn_worker_url, wasi_farm_refs_tmp, - undefined, + options.share_memory, undefined, undefined, options.thread_spawn_wasm, + options.worker_background_worker_url, ); } } @@ -1243,9 +1277,60 @@ export class WASIFarmAnimal { const path = buffer8.slice(path_ptr, path_ptr + path_len); return wasi_farm_ref.path_unlink_file(mapped_fd, path); }, - poll_oneoff(_in_, _out, _nsubscriptions) { - self.check_fds(); - throw "async io not supported"; + poll_oneoff( + in_ptr: number, + out_ptr: number, + nsubscriptions: number, + stored_events_count_ptr: number, + ): number { + if (nsubscriptions === 0) { + return wasi.ERRNO_INVAL; + } + // TODO: For now, we only support a single subscription just to be enough for wasi-libc's + // clock_nanosleep. + if (nsubscriptions > 1) { + console.error("poll_oneoff: only a single subscription is supported"); + return wasi.ERRNO_NOTSUP; + } + + // Read a subscription from the in buffer + const buffer = new DataView(self.inst!.exports.memory.buffer); + const s = wasi.Subscription.read_bytes(buffer, in_ptr); + const eventtype = s.eventtype; + const clockid = s.clockid; + const timeout = s.timeout; + // TODO: For now, we only support clock subscriptions. + if (eventtype !== wasi.EVENTTYPE_CLOCK) { + console.error("poll_oneoff: only clock subscriptions are supported"); + return wasi.ERRNO_NOTSUP; + } + + // Select timer + let getNow: (() => bigint) | undefined = undefined; + if (clockid === wasi.CLOCKID_MONOTONIC) { + getNow = () => BigInt(Math.round(performance.now() * 1_000_000)); + } else if (clockid === wasi.CLOCKID_REALTIME) { + getNow = () => BigInt(new Date().getTime()) * 1_000_000n; + } else { + return wasi.ERRNO_INVAL; + } + + // Perform the wait + const endTime = + ((s.flags & wasi.SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME) !== 0 + ? timeout + : getNow() + timeout) - s.precision; + while (endTime > getNow()) { + // block until the timeout is reached + } + + // Write an event to the out buffer + 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) { self.check_fds(); diff --git a/threads/src/farm.ts b/threads/src/farm.ts index f2455dc..90fafc4 100644 --- a/threads/src/farm.ts +++ b/threads/src/farm.ts @@ -1,7 +1,7 @@ import type { Fd } from "@bjorn3/browser_wasi_shim"; -import type { WASIFarmPark } from "./park.js"; -import type { WASIFarmRefObject } from "./ref.js"; -import { WASIFarmParkUseArrayBuffer } from "./shared_array_buffer/index.js"; +import type { WASIFarmPark } from "./park.ts"; +import type { WASIFarmRefObject } from "./ref.ts"; +import { WASIFarmParkUseArrayBuffer } from "./shared_array_buffer/index.ts"; export class WASIFarm { private fds: Array; @@ -16,6 +16,7 @@ export class WASIFarm { fds: Array = [], options: { allocator_size?: number; + max_fds_limit?: number; } = {}, ) { const new_fds = []; @@ -64,6 +65,13 @@ export class WASIFarm { } } + // Check Atomics.waitAsync support + if (typeof Atomics.waitAsync !== "function") { + throw new Error( + "Atomics.waitAsync is not supported. Please use a polyfill.", + ); + } + if (this.can_array_buffer) { this.park = new WASIFarmParkUseArrayBuffer( this.fds_ref(), @@ -72,6 +80,7 @@ export class WASIFarm { stderr_, default_allow_fds, options?.allocator_size, + options?.max_fds_limit, ); } else { throw new Error("Non SharedArrayBuffer is not supported yet"); diff --git a/threads/src/index.ts b/threads/src/index.ts index f5ec1d6..319af1f 100644 --- a/threads/src/index.ts +++ b/threads/src/index.ts @@ -1,5 +1,10 @@ -import { WASIFarmAnimal } from "./animals.js"; -import { WASIFarm } from "./farm.js"; -import { WASIFarmRef } from "./ref.js"; -export { thread_spawn_on_worker } from "./shared_array_buffer/index.js"; +import { WASIFarmAnimal } from "./animals.ts"; +import { WASIFarm } from "./farm.ts"; +import { WASIFarmRef } from "./ref.ts"; +export { thread_spawn_on_worker } from "./shared_array_buffer/index.ts"; export { WASIFarm, WASIFarmRef, WASIFarmAnimal }; +const worker_background_worker_url: string = + "./dist/worker_background_worker.min.ts"; +export { worker_background_worker_url }; +// @ts-ignore +export { wait_async_polyfill } from "./polyfill.js"; diff --git a/threads/src/park.ts b/threads/src/park.ts index b652648..17639e9 100644 --- a/threads/src/park.ts +++ b/threads/src/park.ts @@ -35,7 +35,7 @@ export abstract class WASIFarmPark { private get_new_fd_lock = new Array<() => Promise>(); - // fdに対して、現在そのfdにidがアクセス可能かを示す。 + // Indicates whether the given id currently has access to the fd. protected fds_map: Array; // If the reassigned value is accessed after being closed, diff --git a/threads/src/patch.ts b/threads/src/patch.ts new file mode 100644 index 0000000..9bbaa38 --- /dev/null +++ b/threads/src/patch.ts @@ -0,0 +1,26 @@ +// I don't know what happened, but this file must be here for some reason. +// Maybe it's a bug in the somewhere? + +import { wasi } from "@bjorn3/browser_wasi_shim"; + +export function gen_wasi_filestat( + dev: bigint, + ino: bigint, + filetype: number, + nlink: bigint, + size: bigint, + atim: bigint, + mtim: bigint, + ctim: bigint, +): wasi.Filestat { + const file_stat = new wasi.Filestat(ino, filetype, size); + file_stat.dev = dev; + file_stat.ino = ino; + file_stat.filetype = filetype; + file_stat.nlink = nlink; + file_stat.size = size; + file_stat.atim = atim; + file_stat.mtim = mtim; + file_stat.ctim = ctim; + return file_stat; +} diff --git a/threads/src/polyfill.js b/threads/src/polyfill.js index bde01dd..2369579 100644 --- a/threads/src/polyfill.js +++ b/threads/src/polyfill.js @@ -1,147 +1,159 @@ -// https://github.com/tc39/proposal-atomics-wait-async/blob/master/polyfill.js - /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Author: Lars T Hansen, lhansen@mozilla.com - */ - -/* Polyfill for Atomics.waitAsync() for web browsers. - * - * Any kind of agent that is able to create a new Worker can use this polyfill. - * - * Load this file in all agents that will use Atomics.waitAsync. * - * Agents that don't call Atomics.waitAsync need do nothing special. - * - * Any kind of agent can wake another agent that is sleeping in - * Atomics.waitAsync by just calling Atomics.notify for the location being slept - * on, as normal. - * - * The implementation is not completely faithful to the proposed semantics: in - * the case where an agent first asyncWaits and then waits on the same location: - * when it is woken, the two waits will be woken in order, while in the real - * semantics, the sync wait will be woken first. - * - * In this polyfill Atomics.waitAsync is not very fast. + * Modified to implement a dynamic worker pool with idle timeout, + * avoiding the 'delete' operator for better performance. */ -/* Implementation: - * - * For every wait we fork off a Worker to perform the wait. Workers are reused - * when possible. The worker communicates with its parent using postMessage. - */ - -(() => { +export function wait_async_polyfill() { + // If native implementation already exists, do nothing if (typeof Atomics.waitAsync === "function") return; + // Code to be executed within the worker const helperCode = ` - onmessage = function (ev) { + onmessage = function (ev) { try { - switch (ev.data[0]) { - case 'wait': { - let [_, ia, index, value, timeout] = ev.data; - let result = Atomics.wait(ia, index, value, timeout) - postMessage(['ok', result]); - break; - } - default: { - throw new Error("Bogus message sent to wait helper: " + ev.data.join(',')); - } + switch (ev.data[0]) { + case 'wait': { + let [_, ia, index, value, timeout] = ev.data; + let result = Atomics.wait(ia, index, value, timeout); + postMessage(['ok', result]); + break; } + default: { + throw new Error("Bogus message sent to wait helper: " + ev.data.join(',')); + } + } } catch (e) { - console.log("Exception in wait helper"); - postMessage(['error', 'Exception']); + // Notify the main thread of any errors + postMessage(['error', e.name + ': ' + e.message]); } - } + } `; - const helpers = []; + // Pool to hold idle workers + const idleHelpers = []; + const IDLE_TIMEOUT = 10000; // 10 seconds + /** + * Gets a worker from the pool. + * Reuses an idle worker if available, otherwise creates a new one. + */ function allocHelper() { - if (helpers.length > 0) return helpers.pop(); - const h = new Worker( - `data:application/javascript,${encodeURIComponent(helperCode)}`, - ); + if (idleHelpers.length > 0) { + const h = idleHelpers.pop(); + // Cancel the scheduled termination timer for the reused worker + if (h.terminationTimer) { + clearTimeout(h.terminationTimer); + // Avoid 'delete' by setting the property to null + h.terminationTimer = null; + } + return h; + } + + console.debug("Allocating new waitAsync helper worker"); + + // Create a new worker if the pool is empty + const blob = new Blob([helperCode], { type: "application/javascript" }); + const url = URL.createObjectURL(blob); + const h = new Worker(url); + URL.revokeObjectURL(url); // Clean up the object URL + // Add an error handler for debugging + h.onerror = (e) => { + console.error( + "Error in waitAsync helper worker:", + e.message, + e.filename, + e.lineno, + ); + }; return h; } + /** + * Returns a worker to the pool. + * Sets a timer to terminate the worker after 10 seconds of inactivity. + * @param {Worker} h - The worker to return to the pool. + */ function freeHelper(h) { - helpers.push(h); - } + // Schedule the worker for termination if it remains idle + h.terminationTimer = setTimeout(() => { + const index = idleHelpers.indexOf(h); + if (index !== -1) { + h.terminate(); // Terminate the worker + idleHelpers.splice(index, 1); // Remove from the pool + console.debug("Terminated idle waitAsync helper worker"); + } + }, IDLE_TIMEOUT); - // Atomics.waitAsync always returns a promise. Throws standard errors - // for parameter validation. The promise is resolved with a string as from - // Atomics.wait, or, in the case something went completely wrong, it is - // rejected with an error string. + // Add the worker back to the idle pool + idleHelpers.push(h); + } + /** + * Polyfill implementation for Atomics.waitAsync + */ function waitAsync(ia, index_, value_, timeout_) { if ( typeof ia !== "object" || !(ia instanceof Int32Array) || !(ia.buffer instanceof SharedArrayBuffer) ) - throw new TypeError("Expected shared memory"); - - // These conversions only approximate the desired semantics but are - // close enough for the polyfill. + throw new TypeError("Atomics.waitAsync requires a shared Int32Array."); const index = index_ | 0; const value = value_ | 0; const timeout = timeout_ === undefined ? Number.POSITIVE_INFINITY : +timeout_; - // Range checking for the index. - - ia[index]; + if (index < 0 || index >= ia.length) { + throw new RangeError("Index out of bounds."); + } - // Optimization, avoid the helper thread in this common case. + // Optimization: avoid waiting if the value already doesn't match + if (Atomics.load(ia, index) !== value) { + return { + async: false, + value: "not-equal", + }; + } - if (Atomics.load(ia, index) !== value) return Promise.resolve("not-equal"); + // General case: must wait for a notification + return { + async: true, + value: new Promise((resolve, reject) => { + const h = allocHelper(); - // General case, we must wait. + h.onmessage = (ev) => { + // Return the worker to the pool for reuse + freeHelper(h); + h.onmessage = null; // Clear the handler - return new Promise((resolve, reject) => { - const h = allocHelper(); - h.onmessage = (ev) => { - // Free the helper early so that it can be reused if the resolution - // needs a helper. - freeHelper(h); - switch (ev.data[0]) { - case "ok": - resolve(ev.data[1]); - break; - case "error": - // Note, rejection is not in the spec, it is an artifact of the polyfill. - // The helper already printed an error to the console. - reject(ev.data[1]); - break; - } - }; + switch (ev.data[0]) { + case "ok": + resolve(ev.data[1]); + break; + case "error": + // Note: rejection is an artifact of the polyfill, not in the spec + reject(new Error(`Error in waitAsync helper: ${ev.data[1]}`)); + break; + } + }; - // It's possible to do better here if the ia is already known to the - // helper. In that case we can communicate the other data through - // shared memory and wake the agent. And it is possible to make ia - // known to the helper by waking it with a special value so that it - // checks its messages, and then posting the ia to the helper. Some - // caching / decay scheme is useful no doubt, to improve performance - // and avoid leaks. - // - // In the event we wake the helper directly, we can micro-wait here - // for a quick result. We'll need to restructure some code to make - // that work out properly, and some synchronization is necessary for - // the helper to know that we've picked up the result and no - // postMessage is necessary. - - h.postMessage(["wait", ia, index, value, timeout]); - }); + // Send the wait command to the worker + h.postMessage(["wait", ia, index, value, timeout]); + }), + }; } + // Define the waitAsync property on the Atomics object Object.defineProperty(Atomics, "waitAsync", { value: waitAsync, configurable: true, enumerable: false, writable: true, }); -})(); +} diff --git a/threads/src/shared_array_buffer/fd_close_sender.ts b/threads/src/shared_array_buffer/fd_close_sender.ts index a137e77..a1554d4 100644 --- a/threads/src/shared_array_buffer/fd_close_sender.ts +++ b/threads/src/shared_array_buffer/fd_close_sender.ts @@ -1,8 +1,8 @@ -import type { FdCloseSender } from "../sender.js"; +import type { FdCloseSender } from "../sender.ts"; import { ToRefSenderUseArrayBuffer, type ToRefSenderUseArrayBufferObject, -} from "./sender.js"; +} from "./sender.ts"; export type FdCloseSenderUseArrayBufferObject = { max_share_arrays_memory?: number; diff --git a/threads/src/shared_array_buffer/index.ts b/threads/src/shared_array_buffer/index.ts index 0e2d34a..193797c 100644 --- a/threads/src/shared_array_buffer/index.ts +++ b/threads/src/shared_array_buffer/index.ts @@ -1,8 +1,8 @@ -import { WASIFarmParkUseArrayBuffer } from "./park.js"; -import { WASIFarmRefUseArrayBuffer } from "./ref.js"; -import type { WASIFarmRefUseArrayBufferObject } from "./ref.js"; -import { ThreadSpawner } from "./thread_spawn.js"; -import { thread_spawn_on_worker } from "./thread_spawn.js"; +import { WASIFarmParkUseArrayBuffer } from "./park.ts"; +import { WASIFarmRefUseArrayBuffer } from "./ref.ts"; +import type { WASIFarmRefUseArrayBufferObject } from "./ref.ts"; +import { ThreadSpawner } from "./thread_spawn.ts"; +import { thread_spawn_on_worker } from "./thread_spawn.ts"; export { WASIFarmRefUseArrayBuffer, diff --git a/threads/src/shared_array_buffer/park.ts b/threads/src/shared_array_buffer/park.ts index cd77671..8bd5d19 100644 --- a/threads/src/shared_array_buffer/park.ts +++ b/threads/src/shared_array_buffer/park.ts @@ -1,10 +1,9 @@ import { type Fd, wasi } from "@bjorn3/browser_wasi_shim"; -import { WASIFarmPark } from "../park.js"; -import type { FdCloseSender } from "../sender.js"; -import { AllocatorUseArrayBuffer } from "./allocator.js"; -import { FdCloseSenderUseArrayBuffer } from "./fd_close_sender.js"; -import type { WASIFarmRefUseArrayBufferObject } from "./ref.js"; -import { get_func_name_from_number } from "./util.js"; +import { WASIFarmPark } from "../park.ts"; +import type { FdCloseSender } from "../sender.ts"; +import { AllocatorUseArrayBuffer } from "./allocator.ts"; +import { FdCloseSenderUseArrayBuffer } from "./fd_close_sender.ts"; +import type { WASIFarmRefUseArrayBufferObject } from "./ref.ts"; export const fd_func_sig_u32_size: number = 18; export const fd_func_sig_bytes: number = fd_func_sig_u32_size * 4; @@ -111,6 +110,7 @@ export class WASIFarmParkUseArrayBuffer extends WASIFarmPark { // wasi_farm_ref default allow fds default_allow_fds: Array, allocator_size?: number, + max_fds_len = 128, ) { super(fds, stdin, stdout, stderr, default_allow_fds); @@ -121,7 +121,7 @@ export class WASIFarmParkUseArrayBuffer extends WASIFarmPark { new SharedArrayBuffer(allocator_size), ); } - const max_fds_len = 128; + // size of int * max_fds_len * 4 (= lock, call, wait) this.lock_fds = new SharedArrayBuffer(4 * max_fds_len * 3); this.fd_func_sig = new SharedArrayBuffer( fd_func_sig_u32_size * 4 * max_fds_len, @@ -133,7 +133,7 @@ export class WASIFarmParkUseArrayBuffer extends WASIFarmPark { Atomics.store(view, 1, 0); this.fd_close_receiver = new FdCloseSenderUseArrayBuffer(); - this.base_func_util = new SharedArrayBuffer(24); + this.base_func_util = new SharedArrayBuffer(28); } /// Send this return by postMessage. @@ -226,78 +226,63 @@ export class WASIFarmParkUseArrayBuffer extends WASIFarmPark { async listen_base() { const lock_view = new Int32Array(this.base_func_util); Atomics.store(lock_view, 0, 0); - Atomics.store(lock_view, 1, 0); + Atomics.store(lock_view, 1, 1); // eslint-disable-next-line no-constant-condition while (true) { - try { - let lock: "not-equal" | "timed-out" | "ok"; + const { value } = Atomics.waitAsync(lock_view, 1, 1); + if ((await value) === "timed-out") { + throw new Error("timed-out"); + } - const { value } = Atomics.waitAsync(lock_view, 1, 0); - if (value instanceof Promise) { - lock = await value; - } else { - lock = value; - } - if (lock === "timed-out") { - throw new Error("timed-out"); - } - - const func_number = Atomics.load(lock_view, 2); - - switch (func_number) { - // set_fds_map: (fds_ptr: u32, fds_len: u32); - case 0: { - // console.log("set_fds_map"); - const ptr = Atomics.load(lock_view, 3); - const len = Atomics.load(lock_view, 4); - // console.log("set_fds_map", ptr, len); - const data = new Uint32Array(this.allocator.get_memory(ptr, len)); - this.allocator.free(ptr, len); - const wasi_farm_ref_id = Atomics.load(lock_view, 5); - - // console.log("listen_base set_fds_map", data, "from", wasi_farm_ref_id); - - // console.log("listen_base fds_map", this.fds_map); - - for (let i = 0; i < len / 4; i++) { - const fd = data[i]; - if (this.fds_map[fd] === undefined) { - this.fds_map[fd] = []; - console.error("listen_base fd is not defined"); - } - this.fds_map[fd].push(wasi_farm_ref_id); - // console.log("this.fds_map", this.fds_map); - // console.log("this.fds_map[fd]", this.fds_map[fd]); - // console.log("this.fds_map[1]", this.fds_map[1]); - // console.log("fd", fd, "wasi_farm_ref_id", wasi_farm_ref_id); - } + const func_number = Atomics.load(lock_view, 3); - // console.log("listen_base fds_map", this.fds_map); + switch (func_number) { + // set_fds_map: (fds_ptr: u32, fds_len: u32); + case 0: { + // console.log("set_fds_map"); + const ptr = Atomics.load(lock_view, 4); + const len = Atomics.load(lock_view, 5); + // console.log("set_fds_map", ptr, len); + const data = new Uint32Array(this.allocator.get_memory(ptr, len)); + this.allocator.free(ptr, len); + const wasi_farm_ref_id = Atomics.load(lock_view, 6); - // sleep 1000ms - await new Promise((resolve) => setTimeout(resolve, 1000)); + // console.log("listen_base set_fds_map", data, "from", wasi_farm_ref_id); - break; + // console.log("listen_base fds_map", this.fds_map); + + for (let i = 0; i < len / 4; i++) { + const fd = data[i]; + if (this.fds_map[fd] === undefined) { + this.fds_map[fd] = []; + console.error("listen_base fd is not defined"); + } + this.fds_map[fd].push(wasi_farm_ref_id); + // console.log("this.fds_map", this.fds_map); + // console.log("this.fds_map[fd]", this.fds_map[fd]); + // console.log("this.fds_map[1]", this.fds_map[1]); + // console.log("fd", fd, "wasi_farm_ref_id", wasi_farm_ref_id); } - } - const old_call_lock = Atomics.exchange(lock_view, 1, 0); - if (old_call_lock !== 1) { - throw new Error("Lock is already set"); + // console.log("listen_base fds_map", this.fds_map); + + // sleep 1000ms + await new Promise((resolve) => setTimeout(resolve, 1000)); + + break; } - const num = Atomics.notify(lock_view, 1, 1); - if (num !== 1) { - if (num === 0) { - console.warn("notify failed, waiter is late"); - continue; - } - throw new Error(`notify failed: ${num}`); + } + + Atomics.store(lock_view, 1, 1); + Atomics.store(lock_view, 2, 0); + const num = Atomics.notify(lock_view, 2, 1); + if (num !== 1) { + if (num === 0) { + console.warn("notify failed, waiter is late"); + continue; } - } catch (e) { - console.error("error", e); - Atomics.store(lock_view, 1, 0); - Atomics.notify(lock_view, 1, 1); + throw new Error(`notify failed: ${num}`); } } } @@ -316,684 +301,648 @@ export class WASIFarmParkUseArrayBuffer extends WASIFarmPark { ); const errno_offset = fd_func_sig_u32_size - 1; Atomics.store(lock_view, 0, 0); - Atomics.store(lock_view, 1, 0); + Atomics.store(lock_view, 1, 1); Atomics.store(func_sig_view_i32, errno_offset, -1); // eslint-disable-next-line no-constant-condition while (true) { - try { - let lock: "not-equal" | "timed-out" | "ok"; + const { value } = Atomics.waitAsync(lock_view, 1, 1); - const { value } = Atomics.waitAsync(lock_view, 1, 0); - if (value instanceof Promise) { - // console.log("listen", fd_n, 1); - lock = await value; - } else { - lock = value; - } - if (lock === "timed-out") { - throw new Error("timed-out"); - } + if ((await value) === "timed-out") { + throw new Error("timed-out"); + } - const func_lock = Atomics.load(lock_view, 1); + const set_error = (errno: number) => { + // console.log("set_error", errno, "pointer", errno_offset); + Atomics.store(func_sig_view_i32, errno_offset, errno); + }; - if (func_lock !== 1) { - throw new Error(`func_lock is already set: ${func_lock}`); - } + const func_number = Atomics.load(func_sig_view_u32, 0); - // console.log("func_lock", func_lock); + // console.log("called: func: ", get_func_name_from_number(func_number), "fd: ", fd_n); - // console.log("called", fd_n, 1); + switch (func_number) { + // fd_advise: (fd: u32) => errno; + case 7: { + const fd = Atomics.load(func_sig_view_u32, 1); - const set_error = (errno: number) => { - // console.log("set_error", errno, "pointer", errno_offset); - Atomics.store(func_sig_view_i32, errno_offset, errno); - }; + const error = this.fd_advise(fd); - const func_number = Atomics.load(func_sig_view_u32, 0); + set_error(error); + break; + } + // fd_allocate: (fd: u32, offset: u64, len: u64) => errno; + case 8: { + const fd = Atomics.load(func_sig_view_u32, 1); + const offset = Atomics.load(func_sig_view_u64, 1); + const len = Atomics.load(func_sig_view_u64, 2); - // console.log("called: func: ", get_func_name_from_number(func_number), "fd: ", fd_n); + const error = this.fd_allocate(fd, offset, len); - switch (func_number) { - // fd_advise: (fd: u32) => errno; - case 7: { - const fd = Atomics.load(func_sig_view_u32, 1); + set_error(error); + break; + } + // fd_close: (fd: u32) => errno; + case 9: { + const fd = Atomics.load(func_sig_view_u32, 1); - const error = this.fd_advise(fd); + const error = await this.fd_close(fd); - set_error(error); - break; - } - // fd_allocate: (fd: u32, offset: u64, len: u64) => errno; - case 8: { - const fd = Atomics.load(func_sig_view_u32, 1); - const offset = Atomics.load(func_sig_view_u64, 1); - const len = Atomics.load(func_sig_view_u64, 2); + // console.log("fd_close", fd, error); - const error = this.fd_allocate(fd, offset, len); + set_error(error); + break; + } + // fd_datasync: (fd: u32) => errno; + case 10: { + const fd = Atomics.load(func_sig_view_u32, 1); - set_error(error); - break; - } - // fd_close: (fd: u32) => errno; - case 9: { - const fd = Atomics.load(func_sig_view_u32, 1); + const error = this.fd_datasync(fd); - const error = await this.fd_close(fd); + set_error(error); + break; + } + // fd_fdstat_get: (fd: u32) => [wasi.Fdstat(u32 * 6)], errno]; + case 11: { + const fd = Atomics.load(func_sig_view_u32, 1); - // console.log("fd_close", fd, error); + const [fdstat, ret] = this.fd_fdstat_get(fd); - set_error(error); - break; + if (fdstat) { + Atomics.store(func_sig_view_u8, 0, fdstat.fs_filetype); + Atomics.store(func_sig_view_u16, 2, fdstat.fs_flags); + Atomics.store(func_sig_view_u64, 1, fdstat.fs_rights_base); + Atomics.store(func_sig_view_u64, 2, fdstat.fs_rights_inherited); } - // fd_datasync: (fd: u32) => errno; - case 10: { - const fd = Atomics.load(func_sig_view_u32, 1); + set_error(ret); + break; + } + // fd_fdstat_set_flags: (fd: u32, flags: u16) => errno; + case 12: { + const fd = Atomics.load(func_sig_view_u32, 1); + const flags = Atomics.load(func_sig_view_u16, 4); - const error = this.fd_datasync(fd); + const error = this.fd_fdstat_set_flags(fd, flags); - set_error(error); - break; - } - // fd_fdstat_get: (fd: u32) => [wasi.Fdstat(u32 * 6)], errno]; - case 11: { - const fd = Atomics.load(func_sig_view_u32, 1); + set_error(error); + break; + } + // fd_fdstat_set_rights: (fd: u32, fs_rights_base: u64, fs_rights_inheriting: u64) => errno; + case 13: { + const fd = Atomics.load(func_sig_view_u32, 1); + const fs_rights_base = Atomics.load(func_sig_view_u64, 1); + const fs_rights_inheriting = Atomics.load(func_sig_view_u64, 2); + + const error = this.fd_fdstat_set_rights( + fd, + fs_rights_base, + fs_rights_inheriting, + ); - const [fdstat, ret] = this.fd_fdstat_get(fd); + set_error(error); + break; + } + // fd_filestat_get: (fd: u32) => [wasi.Filestat(u32 * 16)], errno]; + case 14: { + const fd = Atomics.load(func_sig_view_u32, 1); - if (fdstat) { - Atomics.store(func_sig_view_u8, 0, fdstat.fs_filetype); - Atomics.store(func_sig_view_u16, 2, fdstat.fs_flags); - Atomics.store(func_sig_view_u64, 1, fdstat.fs_rights_base); - Atomics.store(func_sig_view_u64, 2, fdstat.fs_rights_inherited); - } - set_error(ret); - break; + const [filestat, ret] = this.fd_filestat_get(fd); + + if (filestat) { + Atomics.store(func_sig_view_u64, 0, filestat.dev); + Atomics.store(func_sig_view_u64, 1, filestat.ino); + Atomics.store(func_sig_view_u8, 16, filestat.filetype); + Atomics.store(func_sig_view_u64, 3, filestat.nlink); + Atomics.store(func_sig_view_u64, 4, filestat.size); + Atomics.store(func_sig_view_u64, 5, filestat.atim); + Atomics.store(func_sig_view_u64, 6, filestat.mtim); + Atomics.store(func_sig_view_u64, 7, filestat.ctim); } - // fd_fdstat_set_flags: (fd: u32, flags: u16) => errno; - case 12: { - const fd = Atomics.load(func_sig_view_u32, 1); - const flags = Atomics.load(func_sig_view_u16, 4); - const error = this.fd_fdstat_set_flags(fd, flags); + set_error(ret); + break; + } + // fd_filestat_set_size: (fd: u32, size: u64) => errno; + case 15: { + const fd = Atomics.load(func_sig_view_u32, 1); + const size = Atomics.load(func_sig_view_u64, 1); - set_error(error); - break; - } - // fd_fdstat_set_rights: (fd: u32, fs_rights_base: u64, fs_rights_inheriting: u64) => errno; - case 13: { - const fd = Atomics.load(func_sig_view_u32, 1); - const fs_rights_base = Atomics.load(func_sig_view_u64, 1); - const fs_rights_inheriting = Atomics.load(func_sig_view_u64, 2); - - const error = this.fd_fdstat_set_rights( - fd, - fs_rights_base, - fs_rights_inheriting, - ); + const error = this.fd_filestat_set_size(fd, size); - set_error(error); - break; - } - // fd_filestat_get: (fd: u32) => [wasi.Filestat(u32 * 16)], errno]; - case 14: { - const fd = Atomics.load(func_sig_view_u32, 1); - - const [filestat, ret] = this.fd_filestat_get(fd); - - if (filestat) { - Atomics.store(func_sig_view_u64, 0, filestat.dev); - Atomics.store(func_sig_view_u64, 1, filestat.ino); - Atomics.store(func_sig_view_u8, 16, filestat.filetype); - Atomics.store(func_sig_view_u64, 3, filestat.nlink); - Atomics.store(func_sig_view_u64, 4, filestat.size); - Atomics.store(func_sig_view_u64, 5, filestat.atim); - Atomics.store(func_sig_view_u64, 6, filestat.mtim); - Atomics.store(func_sig_view_u64, 7, filestat.ctim); - } + set_error(error); + break; + } + // fd_filestat_set_times: (fd: u32, atim: u64, mtim: u64, fst_flags: u16) => errno; + case 16: { + const fd = Atomics.load(func_sig_view_u32, 1); + const atim = Atomics.load(func_sig_view_u64, 1); + const mtim = Atomics.load(func_sig_view_u64, 2); + const fst_flags = Atomics.load(func_sig_view_u16, 12); - set_error(ret); - break; - } - // fd_filestat_set_size: (fd: u32, size: u64) => errno; - case 15: { - const fd = Atomics.load(func_sig_view_u32, 1); - const size = Atomics.load(func_sig_view_u64, 1); + const error = this.fd_filestat_set_times(fd, atim, mtim, fst_flags); - const error = this.fd_filestat_set_size(fd, size); + set_error(error); + break; + } + // fd_pread: (fd: u32, iovs_ptr: pointer, iovs_len: u32, offset: u64) => [u32, data_ptr, errno]; + case 17: { + const fd = Atomics.load(func_sig_view_u32, 1); + const iovs_ptr = Atomics.load(func_sig_view_u32, 2); + const iovs_ptr_len = Atomics.load(func_sig_view_u32, 3); + const offset = Atomics.load(func_sig_view_u64, 2); + const data = new Uint32Array( + this.allocator.get_memory(iovs_ptr, iovs_ptr_len), + ); + this.allocator.free(iovs_ptr, iovs_ptr_len); - set_error(error); - break; + const iovecs = new Array(); + for (let i = 0; i < iovs_ptr_len; i += 8) { + const iovec = new wasi.Iovec(); + iovec.buf = data[i * 2]; + iovec.buf_len = data[i * 2 + 1]; + iovecs.push(iovec); } - // fd_filestat_set_times: (fd: u32, atim: u64, mtim: u64, fst_flags: u16) => errno; - case 16: { - const fd = Atomics.load(func_sig_view_u32, 1); - const atim = Atomics.load(func_sig_view_u64, 1); - const mtim = Atomics.load(func_sig_view_u64, 2); - const fst_flags = Atomics.load(func_sig_view_u16, 12); - const error = this.fd_filestat_set_times(fd, atim, mtim, fst_flags); + // const [[nread, buffer8], error] = this.fd_pread(fd, iovecs, offset); + const [nread_and_buffer, error] = this.fd_pread(fd, iovecs, offset); + const [nread, buffer8] = nread_and_buffer ?? [undefined, undefined]; - set_error(error); - break; + if (nread !== undefined) { + Atomics.store(func_sig_view_u32, 0, nread); } - // fd_pread: (fd: u32, iovs_ptr: pointer, iovs_len: u32, offset: u64) => [u32, data_ptr, errno]; - case 17: { - const fd = Atomics.load(func_sig_view_u32, 1); - const iovs_ptr = Atomics.load(func_sig_view_u32, 2); - const iovs_ptr_len = Atomics.load(func_sig_view_u32, 3); - const offset = Atomics.load(func_sig_view_u64, 2); - const data = new Uint32Array( - this.allocator.get_memory(iovs_ptr, iovs_ptr_len), + if (buffer8) { + await this.allocator.async_write( + buffer8, + this.fd_func_sig, + fd * fd_func_sig_u32_size + 1, ); - this.allocator.free(iovs_ptr, iovs_ptr_len); - - const iovecs = new Array(); - for (let i = 0; i < iovs_ptr_len; i += 8) { - const iovec = new wasi.Iovec(); - iovec.buf = data[i * 2]; - iovec.buf_len = data[i * 2 + 1]; - iovecs.push(iovec); - } - - // const [[nread, buffer8], error] = this.fd_pread(fd, iovecs, offset); - const [nread_and_buffer, error] = this.fd_pread(fd, iovecs, offset); - const [nread, buffer8] = nread_and_buffer ?? [undefined, undefined]; - - if (nread !== undefined) { - Atomics.store(func_sig_view_u32, 0, nread); - } - if (buffer8) { - await this.allocator.async_write( - buffer8, - this.fd_func_sig, - fd * fd_func_sig_u32_size + 1, - ); - } - set_error(error); - break; } - // fd_prestat_get: (fd: u32) => [wasi.Prestat(u32 * 2)], errno]; - case 18: { - const fd = Atomics.load(func_sig_view_u32, 1); + set_error(error); + break; + } + // fd_prestat_get: (fd: u32) => [wasi.Prestat(u32 * 2)], errno]; + case 18: { + const fd = Atomics.load(func_sig_view_u32, 1); - const [prestat, ret] = this.fd_prestat_get(fd); + const [prestat, ret] = this.fd_prestat_get(fd); - // console.log("fd_prestat_get", prestat, ret); + // console.log("fd_prestat_get", prestat, ret); - if (prestat) { - Atomics.store(func_sig_view_u32, 0, prestat.tag); - Atomics.store( - func_sig_view_u32, - 1, - prestat.inner.pr_name.byteLength, - ); - } - set_error(ret); - break; - } - // fd_prestat_dir_name: (fd: u32, path_len: u32) => [path_ptr: pointer, path_len: u32, errno]; - case 19: { - const fd = Atomics.load(func_sig_view_u32, 1); - const path_len = Atomics.load(func_sig_view_u32, 2); - - const [prestat_dir_name, ret] = this.fd_prestat_dir_name( - fd, - path_len, + if (prestat) { + Atomics.store(func_sig_view_u32, 0, prestat.tag); + Atomics.store( + func_sig_view_u32, + 1, + prestat.inner.pr_name.byteLength, ); - - // console.log("fd_prestat_dir_name: park: ", prestat_dir_name); - - if ( - prestat_dir_name && - (ret === wasi.ERRNO_SUCCESS || ret === wasi.ERRNO_NAMETOOLONG) - ) { - await this.allocator.async_write( - prestat_dir_name, - this.fd_func_sig, - fd * fd_func_sig_u32_size, - ); - } - set_error(ret); - break; } - // fd_pwrite: (fd: u32, write_data: pointer, write_data_len: u32, offset: u64) => [u32, errno]; - case 20: { - const fd = Atomics.load(func_sig_view_u32, 1); - const write_data_ptr = Atomics.load(func_sig_view_u32, 2); - const write_data_len = Atomics.load(func_sig_view_u32, 3); - const offset = Atomics.load(func_sig_view_u64, 2); - - const data = new Uint8Array( - this.allocator.get_memory(write_data_ptr, write_data_len), + set_error(ret); + break; + } + // fd_prestat_dir_name: (fd: u32, path_len: u32) => [path_ptr: pointer, path_len: u32, errno]; + case 19: { + const fd = Atomics.load(func_sig_view_u32, 1); + const path_len = Atomics.load(func_sig_view_u32, 2); + + const [prestat_dir_name, ret] = this.fd_prestat_dir_name( + fd, + path_len, + ); + + // console.log("fd_prestat_dir_name: park: ", prestat_dir_name); + + if ( + prestat_dir_name && + (ret === wasi.ERRNO_SUCCESS || ret === wasi.ERRNO_NAMETOOLONG) + ) { + await this.allocator.async_write( + prestat_dir_name, + this.fd_func_sig, + fd * fd_func_sig_u32_size, ); - this.allocator.free(write_data_ptr, write_data_len); + } + set_error(ret); + break; + } + // fd_pwrite: (fd: u32, write_data: pointer, write_data_len: u32, offset: u64) => [u32, errno]; + case 20: { + const fd = Atomics.load(func_sig_view_u32, 1); + const write_data_ptr = Atomics.load(func_sig_view_u32, 2); + const write_data_len = Atomics.load(func_sig_view_u32, 3); + const offset = Atomics.load(func_sig_view_u64, 2); + + const data = new Uint8Array( + this.allocator.get_memory(write_data_ptr, write_data_len), + ); + this.allocator.free(write_data_ptr, write_data_len); - const [nwritten, error] = this.fd_pwrite(fd, data, offset); + const [nwritten, error] = this.fd_pwrite(fd, data, offset); - if (nwritten !== undefined) { - Atomics.store(func_sig_view_u32, 0, nwritten); - } - set_error(error); - break; + if (nwritten !== undefined) { + Atomics.store(func_sig_view_u32, 0, nwritten); } - // fd_read: (fd: u32, iovs_ptr: pointer, iovs_len: u32) => [u32, data_ptr, errno]; - case 21: { - const fd = Atomics.load(func_sig_view_u32, 1); - const iovs_ptr = Atomics.load(func_sig_view_u32, 2); - const iovs_ptr_len = Atomics.load(func_sig_view_u32, 3); - // console.log("fd_read: park: iovs: Uint8Array", this.allocator.get_memory(iovs_ptr, iovs_ptr_len)); - // console.log("ptr_len", iovs_ptr_len); - const iovs = new Uint32Array( - this.allocator.get_memory(iovs_ptr, iovs_ptr_len), - ); - this.allocator.free(iovs_ptr, iovs_ptr_len); + set_error(error); + break; + } + // fd_read: (fd: u32, iovs_ptr: pointer, iovs_len: u32) => [u32, data_ptr, errno]; + case 21: { + const fd = Atomics.load(func_sig_view_u32, 1); + const iovs_ptr = Atomics.load(func_sig_view_u32, 2); + const iovs_ptr_len = Atomics.load(func_sig_view_u32, 3); + // console.log("fd_read: park: iovs: Uint8Array", this.allocator.get_memory(iovs_ptr, iovs_ptr_len)); + // console.log("ptr_len", iovs_ptr_len); + const iovs = new Uint32Array( + this.allocator.get_memory(iovs_ptr, iovs_ptr_len), + ); + this.allocator.free(iovs_ptr, iovs_ptr_len); - // console.log("fd_read: park: iovs", iovs); + // console.log("fd_read: park: iovs", iovs); - const iovecs = new Array(); - for (let i = 0; i < iovs_ptr_len; i += 8) { - const iovec = new wasi.Iovec(); - iovec.buf = iovs[i * 2]; - iovec.buf_len = iovs[i * 2 + 1]; - iovecs.push(iovec); - } + const iovecs = new Array(); + for (let i = 0; i < iovs_ptr_len; i += 8) { + const iovec = new wasi.Iovec(); + iovec.buf = iovs[i * 2]; + iovec.buf_len = iovs[i * 2 + 1]; + iovecs.push(iovec); + } - // console.log("fd_read: park: iovecs", iovecs); + // console.log("fd_read: park: iovecs", iovecs); - const [nread_and_buffer, error] = this.fd_read(fd, iovecs); - const [nread, buffer8] = nread_and_buffer ?? [undefined, undefined]; + const [nread_and_buffer, error] = this.fd_read(fd, iovecs); + const [nread, buffer8] = nread_and_buffer ?? [undefined, undefined]; - // console.log("fd_read: park: buffer8", new TextDecoder().decode(buffer8)); + // console.log("fd_read: park: buffer8", new TextDecoder().decode(buffer8)); - if (nread !== undefined) { - Atomics.store(func_sig_view_u32, 0, nread); - } - if (buffer8) { - await this.allocator.async_write( - buffer8, - this.fd_func_sig, - fd * fd_func_sig_u32_size + 1, - ); - } - set_error(error); - break; + if (nread !== undefined) { + Atomics.store(func_sig_view_u32, 0, nread); } - // fd_readdir: (fd: u32, buf_len: u32, cookie: u64) => [buf_ptr: pointer, buf_len: u32, buf_used: u32, errno]; - case 22: { - const fd = Atomics.load(func_sig_view_u32, 1); - const buf_len = Atomics.load(func_sig_view_u32, 2); - const cookie = Atomics.load(func_sig_view_u64, 2); - - const [array_and_buf_used, error] = this.fd_readdir( - fd, - buf_len, - cookie, + if (buffer8) { + await this.allocator.async_write( + buffer8, + this.fd_func_sig, + fd * fd_func_sig_u32_size + 1, ); - const [array, buf_used] = array_and_buf_used ?? [ - undefined, - undefined, - ]; - - if (array) { - await this.allocator.async_write( - array, - this.fd_func_sig, - fd * fd_func_sig_u32_size, - ); - } - if (buf_used !== undefined) { - Atomics.store(func_sig_view_u32, 2, buf_used); - } - set_error(error); - break; } - // fd_seek: (fd: u32, offset: i64, whence: u8) => [u64, errno]; - case 24: { - const fd = Atomics.load(func_sig_view_u32, 1); - const offset = Atomics.load(func_sig_view_u64, 1); - const whence = Atomics.load(func_sig_view_u8, 16); + set_error(error); + break; + } + // fd_readdir: (fd: u32, buf_len: u32, cookie: u64) => [buf_ptr: pointer, buf_len: u32, buf_used: u32, errno]; + case 22: { + const fd = Atomics.load(func_sig_view_u32, 1); + const buf_len = Atomics.load(func_sig_view_u32, 2); + const cookie = Atomics.load(func_sig_view_u64, 2); + + const [array_and_buf_used, error] = this.fd_readdir( + fd, + buf_len, + cookie, + ); + const [array, buf_used] = array_and_buf_used ?? [ + undefined, + undefined, + ]; + + if (array) { + await this.allocator.async_write( + array, + this.fd_func_sig, + fd * fd_func_sig_u32_size, + ); + } + if (buf_used !== undefined) { + Atomics.store(func_sig_view_u32, 2, buf_used); + } + set_error(error); + break; + } + // fd_seek: (fd: u32, offset: i64, whence: u8) => [u64, errno]; + case 24: { + const fd = Atomics.load(func_sig_view_u32, 1); + const offset = Atomics.load(func_sig_view_u64, 1); + const whence = Atomics.load(func_sig_view_u8, 16); - const [new_offset, error] = this.fd_seek(fd, offset, whence); + const [new_offset, error] = this.fd_seek(fd, offset, whence); - if (new_offset !== undefined) { - Atomics.store(func_sig_view_u64, 0, new_offset); - } - set_error(error); - break; + if (new_offset !== undefined) { + Atomics.store(func_sig_view_u64, 0, new_offset); } - // fd_sync: (fd: u32) => errno; - case 25: { - const fd = Atomics.load(func_sig_view_u32, 1); + set_error(error); + break; + } + // fd_sync: (fd: u32) => errno; + case 25: { + const fd = Atomics.load(func_sig_view_u32, 1); - const error = this.fd_sync(fd); + const error = this.fd_sync(fd); - set_error(error); - break; - } - // fd_tell: (fd: u32) => [u64, errno]; - case 26: { - const fd = Atomics.load(func_sig_view_u32, 1); + set_error(error); + break; + } + // fd_tell: (fd: u32) => [u64, errno]; + case 26: { + const fd = Atomics.load(func_sig_view_u32, 1); - const [offset, error] = this.fd_tell(fd); + const [offset, error] = this.fd_tell(fd); - if (offset !== undefined) { - Atomics.store(func_sig_view_u64, 0, offset); - } - set_error(error); - break; + if (offset !== undefined) { + Atomics.store(func_sig_view_u64, 0, offset); } - // fd_write: (fd: u32, write_data: pointer, write_data_len: u32) => [u32, errno]; - case 27: { - const fd = Atomics.load(func_sig_view_u32, 1); - const write_data_ptr = Atomics.load(func_sig_view_u32, 2); - const write_data_len = Atomics.load(func_sig_view_u32, 3); - - const data = new Uint8Array( - this.allocator.get_memory(write_data_ptr, write_data_len), - ); - this.allocator.free(write_data_ptr, write_data_len); + set_error(error); + break; + } + // fd_write: (fd: u32, write_data: pointer, write_data_len: u32) => [u32, errno]; + case 27: { + const fd = Atomics.load(func_sig_view_u32, 1); + const write_data_ptr = Atomics.load(func_sig_view_u32, 2); + const write_data_len = Atomics.load(func_sig_view_u32, 3); + + const data = new Uint8Array( + this.allocator.get_memory(write_data_ptr, write_data_len), + ); + this.allocator.free(write_data_ptr, write_data_len); - // console.log("allocator", this.allocator); + // console.log("allocator", this.allocator); - // console.log("fd_write: park: write_data", new TextDecoder().decode(data)); + // console.log("fd_write: park: write_data", new TextDecoder().decode(data)); - const [nwritten, error] = await this.fd_write(fd, data); + const [nwritten, error] = await this.fd_write(fd, data); - // console.log("fd_write: park: error", error); + // console.log("fd_write: park: error", error); - if (nwritten !== undefined) { - Atomics.store(func_sig_view_u32, 0, nwritten); - } - set_error(error); - break; + if (nwritten !== undefined) { + Atomics.store(func_sig_view_u32, 0, nwritten); } - // path_create_directory: (fd: u32, path_ptr: pointer, path_len: u32) => errno; - case 28: { - const fd = Atomics.load(func_sig_view_u32, 1); - const path_ptr = Atomics.load(func_sig_view_u32, 2); - const path_len = Atomics.load(func_sig_view_u32, 3); - - const path = new Uint8Array( - this.allocator.get_memory(path_ptr, path_len), - ); - const path_str = new TextDecoder().decode(path); - this.allocator.free(path_ptr, path_len); + set_error(error); + break; + } + // path_create_directory: (fd: u32, path_ptr: pointer, path_len: u32) => errno; + case 28: { + const fd = Atomics.load(func_sig_view_u32, 1); + const path_ptr = Atomics.load(func_sig_view_u32, 2); + const path_len = Atomics.load(func_sig_view_u32, 3); + + const path = new Uint8Array( + this.allocator.get_memory(path_ptr, path_len), + ); + const path_str = new TextDecoder().decode(path); + this.allocator.free(path_ptr, path_len); - const error = this.path_create_directory(fd, path_str); + const error = this.path_create_directory(fd, path_str); - set_error(error); - break; - } - // path_filestat_get: (fd: u32, flags: u32, path_ptr: pointer, path_len: u32) => [wasi.Filestat(u32 * 16), errno]; - case 29: { - const fd = Atomics.load(func_sig_view_u32, 1); - const flags = Atomics.load(func_sig_view_u32, 2); - const path_ptr = Atomics.load(func_sig_view_u32, 3); - const path_len = Atomics.load(func_sig_view_u32, 4); - - const path = new Uint8Array( - this.allocator.get_memory(path_ptr, path_len), - ); - const path_str = new TextDecoder().decode(path); - this.allocator.free(path_ptr, path_len); - - const [filestat, ret] = this.path_filestat_get(fd, flags, path_str); - - if (filestat) { - Atomics.store(func_sig_view_u64, 0, filestat.dev); - Atomics.store(func_sig_view_u64, 1, filestat.ino); - Atomics.store(func_sig_view_u8, 16, filestat.filetype); - Atomics.store(func_sig_view_u64, 3, filestat.nlink); - Atomics.store(func_sig_view_u64, 4, filestat.size); - Atomics.store(func_sig_view_u64, 5, filestat.atim); - Atomics.store(func_sig_view_u64, 6, filestat.mtim); - Atomics.store(func_sig_view_u64, 7, filestat.ctim); - } - set_error(ret); - break; - } - // path_filestat_set_times: (fd: u32, flags: u32, path_ptr: pointer, path_len: u32, atim: u64, mtim: u64, fst_flags: u16) => errno; - case 30: { - const fd = Atomics.load(func_sig_view_u32, 1); - const flags = Atomics.load(func_sig_view_u32, 2); - const path_ptr = Atomics.load(func_sig_view_u32, 3); - const path_len = Atomics.load(func_sig_view_u32, 4); - const atim = Atomics.load(func_sig_view_u64, 3); - const mtim = Atomics.load(func_sig_view_u64, 4); - const fst_flags = Atomics.load(func_sig_view_u16, 12); - - const path = new Uint8Array( - this.allocator.get_memory(path_ptr, path_len), - ); - const path_str = new TextDecoder().decode(path); - this.allocator.free(path_ptr, path_len); - - const error = this.path_filestat_set_times( - fd, - flags, - path_str, - atim, - mtim, - fst_flags, - ); + set_error(error); + break; + } + // path_filestat_get: (fd: u32, flags: u32, path_ptr: pointer, path_len: u32) => [wasi.Filestat(u32 * 16), errno]; + case 29: { + const fd = Atomics.load(func_sig_view_u32, 1); + const flags = Atomics.load(func_sig_view_u32, 2); + const path_ptr = Atomics.load(func_sig_view_u32, 3); + const path_len = Atomics.load(func_sig_view_u32, 4); + + const path = new Uint8Array( + this.allocator.get_memory(path_ptr, path_len), + ); + const path_str = new TextDecoder().decode(path); + this.allocator.free(path_ptr, path_len); + + const [filestat, ret] = this.path_filestat_get(fd, flags, path_str); + + if (filestat) { + Atomics.store(func_sig_view_u64, 0, filestat.dev); + Atomics.store(func_sig_view_u64, 1, filestat.ino); + Atomics.store(func_sig_view_u8, 16, filestat.filetype); + Atomics.store(func_sig_view_u64, 3, filestat.nlink); + Atomics.store(func_sig_view_u64, 4, filestat.size); + Atomics.store(func_sig_view_u64, 5, filestat.atim); + Atomics.store(func_sig_view_u64, 6, filestat.mtim); + Atomics.store(func_sig_view_u64, 7, filestat.ctim); + } + set_error(ret); + break; + } + // path_filestat_set_times: (fd: u32, flags: u32, path_ptr: pointer, path_len: u32, atim: u64, mtim: u64, fst_flags: u16) => errno; + case 30: { + const fd = Atomics.load(func_sig_view_u32, 1); + const flags = Atomics.load(func_sig_view_u32, 2); + const path_ptr = Atomics.load(func_sig_view_u32, 3); + const path_len = Atomics.load(func_sig_view_u32, 4); + const atim = Atomics.load(func_sig_view_u64, 3); + const mtim = Atomics.load(func_sig_view_u64, 4); + const fst_flags = Atomics.load(func_sig_view_u16, 12); + + const path = new Uint8Array( + this.allocator.get_memory(path_ptr, path_len), + ); + const path_str = new TextDecoder().decode(path); + this.allocator.free(path_ptr, path_len); + + const error = this.path_filestat_set_times( + fd, + flags, + path_str, + atim, + mtim, + fst_flags, + ); - set_error(error); - break; - } - // path_link: (old_fd: u32, old_flags: u32, old_path_ptr: pointer, old_path_len: u32, new_fd: u32, new_path_ptr: pointer, new_path_len: u32) => errno; - case 31: { - const old_fd = Atomics.load(func_sig_view_u32, 1); - const old_flags = Atomics.load(func_sig_view_u32, 2); - const old_path_ptr = Atomics.load(func_sig_view_u32, 3); - const old_path_len = Atomics.load(func_sig_view_u32, 4); - const new_fd = Atomics.load(func_sig_view_u32, 5); - const new_path_ptr = Atomics.load(func_sig_view_u32, 6); - const new_path_len = Atomics.load(func_sig_view_u32, 7); - - const old_path = new Uint8Array( - this.allocator.get_memory(old_path_ptr, old_path_len), - ); - const old_path_str = new TextDecoder().decode(old_path); - this.allocator.free(old_path_ptr, old_path_len); - const new_path = new Uint8Array( - this.allocator.get_memory(new_path_ptr, new_path_len), - ); - const new_path_str = new TextDecoder().decode(new_path); - this.allocator.free(new_path_ptr, new_path_len); - - const error = this.path_link( - old_fd, - old_flags, - old_path_str, - new_fd, - new_path_str, - ); + set_error(error); + break; + } + // path_link: (old_fd: u32, old_flags: u32, old_path_ptr: pointer, old_path_len: u32, new_fd: u32, new_path_ptr: pointer, new_path_len: u32) => errno; + case 31: { + const old_fd = Atomics.load(func_sig_view_u32, 1); + const old_flags = Atomics.load(func_sig_view_u32, 2); + const old_path_ptr = Atomics.load(func_sig_view_u32, 3); + const old_path_len = Atomics.load(func_sig_view_u32, 4); + const new_fd = Atomics.load(func_sig_view_u32, 5); + const new_path_ptr = Atomics.load(func_sig_view_u32, 6); + const new_path_len = Atomics.load(func_sig_view_u32, 7); + + const old_path = new Uint8Array( + this.allocator.get_memory(old_path_ptr, old_path_len), + ); + const old_path_str = new TextDecoder().decode(old_path); + this.allocator.free(old_path_ptr, old_path_len); + const new_path = new Uint8Array( + this.allocator.get_memory(new_path_ptr, new_path_len), + ); + const new_path_str = new TextDecoder().decode(new_path); + this.allocator.free(new_path_ptr, new_path_len); + + const error = this.path_link( + old_fd, + old_flags, + old_path_str, + new_fd, + new_path_str, + ); - set_error(error); - break; - } - // path_open: (fd: u32, dirflags: u32, path_ptr: pointer, path_len: u32, oflags: u32, fs_rights_base: u64, fs_rights_inheriting: u64, fdflags: u16) => [u32, errno]; - case 32: { - const fd = Atomics.load(func_sig_view_u32, 1); - const dirflags = Atomics.load(func_sig_view_u32, 2); - const path_ptr = Atomics.load(func_sig_view_u32, 3); - const path_len = Atomics.load(func_sig_view_u32, 4); - const oflags = Atomics.load(func_sig_view_u32, 5); - const fs_rights_base = Atomics.load(func_sig_view_u64, 3); - const fs_rights_inheriting = Atomics.load(func_sig_view_u64, 4); - const fd_flags = Atomics.load(func_sig_view_u16, 20); - - const path = new Uint8Array( - this.allocator.get_memory(path_ptr, path_len), - ); - const path_str = new TextDecoder().decode(path); - this.allocator.free(path_ptr, path_len); - - const [opened_fd, error] = await this.path_open( - fd, - dirflags, - path_str, - oflags, - fs_rights_base, - fs_rights_inheriting, - fd_flags, - ); + set_error(error); + break; + } + // path_open: (fd: u32, dirflags: u32, path_ptr: pointer, path_len: u32, oflags: u32, fs_rights_base: u64, fs_rights_inheriting: u64, fdflags: u16) => [u32, errno]; + case 32: { + const fd = Atomics.load(func_sig_view_u32, 1); + const dirflags = Atomics.load(func_sig_view_u32, 2); + const path_ptr = Atomics.load(func_sig_view_u32, 3); + const path_len = Atomics.load(func_sig_view_u32, 4); + const oflags = Atomics.load(func_sig_view_u32, 5); + const fs_rights_base = Atomics.load(func_sig_view_u64, 3); + const fs_rights_inheriting = Atomics.load(func_sig_view_u64, 4); + const fd_flags = Atomics.load(func_sig_view_u16, 20); + + const path = new Uint8Array( + this.allocator.get_memory(path_ptr, path_len), + ); + const path_str = new TextDecoder().decode(path); + this.allocator.free(path_ptr, path_len); + + const [opened_fd, error] = await this.path_open( + fd, + dirflags, + path_str, + oflags, + fs_rights_base, + fs_rights_inheriting, + fd_flags, + ); - // console.log("path_open: opend_fd", opened_fd, error); + // console.log("path_open: opend_fd", opened_fd, error); - if (opened_fd !== undefined) { - Atomics.store(func_sig_view_u32, 0, opened_fd); - } - set_error(error); - break; + if (opened_fd !== undefined) { + Atomics.store(func_sig_view_u32, 0, opened_fd); } - // path_readlink: (fd: u32, path_ptr: pointer, path_len: u32, buf_len: u32) => [buf_len: u32, data_ptr: pointer, data_len: u32, errno]; - case 33: { - const fd = Atomics.load(func_sig_view_u32, 1); - const path_ptr = Atomics.load(func_sig_view_u32, 2); - const path_len = Atomics.load(func_sig_view_u32, 3); - const buf_len = Atomics.load(func_sig_view_u32, 4); - - const path = new Uint8Array( - this.allocator.get_memory(path_ptr, path_len), - ); - const path_str = new TextDecoder().decode(path); - this.allocator.free(path_ptr, path_len); - - const [buf, error] = this.path_readlink(fd, path_str, buf_len); - - if (buf) { - await this.allocator.async_write( - buf, - this.fd_func_sig, - fd * fd_func_sig_u32_size + 1, - ); - Atomics.store(func_sig_view_u32, 0, buf.byteLength); - } - set_error(error); - break; - } - // path_remove_directory: (fd: u32, path_ptr: pointer, path_len: u32) => errno; - case 34: { - const fd = Atomics.load(func_sig_view_u32, 1); - const path_ptr = Atomics.load(func_sig_view_u32, 2); - const path_len = Atomics.load(func_sig_view_u32, 3); - - const path = new Uint8Array( - this.allocator.get_memory(path_ptr, path_len), - ); - const path_str = new TextDecoder().decode(path); - this.allocator.free(path_ptr, path_len); + set_error(error); + break; + } + // path_readlink: (fd: u32, path_ptr: pointer, path_len: u32, buf_len: u32) => [buf_len: u32, data_ptr: pointer, data_len: u32, errno]; + case 33: { + const fd = Atomics.load(func_sig_view_u32, 1); + const path_ptr = Atomics.load(func_sig_view_u32, 2); + const path_len = Atomics.load(func_sig_view_u32, 3); + const buf_len = Atomics.load(func_sig_view_u32, 4); + + const path = new Uint8Array( + this.allocator.get_memory(path_ptr, path_len), + ); + const path_str = new TextDecoder().decode(path); + this.allocator.free(path_ptr, path_len); - const error = this.path_remove_directory(fd, path_str); + const [buf, error] = this.path_readlink(fd, path_str, buf_len); - set_error(error); - break; - } - // path_rename: (old_fd: u32, old_path_ptr: pointer, old_path_len: u32, new_fd: u32, new_path_ptr: pointer, new_path_len: u32) => errno; - case 35: { - const fd = Atomics.load(func_sig_view_u32, 1); - const old_path_ptr = Atomics.load(func_sig_view_u32, 2); - const old_path_len = Atomics.load(func_sig_view_u32, 3); - const new_fd = Atomics.load(func_sig_view_u32, 4); - const new_path_ptr = Atomics.load(func_sig_view_u32, 5); - const new_path_len = Atomics.load(func_sig_view_u32, 6); - - const old_path = new Uint8Array( - this.allocator.get_memory(old_path_ptr, old_path_len), - ); - const old_path_str = new TextDecoder().decode(old_path); - this.allocator.free(old_path_ptr, old_path_len); - const new_path = new Uint8Array( - this.allocator.get_memory(new_path_ptr, new_path_len), + if (buf) { + await this.allocator.async_write( + buf, + this.fd_func_sig, + fd * fd_func_sig_u32_size + 1, ); - const new_path_str = new TextDecoder().decode(new_path); - this.allocator.free(new_path_ptr, new_path_len); - - const error = this.path_rename( - fd, - old_path_str, - new_fd, - new_path_str, - ); - - set_error(error); - break; + Atomics.store(func_sig_view_u32, 0, buf.byteLength); } - // path_symlink: (old_path_ptr: pointer, old_path_len: u32, fd: u32, new_path_ptr: pointer, new_path_len: u32) => errno; - case 36: { - const old_path_ptr = Atomics.load(func_sig_view_u32, 1); - const old_path_len = Atomics.load(func_sig_view_u32, 2); - const fd = Atomics.load(func_sig_view_u32, 3); - const new_path_ptr = Atomics.load(func_sig_view_u32, 4); - const new_path_len = Atomics.load(func_sig_view_u32, 5); - - const old_path = new Uint8Array( - this.allocator.get_memory(old_path_ptr, old_path_len), - ); - const old_path_str = new TextDecoder().decode(old_path); - this.allocator.free(old_path_ptr, old_path_len); - const new_path = new Uint8Array( - this.allocator.get_memory(new_path_ptr, new_path_len), - ); - const new_path_str = new TextDecoder().decode(new_path); - this.allocator.free(new_path_ptr, new_path_len); + set_error(error); + break; + } + // path_remove_directory: (fd: u32, path_ptr: pointer, path_len: u32) => errno; + case 34: { + const fd = Atomics.load(func_sig_view_u32, 1); + const path_ptr = Atomics.load(func_sig_view_u32, 2); + const path_len = Atomics.load(func_sig_view_u32, 3); + + const path = new Uint8Array( + this.allocator.get_memory(path_ptr, path_len), + ); + const path_str = new TextDecoder().decode(path); + this.allocator.free(path_ptr, path_len); - set_error(this.path_symlink(old_path_str, fd, new_path_str)); - break; - } - // path_unlink_file: (fd: u32, path_ptr: pointer, path_len: u32) => errno; - case 37: { - const fd = Atomics.load(func_sig_view_u32, 1); - const path_ptr = Atomics.load(func_sig_view_u32, 2); - const path_len = Atomics.load(func_sig_view_u32, 3); - - const path = new Uint8Array( - this.allocator.get_memory(path_ptr, path_len), - ); - const path_str = new TextDecoder().decode(path); - this.allocator.free(path_ptr, path_len); + const error = this.path_remove_directory(fd, path_str); - set_error(this.path_unlink_file(fd, path_str)); - break; - } - default: { - throw new Error(`Unknown function number: ${func_number}`); - } + set_error(error); + break; } - - const old_call_lock = Atomics.exchange(lock_view, 1, 0); - if (old_call_lock !== 1) { - throw new Error( - `Call is already set: ${old_call_lock}\nfunc: ${get_func_name_from_number(func_number)}\nfd: ${fd_n}`, + // path_rename: (old_fd: u32, old_path_ptr: pointer, old_path_len: u32, new_fd: u32, new_path_ptr: pointer, new_path_len: u32) => errno; + case 35: { + const fd = Atomics.load(func_sig_view_u32, 1); + const old_path_ptr = Atomics.load(func_sig_view_u32, 2); + const old_path_len = Atomics.load(func_sig_view_u32, 3); + const new_fd = Atomics.load(func_sig_view_u32, 4); + const new_path_ptr = Atomics.load(func_sig_view_u32, 5); + const new_path_len = Atomics.load(func_sig_view_u32, 6); + + const old_path = new Uint8Array( + this.allocator.get_memory(old_path_ptr, old_path_len), + ); + const old_path_str = new TextDecoder().decode(old_path); + this.allocator.free(old_path_ptr, old_path_len); + const new_path = new Uint8Array( + this.allocator.get_memory(new_path_ptr, new_path_len), + ); + const new_path_str = new TextDecoder().decode(new_path); + this.allocator.free(new_path_ptr, new_path_len); + + const error = this.path_rename( + fd, + old_path_str, + new_fd, + new_path_str, ); - } - // console.log("called end: func: ", get_func_name_from_number(func_number), "fd: ", fd_n); + set_error(error); + break; + } + // path_symlink: (old_path_ptr: pointer, old_path_len: u32, fd: u32, new_path_ptr: pointer, new_path_len: u32) => errno; + case 36: { + const old_path_ptr = Atomics.load(func_sig_view_u32, 1); + const old_path_len = Atomics.load(func_sig_view_u32, 2); + const fd = Atomics.load(func_sig_view_u32, 3); + const new_path_ptr = Atomics.load(func_sig_view_u32, 4); + const new_path_len = Atomics.load(func_sig_view_u32, 5); + + const old_path = new Uint8Array( + this.allocator.get_memory(old_path_ptr, old_path_len), + ); + const old_path_str = new TextDecoder().decode(old_path); + this.allocator.free(old_path_ptr, old_path_len); + const new_path = new Uint8Array( + this.allocator.get_memory(new_path_ptr, new_path_len), + ); + const new_path_str = new TextDecoder().decode(new_path); + this.allocator.free(new_path_ptr, new_path_len); - const n = Atomics.notify(lock_view, 1); - if (n !== 1) { - if (n === 0) { - console.warn("notify number is 0. ref is late?"); - } else { - console.warn(`notify number is not 1: ${n}`); - } + set_error(this.path_symlink(old_path_str, fd, new_path_str)); + break; } + // path_unlink_file: (fd: u32, path_ptr: pointer, path_len: u32) => errno; + case 37: { + const fd = Atomics.load(func_sig_view_u32, 1); + const path_ptr = Atomics.load(func_sig_view_u32, 2); + const path_len = Atomics.load(func_sig_view_u32, 3); + + const path = new Uint8Array( + this.allocator.get_memory(path_ptr, path_len), + ); + const path_str = new TextDecoder().decode(path); + this.allocator.free(path_ptr, path_len); - if (this.fds[fd_n] === undefined) { + set_error(this.path_unlink_file(fd, path_str)); break; } - } catch (e) { - console.error(e); + default: { + throw new Error(`Unknown function number: ${func_number}`); + } + } - // sleep 1000ms - await new Promise((resolve) => setTimeout(resolve, 1000)); + Atomics.store(lock_view, 1, 1); + Atomics.store(lock_view, 2, 0); + const n = Atomics.notify(lock_view, 2); + if (n !== 1) { + if (n === 0) { + console.warn("notify number is 0. ref is late?"); + } else { + console.warn(`notify number is not 1: ${n}`); + } + } - const lock_view = new Int32Array(this.lock_fds); - Atomics.exchange(lock_view, 1, 0); - const func_sig_view = new Int32Array(this.fd_func_sig); - Atomics.exchange(func_sig_view, 16, -1); + if (this.fds[fd_n] === undefined) { + break; } } } diff --git a/threads/src/shared_array_buffer/ref.ts b/threads/src/shared_array_buffer/ref.ts index 08b5ce7..18eff76 100644 --- a/threads/src/shared_array_buffer/ref.ts +++ b/threads/src/shared_array_buffer/ref.ts @@ -1,14 +1,15 @@ import { wasi } from "@bjorn3/browser_wasi_shim"; -import { WASIFarmRef, type WASIFarmRefObject } from "../ref.js"; +import { gen_wasi_filestat } from "../patch.ts"; +import { WASIFarmRef, type WASIFarmRefObject } from "../ref.ts"; import { AllocatorUseArrayBuffer, type AllocatorUseArrayBufferObject, -} from "./allocator.js"; +} from "./allocator.ts"; import { FdCloseSenderUseArrayBuffer, type FdCloseSenderUseArrayBufferObject, -} from "./fd_close_sender.js"; -import { fd_func_sig_bytes, fd_func_sig_u32_size } from "./park.js"; +} from "./fd_close_sender.ts"; +import { fd_func_sig_bytes, fd_func_sig_u32_size } from "./park.ts"; export type WASIFarmRefUseArrayBufferObject = { allocator: AllocatorUseArrayBuffer; @@ -88,9 +89,17 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { return id; } + private base_func_locker(): Int32Array { + return new Int32Array(this.base_func_util); + } + + private base_func_park_locker(): Int32Array { + return new Int32Array(this.base_func_util, 12); + } + // lock base_func private lock_base_func(): void { - const view = new Int32Array(this.base_func_util); + const view = this.base_func_locker(); // eslint-disable-next-line no-constant-condition while (true) { const lock = Atomics.wait(view, 0, 1); @@ -98,27 +107,24 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { throw new Error("timed-out lock"); } const old = Atomics.compareExchange(view, 0, 0, 1); - if (old !== 0) { - continue; + if (old === 0) { + break; } - break; } } // call base_func private call_base_func(): void { - const view = new Int32Array(this.base_func_util); - const old = Atomics.exchange(view, 1, 1); - if (old !== 0) { - console.error("what happened?"); - } + const view = this.base_func_locker(); + Atomics.store(view, 2, 1); + Atomics.store(view, 1, 0); Atomics.notify(view, 1, 1); } // wait base_func private wait_base_func(): void { - const view = new Int32Array(this.base_func_util); - const lock = Atomics.wait(view, 1, 1); + const view = this.base_func_locker(); + const lock = Atomics.wait(view, 2, 1); if (lock === "timed-out") { throw new Error("timed-out lock"); } @@ -126,7 +132,7 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { // release base_func private release_base_func(): void { - const view = new Int32Array(this.base_func_util); + const view = this.base_func_locker(); Atomics.store(view, 0, 0); Atomics.notify(view, 0, 1); } @@ -134,19 +140,20 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { // set park_fds_map set_park_fds_map(fds: Array): void { this.lock_base_func(); - const view = new Int32Array(this.base_func_util); - Atomics.store(view, 2, 0); + const view = this.base_func_park_locker(); + Atomics.store(view, 0, 0); const fds_array = new Uint32Array(fds); // console.log("fds_array", fds_array); - this.allocator.block_write(fds_array, this.base_func_util, 3); - Atomics.store(view, 5, this.id); + this.allocator.block_write(fds_array, this.base_func_util, 1 + 3); + Atomics.store(view, 3, this.id); this.call_base_func(); this.wait_base_func(); this.release_base_func(); } + key: number = Math.round(Math.random() * 100); + private lock_fd(fd: number) { - // console.log("lock_fd start", fd); const view = new Int32Array(this.lock_fds, fd * 12); // eslint-disable-next-line no-constant-condition while (true) { @@ -160,7 +167,6 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { } const old = Atomics.compareExchange(view, 0, 0, 1); if (old === 0) { - // console.log("lock_fd success", fd); return; } } @@ -169,7 +175,10 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { private release_fd(fd: number) { // console.log("release_fd", fd); const view = new Int32Array(this.lock_fds, fd * 12); - Atomics.store(view, 0, 0); + const before = Atomics.exchange(view, 0, 0); + if (before !== 1) { + console.error("what happened? before", before); + } Atomics.notify(view, 0, 1); } @@ -232,39 +241,32 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { if (fd === undefined) { return false; } - // console.log("invoke_fd_func", fd); - const view = new Int32Array(this.lock_fds, fd * 12 + 4); - const old = Atomics.exchange(view, 0, 1); - if (old === 1) { - console.error(`invoke_fd_func already invoked\nfd: ${fd}`); - return false; + const view = new Int32Array(this.lock_fds, fd * 12); + Atomics.store(view, 2, 1); + Atomics.store(view, 1, 0); + const n = Atomics.notify(view, 1); + if (n === 1) { + return true; } - const n = Atomics.notify(view, 0); - if (n !== 1) { - if (n === 0) { - const len = this.get_fds_len(); - if (len <= fd) { - const lock = Atomics.exchange(view, 0, 0); - if (lock !== 1) { - console.error("what happened?"); - } - Atomics.notify(view, 0, 1); - console.error("what happened?: len", len, "fd", fd); - return true; - } - console.warn("invoke_func_loop is late"); - return true; + if (n === 0) { + const len = this.get_fds_len(); + if (len <= fd) { + console.error("invoke_fd_func notify len failed:", n); + Atomics.store(view, 2, 0); + Atomics.store(view, 1, 1); + return false; } - console.error("invoke_fd_func notify failed:", n); - return false; + console.warn("invoke_func_loop is late"); + return true; } - return true; + console.error("invoke_fd_func notify too:", n); + return false; } private wait_fd_func(fd: number) { // console.log("wait_fd_func", fd); - const view = new Int32Array(this.lock_fds, fd * 12 + 4); - const value = Atomics.wait(view, 0, 1); + const view = new Int32Array(this.lock_fds, fd * 12); + const value = Atomics.wait(view, 2, 1); if (value === "timed-out") { console.error("wait call park_fd_func timed-out"); } @@ -276,8 +278,7 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { } // console.log("call_fd_func", fd); this.wait_fd_func(fd); - // console.log("wait_fd_func", fd); - // console.log("call_fd_func released", fd); + // console.log("### call_fd_func released", fd); return true; } @@ -521,12 +522,23 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { this.release_fd(fd); - const file_stat = new wasi.Filestat(fs_ino, fs_filetype, fs_size); - file_stat.dev = fs_dev; - file_stat.nlink = fs_nlink; - file_stat.atim = fs_atim; - file_stat.mtim = fs_mtim; - file_stat.ctim = fs_ctim; + // const file_stat = new wasi.Filestat(fs_ino, fs_filetype, fs_size); + // file_stat.dev = fs_dev; + // file_stat.nlink = fs_nlink; + // file_stat.atim = fs_atim; + // file_stat.mtim = fs_mtim; + // file_stat.ctim = fs_ctim; + + const file_stat = gen_wasi_filestat( + fs_dev, + fs_ino, + fs_filetype, + fs_nlink, + fs_size, + fs_atim, + fs_mtim, + fs_ctim, + ); return [file_stat, error]; } @@ -1091,12 +1103,23 @@ export class WASIFarmRefUseArrayBuffer extends WASIFarmRef { this.release_fd(fd); - const file_stat = new wasi.Filestat(fs_ino, fs_filetype, fs_size); - file_stat.dev = fs_dev; - file_stat.nlink = fs_nlink; - file_stat.atim = fs_atim; - file_stat.mtim = fs_mtim; - file_stat.ctim = fs_ctim; + // const file_stat = new wasi.Filestat(fs_ino, fs_filetype, fs_size); + // file_stat.dev = fs_dev; + // file_stat.nlink = fs_nlink; + // file_stat.atim = fs_atim; + // file_stat.mtim = fs_mtim; + // file_stat.ctim = fs_ctim; + + const file_stat = gen_wasi_filestat( + fs_dev, + fs_ino, + fs_filetype, + fs_nlink, + fs_size, + fs_atim, + fs_mtim, + fs_ctim, + ); return [file_stat, error]; } diff --git a/threads/src/shared_array_buffer/thread_spawn.ts b/threads/src/shared_array_buffer/thread_spawn.ts index 76231b3..563c0d2 100644 --- a/threads/src/shared_array_buffer/thread_spawn.ts +++ b/threads/src/shared_array_buffer/thread_spawn.ts @@ -14,17 +14,20 @@ // (import "wasi" "thread-spawn" (func $fimport$27 (param i32) (result i32))) -import { WASIFarmAnimal } from "../animals.js"; -import type { WASIFarmRefObject } from "../ref.js"; -import type { WorkerBackgroundRefObject } from "./worker_background/index.js"; +import { WASIProcExit } from "@bjorn3/browser_wasi_shim"; +import { WASIFarmAnimal } from "../animals.ts"; +import type { WASIFarmRefObject } from "../ref.ts"; +import type { WorkerBackgroundRefObject } from "./worker_background/index.ts"; import { WorkerBackgroundRef, - worker_background_worker_url, -} from "./worker_background/index.js"; -import { WorkerBackgroundRefObjectConstructor } from "./worker_background/worker_export.js"; + gen_worker_background_worker_url, +} from "./worker_background/index.ts"; +import { WorkerBackgroundRefObjectConstructor } from "./worker_background/worker_export.ts"; type ThreadSpawnerObject = { - share_memory: WebAssembly.Memory; + share_memory: { + [key: string]: WebAssembly.Memory; + }; wasi_farm_refs_object: Array; worker_url: string; worker_background_ref_object: WorkerBackgroundRefObject; @@ -32,7 +35,9 @@ type ThreadSpawnerObject = { }; export class ThreadSpawner { - private share_memory: WebAssembly.Memory; + private share_memory: { + [key: string]: WebAssembly.Memory; + }; private wasi_farm_refs_object: Array; private worker_url: string; private worker_background_ref: WorkerBackgroundRef; @@ -48,50 +53,56 @@ export class ThreadSpawner { constructor( worker_url: string, wasi_farm_refs_object: Array, - share_memory?: WebAssembly.Memory, + share_memory?: { + [key: string]: WebAssembly.Memory; + }, // 16MB for the time being. // https://users.rust-lang.org/t/what-is-the-size-limit-of-threads-stack-in-rust/11867/3 MIN_STACK = 16777216, worker_background_ref_object?: WorkerBackgroundRefObject, thread_spawn_wasm?: WebAssembly.Module, // inst_default_buffer_kept?: WebAssembly.Memory, + worker_background_worker_url?: string, ) { this.worker_url = worker_url; this.wasi_farm_refs_object = wasi_farm_refs_object; - const min_initial_size = 1048576 / 65536; // Rust's default stack size is 1MB. - const initial_size = MIN_STACK / 65536; - if (initial_size < min_initial_size) { - throw new Error( - `The stack size must be at least ${min_initial_size} bytes.`, - ); - } - const max_memory = 1073741824 / 65536; // Rust's default maximum memory size is 1GB. - - // this.inst_default_buffer_kept = - // inst_default_buffer_kept || - // new WebAssembly.Memory({ - // initial: 1, - // maximum: max_memory, - // shared: true, - // }); - - this.share_memory = - share_memory || + if (share_memory === undefined) { + const min_initial_size = 1048576 / 65536; // Rust's default stack size is 1MB. + const initial_size = MIN_STACK / 65536; + if (initial_size < min_initial_size) { + throw new Error( + `The stack size must be at least ${min_initial_size} bytes.`, + ); + } + const max_memory = 1073741824 / 65536; // Rust's default maximum memory size is 1GB. + // WebAssembly.Memory's 1 page is 65536 bytes. - new WebAssembly.Memory({ - initial: initial_size, - maximum: max_memory, - shared: true, - }); + this.share_memory = { + memory: new WebAssembly.Memory({ + initial: initial_size, + maximum: max_memory, + shared: true, + }), + }; + } else { + this.share_memory = share_memory; + } if (worker_background_ref_object === undefined) { - const worker_background_worker_url__ = worker_background_worker_url(); + let worker_background_worker_url__: string; + if (worker_background_worker_url) { + worker_background_worker_url__ = worker_background_worker_url; + } else { + worker_background_worker_url__ = gen_worker_background_worker_url(); + } this.worker_background_worker = new Worker( worker_background_worker_url__, { type: "module" }, ); - URL.revokeObjectURL(worker_background_worker_url__); + if (!worker_background_worker_url) { + URL.revokeObjectURL(worker_background_worker_url__); + } const { promise, resolve } = Promise.withResolvers(); this.worker_background_worker_promise = promise; this.worker_background_worker.onmessage = () => { @@ -108,7 +119,9 @@ export class ThreadSpawner { sl_object: this.get_object(), thread_spawn_wasm, }, - worker_background_ref_object: this.worker_background_ref_object, + worker_background_ref_object: structuredClone( + this.worker_background_ref_object, + ), }); } else { this.worker_background_ref_object = worker_background_ref_object; @@ -121,9 +134,7 @@ export class ThreadSpawner { // This cannot blocking. async wait_worker_background_worker(): Promise { if (this.worker_background_worker_promise) { - const promise = this.worker_background_worker_promise; - - await promise; + await this.worker_background_worker_promise; return; } @@ -240,7 +251,9 @@ export class ThreadSpawner { return thread_spawner; } - get_share_memory(): WebAssembly.Memory { + get_share_memory(): { + [key: string]: WebAssembly.Memory; + } { return this.share_memory; } @@ -275,20 +288,41 @@ export class ThreadSpawner { } } -// send fd_map is not implemented yet. -// issue: the fd passed to the child process is different from the parent process. -export const thread_spawn_on_worker = async (msg: { - this_is_thread_spawn: boolean; - worker_id?: number; - start_arg: number; - worker_background_ref: WorkerBackgroundRefObject; - sl_object: ThreadSpawnerObject; - thread_spawn_wasm: WebAssembly.Module; - args: Array; - env: Array; - fd_map: [number, number][]; - this_is_start?: boolean; -}): Promise => { +/** send fd_map is not implemented yet. +issue: the fd passed to the child process is different from the parent process. +@param instantiate - WebAssembly.instantiate or custom instantiate function +*/ +export const thread_spawn_on_worker = async ( + msg: { + this_is_thread_spawn: boolean; + worker_id?: number; + start_arg: number; + worker_background_ref: WorkerBackgroundRefObject; + sl_object: ThreadSpawnerObject; + thread_spawn_wasm: WebAssembly.Module; + args: Array; + env: Array; + fd_map: [number, number][]; + this_is_start?: boolean; + }, + instantiate: ( + thread_spawn_wasm: WebAssembly.Module, + imports: { + env: { + [key: string]: WebAssembly.Memory; + }; + wasi: { + "thread-spawn": (start_arg: number) => number; + }; + wasi_snapshot_preview1: { + // biome-ignore lint/suspicious/noExplicitAny: + [key: string]: (...args: any[]) => unknown; + }; + }, + ) => Promise = WebAssembly.instantiate.bind( + WebAssembly, + ), +): Promise => { if (msg.this_is_thread_spawn) { const { sl_object, @@ -335,16 +369,16 @@ export const thread_spawn_on_worker = async (msg: { thread_spawner, ); - const inst = await WebAssembly.instantiate(thread_spawn_wasm, { + const inst = await instantiate(thread_spawn_wasm, { env: { - memory: wasi.get_share_memory(), + ...wasi.get_share_memory(), }, wasi: wasi.wasiThreadImport, wasi_snapshot_preview1: wasi.wasiImport, }); try { - wasi.start( + wasi.start_only( inst as unknown as { exports: { memory: WebAssembly.Memory; @@ -353,11 +387,7 @@ export const thread_spawn_on_worker = async (msg: { }, ); } catch (e) { - globalThis.postMessage({ - msg: "error", - error: e, - }); - + check_error(e, "main"); return wasi; } @@ -370,7 +400,7 @@ export const thread_spawn_on_worker = async (msg: { const { worker_id: thread_id, start_arg } = msg; - console.log(`thread_spawn worker ${thread_id} start`); + console.debug(`thread_spawn worker ${thread_id} start`); const wasi = new WASIFarmAnimal( sl_object.wasi_farm_refs_object, @@ -385,9 +415,9 @@ export const thread_spawn_on_worker = async (msg: { thread_spawner, ); - const inst = await WebAssembly.instantiate(thread_spawn_wasm, { + const inst = await instantiate(thread_spawn_wasm, { env: { - memory: wasi.get_share_memory(), + ...wasi.get_share_memory(), }, wasi: wasi.wasiThreadImport, wasi_snapshot_preview1: wasi.wasiImport, @@ -410,11 +440,8 @@ export const thread_spawn_on_worker = async (msg: { start_arg, ); } catch (e) { - globalThis.postMessage({ - msg: "error", - error: e, - }); - + // biome-ignore lint/style/noNonNullAssertion: + check_error(e, thread_id!); return wasi; } @@ -425,3 +452,48 @@ export const thread_spawn_on_worker = async (msg: { return wasi; } }; + +function check_error(e: unknown, thread_id: number | string): void { + let e_alt: Error | undefined = undefined; + + if (e instanceof WASIProcExit) { + globalThis.postMessage({ + msg: "exit", + code: e.code, + }); + + return; + } + + try { + structuredClone(e); + } catch (error) { + if ( + ( + error as { + name: string; + } + ).name === "DataCloneError" + ) { + e_alt = new Error( + `An error occurred on the thread ${thread_id}, but it cannot be cloned. + Since error propagation does not work properly with this, + stopping cannot be performed. + Therefore, I will insert this error instead. + The error currently confirmed occurs in Firefox, + after executing with invoke on webworker and reaching an unreachable statement. + `, + ); + e_alt.name = "EncounteredUncloneableError"; + e_alt.stack = (e as Error).stack; + } + } + if (e_alt === undefined) { + e_alt = e as Error; + } + + globalThis.postMessage({ + msg: "error", + error: e_alt, + }); +} diff --git a/threads/src/shared_array_buffer/worker_background/index.ts b/threads/src/shared_array_buffer/worker_background/index.ts index eb3e67c..7ca171e 100644 --- a/threads/src/shared_array_buffer/worker_background/index.ts +++ b/threads/src/shared_array_buffer/worker_background/index.ts @@ -1,10 +1,10 @@ -import type { WorkerBackgroundRefObject } from "./worker_export.js"; -import { WorkerBackgroundRef, WorkerRef } from "./worker_background_ref.js"; -import { url as worker_background_worker_url } from "./worker_blob.js"; +import { WorkerBackgroundRef, WorkerRef } from "./worker_background_ref.ts"; +import { url as gen_worker_background_worker_url } from "./worker_blob.ts"; +import type { WorkerBackgroundRefObject } from "./worker_export.ts"; export { WorkerBackgroundRef, WorkerRef, type WorkerBackgroundRefObject, - worker_background_worker_url, + gen_worker_background_worker_url, }; diff --git a/threads/src/shared_array_buffer/worker_background/minify.js b/threads/src/shared_array_buffer/worker_background/minify.js index 9f4435e..b8521f8 100644 --- a/threads/src/shared_array_buffer/worker_background/minify.js +++ b/threads/src/shared_array_buffer/worker_background/minify.js @@ -44,3 +44,13 @@ writeFileSync( wrapper_code, "utf8", ); + +const wrapper_code_js = `export default function() { + ${code} +}`; + +writeFileSync( + "./src/shared_array_buffer/worker_background/worker_background_worker_minify.js", + wrapper_code_js, + "utf8", +); diff --git a/threads/src/shared_array_buffer/worker_background/worker.ts b/threads/src/shared_array_buffer/worker_background/worker.ts index 60e6274..5ceb2be 100644 --- a/threads/src/shared_array_buffer/worker_background/worker.ts +++ b/threads/src/shared_array_buffer/worker_background/worker.ts @@ -1,4 +1,4 @@ -/// +//// // If you create a worker and try to increase the number of threads, // you will have to use Atomics.wait because they need to be synchronized. @@ -6,8 +6,8 @@ // Therefore, a dedicated worker that creates a subworker (worker in worker) is prepared. // The request is made using BroadcastChannel. -import * as Serializer from "../serialize_error.js"; import { AllocatorUseArrayBuffer } from "../allocator.js"; +import * as Serializer from "../serialize_error.js"; import type { WorkerBackgroundRefObject } from "./worker_export.js"; // Note that postMessage, etc. @@ -17,6 +17,8 @@ import type { WorkerBackgroundRefObject } from "./worker_export.js"; class WorkerBackground { private override_object: T; private allocator: AllocatorUseArrayBuffer; + // 0: lock + // 1: call private lock: SharedArrayBuffer; private signature_input: SharedArrayBuffer; @@ -35,7 +37,7 @@ class WorkerBackground { signature_input?: SharedArrayBuffer, ) { this.override_object = override_object; - this.lock = lock ?? new SharedArrayBuffer(20); + this.lock = lock ?? new SharedArrayBuffer(24); this.allocator = allocator ?? new AllocatorUseArrayBuffer(new SharedArrayBuffer(10 * 1024)); @@ -76,126 +78,120 @@ class WorkerBackground { async listen(): Promise { const lock_view = new Int32Array(this.lock); Atomics.store(lock_view, 0, 0); - Atomics.store(lock_view, 1, 0); + Atomics.store(lock_view, 1, 1); const signature_input_view = new Int32Array(this.signature_input); // eslint-disable-next-line no-constant-condition while (true) { - try { - let lock: "not-equal" | "timed-out" | "ok"; - - const { value } = Atomics.waitAsync(lock_view, 1, 0); - if (value instanceof Promise) { - lock = await value; - } else { - lock = value; - } - if (lock === "timed-out") { - throw new Error("timed-out"); - } + const { value } = Atomics.waitAsync(lock_view, 1, 1); + if ((await value) === "timed-out") { + throw new Error("timed-out"); + } - const locked_value = Atomics.load(lock_view, 1); - if (locked_value !== 1) { - throw new Error("locked"); - } + const gen_worker = () => { + const url_ptr = Atomics.load(signature_input_view, 1); + const url_len = Atomics.load(signature_input_view, 2); + const url_buff = this.allocator.get_memory(url_ptr, url_len); + this.allocator.free(url_ptr, url_len); + const url = new TextDecoder().decode(url_buff); + const is_module = Atomics.load(signature_input_view, 3) === 1; + return new Worker(url, { + type: is_module ? "module" : "classic", + }); + }; + + // biome-ignore lint/complexity/noBannedTypes: + const gen_obj = (): Object => { + const json_ptr = Atomics.load(signature_input_view, 4); + const json_len = Atomics.load(signature_input_view, 5); + const json_buff = this.allocator.get_memory(json_ptr, json_len); + this.allocator.free(json_ptr, json_len); + const json = new TextDecoder().decode(json_buff); + // biome-ignore lint/complexity/noBannedTypes: + return JSON.parse(json) as Object; + }; - const gen_worker = () => { - console.log("gen_worker"); - const url_ptr = Atomics.load(signature_input_view, 1); - const url_len = Atomics.load(signature_input_view, 2); - const url_buff = this.allocator.get_memory(url_ptr, url_len); - this.allocator.free(url_ptr, url_len); - const url = new TextDecoder().decode(url_buff); - const is_module = Atomics.load(signature_input_view, 3) === 1; - return new Worker(url, { - type: is_module ? "module" : "classic", - }); - }; + const signature_input = Atomics.load(signature_input_view, 0); - // biome-ignore lint/complexity/noBannedTypes: - const gen_obj = (): Object => { - console.log("gen_obj"); - const json_ptr = Atomics.load(signature_input_view, 4); - const json_len = Atomics.load(signature_input_view, 5); - const json_buff = this.allocator.get_memory(json_ptr, json_len); - this.allocator.free(json_ptr, json_len); - const json = new TextDecoder().decode(json_buff); - // biome-ignore lint/complexity/noBannedTypes: - return JSON.parse(json) as Object; - }; + switch (signature_input) { + // create new worker + case 1: { + const worker = gen_worker(); + const obj = gen_obj(); - const signature_input = Atomics.load(signature_input_view, 0); - switch (signature_input) { - // create new worker - case 1: { - const worker = gen_worker(); - const obj = gen_obj(); + const worker_id = this.assign_worker_id(); - const worker_id = this.assign_worker_id(); + console.debug(`new worker ${worker_id}`); - console.log(`new worker ${worker_id}`); + this.workers[worker_id] = worker; - this.workers[worker_id] = worker; + const { promise, resolve } = Promise.withResolvers(); - const { promise, resolve } = Promise.withResolvers(); + worker.onmessage = async (e) => { + const { msg } = e.data; - worker.onmessage = async (e) => { - const { msg } = e.data; + if (msg === "ready") { + resolve(); + } - if (msg === "ready") { - resolve(); - } + if (msg === "done") { + // biome-ignore lint/style/noNonNullAssertion: + this.workers[worker_id]!.terminate(); + this.workers[worker_id] = undefined; - if (msg === "done") { - // biome-ignore lint/style/noNonNullAssertion: - this.workers[worker_id]!.terminate(); - this.workers[worker_id] = undefined; + console.debug(`worker ${worker_id} done so terminate`); + } - console.log(`worker ${worker_id} done so terminate`); - } + if (msg === "error" || msg === "exit") { + // biome-ignore lint/style/noNonNullAssertion: + this.workers[worker_id]!.terminate(); + this.workers[worker_id] = undefined; - if (msg === "error") { - // biome-ignore lint/style/noNonNullAssertion: - this.workers[worker_id]!.terminate(); - this.workers[worker_id] = undefined; - - let n = 0; - for (const worker of this.workers) { - if (worker !== undefined) { - worker.terminate(); + let n = 0; + for (const worker of this.workers) { + if (worker !== undefined) { + worker.terminate(); + if (msg === "error") { console.warn( `wasi throw error but child process exists, terminate ${n}`, ); + } else { + console.debug( + `wasi exit but child process exists, terminate ${n}`, + ); } - n++; } - if (this.start_worker !== undefined) { - this.start_worker.terminate(); + n++; + } + if (this.start_worker !== undefined) { + this.start_worker.terminate(); + if (msg === "error") { console.warn( "wasi throw error but wasi exists, terminate wasi", ); + } else { + console.debug("wasi exit but wasi exists, terminate wasi"); } + } - this.workers = [undefined]; - this.start_worker = undefined; + this.workers = [undefined]; + this.start_worker = undefined; + const notify_view = new Int32Array(this.lock, 12); + if (msg === "error") { const error = e.data.error; - const notify_view = new Int32Array(this.lock, 8); - const serialized_error = Serializer.serialize(error); const [ptr, len] = await this.allocator.async_write( new TextEncoder().encode(JSON.stringify(serialized_error)), this.lock, - 3, + 4, ); // notify error = code 1 - const old = Atomics.compareExchange(notify_view, 0, 0, 1); - - if (old !== 0) { + if (Atomics.compareExchange(notify_view, 0, 0, 1) !== 0) { console.error("what happened?"); this.allocator.free(ptr, len); @@ -205,85 +201,126 @@ class WorkerBackground { const num = Atomics.notify(notify_view, 0); - if (num === 0) { + if (num !== 1) { console.error(error); this.allocator.free(ptr, len); + Atomics.store(notify_view, 0, 0); + } + } else { + const code = e.data.code; + + // notify exit = code 2 + if (Atomics.compareExchange(notify_view, 0, 0, 2) !== 0) { + console.error("what happened?"); + return; + } + + Atomics.store(notify_view, 1, code); + + const num = Atomics.notify(notify_view, 0); + + if (num === 0) { Atomics.store(notify_view, 0, 0); } } - }; - - worker.postMessage({ - ...this.override_object, - ...obj, - worker_id, - worker_background_ref: this.ref(), - }); - - await promise; - - Atomics.store(signature_input_view, 0, worker_id); - - break; - } - // create start - case 2: { - this.start_worker = gen_worker(); - const obj = gen_obj(); - - this.start_worker.onmessage = async (e) => { - const { msg } = e.data; - - if (msg === "done") { - let n = 0; - for (const worker of this.workers) { - if (worker !== undefined) { - worker.terminate(); - console.warn(`wasi done but worker exists, terminate ${n}`); - } - n++; + } + }; + + worker.postMessage({ + ...this.override_object, + ...obj, + worker_id, + worker_background_ref: this.ref(), + }); + + await promise; + + Atomics.store(signature_input_view, 0, worker_id); + + break; + } + // create start + case 2: { + console.debug("start worker create"); + + this.start_worker = gen_worker(); + const obj = gen_obj(); + + this.start_worker.onmessage = async (e) => { + const { msg } = e.data; + + if (msg === "done") { + let n = 0; + for (const worker of this.workers) { + if (worker !== undefined) { + worker.terminate(); + console.warn(`wasi done but worker exists, terminate ${n}`); } + n++; + } + + // biome-ignore lint/style/noNonNullAssertion: + this.start_worker!.terminate(); + this.start_worker = undefined; - // biome-ignore lint/style/noNonNullAssertion: - this.start_worker!.terminate(); - this.start_worker = undefined; + const notify_view = new Int32Array(this.lock, 12); - console.log("start worker done so terminate"); + // notify done = code 3 + Atomics.store(notify_view, 0, 3); + const num = Atomics.notify(notify_view, 0); + + if (num === 0) { + Atomics.store(notify_view, 0, 0); } - if (msg === "error") { - let n = 0; - for (const worker of this.workers) { - if (worker !== undefined) { - worker.terminate(); + console.debug("start worker done so terminate"); + } + + if (msg === "error" || msg === "exit") { + let n = 0; + for (const worker of this.workers) { + if (worker !== undefined) { + worker.terminate(); + if (msg === "error") { console.warn( `wasi throw error but worker exists, terminate ${n}`, ); + } else { + console.debug( + `wasi exit but worker exists, terminate ${n}`, + ); } - n++; } - if (this.start_worker !== undefined) { - this.start_worker.terminate(); + n++; + } + if (this.start_worker !== undefined) { + this.start_worker.terminate(); + if (msg === "error") { console.warn( "wasi throw error but wasi exists, terminate start worker", ); + } else { + console.debug( + "wasi exit but wasi exists, terminate start worker", + ); } + } - this.workers = [undefined]; - this.start_worker = undefined; + this.workers = [undefined]; + this.start_worker = undefined; + const notify_view = new Int32Array(this.lock, 12); + if (msg === "error") { const error = e.data.error; - const notify_view = new Int32Array(this.lock, 8); - const serialized_error = Serializer.serialize(error); const [ptr, len] = await this.allocator.async_write( new TextEncoder().encode(JSON.stringify(serialized_error)), this.lock, - 3, + 4, ); // notify error = code 1 @@ -300,42 +337,48 @@ class WorkerBackground { const num = Atomics.notify(notify_view, 0); if (num === 0) { - console.error(error); - this.allocator.free(ptr, len); Atomics.store(notify_view, 0, 0); + + throw error; + } + } else { + const code = e.data.code; + + // notify exit = code 2 + const old = Atomics.compareExchange(notify_view, 0, 0, 2); + if (old !== 0) { + console.error("what happened?"); + return; + } + + Atomics.store(notify_view, 1, code); + + const num = Atomics.notify(notify_view, 0); + + if (num === 0) { + Atomics.store(notify_view, 0, 0); } } - }; - - this.start_worker.postMessage({ - ...this.override_object, - ...obj, - worker_background_ref: this.ref(), - }); + } + }; - break; - } - } + this.start_worker.postMessage({ + ...this.override_object, + ...obj, + worker_background_ref: this.ref(), + }); - const old_call_lock = Atomics.exchange(lock_view, 1, 0); - if (old_call_lock !== 1) { - throw new Error("Lock is already set"); + break; } - const num = Atomics.notify(lock_view, 1, 1); - if (num !== 1) { - if (num === 0) { - console.warn("notify failed, waiter is late"); - continue; - } - throw new Error(`notify failed: ${num}`); - } - } catch (e) { - console.error(e); + } - // sleep 1000 - await new Promise((resolve) => setTimeout(resolve, 1000)); + Atomics.store(lock_view, 1, 1); + Atomics.store(lock_view, 2, 0); + const num = Atomics.notify(lock_view, 2, 1); + if (num === 0) { + console.warn("notify failed, waiter is late"); } } } diff --git a/threads/src/shared_array_buffer/worker_background/worker_background_ref.ts b/threads/src/shared_array_buffer/worker_background/worker_background_ref.ts index 17e9924..b89783a 100644 --- a/threads/src/shared_array_buffer/worker_background/worker_background_ref.ts +++ b/threads/src/shared_array_buffer/worker_background/worker_background_ref.ts @@ -1,9 +1,9 @@ -import { AllocatorUseArrayBuffer } from "../allocator.js"; +import { AllocatorUseArrayBuffer } from "../allocator.ts"; +import * as Serializer from "../serialize_error.ts"; import type { WorkerBackgroundRefObject, WorkerOptions, -} from "./worker_export.js"; -import * as Serializer from "../serialize_error.js"; +} from "./worker_export.ts"; export class WorkerBackgroundRef { private allocator: AllocatorUseArrayBuffer; @@ -29,10 +29,9 @@ export class WorkerBackgroundRef { throw new Error("timed-out lock"); } const old = Atomics.compareExchange(view, 0, 0, 1); - if (old !== 0) { - continue; + if (old === 0) { + return; } - break; } } @@ -40,37 +39,28 @@ export class WorkerBackgroundRef { const view = new Int32Array(this.lock); // eslint-disable-next-line no-constant-condition while (true) { - let value: "timed-out" | "not-equal" | "ok"; - const { value: _value } = Atomics.waitAsync(view, 0, 1); - if (_value instanceof Promise) { - value = await _value; - } else { - value = _value; - } - if (value === "timed-out") { + const { value } = Atomics.waitAsync(view, 0, 1); + if ((await value) === "timed-out") { throw new Error("timed-out lock"); } const old = Atomics.compareExchange(view, 0, 0, 1); - if (old !== 0) { - continue; + if (old === 0) { + return; } - break; } } private call_base_func(): void { const view = new Int32Array(this.lock); - const old = Atomics.exchange(view, 1, 1); - if (old !== 0) { - console.error("what happened?"); - } + Atomics.store(view, 2, 1); + Atomics.store(view, 1, 0); Atomics.notify(view, 1, 1); } // wait base_func private block_wait_base_func(): void { const view = new Int32Array(this.lock); - const lock = Atomics.wait(view, 1, 1); + const lock = Atomics.wait(view, 2, 1); if (lock === "timed-out") { throw new Error("timed-out lock"); } @@ -78,14 +68,8 @@ export class WorkerBackgroundRef { private async async_wait_base_func(): Promise { const view = new Int32Array(this.lock); - let value: "timed-out" | "not-equal" | "ok"; - const { value: _value } = Atomics.waitAsync(view, 1, 1); - if (_value instanceof Promise) { - value = await _value; - } else { - value = _value; - } - if (value === "timed-out") { + const { value } = Atomics.waitAsync(view, 2, 1); + if ((await value) === "timed-out") { throw new Error("timed-out lock"); } } @@ -102,6 +86,8 @@ export class WorkerBackgroundRef { options?: WorkerOptions, post_obj?: unknown, ): WorkerRef { + console.log("new_worker", url, options, post_obj); + this.block_lock_base_func(); const view = new Int32Array(this.signature_input); Atomics.store(view, 0, 1); @@ -170,7 +156,7 @@ export class WorkerBackgroundRef { } done_notify(code: number): void { - const notify_view = new Int32Array(this.lock, 8); + const notify_view = new Int32Array(this.lock, 12); // notify done = code 2 const old = Atomics.compareExchange(notify_view, 0, 0, 2); @@ -191,7 +177,7 @@ export class WorkerBackgroundRef { } async async_wait_done_or_error(): Promise { - const notify_view = new Int32Array(this.lock, 8); + const notify_view = new Int32Array(this.lock, 12); Atomics.store(notify_view, 0, 0); @@ -207,12 +193,18 @@ export class WorkerBackgroundRef { throw new Error("timed-out"); } - if (value === "not-equal") { - throw new Error("not-equal"); - } - const code = Atomics.load(notify_view, 0); + if (code === 3) { + const old = Atomics.compareExchange(notify_view, 0, 3, 0); + + if (old !== 3) { + console.error("what happened?"); + } + + return 0; + } + if (code === 2) { const old = Atomics.compareExchange(notify_view, 0, 2, 0); @@ -249,7 +241,7 @@ export class WorkerBackgroundRef { } block_wait_done_or_error(): number { - const notify_view = new Int32Array(this.lock, 8); + const notify_view = new Int32Array(this.lock, 12); Atomics.store(notify_view, 0, 0); @@ -259,12 +251,18 @@ export class WorkerBackgroundRef { throw new Error("timed-out"); } - if (value === "not-equal") { - throw new Error("not-equal"); - } - const code = Atomics.load(notify_view, 0); + if (code === 3) { + const old = Atomics.compareExchange(notify_view, 0, 3, 0); + + if (old !== 3) { + console.error("what happened?"); + } + + return 0; + } + if (code === 2) { const old = Atomics.compareExchange(notify_view, 0, 2, 0); diff --git a/threads/src/shared_array_buffer/worker_background/worker_background_worker_minify.js b/threads/src/shared_array_buffer/worker_background/worker_background_worker_minify.js new file mode 100644 index 0000000..e58a904 --- /dev/null +++ b/threads/src/shared_array_buffer/worker_background/worker_background_worker_minify.js @@ -0,0 +1,3 @@ +export default function() { + let worker_background;class AllocatorUseArrayBuffer{share_arrays_memory;constructor(r=new SharedArrayBuffer(0xa00000)){this.share_arrays_memory=r;let e=new Int32Array(this.share_arrays_memory);Atomics.store(e,0,0),Atomics.store(e,1,0),Atomics.store(e,2,12)}static init_self(r){return new AllocatorUseArrayBuffer(r.share_arrays_memory)}async async_write(r,e,t){let o=new Int32Array(this.share_arrays_memory);for(;;){let{value:s}=Atomics.waitAsync(o,0,1);if("timed-out"===(s instanceof Promise?await s:s))throw Error("timed-out lock");if(0!==Atomics.compareExchange(o,0,0,1))continue;let i=this.write_inner(r,e,t);return Atomics.store(o,0,0),Atomics.notify(o,0,1),i}}block_write(r,e,t){for(;;){let o=new Int32Array(this.share_arrays_memory);if("timed-out"===Atomics.wait(o,0,1))throw Error("timed-out lock");if(0!==Atomics.compareExchange(o,0,0,1))continue;let s=this.write_inner(r,e,t);return Atomics.store(o,0,0),Atomics.notify(o,0,1),s}}write_inner(r,e,t){let o,s,i=new Int32Array(this.share_arrays_memory),a=new Uint8Array(this.share_arrays_memory);o=0===Atomics.add(i,1,1)?Atomics.store(i,2,12):Atomics.load(i,2);let n=this.share_arrays_memory.byteLength,c=r.byteLength,l=o+c;if(n({message:r.message,name:r.name,stack:r.stack,cause:r.cause}),WorkerBackground=class r{override_object;allocator;lock;signature_input;workers=[void 0];start_worker;listen_holder;constructor(r,e,t,o){this.override_object=r,this.lock=e??new SharedArrayBuffer(24),this.allocator=t??new AllocatorUseArrayBuffer(new SharedArrayBuffer(10240)),this.signature_input=o??new SharedArrayBuffer(24),this.listen_holder=this.listen()}static init_self(e,t){return new r(e,t.lock,AllocatorUseArrayBuffer.init_self(t.allocator),t.signature_input)}assign_worker_id(){for(let r=1;r{let r=Atomics.load(e,1),t=Atomics.load(e,2),o=this.allocator.get_memory(r,t);return this.allocator.free(r,t),new Worker(new TextDecoder().decode(o),{type:1===Atomics.load(e,3)?"module":"classic"})},s=()=>{let r=Atomics.load(e,4),t=Atomics.load(e,5),o=this.allocator.get_memory(r,t);return this.allocator.free(r,t),JSON.parse(new TextDecoder().decode(o))};switch(Atomics.load(e,0)){case 1:{let r=o(),t=s(),i=this.assign_worker_id();console.debug("new worker "+i),this.workers[i]=r;let{promise:a,resolve:n}=Promise.withResolvers();r.onmessage=async r=>{let{msg:e}=r.data;if("ready"===e&&n(),"done"===e&&(this.workers[i].terminate(),this.workers[i]=void 0,console.debug(`worker ${i} done so terminate`)),"error"===e||"exit"===e){this.workers[i].terminate(),this.workers[i]=void 0;let t=0;for(let r of this.workers)void 0!==r&&(r.terminate(),"error"===e?console.warn("wasi throw error but child process exists, terminate "+t):console.debug("wasi exit but child process exists, terminate "+t)),t++;void 0!==this.start_worker&&(this.start_worker.terminate(),"error"===e?console.warn("wasi throw error but wasi exists, terminate wasi"):console.debug("wasi exit but wasi exists, terminate wasi")),this.workers=[void 0],this.start_worker=void 0;let o=new Int32Array(this.lock,12);if("error"===e){let e=r.data.error,t=serialize(e),[s,i]=await this.allocator.async_write(new TextEncoder().encode(JSON.stringify(t)),this.lock,4);if(0!==Atomics.compareExchange(o,0,0,1)){console.error("what happened?"),this.allocator.free(s,i);return}1!==Atomics.notify(o,0)&&(console.error(e),this.allocator.free(s,i),Atomics.store(o,0,0))}else{let e=r.data.code;if(0!==Atomics.compareExchange(o,0,0,2))return void console.error("what happened?");Atomics.store(o,1,e),0===Atomics.notify(o,0)&&Atomics.store(o,0,0)}}},r.postMessage({...this.override_object,...t,worker_id:i,worker_background_ref:this.ref()}),await a,Atomics.store(e,0,i);break}case 2:{console.debug("start worker create"),this.start_worker=o();let r=s();this.start_worker.onmessage=async r=>{let{msg:e}=r.data;if("done"===e){let r=0;for(let e of this.workers)void 0!==e&&(e.terminate(),console.warn("wasi done but worker exists, terminate "+r)),r++;this.start_worker.terminate(),this.start_worker=void 0;let e=new Int32Array(this.lock,12);Atomics.store(e,0,3),0===Atomics.notify(e,0)&&Atomics.store(e,0,0),console.debug("start worker done so terminate")}if("error"===e||"exit"===e){let t=0;for(let r of this.workers)void 0!==r&&(r.terminate(),"error"===e?console.warn("wasi throw error but worker exists, terminate "+t):console.debug("wasi exit but worker exists, terminate "+t)),t++;void 0!==this.start_worker&&(this.start_worker.terminate(),"error"===e?console.warn("wasi throw error but wasi exists, terminate start worker"):console.debug("wasi exit but wasi exists, terminate start worker")),this.workers=[void 0],this.start_worker=void 0;let o=new Int32Array(this.lock,12);if("error"===e){let e=r.data.error,t=serialize(e),[s,i]=await this.allocator.async_write(new TextEncoder().encode(JSON.stringify(t)),this.lock,4);if(0!==Atomics.compareExchange(o,0,0,1)){console.error("what happened?"),this.allocator.free(s,i);return}if(0===Atomics.notify(o,0))throw this.allocator.free(s,i),Atomics.store(o,0,0),e}else{let e=r.data.code;if(0!==Atomics.compareExchange(o,0,0,2))return void console.error("what happened?");Atomics.store(o,1,e),0===Atomics.notify(o,0)&&Atomics.store(o,0,0)}}},this.start_worker.postMessage({...this.override_object,...r,worker_background_ref:this.ref()})}}Atomics.store(r,1,1),Atomics.store(r,2,0),0===Atomics.notify(r,2,1)&&console.warn("notify failed, waiter is late")}}};globalThis.onmessage=r=>{let{override_object:e,worker_background_ref_object:t}=r.data;worker_background=WorkerBackground.init_self(e,t),postMessage("ready")}; +} \ No newline at end of file diff --git a/threads/src/shared_array_buffer/worker_background/worker_blob.ts b/threads/src/shared_array_buffer/worker_background/worker_blob.ts index a202b08..5d31339 100644 --- a/threads/src/shared_array_buffer/worker_background/worker_blob.ts +++ b/threads/src/shared_array_buffer/worker_background/worker_blob.ts @@ -1,6 +1,6 @@ export const url = () => { const code = - 'let worker_background;let serialize=r=>({message:r.message,name:r.name,stack:r.stack,cause:r.cause});class AllocatorUseArrayBuffer{share_arrays_memory;constructor(r=new SharedArrayBuffer(0xa00000)){this.share_arrays_memory=r;let e=new Int32Array(this.share_arrays_memory);Atomics.store(e,0,0),Atomics.store(e,1,0),Atomics.store(e,2,12)}static init_self(r){return new AllocatorUseArrayBuffer(r.share_arrays_memory)}async async_write(r,e,t){let o=new Int32Array(this.share_arrays_memory);for(;;){let{value:s}=Atomics.waitAsync(o,0,1);if("timed-out"===(s instanceof Promise?await s:s))throw Error("timed-out lock");if(0!==Atomics.compareExchange(o,0,0,1))continue;let i=this.write_inner(r,e,t);return Atomics.store(o,0,0),Atomics.notify(o,0,1),i}}block_write(r,e,t){for(;;){let o=new Int32Array(this.share_arrays_memory);if("timed-out"===Atomics.wait(o,0,1))throw Error("timed-out lock");if(0!==Atomics.compareExchange(o,0,0,1))continue;let s=this.write_inner(r,e,t);return Atomics.store(o,0,0),Atomics.notify(o,0,1),s}}write_inner(r,e,t){let o,s;let i=new Int32Array(this.share_arrays_memory),a=new Uint8Array(this.share_arrays_memory);o=0===Atomics.add(i,1,1)?Atomics.store(i,2,12):Atomics.load(i,2);let n=this.share_arrays_memory.byteLength,l=r.byteLength,c=o+l;if(n{console.log("gen_worker");let r=Atomics.load(e,1),t=Atomics.load(e,2),o=this.allocator.get_memory(r,t);this.allocator.free(r,t);let s=new TextDecoder().decode(o),i=1===Atomics.load(e,3);return new Worker(s,{type:i?"module":"classic"})},a=()=>{console.log("gen_obj");let r=Atomics.load(e,4),t=Atomics.load(e,5),o=this.allocator.get_memory(r,t);this.allocator.free(r,t);let s=new TextDecoder().decode(o);return JSON.parse(s)};switch(Atomics.load(e,0)){case 1:{let r=i(),t=a(),o=this.assign_worker_id();console.log("new worker "+o),this.workers[o]=r;let{promise:s,resolve:n}=Promise.withResolvers();r.onmessage=async r=>{let{msg:e}=r.data;if("ready"===e&&n(),"done"===e&&(this.workers[o].terminate(),this.workers[o]=void 0,console.log(`worker ${o} done so terminate`)),"error"===e){this.workers[o].terminate(),this.workers[o]=void 0;let e=0;for(let r of this.workers)void 0!==r&&(r.terminate(),console.warn("wasi throw error but child process exists, terminate "+e)),e++;void 0!==this.start_worker&&(this.start_worker.terminate(),console.warn("wasi throw error but wasi exists, terminate wasi")),this.workers=[void 0],this.start_worker=void 0;let t=r.data.error,s=new Int32Array(this.lock,8),i=serialize(t),[a,n]=await this.allocator.async_write(new TextEncoder().encode(JSON.stringify(i)),this.lock,3),l=Atomics.compareExchange(s,0,0,1);if(0!==l){console.error("what happened?"),this.allocator.free(a,n);return}let c=Atomics.notify(s,0);0===c&&(console.error(t),this.allocator.free(a,n),Atomics.store(s,0,0))}},r.postMessage({...this.override_object,...t,worker_id:o,worker_background_ref:this.ref()}),await s,Atomics.store(e,0,o);break}case 2:{this.start_worker=i();let r=a();this.start_worker.onmessage=async r=>{let{msg:e}=r.data;if("done"===e){let r=0;for(let e of this.workers)void 0!==e&&(e.terminate(),console.warn("wasi done but worker exists, terminate "+r)),r++;this.start_worker.terminate(),this.start_worker=void 0,console.log("start worker done so terminate")}if("error"===e){let e=0;for(let r of this.workers)void 0!==r&&(r.terminate(),console.warn("wasi throw error but worker exists, terminate "+e)),e++;void 0!==this.start_worker&&(this.start_worker.terminate(),console.warn("wasi throw error but wasi exists, terminate start worker")),this.workers=[void 0],this.start_worker=void 0;let t=r.data.error,o=new Int32Array(this.lock,8),s=serialize(t),[i,a]=await this.allocator.async_write(new TextEncoder().encode(JSON.stringify(s)),this.lock,3),n=Atomics.compareExchange(o,0,0,1);if(0!==n){console.error("what happened?"),this.allocator.free(i,a);return}let l=Atomics.notify(o,0);0===l&&(console.error(t),this.allocator.free(i,a),Atomics.store(o,0,0))}},this.start_worker.postMessage({...this.override_object,...r,worker_background_ref:this.ref()})}}let n=Atomics.exchange(r,1,0);if(1!==n)throw Error("Lock is already set");let l=Atomics.notify(r,1,1);if(1!==l){if(0===l){console.warn("notify failed, waiter is late");continue}throw Error("notify failed: "+l)}}catch(r){console.error(r),await new Promise(r=>setTimeout(r,1e3))}}};globalThis.onmessage=r=>{let{override_object:e,worker_background_ref_object:t}=r.data;worker_background=WorkerBackground.init_self(e,t),postMessage("ready")};'; + 'let worker_background;class AllocatorUseArrayBuffer{share_arrays_memory;constructor(r=new SharedArrayBuffer(0xa00000)){this.share_arrays_memory=r;let e=new Int32Array(this.share_arrays_memory);Atomics.store(e,0,0),Atomics.store(e,1,0),Atomics.store(e,2,12)}static init_self(r){return new AllocatorUseArrayBuffer(r.share_arrays_memory)}async async_write(r,e,t){let o=new Int32Array(this.share_arrays_memory);for(;;){let{value:s}=Atomics.waitAsync(o,0,1);if("timed-out"===(s instanceof Promise?await s:s))throw Error("timed-out lock");if(0!==Atomics.compareExchange(o,0,0,1))continue;let i=this.write_inner(r,e,t);return Atomics.store(o,0,0),Atomics.notify(o,0,1),i}}block_write(r,e,t){for(;;){let o=new Int32Array(this.share_arrays_memory);if("timed-out"===Atomics.wait(o,0,1))throw Error("timed-out lock");if(0!==Atomics.compareExchange(o,0,0,1))continue;let s=this.write_inner(r,e,t);return Atomics.store(o,0,0),Atomics.notify(o,0,1),s}}write_inner(r,e,t){let o,s,i=new Int32Array(this.share_arrays_memory),a=new Uint8Array(this.share_arrays_memory);o=0===Atomics.add(i,1,1)?Atomics.store(i,2,12):Atomics.load(i,2);let n=this.share_arrays_memory.byteLength,c=r.byteLength,l=o+c;if(n({message:r.message,name:r.name,stack:r.stack,cause:r.cause}),WorkerBackground=class r{override_object;allocator;lock;signature_input;workers=[void 0];start_worker;listen_holder;constructor(r,e,t,o){this.override_object=r,this.lock=e??new SharedArrayBuffer(24),this.allocator=t??new AllocatorUseArrayBuffer(new SharedArrayBuffer(10240)),this.signature_input=o??new SharedArrayBuffer(24),this.listen_holder=this.listen()}static init_self(e,t){return new r(e,t.lock,AllocatorUseArrayBuffer.init_self(t.allocator),t.signature_input)}assign_worker_id(){for(let r=1;r{let r=Atomics.load(e,1),t=Atomics.load(e,2),o=this.allocator.get_memory(r,t);return this.allocator.free(r,t),new Worker(new TextDecoder().decode(o),{type:1===Atomics.load(e,3)?"module":"classic"})},s=()=>{let r=Atomics.load(e,4),t=Atomics.load(e,5),o=this.allocator.get_memory(r,t);return this.allocator.free(r,t),JSON.parse(new TextDecoder().decode(o))};switch(Atomics.load(e,0)){case 1:{let r=o(),t=s(),i=this.assign_worker_id();console.debug("new worker "+i),this.workers[i]=r;let{promise:a,resolve:n}=Promise.withResolvers();r.onmessage=async r=>{let{msg:e}=r.data;if("ready"===e&&n(),"done"===e&&(this.workers[i].terminate(),this.workers[i]=void 0,console.debug(`worker ${i} done so terminate`)),"error"===e||"exit"===e){this.workers[i].terminate(),this.workers[i]=void 0;let t=0;for(let r of this.workers)void 0!==r&&(r.terminate(),"error"===e?console.warn("wasi throw error but child process exists, terminate "+t):console.debug("wasi exit but child process exists, terminate "+t)),t++;void 0!==this.start_worker&&(this.start_worker.terminate(),"error"===e?console.warn("wasi throw error but wasi exists, terminate wasi"):console.debug("wasi exit but wasi exists, terminate wasi")),this.workers=[void 0],this.start_worker=void 0;let o=new Int32Array(this.lock,12);if("error"===e){let e=r.data.error,t=serialize(e),[s,i]=await this.allocator.async_write(new TextEncoder().encode(JSON.stringify(t)),this.lock,4);if(0!==Atomics.compareExchange(o,0,0,1)){console.error("what happened?"),this.allocator.free(s,i);return}1!==Atomics.notify(o,0)&&(console.error(e),this.allocator.free(s,i),Atomics.store(o,0,0))}else{let e=r.data.code;if(0!==Atomics.compareExchange(o,0,0,2))return void console.error("what happened?");Atomics.store(o,1,e),0===Atomics.notify(o,0)&&Atomics.store(o,0,0)}}},r.postMessage({...this.override_object,...t,worker_id:i,worker_background_ref:this.ref()}),await a,Atomics.store(e,0,i);break}case 2:{console.debug("start worker create"),this.start_worker=o();let r=s();this.start_worker.onmessage=async r=>{let{msg:e}=r.data;if("done"===e){let r=0;for(let e of this.workers)void 0!==e&&(e.terminate(),console.warn("wasi done but worker exists, terminate "+r)),r++;this.start_worker.terminate(),this.start_worker=void 0;let e=new Int32Array(this.lock,12);Atomics.store(e,0,3),0===Atomics.notify(e,0)&&Atomics.store(e,0,0),console.debug("start worker done so terminate")}if("error"===e||"exit"===e){let t=0;for(let r of this.workers)void 0!==r&&(r.terminate(),"error"===e?console.warn("wasi throw error but worker exists, terminate "+t):console.debug("wasi exit but worker exists, terminate "+t)),t++;void 0!==this.start_worker&&(this.start_worker.terminate(),"error"===e?console.warn("wasi throw error but wasi exists, terminate start worker"):console.debug("wasi exit but wasi exists, terminate start worker")),this.workers=[void 0],this.start_worker=void 0;let o=new Int32Array(this.lock,12);if("error"===e){let e=r.data.error,t=serialize(e),[s,i]=await this.allocator.async_write(new TextEncoder().encode(JSON.stringify(t)),this.lock,4);if(0!==Atomics.compareExchange(o,0,0,1)){console.error("what happened?"),this.allocator.free(s,i);return}if(0===Atomics.notify(o,0))throw this.allocator.free(s,i),Atomics.store(o,0,0),e}else{let e=r.data.code;if(0!==Atomics.compareExchange(o,0,0,2))return void console.error("what happened?");Atomics.store(o,1,e),0===Atomics.notify(o,0)&&Atomics.store(o,0,0)}}},this.start_worker.postMessage({...this.override_object,...r,worker_background_ref:this.ref()})}}Atomics.store(r,1,1),Atomics.store(r,2,0),0===Atomics.notify(r,2,1)&&console.warn("notify failed, waiter is late")}}};globalThis.onmessage=r=>{let{override_object:e,worker_background_ref_object:t}=r.data;worker_background=WorkerBackground.init_self(e,t),postMessage("ready")};'; const blob = new Blob([code], { type: "application/javascript" }); diff --git a/threads/src/shared_array_buffer/worker_background/worker_export.ts b/threads/src/shared_array_buffer/worker_background/worker_export.ts index f0758a2..a8d7093 100644 --- a/threads/src/shared_array_buffer/worker_background/worker_export.ts +++ b/threads/src/shared_array_buffer/worker_background/worker_export.ts @@ -12,7 +12,7 @@ export const WorkerBackgroundRefObjectConstructor = allocator: { share_arrays_memory: new SharedArrayBuffer(10 * 1024), }, - lock: new SharedArrayBuffer(20), + lock: new SharedArrayBuffer(24), signature_input: new SharedArrayBuffer(24), }; }; diff --git a/threads/tsconfig.json b/threads/tsconfig.json index 6a2b7c9..8f6ff75 100644 --- a/threads/tsconfig.json +++ b/threads/tsconfig.json @@ -21,7 +21,8 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "libReplacement": true }, - "include": ["./src"] + "include": ["./src", "scripts/post_build.js"] } diff --git a/threads/vite.config.ts b/threads/vite.config.ts index a358b42..867b7cc 100644 --- a/threads/vite.config.ts +++ b/threads/vite.config.ts @@ -1,9 +1,9 @@ // https://zenn.dev/seapolis/articles/3605c4befc8465 import { resolve } from "node:path"; +import swc from "unplugin-swc"; import { defineConfig } from "vite"; import dts from "vite-plugin-dts"; -import swc from "unplugin-swc"; export default defineConfig({ server: {