added .read state
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

This commit is contained in:
wt committed 2026-09-14 22:22:15 +07:00
1 parent 299f78de36
commit 16c9fab509
9 files changed
+513 -19

No files matched your search

+20 -1
View File
@@ -37,7 +37,8 @@ XEP-0045-комнатами в отдельном разделе «Группо
собственных дополнительных устройств; при выключенном отправляется обычный
`<body>` внутри TLS-соединения. Ошибка OMEMO никогда не вызывает автоматический
fallback на plaintext. UI сразу показывает optimistic message и обновляет
состояние по результату записи/receipt.
состояние по результату записи/receipt; XEP-0333 `<displayed/>`-маркер
собеседника переводит исходящее сообщение в состояние «прочитано».
## OMEMO 2
@@ -218,6 +219,24 @@ trickle ICE candidates накапливаются до успешного нач
clientID карточки на исходном устройстве. Пропущенный входящий звонок
увеличивает счётчик непрочитанных на каждом устройстве.
Состояние «прочитано» (`.read`) синхронизируется между устройствами тем же
каналом. Устройство, получившее от собеседника `<displayed/>`-маркер
(XEP-0333) или, для MUC, маркер от участника комнаты, переводит исходящее
сообщение в `.read` и отправляет собственному bare JID служебное сообщение с
`<read-marker xmlns='https://luma.chat/read-marker'>` (чат, origin-id, stanza-id
сообщения). Carbons доставляют его на остальные устройства, MAM архивирует —
поэтому свежая установка и повторные прогоны архива сходятся к одному
состоянию, даже когда маркер приходит раньше самого сообщения (MAM отдаёт
станзы от новых к старым): маркер ждёт в `pendingReadMarkers` до upsert
сообщения. Для комнат маркер адресован собственному bare JID и ссылается на
stanza-id из MUC-MAM, так что состояние прочтения не попадает в архив
комнаты. При открытии 1:1-чата Luma отправляет собеседнику `<displayed/>` для
последнего входящего сообщения (в MUC маркеры не отправляются — XEP-0333).
Слияние копий одного исходящего сообщения (live/MAM/MUC-MAM/Carbons)
монотонно: `Delivery.merged(with:)` не позволяет архивному повтору с `.sent`
понизить уже установленные `.delivered`/`.read`, а `.failed` остаётся
неизменным до явной повторной отправки.
Текущая реализация принимает вызов при живом XMPP-соединении. Wake-up завершённого
iOS-приложения намеренно не имитируется: production-путь требует VoIP push,
PushKit/CallKit и серверной APNs-инфраструктуры.