From f2bce801e445cbf4a726bdefc881a95cd9069481 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 01:44:04 +0000 Subject: [PATCH 1/4] feat(nodex-api): add v9/v10 feature support and new Node-API bindings Agent-Logs-Url: https://github.com/uuhan/nodex/sessions/e3484bea-e3ba-4ff3-9fc3-4032cf875aa6 Co-authored-by: uuhan <3286111+uuhan@users.noreply.github.com> --- crates/nodex-api/Cargo.toml | 4 +- crates/nodex-api/api | 2 +- crates/nodex-api/build.rs | 4 ++ crates/nodex-api/src/api.rs | 109 ++++++++++++++++++++++++++++++++++ crates/nodex-api/src/error.rs | 6 ++ crates/nodex-api/src/lib.rs | 14 +++++ 6 files changed, 137 insertions(+), 2 deletions(-) diff --git a/crates/nodex-api/Cargo.toml b/crates/nodex-api/Cargo.toml index 60073db..ac8c697 100644 --- a/crates/nodex-api/Cargo.toml +++ b/crates/nodex-api/Cargo.toml @@ -37,6 +37,8 @@ v5 = ["v1", "v2", "v3", "v4"] v6 = ["v1", "v2", "v3", "v4", "v5"] v7 = ["v1", "v2", "v3", "v4", "v5", "v6"] v8 = ["v1", "v2", "v3", "v4", "v5", "v6", "v7"] +v9 = ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8"] +v10 = ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9"] [package.metadata.docs.rs] -features = ["v8"] +features = ["v10"] diff --git a/crates/nodex-api/api b/crates/nodex-api/api index d68505e..663251b 160000 --- a/crates/nodex-api/api +++ b/crates/nodex-api/api @@ -1 +1 @@ -Subproject commit d68505e4055ecb630e14c26c32e5c2c65e179bba +Subproject commit 663251b48d151a00c2ecaa079b3ca664558e953d diff --git a/crates/nodex-api/build.rs b/crates/nodex-api/build.rs index f331b44..a25aa0c 100644 --- a/crates/nodex-api/build.rs +++ b/crates/nodex-api/build.rs @@ -49,6 +49,10 @@ pub fn main() { #[cfg(feature = "gen-api")] fn api_version<'a>() -> &'a [&'a str] { + #[cfg(feature = "v10")] + return &["-DNAPI_VERSION=10"]; + #[cfg(feature = "v9")] + return &["-DNAPI_VERSION=9"]; #[cfg(feature = "v8")] return &["-DNAPI_VERSION=8"]; #[cfg(feature = "v7")] diff --git a/crates/nodex-api/src/api.rs b/crates/nodex-api/src/api.rs index 9687531..0a776e0 100644 --- a/crates/nodex-api/src/api.rs +++ b/crates/nodex-api/src/api.rs @@ -16,6 +16,10 @@ pub struct napi_env__ { _unused: [u8; 0], } pub type napi_env = *mut napi_env__; +#[cfg(any(feature = "v9", feature = "v10"))] +pub type node_api_nogc_env = *mut napi_env__; +#[cfg(any(feature = "v9", feature = "v10"))] +pub type node_api_basic_env = node_api_nogc_env; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct napi_value__ { @@ -82,6 +86,8 @@ pub const napi_typedarray_type_napi_float32_array: napi_typedarray_type = 7; pub const napi_typedarray_type_napi_float64_array: napi_typedarray_type = 8; pub const napi_typedarray_type_napi_bigint64_array: napi_typedarray_type = 9; pub const napi_typedarray_type_napi_biguint64_array: napi_typedarray_type = 10; +#[cfg(feature = "v10")] +pub const napi_typedarray_type_napi_float16_array: napi_typedarray_type = 11; pub type napi_typedarray_type = ::std::os::raw::c_uint; pub const napi_status_napi_ok: napi_status = 0; pub const napi_status_napi_invalid_arg: napi_status = 1; @@ -105,6 +111,10 @@ pub const napi_status_napi_date_expected: napi_status = 18; pub const napi_status_napi_arraybuffer_expected: napi_status = 19; pub const napi_status_napi_detachable_arraybuffer_expected: napi_status = 20; pub const napi_status_napi_would_deadlock: napi_status = 21; +#[cfg(feature = "v10")] +pub const napi_status_napi_no_external_buffers_allowed: napi_status = 22; +#[cfg(feature = "v10")] +pub const napi_status_napi_cannot_run_js: napi_status = 23; pub type napi_status = ::std::os::raw::c_uint; pub type napi_callback = ::std::option::Option< unsafe extern "C" fn(env: NapiEnv, info: napi_callback_info) -> napi_value, @@ -116,6 +126,10 @@ pub type napi_finalize = ::std::option::Option< finalize_hint: *mut ::std::os::raw::c_void, ), >; +#[cfg(feature = "v10")] +pub type node_api_nogc_finalize = napi_finalize; +#[cfg(feature = "v10")] +pub type node_api_basic_finalize = node_api_nogc_finalize; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct napi_property_descriptor { @@ -222,6 +236,57 @@ extern "C" { result: *mut napi_value, ) -> NapiStatus; } +#[cfg(feature = "v10")] +extern "C" { + pub fn node_api_create_external_string_latin1( + env: NapiEnv, + str_: *mut ::std::os::raw::c_char, + length: size_t, + finalize_callback: node_api_basic_finalize, + finalize_hint: *mut ::std::os::raw::c_void, + result: *mut napi_value, + copied: *mut bool, + ) -> NapiStatus; +} +#[cfg(feature = "v10")] +extern "C" { + pub fn node_api_create_external_string_utf16( + env: NapiEnv, + str_: *mut char16_t, + length: size_t, + finalize_callback: node_api_basic_finalize, + finalize_hint: *mut ::std::os::raw::c_void, + result: *mut napi_value, + copied: *mut bool, + ) -> NapiStatus; +} +#[cfg(feature = "v10")] +extern "C" { + pub fn node_api_create_property_key_latin1( + env: NapiEnv, + str_: *const ::std::os::raw::c_char, + length: size_t, + result: *mut napi_value, + ) -> NapiStatus; +} +#[cfg(feature = "v10")] +extern "C" { + pub fn node_api_create_property_key_utf8( + env: NapiEnv, + str_: *const ::std::os::raw::c_char, + length: size_t, + result: *mut napi_value, + ) -> NapiStatus; +} +#[cfg(feature = "v10")] +extern "C" { + pub fn node_api_create_property_key_utf16( + env: NapiEnv, + str_: *const char16_t, + length: size_t, + result: *mut napi_value, + ) -> NapiStatus; +} extern "C" { pub fn napi_create_symbol( env: NapiEnv, @@ -229,6 +294,15 @@ extern "C" { result: *mut napi_value, ) -> NapiStatus; } +#[cfg(any(feature = "v9", feature = "v10"))] +extern "C" { + pub fn node_api_symbol_for( + env: NapiEnv, + utf8description: *const ::std::os::raw::c_char, + length: size_t, + result: *mut napi_value, + ) -> NapiStatus; +} extern "C" { pub fn napi_create_function( env: NapiEnv, @@ -263,6 +337,15 @@ extern "C" { result: *mut napi_value, ) -> NapiStatus; } +#[cfg(any(feature = "v9", feature = "v10"))] +extern "C" { + pub fn node_api_create_syntax_error( + env: NapiEnv, + code: napi_value, + msg: napi_value, + result: *mut napi_value, + ) -> NapiStatus; +} extern "C" { pub fn napi_typeof(env: NapiEnv, value: napi_value, result: *mut NapiValuetype) -> NapiStatus; } @@ -638,6 +721,14 @@ extern "C" { msg: *const ::std::os::raw::c_char, ) -> NapiStatus; } +#[cfg(any(feature = "v9", feature = "v10"))] +extern "C" { + pub fn node_api_throw_syntax_error( + env: NapiEnv, + code: *const ::std::os::raw::c_char, + msg: *const ::std::os::raw::c_char, + ) -> NapiStatus; +} extern "C" { pub fn napi_is_error(env: NapiEnv, value: napi_value, result: *mut bool) -> NapiStatus; } @@ -1066,6 +1157,17 @@ extern "C" { result: *mut napi_value, ) -> NapiStatus; } +#[cfg(any(feature = "v9", feature = "v10"))] +extern "C" { + pub fn node_api_create_buffer_from_arraybuffer( + env: NapiEnv, + arraybuffer: napi_value, + byte_offset: size_t, + byte_length: size_t, + result_data: *mut *mut ::std::os::raw::c_void, + result: *mut napi_value, + ) -> NapiStatus; +} extern "C" { pub fn napi_is_buffer(env: NapiEnv, value: napi_value, result: *mut bool) -> NapiStatus; } @@ -1103,6 +1205,13 @@ extern "C" { version: *mut *const napi_node_version, ) -> NapiStatus; } +#[cfg(any(feature = "v9", feature = "v10"))] +extern "C" { + pub fn node_api_get_module_file_name( + env: node_api_basic_env, + result: *mut *const ::std::os::raw::c_char, + ) -> NapiStatus; +} #[cfg(feature = "v2")] extern "C" { diff --git a/crates/nodex-api/src/error.rs b/crates/nodex-api/src/error.rs index 4472876..a0e5cd2 100644 --- a/crates/nodex-api/src/error.rs +++ b/crates/nodex-api/src/error.rs @@ -48,6 +48,12 @@ pub enum NapiStatus { DetachableArraybufferExpected = api::napi_status_napi_detachable_arraybuffer_expected, #[error("napi error: would deadlock")] WouldDeadlock = api::napi_status_napi_would_deadlock, + #[cfg(feature = "v10")] + #[error("napi error: no external buffers allowed")] + NoExternalBuffersAllowed = api::napi_status_napi_no_external_buffers_allowed, + #[cfg(feature = "v10")] + #[error("napi error: cannot run js")] + CannotRunJs = api::napi_status_napi_cannot_run_js, } impl NapiStatus { diff --git a/crates/nodex-api/src/lib.rs b/crates/nodex-api/src/lib.rs index 228327f..ae7049d 100644 --- a/crates/nodex-api/src/lib.rs +++ b/crates/nodex-api/src/lib.rs @@ -55,6 +55,8 @@ pub enum NapiTypedarrayType { Float64Array = api::napi_typedarray_type_napi_float64_array, Bigint64Array = api::napi_typedarray_type_napi_bigint64_array, Biguint64Array = api::napi_typedarray_type_napi_biguint64_array, + #[cfg(feature = "v10")] + Float16Array = api::napi_typedarray_type_napi_float16_array, } /// napi_key_collection_mode @@ -155,6 +157,14 @@ pub mod prelude { pub use api::napi_async_cleanup_hook_handle; #[cfg(feature = "v4")] pub use api::napi_threadsafe_function; + #[cfg(feature = "v10")] + pub use api::node_api_basic_env; + #[cfg(feature = "v10")] + pub use api::node_api_basic_finalize; + #[cfg(feature = "v10")] + pub use api::node_api_nogc_env; + #[cfg(feature = "v10")] + pub use api::node_api_nogc_finalize; pub use api::{ napi_async_context, napi_async_work, napi_callback, napi_callback_info, napi_callback_scope, napi_deferred, napi_env, napi_escapable_handle_scope, napi_finalize, @@ -167,6 +177,10 @@ pub mod prelude { } pub const fn napi_version_guard() -> u32 { + #[cfg(feature = "v10")] + return 10; + #[cfg(feature = "v9")] + return 9; #[cfg(feature = "v8")] return 8; #[cfg(feature = "v7")] From 4bbf084adb2d68ff0d538d756af07028e982990d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 01:47:51 +0000 Subject: [PATCH 2/4] fix(nodex-api): resolve v9/v10 feature precedence in guards Agent-Logs-Url: https://github.com/uuhan/nodex/sessions/e3484bea-e3ba-4ff3-9fc3-4032cf875aa6 Co-authored-by: uuhan <3286111+uuhan@users.noreply.github.com> --- crates/nodex-api/build.rs | 2 +- crates/nodex-api/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/nodex-api/build.rs b/crates/nodex-api/build.rs index a25aa0c..7261fed 100644 --- a/crates/nodex-api/build.rs +++ b/crates/nodex-api/build.rs @@ -51,7 +51,7 @@ pub fn main() { fn api_version<'a>() -> &'a [&'a str] { #[cfg(feature = "v10")] return &["-DNAPI_VERSION=10"]; - #[cfg(feature = "v9")] + #[cfg(all(feature = "v9", not(feature = "v10")))] return &["-DNAPI_VERSION=9"]; #[cfg(feature = "v8")] return &["-DNAPI_VERSION=8"]; diff --git a/crates/nodex-api/src/lib.rs b/crates/nodex-api/src/lib.rs index ae7049d..d0b3aeb 100644 --- a/crates/nodex-api/src/lib.rs +++ b/crates/nodex-api/src/lib.rs @@ -179,7 +179,7 @@ pub mod prelude { pub const fn napi_version_guard() -> u32 { #[cfg(feature = "v10")] return 10; - #[cfg(feature = "v9")] + #[cfg(all(feature = "v9", not(feature = "v10")))] return 9; #[cfg(feature = "v8")] return 8; From 8c3b0aea69c0166d53ae89f8f301ba2f6f2a9989 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 01:56:15 +0000 Subject: [PATCH 3/4] test: ensure napi guard prefers v10 over v9 Agent-Logs-Url: https://github.com/uuhan/nodex/sessions/4602fd2d-4fba-487b-b4e9-bbc138a6e588 Co-authored-by: uuhan <3286111+uuhan@users.noreply.github.com> --- crates/nodex-api/src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/nodex-api/src/lib.rs b/crates/nodex-api/src/lib.rs index d0b3aeb..e3312ca 100644 --- a/crates/nodex-api/src/lib.rs +++ b/crates/nodex-api/src/lib.rs @@ -222,4 +222,10 @@ pub fn fatal_error(msg: impl AsRef, loc: Option>) { #[cfg(test)] mod tests { use super::*; + + #[cfg(all(feature = "v9", feature = "v10"))] + #[test] + fn napi_version_guard_prefers_v10_when_v9_and_v10_are_enabled() { + assert_eq!(napi_version_guard(), 10); + } } From f2f987e40baa8dc86e5d8c0d76c598cd3001bc16 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:07:08 +0000 Subject: [PATCH 4/4] fix(nodex-api): gate node_api_create_buffer_from_arraybuffer to v10 only Agent-Logs-Url: https://github.com/uuhan/nodex/sessions/70b00b61-2eee-48bb-a88d-e7d8e8b353e9 Co-authored-by: uuhan <3286111+uuhan@users.noreply.github.com> --- crates/nodex-api/src/api.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/nodex-api/src/api.rs b/crates/nodex-api/src/api.rs index 0a776e0..5749b81 100644 --- a/crates/nodex-api/src/api.rs +++ b/crates/nodex-api/src/api.rs @@ -1157,7 +1157,7 @@ extern "C" { result: *mut napi_value, ) -> NapiStatus; } -#[cfg(any(feature = "v9", feature = "v10"))] +#[cfg(feature = "v10")] extern "C" { pub fn node_api_create_buffer_from_arraybuffer( env: NapiEnv,