@fightmegg/riot-rate-limiter
Version:
Rate Limiter for Riot Games API
51 lines (50 loc) • 2.2 kB
JavaScript
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;
}));
};