cloudillo_core/rate_limit/
config.rs1use std::num::NonZeroU32;
7use std::time::Duration;
8
9#[derive(Clone, Debug)]
11pub struct RateLimitTierConfig {
12 pub short_term_rps: NonZeroU32,
15 pub short_term_burst: NonZeroU32,
17
18 pub long_term_rph: NonZeroU32,
21 pub long_term_burst: NonZeroU32,
23}
24
25impl RateLimitTierConfig {
26 pub fn new(short_rps: u32, short_burst: u32, long_rph: u32, long_burst: u32) -> Self {
27 Self {
28 short_term_rps: NonZeroU32::new(short_rps).unwrap_or(NonZeroU32::MIN),
29 short_term_burst: NonZeroU32::new(short_burst).unwrap_or(NonZeroU32::MIN),
30 long_term_rph: NonZeroU32::new(long_rph).unwrap_or(NonZeroU32::MIN),
31 long_term_burst: NonZeroU32::new(long_burst).unwrap_or(NonZeroU32::MIN),
32 }
33 }
34}
35
36#[derive(Clone, Debug)]
38pub struct EndpointCategoryConfig {
39 pub name: &'static str,
41 pub ipv4_individual: RateLimitTierConfig,
43 pub ipv4_network: RateLimitTierConfig,
45 pub ipv6_subnet: RateLimitTierConfig,
47 pub ipv6_provider: RateLimitTierConfig,
49}
50
51#[derive(Clone, Debug)]
53pub struct RateLimitConfig {
54 pub auth: EndpointCategoryConfig,
56 pub federation: EndpointCategoryConfig,
58 pub general: EndpointCategoryConfig,
60 pub websocket: EndpointCategoryConfig,
62 pub max_tracked_ips: usize,
64 pub entry_ttl: Duration,
66}
67
68impl Default for RateLimitConfig {
69 fn default() -> Self {
70 Self {
71 auth: EndpointCategoryConfig {
72 name: "auth",
73 ipv4_individual: RateLimitTierConfig::new(20, 50, 100, 200),
75 ipv4_network: RateLimitTierConfig::new(50, 100, 300, 500),
76 ipv6_subnet: RateLimitTierConfig::new(20, 50, 100, 200),
77 ipv6_provider: RateLimitTierConfig::new(50, 100, 300, 500),
78 },
79 federation: EndpointCategoryConfig {
80 name: "federation",
81 ipv4_individual: RateLimitTierConfig::new(100, 200, 1000, 100),
83 ipv4_network: RateLimitTierConfig::new(500, 750, 5000, 500),
84 ipv6_subnet: RateLimitTierConfig::new(100, 200, 1000, 100),
85 ipv6_provider: RateLimitTierConfig::new(500, 750, 5000, 500),
86 },
87 general: EndpointCategoryConfig {
88 name: "general",
89 ipv4_individual: RateLimitTierConfig::new(300, 500, 5000, 500),
91 ipv4_network: RateLimitTierConfig::new(600, 1000, 50000, 5000),
92 ipv6_subnet: RateLimitTierConfig::new(300, 500, 5000, 500),
93 ipv6_provider: RateLimitTierConfig::new(600, 1000, 50000, 5000),
94 },
95 websocket: EndpointCategoryConfig {
96 name: "websocket",
97 ipv4_individual: RateLimitTierConfig::new(100, 200, 1000, 500),
99 ipv4_network: RateLimitTierConfig::new(100, 200, 1000, 500),
100 ipv6_subnet: RateLimitTierConfig::new(100, 200, 1000, 500),
101 ipv6_provider: RateLimitTierConfig::new(100, 200, 1000, 500),
102 },
103 max_tracked_ips: 100_000,
104 entry_ttl: Duration::from_secs(3600), }
106 }
107}
108
109#[derive(Clone, Debug)]
111pub struct PowConfig {
112 pub max_counter: u32,
114 pub decay_interval_secs: u64,
116 pub max_individual_entries: usize,
118 pub max_network_entries: usize,
120}
121
122impl Default for PowConfig {
123 fn default() -> Self {
124 Self {
125 max_counter: 10, decay_interval_secs: 3600, max_individual_entries: 50_000,
128 max_network_entries: 10_000,
129 }
130 }
131}
132
133