16#include <ascii-chat/asciichat_errno.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>
32#if !defined(MAX_PARTICIPANTS)
33#define MAX_PARTICIPANTS 16
51 uint8_t future_host_id[16];
52 char future_host_address[64];
98 uint8_t last_host_id[16];
142 uint8_t initiator_id[16];
143 char session_string[SESSION_STRING_BUFFER_SIZE];
148 uint8_t identity_pubkey[32];
149 uint8_t identity_seckey[64];
153 char acds_address[64];
158 char host_address[64];
163 char turn_username[128];
164 char turn_password[128];
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);
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);
372 char out_address[64], uint16_t *out_port,
373 uint8_t *out_connection_type);
Host negotiation logic for discovery mode.
migration_state_t
Migration detection and failover state.
@ MIGRATION_STATE_DETECTED
Host disconnect detected.
@ MIGRATION_STATE_COMPLETE
Failover complete, call resumed.
@ MIGRATION_STATE_NONE
No migration in progress.
@ MIGRATION_STATE_FAILOVER
Failing over to pre-elected future host.
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.
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.
@ DISCOVERY_STATE_ENDED
Session ended.
@ DISCOVERY_STATE_JOINING_SESSION
Joining existing session.
@ DISCOVERY_STATE_INIT
Initial state.
@ DISCOVERY_STATE_ACTIVE
Session active (call in progress)
@ DISCOVERY_STATE_MIGRATING
Host migration in progress.
@ DISCOVERY_STATE_NEGOTIATING
NAT negotiation in progress.
@ DISCOVERY_STATE_CONNECTING_HOST
Connecting to host as participant.
@ DISCOVERY_STATE_CREATING_SESSION
Creating new session.
@ DISCOVERY_STATE_CONNECTING_ACDS
Connecting to ACDS.
@ DISCOVERY_STATE_WAITING_PEER
Waiting for peer to join (initiator)
@ DISCOVERY_STATE_FAILED
Session failed.
@ DISCOVERY_STATE_STARTING_HOST
Starting as host.
uint8_t participant_id[16]
Configuration for discovery session.
void * callback_user_data
const char * acds_address
ACDS address (default: "127.0.0.1")
uint16_t acds_port
ACDS port (default: 27225)
discovery_should_exit_fn should_exit_callback
void * exit_callback_data
uint16_t local_port
Local port for hosting (default: 27224)
const char * session_string
Session string to join (or NULL to create)
Discovery session context.
void * callback_user_data
uint64_t webrtc_last_attempt_time_ms
Timestamp of last connection attempt (monotonic time)
uint8_t session_type
0 = DIRECT_TCP, 1 = WEBRTC
session_host_t * host_ctx
int webrtc_retry_attempt
Current retry attempt number (0 = initial, 1+ = retries)
void * exit_callback_data
bool webrtc_transport_ready
True when DataChannel is open and transport created.
turn_server_t * turn_servers
TURN servers from ACDS.
size_t stun_count
Number of STUN servers.
migration_ctx_t migration
stun_server_t * stun_servers
STUN servers from ACDS.
discovery_should_exit_fn should_exit_callback
size_t turn_count
Number of TURN servers.
bool webrtc_connection_initiated
True when we've called webrtc_peer_manager_connect()
session_participant_t * participant_ctx
struct webrtc_peer_manager * peer_manager
WebRTC peer connection manager (NULL for TCP sessions)
negotiate_ctx_t negotiate
Host liveness detection state.
uint32_t consecutive_failures
Number of consecutive ping failures.
uint32_t max_failures
Threshold for triggering migration (default: 3)
uint64_t ping_interval_ms
Time between pings (default: 3000ms)
uint64_t last_pong_received_ms
Timestamp of last pong received (monotonic)
uint64_t last_ping_sent_ms
Timestamp of last ping sent (monotonic)
bool ping_in_flight
True if waiting for pong.
uint64_t timeout_ms
Timeout for ping response (default: 10000ms)
Host migration context for tracking failover state.
uint64_t detection_time_ms
When host disconnect detected (Unix ms)
migration_state_t state
Current migration state.
uint32_t disconnect_reason
Reason for disconnect (from HOST_LOST packet)
Host negotiation context.
Ring consensus state (Host-Mediated Proactive Election)
uint8_t future_host_connection_type
acip_connection_type_t (DIRECT, UPNP, STUN, TURN)
uint16_t future_host_port
Port number.
uint64_t future_host_elected_round
Which 5-minute round this was elected in.
uint64_t last_ring_round_ms
When host last ran election (for 5-min timer)
bool am_future_host
Am I the elected future host?
Internal session host structure.
Internal session participant structure.
WebRTC peer manager structure.