pub struct PeerRegistry<N: NetworkProvider + 'static> { /* private fields */ }Expand description
Manages peer state and WebSocket connections.
The PeerRegistry is the heart of Layer 5. It:
- Tracks peers from Layer 3 discovery events — peers exist in the registry even with zero transport connections.
- Manages lazy connections — the first
send()to a peer triggers a WebSocket connection via Layer 4. Subsequent sends reuse the cached connection. - Routes messages — incoming messages from any peer are forwarded to subscribers via a broadcast channel.
- Emits lifecycle events —
PeerEvents for peer discovery changes and connection state changes.
§Example
use std::sync::Arc;
use truffle_core::session::PeerRegistry;
let registry = PeerRegistry::new(network, ws_transport);
registry.start().await;
// Peers appear from Layer 3 discovery
let peers = registry.peers().await;
// First send lazily connects
registry.send("peer-id", b"hello").await?;Implementations§
Source§impl<N: NetworkProvider + 'static> PeerRegistry<N>
impl<N: NetworkProvider + 'static> PeerRegistry<N>
Sourcepub fn new(network: Arc<N>, ws_transport: Arc<WebSocketTransport<N>>) -> Self
pub fn new(network: Arc<N>, ws_transport: Arc<WebSocketTransport<N>>) -> Self
Create a new peer registry.
network: The Layer 3 network provider for peer discovery.ws_transport: The Layer 4 WebSocket transport for connections.
Call start() after creation to begin processing
peer events and accepting incoming connections.
Sourcepub async fn start(&self)
pub async fn start(&self)
Start the peer registry.
This spawns two background tasks:
- A task that subscribes to Layer 3 peer events and maintains the peer list (Joined/Left/Updated).
- A task that listens for incoming WebSocket connections from peers and spawns connection tasks for each.
Call this once after constructing the registry.
Sourcepub async fn peers(&self) -> Vec<PeerState>
pub async fn peers(&self) -> Vec<PeerState>
Return all known peers.
This returns peers discovered by Layer 3, including those with
no active transport connections (ws_connected: false).
Sourcepub fn on_peer_change(&self) -> Receiver<PeerEvent>
pub fn on_peer_change(&self) -> Receiver<PeerEvent>
Subscribe to peer change events.
Returns a broadcast receiver that yields PeerEvents for peer
discovery changes (Joined/Left/Updated) and connection lifecycle
changes (Connected/Disconnected).
Sourcepub async fn send(&self, peer_id: &str, data: &[u8]) -> Result<(), SessionError>
pub async fn send(&self, peer_id: &str, data: &[u8]) -> Result<(), SessionError>
Send data to a specific peer.
If no WebSocket connection exists to the peer, one is lazily established via Layer 4. The connection is cached for subsequent sends. If the peer is unknown or offline, an error is returned.
§Errors
SessionError::UnknownPeerif the peer is not in the registrySessionError::PeerOfflineif Layer 3 reports the peer as offlineSessionError::ConnectFailedif the WS connection cannot be establishedSessionError::SendFailedif the send operation fails
Sourcepub async fn broadcast(&self, data: &[u8])
pub async fn broadcast(&self, data: &[u8])
Broadcast data to all peers with active WebSocket connections.
Sends to all currently connected peers. Peers with no active connection are skipped (no lazy connect on broadcast). Errors from individual sends are logged but do not fail the broadcast.
Sourcepub fn subscribe(&self) -> Receiver<IncomingMessage>
pub fn subscribe(&self) -> Receiver<IncomingMessage>
Subscribe to incoming messages from any connected peer.
Returns a broadcast receiver that yields IncomingMessages.
Messages include the sender’s peer ID and raw bytes — Layer 5
does not interpret the payload.
Sourcepub async fn disconnect(&self, peer_id: &str)
pub async fn disconnect(&self, peer_id: &str)
Disconnect a specific peer’s WebSocket connection.
Removes the cached connection and marks the peer as disconnected.
Does not remove the peer from the registry (that only happens when
Layer 3 emits a Left event).
Auto Trait Implementations§
impl<N> Freeze for PeerRegistry<N>
impl<N> !RefUnwindSafe for PeerRegistry<N>
impl<N> Send for PeerRegistry<N>
impl<N> Sync for PeerRegistry<N>
impl<N> Unpin for PeerRegistry<N>
impl<N> UnsafeUnpin for PeerRegistry<N>
impl<N> !UnwindSafe for PeerRegistry<N>
Blanket Implementations§
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> 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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);