redis-sliding-rate-limiter
Version:
Flexible and performant rate limiter based on sliding window algorithm with arbitrary precision
69 lines (58 loc) • 2.07 kB
JavaScript
const express = require('express');
const Redis = require('ioredis');
const { RateLimiter, Unit, createExpressMiddleware } = require('../../build/index');
(async () => {
const app = express();
const client = new Redis({
host: 'localhost',
port: 6379
});
const middleware = createExpressMiddleware({
// Define limiters that will be evaluated from this middleware for each request
limiters: [
{
limiter: new RateLimiter({
client: client,
windowUnit: Unit.SECOND,
windowSize: 1,
limit: 5,
}),
overrideKey: true,
key: 'This key will be overridden',
errorMessage: '[Peak] Too many requests',
},
{
limiter: new RateLimiter({
client: client,
windowUnit: Unit.HOUR,
windowSize: 1,
limit: 10000,
windowSubdivisionUnit: Unit.MINUTE,
}),
errorMessage: '[Hourly] Too many requests',
},
],
// Compute Redis key from request and limiter objects
overrideKeyFn: (req, limiter) => {
return req.path + limiter.name;
},
// Error status code
errorStatusCode: 429,
// Enable/disable setting headers on response
setHeaders: true,
// Override default response headers
headers: (req, limiter) => {
return {
remaining: `X-Rate-Limit-Remaining-${limiter.name}`,
firstExpireAt: `X-Rate-Limit-First-Expire-${limiter.name}`,
windowExpireAt: `X-Rate-Limit-Window-Expire-${limiter.name}`,
};
},
});
// Plug-in the middleware
app.use(middleware);
app.get('/', (req, res) => {
return res.send('Yo!');
});
app.listen(8080, () => console.log('Server listening on port 8080...'));
})();