Relocate the ~6k-file docs tree from the repo root into plugins/document-navigator/docs/ so the plugin is self-contained and portable. docs/superpowers/ (specs and plans) stays at the repo root. Moved via cp+rm rather than git mv because directory rename() fails with EPERM on this WSL /mnt DrvFs mount; git rename-detection pairs the identical-content files at commit time. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
12 KiB
12 KiB
@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 — (no submodules)
- fixed-window — (no submodules)
- rate-limiter — (no submodules)
- rate-limiter — (no submodules)
- sliding-window — (no submodules)
- sliding-window — (no submodules)
- token-bucket — (no submodules)
- token-bucket — (no submodules)
- errors — (no submodules)
- rate-limiter-error — (no submodules)
- rate-limit-middleware — (no submodules)
- rate-limit-middleware — (no submodules)
- schemas — (no submodules)
- rate-limiter.schemas — (no submodules)
- adapter — (no submodules)
- adapter — (no submodules)
- memory-storage — (no submodules)
- memory-storage — (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
src/errors/rate-limiter-error.md— Error codes andRateLimiterErrorsrc/types/rate-limiter.types.md— All shared typessrc/core/token-bucket/token-bucket.md— TokenBucket algorithmsrc/core/sliding-window/sliding-window.md— SlidingWindow algorithmsrc/core/fixed-window/fixed-window.md— FixedWindow algorithmsrc/core/rate-limiter/rate-limiter.md—createRateLimiterorchestratorsrc/storage/storage-adapter/storage-adapter.md—RateLimitStorageinterfacesrc/storage/memory-storage/memory-storage.md—MemoryStorageadaptersrc/middleware/rate-limit-middleware/rate-limit-middleware.md— Middleware helperssrc/schemas/rate-limiter.schemas.md— Zod schemas