You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.4 KiB
134 lines
4.4 KiB
var UTF8 = 'utf8';
|
|
var initializedPlugin = null;
|
|
function parseParams() {
|
|
var result = {
|
|
sessionId: null,
|
|
restArgs: null,
|
|
pluginName: null
|
|
};
|
|
var args = process.argv.slice(2);
|
|
var counter = 0;
|
|
var paramNameToPropertyName = {};
|
|
paramNameToPropertyName["-id="] = 'sessionId';
|
|
paramNameToPropertyName["-pluginName="] = 'pluginName';
|
|
args.forEach(function (value, index, arr) {
|
|
function isName(name) {
|
|
return value.indexOf(name) === 0;
|
|
}
|
|
function getValue() {
|
|
return value.split('=')[1];
|
|
}
|
|
Object.keys(paramNameToPropertyName).forEach(function (val) {
|
|
if (isName(val)) {
|
|
result[paramNameToPropertyName[val]] = getValue();
|
|
counter++;
|
|
}
|
|
});
|
|
});
|
|
result.restArgs = args.slice(counter);
|
|
return result;
|
|
}
|
|
function getPluginFactory(state, pluginName) {
|
|
var pluginPath = pluginName;
|
|
if (state.pluginPath) {
|
|
pluginPath = state.pluginPath;
|
|
}
|
|
var factoryProvider = require(pluginPath);
|
|
return factoryProvider.factory;
|
|
}
|
|
;
|
|
function initAndStartListening(params) {
|
|
var readline = require("readline");
|
|
var rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
terminal: false
|
|
});
|
|
process.stdin.setEncoding(UTF8);
|
|
var pending = [];
|
|
var canWrite = true;
|
|
function writeMessage(s) {
|
|
if (!canWrite) {
|
|
pending.push(s);
|
|
}
|
|
else {
|
|
canWrite = false;
|
|
process.stdout.write(new Buffer(s, UTF8), setCanWriteFlagAndWriteMessageIfNecessary);
|
|
}
|
|
}
|
|
function setCanWriteFlagAndWriteMessageIfNecessary() {
|
|
canWrite = true;
|
|
if (pending.length) {
|
|
writeMessage(pending.shift());
|
|
}
|
|
}
|
|
var messageWriter = {
|
|
write: function (answer) {
|
|
writeMessage(answer + '\n');
|
|
}
|
|
};
|
|
var expectedState = true;
|
|
rl.on("line", function (input) {
|
|
var message = input.trim();
|
|
if (expectedState) {
|
|
var state = JSON.parse(message);
|
|
if (state && state.pluginName) {
|
|
var pluginName = state.pluginName;
|
|
if (initializedPlugin == null) {
|
|
var pluginFactory = getPluginFactory(state, pluginName);
|
|
if (pluginFactory != null) {
|
|
var result = {};
|
|
try {
|
|
var _a = pluginFactory.create(state), languagePlugin = _a.languagePlugin, readyMessage = _a.readyMessage;
|
|
initializedPlugin = languagePlugin;
|
|
result.success = true;
|
|
result.message = readyMessage;
|
|
sendJson(JSON.stringify(result));
|
|
}
|
|
catch (e) {
|
|
//initialization error
|
|
//ok, lets kill the process
|
|
result.success = false;
|
|
var err = e.message || e.messageText;
|
|
result.error = "Initialization error (" + pluginName + "). " + err;
|
|
result.stack = e.stack;
|
|
sendJson(JSON.stringify(result));
|
|
}
|
|
}
|
|
}
|
|
expectedState = false;
|
|
}
|
|
}
|
|
else {
|
|
if (initializedPlugin != null) {
|
|
try {
|
|
initializedPlugin.onMessage(message, messageWriter);
|
|
}
|
|
catch (e) {
|
|
console.error(e.message + " " + e.stack);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
rl.on("close", function () {
|
|
// If IDE doesn't have enough time to terminate process properly
|
|
// (due to being killed or just not to slow down the whole IDE termination stage),
|
|
// the process should take precautions and terminate itself.
|
|
exitProcess();
|
|
});
|
|
sendCommand("ready");
|
|
setInterval(function () {
|
|
console.error('Process ' + params.sessionId + ' heartbeat: "alive" ');
|
|
}, 60000);
|
|
function sendCommand(command) {
|
|
process.stdout.write(params.sessionId + ' ' + command + '\n', UTF8);
|
|
}
|
|
function sendJson(json) {
|
|
process.stdout.write(json + '\n', UTF8);
|
|
}
|
|
}
|
|
function exitProcess() {
|
|
process.exit(0);
|
|
}
|
|
initAndStartListening(parseParams());
|