@@ -2148,6 +2148,22 @@ class RustPushService extends GetxService {
21482148 Database .attachments.putMany (attachments);
21492149 }
21502150
2151+ // forcibly stops a running sync operation.
2152+ Future <void > resetCloudKitSync () async {
2153+ if (isSyncing.value == null ) return ;
2154+
2155+ if (kIsDesktop) {
2156+ exit (0 );
2157+ } else {
2158+ await mcs.invokeMethod ("native-sync-isolate" , {
2159+ "close" : true
2160+ });
2161+ ui.IsolateNameServer .removePortNameMapping ("bg_sync" );
2162+ pushService.isSyncing.value = null ;
2163+ chats.restoring = false ;
2164+ }
2165+ }
2166+
21512167 Rxn <String > isSyncing = Rxn (null );
21522168 Future <void > doCloudKitSync () async {
21532169 if (kIsDesktop) {
@@ -2187,6 +2203,20 @@ class RustPushService extends GetxService {
21872203 return "${size .toStringAsFixed (decimals )} ${suffixes [i ]}" ;
21882204 }
21892205
2206+ (int , DateTime ) getCutoffTime () {
2207+ // yes, we call this a lot, it's a bit of a shame.
2208+ ss.prefs.reload ();
2209+ var time = ss.prefs.getInt ('syncHistoryTime' ) ?? 0 ;
2210+
2211+ var cutoffDateTime = DateTime .fromMillisecondsSinceEpoch (0 );
2212+ var cutoffTime = 0 ;
2213+ if (time != 0 ) {
2214+ cutoffTime = RustPushBBUtils .nsSinceAppleEpoch (DateTime .now ()) - (time * 1000000 );
2215+ cutoffDateTime = DateTime .now ().subtract (Duration (milliseconds: time));
2216+ }
2217+ return (cutoffTime, cutoffDateTime);
2218+ }
2219+
21902220 Future <void > uploadMessages (
21912221 List <Message > messages,
21922222 List <(String , String )> uploadAttachments,
@@ -2394,6 +2424,8 @@ class RustPushService extends GetxService {
23942424
23952425 isSyncing.value = "Downloading Attachments..." ;
23962426
2427+ // we must have one uniform cutoff time to ensure we don't upload duplicates
2428+ var (cutoffTime, cutoffDateTime) = getCutoffTime ();
23972429 var attCount = 0 ;
23982430 currentState = 0 ;
23992431 while (currentState != 3 ) {
@@ -2413,6 +2445,12 @@ class RustPushService extends GetxService {
24132445 }
24142446 if (dupDeleteAttachments.contains (item.key)) continue ;
24152447 var decoded = api.decodeAttachmentmeta (wrapped: item.value! .cm);
2448+
2449+ if (cutoffTime > decoded.createdDate && currentState != 3 ) {
2450+ Logger .info ("Stopping attachment sync for cutoff!" );
2451+ currentState = 3 ;
2452+ }
2453+
24162454 var existing = Attachment .findOne (convertAttachmentGuid (decoded.guid));
24172455 if (existing != null ) {
24182456 if (existing.ckRecordId != null && existing.ckRecordId != item.key) {
@@ -2482,6 +2520,12 @@ class RustPushService extends GetxService {
24822520 continue ;
24832521 }
24842522 if (dupDeleteMessages.contains (item.key)) continue ;
2523+
2524+ if (cutoffTime > item.value! .time && currentState != 3 ) {
2525+ Logger .info ("Stopping message sync for cutoff!" );
2526+ currentState = 3 ;
2527+ }
2528+
24852529 var existing = Message .findOne (guid: item.value! .guid);
24862530 if (existing != null ) {
24872531 if (existing.ckRecordId == item.key) {
@@ -2591,7 +2635,8 @@ class RustPushService extends GetxService {
25912635 bool noAttachments = ! ss.settings.attachmentSyncEnabled.value;
25922636
25932637
2594- var unsyncedMessages = Database .messages.query (Message_ .ckRecordId.isNull ().and (Message_ .itemType.equals (0 )).and (Message_ .ckSyncState.equals (false ).or (Message_ .ckSyncState.isNull ())))
2638+ var unsyncedMessages = Database .messages.query (Message_ .ckRecordId.isNull ().and (Message_ .itemType.equals (0 )).and (Message_ .ckSyncState.equals (false ).or (Message_ .ckSyncState.isNull ()))
2639+ .and (Message_ .dateCreated.greaterThanDate (cutoffDateTime)))
25952640 .build ()
25962641 ..limit = 3000 ;
25972642 var messages = unsyncedMessages.find ();
@@ -2601,7 +2646,8 @@ class RustPushService extends GetxService {
26012646 Logger .info ("Syncing batch ${messages .length }" );
26022647 await uploadMessages (messages, uploadAttachments, idToAttachment, noAttachments);
26032648
2604- var unsyncedMessages = Database .messages.query (Message_ .ckRecordId.isNull ().and (Message_ .itemType.equals (0 )).and (Message_ .ckSyncState.equals (false ).or (Message_ .ckSyncState.isNull ())))
2649+ var unsyncedMessages = Database .messages.query (Message_ .ckRecordId.isNull ().and (Message_ .itemType.equals (0 )).and (Message_ .ckSyncState.equals (false ).or (Message_ .ckSyncState.isNull ()))
2650+ .and (Message_ .dateCreated.greaterThanDate (cutoffDateTime)))
26052651 .build ()
26062652 ..limit = 3000 ;
26072653 messages = unsyncedMessages.find ();
0 commit comments