@@ -297,6 +297,10 @@ protected async Task StreamingSync(CancellationToken? signal, PowerSyncConnectio
297297 UpdateSyncStatus ( new SyncStatusOptions
298298 {
299299 Connected = false ,
300+ DataFlow = new SyncDataFlowStatus
301+ {
302+ DownloadError = ex
303+ }
300304 } ) ;
301305
302306 // On error, wait a little before retrying
@@ -466,7 +470,13 @@ protected async Task<StreamingSyncIterationResult> StreamingSyncIteration(Cancel
466470 {
467471 Connected = true ,
468472 LastSyncedAt = DateTime . Now ,
469- DataFlow = new SyncDataFlowStatus { Downloading = false }
473+ DataFlow = new SyncDataFlowStatus
474+ {
475+ Downloading = false
476+ }
477+ } , new UpdateSyncStatusOptions
478+ {
479+ ClearDownloadError = true
470480 } ) ;
471481
472482 }
@@ -539,13 +549,21 @@ protected async Task<StreamingSyncIterationResult> StreamingSyncIteration(Cancel
539549 {
540550 // Connection would be closed automatically right after this
541551 logger . LogDebug ( "Token expiring; reconnect" ) ;
552+ Options . Remote . InvalidateCredentials ( ) ;
542553
543554 // For a rare case where the backend connector does not update the token
544555 // (uses the same one), this should have some delay.
545556 //
546557 await DelayRetry ( ) ;
547558 return new StreamingSyncIterationResult { Retry = true } ;
548559 }
560+ else if ( remainingSeconds < 30 )
561+ {
562+ logger . LogDebug ( "Token will expire soon; reconnect" ) ;
563+ // Pre-emptively refresh the token
564+ Options . Remote . InvalidateCredentials ( ) ;
565+ return new StreamingSyncIterationResult { Retry = true } ;
566+ }
549567 TriggerCrudUpload ( ) ;
550568 }
551569 else
@@ -557,8 +575,13 @@ protected async Task<StreamingSyncIterationResult> StreamingSyncIteration(Cancel
557575 UpdateSyncStatus ( new SyncStatusOptions
558576 {
559577 Connected = true ,
560- LastSyncedAt = DateTime . Now
561- } ) ;
578+ LastSyncedAt = DateTime . Now ,
579+ } ,
580+ new UpdateSyncStatusOptions
581+ {
582+ ClearDownloadError = true
583+ }
584+ ) ;
562585 }
563586 else if ( validatedCheckpoint == targetCheckpoint )
564587 {
@@ -584,8 +607,12 @@ protected async Task<StreamingSyncIterationResult> StreamingSyncIteration(Cancel
584607 LastSyncedAt = DateTime . Now ,
585608 DataFlow = new SyncDataFlowStatus
586609 {
587- Downloading = false
610+ Downloading = false ,
588611 }
612+ } ,
613+ new UpdateSyncStatusOptions
614+ {
615+ ClearDownloadError = true
589616 } ) ;
590617 }
591618 }
@@ -655,6 +682,14 @@ await locks.ObtainLock(new LockOptions<Task>
655682
656683 checkedCrudItem = nextCrudItem ;
657684 await Options . UploadCrud ( ) ;
685+ UpdateSyncStatus ( new SyncStatusOptions
686+ {
687+ } ,
688+ new UpdateSyncStatusOptions
689+ {
690+ ClearUploadError = true
691+ } ) ;
692+
658693 }
659694 else
660695 {
@@ -666,7 +701,14 @@ await locks.ObtainLock(new LockOptions<Task>
666701 catch ( Exception ex )
667702 {
668703 checkedCrudItem = null ;
669- UpdateSyncStatus ( new SyncStatusOptions { DataFlow = new SyncDataFlowStatus { Uploading = false } } ) ;
704+ UpdateSyncStatus ( new SyncStatusOptions
705+ {
706+ DataFlow = new SyncDataFlowStatus
707+ {
708+ Uploading = false ,
709+ UploadError = ex
710+ }
711+ } ) ;
670712
671713 await DelayRetry ( ) ;
672714
@@ -700,7 +742,10 @@ public async Task WaitForReady()
700742 await Task . CompletedTask ;
701743 }
702744
703- protected void UpdateSyncStatus ( SyncStatusOptions options )
745+ protected record UpdateSyncStatusOptions (
746+ bool ? ClearDownloadError = null , bool ? ClearUploadError = null
747+ ) ;
748+ protected void UpdateSyncStatus ( SyncStatusOptions options , UpdateSyncStatusOptions ? updateOptions = null )
704749 {
705750 var updatedStatus = new SyncStatus ( new SyncStatusOptions
706751 {
@@ -710,7 +755,9 @@ protected void UpdateSyncStatus(SyncStatusOptions options)
710755 DataFlow = new SyncDataFlowStatus
711756 {
712757 Uploading = options . DataFlow ? . Uploading ?? SyncStatus . DataFlowStatus . Uploading ,
713- Downloading = options . DataFlow ? . Downloading ?? SyncStatus . DataFlowStatus . Downloading
758+ Downloading = options . DataFlow ? . Downloading ?? SyncStatus . DataFlowStatus . Downloading ,
759+ DownloadError = updateOptions ? . ClearDownloadError == true ? null : options . DataFlow ? . DownloadError ?? SyncStatus . DataFlowStatus . DownloadError ,
760+ UploadError = updateOptions ? . ClearUploadError == true ? null : options . DataFlow ? . UploadError ?? SyncStatus . DataFlowStatus . UploadError ,
714761 }
715762 } ) ;
716763
0 commit comments