//! Utility functions for exchanging messages with many peers. use crate::Provider; use commonware_cryptography::PublicKey; use commonware_utils::{ channel::{ fallible::FallibleExt, mpsc::{self, UnboundedReceiver, UnboundedSender}, }, ordered::Set, }; pub mod codec; pub mod limited; pub mod mux; /// A [Provider] over a static set of peers. #[derive(Debug, Clone)] pub struct StaticProvider { id: u64, peers: Set

, #[allow(clippy::type_complexity)] senders: Vec, Set

)>>, } impl StaticProvider

{ /// Create a new [StaticProvider] with the given ID and peers. pub const fn new(id: u64, peers: Set

) -> Self { Self { id, peers, senders: vec![], } } } impl Provider for StaticProvider

{ type PublicKey = P; async fn peer_set(&mut self, id: u64) -> Option> { assert_eq!(id, self.id); Some(self.peers.clone()) } async fn subscribe(&mut self) -> UnboundedReceiver<(u64, Set

, Set

)> { let (sender, receiver) = mpsc::unbounded_channel(); sender.send_lossy((self.id, self.peers.clone(), self.peers.clone())); self.senders.push(sender); // prevent the receiver from closing receiver } }