PeerConnection

Struct PeerConnection 

Source
pub struct PeerConnection<T: Transport> { /* private fields */ }
Expand description

Relationship with one remote peer, bound to a transport context.

Generic over T: Transport — works with LocalNode (unicast) or BoundChannel (blind unicast) identically.

Implementations§

Source§

impl<T: Transport> PeerConnection<T>

Source

pub fn peer(&self) -> &PublicKey

The remote peer’s public key.

Source

pub async fn send( &self, payload: &[u8], options: &SendOptions, ) -> Result<SendProgressTicket, T::Error>

Send a raw payload to this peer (delegates to transport.send()).

Source§

impl<M, T> PeerConnection<T>
where M: MacBackend, T: Transport<Error = NodeError<M>> + NodeAccess<Backend = M>,

Everything a peer relationship needs from the node behind its transport.

Implemented once for both carriages: a peer reached through a channel gets the same pings, subscriptions, and identity requests as one reached by plain unicast, and each frame goes out over the transport it was built on.

Source

pub fn on_receive<F>(&self, handler: F) -> Subscription
where F: FnMut(&ReceivedPacketRef<'_>) -> bool + 'static,

Source

pub fn on_ack_received<F>(&self, handler: F) -> Subscription
where F: FnMut(SendToken) + 'static,

Source

pub fn on_ack_timeout<F>(&self, handler: F) -> Subscription
where F: FnMut(SendToken) + 'static,

Source

pub fn on_pfs_established<F>(&self, handler: F) -> Subscription
where F: FnMut() + 'static,

Source

pub fn on_pfs_ended<F>(&self, handler: F) -> Subscription
where F: FnMut() + 'static,

Source

pub fn on_pong<F>(&self, handler: F) -> Subscription
where F: FnMut(u64) + 'static,

Source

pub fn on_ping_timeout<F>(&self, handler: F) -> Subscription
where F: FnMut() + 'static,

Source

pub async fn ping( &self, extra_bytes: usize, options: &SendOptions, timeout_ms: u64, ) -> Result<SendProgressTicket, NodeError<M>>

Send an echo request and record it as pending until the matching echo response arrives or timeout_ms elapses.

options is honoured as given, so a ping travels the same way the traffic it is measuring would: same MIC size, same encryption, same routing and region options. Only ack_requested is overridden — the echo response is the acknowledgement, so asking for a MAC ack as well would put a second frame on the air for nothing.

extra_bytes pads the payload beyond the 2-byte nonce. Padding matters for the same reason the MIC size does: packet error rate rises with frame length, so a minimal ping reports a link as usable when a full-size message would not get through. See PING_MIC_SIZE for the MIC size callers should normally ask for.

The padding is bounded by what one frame can carry, not by this call: a ping too large to build fails with the MAC’s own send error rather than being quietly shortened into a measurement of a smaller frame.

Source

pub async fn request_identity( &self, options: &SendOptions, ) -> Result<SendProgressTicket, NodeError<M>>

Solicit this peer’s current identity by sending a targeted MAC Identity Request (command 1). Because the request is a unicast to a specific peer, no filter options are needed — filters exist only to narrow a broadcast solicitation. A random NONCE is included so the peer echoes it in its identity response, matching the responder’s correlation contract.

The response arrives asynchronously as a PayloadType::NodeIdentity frame on the normal receive path, not as the return value here.

Source

pub async fn request_peer_repeaters( &self, nonce: u16, cursor: Option<&[u8]>, options: &SendOptions, ) -> Result<SendProgressTicket, NodeError<M>>

Ask this peer for one page of its known peer repeaters (command 10).

nonce is echoed in the response, which is what tells one page’s answer from a stale copy of an earlier one. cursor resumes an enumeration from where a previous response said to; pass None for the first page, and expect a Total on the answer to that one.

The response arrives asynchronously as a MAC command on the normal receive path, not as the return value here.

Source

pub async fn route(&self) -> Option<CachedRoute>

The route the MAC has cached for this peer, if any.

Source

pub async fn clear_route(&self) -> bool

Forget this peer’s cached route, returning whether one was held.

Source

pub async fn restore_route(&self, route: CachedRoute) -> bool

Install a route learned before this MAC existed, returning whether it could be installed.

Source§

impl<M: MacBackend> PeerConnection<LocalNode<M>>

Forward secrecy is negotiated between two nodes, not inside a channel: the session it establishes replaces the pairwise keys a unicast is sealed with. These stay on the plain-unicast transport.

Source

pub async fn request_pfs( &self, duration_minutes: u16, options: &SendOptions, ) -> Result<SendProgressTicket, NodeError<M>>

Source

pub async fn end_pfs(&self, options: &SendOptions) -> Result<(), NodeError<M>>

Source

pub async fn pfs_status(&self) -> Result<PfsStatus, NodeError<M>>

Trait Implementations§

Source§

impl<T: Clone + Transport> Clone for PeerConnection<T>

Source§

fn clone(&self) -> PeerConnection<T>

Returns a duplicate of the value. Read more
1.0.0§

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

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl<T> Freeze for PeerConnection<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for PeerConnection<T>
where T: RefUnwindSafe,

§

impl<T> Send for PeerConnection<T>
where T: Send,

§

impl<T> Sync for PeerConnection<T>
where T: Sync,

§

impl<T> Unpin for PeerConnection<T>
where T: Unpin,

§

impl<T> UnwindSafe for PeerConnection<T>
where T: UnwindSafe,

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

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

§

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
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

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
§

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

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

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

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

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

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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

Performs the conversion.