add simple reconnecting rpc client

This commit is contained in:
Niklas Adolfsson
2024-03-21 15:57:56 +01:00
parent 9810406db2
commit 476afd9526
6 changed files with 383 additions and 109 deletions
+15 -20
View File
@@ -6,9 +6,10 @@
#![allow(missing_docs)]
use std::sync::Arc;
use std::time::Duration;
use subxt::backend::rpc::reconnecting_rpc_client::{Client, ExponentialBackoff, PingConfig};
use subxt::backend::rpc::reconnecting_rpc_client::{CallRetryPolicy, Client, RetryPolicy};
use subxt::backend::rpc::RpcClient;
use subxt::error::{Error, RpcError};
use subxt::{OnlineClient, PolkadotConfig};
@@ -22,25 +23,19 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
// Create a new client with with a reconnecting RPC client.
let rpc = Client::builder()
// Reconnect with exponential backoff
//
// This API is "iterator-like" so one could limit it to only
// reconnect x times and then quit.
.retry_policy(ExponentialBackoff::from_millis(100).max_delay(Duration::from_secs(10)))
// Send period WebSocket pings/pongs every 6th second and if it's not ACK:ed in 30 seconds
// then disconnect.
//
// This is just a way to ensure that the connection isn't idle if no message is sent that often
.enable_ws_ping(
PingConfig::new()
.ping_interval(Duration::from_secs(6))
.inactive_limit(Duration::from_secs(30)),
)
// There are other configurations as well that can be found here:
// <https://docs.rs/reconnecting-jsonrpsee-ws-client/latest/reconnecting_jsonrpsee_ws_client/struct.ClientBuilder.html>
.build("ws://localhost:9944".to_string())
.await?;
let rpc = Arc::new(
Client::builder()
// Reconnect with exponential backoff
.retry_policy_for_reconnect(
RetryPolicy::exponential(Duration::from_millis(100))
.with_max_delay(Duration::from_secs(10))
.with_max_retries(usize::MAX),
)
// Just an example how to override the default retry policy for individual RPC calls.
.retry_policy_for_method("foo", CallRetryPolicy::Retry)
.build("ws://localhost:9944".to_string())
.await?,
);
let api: OnlineClient<PolkadotConfig> =
OnlineClient::from_rpc_client(RpcClient::new(rpc.clone())).await?;