Crates.io | wasmer-wasi-asml-fork |
lib.rs | wasmer-wasi-asml-fork |
version | 2.0.0 |
source | src |
created_at | 2021-02-06 02:55:24.120944 |
updated_at | 2021-10-29 03:49:54.210359 |
description | WASI implementation library for Wasmer WebAssembly runtime |
homepage | |
repository | https://github.com/wasmerio/wasmer |
max_upload_size | |
id | 351390 |
size | 238,753 |
wasmer-wasi
This crate provides the necessary imports to use WASI easily from Wasmer. WebAssembly System Interface (WASI for short) is a modular system interface for WebAssembly. WASI is being standardized in the WebAssembly subgroup.
Very succinctly, from the user perspective, WASI is a set of
WebAssembly module imports under a specific namespace (which
varies based on the WASI version). A program compiled for the
wasm32-wasi
target will be able to support standard I/O, file I/O,
filesystem manipulation, memory management, time, string, environment
variables, program startup etc.
This crate provides the necessary API to create the imports to use
WASI easily from the Wasmer runtime, through our ImportObject
API.
WASI version | Support |
---|---|
wasi_unstable |
✅ |
wasi_snapshot_preview1 |
✅ |
The special Latest
version points to wasi_snapshot_preview1
.
Learn more about the WASI version process (ephemeral, snapshot, old).
Let's consider the following hello.rs
Rust program:
fn main() {
println!("Hello, {:?}", std::env::args().nth(1));
}
Then, let's compile it to a WebAssembly module with WASI support:
$ rustc --target wasm32-wasi hello.rs
Finally, let's execute it with the wasmer
CLI:
$ wasmer run hello.wasm Gordon
Hello, Some("Gordon")
… and programatically with the wasmer
and the wasmer-wasi
libraries:
use wasmer::{Store, Module, Instance};
use wasmer_wasi::WasiState;
let store = Store::default();
let module = Module::from_file(&store, "hello.wasm")?;
// Create the `WasiEnv`.
let wasi_env = WasiState::new("command-name")
.args(&["Gordon"])
.finalize()?;
// Generate an `ImportObject`.
let import_object = wasi_env.import_object(&module)?;
// Let's instantiate the module with the imports.
let instance = Instance::new(&module, &import_object)?;
// Let's call the `_start` function, which is our `main` function in Rust.
let start = instance.exports.get_function("_start")?;
start.call(&[])?;
Check the fully working example using WASI.
This library is about the WASI implementation inside the Wasmer runtime. It contains documentation about the implementation itself. However, if you wish to learn more about WASI, here is a list of links that may help you:
wasi-libc
, WASI libc
implementation for WebAssembly programs built on top of WASI system
calls. It provides a wide array of POSIX-compatible C APIs,
including support for standard I/O, file I/O, filesystem
manipulation, memory management, time, string, environment
variables, program startup, and many other APIs,wasi-sdk
, WASI-enabled
WebAssembly C/C++ toolchain, based on wasi-libc
,_start
and _initialize
(for reactors) for example.