Skip to main content

a3s_boot/websocket/
context.rs

1use super::gateway::WebSocketGatewayDefinition;
2use super::server::WebSocketGatewayServer;
3use crate::{BootRequest, ExecutionContext};
4use std::ops::Deref;
5
6/// Context available to WebSocket guards and interceptors.
7#[derive(Debug, Clone)]
8pub struct WebSocketContext {
9    pub request: BootRequest,
10    pub gateway_path: String,
11    pub event: String,
12    pub namespace: Option<String>,
13    pub module_name: Option<String>,
14    server: WebSocketGatewayServer,
15    execution_context: ExecutionContext,
16}
17
18impl WebSocketContext {
19    pub(crate) fn new(
20        gateway: &WebSocketGatewayDefinition,
21        request: BootRequest,
22        event: &str,
23    ) -> Self {
24        let gateway_path = gateway.path().to_string();
25        let event = event.to_string();
26        let namespace = gateway.namespace().map(str::to_string);
27        let module_name = gateway.module_name().map(str::to_string);
28        let metadata = gateway
29            .event_metadata(&event)
30            .cloned()
31            .unwrap_or_else(|| gateway.metadata().clone());
32        let execution_context = ExecutionContext::websocket(
33            request.clone(),
34            gateway_path.clone(),
35            event.clone(),
36            namespace.clone(),
37            module_name.clone(),
38            metadata,
39        );
40        Self {
41            request,
42            gateway_path,
43            event,
44            namespace,
45            module_name,
46            server: gateway.server(),
47            execution_context,
48        }
49    }
50
51    pub fn server(&self) -> WebSocketGatewayServer {
52        self.server.clone()
53    }
54
55    pub fn execution_context(&self) -> &ExecutionContext {
56        &self.execution_context
57    }
58
59    pub fn into_execution_context(self) -> ExecutionContext {
60        self.execution_context
61    }
62}
63
64impl Deref for WebSocketContext {
65    type Target = ExecutionContext;
66
67    fn deref(&self) -> &Self::Target {
68        self.execution_context()
69    }
70}
71
72/// Context passed to WebSocket gateway initialization hooks.
73#[derive(Debug, Clone)]
74pub struct WebSocketGatewayInitContext {
75    pub gateway_path: String,
76    pub namespace: Option<String>,
77    pub module_name: Option<String>,
78    pub events: Vec<String>,
79    server: WebSocketGatewayServer,
80}
81
82impl WebSocketGatewayInitContext {
83    pub(crate) fn new(gateway: &WebSocketGatewayDefinition) -> Self {
84        Self {
85            gateway_path: gateway.path().to_string(),
86            namespace: gateway.namespace().map(str::to_string),
87            module_name: gateway.module_name().map(str::to_string),
88            events: gateway.events().into_iter().map(str::to_string).collect(),
89            server: gateway.server(),
90        }
91    }
92
93    pub fn server(&self) -> WebSocketGatewayServer {
94        self.server.clone()
95    }
96}