diff --git a/crates/napi/Cargo.toml b/crates/napi/Cargo.toml index b6ad7299..32360aae 100644 --- a/crates/napi/Cargo.toml +++ b/crates/napi/Cargo.toml @@ -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"] diff --git a/crates/napi/src/threadsafe_function.rs b/crates/napi/src/threadsafe_function.rs index 89771702..c3361e58 100644 --- a/crates/napi/src/threadsafe_function.rs +++ b/crates/napi/src/threadsafe_function.rs @@ -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::), - callback_ptr.cast(), - Some(call_js_cb::), - &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::), + callback_ptr.cast(), + Some(call_js_cb::), + &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 diff --git a/crates/sys/Cargo.toml b/crates/sys/Cargo.toml index ff1f118d..3b92ce38 100644 --- a/crates/sys/Cargo.toml +++ b/crates/sys/Cargo.toml @@ -23,6 +23,7 @@ napi6 = ["napi5"] napi7 = ["napi6"] napi8 = ["napi7"] napi9 = ["napi8"] +napi10 = ["napi9"] [package.metadata.workspaces] independent = true diff --git a/crates/sys/src/functions.rs b/crates/sys/src/functions.rs index ee9e33b5..0bf5a96f 100644 --- a/crates/sys/src/functions.rs +++ b/crates/sys/src/functions.rs @@ -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 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 { - 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 { diff --git a/examples/napi/Cargo.toml b/examples/napi/Cargo.toml index f24f36a4..a8cc9dce 100644 --- a/examples/napi/Cargo.toml +++ b/examples/napi/Cargo.toml @@ -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", diff --git a/examples/napi/package.json b/examples/napi/package.json index 805dd855..7b2575f1 100644 --- a/examples/napi/package.json +++ b/examples/napi/package.json @@ -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", diff --git a/examples/napi/src/serde.rs b/examples/napi/src/serde.rs index e7a46353..32f43fa3 100644 --- a/examples/napi/src/serde.rs +++ b/examples/napi/src/serde.rs @@ -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"); diff --git a/package.json b/package.json index 5afc098c..c174f88a 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/yarn.lock b/yarn.lock index 873fd30c..c3d077ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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"