diff --git a/Cargo.lock b/Cargo.lock index c4d608fdc..5ad7e1b04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -596,7 +596,7 @@ dependencies = [ "clang-sys", "itertools 0.13.0", "log", - "prettyplease 0.2.35", + "prettyplease 0.2.36", "proc-macro2", "quote", "regex", @@ -2322,7 +2322,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -2625,9 +2625,9 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" dependencies = [ "bitflags 2.9.1", "cfg-if", @@ -2798,18 +2798,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] name = "libredox" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0" +checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" dependencies = [ "bitflags 2.9.1", "libc", - "redox_syscall 0.5.14", + "redox_syscall 0.5.17", ] [[package]] @@ -3386,7 +3386,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.14", + "redox_syscall 0.5.17", "smallvec", "windows-targets 0.52.6", ] @@ -3583,9 +3583,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" dependencies = [ "proc-macro2", "syn 2.0.104", @@ -3980,9 +3980,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.14" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3a5d9f0aba1dbcec1cc47f0ff94a4b778fe55bca98a6dfa92e4e094e57b1c4" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.9.1", ] @@ -4306,6 +4306,7 @@ dependencies = [ "rings-core", "rings-node", "rings-rpc", + "rings-types", "serde_json", "tokio", ] @@ -4349,6 +4350,7 @@ dependencies = [ "rings-rpc", "rings-snark", "rings-transport", + "rings-types", "serde", "serde-wasm-bindgen 0.6.5", "serde_json", @@ -4457,6 +4459,18 @@ dependencies = [ "webrtc", ] +[[package]] +name = "rings-types" +version = "0.7.0" +dependencies = [ + "async-trait", + "js-sys", + "rings-rpc", + "serde", + "serde_json", + "wasm-bindgen", +] + [[package]] name = "rkyv" version = "0.7.45" @@ -4553,9 +4567,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -4639,9 +4653,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "069a8df149a16b1a12dcc31497c3396a173844be3cac4bd40c9e7671fef96671" dependencies = [ "log", "once_cell", @@ -5061,6 +5075,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "spin" version = "0.5.2" @@ -5417,9 +5441,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" dependencies = [ "backtrace", "bytes", @@ -5430,9 +5454,9 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5809,7 +5833,7 @@ dependencies = [ "flate2", "log", "once_cell", - "rustls 0.23.29", + "rustls 0.23.30", "rustls-pki-types", "url", "webpki-roots 0.26.11", @@ -6526,7 +6550,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce981f93104a8debb3563bb0cedfe4aa2f351fdf6b53f346ab50009424125c08" dependencies = [ "log", - "socket2", + "socket2 0.5.10", "thiserror", "tokio", "webrtc-util", @@ -6753,7 +6777,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -6789,10 +6813,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", diff --git a/Cargo.toml b/Cargo.toml index 5a9e7fd47..bb75c119b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ rings-node = { path = "crates/node" } rings-rpc = { path = "crates/rpc", default-features = false } rings-snark = { path = "crates/snark", default-features = false } rings-transport = { path = "crates/transport" } +rings-types = { path = "crates/types", default-features = false } serde-wasm-bindgen = "0.6.5" wasm-bindgen = "0.2.100" wasm-bindgen-futures = "0.4.37" diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 5cbd37db7..383473664 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -78,7 +78,7 @@ primeorder = "0.13.2" rand = { version = "0.8.5", features = ["getrandom"] } rand_core = { version = "0.6.3", features = ["getrandom"] } rand_hc = "0.3.1" -rings-transport = { workspace = true } +rings-transport = { workspace = true, optional = true } serde = { version = "1.0.130", features = ["derive"] } serde_json = "1.0.70" sha1 = "0.10.1" @@ -102,7 +102,7 @@ tokio = { version = "1.13.0", features = ["full"], optional = true } # wasm js-sys = { workspace = true, optional = true } -rexie = { version = "0.4.1", optional = true } +rexie = { version = "0.4.2", optional = true } serde-wasm-bindgen = { workspace = true, optional = true } wasm-bindgen = { workspace = true, optional = true } wasm-bindgen-futures = { workspace = true, optional = true } @@ -123,4 +123,4 @@ tracing-wasm = "0.2.1" wasm-bindgen-test = { workspace = true } [target.'cfg(not(target_family="wasm"))'.dev-dependencies] -tokio = { version = "1.13.0", features = ["full"] } +tokio = { version = "1.47", features = ["full"] } diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 97611648b..ed1ae41d8 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -44,6 +44,7 @@ node = [ "rings-rpc/std", "rings-derive/default", "rings-transport/native-webrtc", + "rings-types/default", "wasmer/default", "wasmer-types", "home", @@ -58,6 +59,7 @@ browser = [ "rings-core/wasm", "rings-rpc/wasm", "rings-derive/wasm", + "rings-types/websys", "rings-transport/web-sys-webrtc", "serde-wasm-bindgen", "wasmer/js-default", @@ -88,7 +90,8 @@ rings-core = { workspace = true, optional = true } rings-derive = { workspace = true, optional = true } rings-rpc = { workspace = true, optional = true } rings-snark = { workspace = true, optional = true } -rings-transport = { workspace = true } +rings-transport = { workspace = true, optional = true } +rings-types = { workspace = true, optional = true } serde = { version = "1.0.136", features = ["derive"] } serde_json = "1.0.70" serde_yaml = "0.9.17" diff --git a/crates/node/src/backend/native/service/mod.rs b/crates/node/src/backend/native/service/mod.rs index 59f9c46d1..b458abc81 100644 --- a/crates/node/src/backend/native/service/mod.rs +++ b/crates/node/src/backend/native/service/mod.rs @@ -25,6 +25,7 @@ use dashmap::DashMap; use rings_core::message::MessagePayload; use rings_core::message::MessageVerificationExt; use rings_rpc::method::Method; +use rings_types::AsyncProvider; use serde::Deserialize; use serde::Serialize; diff --git a/crates/node/src/backend/native/service/tcp_proxy.rs b/crates/node/src/backend/native/service/tcp_proxy.rs index a478671d3..dce856f59 100644 --- a/crates/node/src/backend/native/service/tcp_proxy.rs +++ b/crates/node/src/backend/native/service/tcp_proxy.rs @@ -7,6 +7,7 @@ use std::time::Duration; use bytes::Bytes; use rings_core::dht::Did; use rings_rpc::method::Method; +use rings_types::AsyncProvider; use tokio::io::AsyncReadExt; use tokio::io::AsyncWriteExt; use tokio::net::TcpStream; @@ -19,7 +20,6 @@ use crate::backend::types::ServiceMessage; use crate::backend::types::TunnelDefeat; use crate::backend::types::TunnelId; use crate::provider::Provider; - /// Abstract Tcp Tunnel pub struct Tunnel { tid: TunnelId, diff --git a/crates/node/src/backend/snark/mod.rs b/crates/node/src/backend/snark/mod.rs index 58194157d..36e0b79d6 100644 --- a/crates/node/src/backend/snark/mod.rs +++ b/crates/node/src/backend/snark/mod.rs @@ -21,6 +21,7 @@ use rings_snark::snark::ProverKey; use rings_snark::snark::PublicParams; use rings_snark::snark::VerifierKey; use rings_snark::snark::SNARK; +use rings_types::AsyncProvider; use serde::Deserialize; use serde::Serialize; diff --git a/crates/node/src/provider/browser/provider.rs b/crates/node/src/provider/browser/provider.rs index 75a94e898..fed63e860 100644 --- a/crates/node/src/provider/browser/provider.rs +++ b/crates/node/src/provider/browser/provider.rs @@ -19,6 +19,7 @@ use rings_core::utils::js_value; use rings_derive::wasm_export; use rings_rpc::method::Method; use rings_rpc::protos::rings_node::*; +use rings_types::websys::JsProvider; use wasm_bindgen; use wasm_bindgen::prelude::*; use wasm_bindgen_futures; @@ -68,6 +69,45 @@ impl Provider { } } +impl JsProvider for Provider { + /// Request local rpc interface + fn request(&self, method: String, params: JsValue) -> js_sys::Promise { + let ins = self.clone(); + future_to_promise(async move { + let params = + js_value::json_value(params).map_err(|e| JsError::new(e.to_string().as_str()))?; + let ret = ins + .request_internal(method, params) + .await + .map_err(JsError::from)?; + Ok(js_value::serialize(&ret).map_err(JsError::from)?) + }) + } + + /// listen message. + fn listen(&self) -> js_sys::Promise { + let p = self.processor.clone(); + + future_to_promise(async move { + p.listen().await; + Ok(JsValue::null()) + }) + } +} + +#[wasm_export] +impl Provider { + /// Request local rpc interface + pub fn request(&self, method: String, params: JsValue) -> js_sys::Promise { + ::request(self, method, params) + } + + /// listen message. + pub fn listen(&self) -> js_sys::Promise { + ::listen(self) + } +} + #[wasm_export] impl Provider { /// Create new instance of Provider, return Promise @@ -206,34 +246,11 @@ impl Provider { }) } - /// Request local rpc interface - pub fn request(&self, method: String, params: JsValue) -> js_sys::Promise { - let ins = self.clone(); - future_to_promise(async move { - let params = - js_value::json_value(params).map_err(|e| JsError::new(e.to_string().as_str()))?; - let ret = ins - .request_internal(method, params) - .await - .map_err(JsError::from)?; - Ok(js_value::serialize(&ret).map_err(JsError::from)?) - }) - } - - /// listen message. - pub fn listen(&self) -> js_sys::Promise { - let p = self.processor.clone(); - - future_to_promise(async move { - p.listen().await; - Ok(JsValue::null()) - }) - } - /// connect peer with remote jsonrpc server url pub fn connect_peer_via_http(&self, remote_url: String) -> js_sys::Promise { log::debug!("remote_url: {remote_url}"); - self.request( + ::request( + self, "ConnectPeerViaHttp".to_string(), js_value::serialize(&ConnectPeerViaHttpRequest { url: remote_url }).unwrap(), ) diff --git a/crates/node/src/provider/mod.rs b/crates/node/src/provider/mod.rs index 24010bd32..bb93c5940 100644 --- a/crates/node/src/provider/mod.rs +++ b/crates/node/src/provider/mod.rs @@ -10,6 +10,7 @@ use rings_core::session::SessionSkBuilder; use rings_core::storage::MemStorage; use rings_core::swarm::callback::SharedSwarmCallback; use rings_rpc::protos::rings_node_handler::InternalRpcHandler; +use rings_types::AsyncProvider; use crate::backend::types::BackendMessage; use crate::backend::types::MessageHandler; @@ -175,23 +176,24 @@ impl Provider { } } -#[cfg(feature = "node")] -impl Provider { +#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)] +impl AsyncProvider for Provider { /// A request function implementation for native provider - pub async fn request( + async fn request( &self, method: rings_rpc::method::Method, params: T, ) -> Result where - T: serde::Serialize, + T: serde::Serialize + Send, { let params = serde_json::to_value(params)?; self.request_internal(method.to_string(), params).await } /// Listen messages - pub async fn listen(&self) { + async fn listen(&self) { self.processor.listen().await; } } diff --git a/crates/transport/Cargo.toml b/crates/transport/Cargo.toml index b19b4e441..bffb7afab 100644 --- a/crates/transport/Cargo.toml +++ b/crates/transport/Cargo.toml @@ -18,7 +18,7 @@ web-sys-webrtc = ["wasm-bindgen", "js-sys", "web-sys", "wasm-bindgen-futures"] [dependencies] # Dependencies for native-webrtc feature -tokio = { version = "1.32.0", optional = true } +tokio = { version = "1.47.0", optional = true } tokio-util = { version = "0.7.8", optional = true } webrtc = { workspace = true, optional = true } @@ -63,6 +63,9 @@ thiserror = "1.0.47" tracing = "0.1.37" url = { version = "2.4.0", features = ["serde"] } -[dev-dependencies] +[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies] futures = "0.3.28" -tokio = { version = "1.32.0", features = ["full"] } +tokio = { version = "1.47.0", features = ["full"] } + +[target.'cfg(target_arch = "wasm32")'.dev-dependencies] +tokio = { version = "1.47", default-features = false, features = ["rt", "sync", "macros", "test-util"] } diff --git a/crates/types/Cargo.toml b/crates/types/Cargo.toml new file mode 100644 index 000000000..7ca721231 --- /dev/null +++ b/crates/types/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "rings-types" +version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true + +[features] +default = [ + "rings-rpc/std", +] +websys = [ + 'js-sys', + 'wasm-bindgen', + 'rings-rpc/wasm', +] + +[dependencies] +async-trait = { workspace = true } +rings-rpc = { workspace = true, optional = true, default-features = false } +serde = { version = "1.0.136", features = ["derive"] } +serde_json = { version = "1.0.70" } + +# wasm +js-sys = { workspace = true, optional = true } +wasm-bindgen = { workspace = true, features = ["serde-serialize"], optional = true } diff --git a/crates/types/src/lib.rs b/crates/types/src/lib.rs new file mode 100644 index 000000000..d0948908c --- /dev/null +++ b/crates/types/src/lib.rs @@ -0,0 +1,31 @@ +//! Lib for common types + +/// Common trait of async provider +#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)] +pub trait AsyncProvider: Clone { + /// handle message + async fn request( + &self, + method: rings_rpc::method::Method, + params: T, + ) -> Result + where + T: serde::Serialize + Send; + + /// Listen messages + async fn listen(&self); +} + +#[cfg(feature = "websys")] +pub mod websys { + use wasm_bindgen::JsValue; + /// Async provider trait + pub trait JsProvider { + /// Request local interface + fn request(&self, method: String, params: JsValue) -> js_sys::Promise; + + /// Listen messages + fn listen(&self) -> js_sys::Promise; + } +} diff --git a/crates/types/src/main.rs b/crates/types/src/main.rs new file mode 100644 index 000000000..e7a11a969 --- /dev/null +++ b/crates/types/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/examples/native/Cargo.toml b/examples/native/Cargo.toml index a6caf53c4..83d2cec72 100644 --- a/examples/native/Cargo.toml +++ b/examples/native/Cargo.toml @@ -11,5 +11,6 @@ async-trait = { workspace = true } rings-core = { workspace = true } rings-node = { workspace = true } rings-rpc = { workspace = true } +rings-types = { workspace = true } serde_json = "1.0.70" tokio = { version = "1.13.0", features = ["full"] } diff --git a/examples/native/src/main.rs b/examples/native/src/main.rs index 1427c05c0..82e8e65c5 100644 --- a/examples/native/src/main.rs +++ b/examples/native/src/main.rs @@ -16,7 +16,7 @@ use rings_node::processor::ProcessorConfig; use rings_node::provider::Provider; use rings_rpc::method::Method; use rings_rpc::protos::rings_node::*; - +use rings_types::AsyncProvider; struct BackendBehaviour; #[async_trait]