
Security News
Browserslist-rs Gets Major Refactor, Cutting Binary Size by Over 1MB
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
node-addon-api
Advanced tools
The node-addon-api package is a helper library for building Node.js Addons in C++. It provides a C++ API that abstracts away the complexities of working with the low-level V8 and N-API provided by Node.js, making it easier to develop native addons.
Object Wrapping
Object wrapping allows C++ classes to be represented as JavaScript objects. It provides an easy way to create and manage objects that have a one-to-one relationship with C++ objects.
Napi::ObjectReference MyClass::constructor;
MyClass::MyClass(const Napi::CallbackInfo& info) : Napi::ObjectWrap<MyClass>(info) {
// constructor implementation
}
Napi::Object MyClass::Init(Napi::Env env, Napi::Object exports) {
Napi::HandleScope scope(env);
Napi::Function func = DefineClass(env, "MyClass", {
InstanceMethod("myMethod", &MyClass::MyMethod)
});
constructor = Napi::Persistent(func);
constructor.SuppressDestruct();
exports.Set("MyClass", func);
return exports;
}
Function Arguments
The package provides a way to handle function arguments passed from JavaScript to C++ with type checking and conversion utilities.
Napi::Value MyFunction(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 2) {
Napi::TypeError::New(env, "Expected at least two arguments").ThrowAsJavaScriptException();
}
Napi::String arg0 = info[0].As<Napi::String>();
double arg1 = info[1].As<Napi::Number>().DoubleValue();
// function implementation
return Napi::String::New(env, "result");
}
Asynchronous Operations
node-addon-api provides utilities for performing asynchronous operations, allowing long-running tasks to be executed without blocking the Node.js event loop.
class MyAsyncWorker : public Napi::AsyncWorker {
public:
MyAsyncWorker(Napi::Function& callback) : AsyncWorker(callback) {}
void Execute() override {
// Do work in another thread
}
void OnOK() override {
Napi::HandleScope scope(Env());
Callback().Call({Env().Null(), Napi::String::New(Env(), "Success")});
}
};
Napi::Value RunAsyncWork(const Napi::CallbackInfo& info) {
Napi::Function callback = info[0].As<Napi::Function>();
MyAsyncWorker* worker = new MyAsyncWorker(callback);
worker->Queue();
return info.Env().Undefined();
}
The 'nan' package is a header file filled with macros and utilities for making addon development for different versions of V8 easier. It predates N-API and node-addon-api, and while it's still used, node-addon-api is recommended for most cases due to its simpler API and direct support for N-API.
The 'ffi-napi' package allows for calling foreign functions of dynamic libraries from Node.js. It is similar to node-addon-api in that it allows for native functionality in Node.js, but it focuses on interfacing with existing libraries rather than writing new native modules.
The 'neon' package is a Rust framework for writing safe and fast native Node.js modules. Like node-addon-api, it simplifies the process of writing native addons but does so using Rust instead of C++.
This module contains header-only C++ wrapper classes which simplify the use of the C based N-API provided by Node.js when using C++. It provides a C++ object model and exception handling semantics with low overhead.
N-API is an ABI stable C interface provided by Node.js for building native addons. It is independent from the underlying JavaScript runtime (e.g. V8 or ChakraCore) and is maintained as part of Node.js itself. It is intended to insulate native addons from changes in the underlying JavaScript engine and allow modules compiled for one version to run on later versions of Node.js without recompilation.
The node-addon-api
module, which is not part of Node.js, preserves the benefits
of the N-API as it consists only of inline code that depends only on the stable API
provided by N-API. As such, modules built against one version of Node.js
using node-addon-api should run without having to be rebuilt with newer versions
of Node.js.
It is important to remember that other Node.js interfaces such as
libuv
(included in a project via #include <uv.h>
) are not ABI-stable across
Node.js major versions. Thus, and addon must use N-API and/or node-addon-api
exclusively and build against a version of Node.js that includes an
implementation of N-API (meaning a version of Node.js newer than 6.14.2) in
order to benefit from ABI stability across Node.js major versions.
As new APIs are added to N-API, node-addon-api must be updated to provide wrappers for those new APIs. For this reason node-addon-api provides methods that allow callers to obtain the underlying N-API handles so direct calls to N-API and the use of the objects/methods provided by node-addon-api can be used together. For example, in order to be able to use an API for which the node-add-api does not yet provide a wrapper.
APIs exposed by node-addon-api are generally used to create and manipulate JavaScript values. Concepts and operations generally map to ideas specified in the ECMA262 Language Specification.
(See CHANGELOG.md for complete Changelog)
The following is the documentation for node-addon-api.
Are you new to node-addon-api? Take a look at our examples
To run the node-addon-api tests do:
npm install
npm test
To avoid testing the deprecated portions of the API run
npm install
npm test --disable-deprecated
Take a look and get inspired by our test suite
Name | GitHub link |
---|---|
Anna Henningsen | addaleax |
Arunesh Chandra | aruneshchandra |
Benjamin Byholm | kkoopa |
Gabriel Schulhof | gabrielschulhof |
Hitesh Kanwathirtha | digitalinfinity |
Jason Ginchereau | jasongin |
Michael Dawson | mhdawson |
Nicola Del Gobbo | NickNaso |
Sampson Gao | sampsongao |
Taylor Woll | boingoing |
Licensed under MIT
2018-10-03 Version 1.5.0, @NickNaso
Napi::AsyncContext
class to handle asynchronous operation.Napi::BigInt
class to work with BigInt type.Napi::VersionManagement
class to retrieve the versions of Node.js and N-API.Napi::FunctionReference
.Napi::Promise::Deferred
2009c019af
] - Merge pull request #292 from devsnek/feature/bigint (Gus Caplan)e44aca985e
] - add bigint class (Gus Caplan)a3951ab973
] - Add documentation for Env(). (Rolf Timmermans) #318a6f7a6ad51
] - Add Env() to Promise::Deferred. (Rolf Timmermans)0097e96b92
] - Fixed broken links for Symbol and String (NickNaso)b0ecd38d76
] - Fix Code of conduct link properly (#323) (Jake Yoon) #323223474900f
] - doc: update Version management (Dongjin Na) #3604f76262a10
] - doc: some fix on Napi::Boolean
documentation (NickNaso) #35478374f72d2
] - doc: number documentation (NickNaso) #35651ffe453f8
] - doc: doc cleanup (NickNaso) #353fc11c944b2
] - doc: major doc cleanup (NickNaso) #335100d0a7cb2
] - doc: first pass on objectwrap documentation (NickNaso) #321c7d54180ff
] - doc: the Napi::ObjectWrap example does not compile (Arnaud Botella) #3397cdd78726a
] - doc: added cpp highlight for string.md (Jaeseok Yoon) #3298ed29f547c
] - doc: add blurb about ABI stability (Gabriel Schulhof) #326757eb1f5a3
] - doc: add function and function reference doc (NickNaso) #2992885c18591
] - doc: Create changelog for release 1.4.0 (Nicola Del Gobbo)917bd60baa
] - src: remove TODOs by fixing memory leaks (Gabriel Schulhof) #343dfcb93945f
] - src: implement AsyncContext class (Jinho Bang) #252211ed38d0d
] - src: make 'nothing' target a static library (Gabriel Schulhof) #34897c4ab5cf2
] - src: add Call and MakeCallback that accept cargs (NickNaso) #344b6e2d92c09
] - src: enable DataView feature by default (Jinho) #3310a00e7c97b
] - src: implement missing descriptor defs for symbols (Philipp Renoth) #28038e01b7e3b
] - src: first pass on adding version management apis (NickNaso) #32579ee8381d2
] - src: fix compile failure in test (Michael Dawson) #3454d92a6066f
] - src: Add ObjectReference test case (Anisha Rohra) #212779560f397
] - test: add operator overloading tests in Number (Your Name) #35573fed84ceb
] - test: add ability to control experimental tests (Michael Dawson) #35014c69abd46
] - test: write tests for Boolean class (Jaeseok Yoon) #3282ad47a83b1
] - test: explicitly cast to uint32_t in test (Gabriel Schulhof) #341622ffaea76
] - test: Tighten up compiler warnings (Mikhail Cheshkov) #315fd3c37b0f2
] - tools: add tool to check for N-API modules (Gabriel Schulhof) #346FAQs
Node.js API (Node-API)
The npm package node-addon-api receives a total of 31,792,968 weekly downloads. As such, node-addon-api popularity was classified as popular.
We found that node-addon-api demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 7 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
Research
Security News
Eight new malicious Firefox extensions impersonate games, steal OAuth tokens, hijack sessions, and exploit browser permissions to spy on users.
Security News
The official Go SDK for the Model Context Protocol is in development, with a stable, production-ready release expected by August 2025.