13 unstable releases (5 breaking)

0.6.0 Jul 23, 2025
0.5.0 Mar 23, 2025
0.4.2 Aug 22, 2024
0.4.0 May 11, 2024
0.1.4 Sep 30, 2023

#137 in WebAssembly

Download history 96/week @ 2025-10-22 241/week @ 2025-10-29 63/week @ 2025-11-05 92/week @ 2025-11-12 124/week @ 2025-11-19 69/week @ 2025-11-26 108/week @ 2025-12-03 105/week @ 2025-12-10 73/week @ 2025-12-17 35/week @ 2025-12-24 47/week @ 2025-12-31 21/week @ 2026-01-07 28/week @ 2026-01-14 36/week @ 2026-01-21 74/week @ 2026-01-28 155/week @ 2026-02-04

294 downloads per month
Used in 15 crates (13 directly)

MIT/Apache

69KB
1.5K SLoC

wasm_runtime_layer

Crates.io Docs.rs

wasm_runtime_layer creates a thin abstraction over WebAssembly runtimes, allowing for backend-agnostic host code. The interface is based upon the wasmtime and wasmi crates, but may be implemented for any runtime.

Usage

To use this crate, first instantiate a backend runtime. The runtime may be any value that implements backend::WasmEngine. Some runtimes are already implemented as additional crates. Then, one can create an Engine from the backend runtime, and use it to initialize modules and instances:

// 1. Instantiate a runtime
let engine = Engine::new(wasmi_runtime_layer::Engine::default());
let mut store = Store::new(&engine, ());

// 2. Create modules and instances, similar to other runtimes
let module_bin = wat::parse_str(
    r#"
(module
(type $t0 (func (param i32) (result i32)))
(func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
    local.get $p0
    i32.const 1
    i32.add))
"#,
)
.unwrap();

let module = Module::new(&engine, &module_bin).unwrap();
let instance = Instance::new(&mut store, &module, &Imports::default()).unwrap();

let add_one = instance
    .get_export(&store, "add_one")
    .unwrap()
    .into_func()
    .unwrap();
        
let mut result = [Value::I32(0)];
add_one
    .call(&mut store, &[Value::I32(42)], &mut result)
    .unwrap();

assert_eq!(result[0], Value::I32(43));

Backends

  • wasmer_runtime_layer - Implements the WasmEngine trait for wrappers around wasmer::Engine instances.
  • wasmtime_runtime_layer - Implements the WasmEngine trait for wrappers around wasmtime::Engine instances.
  • wasmi_runtime_layer - Implements the WasmEngine trait for wrappers around wasmi::Engine instances.
  • js_wasm_runtime_layer - Implements a wasm engine targeting the browser's WebAssembly API on wasm32-unknown-unknown targets.
  • pyodide-webassembly-runtime-layer - Implements a wasm engine targeting the browser's WebAssembly API when running as a Python extension module inside Pyodide.

Contributions for additional backend implementations are welcome!

Testing

To run the tests for wasmi and wasmtime, run:

cargo test

For the wasm32 target, you can use the slower interpreter wasmi, or the native JIT accelerated browser backend.

To test the backends, you need to install wasm-pack.

You can then run:

wasm-pack test --node

Dependencies

~1.1–1.6MB
~29K SLoC