use std::time::Duration;
use tracing::warn;
pub const POST_EXIT_PTY_DRAIN_TIMEOUT: Duration = Duration::from_millis(100);
pub const CHILD_POLL_INTERVAL: Duration = Duration::from_millis(200);
pub const ATTACH_SOCKET_READ_TIMEOUT: Duration = Duration::from_millis(500);
pub const ATTACH_STDIN_DELAY: Duration = Duration::from_millis(250);
pub const ATTACH_RETRY_DELAY: Duration = Duration::from_millis(150);
pub const DETACH_STARTUP_TIMEOUT: Duration = Duration::from_secs(30);
pub const SESSION_READY_POLL_INTERVAL: Duration = Duration::from_millis(50);
pub const TERMINATE_POLL_INTERVAL: Duration = Duration::from_millis(25);
pub const STOP_POLL_INTERVAL: Duration = Duration::from_millis(200);
pub const LOG_TAIL_POLL_INTERVAL: Duration = Duration::from_millis(250);
#[cfg(target_os = "macos")]
pub const FS_USAGE_SETTLE_TIME: Duration = Duration::from_secs(2);
#[cfg(target_os = "macos")]
pub const SIGTERM_GRACE_PERIOD: Duration = Duration::from_secs(3);
pub fn detach_startup_timeout() -> Duration {
env_duration_secs("NONO_DETACH_STARTUP_TIMEOUT", DETACH_STARTUP_TIMEOUT)
}
pub fn pty_drain_timeout() -> Duration {
env_duration_millis("NONO_PTY_DRAIN_TIMEOUT", POST_EXIT_PTY_DRAIN_TIMEOUT)
}
pub fn pty_attach_timeout_ms() -> i32 {
env_duration_millis(
"NONO_PTY_ATTACH_TIMEOUT",
Duration::from_millis(PTY_ATTACH_TIMEOUT_MS as u64),
)
.as_millis()
.min(i32::MAX as u128) as i32
}
pub const PTY_ATTACH_TIMEOUT_MS: i32 = 1000;
const MAX_TIMEOUT: Duration = Duration::from_secs(3600);
fn env_duration_secs(var: &str, default: Duration) -> Duration {
match std::env::var(var) {
Ok(val) => match val.parse::<u64>() {
Ok(secs) => {
let d = Duration::from_secs(secs);
if d > MAX_TIMEOUT {
warn!(
"{var}={val} exceeds maximum ({} s), clamping",
MAX_TIMEOUT.as_secs()
);
MAX_TIMEOUT
} else {
d
}
}
Err(_) => {
warn!("{var}={val:?} is not a valid number of seconds, using default");
default
}
},
Err(_) => default,
}
}
fn env_duration_millis(var: &str, default: Duration) -> Duration {
match std::env::var(var) {
Ok(val) => match val.parse::<u64>() {
Ok(ms) => {
let d = Duration::from_millis(ms);
if d > MAX_TIMEOUT {
warn!(
"{var}={val} exceeds maximum ({} s), clamping",
MAX_TIMEOUT.as_secs()
);
MAX_TIMEOUT
} else {
d
}
}
Err(_) => {
warn!("{var}={val:?} is not a valid number of milliseconds, using default");
default
}
},
Err(_) => default,
}
}