ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
consensus_integration.c File Reference

Integration helpers for session consensus in discovery mode. More...

Go to the source code of this file.

Functions

asciichat_error_t consensus_get_discovery_callbacks (void *context, session_consensus_callbacks_t *out_callbacks)
 Get callbacks configured for discovery mode integration.
 
asciichat_error_t consensus_create_for_discovery (const uint8_t session_id[16], const uint8_t my_id[16], const uint8_t participant_ids[64][16], int num_participants, void *discovery_context, session_consensus_t **out_consensus)
 Example: Create session consensus for discovery mode.
 
uint32_t consensus_suggest_timeout_ms (session_consensus_t *consensus, uint32_t current_timeout_ms)
 Calculate how long to wait until next consensus processing.
 

Detailed Description

Integration helpers for session consensus in discovery mode.

This file provides example integration code showing how modes (discovery, server, client, acds) can integrate the ring consensus abstraction.

Design Example for Discovery Mode:

  1. Create consensus when entering ACTIVE state
  2. Call consensus_process() in discovery_session_process() loop
  3. Hook up packet routing for RING_* consensus packets
  4. Update host info when election completes

Definition in file consensus_integration.c.

Function Documentation

◆ consensus_create_for_discovery()

asciichat_error_t consensus_create_for_discovery ( const uint8_t  session_id[16],
const uint8_t  my_id[16],
const uint8_t  participant_ids[64][16],
int  num_participants,
void *  discovery_context,
session_consensus_t **  out_consensus 
)

Example: Create session consensus for discovery mode.

Shows how a mode would create the consensus abstraction. This is a standalone example - real discovery session would call this when transitioning to ACTIVE state if participants found.

Parameters
session_idSession identifier (16 bytes)
my_idMy participant identifier (16 bytes)
participant_idsArray of all participant IDs (up to 64)
num_participantsCount of participants
discovery_contextMode-specific context (e.g., discovery_session_t)
out_consensusOutput: Created consensus handle
Returns
ASCIICHAT_OK on success

Definition at line 159 of file consensus_integration.c.

161 {
162 (void)session_id; // Informational only, not needed by consensus itself
163
164 if (!my_id || !participant_ids || !discovery_context || !out_consensus) {
165 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters");
166 }
167
168 if (num_participants < 1 || num_participants > 64) {
169 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid participant count: %d", num_participants);
170 }
171
172 // Determine if we're the ring leader (for now, assume not - ACDS would manage this)
173 // In a real implementation, ACDS would tell us our position in the ring
174 bool is_leader = false; // This would be determined by ACDS
175
176 // Get callbacks configured for our mode
177 session_consensus_callbacks_t callbacks = {0};
178 asciichat_error_t err = consensus_get_discovery_callbacks(discovery_context, &callbacks);
179 if (err != ASCIICHAT_OK) {
180 return err;
181 }
182
183 // Create consensus with the callbacks
184 return session_consensus_create(my_id, is_leader, participant_ids, num_participants, &callbacks, out_consensus);
185}
asciichat_error_t session_consensus_create(const uint8_t my_id[16], bool is_leader, const uint8_t participant_ids[64][16], int num_participants, const session_consensus_callbacks_t *callbacks, session_consensus_t **out_consensus)
Definition consensus.c:108
asciichat_error_t consensus_get_discovery_callbacks(void *context, session_consensus_callbacks_t *out_callbacks)
Get callbacks configured for discovery mode integration.
uint8_t session_id[16]

References consensus_get_discovery_callbacks(), session_consensus_create(), and session_id.

◆ consensus_get_discovery_callbacks()

asciichat_error_t consensus_get_discovery_callbacks ( void *  context,
session_consensus_callbacks_t *  out_callbacks 
)

Get callbacks configured for discovery mode integration.

Returns a properly configured callback structure for session consensus. The returned callbacks encapsulate the discovery session's packet sending, election handling, and metrics measurement capabilities.

Parameters
contextDiscovery session pointer (void* for genericity)
out_callbacksOutput: Configured callbacks
Returns
ASCIICHAT_OK on success

Definition at line 129 of file consensus_integration.c.

129 {
130 if (!context || !out_callbacks) {
131 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters: context=%p, out_callbacks=%p", context, out_callbacks);
132 }
133
134 // Configure callbacks for discovery mode
135 out_callbacks->send_packet = consensus_send_via_discovery;
136 out_callbacks->on_election = consensus_on_election_result;
137 out_callbacks->get_metrics = consensus_get_metrics;
138 out_callbacks->election = NULL; // Use default election algorithm
139 out_callbacks->context = context;
140
141 return ASCIICHAT_OK;
142}

Referenced by consensus_create_for_discovery().

◆ consensus_suggest_timeout_ms()

uint32_t consensus_suggest_timeout_ms ( session_consensus_t consensus,
uint32_t  current_timeout_ms 
)

Calculate how long to wait until next consensus processing.

Useful for modes to schedule when they should call consensus_process() next.

Parameters
consensusConsensus handle
current_timeout_msCurrent event loop timeout in milliseconds
Returns
Suggested next timeout in milliseconds

Definition at line 196 of file consensus_integration.c.

196 {
197 if (!consensus) {
198 return current_timeout_ms;
199 }
200
201 // Get time until next round in nanoseconds
202 uint64_t time_to_next_ns = session_consensus_time_until_next_round(consensus);
203
204 // Convert to milliseconds
205 uint64_t time_to_next_ms = time_ns_to_ms(time_to_next_ns);
206
207 // Return minimum of consensus deadline or current timeout
208 if (time_to_next_ms == 0) {
209 return 0; // Consensus needs immediate attention
210 }
211
212 if (time_to_next_ms < current_timeout_ms) {
213 return (uint32_t)time_to_next_ms;
214 }
215
216 return current_timeout_ms;
217}
uint64_t session_consensus_time_until_next_round(session_consensus_t *consensus)
Definition consensus.c:306

References session_consensus_time_until_next_round().