diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index b662b07ac07048ede137090db43292fe12ca4647..7f7d3a96d84558d533482b58ace50fd454643852 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -85,6 +85,12 @@ export interface IWorkspaceData extends IStaticWorkspaceData { folders: { uri: UriComponents, name: string, index: number; }[]; } +export interface IRemoteConnectionData { + host: string; + port: number; + connectionToken: string; +} + export interface IInitData { version: string; commit?: string; @@ -99,7 +105,7 @@ export interface IInitData { logsLocation: URI; logFile: URI; autoStart: boolean; - remote: { isRemote: boolean; authority: string | undefined; }; + remote: { isRemote: boolean; authority: string | undefined; connectionData: IRemoteConnectionData | undefined; }; uiKind: UIKind; } diff --git a/src/vs/workbench/services/extensions/browser/extensionService.ts b/src/vs/workbench/services/extensions/browser/extensionService.ts index 5b6a15e820e5edd62e4e9765061c44b3befc15ab..4e7040c9ea80cd97aa12d53cf56911d0750dc93d 100644 --- a/src/vs/workbench/services/extensions/browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/browser/extensionService.ts @@ -28,6 +28,7 @@ import { Schemas } from 'vs/base/common/network'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IStaticExtensionsService } from 'vs/workbench/services/extensions/common/staticExtensions'; import { DeltaExtensionsResult } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; +import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; export class ExtensionService extends AbstractExtensionService implements IExtensionService { @@ -42,6 +43,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten @IWorkbenchExtensionEnablementService extensionEnablementService: IWorkbenchExtensionEnablementService, @IFileService fileService: IFileService, @IProductService productService: IProductService, + @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService, @IRemoteAgentService private readonly _remoteAgentService: IRemoteAgentService, @IConfigurationService private readonly _configService: IConfigurationService, @IStaticExtensionsService private readonly _staticExtensions: IStaticExtensionsService, @@ -74,10 +76,18 @@ export class ExtensionService extends AbstractExtensionService implements IExten private _createProvider(remoteAuthority: string): IInitDataProvider { return { remoteAuthority: remoteAuthority, - getInitData: () => { - return this.whenInstalledExtensionsRegistered().then(() => { - return this._remoteExtensionsEnvironmentData!; - }); + getInitData: async () => { + await this.whenInstalledExtensionsRegistered(); + const resolverResult = await this._remoteAuthorityResolverService.resolveAuthority(remoteAuthority); + const remoteEnvironment = this._remoteExtensionsEnvironmentData!; + return { + connectionData: { + host: resolverResult.authority.host, + port: resolverResult.authority.port, + connectionToken: remoteEnvironment.connectionToken + }, + remoteEnvironment: remoteEnvironment + }; } }; } diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts index 097a048793156180bfed5d6c5bb1ce5d4ea61177..c7a93a63df8201b3a50c55b902d9c6a32bb1be57 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts @@ -160,6 +160,7 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter { autoStart: this._autoStart, remote: { authority: this._environmentService.configuration.remoteAuthority, + connectionData: undefined, isRemote: false }, uiKind: platform.isWeb ? UIKind.Web : UIKind.Desktop diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts index cb751b89e8fad38f8294231cd750ae708791e466..5804044bd87472fbd6e09b079568be79cd0708ab 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts @@ -11,7 +11,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { connectRemoteAgentExtensionHost, IRemoteExtensionHostStartParams, IConnectionOptions, ISocketFactory } from 'vs/platform/remote/common/remoteAgentConnection'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IInitData, UIKind } from 'vs/workbench/api/common/extHost.protocol'; +import { IInitData, UIKind, IRemoteConnectionData } from 'vs/workbench/api/common/extHost.protocol'; import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { IExtensionHostStarter, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions'; import { parseExtensionDevOptions } from 'vs/workbench/services/extensions/common/extensionDevOptions'; @@ -33,9 +33,14 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output'; import { localize } from 'vs/nls'; +export interface IRemoteInitData { + readonly connectionData: IRemoteConnectionData; + readonly remoteEnvironment: IRemoteAgentEnvironment; +} + export interface IInitDataProvider { readonly remoteAuthority: string; - getInitData(): Promise; + getInitData(): Promise; } export class RemoteExtensionHostClient extends Disposable implements IExtensionHostStarter { @@ -190,26 +195,27 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH } private _createExtHostInitData(isExtensionDevelopmentDebug: boolean): Promise { - return Promise.all([this._allExtensions, this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]).then(([allExtensions, telemetryInfo, remoteExtensionHostData]) => { + return Promise.all([this._allExtensions, this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]).then(([allExtensions, telemetryInfo, remoteInitData]) => { // Collect all identifiers for extension ids which can be considered "resolved" const resolvedExtensions = allExtensions.filter(extension => !extension.main).map(extension => extension.identifier); const hostExtensions = allExtensions.filter(extension => extension.main && extension.api === 'none').map(extension => extension.identifier); const workspace = this._contextService.getWorkspace(); + const remoteEnv = remoteInitData.remoteEnvironment; const r: IInitData = { commit: this._productService.commit, version: this._productService.version, - parentPid: remoteExtensionHostData.pid, + parentPid: remoteEnv.pid, environment: { isExtensionDevelopmentDebug, - appRoot: remoteExtensionHostData.appRoot, - appSettingsHome: remoteExtensionHostData.appSettingsHome, + appRoot: remoteEnv.appRoot, + appSettingsHome: remoteEnv.appSettingsHome, appName: this._productService.nameLong, appUriScheme: this._productService.urlProtocol, appLanguage: platform.language, extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, - globalStorageHome: remoteExtensionHostData.globalStorageHome, - userHome: remoteExtensionHostData.userHome, + globalStorageHome: remoteEnv.globalStorageHome, + userHome: remoteEnv.userHome, webviewResourceRoot: this._environmentService.webviewResourceRoot, webviewCspSource: this._environmentService.webviewCspSource, }, @@ -220,15 +226,16 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH }, remote: { isRemote: true, - authority: this._initDataProvider.remoteAuthority + authority: this._initDataProvider.remoteAuthority, + connectionData: remoteInitData.connectionData }, resolvedExtensions: resolvedExtensions, hostExtensions: hostExtensions, - extensions: remoteExtensionHostData.extensions, + extensions: remoteEnv.extensions, telemetryInfo, logLevel: this._logService.getLevel(), - logsLocation: remoteExtensionHostData.extensionHostLogsPath, - logFile: joinPath(remoteExtensionHostData.extensionHostLogsPath, `${ExtensionHostLogFileName}.log`), + logsLocation: remoteEnv.extensionHostLogsPath, + logFile: joinPath(remoteEnv.extensionHostLogsPath, `${ExtensionHostLogFileName}.log`), autoStart: true, uiKind: platform.isWeb ? UIKind.Web : UIKind.Desktop }; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index 27a5111455c9192871514e5eeb817c9af4fac4d0..3545bee8b777994ba5280ab143009641785fc8d9 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -440,6 +440,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { }, remote: { authority: this._environmentService.configuration.remoteAuthority, + connectionData: undefined, isRemote: false }, resolvedExtensions: [], diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index d8b5ecf4f5a69e42f71f9350f6fd7dd0add23e88..772121edf5e2dd465642925fd76f8d8ffd8c2ce3 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -52,7 +52,8 @@ class DeltaExtensionsQueueItem { export class ExtensionService extends AbstractExtensionService implements IExtensionService { - private readonly _remoteExtensionsEnvironmentData: Map; + private readonly _remoteEnvironment: Map; + private readonly _remoteResolvedAuthority: Map; private readonly _extensionScanner: CachedExtensionScanner; private _deltaExtensionsQueue: DeltaExtensionsQueueItem[]; @@ -95,7 +96,8 @@ export class ExtensionService extends AbstractExtensionService implements IExten }]); } - this._remoteExtensionsEnvironmentData = new Map(); + this._remoteEnvironment = new Map(); + this._remoteResolvedAuthority = new Map(); this._extensionScanner = instantiationService.createInstance(CachedExtensionScanner); this._deltaExtensionsQueue = []; @@ -344,10 +346,18 @@ export class ExtensionService extends AbstractExtensionService implements IExten private _createProvider(remoteAuthority: string): IInitDataProvider { return { remoteAuthority: remoteAuthority, - getInitData: () => { - return this.whenInstalledExtensionsRegistered().then(() => { - return this._remoteExtensionsEnvironmentData.get(remoteAuthority)!; - }); + getInitData: async () => { + await this.whenInstalledExtensionsRegistered(); + const remoteEnvironment = this._remoteEnvironment.get(remoteAuthority)!; + const resolvedAuthority = this._remoteResolvedAuthority.get(remoteAuthority)!.authority; + return { + connectionData: { + host: resolvedAuthority.host, + port: resolvedAuthority.port, + connectionToken: remoteEnvironment.connectionToken + }, + remoteEnvironment: remoteEnvironment + }; } }; } @@ -547,7 +557,8 @@ export class ExtensionService extends AbstractExtensionService implements IExten remoteEnv.extensions = remoteEnv.extensions.filter(ext => runningLocation.get(ExtensionIdentifier.toKey(ext.identifier)) === RunningLocation.Remote); // save for remote extension's init data - this._remoteExtensionsEnvironmentData.set(remoteAuthority, remoteEnv); + this._remoteEnvironment.set(remoteAuthority, remoteEnv); + this._remoteResolvedAuthority.set(remoteAuthority, resolvedAuthority); await this._startLocalExtensionHost(extensionHost, remoteEnv.extensions.concat(localExtensions), localExtensions.map(extension => extension.identifier)); } else { diff --git a/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts b/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts index 7c74cab435b2903b875428e3a9ca9377491653a1..644e62d83c874b12aedaa042b34a294d90a70355 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts @@ -144,7 +144,7 @@ suite('ExtHostSearch', () => { constructor() { super( rpcProtocol, - new class extends mock() { remote = { isRemote: false, authority: undefined }; }, + new class extends mock() { remote = { isRemote: false, authority: undefined, connectionData: undefined }; }, new URITransformerService(null), logService );