added rate limiting
This commit is contained in:
22
src/controllers/middleware/index.js
Normal file
22
src/controllers/middleware/index.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import stringify from 'json-stringify-safe';
|
||||
|
||||
import {Logger} from '../../models/logger';
|
||||
|
||||
export class MiddleWare {
|
||||
static async end(req, res, next) {
|
||||
await MiddleWare.RateLimits.request(req, res, next);
|
||||
await MiddleWare.analytics(req, res, next);
|
||||
}
|
||||
|
||||
static analytics(req, res, next) {
|
||||
// TODO: Send data such as IP to an anyaltitics model
|
||||
Logger.middleware(`${req.method} request to ${req.url}`)
|
||||
next();
|
||||
}
|
||||
|
||||
static newUser(req, res, next) {
|
||||
next();
|
||||
}
|
||||
}
|
||||
|
||||
MiddleWare.RateLimits = require('./rateLimits').RateLimits;
|
||||
53
src/controllers/middleware/rateLimits.js
Normal file
53
src/controllers/middleware/rateLimits.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import {Logger} from '../../models/logger';
|
||||
import {MiddleWare} from './index';
|
||||
|
||||
let requestsPerSecond = 2;
|
||||
// let disposeTime = 20000; //ms 1800000 = 30 mins
|
||||
let buckets = {}
|
||||
|
||||
export class RateLimits extends MiddleWare{
|
||||
static async request(req, res, next) {
|
||||
let ip = req.connection.remoteAddress;
|
||||
|
||||
if (!buckets[ip]) {
|
||||
console.log(`New bucket`)
|
||||
RateLimits.newBucket(ip);
|
||||
next();
|
||||
return;
|
||||
}
|
||||
|
||||
buckets[ip].lastUsed = new Date().getTime();
|
||||
|
||||
if (buckets[ip].tokens.length <= 0) {
|
||||
Logger.middleware(`${ip} is being rate limited`);
|
||||
res.status(422).end('422 TO MANY REQUESTS');
|
||||
return;
|
||||
}
|
||||
|
||||
buckets[ip].tokens.pop();
|
||||
next();
|
||||
}
|
||||
|
||||
static newBucket(ip) {
|
||||
buckets[ip] = {ip: ip, tokens: [], lastUsed: new Date().getTime()};
|
||||
for (let i = 0; i < requestsPerSecond; i++) {
|
||||
buckets[ip].tokens.push(1);
|
||||
}
|
||||
}
|
||||
|
||||
static tick() {
|
||||
for (let bucket in buckets) {
|
||||
// if (buckets[bucket].lastUsed += disposeTime >= new Date().getTime()) {
|
||||
// delete buckets[bucket]; // remove element here, don't redefine
|
||||
// continue;
|
||||
// }
|
||||
if (buckets[bucket].tokens.length > requestsPerSecond) continue;
|
||||
buckets[bucket].tokens.push(1);
|
||||
}
|
||||
}
|
||||
|
||||
static init() {
|
||||
Logger.info('Initialized ratelimiting middleware');
|
||||
setInterval(RateLimits.tick, 1000 / requestsPerSecond);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user