UNPKG

rate-limiter-flexible

Version:

Node.js rate limiter by key and protection from DDoS and Brute-Force attacks in process Memory, Redis, MongoDb, Memcached, MySQL, PostgreSQL, Cluster or PM

52 lines (44 loc) 1.43 kB
const RateLimiterAbstract = require('./RateLimiterAbstract'); module.exports = class RateLimiterUnion { constructor(...limiters) { if (limiters.length < 1) { throw new Error('RateLimiterUnion: at least one limiter have to be passed'); } limiters.forEach((limiter) => { if (!(limiter instanceof RateLimiterAbstract)) { throw new Error('RateLimiterUnion: all limiters have to be instance of RateLimiterAbstract'); } }); this._limiters = limiters; } consume(key, points = 1) { return new Promise((resolve, reject) => { const promises = []; this._limiters.forEach((limiter) => { promises.push(limiter.consume(key, points).catch(rej => ({ rejected: true, rej }))); }); Promise.all(promises) .then((res) => { const resObj = {}; let rejected = false; res.forEach((item) => { if (item.rejected === true) { rejected = true; } }); for (let i = 0; i < res.length; i++) { if (rejected && res[i].rejected === true) { resObj[this._limiters[i].keyPrefix] = res[i].rej; } else if (!rejected) { resObj[this._limiters[i].keyPrefix] = res[i]; } } if (rejected) { reject(resObj); } else { resolve(resObj); } }); }); } };