use std::net::SocketAddr;
use iroh::SecretKey;
use tokio::sync::watch;
use crate::zakura::{ZakuraHandshakeConfig, ZakuraPeerId};
use super::protocol::{
DiscoveryWireError, ZakuraDiscoveryConfig, ZakuraDiscoveryHandle, ZakuraDiscoveryLocalConfig,
ZakuraServiceId, DEFAULT_DISCOVERY_CONNECTION_HEADROOM,
};
pub(crate) fn default_advertised_services() -> Vec<ZakuraServiceId> {
vec![
ZakuraServiceId::discovery(),
ZakuraServiceId::block_sync(),
ZakuraServiceId::header_sync(),
ZakuraServiceId::legacy_gossip(),
ZakuraServiceId::legacy_requests(),
ZakuraServiceId::service_discovery(),
]
}
pub(crate) fn effective_discovery_connection_headroom(bootstrap_peer_count: usize) -> usize {
DEFAULT_DISCOVERY_CONNECTION_HEADROOM.max(bootstrap_peer_count)
}
#[allow(clippy::too_many_arguments)]
pub(crate) fn build_discovery_handle(
secret_key: SecretKey,
direct_addrs: Vec<SocketAddr>,
advertised_services: Vec<ZakuraServiceId>,
handshake: &ZakuraHandshakeConfig,
max_zakura_connections: usize,
bootstrap_peer_count: usize,
connected: watch::Receiver<Vec<ZakuraPeerId>>,
) -> Result<ZakuraDiscoveryHandle, DiscoveryWireError> {
let local_config = ZakuraDiscoveryLocalConfig {
secret_key,
direct_addrs,
services: advertised_services,
zakura_protocol_min: handshake.zakura_protocol_min,
zakura_protocol_max: handshake.zakura_protocol_max,
network_id: handshake.network_id,
chain_id: handshake.chain_id,
last_authored_sequence: None,
};
let config = ZakuraDiscoveryConfig {
max_zakura_connections,
discovery_connection_headroom: effective_discovery_connection_headroom(
bootstrap_peer_count,
),
..ZakuraDiscoveryConfig::default()
};
ZakuraDiscoveryHandle::new(local_config, config, connected)
}