Struct tendermint_rpc::WebSocketClient 
source · [−]pub struct WebSocketClient { /* private fields */ }Expand description
Tendermint RPC client that provides access to all RPC functionality
(including Event subscription) over a WebSocket connection.
The WebSocketClient itself is effectively just a handle to its driver
The driver is the component of the client that actually interacts with the
remote RPC over the WebSocket connection. The WebSocketClient can
therefore be cloned into different asynchronous contexts, effectively
allowing for asynchronous access to the driver.
It is the caller’s responsibility to spawn an asynchronous task in which to
execute the WebSocketClientDriver::run method. See the example below.
Dropping Subscriptions will automatically terminate them (the
WebSocketClientDriver detects a disconnected channel and removes the
subscription from its internal routing table). When all subscriptions to a
particular query have disconnected, the driver will automatically issue an
unsubscribe request to the remote RPC endpoint.
Timeouts
The WebSocket client connection times out after 30 seconds if it does not receive anything at all from the server. This will automatically return errors to all active subscriptions and terminate them.
This is not configurable at present.
Keep-Alive
The WebSocket client implements a keep-alive mechanism whereby it sends a PING message to the server every 27 seconds, matching the PING cadence of the Tendermint server (see this code for details).
This is not configurable at present.
Examples
use tendermint::abci::Transaction;
use tendermint_rpc::{WebSocketClient, SubscriptionClient, Client};
use tendermint_rpc::query::EventType;
use futures::StreamExt;
#[tokio::main]
async fn main() {
    let (client, driver) = WebSocketClient::new("ws://127.0.0.1:26657/websocket")
        .await
        .unwrap();
    let driver_handle = tokio::spawn(async move { driver.run().await });
    // Standard client functionality
    let tx = format!("some-key=some-value");
    client.broadcast_tx_async(Transaction::from(tx.into_bytes())).await.unwrap();
    // Subscription functionality
    let mut subs = client.subscribe(EventType::NewBlock.into())
        .await
        .unwrap();
    // Grab 5 NewBlock events
    let mut ev_count = 5_i32;
    while let Some(res) = subs.next().await {
        let ev = res.unwrap();
        println!("Got event: {:?}", ev);
        ev_count -= 1;
        if ev_count < 0 {
            break;
        }
    }
    // Signal to the driver to terminate.
    client.close().unwrap();
    // Await the driver's termination to ensure proper connection closure.
    let _ = driver_handle.await.unwrap();
}Implementations
sourceimpl WebSocketClient
 
impl WebSocketClient
sourcepub async fn new<U>(url: U) -> Result<(Self, WebSocketClientDriver), Error> where
    U: TryInto<WebSocketClientUrl, Error = Error>, 
 
pub async fn new<U>(url: U) -> Result<(Self, WebSocketClientDriver), Error> where
    U: TryInto<WebSocketClientUrl, Error = Error>, 
Construct a new WebSocket-based client connecting to the given Tendermint node’s RPC endpoint.
Supports both ws:// and wss:// protocols.
sourcepub async fn new_with_config<U>(
    url: U, 
    config: Option<WebSocketConfig>
) -> Result<(Self, WebSocketClientDriver), Error> where
    U: TryInto<WebSocketClientUrl, Error = Error>, 
 
pub async fn new_with_config<U>(
    url: U, 
    config: Option<WebSocketConfig>
) -> Result<(Self, WebSocketClientDriver), Error> where
    U: TryInto<WebSocketClientUrl, Error = Error>, 
Construct a new WebSocket-based client connecting to the given Tendermint node’s RPC endpoint.
Supports both ws:// and wss:// protocols.
Trait Implementations
sourceimpl Client for WebSocketClient
 
impl Client for WebSocketClient
sourcefn perform<'life0, 'async_trait, R>(
    &'life0 self, 
    request: R
) -> Pin<Box<dyn Future<Output = Result<<R as Request>::Response, Error>> + Send + 'async_trait>> where
    R: SimpleRequest,
    R: 'async_trait,
    'life0: 'async_trait,
    Self: 'async_trait, 
 
fn perform<'life0, 'async_trait, R>(
    &'life0 self, 
    request: R
) -> Pin<Box<dyn Future<Output = Result<<R as Request>::Response, Error>> + Send + 'async_trait>> where
    R: SimpleRequest,
    R: 'async_trait,
    'life0: 'async_trait,
    Self: 'async_trait, 
Perform a request against the RPC endpoint
sourcefn abci_info<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<AbciInfo, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn abci_info<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<AbciInfo, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/abci_info: get information about the ABCI application.
sourcefn abci_query<'life0, 'async_trait, V>(
    &'life0 self, 
    path: Option<Path>, 
    data: V, 
    height: Option<Height>, 
    prove: bool
) -> Pin<Box<dyn Future<Output = Result<AbciQuery, Error>> + Send + 'async_trait>> where
    V: Into<Vec<u8>> + Send,
    V: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn abci_query<'life0, 'async_trait, V>(
    &'life0 self, 
    path: Option<Path>, 
    data: V, 
    height: Option<Height>, 
    prove: bool
) -> Pin<Box<dyn Future<Output = Result<AbciQuery, Error>> + Send + 'async_trait>> where
    V: Into<Vec<u8>> + Send,
    V: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/abci_query: query the ABCI application
sourcefn block<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn block<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/block: get block at a given height.
sourcefn latest_block<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn latest_block<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/block: get the latest block.
sourcefn block_results<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn block_results<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/block_results: get ABCI results for a block at a particular height.
sourcefn latest_block_results<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn latest_block_results<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/block_results: get ABCI results for the latest block.
sourcefn block_search<'life0, 'async_trait>(
    &'life0 self, 
    query: Query, 
    page: u32, 
    per_page: u8, 
    order: Order
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn block_search<'life0, 'async_trait>(
    &'life0 self, 
    query: Query, 
    page: u32, 
    per_page: u8, 
    order: Order
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/block_search: search for blocks by BeginBlock and EndBlock events.
sourcefn blockchain<'life0, 'async_trait, H>(
    &'life0 self, 
    min: H, 
    max: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn blockchain<'life0, 'async_trait, H>(
    &'life0 self, 
    min: H, 
    max: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/blockchain: get block headers for min <= height <= max. Read more
sourcefn broadcast_tx_async<'life0, 'async_trait>(
    &'life0 self, 
    tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn broadcast_tx_async<'life0, 'async_trait>(
    &'life0 self, 
    tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/broadcast_tx_async: broadcast a transaction, returning immediately.
sourcefn broadcast_tx_sync<'life0, 'async_trait>(
    &'life0 self, 
    tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn broadcast_tx_sync<'life0, 'async_trait>(
    &'life0 self, 
    tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/broadcast_tx_sync: broadcast a transaction, returning the response
from CheckTx. Read more
sourcefn broadcast_tx_commit<'life0, 'async_trait>(
    &'life0 self, 
    tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn broadcast_tx_commit<'life0, 'async_trait>(
    &'life0 self, 
    tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/broadcast_tx_commit: broadcast a transaction, returning the response
from DeliverTx. Read more
sourcefn commit<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn commit<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/commit: get block commit at a given height.
sourcefn consensus_params<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn consensus_params<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/consensus_params: get current consensus parameters at the specified
height. Read more
sourcefn consensus_state<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn consensus_state<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/consensus_state: get current consensus state
sourcefn validators<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H, 
    paging: Paging
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn validators<'life0, 'async_trait, H>(
    &'life0 self, 
    height: H, 
    paging: Paging
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    H: Into<Height> + Send,
    H: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/validators: get validators a given height.
sourcefn latest_consensus_params<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn latest_consensus_params<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/consensus_params: get the latest consensus parameters.
sourcefn latest_commit<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn latest_commit<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/commit: get the latest block commit
sourcefn health<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn health<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/health: get node health. Read more
sourcefn genesis<'life0, 'async_trait, AppState>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Genesis<AppState>, Error>> + Send + 'async_trait>> where
    AppState: Debug + Serialize + DeserializeOwned + Send,
    AppState: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn genesis<'life0, 'async_trait, AppState>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Genesis<AppState>, Error>> + Send + 'async_trait>> where
    AppState: Debug + Serialize + DeserializeOwned + Send,
    AppState: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/genesis: get genesis file.
sourcefn net_info<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn net_info<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/net_info: obtain information about P2P and other network connections.
sourcefn status<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn status<'life0, 'async_trait>(
    &'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/status: get Tendermint status including node info, pubkey, latest
block hash, app hash, block height and time. Read more
sourcefn broadcast_evidence<'life0, 'async_trait>(
    &'life0 self, 
    e: Evidence
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn broadcast_evidence<'life0, 'async_trait>(
    &'life0 self, 
    e: Evidence
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/broadcast_evidence: broadcast an evidence.
sourcefn tx<'life0, 'async_trait>(
    &'life0 self, 
    hash: Hash, 
    prove: bool
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn tx<'life0, 'async_trait>(
    &'life0 self, 
    hash: Hash, 
    prove: bool
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/tx: find transaction by hash.
sourcefn tx_search<'life0, 'async_trait>(
    &'life0 self, 
    query: Query, 
    prove: bool, 
    page: u32, 
    per_page: u8, 
    order: Order
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn tx_search<'life0, 'async_trait>(
    &'life0 self, 
    query: Query, 
    prove: bool, 
    page: u32, 
    per_page: u8, 
    order: Order
) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
/tx_search: search for transactions with their results.
sourcefn wait_until_healthy<'life0, 'async_trait, T>(
    &'life0 self, 
    timeout: T
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>> where
    T: Into<Duration> + Send,
    T: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
 
fn wait_until_healthy<'life0, 'async_trait, T>(
    &'life0 self, 
    timeout: T
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>> where
    T: Into<Duration> + Send,
    T: 'async_trait,
    'life0: 'async_trait,
    Self: Sync + 'async_trait, 
Poll the /health endpoint until it returns a successful result or
the given timeout has elapsed. Read more
sourceimpl Clone for WebSocketClient
 
impl Clone for WebSocketClient
sourcefn clone(&self) -> WebSocketClient
 
fn clone(&self) -> WebSocketClient
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
 
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read more
sourceimpl Debug for WebSocketClient
 
impl Debug for WebSocketClient
sourceimpl SubscriptionClient for WebSocketClient
 
impl SubscriptionClient for WebSocketClient
sourcefn subscribe<'life0, 'async_trait>(
    &'life0 self, 
    query: Query
) -> Pin<Box<dyn Future<Output = Result<Subscription, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: 'async_trait, 
 
fn subscribe<'life0, 'async_trait>(
    &'life0 self, 
    query: Query
) -> Pin<Box<dyn Future<Output = Result<Subscription, Error>> + Send + 'async_trait>> where
    'life0: 'async_trait,
    Self: 'async_trait, 
/subscribe: subscribe to receive events produced by the given query.
Auto Trait Implementations
impl !RefUnwindSafe for WebSocketClient
impl Send for WebSocketClient
impl Sync for WebSocketClient
impl Unpin for WebSocketClient
impl !UnwindSafe for WebSocketClient
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
    T: ?Sized, 
 
impl<T> BorrowMut<T> for T where
    T: ?Sized, 
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
 
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> Instrument for T
 
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> Instrumented<Self>
sourceimpl<T> ToOwned for T where
    T: Clone, 
 
impl<T> ToOwned for T where
    T: Clone, 
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
 
fn clone_into(&self, target: &mut T)
toowned_clone_into)Uses borrowed data to replace owned data, usually by cloning. Read more
impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 
impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 
fn vzip(self) -> V
sourceimpl<T> WithSubscriber for T
 
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
    S: Into<Dispatch>, 
 
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
    S: Into<Dispatch>, 
Attaches the provided Subscriber to this type, returning a
WithDispatch wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
 
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber to this type, returning a
WithDispatch wrapper. Read more