use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BrokerInstance {
pub path: String,
}
pub fn list() -> Vec<BrokerInstance> {
if !crate::platform::ipc::endpoint_is_filesystem_backed() {
return Vec::new();
}
{
instance_dirs()
.into_iter()
.flat_map(|dir| {
std::fs::read_dir(dir)
.into_iter()
.flat_map(|rd| rd.flatten())
.filter_map(|entry| {
let path = entry.path();
let name = path.file_name()?.to_string_lossy();
if name.starts_with("rpb-v1-") && name.ends_with(".sock") {
Some(BrokerInstance {
path: path.to_string_lossy().into_owned(),
})
} else {
None
}
})
.collect::<Vec<_>>()
})
.collect()
}
}
pub fn render_json(instances: &[BrokerInstance]) -> String {
let body = instances
.iter()
.map(|instance| {
format!(
"{{\"path\":\"{}\"}}",
crate::cleanup::json_escape(&instance.path)
)
})
.collect::<Vec<_>>()
.join(",");
format!("{{\"schema_version\":1,\"instances\":[{body}]}}")
}
fn instance_dirs() -> Vec<PathBuf> {
let mut dirs = Vec::new();
if let Some(runtime) = crate::env_vars::XDG_RUNTIME_DIR.path() {
dirs.push(runtime.join("running-process").join("broker"));
}
dirs.push(std::env::temp_dir());
dirs
}