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 MetadataChanged,
20
21 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}