Skip to content

Commit 1937de8

Browse files
committed
1 parent 5b69c8d commit 1937de8

File tree

2 files changed

+65
-10
lines changed

2 files changed

+65
-10
lines changed

src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,17 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { localize } from 'vs/nls';
7-
import { ExtensionInstallLocation, IExtensionManagementServer, IExtensionManagementServerService, IProfileAwareExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
7+
import { ExtensionInstallLocation, IExtensionManagementServer, IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
88
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
99
import { Schemas } from 'vs/base/common/network';
10-
import { Event } from 'vs/base/common/event';
1110
import { IChannel } from 'vs/base/parts/ipc/common/ipc';
1211
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
1312
import { ILabelService } from 'vs/platform/label/common/label';
1413
import { isWeb } from 'vs/base/common/platform';
1514
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1615
import { WebExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/webExtensionManagementService';
1716
import { IExtension } from 'vs/platform/extensions/common/extensions';
18-
import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc';
17+
import { RemoteExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/remoteExtensionManagementService';
1918

2019
export class ExtensionManagementServerService implements IExtensionManagementServerService {
2120

@@ -32,13 +31,7 @@ export class ExtensionManagementServerService implements IExtensionManagementSer
3231
) {
3332
const remoteAgentConnection = remoteAgentService.getConnection();
3433
if (remoteAgentConnection) {
35-
const extensionManagementService = new class extends ExtensionManagementChannelClient implements IProfileAwareExtensionManagementService {
36-
get onProfileAwareInstallExtension() { return super.onInstallExtension; }
37-
get onProfileAwareDidInstallExtensions() { return super.onDidInstallExtensions; }
38-
get onProfileAwareUninstallExtension() { return super.onUninstallExtension; }
39-
get onProfileAwareDidUninstallExtension() { return super.onDidUninstallExtension; }
40-
readonly onDidChangeProfile = Event.None;
41-
}(remoteAgentConnection.getChannel<IChannel>('extensions'));
34+
const extensionManagementService = instantiationService.createInstance(RemoteExtensionManagementService, remoteAgentConnection.getChannel<IChannel>('extensions'));
4235
this.remoteExtensionManagementServer = {
4336
id: 'remote',
4437
extensionManagementService,
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { IChannel } from 'vs/base/parts/ipc/common/ipc';
7+
import { Event } from 'vs/base/common/event';
8+
import { ILocalExtension, IGalleryExtension, InstallOptions, InstallVSIXOptions, UninstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement';
9+
import { URI } from 'vs/base/common/uri';
10+
import { ExtensionType } from 'vs/platform/extensions/common/extensions';
11+
import { IProfileAwareExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
12+
import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc';
13+
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
14+
import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile';
15+
16+
export class RemoteExtensionManagementService extends ExtensionManagementChannelClient implements IProfileAwareExtensionManagementService {
17+
18+
readonly onDidChangeProfile = Event.None;
19+
get onProfileAwareInstallExtension() { return super.onInstallExtension; }
20+
get onProfileAwareDidInstallExtensions() { return super.onDidInstallExtensions; }
21+
get onProfileAwareUninstallExtension() { return super.onUninstallExtension; }
22+
get onProfileAwareDidUninstallExtension() { return super.onDidUninstallExtension; }
23+
24+
constructor(
25+
channel: IChannel,
26+
@IUserDataProfilesService private readonly userDataProfileService: IUserDataProfilesService,
27+
@IUriIdentityService private readonly uriIdentityService: IUriIdentityService,
28+
) {
29+
super(channel);
30+
}
31+
32+
override getInstalled(type: ExtensionType | null = null, profileLocation?: URI): Promise<ILocalExtension[]> {
33+
this.validateProfileLocation({ profileLocation });
34+
return super.getInstalled(type);
35+
}
36+
37+
override uninstall(extension: ILocalExtension, options?: UninstallOptions): Promise<void> {
38+
options = this.validateProfileLocation(options);
39+
return super.uninstall(extension, options);
40+
}
41+
42+
override async install(vsix: URI, options?: InstallVSIXOptions): Promise<ILocalExtension> {
43+
options = this.validateProfileLocation(options);
44+
return super.install(vsix, options);
45+
}
46+
47+
override async installFromGallery(extension: IGalleryExtension, options?: InstallOptions): Promise<ILocalExtension> {
48+
options = this.validateProfileLocation(options);
49+
return super.installFromGallery(extension, options);
50+
}
51+
52+
private validateProfileLocation<T extends { profileLocation?: URI }>(options?: T): T | undefined {
53+
if (options?.profileLocation) {
54+
if (!this.uriIdentityService.extUri.isEqual(options?.profileLocation, this.userDataProfileService.defaultProfile.extensionsResource)) {
55+
throw new Error('This opertaion is not supported in remote scenario');
56+
}
57+
options = { ...options, profileLocation: undefined };
58+
}
59+
return options;
60+
}
61+
62+
}

0 commit comments

Comments
 (0)