Improve direct message history and SQLite resilience

This commit is contained in:
AidarKC
2026-07-22 13:09:42 +04:00
parent 2f3b1571e5
commit 93673e5786
18 changed files with 908 additions and 233 deletions
+68 -3
View File
@@ -176,7 +176,72 @@
}
```
## 7. `AckSessionDelivery`
## 7. `GetDirectMessages`
Требует авторизации. Возвращает историю диалога с конкретным собеседником страницами.
Важно:
- начиная с 22 июля 2026 года сервер больше не высылает старую DM-историю автоматически при логине;
- после подключения клиент должен сам запросить первую страницу диалога;
- новые realtime-сообщения по-прежнему приходят событием `SignedMessageArrived`.
- в `GetDirectMessages` сервер отдаёт только обычные chat-сообщения (`type=1/2`), без read-receipt и delete/tombstone.
### Запрос
```json
{
"op": "GetDirectMessages",
"requestId": "dm-history-001",
"payload": {
"peerLogin": "bob",
"limit": 50,
"beforeTimeMs": 1774700000123,
"beforeMessageKey": "alice|bob|1774700000123|123456789|1"
}
}
```
`beforeTimeMs` и `beforeMessageKey` необязательны. Если их нет, сервер вернёт самую новую страницу.
### Успешный ответ
```json
{
"op": "GetDirectMessages",
"requestId": "dm-history-001",
"status": 200,
"ok": true,
"payload": {
"login": "alice",
"peerLogin": "bob",
"limit": 50,
"hasMore": true,
"nextBeforeTimeMs": 1774699999000,
"nextBeforeMessageKey": "alice|bob|1774699999000|123456780|2",
"messages": [
{
"messageKey": "alice|bob|1774700000123|123456789|1",
"baseKey": "alice|bob|1774700000123|123456789",
"fromLogin": "alice",
"toLogin": "bob",
"messageType": 1,
"timeMs": 1774700000123,
"nonce": 123456789,
"revisionTimeMs": 0,
"reencryptedAtMs": 0,
"createdAtMs": 1774700001123,
"readAtMs": 1774700001456,
"blobB64": "BASE64_SIGNED_BLOCK"
}
]
}
}
```
Для следующей страницы клиент должен передать `nextBeforeTimeMs` и `nextBeforeMessageKey` из предыдущего ответа.
## 8. `AckSessionDelivery`
Требует авторизации. Подтверждает доставку в текущую сессию.
@@ -192,7 +257,7 @@
}
```
## 8. Событие `SignedMessageArrived`
## 9. Событие `SignedMessageArrived`
Сервер присылает его по WebSocket в активные сессии адресата.
@@ -217,7 +282,7 @@
Для типов `5/6/7/8` событие тоже приходит в таком же конверте, но логика применения определяется `messageType` и бинарным `blobB64`.
## 9. `CallInviteBroadcast`
## 10. `CallInviteBroadcast`
Требует авторизации. Шлёт приглашение к звонку в активные сессии `toLogin`.