iracing-api
Version:
Javascript client for iracing API
52 lines (51 loc) • 2.15 kB
JavaScript
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;
}
}