calimero-network 0.10.0

Core Calimero infrastructure and tools
Documentation
use actix::StreamHandler;
use tokio::time::Instant;
use tracing::{debug, error};

use crate::NetworkManager;

#[derive(Copy, Clone, Debug)]
pub struct RendezvousTick;

impl From<Instant> for RendezvousTick {
    fn from(_: Instant) -> Self {
        Self
    }
}

impl StreamHandler<RendezvousTick> for NetworkManager {
    fn started(&mut self, _ctx: &mut Self::Context) {
        debug!("started rendezvous tick stream");
    }

    fn handle(&mut self, _tick: RendezvousTick, _ctx: &mut Self::Context) {
        #[expect(clippy::needless_collect, reason = "Necessary here; false positive")]
        for peer_id in self
            .discovery
            .state
            .get_rendezvous_peer_ids()
            .collect::<Vec<_>>()
        {
            let Some(peer_info) = self.discovery.state.get_peer_info(&peer_id) else {
                error!(%peer_id, "Failed to lookup peer info");
                continue;
            };

            if peer_info
                .is_rendezvous_discover_throttled(self.discovery.rendezvous_config.discovery_rpm)
            {
                continue;
            }

            if !self.swarm.is_connected(&peer_id) {
                for addr in peer_info.addrs().cloned() {
                    if let Err(err) = self.swarm.dial(addr) {
                        error!(%err, "Failed to dial rendezvous peer");
                    }
                }
            } else if let Err(err) = self.rendezvous_discover(&peer_id) {
                error!(%err, "Failed to perform rendezvous discover");
            }
        }
    }

    fn finished(&mut self, _ctx: &mut Self::Context) {
        debug!("finished rendezvous tick stream");
    }
}