use anyhow::Result;
use async_trait::async_trait;
use multicast_discovery::PeerInfo;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use std::time::Duration;
use runar_schemas::NodeMetadata;
pub mod memory_discovery;
pub mod mock;
pub mod multicast_discovery;
pub use memory_discovery::MemoryDiscovery;
pub use mock::MockNodeDiscovery;
pub use multicast_discovery::MulticastDiscovery;
#[derive(Clone, Debug)]
pub struct DiscoveryOptions {
pub announce_interval: Duration,
pub discovery_timeout: Duration,
pub node_ttl: Duration,
pub debounce_window: Duration,
pub use_multicast: bool,
pub local_network_only: bool,
pub multicast_group: String,
}
impl Default for DiscoveryOptions {
fn default() -> Self {
Self {
announce_interval: Duration::from_secs(5),
discovery_timeout: Duration::from_secs(10),
node_ttl: Duration::from_secs(300),
debounce_window: Duration::from_millis(400),
use_multicast: true,
local_network_only: true,
multicast_group: DEFAULT_MULTICAST_ADDR.to_string(),
}
}
}
pub const DEFAULT_MULTICAST_ADDR: &str = "239.255.42.98";
#[derive(Clone, Serialize, Deserialize, Debug)]
pub struct NodeInfo {
pub node_public_key: Vec<u8>,
pub network_ids: Vec<String>,
pub addresses: Vec<String>,
pub node_metadata: NodeMetadata,
pub version: i64,
}
use std::future::Future;
use std::pin::Pin;
#[derive(Clone, Debug)]
pub enum DiscoveryEvent {
Discovered(PeerInfo),
Updated(PeerInfo),
Lost(String), }
pub type DiscoveryListener =
Arc<dyn Fn(DiscoveryEvent) -> Pin<Box<dyn Future<Output = ()> + Send>> + Send + Sync>;
#[async_trait]
pub trait NodeDiscovery: Send + Sync {
async fn init(&self, options: DiscoveryOptions) -> Result<()>;
async fn start_announcing(&self) -> Result<()>;
async fn stop_announcing(&self) -> Result<()>;
async fn subscribe(&self, listener: DiscoveryListener) -> Result<()>;
async fn shutdown(&self) -> Result<()>;
async fn update_local_node_info(&self, new_node_info: NodeInfo) -> Result<()>;
}