mod limiter;
mod strategies;
mod types;
mod utils;
#[cfg(test)]
mod tests;
#[cfg(test)]
pub(crate) use limiter::RateLimitRecordSource;
pub(crate) use limiter::RateLimitReservation;
pub use limiter::{RateLimiter, render_degraded_metrics};
pub use types::RateLimitResult;
use crate::config::models::rate_limit::RateLimitConfig;
use std::sync::Arc;
static GLOBAL_RATE_LIMITER: std::sync::OnceLock<Arc<RateLimiter>> = std::sync::OnceLock::new();
pub fn init_global_rate_limiter(config: RateLimitConfig) {
let limiter = Arc::new(RateLimiter::new(config));
let _ = GLOBAL_RATE_LIMITER.set(limiter.clone());
limiter.start_cleanup_task();
}
#[cfg(feature = "gateway")]
pub fn init_global_rate_limiter_with_redis(
config: RateLimitConfig,
redis: Arc<crate::storage::redis::RedisPool>,
) {
let limiter = Arc::new(RateLimiter::with_redis(config, redis));
let _ = GLOBAL_RATE_LIMITER.set(limiter.clone());
limiter.start_cleanup_task();
}
pub fn get_global_rate_limiter() -> Option<Arc<RateLimiter>> {
GLOBAL_RATE_LIMITER.get().cloned()
}