Nudge forward style checks a la eslint-config-standard (#1082)
Because I despise nitpicking stuff like indentation and spacing in pull request comments, I'd like to nudge forward our automated style checking, at least for new files being added. I don't want to totally rewrite server.js just to get automated style checking… the blame tracking is just too useful. So let's it's just take care of that when we start splitting it out. More discussion in #948.
This commit is contained in:
@@ -1,18 +1,20 @@
|
||||
var querystring = require('querystring');
|
||||
var request = require('request');
|
||||
var autosave = require('json-autosave');
|
||||
var serverSecrets;
|
||||
var baseUrl = process.env.BASE_URL || "https://shields.io";
|
||||
'use strict';
|
||||
|
||||
const querystring = require('querystring');
|
||||
const request = require('request');
|
||||
const autosave = require('json-autosave');
|
||||
let serverSecrets;
|
||||
const baseUrl = process.env.BASE_URL || 'https://shields.io';
|
||||
try {
|
||||
// Everything that cannot be checked in but is useful server-side
|
||||
// is stored in this JSON data.
|
||||
serverSecrets = require('../private/secret.json');
|
||||
} catch(e) {}
|
||||
var githubUserTokens = {data:[]};
|
||||
var githubUserTokensFile = './private/github-user-tokens.json';
|
||||
autosave(githubUserTokensFile, {data:[]}).then(function(f) {
|
||||
let githubUserTokens = {data: []};
|
||||
const githubUserTokensFile = './private/github-user-tokens.json';
|
||||
autosave(githubUserTokensFile, {data: []}).then(function(f) {
|
||||
githubUserTokens = f;
|
||||
for (var i = 0; i < githubUserTokens.data.length; i++) {
|
||||
for (let i = 0; i < githubUserTokens.data.length; i++) {
|
||||
addGithubToken(githubUserTokens.data[i]);
|
||||
}
|
||||
// Personal tokens allow access to GitHub private repositories.
|
||||
@@ -28,7 +30,7 @@ function setRoutes(server) {
|
||||
if (!(serverSecrets && serverSecrets.gh_client_id)) {
|
||||
return end('This server is missing GitHub client secrets.');
|
||||
}
|
||||
var query = querystring.stringify({
|
||||
const query = querystring.stringify({
|
||||
client_id: serverSecrets.gh_client_id,
|
||||
redirect_uri: baseUrl + '/github-auth/done',
|
||||
});
|
||||
@@ -44,7 +46,7 @@ function setRoutes(server) {
|
||||
if (!data.code) {
|
||||
return end('GitHub OAuth authentication failed to provide a code.');
|
||||
}
|
||||
var options = {
|
||||
const options = {
|
||||
url: 'https://github.com/login/oauth/access_token',
|
||||
headers: {
|
||||
'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
||||
@@ -59,10 +61,11 @@ function setRoutes(server) {
|
||||
};
|
||||
request(options, function(err, res, body) {
|
||||
if (err != null) { return end('The connection to GitHub failed.'); }
|
||||
let content;
|
||||
try {
|
||||
var content = querystring.parse(body);
|
||||
content = querystring.parse(body);
|
||||
} catch(e) { return end('The GitHub OAuth token could not be parsed.'); }
|
||||
var token = content.access_token;
|
||||
const token = content.access_token;
|
||||
if (!token) {
|
||||
return end('The GitHub OAuth process did not return a user token.');
|
||||
}
|
||||
@@ -96,10 +99,10 @@ function setRoutes(server) {
|
||||
}
|
||||
|
||||
function sendTokenToAllServers(token) {
|
||||
var ips = serverSecrets.shieldsIps;
|
||||
const ips = serverSecrets.shieldsIps;
|
||||
return Promise.all(ips.map(function(ip) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var options = {
|
||||
const options = {
|
||||
url: 'https://' + ip + '/github-auth/add-token',
|
||||
method: 'POST',
|
||||
form: {
|
||||
@@ -127,8 +130,8 @@ function sendTokenToAllServers(token) {
|
||||
// Track rate limit requests remaining.
|
||||
|
||||
// Ideally, we would want priority queues here.
|
||||
var reqRemaining = new Map(); // From token to requests remaining.
|
||||
var reqReset = new Map(); // From token to timestamp.
|
||||
const reqRemaining = new Map(); // From token to requests remaining.
|
||||
const reqReset = new Map(); // From token to timestamp.
|
||||
|
||||
// token: client token as a string.
|
||||
// reqs: number of requests remaining.
|
||||
@@ -147,23 +150,23 @@ function utcEpochSeconds() {
|
||||
return ((Date.now() / 1000) >>> 0);
|
||||
}
|
||||
|
||||
var userTokenRateLimit = 12500;
|
||||
const userTokenRateLimit = 12500;
|
||||
|
||||
// Return false if the token cannot reasonably be expected to perform
|
||||
// a GitHub request.
|
||||
function isTokenUsable(token, now) {
|
||||
var reqs = reqRemaining.get(token);
|
||||
var reset = reqReset.get(token);
|
||||
const reqs = reqRemaining.get(token);
|
||||
const reset = reqReset.get(token);
|
||||
// We don't want to empty more than 3/4 of a user's rate limit.
|
||||
var hasRemainingReqs = reqs > (userTokenRateLimit / 4);
|
||||
var isBeyondRateLimitReset = reset < now;
|
||||
const hasRemainingReqs = reqs > (userTokenRateLimit / 4);
|
||||
const isBeyondRateLimitReset = reset < now;
|
||||
return hasRemainingReqs || isBeyondRateLimitReset;
|
||||
}
|
||||
|
||||
// Return a list of tokens (as strings) which can be used for a GitHub request,
|
||||
// with a reasonable chance that the request will succeed.
|
||||
function usableTokens() {
|
||||
var now = utcEpochSeconds();
|
||||
const now = utcEpochSeconds();
|
||||
return githubUserTokens.data.filter(function(token) {
|
||||
return isTokenUsable(token, now);
|
||||
});
|
||||
@@ -175,12 +178,12 @@ function getReqRemainingToken() {
|
||||
// Go through the user tokens.
|
||||
// Among usable ones, use the one with the highest number of remaining
|
||||
// requests.
|
||||
var tokens = usableTokens();
|
||||
var highestReq = -1;
|
||||
var highestToken;
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
var token = tokens[i];
|
||||
var reqs = reqRemaining.get(token);
|
||||
const tokens = usableTokens();
|
||||
let highestReq = -1;
|
||||
let highestToken;
|
||||
for (let i = 0; i < tokens.length; i++) {
|
||||
const token = tokens[i];
|
||||
const reqs = reqRemaining.get(token);
|
||||
if (reqs > highestReq) {
|
||||
highestReq = reqs;
|
||||
highestToken = token;
|
||||
@@ -201,7 +204,7 @@ function addGithubToken(token) {
|
||||
function rmGithubToken(token) {
|
||||
rmReqRemaining(token);
|
||||
// Remove it only if it is in there.
|
||||
var idx = githubUserTokens.data.indexOf(token);
|
||||
const idx = githubUserTokens.data.indexOf(token);
|
||||
if (idx >= 0) {
|
||||
githubUserTokens.data.splice(idx, 1);
|
||||
}
|
||||
@@ -213,11 +216,11 @@ function githubRequest(request, url, query, cb) {
|
||||
query = query || {};
|
||||
// A special User-Agent is required:
|
||||
// http://developer.github.com/v3/#user-agent-required
|
||||
var headers = {
|
||||
const headers = {
|
||||
'User-Agent': 'Shields.io',
|
||||
'Accept': 'application/vnd.github.v3+json',
|
||||
};
|
||||
var githubToken = getReqRemainingToken();
|
||||
const githubToken = getReqRemainingToken();
|
||||
|
||||
if (githubToken != null) {
|
||||
// Typically, GitHub user tokens grants us 12500 req/hour.
|
||||
@@ -229,16 +232,16 @@ function githubRequest(request, url, query, cb) {
|
||||
query.client_secret = serverSecrets.gh_client_secret;
|
||||
}
|
||||
|
||||
var qs = querystring.stringify(query);
|
||||
const qs = querystring.stringify(query);
|
||||
if (qs) { url += '?' + qs; }
|
||||
request(url, {headers: headers}, function(err, res, buffer) {
|
||||
if (githubToken != null) {
|
||||
if (res.statusCode === 401) { // Unauthorized.
|
||||
rmGithubToken(githubToken);
|
||||
} else {
|
||||
var remaining = +res.headers['x-ratelimit-remaining'];
|
||||
const remaining = +res.headers['x-ratelimit-remaining'];
|
||||
// reset is in UTC epoch seconds.
|
||||
var reset = +res.headers['x-ratelimit-reset'];
|
||||
const reset = +res.headers['x-ratelimit-reset'];
|
||||
setReqRemaining(githubToken, remaining, reset);
|
||||
if (remaining === 0) { return; } // Hope for the best in the cache.
|
||||
}
|
||||
@@ -249,8 +252,8 @@ function githubRequest(request, url, query, cb) {
|
||||
|
||||
function constEq(a, b) {
|
||||
if (a.length !== b.length) { return false; }
|
||||
var zero = 0;
|
||||
for (var i = 0; i < a.length; i++) {
|
||||
let zero = 0;
|
||||
for (let i = 0; i < a.length; i++) {
|
||||
zero |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
||||
}
|
||||
return (zero === 0);
|
||||
|
||||
Reference in New Issue
Block a user