use std::time::Duration;
use crate::protocol::heartbeat::HeartbeatPolicy;
use crate::topic::TopicProfile;
#[derive(Debug, Clone)]
pub struct ServerConfig {
pub max_payload_bytes: usize,
pub max_topics_per_connection: usize,
pub max_send_queue_bytes: usize,
pub heartbeat: HeartbeatPolicy,
pub max_connections: usize,
pub write_timeout: Duration,
pub idle_timeout: Duration,
pub reconnect_base_ms: u32,
pub reconnect_max_ms: u32,
pub replay_window: Duration,
pub dedupe_window: Duration,
pub max_auth_failures: u32,
pub codec_offer: Vec<crate::frame::Codec>,
pub default_topic_profile: TopicProfile,
#[cfg(feature = "redis")]
pub redis: Option<RedisConfig>,
}
#[cfg(feature = "redis")]
#[derive(Debug, Clone)]
pub struct RedisConfig {
pub url: String,
pub pool_size: usize,
pub prefix: String,
}
#[cfg(feature = "redis")]
impl Default for RedisConfig {
fn default() -> Self {
Self {
url: "redis://127.0.0.1:6379".into(),
pool_size: 8,
prefix: "rift".into(),
}
}
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
max_payload_bytes: 65_536,
max_topics_per_connection: 128,
max_send_queue_bytes: 1_048_576,
max_connections: 0, heartbeat: HeartbeatPolicy::default(),
idle_timeout: Duration::from_secs(300),
write_timeout: Duration::from_secs(30),
reconnect_base_ms: 500,
reconnect_max_ms: 15_000,
replay_window: Duration::from_secs(300),
dedupe_window: Duration::from_secs(60),
max_auth_failures: 3,
codec_offer: Vec::new(),
default_topic_profile: TopicProfile::default(),
#[cfg(feature = "redis")]
redis: None,
}
}
}
impl ServerConfig {
pub fn supported_features(&self) -> Vec<&'static str> {
vec![
"replay",
"snapshot",
"resume",
"topic_profiles",
"backpressure",
]
}
pub fn validate(&self) -> Result<(), String> {
if self.max_payload_bytes == 0 {
return Err("max_payload_bytes must be > 0".into());
}
if self.max_send_queue_bytes == 0 {
return Err("max_send_queue_bytes must be > 0".into());
}
self.heartbeat
.validate()
.map_err(|e| format!("heartbeat: {e}"))?;
Ok(())
}
}