@fightmegg/riot-rate-limiter
Version:
Rate Limiter for Riot Games API
54 lines (53 loc) • 2.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractRateLimits = exports.toNumber = exports.secsToMs = exports.chainRateLimiters = exports.createJobOptions = exports.createRateLimiterOptions = void 0;
const bottleneck_1 = __importDefault(require("bottleneck"));
const defaultRateLimiterOptions = {
maxConcurrent: 1,
strategy: bottleneck_1.default.strategy.OVERFLOW,
};
const createRateLimiterOptions = (limit, count, options) => {
const limits = limit.split(":").map(exports.toNumber);
const counts = count.split(":").map(exports.toNumber);
if (!limits.length || limits.length < 2)
throw new Error("invalid rate limits");
return {
...defaultRateLimiterOptions,
...(options || {}),
reservoir: limits[0] - (counts[0] || 0),
reservoirRefreshAmount: limits[0],
reservoirRefreshInterval: (0, exports.secsToMs)(limits[1]),
minTime: (0, exports.secsToMs)(limits[1]) / limits[0],
};
};
exports.createRateLimiterOptions = createRateLimiterOptions;
const createJobOptions = (options = {}) => ({
id: String(Date.now()),
...options,
weight: 1,
});
exports.createJobOptions = createJobOptions;
const chainRateLimiters = (rl) => {
for (let i = rl.length - 1; i >= 0; i--) {
if (rl[i - 1])
rl[i - 1].chain(rl[i]);
}
return rl;
};
exports.chainRateLimiters = chainRateLimiters;
const secsToMs = (secs) => secs * 1000;
exports.secsToMs = secsToMs;
const toNumber = (n) => Number(n);
exports.toNumber = toNumber;
const extractRateLimits = (headers) => ({
appLimits: headers.get("X-App-Rate-Limit") || "10:10,500:600",
appCounts: headers.get("X-App-Rate-Limit-Count") || "1:10,1:600",
methodLimits: headers.get("X-Method-Rate-Limit") || "",
methodCounts: headers.get("X-Method-Rate-Limit-Count") || "",
retryAfter: (0, exports.secsToMs)((0, exports.toNumber)(headers.get("Retry-After") || "")),
limitType: headers.get("X-Rate-Limit-Type"),
});
exports.extractRateLimits = extractRateLimits;