Command interface

WASI enables WebAssembly programs to call standard library functions in the host operating system. It does so through a fine-grained security model known as “capability-based security”. The WebAssembly VM owner can grant access to host system resources when the VM starts up. The program cannot access any resources (e.g., file folders) that are not explicitly allowed.

Now, why limit ourselves to standard library functions? The same approach can be used to call just any host functions from WebAssembly. WasmEdge provides a WASI-like extension to access any command line programs in the host operating system.

The command line program can

  • Take input via command line arguments, as well as the STDIN stream.
  • Return value and data via the STDOUT stream.

Application developers for WasmEdge can use our Rust interface crate to access this functionality. In Cargo.toml, make sure that you have this dependency.

[dependencies] rust_process_interface_library = "0.1.3"

In the Rust application, you can now use the API methods to start a new process for the operating system command program, pass in arguments via the arg() method as well as via the STDIN, and receives the return values via the STDOUT.

  1. #![allow(unused)]
  2. fn main() {
  3. let mut cmd = Command::new("http_proxy");
  4. cmd.arg("post")
  5. .arg("https://api.sendgrid.com/v3/mail/send")
  6. .arg(auth_header);
  7. cmd.stdin_u8vec(payload.to_string().as_bytes());
  8. let out = cmd.output();
  9. }

The Rust function is then compiled into WebAssembly and can run in the WasmEdge.