2
>
* Copyright (c) Microsoft Corporation. All rights reserved.
3
>
* Licensed under the MIT License. See License.txt in the project root for license information.
4
>
*--------------------------------------------------------------------------------------------*/
5
>
6
>
import { CancelablePromise, createCancelablePromise, disposableTimeout, ThrottledDelayer, timeout } from '../../../base/common/async.js';
7
>
import { CancellationToken } from '../../../base/common/cancellation.js';
8
>
import { toLocalISOString } from '../../../base/common/date.js';
9
>
import { toErrorMessage } from '../../../base/common/errorMessage.js';
10
>
import { isCancellationError } from '../../../base/common/errors.js';
11
>
import { Emitter, Event } from '../../../base/common/event.js';
12
>
import { Disposable, IDisposable, MutableDisposable, toDisposable } from '../../../base/common/lifecycle.js';
13
>
import { isWeb } from '../../../base/common/platform.js';
14
>
import { isEqual } from '../../../base/common/resources.js';
15
>
import { URI } from '../../../base/common/uri.js';
16
>
import { localize } from '../../../nls.js';
17
>
import { IMeteredConnectionService } from '../../meteredConnection/common/meteredConnection.js';
18
>
import { IProductService } from '../../product/common/productService.js';
19
>
import { IStorageService, StorageScope, StorageTarget } from '../../storage/common/storage.js';
20
>
import { ITelemetryService } from '../../telemetry/common/telemetry.js';
21
>
import { IUserDataSyncTask, IUserDataAutoSyncService, IUserDataManifest, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncService, IUserDataSyncStoreManagementService, IUserDataSyncStoreService, UserDataAutoSyncError, UserDataSyncError, UserDataSyncErrorCode, SyncOptions } from './userDataSync.js';
22
>
import { IUserDataSyncAccountService } from './userDataSyncAccount.js';
23
>
import { IUserDataSyncMachinesService } from './userDataSyncMachines.js';
24
>
25
>
const disableMachineEventuallyKey = 'sync.disableMachineEventually';
26
>
const sessionIdKey = 'sync.sessionId';
27
>
const storeUrlKey = 'sync.storeUrl';
28
>
const productQualityKey = 'sync.productQuality';
29
>
30
>
export class UserDataAutoSyncService extends Disposable implements IUserDataAutoSyncService {
31
>
32
>
_serviceBrand: undefined;
33
>
34
>
private readonly autoSync = this._register(new MutableDisposable<AutoSync>());
35
>
private successiveFailures: number = 0;
36
>
private lastSyncTriggerTime: number | undefined = undefined;
37
>
private readonly syncTriggerDelayer: ThrottledDelayer<void>;
38
>
private suspendUntilRestart: boolean = false;
39
>
40
>
private readonly _onError: Emitter<UserDataSyncError> = this._register(new Emitter<UserDataSyncError>());
41
>
readonly onError: Event<UserDataSyncError> = this._onError.event;
42
>
43
>
private lastSyncUrl: URI | undefined;
44
>
private get syncUrl(): URI | undefined {
45
>
const value = this.storageService.get(storeUrlKey, StorageScope.APPLICATION);
46
>
return value ? URI.parse(value) : undefined;
47
>
}
48
>
private set syncUrl(syncUrl: URI | undefined) {
49
if (syncUrl) {
50
this.storageService.store(storeUrlKey, syncUrl.toString(), StorageScope.APPLICATION, StorageTarget.MACHINE);