251015.1 · 78317af4798297dad5a17b2a07f5dfc712040b7a
Update Node-API files (#15)
reading declarations
@@ -0,0 +1,21 @@+MIT License++Copyright (c) 2021 Node.js++Permission is hereby granted, free of charge, to any person obtaining a copy+of this software and associated documentation files (the "Software"), to deal+in the Software without restriction, including without limitation the rights+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+copies of the Software, and to permit persons to whom the Software is+furnished to do so, subject to the following conditions:++The above copyright notice and this permission notice shall be included in all+copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+SOFTWARE.
@@ -0,0 +1,14 @@+# Node-API header files++Files in this folder are the Node-API from Node.js project.+https://github.com/nodejs/node-api-headers/tree/main/include++They are augmented with the experiemental APIs from the Node.js project+https://github.com/nodejs/node++See the copy of the license file in this folder.++# Additional files++The js_runtime_api.h file is part of this project and+licensed under Microsoft MIT license.
@@ -21,6 +21,18 @@ #endif #endif +#if defined(NAPI_EXPERIMENTAL) && \+ !defined(NODE_API_EXPERIMENTAL_NO_WARNING) && \+ !defined(NODE_WANT_INTERNALS)+#ifdef _MSC_VER+#pragma message("NAPI_EXPERIMENTAL is enabled. " \+ "Experimental features may be unstable.")+#else+#warning "NAPI_EXPERIMENTAL is enabled. " \+ "Experimental features may be unstable."+#endif+#endif+ #include "js_native_api_types.h" // If you need __declspec(dllimport), either include <node_api.h> instead, or@@ -50,7 +62,7 @@ EXTERN_C_START NAPI_EXTERN napi_status NAPI_CDECL napi_get_last_error_info(- node_api_nogc_env env, const napi_extended_error_info** result);+ node_api_basic_env env, const napi_extended_error_info** result); // Getters for defined singletons NAPI_EXTERN napi_status NAPI_CDECL napi_get_undefined(napi_env env,@@ -92,31 +104,31 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_create_string_utf16(napi_env env, const char16_t* str, size_t length, napi_value* result);-#ifdef NAPI_EXPERIMENTAL-#define NODE_API_EXPERIMENTAL_HAS_EXTERNAL_STRINGS-NAPI_EXTERN napi_status NAPI_CDECL-node_api_create_external_string_latin1(napi_env env,- char* str,- size_t length,- node_api_nogc_finalize finalize_callback,- void* finalize_hint,- napi_value* result,- bool* copied);+#if NAPI_VERSION >= 10+NAPI_EXTERN napi_status NAPI_CDECL node_api_create_external_string_latin1(+ napi_env env,+ char* str,+ size_t length,+ node_api_basic_finalize finalize_callback,+ void* finalize_hint,+ napi_value* result,+ bool* copied); NAPI_EXTERN napi_status NAPI_CDECL node_api_create_external_string_utf16(napi_env env, char16_t* str, size_t length,- node_api_nogc_finalize finalize_callback,+ node_api_basic_finalize finalize_callback, void* finalize_hint, napi_value* result, bool* copied);-#endif // NAPI_EXPERIMENTAL -#ifdef NAPI_EXPERIMENTAL-#define NODE_API_EXPERIMENTAL_HAS_PROPERTY_KEYS+NAPI_EXTERN napi_status NAPI_CDECL node_api_create_property_key_latin1(+ napi_env env, const char* str, size_t length, napi_value* result);+NAPI_EXTERN napi_status NAPI_CDECL node_api_create_property_key_utf8(+ napi_env env, const char* str, size_t length, napi_value* result); NAPI_EXTERN napi_status NAPI_CDECL node_api_create_property_key_utf16( napi_env env, const char16_t* str, size_t length, napi_value* result);-#endif // NAPI_EXPERIMENTAL+#endif // NAPI_VERSION >= 10 NAPI_EXTERN napi_status NAPI_CDECL napi_create_symbol(napi_env env, napi_value description,@@ -318,12 +330,13 @@ napi_define_class(napi_env env, napi_value* result); // Methods to work with external data objects-NAPI_EXTERN napi_status NAPI_CDECL napi_wrap(napi_env env,- napi_value js_object,- void* native_object,- node_api_nogc_finalize finalize_cb,- void* finalize_hint,- napi_ref* result);+NAPI_EXTERN napi_status NAPI_CDECL+napi_wrap(napi_env env,+ napi_value js_object,+ void* native_object,+ node_api_basic_finalize finalize_cb,+ void* finalize_hint,+ napi_ref* result); NAPI_EXTERN napi_status NAPI_CDECL napi_unwrap(napi_env env, napi_value js_object, void** result);@@ -333,7 +346,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_remove_wrap(napi_env env, NAPI_EXTERN napi_status NAPI_CDECL napi_create_external(napi_env env, void* data,- node_api_nogc_finalize finalize_cb,+ node_api_basic_finalize finalize_cb, void* finalize_hint, napi_value* result); NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_external(napi_env env,@@ -432,7 +445,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_create_external_arraybuffer(napi_env env, void* external_data, size_t byte_length,- node_api_nogc_finalize finalize_cb,+ node_api_basic_finalize finalize_cb, void* finalize_hint, napi_value* result); #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED@@ -474,7 +487,7 @@ napi_get_dataview_info(napi_env env, size_t* byte_offset); // version management-NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_nogc_env env,+NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_basic_env env, uint32_t* result); // Promises@@ -498,7 +511,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_run_script(napi_env env, // Memory management NAPI_EXTERN napi_status NAPI_CDECL napi_adjust_external_memory(- node_api_nogc_env env, int64_t change_in_bytes, int64_t* adjusted_value);+ node_api_basic_env env, int64_t change_in_bytes, int64_t* adjusted_value); #if NAPI_VERSION >= 5 @@ -520,7 +533,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_add_finalizer(napi_env env, napi_value js_object, void* finalize_data,- node_api_nogc_finalize finalize_cb,+ node_api_basic_finalize finalize_cb, void* finalize_hint, napi_ref* result); @@ -530,7 +543,7 @@ napi_add_finalizer(napi_env env, #define NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER NAPI_EXTERN napi_status NAPI_CDECL-node_api_post_finalizer(node_api_nogc_env env,+node_api_post_finalizer(node_api_basic_env env, napi_finalize finalize_cb, void* finalize_data, void* finalize_hint);@@ -575,13 +588,13 @@ napi_get_all_property_names(napi_env env, // Instance data NAPI_EXTERN napi_status NAPI_CDECL-napi_set_instance_data(node_api_nogc_env env,+napi_set_instance_data(node_api_basic_env env, void* data, napi_finalize finalize_cb, void* finalize_hint); -NAPI_EXTERN napi_status NAPI_CDECL napi_get_instance_data(node_api_nogc_env env,- void** data);+NAPI_EXTERN napi_status NAPI_CDECL+napi_get_instance_data(node_api_basic_env env, void** data); #endif // NAPI_VERSION >= 6 #if NAPI_VERSION >= 7
node-api/js_native_api_types.h
@@ -7,11 +7,6 @@ #include <stddef.h> // NOLINT(modernize-deprecated-headers) #include <stdint.h> // NOLINT(modernize-deprecated-headers) -// TODO: (vmoroz) NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT is not part of this-// Node-API file. It is here temporary to enable compilation. Remove it after-// updating tests.-#define NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT- #if !defined __cplusplus || (defined(_MSC_VER) && _MSC_VER < 1900) typedef uint16_t char16_t; #endif@@ -32,7 +27,7 @@ typedef struct napi_env__* napi_env; // meaning that they do not affect the state of the JS engine, and can // therefore be called synchronously from a finalizer that itself runs // synchronously during GC. Such APIs can receive either a `napi_env` or a-// `node_api_nogc_env` as their first parameter, because we should be able to+// `node_api_basic_env` as their first parameter, because we should be able to // also call them during normal, non-garbage-collecting operations, whereas // APIs that affect the state of the JS engine can only receive a `napi_env` as // their first parameter, because we must not call them during GC. In lieu of@@ -42,19 +37,21 @@ typedef struct napi_env__* napi_env; // expecting a non-const value. // // In conjunction with appropriate CFLAGS to warn us if we're passing a const-// (nogc) environment into an API that expects a non-const environment, and the-// definition of nogc finalizer function pointer types below, which receive a-// nogc environment as their first parameter, and can thus only call nogc APIs-// (unless the user explicitly casts the environment), we achieve the ability-// to ensure at compile time that we do not call APIs that affect the state of-// the JS engine from a synchronous (nogc) finalizer.+// (basic) environment into an API that expects a non-const environment, and+// the definition of basic finalizer function pointer types below, which+// receive a basic environment as their first parameter, and can thus only call+// basic APIs (unless the user explicitly casts the environment), we achieve+// the ability to ensure at compile time that we do not call APIs that affect+// the state of the JS engine from a synchronous (basic) finalizer. #if !defined(NAPI_EXPERIMENTAL) || \ (defined(NAPI_EXPERIMENTAL) && \- defined(NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT))+ (defined(NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT) || \+ defined(NODE_API_EXPERIMENTAL_BASIC_ENV_OPT_OUT))) typedef struct napi_env__* node_api_nogc_env; #else typedef const struct napi_env__* node_api_nogc_env; #endif+typedef node_api_nogc_env node_api_basic_env; typedef struct napi_value__* napi_value; typedef struct napi_ref__* napi_ref;@@ -152,13 +149,15 @@ typedef void(NAPI_CDECL* napi_finalize)(napi_env env, #if !defined(NAPI_EXPERIMENTAL) || \ (defined(NAPI_EXPERIMENTAL) && \- defined(NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT))+ (defined(NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT) || \+ defined(NODE_API_EXPERIMENTAL_BASIC_ENV_OPT_OUT))) typedef napi_finalize node_api_nogc_finalize; #else typedef void(NAPI_CDECL* node_api_nogc_finalize)(node_api_nogc_env env, void* finalize_data, void* finalize_hint); #endif+typedef node_api_nogc_finalize node_api_basic_finalize; typedef struct { // One of utf8name or name should be NULL.
@@ -4,7 +4,7 @@ #ifndef SRC_JS_RUNTIME_API_H_ #define SRC_JS_RUNTIME_API_H_ -#include "js_native_api.h"+#include "node_api.h" // // Node-API extensions required for JavaScript engine hosting.@@ -51,6 +51,16 @@ JSR_API jsr_config_enable_gc_api(jsr_config config, bool value); JSR_API jsr_config_set_explicit_microtasks(jsr_config config, bool value); +// A callback to process unhandled JS error+typedef void(NAPI_CDECL* jsr_unhandled_error_cb)(void* cb_data,+ napi_env env,+ napi_value error);++JSR_API jsr_config_on_unhandled_error(+ jsr_config config,+ void* cb_data,+ jsr_unhandled_error_cb unhandled_error_cb);+ //============================================================================= // jsr_config task runner //=============================================================================@@ -187,13 +197,18 @@ JSR_API jsr_get_and_clear_last_unhandled_promise_rejection(napi_env env, napi_value* result); // Create new napi_env for the runtime.-JSR_API jsr_create_node_api_env(napi_env root_env,- int32_t api_version,- napi_env* env);+JSR_API+jsr_create_node_api_env(napi_env root_env, int32_t api_version, napi_env* env); // Run task in the environment context. JSR_API jsr_run_task(napi_env env, jsr_task_run_cb task_cb, void* data); +// Initializes native module.+JSR_API jsr_initialize_native_module(napi_env env,+ napi_addon_register_func register_module,+ int32_t api_version,+ napi_value* exports);+ EXTERN_C_END #endif // !SRC_JS_RUNTIME_API_H_
@@ -0,0 +1,270 @@+#ifndef SRC_NODE_API_H_+#define SRC_NODE_API_H_++#if defined(BUILDING_NODE_EXTENSION) && !defined(NAPI_EXTERN)+#ifdef _WIN32+// Building native addon against node+#define NAPI_EXTERN __declspec(dllimport)+#elif defined(__wasm__)+#define NAPI_EXTERN __attribute__((__import_module__("napi")))+#endif+#endif+#include "js_native_api.h"+#include "node_api_types.h"++struct uv_loop_s; // Forward declaration.++#ifdef _WIN32+#define NAPI_MODULE_EXPORT __declspec(dllexport)+#else+#ifdef __EMSCRIPTEN__+#define NAPI_MODULE_EXPORT \+ __attribute__((visibility("default"))) __attribute__((used))+#else+#define NAPI_MODULE_EXPORT __attribute__((visibility("default")))+#endif+#endif++#if defined(__GNUC__)+#define NAPI_NO_RETURN __attribute__((noreturn))+#elif defined(_WIN32)+#define NAPI_NO_RETURN __declspec(noreturn)+#else+#define NAPI_NO_RETURN+#endif++typedef napi_value(NAPI_CDECL* napi_addon_register_func)(napi_env env,+ napi_value exports);+typedef int32_t(NAPI_CDECL* node_api_addon_get_api_version_func)(void);++// Used by deprecated registration method napi_module_register.+typedef struct napi_module {+ int nm_version;+ unsigned int nm_flags;+ const char* nm_filename;+ napi_addon_register_func nm_register_func;+ const char* nm_modname;+ void* nm_priv;+ void* reserved[4];+} napi_module;++#define NAPI_MODULE_VERSION 1++#define NAPI_MODULE_INITIALIZER_X(base, version) \+ NAPI_MODULE_INITIALIZER_X_HELPER(base, version)+#define NAPI_MODULE_INITIALIZER_X_HELPER(base, version) base##version++#ifdef __wasm__+#define NAPI_MODULE_INITIALIZER_BASE napi_register_wasm_v+#else+#define NAPI_MODULE_INITIALIZER_BASE napi_register_module_v+#endif++#define NODE_API_MODULE_GET_API_VERSION_BASE node_api_module_get_api_version_v++#define NAPI_MODULE_INITIALIZER \+ NAPI_MODULE_INITIALIZER_X(NAPI_MODULE_INITIALIZER_BASE, NAPI_MODULE_VERSION)++#define NODE_API_MODULE_GET_API_VERSION \+ NAPI_MODULE_INITIALIZER_X(NODE_API_MODULE_GET_API_VERSION_BASE, \+ NAPI_MODULE_VERSION)++#define NAPI_MODULE_INIT() \+ EXTERN_C_START \+ NAPI_MODULE_EXPORT int32_t NODE_API_MODULE_GET_API_VERSION(void) { \+ return NAPI_VERSION; \+ } \+ NAPI_MODULE_EXPORT napi_value NAPI_MODULE_INITIALIZER(napi_env env, \+ napi_value exports); \+ EXTERN_C_END \+ napi_value NAPI_MODULE_INITIALIZER(napi_env env, napi_value exports)++#define NAPI_MODULE(modname, regfunc) \+ NAPI_MODULE_INIT() { \+ return regfunc(env, exports); \+ }++// Deprecated. Use NAPI_MODULE.+#define NAPI_MODULE_X(modname, regfunc, priv, flags) \+ NAPI_MODULE(modname, regfunc)++EXTERN_C_START++// Deprecated. Replaced by symbol-based registration defined by NAPI_MODULE+// and NAPI_MODULE_INIT macros.+NAPI_EXTERN void NAPI_CDECL napi_module_register(napi_module* mod);++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);++// Methods for custom handling of async operations+NAPI_EXTERN napi_status NAPI_CDECL+napi_async_init(napi_env env,+ napi_value async_resource,+ napi_value async_resource_name,+ napi_async_context* result);++NAPI_EXTERN napi_status NAPI_CDECL+napi_async_destroy(napi_env env, napi_async_context async_context);++NAPI_EXTERN napi_status NAPI_CDECL+napi_make_callback(napi_env env,+ napi_async_context async_context,+ napi_value recv,+ napi_value func,+ size_t argc,+ const napi_value* argv,+ napi_value* result);++// Methods to provide node::Buffer functionality with napi types+NAPI_EXTERN napi_status NAPI_CDECL napi_create_buffer(napi_env env,+ size_t length,+ void** data,+ napi_value* result);+#ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED+NAPI_EXTERN napi_status NAPI_CDECL+napi_create_external_buffer(napi_env env,+ size_t length,+ void* data,+ node_api_basic_finalize finalize_cb,+ void* finalize_hint,+ napi_value* result);+#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED++#if NAPI_VERSION >= 10++NAPI_EXTERN napi_status NAPI_CDECL+node_api_create_buffer_from_arraybuffer(napi_env env,+ napi_value arraybuffer,+ size_t byte_offset,+ size_t byte_length,+ napi_value* result);+#endif // NAPI_VERSION >= 10++NAPI_EXTERN napi_status NAPI_CDECL napi_create_buffer_copy(napi_env env,+ size_t length,+ const void* data,+ void** result_data,+ napi_value* result);+NAPI_EXTERN napi_status NAPI_CDECL napi_is_buffer(napi_env env,+ napi_value value,+ bool* result);+NAPI_EXTERN napi_status NAPI_CDECL napi_get_buffer_info(napi_env env,+ napi_value value,+ void** data,+ size_t* length);++// Methods to manage simple async operations+NAPI_EXTERN napi_status NAPI_CDECL+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);+NAPI_EXTERN napi_status NAPI_CDECL napi_delete_async_work(napi_env env,+ napi_async_work work);+NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(node_api_basic_env env,+ napi_async_work work);+NAPI_EXTERN napi_status NAPI_CDECL+napi_cancel_async_work(node_api_basic_env env, napi_async_work work);++// version management+NAPI_EXTERN napi_status NAPI_CDECL napi_get_node_version(+ node_api_basic_env env, const napi_node_version** version);++#if NAPI_VERSION >= 2++// Return the current libuv event loop for a given environment+NAPI_EXTERN napi_status NAPI_CDECL+napi_get_uv_event_loop(node_api_basic_env env, struct uv_loop_s** loop);++#endif // NAPI_VERSION >= 2++#if NAPI_VERSION >= 3++NAPI_EXTERN napi_status NAPI_CDECL napi_fatal_exception(napi_env env,+ napi_value err);++NAPI_EXTERN napi_status NAPI_CDECL napi_add_env_cleanup_hook(+ node_api_basic_env env, napi_cleanup_hook fun, void* arg);++NAPI_EXTERN napi_status NAPI_CDECL napi_remove_env_cleanup_hook(+ node_api_basic_env env, napi_cleanup_hook fun, void* arg);++NAPI_EXTERN napi_status NAPI_CDECL+napi_open_callback_scope(napi_env env,+ napi_value resource_object,+ napi_async_context context,+ napi_callback_scope* result);++NAPI_EXTERN napi_status NAPI_CDECL+napi_close_callback_scope(napi_env env, napi_callback_scope scope);++#endif // NAPI_VERSION >= 3++#if NAPI_VERSION >= 4++// Calling into JS from other threads+NAPI_EXTERN napi_status NAPI_CDECL+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);++NAPI_EXTERN napi_status NAPI_CDECL napi_get_threadsafe_function_context(+ napi_threadsafe_function func, void** result);++NAPI_EXTERN napi_status NAPI_CDECL+napi_call_threadsafe_function(napi_threadsafe_function func,+ void* data,+ napi_threadsafe_function_call_mode is_blocking);++NAPI_EXTERN napi_status NAPI_CDECL+napi_acquire_threadsafe_function(napi_threadsafe_function func);++NAPI_EXTERN napi_status NAPI_CDECL napi_release_threadsafe_function(+ napi_threadsafe_function func, napi_threadsafe_function_release_mode mode);++NAPI_EXTERN napi_status NAPI_CDECL napi_unref_threadsafe_function(+ node_api_basic_env env, napi_threadsafe_function func);++NAPI_EXTERN napi_status NAPI_CDECL napi_ref_threadsafe_function(+ node_api_basic_env env, napi_threadsafe_function func);++#endif // NAPI_VERSION >= 4++#if NAPI_VERSION >= 8++NAPI_EXTERN napi_status NAPI_CDECL+napi_add_async_cleanup_hook(node_api_basic_env env,+ napi_async_cleanup_hook hook,+ void* arg,+ napi_async_cleanup_hook_handle* remove_handle);++NAPI_EXTERN napi_status NAPI_CDECL+napi_remove_async_cleanup_hook(napi_async_cleanup_hook_handle remove_handle);++#endif // NAPI_VERSION >= 8++#if NAPI_VERSION >= 9++NAPI_EXTERN napi_status NAPI_CDECL+node_api_get_module_file_name(node_api_basic_env env, const char** result);++#endif // NAPI_VERSION >= 9++EXTERN_C_END++#endif // SRC_NODE_API_H_
@@ -0,0 +1,52 @@+#ifndef SRC_NODE_API_TYPES_H_+#define SRC_NODE_API_TYPES_H_++#include "js_native_api_types.h"++typedef struct napi_callback_scope__* napi_callback_scope;+typedef struct napi_async_context__* napi_async_context;+typedef struct napi_async_work__* napi_async_work;++#if NAPI_VERSION >= 3+typedef void(NAPI_CDECL* napi_cleanup_hook)(void* arg);+#endif // NAPI_VERSION >= 3++#if NAPI_VERSION >= 4+typedef struct napi_threadsafe_function__* napi_threadsafe_function;+#endif // NAPI_VERSION >= 4++#if NAPI_VERSION >= 4+typedef enum {+ napi_tsfn_release,+ napi_tsfn_abort+} napi_threadsafe_function_release_mode;++typedef enum {+ napi_tsfn_nonblocking,+ napi_tsfn_blocking+} napi_threadsafe_function_call_mode;+#endif // NAPI_VERSION >= 4++typedef void(NAPI_CDECL* napi_async_execute_callback)(napi_env env, void* data);+typedef void(NAPI_CDECL* napi_async_complete_callback)(napi_env env,+ napi_status status,+ void* data);+#if NAPI_VERSION >= 4+typedef void(NAPI_CDECL* napi_threadsafe_function_call_js)(+ napi_env env, napi_value js_callback, void* context, void* data);+#endif // NAPI_VERSION >= 4++typedef struct {+ uint32_t major;+ uint32_t minor;+ uint32_t patch;+ const char* release;+} napi_node_version;++#if NAPI_VERSION >= 8+typedef struct napi_async_cleanup_hook_handle__* napi_async_cleanup_hook_handle;+typedef void(NAPI_CDECL* napi_async_cleanup_hook)(+ napi_async_cleanup_hook_handle handle, void* data);+#endif // NAPI_VERSION >= 8++#endif // SRC_NODE_API_TYPES_H_