use std::time::Duration;
use governor::{clock::QuantaInstant, middleware::NoOpMiddleware};
use tower_governor::{
governor::GovernorConfigBuilder, key_extractor::PeerIpKeyExtractor, GovernorLayer,
};
pub fn create() -> GovernorLayer<'static, PeerIpKeyExtractor, NoOpMiddleware<QuantaInstant>> {
let governor_conf = GovernorConfigBuilder::default()
.per_second(4)
.burst_size(2)
.finish()
.expect("failed to build rate-limiting governor");
let governor_conf = Box::leak(Box::new(governor_conf));
let gc_interval = Duration::from_secs(60);
let governor_limiter = governor_conf.limiter().clone();
std::thread::spawn(move || loop {
std::thread::sleep(gc_interval);
tracing::debug!("rate limiting storage size: {}", governor_limiter.len());
governor_limiter.retain_recent();
});
GovernorLayer {
config: &*governor_conf,
}
}