use crate::common::config_types::{TransportProtocol, TlsConfig, HeartbeatConfig};
use crate::common::protocol::SerializationFormat;
use crate::common::compression::CompressionAlgorithm;
use crate::common::device::DeviceConflictStrategy;
use std::time::Duration;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ServerConfig {
pub bind_address: String,
pub transport: TransportProtocol,
pub transports: Option<Vec<TransportProtocol>>,
pub protocol_addresses: Option<std::collections::HashMap<TransportProtocol, String>>,
pub default_serialization_format: SerializationFormat,
pub default_compression: CompressionAlgorithm,
pub max_connections: usize,
pub connection_timeout: Duration,
pub default_heartbeat: HeartbeatConfig,
pub tls: TlsConfig,
pub max_message_size: usize,
pub device_conflict_strategy: DeviceConflictStrategy,
pub auth_enabled: bool,
pub auth_timeout: Duration,
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
bind_address: "0.0.0.0:8080".to_string(),
transport: TransportProtocol::WebSocket,
transports: None,
protocol_addresses: None,
default_serialization_format: SerializationFormat::Protobuf,
default_compression: CompressionAlgorithm::None,
max_connections: 10000,
connection_timeout: Duration::from_secs(300),
default_heartbeat: HeartbeatConfig::default(),
tls: TlsConfig::none(),
max_message_size: 10 * 1024 * 1024, device_conflict_strategy: DeviceConflictStrategy::default(),
auth_enabled: false, auth_timeout: Duration::from_secs(30), }
}
}
impl ServerConfig {
pub fn new(bind_address: String) -> Self {
Self {
bind_address,
..Default::default()
}
}
pub fn websocket(mut self) -> Self {
self.transport = TransportProtocol::WebSocket;
self
}
pub fn quic(mut self) -> Self {
self.transport = TransportProtocol::QUIC;
self
}
pub fn with_format(mut self, format: SerializationFormat) -> Self {
self.default_serialization_format = format;
self
}
pub fn with_compression(mut self, compression: CompressionAlgorithm) -> Self {
self.default_compression = compression;
self
}
pub fn with_max_connections(mut self, max: usize) -> Self {
self.max_connections = max;
self
}
pub fn with_protocols(mut self, protocols: Vec<TransportProtocol>) -> Self {
self.transports = Some(protocols);
self
}
pub fn with_protocol_address(mut self, protocol: TransportProtocol, address: String) -> Self {
if self.protocol_addresses.is_none() {
self.protocol_addresses = Some(std::collections::HashMap::new());
}
if let Some(ref mut addresses) = self.protocol_addresses {
addresses.insert(protocol, address);
}
self
}
pub fn with_protocol_addresses(mut self, addresses: std::collections::HashMap<TransportProtocol, String>) -> Self {
self.protocol_addresses = Some(addresses);
self
}
pub fn get_protocol_address(&self, protocol: &TransportProtocol) -> String {
if let Some(ref addresses) = self.protocol_addresses {
if let Some(addr) = addresses.get(protocol) {
return addr.clone();
}
}
self.bind_address.clone()
}
pub fn with_heartbeat(mut self, heartbeat: HeartbeatConfig) -> Self {
self.default_heartbeat = heartbeat;
self
}
pub fn with_tls(mut self, tls: TlsConfig) -> Self {
self.tls = tls;
self
}
pub fn with_connection_timeout(mut self, timeout: Duration) -> Self {
self.connection_timeout = timeout;
self
}
pub fn get_protocols(&self) -> Vec<TransportProtocol> {
if let Some(ref protocols) = self.transports {
protocols.clone()
} else {
vec![self.transport]
}
}
pub fn with_device_conflict_strategy(mut self, strategy: DeviceConflictStrategy) -> Self {
self.device_conflict_strategy = strategy;
self
}
pub fn enable_auth(mut self) -> Self {
self.auth_enabled = true;
self
}
pub fn disable_auth(mut self) -> Self {
self.auth_enabled = false;
self
}
pub fn with_auth_timeout(mut self, timeout: Duration) -> Self {
self.auth_timeout = timeout;
self
}
}