1use std::sync::OnceLock;
2
3static SESSION_ID: OnceLock<String> = OnceLock::new();
5
6pub fn session_id() -> &'static str {
12 SESSION_ID.get_or_init(|| {
13 std::env::var("TIRITH_SESSION_ID").unwrap_or_else(|_| generate_session_id())
14 })
15}
16
17fn generate_session_id() -> String {
19 uuid::Uuid::new_v4().to_string()
20}
21
22pub fn new_session_id() -> String {
24 generate_session_id()
25}
26
27#[cfg(test)]
28mod tests {
29 use super::*;
30
31 #[test]
32 fn test_session_id_stable_within_process() {
33 let id1 = session_id();
34 let id2 = session_id();
35 assert_eq!(id1, id2);
36 }
37
38 #[test]
39 fn test_generate_session_id_unique() {
40 let a = generate_session_id();
41 std::thread::sleep(std::time::Duration::from_millis(1));
43 let b = generate_session_id();
44 assert_ne!(a, b);
45 }
46
47 #[test]
48 fn test_generate_session_id_format() {
49 let id = generate_session_id();
50 assert_eq!(id.len(), 36);
52 assert!(uuid::Uuid::parse_str(&id).is_ok());
53 }
54}