use anyhow::Result;
use faststr::FastStr;
use libipld::Cid;
use std::{fmt, sync::Arc};
use tokio::sync::broadcast;
#[derive(Debug)]
pub(crate) struct Notifier<T>(Arc<broadcast::Sender<T>>);
impl<T> Clone for Notifier<T> {
fn clone(&self) -> Self {
Self(self.0.clone())
}
}
impl<T> Notifier<T>
where
T: Send + Sync + fmt::Debug + 'static,
{
pub(crate) fn new(sender: broadcast::Sender<T>) -> Self {
Self(sender.into())
}
#[allow(dead_code)]
pub(crate) fn inner(&self) -> &Arc<broadcast::Sender<T>> {
&self.0
}
#[allow(dead_code)]
pub(crate) fn into_inner(self) -> Arc<broadcast::Sender<T>> {
self.0
}
pub(crate) fn notify(&self, msg: T) -> Result<()> {
if self.0.receiver_count() > 0 {
let _ = self.0.send(msg)?;
}
Ok(())
}
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub(crate) enum SubscriptionTyp {
EventSub(String),
Cid(Cid),
}
#[derive(Debug, Clone)]
pub(crate) struct Header {
pub(crate) subscription: SubscriptionTyp,
pub(crate) ident: Option<FastStr>,
}
impl Header {
pub(crate) fn new(sub: SubscriptionTyp, ident: Option<FastStr>) -> Self {
Self {
subscription: sub,
ident,
}
}
}
#[derive(Debug, Clone)]
pub(crate) struct Message {
pub(crate) header: Header,
pub(crate) payload: Vec<u8>,
}
impl Message {
pub(crate) fn new(header: Header, payload: Vec<u8>) -> Self {
Self { header, payload }
}
#[allow(dead_code)]
pub(crate) fn header(&self) -> &Header {
&self.header
}
#[allow(dead_code)]
pub(crate) fn payload(&self) -> &[u8] {
&self.payload
}
}