use alloy_primitives::Address;
use futures::future::OptionFuture;
use kona_p2p::{ConnectionGater, Discv5Driver, GossipDriver, PEER_SCORE_INSPECT_FREQUENCY};
use kona_sources::{BlockSigner, BlockSignerStartError};
use libp2p::TransportError;
use tokio::sync::watch;
use crate::actors::network::handler::NetworkHandler;
#[derive(Debug)]
pub struct NetworkDriver {
pub gossip: GossipDriver<ConnectionGater>,
pub discovery: Discv5Driver,
pub unsafe_block_signer_sender: watch::Sender<Address>,
pub signer: Option<BlockSigner>,
}
#[derive(Debug, thiserror::Error)]
pub enum NetworkDriverError {
#[error("error starting libp2p Swarm")]
GossipStartError(#[from] TransportError<std::io::Error>),
#[error("error starting block signer client: {0}")]
BlockSignerStartError(#[from] BlockSignerStartError),
}
impl NetworkDriver {
pub async fn start(mut self) -> Result<NetworkHandler, NetworkDriverError> {
let (handler, enr_receiver) = self.discovery.start();
self.gossip.start().await?;
let peer_score_inspector = tokio::time::interval(*PEER_SCORE_INSPECT_FREQUENCY);
let signer =
OptionFuture::from(self.signer.map(async |s| s.start().await)).await.transpose()?;
Ok(NetworkHandler {
gossip: self.gossip,
discovery: handler,
enr_receiver,
unsafe_block_signer_sender: self.unsafe_block_signer_sender,
peer_score_inspector,
signer,
})
}
}