• 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 #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