Skip to content

Commit aa3ea85

Browse files
committed
Explorations
1 parent 3b6578a commit aa3ea85

23 files changed

Lines changed: 455 additions & 486 deletions

src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
4242
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
4343
import { DownloadService } from 'vs/platform/download/node/downloadService';
4444
import { IDownloadService } from 'vs/platform/download/common/download';
45-
import { RemoteAuthorityResolverService } from 'vs/platform/remote/node/remoteAuthorityResolverService';
46-
import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
47-
import { RemoteAuthorityResolverChannel } from 'vs/platform/remote/node/remoteAuthorityResolverChannel';
4845
import { StaticRouter } from 'vs/base/parts/ipc/node/ipc';
4946
import { DefaultURITransformer } from 'vs/base/common/uriIpc';
5047

@@ -130,16 +127,11 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I
130127
services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService));
131128
services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService));
132129
services.set(ILocalizationsService, new SyncDescriptor(LocalizationsService));
133-
services.set(IRemoteAuthorityResolverService, new SyncDescriptor(RemoteAuthorityResolverService));
134130

135131
const instantiationService2 = instantiationService.createChild(services);
136132

137133
instantiationService2.invokeFunction(accessor => {
138134

139-
const remoteAuthorityResolverService = accessor.get(IRemoteAuthorityResolverService);
140-
const remoteAuthorityResolverChannel = new RemoteAuthorityResolverChannel(remoteAuthorityResolverService);
141-
server.registerChannel('remoteAuthorityResolver', remoteAuthorityResolverChannel);
142-
143135
const extensionManagementService = accessor.get(IExtensionManagementService);
144136
const channel = new ExtensionManagementChannel(extensionManagementService, () => DefaultURITransformer);
145137
server.registerChannel('extensions', channel);
@@ -153,7 +145,6 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I
153145

154146
createSharedProcessContributions(instantiationService2);
155147
disposables.push(extensionManagementService as ExtensionManagementService);
156-
disposables.push(remoteAuthorityResolverService as RemoteAuthorityResolverService);
157148
});
158149
});
159150
}

src/vs/code/electron-main/app.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ export class CodeApplication extends Disposable {
209209
} else {
210210
const [host, strPort] = authority.split(':');
211211
const port = parseInt(strPort, 10);
212-
return { authority, host, port };
212+
return { authority, host, port, syncExtensions: false };
213213
}
214214
};
215215

src/vs/platform/extensionManagement/common/extensionManagement.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { ILocalization } from 'vs/platform/localizations/common/localizations';
1111
import { URI } from 'vs/base/common/uri';
1212
import { IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/workspace';
1313
import { CancellationToken } from 'vs/base/common/cancellation';
14-
import { IRemoteAuthorityResolver } from 'vs/platform/remote/common/remoteAuthorityResolver';
1514

1615
export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\-A-Z]*)$';
1716
export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN);
@@ -109,7 +108,6 @@ export interface IExtensionContributions {
109108
views?: { [location: string]: IView[] };
110109
colors?: IColor[];
111110
localizations?: ILocalization[];
112-
remoteAuthorityResolvers?: IRemoteAuthorityResolver[];
113111
}
114112

115113
export type ExtensionKind = 'ui' | 'workspace';

src/vs/platform/extensionManagement/node/multiExtensionManagement.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { URI } from 'vs/base/common/uri';
1414
import { Disposable } from 'vs/base/common/lifecycle';
1515
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1616
import { CancellationToken } from 'vs/base/common/cancellation';
17-
import { IRemoteAuthorityResolverService, IRemoteAuthorityResolver } from 'vs/platform/remote/common/remoteAuthorityResolver';
17+
import { IRemoteAuthorityResolverService, ResolvedAuthority } from 'vs/platform/remote/common/remoteAuthorityResolver';
1818
import { getManifest } from 'vs/platform/extensionManagement/node/extensionManagementUtil';
1919

2020
export class MulitExtensionManagementService extends Disposable implements IExtensionManagementService {
@@ -100,13 +100,13 @@ export class MulitExtensionManagementService extends Disposable implements IExte
100100
return this.extensionManagementServerService.getExtensionManagementServer(extension.location);
101101
}
102102

103-
private _remoteAuthorityResolverPromise: Thenable<IRemoteAuthorityResolver>;
103+
private _remoteAuthorityResolverPromise: Thenable<ResolvedAuthority>;
104104
private hasToSyncExtensions(): Thenable<boolean> {
105105
if (!this.extensionManagementServerService.remoteExtensionManagementServer) {
106106
return Promise.resolve(false);
107107
}
108108
if (!this._remoteAuthorityResolverPromise) {
109-
this._remoteAuthorityResolverPromise = this.remoteAuthorityResolverService.getRemoteAuthorityResolver(this.extensionManagementServerService.remoteExtensionManagementServer.authority);
109+
this._remoteAuthorityResolverPromise = this.remoteAuthorityResolverService.resolveAuthority(this.extensionManagementServerService.remoteExtensionManagementServer.authority);
110110
}
111111
return this._remoteAuthorityResolverPromise.then(({ syncExtensions }) => !!syncExtensions);
112112
}

src/vs/platform/remote/common/remoteAuthorityResolver.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,21 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
7-
import { IProgressStep } from 'vs/platform/progress/common/progress';
8-
import { Event } from 'vs/base/common/event';
97

108
export const IRemoteAuthorityResolverService = createDecorator<IRemoteAuthorityResolverService>('remoteAuthorityResolverService');
119

1210
export interface ResolvedAuthority {
1311
readonly authority: string;
1412
readonly host: string;
1513
readonly port: number;
14+
readonly syncExtensions: boolean;
1615
}
1716

18-
export type IResolvingProgressEvent =
19-
{ type: 'progress', authority: string, data: IProgressStep }
20-
| { type: 'finished', authority: string }
21-
| { type: 'output', authority: string, data: { channel: string, message: string; isErr?: boolean; } };
22-
2317
export interface IRemoteAuthorityResolverService {
2418

2519
_serviceBrand: any;
2620

27-
onResolvingProgress: Event<IResolvingProgressEvent>;
28-
2921
resolveAuthority(authority: string): Thenable<ResolvedAuthority>;
3022

31-
getRemoteAuthorityResolver(authority: string): Thenable<IRemoteAuthorityResolver | null>;
32-
}
33-
34-
export interface IRemoteAuthorityResolver {
35-
label: string;
36-
path: string;
37-
authorityPrefix: string;
38-
syncExtensions?: boolean;
23+
setResolvedAuthority(resolvedAuthority: ResolvedAuthority): void;
3924
}

src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,53 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IChannel } from 'vs/base/parts/ipc/node/ipc';
7-
import { Event, buffer } from 'vs/base/common/event';
8-
import { ResolvedAuthority, IResolvingProgressEvent, IRemoteAuthorityResolverService, IRemoteAuthorityResolver } from 'vs/platform/remote/common/remoteAuthorityResolver';
6+
import { ResolvedAuthority, IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
97
import { ipcRenderer as ipc } from 'electron';
108

11-
export class RemoteAuthorityResolverChannelClient implements IRemoteAuthorityResolverService {
9+
class PendingResolveAuthorityRequest {
10+
constructor(
11+
public readonly resolve: (value: ResolvedAuthority) => void,
12+
public readonly reject: (err: any) => void,
13+
public readonly promise: Promise<ResolvedAuthority>,
14+
) {
15+
}
16+
}
17+
18+
export class RemoteAuthorityResolverService implements IRemoteAuthorityResolverService {
1219

1320
_serviceBrand: any;
1421

15-
private _resolveAuthorityCache: { [authority: string]: Thenable<ResolvedAuthority>; };
16-
get onResolvingProgress(): Event<IResolvingProgressEvent> { return buffer(this.channel.listen('onResolvingProgress'), true); }
22+
private _pendingResolveAuthorityRequests: { [authority: string]: PendingResolveAuthorityRequest; };
23+
private _resolvedAuthorities: { [authority: string]: ResolvedAuthority; };
1724

18-
constructor(private channel: IChannel) {
19-
this._resolveAuthorityCache = Object.create(null);
25+
constructor() {
26+
this._pendingResolveAuthorityRequests = Object.create(null);
27+
this._resolvedAuthorities = Object.create(null);
2028
}
2129

2230
resolveAuthority(authority: string): Thenable<ResolvedAuthority> {
23-
if (!this._resolveAuthorityCache[authority]) {
24-
this._resolveAuthorityCache[authority] = this._resolveAuthority(authority);
25-
this._resolveAuthorityCache[authority].then((r) => {
26-
ipc.send('vscode:remoteAuthorityResolved', {
27-
authority: authority,
28-
host: r.host,
29-
port: r.port
30-
});
31+
if (this._resolvedAuthorities[authority]) {
32+
return Promise.resolve(this._resolvedAuthorities[authority]);
33+
}
34+
if (!this._pendingResolveAuthorityRequests[authority]) {
35+
let resolve: (value: ResolvedAuthority) => void;
36+
let reject: (err: any) => void;
37+
let promise = new Promise<ResolvedAuthority>((_resolve, _reject) => {
38+
resolve = _resolve;
39+
reject = _reject;
3140
});
41+
this._pendingResolveAuthorityRequests[authority] = new PendingResolveAuthorityRequest(resolve, reject, promise);
3242
}
33-
return this._resolveAuthorityCache[authority];
43+
return this._pendingResolveAuthorityRequests[authority].promise;
3444
}
3545

36-
getRemoteAuthorityResolver(authority: string): Thenable<IRemoteAuthorityResolver | null> {
37-
return this.channel.call('getRemoteAuthorityResolver', [authority]);
38-
}
39-
40-
private _resolveAuthority(authority: string): Thenable<ResolvedAuthority> {
41-
if (authority.indexOf('+') >= 0) {
42-
return this.channel.call('resolveAuthority', [authority]);
43-
} else {
44-
const [host, strPort] = authority.split(':');
45-
const port = parseInt(strPort, 10);
46-
return Promise.resolve({ authority, host, port });
46+
setResolvedAuthority(resolvedAuthority: ResolvedAuthority) {
47+
this._resolvedAuthorities[resolvedAuthority.authority] = resolvedAuthority;
48+
if (this._pendingResolveAuthorityRequests[resolvedAuthority.authority]) {
49+
let request = this._pendingResolveAuthorityRequests[resolvedAuthority.authority];
50+
delete this._pendingResolveAuthorityRequests[resolvedAuthority.authority];
51+
ipc.send('vscode:remoteAuthorityResolved', resolvedAuthority);
52+
request.resolve(resolvedAuthority);
4753
}
4854
}
49-
5055
}

src/vs/platform/remote/node/remoteAuthorityResolverChannel.ts

Lines changed: 0 additions & 35 deletions
This file was deleted.

src/vs/platform/remote/node/remoteAuthorityResolverService.ts

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/vs/workbench/api/node/extHost.api.impl.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,11 @@ import { ExtHostWindow } from 'vs/workbench/api/node/extHostWindow';
6161
import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace';
6262
import { IExtensionDescription, throwProposedApiError, checkProposedApiEnabled, nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
6363
import { ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier';
64+
import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/node/extensionDescriptionRegistry';
6465
import * as vscode from 'vscode';
6566

6667
export interface IExtensionApiFactory {
67-
(extension: IExtensionDescription): typeof vscode;
68+
(extension: IExtensionDescription, registry: ExtensionDescriptionRegistry): typeof vscode;
6869
}
6970

7071
function proposedApiFunction<T>(extension: IExtensionDescription, fn: T): T {
@@ -140,7 +141,7 @@ export function createApiFactory(
140141
// Register API-ish commands
141142
ExtHostApiCommands.register(extHostCommands);
142143

143-
return function (extension: IExtensionDescription): typeof vscode {
144+
return function (extension: IExtensionDescription, extensionRegistry: ExtensionDescriptionRegistry): typeof vscode {
144145

145146
// Check document selectors for being overly generic. Technically this isn't a problem but
146147
// in practice many extensions say they support `fooLang` but need fs-access to do so. Those
@@ -259,14 +260,14 @@ export function createApiFactory(
259260
// namespace: extensions
260261
const extensions: typeof vscode.extensions = {
261262
getExtension(extensionId: string): Extension<any> {
262-
let desc = extensionService.getExtensionDescription(extensionId);
263+
let desc = extensionRegistry.getExtensionDescription(extensionId);
263264
if (desc) {
264265
return new Extension(extensionService, desc);
265266
}
266267
return undefined;
267268
},
268269
get all(): Extension<any>[] {
269-
return extensionService.getAllExtensionDescriptions().map((desc) => new Extension(extensionService, desc));
270+
return extensionRegistry.getAllExtensionDescriptions().map((desc) => new Extension(extensionService, desc));
270271
}
271272
};
272273

@@ -860,11 +861,11 @@ class Extension<T> implements vscode.Extension<T> {
860861
}
861862
}
862863

863-
export function initializeExtensionApi(extensionService: ExtHostExtensionService, apiFactory: IExtensionApiFactory): Promise<void> {
864-
return extensionService.getExtensionPathIndex().then(trie => defineAPI(apiFactory, trie));
864+
export function initializeExtensionApi(extensionService: ExtHostExtensionService, apiFactory: IExtensionApiFactory, extensionRegistry: ExtensionDescriptionRegistry): Promise<void> {
865+
return extensionService.getExtensionPathIndex().then(trie => defineAPI(apiFactory, trie, extensionRegistry));
865866
}
866867

867-
function defineAPI(factory: IExtensionApiFactory, extensionPaths: TernarySearchTree<IExtensionDescription>): void {
868+
function defineAPI(factory: IExtensionApiFactory, extensionPaths: TernarySearchTree<IExtensionDescription>, extensionRegistry: ExtensionDescriptionRegistry): void {
868869

869870
// each extension is meant to get its own api implementation
870871
const extApiImpl = new Map<string, typeof vscode>();
@@ -882,7 +883,7 @@ function defineAPI(factory: IExtensionApiFactory, extensionPaths: TernarySearchT
882883
if (ext) {
883884
let apiImpl = extApiImpl.get(ext.id);
884885
if (!apiImpl) {
885-
apiImpl = factory(ext);
886+
apiImpl = factory(ext, extensionRegistry);
886887
extApiImpl.set(ext.id, apiImpl);
887888
}
888889
return apiImpl;
@@ -893,7 +894,7 @@ function defineAPI(factory: IExtensionApiFactory, extensionPaths: TernarySearchT
893894
let extensionPathsPretty = '';
894895
extensionPaths.forEach((value, index) => extensionPathsPretty += `\t${index} -> ${value.id}\n`);
895896
console.warn(`Could not identify extension for 'vscode' require call from ${parent.filename}. These are the extension path mappings: \n${extensionPathsPretty}`);
896-
defaultApiImpl = factory(nullExtensionDescription);
897+
defaultApiImpl = factory(nullExtensionDescription, extensionRegistry);
897898
}
898899
return defaultApiImpl;
899900
};

src/vs/workbench/api/node/extHost.protocol.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,15 @@ import { IProgressOptions, IProgressStep } from 'vs/platform/progress/common/pro
4343
import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles';
4444
import * as vscode from 'vscode';
4545
import { IMarkdownString } from 'vs/base/common/htmlContent';
46+
import { ResolvedAuthority } from 'vs/platform/remote/common/remoteAuthorityResolver';
4647

4748
export interface IEnvironment {
4849
isExtensionDevelopmentDebug: boolean;
4950
appRoot: URI;
5051
appSettingsHome: URI;
5152
extensionDevelopmentLocationURI: URI;
5253
extensionTestsPath: string;
53-
globalStorageHome: string;
54+
globalStorageHome: URI;
5455
}
5556

5657
export interface IWorkspaceData {
@@ -70,6 +71,7 @@ export interface IInitData {
7071
telemetryInfo: ITelemetryInfo;
7172
logLevel: LogLevel;
7273
logsLocation: URI;
74+
autoStart: boolean;
7375
remoteAuthority?: string | null;
7476
}
7577

@@ -732,6 +734,8 @@ export interface ExtHostSearchShape {
732734
}
733735

734736
export interface ExtHostExtensionServiceShape {
737+
$resolveAuthority(remoteAuthority: string): Thenable<ResolvedAuthority>;
738+
$startExtensionHost(enabledExtensionIds: string[]): Thenable<void>;
735739
$activateByEvent(activationEvent: string): Thenable<void>;
736740
}
737741

0 commit comments

Comments
 (0)