blockfrost-js-ratelimited
Version:
A JavaScript/TypeScript SDK for interacting with the https://blockfrost.io API
51 lines (50 loc) • 1.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createRateLimiter = exports.defaultRateLimiterConfig = void 0;
exports.defaultRateLimiterConfig = {
requestsPerSecond: 10,
burstCooldownPerSecond: 10,
maxBurst: 500,
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
const createRateLimiter = ({ burstCooldownPerSecond, maxBurst, requestsPerSecond, } = exports.defaultRateLimiterConfig) => {
let remainingBurst = maxBurst;
// eslint-disable-next-line @typescript-eslint/ban-types
let usedRequests = 0;
let restoreBurstInterval = null;
const startRestoreBurstInterval = () => {
restoreBurstInterval = setInterval(() => {
remainingBurst = Math.min(maxBurst, remainingBurst + burstCooldownPerSecond);
if (remainingBurst === maxBurst) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
clearInterval(restoreBurstInterval);
restoreBurstInterval = null;
}
}, 1000);
};
const _readyForNextRequest = () => {
if (usedRequests < requestsPerSecond && remainingBurst === maxBurst) {
usedRequests++;
if (usedRequests === requestsPerSecond) {
setTimeout(() => {
usedRequests = 0;
}, 1000);
}
return Promise.resolve();
}
if (remainingBurst > 0) {
remainingBurst--;
if (!restoreBurstInterval) {
startRestoreBurstInterval();
}
return Promise.resolve();
}
return new Promise(resolve => setTimeout(() => _readyForNextRequest().then(resolve), 1000));
};
let previousRequestReady = Promise.resolve();
return () => {
return (previousRequestReady =
previousRequestReady.then(_readyForNextRequest));
};
};
exports.createRateLimiter = createRateLimiter;