1 stable release
1.1.0 | Aug 8, 2022 |
---|
#1544 in WebAssembly
63 downloads per month
Used in 12 crates
(6 directly)
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:
- Wasmer Terminal (https://wasmer.sh/)
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
Dependencies
~5–11MB
~119K SLoC