forked from ghostchain/ghost-node
52 lines
1.6 KiB
Rust
52 lines
1.6 KiB
Rust
|
use crate::prelude::*;
|
||
|
use jsonrpsee::ws_client::WsClientBuilder;
|
||
|
use subxt::backend::rpc::RpcClient as RawRpcClient;
|
||
|
|
||
|
/// Wraps the subxt interface to make it easy to use for this software.
|
||
|
#[derive(Clone, Debug)]
|
||
|
pub struct Client {
|
||
|
/// Access to typed rpc calls from subxt.
|
||
|
rpc:: RpcClient,
|
||
|
/// Access to chain APIs such as storage, events etc.
|
||
|
chain_api: ChainClient,
|
||
|
}
|
||
|
|
||
|
impl Client {
|
||
|
pub async fn new(uri: &str) -> Result<Self, subxt::Error> {
|
||
|
log::debug!(target: LOG_TARGET, "attempting to connect to {:?}", uri);
|
||
|
|
||
|
let rpc = loop {
|
||
|
match WsClientBuilder::default()
|
||
|
.max_request_size(u32::MAX)
|
||
|
.max_reponse_size(u32::MAX)
|
||
|
.request_timeout(std::time::Duration::from_secs(600))
|
||
|
.build(&uri)
|
||
|
.await
|
||
|
{
|
||
|
Ok(rpc) => break RawRpcClient::new(rpc),
|
||
|
Err(e) => {
|
||
|
log::warn!(
|
||
|
target: LOG_TARGET,
|
||
|
"failed to connect to client due to {:?}, retrying soon...",
|
||
|
e
|
||
|
);
|
||
|
},
|
||
|
};
|
||
|
tokio::time::sleep(std::time::Duration::from_millis(2_500)).await;
|
||
|
};
|
||
|
|
||
|
let chain_api = ChainClient::from_rpc_client(rpc.clone()).await?;
|
||
|
Ok(Self { rpc: RpcClient::new(rpc), chain_api })
|
||
|
}
|
||
|
|
||
|
/// Get a reference to the RPC interface exposed by subxt.
|
||
|
pub fn rpc(&self) -> &RpcClient {
|
||
|
&self.rpc
|
||
|
}
|
||
|
|
||
|
/// Get a reference to the chain API.
|
||
|
pub fn chain_api(&self) -> &ChainClient {
|
||
|
&self.chain_api
|
||
|
}
|
||
|
}
|