use std::sync::atomic::{AtomicU64, Ordering};
use std::time::Duration;
use crate::services::PortServices;
static AUTO_CONNECT_TIMEOUT_US: AtomicU64 = AtomicU64::new(500_000);
pub fn auto_connect_timeout() -> Duration {
Duration::from_micros(AUTO_CONNECT_TIMEOUT_US.load(Ordering::Relaxed))
}
pub fn set_auto_connect_timeout(timeout: Duration) {
AUTO_CONNECT_TIMEOUT_US.store(timeout.as_micros() as u64, Ordering::Relaxed);
}
#[derive(Debug, Clone)]
pub struct RuntimeConfig {
pub channel_capacity: usize,
pub auto_connect: bool,
pub connect_backoff: BackoffConfig,
pub supervision: SupervisionPolicy,
pub auto_connect_timeout: Duration,
pub services: PortServices,
}
impl Default for RuntimeConfig {
fn default() -> Self {
Self {
channel_capacity: 1024,
auto_connect: true,
connect_backoff: BackoffConfig::default(),
supervision: SupervisionPolicy::default(),
auto_connect_timeout: auto_connect_timeout(),
services: PortServices::global(),
}
}
}
#[derive(Debug, Clone)]
pub struct BackoffConfig {
pub initial: Duration,
pub max: Duration,
pub multiplier: f64,
}
impl Default for BackoffConfig {
fn default() -> Self {
Self {
initial: Duration::from_millis(100),
max: Duration::from_secs(30),
multiplier: 2.0,
}
}
}
#[derive(Debug, Clone)]
pub struct SupervisionPolicy {
pub max_restarts: usize,
pub restart_window: Duration,
}
impl Default for SupervisionPolicy {
fn default() -> Self {
Self {
max_restarts: 5,
restart_window: Duration::from_secs(60),
}
}
}