/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; import { values } from 'vs/base/common/map'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export interface IStorageKey { readonly key: string; readonly version: number; } export const IStorageKeysSyncRegistryService = createDecorator('IStorageKeysSyncRegistryService'); export interface IStorageKeysSyncRegistryService { _serviceBrand: any; /** * All registered storage keys */ readonly storageKeys: ReadonlyArray; /** * Event that is triggered when storage keys are changed */ readonly onDidChangeStorageKeys: Event>; /** * Register a storage key that has to be synchronized during sync. */ registerStorageKey(key: IStorageKey): void; } export class StorageKeysSyncRegistryService extends Disposable implements IStorageKeysSyncRegistryService { _serviceBrand: any; private readonly _storageKeys = new Map(); get storageKeys(): ReadonlyArray { return values(this._storageKeys); } private readonly _onDidChangeStorageKeys: Emitter> = this._register(new Emitter>()); readonly onDidChangeStorageKeys = this._onDidChangeStorageKeys.event; constructor() { super(); this._register(toDisposable(() => this._storageKeys.clear())); } registerStorageKey(storageKey: IStorageKey): void { if (!this._storageKeys.has(storageKey.key)) { this._storageKeys.set(storageKey.key, storageKey); this._onDidChangeStorageKeys.fire(this.storageKeys); } } }