ssvm-napi
v0.4.0
Published
SSVM Node.js Addons
Downloads
2
Readme
SSVM Node.js Addon
In this example, we setup a string
hello world WASM demo and demonstrate interaction with the SSVM addon. Since the string
type is NOT natively supported by WASM, our SSVM addon could interact with the wasm files generated by wasm-pack
and wasm-bindgen
.
Setup for Rust utilities
apt-get update
apt install -y apache2 build-essential
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
Create new project
cargo new --lib hello
cd hello
Change the cargo config file
Add the following to the Cargo.toml
file.
[lib]
name = "hello"
path = "src/lib.rs"
crate-type =["cdylib"]
[dependencies]
wasm-bindgen = "0.2.50"
Write Rust code
Below is the entire content of the src/lib.rs
file.
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn say(s: String) -> String {
let r = String::from("hello ");
return r + &s;
}
#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
return a + b;
}
#[wasm_bindgen]
pub fn reverse(v: Vec<u8>) -> Vec<u8> {
let mut r = v.clone();
r.reverse();
return r;
}
Build the WASM bytecode
wasm-pack build --target nodejs
After building, our target wasm file is located at pkg/hello_bg.wasm
.
Setup for SSVM addon
# Dependencies for SSVM-core
apt update && apt install -y \
libboost-all-dev
npm install -g [email protected] --unsafe-perm
Use SSVM addon
After building SSVM addon, we could now interact with hello_bg.wasm
generated by wasm-pack in Node.js.
Make sure you use the corresponding vm method to rust return type.
- Create a new folder to setup execution environment. (e.g.
mkdir application
) - Copy
hello_bg.wasm
into your application directory. (e.g.cp hello_gb.wasm <path_to_your_application_folder>
) - Create js file
main.js
(or whatever you like) with the following content:
var ssvm = require('ssvm-napi');
var vm = new ssvm.VM("hello_bg.wasm")
var ret = vm.RunString("say", "world");
console.log(ret);
ret = vm.RunInt("add", 3, 4);
console.log(ret);
ret = vm.RunUint8Array("reverse", Uint8Array.from([1, 2, 3]));
console.log(ret);
- Run
main.js
node main.js
...ommited...
hello world
...ommited...
7
...ommited...
Uint8Array(3) [ 3, 2, 1 ]