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