33 releases (16 breaking)

✓ Uses Rust 2018 edition

0.17.1 Jun 24, 2020
0.16.2 Mar 12, 2020
0.12.0 Dec 19, 2019
0.11.0 Nov 24, 2019
0.2.1 Feb 28, 2019

#3 in WebAssembly

Download history 1132/week @ 2020-03-12 1254/week @ 2020-03-19 1613/week @ 2020-03-26 1957/week @ 2020-04-02 2173/week @ 2020-04-09 1537/week @ 2020-04-16 1509/week @ 2020-04-23 1478/week @ 2020-04-30 1586/week @ 2020-05-07 2436/week @ 2020-05-14 1285/week @ 2020-05-21 1428/week @ 2020-05-28 1139/week @ 2020-06-04 921/week @ 2020-06-11 1254/week @ 2020-06-18 1274/week @ 2020-06-25

6,685 downloads per month
Used in 15 crates (11 directly)

MIT and maybe MPL-2.0

1MB
19K SLoC

Wasmer logo

Build Status License Join the Wasmer Community Number of downloads from crates.io Read our API documentation

Wasmer Runtime

Wasmer is a standalone JIT WebAssembly runtime, aiming to be fully compatible with Emscripten, Rust and Go. Learn more.

This crate represents the high-level runtime API, making embedding WebAssembly in your application easy, efficient, and safe.

How to use Wasmer Runtime

The easiest way is to use the instantiate function to create an Instance. Then you can use call or func and then call to call an exported function safely.

Example

Given this WebAssembly:

(module
  (type $t0 (func (param i32) (result i32)))
  (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
    get_local $p0
    i32.const 1
    i32.add))

compiled into Wasm bytecode, we can call the exported add_one function:

static WASM: &'static [u8] = &[
    // The module above compiled to bytecode goes here.
    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x60,
    0x01, 0x7f, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07, 0x0b, 0x01, 0x07,
    0x61, 0x64, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x00, 0x00, 0x0a, 0x09, 0x01,
    0x07, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x0b, 0x00, 0x1a, 0x04, 0x6e,
    0x61, 0x6d, 0x65, 0x01, 0x0a, 0x01, 0x00, 0x07, 0x61, 0x64, 0x64, 0x5f,
    0x6f, 0x6e, 0x65, 0x02, 0x07, 0x01, 0x00, 0x01, 0x00, 0x02, 0x70, 0x30,
];

use wasmer_runtime::{
    instantiate,
    DynFunc,
    Value,
    imports,
    error,
};

fn main() -> error::Result<()> {
    // We're not importing anything, so make an empty import object.
    let import_object = imports! {};

    let instance = instantiate(WASM, &import_object)?;

    let values = instance
        .exports
        .get::<DynFunc>("add_one")?
        .call(&[Value::I32(42)])?;

    assert_eq!(values[0], Value::I32(43));
    
    Ok(())
}

Additional Notes

The wasmer-runtime crate is built to support multiple compiler backends. We support having a Cranelift backend in the wasmer-clif-backend crate, a LLVM backend in the [wasmer-llvm-backend] crate, and the Singlepass backend in the [wasmer-singlepass-backend] crate. Currently, the Cranelift backend is the default.

You can specify the compiler you wish to use with the compile_with function.

Dependencies

~4–6.5MB
~142K SLoC