ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
include/ascii-chat/network/acip/transport.h
Go to the documentation of this file.
1
75
76#pragma once
79
81#include <libplatform/atomic.h>
82#include "../../common.h"
84#include "../../crypto/crypto.h"
85#include "../../os/socket.h"
86#include <stddef.h>
87#include <stdint.h>
88#include <stdbool.h>
89
105
112typedef struct acip_transport acip_transport_t;
113
123
129
136typedef struct {
150 asciichat_error_t (*send)(acip_transport_t *transport, const void *data, size_t len);
151
166 asciichat_error_t (*recv)(acip_transport_t *transport, void **buffer, size_t *out_len, void **out_allocated_buffer);
167
178
182 void (*interrupt)(acip_transport_t *transport);
183
191
202
209 bool (*is_connected)(acip_transport_t *transport);
210
221
234 asciichat_error_t (*sendv)(acip_transport_t *transport, const socket_buffer_t *buffers, size_t count);
235
237 size_t (*queued_bytes)(acip_transport_t *transport);
241 void (*destroy_impl)(acip_transport_t *transport);
243 asciichat_error_t (*sendv_ex)(acip_transport_t *transport, const socket_buffer_t *buffers, size_t count,
244 const acip_send_options_t *options);
249 bool (*consume_keyframe_request)(acip_transport_t *transport, uint16_t type, uint32_t stream_id);
252
271
272// =============================================================================
273// Transport Lifecycle
274// =============================================================================
275
286
287// =============================================================================
288// Transport Operations (convenience wrappers)
289// =============================================================================
290
301asciichat_error_t acip_transport_sendv(acip_transport_t *transport, const socket_buffer_t *buffers, size_t count);
302
307asciichat_error_t acip_transport_sendv_ex(acip_transport_t *transport, const socket_buffer_t *buffers, size_t count,
308 const acip_send_options_t *options);
309
313
315
327static inline asciichat_error_t acip_transport_recv(acip_transport_t *transport, void **buffer, size_t *out_len,
328 void **out_allocated_buffer) {
330 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid transport");
331 }
332 return transport->methods->recv(transport, buffer, out_len, out_allocated_buffer);
333}
334
343static inline asciichat_error_t acip_transport_close(acip_transport_t *transport) {
345 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid transport");
346 }
347#ifndef __EMSCRIPTEN__
349#endif
351}
352
359static inline acip_transport_type_t acip_transport_get_type(acip_transport_t *transport) {
361 return (acip_transport_type_t)0;
362 }
364}
365
368static inline void acip_transport_interrupt(acip_transport_t *transport) {
369#ifndef __EMSCRIPTEN__
371#endif
374}
375
382static inline socket_t acip_transport_get_socket(acip_transport_t *transport) {
384 return INVALID_SOCKET_VALUE;
385 }
387}
388
395static inline bool acip_transport_is_connected(acip_transport_t *transport) {
397 return false;
398 }
400}
401
402static inline bool acip_transport_has_pending_data(acip_transport_t *transport) {
404 return false;
405 }
407}
408
409// =============================================================================
410// Transport Implementations (defined in separate files)
411// =============================================================================
412
423acip_transport_t *acip_tcp_transport_create(const char *name, socket_t sockfd, crypto_context_t *crypto_ctx);
424
433acip_transport_t *acip_tcp_transport_create_owned(const char *name, socket_t sockfd, crypto_context_t *crypto_ctx);
434
440
459
465
466acip_transport_t *acip_websocket_client_transport_create(const char *name, const char *url,
467 crypto_context_t *crypto_ctx);
468
483struct lws;
484acip_transport_t *acip_websocket_server_transport_create(const char *name, struct lws *wsi,
485 crypto_context_t *crypto_ctx);
486
501 struct webrtc_data_channel *data_channel, crypto_context_t *crypto_ctx);
Synchronized per-thread pending error stacks and value snapshots. SET_ERRNO pushes,...
#define SET_ERRNO(code,...)
void acip_outbound_stop(acip_transport_t *transport)
⚙️ Common definitions, error codes, macros, and types shared throughout the application
bool enabled
Is filtering active?
Definition grep.c:62
unsigned short uint16_t
Definition common.h:61
unsigned int uint32_t
Definition common.h:62
unsigned long long uint64_t
Definition common.h:63
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ERROR_INVALID_PARAM
struct acip_transport acip_transport_t
Forward declaration of ACIP transport.
Definition host.h:506
int socket_t
asciichat_error_t acip_transport_sendv_ex(acip_transport_t *transport, const socket_buffer_t *buffers, size_t count, const acip_send_options_t *options)
Definition send.c:113
asciichat_error_t acip_tcp_transport_set_zerocopy(acip_transport_t *transport, bool enabled)
acip_transport_t * acip_webrtc_transport_create(struct webrtc_peer_connection *peer_conn, struct webrtc_data_channel *data_channel, crypto_context_t *crypto_ctx)
acip_transport_t * acip_websocket_client_transport_create(const char *name, const char *url, crypto_context_t *crypto_ctx)
Create WebSocket client transport.
asciichat_error_t acip_transport_get_capabilities(acip_transport_t *transport, acip_transport_capabilities_t *out)
Definition send.c:104
acip_transport_t * acip_tcp_transport_create(const char *name, socket_t sockfd, crypto_context_t *crypto_ctx)
Create TCP transport from existing socket.
asciichat_error_t acip_websocket_runtime_create(acip_websocket_runtime_t **out)
struct acip_websocket_runtime acip_websocket_runtime_t
asciichat_error_t acip_transport_sendv(acip_transport_t *transport, const socket_buffer_t *buffers, size_t count)
Send data through transport.
Definition send.c:140
acip_transport_type_t
Transport method table (virtual function table).
@ ACIP_TRANSPORT_TCP
Raw TCP socket.
@ ACIP_TRANSPORT_WEBSOCKET
WebSocket over TCP.
@ ACIP_TRANSPORT_WEBRTC
WebRTC DataChannel (P2P).
@ ACIP_TRANSPORT_HTTP
HTTP long-polling (future).
@ ACIP_TRANSPORT_QUIC
QUIC/UDP (future).
asciichat_error_t acip_websocket_transport_flush(acip_transport_t *transport, uint64_t timeout_ns)
Create WebSocket client transport.
acip_transport_t * acip_websocket_server_transport_create(const char *name, struct lws *wsi, crypto_context_t *crypto_ctx)
Create WebSocket server transport from existing connection.
asciichat_error_t acip_transport_send(acip_transport_t *transport, const void *data, size_t len)
Definition send.c:150
acip_transport_t * acip_tcp_transport_create_owned(const char *name, socket_t sockfd, crypto_context_t *crypto_ctx)
Create a TCP transport that owns its connected socket.
void acip_websocket_runtime_destroy(acip_websocket_runtime_t **runtime)
void acip_transport_destroy(acip_transport_t *transport)
Destroy transport and free all resources.
static bool size_t gotel_query_t * out
Definition queries.h:8
struct stats_peer stats_peer_t
acip_transport_t * transport
The useful part of acip transport capabilities is in independent_streams, datagrams,...
Transport method table (virtual function table).
asciichat_error_t(* validate_send_options)(acip_transport_t *transport, const acip_send_options_t *options)
void(* interrupt)(acip_transport_t *transport)
asciichat_error_t(* send)(acip_transport_t *transport, const void *data, size_t len)
Send data through this transport.
bool(* is_connected)(acip_transport_t *transport)
Check if transport is connected.
asciichat_error_t(* close)(acip_transport_t *transport)
Close this transport.
socket_t(* get_socket)(acip_transport_t *transport)
Get underlying socket (if applicable).
asciichat_error_t(* sendv)(acip_transport_t *transport, const socket_buffer_t *buffers, size_t count)
Custom destroy implementation (optional).
bool(* consume_keyframe_request)(acip_transport_t *transport, uint16_t type, uint32_t stream_id)
size_t reserved_bytes
Bound for backend-owned pending data not exposed by queued_bytes.
size_t(* queued_bytes)(acip_transport_t *transport)
asciichat_error_t(* wait_writable)(acip_transport_t *transport, uint64_t timeout_ns)
asciichat_error_t(* recv)(acip_transport_t *transport, void **buffer, size_t *out_len, void **out_allocated_buffer)
Receive data from this transport.
void(* destroy_impl)(acip_transport_t *transport)
acip_transport_type_t(* get_type)(acip_transport_t *transport)
Get transport type.
bool(* has_pending_data)(acip_transport_t *transport)
Check whether the transport has pending readable data.
asciichat_error_t(* sendv_ex)(acip_transport_t *transport, const socket_buffer_t *buffers, size_t count, const acip_send_options_t *options)
asciichat_error_t(* get_capabilities)(acip_transport_t *transport, acip_transport_capabilities_t *out)
struct acip_outbound * outbound
Per-connection plaintext admission and scheduling.
atomic_t packet_security_active
Publishes the stable post-handshake crypto owner.
void * impl_data
Transport-specific state.
bool prefer_visual_datagrams
Select negotiated visual datagrams when supported.
stats_peer_t * stats_peer
Owned statistics handle, destroyed with transport.
const acip_transport_methods_t * methods
Method table (virtual functions).
crypto_context_t * crypto_ctx
Optional encryption context.
void * user_data
Application-specific context (e.g., per-client data).
uint64_t receive_timeout_ns
Optional TCP receive timeout override; zero uses the normal polling timeout.
bool prefer_audio_datagrams
Select negotiated datagrams for audio, otherwise reliable delivery.
Endpoint cryptographic state for handshake, packet protection, authentication, and rekeying.
When code needs to work with webrtc peer connection, it keeps mapping, port_reservation,...
WebRTC data channel for sending/receiving messages.