lb_rs/service/
events.rs

1use tokio::sync::broadcast::{self, Receiver, Sender};
2use tracing::*;
3use uuid::Uuid;
4
5use crate::Lb;
6
7use super::sync::SyncIncrement;
8
9#[derive(Clone)]
10pub struct EventSubs {
11    tx: Sender<Event>,
12}
13
14#[derive(Clone, Debug)]
15pub enum Event {
16    /// A metadata for a given id or it's descendants changed. The id returned
17    /// may be deleted. Updates to document contents will not cause this
18    /// message to be sent (unless a document was deleted).
19    MetadataChanged,
20
21    /// The contents of this document have changed either by this lb
22    /// library or as a result of sync
23    DocumentWritten(Uuid),
24
25    PendingSharesChanged,
26
27    Sync(SyncIncrement),
28
29    StatusUpdated,
30}
31
32impl Default for EventSubs {
33    fn default() -> Self {
34        let (tx, _) = broadcast::channel::<Event>(10000);
35        Self { tx }
36    }
37}
38
39impl EventSubs {
40    pub fn meta_changed(&self) {
41        self.queue(Event::MetadataChanged);
42    }
43
44    pub fn doc_written(&self, id: Uuid) {
45        self.queue(Event::DocumentWritten(id));
46    }
47
48    pub fn sync(&self, s: SyncIncrement) {
49        self.queue(Event::Sync(s));
50    }
51
52    pub fn status_updated(&self) {
53        self.queue(Event::StatusUpdated);
54    }
55
56    fn queue(&self, evt: Event) {
57        if let Err(e) = self.tx.send(evt.clone()) {
58            error!(?evt, ?e, "could not queue");
59        }
60    }
61}
62
63impl Lb {
64    pub fn subscribe(&self) -> Receiver<Event> {
65        self.events.tx.subscribe()
66    }
67}