use serde::{Deserialize, Serialize};
use tokio::sync::broadcast;
use crate::ir::ModelWarning;
pub const DEFAULT_CAPACITY: usize = 256;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "event", rename_all = "snake_case")]
#[non_exhaustive]
pub enum Event {
RequestStarted {
codec: String,
transport: String,
model: String,
},
RequestCompleted {
model: String,
input_tokens: u32,
output_tokens: u32,
},
Warning(ModelWarning),
ToolDispatched {
name: String,
},
ToolCompleted {
name: String,
error: bool,
},
}
#[derive(Clone)]
pub struct EventBus {
sender: broadcast::Sender<Event>,
}
impl EventBus {
pub fn new(capacity: usize) -> Self {
let (sender, _) = broadcast::channel(capacity);
Self { sender }
}
pub fn publish(&self, event: Event) -> usize {
self.sender.send(event).unwrap_or_default()
}
pub fn subscribe(&self) -> broadcast::Receiver<Event> {
self.sender.subscribe()
}
pub fn receiver_count(&self) -> usize {
self.sender.receiver_count()
}
}
impl Default for EventBus {
fn default() -> Self {
Self::new(DEFAULT_CAPACITY)
}
}