second-state / wasmedge-core

WasmEdge Node.js Addon
Apache License 2.0
6 stars 6 forks source link

WasmEdge for Node.js Addon

The WasmEdge (previously known as Second State VM, SSVM) is a high-performance WebAssembly runtime optimized for server-side applications. This project provides support for accessing WasmEdge as a Node.js addon. It allows Node.js applications to call WebAssembly functions written in Rust or other high-performance languages. Why do you want to run WebAssembly on the server-side? The WasmEdge addon could interact with the wasm files generated by the rustwasmc compiler tool.

NOTICE

In the current stage, our prebuilt version only supports x86_64 and aarch64 Linux. Or you could use --build-from-source flag to build from the source during addon installation.

WasmEdge versions

There are mappings of wasmedge-core versoins and corresponding WasmEdge versions:

wasmedge-core WasmEdge
0.8.1 0.8.1
0.8.2-rc.1 0.8.1
0.8.2 0.8.2
0.8.3 0.8.2
0.9.0-rc.1 0.9.0-rc.1
0.9.0 0.9.0

Development Requirements

Users should install the dependencies by the following requirments:

Prepare the environment

Use our docker image (recommended)

docker pull wasmedge/wasmedge

For ubuntu 20.04

# Tools and libraries
sudo apt install -y \
    software-properties-common \
    cmake \
    libboost-all-dev

# And you will need to install llvm for wasmedge-aot tools
sudo apt install -y \
    llvm-dev \
    liblld-10-dev

# WasmEdge supports both clang++ and g++ compilers
# You can choose one of them for building this project
sudo apt install -y gcc g++
sudo apt install -y clang

Verify the version of llvm

sudo apt list | grep llvm

# Expected output
...omitted...
llvm-dev/focal,now 1:10.0-50~exp1 amd64 [installed]
llvm-runtime/focal,now 1:10.0-50~exp1 amd64 [installed,automatic]
llvm/focal,now 1:10.0-50~exp1 amd64 [installed,automatic]
...omitted...

# If the version is 1:10.x, then your llvm version is correct.

Verify the version of libstdc++6

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

# Expected output
...omitted...
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH

# If you can find GLIBCXX_3.4.28 in the output, then your libstdc++6 version is correct.

Running on MacOS Darwin

To run on MacOS you will need to build from source by following the steps mentioned below,

Works with Rust library using Wasm-Bindgen

Please refer to Tutorial: A Wasm-Bindgen application.

Works with Rust application using standalone wasm32-wasi backend

Please refer to Tutorial: A standalone wasm32-wasi application.

APIs

Constructor: wasmedge.VM(wasm, wasmedge_options) -> vm_instance

Methods

Start() -> Integer

Run(function_name, args...) -> void

RunInt(function_name, args...) -> Integer

RunUInt(function_name, args...) -> Integer

RunInt64(function_name, args...) -> BigInt

RunUInt64(function_name, args...) -> BigInt

RunString(function_name, args...) -> String

RunUint8Array(function_name, args...) -> Uint8Array

Compile(output_filename) -> boolean

// When you want to run the compiled file let vm = wasmedge.VM("/path/to/aot/file", options); vm.RunXXX("Func", args);


#### `GetStatistics() -> Object`
* If you want to enable measurement, set the option `EnableMeasurement` to `true`. But please notice that enabling measurement will significantly affect performance.
* Get the statistics of execution runtime.
* Return Value `Statistics` <Object>
    * `Measure` -> <Boolean>: To show if the measurement is enabled or not.
    * `TotalExecutionTime` -> <Integer>: Total execution time (Wasm exeuction time + Host function execution time) in `` unit.
    * `WasmExecutionTime` -> <Integer>: Wasm instructions execution time in `ns` unit.
    * `HostFunctionExecutionTime` -> <Integer>: Host functions (e.g. eei or wasi functions) execution time in `ns` unit.
    * `InstructionCount` -> <Integer>: The number of executed instructions in this execution.
    * `TotalGasCost` -> <Integer>: The cost of this execution.
    * `InstructionPerSecond` -> <Float>: The instructions per second of this execution.

```javascript
let result = RunInt("Add", 1, 2);
// result should be 3
let stat = GetStatistics();
/*
If the `EnableMeasurement: true`:

stat = Statistics:  {
  Measure: true,
  TotalExecutionTime: 1512,
  WasmExecutionTime: 1481,
  HostFunctionExecutionTime: 31,
  InstructionCount: 27972,
  TotalGasCost: 27972,
  InstructionPerSecond: 18887238.35246455
}

Else:

stat = Statistics:  {
  Measure: false
}
*/