mirror of
https://github.com/fullstack-cash/bch-api.git
synced 2026-09-21 16:52:04 -07:00
fix(rate-limit.js): Refactored to use JS Class
This commit is contained in:
+4
-2
@@ -3,7 +3,9 @@
|
||||
const express = require("express")
|
||||
|
||||
// Middleware
|
||||
const { routeRateLimit } = require("./middleware/route-ratelimit")
|
||||
// const { routeRateLimit } = require("./middleware/route-ratelimit")
|
||||
const RateLimits = require("./middleware/route-ratelimit")
|
||||
const rateLimits = new RateLimits()
|
||||
|
||||
const path = require("path")
|
||||
const logger = require("morgan")
|
||||
@@ -84,7 +86,7 @@ app.use(`/${v3prefix}/`, auth.mw())
|
||||
|
||||
// Rate limit on all v3 routes
|
||||
// Establish and enforce rate limits.
|
||||
app.use(`/${v3prefix}/`, routeRateLimit)
|
||||
app.use(`/${v3prefix}/`, rateLimits.routeRateLimit)
|
||||
|
||||
app.use(`/${v3prefix}/` + `health-check`, healthCheckV3)
|
||||
app.use(`/${v3prefix}/` + `blockchain`, blockchainV3.router)
|
||||
|
||||
@@ -32,7 +32,14 @@ const maxRequests = process.env.RATE_LIMIT_MAX_REQUESTS
|
||||
// Unique route mapped to its rate limit
|
||||
const uniqueRateLimits = {}
|
||||
|
||||
const routeRateLimit = async function(req, res, next) {
|
||||
let _this
|
||||
|
||||
class RateLimits {
|
||||
constructor() {
|
||||
_this = this
|
||||
}
|
||||
|
||||
async routeRateLimit(req, res, next) {
|
||||
// Disable rate limiting if 0 passed from RATE_LIMIT_MAX_REQUESTS
|
||||
if (maxRequests === 0) return next()
|
||||
|
||||
@@ -70,7 +77,7 @@ const routeRateLimit = async function(req, res, next) {
|
||||
// If JWT if valid, evaluate the API level for the user.
|
||||
if (jwtInfo.isValid) {
|
||||
// Set fine-grain permissions for each user based on the JWT token.
|
||||
const userPermissions = evalUserPermissioins(req, jwtInfo)
|
||||
const userPermissions = _this.evalUserPermissioins(req, jwtInfo)
|
||||
// console.log(
|
||||
// `userPermissions: ${JSON.stringify(userPermissions, null, 2)}`
|
||||
// )
|
||||
@@ -163,7 +170,7 @@ const routeRateLimit = async function(req, res, next) {
|
||||
// It does fine-grane analysis on the data coming from the auth servers and
|
||||
// uses its output to adjust rate limits on-the-fly based on the users
|
||||
// permission level.
|
||||
function evalUserPermissioins(req, authData) {
|
||||
evalUserPermissioins(req, authData) {
|
||||
// console.log(`authData: ${JSON.stringify(authData, null, 2)}`)
|
||||
|
||||
// Return object with default values
|
||||
@@ -196,5 +203,6 @@ function evalUserPermissioins(req, authData) {
|
||||
|
||||
return retObj
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { routeRateLimit }
|
||||
module.exports = RateLimits
|
||||
|
||||
@@ -18,7 +18,7 @@ util.inspect.defaultOptions = { depth: 1 }
|
||||
const SERVER = `http://localhost:3000/v3/`
|
||||
|
||||
const TEST_JWT =
|
||||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVkYTc5ZDk4OTYyMjRjNjM2MmQwYzkwMiIsImlhdCI6MTU3MTUzOTU1MSwiZXhwIjoxNTc0MTMxNTUxfQ.PfPW_Z2NYT1O2zUHXopcz2aLGHSGudaKOIGnt7SuAi4"
|
||||
"eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVlM2EwNDE1ZWIyOWE5NjJkYTI3MDhiNCIsImFwaUxldmVsIjowLCJyYXRlTGltaXQiOjEwLCJpYXQiOjE1ODA4NjA0NjcsImV4cCI6MTU4MzQ1MjQ2N30.fuY5S-YrF0J11h5uyMjPe7wiVkYRnIyXi4dL9-V-C6pLJm33p0dSq_pSheVVWw78n5kAvL_9kFHngbnmQiOJYQ"
|
||||
|
||||
describe("#rate limits", () => {
|
||||
it("should get control/getNetworkInfo() with no auth", async () => {
|
||||
|
||||
+20
-13
@@ -12,7 +12,10 @@ util.inspect.defaultOptions = { depth: 1 }
|
||||
const { mockReq, mockRes, mockNext } = require("./mocks/express-mocks")
|
||||
|
||||
// Libraries under test
|
||||
let rateLimitMiddleware = require("../../src/middleware/route-ratelimit")
|
||||
const RateLimits = require("../../src/middleware/route-ratelimit")
|
||||
const rateLimits = new RateLimits()
|
||||
let rateLimitMiddleware = rateLimits.routeRateLimit
|
||||
|
||||
const controlRoute = require("../../src/routes/v3/full-node/control")
|
||||
const jwtAuth = require("../../src/middleware/jwt-auth")
|
||||
|
||||
@@ -74,6 +77,7 @@ describe("#route-ratelimits & jwt-auth", () => {
|
||||
})
|
||||
|
||||
describe("#routeRateLimit", () => {
|
||||
rateLimitMiddleware = new RateLimits()
|
||||
let routeRateLimit = rateLimitMiddleware.routeRateLimit
|
||||
const getInfo = controlRoute.testableComponents.getInfo
|
||||
|
||||
@@ -112,10 +116,11 @@ describe("#route-ratelimits & jwt-auth", () => {
|
||||
|
||||
it("should NOT trigger rate-limit for free-tier at 5 RPM", async () => {
|
||||
// Clear the require cache before running this test.
|
||||
delete require.cache[
|
||||
require.resolve("../../src/middleware/route-ratelimit")
|
||||
]
|
||||
rateLimitMiddleware = require("../../src/middleware/route-ratelimit")
|
||||
// delete require.cache[
|
||||
// require.resolve("../../src/middleware/route-ratelimit")
|
||||
// ]
|
||||
// rateLimitMiddleware = require("../../src/middleware/route-ratelimit")
|
||||
rateLimitMiddleware = new RateLimits()
|
||||
routeRateLimit = rateLimitMiddleware.routeRateLimit
|
||||
|
||||
req.baseUrl = "/v3"
|
||||
@@ -167,10 +172,11 @@ describe("#route-ratelimits & jwt-auth", () => {
|
||||
|
||||
it("should NOT trigger rate-limit handler for pro-tier at 25 RPM", async () => {
|
||||
// Clear the require cache before running this test.
|
||||
delete require.cache[
|
||||
require.resolve("../../src/middleware/route-ratelimit")
|
||||
]
|
||||
rateLimitMiddleware = require("../../src/middleware/route-ratelimit")
|
||||
// delete require.cache[
|
||||
// require.resolve("../../src/middleware/route-ratelimit")
|
||||
// ]
|
||||
// rateLimitMiddleware = require("../../src/middleware/route-ratelimit")
|
||||
rateLimitMiddleware = new RateLimits()
|
||||
routeRateLimit = rateLimitMiddleware.routeRateLimit
|
||||
|
||||
req.baseUrl = "/v3"
|
||||
@@ -199,10 +205,11 @@ describe("#route-ratelimits & jwt-auth", () => {
|
||||
|
||||
it("rate-limiting should still kick in at a higher RPM for pro-tier", async () => {
|
||||
// Clear the require cache before running this test.
|
||||
delete require.cache[
|
||||
require.resolve("../../src/middleware/route-ratelimit")
|
||||
]
|
||||
rateLimitMiddleware = require("../../src/middleware/route-ratelimit")
|
||||
// delete require.cache[
|
||||
// require.resolve("../../src/middleware/route-ratelimit")
|
||||
// ]
|
||||
// rateLimitMiddleware = require("../../src/middleware/route-ratelimit")
|
||||
rateLimitMiddleware = new RateLimits()
|
||||
routeRateLimit = rateLimitMiddleware.routeRateLimit
|
||||
|
||||
req.baseUrl = "/v3"
|
||||
|
||||
Reference in New Issue
Block a user