GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing nodejs.org — Node-API | Node.js v26.13.1 Documentation Skip to content
Node-API#Stability: 2 - Stable Node-API (formerly N-API) is an API for building native Addons. It is independent from the underlying JavaScript runtime (for example, V8) and is maintained as part of Node.js itself. This API will be Application Binary Interface (ABI) stable across versions of Node.js. It is intended to insulate addons from changes in the underlying JavaScript engine and allow modules compiled for one major version to run on later major versions of Node.js without recompilation. The ABI Stability guide provides a more in-depth explanation. Addons are built/packaged with the same approach/tools outlined in the section titled C++ Addons. The only difference is the set of APIs that are used by the native code. Instead of using the V8 or Native Abstractions for Node.js APIs, the functions available in Node-API are used. APIs exposed by Node-API are generally used to create and manipulate JavaScript values. Concepts and operations generally map to ideas specified in the ECMA-262 Language Specification. The APIs have the following properties:
Writing addons in various programming languages#Node-API is a C API that ensures ABI stability across Node.js versions and different compiler levels. With this stability guarantee, it is possible to write addons in other programming languages on top of Node-API. Refer to language and engine bindings for more programming languages and engines support details.
The above
The end result is that the addon only uses the exported C APIs. Even though the addon is written in C++, it still gets the benefits of the ABI stability provided by the C Node-API. When using The Node-API Resource offers
an excellent orientation and tips for developers just getting started with
Node-API and Implications of ABI stability#Although Node-API provides an ABI stability guarantee, other parts of Node.js do not, and any external libraries used from the addon may not. In particular, none of the following APIs provide an ABI stability guarantee across major versions:
Thus, for an addon to remain ABI-compatible across Node.js major versions, it must use Node-API exclusively by restricting itself to using
and by checking, for all external libraries that it uses, that the external library makes ABI stability guarantees similar to Node-API. Enum values in ABI stability#All enum data types defined in Node-API should be considered as a fixed size
A new enum value will be added at the end of the enum definition. An enum value will not be removed or renamed. For an enum type returned from a Node-API function, or provided as an out
parameter of a Node-API function, the value is an integer value and an addon
should handle unknown values. New values are allowed to be introduced without
a version guard. For example, when checking For an enum type used in an in-parameter, the result of passing an unknown
integer value to Node-API functions is undefined unless otherwise documented.
A new value is added with a version guard to indicate the Node-API version in
which it was introduced. For example, For an enum type used in both in-parameters and out-parameters, new values are allowed to be introduced without a version guard. Building#Unlike modules written in JavaScript, developing and deploying Node.js native addons using Node-API requires an additional set of tools. Besides the basic tools required to develop for Node.js, the native addon developer requires a toolchain that can compile C and C++ code into a binary. In addition, depending upon how the native addon is deployed, the user of the native addon will also need to have a C/C++ toolchain installed. For Linux developers, the necessary C/C++ toolchain packages are readily available. GCC is widely used in the Node.js community to build and test across a variety of platforms. For many developers, the LLVM compiler infrastructure is also a good choice. For Mac developers, Xcode offers all the required compiler tools. However, it is not necessary to install the entire Xcode IDE. The following command installs the necessary toolchain:
For Windows developers, Visual Studio offers all the required compiler tools. However, it is not necessary to install the entire Visual Studio IDE. The following command installs the necessary toolchain:
The sections below describe the additional tools available for developing and deploying Node.js native addons. Build tools#Both the tools listed here require that users of the native addon have a C/C++ toolchain installed in order to successfully install the native addon. node-gyp#node-gyp is a build system based on the gyp-next tool and comes bundled with npm. node-gyp requires that Python be installed. Historically, node-gyp has been the tool of choice for building native addons. It has widespread adoption and documentation. However, some developers have run into limitations in node-gyp. CMake.js#CMake.js is an alternative build system based on CMake. CMake.js is a good choice for projects that already use CMake or for
developers affected by limitations in node-gyp. Uploading precompiled binaries#The three tools listed here permit native addon developers and maintainers to create and upload binaries to public or private servers. These tools are typically integrated with CI/CD build systems like Travis CI and AppVeyor to build and upload binaries for a variety of platforms and architectures. These binaries are then available for download by users who do not need to have a C/C++ toolchain installed. node-pre-gyp#node-pre-gyp is a tool based on node-gyp that adds the ability to upload binaries to a server of the developer's choice. node-pre-gyp has particularly good support for uploading binaries to Amazon S3. prebuild#prebuild is a tool that supports builds using either node-gyp or CMake.js. Unlike node-pre-gyp which supports a variety of servers, prebuild uploads binaries only to GitHub releases. prebuild is a good choice for GitHub projects using CMake.js. prebuildify#prebuildify is a tool based on node-gyp. The advantage of prebuildify is that the built binaries are bundled with the native addon when it's uploaded to npm. The binaries are downloaded from npm and are immediately available to the module user when the native addon is installed. Usage#In order to use the Node-API functions, include the file
This will opt into the default
This restricts the Node-API surface to just the functionality that was available in the specified (and earlier) versions. Some of the Node-API surface is experimental and requires explicit opt-in:
In this case the entire API surface, including any experimental APIs, will be available to the module code. Occasionally, experimental features are introduced that affect already-released and stable APIs. These features can be disabled by an opt-out:
where Node-API version matrix#Up until version 9, Node-API versions were additive and versioned independently from Node.js. This meant that any version was an extension to the previous version in that it had all of the APIs from the previous version with some additions. Each Node.js version only supported a single Node-API version. For example v18.15.0 supports only Node-API version 8. ABI stability was achieved because 8 was a strict superset of all previous versions. As of version 9, while Node-API versions continue to be versioned independently, an add-on that ran with Node-API version 9 may need code updates to run with Node-API version 10. ABI stability is maintained, however, because Node.js versions that support Node-API versions higher than 8 will support all versions between 8 and the highest version they support and will default to providing the version 8 APIs unless an add-on opts into a higher Node-API version. This approach provides the flexibility of better optimizing existing Node-API functions while maintaining ABI stability. Existing add-ons can continue to run without recompilation using an earlier version of Node-API. If an add-on needs functionality from a newer Node-API version, changes to existing code and recompilation will be needed to use those new functions anyway. In versions of Node.js that support Node-API version 9 and later, defining
This table may not be up to date in older streams, the most up to date information is in the latest API documentation in: Node-API version matrix
* Node-API was experimental. ** Node.js 8.0.0 included Node-API as experimental. It was released as Node-API version 1 but continued to evolve until Node.js 8.6.0. The API is different in versions prior to Node.js 8.6.0. We recommend Node-API version 3 or later. Each API documented for Node-API will have a header named The Node-APIs associated strictly with accessing ECMAScript features from native
code can be found separately in The Node.js-specific parts of an addon can be separated from the code that
exposes the actual functionality to the JavaScript environment so that the
latter may be used with multiple implementations of Node-API. In the example
below,
Environment life cycle APIs#Section Agents of the ECMAScript Language Specification defines the concept of an "Agent" as a self-contained environment in which JavaScript code runs. Multiple such Agents may be started and terminated either concurrently or in sequence by the process. A Node.js environment corresponds to an ECMAScript Agent. In the main process, an environment is created at startup, and additional environments can be created on separate threads to serve as worker threads. When Node.js is embedded in another application, the main thread of the application may also construct and destroy a Node.js environment multiple times during the life cycle of the application process such that each Node.js environment created by the application may, in turn, during its life cycle create and destroy additional environments as worker threads. From the perspective of a native addon this means that the bindings it provides may be called multiple times, from multiple contexts, and even concurrently from multiple threads. Native addons may need to allocate global state which they use during their life cycle of an Node.js environment such that the state can be unique to each instance of the addon. To this end, Node-API provides a way to associate data such that its life cycle is tied to the life cycle of a Node.js environment.
|
| Version | Changes |
|---|---|
| v14.10.0, v12.19.0 | Changed signature of the |
NAPI_EXTERN napi_status napi_add_async_cleanup_hook( node_api_basic_env env, napi_async_cleanup_hook hook, void* arg, napi_async_cleanup_hook_handle* remove_handle);c
[in] env: The environment that the API is invoked under.[in] hook: The function pointer to call at environment teardown.[in] arg: The pointer to pass to hook when it gets called.[out] remove_handle: Optional handle that refers to the asynchronous cleanup
hook.Registers hook, which is a function of type napi_async_cleanup_hook, as
a function to be run with the remove_handle and arg parameters once the
current Node.js environment exits.
Unlike napi_add_env_cleanup_hook, the hook is allowed to be asynchronous.
Otherwise, behavior generally matches that of napi_add_env_cleanup_hook.
If remove_handle is not NULL, an opaque value will be stored in it
that must later be passed to napi_remove_async_cleanup_hook,
regardless of whether the hook has already been invoked.
Typically, that happens when the resource for which this hook was added
is being torn down anyway.
napi_remove_async_cleanup_hook#| Version | Changes |
|---|---|
| v14.10.0, v12.19.0 | Removed |
NAPI_EXTERN napi_status napi_remove_async_cleanup_hook( napi_async_cleanup_hook_handle remove_handle);c
[in] remove_handle: The handle to an asynchronous cleanup hook that was
created with napi_add_async_cleanup_hook.Unregisters the cleanup hook corresponding to remove_handle. This will prevent
the hook from being executed, unless it has already started executing.
This must be called on any napi_async_cleanup_hook_handle value obtained
from napi_add_async_cleanup_hook.
The Node.js environment may be torn down at an arbitrary time as soon as
possible with JavaScript execution disallowed, like on the request of
worker.terminate(). When the environment is being torn down, the
registered napi_finalize callbacks of JavaScript objects, thread-safe
functions and environment instance data are invoked immediately and
independently.
The invocation of napi_finalize callbacks is scheduled after the manually
registered cleanup hooks. In order to ensure a proper order of addon
finalization during environment shutdown to avoid use-after-free in the
napi_finalize callback, addons should register a cleanup hook with
napi_add_env_cleanup_hook and napi_add_async_cleanup_hook to manually
release the allocated resource in a proper order.
Node-API modules are registered in a manner similar to other modules
except that instead of using the NODE_MODULE macro the following
is used:
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)c
The next difference is the signature for the Init method. For a Node-API
module it is as follows:
napi_value Init(napi_env env, napi_value exports);c
The return value from Init is treated as the exports object for the module.
The Init method is passed an empty object via the exports parameter as a
convenience. If Init returns NULL, the parameter passed as exports is
exported by the module. Node-API modules cannot modify the module object but
can specify anything as the exports property of the module.
To add the method hello as a function so that it can be called as a method
provided by the addon:
napi_value Init(napi_env env, napi_value exports) { napi_status status; napi_property_descriptor desc = { "hello", NULL, Method, NULL, NULL, NULL, napi_writable | napi_enumerable | napi_configurable, NULL }; status = napi_define_properties(env, exports, 1, &desc); if (status != napi_ok) return NULL; return exports; }c
To set a function to be returned by the require() for the addon:
napi_value Init(napi_env env, napi_value exports) { napi_value method; napi_status status; status = napi_create_function(env, "exports", NAPI_AUTO_LENGTH, Method, NULL, &method); if (status != napi_ok) return NULL; return method; }c
To define a class so that new instances can be created (often used with Object wrap):
// NOTE: partial example, not all referenced code is included napi_value Init(napi_env env, napi_value exports) { napi_status status; napi_property_descriptor properties[] = { { "value", NULL, NULL, GetValue, SetValue, NULL, napi_writable | napi_configurable, NULL }, DECLARE_NAPI_METHOD("plusOne", PlusOne), DECLARE_NAPI_METHOD("multiply", Multiply), }; napi_value cons; status = napi_define_class(env, "MyObject", New, NULL, 3, properties, &cons); if (status != napi_ok) return NULL; status = napi_create_reference(env, cons, 1, &constructor); if (status != napi_ok) return NULL; status = napi_set_named_property(env, exports, "MyObject", cons); if (status != napi_ok) return NULL; return exports; }c
You can also use the NAPI_MODULE_INIT macro, which acts as a shorthand
for NAPI_MODULE and defining an Init function:
NAPI_MODULE_INIT(/* napi_env env, napi_value exports */) { napi_value answer; napi_status result; status = napi_create_int64(env, 42, &answer); if (status != napi_ok) return NULL; status = napi_set_named_property(env, exports, "answer", answer); if (status != napi_ok) return NULL; return exports; }c
The parameters env and exports are provided to the body of the
NAPI_MODULE_INIT macro.
All Node-API addons are context-aware, meaning they may be loaded multiple times. There are a few design considerations when declaring such a module. The documentation on context-aware addons provides more details.
The variables env and exports will be available inside the function body
following the macro invocation.
For more details on setting properties on objects, see the section on Working with JavaScript properties.
For more details on building addon modules in general, refer to the existing API.
Node-API exposes a set of APIs to create all types of JavaScript values. Some of these types are documented under Section language types of the ECMAScript Language Specification.
Fundamentally, these APIs are used to do one of the following:
undefined and nullNode-API values are represented by the type napi_value.
Any Node-API call that requires a JavaScript value takes in a napi_value.
In some cases, the API does check the type of the napi_value up-front.
However, for better performance, it's better for the caller to make sure that
the napi_value in question is of the JavaScript type expected by the API.
napi_key_collection_mode#typedef enum { napi_key_include_prototypes, napi_key_own_only } napi_key_collection_mode;c
Describes the Keys/Properties filter enums:
napi_key_collection_mode limits the range of collected properties.
napi_key_own_only limits the collected properties to the given
object only. napi_key_include_prototypes will include all keys
of the objects's prototype chain as well.
napi_key_filter#typedef enum { napi_key_all_properties = 0, napi_key_writable = 1, napi_key_enumerable = 1 << 1, napi_key_configurable = 1 << 2, napi_key_skip_strings = 1 << 3, napi_key_skip_symbols = 1 << 4 } napi_key_filter;c
Property filter bit flag. This works with bit operators to build a composite filter.
napi_key_conversion#typedef enum { napi_key_keep_numbers, napi_key_numbers_to_strings } napi_key_conversion;c
napi_key_numbers_to_strings will convert integer indexes to
strings. napi_key_keep_numbers will return numbers for integer
indexes.
napi_valuetype#typedef enum { // ES6 types (corresponds to typeof) napi_undefined, napi_null, napi_boolean, napi_number, napi_string, napi_symbol, napi_object, napi_function, napi_external, napi_bigint, } napi_valuetype;c
Describes the type of a napi_value. This generally corresponds to the types
described in Section language types of the ECMAScript Language Specification.
In addition to types in that section, napi_valuetype can also represent
Functions and Objects with external data.
A JavaScript value of type napi_external appears in JavaScript as a plain
object such that no properties can be set on it, and no prototype.
napi_typedarray_type#| Version | Changes |
|---|---|
| v25.5.0, v24.13.1 | Added |
typedef enum { napi_int8_array, napi_uint8_array, napi_uint8_clamped_array, napi_int16_array, napi_uint16_array, napi_int32_array, napi_uint32_array, napi_float32_array, napi_float64_array, napi_bigint64_array, napi_biguint64_array, napi_float16_array, } napi_typedarray_type;c
This represents the underlying binary scalar datatype of the TypedArray.
Elements of this enum correspond to
Section TypedArray objects of the ECMAScript Language Specification.
napi_create_array#napi_status napi_create_array(napi_env env, napi_value* result)c
[in] env: The environment that the Node-API call is invoked under.[out] result: A napi_value representing a JavaScript Array.Returns napi_ok if the API succeeded.
This API returns a Node-API value corresponding to a JavaScript Array type.
JavaScript arrays are described in
Section Array objects of the ECMAScript Language Specification.
napi_create_array_with_length#napi_status napi_create_array_with_length(napi_env env, size_t length, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] length: The initial length of the Array.[out] result: A napi_value representing a JavaScript Array.Returns napi_ok if the API succeeded.
This API returns a Node-API value corresponding to a JavaScript Array type.
The Array's length property is set to the passed-in length parameter.
However, the underlying buffer is not guaranteed to be pre-allocated by the VM
when the array is created. That behavior is left to the underlying VM
implementation. If the buffer must be a contiguous block of memory that can be
directly read and/or written via C, consider using
napi_create_external_arraybuffer.
JavaScript arrays are described in Section Array objects of the ECMAScript Language Specification.
napi_create_arraybuffer#napi_status napi_create_arraybuffer(napi_env env, size_t byte_length, void** data, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] length: The length in bytes of the array buffer to create.[out] data: Pointer to the underlying byte buffer of the ArrayBuffer.
data can optionally be ignored by passing NULL.[out] result: A napi_value representing a JavaScript ArrayBuffer.Returns napi_ok if the API succeeded.
This API returns a Node-API value corresponding to a JavaScript ArrayBuffer.
ArrayBuffers are used to represent fixed-length binary data buffers. They are
normally used as a backing-buffer for TypedArray objects.
The ArrayBuffer allocated will have an underlying byte buffer whose size is
determined by the length parameter that's passed in.
The underlying buffer is optionally returned back to the caller in case the
caller wants to directly manipulate the buffer. This buffer can only be
written to directly from native code. To write to this buffer from JavaScript,
a typed array or DataView object would need to be created.
JavaScript ArrayBuffer objects are described in
Section ArrayBuffer objects of the ECMAScript Language Specification.
napi_create_buffer#napi_status napi_create_buffer(napi_env env, size_t size, void** data, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] size: Size in bytes of the underlying buffer.[out] data: Raw pointer to the underlying buffer.
data can optionally be ignored by passing NULL.[out] result: A napi_value representing a node::Buffer.Returns napi_ok if the API succeeded.
This API allocates a node::Buffer object. While this is still a
fully-supported data structure, in most cases using a TypedArray will suffice.
napi_create_buffer_copy#napi_status napi_create_buffer_copy(napi_env env, size_t length, const void* data, void** result_data, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] size: Size in bytes of the input buffer (should be the same as the size
of the new buffer).[in] data: Raw pointer to the underlying buffer to copy from.[out] result_data: Pointer to the new Buffer's underlying data buffer.
result_data can optionally be ignored by passing NULL.[out] result: A napi_value representing a node::Buffer.Returns napi_ok if the API succeeded.
This API allocates a node::Buffer object and initializes it with data copied
from the passed-in buffer. While this is still a fully-supported data
structure, in most cases using a TypedArray will suffice.
napi_create_date#napi_status napi_create_date(napi_env env, double time, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] time: ECMAScript time value in milliseconds since 01 January, 1970 UTC.[out] result: A napi_value representing a JavaScript Date.Returns napi_ok if the API succeeded.
This API does not observe leap seconds; they are ignored, as ECMAScript aligns with POSIX time specification.
This API allocates a JavaScript Date object.
JavaScript Date objects are described in
Section Date objects of the ECMAScript Language Specification.
napi_create_external#napi_status napi_create_external(napi_env env, void* data, napi_finalize finalize_cb, void* finalize_hint, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] data: Raw pointer to the external data.[in] finalize_cb: Optional callback to call when the external value is being
collected. napi_finalize provides more details.[in] finalize_hint: Optional hint to pass to the finalize callback during
collection.[out] result: A napi_value representing an external value.Returns napi_ok if the API succeeded.
This API allocates a JavaScript value with external data attached to it. This
is used to pass external data through JavaScript code, so it can be retrieved
later by native code using napi_get_value_external.
The API adds a napi_finalize callback which will be called when the JavaScript
object just created has been garbage collected.
The created value is not an object, and therefore does not support additional
properties. It is considered a distinct value type: calling napi_typeof() with
an external value yields napi_external.
napi_create_external_arraybuffer#napi_status napi_create_external_arraybuffer(napi_env env, void* external_data, size_t byte_length, napi_finalize finalize_cb, void* finalize_hint, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] external_data: Pointer to the underlying byte buffer of the
ArrayBuffer.[in] byte_length: The length in bytes of the underlying buffer.[in] finalize_cb: Optional callback to call when the ArrayBuffer is being
collected. napi_finalize provides more details.[in] finalize_hint: Optional hint to pass to the finalize callback during
collection.[out] result: A napi_value representing a JavaScript ArrayBuffer.Returns napi_ok if the API succeeded.
Some runtimes other than Node.js have dropped support for external buffers.
On runtimes other than Node.js this method may return
napi_no_external_buffers_allowed to indicate that external
buffers are not supported. One such runtime is Electron as
described in this issue
electron/issues/35801.
In order to maintain broadest compatibility with all runtimes
you may define NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED in your addon before
includes for the node-api headers. Doing so will hide the 2 functions
that create external buffers. This will ensure a compilation error
occurs if you accidentally use one of these methods.
This API returns a Node-API value corresponding to a JavaScript ArrayBuffer.
The underlying byte buffer of the ArrayBuffer is externally allocated and
managed. The caller must ensure that the byte buffer remains valid until the
finalize callback is called.
The API adds a napi_finalize callback which will be called when the JavaScript
object just created has been garbage collected.
JavaScript ArrayBuffers are described in
Section ArrayBuffer objects of the ECMAScript Language Specification.
node_api_create_external_sharedarraybuffer#napi_status node_api_create_external_sharedarraybuffer(napi_env env, void* external_data, size_t byte_length, node_api_noenv_finalize finalize_cb, void* finalize_hint, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] external_data: Pointer to the underlying byte buffer of the
SharedArrayBuffer.[in] byte_length: The length in bytes of the underlying buffer.[in] finalize_cb: Optional callback to call when the SharedArrayBuffer is
being collected. Called on an arbitrary thread. Because a SharedArrayBuffer
can outlive the environment it's created in, the callback does not receive a
reference to env.[in] finalize_hint: Optional hint to pass to the finalize callback during
collection.[out] result: A napi_value representing a JavaScript SharedArrayBuffer.Returns napi_ok if the API succeeded.
Create a SharedArrayBuffer with externally managed memory.
See the entry on napi_create_external_arraybuffer for runtime
compatibility.
napi_create_external_buffer#napi_status napi_create_external_buffer(napi_env env, size_t length, void* data, napi_finalize finalize_cb, void* finalize_hint, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] length: Size in bytes of the input buffer (should be the same as the
size of the new buffer).[in] data: Raw pointer to the underlying buffer to expose to JavaScript.[in] finalize_cb: Optional callback to call when the ArrayBuffer is being
collected. napi_finalize provides more details.[in] finalize_hint: Optional hint to pass to the finalize callback during
collection.[out] result: A napi_value representing a node::Buffer.Returns napi_ok if the API succeeded.
Some runtimes other than Node.js have dropped support for external buffers.
On runtimes other than Node.js this method may return
napi_no_external_buffers_allowed to indicate that external
buffers are not supported. One such runtime is Electron as
described in this issue
electron/issues/35801.
In order to maintain broadest compatibility with all runtimes
you may define NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED in your addon before
includes for the node-api headers. Doing so will hide the 2 functions
that create external buffers. This will ensure a compilation error
occurs if you accidentally use one of these methods.
This API allocates a node::Buffer object and initializes it with data
backed by the passed in buffer. While this is still a fully-supported data
structure, in most cases using a TypedArray will suffice.
The API adds a napi_finalize callback which will be called when the JavaScript
object just created has been garbage collected.
For Node.js >=4 Buffers are Uint8Arrays.
napi_create_object#napi_status napi_create_object(napi_env env, napi_value* result)c
[in] env: The environment that the API is invoked under.[out] result: A napi_value representing a JavaScript Object.Returns napi_ok if the API succeeded.
This API allocates a default JavaScript Object.
It is the equivalent of doing new Object() in JavaScript.
The JavaScript Object type is described in Section object type of the
ECMAScript Language Specification.
node_api_create_object_with_properties#Stability: 1 - Experimental
napi_status node_api_create_object_with_properties(napi_env env, napi_value prototype_or_null, const napi_value* property_names, const napi_value* property_values, size_t property_count, napi_value* result)cpp
[in] env: The environment that the API is invoked under.[in] prototype_or_null: The prototype object for the new object. Can be a
napi_value representing a JavaScript object to use as the prototype, a
napi_value representing JavaScript null, or a nullptr that will be converted to null.[in] property_names: Array of napi_value representing the property names.[in] property_values: Array of napi_value representing the property values.[in] property_count: Number of properties in the arrays.[out] result: A napi_value representing a JavaScript Object.Returns napi_ok if the API succeeded.
This API creates a JavaScript Object with the specified prototype and
properties. This is more efficient than calling napi_create_object followed
by multiple napi_set_property calls, as it can create the object with all
properties atomically, avoiding potential V8 map transitions.
The arrays property_names and property_values must have the same length
specified by property_count. The properties are added to the object in the
order they appear in the arrays.
napi_create_symbol#napi_status napi_create_symbol(napi_env env, napi_value description, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] description: Optional napi_value which refers to a JavaScript
string to be set as the description for the symbol.[out] result: A napi_value representing a JavaScript symbol.Returns napi_ok if the API succeeded.
This API creates a JavaScript symbol value from a UTF8-encoded C string.
The JavaScript symbol type is described in Section symbol type
of the ECMAScript Language Specification.
node_api_symbol_for#napi_status node_api_symbol_for(napi_env env, const char* utf8description, size_t length, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] utf8description: UTF-8 C string representing the text to be used as the
description for the symbol.[in] length: The length of the description string in bytes, or
NAPI_AUTO_LENGTH if it is null-terminated.[out] result: A napi_value representing a JavaScript symbol.Returns napi_ok if the API succeeded.
This API searches in the global registry for an existing symbol with the given description. If the symbol already exists it will be returned, otherwise a new symbol will be created in the registry.
The JavaScript symbol type is described in Section symbol type of the ECMAScript
Language Specification.
napi_create_typedarray#| Version | Changes |
|---|---|
| v26.2.0 | Added support for |
napi_status napi_create_typedarray(napi_env env, napi_typedarray_type type, size_t length, napi_value arraybuffer, size_t byte_offset, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] type: Scalar datatype of the elements within the TypedArray.[in] length: Number of elements in the TypedArray.[in] arraybuffer: ArrayBuffer or SharedArrayBuffer underlying the
typed array.[in] byte_offset: The byte offset within the ArrayBuffer or
SharedArrayBuffer from which to start projecting the TypedArray.[out] result: A napi_value representing a JavaScript TypedArray.Returns napi_ok if the API succeeded.
This API creates a JavaScript TypedArray object over an existing
ArrayBuffer or SharedArrayBuffer. TypedArray objects provide an
array-like view over an underlying data buffer where each element has the same
underlying binary scalar datatype.
It is required that (length * size_of_element) + byte_offset is less than or
equal to the size in bytes of the ArrayBuffer or SharedArrayBuffer passed
in. If not, a RangeError exception is raised.
For element sizes greater than 1, byte_offset is required to be a multiple
of the element size. If not, a RangeError exception is raised.
JavaScript TypedArray objects are described in
Section TypedArray objects of the ECMAScript Language Specification.
node_api_create_buffer_from_arraybuffer#napi_status NAPI_CDECL node_api_create_buffer_from_arraybuffer(napi_env env, napi_value arraybuffer, size_t byte_offset, size_t byte_length, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] arraybuffer: The ArrayBuffer from which the buffer will be created.[in] byte_offset: The byte offset within the ArrayBuffer from which to start creating the buffer.[in] byte_length: The length in bytes of the buffer to be created from the ArrayBuffer.[out] result: A napi_value representing the created JavaScript Buffer object.Returns napi_ok if the API succeeded.
This API creates a JavaScript Buffer object from an existing ArrayBuffer.
The Buffer object is a Node.js-specific class that provides a way to work with binary data directly in JavaScript.
The byte range [byte_offset, byte_offset + byte_length)
must be within the bounds of the ArrayBuffer. If byte_offset + byte_length
exceeds the size of the ArrayBuffer, a RangeError exception is raised.
napi_create_dataview#| Version | Changes |
|---|---|
| v25.5.0, v24.13.1 | Added support for |
napi_status napi_create_dataview(napi_env env, size_t byte_length, napi_value arraybuffer, size_t byte_offset, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] length: Number of elements in the DataView.[in] arraybuffer: ArrayBuffer or SharedArrayBuffer underlying the
DataView.[in] byte_offset: The byte offset within the ArrayBuffer from which to
start projecting the DataView.[out] result: A napi_value representing a JavaScript DataView.Returns napi_ok if the API succeeded.
This API creates a JavaScript DataView object over an existing ArrayBuffer
or SharedArrayBuffer. DataView objects provide an array-like view over an
underlying data buffer, but one which allows items of different size and type in
the ArrayBuffer or SharedArrayBuffer.
It is required that byte_length + byte_offset is less than or equal to the
size in bytes of the array passed in. If not, a RangeError exception is
raised.
JavaScript DataView objects are described in
Section DataView objects of the ECMAScript Language Specification.
napi_create_int32#napi_status napi_create_int32(napi_env env, int32_t value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: Integer value to be represented in JavaScript.[out] result: A napi_value representing a JavaScript number.Returns napi_ok if the API succeeded.
This API is used to convert from the C int32_t type to the JavaScript
number type.
The JavaScript number type is described in
Section number type of the ECMAScript Language Specification.
napi_create_uint32#napi_status napi_create_uint32(napi_env env, uint32_t value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: Unsigned integer value to be represented in JavaScript.[out] result: A napi_value representing a JavaScript number.Returns napi_ok if the API succeeded.
This API is used to convert from the C uint32_t type to the JavaScript
number type.
The JavaScript number type is described in
Section number type of the ECMAScript Language Specification.
napi_create_int64#napi_status napi_create_int64(napi_env env, int64_t value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: Integer value to be represented in JavaScript.[out] result: A napi_value representing a JavaScript number.Returns napi_ok if the API succeeded.
This API is used to convert from the C int64_t type to the JavaScript
number type.
The JavaScript number type is described in Section number type
of the ECMAScript Language Specification. Note the complete range of int64_t
cannot be represented with full precision in JavaScript. Integer values
outside the range of Number.MIN_SAFE_INTEGER -(2**53 - 1) -
Number.MAX_SAFE_INTEGER (2**53 - 1) will lose precision.
napi_create_double#napi_status napi_create_double(napi_env env, double value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: Double-precision value to be represented in JavaScript.[out] result: A napi_value representing a JavaScript number.Returns napi_ok if the API succeeded.
This API is used to convert from the C double type to the JavaScript
number type.
The JavaScript number type is described in
Section number type of the ECMAScript Language Specification.
napi_create_bigint_int64#napi_status napi_create_bigint_int64(napi_env env, int64_t value, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] value: Integer value to be represented in JavaScript.[out] result: A napi_value representing a JavaScript BigInt.Returns napi_ok if the API succeeded.
This API converts the C int64_t type to the JavaScript BigInt type.
napi_create_bigint_uint64#napi_status napi_create_bigint_uint64(napi_env env, uint64_t value, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] value: Unsigned integer value to be represented in JavaScript.[out] result: A napi_value representing a JavaScript BigInt.Returns napi_ok if the API succeeded.
This API converts the C uint64_t type to the JavaScript BigInt type.
napi_create_bigint_words#napi_status napi_create_bigint_words(napi_env env, int sign_bit, size_t word_count, const uint64_t* words, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] sign_bit: Determines if the resulting BigInt will be positive or
negative.[in] word_count: The length of the words array.[in] words: An array of uint64_t little-endian 64-bit words.[out] result: A napi_value representing a JavaScript BigInt.Returns napi_ok if the API succeeded.
This API converts an array of unsigned 64-bit words into a single BigInt
value.
The resulting BigInt is calculated as: (–1)sign_bit (words[0]
× (264)0 + words[1] × (264)1 + …)
napi_create_string_latin1#napi_status napi_create_string_latin1(napi_env env, const char* str, size_t length, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] str: Character buffer representing an ISO-8859-1-encoded string.[in] length: The length of the string in bytes, or NAPI_AUTO_LENGTH if it
is null-terminated.[out] result: A napi_value representing a JavaScript string.Returns napi_ok if the API succeeded.
This API creates a JavaScript string value from an ISO-8859-1-encoded C
string. The native string is copied.
The JavaScript string type is described in
Section string type of the ECMAScript Language Specification.
node_api_create_external_string_latin1#napi_status node_api_create_external_string_latin1(napi_env env, char* str, size_t length, napi_finalize finalize_callback, void* finalize_hint, napi_value* result, bool* copied);c
[in] env: The environment that the API is invoked under.[in] str: Character buffer representing an ISO-8859-1-encoded string.[in] length: The length of the string in bytes, or NAPI_AUTO_LENGTH if it
is null-terminated.[in] finalize_callback: The function to call when the string is being
collected. The function will be called with the following parameters:
[in] env: The environment in which the add-on is running. This value
may be null if the string is being collected as part of the termination
of the worker or the main Node.js instance.[in] data: This is the value str as a void* pointer.[in] finalize_hint: This is the value finalize_hint that was given
to the API.
napi_finalize provides more details.
This parameter is optional. Passing a null value means that the add-on
doesn't need to be notified when the corresponding JavaScript string is
collected.[in] finalize_hint: Optional hint to pass to the finalize callback during
collection.[out] result: A napi_value representing a JavaScript string.[out] copied: Whether the string was copied. If it was, the finalizer will
already have been invoked to destroy str.Returns napi_ok if the API succeeded.
This API creates a JavaScript string value from an ISO-8859-1-encoded C
string. The native string may not be copied and must thus exist for the entire
life cycle of the JavaScript value.
The JavaScript string type is described in
Section string type of the ECMAScript Language Specification.
napi_create_string_utf16#napi_status napi_create_string_utf16(napi_env env, const char16_t* str, size_t length, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] str: Character buffer representing a UTF16-LE-encoded string.[in] length: The length of the string in two-byte code units, or
NAPI_AUTO_LENGTH if it is null-terminated.[out] result: A napi_value representing a JavaScript string.Returns napi_ok if the API succeeded.
This API creates a JavaScript string value from a UTF16-LE-encoded C string.
The native string is copied.
The JavaScript string type is described in
Section string type of the ECMAScript Language Specification.
node_api_create_external_string_utf16#napi_status node_api_create_external_string_utf16(napi_env env, char16_t* str, size_t length, napi_finalize finalize_callback, void* finalize_hint, napi_value* result, bool* copied);c
[in] env: The environment that the API is invoked under.[in] str: Character buffer representing a UTF16-LE-encoded string.[in] length: The length of the string in two-byte code units, or
NAPI_AUTO_LENGTH if it is null-terminated.[in] finalize_callback: The function to call when the string is being
collected. The function will be called with the following parameters:
[in] env: The environment in which the add-on is running. This value
may be null if the string is being collected as part of the termination
of the worker or the main Node.js instance.[in] data: This is the value str as a void* pointer.[in] finalize_hint: This is the value finalize_hint that was given
to the API.
napi_finalize provides more details.
This parameter is optional. Passing a null value means that the add-on
doesn't need to be notified when the corresponding JavaScript string is
collected.[in] finalize_hint: Optional hint to pass to the finalize callback during
collection.[out] result: A napi_value representing a JavaScript string.[out] copied: Whether the string was copied. If it was, the finalizer will
already have been invoked to destroy str.Returns napi_ok if the API succeeded.
This API creates a JavaScript string value from a UTF16-LE-encoded C string.
The native string may not be copied and must thus exist for the entire life
cycle of the JavaScript value.
The JavaScript string type is described in
Section string type of the ECMAScript Language Specification.
napi_create_string_utf8#napi_status napi_create_string_utf8(napi_env env, const char* str, size_t length, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] str: Character buffer representing a UTF8-encoded string.[in] length: The length of the string in bytes, or NAPI_AUTO_LENGTH if it
is null-terminated.[out] result: A napi_value representing a JavaScript string.Returns napi_ok if the API succeeded.
This API creates a JavaScript string value from a UTF8-encoded C string.
The native string is copied.
The JavaScript string type is described in
Section string type of the ECMAScript Language Specification.
Many JavaScript engines including V8 use internalized strings as keys to set and get property values. They typically use a hash table to create and lookup such strings. While it adds some cost per key creation, it improves the performance after that by enabling comparison of string pointers instead of the whole strings.
If a new JavaScript string is intended to be used as a property key, then for
some JavaScript engines it will be more efficient to use the functions in this
section. Otherwise, use the napi_create_string_utf8 or
node_api_create_external_string_utf8 series functions as there may be
additional overhead in creating/storing strings with the property key
creation methods.
node_api_create_property_key_latin1#napi_status NAPI_CDECL node_api_create_property_key_latin1(napi_env env, const char* str, size_t length, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] str: Character buffer representing an ISO-8859-1-encoded string.[in] length: The length of the string in bytes, or NAPI_AUTO_LENGTH if it
is null-terminated.[out] result: A napi_value representing an optimized JavaScript string
to be used as a property key for objects.Returns napi_ok if the API succeeded.
This API creates an optimized JavaScript string value from
an ISO-8859-1-encoded C string to be used as a property key for objects.
The native string is copied. In contrast with napi_create_string_latin1,
subsequent calls to this function with the same str pointer may benefit from a speedup
in the creation of the requested napi_value, depending on the engine.
The JavaScript string type is described in
Section string type of the ECMAScript Language Specification.
node_api_create_property_key_utf16#napi_status NAPI_CDECL node_api_create_property_key_utf16(napi_env env, const char16_t* str, size_t length, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] str: Character buffer representing a UTF16-LE-encoded string.[in] length: The length of the string in two-byte code units, or
NAPI_AUTO_LENGTH if it is null-terminated.[out] result: A napi_value representing an optimized JavaScript string
to be used as a property key for objects.Returns napi_ok if the API succeeded.
This API creates an optimized JavaScript string value from
a UTF16-LE-encoded C string to be used as a property key for objects.
The native string is copied.
The JavaScript string type is described in
Section string type of the ECMAScript Language Specification.
node_api_create_property_key_utf8#napi_status NAPI_CDECL node_api_create_property_key_utf8(napi_env env, const char* str, size_t length, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] str: Character buffer representing a UTF8-encoded string.[in] length: The length of the string in two-byte code units, or
NAPI_AUTO_LENGTH if it is null-terminated.[out] result: A napi_value representing an optimized JavaScript string
to be used as a property key for objects.Returns napi_ok if the API succeeded.
This API creates an optimized JavaScript string value from
a UTF8-encoded C string to be used as a property key for objects.
The native string is copied.
The JavaScript string type is described in
Section string type of the ECMAScript Language Specification.
napi_get_array_length#napi_status napi_get_array_length(napi_env env, napi_value value, uint32_t* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing the JavaScript Array whose length is
being queried.[out] result: uint32 representing length of the array.Returns napi_ok if the API succeeded.
This API returns the length of an array.
Array length is described in Section Array instance length of the ECMAScript Language
Specification.
napi_get_arraybuffer_info#| Version | Changes |
|---|---|
| v24.9.0, v22.21.0 | Added support for |
napi_status napi_get_arraybuffer_info(napi_env env, napi_value arraybuffer, void** data, size_t* byte_length)c
[in] env: The environment that the API is invoked under.[in] arraybuffer: napi_value representing the ArrayBuffer or SharedArrayBuffer being queried.[out] data: The underlying data buffer of the ArrayBuffer or SharedArrayBuffer
is 0, this may be NULL or any other pointer value.[out] byte_length: Length in bytes of the underlying data buffer.Returns napi_ok if the API succeeded.
This API is used to retrieve the underlying data buffer of an ArrayBuffer or SharedArrayBuffer and its length.
WARNING: Use caution while using this API. The lifetime of the underlying data
buffer is managed by the ArrayBuffer or SharedArrayBuffer even after it's returned. A
possible safe way to use this API is in conjunction with
napi_create_reference, which can be used to guarantee control over the
lifetime of the ArrayBuffer or SharedArrayBuffer. It's also safe to use the returned data buffer
within the same callback as long as there are no calls to other APIs that might
trigger a GC.
napi_get_buffer_info#napi_status napi_get_buffer_info(napi_env env, napi_value value, void** data, size_t* length)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing the node::Buffer or Uint8Array
being queried.[out] data: The underlying data buffer of the node::Buffer or
Uint8Array. If length is 0, this may be NULL or any other pointer value.[out] length: Length in bytes of the underlying data buffer.Returns napi_ok if the API succeeded.
This method returns the identical data and byte_length as
napi_get_typedarray_info. And napi_get_typedarray_info accepts a
node::Buffer (a Uint8Array) as the value too.
This API is used to retrieve the underlying data buffer of a node::Buffer
and its length.
Warning: Use caution while using this API since the underlying data buffer's lifetime is not guaranteed if it's managed by the VM.
napi_get_prototype#napi_status napi_get_prototype(napi_env env, napi_value object, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] object: napi_value representing JavaScript Object whose prototype
to return. This returns the equivalent of Object.getPrototypeOf (which is
not the same as the function's prototype property).[out] result: napi_value representing prototype of the given object.Returns napi_ok if the API succeeded.
napi_get_typedarray_info#napi_status napi_get_typedarray_info(napi_env env, napi_value typedarray, napi_typedarray_type* type, size_t* length, void** data, napi_value* arraybuffer, size_t* byte_offset)c
[in] env: The environment that the API is invoked under.[in] typedarray: napi_value representing the TypedArray whose
properties to query.[out] type: Scalar datatype of the elements within the TypedArray.[out] length: The number of elements in the TypedArray.[out] data: The data buffer underlying the TypedArray adjusted by
the byte_offset value so that it points to the first element in the
TypedArray. If the length of the array is 0, this may be NULL or
any other pointer value.[out] arraybuffer: The ArrayBuffer or SharedArrayBuffer underlying the
TypedArray.[out] byte_offset: The byte offset within the underlying native array
at which the first element of the arrays is located. The value for the data
parameter has already been adjusted so that data points to the first element
in the array. Therefore, the first byte of the native array would be at
data - byte_offset.Returns napi_ok if the API succeeded.
This API returns various properties of a typed array.
Any of the out parameters may be NULL if that property is unneeded.
Warning: Use caution while using this API since the underlying data buffer is managed by the VM.
napi_get_dataview_info#napi_status napi_get_dataview_info(napi_env env, napi_value dataview, size_t* byte_length, void** data, napi_value* arraybuffer, size_t* byte_offset)c
[in] env: The environment that the API is invoked under.[in] dataview: napi_value representing the DataView whose
properties to query.[out] byte_length: Number of bytes in the DataView.[out] data: The data buffer underlying the DataView.
If byte_length is 0, this may be NULL or any other pointer value.[out] arraybuffer: ArrayBuffer underlying the DataView.[out] byte_offset: The byte offset within the data buffer from which
to start projecting the DataView.Returns napi_ok if the API succeeded.
Any of the out parameters may be NULL if that property is unneeded.
This API returns various properties of a DataView.
napi_get_date_value#napi_status napi_get_date_value(napi_env env, napi_value value, double* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing a JavaScript Date.[out] result: Time value as a double represented as milliseconds since
midnight at the beginning of 01 January, 1970 UTC.This API does not observe leap seconds; they are ignored, as ECMAScript aligns with POSIX time specification.
Returns napi_ok if the API succeeded. If a non-date napi_value is passed
in it returns napi_date_expected.
This API returns the C double primitive of time value for the given JavaScript
Date.
napi_get_value_bool#napi_status napi_get_value_bool(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript Boolean.[out] result: C boolean primitive equivalent of the given JavaScript
Boolean.Returns napi_ok if the API succeeded. If a non-boolean napi_value is
passed in it returns napi_boolean_expected.
This API returns the C boolean primitive equivalent of the given JavaScript
Boolean.
napi_get_value_double#napi_status napi_get_value_double(napi_env env, napi_value value, double* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript number.[out] result: C double primitive equivalent of the given JavaScript
number.Returns napi_ok if the API succeeded. If a non-number napi_value is passed
in it returns napi_number_expected.
This API returns the C double primitive equivalent of the given JavaScript
number.
napi_get_value_bigint_int64#napi_status napi_get_value_bigint_int64(napi_env env, napi_value value, int64_t* result, bool* lossless);c
[in] env: The environment that the API is invoked under[in] value: napi_value representing JavaScript BigInt.[out] result: C int64_t primitive equivalent of the given JavaScript
BigInt.[out] lossless: Indicates whether the BigInt value was converted
losslessly.Returns napi_ok if the API succeeded. If a non-BigInt is passed in it
returns napi_bigint_expected.
This API returns the C int64_t primitive equivalent of the given JavaScript
BigInt. If needed it will truncate the value, setting lossless to false.
napi_get_value_bigint_uint64#napi_status napi_get_value_bigint_uint64(napi_env env, napi_value value, uint64_t* result, bool* lossless);c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript BigInt.[out] result: C uint64_t primitive equivalent of the given JavaScript
BigInt.[out] lossless: Indicates whether the BigInt value was converted
losslessly.Returns napi_ok if the API succeeded. If a non-BigInt is passed in it
returns napi_bigint_expected.
This API returns the C uint64_t primitive equivalent of the given JavaScript
BigInt. If needed it will truncate the value, setting lossless to false.
napi_get_value_bigint_words#napi_status napi_get_value_bigint_words(napi_env env, napi_value value, int* sign_bit, size_t* word_count, uint64_t* words);c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript BigInt.[out] sign_bit: Integer representing if the JavaScript BigInt is positive
or negative.[in/out] word_count: Must be initialized to the length of the words
array. Upon return, it will be set to the actual number of words that
would be needed to store this BigInt.[out] words: Pointer to a pre-allocated 64-bit word array.Returns napi_ok if the API succeeded.
This API converts a single BigInt value into a sign bit, 64-bit little-endian
array, and the number of elements in the array. sign_bit and words may be
both set to NULL, in order to get only word_count.
napi_get_value_external#napi_status napi_get_value_external(napi_env env, napi_value value, void** result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript external value.[out] result: Pointer to the data wrapped by the JavaScript external value.Returns napi_ok if the API succeeded. If a non-external napi_value is
passed in it returns napi_invalid_arg.
This API retrieves the external data pointer that was previously passed to
napi_create_external().
napi_get_value_int32#napi_status napi_get_value_int32(napi_env env, napi_value value, int32_t* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript number.[out] result: C int32 primitive equivalent of the given JavaScript
number.Returns napi_ok if the API succeeded. If a non-number napi_value
is passed in napi_number_expected.
This API returns the C int32 primitive equivalent
of the given JavaScript number.
If the number exceeds the range of the 32 bit integer, then the result is truncated to the equivalent of the bottom 32 bits. This can result in a large positive number becoming a negative number if the value is > 231 - 1.
Non-finite number values (NaN, +Infinity, or -Infinity) set the
result to zero.
napi_get_value_int64#napi_status napi_get_value_int64(napi_env env, napi_value value, int64_t* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript number.[out] result: C int64 primitive equivalent of the given JavaScript
number.Returns napi_ok if the API succeeded. If a non-number napi_value
is passed in it returns napi_number_expected.
This API returns the C int64 primitive equivalent of the given JavaScript
number.
number values outside the range of Number.MIN_SAFE_INTEGER
-(2**53 - 1) - Number.MAX_SAFE_INTEGER (2**53 - 1) will lose
precision.
Non-finite number values (NaN, +Infinity, or -Infinity) set the
result to zero.
napi_get_value_string_latin1#napi_status napi_get_value_string_latin1(napi_env env, napi_value value, char* buf, size_t bufsize, size_t* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript string.[in] buf: Buffer to write the ISO-8859-1-encoded string into. If NULL is
passed in, the length of the string in bytes and excluding the null terminator
is returned in result.[in] bufsize: Size of the destination buffer. When this value is
insufficient, the returned string is truncated and null-terminated.
If this value is zero, then the string is not returned and no changes are done
to the buffer.[out] result: Number of bytes copied into the buffer, excluding the null
terminator.Returns napi_ok if the API succeeded. If a non-string napi_value
is passed in it returns napi_string_expected.
This API returns the ISO-8859-1-encoded string corresponding the value passed in.
napi_get_value_string_utf8#napi_status napi_get_value_string_utf8(napi_env env, napi_value value, char* buf, size_t bufsize, size_t* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript string.[in] buf: Buffer to write the UTF8-encoded string into. If NULL is passed
in, the length of the string in bytes and excluding the null terminator is
returned in result.[in] bufsize: Size of the destination buffer. When this value is
insufficient, the returned string is truncated and null-terminated.
If this value is zero, then the string is not returned and no changes are done
to the buffer.[out] result: Number of bytes copied into the buffer, excluding the null
terminator.Returns napi_ok if the API succeeded. If a non-string napi_value
is passed in it returns napi_string_expected.
This API returns the UTF8-encoded string corresponding the value passed in.
napi_get_value_string_utf16#napi_status napi_get_value_string_utf16(napi_env env, napi_value value, char16_t* buf, size_t bufsize, size_t* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript string.[in] buf: Buffer to write the UTF16-LE-encoded string into. If NULL is
passed in, the length of the string in 2-byte code units and excluding the
null terminator is returned.[in] bufsize: Size of the destination buffer. When this value is
insufficient, the returned string is truncated and null-terminated.
If this value is zero, then the string is not returned and no changes are done
to the buffer.[out] result: Number of 2-byte code units copied into the buffer, excluding
the null terminator.Returns napi_ok if the API succeeded. If a non-string napi_value
is passed in it returns napi_string_expected.
This API returns the UTF16-encoded string corresponding the value passed in.
napi_get_value_uint32#napi_status napi_get_value_uint32(napi_env env, napi_value value, uint32_t* result)c
[in] env: The environment that the API is invoked under.[in] value: napi_value representing JavaScript number.[out] result: C primitive equivalent of the given napi_value as a
uint32_t.Returns napi_ok if the API succeeded. If a non-number napi_value
is passed in it returns napi_number_expected.
This API returns the C primitive equivalent of the given napi_value as a
uint32_t.
napi_get_boolean#napi_status napi_get_boolean(napi_env env, bool value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: The value of the boolean to retrieve.[out] result: napi_value representing JavaScript Boolean singleton to
retrieve.Returns napi_ok if the API succeeded.
This API is used to return the JavaScript singleton object that is used to represent the given boolean value.
napi_get_global#napi_status napi_get_global(napi_env env, napi_value* result)c
[in] env: The environment that the API is invoked under.[out] result: napi_value representing JavaScript global object.Returns napi_ok if the API succeeded.
This API returns the global object.
napi_get_null#napi_status napi_get_null(napi_env env, napi_value* result)c
[in] env: The environment that the API is invoked under.[out] result: napi_value representing JavaScript null object.Returns napi_ok if the API succeeded.
This API returns the null object.
napi_get_undefined#napi_status napi_get_undefined(napi_env env, napi_value* result)c
[in] env: The environment that the API is invoked under.[out] result: napi_value representing JavaScript Undefined value.Returns napi_ok if the API succeeded.
This API returns the Undefined object.
Node-API exposes a set of APIs to perform some abstract operations on JavaScript values.
These APIs support doing one of the following:
number or
string).napi_coerce_to_bool#napi_status napi_coerce_to_bool(napi_env env, napi_value value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to coerce.[out] result: napi_value representing the coerced JavaScript Boolean.Returns napi_ok if the API succeeded.
This API implements the abstract operation ToBoolean() as defined in
Section ToBoolean of the ECMAScript Language Specification.
napi_coerce_to_number#napi_status napi_coerce_to_number(napi_env env, napi_value value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to coerce.[out] result: napi_value representing the coerced JavaScript number.Returns napi_ok if the API succeeded.
This API implements the abstract operation ToNumber() as defined in
Section ToNumber of the ECMAScript Language Specification.
This function potentially runs JS code if the passed-in value is an
object.
napi_coerce_to_object#napi_status napi_coerce_to_object(napi_env env, napi_value value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to coerce.[out] result: napi_value representing the coerced JavaScript Object.Returns napi_ok if the API succeeded.
This API implements the abstract operation ToObject() as defined in
Section ToObject of the ECMAScript Language Specification.
napi_coerce_to_string#napi_status napi_coerce_to_string(napi_env env, napi_value value, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to coerce.[out] result: napi_value representing the coerced JavaScript string.Returns napi_ok if the API succeeded.
This API implements the abstract operation ToString() as defined in
Section ToString of the ECMAScript Language Specification.
This function potentially runs JS code if the passed-in value is an
object.
napi_typeof#napi_status napi_typeof(napi_env env, napi_value value, napi_valuetype* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value whose type to query.[out] result: The type of the JavaScript value.Returns napi_ok if the API succeeded.
napi_invalid_arg if the type of value is not a known ECMAScript type and
value is not an External value.This API represents behavior similar to invoking the typeof Operator on
the object as defined in Section typeof operator of the ECMAScript Language
Specification. However, there are some differences:
null as a separate type, while ECMAScript typeof would detect
object.If value has a type that is invalid, an error is returned.
napi_instanceof#napi_status napi_instanceof(napi_env env, napi_value object, napi_value constructor, bool* result)c
[in] env: The environment that the API is invoked under.[in] object: The JavaScript value to check.[in] constructor: The JavaScript function object of the constructor function
to check against.[out] result: Boolean that is set to true if object instanceof constructor
is true.Returns napi_ok if the API succeeded.
This API represents invoking the instanceof Operator on the object as
defined in Section instanceof operator of the ECMAScript Language Specification.
napi_is_array#napi_status napi_is_array(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to check.[out] result: Whether the given object is an array.Returns napi_ok if the API succeeded.
This API represents invoking the IsArray operation on the object
as defined in Section IsArray of the ECMAScript Language Specification.
napi_is_arraybuffer#napi_status napi_is_arraybuffer(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to check.[out] result: Whether the given object is an ArrayBuffer.Returns napi_ok if the API succeeded.
This API checks if the Object passed in is an array buffer.
napi_is_buffer#napi_status napi_is_buffer(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to check.[out] result: Whether the given napi_value represents a node::Buffer or
Uint8Array object.Returns napi_ok if the API succeeded.
This API checks if the Object passed in is a buffer or Uint8Array.
napi_is_typedarray should be preferred if the caller needs to check if the
value is a Uint8Array.
napi_is_date#napi_status napi_is_date(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to check.[out] result: Whether the given napi_value represents a JavaScript Date
object.Returns napi_ok if the API succeeded.
This API checks if the Object passed in is a date.
napi_is_error#napi_status napi_is_error(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to check.[out] result: Whether the given napi_value represents an Error object.Returns napi_ok if the API succeeded.
This API checks if the Object passed in is an Error.
napi_is_typedarray#napi_status napi_is_typedarray(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to check.[out] result: Whether the given napi_value represents a TypedArray.Returns napi_ok if the API succeeded.
This API checks if the Object passed in is a typed array.
napi_is_dataview#napi_status napi_is_dataview(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to check.[out] result: Whether the given napi_value represents a DataView.Returns napi_ok if the API succeeded.
This API checks if the Object passed in is a DataView.
napi_strict_equals#napi_status napi_strict_equals(napi_env env, napi_value lhs, napi_value rhs, bool* result)c
[in] env: The environment that the API is invoked under.[in] lhs: The JavaScript value to check.[in] rhs: The JavaScript value to check against.[out] result: Whether the two napi_value objects are equal.Returns napi_ok if the API succeeded.
This API represents the invocation of the Strict Equality algorithm as defined in Section IsStrictlyEqual of the ECMAScript Language Specification.
napi_detach_arraybuffer#napi_status napi_detach_arraybuffer(napi_env env, napi_value arraybuffer)c
[in] env: The environment that the API is invoked under.[in] arraybuffer: The JavaScript ArrayBuffer to be detached.Returns napi_ok if the API succeeded. If a non-detachable ArrayBuffer is
passed in it returns napi_detachable_arraybuffer_expected.
Generally, an ArrayBuffer is non-detachable if it has been detached before.
The engine may impose additional conditions on whether an ArrayBuffer is
detachable. For example, V8 requires that the ArrayBuffer be external,
that is, created with napi_create_external_arraybuffer.
This API represents the invocation of the ArrayBuffer detach operation as
defined in Section detachArrayBuffer of the ECMAScript Language Specification.
napi_is_detached_arraybuffer#napi_status napi_is_detached_arraybuffer(napi_env env, napi_value arraybuffer, bool* result)c
[in] env: The environment that the API is invoked under.[in] arraybuffer: The JavaScript ArrayBuffer to be checked.[out] result: Whether the arraybuffer is detached.Returns napi_ok if the API succeeded.
The ArrayBuffer is considered detached if its internal data is null.
This API represents the invocation of the ArrayBuffer IsDetachedBuffer
operation as defined in Section isDetachedBuffer of the ECMAScript Language
Specification.
node_api_is_sharedarraybuffer#Stability: 1 - Experimental
napi_status node_api_is_sharedarraybuffer(napi_env env, napi_value value, bool* result)c
[in] env: The environment that the API is invoked under.[in] value: The JavaScript value to check.[out] result: Whether the given napi_value represents a SharedArrayBuffer.Returns napi_ok if the API succeeded.
This API checks if the Object passed in is a SharedArrayBuffer.
node_api_create_sharedarraybuffer#Stability: 1 - Experimental
napi_status node_api_create_sharedarraybuffer(napi_env env, size_t byte_length, void** data, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] byte_length: The length in bytes of the shared array buffer to create.[out] data: Pointer to the underlying byte buffer of the SharedArrayBuffer.
data can optionally be ignored by passing NULL.[out] result: A napi_value representing a JavaScript SharedArrayBuffer.Returns napi_ok if the API succeeded.
This API returns a Node-API value corresponding to a JavaScript SharedArrayBuffer.
SharedArrayBuffers are used to represent fixed-length binary data buffers that
can be shared across multiple workers.
The SharedArrayBuffer allocated will have an underlying byte buffer whose size is
determined by the byte_length parameter that's passed in.
The underlying buffer is optionally returned back to the caller in case the
caller wants to directly manipulate the buffer. This buffer can only be
written to directly from native code. To write to this buffer from JavaScript,
a typed array or DataView object would need to be created.
JavaScript SharedArrayBuffer objects are described in
Section SharedArrayBuffer objects of the ECMAScript Language Specification.
Node-API exposes a set of APIs to get and set properties on JavaScript objects.
Properties in JavaScript are represented as a tuple of a key and a value. Fundamentally, all property keys in Node-API can be represented in one of the following forms:
uint32_tnapi_value. This can
be a napi_value representing a string, number, or symbol.Node-API values are represented by the type napi_value.
Any Node-API call that requires a JavaScript value takes in a napi_value.
However, it's the caller's responsibility to make sure that the
napi_value in question is of the JavaScript type expected by the API.
The APIs documented in this section provide a simple interface to
get and set properties on arbitrary JavaScript objects represented by
napi_value.
For instance, consider the following JavaScript code snippet:
const obj = {}; obj.myProp = 123;js
The equivalent can be done using Node-API values with the following snippet:
napi_status status = napi_generic_failure; // const obj = {} napi_value obj, value; status = napi_create_object(env, &obj); if (status != napi_ok) return status; // Create a napi_value for 123 status = napi_create_int32(env, 123, &value); if (status != napi_ok) return status; // obj.myProp = 123 status = napi_set_named_property(env, obj, "myProp", value); if (status != napi_ok) return status;c
Indexed properties can be set in a similar manner. Consider the following JavaScript snippet:
const arr = []; arr[123] = 'hello';js
The equivalent can be done using Node-API values with the following snippet:
napi_status status = napi_generic_failure; // const arr = []; napi_value arr, value; status = napi_create_array(env, &arr); if (status != napi_ok) return status; // Create a napi_value for 'hello' status = napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &value); if (status != napi_ok) return status; // arr[123] = 'hello'; status = napi_set_element(env, arr, 123, value); if (status != napi_ok) return status;c
Properties can be retrieved using the APIs described in this section. Consider the following JavaScript snippet:
const arr = []; const value = arr[123];js
The following is the approximate equivalent of the Node-API counterpart:
napi_status status = napi_generic_failure; // const arr = [] napi_value arr, value; status = napi_create_array(env, &arr); if (status != napi_ok) return status; // const value = arr[123] status = napi_get_element(env, arr, 123, &value); if (status != napi_ok) return status;c
Finally, multiple properties can also be defined on an object for performance reasons. Consider the following JavaScript:
const obj = {}; Object.defineProperties(obj, { 'foo': { value: 123, writable: true, configurable: true, enumerable: true }, 'bar': { value: 456, writable: true, configurable: true, enumerable: true }, });js
The following is the approximate equivalent of the Node-API counterpart:
napi_status status = napi_status_generic_failure; // const obj = {}; napi_value obj; status = napi_create_object(env, &obj); if (status != napi_ok) return status; // Create napi_values for 123 and 456 napi_value fooValue, barValue; status = napi_create_int32(env, 123, &fooValue); if (status != napi_ok) return status; status = napi_create_int32(env, 456, &barValue); if (status != napi_ok) return status; // Set the properties napi_property_descriptor descriptors[] = { { "foo", NULL, NULL, NULL, NULL, fooValue, napi_writable | napi_configurable, NULL }, { "bar", NULL, NULL, NULL, NULL, barValue, napi_writable | napi_configurable, NULL } } status = napi_define_properties(env, obj, sizeof(descriptors) / sizeof(descriptors[0]), descriptors); if (status != napi_ok) return status;c
napi_property_attributes#| Version | Changes |
|---|---|
| v14.12.0 | added |
typedef enum { napi_default = 0, napi_writable = 1 << 0, napi_enumerable = 1 << 1, napi_configurable = 1 << 2, // Used with napi_define_class to distinguish static properties // from instance properties. Ignored by napi_define_properties. napi_static = 1 << 10, // Default for class methods. napi_default_method = napi_writable | napi_configurable, // Default for object properties, like in JS obj[prop]. napi_default_jsproperty = napi_writable | napi_enumerable | napi_configurable, } napi_property_attributes;c
napi_property_attributes are bit flags used to control the behavior of
properties set on a JavaScript object. Other than napi_static they
correspond to the attributes listed in Section property attributes
of the ECMAScript Language Specification.
They can be one or more of the following bit flags:
napi_default: No explicit attributes are set on the property. By default, a
property is read only, not enumerable and not configurable.napi_writable: The property is writable.napi_enumerable: The property is enumerable.napi_configurable: The property is configurable as defined in
Section property attributes of the ECMAScript Language Specification.napi_static: The property will be defined as a static property on a class as
opposed to an instance property, which is the default. This is used only by
napi_define_class. It is ignored by napi_define_properties.napi_default_method: Like a method in a JS class, the property is
configurable and writable, but not enumerable.napi_default_jsproperty: Like a property set via assignment in JavaScript,
the property is writable, enumerable, and configurable.napi_property_descriptor#typedef struct { // One of utf8name or name should be NULL. const char* utf8name; napi_value name; napi_callback method; napi_callback getter; napi_callback setter; napi_value value; napi_property_attributes attributes; void* data; } napi_property_descriptor;c
utf8name: Optional string describing the key for the property,
encoded as UTF8. One of utf8name or name must be provided for the
property.name: Optional napi_value that points to a JavaScript string or symbol
to be used as the key for the property. One of utf8name or name must
be provided for the property.value: The value that's retrieved by a get access of the property if the
property is a data property. If this is passed in, set getter, setter,
method and data to NULL (since these members won't be used).getter: A function to call when a get access of the property is performed.
If this is passed in, set value and method to NULL (since these members
won't be used). The given function is called implicitly by the runtime when
the property is accessed from JavaScript code (or if a get on the property is
performed using a Node-API call). napi_callback provides more details.setter: A function to call when a set access of the property is performed.
If this is passed in, set value and method to NULL (since these members
won't be used). The given function is called implicitly by the runtime when
the property is set from JavaScript code (or if a set on the property is
performed using a Node-API call). napi_callback provides more details.method: Set this to make the property descriptor object's value
property to be a JavaScript function represented by method. If this is
passed in, set value, getter and setter to NULL (since these members
won't be used). napi_callback provides more details.attributes: The attributes associated with the particular property. See
napi_property_attributes.data: The callback data passed into method, getter and setter if this
function is invoked.napi_get_property_names#napi_status napi_get_property_names(napi_env env, napi_value object, napi_value* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object from which to retrieve the properties.[out] result: A napi_value representing an array of JavaScript values
that represent the property names of the object. The API can be used to
iterate over result using napi_get_array_length
and napi_get_element.Returns napi_ok if the API succeeded.
This API returns the names of the enumerable properties of object as an array
of strings. The properties of object whose key is a symbol will not be
included.
napi_get_all_property_names#napi_get_all_property_names(napi_env env, napi_value object, napi_key_collection_mode key_mode, napi_key_filter key_filter, napi_key_conversion key_conversion, napi_value* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object from which to retrieve the properties.[in] key_mode: Whether to retrieve prototype properties as well.[in] key_filter: Which properties to retrieve
(enumerable/readable/writable).[in] key_conversion: Whether to convert numbered property keys to strings.[out] result: A napi_value representing an array of JavaScript values
that represent the property names of the object. napi_get_array_length
and napi_get_element can be used to iterate over result.Returns napi_ok if the API succeeded.
This API returns an array containing the names of the available properties of this object.
napi_set_property#napi_status napi_set_property(napi_env env, napi_value object, napi_value key, napi_value value);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object on which to set the property.[in] key: The name of the property to set.[in] value: The property value.Returns napi_ok if the API succeeded.
This API set a property on the Object passed in.
napi_get_property#napi_status napi_get_property(napi_env env, napi_value object, napi_value key, napi_value* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object from which to retrieve the property.[in] key: The name of the property to retrieve.[out] result: The value of the property.Returns napi_ok if the API succeeded.
This API gets the requested property from the Object passed in.
napi_has_property#napi_status napi_has_property(napi_env env, napi_value object, napi_value key, bool* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object to query.[in] key: The name of the property whose existence to check.[out] result: Whether the property exists on the object or not.Returns napi_ok if the API succeeded.
This API checks if the Object passed in has the named property.
napi_delete_property#napi_status napi_delete_property(napi_env env, napi_value object, napi_value key, bool* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object to query.[in] key: The name of the property to delete.[out] result: Whether the property deletion succeeded or not. result can
optionally be ignored by passing NULL.Returns napi_ok if the API succeeded.
This API attempts to delete the key own property from object.
napi_has_own_property#napi_status napi_has_own_property(napi_env env, napi_value object, napi_value key, bool* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object to query.[in] key: The name of the own property whose existence to check.[out] result: Whether the own property exists on the object or not.Returns napi_ok if the API succeeded.
This API checks if the Object passed in has the named own property. key must
be a string or a symbol, or an error will be thrown. Node-API will not
perform any conversion between data types.
napi_set_named_property#napi_status napi_set_named_property(napi_env env, napi_value object, const char* utf8Name, napi_value value);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object on which to set the property.[in] utf8Name: The name of the property to set.[in] value: The property value.Returns napi_ok if the API succeeded.
This method is equivalent to calling napi_set_property with a napi_value
created from the string passed in as utf8Name.
napi_get_named_property#napi_status napi_get_named_property(napi_env env, napi_value object, const char* utf8Name, napi_value* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object from which to retrieve the property.[in] utf8Name: The name of the property to get.[out] result: The value of the property.Returns napi_ok if the API succeeded.
This method is equivalent to calling napi_get_property with a napi_value
created from the string passed in as utf8Name.
napi_has_named_property#napi_status napi_has_named_property(napi_env env, napi_value object, const char* utf8Name, bool* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object to query.[in] utf8Name: The name of the property whose existence to check.[out] result: Whether the property exists on the object or not.Returns napi_ok if the API succeeded.
This method is equivalent to calling napi_has_property with a napi_value
created from the string passed in as utf8Name.
napi_set_element#napi_status napi_set_element(napi_env env, napi_value object, uint32_t index, napi_value value);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object from which to set the properties.[in] index: The index of the property to set.[in] value: The property value.Returns napi_ok if the API succeeded.
This API sets an element on the Object passed in.
napi_get_element#napi_status napi_get_element(napi_env env, napi_value object, uint32_t index, napi_value* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object from which to retrieve the property.[in] index: The index of the property to get.[out] result: The value of the property.Returns napi_ok if the API succeeded.
This API gets the element at the requested index.
napi_has_element#napi_status napi_has_element(napi_env env, napi_value object, uint32_t index, bool* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object to query.[in] index: The index of the property whose existence to check.[out] result: Whether the property exists on the object or not.Returns napi_ok if the API succeeded.
This API returns if the Object passed in has an element at the
requested index.
napi_delete_element#napi_status napi_delete_element(napi_env env, napi_value object, uint32_t index, bool* result);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object to query.[in] index: The index of the property to delete.[out] result: Whether the element deletion succeeded or not. result can
optionally be ignored by passing NULL.Returns napi_ok if the API succeeded.
This API attempts to delete the specified index from object.
napi_define_properties#napi_status napi_define_properties(napi_env env, napi_value object, size_t property_count, const napi_property_descriptor* properties);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object from which to retrieve the properties.[in] property_count: The number of elements in the properties array.[in] properties: The array of property descriptors.Returns napi_ok if the API succeeded.
This method allows the efficient definition of multiple properties on a given
object. The properties are defined using property descriptors (see
napi_property_descriptor). Given an array of such property descriptors,
this API will set the properties on the object one at a time, as defined by
DefineOwnProperty() (described in Section DefineOwnProperty of the ECMA-262
specification).
napi_object_freeze#napi_status napi_object_freeze(napi_env env, napi_value object);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object to freeze.Returns napi_ok if the API succeeded.
This method freezes a given object. This prevents new properties from being added to it, existing properties from being removed, prevents changing the enumerability, configurability, or writability of existing properties, and prevents the values of existing properties from being changed. It also prevents the object's prototype from being changed. This is described in Section 19.1.2.6 of the ECMA-262 specification.
napi_object_seal#napi_status napi_object_seal(napi_env env, napi_value object);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object to seal.Returns napi_ok if the API succeeded.
This method seals a given object. This prevents new properties from being added to it, as well as marking all existing properties as non-configurable. This is described in Section 19.1.2.20 of the ECMA-262 specification.
node_api_set_prototype#Stability: 1 - Experimental
napi_status node_api_set_prototype(napi_env env, napi_value object, napi_value value);c
[in] env: The environment that the Node-API call is invoked under.[in] object: The object on which to set the prototype.[in] value: The prototype value.Returns napi_ok if the API succeeded.
This API sets the prototype of the Object passed in.
Node-API provides a set of APIs that allow JavaScript code to
call back into native code. Node-APIs that support calling back
into native code take in a callback functions represented by
the napi_callback type. When the JavaScript VM calls back to
native code, the napi_callback function provided is invoked. The APIs
documented in this section allow the callback function to do the
following:
napi_value back from the callback.Additionally, Node-API provides a set of functions which allow calling JavaScript functions from native code. One can either call a function like a regular JavaScript function call, or as a constructor function.
Any non-NULL data which is passed to this API via the data field of the
napi_property_descriptor items can be associated with object and freed
whenever object is garbage-collected by passing both object and the data to
napi_add_finalizer.
napi_call_function#NAPI_EXTERN napi_status napi_call_function(napi_env env, napi_value recv, napi_value func, size_t argc, const napi_value* argv, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] recv: The this value passed to the called function.[in] func: napi_value representing the JavaScript function to be invoked.[in] argc: The count of elements in the argv array.[in] argv: Array of napi_values representing JavaScript values passed in
as arguments to the function.[out] result: napi_value representing the JavaScript object returned.Returns napi_ok if the API succeeded.
This method allows a JavaScript function object to be called from a native
add-on. This is the primary mechanism of calling back from the add-on's
native code into JavaScript. For the special case of calling into JavaScript
after an async operation, see napi_make_callback.
A sample use case might look as follows. Consider the following JavaScript snippet:
function AddTwo(num) { return num + 2; } global.AddTwo = AddTwo;js
Then, the above function can be invoked from a native add-on using the following code:
// Get the function named "AddTwo" on the global object napi_value global, add_two, arg; napi_status status = napi_get_global(env, &global); if (status != napi_ok) return; status = napi_get_named_property(env, global, "AddTwo", &add_two); if (status != napi_ok) return; // const arg = 1337 status = napi_create_int32(env, 1337, &arg); if (status != napi_ok) return; napi_value* argv = &arg; size_t argc = 1; // AddTwo(arg); napi_value return_val; status = napi_call_function(env, global, add_two, argc, argv, &return_val); if (status != napi_ok) return; // Convert the result back to a native type int32_t result; status = napi_get_value_int32(env, return_val, &result); if (status != napi_ok) return;c
napi_create_function#napi_status napi_create_function(napi_env env, const char* utf8name, size_t length, napi_callback cb, void* data, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] utf8Name: Optional name of the function encoded as UTF8. This is
visible within JavaScript as the new function object's name property.[in] length: The length of the utf8name in bytes, or NAPI_AUTO_LENGTH if
it is null-terminated.[in] cb: The native function which should be called when this function
object is invoked. napi_callback provides more details.[in] data: User-provided data context. This will be passed back into the
function when invoked later.[out] result: napi_value representing the JavaScript function object for
the newly created function.Returns napi_ok if the API succeeded.
This API allows an add-on author to create a function object in native code. This is the primary mechanism to allow calling into the add-on's native code from JavaScript.
The newly created function is not automatically visible from script after this call. Instead, a property must be explicitly set on any object that is visible to JavaScript, in order for the function to be accessible from script.
In order to expose a function as part of the add-on's module exports, set the newly created function on the exports object. A sample module might look as follows:
napi_value SayHello(napi_env env, napi_callback_info info) { printf("Hello\n"); return NULL; } napi_value Init(napi_env env, napi_value exports) { napi_status status; napi_value fn; status = napi_create_function(env, NULL, 0, SayHello, NULL, &fn); if (status != napi_ok) return NULL; status = napi_set_named_property(env, exports, "sayHello", fn); if (status != napi_ok) return NULL; return exports; } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)c
Given the above code, the add-on can be used from JavaScript as follows:
const myaddon = require('./addon'); myaddon.sayHello();js
The string passed to require() is the name of the target in binding.gyp
responsible for creating the .node file.
Any non-NULL data which is passed to this API via the data parameter can
be associated with the resulting JavaScript function (which is returned in the
result parameter) and freed whenever the function is garbage-collected by
passing both the JavaScript function and the data to napi_add_finalizer.
JavaScript Functions are described in Section Function objects of the ECMAScript
Language Specification.
napi_get_cb_info#napi_status napi_get_cb_info(napi_env env, napi_callback_info cbinfo, size_t* argc, napi_value* argv, napi_value* thisArg, void** data)c
[in] env: The environment that the API is invoked under.[in] cbinfo: The callback info passed into the callback function.[in-out] argc: Specifies the length of the provided argv array and
receives the actual count of arguments. argc can
optionally be ignored by passing NULL.[out] argv: C array of napi_values to which the arguments will be
copied. If there are more arguments than the provided count, only the
requested number of arguments are copied. If there are fewer arguments
provided than claimed, the rest of argv is filled with napi_value values
that represent undefined. argv can optionally be ignored by
passing NULL.[out] thisArg: Receives the JavaScript this argument for the call.
thisArg can optionally be ignored by passing NULL.[out] data: Receives the data pointer for the callback. data can
optionally be ignored by passing NULL.Returns napi_ok if the API succeeded.
This method is used within a callback function to retrieve details about the
call like the arguments and the this pointer from a given callback info.
napi_get_new_target#napi_status napi_get_new_target(napi_env env, napi_callback_info cbinfo, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] cbinfo: The callback info passed into the callback function.[out] result: The new.target of the constructor call.Returns napi_ok if the API succeeded.
This API returns the new.target of the constructor call. If the current
callback is not a constructor call, the result is NULL.
napi_new_instance#napi_status napi_new_instance(napi_env env, napi_value cons, size_t argc, napi_value* argv, napi_value* result)c
[in] env: The environment that the API is invoked under.[in] cons: napi_value representing the JavaScript function to be invoked
as a constructor.[in] argc: The count of elements in the argv array.[in] argv: Array of JavaScript values as napi_value representing the
arguments to the constructor. If argc is zero this parameter may be
omitted by passing in NULL.[out] result: napi_value representing the JavaScript object returned,
which in this case is the constructed object.This method is used to instantiate a new JavaScript value using a given
napi_value that represents the constructor for the object. For example,
consider the following snippet:
function MyObject(param) { this.param = param; } const arg = 'hello'; const value = new MyObject(arg);js
The following can be approximated in Node-API using the following snippet:
// Get the constructor function MyObject napi_value global, constructor, arg, value; napi_status status = napi_get_global(env, &global); if (status != napi_ok) return; status = napi_get_named_property(env, global, "MyObject", &constructor); if (status != napi_ok) return; // const arg = "hello" status = napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &arg); if (status != napi_ok) return; napi_value* argv = &arg; size_t argc = 1; // const value = new MyObject(arg) status = napi_new_instance(env, constructor, argc, argv, &value);c
Returns napi_ok if the API succeeded.
Node-API offers a way to "wrap" C++ classes and instances so that the class constructor and methods can be called from JavaScript.
napi_define_class API defines a JavaScript class with constructor,
static properties and methods, and instance properties and methods that
correspond to the C++ class.napi_wrap to wrap a new C++ instance in a JavaScript object,
then returns the wrapper object.napi_callback C++ function is invoked. For an instance
callback, napi_unwrap obtains the C++ instance that is the target of
the call.For wrapped objects it may be difficult to distinguish between a function
called on a class prototype and a function called on an instance of a class.
A common pattern used to address this problem is to save a persistent
reference to the class constructor for later instanceof checks.
napi_value MyClass_constructor = NULL; status = napi_get_reference_value(env, MyClass::es_constructor, &MyClass_constructor); assert(napi_ok == status); bool is_instance = false; status = napi_instanceof(env, es_this, MyClass_constructor, &is_instance); assert(napi_ok == status); if (is_instance) { // napi_unwrap() ... } else { // otherwise... }c
The reference must be freed once it is no longer needed.
There are occasions where napi_instanceof() is insufficient for ensuring that
a JavaScript object is a wrapper for a certain native type. This is the case
especially when wrapped JavaScript objects are passed back into the addon via
static methods rather than as the this value of prototype methods. In such
cases there is a chance that they may be unwrapped incorrectly.
const myAddon = require('./build/Release/my_addon.node'); // `openDatabase()` returns a JavaScript object that wraps a native database // handle. const dbHandle = myAddon.openDatabase(); // `query()` returns a JavaScript object that wraps a native query handle. const queryHandle = myAddon.query(dbHandle, 'Gimme ALL the things!'); // There is an accidental error in the line below. The first parameter to // `myAddon.queryHasRecords()` should be the database handle (`dbHandle`), not // the query handle (`query`), so the correct condition for the while-loop // should be // // myAddon.queryHasRecords(dbHandle, queryHandle) // while (myAddon.queryHasRecords(queryHandle, dbHandle)) { // retrieve records }js
In the above example myAddon.queryHasRecords() is a method that accepts two
arguments. The first is a database handle and the second is a query handle.
Internally, it unwraps the first argument and casts the resulting pointer to a
native database handle. It then unwraps the second argument and casts the
resulting pointer to a query handle. If the arguments are passed in the wrong
order, the casts will work, however, there is a good chance that the underlying
database operation will fail, or will even cause an invalid memory access.
To ensure that the pointer retrieved from the first argument is indeed a pointer
to a database handle and, similarly, that the pointer retrieved from the second
argument is indeed a pointer to a query handle, the implementation of
queryHasRecords() has to perform a type validation. Retaining the JavaScript
class constructor from which the database handle was instantiated and the
constructor from which the query handle was instantiated in napi_refs can
help, because napi_instanceof() can then be used to ensure that the instances
passed into queryHashRecords() are indeed of the correct type.
Unfortunately, napi_instanceof() does not protect against prototype
manipulation. For example, the prototype of the database handle instance can be
set to the prototype of the constructor for query handle instances. In this
case, the database handle instance can appear as a query handle instance, and it
will pass the napi_instanceof() test for a query handle instance, while still
containing a pointer to a database handle.
To this end, Node-API provides type-tagging capabilities.
A type tag is a 128-bit integer unique to the addon. Node-API provides the
napi_type_tag structure for storing a type tag. When such a value is passed
along with a JavaScript object or external stored in a napi_value to
napi_type_tag_object(), the JavaScript object will be "marked" with the
type tag. The "mark" is invisible on the JavaScript side. When a JavaScript
object arrives into a native binding, napi_check_object_type_tag() can be used
along with the original type tag to determine whether the JavaScript object was
previously "marked" with the type tag. This creates a type-checking capability
of a higher fidelity than napi_instanceof() can provide, because such type-
tagging survives prototype manipulation and addon unloading/reloading.
Continuing the above example, the following skeleton addon implementation
illustrates the use of napi_type_tag_object() and
napi_check_object_type_tag().
// This value is the type tag for a database handle. The command // // uuidgen | sed -r -e 's/-//g' -e 's/(.{16})(.*)/0x\1, 0x\2/' // // can be used to obtain the two values with which to initialize the structure. static const napi_type_tag DatabaseHandleTypeTag = { 0x1edf75a38336451d, 0xa5ed9ce2e4c00c38 }; // This value is the type tag for a query handle. static const napi_type_tag QueryHandleTypeTag = { 0x9c73317f9fad44a3, 0x93c3920bf3b0ad6a }; static napi_value openDatabase(napi_env env, napi_callback_info info) { napi_status status; napi_value result; // Perform the underlying action which results in a database handle. DatabaseHandle* dbHandle = open_database(); // Create a new, empty JS object. status = napi_create_object(env, &result); if (status != napi_ok) return NULL; // Tag the object to indicate that it holds a pointer to a `DatabaseHandle`. status = napi_type_tag_object(env, result, &DatabaseHandleTypeTag); if (status != napi_ok) return NULL; // Store the pointer to the `DatabaseHandle` structure inside the JS object. status = napi_wrap(env, result, dbHandle, NULL, NULL, NULL); if (status != napi_ok) return NULL; return result; } // Later when we receive a JavaScript object purporting to be a database handle // we can use `napi_check_object_type_tag()` to ensure that it is indeed such a // handle. static napi_value query(napi_env env, napi_callback_info info) { napi_status status; size_t argc = 2; napi_value argv[2]; bool is_db_handle; status = napi_get_cb_info(env, info, &argc, argv, NULL, NULL); if (status != napi_ok) return NULL; // Check that the object passed as the first parameter has the previously // applied tag. status = napi_check_object_type_tag(env, argv[0], &DatabaseHandleTypeTag, &is_db_handle); if (status != napi_ok) return NULL; // Throw a `TypeError` if it doesn't. if (!is_db_handle) { // Throw a TypeError. return NULL; } }c
napi_define_class#napi_status napi_define_class(napi_env env, const char* utf8name, size_t length, napi_callback constructor, void* data, size_t property_count, const napi_property_descriptor* properties, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] utf8name: Name of the JavaScript constructor function. For clarity,
it is recommended to use the C++ class name when wrapping a C++ class.[in] length: The length of the utf8name in bytes, or NAPI_AUTO_LENGTH
if it is null-terminated.[in] constructor: Callback function that handles constructing instances
of the class. When wrapping a C++ class, this method must be a static member
with the napi_callback signature. A C++ class constructor cannot be
used. napi_callback provides more details.[in] data: Optional data to be passed to the constructor callback as
the data property of the callback info.[in] property_count: Number of items in the properties array argument.[in] properties: Array of property descriptors describing static and
instance data properties, accessors, and methods on the class
See napi_property_descriptor.[out] result: A napi_value representing the constructor function for
the class.Returns napi_ok if the API succeeded.
Defines a JavaScript class, including:
constructor can be used to
instantiate a new C++ class instance, which can then be placed inside the
JavaScript object instance being constructed using napi_wrap.napi_static attribute).prototype object. When wrapping a
C++ class, non-static data properties, accessors, and methods of the C++
class can be called from the static functions given in the property
descriptors without the napi_static attribute after retrieving the C++ class
instance placed inside the JavaScript object instance by using
napi_unwrap.When wrapping a C++ class, the C++ constructor callback passed via constructor
should be a static method on the class that calls the actual class constructor,
then wraps the new C++ instance in a JavaScript object, and returns the wrapper
object. See napi_wrap for details.
The JavaScript constructor function returned from napi_define_class is
often saved and used later to construct new instances of the class from native
code, and/or to check whether provided values are instances of the class. In
that case, to prevent the function value from being garbage-collected, a
strong persistent reference to it can be created using
napi_create_reference, ensuring that the reference count is kept >= 1.
Any non-NULL data which is passed to this API via the data parameter or via
the data field of the napi_property_descriptor array items can be associated
with the resulting JavaScript constructor (which is returned in the result
parameter) and freed whenever the class is garbage-collected by passing both
the JavaScript function and the data to napi_add_finalizer.
napi_wrap#napi_status napi_wrap(napi_env env, napi_value js_object, void* native_object, napi_finalize finalize_cb, void* finalize_hint, napi_ref* result);c
[in] env: The environment that the API is invoked under.[in] js_object: The JavaScript object that will be the wrapper for the
native object.[in] native_object: The native instance that will be wrapped in the
JavaScript object.[in] finalize_cb: Optional native callback that can be used to free the
native instance when the JavaScript object has been garbage-collected.
napi_finalize provides more details.[in] finalize_hint: Optional contextual hint that is passed to the
finalize callback.[out] result: Optional reference to the wrapped object.Returns napi_ok if the API succeeded.
Wraps a native instance in a JavaScript object. The native instance can be
retrieved later using napi_unwrap().
When JavaScript code invokes a constructor for a class that was defined using
napi_define_class(), the napi_callback for the constructor is invoked.
After constructing an instance of the native class, the callback must then call
napi_wrap() to wrap the newly constructed instance in the already-created
JavaScript object that is the this argument to the constructor callback.
(That this object was created from the constructor function's prototype,
so it already has definitions of all the instance properties and methods.)
Typically when wrapping a class instance, a finalize callback should be
provided that simply deletes the native instance that is received as the data
argument to the finalize callback.
The optional returned reference is initially a weak reference, meaning it has a reference count of 0. Typically this reference count would be incremented temporarily during async operations that require the instance to remain valid.
Caution: The optional returned reference (if obtained) should be deleted via
napi_delete_reference ONLY in response to the finalize callback
invocation. If it is deleted before then, then the finalize callback may never
be invoked. Therefore, when obtaining a reference a finalize callback is also
required in order to enable correct disposal of the reference.
Finalizer callbacks may be deferred, leaving a window where the object has
been garbage collected (and the weak reference is invalid) but the finalizer
hasn't been called yet. When using napi_get_reference_value() on weak
references returned by napi_wrap(), you should still handle an empty result.
Calling napi_wrap() a second time on an object will return an error. To
associate another native instance with the object, use napi_remove_wrap()
first.
napi_unwrap#napi_status napi_unwrap(napi_env env, napi_value js_object, void** result);c
[in] env: The environment that the API is invoked under.[in] js_object: The object associated with the native instance.[out] result: Pointer to the wrapped native instance.Returns napi_ok if the API succeeded.
Retrieves a native instance that was previously wrapped in a JavaScript
object using napi_wrap().
When JavaScript code invokes a method or property accessor on the class, the
corresponding napi_callback is invoked. If the callback is for an instance
method or accessor, then the this argument to the callback is the wrapper
object; the wrapped C++ instance that is the target of the call can be obtained
then by calling napi_unwrap() on the wrapper object.
napi_remove_wrap#napi_status napi_remove_wrap(napi_env env, napi_value js_object, void** result);c
[in] env: The environment that the API is invoked under.[in] js_object: The object associated with the native instance.[out] result: Pointer to the wrapped native instance.Returns napi_ok if the API succeeded.
Retrieves a native instance that was previously wrapped in the JavaScript
object js_object using napi_wrap() and removes the wrapping. If a finalize
callback was associated with the wrapping, it will no longer be called when the
JavaScript object becomes garbage-collected.
napi_type_tag_object#napi_status napi_type_tag_object(napi_env env, napi_value js_object, const napi_type_tag* type_tag);c
[in] env: The environment that the API is invoked under.[in] js_object: The JavaScript object or external to be marked.[in] type_tag: The tag with which the object is to be marked.Returns napi_ok if the API succeeded.
Associates the value of the type_tag pointer with the JavaScript object or
external. napi_check_object_type_tag() can then be used to compare the tag
that was attached to the object with one owned by the addon to ensure that the
object has the right type.
If the object already has an associated type tag, this API will return
napi_invalid_arg.
napi_check_object_type_tag#napi_status napi_check_object_type_tag(napi_env env, napi_value js_object, const napi_type_tag* type_tag, bool* result);c
[in] env: The environment that the API is invoked under.[in] js_object: The JavaScript object or external whose type tag to
examine.[in] type_tag: The tag with which to compare any tag found on the object.[out] result: Whether the type tag given matched the type tag on the
object. false is also returned if no type tag was found on the object.Returns napi_ok if the API succeeded.
Compares the pointer given as type_tag with any that can be found on
js_object. If no tag is found on js_object or, if a tag is found but it does
not match type_tag, then result is set to false. If a tag is found and it
matches type_tag, then result is set to true.
napi_add_finalizer#napi_status napi_add_finalizer(napi_env env, napi_value js_object, void* finalize_data, node_api_basic_finalize finalize_cb, void* finalize_hint, napi_ref* result);c
[in] env: The environment that the API is invoked under.[in] js_object: The JavaScript object to which the native data will be
attached.[in] finalize_data: Optional data to be passed to finalize_cb.[in] finalize_cb: Native callback that will be used to free the
native data when the JavaScript object has been garbage-collected.
napi_finalize provides more details.[in] finalize_hint: Optional contextual hint that is passed to the
finalize callback.[out] result: Optional reference to the JavaScript object.Returns napi_ok if the API succeeded.
Adds a napi_finalize callback which will be called when the JavaScript object
in js_object has been garbage-collected.
This API can be called multiple times on a single JavaScript object.
Caution: The optional returned reference (if obtained) should be deleted via
napi_delete_reference ONLY in response to the finalize callback
invocation. If it is deleted before then, then the finalize callback may never
be invoked. Therefore, when obtaining a reference a finalize callback is also
required in order to enable correct disposal of the reference.
node_api_post_finalizer#Stability: 1 - Experimental
napi_status node_api_post_finalizer(node_api_basic_env env, napi_finalize finalize_cb, void* finalize_data, void* finalize_hint);c
[in] env: The environment that the API is invoked under.[in] finalize_cb: Native callback that will be used to free the
native data when the JavaScript object has been garbage-collected.
napi_finalize provides more details.[in] finalize_data: Optional data to be passed to finalize_cb.[in] finalize_hint: Optional contextual hint that is passed to the
finalize callback.Returns napi_ok if the API succeeded.
Schedules a napi_finalize callback to be called asynchronously in the
event loop.
Normally, finalizers are called while the GC (garbage collector) collects objects. At that point calling any Node-API that may cause changes in the GC state will be disabled and will crash Node.js.
node_api_post_finalizer helps to work around this limitation by allowing the
add-on to defer calls to such Node-APIs to a point in time outside of the GC
finalization.
Addon modules often need to leverage async helpers from libuv as part of their implementation. This allows them to schedule work to be executed asynchronously so that their methods can return in advance of the work being completed. This allows them to avoid blocking overall execution of the Node.js application.
Node-API provides an ABI-stable interface for these supporting functions which covers the most common asynchronous use cases.
Node-API defines the napi_async_work structure which is used to manage
asynchronous workers. Instances are created/deleted with
napi_create_async_work and napi_delete_async_work.
The execute and complete callbacks are functions that will be
invoked when the executor is ready to execute and when it completes its
task respectively.
The execute function should avoid making any Node-API calls
that could result in the execution of JavaScript or interaction with
JavaScript objects. Most often, any code that needs to make Node-API
calls should be made in complete callback instead.
Avoid using the napi_env parameter in the execute callback as
it will likely execute JavaScript.
These functions implement the following interfaces:
typedef void (*napi_async_execute_callback)(napi_env env, void* data); typedef void (*napi_async_complete_callback)(napi_env env, napi_status status, void* data);c
When these methods are invoked, the data parameter passed will be the
addon-provided void* data that was passed into the
napi_create_async_work call.
Once created the async worker can be queued
for execution using the napi_queue_async_work function:
napi_status napi_queue_async_work(node_api_basic_env env, napi_async_work work);c
napi_cancel_async_work can be used if the work needs
to be cancelled before the work has started execution.
After calling napi_cancel_async_work, the complete callback
will be invoked with a status value of napi_cancelled.
The work should not be deleted before the complete
callback invocation, even when it was cancelled.
napi_create_async_work#| Version | Changes |
|---|---|
| v8.6.0 | Added |
napi_status napi_create_async_work(napi_env env, napi_value async_resource, napi_value async_resource_name, napi_async_execute_callback execute, napi_async_complete_callback complete, void* data, napi_async_work* result);c
[in] env: The environment that the API is invoked under.[in] async_resource: An optional object associated with the async work
that will be passed to possible async_hooks init hooks.[in] async_resource_name: Identifier for the kind of resource that is being
provided for diagnostic information exposed by the async_hooks API.[in] execute: The native function which should be called to execute the
logic asynchronously. The given function is called from a worker pool thread
and can execute in parallel with the main event loop thread.[in] complete: The native function which will be called when the
asynchronous logic is completed or is cancelled. The given function is called
from the main event loop thread. napi_async_complete_callback provides
more details.[in] data: User-provided data context. This will be passed back into the
execute and complete functions.[out] result: napi_async_work* which is the handle to the newly created
async work.Returns napi_ok if the API succeeded.
This API allocates a work object that is used to execute logic asynchronously.
It should be freed using napi_delete_async_work once the work is no longer
required.
async_resource_name should be a null-terminated, UTF-8-encoded string.
The async_resource_name identifier is provided by the user and should be
representative of the type of async work being performed. It is also recommended
to apply namespacing to the identifier, e.g. by including the module name. See
the async_hooks documentation for more information.
napi_delete_async_work#napi_status napi_delete_async_work(napi_env env, napi_async_work work);c
[in] env: The environment that the API is invoked under.[in] work: The handle returned by the call to napi_create_async_work.Returns napi_ok if the API succeeded.
This API frees a previously allocated work object.
This API can be called even if there is a pending JavaScript exception.
napi_queue_async_work#napi_status napi_queue_async_work(node_api_basic_env env, napi_async_work work);c
[in] env: The environment that the API is invoked under.[in] work: The handle returned by the call to napi_create_async_work.Returns napi_ok if the API succeeded.
This API requests that the previously allocated work be scheduled
for execution. Once it returns successfully, this API must not be called again
with the same napi_async_work item or the result will be undefined.
napi_cancel_async_work#napi_status napi_cancel_async_work(node_api_basic_env env, napi_async_work work);c
[in] env: The environment that the API is invoked under.[in] work: The handle returned by the call to napi_create_async_work.Returns napi_ok if the API succeeded.
This API cancels queued work if it has not yet
been started. If it has already started executing, it cannot be
cancelled and napi_generic_failure will be returned. If successful,
the complete callback will be invoked with a status value of
napi_cancelled. The work should not be deleted before the complete
callback invocation, even if it has been successfully cancelled.
This API can be called even if there is a pending JavaScript exception.
The simple asynchronous work APIs above may not be appropriate for every scenario. When using any other asynchronous mechanism, the following APIs are necessary to ensure an asynchronous operation is properly tracked by the runtime.
napi_async_init#| Version | Changes |
|---|---|
| v25.0.0 | The |
napi_status napi_async_init(napi_env env, napi_value async_resource, napi_value async_resource_name, napi_async_context* result)c
[in] env: The environment that the API is invoked under.[in] async_resource: Object associated with the async work
that will be passed to possible async_hooks init hooks and can be
accessed by async_hooks.executionAsyncResource().[in] async_resource_name: Identifier for the kind of resource that is being
provided for diagnostic information exposed by the async_hooks API.[out] result: The initialized async context.Returns napi_ok if the API succeeded.
In order to retain ABI compatibility with previous versions, passing NULL
for async_resource does not result in an error. However, this is not
recommended as this will result in undesirable behavior with async_hooks
init hooks and async_hooks.executionAsyncResource() as the resource is
now required by the underlying async_hooks implementation in order to provide
the linkage between async callbacks.
Previous versions of this API were not maintaining a strong reference to
async_resource while the napi_async_context object existed and instead
expected the caller to hold a strong reference. This has been changed, as a
corresponding call to napi_async_destroy for every call to
napi_async_init() is a requirement in any case to avoid memory leaks.
napi_async_destroy#napi_status napi_async_destroy(napi_env env, napi_async_context async_context);c
[in] env: The environment that the API is invoked under.[in] async_context: The async context to be destroyed.Returns napi_ok if the API succeeded.
This API can be called even if there is a pending JavaScript exception.
napi_make_callback#| Version | Changes |
|---|---|
| v8.6.0 | Added |
NAPI_EXTERN napi_status napi_make_callback(napi_env env, napi_async_context async_context, napi_value recv, napi_value func, size_t argc, const napi_value* argv, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] async_context: Context for the async operation that is
invoking the callback. This should normally be a value previously
obtained from napi_async_init.
In order to retain ABI compatibility with previous versions, passing NULL
for async_context does not result in an error. However, this results
in incorrect operation of async hooks. Potential issues include loss of
async context when using the AsyncLocalStorage API.[in] recv: The this value passed to the called function.[in] func: napi_value representing the JavaScript function to be invoked.[in] argc: The count of elements in the argv array.[in] argv: Array of JavaScript values as napi_value representing the
arguments to the function. If argc is zero this parameter may be
omitted by passing in NULL.[out] result: napi_value representing the JavaScript object returned.Returns napi_ok if the API succeeded.
This method allows a JavaScript function object to be called from a native
add-on. This API is similar to napi_call_function. However, it is used to call
from native code back into JavaScript after returning from an async
operation (when there is no other script on the stack). It is a fairly simple
wrapper around node::MakeCallback.
Note it is not necessary to use napi_make_callback from within a
napi_async_complete_callback; in that situation the callback's async
context has already been set up, so a direct call to napi_call_function
is sufficient and appropriate. Use of the napi_make_callback function
may be required when implementing custom async behavior that does not use
napi_create_async_work.
Any process.nextTicks or Promises scheduled on the microtask queue by
JavaScript during the callback are ran before returning back to C/C++.
napi_open_callback_scope#NAPI_EXTERN napi_status napi_open_callback_scope(napi_env env, napi_value resource_object, napi_async_context context, napi_callback_scope* result)c
[in] env: The environment that the API is invoked under.[in] resource_object: An object associated with the async work
that will be passed to possible async_hooks init hooks. This
parameter has been deprecated and is ignored at runtime. Use the
async_resource parameter in napi_async_init instead.[in] context: Context for the async operation that is invoking the callback.
This should be a value previously obtained from napi_async_init.[out] result: The newly created scope.There are cases (for example, resolving promises) where it is
necessary to have the equivalent of the scope associated with a callback
in place when making certain Node-API calls. If there is no other script on
the stack the napi_open_callback_scope and
napi_close_callback_scope functions can be used to open/close
the required scope.
napi_close_callback_scope#NAPI_EXTERN napi_status napi_close_callback_scope(napi_env env, napi_callback_scope scope)c
[in] env: The environment that the API is invoked under.[in] scope: The scope to be closed.This API can be called even if there is a pending JavaScript exception.
napi_get_node_version#typedef struct { uint32_t major; uint32_t minor; uint32_t patch; const char* release; } napi_node_version; napi_status napi_get_node_version(node_api_basic_env env, const napi_node_version** version);c
[in] env: The environment that the API is invoked under.[out] version: A pointer to version information for Node.js itself.Returns napi_ok if the API succeeded.
This function fills the version struct with the major, minor, and patch
version of Node.js that is currently running, and the release field with the
value of process.release.name.
The returned buffer is statically allocated and does not need to be freed.
napi_get_version#napi_status napi_get_version(node_api_basic_env env, uint32_t* result);c
[in] env: The environment that the API is invoked under.[out] result: The highest version of Node-API supported.Returns napi_ok if the API succeeded.
This API returns the highest Node-API version supported by the Node.js runtime. Node-API is planned to be additive such that newer releases of Node.js may support additional API functions. In order to allow an addon to use a newer function when running with versions of Node.js that support it, while providing fallback behavior when running with Node.js versions that don't support it:
napi_get_version() to determine if the API is available.uv_dlsym().napi_adjust_external_memory#NAPI_EXTERN napi_status napi_adjust_external_memory(node_api_basic_env env, int64_t change_in_bytes, int64_t* result);c
[in] env: The environment that the API is invoked under.[in] change_in_bytes: The change in externally allocated memory that is kept
alive by JavaScript objects.[out] result: The adjusted value. This value should reflect the
total amount of external memory with the given change_in_bytes included.
The absolute value of the returned value should not be depended on.
For example, implementations may use a single counter for all addons, or a
counter for each addon.Returns napi_ok if the API succeeded.
This function gives the runtime an indication of the amount of externally allocated memory that is kept alive by JavaScript objects (i.e. a JavaScript object that points to its own memory allocated by a native addon). Registering externally allocated memory may, but is not guaranteed to, trigger global garbage collections more often than it would otherwise.
This function is expected to be called in a manner such that an addon does not decrease the external memory more than it has increased the external memory.
Node-API provides facilities for creating Promise objects as described in
Section Promise objects of the ECMA specification. It implements promises as a pair of
objects. When a promise is created by napi_create_promise(), a "deferred"
object is created and returned alongside the Promise. The deferred object is
bound to the created Promise and is the only means to resolve or reject the
Promise using napi_resolve_deferred() or napi_reject_deferred(). The
deferred object that is created by napi_create_promise() is freed by
napi_resolve_deferred() or napi_reject_deferred(). The Promise object may
be returned to JavaScript where it can be used in the usual fashion.
For example, to create a promise and pass it to an asynchronous worker:
napi_deferred deferred; napi_value promise; napi_status status; // Create the promise. status = napi_create_promise(env, &deferred, &promise); if (status != napi_ok) return NULL; // Pass the deferred to a function that performs an asynchronous action. do_something_asynchronous(deferred); // Return the promise to JS return promise;c
The above function do_something_asynchronous() would perform its asynchronous
action and then it would resolve or reject the deferred, thereby concluding the
promise and freeing the deferred:
napi_deferred deferred; napi_value undefined; napi_status status; // Create a value with which to conclude the deferred. status = napi_get_undefined(env, &undefined); if (status != napi_ok) return NULL; // Resolve or reject the promise associated with the deferred depending on // whether the asynchronous action succeeded. if (asynchronous_action_succeeded) { status = napi_resolve_deferred(env, deferred, undefined); } else { status = napi_reject_deferred(env, deferred, undefined); } if (status != napi_ok) return NULL; // At this point the deferred has been freed, so we should assign NULL to it. deferred = NULL;c
napi_create_promise#napi_status napi_create_promise(napi_env env, napi_deferred* deferred, napi_value* promise);c
[in] env: The environment that the API is invoked under.[out] deferred: A newly created deferred object which can later be passed to
napi_resolve_deferred() or napi_reject_deferred() to resolve resp. reject
the associated promise.[out] promise: The JavaScript promise associated with the deferred object.Returns napi_ok if the API succeeded.
This API creates a deferred object and a JavaScript promise.
napi_resolve_deferred#napi_status napi_resolve_deferred(napi_env env, napi_deferred deferred, napi_value resolution);c
[in] env: The environment that the API is invoked under.[in] deferred: The deferred object whose associated promise to resolve.[in] resolution: The value with which to resolve the promise.This API resolves a JavaScript promise by way of the deferred object
with which it is associated. Thus, it can only be used to resolve JavaScript
promises for which the corresponding deferred object is available. This
effectively means that the promise must have been created using
napi_create_promise() and the deferred object returned from that call must
have been retained in order to be passed to this API.
The deferred object is freed upon successful completion.
napi_reject_deferred#napi_status napi_reject_deferred(napi_env env, napi_deferred deferred, napi_value rejection);c
[in] env: The environment that the API is invoked under.[in] deferred: The deferred object whose associated promise to resolve.[in] rejection: The value with which to reject the promise.This API rejects a JavaScript promise by way of the deferred object
with which it is associated. Thus, it can only be used to reject JavaScript
promises for which the corresponding deferred object is available. This
effectively means that the promise must have been created using
napi_create_promise() and the deferred object returned from that call must
have been retained in order to be passed to this API.
The deferred object is freed upon successful completion.
napi_is_promise#napi_status napi_is_promise(napi_env env, napi_value value, bool* is_promise);c
[in] env: The environment that the API is invoked under.[in] value: The value to examine[out] is_promise: Flag indicating whether promise is a native promise
object (that is, a promise object created by the underlying engine).Node-API provides an API for executing a string containing JavaScript using the underlying JavaScript engine.
napi_run_script#NAPI_EXTERN napi_status napi_run_script(napi_env env, napi_value script, napi_value* result);c
[in] env: The environment that the API is invoked under.[in] script: A JavaScript string containing the script to execute.[out] result: The value resulting from having executed the script.This function executes a string of JavaScript code and returns its result with the following caveats:
eval, this function does not allow the script to access the current
lexical scope, and therefore also does not allow to access the
module scope, meaning that pseudo-globals such as require will not be
available.var declarations
in the script will be added to the global object. Variable declarations
made using let and const will be visible globally, but will not be added
to the global object.this is global within the script.Node-API provides a function for getting the current event loop associated with
a specific napi_env.
napi_get_uv_event_loop#NAPI_EXTERN napi_status napi_get_uv_event_loop(node_api_basic_env env, struct uv_loop_s** loop);c
[in] env: The environment that the API is invoked under.[out] loop: The current libuv loop instance.Note: While libuv only guarantees ABI stability in a major version, its use may result in an addon that does not work across Node.js major versions.
ThreadSafeFunction is an ABI-stable alternative for many use cases to calling into the JavaScript thread from another thread.
JavaScript functions can normally only be called from a native addon's main
thread. If an addon creates additional threads, then Node-API functions that
require a napi_env, napi_value, or napi_ref must not be called from those
threads.
When an addon has additional threads and JavaScript functions need to be invoked based on the processing completed by those threads, those threads must communicate with the addon's main thread so that the main thread can invoke the JavaScript function on their behalf. The thread-safe function APIs provide an easy way to do this.
These APIs provide the type napi_threadsafe_function as well as APIs to
create, destroy, and call objects of this type.
napi_create_threadsafe_function() creates a persistent reference to a
napi_value that holds a JavaScript function which can be called from multiple
threads. The calls happen asynchronously. This means that values with which the
JavaScript callback is to be called will be placed in a queue, and, for each
value in the queue, a call will eventually be made to the JavaScript function.
Upon creation of a napi_threadsafe_function a napi_finalize callback can be
provided. This callback will be invoked on the main thread when the thread-safe
function is about to be destroyed. It receives the context and the finalize data
given during construction, and provides an opportunity for cleaning up after the
threads e.g. by calling uv_thread_join(). Aside from the main loop thread,
no threads should be using the thread-safe function after the finalize callback
completes.
The context given during the call to napi_create_threadsafe_function() can
be retrieved from any thread with a call to
napi_get_threadsafe_function_context().
napi_call_threadsafe_function() can be used for initiating a call into
JavaScript. napi_call_threadsafe_function() accepts a parameter which controls
whether the API behaves blockingly. If set to napi_tsfn_nonblocking, the API
behaves non-blockingly, returning napi_queue_full if the queue was full,
preventing data from being successfully added to the queue. If set to
napi_tsfn_blocking, the API blocks until space becomes available in the queue.
napi_call_threadsafe_function() never blocks if the thread-safe function was
created with a maximum queue size of 0.
napi_call_threadsafe_function() should not be called with napi_tsfn_blocking
from a JavaScript thread, because, if the queue is full, it may cause the
JavaScript thread to deadlock.
The actual call into JavaScript is controlled by the callback given via the
call_js_cb parameter. call_js_cb is invoked on the main thread once for each
value that was placed into the queue by a successful call to
napi_call_threadsafe_function(). If such a callback is not given, a default
callback will be used, and the resulting JavaScript call will have no arguments.
The call_js_cb callback receives the JavaScript function to call as a
napi_value in its parameters, as well as the void* context pointer used when
creating the napi_threadsafe_function, and the next data pointer that was
created by one of the secondary threads. The callback can then use an API such
as napi_call_function() to call into JavaScript.
The callback may also be invoked with env and call_js_cb both set to NULL
to indicate that calls into JavaScript are no longer possible, while items
remain in the queue that may need to be freed. This normally occurs when the
Node.js process exits while there is a thread-safe function still active.
It is not necessary to call into JavaScript via napi_make_callback() because
Node-API runs call_js_cb in a context appropriate for callbacks.
Zero or more queued items may be invoked in each tick of the event loop. Applications should not depend on a specific behavior other than progress in invoking callbacks will be made and events will be invoked as time moves forward.
Threads can be added to and removed from a napi_threadsafe_function object
during its existence. Thus, in addition to specifying an initial number of
threads upon creation, napi_acquire_threadsafe_function can be called to
indicate that a new thread will start making use of the thread-safe function.
Similarly, napi_release_threadsafe_function can be called to indicate that an
existing thread will stop making use of the thread-safe function.
napi_threadsafe_function objects are destroyed when every thread which uses
the object has called napi_release_threadsafe_function() or has received a
return status of napi_closing in response to a call to
napi_call_threadsafe_function. The queue is emptied before the
napi_threadsafe_function is destroyed. napi_release_threadsafe_function()
should be the last API call made in conjunction with a given
napi_threadsafe_function, because after the call completes, there is no
guarantee that the napi_threadsafe_function is still allocated. For the same
reason, do not use a thread-safe function
after receiving a return value of napi_closing in response to a call to
napi_call_threadsafe_function. Data associated with the
napi_threadsafe_function can be freed in its napi_finalize callback which
was passed to napi_create_threadsafe_function(). The parameter
initial_thread_count of napi_create_threadsafe_function marks the initial
number of acquisitions of the thread-safe functions, instead of calling
napi_acquire_threadsafe_function multiple times at creation.
Once the number of threads making use of a napi_threadsafe_function reaches
zero, no further threads can start making use of it by calling
napi_acquire_threadsafe_function(). In fact, all subsequent API calls
associated with it, except napi_release_threadsafe_function(), will return an
error value of napi_closing.
The thread-safe function can be "aborted" by giving a value of napi_tsfn_abort
to napi_release_threadsafe_function(). This will cause all subsequent APIs
associated with the thread-safe function except
napi_release_threadsafe_function() to return napi_closing even before its
reference count reaches zero. In particular, napi_call_threadsafe_function()
will return napi_closing, thus informing the threads that it is no longer
possible to make asynchronous calls to the thread-safe function. This can be
used as a criterion for terminating the thread. Upon receiving a return value
of napi_closing from napi_call_threadsafe_function() a thread must not use
the thread-safe function anymore because it is no longer guaranteed to
be allocated.
Similarly to libuv handles, thread-safe functions can be "referenced" and
"unreferenced". A "referenced" thread-safe function will cause the event loop on
the thread on which it is created to remain alive until the thread-safe function
is destroyed. In contrast, an "unreferenced" thread-safe function will not
prevent the event loop from exiting. The APIs napi_ref_threadsafe_function and
napi_unref_threadsafe_function exist for this purpose.
Neither does napi_unref_threadsafe_function mark the thread-safe functions as
able to be destroyed nor does napi_ref_threadsafe_function prevent it from
being destroyed.
napi_create_threadsafe_function#| Version | Changes |
|---|---|
| v12.6.0, v10.17.0 | Made |
NAPI_EXTERN napi_status napi_create_threadsafe_function(napi_env env, napi_value func, napi_value async_resource, napi_value async_resource_name, size_t max_queue_size, size_t initial_thread_count, void* thread_finalize_data, napi_finalize thread_finalize_cb, void* context, napi_threadsafe_function_call_js call_js_cb, napi_threadsafe_function* result);c
[in] env: The environment that the API is invoked under.[in] func: An optional JavaScript function to call from another thread. It
must be provided if NULL is passed to call_js_cb.[in] async_resource: An optional object associated with the async work that
will be passed to possible async_hooks init hooks.[in] async_resource_name: A JavaScript string to provide an identifier for
the kind of resource that is being provided for diagnostic information exposed
by the async_hooks API.[in] max_queue_size: Maximum size of the queue. 0 for no limit.[in] initial_thread_count: The initial number of acquisitions, i.e. the
initial number of threads, including the main thread, which will be making use
of this function.[in] thread_finalize_data: Optional data to be passed to thread_finalize_cb.[in] thread_finalize_cb: Optional function to call when the
napi_threadsafe_function is being destroyed.[in] context: Optional data to attach to the resulting
napi_threadsafe_function.[in] call_js_cb: Optional callback which calls the JavaScript function in
response to a call on a different thread. This callback will be called on the
main thread. If not given, the JavaScript function will be called with no
parameters and with undefined as its this value.
napi_threadsafe_function_call_js provides more details.[out] result: The asynchronous thread-safe JavaScript function.Change History:
Version 10 (NAPI_VERSION is defined as 10 or higher):
Uncaught exceptions thrown in call_js_cb are handled with the
'uncaughtException' event, instead of being ignored.
napi_get_threadsafe_function_context#NAPI_EXTERN napi_status napi_get_threadsafe_function_context(napi_threadsafe_function func, void** result);c
[in] func: The thread-safe function for which to retrieve the context.[out] result: The location where to store the context.This API may be called from any thread which makes use of func.
napi_call_threadsafe_function#| Version | Changes |
|---|---|
| v14.5.0 | Support for |
| v14.1.0 | Return |
NAPI_EXTERN napi_status napi_call_threadsafe_function(napi_threadsafe_function func, void* data, napi_threadsafe_function_call_mode is_blocking);c
[in] func: The asynchronous thread-safe JavaScript function to invoke.[in] data: Data to send into JavaScript via the callback call_js_cb
provided during the creation of the thread-safe JavaScript function.[in] is_blocking: Flag whose value can be either napi_tsfn_blocking to
indicate that the call should block if the queue is full or
napi_tsfn_nonblocking to indicate that the call should return immediately
with a status of napi_queue_full whenever the queue is full.This API should not be called with napi_tsfn_blocking from a JavaScript
thread, because, if the queue is full, it may cause the JavaScript thread to
deadlock.
This API will return napi_closing if napi_release_threadsafe_function() was
called with abort set to napi_tsfn_abort from any thread. The value is only
added to the queue if the API returns napi_ok.
This API may be called from any thread which makes use of func.
napi_acquire_threadsafe_function#NAPI_EXTERN napi_status napi_acquire_threadsafe_function(napi_threadsafe_function func);c
[in] func: The asynchronous thread-safe JavaScript function to start making
use of.A thread should call this API before passing func to any other thread-safe
function APIs to indicate that it will be making use of func. This prevents
func from being destroyed when all other threads have stopped making use of
it.
This API may be called from any thread which will start making use of func.
napi_release_threadsafe_function#NAPI_EXTERN napi_status napi_release_threadsafe_function(napi_threadsafe_function func, napi_threadsafe_function_release_mode mode);c
[in] func: The asynchronous thread-safe JavaScript function whose reference
count to decrement.[in] mode: Flag whose value can be either napi_tsfn_release to indicate
that the current thread will make no further calls to the thread-safe
function, or napi_tsfn_abort to indicate that in addition to the current
thread, no other thread should make any further calls to the thread-safe
function. If set to napi_tsfn_abort, further calls to
napi_call_threadsafe_function() will return napi_closing, and no further
values will be placed in the queue.A thread should call this API when it stops making use of func. Passing func
to any thread-safe APIs after having called this API has undefined results, as
func may have been destroyed.
This API may be called from any thread which will stop making use of func.
napi_ref_threadsafe_function#NAPI_EXTERN napi_status napi_ref_threadsafe_function(node_api_basic_env env, napi_threadsafe_function func);c
[in] env: The environment that the API is invoked under.[in] func: The thread-safe function to reference.This API is used to indicate that the event loop running on the main thread
should not exit until func has been destroyed. Similar to uv_ref it is
also idempotent.
Neither does napi_unref_threadsafe_function mark the thread-safe functions as
able to be destroyed nor does napi_ref_threadsafe_function prevent it from
being destroyed. napi_acquire_threadsafe_function and
napi_release_threadsafe_function are available for that purpose.
This API may only be called from the main thread.
napi_unref_threadsafe_function#NAPI_EXTERN napi_status napi_unref_threadsafe_function(node_api_basic_env env, napi_threadsafe_function func);c
[in] env: The environment that the API is invoked under.[in] func: The thread-safe function to unreference.This API is used to indicate that the event loop running on the main thread
may exit before func is destroyed. Similar to uv_unref it is also
idempotent.
This API may only be called from the main thread.
node_api_get_module_file_name#NAPI_EXTERN napi_status node_api_get_module_file_name(node_api_basic_env env, const char** result);c
[in] env: The environment that the API is invoked under.[out] result: A URL containing the absolute path of the
location from which the add-on was loaded. For a file on the local
file system it will start with file://. The string is null-terminated and
owned by env and must thus not be modified or freed.result may be an empty string if the add-on loading process fails to establish
the add-on's file name during loading.