rust_p2p_core/idle/
mod.rs1use 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 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}