node-inspector/lib/debug-server.js

84 строки
2.3 KiB
JavaScript

var http = require('http'),
EventEmitter = require('events').EventEmitter,
inherits = require('util').inherits,
extend = require('util')._extend,
path = require('path'),
express = require('express'),
WebSocketServer = require('ws').Server,
Session = require('./session'),
buildUrl = require('../index.js').buildInspectorUrl,
WEBROOT = path.join(__dirname, '../front-end');
function debugAction(req, res) {
res.sendfile(path.join(WEBROOT, 'inspector.html'));
}
function overridesAction(req, res) {
res.sendfile(path.join(__dirname, '../front-end-node/Overrides.js'));
}
function handleWebSocketConnection(socket) {
var debugPort = this._getDebuggerPort(socket.upgradeReq.url);
this._createSession(debugPort).join(socket);
}
function handleServerListening() {
this.emit('listening');
}
function handleServerError(err) {
if (err._handledByInspector) return;
err._handledByInspector = true;
this.emit('error', err);
}
function DebugServer() {}
inherits(DebugServer, EventEmitter);
DebugServer.prototype.start = function(options) {
this._config = extend({}, options);
var app = express();
var httpServer = http.createServer(app);
this._httpServer = httpServer;
app.get('/debug', debugAction.bind(this));
app.get('/node/Overrides.js', overridesAction);
app.use(express.static(WEBROOT));
this.wsServer = new WebSocketServer({
server: httpServer
});
this.wsServer.on('connection', handleWebSocketConnection.bind(this));
this.wsServer.on('error', handleServerError.bind(this));
httpServer.on('listening', handleServerListening.bind(this));
httpServer.on('error', handleServerError.bind(this));
httpServer.listen(this._config.webPort, this._config.webHost);
};
DebugServer.prototype._getDebuggerPort = function(url) {
return parseInt((/\?port=(\d+)/.exec(url) || [null, this._config.debugPort])[1], 10);
};
DebugServer.prototype._createSession = function(debugPort) {
return Session.create(debugPort, this._config);
};
DebugServer.prototype.close = function() {
if (this.wsServer) {
this.wsServer.close();
this.emit('close');
}
};
DebugServer.prototype.address = function() {
var address = this._httpServer.address();
var config = this._config;
address.url = buildUrl(config.webHost, address.port, config.debugPort);
return address;
};
exports.DebugServer = DebugServer;