thread - Replace O(n^2) origin-id/stanza-id lookups in AppModel with hash indexes and stop rebuilding the whole index on every unseen stanza-id, so archive application no longer grows quadratically with history size. - Run OMEMO decryption on a serial background queue instead of the main actor, and decrypt archived stanzas in small batches with a shorter yield, keeping the UI responsive during large archive catch-ups. - Show the "Синхронизация истории…" banner only for the one-page bootstrap window; incremental backlog catch-up continues silently in the background. - Fix MUC-MAM: publish decoded group mutations at the end of room catch-up; they were previously accumulated and then silently dropped. - Retry a failed catch-up pass automatically (bounded) and lengthen the query/apply timeouts so a single slow page no longer leaves history unloaded until the next app activation.
20 lines
941 B
Swift
20 lines
941 B
Swift
import Foundation
|
|
|
|
/// Keeps MAM work below a visible frame-sized burst. A whole decoded pass is
|
|
/// still published atomically; these values only bound network and decryption
|
|
/// work performed before that publication.
|
|
enum ArchiveMessageBatchPolicy {
|
|
static let pageSize = 24
|
|
static let bootstrapMessageLimit = 40
|
|
/// Decrypt this many archived stanzas per main-actor slice before yielding.
|
|
/// One-by-one decryption turns a large MAM catch-up into hours of serialized
|
|
/// work; a small batch keeps frames mostly intact while cutting the number
|
|
/// of run-loop hand-offs by the same factor.
|
|
static let decodeSliceSize = 8
|
|
static let maximumBufferedStanzas = 48
|
|
/// A short yield between archived decryption slices keeps touch handling
|
|
/// responsive without the 8 ms per single message that previously dominated
|
|
/// catch-up time.
|
|
static let interSliceDelayNanoseconds: UInt64 = 1_000_000
|
|
}
|