lb_rs/service/
events.rs

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    /// A metadata for a given id or it's descendants changed. The id returned
15    /// may be deleted. Updates to document contents will not cause this
16    /// message to be sent (unless a document was deleted).
17    MetadataChanged(Uuid),
18
19    /// The contents of this document have changed either by this lb
20    /// library or as a result of sync
21    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}