[Add] Structure

This commit is contained in:
Alex Emmet 2026-07-20 22:21:43 +02:00
commit 826fb9ce50
44 changed files with 2210 additions and 2721 deletions

65
src/config.rs Normal file
View file

@ -0,0 +1,65 @@
use std::{env, time::Duration};
#[derive(Clone, Debug)]
pub struct RateLimitConfig {
pub window: Duration,
pub general_requests: usize,
pub registration_requests: usize,
pub transport_connections: usize,
pub transport_connections_per_ip: usize,
}
pub fn cors_origin() -> String {
env::var("CORS_ORIGIN").unwrap_or_else(|_| "https://tensamin.net".to_string())
}
impl Default for RateLimitConfig {
fn default() -> Self {
Self {
window: Duration::from_secs(60),
general_requests: 120,
registration_requests: 20,
transport_connections: 512,
transport_connections_per_ip: 32,
}
}
}
impl RateLimitConfig {
pub fn from_env() -> Self {
let defaults = Self::default();
Self {
window: env_duration("RATE_LIMIT_WINDOW_SECONDS", defaults.window),
general_requests: env_usize("RATE_LIMIT_GENERAL_REQUESTS", defaults.general_requests),
registration_requests: env_usize(
"RATE_LIMIT_REGISTRATION_REQUESTS",
defaults.registration_requests,
),
transport_connections: env_usize(
"RATE_LIMIT_TRANSPORT_CONNECTIONS",
defaults.transport_connections,
),
transport_connections_per_ip: env_usize(
"RATE_LIMIT_TRANSPORT_CONNECTIONS_PER_IP",
defaults.transport_connections_per_ip,
),
}
}
}
fn env_usize(name: &str, fallback: usize) -> usize {
env::var(name)
.ok()
.and_then(|value| value.parse::<usize>().ok())
.filter(|value| *value > 0)
.unwrap_or(fallback)
}
fn env_duration(name: &str, fallback: Duration) -> Duration {
env::var(name)
.ok()
.and_then(|value| value.parse::<u64>().ok())
.filter(|value| *value > 0)
.map(Duration::from_secs)
.unwrap_or(fallback)
}