• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
20 struct 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 
36 typedef napi_value (*napi_addon_register_func)(napi_env env,
37                                                napi_value exports);
38 
39 typedef 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 
115 EXTERN_C_START
116 
117 NAPI_EXTERN void napi_module_register(napi_module* mod);
118 
119 NAPI_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
125 NAPI_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 
130 NAPI_EXTERN napi_status napi_async_destroy(napi_env env,
131                                            napi_async_context async_context);
132 
133 NAPI_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
142 NAPI_EXTERN napi_status napi_create_buffer(napi_env env,
143                                            size_t length,
144                                            void** data,
145                                            napi_value* result);
146 NAPI_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);
152 NAPI_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);
157 NAPI_EXTERN napi_status napi_is_buffer(napi_env env,
158                                        napi_value value,
159                                        bool* result);
160 NAPI_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
166 NAPI_EXTERN
167 napi_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);
174 NAPI_EXTERN napi_status napi_delete_async_work(napi_env env,
175                                                napi_async_work work);
176 NAPI_EXTERN napi_status napi_queue_async_work(napi_env env,
177                                               napi_async_work work);
178 NAPI_EXTERN napi_status napi_cancel_async_work(napi_env env,
179                                                napi_async_work work);
180 
181 // version management
182 NAPI_EXTERN
183 napi_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  */
196 NAPI_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 
203 NAPI_EXTERN napi_status napi_fatal_exception(napi_env env, napi_value err);
204 
205 NAPI_EXTERN napi_status napi_add_env_cleanup_hook(napi_env env,
206                                                   void (*fun)(void* arg),
207                                                   void* arg);
208 
209 NAPI_EXTERN napi_status napi_remove_env_cleanup_hook(napi_env env,
210                                                      void (*fun)(void* arg),
211                                                      void* arg);
212 
213 NAPI_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 
218 NAPI_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
227 NAPI_EXTERN napi_status
228 napi_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 
240 NAPI_EXTERN napi_status
241 napi_get_threadsafe_function_context(napi_threadsafe_function func,
242                                      void** result);
243 
244 NAPI_EXTERN napi_status
245 napi_call_threadsafe_function(napi_threadsafe_function func,
246                               void* data,
247                               napi_threadsafe_function_call_mode is_blocking);
248 
249 NAPI_EXTERN napi_status
250 napi_acquire_threadsafe_function(napi_threadsafe_function func);
251 
252 NAPI_EXTERN napi_status
253 napi_release_threadsafe_function(napi_threadsafe_function func,
254                                  napi_threadsafe_function_release_mode mode);
255 
256 NAPI_EXTERN napi_status
257 napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func);
258 
259 NAPI_EXTERN napi_status
260 napi_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 
267 NAPI_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 
273 NAPI_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 
280 NAPI_EXTERN napi_status
281 node_api_get_module_file_name(napi_env env, const char** result);
282 
283 #endif  // NAPI_EXPERIMENTAL
284 
285 EXTERN_C_END
286 
287 #endif  // SRC_NODE_API_H_
288