Files
Andrei 58f8093689 Rebrand from 'Redirect Intelligence v2' to 'URL Tracker Tool V2' throughout UI
- Updated all component headers and documentation
- Changed navbar and footer branding
- Updated homepage hero badge
- Modified page title in index.html
- Simplified footer text to 'Built with ❤️'
- Consistent V2 capitalization across all references
2025-08-19 19:12:23 +00:00

52 lines
1.4 KiB
JavaScript

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