batuta/serve/banco/
events.rs1use serde::Serialize;
7use tokio::sync::broadcast;
8
9#[derive(Debug, Clone, Serialize)]
11#[serde(tag = "type", content = "data")]
12#[serde(rename_all = "snake_case")]
13pub enum BancoEvent {
14 ModelLoaded { model_id: String, format: String },
16 ModelUnloaded,
18 TrainingStarted { run_id: String, method: String },
20 TrainingMetric { run_id: String, step: u64, loss: f32 },
22 TrainingComplete { run_id: String },
24 FileUploaded { file_id: String, name: String },
26 RagIndexed { doc_count: usize, chunk_count: usize },
28 MergeComplete { merge_id: String, strategy: String },
30 SystemEvent { message: String },
32}
33
34pub struct EventBus {
36 sender: broadcast::Sender<String>,
37}
38
39impl EventBus {
40 #[must_use]
42 pub fn new(capacity: usize) -> Self {
43 let (sender, _) = broadcast::channel(capacity);
44 Self { sender }
45 }
46
47 pub fn emit(&self, event: &BancoEvent) {
49 if let Ok(json) = serde_json::to_string(event) {
50 let _ = self.sender.send(json);
52 }
53 }
54
55 pub fn subscribe(&self) -> broadcast::Receiver<String> {
57 self.sender.subscribe()
58 }
59
60 #[must_use]
62 pub fn subscriber_count(&self) -> usize {
63 self.sender.receiver_count()
64 }
65}
66
67impl Default for EventBus {
68 fn default() -> Self {
69 Self::new(256)
70 }
71}