p-ratelimit
Version:
Promise-based utility to make sure you don’t call rate-limited APIs too quickly.
63 lines • 2.11 kB
JavaScript
;
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