coda_api/
limiter.rs

1use governor::{DefaultDirectRateLimiter, Quota};
2use std::num::NonZeroU32;
3use std::time::Duration;
4
5/// The rate limits are slightly lower compared to official docs because I've seen "429 Too Many Requests" errors even with these rate limits
6#[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
15/// Buffer added to official rate limits
16const 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}