cloudillo_core/rate_limit/
config.rs1use std::num::NonZeroU32;
10use std::time::Duration;
11
12#[derive(Clone, Debug)]
14pub struct RateLimitTierConfig {
15 pub short_term_rps: NonZeroU32,
18 pub short_term_burst: NonZeroU32,
20
21 pub long_term_rph: NonZeroU32,
24 pub long_term_burst: NonZeroU32,
26}
27
28impl RateLimitTierConfig {
29 pub fn new(short_rps: u32, short_burst: u32, long_rph: u32, long_burst: u32) -> Self {
30 Self {
31 short_term_rps: NonZeroU32::new(short_rps).unwrap_or(NonZeroU32::MIN),
32 short_term_burst: NonZeroU32::new(short_burst).unwrap_or(NonZeroU32::MIN),
33 long_term_rph: NonZeroU32::new(long_rph).unwrap_or(NonZeroU32::MIN),
34 long_term_burst: NonZeroU32::new(long_burst).unwrap_or(NonZeroU32::MIN),
35 }
36 }
37}
38
39#[derive(Clone, Debug)]
41pub struct EndpointCategoryConfig {
42 pub name: &'static str,
44 pub ipv4_individual: RateLimitTierConfig,
46 pub ipv4_network: RateLimitTierConfig,
48 pub ipv6_subnet: RateLimitTierConfig,
50 pub ipv6_provider: RateLimitTierConfig,
52}
53
54#[derive(Clone, Debug)]
56pub struct RateLimitConfig {
57 pub auth: EndpointCategoryConfig,
59 pub federation: EndpointCategoryConfig,
61 pub general: EndpointCategoryConfig,
63 pub websocket: EndpointCategoryConfig,
65 pub max_tracked_ips: usize,
67 pub entry_ttl: Duration,
69}
70
71impl Default for RateLimitConfig {
72 fn default() -> Self {
73 Self {
74 auth: EndpointCategoryConfig {
75 name: "auth",
76 ipv4_individual: RateLimitTierConfig::new(5, 10, 60, 60),
78 ipv4_network: RateLimitTierConfig::new(15, 30, 200, 200),
79 ipv6_subnet: RateLimitTierConfig::new(5, 10, 60, 60),
80 ipv6_provider: RateLimitTierConfig::new(15, 30, 200, 200),
81 },
82 federation: EndpointCategoryConfig {
83 name: "federation",
84 ipv4_individual: RateLimitTierConfig::new(100, 200, 1000, 100),
86 ipv4_network: RateLimitTierConfig::new(500, 750, 5000, 500),
87 ipv6_subnet: RateLimitTierConfig::new(100, 200, 1000, 100),
88 ipv6_provider: RateLimitTierConfig::new(500, 750, 5000, 500),
89 },
90 general: EndpointCategoryConfig {
91 name: "general",
92 ipv4_individual: RateLimitTierConfig::new(300, 500, 5000, 500),
94 ipv4_network: RateLimitTierConfig::new(600, 1000, 50000, 5000),
95 ipv6_subnet: RateLimitTierConfig::new(300, 500, 5000, 500),
96 ipv6_provider: RateLimitTierConfig::new(600, 1000, 50000, 5000),
97 },
98 websocket: EndpointCategoryConfig {
99 name: "websocket",
100 ipv4_individual: RateLimitTierConfig::new(100, 200, 1000, 500),
102 ipv4_network: RateLimitTierConfig::new(100, 200, 1000, 500),
103 ipv6_subnet: RateLimitTierConfig::new(100, 200, 1000, 500),
104 ipv6_provider: RateLimitTierConfig::new(100, 200, 1000, 500),
105 },
106 max_tracked_ips: 100_000,
107 entry_ttl: Duration::from_secs(3600), }
109 }
110}
111
112#[derive(Clone, Debug)]
114pub struct PowConfig {
115 pub max_counter: u32,
117 pub decay_interval_secs: u64,
119 pub max_individual_entries: usize,
121 pub max_network_entries: usize,
123}
124
125impl Default for PowConfig {
126 fn default() -> Self {
127 Self {
128 max_counter: 10, decay_interval_secs: 3600, max_individual_entries: 50_000,
131 max_network_entries: 10_000,
132 }
133 }
134}
135
136