/* * chat_core.h — центральный API чата в потоке uasync * * Все DB-операции и сетевые функции выполняются в uasync-потоке. * GUI вызывает chat_core_submit_message() через gui_bridge_post_uasync(). */ #ifndef CHAT_CORE_H #define CHAT_CORE_H #include #include struct sqlite3; struct UTUN_INSTANCE; /* ── Жизненный цикл ── */ int chat_core_init(struct UTUN_INSTANCE* inst, const char* db_path); void chat_core_destroy(struct UTUN_INSTANCE* inst); struct sqlite3* chat_core_get_db(void); /* ── Отправка сообщения (GUI → uasync) ── */ struct chat_msg_submit { char channel_id[64]; char content_type[32]; uint8_t* data; uint32_t data_len; uint64_t timestamp; }; void chat_core_submit_message(struct chat_msg_submit* req); /* ── DB-операции (оставлены для интроспекции) ── */ uint32_t chat_core_count(const char* ch_id); int chat_core_chain_hash_at(const char* ch_id, uint32_t pos, uint8_t* hash_out); int chat_core_list_channels(uint8_t* buf, size_t buf_size, size_t* out_len); int chat_core_list_peers(const char* ch_id, uint8_t* buf, size_t buf_size, size_t* out_len); int chat_core_load_nodeinfo(uint64_t node_id, uint8_t* buf, size_t buf_size, size_t* out_len); /* ── Подключение к пиру (из invite-ссылки) ── */ struct chat_invite { uint64_t channel_id; uint64_t node_id; uint8_t pubkey[32]; uint8_t* addrs_data; int addr_count; }; void chat_core_connect_from_invite(struct chat_invite* inv); /* Прямое ETCP-подключение к узлу без BGP: pubkey+адреса из SQLite, * коллбэк вызывается один раз с CONN_MGR_OK / CONN_MGR_ERR_*. * При out_state != NULL — возвращает opaque handle для отмены. */ void chat_core_connect_auto(uint64_t node_id, void (*cb)(int result, uint64_t node_id, void* arg), void* arg, void** out_state); /* Отмена активного auto-connect (закрывает ETCP-соединения, освобождает память). * Коллбэк chat_core_connect_auto после cancel не вызывается. */ void chat_core_connect_auto_cancel(void* state); /* ── Создание канала (GUI → uasync) ── */ struct chat_channel_create { char channel_id[64]; char name[128]; uint64_t owner_node_id; int is_dm; uint8_t x25519_pubkey[32]; uint8_t x25519_privkey[32]; uint8_t ed25519_pubkey[32]; uint8_t ed25519_privkey[32]; uint8_t signature[64]; }; void chat_core_ensure_channel_ready(const char* ch_id); void chat_core_create_channel(struct chat_channel_create* req); void chat_core_create_channel_trampoline(void* arg); /* ── Утилиты ── */ void chat_core_set_my_node_id(uint64_t node_id); void chat_core_update_my_name(const char* name); void chat_core_update_my_name_trampoline(void* arg); /* Трамплин для gui_bridge_post_uasync (GUI → uasync) */ void chat_core_submit_trampoline(void* arg); #endif /* CHAT_CORE_H */