73 lines
2.1 KiB
JavaScript
73 lines
2.1 KiB
JavaScript
class RateLimit{
|
|
constructor(maxRequests, timeFrame){
|
|
this.maxRequests = maxRequests;
|
|
this.timeFrame = timeFrame;
|
|
this.users = {};
|
|
}
|
|
|
|
async addUser(user){
|
|
this.users[user] = {
|
|
requests: this.maxRequests,
|
|
lastRequest: Date.now()
|
|
};
|
|
}
|
|
|
|
async removeUser(user){
|
|
delete this.users[user];
|
|
}
|
|
|
|
async checkUser(user){
|
|
if(!this.users[user]) await this.addUser(user);
|
|
return this.users[user];
|
|
}
|
|
|
|
async checkRateLimit(user){
|
|
const { requests, lastRequest } = await this.checkUser(user);
|
|
const now = Date.now();
|
|
if(now - lastRequest > this.timeFrame) {
|
|
this.users[user].requests = this.maxRequests;
|
|
this.users[user].lastRequest = now;
|
|
return true;
|
|
}
|
|
if(requests > 0) {
|
|
this.users[user].requests--;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
async getRateLimit(user){
|
|
const { requests, lastRequest } = await this.checkUser(user);
|
|
const now = Date.now();
|
|
if(now - lastRequest > this.timeFrame) {
|
|
this.users[user].requests = this.maxRequests;
|
|
this.users[user].lastRequest = now;
|
|
return this.maxRequests;
|
|
}
|
|
return requests;
|
|
}
|
|
|
|
async getRateLimitReset(user){
|
|
const { requests, lastRequest } = await this.checkUser(user);
|
|
const now = Date.now();
|
|
if(now - lastRequest > this.timeFrame) {
|
|
this.users[user].requests = this.maxRequests;
|
|
this.users[user].lastRequest = now;
|
|
return this.timeFrame;
|
|
}
|
|
return this.timeFrame - (now - lastRequest);
|
|
}
|
|
|
|
async getRateLimitRemaining(user){
|
|
const { requests, lastRequest } = await this.checkUser(user);
|
|
const now = Date.now();
|
|
if(now - lastRequest > this.timeFrame) {
|
|
this.users[user].requests = this.maxRequests;
|
|
this.users[user].lastRequest = now;
|
|
return this.maxRequests;
|
|
}
|
|
return requests;
|
|
}
|
|
}
|
|
|
|
module.exports = RateLimit; |