GithubHelp home page GithubHelp logo

website's Introduction

napi-rs

This project was initialized from xray

A framework for building compiled Node.js add-ons in Rust via Node-API. Website: https://napi.rs

chat Stake to support us

Platform Support

Test & Release FreeBSD Address Sanitizer Memory Leak Detect

MSRV

Rust 1.65.0

node12 node14 node16 node18 node20
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 riscv64 gnu N/A N/A
Linux aarch64 android
Linux armv7 android
FreeBSD x64

This library depends on Node-API and requires [email protected] or later.

We already have some packages written by napi-rs: node-rs

One nice feature is that this crate allows you to build add-ons purely with the Rust/JavaScript toolchain and without involving node-gyp.

Taste

You can start from package-template to play with napi-rs

Define JavaScript functions

/// import the preludes
use napi::bindgen_prelude::*;
use napi_derive::napi;

/// module registration is done by the runtime, no need to explicitly do it now.
#[napi]
fn fibonacci(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]
fn get_cwd<T: Fn(String) -> Result<()>>(callback: T) {
  callback(env::current_dir().unwrap().to_string_lossy().to_string()).unwrap();
}

/// or, define the callback signature in where clause
#[napi]
fn test_callback<T>(callback: T)
where T: Fn(String) -> Result<()>
{}

/// async fn, require `async` feature enabled.
/// [dependencies]
/// napi = {version="2", features=["async"]}
#[napi]
async fn read_file_async(path: String) -> Result<Buffer> {
  tokio::fs::read(path)
    .map(|r| match r {
      Ok(content) => Ok(content.into()),
      Err(e) => Err(Error::new(
        Status::GenericFailure,
        format!("failed to read file, {}", e),
      )),
    })
    .await
}

more examples at examples

Building

This repository is a Cargo crate. Any napi-based add-on should contain Cargo.toml to make it a Cargo crate.

In your Cargo.toml you need to set the crate-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 create build.rs in your own project:

// build.rs
extern crate napi_build;

fn main() {
  napi_build::setup();
}

So far, the napi build script has only been tested on macOS Linux Windows x64 MSVC and FreeBSD.

Install the @napi-rs/cli to help you build your Rust codes and copy Dynamic lib file to .node file in case you can require 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')

The module_name would be your package name in your Cargo.toml.

xxx => ./xxx.node

xxx-yyy => ./xxx_yyy.node

You can also copy Dynamic lib file to an appointed location:

napi build [--release] ./dll
napi build [--release] ./artifacts

There are documents which contains more details about the @napi-rs/cli usage.

Testing

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 the test_module subdirectory.

To run tests:

yarn build:test
yarn test

Related projects

Features table

Rust Type Node Type NAPI Version Minimal Node version Enable by napi 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

website's People

Contributors

adamdbradley avatar aml360 avatar arnau avatar brooooooklyn avatar chentsulin avatar doodlewind avatar g-plane avatar hankszhang avatar huozhi avatar jbolda avatar jjangga0214 avatar jose-acevedoflores avatar lvqq avatar matchai avatar micalevisk avatar michaeljones avatar mkusaka avatar overlookmotel avatar oyyd avatar probablykasper avatar promer94 avatar reconbot avatar renovate[bot] avatar sachinraja avatar samvdst avatar shuding avatar suica avatar superchupudev avatar thebrenny avatar timfish avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

website's Issues

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

npm
package.json
  • @mdx-js/react ^2.3.0
  • @vercel/analytics ^1.0.0
  • lodash-es ^4.17.21
  • next 13.4.13
  • nextra 2.10.0
  • nextra-theme-docs 2.10.0
  • react ^18.2.0
  • react-dom ^18.2.0
  • @perfsee/webpack ^1.5.0
  • @types/node ^18.15.5
  • @types/react ^18.0.28
  • @types/sharp ^0.31.1
  • autoprefixer ^10.4.14
  • cross-env ^7.0.3
  • file-loader ^6.2.0
  • husky 8
  • lint-staged ^13.2.0
  • next-mdx-remote ^4.4.1
  • postcss ^8.4.21
  • prettier ^3.0.0
  • sharp ^0.32.0
  • tailwindcss ^3.2.7
  • typescript ^5.0.2
  • vercel ^31.0.0
  • yarn 3.6.1

  • Check this box to trigger a request for Renovate to run again on this repository

Feedback for “Class”

I'm trying to use napi-rs at the moment for a project and I'm generally very impressed and grateful for what you have created.

Yesterday I had the experience of getting quite confused about an error which said

the trait NapiValue is not implemented for MyValue

And I couldn't see anything about MyValue that would be causing the problem given how I was setting it up. It turned out that I had another struct with #[napi] which had a pub value: MyValue field and it was the pub that was triggering the error. It never should have been pub but I guess I typed it accidentally at some point. I realise it is hard to control the kind of errors that the compiler produces in this situation but I'm wondering if the docs could be extended to include a section about pub fields and their implications and the kind of error that I ran into.

I would be happy to try to provide some text or a PR if that would be useful.

Feedback for “Prepublish”

The description in the docs about prepublish is: Running some preparation for publishing NAPI-RS packages. is not helpful. At least there should be a warning that running prepublish command will publish all the platform packages to the NPM repository. I think you should more explicitly describe how the command works, similar to the artifacts page (some preparation doesn't explain much).

Feedback for “Prepublish – NAPI-RS”

Type Error: Cannot read property 'split' of undefined
at PrePublishCommand. (C:\Users\Administrator\AppData\Roaming\npm\node_modules@napi-rs\cli\scripts\index.js:135601:65)
at Generator.next ()
at fulfilled (C:\Users\Administrator\AppData\Roaming\npm\node_modules@napi-rs\cli\scripts\index.js:3454:58)
at processTicksAndRejections (internal/process/task_queues.js:95:5)
配置文件无误

docs(intro): GuideVideo is not loaded.

Hi!

As you can see in the screenshot, it's not loaded.
The error message(translated) is "Can not find supported MIME type video".

스크린샷 2022-08-25 오후 12 25 21

Info

  • firefox 103.0.2
  • chrome 104.0.5112.101 (arm64)
  • macOS Monterey 12.5
  • M1 Max

Thanks!

Feedback for “Home – NAPI-RS”

The README has a bullet point claiming "Zero copy data interactive between Rust & Node.js".
All data is copied into/out of the JS virtual machine by definition. Rust, like every other foreign interface, cannot directly access the JS heap without risking race conditions with garbage collection.
This claim should be removed or corrected.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.