Skip to main content

forge_core/config/
rate_limit.rs

1//! Rate-limiter configuration.
2
3use serde::{Deserialize, Serialize};
4
5/// Rate-limiter mode selector.
6#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum RateLimitMode {
9    /// Per-node DashMap fast path with PG fallback for `Global` keys.
10    /// User/IP limits are approximate across N nodes — right for DDoS protection.
11    #[default]
12    Hybrid,
13    /// Every check round-trips to PG. Cluster-wide correct — right for billing-grade quotas.
14    Strict,
15}
16
17/// `[rate_limit]` configuration.
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[non_exhaustive]
20pub struct RateLimitSettings {
21    /// Rate-limiter mode. Defaults to `hybrid`.
22    #[serde(default)]
23    pub mode: RateLimitMode,
24
25    /// Maximum local (in-memory) rate limit buckets before eviction.
26    #[serde(default = "default_max_local_buckets")]
27    pub max_local_buckets: usize,
28}
29
30impl Default for RateLimitSettings {
31    fn default() -> Self {
32        Self {
33            mode: RateLimitMode::default(),
34            max_local_buckets: default_max_local_buckets(),
35        }
36    }
37}
38
39fn default_max_local_buckets() -> usize {
40    100_000
41}