Open5
BunからWebAssemblyを呼び出す
BunからWebAssemblyを呼び出すトライ。
シンプルなコードだと、エラーも実行結果も出ずに終了する。
(Node.jsだと 実行結果 42 が表示される)
use_wasm_.js
const fs = require("fs");
const content = fs.readFileSync("./func.wasm");
console.warn("-- start compiling wasm --")
WebAssembly.compile(content)
.then((module) => {
console.warn("-- wasm compiled --");
const lib = new WebAssembly.Instance(module, {
env: {},
}).exports;
console.warn("-- wasm instance ready. lib:", lib);
// --- call func ---
console.warn("== Result of wasm func ==");
const ret = lib.func();
console.log(ret); // 42
})
.catch((e) => {
console.error("ERROR:", e);
});
console.warn("--- end ---");
WebAssemblyのモジュールを生成するためのZigソース
src/func.zig
// src/func.zig
export fn func() usize {
return 42;
}
ビルド手順
zig build-lib \
-O ReleaseSmall \
-target wasm32-wasi \
-dynamic \
--export=func \
src/func.zig
WebAssembly.compile(content)の結果を待たずにプロセスが終了してしまうのが原因
issue https://github.com/oven-sh/bun/issues/1189
setTimeout()でしばらく待たせれば、OK
use_wasm_timeout.js
const fs = require("fs");
const content = fs.readFileSync("./func.wasm");
console.warn("-- start compiling wasm --")
WebAssembly.compile(content)
.then((module) => {
console.warn("-- wasm compiled --");
const lib = new WebAssembly.Instance(module, {
env: {},
}).exports;
console.warn("-- wasm instance ready. lib:", lib);
// --- call func ---
console.warn("== Result of wasm func ==");
const ret = lib.func();
console.log(ret); // 42
})
.catch((e) => {
console.error("ERROR:", e);
});
// --- wait for WebAssembly.compile() ---
setTimeout(function() {
console.warn("timeout ..");
}, 100);
あるいは、単に await で待たせるのでもOK
use_wasm_await.mjs
import fs from "fs";
const content = fs.readFileSync("./func.wasm");
console.warn("-- start compiling wasm --")
const module = await WebAssembly.compile(content)
.catch((e) => {
console.error("ERROR:", e);
});
console.warn("-- wasm compiled --");
const lib = new WebAssembly.Instance(module, {
env: {},
}).exports;
console.warn("-- wasm instance ready. lib:", lib);
// --- call func ---
console.warn("== Result of wasm func ==");
const ret = lib.func();
console.log(ret); // 42