From 58e5017159ebe9b89327b1647cb433a412be2a46 Mon Sep 17 00:00:00 2001 From: bdistin Date: Sat, 23 Jun 2018 16:08:40 -0500 Subject: [PATCH] fix: ratelimits (#2615) * Add timeDifference calcs back into ratelimits And fix x-ratelimit-reset is in seconds, not ms: https://puu.sh/AIXxY/9b3989b248.png * mutate reset time with date header instead * fix defaulting of reset and remaining if the reset header is not available, then the reset time should be Date.now() instead of the difference between the date header and Date.now() If the date header is null, fall back to Date.now() since it's the best we can do (this should never happen, but safer to handle it just in case) if remaining is 0 we don't want to default it back to 1 since 0 is falsy --- src/rest/RESTManager.js | 10 ---------- src/rest/handlers/RequestHandler.js | 10 +++++++--- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/rest/RESTManager.js b/src/rest/RESTManager.js index 586125a54..cf6227a8a 100644 --- a/src/rest/RESTManager.js +++ b/src/rest/RESTManager.js @@ -12,7 +12,6 @@ class RESTManager { this.globallyRateLimited = false; this.tokenPrefix = tokenPrefix; this.versioned = true; - this.timeDifferences = []; if (client.options.restSweepInterval > 0) { client.setInterval(() => { this.handlers.sweep(handler => handler._inactive); @@ -24,15 +23,6 @@ class RESTManager { return routeBuilder(this); } - get timeDifference() { - return Math.round(this.timeDifferences.reduce((a, b) => a + b, 0) / this.timeDifferences.length); - } - - set timeDifference(ms) { - this.timeDifferences.unshift(ms); - if (this.timeDifferences.length > 5) this.timeDifferences.length = 5; - } - getAuth() { const token = this.client.token || this.client.accessToken; const prefixed = !!this.client.application || (this.client.user && this.client.user.bot); diff --git a/src/rest/handlers/RequestHandler.js b/src/rest/handlers/RequestHandler.js index 2c5655814..03e5e8fca 100644 --- a/src/rest/handlers/RequestHandler.js +++ b/src/rest/handlers/RequestHandler.js @@ -29,7 +29,7 @@ class RequestHandler { } get _inactive() { - return this.queue.length === 0 && !this.limited && Date.now() > this.resetTime && this.busy !== true; + return this.queue.length === 0 && !this.limited && this.busy !== true; } /* eslint-disable prefer-promise-reject-errors */ @@ -78,8 +78,12 @@ class RequestHandler { if (res && res.headers) { if (res.headers.get('x-ratelimit-global')) this.manager.globallyRateLimited = true; this.limit = Number(res.headers.get('x-ratelimit-limit') || Infinity); - this.resetTime = Number(res.headers.get('x-ratelimit-reset') || 0); - this.remaining = Number(res.headers.get('x-ratelimit-remaining') || 1); + const reset = res.headers.get('x-ratelimit-reset'); + this.resetTime = reset !== null ? + (Number(reset) * 1e3) - new Date(res.headers.get('date') || Date.now()).getTime() + Date.now() : + Date.now(); + const remaining = res.headers.get('x-ratelimit-remaining'); + this.remaining = remaining !== null ? Number(remaining) : 1; } if (res.ok) {