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 #ifdef __cplusplus
17 #include <cstdio>
18 #include <cstdlib>
19 #else
20 #include <stdio.h>
21 #include <stdlib.h>
22 #endif
23
24 #include <windows.h>
25 #include "node_api.h"
26
27 #define NAPI_CDECL __cdecl
28
29 #define NAPI_FUNCTIONS(op) \
30 op(napi_module_register) \
31 op(napi_create_function) \
32 op(napi_set_named_property) \
33 op(napi_create_string_utf8) \
34 op(napi_add_env_cleanup_hook) \
35 op(napi_get_last_error_info) \
36 op(napi_get_value_bigint_int64) \
37 op(napi_get_value_bigint_uint64) \
38 op(napi_create_object) \
39 op(napi_get_arraybuffer_info) \
40 op(napi_create_bigint_uint64) \
41 op(napi_is_typedarray) \
42 op(napi_add_finalizer) \
43 op(napi_get_typedarray_info) \
44 op(napi_set_property) \
45 op(napi_get_value_bool) \
46 op(napi_coerce_to_string) \
47 op(napi_get_value_uint32) \
48 op(napi_get_value_int32) \
49 op(napi_throw) \
50 op(napi_get_cb_info) \
51 op(napi_create_error) \
52 op(napi_get_value_string_utf8) \
53 op(napi_define_properties) \
54 op(napi_delete_reference) \
55 op(napi_get_reference_value) \
56 op(napi_open_handle_scope) \
57 op(napi_close_handle_scope) \
58 op(napi_open_escapable_handle_scope) \
59 op(napi_close_escapable_handle_scope) \
60 op(napi_is_exception_pending) \
61 op(napi_create_type_error) \
62 op(napi_escape_handle) \
63 op(napi_get_and_clear_last_exception) \
64 op(napi_fatal_error) \
65 op(napi_create_double) \
66 op(napi_typeof) \
67 op(napi_get_property) \
68 op(napi_get_named_property) \
69 op(napi_create_reference) \
70 op(napi_get_global) \
71 op(napi_has_property) \
72 op(napi_get_undefined) \
73 op(napi_get_value_double) \
74 op(napi_close_callback_scope) \
75 op(napi_async_destroy) \
76 op(napi_call_function) \
77 op(napi_get_value_external) \
78 op(napi_throw_error) \
79 op(napi_create_int32) \
80 op(napi_create_external_arraybuffer) \
81 op(napi_create_typedarray) \
82 op(napi_create_string_latin1) \
83 op(napi_create_async_work) \
84 op(napi_delete_async_work) \
85 op(napi_queue_async_work) \
86 op(napi_resolve_deferred) \
87 op(napi_reject_deferred) \
88 op(napi_create_promise) \
89 op(napi_create_threadsafe_function) \
90 op(napi_acquire_threadsafe_function) \
91 op(napi_release_threadsafe_function) \
92 op(napi_call_threadsafe_function) \
93 op(napi_is_dataview) \
94 op(napi_is_arraybuffer) \
95 op(napi_get_dataview_info)\
96 op(napi_get_boolean)\
97 op(napi_create_uint32)\
98 op(napi_create_bigint_int64)\
99
100 #define DECL_NAPI_IMPL(fn_name, ...) decltype(&fn_name) p_##fn_name;
101
NAPI_FUNCTIONS(DECL_NAPI_IMPL)102 NAPI_FUNCTIONS(DECL_NAPI_IMPL)
103
104 bool LoadNapiFunctions() {
105 static bool isLoaded = false;
106 if (isLoaded) return true;
107 HMODULE nodeModule = GetModuleHandle(NULL);
108 FARPROC fn_addr = GetProcAddress(nodeModule, "napi_module_register");
109
110 if (fn_addr == NULL) {
111 nodeModule = GetModuleHandleA("node.dll");
112 if (nodeModule == NULL) return false;
113 fn_addr = GetProcAddress(nodeModule, "napi_module_register");
114 if (fn_addr == NULL) {
115 return false;
116 }
117 }
118 bool apiLoadFailed = false;
119
120 #define GET_NAPI_IMPL(fn_name) \
121 fn_addr = GetProcAddress(nodeModule, #fn_name); \
122 if (fn_addr == NULL) apiLoadFailed = true; \
123 p_##fn_name = (decltype(p_##fn_name))fn_addr;
124
125 // Assign the addresses of the needed functions to the "p*" named pointers.
126 NAPI_FUNCTIONS(GET_NAPI_IMPL);
127
128 // If any required APIs failed to load, return false
129 if (apiLoadFailed) return false;
130
131 isLoaded = true;
132
133 return true;
134 }
135
136 NAPI_EXTERN void NAPI_CDECL
napi_module_register(napi_module * mod)137 napi_module_register(napi_module* mod) {
138 LoadNapiFunctions();
139 p_napi_module_register(mod);
140 }
141
142 NAPI_EXTERN napi_status NAPI_CDECL
napi_get_last_error_info(napi_env env,const napi_extended_error_info ** result)143 napi_get_last_error_info(napi_env env, const napi_extended_error_info** result) {
144 LoadNapiFunctions();
145 return p_napi_get_last_error_info(env, result);
146 }
147
napi_get_value_bigint_int64(napi_env env,napi_value value,int64_t * result,bool * lossless)148 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_bigint_int64(
149 napi_env env, napi_value value, int64_t* result, bool* lossless) {
150 LoadNapiFunctions();
151 return p_napi_get_value_bigint_int64(env, value, result, lossless);
152 }
153
napi_get_value_bigint_uint64(napi_env env,napi_value value,uint64_t * result,bool * lossless)154 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_bigint_uint64(
155 napi_env env, napi_value value, uint64_t* result, bool* lossless) {
156 LoadNapiFunctions();
157 return p_napi_get_value_bigint_uint64(env, value, result, lossless);
158 }
159
napi_create_object(napi_env env,napi_value * result)160 NAPI_EXTERN napi_status NAPI_CDECL napi_create_object(napi_env env, napi_value* result) {
161 LoadNapiFunctions();
162 return p_napi_create_object(env, result);
163 }
164
napi_get_arraybuffer_info(napi_env env,napi_value arraybuffer,void ** data,size_t * byte_length)165 NAPI_EXTERN napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env, napi_value arraybuffer, void** data, size_t* byte_length) {
166 LoadNapiFunctions();
167 return p_napi_get_arraybuffer_info(env, arraybuffer, data, byte_length);
168 }
169
170 NAPI_EXTERN napi_status NAPI_CDECL
napi_create_bigint_uint64(napi_env env,uint64_t value,napi_value * result)171 napi_create_bigint_uint64(napi_env env, uint64_t value, napi_value* result) {
172 LoadNapiFunctions();
173 return p_napi_create_bigint_uint64(env, value, result);
174 }
175
napi_is_typedarray(napi_env env,napi_value value,bool * result)176 NAPI_EXTERN napi_status NAPI_CDECL napi_is_typedarray(napi_env env, napi_value value, bool* result) {
177 LoadNapiFunctions();
178 return p_napi_is_typedarray(env, value, result);
179 }
180
181 NAPI_EXTERN napi_status NAPI_CDECL
napi_add_finalizer(napi_env env,napi_value js_object,void * finalize_data,napi_finalize finalize_cb,void * finalize_hint,napi_ref * result)182 napi_add_finalizer(napi_env env,
183 napi_value js_object,
184 void* finalize_data,
185 napi_finalize finalize_cb,
186 void* finalize_hint,
187 napi_ref* result) {
188 LoadNapiFunctions();
189 return p_napi_add_finalizer(env, js_object, finalize_data, finalize_cb, finalize_hint, result);
190 }
191
192
193 NAPI_EXTERN napi_status NAPI_CDECL
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)194 napi_get_typedarray_info(napi_env env,
195 napi_value typedarray,
196 napi_typedarray_type* type,
197 size_t* length,
198 void** data,
199 napi_value* arraybuffer,
200 size_t* byte_offset) {
201 LoadNapiFunctions();
202 return p_napi_get_typedarray_info(env, typedarray, type, length, data, arraybuffer, byte_offset);
203 }
204
napi_set_property(napi_env env,napi_value object,napi_value key,napi_value value)205 NAPI_EXTERN napi_status NAPI_CDECL napi_set_property(napi_env env,
206 napi_value object,
207 napi_value key,
208 napi_value value) {
209 LoadNapiFunctions();
210 return p_napi_set_property(env, object, key, value);
211 }
212
napi_get_value_bool(napi_env env,napi_value value,bool * result)213 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_bool(napi_env env,
214 napi_value value,
215 bool* result) {
216 LoadNapiFunctions();
217 return p_napi_get_value_bool(env, value, result);
218 }
219
napi_coerce_to_string(napi_env env,napi_value value,napi_value * result)220 NAPI_EXTERN napi_status NAPI_CDECL napi_coerce_to_string(napi_env env,
221 napi_value value,
222 napi_value* result) {
223 LoadNapiFunctions();
224 return p_napi_coerce_to_string(env, value, result);
225 }
226
napi_get_value_int32(napi_env env,napi_value value,int32_t * result)227 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_int32(napi_env env,
228 napi_value value,
229 int32_t* result) {
230 LoadNapiFunctions();
231 return p_napi_get_value_int32(env, value, result);
232 }
233
napi_get_cb_info(napi_env env,napi_callback_info cbinfo,size_t * argc,napi_value * argv,napi_value * this_arg,void ** data)234 NAPI_EXTERN napi_status NAPI_CDECL napi_get_cb_info(
235 napi_env env,
236 napi_callback_info cbinfo,
237 size_t* argc,
238 napi_value* argv,
239 napi_value* this_arg,
240 void** data) {
241 LoadNapiFunctions();
242 return p_napi_get_cb_info(env, cbinfo, argc, argv, this_arg, data);
243 }
244
napi_create_string_utf8(napi_env env,const char * str,size_t length,napi_value * result)245 NAPI_EXTERN napi_status NAPI_CDECL napi_create_string_utf8(napi_env env,
246 const char* str,
247 size_t length,
248 napi_value* result) {
249 LoadNapiFunctions();
250 return p_napi_create_string_utf8(env, str, length, result);
251 }
252
253
napi_throw(napi_env env,napi_value error)254 NAPI_EXTERN napi_status NAPI_CDECL napi_throw(napi_env env, napi_value error) {
255 LoadNapiFunctions();
256 return p_napi_throw(env, error);
257 }
258
napi_create_error(napi_env env,napi_value code,napi_value msg,napi_value * result)259 NAPI_EXTERN napi_status NAPI_CDECL napi_create_error(napi_env env,
260 napi_value code,
261 napi_value msg,
262 napi_value* result) {
263 LoadNapiFunctions();
264 return p_napi_create_error(env, code, msg, result);
265 }
266
napi_get_value_string_utf8(napi_env env,napi_value value,char * buf,size_t bufsize,size_t * result)267 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_string_utf8(
268 napi_env env, napi_value value, char* buf, size_t bufsize, size_t* result) {
269 LoadNapiFunctions();
270 return p_napi_get_value_string_utf8(env, value, buf, bufsize, result);
271 }
272
273 NAPI_EXTERN napi_status NAPI_CDECL
napi_define_properties(napi_env env,napi_value object,size_t property_count,const napi_property_descriptor * properties)274 napi_define_properties(napi_env env,
275 napi_value object,
276 size_t property_count,
277 const napi_property_descriptor* properties) {
278 LoadNapiFunctions();
279 return p_napi_define_properties(env, object, property_count, properties);
280 }
281
napi_delete_reference(napi_env env,napi_ref ref)282 NAPI_EXTERN napi_status NAPI_CDECL napi_delete_reference(napi_env env,
283 napi_ref ref) {
284 LoadNapiFunctions();
285 return p_napi_delete_reference(env, ref);
286 }
287
napi_get_reference_value(napi_env env,napi_ref ref,napi_value * result)288 NAPI_EXTERN napi_status NAPI_CDECL napi_get_reference_value(napi_env env,
289 napi_ref ref,
290 napi_value* result) {
291 LoadNapiFunctions();
292 return p_napi_get_reference_value(env, ref, result);
293 }
294 NAPI_EXTERN napi_status NAPI_CDECL
napi_open_handle_scope(napi_env env,napi_handle_scope * result)295 napi_open_handle_scope(napi_env env, napi_handle_scope* result) {
296 LoadNapiFunctions();
297 return p_napi_open_handle_scope(env, result);
298 }
299
300 NAPI_EXTERN napi_status NAPI_CDECL
napi_close_handle_scope(napi_env env,napi_handle_scope scope)301 napi_close_handle_scope(napi_env env, napi_handle_scope scope) {
302 LoadNapiFunctions();
303 return p_napi_close_handle_scope(env, scope);
304 }
napi_open_escapable_handle_scope(napi_env env,napi_escapable_handle_scope * result)305 NAPI_EXTERN napi_status NAPI_CDECL napi_open_escapable_handle_scope(
306 napi_env env, napi_escapable_handle_scope* result) {
307 return p_napi_open_escapable_handle_scope(env, result);
308 }
napi_close_escapable_handle_scope(napi_env env,napi_escapable_handle_scope scope)309 NAPI_EXTERN napi_status NAPI_CDECL napi_close_escapable_handle_scope(
310 napi_env env, napi_escapable_handle_scope scope) {
311 LoadNapiFunctions();
312 return p_napi_close_escapable_handle_scope(env, scope);
313 }
napi_is_exception_pending(napi_env env,bool * result)314 NAPI_EXTERN napi_status NAPI_CDECL napi_is_exception_pending(napi_env env,
315 bool* result) {
316 LoadNapiFunctions();
317 return p_napi_is_exception_pending(env, result);
318 }
319
napi_get_property(napi_env env,napi_value object,napi_value key,napi_value * result)320 NAPI_EXTERN napi_status NAPI_CDECL napi_get_property(napi_env env,
321 napi_value object,
322 napi_value key,
323 napi_value* result) {
324 LoadNapiFunctions();
325 return p_napi_get_property(env, object, key, result);
326 }
327
napi_get_value_uint32(napi_env env,napi_value value,uint32_t * result)328 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_uint32(napi_env env,
329 napi_value value,
330 uint32_t* result) {
331 LoadNapiFunctions();
332 return p_napi_get_value_uint32(env, value, result);
333 }
334
napi_typeof(napi_env env,napi_value value,napi_valuetype * result)335 NAPI_EXTERN napi_status NAPI_CDECL napi_typeof(napi_env env,
336 napi_value value,
337 napi_valuetype* result) {
338 LoadNapiFunctions();
339 return p_napi_typeof(env, value, result);
340 }
341 NAPI_EXTERN napi_status NAPI_CDECL
napi_get_and_clear_last_exception(napi_env env,napi_value * result)342 napi_get_and_clear_last_exception(napi_env env, napi_value* result) {
343 LoadNapiFunctions();
344 return p_napi_get_and_clear_last_exception(env, result);
345 }
346 NAPI_EXTERN NAPI_NO_RETURN void NAPI_CDECL
napi_fatal_error(const char * location,size_t location_len,const char * message,size_t message_len)347 napi_fatal_error(const char* location,
348 size_t location_len,
349 const char* message,
350 size_t message_len) {
351 LoadNapiFunctions();
352 p_napi_fatal_error(location, location_len, message, message_len);
353 // Not reachable, but not represented in type signature.
354 exit(0);
355 }
356 NAPI_EXTERN napi_status NAPI_CDECL
napi_get_value_external(napi_env env,napi_value value,void ** result)357 napi_get_value_external(napi_env env, napi_value value, void** result) {
358 LoadNapiFunctions();
359 return p_napi_get_value_external(env, value, result);
360 }
napi_create_double(napi_env env,double value,napi_value * result)361 NAPI_EXTERN napi_status NAPI_CDECL napi_create_double(napi_env env,
362 double value,
363 napi_value* result) {
364 LoadNapiFunctions();
365 return p_napi_create_double(env, value, result);
366 }
367
napi_create_type_error(napi_env env,napi_value code,napi_value msg,napi_value * result)368 NAPI_EXTERN napi_status NAPI_CDECL napi_create_type_error(napi_env env,
369 napi_value code,
370 napi_value msg,
371 napi_value* result) {
372 LoadNapiFunctions();
373 return p_napi_create_type_error(env, code, msg, result);
374 }
napi_get_named_property(napi_env env,napi_value object,const char * utf8name,napi_value * result)375 NAPI_EXTERN napi_status NAPI_CDECL napi_get_named_property(napi_env env,
376 napi_value object,
377 const char* utf8name,
378 napi_value* result) {
379 LoadNapiFunctions();
380 return p_napi_get_named_property(env, object, utf8name, result);
381 }
382 NAPI_EXTERN napi_status NAPI_CDECL
napi_create_reference(napi_env env,napi_value value,uint32_t initial_refcount,napi_ref * result)383 napi_create_reference(napi_env env,
384 napi_value value,
385 uint32_t initial_refcount,
386 napi_ref* result) {
387 LoadNapiFunctions();
388 return p_napi_create_reference(env, value, initial_refcount, result);
389 }
390
391 NAPI_EXTERN napi_status NAPI_CDECL
392 napi_escape_handle(napi_env env,
393 napi_escapable_handle_scope scope,
394 napi_value escapee,
395 napi_value* result);
napi_get_global(napi_env env,napi_value * result)396 NAPI_EXTERN napi_status NAPI_CDECL napi_get_global(napi_env env,
397 napi_value* result) {
398
399 LoadNapiFunctions();
400 return p_napi_get_global(env, result);
401 }
napi_has_property(napi_env env,napi_value object,napi_value key,bool * result)402 NAPI_EXTERN napi_status NAPI_CDECL napi_has_property(napi_env env,
403 napi_value object,
404 napi_value key,
405 bool* result) {
406 LoadNapiFunctions();
407 return p_napi_has_property(env, object, key, result);
408 }
napi_create_function(napi_env env,const char * utf8name,size_t length,napi_callback cb,void * data,napi_value * result)409 NAPI_EXTERN napi_status NAPI_CDECL napi_create_function(napi_env env,
410 const char* utf8name,
411 size_t length,
412 napi_callback cb,
413 void* data,
414 napi_value* result) {
415 LoadNapiFunctions();
416 return p_napi_create_function(env, utf8name, length, cb, data, result);
417 }
418
419 NAPI_EXTERN napi_status NAPI_CDECL
napi_escape_handle(napi_env env,napi_escapable_handle_scope scope,napi_value escapee,napi_value * result)420 napi_escape_handle(napi_env env,
421 napi_escapable_handle_scope scope,
422 napi_value escapee,
423 napi_value* result) {
424 LoadNapiFunctions();
425 return p_napi_escape_handle(env, scope, escapee, result);
426 }
napi_get_undefined(napi_env env,napi_value * result)427 NAPI_EXTERN napi_status NAPI_CDECL napi_get_undefined(napi_env env,
428 napi_value* result) {
429 LoadNapiFunctions();
430 return p_napi_get_undefined(env, result);
431 }
napi_get_value_double(napi_env env,napi_value value,double * result)432 NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_double(napi_env env,
433 napi_value value,
434 double* result) {
435 LoadNapiFunctions();
436 return p_napi_get_value_double(env, value, result);
437 }
438
439 NAPI_EXTERN napi_status NAPI_CDECL
napi_close_callback_scope(napi_env env,napi_callback_scope scope)440 napi_close_callback_scope(napi_env env, napi_callback_scope scope) {
441 LoadNapiFunctions();
442 return p_napi_close_callback_scope(env, scope);
443 }
444
445 NAPI_EXTERN napi_status NAPI_CDECL
napi_async_destroy(napi_env env,napi_async_context async_context)446 napi_async_destroy(napi_env env, napi_async_context async_context) {
447 LoadNapiFunctions();
448 return p_napi_async_destroy(env, async_context);
449 }
450
napi_call_function(napi_env env,napi_value recv,napi_value func,size_t argc,const napi_value * argv,napi_value * result)451 NAPI_EXTERN napi_status NAPI_CDECL napi_call_function(napi_env env,
452 napi_value recv,
453 napi_value func,
454 size_t argc,
455 const napi_value* argv,
456 napi_value* result) {
457 LoadNapiFunctions();
458 return p_napi_call_function(env, recv, func, argc, argv, result);
459 }
460
napi_throw_error(napi_env env,const char * code,const char * msg)461 NAPI_EXTERN napi_status NAPI_CDECL napi_throw_error(napi_env env,
462 const char* code,
463 const char* msg)
464 {
465 LoadNapiFunctions();
466 return p_napi_throw_error(env, code, msg);
467 }
468
napi_create_int32(napi_env env,int32_t value,napi_value * result)469 NAPI_EXTERN napi_status NAPI_CDECL napi_create_int32(napi_env env,
470 int32_t value,
471 napi_value* result)
472 {
473 LoadNapiFunctions();
474 return p_napi_create_int32(env, value, result);
475 }
476
napi_get_boolean(napi_env env,int32_t value,napi_value * result)477 NAPI_EXTERN napi_status NAPI_CDECL napi_get_boolean(napi_env env,
478 int32_t value,
479 napi_value* result)
480 {
481 LoadNapiFunctions();
482 return p_napi_create_int32(env, value, result);
483 }
484
napi_get_boolean(napi_env env,bool value,napi_value * result)485 NAPI_EXTERN napi_status NAPI_CDECL napi_get_boolean(napi_env env,
486 bool value,
487 napi_value* result)
488 {
489 LoadNapiFunctions();
490 return p_napi_get_boolean(env, value, result);
491 }
492
napi_create_uint32(napi_env env,uint32_t value,napi_value * result)493 NAPI_EXTERN napi_status NAPI_CDECL napi_create_uint32(napi_env env,
494 uint32_t value,
495 napi_value* result)
496 {
497 LoadNapiFunctions();
498 return p_napi_create_uint32(env, value, result);
499 }
500
napi_create_bigint_int64(napi_env env,int64_t value,napi_value * result)501 NAPI_EXTERN napi_status NAPI_CDECL napi_create_bigint_int64(napi_env env,
502 int64_t value,
503 napi_value* result)
504 {
505 LoadNapiFunctions();
506 return p_napi_create_bigint_int64(env, value, result);
507 }
508
napi_create_external_arraybuffer(napi_env env,void * external_data,size_t byte_length,napi_finalize finalize_cb,void * finalize_hint,napi_value * result)509 NAPI_EXTERN napi_status NAPI_CDECL napi_create_external_arraybuffer(
510 napi_env env,
511 void* external_data,
512 size_t byte_length,
513 napi_finalize finalize_cb,
514 void* finalize_hint,
515 napi_value* result)
516 {
517 LoadNapiFunctions();
518 return p_napi_create_external_arraybuffer(env, external_data, byte_length, finalize_cb, finalize_hint, result);
519 }
520
napi_create_typedarray(napi_env env,napi_typedarray_type type,size_t length,napi_value array_buffer,size_t byte_offset,napi_value * result)521 NAPI_EXTERN napi_status NAPI_CDECL napi_create_typedarray(
522 napi_env env,
523 napi_typedarray_type type,
524 size_t length,
525 napi_value array_buffer,
526 size_t byte_offset,
527 napi_value* result
528 )
529 {
530 LoadNapiFunctions();
531 return p_napi_create_typedarray(env, type, length, array_buffer, byte_offset, result);
532 }
533
napi_create_string_latin1(napi_env env,const char * str,size_t length,napi_value * result)534 NAPI_EXTERN napi_status NAPI_CDECL napi_create_string_latin1(
535 napi_env env,
536 const char* str,
537 size_t length,
538 napi_value* result
539 )
540 {
541 LoadNapiFunctions();
542 return p_napi_create_string_latin1(env, str, length, result);
543 }
544
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)545 NAPI_EXTERN napi_status NAPI_CDECL napi_create_async_work(
546 napi_env env,
547 napi_value async_resource,
548 napi_value async_resource_name,
549 napi_async_execute_callback execute,
550 napi_async_complete_callback complete,
551 void* data,
552 napi_async_work* result
553 )
554 {
555 LoadNapiFunctions();
556 return p_napi_create_async_work(env, async_resource, async_resource_name, execute, complete, data, result);
557 }
558
napi_delete_async_work(napi_env env,napi_async_work work)559 NAPI_EXTERN napi_status NAPI_CDECL napi_delete_async_work(
560 napi_env env,
561 napi_async_work work
562 )
563 {
564 LoadNapiFunctions();
565 return p_napi_delete_async_work(env, work);
566 }
567
napi_queue_async_work(napi_env env,napi_async_work work)568 NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(
569 napi_env env,
570 napi_async_work work
571 )
572 {
573 LoadNapiFunctions();
574 return p_napi_queue_async_work(env, work);
575 }
576
napi_create_promise(napi_env env,napi_deferred * deferred,napi_value * promise)577 NAPI_EXTERN napi_status NAPI_CDECL napi_create_promise(
578 napi_env env,
579 napi_deferred* deferred,
580 napi_value* promise)
581 {
582 LoadNapiFunctions();
583 return p_napi_create_promise(env, deferred, promise);
584 }
585
napi_resolve_deferred(napi_env env,napi_deferred deferred,napi_value resolution)586 NAPI_EXTERN napi_status NAPI_CDECL napi_resolve_deferred(
587 napi_env env,
588 napi_deferred deferred,
589 napi_value resolution)
590 {
591 LoadNapiFunctions();
592 return p_napi_resolve_deferred(env, deferred, resolution);
593 }
594
napi_reject_deferred(napi_env env,napi_deferred deferred,napi_value rejection)595 NAPI_EXTERN napi_status NAPI_CDECL napi_reject_deferred(
596 napi_env env,
597 napi_deferred deferred,
598 napi_value rejection)
599 {
600 LoadNapiFunctions();
601 return p_napi_reject_deferred(env, deferred, rejection);
602 }
603
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)604 NAPI_EXTERN napi_status NAPI_CDECL napi_create_threadsafe_function(
605 napi_env env,
606 napi_value func,
607 napi_value async_resource,
608 napi_value async_resource_name,
609 size_t max_queue_size,
610 size_t initial_thread_count,
611 void* thread_finalize_data,
612 napi_finalize thread_finalize_cb,
613 void* context,
614 napi_threadsafe_function_call_js call_js_cb,
615 napi_threadsafe_function* result)
616 {
617 LoadNapiFunctions();
618 return p_napi_create_threadsafe_function(env, func, async_resource, async_resource_name, max_queue_size, initial_thread_count, thread_finalize_data, thread_finalize_cb, context, call_js_cb, result);
619 }
620
621 NAPI_EXTERN napi_status NAPI_CDECL
napi_acquire_threadsafe_function(napi_threadsafe_function func)622 napi_acquire_threadsafe_function(napi_threadsafe_function func)
623 {
624 LoadNapiFunctions();
625 return p_napi_acquire_threadsafe_function(func);
626 }
627
628 NAPI_EXTERN napi_status NAPI_CDECL
napi_release_threadsafe_function(napi_threadsafe_function func,napi_threadsafe_function_release_mode mode)629 napi_release_threadsafe_function(napi_threadsafe_function func, napi_threadsafe_function_release_mode mode)
630 {
631 LoadNapiFunctions();
632 return p_napi_release_threadsafe_function(func, mode);
633 }
634
635 NAPI_EXTERN napi_status NAPI_CDECL
napi_call_threadsafe_function(napi_threadsafe_function func,void * data,napi_threadsafe_function_call_mode is_blocking)636 napi_call_threadsafe_function(
637 napi_threadsafe_function func,
638 void* data,
639 napi_threadsafe_function_call_mode is_blocking)
640 {
641 LoadNapiFunctions();
642 return p_napi_call_threadsafe_function(func, data, is_blocking);
643 }
644
645 NAPI_EXTERN napi_status NAPI_CDECL
napi_is_dataview(napi_env env,napi_value value,bool * result)646 napi_is_dataview(napi_env env,
647 napi_value value,
648 bool* result) {
649 LoadNapiFunctions();
650 return p_napi_is_dataview(env, value, result);
651 }
652
653 NAPI_EXTERN napi_status NAPI_CDECL
napi_is_arraybuffer(napi_env env,napi_value value,bool * result)654 napi_is_arraybuffer(napi_env env,
655 napi_value value,
656 bool* result) {
657 LoadNapiFunctions();
658 return p_napi_is_arraybuffer(env, value, result);
659 }
660
661 NAPI_EXTERN napi_status NAPI_CDECL
napi_get_dataview_info(napi_env env,napi_value dataview,size_t * bytelength,void ** data,napi_value * arraybuffer,size_t * byte_offset)662 napi_get_dataview_info(napi_env env,
663 napi_value dataview,
664 size_t* bytelength,
665 void** data,
666 napi_value* arraybuffer,
667 size_t* byte_offset) {
668 LoadNapiFunctions();
669 return p_napi_get_dataview_info(env, dataview, bytelength, data, arraybuffer, byte_offset);
670 }
671
672 NAPI_EXTERN napi_status NAPI_CDECL
napi_set_named_property(napi_env env,napi_value object,const char * utf8name,napi_value value)673 napi_set_named_property(napi_env env,
674 napi_value object,
675 const char* utf8name,
676 napi_value value) {
677 LoadNapiFunctions();
678 return p_napi_set_named_property(env, object, utf8name, value);
679 }
680