Rate Limiting

Overview

Katal rate limiting now supports pluggable storage adapters.

Built-ins: - MemoryRateLimitStore (default) - RedisRateLimitStore (distributed-friendly)

Basic Usage

import { createRateLimitMiddleware } from "katal";

app.use(
  createRateLimitMiddleware({
    windowMs: 60_000,
    maxRequests: 100,
  }),
);

Custom Client Key

app.use(
  createRateLimitMiddleware({
    windowMs: 60_000,
    maxRequests: 100,
    keyGenerator: (request) => request.headers.get("x-api-key") ?? "anonymous",
  }),
);

Redis Store Example

import {
  createRateLimitMiddleware,
  RedisRateLimitStore,
} from "katal";

const redisStore = new RedisRateLimitStore(redisClient);

app.use(
  createRateLimitMiddleware({
    windowMs: 60_000,
    maxRequests: 100,
    store: redisStore,
  }),
);

redisClient must provide: - get(key) - set(key, value, mode, duration) - del(key)

Response Behavior

When limit is exceeded: - status: 429 - content type: application/problem+json - headers: - Retry-After - X-RateLimit-Limit - X-RateLimit-Remaining - X-RateLimit-Reset

Store Contract

interface RateLimitStore {
  get(key: string): Promise<RateLimitRecord | null> | RateLimitRecord | null;
  set(key: string, value: RateLimitRecord): Promise<void> | void;
  delete(key: string): Promise<void> | void;
}

---

## See Also

- [Middleware](MIDDLEWARE.md)
- [Application & Router](CORE.md)