26 offsetof(options_t, port),
29 "Port to host a server or discovery-service on, or port to connect to a server as a client (default: 27224 for "
30 "server/client, 27225 for discovery-service).",
39 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
40 {.numeric_range = {1, 65535, 1}, .input_type = OPTION_INPUT_NUMERIC},
45 offsetof(options_t, websocket_port),
48 "WebSocket server port (default: 27226 for server, 27227 for discovery-service).",
52 "ASCII_CHAT_WEBSOCKET_PORT",
57 OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC,
58 {.numeric_range = {1, 65535, 1}, .input_type = OPTION_INPUT_NUMERIC},
63 offsetof(options_t, max_clients),
64 &default_max_clients_value,
66 "Maximum concurrent clients.",
70 "ASCII_CHAT_MAX_CLIENTS",
75 OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC,
78 {
"reconnect-attempts",
81 offsetof(options_t, reconnect_attempts),
82 &default_reconnect_attempts_value,
84 "Number of reconnection attempts before giving up (-1=infinite, 0=none).",
88 "ASCII_CHAT_RECONNECT_ATTEMPTS",
93 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
94 {.numeric_range = {-1, 99, 1}, .examples =
g_reconnect_examples, .input_type = OPTION_INPUT_NUMERIC},
99 offsetof(options_t, enable_upnp),
100 &default_enable_upnp_value,
102 "Use UPnP/NAT-PMP port mapping to open a port in your router to ascii-chat (might fail with some routers).",
106 "ASCII_CHAT_PORT_FORWARDING",
111 OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC,
117 offsetof(options_t, lan_discovery),
118 &default_lan_discovery_value,
120 "Scan for servers on local network via mDNS.",
129 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
134 {
"compression-level",
137 offsetof(options_t, compression_level),
138 &default_compression_level_value,
140 "zstd compression level (1-9).",
144 "ASCII_CHAT_COMPRESSION_LEVEL",
149 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
155 offsetof(options_t, no_compress),
156 &default_no_compress_value,
158 "Disable compression.",
162 "ASCII_CHAT_NO_COMPRESS",
167 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
172 {
"discovery-service",
175 offsetof(options_t, discovery_server),
176 OPT_ENDPOINT_DISCOVERY_SERVICE,
178 "Discovery service endpoint (IP address or hostname).",
182 "ASCII_CHAT_DISCOVERY_SERVER",
187 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
190 {
"discovery-service-port",
193 offsetof(options_t, discovery_port),
194 &default_discovery_port_value,
196 "Discovery service port (1-65535).",
200 "ASCII_CHAT_DISCOVERY_SERVICE_PORT",
205 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
208 {
"discovery-expose-ip",
211 offsetof(options_t, discovery_expose_ip),
212 &default_discovery_expose_ip_value,
214 "Allow public IP disclosure in discovery sessions (requires confirmation).",
218 "ASCII_CHAT_DISCOVERY_EXPOSE_IP",
223 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
229 offsetof(options_t, discovery),
230 &default_discovery_value,
232 "Enable discovery session registration.",
236 "ASCII_CHAT_DISCOVERY",
249 offsetof(options_t, webrtc),
250 &default_webrtc_value,
252 "Make calls using WebRTC p2p connections.",
261 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
267 offsetof(options_t, no_webrtc),
268 &default_no_webrtc_value,
270 "Disable WebRTC, use direct TCP only.",
274 "ASCII_CHAT_NO_WEBRTC",
279 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
285 offsetof(options_t, prefer_webrtc),
286 &default_prefer_webrtc_value,
288 "Try WebRTC before direct TCP.",
292 "ASCII_CHAT_PREFER_WEBRTC",
297 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
303 offsetof(options_t, webrtc_skip_stun),
304 &default_webrtc_skip_stun_value,
306 "Skip WebRTC+STUN stage, go straight to TURN relay.",
310 "ASCII_CHAT_WEBRTC_SKIP_STUN",
315 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
318 {
"webrtc-disable-turn",
321 offsetof(options_t, webrtc_disable_turn),
322 &default_webrtc_disable_turn_value,
324 "Disable WebRTC+TURN relay, use STUN only.",
328 "ASCII_CHAT_WEBRTC_DISABLE_TURN",
333 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
339 offsetof(options_t, webrtc_skip_host),
340 &default_webrtc_skip_host_value,
342 "Skip host candidates, force STUN/TURN (for testing).",
346 "ASCII_CHAT_WEBRTC_SKIP_HOST",
351 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
354 {
"webrtc-ice-timeout",
357 offsetof(options_t, webrtc_ice_timeout_ms),
358 &default_webrtc_ice_timeout_ms_value,
360 "ICE gathering timeout in milliseconds.",
364 "ASCII_CHAT_WEBRTC_ICE_TIMEOUT",
369 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
372 {
"webrtc-reconnect-attempts",
375 offsetof(options_t, webrtc_reconnect_attempts),
376 &default_webrtc_reconnect_attempts_value,
378 "Number of WebRTC connection retry attempts.",
382 "ASCII_CHAT_WEBRTC_RECONNECT_ATTEMPTS",
387 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
393 offsetof(options_t, stun_servers),
394 OPT_STUN_SERVERS_DEFAULT,
396 "Comma-separated list of WebRTC+STUN server URLs.",
400 "ASCII_CHAT_STUN_SERVERS",
405 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
411 offsetof(options_t, turn_servers),
412 OPT_TURN_SERVERS_DEFAULT,
414 "Comma-separated list of WebRTC+TURN server URLs.",
418 "ASCII_CHAT_TURN_SERVERS",
423 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
429 offsetof(options_t, turn_username),
430 OPT_TURN_USERNAME_DEFAULT,
432 "Username for WebRTC+TURN authentication.",
436 "ASCII_CHAT_TURN_USERNAME",
441 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
447 offsetof(options_t, turn_credential),
448 OPT_TURN_CREDENTIAL_DEFAULT,
450 "Credential/password for WebRTC+TURN authentication.",
454 "ASCII_CHAT_TURN_CREDENTIAL",
459 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
465 offsetof(options_t, turn_secret),
468 "Shared secret for dynamic WebRTC+TURN credential generation (HMAC-SHA1).",
472 "ASCII_CHAT_TURN_SECRET",
477 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
481 REGISTRY_TERMINATOR()};