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 search: EndpointCategoryConfig,
68 pub websocket: EndpointCategoryConfig,
70 pub max_tracked_ips: usize,
72 pub entry_ttl: Duration,
74}
75
76impl Default for RateLimitConfig {
77 fn default() -> Self {
78 Self {
79 auth: EndpointCategoryConfig {
80 name: "auth",
81 ipv4_individual: RateLimitTierConfig::new(5, 10, 60, 60),
83 ipv4_network: RateLimitTierConfig::new(15, 30, 200, 200),
84 ipv6_subnet: RateLimitTierConfig::new(5, 10, 60, 60),
85 ipv6_provider: RateLimitTierConfig::new(15, 30, 200, 200),
86 },
87 dav: EndpointCategoryConfig {
88 name: "dav",
89 ipv4_individual: RateLimitTierConfig::new(30, 60, 2000, 500),
96 ipv4_network: RateLimitTierConfig::new(60, 120, 5000, 1000),
97 ipv6_subnet: RateLimitTierConfig::new(30, 60, 2000, 500),
98 ipv6_provider: RateLimitTierConfig::new(60, 120, 5000, 1000),
99 },
100 federation: EndpointCategoryConfig {
101 name: "federation",
102 ipv4_individual: RateLimitTierConfig::new(100, 200, 1000, 100),
104 ipv4_network: RateLimitTierConfig::new(500, 750, 5000, 500),
105 ipv6_subnet: RateLimitTierConfig::new(100, 200, 1000, 100),
106 ipv6_provider: RateLimitTierConfig::new(500, 750, 5000, 500),
107 },
108 general: EndpointCategoryConfig {
109 name: "general",
110 ipv4_individual: RateLimitTierConfig::new(300, 500, 5000, 500),
112 ipv4_network: RateLimitTierConfig::new(600, 1000, 50000, 5000),
113 ipv6_subnet: RateLimitTierConfig::new(300, 500, 5000, 500),
114 ipv6_provider: RateLimitTierConfig::new(600, 1000, 50000, 5000),
115 },
116 search: EndpointCategoryConfig {
117 name: "search",
118 ipv4_individual: RateLimitTierConfig::new(30, 60, 600, 100),
122 ipv4_network: RateLimitTierConfig::new(60, 120, 2000, 300),
123 ipv6_subnet: RateLimitTierConfig::new(30, 60, 600, 100),
124 ipv6_provider: RateLimitTierConfig::new(60, 120, 2000, 300),
125 },
126 websocket: EndpointCategoryConfig {
127 name: "websocket",
128 ipv4_individual: RateLimitTierConfig::new(100, 200, 1000, 500),
130 ipv4_network: RateLimitTierConfig::new(100, 200, 1000, 500),
131 ipv6_subnet: RateLimitTierConfig::new(100, 200, 1000, 500),
132 ipv6_provider: RateLimitTierConfig::new(100, 200, 1000, 500),
133 },
134 max_tracked_ips: 100_000,
135 entry_ttl: Duration::from_hours(1),
136 }
137 }
138}
139
140#[derive(Clone, Debug)]
142pub struct PowConfig {
143 pub max_counter: u32,
145 pub decay_interval_secs: u64,
147 pub max_individual_entries: usize,
149 pub max_network_entries: usize,
151}
152
153impl Default for PowConfig {
154 fn default() -> Self {
155 Self {
156 max_counter: 10, decay_interval_secs: 3600, max_individual_entries: 50_000,
159 max_network_entries: 10_000,
160 }
161 }
162}
163
164