1use std::sync::Arc;
2
3use tokio::sync::broadcast;
4use tracing::instrument;
5
6use super::types::AuthEvent;
7
8const BUS_CAPACITY: usize = 256;
9
10#[derive(Clone)]
16pub struct EventBus {
17 sender: Arc<broadcast::Sender<AuthEvent>>,
18}
19
20impl EventBus {
21 pub fn new() -> Self {
22 let (sender, _) = broadcast::channel(BUS_CAPACITY);
23 Self {
24 sender: Arc::new(sender),
25 }
26 }
27
28 pub fn subscribe(&self) -> broadcast::Receiver<AuthEvent> {
29 self.sender.subscribe()
30 }
31
32 #[instrument(skip(self, event), fields(event = event.name()))]
33 pub fn emit(&self, event: AuthEvent) {
34 let name = event.name();
35 match self.sender.send(event) {
36 Ok(n) => tracing::debug!(listeners = n, event = name, "event emitted"),
37 Err(_) => tracing::debug!(event = name, "no listeners for event"),
38 }
39 }
40}
41
42impl Default for EventBus {
43 fn default() -> Self {
44 Self::new()
45 }
46}