UNPKG

p-ratelimit

Version:

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

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