Browse files

n-api: add napi_get_version

Add napi_get_version function so that addons can
query the level of N-API supported.

PR-URL: #13207
Fixes: nodejs/abi-stable-node#231
Reviewed-By: Anna Henningsen <>
Reviewed-By: Colin Ihrig <>
Reviewed-By: James M Snell <>
Reviewed-By: Jason Ginchereau <>
  • Loading branch information...
mhdawson authored and jasnell committed May 24, 2017
1 parent e7d098c commit 45139e59f3d783f7ea64f5e76e253d25e473f4b6
Showing with 55 additions and 0 deletions.
  1. +29 −0 doc/api/
  2. +9 −0 src/
  3. +4 −0 src/node_api.h
  4. +4 −0 test/addons-napi/test_general/test.js
  5. +9 −0 test/addons-napi/test_general/test_general.c
@@ -2946,6 +2946,35 @@ 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.
## Version Management
### napi_get_version
<!-- YAML
NAPI_EXTERN napi_status napi_get_version(napi_env env,
uint32_t* result);
- `[in] env`: The environment that the API is invoked under.
- `[out] result`: The highest version of N-API supported.
Returns `napi_ok` if the API succeeded.
This API returns the highest N-API version supported by the
Node.js runtime. N-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:
* Call `napi_get_version()` to determine if the API is available.
* If available, dynamically load a pointer to the function using `uv_dlsym()`.
* Use the dynamically loaded pointer to invoke the function.
* If the function is not available, provide an alternate implementation
that does not use the function.
[Aynchronous Operations]: #n_api_asynchronous_operations
[Basic N-API Data Types]: #n_api_basic_n_api_data_types
@@ -18,6 +18,8 @@
#include "uv.h"
#include "node_api.h"
#define NAPI_VERSION 1
napi_status napi_set_last_error(napi_env env, napi_status error_code,
uint32_t engine_error_code = 0,
@@ -2713,6 +2715,13 @@ napi_status napi_get_typedarray_info(napi_env env,
return napi_clear_last_error(env);
napi_status napi_get_version(napi_env env, uint32_t* result) {
CHECK_ARG(env, result);
*result = NAPI_VERSION;
return napi_clear_last_error(env);
namespace uvimpl {
static napi_status ConvertUVErrorCode(int code) {
@@ -478,6 +478,10 @@ NAPI_EXTERN napi_status napi_queue_async_work(napi_env env,
NAPI_EXTERN napi_status napi_cancel_async_work(napi_env env,
napi_async_work work);
// version management
NAPI_EXTERN napi_status napi_get_version(napi_env env, uint32_t* result);
#endif // SRC_NODE_API_H_
@@ -30,3 +30,7 @@ assert.strictEqual(test_general.testGetPrototype(extendedObject),
assert.ok(test_general.testGetPrototype(baseObject) !==
'Prototypes for base and extended should be different');
// test version management funcitons
// expected version is currently 1
assert.strictEqual(test_general.testGetVersion(), 1);
@@ -25,10 +25,19 @@ napi_value testGetPrototype(napi_env env, napi_callback_info info) {
return result;
napi_value testGetVersion(napi_env env, napi_callback_info info) {
uint32_t version;
napi_value result;
NAPI_CALL(env, napi_get_version(env, &version));
NAPI_CALL(env ,napi_create_number(env, version, &result));
return result;
void Init(napi_env env, napi_value exports, napi_value module, void* priv) {
napi_property_descriptor descriptors[] = {
DECLARE_NAPI_PROPERTY("testStrictEquals", testStrictEquals),
DECLARE_NAPI_PROPERTY("testGetPrototype", testGetPrototype),
DECLARE_NAPI_PROPERTY("testGetVersion", testGetVersion),
NAPI_CALL_RETURN_VOID(env, napi_define_properties(

0 comments on commit 45139e5

Please sign in to comment.