UNPKG

@fightmegg/riot-rate-limiter

Version:
51 lines (50 loc) 2.2 kB
import Bottleneck from "bottleneck"; import { chainRateLimiters, createRateLimiterOptions } from "./utils"; export const createRateLimiters = (rateLimits, opts) => { const { limits, counts } = rateLimits; const limitsArr = limits.split(","); const countsArr = counts.split(","); const rateLimiters = {}; rateLimiters.limiters = limitsArr.map((limit, index) => new Bottleneck(createRateLimiterOptions(limit, countsArr[index], { ...opts, id: `${opts.id}_${index}`, }))); rateLimiters.limiters = chainRateLimiters(rateLimiters.limiters); rateLimiters.main = rateLimiters.limiters[0]; return rateLimiters; }; export const createRateLimitRetry = (limitType, retryAfterDefault, retryLimit) => (err, jobInfo) => { if (jobInfo.retryCount >= retryLimit - 1) return; if (err.status === 429) { if (Array.isArray(limitType) && limitType.includes(err.limitType)) return err.retryAfter; else return err.retryAfter || retryAfterDefault; } }; export const updateRateLimiters = (rateLimiters, rateLimits) => { const { limits, counts } = rateLimits; const limitsArr = limits.split(","); const countsArr = counts.split(","); return rateLimiters.map((limiter, index) => { limiter.updateSettings(createRateLimiterOptions(limitsArr[index], countsArr[index])); return limiter; }); }; export const synchronizeRateLimiters = async (rateLimiters, rateLimits, methodCounts) => { const { limits, counts } = rateLimits; const limitsArr = limits.split(","); const countsArr = counts.split(","); const requestsInFlight = methodCounts.EXECUTING; return Promise.all(rateLimiters.map(async (limiter, index) => { const currentReservoir = await limiter.currentReservoir(); if (!currentReservoir) return limiter; const newRateLimits = createRateLimiterOptions(limitsArr[index], countsArr[index]); const rateLimitsLeftFromRiot = newRateLimits.reservoir || 0; const newReservoir = rateLimitsLeftFromRiot - requestsInFlight; limiter.updateSettings({ reservoir: newReservoir }); return limiter; })); };