diff --git a/src/browser/lifecycle.rs b/src/browser/lifecycle.rs index 6cb96df..b40706b 100644 --- a/src/browser/lifecycle.rs +++ b/src/browser/lifecycle.rs @@ -93,18 +93,24 @@ fn get_session_status(session: &Value) -> Option { /// Extract session timeout (milliseconds) from API response. /// The API may return it as `timeout`, `sessionTimeout`, or `timeoutMs`. +/// Self-hosted servers may encode "no timeout" as 0, which we normalize to `None`. pub fn get_session_timeout(session: &Value) -> Option { let keys = ["timeout", "sessionTimeout", "timeoutMs"]; for key in &keys { if let Some(v) = session.get(key) { if let Some(n) = v.as_u64() { - return Some(n); + if n > 0 { + return Some(n); + } + continue; } // Handle string numbers if let Some(s) = v.as_str() && let Ok(n) = s.trim().parse::() { - return Some(n); + if n > 0 { + return Some(n); + } } } } @@ -512,6 +518,12 @@ mod tests { ); } + #[test] + fn session_timeout_zero_means_unset() { + assert_eq!(get_session_timeout(&json!({"timeout": 0})), None); + assert_eq!(get_session_timeout(&json!({"timeoutMs": "0"})), None); + } + #[test] fn session_timeout_missing() { assert_eq!(get_session_timeout(&json!({"id": "s1"})), None);