From a75738a79dd4f50b4eb4339b606b2dcbda78fe90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20F=C3=B6rtsch?= Date: Fri, 13 Mar 2026 21:34:38 +0100 Subject: [PATCH] add background body prefetch for recent messages (last 30 days) Co-Authored-By: Claude Opus 4.6 --- .../Sources/SyncEngine/SyncCoordinator.swift | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Packages/MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift b/Packages/MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift index c745fa6..4fe3743 100644 --- a/Packages/MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift +++ b/Packages/MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift @@ -121,6 +121,8 @@ public final class SyncCoordinator { emit(.newMessages(count: envelopes.count, mailbox: remoteMailbox.name)) } + await prefetchBodies(mailboxId: mailboxId) + try store.updateMailboxSync( id: mailboxId, uidValidity: status.uidValidity, @@ -128,6 +130,26 @@ public final class SyncCoordinator { ) } + /// Fetch full bodies for recent messages that don't have bodyText yet + private func prefetchBodies(mailboxId: String) async { + let thirtyDaysAgo = ISO8601DateFormatter().string( + from: Calendar.current.date(byAdding: .day, value: -30, to: Date())! + ) + do { + let messages = try store.messages(mailboxId: mailboxId) + let recent = messages.filter { $0.bodyText == nil && $0.date >= thirtyDaysAgo } + for message in recent.prefix(50) { + guard !Task.isCancelled else { break } + let (text, html) = try await imapClient.fetchBody(uid: message.uid) + if text != nil || html != nil { + try store.storeBody(messageId: message.id, text: text, html: html) + } + } + } catch { + // Background prefetch failure is non-fatal + } + } + private func envelopeToRecord( _ envelope: FetchedEnvelope, accountId: String, mailboxId: String ) -> MessageRecord {