Skip to content

Commit b04fb63

Browse files
committed
fix: node-api-headers compat
1 parent d8523a7 commit b04fb63

File tree

4 files changed

+114
-18
lines changed

4 files changed

+114
-18
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
name: Node.js CI with node-api-headers
2+
3+
on: [push, pull_request]
4+
5+
env:
6+
PYTHON_VERSION: '3.11'
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
test:
13+
timeout-minutes: 30
14+
strategy:
15+
fail-fast: false
16+
matrix:
17+
api_version:
18+
- '9'
19+
node-version:
20+
- 22.x
21+
node-api-headers-version:
22+
- '1.1.0'
23+
- '1.2.0'
24+
- '1.3.0'
25+
os:
26+
- ubuntu-latest
27+
compiler:
28+
- gcc
29+
runs-on: ${{ matrix.os }}
30+
steps:
31+
- name: Harden Runner
32+
uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
33+
with:
34+
egress-policy: audit
35+
36+
- uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
37+
- name: Set up Python ${{ env.PYTHON_VERSION }}
38+
uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0
39+
with:
40+
python-version: ${{ env.PYTHON_VERSION }}
41+
- name: Use Node.js ${{ matrix.node-version }}
42+
uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4
43+
with:
44+
node-version: ${{ matrix.node-version }}
45+
- name: Check Node.js installation
46+
run: |
47+
node --version
48+
npm --version
49+
- name: Install dependencies
50+
run: |
51+
npm install
52+
npm install "node-api-headers@${{ matrix.node-api-headers-version }}"
53+
- name: npm test
54+
run: |
55+
export NAPI_VERSION=${{ matrix.api_version }}
56+
if [ "${{ matrix.compiler }}" = "gcc" ]; then
57+
export CC="gcc" CXX="g++"
58+
fi
59+
if [ "${{ matrix.compiler }}" = "clang" ]; then
60+
export CC="clang" CXX="clang++"
61+
fi
62+
echo "CC=\"$CC\" CXX=\"$CXX\""
63+
echo "$CC --version"
64+
$CC --version
65+
echo "$CXX --version"
66+
$CXX --version
67+
export CFLAGS="$CFLAGS -O3 --coverage" LDFLAGS="$LDFLAGS --coverage"
68+
export use_node_api_headers=true
69+
echo "CFLAGS=\"$CFLAGS\" LDFLAGS=\"$LDFLAGS\""
70+
npm run pretest -- --verbose

napi-inl.h

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ namespace details {
3535
constexpr int napi_no_external_buffers_allowed = 22;
3636

3737
template <typename FreeType>
38-
inline void default_basic_finalizer(node_api_nogc_env /*env*/,
38+
inline void default_basic_finalizer(node_addon_api_basic_env /*env*/,
3939
void* data,
4040
void* /*hint*/) {
4141
delete static_cast<FreeType*>(data);
@@ -45,8 +45,9 @@ inline void default_basic_finalizer(node_api_nogc_env /*env*/,
4545
// garbage-collected.
4646
// TODO: Replace this code with `napi_add_finalizer()` whenever it becomes
4747
// available on all supported versions of Node.js.
48-
template <typename FreeType,
49-
node_api_nogc_finalize finalizer = default_basic_finalizer<FreeType>>
48+
template <
49+
typename FreeType,
50+
node_addon_api_basic_finalize finalizer = default_basic_finalizer<FreeType>>
5051
inline napi_status AttachData(napi_env env,
5152
napi_value obj,
5253
FreeType* data,
@@ -192,10 +193,10 @@ template <typename T, typename Finalizer, typename Hint = void>
192193
struct FinalizeData {
193194
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
194195
template <typename F = Finalizer,
195-
typename =
196-
std::enable_if_t<std::is_invocable_v<F, node_api_nogc_env, T*>>>
196+
typename = std::enable_if_t<
197+
std::is_invocable_v<F, node_addon_api_basic_env, T*>>>
197198
#endif
198-
static inline void Wrapper(node_api_nogc_env env,
199+
static inline void Wrapper(node_addon_api_basic_env env,
199200
void* data,
200201
void* finalizeHint) NAPI_NOEXCEPT {
201202
WrapVoidCallback([&] {
@@ -208,9 +209,9 @@ struct FinalizeData {
208209
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
209210
template <typename F = Finalizer,
210211
typename = std::enable_if_t<
211-
!std::is_invocable_v<F, node_api_nogc_env, T*>>,
212+
!std::is_invocable_v<F, node_addon_api_basic_env, T*>>,
212213
typename = void>
213-
static inline void Wrapper(node_api_nogc_env env,
214+
static inline void Wrapper(node_addon_api_basic_env env,
214215
void* data,
215216
void* finalizeHint) NAPI_NOEXCEPT {
216217
#ifdef NODE_ADDON_API_REQUIRE_BASIC_FINALIZERS
@@ -228,9 +229,9 @@ struct FinalizeData {
228229
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
229230
template <typename F = Finalizer,
230231
typename = std::enable_if_t<
231-
std::is_invocable_v<F, node_api_nogc_env, T*, Hint*>>>
232+
std::is_invocable_v<F, node_addon_api_basic_env, T*, Hint*>>>
232233
#endif
233-
static inline void WrapperWithHint(node_api_nogc_env env,
234+
static inline void WrapperWithHint(node_addon_api_basic_env env,
234235
void* data,
235236
void* finalizeHint) NAPI_NOEXCEPT {
236237
WrapVoidCallback([&] {
@@ -243,9 +244,9 @@ struct FinalizeData {
243244
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
244245
template <typename F = Finalizer,
245246
typename = std::enable_if_t<
246-
!std::is_invocable_v<F, node_api_nogc_env, T*, Hint*>>,
247+
!std::is_invocable_v<F, node_addon_api_basic_env, T*, Hint*>>,
247248
typename = void>
248-
static inline void WrapperWithHint(node_api_nogc_env env,
249+
static inline void WrapperWithHint(node_addon_api_basic_env env,
249250
void* data,
250251
void* finalizeHint) NAPI_NOEXCEPT {
251252
#ifdef NODE_ADDON_API_REQUIRE_BASIC_FINALIZERS
@@ -576,11 +577,17 @@ inline Maybe<T> Just(const T& t) {
576577
// BasicEnv / Env class
577578
////////////////////////////////////////////////////////////////////////////////
578579

579-
inline BasicEnv::BasicEnv(node_api_nogc_env env) : _env(env) {}
580+
inline BasicEnv::BasicEnv(node_addon_api_basic_env env) : _env(env) {}
580581

582+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
581583
inline BasicEnv::operator node_api_nogc_env() const {
582584
return _env;
583585
}
586+
#else
587+
inline BasicEnv::operator napi_env() const {
588+
return _env;
589+
}
590+
#endif
584591

585592
inline Env::Env(napi_env env) : BasicEnv(env) {}
586593

@@ -5034,7 +5041,7 @@ inline napi_value ObjectWrap<T>::StaticSetterCallbackWrapper(
50345041
}
50355042

50365043
template <typename T>
5037-
inline void ObjectWrap<T>::FinalizeCallback(node_api_nogc_env env,
5044+
inline void ObjectWrap<T>::FinalizeCallback(node_addon_api_basic_env env,
50385045
void* data,
50395046
void* /*hint*/) {
50405047
// If the child class does not override _any_ Finalize() method, `env` will be

napi.h

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,14 @@ template <typename T>
299299
using MaybeOrValue = T;
300300
#endif
301301

302+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
303+
using node_addon_api_basic_env = node_api_nogc_env;
304+
using node_addon_api_basic_finalize = node_api_nogc_finalize;
305+
#else
306+
using node_addon_api_basic_env = napi_env;
307+
using node_addon_api_basic_finalize = napi_finalize;
308+
#endif
309+
302310
/// Environment for Node-API values and operations.
303311
///
304312
/// All Node-API values and operations must be associated with an environment.
@@ -314,16 +322,20 @@ using MaybeOrValue = T;
314322
/// corresponds to an Isolate.
315323
class BasicEnv {
316324
private:
317-
node_api_nogc_env _env;
325+
node_addon_api_basic_env _env;
318326
#if NAPI_VERSION > 5
319327
template <typename T>
320328
static void DefaultFini(Env, T* data);
321329
template <typename DataType, typename HintType>
322330
static void DefaultFiniWithHint(Env, DataType* data, HintType* hint);
323331
#endif // NAPI_VERSION > 5
324332
public:
325-
BasicEnv(node_api_nogc_env env);
333+
BasicEnv(node_addon_api_basic_env env);
334+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
326335
operator node_api_nogc_env() const;
336+
#else
337+
operator napi_env() const;
338+
#endif
327339

328340
// Without these operator overloads, the error:
329341
//
@@ -2470,7 +2482,9 @@ class ObjectWrap : public InstanceWrap<T>, public Reference<Object> {
24702482
napi_callback_info info);
24712483
static napi_value StaticSetterCallbackWrapper(napi_env env,
24722484
napi_callback_info info);
2473-
static void FinalizeCallback(node_api_nogc_env env, void* data, void* hint);
2485+
static void FinalizeCallback(node_addon_api_basic_env env,
2486+
void* data,
2487+
void* hint);
24742488

24752489
static void PostFinalizeCallback(napi_env env, void* data, void* hint);
24762490

test/binding.gyp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
'value_type_cast.cc'
9090
],
9191
'want_coverage': '<!(node -p process.env.npm_config_coverage)',
92+
'use_node_api_headers': '<!(node -p process.env.use_node_api_headers)',
9293
'conditions': [
9394
['disable_deprecated!="true"', {
9495
'build_sources': ['object/object_deprecated.cc']
@@ -99,7 +100,11 @@
99100
['want_coverage=="true" and OS=="linux"', {
100101
'cflags_cc': ['--coverage'],
101102
'ldflags': ['--coverage'],
102-
}]
103+
}],
104+
['use_node_api_headers=="true"', {
105+
# prepend to the include_dirs list
106+
'include_dirs+': ["<!(node -p \"require('node-api-headers').include_dir\")"],
107+
}],
103108
],
104109
},
105110
'targets': [

0 commit comments

Comments
 (0)