1#ifndef SRC_NODE_API_H_
2#define SRC_NODE_API_H_
3
4#ifdef BUILDING_NODE_EXTENSION
5  #ifdef _WIN32
6    // Building native module against node
7    #define NAPI_EXTERN __declspec(dllimport)
8  #elif defined(__wasm32__)
9    #define NAPI_EXTERN __attribute__((__import_module__("napi")))
10  #endif
11#endif
12#include "js_native_api.h"
13#include "node_api_types.h"
14
15 /**
16 * @brief Struct declaration used in the napi_get_uv_event_loop interface
17 * @deprecated since 12
18 * @since since 8
19 */
20struct uv_loop_s;  // Forward declaration.
21
22#ifdef _WIN32
23# define NAPI_MODULE_EXPORT __declspec(dllexport)
24#else
25# define NAPI_MODULE_EXPORT __attribute__((visibility("default")))
26#endif
27
28#if defined(__GNUC__)
29# define NAPI_NO_RETURN __attribute__((noreturn))
30#elif defined(_WIN32)
31# define NAPI_NO_RETURN __declspec(noreturn)
32#else
33# define NAPI_NO_RETURN
34#endif
35
36typedef napi_value (*napi_addon_register_func)(napi_env env,
37                                               napi_value exports);
38
39typedef struct napi_module {
40  int nm_version;
41  unsigned int nm_flags;
42  const char* nm_filename;
43  napi_addon_register_func nm_register_func;
44  const char* nm_modname;
45  void* nm_priv;
46  void* reserved[4];
47} napi_module;
48
49#define NAPI_MODULE_VERSION  1
50
51#if defined(_MSC_VER)
52#pragma section(".CRT$XCU", read)
53#define NAPI_C_CTOR(fn)                                                     \
54  static void __cdecl fn(void);                                             \
55  __declspec(dllexport, allocate(".CRT$XCU")) void(__cdecl * fn##_)(void) = \
56      fn;                                                                   \
57  static void __cdecl fn(void)
58#else
59#define NAPI_C_CTOR(fn)                              \
60  static void fn(void) __attribute__((constructor)); \
61  static void fn(void)
62#endif
63
64#define NAPI_MODULE_X(modname, regfunc, priv, flags)                  \
65  EXTERN_C_START                                                      \
66    static napi_module _module =                                      \
67    {                                                                 \
68      NAPI_MODULE_VERSION,                                            \
69      flags,                                                          \
70      __FILE__,                                                       \
71      regfunc,                                                        \
72      #modname,                                                       \
73      priv,                                                           \
74      {0},                                                            \
75    };                                                                \
76    NAPI_C_CTOR(_register_ ## modname) {                              \
77      napi_module_register(&_module);                                 \
78    }                                                                 \
79  EXTERN_C_END
80
81#define NAPI_MODULE_INITIALIZER_X(base, version)                               \
82  NAPI_MODULE_INITIALIZER_X_HELPER(base, version)
83#define NAPI_MODULE_INITIALIZER_X_HELPER(base, version) base##version
84
85#ifdef __wasm32__
86#define NAPI_WASM_INITIALIZER                                                  \
87  NAPI_MODULE_INITIALIZER_X(napi_register_wasm_v, NAPI_MODULE_VERSION)
88#define NAPI_MODULE(modname, regfunc)                                          \
89  EXTERN_C_START                                                               \
90  NAPI_MODULE_EXPORT napi_value NAPI_WASM_INITIALIZER(napi_env env,            \
91                                                      napi_value exports) {    \
92    return regfunc(env, exports);                                              \
93  }                                                                            \
94  EXTERN_C_END
95#else
96#define NAPI_MODULE(modname, regfunc)                                 \
97  NAPI_MODULE_X(modname, regfunc, NULL, 0)  // NOLINT (readability/null_usage)
98#endif
99
100#define NAPI_MODULE_INITIALIZER_BASE napi_register_module_v
101
102#define NAPI_MODULE_INITIALIZER                                       \
103  NAPI_MODULE_INITIALIZER_X(NAPI_MODULE_INITIALIZER_BASE,             \
104      NAPI_MODULE_VERSION)
105
106#define NAPI_MODULE_INIT()                                            \
107  EXTERN_C_START                                                      \
108  NAPI_MODULE_EXPORT napi_value                                       \
109  NAPI_MODULE_INITIALIZER(napi_env env, napi_value exports);          \
110  EXTERN_C_END                                                        \
111  NAPI_MODULE(NODE_GYP_MODULE_NAME, NAPI_MODULE_INITIALIZER)          \
112  napi_value NAPI_MODULE_INITIALIZER(napi_env env,                    \
113                                     napi_value exports)
114
115EXTERN_C_START
116
117NAPI_EXTERN void napi_module_register(napi_module* mod);
118
119NAPI_EXTERN NAPI_NO_RETURN void napi_fatal_error(const char* location,
120                                                 size_t location_len,
121                                                 const char* message,
122                                                 size_t message_len);
123
124// Methods for custom handling of async operations
125NAPI_EXTERN napi_status napi_async_init(napi_env env,
126                                        napi_value async_resource,
127                                        napi_value async_resource_name,
128                                        napi_async_context* result);
129
130NAPI_EXTERN napi_status napi_async_destroy(napi_env env,
131                                           napi_async_context async_context);
132
133NAPI_EXTERN napi_status napi_make_callback(napi_env env,
134                                           napi_async_context async_context,
135                                           napi_value recv,
136                                           napi_value func,
137                                           size_t argc,
138                                           const napi_value* argv,
139                                           napi_value* result);
140
141// Methods to provide node::Buffer functionality with napi types
142NAPI_EXTERN napi_status napi_create_buffer(napi_env env,
143                                           size_t length,
144                                           void** data,
145                                           napi_value* result);
146NAPI_EXTERN napi_status napi_create_external_buffer(napi_env env,
147                                                    size_t length,
148                                                    void* data,
149                                                    napi_finalize finalize_cb,
150                                                    void* finalize_hint,
151                                                    napi_value* result);
152NAPI_EXTERN napi_status napi_create_buffer_copy(napi_env env,
153                                                size_t length,
154                                                const void* data,
155                                                void** result_data,
156                                                napi_value* result);
157NAPI_EXTERN napi_status napi_is_buffer(napi_env env,
158                                       napi_value value,
159                                       bool* result);
160NAPI_EXTERN napi_status napi_get_buffer_info(napi_env env,
161                                             napi_value value,
162                                             void** data,
163                                             size_t* length);
164
165// Methods to manage simple async operations
166NAPI_EXTERN
167napi_status napi_create_async_work(napi_env env,
168                                   napi_value async_resource,
169                                   napi_value async_resource_name,
170                                   napi_async_execute_callback execute,
171                                   napi_async_complete_callback complete,
172                                   void* data,
173                                   napi_async_work* result);
174NAPI_EXTERN napi_status napi_delete_async_work(napi_env env,
175                                               napi_async_work work);
176NAPI_EXTERN napi_status napi_queue_async_work(napi_env env,
177                                              napi_async_work work);
178NAPI_EXTERN napi_status napi_cancel_async_work(napi_env env,
179                                               napi_async_work work);
180
181// version management
182NAPI_EXTERN
183napi_status napi_get_node_version(napi_env env,
184                                  const napi_node_version** version);
185
186#if NAPI_VERSION >= 2
187
188/**
189 * @brief Get the current event loop associated with a specific napi_env.
190 * @param env The environment that the API is invoked under.
191 * @param loop The current libuv loop instance.
192 * @return A napi_status value is returned, which is used to check whether the UV is successfully obtained.
193 * @deprecated since 12
194 * @since since 8
195 */
196NAPI_EXTERN napi_status napi_get_uv_event_loop(napi_env env,
197                                               struct uv_loop_s** loop);
198
199#endif  // NAPI_VERSION >= 2
200
201#if NAPI_VERSION >= 3
202
203NAPI_EXTERN napi_status napi_fatal_exception(napi_env env, napi_value err);
204
205NAPI_EXTERN napi_status napi_add_env_cleanup_hook(napi_env env,
206                                                  void (*fun)(void* arg),
207                                                  void* arg);
208
209NAPI_EXTERN napi_status napi_remove_env_cleanup_hook(napi_env env,
210                                                     void (*fun)(void* arg),
211                                                     void* arg);
212
213NAPI_EXTERN napi_status napi_open_callback_scope(napi_env env,
214                                                 napi_value resource_object,
215                                                 napi_async_context context,
216                                                 napi_callback_scope* result);
217
218NAPI_EXTERN napi_status napi_close_callback_scope(napi_env env,
219                                                  napi_callback_scope scope);
220
221#endif  // NAPI_VERSION >= 3
222
223#if NAPI_VERSION >= 4
224
225#ifndef __wasm32__
226// Calling into JS from other threads
227NAPI_EXTERN napi_status
228napi_create_threadsafe_function(napi_env env,
229                                napi_value func,
230                                napi_value async_resource,
231                                napi_value async_resource_name,
232                                size_t max_queue_size,
233                                size_t initial_thread_count,
234                                void* thread_finalize_data,
235                                napi_finalize thread_finalize_cb,
236                                void* context,
237                                napi_threadsafe_function_call_js call_js_cb,
238                                napi_threadsafe_function* result);
239
240NAPI_EXTERN napi_status
241napi_get_threadsafe_function_context(napi_threadsafe_function func,
242                                     void** result);
243
244NAPI_EXTERN napi_status
245napi_call_threadsafe_function(napi_threadsafe_function func,
246                              void* data,
247                              napi_threadsafe_function_call_mode is_blocking);
248
249NAPI_EXTERN napi_status
250napi_acquire_threadsafe_function(napi_threadsafe_function func);
251
252NAPI_EXTERN napi_status
253napi_release_threadsafe_function(napi_threadsafe_function func,
254                                 napi_threadsafe_function_release_mode mode);
255
256NAPI_EXTERN napi_status
257napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func);
258
259NAPI_EXTERN napi_status
260napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func);
261#endif  // __wasm32__
262
263#endif  // NAPI_VERSION >= 4
264
265#if NAPI_VERSION >= 8
266
267NAPI_EXTERN napi_status napi_add_async_cleanup_hook(
268    napi_env env,
269    napi_async_cleanup_hook hook,
270    void* arg,
271    napi_async_cleanup_hook_handle* remove_handle);
272
273NAPI_EXTERN napi_status napi_remove_async_cleanup_hook(
274    napi_async_cleanup_hook_handle remove_handle);
275
276#endif  // NAPI_VERSION >= 8
277
278#ifdef NAPI_EXPERIMENTAL
279
280NAPI_EXTERN napi_status
281node_api_get_module_file_name(napi_env env, const char** result);
282
283#endif  // NAPI_EXPERIMENTAL
284
285EXTERN_C_END
286
287#endif  // SRC_NODE_API_H_
288