• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <cstdlib>
17 #include <windows.h>
18 #include "node_api.h"
19 #include <macros.h>
20 
21 #define NAPI_CDECL __cdecl
22 
23 // CC-OFFNXT(G.PRE.06) solid logic
24 #define NAPI_FUNCTIONS(op)                                                                                             \
25     op(napi_module_register) op(napi_create_function) op(napi_set_named_property) op(napi_create_string_utf8) op(      \
26         napi_add_env_cleanup_hook) op(napi_get_last_error_info) op(napi_get_value_bigint_int64)                        \
27         op(napi_get_value_bigint_uint64) op(napi_create_object) op(napi_get_arraybuffer_info) op(                      \
28             napi_create_bigint_uint64) op(napi_is_typedarray) op(napi_add_finalizer) op(napi_get_typedarray_info)      \
29             op(napi_set_property) op(napi_get_value_bool) op(napi_coerce_to_string) op(napi_get_value_uint32) op(      \
30                 napi_get_value_int32) op(napi_throw) op(napi_get_cb_info) op(napi_create_error)                        \
31                 op(napi_get_value_string_utf8) op(napi_define_properties) op(napi_delete_reference) op(                \
32                     napi_get_reference_value) op(napi_open_handle_scope) op(napi_close_handle_scope)                   \
33                     op(napi_open_escapable_handle_scope) op(napi_close_escapable_handle_scope) op(                     \
34                         napi_is_exception_pending) op(napi_create_type_error) op(napi_escape_handle)                   \
35                         op(napi_get_and_clear_last_exception) op(napi_fatal_error) op(napi_create_double) op(          \
36                             napi_typeof) op(napi_get_property) op(napi_get_named_property) op(napi_create_reference)   \
37                             op(napi_get_global) op(napi_has_property) op(napi_get_undefined) op(napi_get_value_double) \
38                                 op(napi_close_callback_scope) op(napi_async_destroy) op(napi_call_function)            \
39                                     op(napi_get_value_external) op(napi_throw_error) op(napi_create_int32)             \
40                                         op(napi_create_external_arraybuffer) op(napi_create_typedarray)                \
41                                             op(napi_create_string_latin1) op(napi_create_async_work)                   \
42                                                 op(napi_delete_async_work) op(napi_queue_async_work)                   \
43                                                     op(napi_resolve_deferred) op(napi_reject_deferred)                 \
44                                                         op(napi_create_promise) op(napi_create_threadsafe_function)    \
45                                                             op(napi_acquire_threadsafe_function)                       \
46                                                                 op(napi_release_threadsafe_function)                   \
47                                                                     op(napi_call_threadsafe_function)                  \
48                                                                         op(napi_is_dataview) op(napi_is_arraybuffer)   \
49                                                                             op(napi_get_dataview_info)                 \
50                                                                                 op(napi_get_boolean)                   \
51                                                                                     op(napi_create_uint32)
52 
53 // CC-OFFNXT(G.PRE.09) code generation
54 // CC-OFFNXT(G.PRE.02) code style
55 #define DECL_NAPI_IMPL(fn_name) decltype(&fn_name) p_##fn_name;
56 
NAPI_FUNCTIONS(DECL_NAPI_IMPL)57 NAPI_FUNCTIONS(DECL_NAPI_IMPL)
58 
59 bool LoadNapiFunctions()
60 {
61     static bool isLoaded = false;
62     if (isLoaded) {
63         return true;
64     }
65     HMODULE nodeModule = GetModuleHandle(NULL);
66     FARPROC fn_addr = GetProcAddress(nodeModule, "napi_module_register");
67     if (fn_addr == NULL) {
68         nodeModule = GetModuleHandleA("node.dll");
69         if (nodeModule == NULL) {
70             return false;
71         }
72         fn_addr = GetProcAddress(nodeModule, "napi_module_register");
73         if (fn_addr == NULL) {
74             return false;
75         }
76     }
77     bool apiLoadFailed = false;
78 
79 #define GET_NAPI_IMPL(fn_name)                         \
80     fn_addr = GetProcAddress(nodeModule, #fn_name);    \
81     if (fn_addr == NULL)                               \
82         /* CC-OFFNXT(G.PRE.10) function scope macro */ \
83         apiLoadFailed = true;                          \
84     /* CC-OFFNXT(G.PRE.09) code generation */          \
85     p_##fn_name = (decltype(p_##fn_name))fn_addr;
86 
87     // Assign the addresses of the needed functions to the "p*" named pointers.
88     NAPI_FUNCTIONS(GET_NAPI_IMPL);
89 
90     // If any required APIs failed to load, return false
91     if (apiLoadFailed) {
92         return false;
93     }
94 
95     isLoaded = true;
96 
97     return true;
98 }
99 
napi_module_register(napi_module * mod)100 NAPI_EXTERN void NAPI_CDECL napi_module_register(napi_module *mod)
101 {
102     LoadNapiFunctions();
103     p_napi_module_register(mod);
104 }
105 
napi_get_last_error_info(napi_env env,const napi_extended_error_info ** result)106 NAPI_EXTERN napi_status NAPI_CDECL napi_get_last_error_info(napi_env env, const napi_extended_error_info **result)
107 {
108     LoadNapiFunctions();
109     return p_napi_get_last_error_info(env, result);
110 }
111 
napi_get_value_bigint_int64(napi_env env,napi_value value,int64_t * result,bool * lossless)112 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_bigint_int64(napi_env env, napi_value value, int64_t *result,
113                                                                bool *lossless)
114 {
115     LoadNapiFunctions();
116     return p_napi_get_value_bigint_int64(env, value, result, lossless);
117 }
118 
napi_get_value_bigint_uint64(napi_env env,napi_value value,uint64_t * result,bool * lossless)119 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_bigint_uint64(napi_env env, napi_value value, uint64_t *result,
120                                                                 bool *lossless)
121 {
122     LoadNapiFunctions();
123     return p_napi_get_value_bigint_uint64(env, value, result, lossless);
124 }
125 
napi_create_object(napi_env env,napi_value * result)126 NAPI_EXTERN napi_status NAPI_CDECL napi_create_object(napi_env env, napi_value *result)
127 {
128     LoadNapiFunctions();
129     return p_napi_create_object(env, result);
130 }
131 
napi_get_arraybuffer_info(napi_env env,napi_value arraybuffer,void ** data,size_t * byte_length)132 NAPI_EXTERN napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env, napi_value arraybuffer, void **data,
133                                                              size_t *byte_length)
134 {
135     LoadNapiFunctions();
136     return p_napi_get_arraybuffer_info(env, arraybuffer, data, byte_length);
137 }
138 
napi_create_bigint_uint64(napi_env env,uint64_t value,napi_value * result)139 NAPI_EXTERN napi_status NAPI_CDECL napi_create_bigint_uint64(napi_env env, uint64_t value, napi_value *result)
140 {
141     LoadNapiFunctions();
142     return p_napi_create_bigint_uint64(env, value, result);
143 }
144 
napi_is_typedarray(napi_env env,napi_value value,bool * result)145 NAPI_EXTERN napi_status NAPI_CDECL napi_is_typedarray(napi_env env, napi_value value, bool *result)
146 {
147     LoadNapiFunctions();
148     return p_napi_is_typedarray(env, value, result);
149 }
150 
151 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_add_finalizer(napi_env env,napi_value js_object,void * finalize_data,napi_finalize finalize_cb,void * finalize_hint,napi_ref * result)152 NAPI_EXTERN napi_status NAPI_CDECL napi_add_finalizer(napi_env env, napi_value js_object, void *finalize_data,
153                                                       napi_finalize finalize_cb, void *finalize_hint, napi_ref *result)
154 {
155     LoadNapiFunctions();
156     return p_napi_add_finalizer(env, js_object, finalize_data, finalize_cb, finalize_hint, result);
157 }
158 
159 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_get_typedarray_info(napi_env env,napi_value typedarray,napi_typedarray_type * type,size_t * length,void ** data,napi_value * arraybuffer,size_t * byte_offset)160 NAPI_EXTERN napi_status NAPI_CDECL napi_get_typedarray_info(napi_env env, napi_value typedarray,
161                                                             napi_typedarray_type *type, size_t *length, void **data,
162                                                             napi_value *arraybuffer, size_t *byte_offset)
163 {
164     LoadNapiFunctions();
165     return p_napi_get_typedarray_info(env, typedarray, type, length, data, arraybuffer, byte_offset);
166 }
167 
napi_set_property(napi_env env,napi_value object,napi_value key,napi_value value)168 NAPI_EXTERN napi_status NAPI_CDECL napi_set_property(napi_env env, napi_value object, napi_value key, napi_value value)
169 {
170     LoadNapiFunctions();
171     return p_napi_set_property(env, object, key, value);
172 }
173 
napi_get_value_bool(napi_env env,napi_value value,bool * result)174 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_bool(napi_env env, napi_value value, bool *result)
175 {
176     LoadNapiFunctions();
177     return p_napi_get_value_bool(env, value, result);
178 }
179 
napi_coerce_to_string(napi_env env,napi_value value,napi_value * result)180 NAPI_EXTERN napi_status NAPI_CDECL napi_coerce_to_string(napi_env env, napi_value value, napi_value *result)
181 {
182     LoadNapiFunctions();
183     return p_napi_coerce_to_string(env, value, result);
184 }
185 
napi_get_value_int32(napi_env env,napi_value value,int32_t * result)186 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_int32(napi_env env, napi_value value, int32_t *result)
187 {
188     LoadNapiFunctions();
189     return p_napi_get_value_int32(env, value, result);
190 }
191 
192 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_get_cb_info(napi_env env,napi_callback_info cbinfo,size_t * argc,napi_value * argv,napi_value * this_arg,void ** data)193 NAPI_EXTERN napi_status NAPI_CDECL napi_get_cb_info(napi_env env, napi_callback_info cbinfo, size_t *argc,
194                                                     napi_value *argv, napi_value *this_arg, void **data)
195 {
196     LoadNapiFunctions();
197     return p_napi_get_cb_info(env, cbinfo, argc, argv, this_arg, data);
198 }
199 
napi_create_string_utf8(napi_env env,const char * str,size_t length,napi_value * result)200 NAPI_EXTERN napi_status NAPI_CDECL napi_create_string_utf8(napi_env env, const char *str, size_t length,
201                                                            napi_value *result)
202 {
203     LoadNapiFunctions();
204     return p_napi_create_string_utf8(env, str, length, result);
205 }
206 
napi_throw(napi_env env,napi_value error)207 NAPI_EXTERN napi_status NAPI_CDECL napi_throw(napi_env env, napi_value error)
208 {
209     LoadNapiFunctions();
210     return p_napi_throw(env, error);
211 }
212 
napi_create_error(napi_env env,napi_value code,napi_value msg,napi_value * result)213 NAPI_EXTERN napi_status NAPI_CDECL napi_create_error(napi_env env, napi_value code, napi_value msg, napi_value *result)
214 {
215     LoadNapiFunctions();
216     return p_napi_create_error(env, code, msg, result);
217 }
218 
napi_get_value_string_utf8(napi_env env,napi_value value,char * buf,size_t bufsize,size_t * result)219 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_string_utf8(napi_env env, napi_value value, char *buf, size_t bufsize,
220                                                               size_t *result)
221 {
222     LoadNapiFunctions();
223     return p_napi_get_value_string_utf8(env, value, buf, bufsize, result);
224 }
225 
napi_define_properties(napi_env env,napi_value object,size_t property_count,const napi_property_descriptor * properties)226 NAPI_EXTERN napi_status NAPI_CDECL napi_define_properties(napi_env env, napi_value object, size_t property_count,
227                                                           const napi_property_descriptor *properties)
228 {
229     LoadNapiFunctions();
230     return p_napi_define_properties(env, object, property_count, properties);
231 }
232 
napi_delete_reference(napi_env env,napi_ref ref)233 NAPI_EXTERN napi_status NAPI_CDECL napi_delete_reference(napi_env env, napi_ref ref)
234 {
235     LoadNapiFunctions();
236     return p_napi_delete_reference(env, ref);
237 }
238 
napi_get_reference_value(napi_env env,napi_ref ref,napi_value * result)239 NAPI_EXTERN napi_status NAPI_CDECL napi_get_reference_value(napi_env env, napi_ref ref, napi_value *result)
240 {
241     LoadNapiFunctions();
242     return p_napi_get_reference_value(env, ref, result);
243 }
napi_open_handle_scope(napi_env env,napi_handle_scope * result)244 NAPI_EXTERN napi_status NAPI_CDECL napi_open_handle_scope(napi_env env, napi_handle_scope *result)
245 {
246     LoadNapiFunctions();
247     return p_napi_open_handle_scope(env, result);
248 }
249 
napi_close_handle_scope(napi_env env,napi_handle_scope scope)250 NAPI_EXTERN napi_status NAPI_CDECL napi_close_handle_scope(napi_env env, napi_handle_scope scope)
251 {
252     LoadNapiFunctions();
253     return p_napi_close_handle_scope(env, scope);
254 }
napi_open_escapable_handle_scope(napi_env env,napi_escapable_handle_scope * result)255 NAPI_EXTERN napi_status NAPI_CDECL napi_open_escapable_handle_scope(napi_env env, napi_escapable_handle_scope *result)
256 {
257     return p_napi_open_escapable_handle_scope(env, result);
258 }
napi_close_escapable_handle_scope(napi_env env,napi_escapable_handle_scope scope)259 NAPI_EXTERN napi_status NAPI_CDECL napi_close_escapable_handle_scope(napi_env env, napi_escapable_handle_scope scope)
260 {
261     LoadNapiFunctions();
262     return p_napi_close_escapable_handle_scope(env, scope);
263 }
napi_is_exception_pending(napi_env env,bool * result)264 NAPI_EXTERN napi_status NAPI_CDECL napi_is_exception_pending(napi_env env, bool *result)
265 {
266     LoadNapiFunctions();
267     return p_napi_is_exception_pending(env, result);
268 }
269 
napi_get_property(napi_env env,napi_value object,napi_value key,napi_value * result)270 NAPI_EXTERN napi_status NAPI_CDECL napi_get_property(napi_env env, napi_value object, napi_value key,
271                                                      napi_value *result)
272 {
273     LoadNapiFunctions();
274     return p_napi_get_property(env, object, key, result);
275 }
276 
napi_get_value_uint32(napi_env env,napi_value value,uint32_t * result)277 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_uint32(napi_env env, napi_value value, uint32_t *result)
278 {
279     LoadNapiFunctions();
280     return p_napi_get_value_uint32(env, value, result);
281 }
282 
napi_typeof(napi_env env,napi_value value,napi_valuetype * result)283 NAPI_EXTERN napi_status NAPI_CDECL napi_typeof(napi_env env, napi_value value, napi_valuetype *result)
284 {
285     LoadNapiFunctions();
286     return p_napi_typeof(env, value, result);
287 }
napi_get_and_clear_last_exception(napi_env env,napi_value * result)288 NAPI_EXTERN napi_status NAPI_CDECL napi_get_and_clear_last_exception(napi_env env, napi_value *result)
289 {
290     LoadNapiFunctions();
291     return p_napi_get_and_clear_last_exception(env, result);
292 }
293 // CC-OFFNXT(G.NAM.03) false positive
napi_fatal_error(const char * location,size_t locationLen,const char * message,size_t messageLen)294 NAPI_EXTERN NAPI_NO_RETURN void NAPI_CDECL napi_fatal_error(const char *location, size_t locationLen,
295                                                             const char *message, size_t messageLen)
296 {
297     LoadNapiFunctions();
298     p_napi_fatal_error(location, locationLen, message, messageLen);
299     // Not reachable, but not represented in type signature.
300     UNREACHABLE();
301 }
302 
napi_get_value_external(napi_env env,napi_value value,void ** result)303 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_external(napi_env env, napi_value value, void **result)
304 {
305     LoadNapiFunctions();
306     return p_napi_get_value_external(env, value, result);
307 }
napi_create_double(napi_env env,double value,napi_value * result)308 NAPI_EXTERN napi_status NAPI_CDECL napi_create_double(napi_env env, double value, napi_value *result)
309 {
310     LoadNapiFunctions();
311     return p_napi_create_double(env, value, result);
312 }
313 
napi_create_type_error(napi_env env,napi_value code,napi_value msg,napi_value * result)314 NAPI_EXTERN napi_status NAPI_CDECL napi_create_type_error(napi_env env, napi_value code, napi_value msg,
315                                                           napi_value *result)
316 {
317     LoadNapiFunctions();
318     return p_napi_create_type_error(env, code, msg, result);
319 }
napi_get_named_property(napi_env env,napi_value object,const char * utf8name,napi_value * result)320 NAPI_EXTERN napi_status NAPI_CDECL napi_get_named_property(napi_env env, napi_value object, const char *utf8name,
321                                                            napi_value *result)
322 {
323     LoadNapiFunctions();
324     return p_napi_get_named_property(env, object, utf8name, result);
325 }
napi_create_reference(napi_env env,napi_value value,uint32_t initial_refcount,napi_ref * result)326 NAPI_EXTERN napi_status NAPI_CDECL napi_create_reference(napi_env env, napi_value value, uint32_t initial_refcount,
327                                                          napi_ref *result)
328 {
329     LoadNapiFunctions();
330     return p_napi_create_reference(env, value, initial_refcount, result);
331 }
332 
333 NAPI_EXTERN napi_status NAPI_CDECL napi_escape_handle(napi_env env, napi_escapable_handle_scope scope,
334                                                       napi_value escapee, napi_value *result);
napi_get_global(napi_env env,napi_value * result)335 NAPI_EXTERN napi_status NAPI_CDECL napi_get_global(napi_env env, napi_value *result)
336 {
337     LoadNapiFunctions();
338     return p_napi_get_global(env, result);
339 }
napi_has_property(napi_env env,napi_value object,napi_value key,bool * result)340 NAPI_EXTERN napi_status NAPI_CDECL napi_has_property(napi_env env, napi_value object, napi_value key, bool *result)
341 {
342     LoadNapiFunctions();
343     return p_napi_has_property(env, object, key, result);
344 }
345 
346 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_create_function(napi_env env,const char * utf8name,size_t length,napi_callback cb,void * data,napi_value * result)347 NAPI_EXTERN napi_status NAPI_CDECL napi_create_function(napi_env env, const char *utf8name, size_t length,
348                                                         napi_callback cb, void *data, napi_value *result)
349 {
350     LoadNapiFunctions();
351     return p_napi_create_function(env, utf8name, length, cb, data, result);
352 }
353 
napi_escape_handle(napi_env env,napi_escapable_handle_scope scope,napi_value escapee,napi_value * result)354 NAPI_EXTERN napi_status NAPI_CDECL napi_escape_handle(napi_env env, napi_escapable_handle_scope scope,
355                                                       napi_value escapee, napi_value *result)
356 {
357     LoadNapiFunctions();
358     return p_napi_escape_handle(env, scope, escapee, result);
359 }
napi_get_undefined(napi_env env,napi_value * result)360 NAPI_EXTERN napi_status NAPI_CDECL napi_get_undefined(napi_env env, napi_value *result)
361 {
362     LoadNapiFunctions();
363     return p_napi_get_undefined(env, result);
364 }
napi_get_value_double(napi_env env,napi_value value,double * result)365 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_double(napi_env env, napi_value value, double *result)
366 {
367     LoadNapiFunctions();
368     return p_napi_get_value_double(env, value, result);
369 }
370 
napi_close_callback_scope(napi_env env,napi_callback_scope scope)371 NAPI_EXTERN napi_status NAPI_CDECL napi_close_callback_scope(napi_env env, napi_callback_scope scope)
372 {
373     LoadNapiFunctions();
374     return p_napi_close_callback_scope(env, scope);
375 }
376 
napi_async_destroy(napi_env env,napi_async_context async_context)377 NAPI_EXTERN napi_status NAPI_CDECL napi_async_destroy(napi_env env, napi_async_context async_context)
378 {
379     LoadNapiFunctions();
380     return p_napi_async_destroy(env, async_context);
381 }
382 
383 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_call_function(napi_env env,napi_value recv,napi_value func,size_t argc,const napi_value * argv,napi_value * result)384 NAPI_EXTERN napi_status NAPI_CDECL napi_call_function(napi_env env, napi_value recv, napi_value func, size_t argc,
385                                                       const napi_value *argv, napi_value *result)
386 {
387     LoadNapiFunctions();
388     return p_napi_call_function(env, recv, func, argc, argv, result);
389 }
390 
napi_throw_error(napi_env env,const char * code,const char * msg)391 NAPI_EXTERN napi_status NAPI_CDECL napi_throw_error(napi_env env, const char *code, const char *msg)
392 {
393     LoadNapiFunctions();
394     return p_napi_throw_error(env, code, msg);
395 }
396 
napi_create_int32(napi_env env,int32_t value,napi_value * result)397 NAPI_EXTERN napi_status NAPI_CDECL napi_create_int32(napi_env env, int32_t value, napi_value *result)
398 {
399     LoadNapiFunctions();
400     return p_napi_create_int32(env, value, result);
401 }
402 
403 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_create_external_arraybuffer(napi_env env,void * external_data,size_t byte_length,napi_finalize finalize_cb,void * finalize_hint,napi_value * result)404 NAPI_EXTERN napi_status NAPI_CDECL napi_create_external_arraybuffer(napi_env env, void *external_data,
405                                                                     size_t byte_length, napi_finalize finalize_cb,
406                                                                     void *finalize_hint, napi_value *result)
407 {
408     LoadNapiFunctions();
409     return p_napi_create_external_arraybuffer(env, external_data, byte_length, finalize_cb, finalize_hint, result);
410 }
411 
412 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_create_typedarray(napi_env env,napi_typedarray_type type,size_t length,napi_value array_buffer,size_t byte_offset,napi_value * result)413 NAPI_EXTERN napi_status NAPI_CDECL napi_create_typedarray(napi_env env, napi_typedarray_type type, size_t length,
414                                                           napi_value array_buffer, size_t byte_offset,
415                                                           napi_value *result)
416 {
417     LoadNapiFunctions();
418     return p_napi_create_typedarray(env, type, length, array_buffer, byte_offset, result);
419 }
420 
napi_create_string_latin1(napi_env env,const char * str,size_t length,napi_value * result)421 NAPI_EXTERN napi_status NAPI_CDECL napi_create_string_latin1(napi_env env, const char *str, size_t length,
422                                                              napi_value *result)
423 {
424     LoadNapiFunctions();
425     return p_napi_create_string_latin1(env, str, length, result);
426 }
427 
428 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_create_async_work(napi_env env,napi_value async_resource,napi_value async_resource_name,napi_async_execute_callback execute,napi_async_complete_callback complete,void * data,napi_async_work * result)429 NAPI_EXTERN napi_status NAPI_CDECL napi_create_async_work(napi_env env, napi_value async_resource,
430                                                           napi_value async_resource_name,
431                                                           napi_async_execute_callback execute,
432                                                           napi_async_complete_callback complete, void *data,
433                                                           napi_async_work *result)
434 {
435     LoadNapiFunctions();
436     return p_napi_create_async_work(env, async_resource, async_resource_name, execute, complete, data, result);
437 }
438 
napi_delete_async_work(napi_env env,napi_async_work work)439 NAPI_EXTERN napi_status NAPI_CDECL napi_delete_async_work(napi_env env, napi_async_work work)
440 {
441     LoadNapiFunctions();
442     return p_napi_delete_async_work(env, work);
443 }
444 
napi_queue_async_work(napi_env env,napi_async_work work)445 NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(napi_env env, napi_async_work work)
446 {
447     LoadNapiFunctions();
448     return p_napi_queue_async_work(env, work);
449 }
450 
napi_create_promise(napi_env env,napi_deferred * deferred,napi_value * promise)451 NAPI_EXTERN napi_status NAPI_CDECL napi_create_promise(napi_env env, napi_deferred *deferred, napi_value *promise)
452 {
453     LoadNapiFunctions();
454     return p_napi_create_promise(env, deferred, promise);
455 }
456 
napi_resolve_deferred(napi_env env,napi_deferred deferred,napi_value resolution)457 NAPI_EXTERN napi_status NAPI_CDECL napi_resolve_deferred(napi_env env, napi_deferred deferred, napi_value resolution)
458 {
459     LoadNapiFunctions();
460     return p_napi_resolve_deferred(env, deferred, resolution);
461 }
462 
napi_reject_deferred(napi_env env,napi_deferred deferred,napi_value rejection)463 NAPI_EXTERN napi_status NAPI_CDECL napi_reject_deferred(napi_env env, napi_deferred deferred, napi_value rejection)
464 {
465     LoadNapiFunctions();
466     return p_napi_reject_deferred(env, deferred, rejection);
467 }
468 
469 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_create_threadsafe_function(napi_env env,napi_value func,napi_value async_resource,napi_value async_resource_name,size_t max_queue_size,size_t initial_thread_count,void * thread_finalize_data,napi_finalize thread_finalize_cb,void * context,napi_threadsafe_function_call_js call_js_cb,napi_threadsafe_function * result)470 NAPI_EXTERN napi_status NAPI_CDECL napi_create_threadsafe_function(
471     napi_env env, napi_value func, napi_value async_resource, napi_value async_resource_name, size_t max_queue_size,
472     size_t initial_thread_count, void *thread_finalize_data, napi_finalize thread_finalize_cb, void *context,
473     napi_threadsafe_function_call_js call_js_cb, napi_threadsafe_function *result)
474 {
475     LoadNapiFunctions();
476     return p_napi_create_threadsafe_function(env, func, async_resource, async_resource_name, max_queue_size,
477                                              initial_thread_count, thread_finalize_data, thread_finalize_cb, context,
478                                              call_js_cb, result);
479 }
480 
napi_acquire_threadsafe_function(napi_threadsafe_function func)481 NAPI_EXTERN napi_status NAPI_CDECL napi_acquire_threadsafe_function(napi_threadsafe_function func)
482 {
483     LoadNapiFunctions();
484     return p_napi_acquire_threadsafe_function(func);
485 }
486 
napi_release_threadsafe_function(napi_threadsafe_function func,napi_threadsafe_function_release_mode mode)487 NAPI_EXTERN napi_status NAPI_CDECL napi_release_threadsafe_function(napi_threadsafe_function func,
488                                                                     napi_threadsafe_function_release_mode mode)
489 {
490     LoadNapiFunctions();
491     return p_napi_release_threadsafe_function(func, mode);
492 }
493 
napi_call_threadsafe_function(napi_threadsafe_function func,void * data,napi_threadsafe_function_call_mode is_blocking)494 NAPI_EXTERN napi_status NAPI_CDECL napi_call_threadsafe_function(napi_threadsafe_function func, void *data,
495                                                                  napi_threadsafe_function_call_mode is_blocking)
496 {
497     LoadNapiFunctions();
498     return p_napi_call_threadsafe_function(func, data, is_blocking);
499 }
500 
napi_is_dataview(napi_env env,napi_value value,bool * result)501 NAPI_EXTERN napi_status NAPI_CDECL napi_is_dataview(napi_env env, napi_value value, bool *result)
502 {
503     LoadNapiFunctions();
504     return p_napi_is_dataview(env, value, result);
505 }
506 
napi_is_arraybuffer(napi_env env,napi_value value,bool * result)507 NAPI_EXTERN napi_status NAPI_CDECL napi_is_arraybuffer(napi_env env, napi_value value, bool *result)
508 {
509     LoadNapiFunctions();
510     return p_napi_is_arraybuffer(env, value, result);
511 }
512 
513 // CC-OFFNXT(G.FUN.01, huge_method) solid logic
napi_get_dataview_info(napi_env env,napi_value dataview,size_t * bytelength,void ** data,napi_value * arraybuffer,size_t * byte_offset)514 NAPI_EXTERN napi_status NAPI_CDECL napi_get_dataview_info(napi_env env, napi_value dataview, size_t *bytelength,
515                                                           void **data, napi_value *arraybuffer, size_t *byte_offset)
516 {
517     LoadNapiFunctions();
518     return p_napi_get_dataview_info(env, dataview, bytelength, data, arraybuffer, byte_offset);
519 }
520 
napi_set_named_property(napi_env env,napi_value object,const char * utf8name,napi_value value)521 NAPI_EXTERN napi_status NAPI_CDECL napi_set_named_property(napi_env env, napi_value object, const char *utf8name,
522                                                            napi_value value)
523 {
524     LoadNapiFunctions();
525     return p_napi_set_named_property(env, object, utf8name, value);
526 }
527 
napi_get_boolean(napi_env env,bool value,napi_value * result)528 NAPI_EXTERN napi_status NAPI_CDECL napi_get_boolean(napi_env env, bool value, napi_value *result)
529 {
530     LoadNapiFunctions();
531     return p_napi_get_boolean(env, value, result);
532 }
533 
napi_create_uint32(napi_env env,uint32_t value,napi_value * result)534 NAPI_EXTERN napi_status NAPI_CDECL napi_create_uint32(napi_env env, uint32_t value, napi_value *result)
535 {
536     LoadNapiFunctions();
537     return p_napi_create_uint32(env, value, result);
538 }
539