93 lines
2.0 KiB
TypeScript
93 lines
2.0 KiB
TypeScript
/**
|
|
* Multiplayer Piano Server
|
|
* Copyright (c) The Dev Channel 2020-2022
|
|
* Licensed under the GPL v3.0 license
|
|
*
|
|
* RateLimit module
|
|
* Original RateLimit.js written by Brandon Lockaby
|
|
* Rewritten in TypeScript by Hri7566
|
|
*/
|
|
|
|
class RateLimit {
|
|
_interval_ms: number;
|
|
_after: number;
|
|
|
|
constructor (interval_ms?: number) {
|
|
this._interval_ms = interval_ms || 0;
|
|
this._after = 0;
|
|
}
|
|
|
|
attempt(time?: number) {
|
|
time = time || Date.now();
|
|
if (time < this._after) return false;
|
|
this._after = time + this._interval_ms;
|
|
return true;
|
|
}
|
|
|
|
setInterval(interval_ms: number) {
|
|
this._after += interval_ms - this._interval_ms;
|
|
this._interval_ms = interval_ms;
|
|
}
|
|
}
|
|
|
|
class RateLimitChain {
|
|
_chain: RateLimit[];
|
|
|
|
constructor (num: number, interval_ms: number) {
|
|
this.setNumAndInterval(num, interval_ms);
|
|
}
|
|
|
|
attempt(time?: number) {
|
|
time = time || Date.now();
|
|
|
|
for (let i = 0; i < this._chain.length; i++) {
|
|
if (this._chain[i].attempt(time)) return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
setNumAndInterval(num: number, interval_ms: number) {
|
|
this._chain = [];
|
|
for (let i = 0; i < num; i++) {
|
|
this._chain.push(new RateLimit(interval_ms));
|
|
}
|
|
}
|
|
}
|
|
|
|
class DataRateLimit {
|
|
_limit: number;
|
|
_interval_ms: number;
|
|
_after: number;
|
|
_size: number;
|
|
|
|
constructor (limit: number, interval_ms: number) {
|
|
this._limit = limit;
|
|
this._interval_ms = interval_ms || 0;
|
|
this._after = 0;
|
|
this._size = 0;
|
|
}
|
|
|
|
attempt (size: number, time: number) {
|
|
time = time || Date.now();
|
|
|
|
if (time >= this._after) {
|
|
this._size = 0;
|
|
this._after = time + this._interval_ms;
|
|
}
|
|
|
|
if (this._size + size <= this._limit) {
|
|
this._size += size;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
export {
|
|
RateLimit,
|
|
RateLimitChain,
|
|
DataRateLimit
|
|
}
|