mirror of
https://github.com/napi-rs/napi-rs.git
synced 2025-12-08 19:56:07 +00:00
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:
parent
9cccc46790
commit
3a720f09cf
@ -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"]
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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");
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
12
yarn.lock
12
yarn.lock
@ -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"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user