ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
consensus_integration.h File Reference

Integration helpers for session consensus across modes. 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 consensus callbacks configured for discovery mode.
 
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)
 Create session consensus for discovery mode.
 
uint32_t consensus_suggest_timeout_ms (session_consensus_t *consensus, uint32_t current_timeout_ms)
 Suggest next timeout for consensus processing.
 

Detailed Description

Integration helpers for session consensus across modes.

Provides example integration patterns and helpers for modes to use the ring consensus abstraction. Shows how different modes (discovery, server, client, acds) would integrate consensus with their specific transport and metrics collection mechanisms.

Definition in file consensus_integration.h.

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 
)

Create session consensus for discovery mode.

Convenience function showing the typical pattern for creating consensus in discovery mode. Calls consensus_create() with discovery-specific callback configuration.

Real usage:

  • When ACDS gives us participant list -> create consensus
  • Call consensus_process() in discovery_session_process() loop
  • Route RING_* packets to consensus handlers
  • Update host on election results
Parameters
session_idSession identifier (16 bytes) - informational
my_idOur participant ID (16 bytes)
participant_idsArray of all participant IDs (up to 64)
num_participantsCount of participants
discovery_contextDiscovery session context (opaque)
out_consensusOutput: Created consensus handle
Returns
ASCIICHAT_OK on success, error code otherwise

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)
Create a new session consensus instance.
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.
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it, returning the error code.
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:49
@ ASCIICHAT_OK
Definition error_codes.h:51
@ ERROR_INVALID_PARAM
uint8_t session_id[16]
Callbacks for consensus operations.
Definition consensus.h:119

References ASCIICHAT_OK, consensus_get_discovery_callbacks(), ERROR_INVALID_PARAM, session_consensus_create(), session_id, and SET_ERRNO.

◆ consensus_get_discovery_callbacks()

asciichat_error_t consensus_get_discovery_callbacks ( void *  context,
session_consensus_callbacks_t *  out_callbacks 
)

Get consensus callbacks configured for discovery mode.

Returns a callback structure showing how discovery mode would integrate consensus:

  • Send packets via ACDS relay
  • Handle election by storing host info
  • Measure NAT quality metrics
Parameters
contextOpaque context (typically discovery_session_t*)
out_callbacksOutput: Configured callback structure
Returns
ASCIICHAT_OK on success, error code otherwise

Get consensus callbacks configured for discovery mode.

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}
void * context
Opaque context passed to all callbacks.
Definition consensus.h:124
session_consensus_election_fn election
Custom election callback (optional, NULL = use default)
Definition consensus.h:123
session_consensus_on_election_fn on_election
Election result callback.
Definition consensus.h:121
session_consensus_get_metrics_fn get_metrics
Measure metrics callback.
Definition consensus.h:122
session_consensus_send_packet_fn send_packet
Send packet callback.
Definition consensus.h:120

References ASCIICHAT_OK, session_consensus_callbacks_t::context, session_consensus_callbacks_t::election, ERROR_INVALID_PARAM, session_consensus_callbacks_t::get_metrics, session_consensus_callbacks_t::on_election, session_consensus_callbacks_t::send_packet, and SET_ERRNO.

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 
)

Suggest next timeout for consensus processing.

Helper for modes to schedule consensus processing appropriately. Returns the minimum of consensus deadline or current timeout.

Usage in mode's main loop:

uint32_t suggested_timeout = consensus_suggest_timeout_ms(consensus, current_timeout);
// Use suggested_timeout in event wait instead of current_timeout
uint32_t consensus_suggest_timeout_ms(session_consensus_t *consensus, uint32_t current_timeout_ms)
Calculate how long to wait until next consensus processing.
unsigned int uint32_t
Definition common.h:58
Parameters
consensusConsensus handle (NULL safe)
current_timeout_msCurrent event loop timeout in milliseconds
Returns
Suggested next timeout in milliseconds

Suggest next timeout for 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)
Get time until next consensus round in nanoseconds.
Definition consensus.c:306
unsigned long long uint64_t
Definition common.h:59

References session_consensus_time_until_next_round().