5.7 KiB
API для разработчиков: DM, push и сигналы звонков
Документ описывает публичные операции, связанные с личными сообщениями, WebPush и сигналами звонков.
Подробная логика DM и бинарного формата:
Dev_Docs/Personal_Messages/Протокол_DM_v1.mdDev_Docs/Personal_Messages/Формат_DM_v1.md
1. UpsertPushToken
Требует авторизации.
Запрос
{
"op": "UpsertPushToken",
"requestId": "push-upsert-001",
"payload": {
"sessionId": "SESSION_ID",
"endpoint": "https://push.example/...",
"p256dhKey": "BASE64",
"authKey": "BASE64",
"platform": "web",
"userAgent": "Mozilla/5.0 ..."
}
}
Успешный ответ
{
"op": "UpsertPushToken",
"requestId": "push-upsert-001",
"status": 200,
"ok": true,
"payload": {
"tokenId": "token-1",
"updatedAtMs": 1774700000123
}
}
2. SendTestWebPush
Требует авторизации.
Запрос
{
"op": "SendTestWebPush",
"requestId": "push-test-001",
"payload": {
"login": "alice",
"sessionId": "SESSION_ID",
"title": "Test",
"text": "Push body"
}
}
3. SendMessagePair и ReceiveOutcomingMessage
ReceiveOutcomingMessage — алиас SendMessagePair.
Назначение
Передаёт пару signed DM-блоков:
incomingBlobB64— блокtype=1илиtype=3outgoingBlobB64— блокtype=2илиtype=4
Все типы в этой паре используют бинарный формат SHiNE_DM.
Запрос
{
"op": "SendMessagePair",
"requestId": "dm-pair-001",
"payload": {
"incomingBlobB64": "BASE64_INCOMING_SIGNED_BLOCK",
"outgoingBlobB64": "BASE64_OUTGOING_SIGNED_BLOCK"
}
}
Успешный ответ
{
"op": "SendMessagePair",
"requestId": "dm-pair-001",
"status": 200,
"ok": true,
"payload": {
"baseKey": "from|to|time|nonce",
"incomingKey": "from|to|time|nonce|1",
"outgoingKey": "from|to|time|nonce|2",
"deliveredWsSessions": 1,
"deliveredWebPushSessions": 0
}
}
Ошибки
400 / BAD_FIELDS— пустойincomingBlobB64илиoutgoingBlobB64400 / BAD_BLOCK_FORMAT— base64 или бинарный контейнер повреждён400 / BAD_CRYPTO_METHOD— неподдерживаемый метод шифрования контейнераEncryptedBody_v1_0404 / USER_NOT_FOUND— один из логинов не найден460 / BAD_SIGNATURE— подпись блока не прошла проверку
4. ReceiveIncomingMessage
Принимает только один входящий signed DM-блок.
Назначение
Используется там, где нужно принять только incoming-вариант сообщения.
Принимаемые типы:
type=1— входящая копия сообщенияtype=3— входящий read-receipt
Запрос
{
"op": "ReceiveIncomingMessage",
"requestId": "dm-in-001",
"payload": {
"incomingBlobB64": "BASE64_INCOMING_SIGNED_BLOCK"
}
}
5. DeleteMessage
Принимает один signed DM-блок type=5 или type=6.
Запрос
{
"op": "DeleteMessage",
"requestId": "dm-del-001",
"payload": {
"blobB64": "BASE64_DELETE_BLOCK"
}
}
6. DeleteConversation
Принимает один signed DM-блок type=7 или type=8.
Запрос
{
"op": "DeleteConversation",
"requestId": "dm-del-all-001",
"payload": {
"blobB64": "BASE64_DELETE_CONVERSATION_BLOCK"
}
}
7. AckSessionDelivery
Требует авторизации. Подтверждает доставку в текущую сессию.
Запрос
{
"op": "AckSessionDelivery",
"requestId": "ack-001",
"payload": {
"messageKey": "from|to|time|nonce|1"
}
}
8. Событие SignedMessageArrived
Сервер присылает его по WebSocket в активные сессии адресата.
Payload события
{
"messageKey": "from|to|time|nonce|1",
"baseKey": "from|to|time|nonce",
"fromLogin": "alice",
"toLogin": "bob",
"targetLogin": "bob",
"messageType": 1,
"timeMs": 1774700000123,
"nonce": 123456789,
"blobB64": "BASE64_SIGNED_BLOCK",
"backlog": false
}
Если это новая ревизия того же письма, messageKey остаётся тем же, а revisionTimeMs меняется внутри бинарного блока.
Для типов 5/6/7/8 событие тоже приходит в таком же конверте, но логика применения определяется messageType и бинарным blobB64.
9. CallInviteBroadcast
Требует авторизации. Шлёт приглашение к звонку в активные сессии toLogin.
10. CallSignalToSession
Требует авторизации. Шлёт сигнал звонка в конкретную сессию.
11. Замечания
- все DM-типы
1..8используютSHiNE_DM - сервер не расшифровывает DM и не использует ciphertext как preview текста
- сервер хранит последнюю применённую ревизию контентного сообщения и отдельные tombstone-события удаления
- HTTP endpoints для DM-файлов сейчас отсутствуют