[][src]Crate napi

High level NodeJS N-API binding

napi-rs provides minimal overhead to write N-API modules in Rust.

Feature flags

libuv

With libuv feature, you can execute a rust future in libuv in NodeJS, and return a promise object.

use std::thread;
use std::fs;

use futures::prelude::*;
use futures::channel::oneshot;
use napi::{CallContext, Result, JsString, JsObject, Status, Error};

#[js_function(1)]
pub fn uv_read_file(ctx: CallContext) -> Result<JsObject> {
    let path = ctx.get::<JsString>(0)?;
    let (sender, receiver) = oneshot::channel();
    let p = path.as_str()?.to_owned();
    thread::spawn(|| {
        let res = fs::read(p).map_err(|e| Error::new(Status::Unknown, format!("{}", e)));
        sender.send(res).expect("Send data failed");
    });
    ctx.env.execute(receiver.map_err(|e| Error::new(Status::Unknown, format!("{}", e))).map(|x| x.and_then(|x| x)), |&mut env, data| {
        env.create_buffer_with_data(data)
    })
}

tokio_rt

With tokio_rt feature, napi-rs provides a tokio runtime in an additional thread. And you can easily run tokio future in it and return promise.

use futures::prelude::*;
use napi::{CallContext, Error, JsObject, JsString, Result, Status};
use tokio;

#[js_function(1)]
pub fn tokio_readfile(ctx: CallContext) -> Result<JsObject> {
    let js_filepath = ctx.get::<JsString>(0)?;
    let path_str = js_filepath.as_str()?;
    ctx.env.execute_tokio_future(
        tokio::fs::read(path_str.to_owned())
          .map(|v| v.map_err(|e| Error::new(Status::Unknown, format!("failed to read file, {}", e)))),
        |&mut env, data| env.create_buffer_with_data(data),
    )
}

Tokio channel in napi-rs buffer size is default 100.

You can adjust it via NAPI_RS_TOKIO_CHANNEL_BUFFER_SIZE environment variable

NAPI_RS_TOKIO_CHANNEL_BUFFER_SIZE=1000 node ./app.js

latin1

Decode latin1 string from JavaScript using encoding_rs.

With this feature, you can use JsString.as_latin1_string function

serde-json

Enable Serialize/Deserialize data cross JavaScript Object and Rust struct.

#[derive(Serialize, Debug, Deserialize)]
struct AnObject {
    a: u32,
    b: Vec<f64>,
    c: String,
}

#[js_function(1)]
fn deserialize_from_js(ctx: CallContext) -> Result<JsUndefined> {
    let arg0 = ctx.get::<JsUnknown>(0)?;
    let de_serialized: AnObject = ctx.env.from_js_value(arg0)?;
    ...
}

#[js_function]
fn serialize(ctx: CallContext) -> Result<JsUnknown> {
    let value = AnyObject { a: 1, b: vec![0.1, 2.22], c: "hello" };
    ctx.env.to_js_value(&value)
}

Re-exports

pub use napi_sys as sys;

Modules

threadsafe_function

Macros

register_moduleDeprecated

Deprecated register nodejs module

Structs

CallContext

Function call context

CleanupEnvHook
Env
Error
EscapableHandleScope
ExtendedErrorInfo
JsArrayBuffer
JsArrayBufferValue
JsBigint
JsBoolean
JsBuffer
JsBufferValue
JsDataView
JsDataViewValue
JsDate
JsError
JsExternal
JsFunction
JsGlobal
JsNull
JsNumber
JsObject
JsRangeError
JsString
JsStringLatin1
JsStringUtf8
JsStringUtf16
JsSymbol
JsTimeout
JsTypeError
JsTypedArray
JsTypedArrayValue
JsUndefined
JsUnknown
Module
NodeVersion
Property
Ref

Enums

Either
KeyCollectionMode
KeyConversion
KeyFilter
PropertyAttributes
Status
TypedArrayType
ValueType

Traits

NapiValue
Task

Functions

shutdown_tokio_rt

Type Definitions

Callback
ContextlessResult
Result