pub struct DigLink(/* private fields */);Expand description
A live websocket link to one peer, framing every message as a DigMessage.
Cheap to clone: every clone shares one connection, one request map and one rate-limit budget.
Implementations§
Source§impl DigLink
impl DigLink
Sourcepub fn from_websocket(
ws: WebSocketStream<MaybeTlsStream<TcpStream>>,
options: LinkOptions,
) -> Result<(Self, Receiver<DigMessage>), LinkError>
pub fn from_websocket( ws: WebSocketStream<MaybeTlsStream<TcpStream>>, options: LinkOptions, ) -> Result<(Self, Receiver<DigMessage>), LinkError>
Adopt an already-established client-side websocket.
The peer address is recovered from the underlying stream. The connection is expected to be TLS-secured, so that a peer id can be derived from the certificate.
Sourcepub fn from_server_websocket<S>(
ws: WebSocketStream<S>,
socket_addr: SocketAddr,
options: LinkOptions,
) -> (Self, Receiver<DigMessage>)
pub fn from_server_websocket<S>( ws: WebSocketStream<S>, socket_addr: SocketAddr, options: LinkOptions, ) -> (Self, Receiver<DigMessage>)
Adopt an already-established server-side websocket.
An inbound acceptor already knows socket_addr and holds a server-side TLS stream that
cannot inhabit MaybeTlsStream, hence the separate constructor generic over the
transport.
The caller must derive the peer id from the client certificate before calling this: the certificate is no longer reachable once the stream has been split.
Sourcepub fn socket_addr(&self) -> SocketAddr
pub fn socket_addr(&self) -> SocketAddr
The address of the peer on the other end.
Sourcepub async fn send<T>(&self, body: T) -> Result<(), LinkError>where
T: Streamable + ChiaProtocolMessage,
pub async fn send<T>(&self, body: T) -> Result<(), LinkError>where
T: Streamable + ChiaProtocolMessage,
Send a Chia-typed body with no correlation id and no expected reply.
Sourcepub async fn send_dig(&self, opcode: u8, data: Bytes) -> Result<(), LinkError>
pub async fn send_dig(&self, opcode: u8, data: Bytes) -> Result<(), LinkError>
Send a DIG-band body with no correlation id and no expected reply.
The payload is opaque to the link: framing an opcode says nothing about what its body means, which is precisely what lets the free band (220+) carry protocols this crate does not know about.
Sourcepub async fn send_message(&self, message: DigMessage) -> Result<(), LinkError>
pub async fn send_message(&self, message: DigMessage) -> Result<(), LinkError>
Send a fully-formed message, preserving its id.
This is how an inbound request is answered: the reply must carry the requester’s id,
which neither Self::send nor Self::send_dig can express.
Rate-limit refusals are handled by kind, never by blanket retry: an over-budget message
waits for the next window (up to LinkOptions::send_timeout), while a message that no
window could ever admit fails immediately. Retrying the latter is an infinite loop with
no error, which is how a caller silently disappears.
Sourcepub async fn request_raw<T>(&self, body: T) -> Result<DigMessage, LinkError>where
T: Streamable + ChiaProtocolMessage,
pub async fn request_raw<T>(&self, body: T) -> Result<DigMessage, LinkError>where
T: Streamable + ChiaProtocolMessage,
Send a Chia-typed body and await the correlated reply, unparsed.
Sourcepub async fn request_dig(
&self,
opcode: u8,
data: Bytes,
) -> Result<DigMessage, LinkError>
pub async fn request_dig( &self, opcode: u8, data: Bytes, ) -> Result<DigMessage, LinkError>
Send a DIG-band body and await the correlated reply, unparsed.
Sourcepub async fn request_infallible<T, B>(&self, body: B) -> Result<T, LinkError>
pub async fn request_infallible<T, B>(&self, body: B) -> Result<T, LinkError>
Send a Chia-typed body and await a reply of exactly one expected type.
Sourcepub async fn request_fallible<T, E, B>(
&self,
body: B,
) -> Result<Result<T, E>, LinkError>where
T: Streamable + ChiaProtocolMessage,
E: Streamable + ChiaProtocolMessage,
B: Streamable + ChiaProtocolMessage,
pub async fn request_fallible<T, E, B>(
&self,
body: B,
) -> Result<Result<T, E>, LinkError>where
T: Streamable + ChiaProtocolMessage,
E: Streamable + ChiaProtocolMessage,
B: Streamable + ChiaProtocolMessage,
Send a Chia-typed body and await either the expected reply or its rejection.
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for DigLink
impl !UnwindSafe for DigLink
impl Freeze for DigLink
impl Send for DigLink
impl Sync for DigLink
impl Unpin for DigLink
impl UnsafeUnpin for DigLink
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.