From ea6f3cc58b43cbd568c981aa131e0e119684a7df Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 29 Feb 2024 15:51:04 +0200 Subject: [PATCH] subxt: Use unstable backend for light client Signed-off-by: Alexandru Vasile --- subxt/Cargo.toml | 3 ++- subxt/src/client/light_client/mod.rs | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/subxt/Cargo.toml b/subxt/Cargo.toml index 4a18bb2b41..f06bd9dd63 100644 --- a/subxt/Cargo.toml +++ b/subxt/Cargo.toml @@ -61,7 +61,7 @@ unstable-metadata = [] # Activate this to expose the Light Client functionality. # Note that this feature is experimental and things may break or not work as expected. -unstable-light-client = ["subxt-lightclient", "tokio-stream"] +unstable-light-client = ["subxt-lightclient", "tokio-stream", "tokio"] [dependencies] async-trait = { workspace = true } @@ -117,6 +117,7 @@ getrandom = { workspace = true, optional = true } # Included if "native" feature is enabled tokio-util = { workspace = true, features = ["compat"], optional = true } +tokio = { workspace = true, features = ["macros", "time", "rt-multi-thread"], optional = true } [dev-dependencies] bitvec = { workspace = true } diff --git a/subxt/src/client/light_client/mod.rs b/subxt/src/client/light_client/mod.rs index a4b116652e..6881e6ac76 100644 --- a/subxt/src/client/light_client/mod.rs +++ b/subxt/src/client/light_client/mod.rs @@ -93,7 +93,29 @@ impl RawLightClient { ) -> Result, crate::Error> { let raw_rpc = self.raw_rpc.for_chain(chain_id); let rpc_client = RpcClient::new(raw_rpc.clone()); - let client = OnlineClient::::from_rpc_client(rpc_client).await?; + + use crate::backend::unstable::UnstableBackend; + use std::sync::Arc; + let (backend, mut driver) = UnstableBackend::builder().build(rpc_client); + let future = async move { + use futures::StreamExt; + while let Some(val) = driver.next().await { + if let Err(e) = val { + // This is a test; bail if something does wrong and try to + // ensure that the message makes it to some logs. + eprintln!("Error driving unstable backend in tests (will panic): {e}"); + panic!("Error driving unstable backend in tests: {e}"); + } + } + }; + // The unstable backend needs driving: + #[cfg(feature = "native")] + tokio::spawn(future); + #[cfg(feature = "web")] + wasm_bindgen_futures::spawn_local(future); + let client = OnlineClient::from_backend(Arc::new(backend)) + .await + .map_err(|e| format!("Cannot construct OnlineClient from backend: {e}"))?; Ok(LightClient { client, chain_id }) }