Slide 36
Slide 36 text
プラグインの非同期処理をサポートする ( Host )
// Host / Guest 間で情報伝達するために os.Pipe() を利用する
reqR, reqW, _ := os.Pipe() // リクエスト用の Pipe
resR, resW, _ := os.Pipe() // レスポンス用の Pipe
// wasmimport で使う Host 関数の定義
hostBuilder.WithGoModuleFunction(
api.GoModuleFunc(func(_ context.Context, mod api.Module, stack []uint64) {
// Guest 側のメモリからレスポンスを取得する
b, _ := mod.Memory().Read(uint32(stack[0]), uint32(stack[1]))
resW.Write(b) // resW に書き込むと、resR で読み込める
}),
[]api.ValueType{api.ValueTypeI32, api.ValueTypeI32}, []api.ValueType{}
)
go func() {
wasmRuntime.InstantiateModule(
wazero.NewModuleConfig().
// Guest の Stdin にリクエスト読み込み用の Pipe を渡す
WithStdin(reqR).WithStdout(os.Stdout).WithStderr(os.Stderr)
)
}()
reqW.Write("hello\n") // リクエストを書き込む。Guest の Stdin 経由で読み込む
resp, _ := bufio.NewReader(resR).ReadString('\n') // 結果を resR 経由で読み込む
1. Host => Guest / Guest => Host
の Pipe を作る
2. Host Function を定義し、Guest
からの戻り値を Pipe に書き込む
3. WASMインスタンス起動時に
STDIN に Pipe を渡す
4. Pipe 経由でリクエストを送る
5. Pipe 経由でレスポンスを受け取る