"""In-memory fixed-window rate limiter, keyed per API key. Good enough for a single-process gateway; swap for Redis if you scale out. """ import time from collections import defaultdict from threading import Lock _windows: dict[int, tuple[int, int]] = defaultdict(lambda: (0, 0)) # key_id -> (window_start, count) _lock = Lock() def check(key_id: int, limit_per_minute: int) -> bool: """Returns True if the request is allowed.""" if limit_per_minute <= 0: return True now = int(time.time() // 60) with _lock: window, count = _windows[key_id] if window != now: _windows[key_id] = (now, 1) return True if count >= limit_per_minute: return False _windows[key_id] = (window, count + 1) return True