Struct tendermint_rpc::WebSocketClient [−][src]
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 Subscription
s 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
impl WebSocketClient
[src]
pub async fn new<U>(url: U) -> Result<(Self, WebSocketClientDriver)> where
U: TryInto<WebSocketClientUrl, Error = Error>,
[src]
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
impl Client for WebSocketClient
[src]
fn perform<'life0, 'async_trait, R>(
&'life0 self,
request: R
) -> Pin<Box<dyn Future<Output = Result<<R as Request>::Response>> + Send + 'async_trait>> where
R: SimpleRequest,
R: 'async_trait,
'life0: 'async_trait,
Self: 'async_trait,
[src]
&'life0 self,
request: R
) -> Pin<Box<dyn Future<Output = Result<<R as Request>::Response>> + Send + 'async_trait>> where
R: SimpleRequest,
R: 'async_trait,
'life0: 'async_trait,
Self: 'async_trait,
#[must_use]fn abci_info<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<AbciInfo>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<AbciInfo>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]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>> + Send + 'async_trait>> where
V: Into<Vec<u8>> + Send,
V: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
path: Option<Path>,
data: V,
height: Option<Height>,
prove: bool
) -> Pin<Box<dyn Future<Output = Result<AbciQuery>> + Send + 'async_trait>> where
V: Into<Vec<u8>> + Send,
V: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn block<'life0, 'async_trait, H>(
&'life0 self,
height: H
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
height: H
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn latest_block<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn block_results<'life0, 'async_trait, H>(
&'life0 self,
height: H
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
height: H
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn latest_block_results<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn blockchain<'life0, 'async_trait, H>(
&'life0 self,
min: H,
max: H
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
min: H,
max: H
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn broadcast_tx_async<'life0, 'async_trait>(
&'life0 self,
tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn broadcast_tx_sync<'life0, 'async_trait>(
&'life0 self,
tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn broadcast_tx_commit<'life0, 'async_trait>(
&'life0 self,
tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
tx: Transaction
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn commit<'life0, 'async_trait, H>(
&'life0 self,
height: H
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
height: H
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn consensus_state<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn validators<'life0, 'async_trait, H>(
&'life0 self,
height: H,
paging: Paging
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
height: H,
paging: Paging
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
H: Into<Height> + Send,
H: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn latest_commit<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn health<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn genesis<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Genesis>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Genesis>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn net_info<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn status<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn broadcast_evidence<'life0, 'async_trait>(
&'life0 self,
e: Evidence
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
e: Evidence
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]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>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
query: Query,
prove: bool,
page: u32,
per_page: u8,
order: Order
) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: Sync + 'async_trait,
#[must_use]fn wait_until_healthy<'life0, 'async_trait, T>(
&'life0 self,
timeout: T
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where
T: Into<Duration> + Send,
T: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
[src]
&'life0 self,
timeout: T
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where
T: Into<Duration> + Send,
T: 'async_trait,
'life0: 'async_trait,
Self: Sync + 'async_trait,
impl Clone for WebSocketClient
[src]
fn clone(&self) -> WebSocketClient
[src]
pub fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl Debug for WebSocketClient
[src]
impl SubscriptionClient for WebSocketClient
[src]
fn subscribe<'life0, 'async_trait>(
&'life0 self,
query: Query
) -> Pin<Box<dyn Future<Output = Result<Subscription>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: 'async_trait,
[src]
&'life0 self,
query: Query
) -> Pin<Box<dyn Future<Output = Result<Subscription>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: 'async_trait,
fn unsubscribe<'life0, 'async_trait>(
&'life0 self,
query: Query
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: 'async_trait,
[src]
&'life0 self,
query: Query
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where
'life0: 'async_trait,
Self: 'async_trait,
fn close(self) -> Result<()>
[src]
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
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Conv for T
impl<T> FmtForward for T
pub fn fmt_binary(self) -> FmtBinary<Self> where
Self: Binary,
Self: Binary,
pub fn fmt_display(self) -> FmtDisplay<Self> where
Self: Display,
Self: Display,
pub fn fmt_lower_exp(self) -> FmtLowerExp<Self> where
Self: LowerExp,
Self: LowerExp,
pub fn fmt_lower_hex(self) -> FmtLowerHex<Self> where
Self: LowerHex,
Self: LowerHex,
pub fn fmt_octal(self) -> FmtOctal<Self> where
Self: Octal,
Self: Octal,
pub fn fmt_pointer(self) -> FmtPointer<Self> where
Self: Pointer,
Self: Pointer,
pub fn fmt_upper_exp(self) -> FmtUpperExp<Self> where
Self: UpperExp,
Self: UpperExp,
pub fn fmt_upper_hex(self) -> FmtUpperHex<Self> where
Self: UpperHex,
Self: UpperHex,
impl<T> From<T> for T
[src]
impl<T> Instrument for T
[src]
pub fn instrument(self, span: Span) -> Instrumented<Self>
[src]
pub fn in_current_span(self) -> Instrumented<Self>
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Pipe for T
impl<T> PipeAsRef for T
pub fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: AsRef<T>,
T: 'a,
R: 'a,
Self: AsRef<T>,
T: 'a,
R: 'a,
pub fn pipe_as_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
Self: AsMut<T>,
T: 'a,
R: 'a,
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
Self: AsMut<T>,
T: 'a,
R: 'a,
impl<T> PipeBorrow for T
pub fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Borrow<T>,
T: 'a,
R: 'a,
Self: Borrow<T>,
T: 'a,
R: 'a,
pub fn pipe_borrow_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
Self: BorrowMut<T>,
T: 'a,
R: 'a,
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
Self: BorrowMut<T>,
T: 'a,
R: 'a,
impl<T> PipeDeref for T
pub fn pipe_deref<'a, R>(
&'a self,
func: impl FnOnce(&'a Self::Target) -> R
) -> R where
Self: Deref,
R: 'a,
&'a self,
func: impl FnOnce(&'a Self::Target) -> R
) -> R where
Self: Deref,
R: 'a,
pub fn pipe_deref_mut<'a, R>(
&'a mut self,
func: impl FnOnce(&'a mut Self::Target) -> R
) -> R where
Self: DerefMut,
R: 'a,
&'a mut self,
func: impl FnOnce(&'a mut Self::Target) -> R
) -> R where
Self: DerefMut,
R: 'a,
impl<T> PipeRef for T
pub fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R where
R: 'a,
R: 'a,
pub fn pipe_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R where
R: 'a,
R: 'a,
impl<T> Same<T> for T
type Output = T
Should always be Self
impl<T> Tap for T
pub fn tap<F, R>(self, func: F) -> Self where
F: FnOnce(&Self) -> R,
F: FnOnce(&Self) -> R,
pub fn tap_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&Self) -> R,
F: FnOnce(&Self) -> R,
pub fn tap_mut<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self) -> R,
F: FnOnce(&mut Self) -> R,
pub fn tap_mut_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self) -> R,
F: FnOnce(&mut Self) -> R,
impl<T, U> TapAsRef<U> for T where
U: ?Sized,
U: ?Sized,
pub fn tap_ref<F, R>(self, func: F) -> Self where
Self: AsRef<T>,
F: FnOnce(&T) -> R,
Self: AsRef<T>,
F: FnOnce(&T) -> R,
pub fn tap_ref_dbg<F, R>(self, func: F) -> Self where
Self: AsRef<T>,
F: FnOnce(&T) -> R,
Self: AsRef<T>,
F: FnOnce(&T) -> R,
pub fn tap_ref_mut<F, R>(self, func: F) -> Self where
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
pub fn tap_ref_mut_dbg<F, R>(self, func: F) -> Self where
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
impl<T, U> TapBorrow<U> for T where
U: ?Sized,
U: ?Sized,
pub fn tap_borrow<F, R>(self, func: F) -> Self where
Self: Borrow<T>,
F: FnOnce(&T) -> R,
Self: Borrow<T>,
F: FnOnce(&T) -> R,
pub fn tap_borrow_dbg<F, R>(self, func: F) -> Self where
Self: Borrow<T>,
F: FnOnce(&T) -> R,
Self: Borrow<T>,
F: FnOnce(&T) -> R,
pub fn tap_borrow_mut<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
pub fn tap_borrow_mut_dbg<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
impl<T> TapDeref for T
pub fn tap_deref<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
Self: Deref,
F: FnOnce(&Self::Target) -> R,
pub fn tap_deref_dbg<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
Self: Deref,
F: FnOnce(&Self::Target) -> R,
pub fn tap_deref_mut<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
pub fn tap_deref_mut_dbg<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T> TryConv for T
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,