Skip to content

Instantly share code, notes, and snippets.

@likwid
Created October 24, 2014 00:53
Show Gist options
  • Save likwid/487334f542a5eed5a2b2 to your computer and use it in GitHub Desktop.
Save likwid/487334f542a5eed5a2b2 to your computer and use it in GitHub Desktop.
(function (_, q, harCapturer, aws, spawn) {
"use strict";
harCapturer.setVerbose(true);
var gcArgs = ["--remote-debugging-port=9222", "--enable-benchmarking", "--enable-net-benchmarking"],
options = { cwd: undefined, env: process.env },
google = spawn("google-chrome", gcArgs, options),
queueUri = process.env.QUEUE_URI,
shouldDebug = process.env.DEBUG || false,
bucketName = "blitz-project-10k",
cfg = {
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_KEY,
region: "us-east-1"
},
awsConfig = aws.config.update(cfg),
s3Params = { Bucket: bucketName},
s3 = new aws.S3({params: s3Params}),
sqs = new aws.SQS(),
backoff = {};
function cleanup() {
google.kill("SIGKILL");
process.exit(0);
}
process
.on("SIGINT", cleanup)
.on("SIGTERM", cleanup)
.on("SIGQUIT", cleanup);
function debug(msg) {
if (shouldDebug) {
console.log(msg);
}
}
function getSiteMessage() {
debug("Polling for site");
var df = q.defer(),
params = {
QueueUrl: queueUri,
MaxNumberOfMessages: 1,
VisibilityTimeout: 120,
WaitTimeSeconds: 20
};
sqs.receiveMessage(params, function (err, data) {
if (err) {
debug("An error has occurred:" + err);
df.reject(err);
}
if (!data || !data.Messages || _.isEmpty(data.Messages)) {
df.reject("No messages found.");
} else {
df.resolve(_.merge({}, {
site: _.first(data.Messages).Body,
receiptHandle: _.first(data.Messages).ReceiptHandle
}));
}
});
return df.promise;
}
function getBackoffTimeout(site) {
backoff[site] = (backoff[site] ? backoff[site] * 1.5 : undefined) || 60000;
backoff[site] = backoff[site] > 120000 ? 120000 : backoff[site];
return backoff[site];
}
function captureHAR(state) {
var df = q.defer(),
chromeHandle = harCapturer.load(state.site),
delay = _.delay(function () {
df.reject("Timeout occured on " + state.site + " at " + backoff[state.site] + "s");
}, getBackoffTimeout(state.site));
debug("Running HAR capture on " + state.site);
chromeHandle.on("error", function () {
df.reject("Error occured in Chrome");
});
chromeHandle.on("end", function (har) {
clearTimeout(delay);
delete backoff[state.site];
df.resolve(_.merge({}, state, {har: har}));
});
return df.promise;
}
function saveResultToS3(state) {
var df = q.defer(),
today = new Date(),
year = today.getFullYear(),
month = today.getMonth(),
day = today.getDate(),
formatted = [year, month, day].join("-"),
fileName = [state.site, ".har"].join(""),
keyName = [formatted, fileName].join("/"),
bodyContent = JSON.stringify(state.har),
putArgs = { Key: keyName, Body: bodyContent };
s3.putObject(putArgs, function (err, data) {
if (err) {
df.reject(err);
} else {
debug("Writing " + state.site + " to bucket:" + bucketName);
df.resolve(_.merge({}, state, { putResult: true, putData: data }));
}
});
return df.promise;
}
function removeMessage(state) {
var df = q.defer(),
params = {
QueueUrl: queueUri,
ReceiptHandle: state.receiptHandle
};
sqs.deleteMessage(params, function (err, data) {
if (err) {
df.reject(err);
} else {
debug("Dequeueing message for " + state.site);
df.resolve(_.merge({}, state, {dequeueData: data}));
}
});
return df.promise;
}
function startPolling() {
getSiteMessage()
.then(captureHAR)
.then(saveResultToS3)
.then(removeMessage)
.fail(function (err) {
console.log("Chrome crashed: " + err);
google.kill("SIGKILL");
google = spawn("google-chrome", gcArgs, options);
})
.finally(function () {
_.delay(startPolling, 2000);
});
}
_.delay(startPolling, 2000);
}(
require("lodash"),
require("q"),
require("chrome-har-capturer"),
require("aws-sdk"),
require("child_process").spawn
));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment