Skip to main content

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}