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