diff options
author | Anna Henningsen <anna@addaleax.net> | 2017-08-08 19:09:28 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-08-12 21:28:59 +0200 |
commit | 835c383969d9bddc3980b9cd7f0d7adf3e2701b9 (patch) | |
tree | 67852e9eb9d7399a9a570ac9a9e4d0920ca927de | |
parent | 8780e1d79b2162f95a50ec350b045868e93cac47 (diff) | |
download | android-node-v8-835c383969d9bddc3980b9cd7f0d7adf3e2701b9.tar.gz android-node-v8-835c383969d9bddc3980b9cd7f0d7adf3e2701b9.tar.bz2 android-node-v8-835c383969d9bddc3980b9cd7f0d7adf3e2701b9.zip |
n-api: add napi_get_node_version
Add `napi_get_node_version`, to help with feature-detecting
Node.js as an environment.
PR-URL: https://github.com/nodejs/node/pull/14696
Reviewed-By: Kyle Farnung <kfarnung@microsoft.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
-rw-r--r-- | doc/api/n-api.md | 31 | ||||
-rw-r--r-- | src/node.cc | 3 | ||||
-rw-r--r-- | src/node_api.cc | 14 | ||||
-rw-r--r-- | src/node_api.h | 4 | ||||
-rw-r--r-- | src/node_api_types.h | 7 | ||||
-rw-r--r-- | src/node_version.h | 4 | ||||
-rw-r--r-- | test/addons-napi/test_general/test.js | 5 | ||||
-rw-r--r-- | test/addons-napi/test_general/test_general.c | 20 |
8 files changed, 87 insertions, 1 deletions
diff --git a/doc/api/n-api.md b/doc/api/n-api.md index af3696fd10..9e7fdd9301 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -3285,6 +3285,35 @@ callback invocation, even if it has been successfully cancelled. ## Version Management +### napi_get_node_version +<!-- YAML +added: REPLACEME +--> + +```C +typedef struct { + uint32_t major; + uint32_t minor; + uint32_t patch; + const char* release; +} napi_node_version; + +NAPI_EXTERN +napi_status napi_get_node_version(napi_env env, + const napi_node_version** version); +``` + +- `[in] env`: The environment that the API is invoked under. +- `[out] version`: A pointer to version information for Node itself. + +Returns `napi_ok` if the API succeeded. + +This function fills the `version` struct with the major, minor and patch version +of Node that is currently running, and the `release` field with the +value of [`process.release.name`][`process.release`]. + +The returned buffer is statically allocated and does not need to be freed. + ### napi_get_version <!-- YAML added: v8.0.0 @@ -3368,3 +3397,5 @@ support it: [`napi_throw_type_error`]: #n_api_napi_throw_type_error [`napi_unwrap`]: #n_api_napi_unwrap [`napi_wrap`]: #n_api_napi_wrap + +[`process.release`]: process.html#process_process_release diff --git a/src/node.cc b/src/node.cc index bfd1eeb954..be1705503f 100644 --- a/src/node.cc +++ b/src/node.cc @@ -3266,7 +3266,8 @@ void SetupProcessObject(Environment* env, // process.release Local<Object> release = Object::New(env->isolate()); READONLY_PROPERTY(process, "release", release); - READONLY_PROPERTY(release, "name", OneByteString(env->isolate(), "node")); + READONLY_PROPERTY(release, "name", + OneByteString(env->isolate(), NODE_RELEASE)); // if this is a release build and no explicit base has been set // substitute the standard release download URL diff --git a/src/node_api.cc b/src/node_api.cc index 32acced231..b84a33e510 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -3119,6 +3119,20 @@ napi_status napi_get_version(napi_env env, uint32_t* result) { return napi_clear_last_error(env); } +napi_status napi_get_node_version(napi_env env, + const napi_node_version** result) { + CHECK_ENV(env); + CHECK_ARG(env, result); + static const napi_node_version version = { + NODE_MAJOR_VERSION, + NODE_MINOR_VERSION, + NODE_PATCH_VERSION, + NODE_RELEASE + }; + *result = &version; + return napi_clear_last_error(env); +} + namespace uvimpl { static napi_status ConvertUVErrorCode(int code) { diff --git a/src/node_api.h b/src/node_api.h index cf4128be21..0cf0ba0469 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -536,6 +536,10 @@ NAPI_EXTERN napi_status napi_cancel_async_work(napi_env env, // version management NAPI_EXTERN napi_status napi_get_version(napi_env env, uint32_t* result); +NAPI_EXTERN +napi_status napi_get_node_version(napi_env env, + const napi_node_version** version); + EXTERN_C_END #endif // SRC_NODE_API_H_ diff --git a/src/node_api_types.h b/src/node_api_types.h index 43102c519c..0bdc377c8f 100644 --- a/src/node_api_types.h +++ b/src/node_api_types.h @@ -102,4 +102,11 @@ typedef struct { napi_status error_code; } napi_extended_error_info; +typedef struct { + uint32_t major; + uint32_t minor; + uint32_t patch; + const char* release; +} napi_node_version; + #endif // SRC_NODE_API_TYPES_H_ diff --git a/src/node_version.h b/src/node_version.h index a35d905595..339e1cd425 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -33,6 +33,10 @@ #define NODE_STRINGIFY_HELPER(n) #n #endif +#ifndef NODE_RELEASE +#define NODE_RELEASE "node" +#endif + #ifndef NODE_TAG # if NODE_VERSION_IS_RELEASE # define NODE_TAG "" diff --git a/test/addons-napi/test_general/test.js b/test/addons-napi/test_general/test.js index 551ba14acc..8e0740a68c 100644 --- a/test/addons-napi/test_general/test.js +++ b/test/addons-napi/test_general/test.js @@ -35,6 +35,11 @@ assert.ok(test_general.testGetPrototype(baseObject) !== // expected version is currently 1 assert.strictEqual(test_general.testGetVersion(), 1); +const [ major, minor, patch, release ] = test_general.testGetNodeVersion(); +assert.strictEqual(process.version.split('-')[0], + `v${major}.${minor}.${patch}`); +assert.strictEqual(release, process.release.name); + [ 123, 'test string', diff --git a/test/addons-napi/test_general/test_general.c b/test/addons-napi/test_general/test_general.c index 8586119394..da347bd68b 100644 --- a/test/addons-napi/test_general/test_general.c +++ b/test/addons-napi/test_general/test_general.c @@ -33,6 +33,25 @@ napi_value testGetVersion(napi_env env, napi_callback_info info) { return result; } +napi_value testGetNodeVersion(napi_env env, napi_callback_info info) { + const napi_node_version* node_version; + napi_value result, major, minor, patch, release; + NAPI_CALL(env, napi_get_node_version(env, &node_version)); + NAPI_CALL(env, napi_create_uint32(env, node_version->major, &major)); + NAPI_CALL(env, napi_create_uint32(env, node_version->minor, &minor)); + NAPI_CALL(env, napi_create_uint32(env, node_version->patch, &patch)); + NAPI_CALL(env, napi_create_string_utf8(env, + node_version->release, + (size_t)-1, + &release)); + NAPI_CALL(env, napi_create_array_with_length(env, 4, &result)); + NAPI_CALL(env, napi_set_element(env, result, 0, major)); + NAPI_CALL(env, napi_set_element(env, result, 1, minor)); + NAPI_CALL(env, napi_set_element(env, result, 2, patch)); + NAPI_CALL(env, napi_set_element(env, result, 3, release)); + return result; +} + napi_value doInstanceOf(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2]; @@ -142,6 +161,7 @@ void Init(napi_env env, napi_value exports, napi_value module, void* priv) { DECLARE_NAPI_PROPERTY("testStrictEquals", testStrictEquals), DECLARE_NAPI_PROPERTY("testGetPrototype", testGetPrototype), DECLARE_NAPI_PROPERTY("testGetVersion", testGetVersion), + DECLARE_NAPI_PROPERTY("testGetNodeVersion", testGetNodeVersion), DECLARE_NAPI_PROPERTY("doInstanceOf", doInstanceOf), DECLARE_NAPI_PROPERTY("getUndefined", getUndefined), DECLARE_NAPI_PROPERTY("getNull", getNull), |