1use tokio::sync::broadcast::{self, Receiver, Sender};
2use tracing::*;
3use uuid::Uuid;
4
5use crate::Lb;
6
7#[derive(Clone)]
8pub struct EventSubs {
9 tx: Sender<Event>,
10}
11
12#[derive(Clone, Copy, Debug)]
13pub enum Event {
14 MetadataChanged(Uuid),
18
19 DocumentWritten(Uuid),
22}
23
24impl Default for EventSubs {
25 fn default() -> Self {
26 let (tx, _) = broadcast::channel::<Event>(10000);
27 Self { tx }
28 }
29}
30
31impl EventSubs {
32 pub fn meta_changed(&self, id: Uuid) {
33 self.queue(Event::MetadataChanged(id));
34 }
35
36 pub fn doc_written(&self, id: Uuid) {
37 self.queue(Event::DocumentWritten(id));
38 }
39
40 fn queue(&self, evt: Event) {
41 if let Err(e) = self.tx.send(evt) {
42 error!(?evt, ?e, "could not queue");
43 }
44 }
45}
46
47impl Lb {
48 pub fn subscribe(&self) -> Receiver<Event> {
49 self.events.tx.subscribe()
50 }
51}