commit 1964589232e03b9a0bf2f2ff6c311759834802dd
parent 17489693da2f2692065dec074795980c5d9824c1
Author: Michael Camilleri <[email protected]>
Date: Wed, 20 May 2026 13:25:38 +0900
Improve diagnostic information
Diffstat:
1 file changed, 43 insertions(+), 3 deletions(-)
diff --git a/Crossmate/Sync/SyncEngine.swift b/Crossmate/Sync/SyncEngine.swift
@@ -2578,15 +2578,55 @@ actor SyncEngine {
}
}
+ private nonisolated static func recordTypeSummary(_ counts: [String: Int]) -> String {
+ counts
+ .filter { $0.value > 0 }
+ .sorted { lhs, rhs in
+ if lhs.key == rhs.key { return lhs.value > rhs.value }
+ return lhs.key < rhs.key
+ }
+ .map { "\($0.key)=\($0.value)" }
+ .joined(separator: ", ")
+ }
+
+ private nonisolated static func inferredRecordType(for recordID: CKRecord.ID) -> String {
+ let name = recordID.recordName
+ if name.hasPrefix("moves-") { return "Moves" }
+ if name.hasPrefix("player-") { return "Player" }
+ if name.hasPrefix("game-") { return "Game" }
+ if name.hasPrefix("ping-") { return "Ping" }
+ if name.hasPrefix("decision-") { return "Decision" }
+ return "Unknown"
+ }
+
private func handleSentRecordZoneChanges(
_ event: CKSyncEngine.Event.SentRecordZoneChanges,
isPrivate: Bool
) async {
+ let savedTypes = Dictionary(
+ grouping: event.savedRecords,
+ by: \.recordType
+ ).mapValues(\.count)
+ let failedTypes = Dictionary(
+ grouping: event.failedRecordSaves,
+ by: { $0.record.recordType }
+ ).mapValues(\.count)
+ let deletedTypes = Dictionary(
+ grouping: event.deletedRecordIDs,
+ by: Self.inferredRecordType(for:)
+ ).mapValues(\.count)
+ let savedSummary = Self.recordTypeSummary(savedTypes)
+ let failedSummary = Self.recordTypeSummary(failedTypes)
+ let deletedSummary = Self.recordTypeSummary(deletedTypes)
+
await trace(
"\(isPrivate ? "private" : "shared") sent: " +
- "\(event.savedRecords.count) saved, " +
- "\(event.failedRecordSaves.count) failed, " +
- "\(event.deletedRecordIDs.count) deleted"
+ "\(event.savedRecords.count) saved" +
+ "\(savedSummary.isEmpty ? "" : " (\(savedSummary))"), " +
+ "\(event.failedRecordSaves.count) failed" +
+ "\(failedSummary.isEmpty ? "" : " (\(failedSummary))"), " +
+ "\(event.deletedRecordIDs.count) deleted" +
+ "\(deletedSummary.isEmpty ? "" : " (\(deletedSummary))")"
)
for record in event.savedRecords {
let name = record.recordID.recordName