Skip to content

Commit

Permalink
Various refactorings.
Browse files Browse the repository at this point in the history
  • Loading branch information
Tom Robinson committed Apr 8, 2010
1 parent f52daaa commit 881c8a1
Show file tree
Hide file tree
Showing 9 changed files with 239 additions and 120 deletions.
2 changes: 2 additions & 0 deletions bin/bcomm
Expand Up @@ -7,6 +7,8 @@ var parser = exports.parser = new args.Parser();

parser.help("BrowserCommand");

parser.command("server", "bcomm/commands/server");

parser.command("runners", "bcomm/commands/runners");
parser.command("console", "bcomm/commands/console");
parser.command("tail", "bcomm/commands/tail");
Expand Down
18 changes: 9 additions & 9 deletions devrun
Expand Up @@ -4,7 +4,12 @@ SIGINT=2

pid=""

function start_jackup () {
kill_jackup () {
kill "$pid"
exit
}

restart_jackup () {
if [ "$pid" ]; then
echo "Killing old Jackup..."
kill "$pid"
Expand All @@ -15,14 +20,9 @@ function start_jackup () {
pid=$!
}

trap start_jackup $SIGINT

start_jackup
trap kill_jackup $SIGINT

while true; do
echo "Waiting for $pid"
wait "$pid"
if [ $? -eq 127 ]; then
exit 1
fi
restart_jackup
read
done
14 changes: 13 additions & 1 deletion jackconfig.js
Expand Up @@ -19,4 +19,16 @@ function ExceptionLogger(app) {
}
}

exports.app = ExceptionLogger(URLMap(require("bcomm/server")));
function NoCache(app) {
return function(env) {
var response = app(env);

response.headers["Cache-Control"] = "no-cache";
response.headers["Pragma"] = "no-cache";
response.headers["Expires"] = "-1";

return response;
}
}

exports.app = NoCache(ExceptionLogger(URLMap(require("bcomm/server"))));
37 changes: 26 additions & 11 deletions lib/bcomm.js
Expand Up @@ -53,20 +53,33 @@ exports.request = function(name, request, options) {
options.block(httpReq);

var response = JSON.parse(httpReq.read().decodeToString("UTF-8"));
// print("response="+UTIL.repr(response));

return response;
}

exports.printResponse = function(response) {
if (response.error) {
stream.print(BCOMM.coloredID(response.runnerID) + ": \0red(" + UTIL.repr(response.error) + "\0)");
}
else if (response.console) {
stream.print(BCOMM.coloredID(response.runnerID) + ": \0yellow(console."+response.console.level+"(" +
UTIL.repr(response.console.args).slice(1,-1)+")\0)");
}
else {
stream.print(BCOMM.coloredID(response.runnerID) + ": " + UTIL.repr(response.value));
switch (response.type) {
case "error":
stream.print(BCOMM.coloredID(response.runnerID) + ": \0red(" + UTIL.repr(response.error) + "\0)");
break;

case "console":
stream.print(BCOMM.coloredID(response.runnerID) + ": \0yellow(console."+response.console.level+"(" +
UTIL.repr(response.console.args).slice(1,-1)+")\0)");
break;

case "value":
var string = "undefined";
if (typeof response.value !== "undefined")
string = UTIL.repr(response.value);
else if (typeof response.valueString !== "undefined")
string = response.valueString;
stream.print(BCOMM.coloredID(response.runnerID) + ": " + string);
break;

default :
stream.print(BCOMM.coloredID(response.runnerID) + ": " + UTIL.repr(response));
break;
}
}

Expand All @@ -93,7 +106,9 @@ exports.JSONApp = function(app) {
stream.print("\0purple(<=\0) response = "+JSON.stringify(responseObject));
stream.print(Array(81).join("="));

return Response.json(responseObject);
var response = Response.json(responseObject);

return response;
}
}

Expand Down
49 changes: 33 additions & 16 deletions lib/bcomm/commands/console.js
@@ -1,56 +1,73 @@

var BCOMM = require("bcomm");

var UTIL = require("util");
var OS = require("os");
var SYSTEM = require("system");

var BCOMM = require("bcomm");
var stream = require("term").stream;
var readline = require("readline").readline;

var parser = exports.parser = new (require("args").Parser)();
parser.help("run a test");

parser.option('-r', 'runners')
parser.option("-r", "runnerIDs")
.push()
.help("select a runner (multiple allowed)");

parser.option('-e', 'eval')
parser.option("-e", "eval")
.set()
.help("select a runner (multiple allowed)");

parser.option('-n', 'noAutoComplete')
parser.option("-n", "noAutoComplete")
.set(true)
.help("disable auto-completion of task");

parser.option("-t", "--timeout", "timeout")
.natural()
.def(5)
.help("timeout period, in seconds, or 0 for no timeout (default 5)");

parser.helpful();

parser.action(function (options) {
if (options.eval) {
exports.evaluate(options.eval, options.runners, options);
exports.evaluate(options.eval, options.runnerIDs, options);
} else {
while (true) {
exports.evaluate(readline("> "), options.runners, options);
exports.evaluate(readline("> "), options.runnerIDs, options);
}
}
});

exports.evaluate = function(command, runners, options) {
var taskIDs = BCOMM.request("eval", {
command : command,
runners : runners,
noAutoComplete : options.noAutoComplete
exports.evaluate = function(command, runnerIDs, options) {
var taskIDs = BCOMM.request("task-send", {
runnerIDs : runnerIDs,
task : {
type : "eval",
command : command,
noAutoComplete : options.noAutoComplete
}
});


var start = new Date();

while (taskIDs.length > 0) {
var responses = BCOMM.request("task-responses", { taskIDs : taskIDs });

responses.forEach(function(response) {
BCOMM.printResponse(response);
BCOMM.printResponse(response);
if (response.complete)
taskIDs = taskIDs.filter(function(taskID) { return taskID !== response.taskID });
});


var elapsed = new Date() - start;
if (taskIDs.length > 0 && options.timeout > 0 && elapsed > options.timeout * 1000) {
stream.print("\0red(Warning: tasks " + taskIDs.join(", ") + " timed out\0)");
break;
}

if (taskIDs.length > 0)
OS.sleep(1.0);
OS.sleep(0.5);
}
}
Empty file added lib/bcomm/commands/server.js
Empty file.
82 changes: 47 additions & 35 deletions lib/bcomm/server.js
Expand Up @@ -13,56 +13,54 @@ var TIMEOUT = 10*1000; // 10s
var staticPath = BCOMM.packagePath.join("static");
exports["/static"] = require("jack/file").File(staticPath.toString());

var JSONApp = BCOMM.JSONApp
var JSONApp = BCOMM.JSONApp;

exports["/eval"] = JSONApp(function(request) {
var runnerIDs = (request.runners && request.runners.length > 0) ? request.runners.filter(getRunner) : getRunnerIDs();
var taskIDs = [];
runnerIDs.map(getRunner).forEach(function(runner) {
taskIDs.push(addTask(runner, { eval : request.command }));
});
return taskIDs;
});

exports["/runners"] = JSONApp(function(request) {
timeoutRunners();
return getRunners();
});
exports["/"] = require("jack/redirect").Redirect("static/dispatcher.html");

exports["/runner-poll"] = JSONApp(function(request, env) {
var runner = getRunner(request.runnerID)
if (!runner) {
runner = request;
runner.userAgent = env["HTTP_USER_AGENT"];
addRunner(runner);
request.userAgent = env["HTTP_USER_AGENT"];
runner = addRunner(request);
}
runner.lastPoll = new Date();

timeoutRunners();

if (request.responses) {
request.responses.forEach(function(response) {
response.runnerID = request.runnerID;

addResponse(response);
});
}

if (request.ready) {
if (runner.queue && runner.queue.length) {
var taskID = runner.queue.pop();
var task = getTask(taskID);
return { task : task };
}
}


});

exports["/task-send"] = JSONApp(function(request) {
timeoutRunners();

var taskIDs = [];

runnersForRequest(request).forEach(function(runner) {
taskIDs.push(addTask(runner, request.task));
});
return taskIDs;
});

exports["/task-responses"] = JSONApp(function(request) {
timeoutRunners();

var responses = [];

request.taskIDs.map(getTask).forEach(function(task) {
if (task.responses.length > 0) {
responses = responses.concat(task.responses);
Expand All @@ -75,12 +73,10 @@ exports["/task-responses"] = JSONApp(function(request) {

exports["/runner-responses"] = JSONApp(function(request) {
timeoutRunners();

var responses = [];

var runners = (request.runnerIDs && request.runnerIDs.length > 0) ? request.runnerIDs.map(getRunner) : getRunners();

runners.forEach(function(runner) {

runnersForRequest(request).forEach(function(runner) {
if (runner.responses.length > 0) {
responses = responses.concat(runner.responses);
runner.responses = [];
Expand All @@ -90,19 +86,31 @@ exports["/runner-responses"] = JSONApp(function(request) {
return responses;
});

exports["/runners"] = JSONApp(function(request) {
timeoutRunners();

return getRunners();
});

require("./server/tests");

function runnersForRequest(request) {
return (request.runnerIDs && request.runnerIDs.length > 0) ? request.runnerIDs.map(getRunner) : getRunners();
}

var tasks = {};
function addTask(runner, task) {
if (!runner.queue)
runner.queue = [];

task = UTIL.deepCopy(task);

task.taskID = BCOMM.generateID();
task.runnerID = runner.runnerID;
task.responses = [];

tasks[task.taskID] = task;

runner.queue.push(task.taskID);

return task.taskID;
Expand All @@ -113,21 +121,25 @@ function addResponse(response) {
var task = getTask(response.taskID);
task.responses.push(response);
}
// else {
var runner = getRunner(response.runnerID);
runner.responses.push(response);
// }

var runner = getRunner(response.runnerID);
runner.responses.push(response);
}

function getTask(taskID) {
return tasks[taskID];
}

var runners = {};
function addRunner(runner) {
function addRunner(request) {
var runner = UTIL.deepCopy(request);

runner.created = new Date();
runner.responses = []; // responses not belonging to any tasks
runner.responses = [];

runners[runner.runnerID] = runner;

return runner;
}

function getRunner(runnerID) {
Expand All @@ -151,7 +163,7 @@ function timeoutRunners() {
getRunners().forEach(function(runner) {
if (runner.lastPoll.getTime() < now.getTime() - TIMEOUT) {
print("Timing out runner " + runner.runnerID);
deleteRunner(runner.runnerID);
deleteRunner(runner.runnerID);
}
});
};
2 changes: 1 addition & 1 deletion static/dispatcher.html
Expand Up @@ -9,6 +9,6 @@
<script type="text/javascript" charset="utf-8" src="js/dispatcher.js"></script>
</head>
<body onload="init();">
<iframe id="testbed" style="position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; border: none;"></iframe>
dispatcher!
</body>
</html>

0 comments on commit 881c8a1

Please sign in to comment.