Context
adaptiveThrottle.ts penalizes IPs that generate repeated 4xx responses using a decaying abuse score stored per IP.
Problem / Gap
Abuse state is held in a process-local Map. Attackers can evade throttling by hitting different pods, and legitimate blocks do not propagate across instances.
Proposed approach
- Add a Redis-backed abuse store when
REDIS_URL is configured, matching the rate limiter fallback pattern.
- Keep in-memory store for local/test environments.
- Expose throttle block count and active blocks in metrics for observability.
Acceptance criteria
Files/areas affected
backend/src/middleware/adaptiveThrottle.ts
backend/src/rateLimiter.ts (shared Redis client patterns)
backend/src/metrics.ts
Context
adaptiveThrottle.tspenalizes IPs that generate repeated 4xx responses using a decaying abuse score stored per IP.Problem / Gap
Abuse state is held in a process-local
Map. Attackers can evade throttling by hitting different pods, and legitimate blocks do not propagate across instances.Proposed approach
REDIS_URLis configured, matching the rate limiter fallback pattern.Acceptance criteria
Files/areas affected
backend/src/middleware/adaptiveThrottle.tsbackend/src/rateLimiter.ts(shared Redis client patterns)backend/src/metrics.ts