diff --git a/lib/github-auth.js b/lib/github-auth.js index 597ab72..dfcbea6 100644 --- a/lib/github-auth.js +++ b/lib/github-auth.js @@ -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); } }