GitHub auth: no longer rely on buggy rate limit cache

This commit is contained in:
Thaddee Tyl 2016-06-26 18:23:53 +02:00
parent a3ba53a0d8
commit 63e25b29eb

View File

@ -126,61 +126,39 @@ function sendTokenToAllServers(token) {
var reqRemaining = new Map(); // From token to requests remaining.
var reqReset = new Map(); // From token to timestamp.
var highestReqRemaining = 0, highestReqRemainingToken;
// Set highestReqRemaining* variables if the token / requests remaining
// combination passed as a parameter is higher than previously registered.
function setHighestReqRemaining(token, reqs) {
// Equality is allowed to ensure that we have a token set as
// highestReqRemainingToken (or else there are no user tokens given).
if (reqs >= highestReqRemaining) {
highestReqRemaining = reqs;
highestReqRemainingToken = token;
}
}
// token: client token as a string.
// reqs: number of requests remaining.
// reset: timestamp when the number of remaining requests is reset.
function setReqRemaining(token, reqs, reset) {
setHighestReqRemaining(token, reqs);
reqRemaining.set(token, reqs);
reqReset.set(token, reset);
}
// Retrieve a user token if there is one for which we believe there are requests
// remaining. Return undefined if we could not find one.
function getReqRemainingToken() {
if (highestReqRemaining > 0) {
return highestReqRemainingToken;
} else {
// Go through the user tokens.
// Keep the first one which is usable or has reset.
var now = +new Date();
for (var token of reqReset.keys()) {
var hasRemainingReqs = reqRemaining.get(token) > 0;
var isBeyondRateLimitReset = reqReset.get(token) < now;
if (hasRemainingReqs || isBeyondRateLimitReset) {
highestReqRemainingToken = token;
highestReqRemaining = reqRemaining.get(token);
return highestReqRemainingToken
}
}
}
}
function rmReqRemaining(token) {
reqRemaining.delete(token);
reqReset.delete(token);
if (highestReqRemainingToken === token) {
highestReqRemaining = 0;
highestReqRemainingToken = undefined;
reqRemaining.forEach(setHighestReqRemaining);
}
// Retrieve a user token if there is one for which we believe there are requests
// remaining. Return undefined if we could not find one.
function getReqRemainingToken() {
// Go through the user tokens.
// Keep the first one which is usable or has reset.
var now = +new Date();
for (var token of reqReset.keys()) {
var reqs = reqRemaining.get(token);
var reset = reqReset.get(token);
var hasRemainingReqs = reqs > 10; // Don't go too close to 0.
var isBeyondRateLimitReset = reset < now;
if (hasRemainingReqs || isBeyondRateLimitReset) {
return token;
}
}
}
function addGithubToken(token) {
setReqRemaining(token, 0, +new Date());
setReqRemaining(token, 0, 0); // A reset date of 0 has to be in the past.
// Insert it only if it is not registered yet.
if (githubUserTokens.data.indexOf(token) === -1) {
githubUserTokens.data.push(token);
@ -235,7 +213,8 @@ function githubRequest(request, url, query, cb) {
} else {
var remaining = +res.headers['x-ratelimit-remaining'];
var reset = +res.headers['x-ratelimit-reset'];
console.log('GitHub auth: token', githubToken, 'at rate limit', remaining);
console.log('GitHub auth: token', githubToken, 'rate limit', remaining,
'reset', reset, 'now', +new Date());
setReqRemaining(githubToken, remaining, reset);
}
}