ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
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[SESSION_ID_SIZE], const uint8_t my_id[SESSION_ID_SIZE], const uint8_t participant_ids[MAX_SESSION_PARTICIPANTS][SESSION_ID_SIZE], 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[SESSION_ID_SIZE],
const uint8_t my_id[SESSION_ID_SIZE],
const uint8_t participant_ids[MAX_SESSION_PARTICIPANTS][SESSION_ID_SIZE],
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 128)
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 128)
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 154 of file consensus_integration.c.

156 {
157 (void)session_id; // Informational only, not needed by consensus itself
158
159 if (!my_id || !participant_ids || !discovery_context || !out_consensus) {
160 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters");
161 }
162
163 if (num_participants < 1 || num_participants > MAX_SESSION_PARTICIPANTS) {
164 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid participant count: %d", num_participants);
165 }
166
167 // Determine if we're the ring leader (for now, assume not - ACDS would manage this)
168 // In a real implementation, ACDS would tell us our position in the ring
169 bool is_leader = false; // This would be determined by ACDS
170
171 // Get callbacks configured for our mode
172 session_consensus_callbacks_t callbacks = {0};
173 asciichat_error_t err = consensus_get_discovery_callbacks(discovery_context, &callbacks);
174 if (err != ASCIICHAT_OK) {
175 return err;
176 }
177
178 // Create consensus with the callbacks
179 return session_consensus_create(my_id, is_leader, participant_ids, num_participants, &callbacks, out_consensus);
180}
#define SET_ERRNO(code,...)
asciichat_error_t session_consensus_create(const uint8_t my_id[SESSION_ID_SIZE], bool is_leader, const uint8_t participant_ids[MAX_SESSION_PARTICIPANTS][SESSION_ID_SIZE], int num_participants, const session_consensus_callbacks_t *callbacks, session_consensus_t **out_consensus)
Create a new session consensus instance.
Definition consensus.c:117
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
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
#define MAX_SESSION_PARTICIPANTS
uint8_t session_id[SESSION_ID_SIZE]
Mode-specific hooks used by the session consensus adapter.
Definition consensus.h:130

References ASCIICHAT_OK, consensus_get_discovery_callbacks(), ERROR_INVALID_PARAM, MAX_SESSION_PARTICIPANTS, session_consensus_create(), session_id, SESSION_ID_SIZE, 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 123 of file consensus_integration.c.

123 {
124 if (!context || !out_callbacks) {
125 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters: context=%p, out_callbacks=%p", context, out_callbacks);
126 }
127
128 // Configure callbacks for discovery mode
129 out_callbacks->send_packet = consensus_send_via_discovery;
130 out_callbacks->on_election = consensus_on_election_result;
131 out_callbacks->get_metrics = consensus_get_metrics;
132 out_callbacks->election = NULL; // Use default election algorithm
133 out_callbacks->context = context;
134
135 return ASCIICHAT_OK;
136}
void * context
Opaque context passed to all callbacks.
Definition consensus.h:135
session_consensus_election_fn election
Custom election callback (optional, NULL = use default).
Definition consensus.h:134
session_consensus_on_election_fn on_election
Election result callback.
Definition consensus.h:132
session_consensus_get_metrics_fn get_metrics
Measure metrics callback.
Definition consensus.h:133
session_consensus_send_packet_fn send_packet
Send packet callback.
Definition consensus.h:131

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:62
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 191 of file consensus_integration.c.

191 {
192 if (!consensus) {
193 return current_timeout_ms;
194 }
195
196 // Get time until next round in nanoseconds
197 uint64_t time_to_next_ns = session_consensus_time_until_next_round(consensus);
198
199 // Convert to milliseconds
200 uint64_t time_to_next_ms = time_ns_to_ms(time_to_next_ns);
201
202 // Return minimum of consensus deadline or current timeout
203 if (time_to_next_ms == 0) {
204 return 0; // Consensus needs immediate attention
205 }
206
207 if (time_to_next_ms < current_timeout_ms) {
208 return (uint32_t)time_to_next_ms;
209 }
210
211 return current_timeout_ms;
212}
uint64_t session_consensus_time_until_next_round(session_consensus_t *consensus)
Get time until next consensus round in nanoseconds.
Definition consensus.c:323
unsigned long long uint64_t
Definition common.h:63

References session_consensus_time_until_next_round().