diff --git a/Cargo.lock b/Cargo.lock index 3b6987d36c..1123c4a10a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10635,7 +10635,7 @@ dependencies = [ "subxt-metadata", "syn 2.0.77", "thiserror", - "tokio", + "url", ] [[package]] @@ -10699,6 +10699,7 @@ name = "subxt-macro" version = "0.37.0" dependencies = [ "darling 0.20.10", + "futures", "parity-scale-codec", "polkadot-sdk", "proc-macro-error2", diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index ba94a826fc..475938c524 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -13,8 +13,9 @@ description = "Generate an API for interacting with a substrate node from FRAME [features] default = [] -fetch-metadata = ["dep:jsonrpsee", "dep:tokio", "dep:frame-metadata"] -web = ["jsonrpsee?/async-wasm-client", "jsonrpsee?/client-web-transport", "getrandom/js"] +fetch-metadata = ["dep:jsonrpsee", "dep:frame-metadata", "dep:url"] +# NOTE: This is just hack that only enables `getrandom/js` and doesn't do anything else. +web = ["getrandom/js"] [dependencies] codec = { package = "parity-scale-codec", workspace = true, features = ["derive"] } @@ -25,11 +26,11 @@ quote = { workspace = true } syn = { workspace = true } scale-info = { workspace = true } subxt-metadata = { workspace = true } -jsonrpsee = { workspace = true, features = ["async-client", "client-ws-transport-tls", "http-client"], optional = true } +jsonrpsee = { workspace = true, features = ["ws-client", "http-client"], optional = true } hex = { workspace = true, features = ["std"] } -tokio = { workspace = true, features = ["rt-multi-thread"], optional = true } thiserror = { workspace = true } scale-typegen = { workspace = true } +url = { workspace = true, optional = true } # Included if "web" feature is enabled, to enable its js feature. getrandom = { workspace = true, optional = true } diff --git a/codegen/src/fetch_metadata.rs b/codegen/src/fetch_metadata.rs index ee7c554013..2317d3f1fe 100644 --- a/codegen/src/fetch_metadata.rs +++ b/codegen/src/fetch_metadata.rs @@ -7,15 +7,11 @@ use crate::error::FetchMetadataError; use codec::{Decode, Encode}; use jsonrpsee::{ - async_client::ClientBuilder, - client_transport::ws::WsTransportClientBuilder, - core::client::{ClientT, Error}, - http_client::HttpClientBuilder, - rpc_params, + core::client::ClientT, http_client::HttpClientBuilder, rpc_params, ws_client::WsClientBuilder, }; use std::time::Duration; -pub use jsonrpsee::client_transport::ws::Url; +pub use url::Url; /// The metadata version that is fetched from the node. #[derive(Default, Debug, Clone, Copy)] @@ -60,23 +56,6 @@ pub fn fetch_metadata_from_file_blocking( Ok(bytes) } -/// Returns the metadata bytes from the provided URL, blocking the current thread. -pub fn fetch_metadata_from_url_blocking( - url: Url, - version: MetadataVersion, -) -> Result, FetchMetadataError> { - tokio_block_on(fetch_metadata_from_url(url, version)) -} - -// Block on some tokio runtime for sync contexts -fn tokio_block_on>(fut: Fut) -> T { - tokio::runtime::Builder::new_multi_thread() - .enable_all() - .build() - .unwrap() - .block_on(fut) -} - /// Returns the metadata bytes from the provided URL. pub async fn fetch_metadata_from_url( url: Url, @@ -95,15 +74,11 @@ async fn fetch_metadata_ws( url: Url, version: MetadataVersion, ) -> Result, FetchMetadataError> { - let (sender, receiver) = WsTransportClientBuilder::default() - .build(url) - .await - .map_err(|e| Error::Transport(e.into()))?; - - let client = ClientBuilder::default() + let client = WsClientBuilder::new() .request_timeout(Duration::from_secs(180)) .max_buffer_capacity_per_subscription(4096) - .build_with_tokio(sender, receiver); + .build(url) + .await?; fetch_metadata(client, version).await } diff --git a/macro/Cargo.toml b/macro/Cargo.toml index 2902b680ce..659b791414 100644 --- a/macro/Cargo.toml +++ b/macro/Cargo.toml @@ -29,6 +29,7 @@ quote = { workspace = true } subxt-codegen = { workspace = true, features = ["fetch-metadata"] } scale-typegen = { workspace = true } polkadot-sdk = { workspace = true, optional = true, features = ["sp-io", "sc-executor-common", "sp-state-machine", "sp-maybe-compressed-blob", "sc-executor"] } +futures = { workspace = true, features = ["executor"] } [lints] workspace = true \ No newline at end of file diff --git a/macro/src/lib.rs b/macro/src/lib.rs index fd224b268e..c772d69ddb 100644 --- a/macro/src/lib.rs +++ b/macro/src/lib.rs @@ -17,7 +17,7 @@ use scale_typegen::typegen::{ }; use subxt_codegen::{ fetch_metadata::{ - fetch_metadata_from_file_blocking, fetch_metadata_from_url_blocking, MetadataVersion, Url, + fetch_metadata_from_file_blocking, fetch_metadata_from_url, MetadataVersion, Url, }, CodegenBuilder, CodegenError, Metadata, }; @@ -256,10 +256,13 @@ fn fetch_metadata(args: &RuntimeMetadataArgs) -> Result MetadataVersion::Latest, }; - fetch_metadata_from_url_blocking(url, version) - .map_err(CodegenError::from) - .and_then(|b| subxt_codegen::Metadata::decode(&mut &*b).map_err(Into::into)) - .map_err(|e| e.into_compile_error())? + futures::executor::block_on(async { + fetch_metadata_from_url(url, version) + .await + .map_err(CodegenError::from) + .and_then(|b| subxt_codegen::Metadata::decode(&mut &*b).map_err(Into::into)) + .map_err(|e| e.into_compile_error()) + })? } #[cfg(feature = "runtime-path")] (None, None) => {