Skip to main content

realtime/server/
runtime.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4
5use super::{RealtimeError, SessionAuth, SocketServerHandle};
6
7#[async_trait]
8pub trait RealtimeTokenVerifier: Send + Sync + 'static {
9    /// Verify an access token and return authenticated session context.
10    ///
11    /// Returning `Err(RealtimeError::unauthorized(...))` denies websocket upgrade.
12    async fn verify_token(&self, token: &str) -> Result<SessionAuth, RealtimeError>;
13}
14
15/// Shared application state for realtime HTTP integration.
16///
17/// This bundles:
18/// - `handle`: transport runtime and messaging API.
19/// - `verifier`: token verification used during websocket upgrade.
20///
21/// Use `state.handle` for send/subscribe operations.
22#[derive(Clone)]
23pub struct SocketAppState {
24    pub handle: SocketServerHandle,
25    pub verifier: Arc<dyn RealtimeTokenVerifier>,
26}
27
28impl SocketAppState {
29    /// Create runtime state from a realtime handle and concrete verifier.
30    pub fn new<V>(handle: SocketServerHandle, verifier: V) -> Self
31    where
32        V: RealtimeTokenVerifier,
33    {
34        Self {
35            handle,
36            verifier: Arc::new(verifier),
37        }
38    }
39
40    /// Create runtime state from a realtime handle and shared verifier trait object.
41    pub fn new_with_shared_verifier(
42        handle: SocketServerHandle,
43        verifier: Arc<dyn RealtimeTokenVerifier>,
44    ) -> Self {
45        Self { handle, verifier }
46    }
47}