#ifndef OMNISOCKET_PY_CLIENT_H #define OMNISOCKET_PY_CLIENT_H #include "peer_kcp_client.h" typedef struct omnisocket_session_stats { uint64_t send_calls; uint64_t send_bytes; uint64_t send_errors; uint64_t recv_calls; uint64_t recv_bytes; uint64_t recv_timeouts; uint64_t recv_errors; int connected; } omnisocket_session_stats_t; typedef struct omnisocket_session { pthread_mutex_t mutex; pthread_cond_t idle_cond; kcp_client_t *client; size_t active_ops; int closing; omnisocket_session_stats_t stats; } omnisocket_session_t; int omnisocket_session_init(omnisocket_session_t *session); void omnisocket_session_destroy(omnisocket_session_t *session); int omnisocket_session_connect( omnisocket_session_t *session, const char *server_addr, const char *relay_via, const char *peer_id, const char *bind_ip, const char *bind_device, const kcp_conn_options_t *options, int stats_interval_ms ); int omnisocket_session_close(omnisocket_session_t *session); int omnisocket_session_send(omnisocket_session_t *session, const char *to, const void *data, size_t data_len); int omnisocket_session_recv(omnisocket_session_t *session, message_t *out_msg, int timeout_ms); int omnisocket_session_recv_into( omnisocket_session_t *session, void *buffer, size_t buffer_len, kcp_client_recv_meta_t *out_meta, int timeout_ms ); void omnisocket_session_stats_snapshot(omnisocket_session_t *session, omnisocket_session_stats_t *out_stats); #endif