added rate limiting

This commit is contained in:
Ben
2018-09-01 19:57:51 +01:00
parent c33f7bdd7b
commit 8ef777ae44
8 changed files with 82 additions and 17 deletions

View 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;

View 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);
}
}