Skip to main content

authx_core/events/
bus.rs

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/// Async broadcast event bus.
11///
12/// Plugins subscribe at startup and receive every event emitted during
13/// request processing. Receivers that fall behind drop old events (broadcast
14/// semantics — no backpressure, no blocking on slow listeners).
15#[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}