a61ddfc404
* add js wasm backend crate + blank trait impls * make wasmtime a default feature for runtime and core * WIP: mock WASI, greeting almost works * WIP: added @wasmer/wasi, moved some stuff to JsStore, implementing Caller * finalize Caller * remove old code * changing js API + fmt * update wasm-bindgen generated and patched code * update call_module to throw error, fix non-logging tests * add multi-module test + update js api * fix last element getting * refactor interface + pass envs * get rid of make_*_result * small refactor * support passing log function * get rid of some todos * use String instead of Vec<u8> for wasi envs * use Strings for wasi envs in marine js * little fix * self-review fixes, import ordering * self-review fixes, import ordering * make clippy happy + fmt * self-review fixes * self-review fixes * self-review fixes * revert example artifact change * pr fixes * add __wbg_adapter_N updating code * add all-types test * fix build * update marine_js.js * Fix I64 handling * pr fixes * fix import order * add copyrights * Add comments, slightly beautify code * fmt * make clippy happy * update js interface * split function interface, improve naming * update Cargo.lock * update to new wasm-backend traits * wip * js glue code update * improve comment * use typed index collection * Add more comments * Add more comments * Fix warnings * pr fixes * pr fixes |
||
---|---|---|
.cargo | ||
.github | ||
core | ||
crates | ||
docs | ||
examples | ||
images | ||
marine | ||
marine-js | ||
tools | ||
.gitignore | ||
.rustfmt.toml | ||
Cargo.lock | ||
Cargo.toml | ||
CHANGELOG.md | ||
CONTRIBUTING.md | ||
LICENSE | ||
README.md | ||
rust-toolchain.toml |
Marine
Marine is a modern general purpose Wasm runtime based on the component model capable of running multi-module Wasm applications, aka services, with interface-types and a shared-nothing linking scheme. This execution model is well suited for a variety of scenarios and especially applicable to implementations following the entity component system (ECS) pattern or plugin-based architectures.
Fluence peers, such as Fluence Rust node, include Marine to execute the hosted Wasm services composed with Aqua.
Motivational example
To illustrate the capabilities of Marine, let's have a look at a multi-module Wasm service as implemented in this example.
cd
into the examples/motivational-example
directory and have a look at the shrek/src/main.rs
file:
// examples/motivational-example/shrek/src/main.rs
use marine_rs_sdk::marine;
fn main() {}
#[marine]
pub fn greeting(name: &str) -> Vec<String> {
let donkey_greeting = donkey::greeting(name); // 1
let shrek_greeting = format!("Shrek: hi, {}", name); // 2
vec![shrek_greeting, donkey_greeting]
}
mod donkey { // 3
use super::*;
#[marine]
#[link(wasm_import_module = "donkey")] // 4
extern "C" {
pub fn greeting(name: &str) -> String;
}
}
In this Marine (Wasm) module (and namespace) shrek
, we declare a function greeting
that creates a donkey_greeting
(1) from the donkey
module's (3)greeting
function, which itself is dependent on importing the donkey
Wasm module with Rust's FFI link
(4) from donkey/src/main.rs
(see below).
// examples/motivational-example/donkey/src/main.rs
use marine_rs_sdk::marine;
fn main() {}
#[marine]
pub fn greeting(name: &str) -> String {
format!("Donkey: hi, {}", name)
}
In summary, our example is comprised of two independent Wasm modules, shrek
and donkey
, and illustrates how to link one module into another one, i.e., use the donkey
module in the shrek
module. Please note that the shrek
module is called a facade module following the facade pattern and there can only be one facade module per service.
Make sure you have the Marine tools installed and compile the donkey
and shrek
, respectively, which we can do with the build.sh
script:
$> ./build.sh
which creates two independent Wasm modules that are placed in the artifacts
directory:
$> ls artifacts
donkey.wasm shrek.wasm
Now that we have our modules, we can explore them with the Marine REPL. Note that we use the Config.toml
file to help out the REPL by providing the module location and names. Once we got the REPL up and running, we can interact with both modules and, as expected, the shrek
module is successfully able to access the donkey
module's exposed functions.
$> marine mrepl Config.toml
...
1> interfaces
Loaded modules interface:
shrek:
fn greeting(name: string) -> []string
donkey:
fn greeting(name: string) -> string
2> call donkey greeting "no link module"
result: String("Donkey: hi, no link module")
elapsed time: 42.985µs
3> call donkey greeting "facade with link module"
result: String("Donkey: hi, facade with link module")
elapsed time: 39.25µs
4> q
Looks like everything is in order and the modules are ready for deployment to the network and composition with Aqua.
Documentation
Do not forget to check our YouTube channel.
Repository structure
- crates
- it-generator: a generator of IT
- it-interfaces: a handy structure for interface types handling
- it-json-serde: a crate for conversion between IT and JSON
- min-it-version keeps minimal supported versions of IT and SDK by runtime
- module-info-parser: a parser of the module manifest and the SDK version
- module-interface: a parser of module IT
- utils: some utility functions and consts
- examples: several Marine examples used mostly for tests
- fluence-faas: a Fluence FaaS layer that provides host closures, IT<->JSON conversion, logger, config handling and other things
- fluence-app-service: a Fluence Application Service layer that provides basic API for service running
- runtime: a runtime layer that provides basic functionality for loading, unloading and calling modules
- marine-js: a web runtime layer aimed to run Marine in a browser
- tools
Support
Please, file an issue if you find a bug. You can also contact us at Discord or Telegram. We will do our best to resolve the issue ASAP.
Contributing
Any interested person is welcome to contribute to the project. Please, make sure you read and follow some basic rules.
License
All software code is copyright (c) Fluence Labs, Inc. under the Apache-2.0 license.