37 lines
3.3 KiB
C
37 lines
3.3 KiB
C
/* dm_mailbox_media — durable задания суперузла: размещение на M, доставка
|
||
* метаданных получателю и освобождение назначений по DELETE_ACK/EXPIRED либо подтверждённому TTL.
|
||
* Жизненный цикл принадлежит dm_mailbox, control принимает dm_media. Все API в uasync.
|
||
* Координатор хранится в dm_media_jobs/dm_media_holders SQLite ядра; таймер — только триггер повторов.
|
||
*/
|
||
#ifndef DM_MAILBOX_MEDIA_H
|
||
#define DM_MAILBOX_MEDIA_H
|
||
|
||
#include <stdint.h>
|
||
#include <stddef.h>
|
||
struct UTUN_INSTANCE;
|
||
struct dm_mb_media;
|
||
|
||
/* Создать таблицы/owner/таймер; inst с живыми SQLite/ua обязателен. Owner либо NULL при ошибке.
|
||
* Повторы задач после restart начинаются сразу. Единственным owner управляет dm_mailbox. */
|
||
struct dm_mb_media* dm_mailbox_media_create(struct UTUN_INSTANCE* inst);
|
||
/* Отменить таймер и освободить owner, сохранив задания/назначения в БД. NULL допустим. */
|
||
void dm_mailbox_media_destroy(struct dm_mb_media* media);
|
||
/* Вызвать в транзакции PUT после проверки роли S, получателя и подписи полного msg/len.
|
||
* 0=не file либо зарегистрирован точный body/UUID, -1=ошибка/конфликт. Не отправляет STORE.
|
||
* media обязателен для file; commit/rollback принадлежит вызывающему. */
|
||
int dm_mailbox_media_register(struct dm_mb_media* media, uint64_t group, uint64_t recipient,
|
||
const uint8_t* msg, size_t len);
|
||
/* После проверки router-подписи и размера команды в dm_media: group/source — доверенные поля router.
|
||
* body заимствован на время вызова; RECEIPT=152, STORED=24, DELETE_ACK/EXPIRED=16, REJECT=17 байт.
|
||
* STORED/REJECT/ACK относятся к сохранённому назначению M; RECEIPT проверяется отдельно подписью B.
|
||
* EXPIRED/REJECT атомарно освобождают назначение и сбрасывают текущий holder; ошибка откатывает оба изменения.
|
||
* Таймер завершает stored-назначение по expires даже при offline B/потерянном EXPIRED, также после restart.
|
||
* Для неподтверждённого STORE повтор запрашивает результат из custody/tombstone M; квитанция B не отменяется. */
|
||
void dm_mailbox_media_recv(struct dm_mb_media* media, uint64_t group, uint64_t source,
|
||
uint8_t cmd, const uint8_t* body, size_t len);
|
||
/* Проверить 152-байтовую квитанцию и попытаться отправить доступным S общей группы.
|
||
* За один вызов выбирается до64 подходящих S на группу; поздние копии также получают подтверждение. */
|
||
void dm_mailbox_media_receipt(struct UTUN_INSTANCE* inst, const uint8_t* receipt);
|
||
|
||
#endif
|