Skip to content

Commit

Permalink
n-api: add napi_get_version
Browse files Browse the repository at this point in the history
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 <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jason Ginchereau <jasongin@microsoft.com>
  • Loading branch information
mhdawson committed May 26, 2017
1 parent 2db6556 commit d9ee297
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 0 deletions.
29 changes: 29 additions & 0 deletions doc/api/n-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
added: REPLACEME
-->
```C
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
Expand Down
9 changes: 9 additions & 0 deletions src/node_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
#include "uv.h"
#include "node_api.h"

#define NAPI_VERSION 1

static
napi_status napi_set_last_error(napi_env env, napi_status error_code,
uint32_t engine_error_code = 0,
Expand Down Expand Up @@ -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_ENV(env);
CHECK_ARG(env, result);
*result = NAPI_VERSION;
return napi_clear_last_error(env);
}

namespace uvimpl {

static napi_status ConvertUVErrorCode(int code) {
Expand Down
4 changes: 4 additions & 0 deletions src/node_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

EXTERN_C_END

#endif // SRC_NODE_API_H_
4 changes: 4 additions & 0 deletions test/addons-napi/test_general/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,7 @@ assert.strictEqual(test_general.testGetPrototype(extendedObject),
assert.ok(test_general.testGetPrototype(baseObject) !==
test_general.testGetPrototype(extendedObject),
'Prototypes for base and extended should be different');

// test version management funcitons
// expected version is currently 1
assert.strictEqual(test_general.testGetVersion(), 1);
9 changes: 9 additions & 0 deletions test/addons-napi/test_general/test_general.c
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down

0 comments on commit d9ee297

Please sign in to comment.