feat: implement rate limits for downloads and info requests

This commit is contained in:
MasterAcnolo
2026-10-28 21:43:31 +01:00
parent 0da6df03cb
commit fbe30f7ee2
3 changed files with 37 additions and 9 deletions

View File

@@ -1,6 +1,5 @@
const RateLimit = require("express-rate-limit");
/**
* Rate limiter middleware used to protect public endpoints
* against abusive or excessive requests.
@@ -15,10 +14,29 @@ const RateLimit = require("express-rate-limit");
const rateLimit = RateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 5,
message: "Too many requests, please try again later.",
statusCode: 429,
message: {error: {code: "RATE_LIMITED", message: "Too many requests, please try again later."}},
standardHeaders: true,
legacyHeaders: false,
});
const downloadRateLimit = RateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100,
message: {error: {code: "RATE_LIMITED", message: "Too many download requests, please try again later."}},
standardHeaders: true,
legacyHeaders: false,
});
const infoRateLimit = RateLimit({
windowMs: 60 * 1000, // 1 minute
max: 60,
message: {error: {code: "RATE_LIMITED", message: "Too many info requests, please try again later."}},
standardHeaders: true,
legacyHeaders: false,
});
module.exports = {
rateLimit
}
rateLimit,
downloadRateLimit,
infoRateLimit,
};

View File

@@ -1,9 +1,17 @@
const express = require("express");
const router = express.Router();
const { downloadController, progressController, speedController, stageController, cancelDownloadController, playlistInfoController } = require("../controller/download.controller");
const {
downloadController,
progressController,
speedController,
stageController,
cancelDownloadController,
playlistInfoController,
} = require("../controller/download.controller");
const {downloadRateLimit} = require("../helpers/rateLimit.helpers");
router.post("/", downloadController);
router.post("/cancel", cancelDownloadController);
router.post("/", downloadRateLimit, downloadController);
router.post("/cancel", downloadRateLimit, cancelDownloadController);
// SSE for download progress
router.get("/progress", progressController);

View File

@@ -1,7 +1,9 @@
const express = require("express");
const router = express.Router();
const { infoController } = require("../controller/info.controller");
const {infoRateLimit} = require("../helpers/rateLimit.helpers");
router.get("/", infoController);
router.get("/", infoRateLimit, infoController);
router.post("/", infoRateLimit, infoController);
module.exports = router;