Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork347
A framework for building compiled Node.js add-ons in Rust via Node-API
License
napi-rs/napi-rs
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
This project was initialized fromxray
A framework for building compiledNode.js add-ons inRust via Node-API. Website:https://napi.rs
Rust1.88.0
| node12 | node14 | node16 | node18 | node20 | node22 | |
|---|---|---|---|---|---|---|
| Windows x64 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Windows x86 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Windows arm64 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| macOS x64 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| macOS aarch64 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux x64 gnu | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux x64 musl | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux aarch64 gnu | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux aarch64 musl | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux arm gnueabihf | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux arm muslebihf | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux powerpc64le gnu | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux s390x gnu | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux loong64 gnu | N/A | N/A | N/A | ✓ | ✓ | ✓ |
| Linux riscv64 gnu | N/A | N/A | ✓ | ✓ | ✓ | ✓ |
| Linux aarch64 android | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Linux armv7 android | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| FreeBSD x64 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
This library depends on Node-API and requiresNode@10.0.0 or later.
We already have some packages written bynapi-rs:node-rs
One nice feature is that this crate allows you to build add-ons purely with theRust/JavaScript toolchain and without involvingnode-gyp.
You can start frompackage-template to play with
napi-rs
use napi::bindgen_prelude::*;use napi_derive::napi;/// module registration is done by the runtime, no need to explicitly do it now.#[napi]pubfnfibonacci(n:u32) ->u32{match n{1 |2 =>1, _ =>fibonacci(n -1) +fibonacci(n -2),}}/// use `Fn`, `FnMut` or `FnOnce` traits to defined JavaScript callbacks/// the return type of callbacks can only be `Result`.#[napi]pubfnget_cwd<T:Fn(String) ->Result<()>>(callback:T){callback( std::env::current_dir().unwrap().to_string_lossy().to_string(),).unwrap();}/// or, define the callback signature in where clause#[napi]pubfntest_callback<T>(callback:T) ->Result<()>whereT:Fn(String) ->Result<()>,{callback(std::env::current_dir()?.to_string_lossy().to_string())}/// async fn, require `async` feature enabled./// [dependencies]/// napi = {version="2", features=["async"]}#[napi]pubasyncfnread_file_async(path:String) ->Result<Buffer>{Ok(tokio::fs::read(path).await?.into())}
more examples atexamples
This repository is aCargo crate. Any napi-based add-on should containCargo.toml to make it a Cargo crate.
In yourCargo.toml you need to set thecrate-type to"cdylib" so that cargo builds a C-style shared library that can be dynamically loaded by the Node executable. You'll also need to add this crate as a dependency.
[package]name ="awesome"[lib]crate-type = ["cdylib"][dependencies]napi ="3"napi-derive ="3"[build-dependencies]napi-build ="1"
And createbuild.rs in your own project:
// build.rsexterncrate napi_build;fnmain(){ napi_build::setup();}
So far, thenapi build script has only been tested onmacOSLinuxWindows x64 MSVC andFreeBSD.
Install the@napi-rs/cli to help you build yourRust codes and copyDynamic lib file to.node file in case you canrequire it in your program.
{"package":"awesome-package","devDependencies":{"@napi-rs/cli":"^1.0.0"},"napi":{"name":"jarvis"// <----------- Config the name of native addon, or the napi command will use the name of `Cargo.toml` for the binary file name.},"scripts":{"build":"napi build --release","build:debug":"napi build"}}
Then you can require your native binding:
require('./jarvis.node')
Themodule_name would be yourpackage name in yourCargo.toml.
xxx => ./xxx.node
xxx-yyy => ./xxx_yyy.node
You can also copyDynamic lib file to an appointed location:
napi build [--release] ./dllnapi build [--release] ./artifacts
There aredocuments which contains more details about the@napi-rs/cli usage.
Because libraries that depend on this crate must be loaded into a Node executable in order to resolve symbols, all tests are written in JavaScript in thetest_module subdirectory.
To run tests:
yarn build:testyarntest| Rust Type | Node Type | NAPI Version | Minimal Node version | Enable bynapi feature |
|---|---|---|---|---|
| u32 | Number | 1 | v8.0.0 | |
| i32/i64 | Number | 1 | v8.0.0 | |
| f64 | Number | 1 | v8.0.0 | |
| bool | Boolean | 1 | v8.0.0 | |
| String/&'a str | String | 1 | v8.0.0 | |
| Latin1String | String | 1 | v8.0.0 | latin1 |
| UTF16String | String | 1 | v8.0.0 | |
| Object | Object | 1 | v8.0.0 | |
| serde_json::Map | Object | 1 | v8.0.0 | serde-json |
| serde_json::Value | any | 1 | v8.0.0 | serde-json |
| Array | Array | 1 | v8.0.0 | |
| Vec | Array | 1 | v8.0.0 | |
| Buffer | Buffer | 1 | v8.0.0 | |
| External | External | 1 | v8.0.0 | |
| Null | null | 1 | v8.0.0 | |
| Undefined/() | undefined | 1 | v8.0.0 | |
| Result<()> | Error | 1 | v8.0.0 | |
| T: Fn(...) -> Result | Function | 1 | v8.0.0 | |
| Async/Future | Promise | 4 | v10.6.0 | async |
| AsyncTask | Promise | 1 | v8.5.0 | |
| JsGlobal | global | 1 | v8.0.0 | |
| JsSymbol | Symbol | 1 | v8.0.0 | |
| Int8Array/Uint8Array ... | TypedArray | 1 | v8.0.0 | |
| JsFunction | threadsafe function | 4 | v10.6.0 | napi4 |
| BigInt | BigInt | 6 | v10.7.0 | napi6 |
About
A framework for building compiled Node.js add-ons in Rust via Node-API
Topics
Resources
License
Code of conduct
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Packages0
Uh oh!
There was an error while loading.Please reload this page.