Skip to content

Commit

Permalink
feat: use in memory rate limiter
Browse files Browse the repository at this point in the history
The service is massive and redis based rate limiter is spending too much money for a simple thing as this
  • Loading branch information
Kikobeats committed Jan 9, 2024
1 parent 44980de commit 416c978
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 34 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@
"@microlink/mql": "~0.12.2",
"@microlink/ping-url": "~1.4.11",
"@microlink/ua": "~1.2.0",
"async-ratelimiter": "~1.3.13",
"browserless": "~10.2.4",
"cacheable-lookup": "~6.1.0",
"cacheable-response": "~2.8.10",
Expand Down Expand Up @@ -119,6 +118,7 @@
"p-timeout": "~4.1.0",
"puppeteer": "~21.7.0",
"qsm": "~2.1.2",
"rate-limiter-flexible": "~4.0.0",
"router-http": "~1.0.5",
"send-http": "~1.0.6",
"serve-static": "~1.15.0",
Expand Down
39 changes: 22 additions & 17 deletions src/authentication.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
'use strict'

const rateLimiter = require('./util/rate-limiter')
const { RateLimiterMemory } = require('rate-limiter-flexible')
const debug = require('debug-logfmt')('unavatar:rate')

const { API_KEY } = require('./constant')
const { API_KEY, RATE_LIMIT_WINDOW, RATE_LIMIT } = require('./constant')

const rateLimiter = new RateLimiterMemory({
points: RATE_LIMIT,
duration: RATE_LIMIT_WINDOW
})

const more = (() => {
const email = '[email protected]'
Expand All @@ -30,21 +35,21 @@ const rateLimitError = (() => {
return rateLimitError
})()

module.exports = rateLimiter
? async (req, res, next) => {
if (req.headers['x-api-key'] === API_KEY) return next()
const { total, reset, remaining } = await rateLimiter.get({
id: req.ipAddress
})
module.exports = async (req, res, next) => {
if (req.headers['x-api-key'] === API_KEY) return next()

if (!res.writableEnded) {
const _remaining = Math.max(0, remaining - 1)
res.setHeader('X-Rate-Limit-Limit', total)
res.setHeader('X-Rate-Limit-Remaining', _remaining)
res.setHeader('X-Rate-Limit-Reset', reset)
debug(req.ipAddress, { total, remaining: _remaining })
}
const { msBeforeNext, remainingPoints: remaining } = await rateLimiter
.consume(req.ipAddress)
.catch(error => error)

return remaining ? next() : next(rateLimitError)
if (!res.writableEnded) {
res.setHeader('X-Rate-Limit-Limit', RATE_LIMIT)
res.setHeader('X-Rate-Limit-Remaining', remaining)
res.setHeader('X-Rate-Limit-Reset', new Date(Date.now() + msBeforeNext))
debug(req.ipAddress, { total: RATE_LIMIT, remaining })
}
: false

if (remaining) return next()
res.setHeader('Retry-After', msBeforeNext / 1000)
return next(rateLimitError)
}
16 changes: 0 additions & 16 deletions src/util/rate-limiter.js

This file was deleted.

0 comments on commit 416c978

Please sign in to comment.