perf(xmpp): fix slow MAM/MUC-MAM and move OMEMO decryption off the main
iOS CI / Build and Test SwiftUI App (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build Unsigned iOS IPA (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build macOS ZIP (push) Canceled after 0s

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.
This commit is contained in:
wt committed 2026-08-17 15:32:05 +07:00
1 parent dee7e94e92
commit 9b56d2ebcf
8 files changed
+329 -167

No files matched your search

+9 -5
View File
@@ -145,14 +145,18 @@ OMEMO, и для XEP-0084 аватаров. Для медиа и вложени
XMPP-сокет. Для production нужны Apple Developer credentials, APNs provider,
XEP-0357 push-компонент и регистрация приложения в этом компоненте.
- При первом запуске Luma запрашивает ограниченную последнюю страницу
серверного MAM-архива, чтобы огромная история не блокировала интерфейс.
серверного MAM-архива, чтобы огромная история не блокировала интерфейс, и
показывает индикатор «Синхронизация истории…» только на этом первичном этапе.
После успешного прохода сохраняются серверный UID последней записи и время;
следующие подключения продолжают RSM строго после UID. Временное перекрытие
используется только для старых snapshots без UID или один раз, если сервер
удалил сохранённый UID. Сырые stanza собираются вне main queue, расшифровываются
по одной с уступкой UI, а готовый проход публикуется одной пачкой. Один
foreground-проход также ограничен по страницам и времени; после ошибки он не
перезапускает сам себя бесконечно.
удалил сохранённый UID. Сырые stanza собираются вне main queue, а расшифровка
OMEMO выполняется на отдельной фоновой очереди — главный поток освобождается на
время Signal-криптографии, поэтому большая история не лагает интерфейс.
Инкрементальная догрузка backlog продолжается в фоне без вечного спиннера, а
сообщения применяются атомарными пачками с дедупликацией по `origin-id`/stanza
id через хеш-индексы. После сбоя отдельной страницы синхронизация автоматически
повторяется ограниченное число раз, не дожидаясь повторного открытия приложения.
- Клиент не вводит собственного ограничения размера вложения: фактический
предел сообщает XEP-0363 upload-компонент сервера. Видеосообщение ограничено
60 секундами.