194 lines
6.1 KiB
JavaScript
194 lines
6.1 KiB
JavaScript
// Generated by CoffeeScript 1.8.0
|
|
var HttpChannelHandler, Version, channelManager, checkForDeath, checkHost, deathTimeout, dns, dumpingHandler, express, fs, getStaticWebDir, getVersion, jsonBodyParser, net, path, processOptions, run2, serviceManager, startDeathWatcher, startServer, utils, _;
|
|
|
|
fs = require('fs');
|
|
|
|
net = require('net');
|
|
|
|
dns = require('dns');
|
|
|
|
path = require('path');
|
|
|
|
_ = require('underscore');
|
|
|
|
express = require('express');
|
|
|
|
utils = require('./utils');
|
|
|
|
jsonBodyParser = require('./jsonBodyParser');
|
|
|
|
HttpChannelHandler = require('./HttpChannelHandler');
|
|
|
|
dumpingHandler = require('./dumpingHandler');
|
|
|
|
channelManager = require('./channelManager');
|
|
|
|
serviceManager = require('./serviceManager');
|
|
|
|
exports.run = function(options) {
|
|
return processOptions(options, run2);
|
|
};
|
|
|
|
run2 = function() {
|
|
var options;
|
|
options = utils.options;
|
|
serviceManager.registerProxyClass('WeinreClientEvents');
|
|
serviceManager.registerProxyClass('WeinreTargetEvents');
|
|
serviceManager.registerLocalClass('WeinreClientCommands');
|
|
serviceManager.registerLocalClass('WeinreTargetCommands');
|
|
startDeathWatcher(options.deathTimeout);
|
|
return startServer();
|
|
};
|
|
|
|
processOptions = function(options, cb) {
|
|
var name, nameLen, names, reducer, _i, _len;
|
|
options.httpPort = utils.ensureInteger(options.httpPort, 'the value of the option httpPort is not a number');
|
|
options.boundHost = utils.ensureString(options.boundHost, 'the value of the option boundHost is not a string');
|
|
options.verbose = utils.ensureBoolean(options.verbose, 'the value of the option verbose is not a boolean');
|
|
options.debug = utils.ensureBoolean(options.debug, 'the value of the option debug is not a boolean');
|
|
options.readTimeout = utils.ensureInteger(options.readTimeout, 'the value of the option readTimeout is not a number');
|
|
options.deathTimeout = utils.ensureInteger(options.deathTimeout, 'the value of the option deathTimeout is not a number');
|
|
if (options.debug) {
|
|
options.verbose = true;
|
|
}
|
|
options.staticWebDir = getStaticWebDir();
|
|
utils.logVerbose("pid: " + process.pid);
|
|
utils.logVerbose("version: " + (getVersion()));
|
|
utils.logVerbose("node versions:");
|
|
names = _.keys(process.versions);
|
|
reducer = function(memo, name) {
|
|
return Math.max(memo, name.length);
|
|
};
|
|
nameLen = _.reduce(names, reducer, 0);
|
|
for (_i = 0, _len = names.length; _i < _len; _i++) {
|
|
name = names[_i];
|
|
utils.logVerbose(" " + (utils.alignLeft(name, nameLen)) + ": " + process.versions[name]);
|
|
}
|
|
utils.logVerbose("options:");
|
|
utils.logVerbose(" httpPort: " + options.httpPort);
|
|
utils.logVerbose(" boundHost: " + options.boundHost);
|
|
utils.logVerbose(" verbose: " + options.verbose);
|
|
utils.logVerbose(" debug: " + options.debug);
|
|
utils.logVerbose(" readTimeout: " + options.readTimeout);
|
|
utils.logVerbose(" deathTimeout: " + options.deathTimeout);
|
|
utils.setOptions(options);
|
|
return checkHost(options.boundHost, function(err) {
|
|
if (err) {
|
|
utils.exit("unable to resolve boundHost address: " + options.boundHost);
|
|
}
|
|
return cb();
|
|
});
|
|
};
|
|
|
|
checkHost = function(hostName, cb) {
|
|
if (hostName === '-all-') {
|
|
return cb();
|
|
}
|
|
if (hostName === 'localhost') {
|
|
return cb();
|
|
}
|
|
if (net.isIP(hostName)) {
|
|
return cb();
|
|
}
|
|
return dns.lookup(hostName, cb);
|
|
};
|
|
|
|
deathTimeout = null;
|
|
|
|
startDeathWatcher = function(timeout) {
|
|
deathTimeout = utils.options.deathTimeout * 1000;
|
|
return setInterval(checkForDeath, 1000);
|
|
};
|
|
|
|
checkForDeath = function() {
|
|
var channel, now, _i, _len, _ref, _results;
|
|
now = (new Date).valueOf();
|
|
_ref = channelManager.getChannels();
|
|
_results = [];
|
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|
channel = _ref[_i];
|
|
if (now - channel.lastRead > deathTimeout) {
|
|
_results.push(channel.close());
|
|
} else {
|
|
_results.push(void 0);
|
|
}
|
|
}
|
|
return _results;
|
|
};
|
|
|
|
startServer = function() {
|
|
var app, clientHandler, favIcon, options, staticCacheOptions, targetHandler;
|
|
options = utils.options;
|
|
clientHandler = new HttpChannelHandler('/ws/client');
|
|
targetHandler = new HttpChannelHandler('/ws/target');
|
|
channelManager.initialize();
|
|
favIcon = "" + options.staticWebDir + "/images/weinre-icon-32x32.png";
|
|
staticCacheOptions = {
|
|
maxObjects: 500,
|
|
maxLength: 32 * 1024 * 1024
|
|
};
|
|
app = express.createServer();
|
|
app.on('error', function(error) {
|
|
return utils.exit("error running server: " + error);
|
|
});
|
|
app.use(express.favicon(favIcon));
|
|
app.use(jsonBodyParser());
|
|
app.all(/^\/ws\/client(.*)/, function(request, response, next) {
|
|
var uri;
|
|
uri = request.params[0];
|
|
if (uri === '') {
|
|
uri = '/';
|
|
}
|
|
if (options.debug) {
|
|
dumpingHandler(request, response, uri);
|
|
}
|
|
return clientHandler.handle(request, response, uri);
|
|
});
|
|
app.all(/^\/ws\/target(.*)/, function(request, response, next) {
|
|
var uri;
|
|
uri = request.params[0];
|
|
if (uri === '') {
|
|
uri = '/';
|
|
}
|
|
if (options.debug) {
|
|
dumpingHandler(request, response, uri);
|
|
}
|
|
return targetHandler.handle(request, response, uri);
|
|
});
|
|
app.use(express.errorHandler({
|
|
dumpExceptions: true
|
|
}));
|
|
app.use(express.staticCache(staticCacheOptions));
|
|
app.use(express["static"](options.staticWebDir));
|
|
if (options.boundHost === '-all-') {
|
|
utils.log("starting server at http://localhost:" + options.httpPort);
|
|
return app.listen(options.httpPort);
|
|
} else {
|
|
utils.log("starting server at http://" + options.boundHost + ":" + options.httpPort);
|
|
return app.listen(options.httpPort, options.boundHost);
|
|
}
|
|
};
|
|
|
|
getStaticWebDir = function() {
|
|
var webDir;
|
|
webDir = path.normalize(path.join(__dirname, '../web'));
|
|
if (utils.fileExistsSync(webDir)) {
|
|
return webDir;
|
|
}
|
|
return utils.exit('unable to find static files to serve in #{webDir}; did you do a build?');
|
|
};
|
|
|
|
Version = null;
|
|
|
|
getVersion = exports.getVersion = function() {
|
|
var json, packageJsonName, values;
|
|
if (Version) {
|
|
return Version;
|
|
}
|
|
packageJsonName = path.join(path.dirname(fs.realpathSync(__filename)), '../package.json');
|
|
json = fs.readFileSync(packageJsonName, 'utf8');
|
|
values = JSON.parse(json);
|
|
Version = values.version;
|
|
return Version;
|
|
};
|