#12 sync call history between devices via carbons and MAM
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

- After a call ends, send a plaintext <call-history/> service message
  to the user's own bare JID with direction, status, duration, start
  time, peer and video flag plus the call id as origin-id.
- Intercept the payload on live, carbon and MAM paths and upsert the
  same system call card on every device; deduplication reuses the
  origin-id as clientID, and missed incoming calls bump unread.
- Cover payload parsing and round-trip in CallHistorySyncTests, guard
  the namespace and interception in verify.sh, and document the flow
  in ARCHITECTURE.md.
This commit is contained in:
wt
2026-08-29 20:51:28 +07:00
parent 0d78e02d2b
commit 1a26651daa
10 changed files with 269 additions and 18 deletions
+9
View File
@@ -196,6 +196,15 @@ trickle ICE candidates накапливаются до успешного нач
успешным и получает длительность. Удаление `activeCall` до закрытия Jingle-сессии
гарантирует, что ответный callback не создаст дубликат карточки.
Карточка звонка синхронизируется между устройствами: по завершении вызова
устройство отправляет самому себе (собственный bare JID) служебное сообщение с
`<call-history xmlns='https://luma.chat/call-history'>` (направление, статус,
длительность, время начала, собеседник, видео). Carbons доставляют его на
остальные устройства, MAM сохраняет в архиве; получатели парсят payload и
создают ту же карточку, а дедупликация идёт по origin-id, совпадающему с
clientID карточки на исходном устройстве. Пропущенный входящий звонок
увеличивает счётчик непрочитанных на каждом устройстве.
Текущая реализация принимает вызов при живом XMPP-соединении. Wake-up завершённого
iOS-приложения намеренно не имитируется: production-путь требует VoIP push,
PushKit/CallKit и серверной APNs-инфраструктуры.