use crate::{Heartbeat, Inbound, Outbound};
use snarkos_node_tcp::{
P2P,
protocols::{Disconnect, Handshake, OnConnect, Writing},
};
use snarkvm::prelude::Network;
use std::time::Instant;
#[async_trait]
pub trait Routing<N: Network>:
P2P + Disconnect + OnConnect + Handshake + Inbound<N> + Outbound<N> + Heartbeat<N>
{
async fn initialize_routing(&self) {
self.enable_handshake().await;
self.enable_reading().await;
self.router().enable_writing().await;
self.enable_disconnect().await;
self.enable_on_connect().await;
self.enable_listener().await;
self.initialize_heartbeat();
}
async fn enable_listener(&self) {
let listen_addr = self.tcp().enable_listener().await.expect("Failed to enable the TCP listener");
debug!("Listening for peer connections at address {listen_addr:?}");
}
fn initialize_heartbeat(&self) {
let self_clone = self.clone();
self.router().spawn(async move {
loop {
let start = Instant::now();
self_clone.heartbeat().await;
let took = start.elapsed();
let sleep_time = Self::HEARTBEAT_INTERVAL.saturating_sub(took);
tokio::time::sleep(sleep_time).await;
}
});
}
}