wasmerio / wasmer-go

🐹🕸️ WebAssembly runtime for Go

Home Page:https://pkg.go.dev/github.com/wasmerio/wasmer-go

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

support setting bytes for stdin

tiziano88 opened this issue · comments

Motivation

It is quite common to have to provide a pre-determined stdin value to a Wasm module, without having to expose a full file system to it.

Proposed solution

leverage this function:

https://docs.wasmtime.dev/c-api/wasi_8h.html#a525abd98ade58887a969b796ea05468e

would require modifying

#if defined(WASMER_WASI_ENABLED)
void wasi_config_inherit_stdin(struct wasi_config_t *config);
#endif

and

wasmer-go/wasmer/wasi.go

Lines 196 to 202 in ca60a45

// InheritStdin configures the WASI module to inherit the stdin from
// the host.
func (self *WasiStateBuilder) InheritStdin() *WasiStateBuilder {
C.wasi_config_inherit_stdin(self.inner())
return self
}

Alternatives

The best alternative at the moment is passing the value as argument on the command line, but that's not great for large and / or binary values.

I'm currently facing the same issue on my project. It would be quite handy having somehow a setStdIn function.

Could you explain on more further details about the workaround to pass input data to the wasi module execution?

For the time being I just serialize the data as a string (base64 if necessary) and pass it as the first command line argument to the Wasm module, which then reads it as argv[1]

Thanks for the explanation, I think this wouldn't even work in my use case :(

I'm trying to embed a .wasm module compiled by Javy and according to this issue, it doesn't currently expose APIs to read environment variables or command line arguments.

Right, in that case fixing this issue wouldn't help you, since this is specific to WASI, which AFAICT you are not using. I think your best bet is to declare a custom function for the Wasm module to read the data into its own memory