hotmint_consensus/
network.rs1use hotmint_types::{ConsensusMessage, ValidatorId};
2
3pub trait NetworkSink: Send + Sync {
4 fn broadcast(&self, msg: ConsensusMessage);
5 fn send_to(&self, target: ValidatorId, msg: ConsensusMessage);
6}
7
8pub struct ChannelNetwork {
10 pub self_id: ValidatorId,
11 pub senders: Vec<(
12 ValidatorId,
13 tokio::sync::mpsc::UnboundedSender<(ValidatorId, ConsensusMessage)>,
14 )>,
15}
16
17impl ChannelNetwork {
18 pub fn new(
19 self_id: ValidatorId,
20 senders: Vec<(
21 ValidatorId,
22 tokio::sync::mpsc::UnboundedSender<(ValidatorId, ConsensusMessage)>,
23 )>,
24 ) -> Self {
25 Self { self_id, senders }
26 }
27}
28
29impl NetworkSink for ChannelNetwork {
30 fn broadcast(&self, msg: ConsensusMessage) {
31 for (id, sender) in &self.senders {
32 if *id != self.self_id {
33 let _ = sender.send((self.self_id, msg.clone()));
34 }
35 }
36 }
37
38 fn send_to(&self, target: ValidatorId, msg: ConsensusMessage) {
39 for (id, sender) in &self.senders {
40 if *id == target {
41 let _ = sender.send((self.self_id, msg));
42 return;
43 }
44 }
45 }
46}