rust_p2p_core/idle/
mod.rs

1use std::hash::Hash;
2use std::time::{Duration, Instant};
3
4use crate::route::route_table::{Route, RouteTable};
5use crate::route::RouteKey;
6
7pub struct IdleRouteManager<PeerID> {
8    read_idle: Duration,
9    route_table: RouteTable<PeerID>,
10}
11
12impl<PeerID: Hash + Eq + Clone> IdleRouteManager<PeerID> {
13    pub fn new(read_idle: Duration, route_table: RouteTable<PeerID>) -> IdleRouteManager<PeerID> {
14        Self {
15            read_idle,
16            route_table,
17        }
18    }
19    /// Take the timeout routes from the managed route_table
20    pub async fn next_idle(&self) -> (PeerID, Route, Instant) {
21        loop {
22            let time = if let Some((peer_id, route, instant)) = self.route_table.oldest_route() {
23                let time = Instant::now().saturating_duration_since(instant);
24                if time > self.read_idle {
25                    return (peer_id, route, instant);
26                }
27                time
28            } else {
29                self.read_idle
30            };
31            tokio::time::sleep(time.max(Duration::from_millis(1))).await;
32        }
33    }
34    pub fn delay(&self, peer_id: &PeerID, route_key: &RouteKey) -> bool {
35        self.route_table.update_read_time(peer_id, route_key)
36    }
37    pub fn remove_route(&self, peer_id: &PeerID, route_key: &RouteKey) {
38        self.route_table.remove_route(peer_id, route_key)
39    }
40}