ts-migrate-server
Version:
A package that contains the main migration runner and spawns a TSServer process
121 lines • 4.62 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const events_1 = require("events");
const commands_1 = require("./commands");
const Reader_1 = __importDefault(require("./Reader"));
class TSServer {
constructor(childProcess, logger) {
this.nextSeq = 1;
this.requestsBySeq = {};
this.killed = false;
this.childProcess = childProcess;
this.logger = logger;
this.reader = new Reader_1.default(childProcess.stdout);
this.emitter = new events_1.EventEmitter();
this.reader.onData((data) => this.handleData(data));
this.initChildProcessListeners();
this.initChildProcessStderrListeners();
}
kill() {
if (this.killed)
return;
this.childProcess.kill();
this.emitter.removeAllListeners();
this.reader.dispose();
this.logger.info('[TSServer] kill');
this.killed = true;
}
sendRequest(command, args) {
const seq = this.nextSeq;
this.nextSeq += 1;
const request = { seq, type: 'request', command, arguments: args };
this.logger.info(`[TSServer] request:\n${JSON.stringify(request, null, 2)}`);
this.write(request);
return commands_1.commandHasResponse(command)
? new Promise((resolve, reject) => {
this.requestsBySeq[seq] = { resolve, reject };
})
: Promise.resolve();
}
onEvent(listener) {
this.emitter.addListener('event', listener);
return () => {
this.emitter.removeListener('event', listener);
};
}
write(data) {
this.childProcess.stdin.write(`${JSON.stringify(data)}\r\n`, 'utf8');
}
handleData(data) {
const msg = data;
if (msg.type === 'response') {
this.handleResponse(msg);
}
else if (msg.type === 'event') {
this.handleEvent(msg);
}
else {
this.logger.err(`[TSServer] unrecognized message:\n${JSON.stringify(msg, null, 2)}`);
}
}
handleResponse(response) {
this.logger.info(`[TSServer] response:\n${JSON.stringify(response, null, 2)}`);
const seq = response.request_seq;
if (this.requestsBySeq[seq] != null) {
const { resolve, reject } = this.requestsBySeq[seq];
if (response.success) {
resolve(response.body);
}
else {
reject(response.message);
}
delete this.requestsBySeq[seq];
}
else {
this.logger.err(`[TSServer] Failed to find originating request for seq ${seq}.`);
}
}
handleEvent(evt) {
this.logger.info(`[TSServer] event:\n${JSON.stringify(evt, null, 2)}`);
this.emitter.emit('event', evt);
}
initChildProcessListeners() {
this.childProcess.on('close', (code, signal) => {
this.logger.err(`[TSServer][childProcess] close: code=${code},signal=${signal}`);
});
this.childProcess.on('disconnect', () => {
this.logger.err('[TSServer][childProcess] disconnect');
});
this.childProcess.on('error', (err) => {
this.logger.err(`[TSServer][childProcess] error: ${err.message}`);
});
this.childProcess.on('exit', (code, signal) => {
this.logger.err(`[TSServer][childProcess] exit: code=${code},signal=${signal}`);
});
this.childProcess.on('message', (message, _sendHandle) => {
this.logger.info(`[TSServer][childProcess] message: ${message}`);
});
}
initChildProcessStderrListeners() {
this.childProcess.stderr.on('close', () => {
this.logger.err('[TSServer][childProcess][stderr] close');
});
this.childProcess.stderr.on('data', (chunk) => {
this.logger.err(`[TSServer][childProcess][stderr] data:\n${String(chunk)}`);
});
this.childProcess.stderr.on('end', () => {
this.logger.err('[TSServer][childProcess][stderr] end');
});
this.childProcess.stderr.on('readable', () => {
this.logger.info('[TSServer][childProcess][stderr] readable');
});
this.childProcess.stderr.on('error', (err) => {
this.logger.err(`[TSServer][childProcess][stderr] error: ${err.message}`);
});
}
}
exports.default = TSServer;
//# sourceMappingURL=TSServer.js.map