UNPKG

@vtex/api

Version:
44 lines (43 loc) 1.54 kB
"use strict"; 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;