channel.rs

Overview

This file defines two primary network message sender abstractions for a peer-to-peer communication system: NetDirectSender and NetBroadcastSender. These abstractions handle the serialization, delivery, and metrics reporting of messages sent either directly to specific peers or broadcast to multiple recipients. The file also includes error handling for message sending failures and utilities for encoding outgoing messages.

The functionality provided is critical for implementing reliable and efficient message delivery within a distributed network, ensuring that messages are correctly serialized, metrics are tracked, and delivery errors are managed gracefully.


Types and Structures

NetDirectSender<PeerId, Message>

A generic struct designed for sending messages directly to specified peers identified by PeerId. It manages an unbounded Tokio channel sender that queues outgoing messages for delivery.


NetBroadcastSender

A generic struct for broadcasting messages to multiple recipients via a Tokio broadcast channel.


NetSendError

An enum representing possible errors encountered when sending messages.


Functions

encode_outgoing<Message>(message: Message) -> Result<(Message, NetMessage, usize), NetSendError<Message>>


Methods

NetDirectSender::new(...) -> Self


NetDirectSender::send(&self, args: (DirectReceiver<PeerId>, Message)) -> Result<(), NetSendError<Message>>


NetBroadcastSender::new(...) -> Self


NetBroadcastSender::send(&self, message: Message) -> Result<usize, NetSendError<Message>>


Interactions with Other Components

This file is thus a key part of the message dispatching subsystem, interfacing between message producers and the network transport layer, while integrating detailed metrics and error handling.


Mermaid Class Diagram

classDiagram
class NetDirectSender {
-inner: UnboundedSender<(DirectReceiver, NetMessage, Instant)>
-metrics: Option<NetMetrics>
-self_peer_id: PeerId
-self_addr: SocketAddr
-_message_type: PhantomData<Message>
+new(inner, metrics, self_peer_id, self_addr)
+send((DirectReceiver, Message)) Result<(), NetSendError>
}
class NetBroadcastSender {
-inner: broadcast::Sender<OutgoingMessage>
-metrics: Option<NetMetrics>
-_message_type: PhantomData<Message>
+new(inner, metrics)
+send(Message) Result<usize, NetSendError>
}
class NetSendError {
<<enumeration>>
+Disconnected(Message)
+EncodeFailed(Message, Error)
+message() String
}
NetDirectSender ..> DirectReceiver : uses
NetDirectSender ..> NetMessage : uses
NetDirectSender ..> NetMetrics : uses
NetBroadcastSender ..> OutgoingMessage : uses
NetBroadcastSender ..> NetMetrics : uses
NetSendError o-- Message : generic over