64} g_session_context = {0};
69static mutex_t g_signaling_mutex;
70static bool g_signaling_mutex_initialized =
false;
79static void ensure_mutex_initialized(
void) {
80 if (!g_signaling_mutex_initialized) {
82 g_signaling_mutex_initialized =
true;
100 const char *sdp_type,
const char *sdp,
void *user_data) {
103 if (!
session_id || !recipient_id || !sdp_type || !sdp) {
107 ensure_mutex_initialized();
111 if (!g_acds_transport) {
117 if (!g_session_context.is_set) {
123 size_t sdp_len = strlen(sdp);
124 if (sdp_len == 0 || sdp_len >= 8192) {
140 memcpy(header->sender_id, g_session_context.participant_id, 16);
141 memcpy(header->recipient_id, recipient_id, 16);
142 header->sdp_type = (strcmp(sdp_type,
"offer") == 0) ? 0 : 1;
148 log_info(
"Sending WebRTC SDP %s to participant (%.8s...) via ACDS", sdp_type, (
const char *)recipient_id);
159 return SET_ERRNO(result,
"Failed to send SDP via ACDS");
175 const char *candidate,
const char *mid,
void *user_data) {
178 if (!
session_id || !recipient_id || !candidate || !mid) {
182 ensure_mutex_initialized();
186 if (!g_acds_transport) {
192 if (!g_session_context.is_set) {
198 size_t candidate_len = strlen(candidate);
199 size_t mid_len = strlen(mid);
200 size_t payload_len = candidate_len + 1 + mid_len + 1;
202 if (payload_len >= 8192) {
218 memcpy(header->sender_id, g_session_context.participant_id, 16);
219 memcpy(header->recipient_id, recipient_id, 16);
224 memcpy(payload, candidate, candidate_len);
225 payload[candidate_len] =
'\0';
226 memcpy(payload + candidate_len + 1, mid, mid_len);
227 payload[candidate_len + 1 + mid_len] =
'\0';
229 log_debug(
"Sending WebRTC ICE candidate to participant (%.8s..., mid=%s) via ACDS", (
const char *)recipient_id, mid);
240 return SET_ERRNO(result,
"Failed to send ICE via ACDS");
251 ensure_mutex_initialized();
254 .
send_sdp = client_send_sdp, .send_ice = client_send_ice, .user_data = NULL};
260 ensure_mutex_initialized();
263 g_acds_transport = transport;
266 log_debug(
"ACDS transport set for WebRTC signaling");
268 log_debug(
"ACDS transport cleared for WebRTC signaling");
276 log_error(
"Invalid session context parameters");
280 ensure_mutex_initialized();
283 memcpy(g_session_context.session_id,
session_id, 16);
285 g_session_context.is_set =
true;
287 log_info(
"Session context set for WebRTC signaling (session=%.8s..., participant=%.8s...)", (
const char *)
session_id,
305 ensure_mutex_initialized();
308 g_webrtc_transport = transport;
311 log_debug(
"WebRTC data channel transport set");
313 log_debug(
"WebRTC data channel transport cleared");
330 ensure_mutex_initialized();
351 ensure_mutex_initialized();
354 if (g_webrtc_transport) {
355 log_debug(
"Cleaning up WebRTC data channel transport");
356 g_webrtc_transport = NULL;
🔌 Cross-platform abstraction layer umbrella header for ascii-chat
🔄 Network byte order conversion helpers
#define HOST_TO_NET_U16(val)
#define SAFE_MALLOC(size, cast)
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it.
asciichat_error_t
Error and exit codes - unified status values (0-255)
#define log_error(...)
Log an ERROR message.
#define log_info(...)
Log an INFO message.
#define log_debug(...)
Log a DEBUG message.
@ PACKET_TYPE_ACIP_WEBRTC_ICE
WebRTC ICE candidate (bidirectional)
@ PACKET_TYPE_ACIP_WEBRTC_SDP
WebRTC SDP offer/answer (bidirectional)
ASCII-Chat IP Protocol (ACIP) packet type definitions.
ASCII-Chat Discovery Service (ACDS) Protocol Message Formats.
asciichat_error_t packet_send_via_transport(acip_transport_t *transport, packet_type_t type, const void *payload, size_t payload_len)
Send packet via transport with proper header (exported for generic wrappers)
ACIP shared/bidirectional packet sending functions.
acip_transport_t * webrtc_get_transport(void)
Get the current WebRTC data channel transport.
void webrtc_set_session_context(const uint8_t session_id[16], const uint8_t participant_id[16])
Set session and participant IDs for signaling.
void webrtc_set_acds_transport(acip_transport_t *transport)
Set the ACDS transport for signaling callbacks.
void webrtc_set_transport(acip_transport_t *transport)
Set the WebRTC data channel transport.
webrtc_signaling_callbacks_t webrtc_get_signaling_callbacks(void)
Get signaling callbacks for WebRTC peer manager.
void webrtc_cleanup_transport(void)
Cleanup and release the WebRTC data channel transport.
uint8_t participant_id[16]
Client-side WebRTC signaling callback implementations.
Transport instance structure.
Signaling callbacks for sending SDP/ICE.
webrtc_send_sdp_callback_t send_sdp
Send SDP via ACDS.