diff options
Diffstat (limited to 'src/bun.js/wasi-runner.js')
-rw-r--r-- | src/bun.js/wasi-runner.js | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/bun.js/wasi-runner.js b/src/bun.js/wasi-runner.js new file mode 100644 index 000000000..24ff0a678 --- /dev/null +++ b/src/bun.js/wasi-runner.js @@ -0,0 +1,49 @@ +/** --- WASI */ +// wasi is imported into the top of this file + +const filePath = process.argv.at(1); +if (!filePath) { + var err = new Error( + "To run a wasm file with Bun, the first argument must be a path to a .wasm file", + ); + err.name = "WasmFileNotFound"; + throw err; +} + +// The module specifier is the resolved path to the wasm file + +var { + WASM_CWD = process.cwd(), + WASM_ROOT_DIR = "/", + WASM_ENV_STR = undefined, + WASM_USE_ASYNC_INIT = "", +} = process.env; + +var env = process.env; +if (WASM_ENV_STR?.length) { + env = JSON.parse(WASM_ENV_STR); +} + +const wasi = new WASI({ + args: process.argv.slice(1), + env, + preopens: { + ".": WASM_CWD || process.cwd(), + "/": WASM_ROOT_DIR || "/", + }, +}); + +let source = globalThis.wasmSourceBytes; +if (!source) { + const fs = Bun.fs(); + const file = import.meta.path; + source = fs.readFileSync(file); +} + +const wasm = new WebAssembly.Module(source); +const instance = !WASM_USE_ASYNC_INIT + ? new WebAssembly.Instance(wasm, wasi.getImports(wasm)) + : await WebAssembly.instantiate(wasm, wasi.getImports(wasm)); +wasi.start(instance); + +process.exit(0); |