You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

99 lines
3.4 KiB

/*
* 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 <stdint.h>
#include <stddef.h>
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);
void chat_core_sync_my_addresses(void);
/* Трамплин для gui_bridge_post_uasync (GUI → uasync) */
void chat_core_submit_trampoline(void* arg);
/* Сбор статуса (NTP + connections) и отправка в GUI */
void chat_core_collect_status_trampoline(void* arg);
#endif /* CHAT_CORE_H */