48 lines
3.0 KiB
C
48 lines
3.0 KiB
C
/* Подписанные состояния реакций и ответов, отдельная таблица 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
|