@@ -17,6 +17,9 @@ import { IUserDataSyncMachine, IUserDataSyncMachinesService } from 'vs/platform/
1717import { PlatformToString , isWeb , Platform , platform } from 'vs/base/common/platform' ;
1818import { escapeRegExpCharacters } from 'vs/base/common/strings' ;
1919import { IProductService } from 'vs/platform/product/common/productService' ;
20+ import { IHeaders } from 'vs/base/parts/request/common/request' ;
21+ import { generateUuid } from 'vs/base/common/uuid' ;
22+ import { localize } from 'vs/nls' ;
2023
2124type AutoSyncClassification = {
2225 sources : { classification : 'SystemMetaData' , purpose : 'FeatureInsight' , isMeasurement : true } ;
@@ -28,6 +31,7 @@ type AutoSyncEnablementClassification = {
2831
2932const enablementKey = 'sync.enable' ;
3033const disableMachineEventuallyKey = 'sync.disableMachineEventually' ;
34+ const SESSION_ID_KEY = 'sync.sessionId' ;
3135
3236export class UserDataAutoSyncEnablementService extends Disposable {
3337
@@ -322,6 +326,10 @@ class AutoSync extends Disposable {
322326 private readonly interval : number /* in milliseconds */ ,
323327 private readonly userDataSyncService : IUserDataSyncService ,
324328 private readonly logService : IUserDataSyncLogService ,
329+ private readonly userDataSyncStoreService : IUserDataSyncStoreService ,
330+ private readonly telemetryService : ITelemetryService ,
331+ private readonly storageService : IStorageService ,
332+ private readonly userDataSyncMachinesService : IUserDataSyncMachinesService ,
325333 ) {
326334 super ( ) ;
327335 }
@@ -379,6 +387,65 @@ class AutoSync extends Disposable {
379387 this . _onDidFinishSync . fire ( error ) ;
380388 }
381389
390+ private async doSync ( reason : string , token : CancellationToken ) : Promise < void > {
391+ try {
392+ this . telemetryService . publicLog2 ( 'sync/getmanifest' ) ;
393+ const syncHeaders : IHeaders = { 'X-Execution-Id' : generateUuid ( ) } ;
394+ let manifest = await this . userDataSyncStoreService . manifest ( syncHeaders ) ;
395+
396+ // Server has no data but this machine was synced before
397+ if ( manifest === null && await this . userDataSyncService . hasPreviouslySynced ( ) ) {
398+ // Sync was turned off in the cloud
399+ throw new UserDataSyncError ( localize ( 'turned off' , "Cannot sync because syncing is turned off in the cloud" ) , UserDataSyncErrorCode . TurnedOff ) ;
400+ }
401+
402+ const sessionId = this . storageService . get ( SESSION_ID_KEY , StorageScope . GLOBAL ) ;
403+ // Server session is different from client session
404+ if ( sessionId && manifest && sessionId !== manifest . session ) {
405+ throw new UserDataSyncError ( localize ( 'session expired' , "Cannot sync because current session is expired" ) , UserDataSyncErrorCode . SessionExpired ) ;
406+ }
407+
408+ const machines = await this . userDataSyncMachinesService . getMachines ( manifest || undefined ) ;
409+ // Return if cancellation is requested
410+ if ( token . isCancellationRequested ) {
411+ return ;
412+ }
413+
414+ const currentMachine = machines . find ( machine => machine . isCurrent ) ;
415+ // Check if sync was turned off from other machine
416+ if ( currentMachine ?. disabled ) {
417+ // Throw TurnedOff error
418+ throw new UserDataSyncError ( localize ( 'turned off machine' , "Cannot sync because syncing is turned off on this machine from another machine." ) , UserDataSyncErrorCode . TurnedOff ) ;
419+ }
420+
421+ await this . userDataSyncService . sync ( manifest , headers , token ) ;
422+
423+ // After syncing, get the manifest if it was not available before
424+ if ( manifest === null ) {
425+ manifest = await this . userDataSyncStoreService . manifest ( syncHeaders ) ;
426+ }
427+
428+ // Return if cancellation is requested
429+ if ( token . isCancellationRequested ) {
430+ return ;
431+ }
432+
433+ // Update local session id
434+ if ( manifest && manifest . session !== sessionId ) {
435+ this . storageService . store ( SESSION_ID_KEY , manifest . session , StorageScope . GLOBAL ) ;
436+ }
437+
438+ } catch ( error ) {
439+ if ( error instanceof UserDataSyncError ) {
440+ this . telemetryService . publicLog2 < { resource ?: string } , SyncClassification > ( `sync/error/${ error . code } ` , { resource : error . resource } ) ;
441+ }
442+ throw error ;
443+ } finally {
444+ this . updateStatus ( ) ;
445+ this . _onSyncErrors . fire ( this . _syncErrors ) ;
446+ }
447+ }
448+
382449 register < T extends IDisposable > ( t : T ) : T {
383450 return super . _register ( t ) ;
384451 }
0 commit comments