crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

commit 1964589232e03b9a0bf2f2ff6c311759834802dd
parent 17489693da2f2692065dec074795980c5d9824c1
Author: Michael Camilleri <[email protected]>
Date:   Wed, 20 May 2026 13:25:38 +0900

Improve diagnostic information

Diffstat:
MCrossmate/Sync/SyncEngine.swift | 46+++++++++++++++++++++++++++++++++++++++++++---
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