perf(xmpp): fix slow MAM/MUC-MAM and move OMEMO decryption off the main
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:
1 parent
dee7e94e92
commit
9b56d2ebcf
8 files changed
+329
-167
No files matched your search
@@ -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 секундами.
|
||||
|
||||
Reference in new issue
Block a user