Skip to content

Commit 38e01b7

Browse files
NickNasomhdawson
authored andcommitted
src: first pass on adding version management apis
PR-URL: #325 Reviewed-By: Michael Dawson <[email protected]>
1 parent 100d0a7 commit 38e01b7

File tree

9 files changed

+132
-0
lines changed

9 files changed

+132
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ still a work in progress as its not yet complete).
101101
- [Async Operations](doc/async_operations.md)
102102
- [AsyncWorker](doc/async_worker.md)
103103
- [Promises](doc/promises.md)
104+
- [Version management](doc/version_management.md)
104105

105106
<a name="examples"></a>
106107

doc/version_management.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# VersionManagement
2+
3+
The `Napi::VersionManagement` class contains methods that allow information
4+
to be retrieved about the version of N-API and Node.js. In some cases it is
5+
important to make decisions based on different versions of the system.
6+
7+
## Methods
8+
9+
### GetNapiVersion
10+
11+
Retrieves the highest N-API version supported by Node.js runtime.
12+
13+
```cpp
14+
static uint32_t GetNapiVersion(Env env);
15+
```
16+
17+
- `[in] env`: The environment in which the API is invoked under.
18+
19+
Returns the highest N-API version supported by Node.js runtime.
20+
21+
### GetNodeVersion
22+
23+
Retrives information about Node.js version present on the system. All the
24+
information is stored in the `napi_node_version` structrue that is defined as
25+
shown below:
26+
27+
```cpp
28+
typedef struct {
29+
uint32_t major;
30+
uint32_t minor;
31+
uint32_t patch;
32+
const char* release;
33+
} napi_node_version;
34+
````
35+
36+
```cpp
37+
static const napi_node_version* GetNodeVersion(Env env);
38+
```
39+
40+
- `[in] env`: The environment in which the API is invoked under.
41+
42+
Returns the structure a pointer to the structure `napi_node_version` populated by
43+
the version information of Node.js runtime.

napi-inl.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3319,6 +3319,24 @@ inline int64_t MemoryManagement::AdjustExternalMemory(Env env, int64_t change_in
33193319
return result;
33203320
}
33213321

3322+
////////////////////////////////////////////////////////////////////////////////
3323+
// Version Management class
3324+
////////////////////////////////////////////////////////////////////////////////
3325+
3326+
inline uint32_t VersionManagement::GetNapiVersion(Env env) {
3327+
uint32_t result;
3328+
napi_status status = napi_get_version(env, &result);
3329+
NAPI_THROW_IF_FAILED(env, status, 0);
3330+
return result;
3331+
}
3332+
3333+
inline const napi_node_version* VersionManagement::GetNodeVersion(Env env) {
3334+
const napi_node_version* result;
3335+
napi_status status = napi_get_node_version(env, &result);
3336+
NAPI_THROW_IF_FAILED(env, status, 0);
3337+
return result;
3338+
}
3339+
33223340
// These macros shouldn't be useful in user code.
33233341
#undef NAPI_THROW
33243342
#undef NAPI_THROW_IF_FAILED

napi.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,6 +1613,13 @@ namespace Napi {
16131613
static int64_t AdjustExternalMemory(Env env, int64_t change_in_bytes);
16141614
};
16151615

1616+
// Version management
1617+
class VersionManagement {
1618+
public:
1619+
static uint32_t GetNapiVersion(Env env);
1620+
static const napi_node_version* GetNodeVersion(Env env);
1621+
};
1622+
16161623
} // namespace Napi
16171624

16181625
// Inline implementations of all the above class methods are included here.

test/binding.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Object InitPromise(Env env);
2222
Object InitTypedArray(Env env);
2323
Object InitObjectWrap(Env env);
2424
Object InitObjectReference(Env env);
25+
Object InitVersionManagement(Env env);
2526

2627
Object Init(Env env, Object exports) {
2728
exports.Set("arraybuffer", InitArrayBuffer(env));
@@ -45,6 +46,7 @@ Object Init(Env env, Object exports) {
4546
exports.Set("typedarray", InitTypedArray(env));
4647
exports.Set("objectwrap", InitObjectWrap(env));
4748
exports.Set("objectreference", InitObjectReference(env));
49+
exports.Set("version_management", InitVersionManagement(env));
4850
return exports;
4951
}
5052

test/binding.gyp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
'typedarray.cc',
2828
'objectwrap.cc',
2929
'objectreference.cc',
30+
'version_management.cc'
3031
],
3132
'include_dirs': ["<!@(node -p \"require('../').include\")"],
3233
'dependencies': ["<!(node -p \"require('../').gyp\")"],

test/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ let testModules = [
3333
'typedarray',
3434
'objectwrap',
3535
'objectreference',
36+
'version_management'
3637
];
3738

3839
if (typeof global.gc === 'function') {

test/version_management.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "napi.h"
2+
3+
using namespace Napi;
4+
5+
Value getNapiVersion(const CallbackInfo& info) {
6+
Napi::Env env = info.Env();
7+
uint32_t napi_version = VersionManagement::GetNapiVersion(env);
8+
return Number::New(env, napi_version);
9+
}
10+
11+
Value getNodeVersion(const CallbackInfo& info) {
12+
Napi::Env env = info.Env();
13+
const napi_node_version* node_version = VersionManagement::GetNodeVersion(env);
14+
Object version = Object::New(env);
15+
version.Set("major", Number::New(env, node_version->major));
16+
version.Set("minor", Number::New(env, node_version->minor));
17+
version.Set("patch", Number::New(env, node_version->patch));
18+
version.Set("release", String::New(env, node_version->release));
19+
return version;
20+
}
21+
22+
Object InitVersionManagement(Env env) {
23+
Object exports = Object::New(env);
24+
exports["getNapiVersion"] = Function::New(env, getNapiVersion);
25+
exports["getNodeVersion"] = Function::New(env, getNodeVersion);
26+
return exports;
27+
}

test/version_management.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict';
2+
const buildType = process.config.target_defaults.default_configuration;
3+
const assert = require('assert');
4+
5+
test(require(`./build/${buildType}/binding.node`));
6+
test(require(`./build/${buildType}/binding_noexcept.node`));
7+
8+
function parseVersion() {
9+
const expected = {};
10+
expected.napi = parseInt(process.versions.napi);
11+
expected.release = process.release.name;
12+
const nodeVersion = process.versions.node.split('.');
13+
expected.major = parseInt(nodeVersion[0]);
14+
expected.minor = parseInt(nodeVersion[1]);
15+
expected.patch = parseInt(nodeVersion[2]);
16+
return expected;
17+
}
18+
19+
function test(binding) {
20+
21+
const expected = parseVersion();
22+
23+
const napiVersion = binding.version_management.getNapiVersion();
24+
assert.strictEqual(napiVersion, expected.napi);
25+
26+
const nodeVersion = binding.version_management.getNodeVersion();
27+
assert.strictEqual(nodeVersion.major, expected.major);
28+
assert.strictEqual(nodeVersion.minor, expected.minor);
29+
assert.strictEqual(nodeVersion.patch, expected.patch);
30+
assert.strictEqual(nodeVersion.release, expected.release);
31+
32+
}

0 commit comments

Comments
 (0)