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 dav: EndpointCategoryConfig,
61 pub federation: EndpointCategoryConfig,
63 pub general: EndpointCategoryConfig,
65 pub websocket: EndpointCategoryConfig,
67 pub max_tracked_ips: usize,
69 pub entry_ttl: Duration,
71}
72
73impl Default for RateLimitConfig {
74 fn default() -> Self {
75 Self {
76 auth: EndpointCategoryConfig {
77 name: "auth",
78 ipv4_individual: RateLimitTierConfig::new(5, 10, 60, 60),
80 ipv4_network: RateLimitTierConfig::new(15, 30, 200, 200),
81 ipv6_subnet: RateLimitTierConfig::new(5, 10, 60, 60),
82 ipv6_provider: RateLimitTierConfig::new(15, 30, 200, 200),
83 },
84 dav: EndpointCategoryConfig {
85 name: "dav",
86 ipv4_individual: RateLimitTierConfig::new(30, 60, 2000, 500),
93 ipv4_network: RateLimitTierConfig::new(60, 120, 5000, 1000),
94 ipv6_subnet: RateLimitTierConfig::new(30, 60, 2000, 500),
95 ipv6_provider: RateLimitTierConfig::new(60, 120, 5000, 1000),
96 },
97 federation: EndpointCategoryConfig {
98 name: "federation",
99 ipv4_individual: RateLimitTierConfig::new(100, 200, 1000, 100),
101 ipv4_network: RateLimitTierConfig::new(500, 750, 5000, 500),
102 ipv6_subnet: RateLimitTierConfig::new(100, 200, 1000, 100),
103 ipv6_provider: RateLimitTierConfig::new(500, 750, 5000, 500),
104 },
105 general: EndpointCategoryConfig {
106 name: "general",
107 ipv4_individual: RateLimitTierConfig::new(300, 500, 5000, 500),
109 ipv4_network: RateLimitTierConfig::new(600, 1000, 50000, 5000),
110 ipv6_subnet: RateLimitTierConfig::new(300, 500, 5000, 500),
111 ipv6_provider: RateLimitTierConfig::new(600, 1000, 50000, 5000),
112 },
113 websocket: EndpointCategoryConfig {
114 name: "websocket",
115 ipv4_individual: RateLimitTierConfig::new(100, 200, 1000, 500),
117 ipv4_network: RateLimitTierConfig::new(100, 200, 1000, 500),
118 ipv6_subnet: RateLimitTierConfig::new(100, 200, 1000, 500),
119 ipv6_provider: RateLimitTierConfig::new(100, 200, 1000, 500),
120 },
121 max_tracked_ips: 100_000,
122 entry_ttl: Duration::from_hours(1),
123 }
124 }
125}
126
127#[derive(Clone, Debug)]
129pub struct PowConfig {
130 pub max_counter: u32,
132 pub decay_interval_secs: u64,
134 pub max_individual_entries: usize,
136 pub max_network_entries: usize,
138}
139
140impl Default for PowConfig {
141 fn default() -> Self {
142 Self {
143 max_counter: 10, decay_interval_secs: 3600, max_individual_entries: 50_000,
146 max_network_entries: 10_000,
147 }
148 }
149}
150
151