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"]
# Enable deprecated types and traits for compatibility
compat-mode = []
default = ["napi4"] # for most Node.js users
default = ["napi4"] # for most Node.js users
deferred_trace = ["napi4"]
error_anyhow = ["anyhow"]
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"]
latin1 = ["encoding_rs"]
napi1 = []
@ -41,6 +48,7 @@ napi6 = ["napi5", "napi-sys/napi6"]
napi7 = ["napi6", "napi-sys/napi7"]
napi8 = ["napi7", "napi-sys/napi8"]
napi9 = ["napi8", "napi-sys/napi9"]
napi10 = ["napi9", "napi-sys/napi10"]
web_stream = ["futures-core", "tokio-stream", "napi4", "tokio_rt"]
noop = []
serde-json = ["serde", "serde_json"]

View File

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

View File

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

View File

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

View File

@ -4,6 +4,23 @@
#[cfg(any(target_env = "msvc", feature = "dyn-symbols"))]
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" {
$(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 = {
$(
unsafe extern "C" fn $name($(_: $ptype,)*)$( -> $rtype)* {
panic_load()
}
generate!(@stub_fn $name($($param: $ptype,)*) $( -> $rtype)?);
)*
Napi {

View File

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

View File

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

View File

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

View File

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

View File

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