@oas-tools/sla-rate-limit
Version:
Rate limit requests based on SLA4OAI
39 lines (29 loc) • 1.2 kB
JavaScript
import $RefParser from "@apidevtools/json-schema-ref-parser";
import { logger, OASBase } from "@oas-tools/commons";
import metaStore from "./utils/store.js";
export class SLARateLimit extends OASBase {
constructor(oasFile, middleware) {
super(oasFile, middleware);
}
static async initialize(oasDoc, config) {
const slaFile = await $RefParser.dereference(
config.slaFile ?? `${process.cwd()}/api/oas-sla.yaml`
);
const store = new metaStore(slaFile, config);
const middleware = (req, res, next) => {
let plan = res.locals.oas?.security?.[config.scheme ?? "apikey"]?.plan;
if (!slaFile.plans[plan]) {
logger.warn(`plan ${plan} is not defined in the SLA.`);
plan = Object.keys(slaFile.plans)[0];
}
logger.info(`Using "${plan}" plan`);
const endpoint = `${req.method}%%${req.route.path}`;
const key = `${req.ip}%%${plan}%%${endpoint}`;
let limiters = store.get(key);
if (!limiters) limiters = store.add(key);
const {speedLimiter, rateLimiter} = limiters;
speedLimiter(req, res, () => rateLimiter(req, res, next));
}
return new SLARateLimit(oasDoc, middleware);
}
}