use crate::cla::peer::ClaPeer;
use crate::routing::algorithm::{RouteEntry, RoutingAlgorithm, RoutingTable};
use crate::store::bundle_descriptor::BundleDescriptor;
use async_trait::async_trait;
use std::collections::HashSet;
#[derive(Default)]
pub struct EpidemicRouting;
#[async_trait]
impl RoutingAlgorithm for EpidemicRouting {
fn notify_new_bundle(&mut self, _descriptor: &BundleDescriptor) {
}
fn select_peers_for_forwarding<'a>(
&self,
descriptor: &BundleDescriptor,
all_peers: &'a [Box<dyn ClaPeer>],
) -> Vec<&'a dyn ClaPeer> {
let mut seen_eids = HashSet::new();
let mut result = Vec::new();
for peer in all_peers {
let eid = peer.get_peer_endpoint_id();
if !descriptor.has_been_sent_to(&eid) && seen_eids.insert(eid.clone()) {
result.push(&**peer);
}
}
result
}
async fn select_peers_for_forwarding_async<'a>(
&self,
descriptor: &BundleDescriptor,
all_peers: &'a [Box<dyn ClaPeer>],
) -> Vec<&'a dyn ClaPeer> {
let mut seen_eids = HashSet::new();
let mut result = Vec::new();
for peer in all_peers {
let eid = peer.get_peer_endpoint_id();
if !descriptor.has_been_sent_to(&eid)
&& seen_eids.insert(eid.clone())
&& peer.is_reachable().await
{
result.push(&**peer);
}
}
result
}
fn select_routes_for_forwarding(
&self,
_descriptor: &BundleDescriptor,
_routing_table: &RoutingTable,
) -> Vec<RouteEntry> {
Vec::new()
}
}