use serde::Serialize;
use tokio::sync::broadcast::{self, error::RecvError};
#[derive(Clone, Debug)]
pub struct ClientEventsBroadcaster(broadcast::Sender<ClientEvent>);
impl Default for ClientEventsBroadcaster {
fn default() -> Self {
Self(broadcast::channel(100).0)
}
}
impl ClientEventsBroadcaster {
pub fn subscribe(&self) -> ClientEventsReceiver {
ClientEventsReceiver(self.0.subscribe())
}
pub(crate) fn broadcast(&self, event: ClientEvent) {
if let Err(err) = self.0.send(event) {
if self.0.receiver_count() == 0 {
return;
}
trace!("Could not broadcast ClientEvent, though we do have listeners: {err:?}");
}
}
}
#[derive(Clone, custom_debug::Debug, Serialize)]
pub enum ClientEvent {
PeerAdded { max_peers_to_connect: usize },
PeerWithUnsupportedProtocol {
our_protocol: String,
their_protocol: String,
},
ConnectedToNetwork,
InactiveClient(tokio::time::Duration),
}
#[derive(Debug)]
pub struct ClientEventsReceiver(pub(super) broadcast::Receiver<ClientEvent>);
impl ClientEventsReceiver {
pub async fn recv(&mut self) -> std::result::Result<ClientEvent, RecvError> {
self.0.recv().await
}
}