39 stable releases

new 2.7.0 Apr 29, 2025
2.6.0 Mar 21, 2025
2.5.0 Feb 24, 2025
2.2.0 Nov 26, 2024
0.0.2 Oct 27, 2020

#30 in WebAssembly

Download history 1229/week @ 2025-01-12 1641/week @ 2025-01-19 1267/week @ 2025-01-26 899/week @ 2025-02-02 1319/week @ 2025-02-09 1616/week @ 2025-02-16 1159/week @ 2025-02-23 1475/week @ 2025-03-02 1121/week @ 2025-03-09 1000/week @ 2025-03-16 970/week @ 2025-03-23 551/week @ 2025-03-30 616/week @ 2025-04-06 536/week @ 2025-04-13 711/week @ 2025-04-20 946/week @ 2025-04-27

2,858 downloads per month
Used in 2 crates (via wascc-host)

Apache-2.0

70KB
1.5K SLoC

Wasmtime Engine Provider

crates.io license

This is a pluggable engine provider for the waPC RPC exchange protocol. This engine implements WebAssemblyEngineProvider for the the Bytecode Alliance's wasmtime WebAssembly runtime.

Usage

use wasmtime_provider::WasmtimeEngineProviderBuilder;
use wapc::WapcHost;
use std::error::Error;

pub fn main() -> Result<(), Box<dyn Error>> {

  // Sample host callback that prints the operation a WASM module requested.
  let host_callback = |id: u64, bd: &str, ns: &str, op: &str, payload: &[u8]| {
    println!("Guest {} invoked '{}->{}:{}' with a {} byte payload",
    id, bd, ns, op, payload.len());
    // Return success with zero-byte payload.
    Ok(vec![])
  };

  let file = "../../wasm/crates/wasm-basic/build/wasm_basic.wasm";
  let module_bytes = std::fs::read(file)?;

  let engine = WasmtimeEngineProviderBuilder::new()
    .module_bytes(&module_bytes)
    .build()?;
  let host = WapcHost::new(Box::new(engine), Some(Box::new(host_callback)))?;

  let res = host.call("ping", b"payload bytes")?;
  assert_eq!(res, b"payload bytes");

  Ok(())
}

async Support

The async feature enables the usage of this provider inside of an async context.

Note: this feature relies on the tokio runtime.

Check the WasmtimeEngineProviderAsync for more details.

Creating a new instance

The WasmtimeEngineProviderBuilder is used to create new instances of WasmtimeEngineProvider and WasmtimeEngineProviderAsync.

Fresh instances of the engines can be created by using pre-initialized instances like WasmtimeEngineProviderPre and WasmtimeEngineProviderAsyncPre.

Examples

Running ping demo

cargo run -p wasmtime-provider \
    --example wasmtime-demo \
    ./wasm/crates/wasm-basic/build/wasm_basic.wasm \
    ping "hi"

Running codec and module hotswapping demo

cargo run -p wasmtime-provider \
    --example wasmtime-hash-mreplace \
    AlexName

See also

Dependencies

~34–48MB
~1M SLoC