Files
2026-06-09 21:06:27 +01:00
..
2026-06-09 21:06:27 +01:00

@suaveplan/rate-limiter - Enterprise rate limiter: TokenBucket, SlidingWindow, FixedWindow algorithms; tenant multipliers; rule-based routing; pluggable storage; OTel instrumentation

Summary

Enterprise rate limiter with three algorithms, rule-based routing, tenant multipliers, pluggable storage, and OTel instrumentation.

Documentation tree

- [fixed-window](./src/core/fixed-window/fixed-window.md) — _(no submodules)_- [rate-limiter](./src/core/rate-limiter/rate-limiter.md) — _(no submodules)_- [rate-limiter](./src/core/rate-limiter/rate-limiter.md) — _(no submodules)_- [sliding-window](./src/core/sliding-window/sliding-window.md) — _(no submodules)_- [sliding-window](./src/core/sliding-window/sliding-window.md) — _(no submodules)_- [token-bucket](./src/core/token-bucket/token-bucket.md) — _(no submodules)_- [token-bucket](./src/core/token-bucket/token-bucket.md) — _(no submodules)_- [errors](./src/errors/rate-limiter-error.md) — _(no submodules)_- [rate-limiter-error](./src/errors/rate-limiter-error.md) — _(no submodules)_- [rate-limit-middleware](./src/middleware/rate-limit-middleware/rate-limit-middleware.md) — _(no submodules)_- [rate-limit-middleware](./src/middleware/rate-limit-middleware/rate-limit-middleware.md) — _(no submodules)_- [schemas](./src/schemas/rate-limiter.schemas.md) — _(no submodules)_- [rate-limiter.schemas](./src/schemas/rate-limiter.schemas.md) — _(no submodules)_- [adapter](./src/storage/adapter/adapter.md) — _(no submodules)_- [adapter](./src/storage/adapter/adapter.md) — _(no submodules)_- [memory-storage](./src/storage/memory-storage/memory-storage.md) — _(no submodules)_- [memory-storage](./src/storage/memory-storage/memory-storage.md) — _(no submodules)_- [fixed-window](./src/core/fixed-window/fixed-window.md) — _(no submodules)_- [rate-limiter](./src/core/rate-limiter/rate-limiter.md) — _(no submodules)_- [rate-limiter](./src/core/rate-limiter/rate-limiter.md) — _(no submodules)_- [sliding-window](./src/core/sliding-window/sliding-window.md) — _(no submodules)_- [sliding-window](./src/core/sliding-window/sliding-window.md) — _(no submodules)_- [token-bucket](./src/core/token-bucket/token-bucket.md) — _(no submodules)_- [token-bucket](./src/core/token-bucket/token-bucket.md) — _(no submodules)_- [errors](./src/errors/rate-limiter-error.md) — _(no submodules)_- [rate-limiter-error](./src/errors/rate-limiter-error.md) — _(no submodules)_- [rate-limit-middleware](./src/middleware/rate-limit-middleware/rate-limit-middleware.md) — _(no submodules)_- [rate-limit-middleware](./src/middleware/rate-limit-middleware/rate-limit-middleware.md) — _(no submodules)_- [schemas](./src/schemas/rate-limiter.schemas.md) — _(no submodules)_- [rate-limiter.schemas](./src/schemas/rate-limiter.schemas.md) — _(no submodules)_- [adapter](./src/storage/adapter/adapter.md) — _(no submodules)_- [adapter](./src/storage/adapter/adapter.md) — _(no submodules)_- [memory-storage](./src/storage/memory-storage/memory-storage.md) — _(no submodules)_- [memory-storage](./src/storage/memory-storage/memory-storage.md) — _(no submodules)_- [fixed-window](./src/core/fixed-window/fixed-window.md) — _(no submodules)_- [rate-limiter](./src/core/rate-limiter/rate-limiter.md) — _(no submodules)_- [rate-limiter](./src/core/rate-limiter/rate-limiter.md) — _(no submodules)_- [sliding-window](./src/core/sliding-window/sliding-window.md) — _(no submodules)_- [sliding-window](./src/core/sliding-window/sliding-window.md) — _(no submodules)_- [token-bucket](./src/core/token-bucket/token-bucket.md) — _(no submodules)_- [token-bucket](./src/core/token-bucket/token-bucket.md) — _(no submodules)_- [errors](./src/errors/rate-limiter-error.md) — _(no submodules)_- [rate-limiter-error](./src/errors/rate-limiter-error.md) — _(no submodules)_- [rate-limit-middleware](./src/middleware/rate-limit-middleware/rate-limit-middleware.md) — _(no submodules)_- [rate-limit-middleware](./src/middleware/rate-limit-middleware/rate-limit-middleware.md) — _(no submodules)_- [schemas](./src/schemas/rate-limiter.schemas.md) — _(no submodules)_- [rate-limiter.schemas](./src/schemas/rate-limiter.schemas.md) — _(no submodules)_- [adapter](./src/storage/adapter/adapter.md) — _(no submodules)_- [adapter](./src/storage/adapter/adapter.md) — _(no submodules)_- [memory-storage](./src/storage/memory-storage/memory-storage.md) — _(no submodules)_- [memory-storage](./src/storage/memory-storage/memory-storage.md) — _(no submodules)_- [fixed-window](./src/core/fixed-window/fixed-window.md) — _(no submodules)_- [rate-limiter](./src/core/rate-limiter/rate-limiter.md) — _(no submodules)_ - [rate-limiter](./src/core/rate-limiter/rate-limiter.md) — _(no submodules)_- [sliding-window](./src/core/sliding-window/sliding-window.md) — _(no submodules)_ - [sliding-window](./src/core/sliding-window/sliding-window.md) — _(no submodules)_- [token-bucket](./src/core/token-bucket/token-bucket.md) — _(no submodules)_ - [token-bucket](./src/core/token-bucket/token-bucket.md) — _(no submodules)_- [errors](./src/errors/rate-limiter-error.md) — _(no submodules)_ - [rate-limiter-error](./src/errors/rate-limiter-error.md) — _(no submodules)_- [rate-limit-middleware](./src/middleware/rate-limit-middleware/rate-limit-middleware.md) — _(no submodules)_ - [rate-limit-middleware](./src/middleware/rate-limit-middleware/rate-limit-middleware.md) — _(no submodules)_- [schemas](./src/schemas/rate-limiter.schemas.md) — _(no submodules)_ - [rate-limiter.schemas](./src/schemas/rate-limiter.schemas.md) — _(no submodules)_- [adapter](./src/storage/adapter/adapter.md) — _(no submodules)_ - [adapter](./src/storage/adapter/adapter.md) — _(no submodules)_- [memory-storage](./src/storage/memory-storage/memory-storage.md) — _(no submodules)_ - [memory-storage](./src/storage/memory-storage/memory-storage.md) — _(no submodules)_

Algorithms

Algorithm Use case
TokenBucket Burst-friendly continuous rate
SlidingWindow Smooth per-key limit (default)
FixedWindow Coarse counter, lowest memory

Quick Start

import { createRateLimiter } from "@suaveplan/rate-limiter";

const limiter = createRateLimiter({
  defaultConfig: { limit: 100, window: 60_000 },
});

const result = await limiter.check({ key: "user:42" });
if (!result.allowed) {
  console.log(`Retry after ${result.retryAfter}ms`);
}

Rule-based routing

const limiter = createRateLimiter({
  defaultConfig: { limit: 100, window: 60_000 },
  rules: [
    {
      id: "admin-bypass",
      limit: 0, window: 60_000,
      priority: 100, bypass: true,
      conditions: [{ field: "userId", operator: "in", value: ["admin-1"] }],
    },
    {
      id: "strict-login",
      limit: 5, window: 60_000,
      priority: 50,
      conditions: [{ field: "path", operator: "eq", value: "/login" }],
    },
  ],
  enableTenantLimits: true,
  tenantMultipliers: { enterprise: 10 },
});

Modules