use std::sync::OnceLock;
static SESSION_ID: OnceLock<String> = OnceLock::new();
pub fn session_id() -> &'static str {
SESSION_ID.get_or_init(|| {
std::env::var("TIRITH_SESSION_ID").unwrap_or_else(|_| generate_session_id())
})
}
fn generate_session_id() -> String {
uuid::Uuid::new_v4().to_string()
}
pub fn new_session_id() -> String {
generate_session_id()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_session_id_stable_within_process() {
let id1 = session_id();
let id2 = session_id();
assert_eq!(id1, id2);
}
#[test]
fn test_generate_session_id_unique() {
let a = generate_session_id();
std::thread::sleep(std::time::Duration::from_millis(1));
let b = generate_session_id();
assert_ne!(a, b);
}
#[test]
fn test_generate_session_id_format() {
let id = generate_session_id();
assert_eq!(id.len(), 36);
assert!(uuid::Uuid::parse_str(&id).is_ok());
}
}