UNPKG

blockfrost-js-ratelimited

Version:

A JavaScript/TypeScript SDK for interacting with the https://blockfrost.io API

51 lines (50 loc) 1.99 kB
"use strict"; 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;