1use quanta::Instant;
7use std::sync::Arc;
8use std::time::Duration;
9use tokio::sync::Mutex;
10use tokio::time::Interval;
11
12pub mod optimized_rate_limiter;
14pub use optimized_rate_limiter::OptimizedRateLimiter;
15
16pub mod lockfree_rate_limiter;
18pub use lockfree_rate_limiter::{LockFreeRateLimiter, TokenGuard};
19
20pub mod helpers;
22pub use helpers::*;
23
24#[derive(Debug)]
26pub struct RateLimiter {
27 #[allow(dead_code)]
29 interval: Mutex<Interval>,
30 max_requests: usize,
32 time_window: Duration,
34 state: Arc<Mutex<RateLimitState>>,
36}
37
38impl Clone for RateLimiter {
39 fn clone(&self) -> Self {
40 Self {
41 interval: Mutex::new(tokio::time::interval(
42 self.time_window / self.max_requests as u32,
43 )),
44 max_requests: self.max_requests,
45 time_window: self.time_window,
46 state: self.state.clone(),
47 }
48 }
49}
50
51#[derive(Debug)]
53pub struct RateLimitState {
54 request_count: usize,
56 window_start: Instant,
58}
59
60impl RateLimiter {
61 #[must_use]
63 pub fn new(max_requests: usize, time_window: Duration) -> Self {
64 Self {
65 interval: Mutex::new(tokio::time::interval(time_window / max_requests as u32)),
66 max_requests,
67 time_window,
68 state: Arc::new(Mutex::new(RateLimitState {
69 request_count: 0,
70 window_start: Instant::now(),
71 })),
72 }
73 }
74
75 pub async fn wait(&self) {
77 let mut interval = self.interval.lock().await;
78 interval.tick().await;
79
80 let mut state = self.state.lock().await;
81
82 if state.window_start.elapsed() > self.time_window {
84 state.request_count = 0;
85 state.window_start = Instant::now();
86 }
87
88 if state.request_count >= self.max_requests {
90 let window_end = state.window_start.elapsed() + self.time_window;
91 drop(state); tokio::time::sleep(window_end).await;
93 state = self.state.lock().await; }
96 state.request_count += 1;
97 }
98
99 pub async fn force_lock(&self) {
101 let mut state = self.state.lock().await;
102 state.request_count = self.max_requests;
103 drop(state); }
105}