Files
utun2/src/dm/dm_mailbox.h
T

58 lines
4.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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 */