Fixes from real-world 5G↔Starlink testing: NAT tickle fix: - tokio::net::UdpSocket::bind() doesn't set SO_REUSEADDR, so binding to the same port as quinn silently failed. Now uses socket2::Socket with explicit SO_REUSEADDR + SO_REUSEPORT (via libc on unix). - Tickle now logs success/failure for debugging. Diagnostic fixes: - connect:dual_path_race_start shows both dial_order_raw and dial_order_smart so we can see what filtering removed - Grace-period timeout (relay wins first, direct still running) now fills "timeout:grace" diags for unrecorded candidates - Previously candidate_diags was empty when relay won the race Dependencies: - Added socket2 = "0.5" to wzp-client 593 tests pass, 0 regressions. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
121 lines
4.8 KiB
TOML
121 lines
4.8 KiB
TOML
[package]
|
|
name = "wzp-client"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
rust-version.workspace = true
|
|
description = "WarzonePhone client library — for Android (JNI) and Windows desktop"
|
|
|
|
[dependencies]
|
|
wzp-proto = { workspace = true }
|
|
wzp-codec = { workspace = true }
|
|
wzp-fec = { workspace = true }
|
|
wzp-crypto = { workspace = true }
|
|
wzp-transport = { workspace = true }
|
|
tokio = { workspace = true }
|
|
tracing = { workspace = true }
|
|
tracing-subscriber = { workspace = true }
|
|
async-trait = { workspace = true }
|
|
bytes = { workspace = true }
|
|
anyhow = "1"
|
|
serde = { workspace = true }
|
|
serde_json = "1"
|
|
chrono = "0.4"
|
|
clap = { version = "4", features = ["derive"] }
|
|
ratatui = "0.29"
|
|
crossterm = "0.28"
|
|
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }
|
|
cpal = { version = "0.15", optional = true }
|
|
libc = "0.2"
|
|
# Phase 5.5 — LAN host-candidate ICE: enumerate local network
|
|
# interface addresses for inclusion in DirectCallOffer/Answer so
|
|
# peers on the same LAN can direct-connect without NAT hairpinning
|
|
# through the WAN reflex addr (which many consumer NATs, including
|
|
# MikroTik's default masquerade, don't support).
|
|
if-addrs = "0.13"
|
|
rand = { workspace = true }
|
|
socket2 = "0.5"
|
|
|
|
# coreaudio-rs is Apple-framework-only; gate it to macOS so enabling
|
|
# the `vpio` feature from a non-macOS target builds cleanly instead of
|
|
# pulling in a crate that can only link against Apple frameworks.
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
coreaudio-rs = { version = "0.11", optional = true }
|
|
|
|
# Windows-only: direct WASAPI bindings for the `windows-aec` feature.
|
|
# `windows` is Microsoft's official Rust COM bindings crate. We pull in
|
|
# only the audio + COM subfeatures we need — the crate is organized as
|
|
# a massive optional-feature tree, so enabling just these keeps compile
|
|
# times reasonable (~5s for these features vs ~60s for the full crate).
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
windows = { version = "0.58", optional = true, features = [
|
|
"Win32_Foundation",
|
|
"Win32_Media_Audio",
|
|
"Win32_Security",
|
|
"Win32_System_Com",
|
|
"Win32_System_Com_StructuredStorage",
|
|
"Win32_System_Threading",
|
|
"Win32_System_Variant",
|
|
] }
|
|
|
|
# Linux-only: WebRTC AEC (Audio Processing Module) bindings for the
|
|
# `linux-aec` feature. This is the 0.3.x line of the `tonarino/
|
|
# webrtc-audio-processing` crate, which links against Debian's
|
|
# `libwebrtc-audio-processing-dev` apt package (0.3-1+b1 on Bookworm).
|
|
#
|
|
# Note: we attempted the 2.x line with its `bundled` sub-feature first
|
|
# (which would give us AEC3 instead of AEC2), but both the crates.io
|
|
# tarball AND the upstream git `main` branch of webrtc-audio-processing-sys
|
|
# 2.0.3 hit a `meson setup --reconfigure` bug where the build.rs passes
|
|
# --reconfigure unconditionally even on first-run empty build dirs,
|
|
# causing the bundled build to fail with "Directory does not contain a
|
|
# valid build tree". The 0.x line doesn't use bundled mode and sidesteps
|
|
# this entirely by linking the apt-provided library. AEC2 is older than
|
|
# AEC3 but still the same algorithm family — this is what PulseAudio's
|
|
# module-echo-cancel and PipeWire's filter-chain use by default on
|
|
# current Debian-family distros.
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
webrtc-audio-processing = { version = "0.3", optional = true }
|
|
|
|
[features]
|
|
default = []
|
|
audio = ["cpal"]
|
|
# vpio enables coreaudio-rs but that dep is itself gated to macOS above,
|
|
# so enabling this feature on Windows/Linux is a no-op (the audio_vpio
|
|
# module is also #[cfg(target_os = "macos")] in lib.rs).
|
|
vpio = ["dep:coreaudio-rs"]
|
|
# windows-aec enables a direct WASAPI capture backend that opens the
|
|
# microphone under AudioCategory_Communications, turning on Windows's
|
|
# OS-level communications audio processing (AEC + noise suppression +
|
|
# AGC). The `windows` dep is itself target-gated to Windows above, so
|
|
# enabling this feature on non-Windows targets is a no-op (the
|
|
# audio_wasapi module is also #[cfg(target_os = "windows")] in lib.rs).
|
|
windows-aec = ["dep:windows"]
|
|
# linux-aec enables a CPAL + WebRTC AEC3 capture/playback backend that
|
|
# runs the WebRTC Audio Processing Module (same algo as Chrome / Zoom /
|
|
# Teams) in-process, using the playback PCM as the reference signal for
|
|
# echo cancellation. The webrtc-audio-processing dep is target-gated to
|
|
# Linux above, so enabling this feature on non-Linux targets is a no-op
|
|
# (the audio_linux_aec module is also #[cfg(target_os = "linux")] in
|
|
# lib.rs).
|
|
linux-aec = ["dep:webrtc-audio-processing"]
|
|
|
|
[[bin]]
|
|
name = "wzp-client"
|
|
path = "src/cli.rs"
|
|
|
|
[[bin]]
|
|
name = "wzp-analyzer"
|
|
path = "src/analyzer.rs"
|
|
|
|
[[bin]]
|
|
name = "wzp-bench"
|
|
path = "src/bench_cli.rs"
|
|
|
|
[dev-dependencies]
|
|
tokio = { workspace = true }
|
|
wzp-relay = { path = "../wzp-relay" }
|
|
wzp-crypto = { workspace = true }
|
|
wzp-proto = { workspace = true }
|
|
async-trait = { workspace = true }
|