diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 73a90261c94..b373ae6c438 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -12,7 +12,7 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; -import { ExtensionManagementChannel, GlobalExtensionEnablementServiceClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; +import { ExtensionManagementChannel } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; import { IExtensionManagementService, IExtensionGalleryService, IGlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionGalleryService'; @@ -64,6 +64,7 @@ import { UserDataAuthTokenService } from 'vs/platform/userDataSync/common/userDa import { NativeStorageService } from 'vs/platform/storage/node/storageService'; import { GlobalStorageDatabaseChannelClient } from 'vs/platform/storage/node/storageIpc'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; export interface ISharedProcessConfiguration { readonly machineId: string; @@ -189,7 +190,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat services.set(IUserDataAuthTokenService, new SyncDescriptor(UserDataAuthTokenService)); services.set(IUserDataSyncLogService, new SyncDescriptor(UserDataSyncLogService)); services.set(IUserDataSyncUtilService, new UserDataSyncUtilServiceClient(server.getChannel('userDataSyncUtil', client => client.ctx !== 'main'))); - services.set(IGlobalExtensionEnablementService, new GlobalExtensionEnablementServiceClient(server.getChannel('globalExtensionEnablement', client => client.ctx !== 'main'))); + services.set(IGlobalExtensionEnablementService, new SyncDescriptor(GlobalExtensionEnablementService)); services.set(IUserDataSyncStoreService, new SyncDescriptor(UserDataSyncStoreService)); services.set(ISettingsSyncService, new SyncDescriptor(SettingsSynchroniser)); services.set(IUserDataSyncService, new SyncDescriptor(UserDataSyncService)); diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 9612407ed07..293d0a90056 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -219,8 +219,6 @@ export interface IGlobalExtensionEnablementService { enableExtension(extension: IExtensionIdentifier, source?: string): Promise; disableExtension(extension: IExtensionIdentifier, source?: string): Promise; - // Async method until storage service is available in shared process - getDisabledExtensionsAsync(): Promise; } export const ExtensionsLabel = localize('extensions', "Extensions"); diff --git a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts index 41544466ab5..035559f7ec6 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IExtensionManagementService, ILocalExtension, InstallExtensionEvent, DidInstallExtensionEvent, IGalleryExtension, DidUninstallExtensionEvent, IExtensionIdentifier, IGalleryMetadata, IReportedExtension, IGlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IExtensionManagementService, ILocalExtension, InstallExtensionEvent, DidInstallExtensionEvent, IGalleryExtension, DidUninstallExtensionEvent, IExtensionIdentifier, IGalleryMetadata, IReportedExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { Event } from 'vs/base/common/event'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IURITransformer, DefaultURITransformer, transformAndReviveIncomingURIs } from 'vs/base/common/uriIpc'; @@ -130,53 +130,3 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer return Promise.resolve(this.channel.call('getExtensionsReport')); } } - -export class GlobalExtensionEnablementServiceChannel implements IServerChannel { - - constructor(private readonly service: IGlobalExtensionEnablementService) { } - - listen(_: unknown, event: string): Event { - switch (event) { - case 'onDidChangeEnablement': return this.service.onDidChangeEnablement; - } - throw new Error(`Event not found: ${event}`); - } - - call(context: any, command: string, args?: any): Promise { - switch (command) { - case 'getDisabledExtensionsAsync': return Promise.resolve(this.service.getDisabledExtensions()); - case 'enableExtension': return this.service.enableExtension(args[0]); - case 'disableExtension': return this.service.disableExtension(args[0]); - } - throw new Error('Invalid call'); - } -} - -export class GlobalExtensionEnablementServiceClient implements IGlobalExtensionEnablementService { - - _serviceBrand: undefined; - - get onDidChangeEnablement(): Event<{ readonly extensions: IExtensionIdentifier[], readonly source?: string }> { return this.channel.listen('onDidChangeEnablement'); } - - constructor(private readonly channel: IChannel) { - } - - getDisabledExtensionsAsync(): Promise { - return this.channel.call('getDisabledExtensionsAsync'); - } - - enableExtension(extension: IExtensionIdentifier): Promise { - return this.channel.call('enableExtension', [extension]); - } - - disableExtension(extension: IExtensionIdentifier): Promise { - return this.channel.call('disableExtension', [extension]); - } - - getDisabledExtensions(): IExtensionIdentifier[] { - throw new Error('not supported'); - } - -} - - diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index d64b5a653e7..d61bb0be1bd 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -295,7 +295,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse private async getLocalExtensions(): Promise { const installedExtensions = await this.extensionManagementService.getInstalled(); - const disabledExtensions = await this.extensionEnablementService.getDisabledExtensionsAsync(); + const disabledExtensions = await this.extensionEnablementService.getDisabledExtensions(); return installedExtensions .map(({ identifier }) => ({ identifier, enabled: !disabledExtensions.some(disabledExtension => areSameExtensions(disabledExtension, identifier)) })); } diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index 427eee23f84..9b816299847 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -119,11 +119,46 @@ export function registerConfiguration(): IDisposable { return configurationRegistry.onDidUpdateConfiguration(() => registerIgnoredSettingsSchema()); } +// #region User Data Sync Store + export interface IUserData { ref: string; content: string | null; } +export interface IUserDataSyncStore { + url: string; + authenticationProviderId: string; +} + +export function getUserDataSyncStore(configurationService: IConfigurationService): IUserDataSyncStore | undefined { + const value = configurationService.getValue(CONFIGURATION_SYNC_STORE_KEY); + return value && value.url && value.authenticationProviderId ? value : undefined; +} + +export type ResourceKey = 'settings' | 'keybindings' | 'extensions' | 'globalState'; + +export interface IUserDataManifest { + settings: string; + keybindings: string; + extensions: string; + globalState: string; +} + +export const IUserDataSyncStoreService = createDecorator('IUserDataSyncStoreService'); +export interface IUserDataSyncStoreService { + _serviceBrand: undefined; + readonly userDataSyncStore: IUserDataSyncStore | undefined; + read(key: ResourceKey, oldValue: IUserData | null, source?: SyncSource): Promise; + write(key: ResourceKey, content: string, ref: string | null, source?: SyncSource): Promise; + manifest(): Promise; + clear(): Promise; +} + +//#endregion + +// #region User Data Sync Error + export enum UserDataSyncErrorCode { Unauthorized = 'Unauthorized', Forbidden = 'Forbidden', @@ -158,34 +193,9 @@ export class UserDataSyncError extends Error { export class UserDataSyncStoreError extends UserDataSyncError { } -export interface IUserDataSyncStore { - url: string; - authenticationProviderId: string; -} +//#endregion -export function getUserDataSyncStore(configurationService: IConfigurationService): IUserDataSyncStore | undefined { - const value = configurationService.getValue(CONFIGURATION_SYNC_STORE_KEY); - return value && value.url && value.authenticationProviderId ? value : undefined; -} - -export type ResourceKey = 'settings' | 'keybindings' | 'extensions' | 'globalState'; - -export interface IUserDataManifest { - settings: string; - keybindings: string; - extensions: string; - globalState: string; -} - -export const IUserDataSyncStoreService = createDecorator('IUserDataSyncStoreService'); -export interface IUserDataSyncStoreService { - _serviceBrand: undefined; - readonly userDataSyncStore: IUserDataSyncStore | undefined; - read(key: ResourceKey, oldValue: IUserData | null, source?: SyncSource): Promise; - write(key: ResourceKey, content: string, ref: string | null, source?: SyncSource): Promise; - manifest(): Promise; - clear(): Promise; -} +// #region User Data Synchroniser export interface ISyncExtension { identifier: IExtensionIdentifier; @@ -233,6 +243,10 @@ export interface IUserDataSynchroniser { accept(content: string): Promise; } +//#endregion + +// #region User Data Sync Services + export const IUserDataSyncService = createDecorator('IUserDataSyncService'); export interface IUserDataSyncService { _serviceBrand: any; @@ -299,6 +313,8 @@ export interface ISettingsSyncService extends IUserDataSynchroniser { resolveSettingsConflicts(resolvedConflicts: { key: string, value: any | undefined }[]): Promise; } +//#endregion + export const CONTEXT_SYNC_STATE = new RawContextKey('syncStatus', SyncStatus.Uninitialized); export const USER_DATA_SYNC_SCHEME = 'vscode-userdata-sync'; diff --git a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts index 42e83a301df..926a6d2e7a2 100644 --- a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts @@ -9,18 +9,14 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { UserDataSycnUtilServiceChannel } from 'vs/platform/userDataSync/common/userDataSyncIpc'; -import { GlobalExtensionEnablementServiceChannel } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; -import { IGlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; class UserDataSyncServicesContribution implements IWorkbenchContribution { constructor( @IUserDataSyncUtilService userDataSyncUtilService: IUserDataSyncUtilService, @ISharedProcessService sharedProcessService: ISharedProcessService, - @IGlobalExtensionEnablementService globalExtensionEnablementService: IGlobalExtensionEnablementService, ) { sharedProcessService.registerChannel('userDataSyncUtil', new UserDataSycnUtilServiceChannel(userDataSyncUtilService)); - sharedProcessService.registerChannel('globalExtensionEnablement', new GlobalExtensionEnablementServiceChannel(globalExtensionEnablementService)); } }