2 changed files with 48 additions and 1 deletions
@ -0,0 +1,47 @@ |
|||||||
|
/* Подписанные состояния реакций и ответов, отдельная таблица feedback_<channel>.
|
||||||
|
* Каждый (message_id, node_id, kind) хранит последнее полное состояние с ver. |
||||||
|
* Пустое data — сохраняемая отмена. Слой хранит и реплицирует подписанные байты; |
||||||
|
* интерпретацию ответа относительно опроса выполняет вызывающий модуль. |
||||||
|
* Все операции — в uasync-потоке. init вызывается после member_sync_init; |
||||||
|
* общий Merkle-движок освобождается member_sync_destroy. */ |
||||||
|
#ifndef CHAT_FEEDBACK_H |
||||||
|
#define CHAT_FEEDBACK_H |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
#include <stddef.h> |
||||||
|
|
||||||
|
struct UTUN_INSTANCE; |
||||||
|
|
||||||
|
#define CHAT_FEEDBACK_REACTION 1 |
||||||
|
#define CHAT_FEEDBACK_ANSWER 2 |
||||||
|
#define CHAT_FEEDBACK_DATA_MAX 2048 |
||||||
|
#define CHAT_MESSAGE_ID_SIZE 32 |
||||||
|
|
||||||
|
struct chat_feedback_record { |
||||||
|
uint8_t message_id[CHAT_MESSAGE_ID_SIZE]; |
||||||
|
uint64_t node_id; |
||||||
|
uint64_t ver; /* 1..INT64_MAX; отдельная версия для каждого kind */ |
||||||
|
uint8_t kind; |
||||||
|
uint16_t data_len; |
||||||
|
uint8_t data[CHAT_FEEDBACK_DATA_MAX]; |
||||||
|
uint8_t signature[64]; |
||||||
|
}; |
||||||
|
|
||||||
|
/* Производный ID неизменяемого сообщения; 0/-1. Числа хешируются как BE64. */ |
||||||
|
int chat_message_id(uint64_t channel_id, uint64_t timestamp, const uint8_t signature[64], uint8_t id[32]); |
||||||
|
/* Регистрирует FEEDBACK и восстанавливает производный индекс из подписанных записей; 0/-1. */ |
||||||
|
int chat_feedback_init(struct UTUN_INSTANCE* inst); |
||||||
|
/* Подготовить таблицу канала; 0/-1. Не создаёт членство или сетевую группу. */ |
||||||
|
int chat_feedback_ensure_channel(struct UTUN_INSTANCE* inst, const char* channel); |
||||||
|
/* Прочитать состояние: 1 найдено, 0 отсутствует, -1 ошибка. */ |
||||||
|
int chat_feedback_get(struct UTUN_INSTANCE* inst, const char* channel, const uint8_t message_id[32], |
||||||
|
uint64_t node_id, uint8_t kind, struct chat_feedback_record* out); |
||||||
|
/* Проверить и применить подписанную запись: 1 изменилось, 0 повтор/старая, -1 ошибка.
|
||||||
|
* Одинаковый ver разрешается сравнением data; подпись проверяется до сравнения. */ |
||||||
|
int chat_feedback_apply(struct UTUN_INSTANCE* inst, const char* channel, const struct chat_feedback_record* record); |
||||||
|
/* Подписать локальное полное состояние с ver+1; NULL/0 отменяет. 1/0/-1 как apply.
|
||||||
|
* out_ver необязателен. Семантику data проверяет вызывающий модуль до этого вызова. */ |
||||||
|
int chat_feedback_set(struct UTUN_INSTANCE* inst, const char* channel, const uint8_t message_id[32], |
||||||
|
uint8_t kind, const uint8_t* data, size_t len, uint64_t* out_ver); |
||||||
|
|
||||||
|
#endif |
||||||
Loading…
Reference in new issue