UNPKG

ts-migrate-server

Version:

A package that contains the main migration runner and spawns a TSServer process

121 lines 4.62 kB
"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