braid_core/core/server/config.rs
1//! Server configuration for Braid-HTTP support.
2//!
3//! This module defines the [`ServerConfig`] struct that controls the behavior
4//! of the Braid-HTTP server middleware, including subscription support,
5//! heartbeat intervals, and multiplexing capabilities.
6//!
7//! # Configuration Options
8//!
9//! | Option | Default | Description |
10//! |--------|---------|-------------|
11//! | `enable_subscriptions` | true | Enable HTTP 209 subscriptions |
12//! | `max_subscriptions` | 1000 | Max concurrent subscriptions |
13//! | `max_subscription_duration_secs` | 3600 | Max subscription lifetime |
14//! | `heartbeat_interval` | 30 | Heartbeat interval (seconds) |
15//! | `enable_multiplex` | false | Enable request multiplexing |
16//!
17//! # Examples
18//!
19//! ## Default Configuration
20//!
21//! ```
22//! use crate::core::server::ServerConfig;
23//!
24//! let config = ServerConfig::default();
25//! assert!(config.enable_subscriptions);
26//! assert_eq!(config.max_subscriptions, 1000);
27//! ```
28//!
29//! ## Custom Configuration
30//!
31//! ```
32//! use crate::core::server::ServerConfig;
33//!
34//! let config = ServerConfig {
35//! enable_subscriptions: true,
36//! max_subscriptions: 5000,
37//! max_subscription_duration_secs: 7200,
38//! heartbeat_interval: 60,
39//! enable_multiplex: true,
40//! };
41//! ```
42//!
43//! ## Partial Override
44//!
45//! ```
46//! use crate::core::server::ServerConfig;
47//!
48//! let config = ServerConfig {
49//! max_subscriptions: 5000,
50//! ..Default::default()
51//! };
52//! assert_eq!(config.max_subscriptions, 5000);
53//! assert_eq!(config.heartbeat_interval, 30); // Default
54//! ```
55
56/// Server configuration for Braid-HTTP support.
57///
58/// Controls subscription behavior, heartbeat intervals, and multiplexing
59/// for the Braid server middleware.
60///
61/// # Example
62///
63/// ```
64/// use crate::core::server::ServerConfig;
65///
66/// let config = ServerConfig {
67/// enable_subscriptions: true,
68/// max_subscriptions: 5000,
69/// ..Default::default()
70/// };
71/// ```
72#[derive(Clone, Debug, PartialEq, Eq)]
73pub struct ServerConfig {
74 /// Enable subscription support (HTTP 209).
75 ///
76 /// When enabled, clients can request subscriptions using the
77 /// `Subscribe: true` header and receive streaming updates.
78 pub enable_subscriptions: bool,
79
80 /// Maximum concurrent subscriptions.
81 ///
82 /// Limits the number of active subscription connections to prevent
83 /// resource exhaustion.
84 pub max_subscriptions: usize,
85
86 /// Maximum subscription duration in seconds.
87 ///
88 /// Subscriptions will be automatically closed after this duration.
89 /// Set to 0 for unlimited duration.
90 pub max_subscription_duration_secs: u64,
91
92 /// Heartbeat interval in seconds.
93 ///
94 /// The server sends heartbeat messages at this interval to keep
95 /// subscription connections alive.
96 pub heartbeat_interval: u64,
97
98 /// Enable request multiplexing.
99 ///
100 /// When enabled, multiple requests can be multiplexed over a single
101 /// connection using HTTP 293 status code.
102 pub enable_multiplex: bool,
103}
104
105impl Default for ServerConfig {
106 fn default() -> Self {
107 ServerConfig {
108 enable_subscriptions: true,
109 max_subscriptions: 1000,
110 max_subscription_duration_secs: 3600,
111 heartbeat_interval: 30,
112 enable_multiplex: false,
113 }
114 }
115}
116
117#[cfg(test)]
118mod tests {
119 use super::*;
120
121 #[test]
122 fn test_default_config() {
123 let config = ServerConfig::default();
124 assert!(config.enable_subscriptions);
125 assert_eq!(config.max_subscriptions, 1000);
126 assert_eq!(config.max_subscription_duration_secs, 3600);
127 assert_eq!(config.heartbeat_interval, 30);
128 assert!(!config.enable_multiplex);
129 }
130
131 #[test]
132 fn test_custom_config() {
133 let config = ServerConfig {
134 enable_subscriptions: false,
135 max_subscriptions: 5000,
136 max_subscription_duration_secs: 7200,
137 heartbeat_interval: 60,
138 enable_multiplex: true,
139 };
140 assert!(!config.enable_subscriptions);
141 assert_eq!(config.max_subscriptions, 5000);
142 assert!(config.enable_multiplex);
143 }
144
145 #[test]
146 fn test_partial_override() {
147 let config = ServerConfig {
148 max_subscriptions: 5000,
149 ..Default::default()
150 };
151 assert_eq!(config.max_subscriptions, 5000);
152 assert!(config.enable_subscriptions);
153 assert_eq!(config.heartbeat_interval, 30);
154 }
155
156 #[test]
157 fn test_clone() {
158 let config = ServerConfig::default();
159 let cloned = config.clone();
160 assert_eq!(config, cloned);
161 }
162
163 #[test]
164 fn test_debug() {
165 let config = ServerConfig::default();
166 let debug = format!("{:?}", config);
167 assert!(debug.contains("ServerConfig"));
168 assert!(debug.contains("enable_subscriptions"));
169 }
170}