#bus #wasi

wasmer-bus

Invocation bus for web assembly modules

1 stable release

1.1.0 Aug 8, 2022

#1579 in WebAssembly

Download history 16/week @ 2024-04-07 14/week @ 2024-04-14 90/week @ 2024-04-21 39/week @ 2024-04-28 15/week @ 2024-05-05 20/week @ 2024-05-12 21/week @ 2024-05-19 27/week @ 2024-05-26 25/week @ 2024-06-02 12/week @ 2024-06-09 19/week @ 2024-06-16 20/week @ 2024-06-23 4/week @ 2024-06-30 12/week @ 2024-07-07 24/week @ 2024-07-14 12/week @ 2024-07-21

52 downloads per month
Used in 12 crates (6 directly)

MIT/Apache

94KB
2.5K SLoC

WASM General Purpose Bus

The WASM Genernal Purpose Bus implements a standard syscall interface for WebAssembly libraries and executables to use to invoke and receive calls between WASM modules and/or operating system functions.

Currently the WASM Bus is supported by the following runtimes:

Functionality supported by this BUS includes

  • Web Socket connections
  • HTTP and HTTPS calls
  • Spawning sub-processes
  • Thread sleeping and timeouts
  • Asynchronous Runtime Engine
  • Client side invocation of WASM modules

TODO

  • Spawning threads
  • Multi-threaded Runtime Engine
  • Universal Logging
  • Server side invocation of WASM modules

Backend Implementations

In order to implment this BUS on your runtime one needs to chain to the ABI exposed in this library and implement the functions.

For a reference implementation see below:

https://github.com/wasmerio/ate/tree/master/wasmer_term/src/bus

Example API

Below is a simple example of how to emit the helper classes and serialization objects for a specific API

use wasmer_bus::macros::*;

#[wasmer_bus(format = "json")]
pub trait Time {
    async fn sleep(&self, duration_ms: u128);
}

Relative Objects

It is also possible to emit a series of sub-apis that carry with them some specific context

use serde::*;
use std::sync::Arc;
use wasmer_bus::macros::*;

#[wasmer_bus(format = "bincode")]
pub trait SocketBuilder {
    async fn connect(
        &self,
        url: String,
        state_change: impl Fn(SocketState),
        receive: impl Fn(Vec<u8>),
    ) -> Arc<dyn WebSocket>;
}

#[wasmer_bus(format = "bincode")]
pub trait WebSocket {
    async fn send(&self, data: Vec<u8>) -> SendResult;
}

Testing

You can test your WASI program by uploading it to wapm.io and then heading over to the Wasmer Shell

https://wasmer.sh

Dependencies

~4–10MB
~99K SLoC