aboutsummaryrefslogtreecommitdiff
path: root/src/js/wasi-runner.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/wasi-runner.js')
-rw-r--r--src/js/wasi-runner.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/js/wasi-runner.js b/src/js/wasi-runner.js
new file mode 100644
index 000000000..bd9e2d56c
--- /dev/null
+++ b/src/js/wasi-runner.js
@@ -0,0 +1,51 @@
+/** This file is used when a .wasm file is ran.
+ * The transpiled contents of `./node/wasi.js` is pasted into the top of this file.
+ */
+import { WASI } from "node:wasi";
+
+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 = "1",
+} = 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 = await WebAssembly.compile(source);
+
+const instance = !Number(WASM_USE_ASYNC_INIT)
+ ? new WebAssembly.Instance(wasm, wasi.getImports(wasm))
+ : await WebAssembly.instantiate(wasm, wasi.getImports(wasm));
+
+wasi.start(instance);
+
+process.reallyExit(0);