diff --git a/crates/napi/Cargo.toml b/crates/napi/Cargo.toml index cfe6f58b..ee381ebc 100644 --- a/crates/napi/Cargo.toml +++ b/crates/napi/Cargo.toml @@ -31,7 +31,19 @@ napi6 = ["napi5", "napi-sys/napi6"] napi7 = ["napi6", "napi-sys/napi7"] napi8 = ["napi7", "napi-sys/napi8"] serde-json = ["serde", "serde_json"] +tokio_fs = ["tokio/fs"] +tokio_full = ["tokio/full"] +tokio_io_std = ["tokio/io-std"] +tokio_io_util = ["tokio/io-util"] +tokio_macros = ["tokio/macros"] +tokio_net = ["tokio/net"] +tokio_process = ["tokio/process"] tokio_rt = ["tokio", "napi4"] +tokio_signal = ["tokio/signal"] +tokio_stats = ["tokio/stats"] +tokio_sync = ["tokio/sync"] +tokio_test_util = ["tokio/test-util"] +tokio_time = ["tokio/time"] [dependencies] ctor = "0.1" @@ -56,4 +68,4 @@ optional = true version = "1" [target.'cfg(windows)'.dependencies] -windows = {version = "0.29", features = ["Win32_System_WindowsProgramming", "Win32_System_LibraryLoader", "Win32_Foundation"]} +windows = {version = "0.30", features = ["Win32_System_WindowsProgramming", "Win32_System_LibraryLoader", "Win32_Foundation"]} diff --git a/crates/napi/src/bindgen_runtime/module_register.rs b/crates/napi/src/bindgen_runtime/module_register.rs index 195f2b7a..0723a7f9 100644 --- a/crates/napi/src/bindgen_runtime/module_register.rs +++ b/crates/napi/src/bindgen_runtime/module_register.rs @@ -161,6 +161,23 @@ pub fn register_class( } #[inline] +/// Get `JsFunction` from defined Rust `fn` +/// ```rust +/// #[napi] +/// fn some_fn() -> u32 { +/// 1 +/// } +/// +/// #[napi] +/// fn return_some_fn() -> Result { +/// get_js_function(some_fn_js_function) +/// } +/// ``` +/// +/// ```js +/// returnSomeFn()(); // 1 +/// ``` +/// pub fn get_js_function(raw_fn: ExportRegisterCallback) -> Result { FN_REGISTER_MAP .borrow_mut() diff --git a/crates/napi/src/lib.rs b/crates/napi/src/lib.rs index df45d69f..69b30e99 100644 --- a/crates/napi/src/lib.rs +++ b/crates/napi/src/lib.rs @@ -23,12 +23,10 @@ //! use napi::{CallContext, Error, JsObject, JsString, Result, Status}; //! use tokio; //! -//! #[js_function(1)] -//! pub fn tokio_readfile(ctx: CallContext) -> Result { -//! let js_filepath = ctx.get::(0)?; -//! let path_str = js_filepath.as_str()?; +//! #[napi] +//! pub async fn tokio_readfile(js_filepath: String) -> Result { //! ctx.env.execute_tokio_future( -//! tokio::fs::read(path_str.to_owned()) +//! tokio::fs::read(js_filepath) //! .map(|v| v.map_err(|e| Error::new(Status::Unknown, format!("failed to read file, {}", e)))), //! |&mut env, data| env.create_buffer_with_data(data), //! ) @@ -61,17 +59,16 @@ //! c: String, //! } //! -//! #[js_function(1)] -//! fn deserialize_from_js(ctx: CallContext) -> Result { -//! let arg0 = ctx.get::(0)?; +//! #[napi] +//! fn deserialize_from_js(arg0: JsUnknown) -> Result { //! let de_serialized: AnObject = ctx.env.from_js_value(arg0)?; //! ... //! } //! -//! #[js_function] -//! fn serialize(ctx: CallContext) -> Result { +//! #[napi] +//! fn serialize(env: Env) -> Result { //! let value = AnyObject { a: 1, b: vec![0.1, 2.22], c: "hello" }; -//! ctx.env.to_js_value(&value) +//! env.to_js_value(&value) //! } //! ``` //! @@ -201,3 +198,6 @@ pub mod bindgen_prelude { type_of, JsError, Property, PropertyAttributes, Result, Status, Task, ValueType, }; } + +#[cfg(feature = "tokio_rt")] +pub extern crate tokio; diff --git a/examples/napi/Cargo.toml b/examples/napi/Cargo.toml index 2fc11d9f..9ccaf160 100644 --- a/examples/napi/Cargo.toml +++ b/examples/napi/Cargo.toml @@ -10,12 +10,11 @@ crate-type = ["cdylib"] [dependencies] futures = "0.3" -napi = {path = "../../crates/napi", default-features = false, features = ["napi8", "tokio_rt", "serde-json", "async", "experimental", "latin1"]} +napi = {path = "../../crates/napi", default-features = false, features = ["tokio_fs", "napi8", "tokio_rt", "serde-json", "async", "experimental", "latin1"]} napi-derive = {path = "../../crates/macro", features = ["type-def"]} serde = "1" serde_derive = "1" serde_json = "1" -tokio = {version = "1", features = ["default", "fs"]} [build-dependencies] napi-build = {path = "../../crates/build"} diff --git a/examples/napi/src/async.rs b/examples/napi/src/async.rs index 76ea50bd..5220ecfc 100644 --- a/examples/napi/src/async.rs +++ b/examples/napi/src/async.rs @@ -1,6 +1,6 @@ use futures::prelude::*; use napi::bindgen_prelude::*; -use tokio::fs; +use napi::tokio::{self, fs}; #[napi] async fn read_file_async(path: String) -> Result {