41 lines
1.0 KiB
JavaScript
41 lines
1.0 KiB
JavaScript
|
|
||
|
var RateLimit = function(interval_ms) {
|
||
|
this._interval_ms = interval_ms || 0; // (0 means no limit)
|
||
|
this._after = 0;
|
||
|
};
|
||
|
|
||
|
RateLimit.prototype.attempt = function(time) {
|
||
|
var time = time || Date.now();
|
||
|
if(time < this._after) return false;
|
||
|
this._after = time + this._interval_ms;
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
RateLimit.prototype.setInterval = function(interval_ms) {
|
||
|
this._after += interval_ms - this._interval_ms;
|
||
|
this._interval_ms = interval_ms;
|
||
|
};
|
||
|
|
||
|
var RateLimitChain = function(num, interval_ms) {
|
||
|
this.setNumAndInterval(num, interval_ms);
|
||
|
};
|
||
|
|
||
|
RateLimitChain.prototype.attempt = function(time) {
|
||
|
var time = time || Date.now();
|
||
|
for(var i = 0; i < this._chain.length; i++) {
|
||
|
if(this._chain[i].attempt(time)) return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
RateLimitChain.prototype.setNumAndInterval = function(num, interval_ms) {
|
||
|
this._chain = [];
|
||
|
for(var i = 0; i < num; i++) {
|
||
|
this._chain.push(new RateLimit(interval_ms));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var exports = typeof module !== "undefined" ? module.exports : this;
|
||
|
exports.RateLimit = RateLimit;
|
||
|
exports.RateLimitChain = RateLimitChain;
|