@vtex/api
Version:
VTEX I/O API client
44 lines (43 loc) • 1.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.concurrentRateLimiter = exports.perMinuteRateLimiter = void 0;
const errors_1 = require("../../../../../errors");
const tokenBucket_1 = require("../../utils/tokenBucket");
const responseMessageConcurrent = 'Rate Exceeded: Too many requests in execution';
const responseMessagePerMinute = 'Rate Exceeded: Too many requests per minute';
function noopMiddleware(_, next) {
return next();
}
function perMinuteRateLimiter(rateLimit, globalLimiter) {
if (!rateLimit && !globalLimiter) {
return noopMiddleware;
}
const tokenBucket = (0, tokenBucket_1.createTokenBucket)(rateLimit, globalLimiter);
return function perMinuteRateMiddleware(ctx, next) {
if (!tokenBucket.removeTokensSync(1)) {
throw new errors_1.TooManyRequestsError(responseMessagePerMinute);
}
return next();
};
}
exports.perMinuteRateLimiter = perMinuteRateLimiter;
function concurrentRateLimiter(rateLimit) {
if (!rateLimit) {
return noopMiddleware;
}
let reqsInExecution = 0;
const maxRequests = rateLimit;
return async function concurrentRateMiddleware(ctx, next) {
if (reqsInExecution >= maxRequests) {
throw new errors_1.TooManyRequestsError(responseMessageConcurrent);
}
reqsInExecution++;
try {
await next();
}
finally {
reqsInExecution--;
}
};
}
exports.concurrentRateLimiter = concurrentRateLimiter;