Skip to main content

rok_broadcasting/
driver.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use tokio::sync::broadcast;
5
6use crate::{BroadcastError, BroadcastEvent};
7
8/// Pluggable backend for delivering broadcast events.
9///
10/// Implement this to route events to Pusher, Ably, Redis Pub/Sub, or any
11/// custom WebSocket transport.
12#[async_trait]
13pub trait BroadcastDriver: Send + Sync + 'static {
14    async fn broadcast(&self, event: BroadcastEvent) -> Result<(), BroadcastError>;
15}
16
17// ── InMemoryDriver ────────────────────────────────────────────────────────────
18
19/// Simple in-process broadcast driver backed by a Tokio broadcast channel.
20///
21/// Useful in tests and single-process development servers.  Subscribe to
22/// [`InMemoryDriver::subscribe`] to receive events.
23pub struct InMemoryDriver {
24    tx: broadcast::Sender<BroadcastEvent>,
25}
26
27impl Default for InMemoryDriver {
28    fn default() -> Self {
29        Self::new()
30    }
31}
32
33impl InMemoryDriver {
34    pub fn new() -> Self {
35        let (tx, _) = broadcast::channel(1024);
36        Self { tx }
37    }
38
39    /// Subscribe to all events emitted through this driver.
40    pub fn subscribe(&self) -> broadcast::Receiver<BroadcastEvent> {
41        self.tx.subscribe()
42    }
43}
44
45#[async_trait]
46impl BroadcastDriver for InMemoryDriver {
47    async fn broadcast(&self, event: BroadcastEvent) -> Result<(), BroadcastError> {
48        let _ = self.tx.send(event);
49        Ok(())
50    }
51}
52
53// ── SharedDriver ──────────────────────────────────────────────────────────────
54
55/// Type alias — most callers pass a driver via `Arc`.
56pub type SharedDriver = Arc<dyn BroadcastDriver>;