diff --git a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts index 9574d24e419..82df24ea01f 100644 --- a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts @@ -114,10 +114,23 @@ export class UserDataAutoSyncService extends UserDataAutoSyncEnablementService i ) { super(storageService, environmentService, userDataSyncStoreManagementService); this.syncTriggerDelayer = this._register(new Delayer(0)); + this.lastSyncUrl = this.syncUrl; this.syncUrl = userDataSyncStoreManagementService.userDataSyncStore?.url; - if (userDataSyncStoreManagementService.userDataSyncStore) { + if (this.syncUrl) { + + this.logService.info('Using settings sync service', this.syncUrl.toString()); + this._register(userDataSyncStoreManagementService.onDidChangeUserDataSyncStore(() => { + if (!isEqual(this.syncUrl, userDataSyncStoreManagementService.userDataSyncStore?.url)) { + this.lastSyncUrl = this.syncUrl; + this.syncUrl = userDataSyncStoreManagementService.userDataSyncStore?.url; + if (this.syncUrl) { + this.logService.info('Using settings sync service', this.syncUrl.toString()); + } + } + })); + if (this.isEnabled()) { this.logService.info('Auto Sync is enabled.'); } else { diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index 642c49800e5..f98181038df 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -158,6 +158,7 @@ export type UserDataSyncStoreType = 'insiders' | 'stable'; export const IUserDataSyncStoreManagementService = createDecorator('IUserDataSyncStoreManagementService'); export interface IUserDataSyncStoreManagementService { readonly _serviceBrand: undefined; + readonly onDidChangeUserDataSyncStore: Event; readonly userDataSyncStore: IUserDataSyncStore | undefined; switch(type: UserDataSyncStoreType): Promise; getPreviousUserDataSyncStore(): Promise; diff --git a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts index 08a8243bb42..aaa4a8543f1 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts @@ -271,6 +271,9 @@ export class UserDataSyncStoreManagementServiceChannel implements IServerChannel constructor(private readonly service: IUserDataSyncStoreManagementService) { } listen(_: unknown, event: string): Event { + switch (event) { + case 'onDidChangeUserDataSyncStore': return this.service.onDidChangeUserDataSyncStore; + } throw new Error(`Event not found: ${event}`); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts index 20ffff9cffd..59e8d8fb0d2 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts @@ -36,7 +36,10 @@ export abstract class AbstractUserDataSyncStoreManagementService extends Disposa _serviceBrand: any; - readonly userDataSyncStore: UserDataSyncStore | undefined; + private readonly _onDidChangeUserDataSyncStore = this._register(new Emitter()); + readonly onDidChangeUserDataSyncStore = this._onDidChangeUserDataSyncStore.event; + private _userDataSyncStore: UserDataSyncStore | undefined; + get userDataSyncStore(): UserDataSyncStore | undefined { return this._userDataSyncStore; } constructor( @IProductService protected readonly productService: IProductService, @@ -44,7 +47,12 @@ export abstract class AbstractUserDataSyncStoreManagementService extends Disposa @IStorageService protected readonly storageService: IStorageService, ) { super(); - this.userDataSyncStore = this.toUserDataSyncStore(productService[CONFIGURATION_SYNC_STORE_KEY], configurationService.getValue(CONFIGURATION_SYNC_STORE_KEY)); + this.updateUserDataSyncStore(); + } + + protected updateUserDataSyncStore(): void { + this._userDataSyncStore = this.toUserDataSyncStore(this.productService[CONFIGURATION_SYNC_STORE_KEY], this.configurationService.getValue(CONFIGURATION_SYNC_STORE_KEY)); + this._onDidChangeUserDataSyncStore.fire(); } protected toUserDataSyncStore(productStore: ConfigurationSyncStore | undefined, configuredStore?: ConfigurationSyncStore): UserDataSyncStore | undefined { @@ -69,7 +77,7 @@ export abstract class AbstractUserDataSyncStoreManagementService extends Disposa defaultUrl: URI.parse(syncStore.url), stableUrl: URI.parse(syncStore.stableUrl), insidersUrl: URI.parse(syncStore.insidersUrl), - canSwitch: !!syncStore.canSwitch, + canSwitch: !!syncStore.canSwitch && !configuredStore?.url, authenticationProviders: Object.keys(syncStore.authenticationProviders).reduce((result, id) => { result.push({ id, scopes: syncStore!.authenticationProviders[id].scopes }); return result; @@ -92,7 +100,6 @@ export class UserDataSyncStoreManagementService extends AbstractUserDataSyncStor @IProductService productService: IProductService, @IConfigurationService configurationService: IConfigurationService, @IStorageService storageService: IStorageService, - @IUserDataSyncLogService logService: IUserDataSyncLogService, ) { super(productService, configurationService, storageService); @@ -107,10 +114,6 @@ export class UserDataSyncStoreManagementService extends AbstractUserDataSyncStor } else { this.storageService.remove(SYNC_PREVIOUS_STORE, StorageScope.GLOBAL); } - - if (this.userDataSyncStore) { - logService.info('Using settings sync service', this.userDataSyncStore.url.toString()); - } } async switch(type: UserDataSyncStoreType): Promise { @@ -120,6 +123,7 @@ export class UserDataSyncStoreManagementService extends AbstractUserDataSyncStor } else { this.storageService.store(SYNC_SERVICE_URL_TYPE, type, StorageScope.GLOBAL); } + this.updateUserDataSyncStore(); } } @@ -130,7 +134,7 @@ export class UserDataSyncStoreManagementService extends AbstractUserDataSyncStor export class UserDataSyncStoreClient extends Disposable implements IUserDataSyncStoreClient { - private readonly userDataSyncStoreUrl: URI | undefined; + private userDataSyncStoreUrl: URI | undefined; private authToken: { token: string, type: string } | undefined; private readonly commonHeadersPromise: Promise<{ [key: string]: string; }>; @@ -157,7 +161,7 @@ export class UserDataSyncStoreClient extends Disposable implements IUserDataSync @IStorageService private readonly storageService: IStorageService, ) { super(); - this.userDataSyncStoreUrl = userDataSyncStoreUrl ? joinPath(userDataSyncStoreUrl, 'v1') : undefined; + this.updateUserDataSyncStoreUrl(userDataSyncStoreUrl); this.commonHeadersPromise = getServiceMachineId(environmentService, fileService, storageService) .then(uuid => { const headers: IHeaders = { @@ -180,6 +184,10 @@ export class UserDataSyncStoreClient extends Disposable implements IUserDataSync this.authToken = { token, type }; } + protected updateUserDataSyncStoreUrl(userDataSyncStoreUrl: URI | undefined): void { + this.userDataSyncStoreUrl = userDataSyncStoreUrl ? joinPath(userDataSyncStoreUrl, 'v1') : undefined; + } + private initDonotMakeRequestsUntil(): void { const donotMakeRequestsUntil = this.storageService.getNumber(DONOT_MAKE_REQUESTS_UNTIL_KEY, StorageScope.GLOBAL); if (donotMakeRequestsUntil && Date.now() < donotMakeRequestsUntil) { @@ -465,6 +473,7 @@ export class UserDataSyncStoreService extends UserDataSyncStoreClient implements @IStorageService storageService: IStorageService, ) { super(userDataSyncStoreManagementService.userDataSyncStore?.url, productService, requestService, logService, environmentService, fileService, storageService); + this._register(userDataSyncStoreManagementService.onDidChangeUserDataSyncStore(() => this.updateUserDataSyncStoreUrl(userDataSyncStoreManagementService.userDataSyncStore?.url))); } } diff --git a/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts b/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts index d6f8e16fbf7..157ba284876 100644 --- a/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts +++ b/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts @@ -752,6 +752,8 @@ class SimpleIUserDataSyncStoreManagementService implements IUserDataSyncStoreMan declare readonly _serviceBrand: undefined; + onDidChangeUserDataSyncStore = Event.None; + userDataSyncStore: IUserDataSyncStore | undefined = undefined; async switch(type: UserDataSyncStoreType): Promise { } diff --git a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncStoreManagementService.ts b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncStoreManagementService.ts index d5df2210df5..7b2e238f684 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncStoreManagementService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncStoreManagementService.ts @@ -25,6 +25,7 @@ class UserDataSyncStoreManagementService extends AbstractUserDataSyncStoreManage ) { super(productService, configurationService, storageService); this.channel = sharedProcessService.getChannel('userDataSyncStoreManagement'); + this._register(this.channel.listen('onDidChangeUserDataSyncStore')(() => this.updateUserDataSyncStore())); } async switch(type: UserDataSyncStoreType): Promise {