From bbc6a8b1b0d64fa86df8046acf39a566f48d27fa Mon Sep 17 00:00:00 2001 From: joffinjoy Date: Tue, 19 Mar 2024 21:11:24 +0530 Subject: [PATCH 1/4] Rate Limiter Implemented --- src/app.js | 4 ++-- src/constants/config.json | 15 +++++++++++--- src/constants/rateLimitConfigs.js | 25 +++++++++++++++++++++++ src/controllers/orchestration.js | 21 +++++++------------ src/helpers/bodyValueReplacer.js | 1 - src/helpers/orchestratorMapGenerator.js | 1 - src/middlewares/rateLimiter.js | 22 ++++++++++++++++++++ src/middlewares/routeConfigInjector.js | 7 +------ src/middlewares/targetPackagesInjector.js | 1 + src/package.json | 5 +++-- src/router/index.js | 5 +++-- src/utils/packageInstaller.js | 5 +---- src/utils/packageLoader.js | 1 - 13 files changed, 77 insertions(+), 36 deletions(-) create mode 100644 src/constants/rateLimitConfigs.js create mode 100644 src/middlewares/rateLimiter.js diff --git a/src/app.js b/src/app.js index cee3b27..ffc3540 100644 --- a/src/app.js +++ b/src/app.js @@ -11,10 +11,10 @@ if (!environmentData.success) { process.exit() } -packageInstaller(process.env.REQUIRED_PACKAGES).catch((error) => { +/* packageInstaller(process.env.REQUIRED_PACKAGES).catch((error) => { console.error(`An error occurred in package installer: ${error}`) process.exit() -}) +}) */ const app = express() const path = require('path') diff --git a/src/constants/config.json b/src/constants/config.json index cf74e32..a294cff 100644 --- a/src/constants/config.json +++ b/src/constants/config.json @@ -102,7 +102,10 @@ "targetBody": [], "responseBody": [{ "sourceField": "permissions", "targetField": "user.permissions[]" }] } - ] + ], + "rateLimit": { + "type": "public-low" + } }, { "sourceRoute": "/user/v1/account/login", @@ -323,7 +326,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "public-low" + } }, { "sourceRoute": "/user/v1/account/logout", @@ -362,7 +368,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "public-low" + } }, { "sourceRoute": "/user/v1/user/read", diff --git a/src/constants/rateLimitConfigs.js b/src/constants/rateLimitConfigs.js new file mode 100644 index 0000000..473a4d9 --- /dev/null +++ b/src/constants/rateLimitConfigs.js @@ -0,0 +1,25 @@ +'use strict' + +const standardHandler = (req, res) => { + res.status(429).json({ + responseCode: 'RATE_LIMITED', + message: 'Too many requests. Please try again later.', + }) +} + +exports.rateLimitConfigs = { + 'public-low': { + windowMs: 2 * 60 * 1000, + limit: 5, + standardHeaders: false, + legacyHeaders: false, + handler: standardHandler, + }, + general: { + windowMs: 1 * 60 * 1000, + limit: 50, + standardHeaders: false, + legacyHeaders: false, + handler: standardHandler, + }, +} diff --git a/src/controllers/orchestration.js b/src/controllers/orchestration.js index aff1e49..2805203 100644 --- a/src/controllers/orchestration.js +++ b/src/controllers/orchestration.js @@ -5,15 +5,13 @@ const removeArraySuffix = (obj) => { if (Array.isArray(obj)) { return obj.map(removeArraySuffix) } else if (typeof obj === 'object' && obj !== null) { - for (const key in obj) { - if (obj.hasOwnProperty(key)) { - const newKey = key.endsWith('[]') ? key.slice(0, -2) : key - obj[newKey] = removeArraySuffix(obj[key]) - if (newKey !== key) { - delete obj[key] - } + Object.keys(obj).forEach((key) => { + const newKey = key.endsWith('[]') ? key.slice(0, -2) : key + obj[newKey] = removeArraySuffix(obj[key]) + if (newKey !== key) { + delete obj[key] } - } + }) } return obj } @@ -23,11 +21,9 @@ const isBadResponse = (statusCode) => statusCode >= 400 && statusCode <= 599 const packageRouterCaller = async (req, res, responses, servicePackage, packages) => { const selectedPackage = packages.find((obj) => obj.packageMeta.basePackageName === servicePackage.basePackageName) req['baseUrl'] = process.env[`${selectedPackage.packageMeta.basePackageName.toUpperCase()}_SERVICE_BASE_URL`] - //const bodyConfig = bodyConfigGenerator(servicePackage.targetBody) const newBody = bodyValueReplacer(req.body, servicePackage.targetBody) req.body = newBody responses[selectedPackage.packageMeta.basePackageName] = await selectedPackage.packageRouter(req, res, responses) - console.log('RESPONSESSSSSSSSSSSSSSSSSSSSSSSSS: ', responses) const responseStatusCode = responses[selectedPackage.packageMeta.basePackageName].status if (isBadResponse(responseStatusCode) && !res.headersSent) { res.status(responseStatusCode).send(responses[selectedPackage.packageMeta.basePackageName].data) @@ -38,9 +34,7 @@ const packageRouterCaller = async (req, res, responses, servicePackage, packages const orchestrationHandler = async (packages, req, res) => { try { - const { targetPackages, inSequence, sourceRoute, responseMessage } = req - console.log(targetPackages, inSequence, sourceRoute) - console.log(packages) + const { targetPackages, inSequence, responseMessage } = req const responses = {} let asyncRequestsStatues = [] if (inSequence) @@ -57,7 +51,6 @@ const orchestrationHandler = async (packages, req, res) => { return packageRouterCaller(req, res, responses, servicePackage, packages) }) ) - console.log('RESPONSEEEEEEEEEEEEEEEEEEEEES: ', responses) let response = {} for (const servicePackage of targetPackages) { const body = responses[servicePackage.basePackageName]?.result diff --git a/src/helpers/bodyValueReplacer.js b/src/helpers/bodyValueReplacer.js index fe80195..305c1b5 100644 --- a/src/helpers/bodyValueReplacer.js +++ b/src/helpers/bodyValueReplacer.js @@ -59,7 +59,6 @@ const sourceFieldMapGenerator = (mappings) => { mappings.map((mapping) => { sourceFieldMap.set(mapping.sourceField, mapping.targetField) }) - console.log(sourceFieldMap) return sourceFieldMap } diff --git a/src/helpers/orchestratorMapGenerator.js b/src/helpers/orchestratorMapGenerator.js index a6babe3..4d7ca10 100644 --- a/src/helpers/orchestratorMapGenerator.js +++ b/src/helpers/orchestratorMapGenerator.js @@ -15,7 +15,6 @@ exports.orchestratorMapGenerator = (orchestratedRoutesArray) => { } }) } - //console.log(routesMap) return routesMap } catch (err) { console.log(err) diff --git a/src/middlewares/rateLimiter.js b/src/middlewares/rateLimiter.js new file mode 100644 index 0000000..7e94147 --- /dev/null +++ b/src/middlewares/rateLimiter.js @@ -0,0 +1,22 @@ +'use strict' +const { rateLimitConfigs } = require('@constants/rateLimitConfigs') +const rateLimit = require('express-rate-limit') + +const createRateLimiter = () => { + const limiters = {} + return (name) => { + if (!limiters[name]) { + const config = rateLimitConfigs[name] + limiters[name] = rateLimit(config) + } + return limiters[name] + } +} + +const getRateLimiter = createRateLimiter() + +exports.rateLimiter = (req, res, next) => { + const rateLimitType = req.rateLimit && req.rateLimit.type ? req.rateLimit.type : 'general' + const limiter = getRateLimiter(rateLimitType) + return limiter(req, res, next) +} diff --git a/src/middlewares/routeConfigInjector.js b/src/middlewares/routeConfigInjector.js index 9faf055..b82b329 100644 --- a/src/middlewares/routeConfigInjector.js +++ b/src/middlewares/routeConfigInjector.js @@ -14,11 +14,6 @@ exports.routeConfigInjector = (req, res, next) => { req['inSequence'] = routeConfig.inSequence req['orchestrated'] = routeConfig.orchestrated req['sourceRoute'] = routeConfig.sourceRoute - console.log({ - baseURL, - parsedUrl, - urlWithoutQuery, - routeConfig, - }) + req['rateLimit'] = routeConfig.rateLimit next() } diff --git a/src/middlewares/targetPackagesInjector.js b/src/middlewares/targetPackagesInjector.js index 2dbbd52..bf3c066 100644 --- a/src/middlewares/targetPackagesInjector.js +++ b/src/middlewares/targetPackagesInjector.js @@ -8,5 +8,6 @@ exports.targetPackagesInjector = (req, res, next) => { req['sourceRoute'] = routeConfig.sourceRoute req['orchestrated'] = routeConfig.orchestrated req['responseMessage'] = routeConfig.responseMessage + req['rateLimit'] = routeConfig.rateLimit next() } diff --git a/src/package.json b/src/package.json index ceed204..e7c2eb3 100644 --- a/src/package.json +++ b/src/package.json @@ -21,11 +21,12 @@ "cli-table": "^0.3.11", "cors": "^2.8.5", "dotenv": "^16.3.1", - "elevate-mentoring": "^1.1.44", + "elevate-mentoring": "^1.1.46", "elevate-package-validator": "^1.0.0", "elevate-scheduler": "^1.0.4", - "elevate-user": "^1.1.35", + "elevate-user": "^1.1.37", "express": "^4.18.2", + "express-rate-limit": "^7.2.0", "module-alias": "^2.2.3" }, "devDependencies": { diff --git a/src/router/index.js b/src/router/index.js index 27f4815..b2eae11 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -3,6 +3,7 @@ const { routesConfigs } = require('@constants/routesConfigs') const { orchestrationController } = require('@controllers/orchestration') const { targetPackagesInjector } = require('@middlewares/targetPackagesInjector') const { routeConfigInjector } = require('@middlewares/routeConfigInjector') +const { rateLimiter } = require('@middlewares/rateLimiter') const bodyParser = require('body-parser') const { httpMethods } = require('@constants/httpMethods') @@ -16,12 +17,12 @@ exports.initializeRouter = (packages) => { if (!route.orchestrated) { const basePackageName = route.targetPackages[0].basePackageName const servicePackage = packages.find((obj) => obj.packageMeta.basePackageName === basePackageName) - router[method](route.sourceRoute, routeConfigInjector, servicePackage.packageRouter) + router[method](route.sourceRoute, routeConfigInjector, rateLimiter, servicePackage.packageRouter) } else { - //console.log(route.sourceRoute) router[method]( route.sourceRoute, targetPackagesInjector, + rateLimiter, bodyParser.urlencoded({ extended: true, limit: '50MB' }), bodyParser.json({ limit: '50MB' }), orchestrationController.orchestrationHandler.bind(null, packages) diff --git a/src/utils/packageInstaller.js b/src/utils/packageInstaller.js index 3575936..96b1908 100644 --- a/src/utils/packageInstaller.js +++ b/src/utils/packageInstaller.js @@ -9,12 +9,9 @@ async function installPackages(packageString) { console.error(`Invalid package format: ${userPackage}`) continue } - const installCommand = version ? `${packageName}@${version}` : packageName - try { - const { stdout, stderr } = child_process.execSync(`npm install ${installCommand}`) - //console.log(`${installCommand} installed successfully`) + child_process.execSync(`npm install ${installCommand}`) } catch (error) { console.error(`Error installing ${installCommand}: ${error}`) throw new Error(`Error installing ${installCommand}: ${error}`) diff --git a/src/utils/packageLoader.js b/src/utils/packageLoader.js index 0a8704d..473710c 100644 --- a/src/utils/packageLoader.js +++ b/src/utils/packageLoader.js @@ -6,7 +6,6 @@ const packageLoader = () => { const [packageName, version] = servicePackage.split('@') packages.push(require(packageName)) } - //console.log(packages) return packages } From 0a73b5a68f2d1016c9fbb91aa5dc794fae08f612 Mon Sep 17 00:00:00 2001 From: joffinjoy Date: Tue, 19 Mar 2024 21:12:25 +0530 Subject: [PATCH 2/4] Uncommented Package Installer --- src/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app.js b/src/app.js index ffc3540..cee3b27 100644 --- a/src/app.js +++ b/src/app.js @@ -11,10 +11,10 @@ if (!environmentData.success) { process.exit() } -/* packageInstaller(process.env.REQUIRED_PACKAGES).catch((error) => { +packageInstaller(process.env.REQUIRED_PACKAGES).catch((error) => { console.error(`An error occurred in package installer: ${error}`) process.exit() -}) */ +}) const app = express() const path = require('path') From 50a2c800e0a68c79f287e7b916f2aedffb3835e7 Mon Sep 17 00:00:00 2001 From: joffinjoy Date: Wed, 20 Mar 2024 18:27:41 +0530 Subject: [PATCH 3/4] Early Initialization Of Limiters + Internal & None Type Limiters Implemented --- src/app.js | 5 +- src/constants/config.json | 115 ++++++++++++++++++++++++------ src/constants/rateLimitConfigs.js | 8 +++ src/init.js | 16 +++++ src/jsconfig.json | 29 ++++---- src/middlewares/rateLimiter.js | 19 ++--- 6 files changed, 138 insertions(+), 54 deletions(-) create mode 100644 src/init.js diff --git a/src/app.js b/src/app.js index cee3b27..fc2f910 100644 --- a/src/app.js +++ b/src/app.js @@ -10,11 +10,12 @@ if (!environmentData.success) { console.error('Server could not start . Not all environment variable is provided') process.exit() } +require('./init') -packageInstaller(process.env.REQUIRED_PACKAGES).catch((error) => { +/* packageInstaller(process.env.REQUIRED_PACKAGES).catch((error) => { console.error(`An error occurred in package installer: ${error}`) process.exit() -}) +}) */ const app = express() const path = require('path') diff --git a/src/constants/config.json b/src/constants/config.json index a294cff..4528bc8 100644 --- a/src/constants/config.json +++ b/src/constants/config.json @@ -355,7 +355,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/account/registrationOtp", @@ -384,7 +387,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/user/read/:id", @@ -397,7 +403,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/user/update", @@ -423,7 +432,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/user/share/:id", @@ -436,7 +448,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/user-role/list", @@ -462,7 +477,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/user-role/create", @@ -658,7 +676,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/admin/login", @@ -723,7 +744,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/entity-type/create", @@ -1985,7 +2009,10 @@ "basePackageName": "mentoring", "packageName": "elevate-mentoring" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/mentoring/v1/org-admin/setOrgPolicies", @@ -2024,7 +2051,10 @@ "basePackageName": "mentoring", "packageName": "elevate-mentoring" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/mentoring/v1/organization/update", @@ -2050,7 +2080,10 @@ "basePackageName": "mentoring", "packageName": "elevate-mentoring" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/mentoring/v1/admin/triggerPeriodicViewRefresh", @@ -2089,7 +2122,10 @@ "basePackageName": "mentoring", "packageName": "elevate-mentoring" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/mentoring/v1/admin/triggerViewRebuildInternal", @@ -2102,7 +2138,10 @@ "basePackageName": "mentoring", "packageName": "elevate-mentoring" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/mentoring/v1/mentors/list", @@ -2180,7 +2219,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/admin/addOrgAdmin", @@ -2362,7 +2404,10 @@ "basePackageName": "scheduler", "packageName": "elevate-scheduler" } - ] + ], + "rateLimit": { + "type": "none" + } }, { "sourceRoute": "/scheduler/jobs/updateDelay", @@ -2375,7 +2420,10 @@ "basePackageName": "scheduler", "packageName": "elevate-scheduler" } - ] + ], + "rateLimit": { + "type": "none" + } }, { "sourceRoute": "/scheduler/jobs/remove", @@ -2388,7 +2436,10 @@ "basePackageName": "scheduler", "packageName": "elevate-scheduler" } - ] + ], + "rateLimit": { + "type": "none" + } }, { "sourceRoute": "/scheduler/jobs/list", @@ -2401,7 +2452,10 @@ "basePackageName": "scheduler", "packageName": "elevate-scheduler" } - ] + ], + "rateLimit": { + "type": "none" + } }, { "sourceRoute": "/scheduler/jobs/purge", @@ -2414,7 +2468,10 @@ "basePackageName": "scheduler", "packageName": "elevate-scheduler" } - ] + ], + "rateLimit": { + "type": "none" + } }, { "sourceRoute": "/mentoring/v1/profile/create", @@ -2557,7 +2614,10 @@ "basePackageName": "mentoring", "packageName": "elevate-mentoring" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/mentoring/v1/org-admin/updateOrganization", @@ -2570,7 +2630,10 @@ "basePackageName": "mentoring", "packageName": "elevate-mentoring" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/mentoring/v1/manage-sessions/createdSessions", @@ -2609,7 +2672,10 @@ "basePackageName": "user", "packageName": "elevate-user" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/mentoring/v1/mentees/list", @@ -2856,7 +2922,10 @@ "basePackageName": "mentoring", "packageName": "elevate-mentoring" } - ] + ], + "rateLimit": { + "type": "internal" + } }, { "sourceRoute": "/user/v1/organization/addRelatedOrg/:org_id", diff --git a/src/constants/rateLimitConfigs.js b/src/constants/rateLimitConfigs.js index 473a4d9..9270da0 100644 --- a/src/constants/rateLimitConfigs.js +++ b/src/constants/rateLimitConfigs.js @@ -22,4 +22,12 @@ exports.rateLimitConfigs = { legacyHeaders: false, handler: standardHandler, }, + internal: { + windowMs: 1 * 60 * 1000, + limit: 50, + standardHeaders: false, + legacyHeaders: false, + handler: standardHandler, + skipSuccessfulRequests: true, + }, } diff --git a/src/init.js b/src/init.js new file mode 100644 index 0000000..b4e5aab --- /dev/null +++ b/src/init.js @@ -0,0 +1,16 @@ +'use strict' +const { rateLimitConfigs } = require('@constants/rateLimitConfigs') +const { default: rateLimit } = require('express-rate-limit') + +const initializeRateLimiters = () => { + try { + const limiters = {} + Object.keys(rateLimitConfigs).map((type) => (limiters[type] = rateLimit(rateLimitConfigs[type]))) + return limiters + } catch (error) { + console.log(error) + } +} + +const limiters = initializeRateLimiters() +module.exports = { limiters } diff --git a/src/jsconfig.json b/src/jsconfig.json index 3c59b1a..79d39c5 100644 --- a/src/jsconfig.json +++ b/src/jsconfig.json @@ -6,20 +6,21 @@ "moduleResolution": "node", "resolveJsonModule": true, "paths": { - "@configs*": ["./configs*"], - "@constants*": ["./constants*"], - "@controllers*": ["./controllers*"], - "@db*": ["./db*"], - "@generics*": ["./generics*"], - "@health-checks*": ["./health-checks*"], - "@middlewares*": ["./middlewares*"], - "@public*": ["./public*"], - "@routes*": ["./routes*"], - "@services*": ["./services*"], - "@validators*": ["./validators*"], - "@utils*": ["./utils*"], - "@router*": ["./router*"], - "@helpers*":["./helpers*"] + "@root/*": ["./*"], + "@configs/*": ["./configs/*"], + "@constants/*": ["./constants/*"], + "@controllers/*": ["./controllers/*"], + "@db/*": ["./db/*"], + "@generics/*": ["./generics/*"], + "@health-checks/*": ["./health-checks/*"], + "@middlewares/*": ["./middlewares/*"], + "@public/*": ["./public/*"], + "@routes/*": ["./routes/*"], + "@services/*": ["./services/*"], + "@validators/*": ["./validators/*"], + "@utils/*": ["./utils/*"], + "@router/*": ["./router/*"], + "@helpers/*": ["./helpers/*"] } }, "exclude": ["node_modules", "@shelf/jest-mongodb"] diff --git a/src/middlewares/rateLimiter.js b/src/middlewares/rateLimiter.js index 7e94147..edcf768 100644 --- a/src/middlewares/rateLimiter.js +++ b/src/middlewares/rateLimiter.js @@ -1,22 +1,11 @@ 'use strict' -const { rateLimitConfigs } = require('@constants/rateLimitConfigs') -const rateLimit = require('express-rate-limit') +const initialDependencies = require('@root/init') -const createRateLimiter = () => { - const limiters = {} - return (name) => { - if (!limiters[name]) { - const config = rateLimitConfigs[name] - limiters[name] = rateLimit(config) - } - return limiters[name] - } -} - -const getRateLimiter = createRateLimiter() +const limiters = initialDependencies.limiters exports.rateLimiter = (req, res, next) => { const rateLimitType = req.rateLimit && req.rateLimit.type ? req.rateLimit.type : 'general' - const limiter = getRateLimiter(rateLimitType) + if (rateLimitType == 'none') return next() + const limiter = limiters[rateLimitType] return limiter(req, res, next) } From c5d112c409f945ac232f1cc9760e45d97a21f736 Mon Sep 17 00:00:00 2001 From: joffinjoy Date: Wed, 20 Mar 2024 18:44:47 +0530 Subject: [PATCH 4/4] Made Limiter Windows & Limits Dynamic --- src/app.js | 10 ++-------- src/constants/rateLimitConfigs.js | 12 ++++++------ src/envVariables.js | 30 ++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/app.js b/src/app.js index fc2f910..116559c 100644 --- a/src/app.js +++ b/src/app.js @@ -12,14 +12,13 @@ if (!environmentData.success) { } require('./init') -/* packageInstaller(process.env.REQUIRED_PACKAGES).catch((error) => { +packageInstaller(process.env.REQUIRED_PACKAGES).catch((error) => { console.error(`An error occurred in package installer: ${error}`) process.exit() -}) */ +}) const app = express() const path = require('path') -//const packageValidator = require('./utils/packageValidator'); //Package Loader & Validation const routerPackages = require('@utils/packageLoader').packageLoader() @@ -27,17 +26,12 @@ const routerPackages = require('@utils/packageLoader').packageLoader() const validatedPackages = routerPackages //Bypassing the validator for now app.use(cors()) -/* app.use(bodyParser.urlencoded({ extended: true, limit: '50MB' })); -app.use(bodyParser.json({ limit: '50MB' })); */ -//Router const { initializeRouter } = require('@router') app.use(initializeRouter(validatedPackages)) app.get(process.env.API_DOC_URL, function (req, res) { res.sendFile(path.join(__dirname, './api-doc/index.html')) }) -/* const { initializeOrchestrationRouter } = require('./router/orchestrationRouter'); -app.use('/interface', initializeOrchestrationRouter()); */ app.listen(process.env.APPLICATION_PORT, (res, err) => { if (err) { diff --git a/src/constants/rateLimitConfigs.js b/src/constants/rateLimitConfigs.js index 9270da0..82a7216 100644 --- a/src/constants/rateLimitConfigs.js +++ b/src/constants/rateLimitConfigs.js @@ -9,22 +9,22 @@ const standardHandler = (req, res) => { exports.rateLimitConfigs = { 'public-low': { - windowMs: 2 * 60 * 1000, - limit: 5, + windowMs: process.env.RATE_LIMITER_PUBLIC_LOW_WINDOW, + limit: process.env.RATE_LIMITER_PUBLIC_LOW_LIMIT, standardHeaders: false, legacyHeaders: false, handler: standardHandler, }, general: { - windowMs: 1 * 60 * 1000, - limit: 50, + windowMs: process.env.RATE_LIMITER_GENERAL_WINDOW, + limit: process.env.RATE_LIMITER_GENERAL_LIMIT, standardHeaders: false, legacyHeaders: false, handler: standardHandler, }, internal: { - windowMs: 1 * 60 * 1000, - limit: 50, + windowMs: process.env.RATE_LIMITER_INTERNAL_WINDOW, + limit: process.env.RATE_LIMITER_INTERNAL_LIMIT, standardHeaders: false, legacyHeaders: false, handler: standardHandler, diff --git a/src/envVariables.js b/src/envVariables.js index aff1ae0..87f94e0 100644 --- a/src/envVariables.js +++ b/src/envVariables.js @@ -28,6 +28,36 @@ let environmentVariables = { message: 'Required notification service base URL', optional: false, }, + RATE_LIMITER_PUBLIC_LOW_WINDOW: { + message: 'Required window duration for public-low type', + optional: true, + default: 2 * 60 * 1000, + }, + RATE_LIMITER_PUBLIC_LOW_LIMIT: { + message: 'Required limit for public-low type', + optional: true, + default: 5, + }, + RATE_LIMITER_GENERAL_WINDOW: { + message: 'Required window duration for general type', + optional: true, + default: 1 * 60 * 1000, + }, + RATE_LIMITER_GENERAL_LIMIT: { + message: 'Required limit for general type', + optional: true, + default: 50, + }, + RATE_LIMITER_INTERNAL_WINDOW: { + message: 'Required window duration for internal type', + optional: true, + default: 1 * 60 * 1000, + }, + RATE_LIMITER_INTERNAL_LIMIT: { + message: 'Required limit for internal type', + optional: true, + default: 50, + }, ...config.requiredEnvs, }