use crate::{PeerPoolHandling, Router, messages::Message};
use snarkvm::prelude::Network;
use std::net::SocketAddr;
pub trait Outbound<N: Network> {
fn router(&self) -> &Router<N>;
fn is_block_synced(&self) -> bool;
fn num_blocks_behind(&self) -> Option<u32>;
fn get_sync_speed(&self) -> f64;
fn propagate(&self, message: Message<N>, excluded_peers: &[SocketAddr]) {
let connected_peers =
self.router().filter_connected_peers(|peer| !excluded_peers.contains(&peer.listener_addr));
for addr in connected_peers.iter().map(|peer| peer.listener_addr) {
self.router().send(addr, message.clone());
}
}
fn propagate_to_validators(&self, message: Message<N>, excluded_peers: &[SocketAddr]) {
let connected_validators = self.router().filter_connected_peers(|peer| {
peer.node_type.is_validator() && !excluded_peers.contains(&peer.listener_addr)
});
for listener_addr in connected_validators.iter().map(|peer| peer.listener_addr) {
self.router().send(listener_addr, message.clone());
}
}
}