From 8a4ace6ebfa58f0154d63dc33d308a96db4e0ece Mon Sep 17 00:00:00 2001 From: Tyler Leonhardt Date: Fri, 23 Jul 2021 09:23:30 -0700 Subject: [PATCH] maintain promise instead in github-auth to ensure the exp service doesn't get created twice --- .../src/experimentationService.ts | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/extensions/github-authentication/src/experimentationService.ts b/extensions/github-authentication/src/experimentationService.ts index 8889dcd6178..ccfc1942407 100644 --- a/extensions/github-authentication/src/experimentationService.ts +++ b/extensions/github-authentication/src/experimentationService.ts @@ -9,17 +9,40 @@ import { getExperimentationService, IExperimentationService, IExperimentationTel export class ExperimentationTelemetry implements IExperimentationTelemetry { private sharedProperties: Record = {}; - private experimentationService: IExperimentationService | undefined; + private experimentationServicePromise: Promise | undefined; constructor(private readonly context: vscode.ExtensionContext, private baseReporter: TelemetryReporter) { } + private async createExperimentationService(): Promise { + let targetPopulation: TargetPopulation; + switch (vscode.env.uriScheme) { + case 'vscode': + targetPopulation = TargetPopulation.Public; + case 'vscode-insiders': + targetPopulation = TargetPopulation.Insiders; + case 'vscode-exploration': + targetPopulation = TargetPopulation.Internal; + case 'code-oss': + targetPopulation = TargetPopulation.Team; + default: + targetPopulation = TargetPopulation.Public; + } + + const id = this.context.extension.id; + const version = this.context.extension.packageJSON.version; + const experimentationService = getExperimentationService(id, version, targetPopulation, this, this.context.globalState); + await experimentationService.initialFetch; + return experimentationService; + } + /** * @returns A promise that you shouldn't need to await because this is just telemetry. */ async sendTelemetryEvent(eventName: string, properties?: Record, measurements?: Record) { - if (!this.experimentationService) { - this.experimentationService = await createExperimentationService(this.context, this); + if (!this.experimentationServicePromise) { + this.experimentationServicePromise = this.createExperimentationService(); } + await this.experimentationServicePromise; this.baseReporter.sendTelemetryEvent( eventName, @@ -39,9 +62,10 @@ export class ExperimentationTelemetry implements IExperimentationTelemetry { properties?: Record, _measurements?: Record ) { - if (!this.experimentationService) { - this.experimentationService = await createExperimentationService(this.context, this); + if (!this.experimentationServicePromise) { + this.experimentationServicePromise = this.createExperimentationService(); } + await this.experimentationServicePromise; this.baseReporter.sendTelemetryErrorEvent(eventName, { ...this.sharedProperties, @@ -65,26 +89,3 @@ export class ExperimentationTelemetry implements IExperimentationTelemetry { return this.baseReporter.dispose(); } } - -function getTargetPopulation(): TargetPopulation { - switch (vscode.env.uriScheme) { - case 'vscode': - return TargetPopulation.Public; - case 'vscode-insiders': - return TargetPopulation.Insiders; - case 'vscode-exploration': - return TargetPopulation.Internal; - case 'code-oss': - return TargetPopulation.Team; - default: - return TargetPopulation.Public; - } -} - -async function createExperimentationService(context: vscode.ExtensionContext, telemetry: ExperimentationTelemetry): Promise { - const id = context.extension.id; - const version = context.extension.packageJSON.version; - const experimentationService = getExperimentationService(id, version, getTargetPopulation(), telemetry, context.globalState); - await experimentationService.initialFetch; - return experimentationService; -}