UNPKG

@suin/esa-api

Version:

esa.io APIクライアント

66 lines 2.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setRatelimit = exports.Ratelimit = void 0; const is_object_1 = require("@suin/is-object"); class Ratelimit { limit; remaining; reset; constructor({ limit, remaining, reset, }) { this.limit = limit; this.remaining = remaining; this.reset = reset; } get resetAsDate() { return new Date(this.reset * 1000); } async cooldown(timeoutMilliseconds = 15 * 60 * 1000) { if (this.remaining > 0) { return; } const milliseconds = this.reset - Date.now(); let timer1 = 0; let timer2 = 0; try { await Promise.race([ new Promise((resolve) => (timer1 = setTimeout(resolve, milliseconds))), new Promise((resolve) => (timer2 = setTimeout(resolve, timeoutMilliseconds))), ]); } finally { clearTimeout(timer1); clearTimeout(timer2); } } } exports.Ratelimit = Ratelimit; function setRatelimit(responseOrError) { let response; let returns; if ((0, is_object_1.isObject)(responseOrError) && "headers" in responseOrError) { response = responseOrError; returns = responseOrError; } else { returns = Promise.reject(responseOrError); response = isAxiosError(responseOrError) && (0, is_object_1.isObject)(responseOrError.response) ? responseOrError.response : undefined; } if (response === undefined) { return returns; } const limit = parseInt(response.headers?.["x-ratelimit-limit"]); const remaining = parseInt(response.headers?.["x-ratelimit-remaining"]); const reset = parseInt(response.headers?.["x-ratelimit-reset"]); if (Number.isInteger(limit) && Number.isInteger(remaining) && Number.isInteger(reset)) { response.ratelimit = new Ratelimit({ limit, remaining, reset }); } return returns; } exports.setRatelimit = setRatelimit; const isAxiosError = (error) => (0, is_object_1.isObject)(error) && error.isAxiosError === true; //# sourceMappingURL=ratelimit.js.map