wa_wasi
WASI preview1 host functions for the Erlang ecosystem — the pure-Erlang core package.
WASI is not a set of new WebAssembly instructions: it is a collection of
standard host-function imports (published under the WASM import-module name
wasi_snapshot_preview1) that a WASM module imports and the host implements.
wa_wasi supplies those implementations so a compiled WASM module can print
output, read its arguments and environment, get time and randomness, and exit.
Standalone by design
wa_wasi is standalone: it depends only on OTP and its own wa_wasi_*
modules — it does not depend on the wa_embedder
WASM→BEAM compiler. Only the user's application depends on both.
Because a compiled host function receives only the WASM integer operands (never
a handle to the module's linear memory), wa_wasi defines its own minimal
byte-level memory contract — the wa_wasi_memory behaviour — and parameterizes
every host function by a memory accessor and a wa_wasi_ctx capabilities
context (stdout/stderr sinks, args, environment, clock source, RNG source). The
user supplies a tiny adapter that bridges the accessor to their runtime's linear
memory.
Scope
Phase 1 (the "compute and output" slice): fd_write, args_sizes_get /
args_get, environ_sizes_get / environ_get, clock_time_get, random_get,
and proc_exit (raised as a catchable {wasi_exit, Code} — never halt).
Filesystem/preopens and WASI preview2 / the Component Model are out of scope for now (roadmap).
Elixir
An idiomatic Elixir wrapper, wa_wasi_ex (the WaWasi module), lives in the
wa_wasi_ex/ subdirectory and delegates to this core.
License
Released into the public domain under the Unlicense.