diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 300e0fb842e..f10338b0cd7 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -22,9 +22,8 @@ import Logger from './utils/logger'; import * as VersionStatus from './utils/versionStatus'; import * as is from './utils/is'; -import TelemetryReporter from 'vscode-extension-telemetry'; - import * as nls from 'vscode-nls'; +import TelemetryReporter from "./utils/telemetry"; const localize = nls.loadMessageBundle(); interface CallbackItem { @@ -43,12 +42,6 @@ interface RequestItem { callbacks: CallbackItem | null; } -interface IPackageInfo { - name: string; - version: string; - aiKey: string; -} - enum Trace { Off, Messages, @@ -162,7 +155,6 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient private _onDidEndInstallTypings = new EventEmitter(); private _onTypesInstallerInitializationFailed = new EventEmitter(); - private _packageInfo: IPackageInfo | null; private _apiVersion: API; private telemetryReporter: TelemetryReporter; private checkJs: boolean; @@ -230,10 +222,8 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.restartTsServer(); } })); - if (this.packageInfo && this.packageInfo.aiKey) { - this.telemetryReporter = new TelemetryReporter(this.packageInfo.name, this.packageInfo.version, this.packageInfo.aiKey); - disposables.push(this.telemetryReporter); - } + this.telemetryReporter = new TelemetryReporter(); + disposables.push(this.telemetryReporter); this.startService(); } @@ -341,30 +331,8 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.logger.logLevel('Trace', message, data); } - private get packageInfo(): IPackageInfo | null { - - if (this._packageInfo !== undefined) { - return this._packageInfo; - } - let packagePath = path.join(__dirname, './../package.json'); - let extensionPackage = require(packagePath); - if (extensionPackage) { - this._packageInfo = { - name: extensionPackage.name, - version: extensionPackage.version, - aiKey: extensionPackage.aiKey - }; - } else { - this._packageInfo = null; - } - - return this._packageInfo; - } - public logTelemetry(eventName: string, properties?: { [prop: string]: string }) { - if (this.telemetryReporter) { - this.telemetryReporter.sendTelemetryEvent(eventName, properties); - } + this.telemetryReporter.logTelemetry(eventName, properties); } private service(): Thenable { diff --git a/extensions/typescript/src/utils/telemetry.ts b/extensions/typescript/src/utils/telemetry.ts new file mode 100644 index 00000000000..8092b4fb4a4 --- /dev/null +++ b/extensions/typescript/src/utils/telemetry.ts @@ -0,0 +1,76 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as path from 'path'; +import VsCodeTelemetryReporter from 'vscode-extension-telemetry'; +import { Disposable } from "vscode"; + + +interface IPackageInfo { + name: string; + version: string; + aiKey: string; +} + + +export default class TelemetryReporter extends Disposable { + private _packageInfo: IPackageInfo | null; + + private _reporter: VsCodeTelemetryReporter | null; + + constructor() { + super(() => this.dispose()); + } + + dispose() { + if (this._reporter) { + this._reporter.dispose(); + this._reporter = null; + } + } + + public logTelemetry(eventName: string, properties?: { [prop: string]: string }) { + if (this._reporter) { + this._reporter.sendTelemetryEvent(eventName, properties); + } + } + + private get reporter(): VsCodeTelemetryReporter | null { + if (typeof this._reporter !== 'undefined') { + return this._reporter; + } + + if (this.packageInfo && this.packageInfo.aiKey) { + this._reporter = new VsCodeTelemetryReporter( + this.packageInfo.name, + this.packageInfo.version, + this.packageInfo.aiKey); + } else { + this._reporter = null; + } + return this._reporter; + } + + private get packageInfo(): IPackageInfo | null { + if (this._packageInfo !== undefined) { + return this._packageInfo; + } + let packagePath = path.join(__dirname, './../package.json'); + let extensionPackage = require(packagePath); + if (extensionPackage) { + this._packageInfo = { + name: extensionPackage.name, + version: extensionPackage.version, + aiKey: extensionPackage.aiKey + }; + } else { + this._packageInfo = null; + } + + return this._packageInfo; + } +} \ No newline at end of file