diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 79be650c93a..438e93d2801 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -42,7 +42,7 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as vscode from 'vscode'; import * as paths from 'vs/base/common/paths'; import { realpathSync } from 'fs'; -import { ITelemetryService, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; +import { ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { MainContext, ExtHostContext, InstanceCollection, IInitConfiguration } from './extHost.protocol'; @@ -53,7 +53,7 @@ export interface IExtensionApiFactory { /** * This method instantiates and returns the extension API surface */ -export function createApiFactory(initDataConfiguration: IInitConfiguration, threadService: IThreadService, extensionService: ExtHostExtensionService, contextService: IWorkspaceContextService, telemetryService: ITelemetryService): IExtensionApiFactory { +export function createApiFactory(initDataConfiguration: IInitConfiguration, initTelemetryInfo: ITelemetryInfo, threadService: IThreadService, extensionService: ExtHostExtensionService, contextService: IWorkspaceContextService): IExtensionApiFactory { @@ -90,11 +90,6 @@ export function createApiFactory(initDataConfiguration: IInitConfiguration, thre // Register API-ish commands ExtHostApiCommands.register(extHostCommands); - // TODO@joh,alex - this is lifecycle critical - // fetch and store telemetry info - let telemetryInfo: ITelemetryInfo; - telemetryService.getTelemetryInfo().then(info => telemetryInfo = info, errors.onUnexpectedError); - return function (extension: IExtensionDescription): typeof vscode { // namespace: commands @@ -133,8 +128,8 @@ export function createApiFactory(initDataConfiguration: IInitConfiguration, thre // namespace: env const env: typeof vscode.env = Object.freeze({ - get machineId() { return telemetryInfo.machineId; }, - get sessionId() { return telemetryInfo.sessionId; }, + get machineId() { return initTelemetryInfo.machineId; }, + get sessionId() { return initTelemetryInfo.sessionId; }, get language() { return Platform.language; }, get appName() { return product.nameLong; } }); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index a7d6157e15b..403f1f96615 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -55,6 +55,7 @@ export interface IInitData { }; extensions: IExtensionDescription[]; configuration: IInitConfiguration; + telemetryInfo: ITelemetryInfo; } export interface InstanceSetter { diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index 1cf968a7acc..f7cfcd91e89 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -55,7 +55,7 @@ export class ExtensionHostMain { this._extensionService = new ExtHostExtensionService(initData.extensions, threadService, telemetryService, { _serviceBrand: 'optionalArgs', workspaceStoragePath }); // Create the ext host API - const factory = createApiFactory(initData.configuration, threadService, this._extensionService, this._contextService, telemetryService); + const factory = createApiFactory(initData.configuration, initData.telemetryInfo, threadService, this._extensionService, this._contextService); defineAPI(factory, this._extensionService); } diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index f2f1b0671d9..650ccd8cb60 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -16,6 +16,7 @@ import { findFreePort } from 'vs/base/node/ports'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { ILifecycleService, ShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWindowService } from 'vs/workbench/services/window/electron-browser/windowService'; import { ChildProcess, fork } from 'child_process'; import { ipcRenderer as ipc } from 'electron'; @@ -68,7 +69,8 @@ export class ExtensionHostProcessWorker { @ILifecycleService lifecycleService: ILifecycleService, @IInstantiationService private instantiationService: IInstantiationService, @IEnvironmentService private environmentService: IEnvironmentService, - @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService + @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService, + @ITelemetryService private telemetryService: ITelemetryService ) { // handle extension host lifecycle a bit special when we know we are developing an extension that runs inside this.isExtensionDevelopmentHost = !!environmentService.extensionDevelopmentPath; @@ -204,7 +206,11 @@ export class ExtensionHostProcessWorker { if (this.initializeTimer) { window.clearTimeout(this.initializeTimer); } - this.extensionService.readExtensions().then((extensionDescriptions) => { + + TPromise.join([ + this.telemetryService.getTelemetryInfo(), + this.extensionService.readExtensions() + ]).then(([telemetryInfo, extensionDescriptions]) => { let initData: IInitData = { parentPid: process.pid, environment: { @@ -218,7 +224,8 @@ export class ExtensionHostProcessWorker { workspace: this.contextService.getWorkspace() }, extensions: extensionDescriptions, - configuration: this.configurationService.getConfiguration() + configuration: this.configurationService.getConfiguration(), + telemetryInfo }; this.extensionHostProcessQueuedSender.send(stringify(initData)); });