From 9b68c0a1b25166674282febfd244e224326be921 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Fri, 11 Oct 2024 16:14:38 +0200 Subject: [PATCH] fetch-metadata: remove tokio --- Cargo.lock | 2 +- codegen/Cargo.toml | 5 ++--- codegen/src/fetch_metadata.rs | 33 ++++----------------------------- macro/Cargo.toml | 1 + macro/src/lib.rs | 13 ++++++++----- 5 files changed, 16 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3b6987d36c..cdc27bf4b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10635,7 +10635,6 @@ dependencies = [ "subxt-metadata", "syn 2.0.77", "thiserror", - "tokio", ] [[package]] @@ -10699,6 +10698,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..4485b2d3b2 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -13,7 +13,7 @@ description = "Generate an API for interacting with a substrate node from FRAME [features] default = [] -fetch-metadata = ["dep:jsonrpsee", "dep:tokio", "dep:frame-metadata"] +fetch-metadata = ["dep:jsonrpsee", "dep:frame-metadata"] web = ["jsonrpsee?/async-wasm-client", "jsonrpsee?/client-web-transport", "getrandom/js"] [dependencies] @@ -25,9 +25,8 @@ 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 } diff --git a/codegen/src/fetch_metadata.rs b/codegen/src/fetch_metadata.rs index ee7c554013..3276170a60 100644 --- a/codegen/src/fetch_metadata.rs +++ b/codegen/src/fetch_metadata.rs @@ -7,11 +7,7 @@ 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; @@ -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) => {