diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 8ca0b13ea65..7dc2a800f64 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1089,59 +1089,4 @@ declare module 'vscode' { } //#endregion - - // #region Sandy - User data synchronization - - export namespace window { - - /** - * Register an [UserDataSyncProvider](#UserDataSyncProvider) to read and write user data. - * @param name Name of the user data sync provider - * @param userDataSyncProvider [UserDataSyncProvider](#UserDataSyncProvider) to read and write user data - */ - export function registerUserDataSyncProvider(name: string, userDataSyncProvider: UserDataSyncProvider): Disposable; - - } - - export class UserDataError extends Error { - - /** - * Create an error to signal that writing user data with given ref is rejected, becase of new ref. - */ - static Rejected(): FileSystemError; - - /** - * Creates a new userData error. - */ - constructor(); - } - - /** - * User data sync provider to read and write user data. - */ - export interface UserDataSyncProvider { - - /** - * Reads the content and its ref for the given key. - * Return null if key does not exists. - * - * @param key key of the content to read - * @returns the content and its ref for the given key. Return null if key does not exists. - */ - read(key: string): Promise<{ content: string, ref: string } | null>; - - /** - * Writes the new content based on the given ref for the given key. - * - * @param key key of the content to write - * @param content new content to write - * @param ref ref of the content on which the content to write is based on - * @throws [Rejected](#UserDataError.Rejected) if the ref is not the latest. - * @returns the latest ref of the content. - */ - write(key: string, content: string, ref: string | null): Promise; - - } - - //#endregion } diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts index 3201bfc181d..2905c524113 100644 --- a/src/vs/workbench/api/browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts @@ -18,7 +18,6 @@ import './mainThreadCodeInsets'; import './mainThreadClipboard'; import './mainThreadCommands'; import './mainThreadConfiguration'; -import './mainThreadUserData'; import './mainThreadConsole'; import './mainThreadDebugService'; import './mainThreadDecorations'; diff --git a/src/vs/workbench/api/browser/mainThreadUserData.ts b/src/vs/workbench/api/browser/mainThreadUserData.ts deleted file mode 100644 index 509f8566752..00000000000 --- a/src/vs/workbench/api/browser/mainThreadUserData.ts +++ /dev/null @@ -1,48 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Disposable } from 'vs/base/common/lifecycle'; -import { MainContext, ExtHostContext, IExtHostContext, MainThreadUserDataShape, ExtHostUserDataShape } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { IUserData } from 'vs/platform/userDataSync/common/userDataSync'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { IUserDataSyncStoresRegistry, Extensions } from 'vs/workbench/services/userDataSync/common/userDataSyncStores'; - -@extHostNamedCustomer(MainContext.MainThreadUserData) -export class MainThreadUserData extends Disposable implements MainThreadUserDataShape { - - private readonly proxy: ExtHostUserDataShape; - - constructor( - extHostContext: IExtHostContext, - ) { - super(); - this.proxy = extHostContext.getProxy(ExtHostContext.ExtHostUserData); - } - - $registerUserDataProvider(id: string, name: string): void { - const proxy = this.proxy; - Registry.as(Extensions.UserDataSyncStoresRegistry).registerUserDataSyncStore({ - id, - name, - read(key: string): Promise { - return proxy.$read(key); - }, - write(key: string, content: string, ref: string): Promise { - return proxy.$write(key, content, ref); - } - }); - } - - $deregisterUserDataProvider(id: string): void { - Registry.as(Extensions.UserDataSyncStoresRegistry).deregisterUserDataSyncStore(id); - } - - dispose(): void { - const registry = Registry.as(Extensions.UserDataSyncStoresRegistry); - registry.all.forEach(store => registry.deregisterUserDataSyncStore(store.id)); - } - -} diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 8eeb8078ea4..417b85c2883 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -68,7 +68,6 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IURITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; -import { ExtHostUserData } from 'vs/workbench/api/common/extHostUserData'; export interface IExtensionApiFactory { (extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode; @@ -125,7 +124,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol)); const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress))); const extHostLabelService = rpcProtocol.set(ExtHostContext.ExtHosLabelService, new ExtHostLabelService(rpcProtocol)); - const extHostUserData = rpcProtocol.set(ExtHostContext.ExtHostUserData, new ExtHostUserData(rpcProtocol.getProxy(MainContext.MainThreadUserData), extHostLogService)); // Check that no named customers are missing const expected: ProxyIdentifier[] = values(ExtHostContext); @@ -545,10 +543,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I }, createInputBox(): vscode.InputBox { return extHostQuickOpen.createInputBox(extension.identifier); - }, - registerUserDataSyncProvider: (name: string, userDataProvider: vscode.UserDataSyncProvider): vscode.Disposable => { - checkProposedApiEnabled(extension); - return extHostUserData.registerUserDataProvider(extension.identifier.value, name, userDataProvider); } }; @@ -907,7 +901,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I CallHierarchyIncomingCall: extHostTypes.CallHierarchyIncomingCall, CallHierarchyItem: extHostTypes.CallHierarchyItem, Decoration: extHostTypes.Decoration, - UserDataError: extHostTypes.UserDataError, WebviewEditorState: extHostTypes.WebviewEditorState, UIKind: UIKind }; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 55bcebff44e..c62623e3929 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -46,7 +46,6 @@ import { ExtensionActivationError } from 'vs/workbench/services/extensions/commo import { createExtHostContextProxyIdentifier as createExtId, createMainContextProxyIdentifier as createMainId, IRPCProtocol } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import * as search from 'vs/workbench/services/search/common/search'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; -import { IUserData } from 'vs/platform/userDataSync/common/userDataSync'; export interface IEnvironment { isExtensionDevelopmentDebug: boolean; @@ -146,11 +145,6 @@ export interface MainThreadConfigurationShape extends IDisposable { $removeConfigurationOption(target: ConfigurationTarget | null, key: string, resource: UriComponents | undefined): Promise; } -export interface MainThreadUserDataShape extends IDisposable { - $registerUserDataProvider(id: string, name: string): void; - $deregisterUserDataProvider(id: string): void; -} - export interface MainThreadDiagnosticsShape extends IDisposable { $changeMany(owner: string, entries: [UriComponents, IMarkerData[] | undefined][]): void; $clear(owner: string): void; @@ -758,11 +752,6 @@ export interface ExtHostConfigurationShape { $acceptConfigurationChanged(data: IConfigurationInitData, eventData: IWorkspaceConfigurationChangeEventData): void; } -export interface ExtHostUserDataShape { - $read(key: string): Promise; - $write(key: string, content: string, ref: string): Promise; -} - export interface ExtHostDiagnosticsShape { $acceptMarkersChange(data: [UriComponents, IMarkerData[]][]): void; } @@ -1336,7 +1325,6 @@ export const MainContext = { MainThreadCommands: createMainId('MainThreadCommands'), MainThreadComments: createMainId('MainThreadComments'), MainThreadConfiguration: createMainId('MainThreadConfiguration'), - MainThreadUserData: createMainId('MainThreadUserData'), MainThreadConsole: createMainId('MainThreadConsole'), MainThreadDebugService: createMainId('MainThreadDebugService'), MainThreadDecorations: createMainId('MainThreadDecorations'), @@ -1376,7 +1364,6 @@ export const MainContext = { export const ExtHostContext = { ExtHostCommands: createExtId('ExtHostCommands'), ExtHostConfiguration: createExtId('ExtHostConfiguration'), - ExtHostUserData: createExtId('ExtHostUserData'), ExtHostDiagnostics: createExtId('ExtHostDiagnostics'), ExtHostDebugService: createExtId('ExtHostDebugService'), ExtHostDecorations: createExtId('ExtHostDecorations'), diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 6462f5b3b9e..f75f09034e7 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -14,8 +14,6 @@ import { generateUuid } from 'vs/base/common/uuid'; import * as vscode from 'vscode'; import { FileSystemProviderErrorCode, markAsFileSystemProviderError } from 'vs/platform/files/common/files'; import { RemoteAuthorityResolverErrorCode } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { UserDataSyncStoreErrorCode } from 'vs/platform/userDataSync/common/userDataSync'; -import { markAsUserDataSyncStoreError } from 'vs/workbench/services/userDataSync/common/userDataSyncStores'; function es5ClassCompat(target: Function): any { ///@ts-ignore @@ -2385,28 +2383,6 @@ export class Decoration { bubble?: boolean; } -@es5ClassCompat -export class UserDataError extends Error { - - static Rejected(message?: string): UserDataError { - return new UserDataError(message, UserDataSyncStoreErrorCode.Rejected); - } - - constructor(message?: string, code: UserDataSyncStoreErrorCode = UserDataSyncStoreErrorCode.Unknown) { - super(message); - - // mark the error as user data provider error so that - // we can extract the error code on the receiving side - markAsUserDataSyncStoreError(this, code); - - // workaround when extending builtin objects and when compiling to ES5, see: - // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work - if (typeof (Object).setPrototypeOf === 'function') { - (Object).setPrototypeOf(this, UserDataError.prototype); - } - } -} - export enum WebviewEditorState { Readonly = 1, Unchanged = 2, diff --git a/src/vs/workbench/api/common/extHostUserData.ts b/src/vs/workbench/api/common/extHostUserData.ts deleted file mode 100644 index de5e565f7cb..00000000000 --- a/src/vs/workbench/api/common/extHostUserData.ts +++ /dev/null @@ -1,48 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { ExtHostUserDataShape, MainThreadUserDataShape } from './extHost.protocol'; -import * as vscode from 'vscode'; -import { toDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { ILogService } from 'vs/platform/log/common/log'; -import { IUserData } from 'vs/platform/userDataSync/common/userDataSync'; - -export class ExtHostUserData implements ExtHostUserDataShape { - - private name: string | null = null; - private userDataProvider: vscode.UserDataSyncProvider | null = null; - - constructor( - private readonly proxy: MainThreadUserDataShape, - private readonly logService: ILogService, - ) { - } - - 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(id, name); - return toDisposable(() => this.proxy.$deregisterUserDataProvider(id)); - } - - $read(key: string): Promise { - if (!this.userDataProvider) { - throw new Error('No remote user data provider exists.'); - } - return this.userDataProvider.read(key); - } - - $write(key: string, content: string, ref: string): Promise { - if (!this.userDataProvider) { - throw new Error('No remote user data provider exists.'); - } - return this.userDataProvider.write(key, content, ref); - } - -} diff --git a/src/vs/workbench/services/userDataSync/common/userDataSyncStores.ts b/src/vs/workbench/services/userDataSync/common/userDataSyncStores.ts deleted file mode 100644 index cd83212d09b..00000000000 --- a/src/vs/workbench/services/userDataSync/common/userDataSyncStores.ts +++ /dev/null @@ -1,128 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * 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 { IUserData, UserDataSyncStoreErrorCode, UserDataSyncStoreError } 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 function markAsUserDataSyncStoreError(error: Error, code: UserDataSyncStoreErrorCode): Error { - error.name = code ? `${code} (UserDataSyncStoreError)` : `UserDataSyncStoreError`; - - return error; -} - -export function toUserDataSyncStoreErrorCode(error: Error | undefined | null): UserDataSyncStoreErrorCode { - - // Guard against abuse - if (!error) { - return UserDataSyncStoreErrorCode.Unknown; - } - - // FileSystemProviderError comes with the code - if (error instanceof UserDataSyncStoreError) { - return error.code; - } - - // Any other error, check for name match by assuming that the error - // went through the markAsUserDataSyncStoreError() method - const match = /^(.+) \(UserDataSyncStoreError\)$/.exec(error.name); - if (!match) { - return UserDataSyncStoreErrorCode.Unknown; - } - - switch (match[1]) { - case UserDataSyncStoreErrorCode.Rejected: return UserDataSyncStoreErrorCode.Rejected; - } - - return UserDataSyncStoreErrorCode.Unknown; -} - -export interface IUserDataSyncStore { - readonly id: string; - readonly name: string; - read(key: string): Promise; - write(key: string, content: string, ref: string | null): Promise; -} - -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());