Refresh both AGENTS guides and clarify module purpose, usage, ownership, threading, return values and wire formats in headers. Remove the unused timeout_heap freed_count field and unimplemented getter.
62 lines
3.3 KiB
C
62 lines
3.3 KiB
C
/*
|
|
* invite_build.h — сборка invite-ссылок utun:// (выбор узла + адреса)
|
|
*
|
|
* Общий модуль для всех GUI (desktop chatgui, Android, headless CLI).
|
|
* Логика выбора «лучшего узла» перенесена из tools/chatgui-android/jni_bridge.
|
|
* Работает в uasync-потоке, использует chat_core_ctx конкретного UTUN_INSTANCE.
|
|
*/
|
|
#ifndef INVITE_BUILD_H
|
|
#define INVITE_BUILD_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct UTUN_INSTANCE;
|
|
struct chat_invite_build;
|
|
typedef void (*chat_invite_ready_fn)(void* arg, int result, const char* link);
|
|
|
|
/* Собрать invite-ссылку для канала.
|
|
* target_node_id = 0 → auto (достижимый суперузел → обычный узел → self).
|
|
* target_node_id != 0 → конкретный узел (должен быть достижимым мембером канала).
|
|
* password = NULL → без пароля.
|
|
* NULL=ошибка запуска, callback не вызывается. Иначе callback после возврата,
|
|
* ровно один раз, result из enum chat_join_result. link доступен только внутри callback,
|
|
* только при успехе — после подтверждения сохранения ключа на выбранном узле.
|
|
* Handle действителен до callback; cancel/destroy завершают запрос синхронно с CANCELLED. */
|
|
struct chat_invite_build* chat_invite_build_link(struct UTUN_INSTANCE* inst, uint64_t channel_id, uint64_t target_node_id,
|
|
const char* password, chat_invite_ready_fn callback, void* arg);
|
|
void chat_invite_build_cancel(struct chat_invite_build* request);
|
|
|
|
/* Список достижимых узлов-кандидатов канала (включая self) — тот же фильтр, что в auto.
|
|
* Возвращает количество (0..max_ids), либо -1. */
|
|
int chat_invite_candidate_nodes(struct UTUN_INSTANCE* inst, uint64_t channel_id, uint64_t* out_ids, int max_ids);
|
|
|
|
/* Авто-узел: достижимый суперузел → обычный узел → self. Возвращает 0 и заполняет out_node_id, либо -1. */
|
|
int chat_invite_best_node(struct UTUN_INSTANCE* inst, uint64_t channel_id, uint64_t* out_node_id);
|
|
|
|
/* Трамплин для gui_bridge (arg = u_malloc(struct chat_invite_build_req)).
|
|
* Результат: CHAT_EVT_INVITE_LINK_READY. */
|
|
struct chat_invite_build_req {
|
|
struct UTUN_INSTANCE* inst;
|
|
char ch_id[64];
|
|
uint64_t request_id; /* идентификатор запроса UI, возвращается в событии */
|
|
uint64_t target_node_id; /* 0 = auto */
|
|
char password[128];
|
|
struct chat_invite_build* pending; /* внутреннее поле trampoline */
|
|
};
|
|
void chat_invite_build_link_trampoline(void* arg);
|
|
|
|
/* Трамплин (arg = u_malloc(struct chat_invite_cand_req)). Результат: CHAT_EVT_INVITE_CANDIDATES
|
|
* (формат: [ch_id_len:1][ch_id][auto_node_id:8][count:2][node_id:8]*). */
|
|
struct chat_invite_cand_req { struct UTUN_INSTANCE* inst; char ch_id[64]; };
|
|
void chat_invite_candidates_trampoline(void* arg);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* INVITE_BUILD_H */
|