use bytes::Bytes;
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) {
trace!(
"Could not broadcast ClientEvent as we don't have any active listeners: {err:?}"
);
}
}
}
#[derive(Clone, custom_debug::Debug, Serialize)]
pub enum ClientEvent {
PeerAdded { max_peers_to_connect: usize },
ConnectedToNetwork,
InactiveClient(std::time::Duration),
GossipsubMsg {
topic: String,
#[debug(skip)]
msg: Bytes,
},
}
#[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
}
}