use std::collections::HashMap;
use std::sync::{LazyLock, Mutex};
use zenoh::Wait;
static SESSION_REGISTRY: LazyLock<Mutex<HashMap<String, zenoh::Session>>> =
LazyLock::new(|| Mutex::new(HashMap::new()));
pub(crate) fn get_or_create_session(
group: &str,
config_path: Option<&str>,
) -> Result<zenoh::Session, zenoh::Error> {
let mut registry = SESSION_REGISTRY.lock().unwrap();
if let Some(session) = registry.get(group) {
return Ok(session.clone());
}
let config = match config_path {
Some(path) => zenoh::Config::from_file(path)?,
None => zenoh::Config::default(),
};
let session = zenoh::open(config).wait()?;
registry.insert(group.to_string(), session.clone());
Ok(session)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_session_group_reuse() {
let session1 =
get_or_create_session("test-reuse-group", None).expect("Failed to create session");
let session2 =
get_or_create_session("test-reuse-group", None).expect("Failed to get session");
assert_eq!(session1.zid(), session2.zid());
}
#[test]
fn test_different_groups_different_sessions() {
let session1 =
get_or_create_session("test-group-x", None).expect("Failed to create session");
let session2 =
get_or_create_session("test-group-y", None).expect("Failed to create session");
assert_ne!(session1.zid(), session2.zid());
}
}