From 80d9d87ef9e473ae51f841dbd5ee9e9800a0fcd9 Mon Sep 17 00:00:00 2001 From: Ranger <32590310+southorange0929@users.noreply.github.com> Date: Sun, 26 May 2024 21:07:01 +0800 Subject: [PATCH] chore(example): remove JsFunction from example (#2123) * chore(example): remove jsfunction * feat(napi): implement ToNapiValue for Ref as required by TSFN * fix(test): tsfn test build failed * chore: lint code * fix(test): fix tsfn unit test --- examples/napi-compat-mode/src/env.rs | 8 +- examples/napi-compat-mode/src/function.rs | 22 ++-- examples/napi-compat-mode/src/napi4/tsfn.rs | 109 +++++++----------- .../src/napi4/tsfn_dua_instance.rs | 18 ++- .../__snapshots__/typegen.spec.ts.md | 12 +- .../__snapshots__/typegen.spec.ts.snap | Bin 5066 -> 5056 bytes examples/napi/index.d.cts | 12 +- examples/napi/src/callback.rs | 14 +-- examples/napi/src/either.rs | 2 +- examples/napi/src/fn_strict.rs | 9 +- examples/napi/src/fn_ts_override.rs | 17 +-- examples/napi/src/function.rs | 26 +++-- 12 files changed, 101 insertions(+), 148 deletions(-) diff --git a/examples/napi-compat-mode/src/env.rs b/examples/napi-compat-mode/src/env.rs index 0fb83d59..12473bb5 100644 --- a/examples/napi-compat-mode/src/env.rs +++ b/examples/napi-compat-mode/src/env.rs @@ -1,6 +1,6 @@ use napi::{ - CallContext, ContextlessResult, Env, JsBoolean, JsFunction, JsObject, JsString, JsUndefined, - JsUnknown, Result, + bindgen_prelude::Function, CallContext, ContextlessResult, Env, JsBoolean, JsObject, JsString, + JsUndefined, JsUnknown, Result, }; #[js_function(2)] @@ -48,8 +48,8 @@ pub fn throw_syntax_error(ctx: CallContext) -> Result { let syntax_error = ctx .env .get_global()? - .get_named_property::("SyntaxError")?; - ctx.env.throw(syntax_error.new_instance(&[message])?)?; + .get_named_property::>("SyntaxError")?; + ctx.env.throw(syntax_error.new_instance(message)?)?; ctx.env.get_undefined() } diff --git a/examples/napi-compat-mode/src/function.rs b/examples/napi-compat-mode/src/function.rs index 6e62e0b8..67ea80b0 100644 --- a/examples/napi-compat-mode/src/function.rs +++ b/examples/napi-compat-mode/src/function.rs @@ -1,25 +1,25 @@ use napi::{ - bindgen_prelude::Function, CallContext, JsError, JsFunction, JsNull, JsObject, JsUnknown, Result, + bindgen_prelude::Function, CallContext, JsError, JsNull, JsObject, JsString, JsUnknown, Result, }; #[js_function(1)] pub fn call_function(ctx: CallContext) -> Result { - let js_func = ctx.get::(0)?; + let js_func = ctx.get::>(0)?; let js_string_hello = ctx.env.create_string("hello".as_ref())?.into_unknown(); let js_string_world = ctx.env.create_string("world".as_ref())?.into_unknown(); - js_func.call(None, &[js_string_hello, js_string_world])?; + js_func.call((js_string_hello, js_string_world))?; ctx.env.get_null() } #[js_function(1)] pub fn call_function_with_ref_arguments(ctx: CallContext) -> Result { - let js_func = ctx.get::(0)?; + let js_func = ctx.get::>(0)?; let js_string_hello = ctx.env.create_string("hello".as_ref())?; let js_string_world = ctx.env.create_string("world".as_ref())?; - js_func.call(None, &[&js_string_hello, &js_string_world])?; + js_func.call((js_string_hello, js_string_world))?; ctx.env.get_null() } @@ -27,21 +27,21 @@ pub fn call_function_with_ref_arguments(ctx: CallContext) -> Result { #[js_function(1)] pub fn call_function_with_this(ctx: CallContext) -> Result { let js_this: JsObject = ctx.this_unchecked(); - let js_func = ctx.get::(0)?; + let js_func = ctx.get::>(0)?; - js_func.call_without_args(Some(&js_this))?; + js_func.apply(&js_this, ())?; ctx.env.get_null() } #[js_function(2)] pub fn call_function_error(ctx: CallContext) -> Result { - let js_func = ctx.get::(0)?; - let error_func = ctx.get::(1)?; + let js_func = ctx.get::>(0)?; + let error_func = ctx.get::(1)?; - match js_func.call_without_args(None) { + match js_func.call(()) { Ok(v) => Ok(v), - Err(e) => error_func.call(None, &[JsError::from(e).into_unknown(*ctx.env)]), + Err(e) => error_func.call(JsError::from(e).into_unknown(*ctx.env)), } } diff --git a/examples/napi-compat-mode/src/napi4/tsfn.rs b/examples/napi-compat-mode/src/napi4/tsfn.rs index 225b6ab1..34ea87d9 100644 --- a/examples/napi-compat-mode/src/napi4/tsfn.rs +++ b/examples/napi-compat-mode/src/napi4/tsfn.rs @@ -2,25 +2,18 @@ use std::path::Path; use std::thread; use napi::{ - threadsafe_function::{ThreadSafeCallContext, ThreadsafeFunctionCallMode}, - CallContext, Error, JsBoolean, JsFunction, JsNumber, JsObject, JsString, JsUndefined, Ref, - Result, Status, + bindgen_prelude::Function, threadsafe_function::ThreadsafeFunctionCallMode, CallContext, Error, + JsBoolean, JsNumber, JsObject, JsString, JsUndefined, Ref, Result, Status, }; #[js_function(1)] pub fn test_threadsafe_function(ctx: CallContext) -> Result { - let func = ctx.get::(0)?; + let func = ctx.get::>>(0)?; - let tsfn = - ctx - .env - .create_threadsafe_function(&func, 0, |ctx: ThreadSafeCallContext>| { - ctx - .value - .iter() - .map(|v| ctx.env.create_uint32(*v)) - .collect::>>() - })?; + let tsfn = func + .build_threadsafe_function() + .callee_handled::() + .build()?; let tsfn_cloned = tsfn.clone(); @@ -41,18 +34,9 @@ pub fn test_threadsafe_function(ctx: CallContext) -> Result { #[js_function(1)] pub fn test_abort_threadsafe_function(ctx: CallContext) -> Result { - let func = ctx.get::(0)?; + let func = ctx.get::>>(0)?; - let tsfn = - ctx - .env - .create_threadsafe_function(&func, 0, |ctx: ThreadSafeCallContext>| { - ctx - .value - .iter() - .map(|v| ctx.env.create_uint32(*v)) - .collect::>>() - })?; + let tsfn = func.build_threadsafe_function().build()?; let tsfn_cloned = tsfn.clone(); @@ -62,20 +46,11 @@ pub fn test_abort_threadsafe_function(ctx: CallContext) -> Result { #[js_function(1)] pub fn test_abort_independent_threadsafe_function(ctx: CallContext) -> Result { - let func = ctx.get::(0)?; + let func = ctx.get::(0)?; - let tsfn = ctx - .env - .create_threadsafe_function(&func, 0, |ctx: ThreadSafeCallContext| { - ctx.env.create_uint32(ctx.value).map(|v| vec![v]) - })?; + let tsfn = func.build_threadsafe_function().build()?; - let tsfn_other = - ctx - .env - .create_threadsafe_function(&func, 0, |ctx: ThreadSafeCallContext| { - ctx.env.create_uint32(ctx.value).map(|v| vec![v]) - })?; + let tsfn_other = func.build_threadsafe_function().build()?; tsfn_other.abort()?; ctx.env.get_boolean(tsfn.aborted()) @@ -83,30 +58,25 @@ pub fn test_abort_independent_threadsafe_function(ctx: CallContext) -> Result Result { - let func = ctx.get::(0)?; + let func = ctx.get::>(0)?; - let tsfn = ctx - .env - .create_threadsafe_function(&func, 0, |ctx: ThreadSafeCallContext| { - ctx.env.create_uint32(ctx.value).map(|v| vec![v]) - })?; + let tsfn = func.build_threadsafe_function().build()?; let tsfn_clone = tsfn.clone(); tsfn_clone.abort()?; - let call_status = tsfn.call(Ok(1), ThreadsafeFunctionCallMode::NonBlocking); + let call_status = tsfn.call(1, ThreadsafeFunctionCallMode::NonBlocking); assert!(call_status != Status::Ok); ctx.env.get_undefined() } #[js_function(1)] pub fn test_tsfn_error(ctx: CallContext) -> Result { - let func = ctx.get::(0)?; - let tsfn = ctx - .env - .create_threadsafe_function(&func, 0, |ctx: ThreadSafeCallContext<()>| { - ctx.env.get_undefined().map(|v| vec![v]) - })?; + let func = ctx.get::>>(0)?; + let tsfn = func + .build_threadsafe_function() + .callee_handled::() + .build()?; thread::spawn(move || { tsfn.call( Err(Error::new(Status::GenericFailure, "invalid".to_owned())), @@ -126,18 +96,18 @@ async fn read_file_content(filepath: &Path) -> Result> { #[js_function(2)] pub fn test_tokio_readfile(ctx: CallContext) -> Result { let js_filepath = ctx.get::(0)?; - let js_func = ctx.get::(1)?; + let js_func = ctx.get::>>(1)?; let path_str = js_filepath.into_utf8()?.into_owned()?; - let tsfn = - ctx - .env - .create_threadsafe_function(&js_func, 0, |ctx: ThreadSafeCallContext>| { - ctx - .env - .create_buffer_with_data(ctx.value) - .map(|v| v.into_raw()) - })?; + let tsfn = js_func + .build_threadsafe_function() + .callee_handled::() + .build_callback(move |ctx| { + ctx + .env + .create_buffer_with_data(ctx.value) + .map(|v| v.into_raw()) + })?; let rt = tokio::runtime::Runtime::new() .map_err(|e| Error::from_reason(format!("Create tokio runtime failed {}", e)))?; @@ -149,24 +119,23 @@ pub fn test_tokio_readfile(ctx: CallContext) -> Result { ctx.env.get_undefined() } -#[js_function(2)] +#[js_function(3)] pub fn test_tsfn_with_ref(ctx: CallContext) -> Result { - let callback = ctx.get::(0)?; + let callback: Function, napi::JsUnknown> = ctx.get::>>(0)?; let options = ctx.get::(1)?; - let options_ref = ctx.env.create_reference(options)?; - let tsfn = ctx.env.create_threadsafe_function( - &callback, - 0, - |mut ctx: ThreadSafeCallContext>| { + let option_ref = ctx.env.create_reference(options); + let tsfn = callback + .build_threadsafe_function() + .callee_handled::() + .build_callback(move |mut ctx| { ctx .env .get_reference_value_unchecked::(&ctx.value) .and_then(|obj| ctx.value.unref(ctx.env).map(|_| obj)) - }, - )?; + })?; thread::spawn(move || { - tsfn.call(Ok(options_ref), ThreadsafeFunctionCallMode::Blocking); + tsfn.call(option_ref, ThreadsafeFunctionCallMode::Blocking); }); ctx.env.get_undefined() diff --git a/examples/napi-compat-mode/src/napi4/tsfn_dua_instance.rs b/examples/napi-compat-mode/src/napi4/tsfn_dua_instance.rs index 46b0c396..05d3047a 100644 --- a/examples/napi-compat-mode/src/napi4/tsfn_dua_instance.rs +++ b/examples/napi-compat-mode/src/napi4/tsfn_dua_instance.rs @@ -1,24 +1,20 @@ use napi::{ - threadsafe_function::{ThreadSafeCallContext, ThreadsafeFunction}, - CallContext, JsFunction, JsObject, JsUndefined, + bindgen_prelude::Function, threadsafe_function::ThreadsafeFunction, CallContext, JsObject, + JsUndefined, }; use napi_derive::js_function; #[derive(Clone)] pub struct A { - pub cb: ThreadsafeFunction, + pub cb: ThreadsafeFunction, } #[js_function(1)] pub fn constructor(ctx: CallContext) -> napi::Result { - let callback = ctx.get::(0)?; + let callback = ctx.get::>(0)?; - let cb = - ctx - .env - .create_threadsafe_function(&callback, 0, |ctx: ThreadSafeCallContext| { - Ok(ctx.value) - })?; + let cb: ThreadsafeFunction = + callback.build_threadsafe_function().build()?; let mut this: JsObject = ctx.this_unchecked(); let obj = A { cb }; @@ -32,7 +28,7 @@ pub fn call(ctx: CallContext) -> napi::Result { let this = ctx.this_unchecked(); let obj = ctx.env.unwrap::(&this)?; obj.cb.call( - Ok("ThreadsafeFunction NonBlocking Call".to_owned()), + "ThreadsafeFunction NonBlocking Call".to_owned(), napi::threadsafe_function::ThreadsafeFunctionCallMode::NonBlocking, ); ctx.env.get_undefined() diff --git a/examples/napi/__tests__/__snapshots__/typegen.spec.ts.md b/examples/napi/__tests__/__snapshots__/typegen.spec.ts.md index 3c1c78e4..0bdf54d9 100644 --- a/examples/napi/__tests__/__snapshots__/typegen.spec.ts.md +++ b/examples/napi/__tests__/__snapshots__/typegen.spec.ts.md @@ -281,9 +281,9 @@ Generated by [AVA](https://avajs.dev). ␊ export declare function appendBuffer(buf: Buffer): Buffer␊ ␊ - export declare function apply0(ctx: Animal, callback: (...args: any[]) => any): void␊ + export declare function apply0(ctx: Animal, callback: () => void): void␊ ␊ - export declare function apply1(ctx: Animal, callback: (...args: any[]) => any, name: string): void␊ + export declare function apply1(ctx: Animal, callback: (arg: string) => void, name: string): void␊ ␊ export declare function arrayBufferPassThrough(buf: Uint8Array): Promise␊ ␊ @@ -323,11 +323,11 @@ Generated by [AVA](https://avajs.dev). baz: number␊ }␊ ␊ - export declare function call0(callback: (...args: any[]) => any): number␊ + export declare function call0(callback: () => number): number␊ ␊ - export declare function call1(callback: (...args: any[]) => any, arg: number): number␊ + export declare function call1(callback: (arg: number) => number, arg: number): number␊ ␊ - export declare function call2(callback: (...args: any[]) => any, arg1: number, arg2: number): number␊ + export declare function call2(callback: (arg0: number, arg1: number) => number, arg1: number, arg2: number): number␊ ␊ export declare function callbackReturnPromise(functionInput: () => T | Promise, callback: (err: Error | null, result: T) => void): T | Promise␊ ␊ @@ -444,7 +444,7 @@ Generated by [AVA](https://avajs.dev). ␊ export declare function either4(input: string | number | boolean | Obj): number␊ ␊ - export declare function eitherBoolOrFunction(input: boolean | ((...args: any[]) => any)): void␊ + export declare function eitherBoolOrFunction(input: boolean | (any)): void␊ ␊ export declare function eitherBoolOrTuple(input: boolean | [boolean, string]): void␊ ␊ diff --git a/examples/napi/__tests__/__snapshots__/typegen.spec.ts.snap b/examples/napi/__tests__/__snapshots__/typegen.spec.ts.snap index 8aa60709f3b47e9ed7906fb459078fe280eba6f8..970ad9ea7e8a07bcfa651abd26dd2010aef6e962 100644 GIT binary patch literal 5056 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 Ws^{`|j~_Km;{O05;NOJ?T>t=S&+7F6 literal 5066 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 any): void +export declare function apply0(ctx: Animal, callback: () => void): void -export declare function apply1(ctx: Animal, callback: (...args: any[]) => any, name: string): void +export declare function apply1(ctx: Animal, callback: (arg: string) => void, name: string): void export declare function arrayBufferPassThrough(buf: Uint8Array): Promise @@ -313,11 +313,11 @@ export interface C { baz: number } -export declare function call0(callback: (...args: any[]) => any): number +export declare function call0(callback: () => number): number -export declare function call1(callback: (...args: any[]) => any, arg: number): number +export declare function call1(callback: (arg: number) => number, arg: number): number -export declare function call2(callback: (...args: any[]) => any, arg1: number, arg2: number): number +export declare function call2(callback: (arg0: number, arg1: number) => number, arg1: number, arg2: number): number export declare function callbackReturnPromise(functionInput: () => T | Promise, callback: (err: Error | null, result: T) => void): T | Promise @@ -434,7 +434,7 @@ export declare function either3(input: string | number | boolean): number export declare function either4(input: string | number | boolean | Obj): number -export declare function eitherBoolOrFunction(input: boolean | ((...args: any[]) => any)): void +export declare function eitherBoolOrFunction(input: boolean | (any)): void export declare function eitherBoolOrTuple(input: boolean | [boolean, string]): void diff --git a/examples/napi/src/callback.rs b/examples/napi/src/callback.rs index 02b53329..5aef2ff0 100644 --- a/examples/napi/src/callback.rs +++ b/examples/napi/src/callback.rs @@ -1,10 +1,6 @@ use std::{env, format}; -use napi::{ - bindgen_prelude::*, - threadsafe_function::{ThreadsafeCallContext, ThreadsafeFunction, ThreadsafeFunctionCallMode}, - JsUnknown, -}; +use napi::{bindgen_prelude::*, threadsafe_function::ThreadsafeFunctionCallMode, JsUnknown}; #[napi] fn get_cwd Result<()>>(callback: T) { @@ -54,13 +50,15 @@ fn read_file_content() -> Result { fn callback_return_promise Result>( env: Env, fn_in: T, - fn_out: JsFunction, + fn_out: Function, ) -> Result { let ret = fn_in()?; if ret.is_promise()? { let p = Promise::::from_unknown(ret)?; - let fn_out_tsfn: ThreadsafeFunction = - fn_out.create_threadsafe_function(|ctx: ThreadsafeCallContext| Ok(ctx.value))?; + let fn_out_tsfn = fn_out + .build_threadsafe_function() + .callee_handled::() + .build()?; env .execute_tokio_future( async move { diff --git a/examples/napi/src/either.rs b/examples/napi/src/either.rs index 4f8902c1..c1b6805a 100644 --- a/examples/napi/src/either.rs +++ b/examples/napi/src/either.rs @@ -131,7 +131,7 @@ pub fn either_from_objects(input: Either3) -> String { } #[napi] -pub fn either_bool_or_function(_input: Either) {} +pub fn either_bool_or_function(_input: Either) {} #[napi] pub async fn promise_in_either(input: Either>) -> Result { diff --git a/examples/napi/src/fn_strict.rs b/examples/napi/src/fn_strict.rs index f007174e..39cbf938 100644 --- a/examples/napi/src/fn_strict.rs +++ b/examples/napi/src/fn_strict.rs @@ -59,13 +59,8 @@ fn validate_external(e: &External) -> u32 { } #[napi(strict, ts_args_type = "cb: () => number")] -fn validate_function(cb: JsFunction) -> Result { - Ok( - cb.call::(None, &[])? - .coerce_to_number()? - .get_uint32()? - + 3, - ) +fn validate_function(cb: Function<(), JsUnknown>) -> Result { + Ok(cb.call(())?.coerce_to_number()?.get_uint32()? + 3) } #[napi(strict)] diff --git a/examples/napi/src/fn_ts_override.rs b/examples/napi/src/fn_ts_override.rs index 9cc2ad6b..a080f049 100644 --- a/examples/napi/src/fn_ts_override.rs +++ b/examples/napi/src/fn_ts_override.rs @@ -1,5 +1,4 @@ -use napi::bindgen_prelude::{Object, Result}; -use napi::JsFunction; +use napi::bindgen_prelude::{Function, Object, Result}; #[napi(ts_args_type = "a: { foo: number }", ts_return_type = "string[]")] fn ts_rename(a: Object) -> Result { @@ -9,20 +8,12 @@ fn ts_rename(a: Object) -> Result { #[napi] fn override_individual_arg_on_function( not_overridden: String, - #[napi(ts_arg_type = "() => string")] f: JsFunction, + #[napi(ts_arg_type = "() => string")] f: Function<(), String>, not_overridden2: u32, ) -> String { - let u = f.call_without_args(None).unwrap(); - let s = u - .coerce_to_string() - .unwrap() - .into_utf8() - .unwrap() - .as_str() - .unwrap() - .to_string(); + let u = f.call(()).unwrap(); - format!("oia: {}-{}-{}", not_overridden, not_overridden2, s) + format!("oia: {}-{}-{}", not_overridden, not_overridden2, u) } #[napi] diff --git a/examples/napi/src/function.rs b/examples/napi/src/function.rs index a6ffb6fd..31721e27 100644 --- a/examples/napi/src/function.rs +++ b/examples/napi/src/function.rs @@ -3,34 +3,38 @@ use napi::{ bindgen_prelude::{ClassInstance, Function, FunctionRef}, threadsafe_function::ThreadsafeFunctionCallMode, - Env, Error, JsFunction, JsObject, Result, Status, + Env, Error, JsObject, Result, Status, }; use crate::class::Animal; #[napi] -pub fn call0(callback: JsFunction) -> Result { - callback.call0() +pub fn call0(callback: Function<(), u32>) -> Result { + callback.call(()) } #[napi] -pub fn call1(callback: JsFunction, arg: u32) -> Result { - callback.call1(arg) +pub fn call1(callback: Function, arg: u32) -> Result { + callback.call(arg) } #[napi] -pub fn call2(callback: JsFunction, arg1: u32, arg2: u32) -> Result { - callback.call2(arg1, arg2) +pub fn call2(callback: Function<(u32, u32), u32>, arg1: u32, arg2: u32) -> Result { + callback.call((arg1, arg2)) } #[napi] -pub fn apply0(ctx: ClassInstance, callback: JsFunction) -> Result<()> { - callback.apply0(ctx) +pub fn apply0(ctx: ClassInstance, callback: Function<(), ()>) -> Result<()> { + callback.apply(ctx, ()) } #[napi] -pub fn apply1(ctx: ClassInstance, callback: JsFunction, name: String) -> Result<()> { - callback.apply1(ctx, name) +pub fn apply1( + ctx: ClassInstance, + callback: Function, + name: String, +) -> Result<()> { + callback.apply(ctx, name) } #[napi]