Struct 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§

Source§

impl WebSocketClient

Source

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.

Source

pub async fn new_with_config<U>( url: U, config: 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.

Source

pub fn builder(url: WebSocketClientUrl) -> Builder

Initiate a builder for a WebSocket-based client connecting to the given Tendermint node’s RPC endpoint.

Supports both ws:// and wss:// protocols.

Trait Implementations§

Source§

impl Client for WebSocketClient

Source§

fn perform<'life0, 'async_trait, R>( &'life0 self, request: R, ) -> Pin<Box<dyn Future<Output = Result<R::Output, Error>> + Send + 'async_trait>>
where R: SimpleRequest + 'async_trait, Self: 'async_trait, 'life0: 'async_trait,

Perform a request against the RPC endpoint. Read more
Source§

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 + 'async_trait, Self: 'async_trait, 'life0: 'async_trait,

/block: get block at a given height.
Source§

fn block_by_hash<'life0, 'async_trait>( &'life0 self, hash: Hash, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

/block_by_hash: get block by hash.
Source§

fn latest_block<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

/block: get the latest block.
Source§

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 + 'async_trait, Self: 'async_trait, 'life0: 'async_trait,

/block_results: get ABCI results for a block at a particular height.
Source§

fn latest_block_results<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

/block_results: get ABCI results for the latest block.
/block_search: search for blocks by BeginBlock and EndBlock events.
Source§

fn header<'life0, 'async_trait, H>( &'life0 self, height: H, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where H: Into<Height> + Send + 'async_trait, Self: 'async_trait, 'life0: 'async_trait,

/header: get block header at a given height.
Source§

fn header_by_hash<'life0, 'async_trait>( &'life0 self, hash: Hash, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

/header_by_hash: get block by hash.
Source§

fn tx<'life0, 'async_trait>( &'life0 self, hash: Hash, prove: bool, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

/tx: find transaction by hash.
/tx_search: search for transactions with their results.
Source§

fn broadcast_tx_commit<'life0, 'async_trait, T>( &'life0 self, tx: T, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where T: Into<Vec<u8>> + Send + 'async_trait, Self: 'async_trait, 'life0: 'async_trait,

/broadcast_tx_commit: broadcast a transaction, returning the response from DeliverTx.
Source§

fn abci_info<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Info, Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/abci_info: get information about the ABCI application.
Source§

fn abci_query<'life0, 'async_trait, V>( &'life0 self, path: Option<String>, data: V, height: Option<Height>, prove: bool, ) -> Pin<Box<dyn Future<Output = Result<AbciQuery, Error>> + Send + 'async_trait>>
where V: Into<Vec<u8>> + Send + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

/abci_query: query the ABCI application
Source§

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 + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

/blockchain: get block headers for min <= height <= max. Read more
Source§

fn broadcast_tx_async<'life0, 'async_trait, T>( &'life0 self, tx: T, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where T: Into<Vec<u8>> + Send + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

/broadcast_tx_async: broadcast a transaction, returning immediately.
Source§

fn broadcast_tx_sync<'life0, 'async_trait, T>( &'life0 self, tx: T, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where T: Into<Vec<u8>> + Send + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

/broadcast_tx_sync: broadcast a transaction, returning the response from CheckTx.
Source§

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 + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

/commit: get block commit at a given height.
Source§

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 + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

/consensus_params: get current consensus parameters at the specified height.
Source§

fn consensus_state<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/consensus_state: get current consensus state
Source§

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 + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

/validators: get validators a given height.
Source§

fn latest_consensus_params<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/consensus_params: get the latest consensus parameters.
Source§

fn latest_commit<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/commit: get the latest block commit
Source§

fn health<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/health: get node health. Read more
Source§

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 + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

/genesis: get genesis file.
Source§

fn genesis_chunked<'life0, 'async_trait>( &'life0 self, chunk: u64, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

Source§

fn genesis_chunked_stream<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Pin<Box<dyn Stream<Item = Result<Vec<u8>, Error>> + '_>>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/genesis_chunked: get genesis file in multiple chunks.
Source§

fn net_info<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/net_info: obtain information about P2P and other network connections.
Source§

fn status<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/status: get Tendermint status including node info, pubkey, latest block hash, app hash, block height and time.
Source§

fn broadcast_evidence<'life0, 'async_trait>( &'life0 self, e: Evidence, ) -> Pin<Box<dyn Future<Output = Result<Response, Error>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait,

/broadcast_evidence: broadcast an evidence.
Source§

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 + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait,

Poll the /health endpoint until it returns a successful result or the given timeout has elapsed.
Source§

impl Clone for WebSocketClient

Source§

fn clone(&self) -> WebSocketClient

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for WebSocketClient

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl SubscriptionClient for WebSocketClient

Source§

fn subscribe<'life0, 'async_trait>( &'life0 self, query: Query, ) -> Pin<Box<dyn Future<Output = Result<Subscription, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

/subscribe: subscribe to receive events produced by the given query.
Source§

fn unsubscribe<'life0, 'async_trait>( &'life0 self, query: Query, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

/unsubscribe: unsubscribe from events relating to the given query. Read more
Source§

fn close(self) -> Result<(), Error>

Subscription clients will usually have long-running underlying transports that will need to be closed at some point.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T