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.
111 lines
3.9 KiB
111 lines
3.9 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; |
|
|
|
/* ── Коды возврата подключения ── */ |
|
#define CC_OK 0 |
|
#define CC_ERR_NOT_FOUND -1 |
|
#define CC_ERR_NO_ADDRESSES -2 |
|
#define CC_ERR_TIMEOUT -3 |
|
#define CC_ERR_UNREACHABLE -4 |
|
#define CC_ERR_INTERNAL -7 |
|
|
|
/* ── Жизненный цикл ── */ |
|
|
|
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); |
|
|
|
/* Сохранение key-value в ui_state (вызывается из uasync-потока) */ |
|
void chat_core_save_ui_state(const char* key, const char* value); |
|
void chat_core_save_ui_state_trampoline(void* arg); |
|
|
|
/* Трамплин для 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 */
|
|
|