kopia lustrzana https://github.com/c9/core
155 wiersze
4.5 KiB
JavaScript
155 wiersze
4.5 KiB
JavaScript
/**
|
|
* in meteor runner restarts debug process after each save.
|
|
* this emulates same sequence of events without all of the complexity of meteor
|
|
*
|
|
* add the following run config, run test.js file, write timeout value in output window
|
|
* and press enter to restart test.js after a timeout
|
|
*
|
|
* "run": {
|
|
* "@path": "/.c9/runners",
|
|
* "configs": {
|
|
* "@inited": "true",
|
|
* "json()": {
|
|
* "mock-meteor": {
|
|
* "command": "test.js",
|
|
* "debug": true,
|
|
* "name": "mock-meteor",
|
|
* "runner": "Node.js.test"
|
|
* }
|
|
* }
|
|
* }
|
|
* },
|
|
**/
|
|
|
|
var net = require("net");
|
|
var spawn = require("child_process").spawn;
|
|
|
|
var argv = process.argv;
|
|
var port = argv[2];
|
|
var debugPort = 5758;
|
|
|
|
var p, interceptServer;
|
|
var outConnection = [];
|
|
var inConnection = [];
|
|
var RETRY_INTERVAL = 500;
|
|
function start() {
|
|
console.log(argv[0], ["--debug-brk=" + debugPort].concat(argv.slice(3)));
|
|
p = spawn(argv[0], ["--debug-brk=" + debugPort].concat(argv.slice(3)), {});
|
|
p.stdout.on("data", function(e) {
|
|
process.stdout.write(e);
|
|
});
|
|
p.stderr.on("data", function(e) {
|
|
process.stderr.write(e);
|
|
});
|
|
|
|
function tryConnect(port, retries, callback) {
|
|
console.log("tryConnect", retries, port);
|
|
if (!retries)
|
|
return callback(new Error("Cannot connect to port " + port));
|
|
|
|
var connection = net.connect(port, "localhost");
|
|
|
|
connection.on("connect", function() {
|
|
console.log("netproxy connected to debugger");
|
|
connection.removeListener("error", onError);
|
|
callback(null, connection);
|
|
});
|
|
|
|
connection.addListener("error", onError);
|
|
function onError(e) {
|
|
if (e.code !== "ECONNREFUSED")
|
|
return callback(e);
|
|
|
|
setTimeout(function() {
|
|
tryConnect(port, retries - 1, callback);
|
|
}, RETRY_INTERVAL);
|
|
}
|
|
}
|
|
|
|
tryConnect(debugPort, 100, function(e, debugConnection) {
|
|
console.log("-----------------------------");
|
|
debugConnection.on("data", function(data) {
|
|
console.log(data + "" + (!outConnection.write ? "<buffer>" : ""));
|
|
if (outConnection.write)
|
|
outConnection.write(data);
|
|
else
|
|
outConnection.push(data);
|
|
});
|
|
inConnection = debugConnection;
|
|
debugConnection.once("data", startServer);
|
|
debugConnection.on("error", function(e) {
|
|
console.log(e);
|
|
});
|
|
});
|
|
|
|
outConnection = outConnection || [];
|
|
inConnection = [];
|
|
|
|
function startServer() {
|
|
console.log("start-server")
|
|
interceptServer = net.createServer(function(socket) {
|
|
console.log(socket)
|
|
outConnection.forEach(function(e) {socket.write(e)});
|
|
outConnection = socket;
|
|
socket.on("data", function(buffer) {
|
|
inConnection.write(buffer);
|
|
});
|
|
socket.on("error", function(e) {
|
|
console.log(e);
|
|
})
|
|
socket.on("end", function(e) {
|
|
outConnection = null
|
|
});
|
|
}).on("error", function(e) {
|
|
interceptServer = null;
|
|
console.error(e);
|
|
}).listen(port);
|
|
}
|
|
}
|
|
|
|
function stop() {
|
|
if (start.timer) clearTimeout(start.timer);
|
|
p && p.kill();
|
|
interceptServer && interceptServer.close();
|
|
inConnection.end && inConnection.end();
|
|
// outConnection.end && outConnection.end();
|
|
}
|
|
|
|
process.stdin.resume();
|
|
process.stdin.setRawMode(true);
|
|
process.stdin.setEncoding("utf8");
|
|
process.on('SIGINT', function() {
|
|
console.log('Got SIGINT. Press Control-D to exit.');
|
|
});
|
|
|
|
process.on("SIGINT", function() {
|
|
console.log(process.argv);
|
|
});
|
|
var buffer = "";
|
|
process.stdin.on("data", function(s) {
|
|
process.stdout.write(s);
|
|
buffer += s;
|
|
var i = buffer.search(/\s/);
|
|
if (i == -1) return;
|
|
if (/^d-out/.test(buffer)) {
|
|
console.log("end netproxy connection");
|
|
outConnection.end && outConnection.end();
|
|
return;
|
|
}
|
|
var t = parseInt(buffer.slice(0, i), 0);
|
|
buffer = "";
|
|
function wait() {
|
|
console.log("killed the process, waiting" + t + "ms before restart");
|
|
if (t > 1000) {
|
|
t -= 1000;
|
|
setTimeout(wait, 1000);
|
|
} else {
|
|
setTimeout(start, t);
|
|
}
|
|
}
|
|
wait();
|
|
stop();
|
|
});
|
|
start();
|
|
console.log(process.argv);
|