58 lines
4.2 KiB
C
58 lines
4.2 KiB
C
/*
|
||
* dm_mailbox.h — очередь offline-сообщений на суперузлах
|
||
*
|
||
* Суперузел общей группы хранит непрозрачное подписанное тело и повторяет
|
||
* доставку при появлении маршрута до получателя, независимо от отправителя.
|
||
* Копия удаляется только по квитанции получателя после commit в dm_core.
|
||
* Квитанция сохраняется отдельно для повторов PUT и доставки отправителю.
|
||
*
|
||
* Роль S — supernode=yes в подписанных adm_tags общей CHAT-группы A/B; storage её не заменяет.
|
||
* При PUT от A в одной транзакции фиксируются сообщение и, для file, задание dm_mailbox_media.
|
||
* Сервис ETCP_RT_ID_DM_MAILBOX (0x35); все пакеты подписаны router, числа native-endian:
|
||
* PUT=1 [recipient:8][message]; DELIVER=2 [message]; RECEIPT=3 [receipt:136]; STORED=4 [conv:8][seq:8].
|
||
* STORED подтверждает запись на S, только подписанная B квитанция подтверждает доставку сообщения.
|
||
* Текст не имеет TTL. Таймер 1с обрабатывает до 32 задач с retry_at через 5с.
|
||
* Входные буферы заимствуются на время вызова; их копией в пакете/SQLite владеет соответствующий owner.
|
||
*/
|
||
|
||
#ifndef DM_MAILBOX_H
|
||
#define DM_MAILBOX_H
|
||
|
||
#include <stdint.h>
|
||
#include <stddef.h>
|
||
|
||
struct UTUN_INSTANCE;
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* Все API в uasync. init после chat_core_init, с живыми SQLite/ua/router ядра:
|
||
* создаёт таблицы, media-координатор и таймер; 0=успех (также повторный init), -1=ошибка.
|
||
* destroy отменяет таймеры/bind до освобождения owner, сохраняет pending/receipts в SQLite.
|
||
* Вызывать после остановки dm_media, до chat_core_destroy; inst=NULL допустим для destroy. */
|
||
int dm_mailbox_init(struct UTUN_INSTANCE* inst);
|
||
void dm_mailbox_destroy(struct UTUN_INSTANCE* inst);
|
||
|
||
/* Поставить PUT выбранному доступному суперузлу общей с recipient группы.
|
||
* 0 означает принятие router, хранение подтверждается отдельно на проводе.
|
||
* До квитанции получателя источник сохраняет задачу в durable outbox.
|
||
* sender должен совпадать с inst->node_id; msg/len — полное подписанное тело dm_core.
|
||
* Выбирается первый доступный S по группам и node_id внутри группы; author/recipient исключаются.
|
||
* -1 при ошибке, отсутствии доступного S или backpressure; сам вызов outbox не создаёт. */
|
||
int dm_mailbox_put(struct UTUN_INSTANCE* inst, uint64_t recipient, uint64_t sender,
|
||
const uint8_t* msg, size_t msg_len);
|
||
|
||
/* Попытаться передать точную квитанцию всем доступным суперузлам общих групп сторон.
|
||
* receipt — DM_RECEIPT_SIZE байт (см. dm_core.h), проверяется подпись получателя.
|
||
* Это попытка отправки текущим доступным S; собственную durable очередь пересылки вызов не создаёт.
|
||
* Источник продолжает повторять PUT до получения этой квитанции.
|
||
* На S сохранение receipt и удаление точного pending атомарны; повтор PUT возвращает receipt.
|
||
* Локальный S здесь пропускается; вызов нужен endpoint, а не для локального применения на S. */
|
||
void dm_mailbox_receipt(struct UTUN_INSTANCE* inst, const uint8_t* receipt);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* DM_MAILBOX_H */
|