feat(sys): sync Node-API version changes (#2661)

* feat(sys): sync Node-API version changes

* upgrade electron

* move node_api_create_buffer_from_arraybuffer to experimental
This commit is contained in:
LongYinan 2025-05-25 00:48:56 +08:00 committed by GitHub
parent 9cccc46790
commit 3a720f09cf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 109 additions and 67 deletions

View File

@ -25,11 +25,18 @@ async = ["tokio_rt"]
chrono_date = ["chrono", "napi5"] chrono_date = ["chrono", "napi5"]
# Enable deprecated types and traits for compatibility # Enable deprecated types and traits for compatibility
compat-mode = [] compat-mode = []
default = ["napi4"] # for most Node.js users default = ["napi4"] # for most Node.js users
deferred_trace = ["napi4"] deferred_trace = ["napi4"]
error_anyhow = ["anyhow"] error_anyhow = ["anyhow"]
experimental = ["napi-sys/experimental"] experimental = ["napi-sys/experimental"]
full = ["latin1", "napi9", "async", "serde-json", "experimental", "chrono_date"] full = [
"latin1",
"napi10",
"async",
"serde-json",
"experimental",
"chrono_date",
]
object_indexmap = ["indexmap"] object_indexmap = ["indexmap"]
latin1 = ["encoding_rs"] latin1 = ["encoding_rs"]
napi1 = [] napi1 = []
@ -41,6 +48,7 @@ napi6 = ["napi5", "napi-sys/napi6"]
napi7 = ["napi6", "napi-sys/napi7"] napi7 = ["napi6", "napi-sys/napi7"]
napi8 = ["napi7", "napi-sys/napi8"] napi8 = ["napi7", "napi-sys/napi8"]
napi9 = ["napi8", "napi-sys/napi9"] napi9 = ["napi8", "napi-sys/napi9"]
napi10 = ["napi9", "napi-sys/napi10"]
web_stream = ["futures-core", "tokio-stream", "napi4", "tokio_rt"] web_stream = ["futures-core", "tokio-stream", "napi4", "tokio_rt"]
noop = [] noop = []
serde-json = ["serde", "serde_json"] serde-json = ["serde", "serde_json"]

View File

@ -263,52 +263,61 @@ impl<
let mut async_resource_name = ptr::null_mut(); let mut async_resource_name = ptr::null_mut();
static THREAD_SAFE_FUNCTION_ASYNC_RESOURCE_NAME: &str = "napi_rs_threadsafe_function"; static THREAD_SAFE_FUNCTION_ASYNC_RESOURCE_NAME: &str = "napi_rs_threadsafe_function";
#[cfg(feature = "experimental")] #[cfg(feature = "napi10")]
{ {
check_status!(unsafe { let mut copied = false;
let mut copied = false; check_status!(
sys::node_api_create_external_string_latin1( unsafe {
env, sys::node_api_create_external_string_latin1(
THREAD_SAFE_FUNCTION_ASYNC_RESOURCE_NAME.as_ptr().cast(), env,
27, THREAD_SAFE_FUNCTION_ASYNC_RESOURCE_NAME.as_ptr().cast(),
None, 27,
ptr::null_mut(), None,
&mut async_resource_name, ptr::null_mut(),
&mut copied, &mut async_resource_name,
) &mut copied,
})?; )
},
"Create external string latin1 in ThreadsafeFunction::create failed"
)?;
} }
#[cfg(not(feature = "experimental"))] #[cfg(not(feature = "napi10"))]
{ {
check_status!(unsafe { check_status!(
sys::napi_create_string_utf8( unsafe {
env, sys::napi_create_string_utf8(
THREAD_SAFE_FUNCTION_ASYNC_RESOURCE_NAME.as_ptr().cast(), env,
27, THREAD_SAFE_FUNCTION_ASYNC_RESOURCE_NAME.as_ptr().cast(),
&mut async_resource_name, 27,
) &mut async_resource_name,
})?; )
},
"Create string utf8 in ThreadsafeFunction::create failed"
)?;
} }
let mut raw_tsfn = ptr::null_mut(); let mut raw_tsfn = ptr::null_mut();
let callback_ptr = Box::into_raw(Box::new(callback)); let callback_ptr = Box::into_raw(Box::new(callback));
let handle = ThreadsafeFunctionHandle::null(); let handle = ThreadsafeFunctionHandle::null();
check_status!(unsafe { check_status!(
sys::napi_create_threadsafe_function( unsafe {
env, sys::napi_create_threadsafe_function(
func, env,
ptr::null_mut(), func,
async_resource_name, ptr::null_mut(),
MaxQueueSize, async_resource_name,
1, MaxQueueSize,
Arc::downgrade(&handle).into_raw().cast_mut().cast(), // pass handler to thread_finalize_cb 1,
Some(thread_finalize_cb::<T, NewArgs, R>), Arc::downgrade(&handle).into_raw().cast_mut().cast(), // pass handler to thread_finalize_cb
callback_ptr.cast(), Some(thread_finalize_cb::<T, NewArgs, R>),
Some(call_js_cb::<T, Return, NewArgs, R, CalleeHandled>), callback_ptr.cast(),
&mut raw_tsfn, Some(call_js_cb::<T, Return, NewArgs, R, CalleeHandled>),
) &mut raw_tsfn,
})?; )
},
"Create threadsafe function in ThreadsafeFunction::create failed"
)?;
handle.set_raw(raw_tsfn); handle.set_raw(raw_tsfn);
// Weak ThreadsafeFunction will not prevent the event loop from exiting // Weak ThreadsafeFunction will not prevent the event loop from exiting

View File

@ -23,6 +23,7 @@ napi6 = ["napi5"]
napi7 = ["napi6"] napi7 = ["napi6"]
napi8 = ["napi7"] napi8 = ["napi7"]
napi9 = ["napi8"] napi9 = ["napi8"]
napi10 = ["napi9"]
[package.metadata.workspaces] [package.metadata.workspaces]
independent = true independent = true

View File

@ -728,8 +728,8 @@ mod napi9 {
); );
} }
#[cfg(feature = "experimental")] #[cfg(feature = "napi10")]
mod experimental { mod napi10 {
use std::os::raw::{c_char, c_void}; use std::os::raw::{c_char, c_void};
use super::super::types::*; use super::super::types::*;
@ -756,14 +756,6 @@ mod experimental {
copied: *mut bool, copied: *mut bool,
) -> napi_status; ) -> napi_status;
fn node_api_create_buffer_from_arraybuffer(
env: napi_env,
arraybuffer: napi_value,
byte_offset: usize,
byte_length: usize,
result: *mut napi_value,
) -> napi_status;
fn node_api_create_property_key_utf16( fn node_api_create_property_key_utf16(
env: napi_env, env: napi_env,
str_: *const u16, str_: *const u16,
@ -784,6 +776,25 @@ mod experimental {
length: isize, length: isize,
result: *mut napi_value, result: *mut napi_value,
) -> napi_status; ) -> napi_status;
}
);
}
#[cfg(feature = "experimental")]
mod experimental {
use std::os::raw::c_void;
use super::super::types::*;
generate!(
extern "C" {
fn node_api_create_buffer_from_arraybuffer(
env: napi_env,
arraybuffer: napi_value,
byte_offset: usize,
byte_length: usize,
result: *mut napi_value,
) -> napi_status;
fn node_api_post_finalizer( fn node_api_post_finalizer(
env: node_api_basic_env, env: node_api_basic_env,
@ -799,6 +810,8 @@ mod experimental {
pub use experimental::*; pub use experimental::*;
pub use napi1::*; pub use napi1::*;
#[cfg(feature = "napi10")]
pub use napi10::*;
#[cfg(feature = "napi2")] #[cfg(feature = "napi2")]
pub use napi2::*; pub use napi2::*;
#[cfg(feature = "napi3")] #[cfg(feature = "napi3")]
@ -882,6 +895,8 @@ pub(super) unsafe fn load_all() -> Result<libloading::Library, libloading::Error
napi8::load(&host)?; napi8::load(&host)?;
#[cfg(feature = "napi9")] #[cfg(feature = "napi9")]
napi9::load(&host)?; napi9::load(&host)?;
#[cfg(feature = "napi10")]
napi10::load(&host)?;
#[cfg(feature = "experimental")] #[cfg(feature = "experimental")]
experimental::load(&host)?; experimental::load(&host)?;
Ok(host) Ok(host)

View File

@ -4,6 +4,23 @@
#[cfg(any(target_env = "msvc", feature = "dyn-symbols"))] #[cfg(any(target_env = "msvc", feature = "dyn-symbols"))]
macro_rules! generate { macro_rules! generate {
(@stub_fn $name:ident($($param:ident: $ptype:ty,)*) -> napi_status) => {
unsafe extern "C" fn $name($(_: $ptype,)*) -> napi_status {
eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
1
}
};
(@stub_fn $name:ident($($param:ident: $ptype:ty,)*) -> $rtype:ty) => {
unsafe extern "C" fn $name($(_: $ptype,)*) -> $rtype {
eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
unsafe { std::mem::zeroed() }
}
};
(@stub_fn $name:ident($($param:ident: $ptype:ty,)*)) => {
unsafe extern "C" fn $name($(_: $ptype,)*) {
eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
}
};
(extern "C" { (extern "C" {
$(fn $name:ident($($param:ident: $ptype:ty$(,)?)*)$( -> $rtype:ty)?;)+ $(fn $name:ident($($param:ident: $ptype:ty$(,)?)*)$( -> $rtype:ty)?;)+
}) => { }) => {
@ -15,16 +32,9 @@ macro_rules! generate {
)* )*
} }
#[inline(never)]
fn panic_load<T>() -> T {
panic!("Node-API symbol has not been loaded")
}
static mut NAPI: Napi = { static mut NAPI: Napi = {
$( $(
unsafe extern "C" fn $name($(_: $ptype,)*)$( -> $rtype)* { generate!(@stub_fn $name($($param: $ptype,)*) $( -> $rtype)?);
panic_load()
}
)* )*
Napi { Napi {

View File

@ -31,7 +31,7 @@ rustc-hash = "2"
tokio-stream = "0.1" tokio-stream = "0.1"
tokio-util = { version = "0.7", features = ["io"] } tokio-util = { version = "0.7", features = ["io"] }
napi = { path = "../../crates/napi", default-features = false, features = [ napi = { path = "../../crates/napi", default-features = false, features = [
"napi9", "napi10",
"serde-json", "serde-json",
"experimental", "experimental",
"latin1", "latin1",

View File

@ -37,7 +37,7 @@
"ava": "^6.2.0", "ava": "^6.2.0",
"buffer": "^6.0.3", "buffer": "^6.0.3",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"electron": "^36.0.0", "electron": "^36.3.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"playwright": "^1.51.1", "playwright": "^1.51.1",
"rxjs": "^7.8.2", "rxjs": "^7.8.2",

View File

@ -86,7 +86,6 @@ pub fn get_bigint_json_value(bigint_json_value: Value) {
} }
Value::String(s) => { Value::String(s) => {
assert_eq!(s, "18446744073709551620"); assert_eq!(s, "18446744073709551620");
return;
} }
_ => { _ => {
unreachable!("should not happen"); unreachable!("should not happen");

View File

@ -75,7 +75,7 @@
"bun-types": "^1.2.8", "bun-types": "^1.2.8",
"c8": "^10.1.3", "c8": "^10.1.3",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"electron": "^36.0.0", "electron": "^36.3.1",
"esbuild": "^0.25.2", "esbuild": "^0.25.2",
"husky": "^9.1.7", "husky": "^9.1.7",
"lerna": "^8.2.1", "lerna": "^8.2.1",

View File

@ -301,7 +301,7 @@ __metadata:
ava: "npm:^6.2.0" ava: "npm:^6.2.0"
buffer: "npm:^6.0.3" buffer: "npm:^6.0.3"
cross-env: "npm:7.0.3" cross-env: "npm:7.0.3"
electron: "npm:^36.0.0" electron: "npm:^36.3.1"
lodash: "npm:^4.17.21" lodash: "npm:^4.17.21"
playwright: "npm:^1.51.1" playwright: "npm:^1.51.1"
rxjs: "npm:^7.8.2" rxjs: "npm:^7.8.2"
@ -5611,16 +5611,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"electron@npm:^36.0.0": "electron@npm:^36.3.1":
version: 36.1.0 version: 36.3.1
resolution: "electron@npm:36.1.0" resolution: "electron@npm:36.3.1"
dependencies: dependencies:
"@electron/get": "npm:^2.0.0" "@electron/get": "npm:^2.0.0"
"@types/node": "npm:^22.7.7" "@types/node": "npm:^22.7.7"
extract-zip: "npm:^2.0.1" extract-zip: "npm:^2.0.1"
bin: bin:
electron: cli.js electron: cli.js
checksum: 10c0/850e7ee65a86e66290bdf9e99902d8d862d568e805ac2749e599f582ba48e384d834559b6ee0bafd845416438a335f8b23fbd55043739d8782434b21fc69d963 checksum: 10c0/12f8856d555019d86a7e4f95ff6ca468a777ff2297b27f51a98b0cd227e08a2866220586b9984a3ae3624fee9286cb8ab2db3eb78906fa980b35a5bdb92070e7
languageName: node languageName: node
linkType: hard linkType: hard
@ -8835,7 +8835,7 @@ __metadata:
bun-types: "npm:^1.2.8" bun-types: "npm:^1.2.8"
c8: "npm:^10.1.3" c8: "npm:^10.1.3"
cross-env: "npm:^7.0.3" cross-env: "npm:^7.0.3"
electron: "npm:^36.0.0" electron: "npm:^36.3.1"
esbuild: "npm:^0.25.2" esbuild: "npm:^0.25.2"
husky: "npm:^9.1.7" husky: "npm:^9.1.7"
lerna: "npm:^8.2.1" lerna: "npm:^8.2.1"