chat-app/backend/dist/middleware/rateLimiter.js
Gal Podlipnik 99cbd6e310 backend
2025-06-12 01:23:08 +02:00

43 lines
1.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkMessageRateLimit = exports.messageRateLimiter = void 0;
class RateLimiter {
limits = new Map();
maxMessages;
windowMs;
constructor(maxMessages = 10, windowMs = 60000) {
this.maxMessages = maxMessages;
this.windowMs = windowMs;
}
checkLimit(userId) {
const now = Date.now();
const userLimit = this.limits.get(userId) ?? { count: 0, resetTime: now + this.windowMs };
if (now > userLimit.resetTime) {
userLimit.count = 0;
userLimit.resetTime = now + this.windowMs;
}
userLimit.count++;
this.limits.set(userId, userLimit);
return userLimit.count <= this.maxMessages;
}
getRemainingTime(userId) {
const userLimit = this.limits.get(userId);
if (!userLimit)
return 0;
return Math.max(0, userLimit.resetTime - Date.now());
}
}
exports.messageRateLimiter = new RateLimiter(10, 60000); // 10 messages per minute
const checkMessageRateLimit = (socket) => {
const canSend = exports.messageRateLimiter.checkLimit(socket.userId);
if (!canSend) {
const remainingTime = exports.messageRateLimiter.getRemainingTime(socket.userId);
socket.emit("rate_limit_exceeded", {
message: `Too many messages. Please wait ${Math.ceil(remainingTime / 1000)} seconds before sending another message.`,
remainingTime,
});
}
return canSend;
};
exports.checkMessageRateLimit = checkMessageRateLimit;