use bytesize::ByteSize;
use leaky_bucket::RateLimiter;
use std::time::Duration;
pub mod bbr;
const BANDWIDTH_LIMITER_REFILLS_PER_SECOND: u32 = 10;
pub fn new_bandwidth_limiter(limit: ByteSize) -> RateLimiter {
let refill = (limit.as_u64() / BANDWIDTH_LIMITER_REFILLS_PER_SECOND as u64) as usize;
RateLimiter::builder()
.initial(refill)
.refill(refill)
.max(refill)
.interval(Duration::from_secs(1) / BANDWIDTH_LIMITER_REFILLS_PER_SECOND)
.fair(true)
.build()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_bandwidth_limiter_refills_a_tenth_of_the_limit_every_100ms() {
let test_cases = vec![(ByteSize::b(1000), 100), (ByteSize::gb(1), 100_000_000)];
for (limit, refill) in test_cases {
let limiter = new_bandwidth_limiter(limit);
assert_eq!(limiter.refill(), refill);
assert_eq!(limiter.max(), refill);
assert_eq!(limiter.balance(), refill);
assert_eq!(limiter.interval(), Duration::from_millis(100));
assert!(limiter.is_fair());
}
}
}