UNPKG

@rexxars/p-ratelimit

Version:

Promise-based utility to make sure you don’t call rate-limited APIs too quickly.

63 lines 2.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.pRateLimit = void 0; var dequeue_1 = require("./dequeue"); var quotaManager_1 = require("./quota/quotaManager"); var rateLimitTimeoutError_1 = require("./rateLimitTimeoutError"); function pRateLimit(quotaManager) { if (!quotaManager || !('start' in quotaManager)) { return pRateLimit(quotaManager_1.getQuotaManager(quotaManager)); } var queue = dequeue_1.dequeue(); var timerId = null; var next = function () { while (queue.length() && quotaManager.start()) { queue.shift()(); } if (queue.length() && !quotaManager.activeCount() && !timerId) { timerId = setTimeout(function () { timerId = null; next(); }, 100); } }; return function (fn) { return new Promise(function (resolve, reject) { var timerId = null; if (quotaManager.maxDelay()) { timerId = setTimeout(function () { timerId = null; reject(new rateLimitTimeoutError_1.RateLimitTimeoutError('queue maxDelay timeout exceeded', quotaManager.maxDelay())); next(); }, quotaManager.maxDelay()); } var run = function () { if (quotaManager.maxDelay()) { if (timerId) { clearTimeout(timerId); } else { // timeout already fired return; } } fn() .then(function (val) { quotaManager.end(); resolve(val); }) .catch(function (err) { quotaManager.end(); reject(err); }) .then(function () { next(); }); }; queue.push(run); next(); }); }; } exports.pRateLimit = pRateLimit; //# sourceMappingURL=rateLimit.js.map