1use governor::{DefaultDirectRateLimiter, Quota};
2use std::num::NonZeroU32;
3use std::time::Duration;
4
5#[derive(Debug)]
7pub struct Limiter {
8 pub read: DefaultDirectRateLimiter,
9 pub write: DefaultDirectRateLimiter,
10 pub write_doc_content: DefaultDirectRateLimiter,
11 pub list_docs: DefaultDirectRateLimiter,
12 pub read_analytics: DefaultDirectRateLimiter,
13}
14
15const BUFFER: u64 = 1;
17
18impl Default for Limiter {
19 fn default() -> Self {
20 let read = make_burst_limiter(100, Duration::from_secs(6 + BUFFER));
21 let write = make_burst_limiter(10, Duration::from_secs(6 + BUFFER));
22 let write_doc_content = make_burst_limiter(5, Duration::from_secs(10 + BUFFER));
23 let list_docs = make_burst_limiter(4, Duration::from_secs(6 + BUFFER));
24 let read_analytics = make_burst_limiter(100, Duration::from_secs(6 + BUFFER));
25 Self {
26 read,
27 write,
28 write_doc_content,
29 list_docs,
30 read_analytics,
31 }
32 }
33}
34
35fn make_burst_limiter(burst: u32, period: Duration) -> DefaultDirectRateLimiter {
36 let burst = NonZeroU32::new(burst).expect("burst must be non-zero");
37 let quota = Quota::with_period(period)
38 .expect("period must be non-zero")
39 .allow_burst(burst);
40 DefaultDirectRateLimiter::direct(quota)
41}