openrtc 1.0.4

OpenRTC: a Rust-first P2P runtime for device discovery, signaling, and iroh/QUIC networking.
Documentation
//! Runtime policy constants and snapshots.
//!
//! Keep retry, grace, timeout, and heartbeat defaults here so docs and
//! diagnostics can point at one source instead of rediscovering scattered
//! magic numbers.

pub const MANAGED_SETTLE_DEADLINE_MS: i64 = 10_000;
pub const SESSION_ADMISSION_TIMEOUT_MS: u64 = 45_000;

pub const WASM_ACCEPT_CLOSE_GRACE_MS: u64 = 4_000;
pub const WASM_CONNECT_REPLACEMENT_GRACE_MS: u64 = 8_000;
pub const WASM_REPLACEMENT_POLL_MAX_INTERVAL_MS: u64 = 500;

#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_ADMISSION_FAILURE_BACKOFF_MS: i64 = 5_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_CONNECT_TIMEOUT_BACKOFF_MS: i64 = 10_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_CONNECT_TIMEOUT_RETRY_DELAY_MS: u64 = 3_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_DIRECT_QUIC_SUPPRESSION_MS: i64 = 15_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_MAX_UPGRADE_ATTEMPTS: u32 = 8;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_SIGNAL_SEND_TIMEOUT_MS: u64 = 30_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_SIGNAL_SEND_RETRY_DELAY_MS: u64 = 100;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_CONNECT_TIMEOUT_MS: u64 = 45_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_NO_SIGNAL_ABORT_MS: u64 = 8_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_ATTEMPT_IN_FLIGHT_GRACE_MS: i64 = 5_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_SKIP_LOG_INTERVAL_MS: i64 = 10_000;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_HEARTBEAT_TICK_SECS: u64 = 10;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_HEARTBEAT_SUSPECT_AFTER_SECS: u64 = 20;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_HEARTBEAT_STALE_AFTER_SECS: u64 = 60;
#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub const NATIVE_WEBRTC_HEARTBEAT_SEND_TIMEOUT_SECS: u64 = 2;

#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
fn read_e2e_u64_env(name: &str, fallback: u64) -> u64 {
    if std::env::var("PLUTO_E2E_ACCELERATED_TIMERS")
        .ok()
        .as_deref()
        != Some("1")
    {
        return fallback;
    }
    std::env::var(name)
        .ok()
        .and_then(|value| value.trim().parse::<u64>().ok())
        .filter(|value| *value > 0)
        .unwrap_or(fallback)
}

#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub fn native_webrtc_heartbeat_tick_secs() -> u64 {
    read_e2e_u64_env(
        "OPENRTC_E2E_NATIVE_WEBRTC_HEARTBEAT_TICK_SECS",
        NATIVE_WEBRTC_HEARTBEAT_TICK_SECS,
    )
}

#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub fn native_webrtc_heartbeat_suspect_after_secs() -> u64 {
    read_e2e_u64_env(
        "OPENRTC_E2E_NATIVE_WEBRTC_HEARTBEAT_SUSPECT_AFTER_SECS",
        NATIVE_WEBRTC_HEARTBEAT_SUSPECT_AFTER_SECS,
    )
}

#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub fn native_webrtc_heartbeat_stale_after_secs() -> u64 {
    read_e2e_u64_env(
        "OPENRTC_E2E_NATIVE_WEBRTC_HEARTBEAT_STALE_AFTER_SECS",
        NATIVE_WEBRTC_HEARTBEAT_STALE_AFTER_SECS,
    )
}

#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
pub fn native_webrtc_heartbeat_send_timeout_secs() -> u64 {
    read_e2e_u64_env(
        "OPENRTC_E2E_NATIVE_WEBRTC_HEARTBEAT_SEND_TIMEOUT_SECS",
        NATIVE_WEBRTC_HEARTBEAT_SEND_TIMEOUT_SECS,
    )
}

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct RuntimePolicySnapshot {
    pub managed_settle_deadline_ms: i64,
    pub session_admission_timeout_ms: u64,
    pub wasm: WasmRuntimePolicySnapshot,
    #[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
    pub native_webrtc: NativeWebRtcPolicySnapshot,
}

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct WasmRuntimePolicySnapshot {
    pub accept_close_grace_ms: u64,
    pub connect_replacement_grace_ms: u64,
    pub replacement_poll_max_interval_ms: u64,
}

#[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct NativeWebRtcPolicySnapshot {
    pub admission_failure_backoff_ms: i64,
    pub connect_timeout_backoff_ms: i64,
    pub connect_timeout_retry_delay_ms: u64,
    pub direct_quic_suppression_ms: i64,
    pub max_upgrade_attempts: u32,
    pub signal_send_timeout_ms: u64,
    pub signal_send_retry_delay_ms: u64,
    pub connect_timeout_ms: u64,
    pub no_signal_abort_ms: u64,
    pub attempt_in_flight_grace_ms: i64,
    pub skip_log_interval_ms: i64,
    pub heartbeat_tick_secs: u64,
    pub heartbeat_suspect_after_secs: u64,
    pub heartbeat_stale_after_secs: u64,
    pub heartbeat_send_timeout_secs: u64,
}

pub fn runtime_policy_snapshot() -> RuntimePolicySnapshot {
    RuntimePolicySnapshot {
        managed_settle_deadline_ms: MANAGED_SETTLE_DEADLINE_MS,
        session_admission_timeout_ms: SESSION_ADMISSION_TIMEOUT_MS,
        wasm: WasmRuntimePolicySnapshot {
            accept_close_grace_ms: WASM_ACCEPT_CLOSE_GRACE_MS,
            connect_replacement_grace_ms: WASM_CONNECT_REPLACEMENT_GRACE_MS,
            replacement_poll_max_interval_ms: WASM_REPLACEMENT_POLL_MAX_INTERVAL_MS,
        },
        #[cfg(all(not(target_arch = "wasm32"), feature = "transport-webrtc"))]
        native_webrtc: NativeWebRtcPolicySnapshot {
            admission_failure_backoff_ms: NATIVE_WEBRTC_ADMISSION_FAILURE_BACKOFF_MS,
            connect_timeout_backoff_ms: NATIVE_WEBRTC_CONNECT_TIMEOUT_BACKOFF_MS,
            connect_timeout_retry_delay_ms: NATIVE_WEBRTC_CONNECT_TIMEOUT_RETRY_DELAY_MS,
            direct_quic_suppression_ms: NATIVE_WEBRTC_DIRECT_QUIC_SUPPRESSION_MS,
            max_upgrade_attempts: NATIVE_WEBRTC_MAX_UPGRADE_ATTEMPTS,
            signal_send_timeout_ms: NATIVE_WEBRTC_SIGNAL_SEND_TIMEOUT_MS,
            signal_send_retry_delay_ms: NATIVE_WEBRTC_SIGNAL_SEND_RETRY_DELAY_MS,
            connect_timeout_ms: NATIVE_WEBRTC_CONNECT_TIMEOUT_MS,
            no_signal_abort_ms: NATIVE_WEBRTC_NO_SIGNAL_ABORT_MS,
            attempt_in_flight_grace_ms: NATIVE_WEBRTC_ATTEMPT_IN_FLIGHT_GRACE_MS,
            skip_log_interval_ms: NATIVE_WEBRTC_SKIP_LOG_INTERVAL_MS,
            heartbeat_tick_secs: native_webrtc_heartbeat_tick_secs(),
            heartbeat_suspect_after_secs: native_webrtc_heartbeat_suspect_after_secs(),
            heartbeat_stale_after_secs: native_webrtc_heartbeat_stale_after_secs(),
            heartbeat_send_timeout_secs: native_webrtc_heartbeat_send_timeout_secs(),
        },
    }
}