17777dab0Sopenharmony_ci#ifndef SRC_NODE_API_H_ 27777dab0Sopenharmony_ci#define SRC_NODE_API_H_ 37777dab0Sopenharmony_ci 47777dab0Sopenharmony_ci#ifdef BUILDING_NODE_EXTENSION 57777dab0Sopenharmony_ci #ifdef _WIN32 67777dab0Sopenharmony_ci // Building native module against node 77777dab0Sopenharmony_ci #define NAPI_EXTERN __declspec(dllimport) 87777dab0Sopenharmony_ci #elif defined(__wasm32__) 97777dab0Sopenharmony_ci #define NAPI_EXTERN __attribute__((__import_module__("napi"))) 107777dab0Sopenharmony_ci #endif 117777dab0Sopenharmony_ci#endif 127777dab0Sopenharmony_ci#include "js_native_api.h" 137777dab0Sopenharmony_ci#include "node_api_types.h" 147777dab0Sopenharmony_ci 157777dab0Sopenharmony_ci /** 167777dab0Sopenharmony_ci * @brief Struct declaration used in the napi_get_uv_event_loop interface 177777dab0Sopenharmony_ci * @deprecated since 12 187777dab0Sopenharmony_ci * @since since 8 197777dab0Sopenharmony_ci */ 207777dab0Sopenharmony_cistruct uv_loop_s; // Forward declaration. 217777dab0Sopenharmony_ci 227777dab0Sopenharmony_ci#ifdef _WIN32 237777dab0Sopenharmony_ci# define NAPI_MODULE_EXPORT __declspec(dllexport) 247777dab0Sopenharmony_ci#else 257777dab0Sopenharmony_ci# define NAPI_MODULE_EXPORT __attribute__((visibility("default"))) 267777dab0Sopenharmony_ci#endif 277777dab0Sopenharmony_ci 287777dab0Sopenharmony_ci#if defined(__GNUC__) 297777dab0Sopenharmony_ci# define NAPI_NO_RETURN __attribute__((noreturn)) 307777dab0Sopenharmony_ci#elif defined(_WIN32) 317777dab0Sopenharmony_ci# define NAPI_NO_RETURN __declspec(noreturn) 327777dab0Sopenharmony_ci#else 337777dab0Sopenharmony_ci# define NAPI_NO_RETURN 347777dab0Sopenharmony_ci#endif 357777dab0Sopenharmony_ci 367777dab0Sopenharmony_citypedef napi_value (*napi_addon_register_func)(napi_env env, 377777dab0Sopenharmony_ci napi_value exports); 387777dab0Sopenharmony_ci 397777dab0Sopenharmony_citypedef struct napi_module { 407777dab0Sopenharmony_ci int nm_version; 417777dab0Sopenharmony_ci unsigned int nm_flags; 427777dab0Sopenharmony_ci const char* nm_filename; 437777dab0Sopenharmony_ci napi_addon_register_func nm_register_func; 447777dab0Sopenharmony_ci const char* nm_modname; 457777dab0Sopenharmony_ci void* nm_priv; 467777dab0Sopenharmony_ci void* reserved[4]; 477777dab0Sopenharmony_ci} napi_module; 487777dab0Sopenharmony_ci 497777dab0Sopenharmony_ci#define NAPI_MODULE_VERSION 1 507777dab0Sopenharmony_ci 517777dab0Sopenharmony_ci#if defined(_MSC_VER) 527777dab0Sopenharmony_ci#pragma section(".CRT$XCU", read) 537777dab0Sopenharmony_ci#define NAPI_C_CTOR(fn) \ 547777dab0Sopenharmony_ci static void __cdecl fn(void); \ 557777dab0Sopenharmony_ci __declspec(dllexport, allocate(".CRT$XCU")) void(__cdecl * fn##_)(void) = \ 567777dab0Sopenharmony_ci fn; \ 577777dab0Sopenharmony_ci static void __cdecl fn(void) 587777dab0Sopenharmony_ci#else 597777dab0Sopenharmony_ci#define NAPI_C_CTOR(fn) \ 607777dab0Sopenharmony_ci static void fn(void) __attribute__((constructor)); \ 617777dab0Sopenharmony_ci static void fn(void) 627777dab0Sopenharmony_ci#endif 637777dab0Sopenharmony_ci 647777dab0Sopenharmony_ci#define NAPI_MODULE_X(modname, regfunc, priv, flags) \ 657777dab0Sopenharmony_ci EXTERN_C_START \ 667777dab0Sopenharmony_ci static napi_module _module = \ 677777dab0Sopenharmony_ci { \ 687777dab0Sopenharmony_ci NAPI_MODULE_VERSION, \ 697777dab0Sopenharmony_ci flags, \ 707777dab0Sopenharmony_ci __FILE__, \ 717777dab0Sopenharmony_ci regfunc, \ 727777dab0Sopenharmony_ci #modname, \ 737777dab0Sopenharmony_ci priv, \ 747777dab0Sopenharmony_ci {0}, \ 757777dab0Sopenharmony_ci }; \ 767777dab0Sopenharmony_ci NAPI_C_CTOR(_register_ ## modname) { \ 777777dab0Sopenharmony_ci napi_module_register(&_module); \ 787777dab0Sopenharmony_ci } \ 797777dab0Sopenharmony_ci EXTERN_C_END 807777dab0Sopenharmony_ci 817777dab0Sopenharmony_ci#define NAPI_MODULE_INITIALIZER_X(base, version) \ 827777dab0Sopenharmony_ci NAPI_MODULE_INITIALIZER_X_HELPER(base, version) 837777dab0Sopenharmony_ci#define NAPI_MODULE_INITIALIZER_X_HELPER(base, version) base##version 847777dab0Sopenharmony_ci 857777dab0Sopenharmony_ci#ifdef __wasm32__ 867777dab0Sopenharmony_ci#define NAPI_WASM_INITIALIZER \ 877777dab0Sopenharmony_ci NAPI_MODULE_INITIALIZER_X(napi_register_wasm_v, NAPI_MODULE_VERSION) 887777dab0Sopenharmony_ci#define NAPI_MODULE(modname, regfunc) \ 897777dab0Sopenharmony_ci EXTERN_C_START \ 907777dab0Sopenharmony_ci NAPI_MODULE_EXPORT napi_value NAPI_WASM_INITIALIZER(napi_env env, \ 917777dab0Sopenharmony_ci napi_value exports) { \ 927777dab0Sopenharmony_ci return regfunc(env, exports); \ 937777dab0Sopenharmony_ci } \ 947777dab0Sopenharmony_ci EXTERN_C_END 957777dab0Sopenharmony_ci#else 967777dab0Sopenharmony_ci#define NAPI_MODULE(modname, regfunc) \ 977777dab0Sopenharmony_ci NAPI_MODULE_X(modname, regfunc, NULL, 0) // NOLINT (readability/null_usage) 987777dab0Sopenharmony_ci#endif 997777dab0Sopenharmony_ci 1007777dab0Sopenharmony_ci#define NAPI_MODULE_INITIALIZER_BASE napi_register_module_v 1017777dab0Sopenharmony_ci 1027777dab0Sopenharmony_ci#define NAPI_MODULE_INITIALIZER \ 1037777dab0Sopenharmony_ci NAPI_MODULE_INITIALIZER_X(NAPI_MODULE_INITIALIZER_BASE, \ 1047777dab0Sopenharmony_ci NAPI_MODULE_VERSION) 1057777dab0Sopenharmony_ci 1067777dab0Sopenharmony_ci#define NAPI_MODULE_INIT() \ 1077777dab0Sopenharmony_ci EXTERN_C_START \ 1087777dab0Sopenharmony_ci NAPI_MODULE_EXPORT napi_value \ 1097777dab0Sopenharmony_ci NAPI_MODULE_INITIALIZER(napi_env env, napi_value exports); \ 1107777dab0Sopenharmony_ci EXTERN_C_END \ 1117777dab0Sopenharmony_ci NAPI_MODULE(NODE_GYP_MODULE_NAME, NAPI_MODULE_INITIALIZER) \ 1127777dab0Sopenharmony_ci napi_value NAPI_MODULE_INITIALIZER(napi_env env, \ 1137777dab0Sopenharmony_ci napi_value exports) 1147777dab0Sopenharmony_ci 1157777dab0Sopenharmony_ciEXTERN_C_START 1167777dab0Sopenharmony_ci 1177777dab0Sopenharmony_ciNAPI_EXTERN void napi_module_register(napi_module* mod); 1187777dab0Sopenharmony_ci 1197777dab0Sopenharmony_ciNAPI_EXTERN NAPI_NO_RETURN void napi_fatal_error(const char* location, 1207777dab0Sopenharmony_ci size_t location_len, 1217777dab0Sopenharmony_ci const char* message, 1227777dab0Sopenharmony_ci size_t message_len); 1237777dab0Sopenharmony_ci 1247777dab0Sopenharmony_ci// Methods for custom handling of async operations 1257777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_async_init(napi_env env, 1267777dab0Sopenharmony_ci napi_value async_resource, 1277777dab0Sopenharmony_ci napi_value async_resource_name, 1287777dab0Sopenharmony_ci napi_async_context* result); 1297777dab0Sopenharmony_ci 1307777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_async_destroy(napi_env env, 1317777dab0Sopenharmony_ci napi_async_context async_context); 1327777dab0Sopenharmony_ci 1337777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_make_callback(napi_env env, 1347777dab0Sopenharmony_ci napi_async_context async_context, 1357777dab0Sopenharmony_ci napi_value recv, 1367777dab0Sopenharmony_ci napi_value func, 1377777dab0Sopenharmony_ci size_t argc, 1387777dab0Sopenharmony_ci const napi_value* argv, 1397777dab0Sopenharmony_ci napi_value* result); 1407777dab0Sopenharmony_ci 1417777dab0Sopenharmony_ci// Methods to provide node::Buffer functionality with napi types 1427777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_create_buffer(napi_env env, 1437777dab0Sopenharmony_ci size_t length, 1447777dab0Sopenharmony_ci void** data, 1457777dab0Sopenharmony_ci napi_value* result); 1467777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_create_external_buffer(napi_env env, 1477777dab0Sopenharmony_ci size_t length, 1487777dab0Sopenharmony_ci void* data, 1497777dab0Sopenharmony_ci napi_finalize finalize_cb, 1507777dab0Sopenharmony_ci void* finalize_hint, 1517777dab0Sopenharmony_ci napi_value* result); 1527777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_create_buffer_copy(napi_env env, 1537777dab0Sopenharmony_ci size_t length, 1547777dab0Sopenharmony_ci const void* data, 1557777dab0Sopenharmony_ci void** result_data, 1567777dab0Sopenharmony_ci napi_value* result); 1577777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_is_buffer(napi_env env, 1587777dab0Sopenharmony_ci napi_value value, 1597777dab0Sopenharmony_ci bool* result); 1607777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_get_buffer_info(napi_env env, 1617777dab0Sopenharmony_ci napi_value value, 1627777dab0Sopenharmony_ci void** data, 1637777dab0Sopenharmony_ci size_t* length); 1647777dab0Sopenharmony_ci 1657777dab0Sopenharmony_ci// Methods to manage simple async operations 1667777dab0Sopenharmony_ciNAPI_EXTERN 1677777dab0Sopenharmony_cinapi_status napi_create_async_work(napi_env env, 1687777dab0Sopenharmony_ci napi_value async_resource, 1697777dab0Sopenharmony_ci napi_value async_resource_name, 1707777dab0Sopenharmony_ci napi_async_execute_callback execute, 1717777dab0Sopenharmony_ci napi_async_complete_callback complete, 1727777dab0Sopenharmony_ci void* data, 1737777dab0Sopenharmony_ci napi_async_work* result); 1747777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_delete_async_work(napi_env env, 1757777dab0Sopenharmony_ci napi_async_work work); 1767777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_queue_async_work(napi_env env, 1777777dab0Sopenharmony_ci napi_async_work work); 1787777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_cancel_async_work(napi_env env, 1797777dab0Sopenharmony_ci napi_async_work work); 1807777dab0Sopenharmony_ci 1817777dab0Sopenharmony_ci// version management 1827777dab0Sopenharmony_ciNAPI_EXTERN 1837777dab0Sopenharmony_cinapi_status napi_get_node_version(napi_env env, 1847777dab0Sopenharmony_ci const napi_node_version** version); 1857777dab0Sopenharmony_ci 1867777dab0Sopenharmony_ci#if NAPI_VERSION >= 2 1877777dab0Sopenharmony_ci 1887777dab0Sopenharmony_ci/** 1897777dab0Sopenharmony_ci * @brief Get the current event loop associated with a specific napi_env. 1907777dab0Sopenharmony_ci * @param env The environment that the API is invoked under. 1917777dab0Sopenharmony_ci * @param loop The current libuv loop instance. 1927777dab0Sopenharmony_ci * @return A napi_status value is returned, which is used to check whether the UV is successfully obtained. 1937777dab0Sopenharmony_ci * @deprecated since 12 1947777dab0Sopenharmony_ci * @since since 8 1957777dab0Sopenharmony_ci */ 1967777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_get_uv_event_loop(napi_env env, 1977777dab0Sopenharmony_ci struct uv_loop_s** loop); 1987777dab0Sopenharmony_ci 1997777dab0Sopenharmony_ci#endif // NAPI_VERSION >= 2 2007777dab0Sopenharmony_ci 2017777dab0Sopenharmony_ci#if NAPI_VERSION >= 3 2027777dab0Sopenharmony_ci 2037777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_fatal_exception(napi_env env, napi_value err); 2047777dab0Sopenharmony_ci 2057777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_add_env_cleanup_hook(napi_env env, 2067777dab0Sopenharmony_ci void (*fun)(void* arg), 2077777dab0Sopenharmony_ci void* arg); 2087777dab0Sopenharmony_ci 2097777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_remove_env_cleanup_hook(napi_env env, 2107777dab0Sopenharmony_ci void (*fun)(void* arg), 2117777dab0Sopenharmony_ci void* arg); 2127777dab0Sopenharmony_ci 2137777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_open_callback_scope(napi_env env, 2147777dab0Sopenharmony_ci napi_value resource_object, 2157777dab0Sopenharmony_ci napi_async_context context, 2167777dab0Sopenharmony_ci napi_callback_scope* result); 2177777dab0Sopenharmony_ci 2187777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_close_callback_scope(napi_env env, 2197777dab0Sopenharmony_ci napi_callback_scope scope); 2207777dab0Sopenharmony_ci 2217777dab0Sopenharmony_ci#endif // NAPI_VERSION >= 3 2227777dab0Sopenharmony_ci 2237777dab0Sopenharmony_ci#if NAPI_VERSION >= 4 2247777dab0Sopenharmony_ci 2257777dab0Sopenharmony_ci#ifndef __wasm32__ 2267777dab0Sopenharmony_ci// Calling into JS from other threads 2277777dab0Sopenharmony_ciNAPI_EXTERN napi_status 2287777dab0Sopenharmony_cinapi_create_threadsafe_function(napi_env env, 2297777dab0Sopenharmony_ci napi_value func, 2307777dab0Sopenharmony_ci napi_value async_resource, 2317777dab0Sopenharmony_ci napi_value async_resource_name, 2327777dab0Sopenharmony_ci size_t max_queue_size, 2337777dab0Sopenharmony_ci size_t initial_thread_count, 2347777dab0Sopenharmony_ci void* thread_finalize_data, 2357777dab0Sopenharmony_ci napi_finalize thread_finalize_cb, 2367777dab0Sopenharmony_ci void* context, 2377777dab0Sopenharmony_ci napi_threadsafe_function_call_js call_js_cb, 2387777dab0Sopenharmony_ci napi_threadsafe_function* result); 2397777dab0Sopenharmony_ci 2407777dab0Sopenharmony_ciNAPI_EXTERN napi_status 2417777dab0Sopenharmony_cinapi_get_threadsafe_function_context(napi_threadsafe_function func, 2427777dab0Sopenharmony_ci void** result); 2437777dab0Sopenharmony_ci 2447777dab0Sopenharmony_ciNAPI_EXTERN napi_status 2457777dab0Sopenharmony_cinapi_call_threadsafe_function(napi_threadsafe_function func, 2467777dab0Sopenharmony_ci void* data, 2477777dab0Sopenharmony_ci napi_threadsafe_function_call_mode is_blocking); 2487777dab0Sopenharmony_ci 2497777dab0Sopenharmony_ciNAPI_EXTERN napi_status 2507777dab0Sopenharmony_cinapi_acquire_threadsafe_function(napi_threadsafe_function func); 2517777dab0Sopenharmony_ci 2527777dab0Sopenharmony_ciNAPI_EXTERN napi_status 2537777dab0Sopenharmony_cinapi_release_threadsafe_function(napi_threadsafe_function func, 2547777dab0Sopenharmony_ci napi_threadsafe_function_release_mode mode); 2557777dab0Sopenharmony_ci 2567777dab0Sopenharmony_ciNAPI_EXTERN napi_status 2577777dab0Sopenharmony_cinapi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func); 2587777dab0Sopenharmony_ci 2597777dab0Sopenharmony_ciNAPI_EXTERN napi_status 2607777dab0Sopenharmony_cinapi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func); 2617777dab0Sopenharmony_ci#endif // __wasm32__ 2627777dab0Sopenharmony_ci 2637777dab0Sopenharmony_ci#endif // NAPI_VERSION >= 4 2647777dab0Sopenharmony_ci 2657777dab0Sopenharmony_ci#if NAPI_VERSION >= 8 2667777dab0Sopenharmony_ci 2677777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_add_async_cleanup_hook( 2687777dab0Sopenharmony_ci napi_env env, 2697777dab0Sopenharmony_ci napi_async_cleanup_hook hook, 2707777dab0Sopenharmony_ci void* arg, 2717777dab0Sopenharmony_ci napi_async_cleanup_hook_handle* remove_handle); 2727777dab0Sopenharmony_ci 2737777dab0Sopenharmony_ciNAPI_EXTERN napi_status napi_remove_async_cleanup_hook( 2747777dab0Sopenharmony_ci napi_async_cleanup_hook_handle remove_handle); 2757777dab0Sopenharmony_ci 2767777dab0Sopenharmony_ci#endif // NAPI_VERSION >= 8 2777777dab0Sopenharmony_ci 2787777dab0Sopenharmony_ci#ifdef NAPI_EXPERIMENTAL 2797777dab0Sopenharmony_ci 2807777dab0Sopenharmony_ciNAPI_EXTERN napi_status 2817777dab0Sopenharmony_cinode_api_get_module_file_name(napi_env env, const char** result); 2827777dab0Sopenharmony_ci 2837777dab0Sopenharmony_ci#endif // NAPI_EXPERIMENTAL 2847777dab0Sopenharmony_ci 2857777dab0Sopenharmony_ciEXTERN_C_END 2867777dab0Sopenharmony_ci 2877777dab0Sopenharmony_ci#endif // SRC_NODE_API_H_ 288