UNPKG

iracing-api

Version:

Javascript client for iracing API

52 lines (51 loc) 2.15 kB
import { DEFAULT_RATE_LIMIT_PADDING } from './consts'; import { logger } from './logger'; export class RateLimiter { constructor(options) { var _a; this.isActive = false; this.rateLimit = undefined; this.limitPadding = DEFAULT_RATE_LIMIT_PADDING; this.updateRateLimit = (response) => { if (!this.isActive) return; this.rateLimit = this._getRateLimit(response); }; this.checkRateLimit = () => { if (!this.isActive) return true; if (!this.rateLimit) return true; if (this.rateLimit.remaining > this.limitPadding) return true; if (this.rateLimit.reset < new Date()) { this.rateLimit = undefined; return true; } return false; }; this.waitForReset = async () => { if (!this.isActive || !this.rateLimit) return; const timeToReset = this.rateLimit.reset.getTime() - new Date().getTime() + 1000; logger(`Rate limit exceeded. Waiting for reset at ${this.rateLimit.reset.toLocaleString()}...`); await new Promise((resolve) => setTimeout(resolve, timeToReset)); }; this._getRateLimit = (response) => { var _a, _b, _c; const limit = (_a = +response.headers.get('x-ratelimit-limit')) !== null && _a !== void 0 ? _a : 0; const remaining = (_b = +response.headers.get('x-ratelimit-remaining')) !== null && _b !== void 0 ? _b : 0; const reset = new Date(((_c = +response.headers.get('x-ratelimit-reset')) !== null && _c !== void 0 ? _c : 0) * 1000); return { limit, remaining, reset }; }; if (RateLimiter.instance) { return RateLimiter.instance; } if (options.manageRateLimit) { this.isActive = true; this.limitPadding = (_a = options.rateLimitPadding) !== null && _a !== void 0 ? _a : DEFAULT_RATE_LIMIT_PADDING; } RateLimiter.instance = this; } }