#token-bucket #rate-limiting #stream #rate #synchronous #byte-stream

stream_limiter

Synchronously speed-limiting streams based on token bucket algorithm

8 stable releases

3.2.0 Jul 3, 2023
3.1.1 Jul 3, 2023
3.0.1 Jun 19, 2023
2.0.0 May 22, 2023
1.0.0 Feb 24, 2023

#7 in #rate

Download history 5/week @ 2023-12-25 198/week @ 2024-01-01 481/week @ 2024-01-08 502/week @ 2024-01-15 112/week @ 2024-01-22 41/week @ 2024-01-29 50/week @ 2024-02-05 80/week @ 2024-02-12 36/week @ 2024-02-19 60/week @ 2024-02-26 70/week @ 2024-03-04 60/week @ 2024-03-11 67/week @ 2024-03-18 296/week @ 2024-03-25 111/week @ 2024-04-01

555 downloads per month

MIT/Apache

44KB
1K SLoC

stream_limiter

Synchronously speed-limiting streams.

This crate provides a Limiter struct that can be used to limit the rate at which a stream can be read or written.

This crate is based on the token bucket algorithm. When we want to read data and we are rate limited the packet aren't drop but we sleep.

Example:

    use stream_limiter::Limiter;
    use std::time::Duration;
    use std::io::prelude::*;
    use std::fs::File;

    let mut file = File::open("tests/resources/test.txt").unwrap();
    let mut limiter = Limiter::new(file, 1, Duration::from_secs(1));
    let mut buf = [0u8; 10];
    let now = std::time::Instant::now();
    limiter.read(&mut buf).unwrap();
    assert_eq!(now.elapsed().as_secs(), 9);

lib.rs:

This crate provides a Limiter struct that can be used to limit the rate at which a stream can be read or written. This crate is based on the token bucket algorithm. When we want to read data and we are rate limited the packet aren't drop but we sleep. Example:

use stream_limiter::{Limiter, LimiterOptions};
use std::time::Duration;
use std::io::prelude::*;
use std::fs::File;

let mut file = File::open("test_resources/test.txt").unwrap();
let mut limiter = Limiter::new(file, Some(LimiterOptions::new(1, Duration::from_secs(1), 1)), None);
let mut buf = [0u8; 10];
let now = std::time::Instant::now();
limiter.read(&mut buf).unwrap();
assert_eq!(now.elapsed().as_secs(), 10);

No runtime deps