use std::time::Duration;
fn random_token_secret() -> Vec<u8> {
let mut buf = vec![0u8; 32];
getrandom::fill(&mut buf).expect("OS RNG unavailable");
buf
}
#[derive(Debug, Clone)]
pub struct EngineCfg {
pub try_only: bool,
pub max_retry: u32,
pub backoff_ms_step: u64,
pub max_hold_ms: u128,
pub token_secret: Vec<u8>,
pub long_hold: LongHoldConfig,
pub max_spawn_depth: u32,
}
impl EngineCfg {
pub fn strict() -> Self {
Self {
try_only: true,
max_retry: 0,
backoff_ms_step: 0,
max_hold_ms: 10,
..Self::default()
}
}
pub fn relaxed() -> Self {
Self {
try_only: false,
max_retry: 10,
backoff_ms_step: 50,
max_hold_ms: 200,
..Self::default()
}
}
}
impl Default for EngineCfg {
fn default() -> Self {
Self {
try_only: false,
max_retry: 3,
backoff_ms_step: 10,
max_hold_ms: 50,
token_secret: random_token_secret(),
long_hold: LongHoldConfig::default(),
max_spawn_depth: 4,
}
}
}
#[derive(Debug, Clone)]
pub struct LongHoldConfig {
pub default_hold: Duration,
pub max_hold: Duration,
pub heartbeat_interval: Duration,
pub heartbeat_miss_threshold: u32,
pub keepalive_on_idle: bool,
}
impl Default for LongHoldConfig {
fn default() -> Self {
Self {
default_hold: Duration::from_secs(3600),
max_hold: Duration::from_secs(48 * 3600),
heartbeat_interval: Duration::from_secs(300),
heartbeat_miss_threshold: 3,
keepalive_on_idle: true,
}
}
}