use crate::types::*;
use serde::{Deserialize, Serialize};
use tokio::sync::broadcast;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum TracingEvent {
TraceCreated { trace: TraceSummary },
TraceUpdated { trace: TraceSummary },
SpanCreated { span: Span },
SpanUpdated { span: Span },
}
#[derive(Clone)]
pub struct EventBus {
sender: broadcast::Sender<TracingEvent>,
}
impl EventBus {
pub fn new() -> Self {
let (sender, _) = broadcast::channel(256);
Self { sender }
}
pub fn publish(&self, event: TracingEvent) {
let _ = self.sender.send(event);
}
pub fn subscribe(&self) -> broadcast::Receiver<TracingEvent> {
self.sender.subscribe()
}
}
impl Default for EventBus {
fn default() -> Self {
Self::new()
}
}