whistle
Version:
HTTP, HTTPS, Websocket debugging proxy
148 lines (134 loc) • 4.1 kB
JavaScript
var util = require('util');
var path = require('path');
var ca = require('../https/ca');
var Storage = require('../rules/storage');
var getServer = require('../util/get-server').create(null, 40500);
module.exports = function(options, callback) {
options.getRootCAFile = ca.getRootCAFile;
options.createCertificate = ca.createCertificate;
options.storage = new Storage(path.join(options.config.baseDir, '.plugins', options.name));
if (options.debugMode) {
var cacheLogs = [];
/*eslint no-console: "off"*/
console.log = function() {
var msg = util.format.apply(this, arguments);
if (cacheLogs) {
cacheLogs.push(msg);
} else {
process.sendData({
type: 'console.log',
message: msg
});
}
};
process.on('data', function(data) {
if (cacheLogs && data && data.type == 'console.log' && data.status == 'ready') {
var _cacheLogs = cacheLogs;
cacheLogs = null;
_cacheLogs.forEach(function(msg) {
process.sendData({
type: 'console.log',
message: msg
});
});
}
});
}
var port, statsPort, uiPort, rulesPort, resRulesPort, statusPort, tunnelRulesPort, tunnelPort;
var count = 0;
var callbackHandler = function() {
if (--count <= 0) {
callback(null, {
port: port,
statsPort: statsPort,
uiPort: uiPort,
rulesPort: rulesPort,
resRulesPort: resRulesPort,
statusPort: statusPort,
tunnelRulesPort: tunnelRulesPort,
tunnelPort: tunnelPort
});
}
};
try {
require.resolve(options.value);
} catch(e) {
return callbackHandler();
}
var execPlugin = require(options.value);
var startServer = execPlugin.pluginServer || execPlugin.server || execPlugin;
if (typeof startServer == 'function') {
++count;
getServer(function(server, _port) {
startServer(server, options);
port = _port;
callbackHandler();
});
}
var startStatsServer = execPlugin.statsServer;
if (typeof startStatsServer == 'function') {
++count;
getServer(function(server, _port) {
startStatsServer(server, options);
statsPort = _port;
callbackHandler();
});
}
var startUIServer = execPlugin.uiServer || execPlugin.innerServer || execPlugin.internalServer;
if (typeof startUIServer == 'function') {
++count;
getServer(function(server, _port) {
startUIServer(server, options);
uiPort = _port;
callbackHandler();
});
}
var startRulesServer = execPlugin.pluginRulesServer || execPlugin.rulesServer || execPlugin.reqRulesServer;
if (typeof startRulesServer == 'function') {
++count;
getServer(function(server, _port) {
startRulesServer(server, options);
rulesPort = _port;
callbackHandler();
});
}
var startResRulesServer = execPlugin.resRulesServer;
if (typeof startResRulesServer == 'function') {
++count;
getServer(function(server, _port) {
startResRulesServer(server, options);
resRulesPort = _port;
callbackHandler();
});
}
var startStatusServer = execPlugin.statusServer || execPlugin.stateServer;
if (typeof startStatusServer == 'function') {
++count;
getServer(function(server, _port) {
startStatusServer(server, options);
statusPort = _port;
callbackHandler();
});
}
var startTunnelRulesServer = execPlugin.pluginRulesServer || execPlugin.tunnelRulesServer;
if (typeof startTunnelRulesServer == 'function') {
++count;
getServer(function(server, _port) {
startTunnelRulesServer(server, options);
tunnelRulesPort = _port;
callbackHandler();
});
}
var startTunnelServer = execPlugin.pluginServer || execPlugin.tunnelServer || execPlugin.connectServer;
if (typeof startTunnelServer == 'function') {
++count;
getServer(function(server, _port) {
startTunnelServer(server, options);
tunnelPort = _port;
callbackHandler();
});
}
if (!count) {
callbackHandler();
}
};