sixth-node
Version:
77 lines (65 loc) • 2 kB
JavaScript
import axios from 'axios';
import listEndpoints from 'express-list-endpoints';
function getDate() {
let _now = Date;
return {
seconds: _now.now()
}
}
const rateLimitMiddleWare = (_apikey, _app, _config, routes, _log_dict) => {
function _is_rate_limit_reached(uid, route){
var date = getDate().seconds
var timestamp = getDate().seconds
var requests = null
try{
requests = _log_dict[route][uid]
}catch{
}
const rate_limit = _config.rate_limiter[route].rate_limit
const interval = _config.rate_limiter[route].interval
if (requests == null){
requests = []
_log_dict[route][uid] = []
}
if (requests.length < rate_limit){
_log_dict[route][uid].push(timestamp)
return true
}
const new_req = _log_dict[route][uid].filter((news =>
news>timestamp-(interval*1000)
))
if (new_req.length<rate_limit){
_log_dict[route][uid].push(timestamp)
return true
}
else{
_log_dict[route][uid].push(timestamp)
return false
}
}
return (req, res, next) => {
// Middleware logic
const host = req.headers.host
var route = req.originalUrl
var body = req.body
route = route.replace(/\//g, "~")
axios.get("https://backend.withsix.co/project-config/config/get-route-rate-limit/"+_apikey+"/"+route).then(response=>{
if (response.statusText=="OK"){
_config.rate_limiter[route] = response.data
const preferred_id = _config.rate_limiter[route].unique_id == "" || _config.rate_limiter[route].unique_id == "host"? host : body[_config.rate_limiter[route].unique_id]
if (_is_rate_limit_reached(preferred_id, route)){
next()
}
else{
const old_json = res.json;
res.json = old_json
res.status(401)
return old_json.call(res, {
"message": "max request reached"
});
}
}
})
};
};
export default rateLimitMiddleWare;