blob: a4ca11c2e72b93e2345194870447f98271995a2e [file] [log] [blame]
// 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;
};