diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index c156f96a984..bb99dd1cc4d 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -2179,4 +2179,22 @@ declare module 'vscode' { } //#endregion + + //#region Syncing Extension's Global State https://github.com/microsoft/vscode/issues/95209 @sandy081 + + export interface ExtensionContext { + readonly syncedGlobalState: SyncedMemento; + } + + export interface SyncedMemento extends Memento { + + /** + * List of keys whose values should be synced across devices when extensions synchronization is enabled . + * Set synced keys to an empty array to unset the synced state. + */ + syncedKeys: ReadonlyArray; + + } + + //#endregion } diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 180ece0ff96..dc794045400 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -387,6 +387,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme const that = this; return Object.freeze({ globalState, + get syncedGlobalState() { checkProposedApiEnabled(extensionDescription); return globalState; }, workspaceState, subscriptions: [], get extensionUri() { return extensionDescription.extensionLocation; }, diff --git a/src/vs/workbench/api/common/extHostMemento.ts b/src/vs/workbench/api/common/extHostMemento.ts index b37d4e0ea60..8a0fdfe62da 100644 --- a/src/vs/workbench/api/common/extHostMemento.ts +++ b/src/vs/workbench/api/common/extHostMemento.ts @@ -7,9 +7,11 @@ import type * as vscode from 'vscode'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; -export class ExtensionMemento implements vscode.Memento { +export class ExtensionMemento implements vscode.SyncedMemento { + private readonly _extension: IExtensionDescription; private readonly _id: string; private readonly _version: string; private readonly _shared: boolean; @@ -19,14 +21,19 @@ export class ExtensionMemento implements vscode.Memento { private _value?: { [n: string]: any; }; private readonly _storageListener: IDisposable; - private _syncKeys: string[] = []; - get syncKeys(): ReadonlyArray { return Object.freeze(this._syncKeys); } - set syncKeys(syncKeys: ReadonlyArray) { - this._syncKeys = [...syncKeys]; - this._storage.registerExtensionStorageKeysToSync({ id: this._id, version: this._version }, this._syncKeys); + private _syncedKeys: string[] = []; + get syncedKeys(): ReadonlyArray { return Object.freeze(this._syncedKeys); } + set syncedKeys(syncKeys: ReadonlyArray) { + checkProposedApiEnabled(this._extension); + if (!this._shared) { + throw new Error('Only global state is synchronized'); + } + this._syncedKeys = [...syncKeys]; + this._storage.registerExtensionStorageKeysToSync({ id: this._id, version: this._version }, this._syncedKeys); } constructor(extensionDescription: IExtensionDescription, global: boolean, storage: ExtHostStorage) { + this._extension = extensionDescription; this._id = extensionDescription.identifier.value; this._version = extensionDescription.version; this._shared = global;