use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub enum FederationMode {
#[default]
Hub,
Leaf {
hub_endpoint: String,
},
Mesh {
peers: Vec<String>,
},
}
#[derive(Debug, Clone)]
pub struct FederationConfig {
pub mode: FederationMode,
pub router_id: String,
pub owned_namespaces: Vec<String>,
pub auth_token: Option<String>,
pub auto_reconnect: bool,
pub reconnect_delay: Duration,
pub max_reconnect_attempts: u32,
pub sync_interval: Duration,
pub client_name: String,
pub features: Vec<String>,
}
impl Default for FederationConfig {
fn default() -> Self {
Self {
mode: FederationMode::Hub,
router_id: uuid::Uuid::new_v4().to_string(),
owned_namespaces: vec!["/**".to_string()],
auth_token: None,
auto_reconnect: true,
reconnect_delay: Duration::from_secs(5),
max_reconnect_attempts: 0,
sync_interval: Duration::from_secs(30),
client_name: "clasp-federation".to_string(),
features: vec![
"param".to_string(),
"event".to_string(),
"stream".to_string(),
"federation".to_string(),
],
}
}
}
#[derive(Debug, Clone)]
pub struct PeerInfo {
pub router_id: String,
pub session_id: Option<String>,
pub namespaces: Vec<String>,
pub endpoint: Option<String>,
pub outbound: bool,
pub state: PeerState,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PeerState {
Connecting,
Handshaking,
Syncing,
Active,
Disconnected,
Failed,
}