ssvm-napi

0.4.0 • Public • Published

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 ssvm-napi@0.4.0 --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 ]

Readme

Keywords

none

Package Sidebar

Install

npm i ssvm-napi

Weekly Downloads

1

Version

0.4.0

License

Apache-2.0

Unpacked Size

6.33 MB

Total Files

588

Last publish

Collaborators

  • hydai