@marufzak/rlimiter
v3.0.0
Published
Rate limiter for NodeJS
Downloads
837
Readme
@marufzak/rlimiter
Redis-backed rate limiter for Node.js with multiple rate limiting strategies.
Installation
npm install @marufzak/rlimiter redisUsage
See the examples folder for usage examples:
- Fixed Window
- Token Bucket
- Leaky Bucket
- Sliding Window Log
- Sliding Window Count (requires Redis 7.4+)
- Koa Middleware
Error Handling
By default, requests are rejected when Redis fails. You can customize this behavior:
const strategy = new FixedWindow({
maxTokens: 10,
windowSizeMs: 60_000,
redisClient,
onError: error => {
console.error('Rate limiter error:', error);
return 'allow'; // or 'reject'
},
});Default behavior: Requests are rejected on Redis errors to maintain security.
Fail open (allow requests):
onError: () => 'allow';Fail closed (reject requests):
onError: () => 'reject'; // DefaultAPI
FixedWindow(options)
Options:
maxTokens- Maximum number of requests allowed per windowwindowSizeMs- Window duration in millisecondsredisClient- Redis client instanceonError- Optional error handler that returns'allow'or'reject'(default: rejects)
Methods:
check({ key })- Returns object:isAllowed-trueif allowed,falseif rate limitedremainingRequests- Number of remaining requests in current windowremainingTime- Time in milliseconds until retry is possible
TokenBucket(options)
Options:
capacity- Maximum number of tokens in the bucketreplenishRate- Tokens added per secondredisClient- Redis client instanceonError- Optional error handler that returns'allow'or'reject'(default: rejects)
Methods:
check({ bucketKey, timestampKey })- Returns object:isAllowed-trueif allowed,falseif rate limitedremainingRequests- Number of remaining tokens in bucketremainingTime- Time in milliseconds until retry is possible
LeakyBucket(options)
Options:
capacity- Maximum queue sizeleakRate- Requests processed per secondredisClient- Redis client instanceonError- Optional error handler that returns'allow'or'reject'(default: rejects)
Methods:
check({ queueKey, timestampKey })- Returns object:isAllowed-trueif allowed,falseif rate limitedremainingRequests- Number of available slots in queueremainingTime- Time in milliseconds until retry is possible
SlidingWindowCount(options)
Requires Redis 7.4+
Options:
limit- Maximum number of requests allowed per windowwindowSizeMs- Total window duration in millisecondssubWindowSizeMs- Sub-window duration in millisecondsredisClient- Redis client instanceonError- Optional error handler that returns'allow'or'reject'(default: rejects)
Methods:
check({ hashKey })- Returns object:isAllowed-trueif allowed,falseif rate limitedremainingRequests- Number of remaining requests in the current windowremainingTime- Time in milliseconds until retry is possible
SlidingWindowLog(options)
Options:
capacity- Maximum number of requests allowed per windowwindowSizeMs- Sliding window duration in millisecondsredisClient- Redis client instanceonError- Optional error handler that returns'allow'or'reject'(default: rejects)
Methods:
check({ queueKey })- Returns object:isAllowed-trueif allowed,falseif rate limitedremainingRequests- Number of remaining requests in the current windowremainingTime- Time in milliseconds until retry is possible
koaRateLimiterMiddleware(options)
Options:
strategy- Rate limiting strategy instance (FixedWindow,TokenBucket,LeakyBucket,SlidingWindowLog, orSlidingWindowCount)getKey- Function to extract rate limit key(s) from context (returns strategy-specific check options)onLimit- Optional callback when rate limit exceededonProceed- Optional callback when request allowed
Returns 429 status with X-Ratelimit-Retry-After header (seconds) and sets X-Ratelimit-Remaining header when rate limited.
License
MIT
