@suin/esa-api
Version:
esa.io APIクライアント
66 lines • 2.22 kB
JavaScript
;
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