use redis::aio::ConnectionManager;
use crate::{
AbsoluteRedisRateLimiter, HardLimitFactor, RateGroupSizeMs, RedisKey,
SuppressedRedisRateLimiter, TrypemaError, WindowSizeSeconds, common::SuppressionFactorCacheMs,
hybrid::SyncIntervalMs,
};
#[derive(Clone, Debug)]
pub struct RedisRateLimiterOptions {
pub connection_manager: ConnectionManager,
pub prefix: Option<RedisKey>,
pub window_size_seconds: WindowSizeSeconds,
pub rate_group_size_ms: RateGroupSizeMs,
pub hard_limit_factor: HardLimitFactor,
pub suppression_factor_cache_ms: SuppressionFactorCacheMs,
pub sync_interval_ms: SyncIntervalMs,
}
impl RedisRateLimiterOptions {
pub fn new(connection_manager: ConnectionManager) -> Self {
Self {
connection_manager,
prefix: None,
window_size_seconds: WindowSizeSeconds::default(),
rate_group_size_ms: RateGroupSizeMs::default(),
hard_limit_factor: HardLimitFactor::default(),
suppression_factor_cache_ms: SuppressionFactorCacheMs::default(),
sync_interval_ms: SyncIntervalMs::default(),
}
}
}
#[derive(Clone, Debug)]
pub struct RedisRateLimiterProvider {
absolute: AbsoluteRedisRateLimiter,
suppressed: SuppressedRedisRateLimiter,
}
impl RedisRateLimiterProvider {
pub(crate) fn new(options: RedisRateLimiterOptions) -> Self {
Self {
absolute: AbsoluteRedisRateLimiter::new(options.clone()),
suppressed: SuppressedRedisRateLimiter::new(options),
}
}
pub fn absolute(&self) -> &AbsoluteRedisRateLimiter {
&self.absolute
}
pub fn suppressed(&self) -> &SuppressedRedisRateLimiter {
&self.suppressed
}
pub(crate) async fn cleanup(&self, stale_after_ms: u64) -> Result<(), TrypemaError> {
self.absolute.cleanup(stale_after_ms).await?;
self.suppressed.cleanup(stale_after_ms).await
}
}