diff --git a/src/backend/app/guards/rate_limit.py b/src/backend/app/guards/rate_limit.py index 329b259e..8b5709b4 100644 --- a/src/backend/app/guards/rate_limit.py +++ b/src/backend/app/guards/rate_limit.py @@ -1,16 +1,11 @@ import inspect from time import time_ns -from app.settings import settings from fastapi_limiter.depends import RateLimiter from pyrate_limiter import BucketFactory, Limiter, Rate, RateItem from pyrate_limiter.buckets.redis_bucket import RedisBucket -from redis.asyncio import ConnectionPool as AsyncConnectionPool -from redis.asyncio import Redis as AsyncRedis - -pool = AsyncConnectionPool.from_url(settings.REDIS_ENDPOINT) -redis_db = AsyncRedis(connection_pool=pool) +from app.singletons.redis import RedisClient class RedisBucketFactory(BucketFactory): @@ -24,7 +19,7 @@ def wrap_item(self, name: str, weight: int = 1) -> RateItem: async def get(self, item: RateItem) -> RedisBucket: bucket_key = f"rate_limit:{item.name}" if bucket_key not in self._buckets: - res = RedisBucket.init(self.rates, redis_db, bucket_key) + res = RedisBucket.init(self.rates, RedisClient.get(), bucket_key) if inspect.isawaitable(res): res = await res self._buckets[bucket_key] = res diff --git a/src/backend/app/managers/websocket.py b/src/backend/app/managers/websocket.py index d6183531..d632cea1 100644 --- a/src/backend/app/managers/websocket.py +++ b/src/backend/app/managers/websocket.py @@ -1,13 +1,12 @@ import asyncio +import contextlib import logging -from contextlib import suppress -import redis.asyncio as redis from fastapi import WebSocket, WebSocketDisconnect from redis.asyncio.client import PubSub -from app.singletons.redis import RedisClient from app.settings import settings +from app.singletons.redis import RedisClient from app.states.app import AppState logger = logging.getLogger(__name__) @@ -52,7 +51,7 @@ async def stop(self) -> None: """Unsubscribe and cancel the background listener.""" if self._listener_task is not None: self._listener_task.cancel() - with suppress(asyncio.CancelledError): + with contextlib.suppress(asyncio.CancelledError): await self._listener_task if self._pubsub is not None: await self._pubsub.unsubscribe(settings.STATE_CHANNEL) diff --git a/src/backend/app/parser/time.py b/src/backend/app/parser/time.py deleted file mode 100644 index 4075e2fc..00000000 --- a/src/backend/app/parser/time.py +++ /dev/null @@ -1,17 +0,0 @@ -import re - -RATE_PATTERN = re.compile(r"(\d+)req/(sec|min|hour|day)", re.IGNORECASE) - - -def parse_rate_string(rate_string: str) -> tuple[int, int]: - regex_match = RATE_PATTERN.match(rate_string) - if not regex_match: - raise ValueError(f"Invalid rate: {rate_string}") - - seconds_map = { - "sec": 1, - "min": 60, - "hour": 3600, - "day": 86400, - } - return int(regex_match.group(1)), seconds_map[regex_match.group(2).lower()]