Adds a dedicated IPv6 QUIC endpoint (IPV6_V6ONLY=1 via socket2) alongside the existing IPv4 signal endpoint for proper dual-stack P2P connectivity. Previous [::]:0 dual-stack attempt broke IPv4 on Android; this uses separate sockets per address family like WebRTC/libwebrtc. - create_ipv6_endpoint(): socket2-based IPv6-only UDP socket, tries same port as IPv4 signal EP, falls back to ephemeral - local_host_candidates(v4_port, v6_port): now gathers IPv6 global-unicast (2000::/3) and unique-local (fc00::/7) addrs - dual_path::race(): A-role accepts on both v4+v6 via select!, D-role routes each candidate to matching-AF endpoint - Graceful fallback: if IPv6 unavailable, .ok() → None → pure IPv4 behavior identical to pre-Phase-7 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
92 lines
2.7 KiB
TOML
92 lines
2.7 KiB
TOML
[workspace]
|
|
resolver = "2"
|
|
members = [
|
|
"crates/wzp-proto",
|
|
"crates/wzp-codec",
|
|
"crates/wzp-fec",
|
|
"crates/wzp-crypto",
|
|
"crates/wzp-transport",
|
|
"crates/wzp-relay",
|
|
"crates/wzp-client",
|
|
"crates/wzp-web",
|
|
"crates/wzp-android",
|
|
"crates/wzp-native",
|
|
"desktop/src-tauri",
|
|
]
|
|
|
|
[workspace.package]
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.85"
|
|
|
|
[workspace.dependencies]
|
|
# Shared
|
|
bytes = "1"
|
|
thiserror = "2"
|
|
async-trait = "0.1"
|
|
tokio = { version = "1", features = ["full"] }
|
|
tracing = "0.1"
|
|
tracing-subscriber = "0.3"
|
|
serde = { version = "1", features = ["derive"] }
|
|
|
|
# Transport
|
|
quinn = "0.11"
|
|
socket2 = "0.5"
|
|
|
|
# FEC
|
|
raptorq = "2"
|
|
|
|
# Codec
|
|
# opusic-c: high-level safe bindings over libopus 1.5.2 (encoder side).
|
|
# opusic-sys: raw FFI for the decoder side — we build our own DecoderHandle
|
|
# because opusic-c::Decoder.inner is pub(crate) and cannot be reached for the
|
|
# Phase 3 DRED reconstruction path. See docs/PRD-dred-integration.md.
|
|
# Pinned exactly (no caret) for reproducible libopus 1.5.2 across the fleet.
|
|
opusic-c = { version = "=1.5.5", default-features = false, features = ["bundled", "dred"] }
|
|
opusic-sys = { version = "=0.6.0", default-features = false, features = ["bundled"] }
|
|
bytemuck = "1"
|
|
codec2 = "0.3"
|
|
|
|
# Crypto
|
|
x25519-dalek = { version = "2", features = ["static_secrets"] }
|
|
ed25519-dalek = { version = "2", features = ["rand_core", "pkcs8"] }
|
|
chacha20poly1305 = "0.10"
|
|
hkdf = "0.12"
|
|
sha2 = "0.10"
|
|
rand = "0.8"
|
|
|
|
# Workspace crates
|
|
wzp-proto = { path = "crates/wzp-proto" }
|
|
wzp-codec = { path = "crates/wzp-codec" }
|
|
wzp-fec = { path = "crates/wzp-fec" }
|
|
wzp-crypto = { path = "crates/wzp-crypto" }
|
|
wzp-transport = { path = "crates/wzp-transport" }
|
|
wzp-client = { path = "crates/wzp-client" }
|
|
|
|
# Fast dev profile: optimized but with debug info and incremental compilation.
|
|
# Use with: cargo run --profile dev-fast
|
|
[profile.dev-fast]
|
|
inherits = "dev"
|
|
opt-level = 2
|
|
|
|
# Optimize heavy compute deps even in debug builds —
|
|
# real-time audio needs < 20ms per frame, impossible unoptimized.
|
|
[profile.dev.package.nnnoiseless]
|
|
opt-level = 3
|
|
[profile.dev.package.opusic-sys]
|
|
opt-level = 3
|
|
[profile.dev.package.raptorq]
|
|
opt-level = 3
|
|
[profile.dev.package.wzp-codec]
|
|
opt-level = 3
|
|
[profile.dev.package.wzp-fec]
|
|
opt-level = 3
|
|
|
|
# Phase 0 (opus-DRED): removed the [patch.crates-io] audiopus_sys = { path =
|
|
# "vendor/audiopus_sys" } block. That patch existed to fix a Windows clang-cl
|
|
# SIMD compile bug in libopus 1.3.1. With the swap to opusic-sys (libopus
|
|
# 1.5.2), the upstream SIMD gating was fixed and the vendor patch is
|
|
# obsolete. The vendor/audiopus_sys directory itself should be deleted as
|
|
# part of the same cleanup — see the commit that follows this Phase 0.
|