diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index f10338b0cd7a038e56a8dcd442c4916b08d8929e..db669ae5858ed3d97128c973796562b0e5d88894 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -328,7 +328,9 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } private logTrace(message: string, data?: any): void { - this.logger.logLevel('Trace', message, data); + if (this.trace !== Trace.Off) { + this.logger.logLevel('Trace', message, data); + } } public logTelemetry(eventName: string, properties?: { [prop: string]: string }) { @@ -464,13 +466,14 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } let value = process.env.TSS_DEBUG; if (value) { - let port = parseInt(value); + const port = parseInt(value); if (!isNaN(port)) { this.info(`TSServer started in debug mode using port ${port}`); options.execArgv = [`--debug=${port}`]; } } - let args: string[] = []; + + const args: string[] = []; if (this.apiVersion.has206Features()) { args.push('--useSingleInferredProject'); if (workspace.getConfiguration().get('typescript.disableAutomaticTypeAcquisition', false)) { @@ -540,9 +543,12 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } this.serviceExited(true); }); - this.reader = new Reader(childProcess.stdout, (msg) => { - this.dispatchMessage(msg); - }); + + this.reader = new Reader( + childProcess.stdout, + (msg) => { this.dispatchMessage(msg); }, + error => { this.error('ReaderError', error); }); + this._onReady.resolve(); resolve(childProcess); this.serviceStarted(resendModels); @@ -759,7 +765,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient }); this.callbacks = Object.create(null); if (restart) { - let diff = Date.now() - this.lastStart; + const diff = Date.now() - this.lastStart; this.numberRestarts++; let startService = true; if (this.numberRestarts > 5) { @@ -902,17 +908,13 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient for (let i = 0; i < this.requestQueue.length; i++) { if (this.requestQueue[i].request.seq === seq) { this.requestQueue.splice(i, 1); - if (this.trace !== Trace.Off) { - this.logTrace(`TypeScript Service: canceled request with sequence number ${seq}`); - } + this.logTrace(`TypeScript Service: canceled request with sequence number ${seq}`); return true; } } if (this.apiVersion.has222Features() && this.cancellationPipeName) { - if (this.trace !== Trace.Off) { - this.logTrace(`TypeScript Service: trying to cancel ongoing request with sequence number ${seq}`); - } + this.logTrace(`TypeScript Service: trying to cancel ongoing request with sequence number ${seq}`); try { fs.writeFileSync(this.cancellationPipeName + seq, ''); return true; @@ -921,17 +923,15 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } } - if (this.trace !== Trace.Off) { - this.logTrace(`TypeScript Service: tried to cancel request with sequence number ${seq}. But request got already delivered.`); - } + this.logTrace(`TypeScript Service: tried to cancel request with sequence number ${seq}. But request got already delivered.`); return false; } private dispatchMessage(message: Proto.Message): void { try { if (message.type === 'response') { - let response: Proto.Response = message; - let p = this.callbacks[response.request_seq]; + const response: Proto.Response = message as Proto.Response; + const p = this.callbacks[response.request_seq]; if (p) { this.traceResponse(response, p.start); delete this.callbacks[response.request_seq]; @@ -943,7 +943,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } } } else if (message.type === 'event') { - let event: Proto.Event = message; + const event: Proto.Event = message; this.traceEvent(event); if (event.event === 'syntaxDiag') { this.host.syntaxDiagnosticsReceived(event as Proto.DiagnosticEvent); diff --git a/extensions/typescript/src/utils/wireProtocol.ts b/extensions/typescript/src/utils/wireProtocol.ts index 3cb8e34348d7a8825b4c7368d9c61b6a51cd7498..218d461f853bfa4e6326200efa369762e1de309e 100644 --- a/extensions/typescript/src/utils/wireProtocol.ts +++ b/extensions/typescript/src/utils/wireProtocol.ts @@ -96,7 +96,11 @@ export class Reader { private readonly buffer: ProtocolBuffer; private nextMessageLength: number; - public constructor(readable: stream.Readable, callback: ICallback) { + public constructor( + readable: stream.Readable, + callback: ICallback, + private readonly onError: (error: any) => void = () => ({}) + ) { this.readable = readable; this.buffer = new ProtocolBuffer(); this.callback = callback; @@ -107,21 +111,25 @@ export class Reader { } private onLengthData(data: Buffer): void { - this.buffer.append(data); - while (true) { - if (this.nextMessageLength === -1) { - this.nextMessageLength = this.buffer.tryReadContentLength(); + try { + this.buffer.append(data); + while (true) { if (this.nextMessageLength === -1) { + this.nextMessageLength = this.buffer.tryReadContentLength(); + if (this.nextMessageLength === -1) { + return; + } + } + const msg = this.buffer.tryReadContent(this.nextMessageLength); + if (msg === null) { return; } + this.nextMessageLength = -1; + const json = JSON.parse(msg); + this.callback(json); } - const msg = this.buffer.tryReadContent(this.nextMessageLength); - if (msg === null) { - return; - } - this.nextMessageLength = -1; - let json = JSON.parse(msg); - this.callback(json); + } catch (e) { + this.onError(e); } } }