ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
session.h
Go to the documentation of this file.
1
14#pragma once
15
16#include <ascii-chat/asciichat_errno.h>
17#include "negotiate.h"
18#include <ascii-chat/platform/socket.h>
19#include <ascii-chat/session/host.h>
20#include <ascii-chat/session/participant.h>
21#include <ascii-chat/discovery/strings.h>
22#include <ascii-chat/network/webrtc/stun.h>
23#include <ascii-chat/network/webrtc/turn.h>
24#include <stdbool.h>
25#include <stdint.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31// Forward declarations
32#if !defined(MAX_PARTICIPANTS)
33#define MAX_PARTICIPANTS 16
34#endif
35
49typedef struct {
50 // Future host information (pre-elected by host every 5 minutes)
51 uint8_t future_host_id[16];
52 char future_host_address[64];
57
58 // Timing for next proactive election
61
77
91
95typedef struct {
98 uint8_t last_host_id[16];
101
111typedef bool (*discovery_should_exit_fn)(void *user_data);
112
130
134typedef struct {
135 // State
137 asciichat_error_t error;
138
139 // Session info
140 uint8_t session_id[16];
141 uint8_t participant_id[16];
142 uint8_t initiator_id[16];
143 char session_string[SESSION_STRING_BUFFER_SIZE];
146
147 // Identity keys (Ed25519)
148 uint8_t identity_pubkey[32];
149 uint8_t identity_seckey[64];
150
151 // ACDS connection
153 char acds_address[64];
154 uint16_t acds_port;
155
156 // Host info (when not us)
157 uint8_t host_id[16];
158 char host_address[64];
159 uint16_t host_port;
160 uint8_t session_type;
161
162 // WebRTC credentials (for WebRTC sessions)
163 char turn_username[128];
164 char turn_password[128];
165
166 // Negotiation (initial host negotiation)
168
169 // Ring Consensus (NEW P2P design)
171
172 // Host liveness detection (participants only)
174
175 // Migration state (host failover)
177
178 // WebRTC support (NEW)
184
185 // WebRTC ICE servers (for STUN/TURN support)
186 // These must be stored in the session to keep memory valid for peer manager lifetime
187 // Forward declare - actual types defined in network/webrtc/stun.h and network/webrtc/turn.h
188 stun_server_t *stun_servers;
189 size_t stun_count;
190 turn_server_t *turn_servers;
191 size_t turn_count;
192
193 // Role contexts (only one is active at a time)
196
197 // Callbacks for state changes
198 void (*on_state_change)(discovery_state_t new_state, void *user_data);
199 void (*on_session_ready)(const char *session_string, void *user_data);
200 void (*on_error)(asciichat_error_t error, const char *message, void *user_data);
202
203 // Exit callback for graceful shutdown during blocking operations
207
211typedef struct {
212 // ACDS server
213 const char *acds_address;
214 uint16_t acds_port;
215
216 // Session to join (NULL = create new)
217 const char *session_string;
218
219 // Local server config (if we become host)
220 uint16_t local_port;
221
222 // Callbacks
223 void (*on_state_change)(discovery_state_t new_state, void *user_data);
224 void (*on_session_ready)(const char *session_string, void *user_data);
225 void (*on_error)(asciichat_error_t error, const char *message, void *user_data);
227
228 // Exit callback for graceful shutdown during blocking operations
232
239
245
254asciichat_error_t discovery_session_start(discovery_session_t *session);
255
265asciichat_error_t discovery_session_process(discovery_session_t *session, int64_t timeout_ns);
266
272
279
286
292const char *discovery_session_get_string(const discovery_session_t *session);
293
300
307
314
324asciichat_error_t discovery_session_init_ring(discovery_session_t *session);
325
332
339
346asciichat_error_t discovery_session_handle_host_disconnect(discovery_session_t *session, uint32_t disconnect_reason);
347
353asciichat_error_t discovery_session_become_host(discovery_session_t *session);
354
361
371asciichat_error_t discovery_session_get_future_host(const discovery_session_t *session, uint8_t out_id[16],
372 char out_address[64], uint16_t *out_port,
373 uint8_t *out_connection_type);
374
381
382#ifdef __cplusplus
383}
384#endif
int socket_t
Host negotiation logic for discovery mode.
migration_state_t
Migration detection and failover state.
Definition session.h:85
@ MIGRATION_STATE_DETECTED
Host disconnect detected.
Definition session.h:87
@ MIGRATION_STATE_COMPLETE
Failover complete, call resumed.
Definition session.h:89
@ MIGRATION_STATE_NONE
No migration in progress.
Definition session.h:86
@ MIGRATION_STATE_FAILOVER
Failing over to pre-elected future host.
Definition session.h:88
bool discovery_session_is_active(const discovery_session_t *session)
Check if session is active (call in progress)
bool discovery_session_is_future_host(const discovery_session_t *session)
Check if we are the future host.
void discovery_session_stop(discovery_session_t *session)
Stop the discovery session.
bool discovery_session_is_host(const discovery_session_t *session)
Check if we are the host.
bool(* discovery_should_exit_fn)(void *user_data)
Callback to check if session should exit.
Definition session.h:111
discovery_session_t * discovery_session_create(const discovery_config_t *config)
Create a new discovery session.
asciichat_error_t discovery_session_start(discovery_session_t *session)
Start the discovery session.
asciichat_error_t discovery_session_init_ring(discovery_session_t *session)
Initialize ring consensus state.
discovery_state_t discovery_session_get_state(const discovery_session_t *session)
Get current session state.
asciichat_error_t discovery_session_check_host_alive(discovery_session_t *session)
Detect host disconnect (check connection status)
session_host_t * discovery_session_get_host(discovery_session_t *session)
Get host context (if we are host)
asciichat_error_t discovery_session_get_future_host(const discovery_session_t *session, uint8_t out_id[16], char out_address[64], uint16_t *out_port, uint8_t *out_connection_type)
Get future host information.
asciichat_error_t discovery_session_process(discovery_session_t *session, int64_t timeout_ns)
Process session events (call in main loop)
asciichat_error_t discovery_session_start_ring_round(discovery_session_t *session)
Start a new ring consensus round (every 5 minutes or on new joiner)
const char * discovery_session_get_string(const discovery_session_t *session)
Get session string.
asciichat_error_t discovery_session_handle_host_disconnect(discovery_session_t *session, uint32_t disconnect_reason)
Handle host disconnect with automatic failover to future host.
asciichat_error_t discovery_session_connect_to_future_host(discovery_session_t *session)
Connect to pre-elected future host (called when NOT future host)
void discovery_session_destroy(discovery_session_t *session)
Destroy discovery session and free resources.
session_participant_t * discovery_session_get_participant(discovery_session_t *session)
Get participant context (if we are participant)
asciichat_error_t discovery_session_become_host(discovery_session_t *session)
Become the host (called when elected as future host)
discovery_state_t
Discovery session state.
Definition session.h:116
@ DISCOVERY_STATE_ENDED
Session ended.
Definition session.h:128
@ DISCOVERY_STATE_JOINING_SESSION
Joining existing session.
Definition session.h:120
@ DISCOVERY_STATE_INIT
Initial state.
Definition session.h:117
@ DISCOVERY_STATE_ACTIVE
Session active (call in progress)
Definition session.h:125
@ DISCOVERY_STATE_MIGRATING
Host migration in progress.
Definition session.h:126
@ DISCOVERY_STATE_NEGOTIATING
NAT negotiation in progress.
Definition session.h:122
@ DISCOVERY_STATE_CONNECTING_HOST
Connecting to host as participant.
Definition session.h:124
@ DISCOVERY_STATE_CREATING_SESSION
Creating new session.
Definition session.h:119
@ DISCOVERY_STATE_CONNECTING_ACDS
Connecting to ACDS.
Definition session.h:118
@ DISCOVERY_STATE_WAITING_PEER
Waiting for peer to join (initiator)
Definition session.h:121
@ DISCOVERY_STATE_FAILED
Session failed.
Definition session.h:127
@ DISCOVERY_STATE_STARTING_HOST
Starting as host.
Definition session.h:123
uint8_t session_id[16]
uint8_t participant_id[16]
#define bool
Definition stdbool.h:22
Configuration for discovery session.
Definition session.h:211
void * callback_user_data
Definition session.h:226
const char * acds_address
ACDS address (default: "127.0.0.1")
Definition session.h:213
uint16_t acds_port
ACDS port (default: 27225)
Definition session.h:214
discovery_should_exit_fn should_exit_callback
Definition session.h:229
void * exit_callback_data
Definition session.h:230
uint16_t local_port
Local port for hosting (default: 27224)
Definition session.h:220
const char * session_string
Session string to join (or NULL to create)
Definition session.h:217
Discovery session context.
Definition session.h:134
void * callback_user_data
Definition session.h:201
asciichat_error_t error
Definition session.h:137
host_liveness_t liveness
Definition session.h:173
uint64_t webrtc_last_attempt_time_ms
Timestamp of last connection attempt (monotonic time)
Definition session.h:183
ring_consensus_t ring
Definition session.h:170
uint8_t session_type
0 = DIRECT_TCP, 1 = WEBRTC
Definition session.h:160
uint16_t acds_port
Definition session.h:154
session_host_t * host_ctx
Definition session.h:194
uint16_t host_port
Definition session.h:159
socket_t acds_socket
Definition session.h:152
int webrtc_retry_attempt
Current retry attempt number (0 = initial, 1+ = retries)
Definition session.h:182
discovery_state_t state
Definition session.h:136
void * exit_callback_data
Definition session.h:205
bool webrtc_transport_ready
True when DataChannel is open and transport created.
Definition session.h:180
turn_server_t * turn_servers
TURN servers from ACDS.
Definition session.h:190
size_t stun_count
Number of STUN servers.
Definition session.h:189
migration_ctx_t migration
Definition session.h:176
stun_server_t * stun_servers
STUN servers from ACDS.
Definition session.h:188
discovery_should_exit_fn should_exit_callback
Definition session.h:204
size_t turn_count
Number of TURN servers.
Definition session.h:191
bool webrtc_connection_initiated
True when we've called webrtc_peer_manager_connect()
Definition session.h:181
session_participant_t * participant_ctx
Definition session.h:195
struct webrtc_peer_manager * peer_manager
WebRTC peer connection manager (NULL for TCP sessions)
Definition session.h:179
negotiate_ctx_t negotiate
Definition session.h:167
Host liveness detection state.
Definition session.h:68
uint32_t consecutive_failures
Number of consecutive ping failures.
Definition session.h:71
uint32_t max_failures
Threshold for triggering migration (default: 3)
Definition session.h:72
uint64_t ping_interval_ms
Time between pings (default: 3000ms)
Definition session.h:73
uint64_t last_pong_received_ms
Timestamp of last pong received (monotonic)
Definition session.h:70
uint64_t last_ping_sent_ms
Timestamp of last ping sent (monotonic)
Definition session.h:69
bool ping_in_flight
True if waiting for pong.
Definition session.h:75
uint64_t timeout_ms
Timeout for ping response (default: 10000ms)
Definition session.h:74
Host migration context for tracking failover state.
Definition session.h:95
uint64_t detection_time_ms
When host disconnect detected (Unix ms)
Definition session.h:97
migration_state_t state
Current migration state.
Definition session.h:96
uint32_t disconnect_reason
Reason for disconnect (from HOST_LOST packet)
Definition session.h:99
Host negotiation context.
Definition negotiate.h:40
Ring consensus state (Host-Mediated Proactive Election)
Definition session.h:49
uint8_t future_host_connection_type
acip_connection_type_t (DIRECT, UPNP, STUN, TURN)
Definition session.h:54
uint16_t future_host_port
Port number.
Definition session.h:53
uint64_t future_host_elected_round
Which 5-minute round this was elected in.
Definition session.h:56
uint64_t last_ring_round_ms
When host last ran election (for 5-min timer)
Definition session.h:59
bool am_future_host
Am I the elected future host?
Definition session.h:55
Internal session host structure.
Definition host.c:82
Internal session participant structure.
Definition participant.c:43
WebRTC peer manager structure.