Redis-backed rate limiter middleware for Express applications using token bucket algorithm.
npm install reflo
import express from 'express';
import { rateLimiter } from 'reflo';
const app = express();
app.use(rateLimiter({
timeWindowSeconds: 60,
requestCount: 100,
}));
app.listen(3000);
interface LimiterConfig {
timeWindowSeconds: number;
requestCount: number;
exceptions?: Array<{ route: string; count: number }>;
allowlist?: string[];
blocklist?: string[];
getIdentifier?: (req: Request) => string;
backoffStrategy?: (overuse: number) => number;
}
Option | Type | Description |
---|---|---|
timeWindowSeconds |
number |
Rate limit window in seconds |
requestCount |
number |
Maximum requests per window |
exceptions |
Array<{route, count}> |
Per-route limit overrides |
allowlist |
string[] |
Bypass rate limiting |
blocklist |
string[] |
Always blocked |
getIdentifier |
(req) => string |
User identification function |
backoffStrategy |
(overuse) => number |
Delay calculation function |
import { identifierStrategies } from 'reflo';
// By IP address
identifierStrategies.byIP()
// By header value
identifierStrategies.byHeader('x-api-key')
import { backoffStrategies } from 'reflo';
backoffStrategies.none() // No delay
backoffStrategies.fixed(500) // Fixed 500ms delay
backoffStrategies.linear(100, 5000) // Linear: 100ms * overuse, max 5s
backoffStrategies.exponential(200, 10000) // Exponential: 200ms * 2^overuse, max 10s
app.use(rateLimiter({
timeWindowSeconds: 60,
requestCount: 100,
exceptions: [
{ route: '/api/upload', count: 5 },
{ route: '/api/search', count: 500 },
],
}));
app.use(rateLimiter({
timeWindowSeconds: 60,
requestCount: 100,
allowlist: ['ip:127.0.0.1', 'hdr:x-api-key:admin-key'],
blocklist: ['ip:192.168.1.100'],
}));
const customIdentifier = (req) => `user:${req.user?.id || req.ip}`;
const customBackoff = (overuse) => Math.min(1000, 50 * Math.pow(overuse, 1.5));
app.use(rateLimiter({
timeWindowSeconds: 60,
requestCount: 100,
getIdentifier: customIdentifier,
backoffStrategy: customBackoff,
}));
REDIS_URL=redis://localhost:6379
REDIS_TLS=true # Enable TLS connection
X-RateLimit-Limit
: Maximum requests allowedX-RateLimit-Remaining
: Requests remaining in current window
- Node.js 14+
- Redis server
- Express application
MIT