use crust::PeerId;
use lru_time_cache::LruCache;
use maidsafe_utilities;
use std::time::Duration;
use message_filter::MessageFilter;
use messages::SignedMessage;
const INCOMING_EXPIRY_DURATION_SECS: u64 = 60 * 20;
const OUTGOING_EXPIRY_DURATION_SECS: u64 = 60 * 10;
pub struct SignedMessageFilter {
incoming: MessageFilter<SignedMessage>,
outgoing: LruCache<(u64, PeerId, u8), ()>,
}
impl SignedMessageFilter {
pub fn new() -> Self {
let incoming_duration = Duration::from_secs(INCOMING_EXPIRY_DURATION_SECS);
let outgoing_duration = Duration::from_secs(OUTGOING_EXPIRY_DURATION_SECS);
SignedMessageFilter {
incoming: MessageFilter::with_expiry_duration(incoming_duration),
outgoing: LruCache::with_expiry_duration(outgoing_duration),
}
}
pub fn filter_incoming(&mut self, msg: &SignedMessage) -> usize {
self.incoming.insert(msg)
}
pub fn filter_outgoing(&mut self, msg: &SignedMessage, peer_id: &PeerId, route: u8) -> bool {
let hash = maidsafe_utilities::big_endian_sip_hash(msg);
self.outgoing.insert((hash, *peer_id, route), ()).is_some()
}
#[cfg(feature = "use-mock-crust")]
pub fn clear(&mut self) {
self.incoming.clear();
self.outgoing.clear();
}
}