use crate::common::config_types::{TransportProtocol, TlsConfig, HeartbeatConfig};
use crate::common::protocol::SerializationFormat;
use crate::common::compression::CompressionAlgorithm;
use crate::common::device::DeviceInfo;
use std::time::Duration;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ClientConfig {
pub server_url: String,
pub transport: TransportProtocol,
pub transports: Option<Vec<TransportProtocol>>,
pub protocol_urls: Option<std::collections::HashMap<TransportProtocol, String>>,
pub race_timeout: Option<Duration>,
pub serialization_format: SerializationFormat,
pub compression: CompressionAlgorithm,
pub force_serialization_format: Option<SerializationFormat>,
pub force_compression: Option<CompressionAlgorithm>,
pub connect_timeout: Duration,
pub reconnect_interval: Duration,
pub max_reconnect_attempts: Option<u32>,
pub heartbeat: HeartbeatConfig,
pub tls: TlsConfig,
pub connection_id: Option<String>,
pub user_id: Option<String>,
pub metadata: std::collections::HashMap<String, String>,
pub enable_router: bool,
pub device_info: Option<DeviceInfo>,
pub token: Option<String>,
}
impl Default for ClientConfig {
fn default() -> Self {
Self {
server_url: "ws://localhost:8080".to_string(),
transport: TransportProtocol::WebSocket,
transports: None,
protocol_urls: None,
race_timeout: Some(Duration::from_secs(5)),
serialization_format: SerializationFormat::Json,
compression: CompressionAlgorithm::None,
force_serialization_format: None,
force_compression: None,
connect_timeout: Duration::from_secs(30),
reconnect_interval: Duration::from_secs(5),
max_reconnect_attempts: Some(5),
heartbeat: HeartbeatConfig::default(),
tls: TlsConfig::none(),
connection_id: None,
user_id: None,
metadata: std::collections::HashMap::new(),
enable_router: false,
device_info: None,
token: None,
}
}
}
impl ClientConfig {
pub fn new(server_url: String) -> Self {
Self {
server_url,
..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.serialization_format = format;
self
}
pub fn with_compression(mut self, compression: CompressionAlgorithm) -> Self {
self.compression = compression;
self
}
pub fn with_user_id(mut self, user_id: String) -> Self {
self.user_id = Some(user_id);
self
}
pub fn with_token(mut self, token: String) -> Self {
self.token = Some(token);
self
}
pub fn with_protocol_race(mut self, protocols: Vec<TransportProtocol>) -> Self {
self.transports = Some(protocols);
self
}
pub fn with_protocol_url(mut self, protocol: TransportProtocol, url: String) -> Self {
if self.protocol_urls.is_none() {
self.protocol_urls = Some(std::collections::HashMap::new());
}
if let Some(ref mut urls) = self.protocol_urls {
urls.insert(protocol, url);
}
self
}
pub fn with_protocol_urls(mut self, urls: std::collections::HashMap<TransportProtocol, String>) -> Self {
self.protocol_urls = Some(urls);
self
}
pub fn get_protocol_url(&self, protocol: &TransportProtocol) -> String {
if let Some(ref urls) = self.protocol_urls {
if let Some(url) = urls.get(protocol) {
return url.clone();
}
}
self.server_url.clone()
}
pub fn with_race_timeout(mut self, timeout: Duration) -> Self {
self.race_timeout = Some(timeout);
self
}
pub fn with_heartbeat(mut self, heartbeat: HeartbeatConfig) -> Self {
self.heartbeat = heartbeat;
self
}
pub fn with_tls(mut self, tls: TlsConfig) -> Self {
self.tls = tls;
self
}
pub fn with_connect_timeout(mut self, timeout: Duration) -> Self {
self.connect_timeout = timeout;
self
}
pub fn with_reconnect_interval(mut self, interval: Duration) -> Self {
self.reconnect_interval = interval;
self
}
pub fn with_max_reconnect_attempts(mut self, max: Option<u32>) -> Self {
self.max_reconnect_attempts = max;
self
}
pub fn enable_router(mut self) -> Self {
self.enable_router = true;
self
}
pub fn with_device_info(mut self, device_info: DeviceInfo) -> Self {
self.device_info = Some(device_info);
self
}
pub fn force_format(mut self, format: SerializationFormat) -> Self {
self.force_serialization_format = Some(format);
self
}
pub fn force_compression(mut self, compression: CompressionAlgorithm) -> Self {
self.force_compression = Some(compression);
self
}
pub fn is_force_format(&self) -> bool {
self.force_serialization_format.is_some() || self.force_compression.is_some()
}
pub fn get_serialization_format(&self) -> SerializationFormat {
self.force_serialization_format.unwrap_or(self.serialization_format)
}
pub fn get_compression(&self) -> CompressionAlgorithm {
self.force_compression.unwrap_or(self.compression)
}
pub fn get_protocols(&self) -> Vec<TransportProtocol> {
if let Some(ref protocols) = self.transports {
protocols.clone()
} else {
vec![self.transport]
}
}
pub fn is_race_mode(&self) -> bool {
self.transports.is_some() && self.transports.as_ref().unwrap().len() > 1
}
}