Skip to content

Commit

Permalink
Fix some ratelimit code
Browse files Browse the repository at this point in the history
  • Loading branch information
abalabahaha committed Feb 23, 2017
1 parent 1630145 commit b106424
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 12 deletions.
33 changes: 22 additions & 11 deletions lib/rest/RequestHandler.js
Expand Up @@ -17,7 +17,9 @@ class RequestHandler {
this.latencyRef = {
latency: 500,
raw: [500, 500, 500, 500, 500, 500, 500, 500, 500, 500],
total: 5000
total: 5000,
timeOffset: 0,
lastTimeOffsetCheck: 0
};
this.globalBlock = false;
this.readyQueue = [];
Expand All @@ -37,7 +39,7 @@ class RequestHandler {
routefy(url) {
return url.replace(/\/([a-z-]+)\/(?:[0-9]{17,})+?/g, function(match, p) {
return p === "channels" || p === "guilds" ? match : `/${p}/:id`;
});
}).replace(/\/reactions\/.+/g, "/reactions/:id");
}

/**
Expand Down Expand Up @@ -132,16 +134,25 @@ class RequestHandler {
var latency = Date.now();

req.once("response", (resp) => {
latency = Date.now() - latency;
this.latencyRef.total = this.latencyRef.total - this.latencyRef.raw.shift() + latency;
this.latencyRef.latency = ~~(this.latencyRef.total / this.latencyRef.raw.push(latency));

var response = "";

resp.on("data", (chunk) => {
response += chunk;
});

resp.once("end", () => {
latency = Date.now() - Math.min((+resp.headers["x-ratelimit-reset"] * 1000) || Date.now(), latency);
this.latencyRef.total = this.latencyRef.total - this.latencyRef.raw.shift() + latency;
this.latencyRef.latency = ~~(this.latencyRef.total / this.latencyRef.raw.push(latency));
var now = Date.now();
if(this.latencyRef.lastTimeOffsetCheck < now - 60000) {
var timeOffset = Date.parse(resp.headers["date"]) - (this.latencyRef.lastTimeOffsetCheck = now);
if(~~(this.latencyRef.timeOffset) - this.latencyRef.latency >= 5000 && ~~(timeOffset) - this.latencyRef.latency >= 5000) {
this._client.emit("error", new Error(`Your clock is ${this.latencyRef.timeOffset}ms behind Discord's server clock. Please check your connection and system time.`));
}
this.latencyRef.timeOffset = timeOffset;
}

if(resp.headers["x-ratelimit-limit"]) {
this.ratelimits[route].limit = +resp.headers["x-ratelimit-limit"];
Expand All @@ -154,19 +165,19 @@ class RequestHandler {
this.globalBlock = true;
setTimeout(() => this.globalUnblock(), +resp.headers["retry-after"] || 1);
} else {
this.ratelimits[route].reset = (+resp.headers["retry-after"] || 1) + Date.now();
this.ratelimits[route].reset = (+resp.headers["retry-after"] || 1) + now;
}
} else if(resp.headers["x-ratelimit-reset"]) {
this.ratelimits[route].reset = Math.max(Math.max(1000 * resp.headers["x-ratelimit-reset"], this.ratelimits[route].reset), Date.now());
this.ratelimits[route].reset = Math.max(+resp.headers["x-ratelimit-reset"] * (route.endsWith("/reactions/:id") ? 250 : 1000) + this.latencyRef.timeOffset, now);
}

if(resp.statusCode !== 429) {
this._client.emit("debug", `${body && body.content} ${Date.now()} ${route} ${resp.statusCode}: ${latency}ms (${this.latencyRef.latency}ms avg) | ${this.ratelimits[route].remaining}/${this.ratelimits[route].limit} left | Reset ${this.ratelimits[route].reset} (${this.ratelimits[route].reset - Date.now()}ms left)`);
this._client.emit("debug", `${body && body.content} ${now} ${route} ${resp.statusCode}: ${latency}ms (${this.latencyRef.latency}ms avg) | ${this.ratelimits[route].remaining}/${this.ratelimits[route].limit} left | Reset ${this.ratelimits[route].reset} (${this.ratelimits[route].reset - now}ms left)`);
}

if(resp.statusCode >= 300) {
if(resp.statusCode === 429) {
this._client.emit("warn", `${resp.headers["x-ratelimit-global"] ? "Global" : "Unexpected"} 429 (╯°□°)╯︵ ┻━┻: ${response}\n${body && body.content} ${Date.now()} ${route} ${resp.statusCode}: ${latency}ms (${this.latencyRef.latency}ms avg) | ${this.ratelimits[route].remaining}/${this.ratelimits[route].limit} left | Reset ${this.ratelimits[route].reset} (${this.ratelimits[route].reset - Date.now()}ms left)`);
this._client.emit("warn", `${resp.headers["x-ratelimit-global"] ? "Global" : "Unexpected"} 429 (╯°□°)╯︵ ┻━┻: ${response}\n${body && body.content} ${now} ${route} ${resp.statusCode}: ${latency}ms (${this.latencyRef.latency}ms avg) | ${this.ratelimits[route].remaining}/${this.ratelimits[route].limit} left | Reset ${this.ratelimits[route].reset} (${this.ratelimits[route].reset - now}ms left)`);
if(resp.headers["retry-after"]) {
setTimeout(() => {
this.request(method, url, auth, body, file, route, true).then(resolve).catch(reject);
Expand Down Expand Up @@ -207,8 +218,8 @@ class RequestHandler {
});
});

req.setTimeout(10000, function() {
reqError = new Error(`Request timed out (>10000ms) on ${method} ${url}`);
req.setTimeout(15000, function() {
reqError = new Error(`Request timed out (>15000ms) on ${method} ${url}`);
req.abort();
});

Expand Down
4 changes: 3 additions & 1 deletion lib/util/SequentialBucket.js
Expand Up @@ -19,7 +19,9 @@ class SequentialBucket {
this.resetInterval = 0;
this.reset = 0;
this.processing = false;
this.latencyRef = latencyRef;
this.latencyRef = latencyRef || {
latency: 0
};
this._queue = [];
}

Expand Down

0 comments on commit b106424

Please sign in to comment.