diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index a311d5185da00dc037da9c80a2362168a48336a1..4e47e25b3912de42b456992fa9ccff9f1d2188d3 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -58,6 +58,7 @@ export class UserDataSyncStoreError extends Error { } export interface IUserDataSyncStore { + readonly id: string; readonly name: string; read(key: string): Promise; write(key: string, content: string, ref: string | null): Promise; diff --git a/src/vs/workbench/api/browser/mainThreadUserData.ts b/src/vs/workbench/api/browser/mainThreadUserData.ts index 6893e0ce18c59211267102bee9ec420fb664dcd0..69d2cdefadca4f858971577d1f9db3d573afc251 100644 --- a/src/vs/workbench/api/browser/mainThreadUserData.ts +++ b/src/vs/workbench/api/browser/mainThreadUserData.ts @@ -22,9 +22,10 @@ export class MainThreadUserData extends Disposable implements MainThreadUserData this._register(toDisposable(() => this.userDataSyncStoreService.deregisterUserDataSyncStore())); } - $registerUserDataProvider(name: string): void { + $registerUserDataProvider(id: string, name: string): void { const proxy = this.proxy; this.userDataSyncStoreService.registerUserDataSyncStore({ + id, name, read(key: string): Promise { return proxy.$read(key); diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 5cb276d27b2a82958bd72a1a0e5679648dba9c6c..8eeb8078ea4a3c023e1600c0eec9b88baaaad65a 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -546,9 +546,9 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I createInputBox(): vscode.InputBox { return extHostQuickOpen.createInputBox(extension.identifier); }, - registerUserDataSyncProvider: (identity: string, userDataProvider: vscode.UserDataSyncProvider): vscode.Disposable => { + registerUserDataSyncProvider: (name: string, userDataProvider: vscode.UserDataSyncProvider): vscode.Disposable => { checkProposedApiEnabled(extension); - return extHostUserData.registerUserDataProvider(identity, userDataProvider); + return extHostUserData.registerUserDataProvider(extension.identifier.value, name, userDataProvider); } }; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index e3e56c063c6814097899d8f08d712e62aad70dd0..979ab88a2dffb20d61a6a24d51152c036619d195 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -147,7 +147,7 @@ export interface MainThreadConfigurationShape extends IDisposable { } export interface MainThreadUserDataShape extends IDisposable { - $registerUserDataProvider(name: string): void; + $registerUserDataProvider(id: string, name: string): void; $deregisterUserDataProvider(): void; } diff --git a/src/vs/workbench/api/common/extHostUserData.ts b/src/vs/workbench/api/common/extHostUserData.ts index 182b989359aee9f3ffdbb4b8ea70aa0b7347fa73..02984f3d88d795bfb80843f77c5ac02bb7d8e546 100644 --- a/src/vs/workbench/api/common/extHostUserData.ts +++ b/src/vs/workbench/api/common/extHostUserData.ts @@ -20,14 +20,14 @@ export class ExtHostUserData implements ExtHostUserDataShape { ) { } - registerUserDataProvider(name: string, userDataProvider: vscode.UserDataSyncProvider): vscode.Disposable { + registerUserDataProvider(id: string, name: string, userDataProvider: vscode.UserDataSyncProvider): vscode.Disposable { if (this.userDataProvider) { this.logService.warn(`A user data provider '${this.name}' already exists hence ignoring the remote user data provider '${name}'.`); return Disposable.None; } this.userDataProvider = userDataProvider; this.name = name; - this.proxy.$registerUserDataProvider(name); + this.proxy.$registerUserDataProvider(id, name); return toDisposable(() => this.proxy.$deregisterUserDataProvider()); } diff --git a/src/vs/workbench/services/userDataSync/common/userDataSyncStores.ts b/src/vs/workbench/services/userDataSync/common/userDataSyncStores.ts new file mode 100644 index 0000000000000000000000000000000000000000..8734df3eb085590425d170d2ed8dfad534fd0474 --- /dev/null +++ b/src/vs/workbench/services/userDataSync/common/userDataSyncStores.ts @@ -0,0 +1,90 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event, Emitter } from 'vs/base/common/event'; +import { IUserDataSyncStore } from 'vs/platform/userDataSync/common/userDataSync'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { values } from 'vs/base/common/map'; +import { Registry } from 'vs/platform/registry/common/platform'; + + +export namespace Extensions { + export const UserDataSyncStoresRegistry = 'workbench.registry.userData.syncStores'; +} + +export interface IUserDataSyncStoresRegistry { + /** + * An event that is triggerred when a user data sync store is registered. + */ + readonly onDidRegister: Event; + + /** + * An event that is triggerred when a user data sync store is deregistered. + */ + readonly onDidDeregister: Event; + + /** + * All registered user data sync stores + */ + readonly all: IUserDataSyncStore[]; + + /** + * Registers a user data sync store + * + * @param userDataSyncStore to register + */ + registerUserDataSyncStore(userDataSyncStore: IUserDataSyncStore): void; + + /** + * Deregisters the user data sync store with given id + */ + deregisterUserDataSyncStore(id: string): void; + + /** + * Returns the user data sync store with given id. + * + * @returns the user data sync store with given id. + */ + get(id: string): IUserDataSyncStore | undefined; +} + +class UserDataSyncStoresRegistryImpl extends Disposable implements IUserDataSyncStoresRegistry { + + private readonly _onDidRegister = this._register(new Emitter()); + readonly onDidRegister: Event = this._onDidRegister.event; + + private readonly _onDidDeregister = this._register(new Emitter()); + readonly onDidDeregister: Event = this._onDidDeregister.event; + + private userDataSyncStores: Map = new Map(); + + get all(): IUserDataSyncStore[] { + return values(this.userDataSyncStores); + } + + registerUserDataSyncStore(userDataSyncStore: IUserDataSyncStore): void { + const existing = this.userDataSyncStores.get(userDataSyncStore.id); + if (existing) { + return; + } + + this.userDataSyncStores.set(userDataSyncStore.id, userDataSyncStore); + this._onDidRegister.fire(userDataSyncStore); + } + + deregisterUserDataSyncStore(id: string): void { + const existing = this.userDataSyncStores.get(id); + if (existing) { + this.userDataSyncStores.delete(id); + this._onDidDeregister.fire(id); + } + } + + get(id: string): IUserDataSyncStore | undefined { + return this.userDataSyncStores.get(id); + } +} + +Registry.add(Extensions.UserDataSyncStoresRegistry, new UserDataSyncStoresRegistryImpl());