Addressed every rustc warning surfaced by \`cargo check --workspace
--release --lib --bins\` on opus-DRED-v2. Split across three
categories:
## Real bugs surfaced by the audit (fix, don't silence)
- **crates/wzp-relay/src/federation.rs** — the per-peer RTT monitor
task computed \`rtt_ms\` every 5 s and threw it on the floor. The
\`wzp_federation_peer_rtt_ms\` gauge has been registered in
metrics.rs the whole time but was never receiving samples, leaving
the Grafana panel blank. Wired it up: the task now calls
\`fm_rtt.metrics.federation_peer_rtt_ms.with_label_values(&[&label_rtt]).set(rtt_ms)\`
on every sample. Fixes three warnings (\`rtt_ms\`, \`fm_rtt\`,
\`label_rtt\` were all captured for this task and all dead).
## Dead code removal
- **crates/wzp-relay/src/federation.rs** — removed \`local_delivery_seq:
AtomicU16\` field and its initializer. It was described in comments
as "per-room seq counter for federation media delivered to local
clients" but was declared, initialized to 0, and never read or
written anywhere else. Genuine half-wired feature; deletable with
zero behavior change.
- **crates/wzp-relay/src/room.rs** — removed \`let recv_start =
Instant::now()\` at the top of a recv loop that was never read.
Separate variable \`last_recv_instant\` already measures the actual
gap that's used for the \`max_recv_gap_ms\` stat.
- **crates/wzp-client/src/cli.rs** — removed \`let my_fp = fp.clone()\`
from the signal loop setup. Cloned but never used in any match arm.
## Stub-intent warnings (underscore + explanatory comment)
- **crates/wzp-relay/src/handshake.rs** — \`choose_profile\` hardcodes
\`QualityProfile::GOOD\` and ignores its \`supported\` parameter.
Comment already documented "Cap at GOOD (24k) for now — studio
tiers not yet tested for federation reliability". Renamed to
\`_supported\`, expanded the comment to explicitly note the future
plan (pick highest supported ≤ relay ceiling).
- **crates/wzp-relay/src/federation.rs** — \`forward_to_peers\` takes
\`room_name: &str\` but only uses \`room_hash\`. The caller
(handle_datagram) passes the name for caller-site symmetry with
other helpers; kept the param shape and underscored the binding
with a comment noting it's reserved for future per-name logging.
## Cosmetic fixes
- **crates/wzp-relay/src/event_log.rs** — dropped \`use std::sync::Arc\`
(unused).
- **crates/wzp-relay/src/signal_hub.rs** — trimmed \`use tracing::{info,
warn}\` to \`use tracing::info\`. Also removed unnecessary \`mut\` on
\`hub\` binding in the \`register_unregister\` test.
- **crates/wzp-relay/src/room.rs** — trimmed \`use tracing::{debug,
error, info, trace, warn}\` to \`{error, info, warn}\`. Also removed
unnecessary \`mut\` on \`mgr\` binding in the \`room_join_leave\` test.
- **crates/wzp-relay/src/main.rs** — removed unnecessary \`mut\` on the
\`config\` destructured binding from \`parse_args()\`; and dropped
\`ref caller_alias\` from the \`DirectCallOffer\` match pattern since
the relay just forwards the full \`msg\` (caller_alias is preserved
end-to-end, we don't need to read it on the relay).
- **crates/wzp-crypto/tests/featherchat_compat.rs** — dropped
\`CallSignalType\` from a \`use wzp_client::featherchat::{...}\`
(unused in the test body). Note: this test file has pre-existing
compile errors from SignalMessage schema drift unrelated to this
sweep; that's tracked separately.
## Crate-level annotation
- **crates/wzp-android/src/lib.rs** — added
\`#![allow(dead_code, unused_imports, unused_variables, unused_mut)]\`
with a doc block explaining the crate is dead code since the Tauri
mobile rewrite. The legacy Kotlin+JNI Android app that consumed
this crate was replaced by desktop/src-tauri (live Android recv
path) + crates/wzp-native (Oboe bridge). Rather than piecemeal
cleanup of a crate that shouldn't be maintained, the whole-crate
allow keeps CI clean until someone removes the crate entirely. Kills
all 6 wzp-android warnings (4 unused imports/vars, 1 unused \`mut\`
on a JNI env param, 1 dead \`command_rx\` field) in one line.
## Not touched
- **deps/featherchat/warzone/crates/warzone-protocol/src/x3dh.rs** —
3 unused-variable warnings in \`alice_spk_secret\`, \`alice_bundle\`,
\`bob_bundle_bytes\`. This is a vendored third-party submodule;
upstream's problem, not ours. Would need to be reported to
featherchat upstream if we care.
## Verification
- \`cargo check --workspace --release --lib --bins\` → 0 warnings, 0 errors
- \`cargo check --workspace --release --all-targets\` → only the 3
featherchat submodule warnings remain, plus the pre-existing 3
broken integration tests (SignalMessage schema drift from Phase 2,
tracked separately and explicitly out of scope).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
106 lines
3.0 KiB
Rust
106 lines
3.0 KiB
Rust
//! Persistent signaling connection manager.
|
|
//!
|
|
//! Tracks clients connected via `_signal` SNI. Routes call signals
|
|
//! (DirectCallOffer, DirectCallAnswer, Hangup) between registered users.
|
|
|
|
use std::collections::HashMap;
|
|
use std::sync::Arc;
|
|
use std::time::Instant;
|
|
|
|
use tracing::info;
|
|
use wzp_proto::{MediaTransport, SignalMessage};
|
|
use wzp_transport::QuinnTransport;
|
|
|
|
/// A client connected via `_signal` for direct calling.
|
|
pub struct SignalClient {
|
|
pub fingerprint: String,
|
|
pub alias: Option<String>,
|
|
pub transport: Arc<QuinnTransport>,
|
|
pub connected_at: Instant,
|
|
}
|
|
|
|
/// Manages persistent signaling connections.
|
|
pub struct SignalHub {
|
|
clients: HashMap<String, SignalClient>,
|
|
}
|
|
|
|
impl SignalHub {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
clients: HashMap::new(),
|
|
}
|
|
}
|
|
|
|
/// Register a new signaling client.
|
|
pub fn register(&mut self, fp: String, transport: Arc<QuinnTransport>, alias: Option<String>) {
|
|
info!(fingerprint = %fp, alias = ?alias, "signal client registered");
|
|
self.clients.insert(fp.clone(), SignalClient {
|
|
fingerprint: fp,
|
|
alias,
|
|
transport,
|
|
connected_at: Instant::now(),
|
|
});
|
|
}
|
|
|
|
/// Unregister a signaling client. Returns the client if found.
|
|
pub fn unregister(&mut self, fp: &str) -> Option<SignalClient> {
|
|
let client = self.clients.remove(fp);
|
|
if client.is_some() {
|
|
info!(fingerprint = %fp, "signal client unregistered");
|
|
}
|
|
client
|
|
}
|
|
|
|
/// Look up a client by fingerprint.
|
|
pub fn get(&self, fp: &str) -> Option<&SignalClient> {
|
|
self.clients.get(fp)
|
|
}
|
|
|
|
/// Check if a fingerprint is online.
|
|
pub fn is_online(&self, fp: &str) -> bool {
|
|
self.clients.contains_key(fp)
|
|
}
|
|
|
|
/// Send a signal message to a client by fingerprint.
|
|
pub async fn send_to(&self, fp: &str, msg: &SignalMessage) -> Result<(), String> {
|
|
match self.clients.get(fp) {
|
|
Some(client) => {
|
|
client.transport.send_signal(msg).await
|
|
.map_err(|e| format!("send to {fp}: {e}"))
|
|
}
|
|
None => Err(format!("{fp} not online")),
|
|
}
|
|
}
|
|
|
|
/// Number of connected signaling clients.
|
|
pub fn online_count(&self) -> usize {
|
|
self.clients.len()
|
|
}
|
|
|
|
/// List all online fingerprints.
|
|
pub fn online_fingerprints(&self) -> Vec<&str> {
|
|
self.clients.keys().map(|s| s.as_str()).collect()
|
|
}
|
|
|
|
/// Get alias for a fingerprint.
|
|
pub fn alias(&self, fp: &str) -> Option<&str> {
|
|
self.clients.get(fp).and_then(|c| c.alias.as_deref())
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn register_unregister() {
|
|
let hub = SignalHub::new();
|
|
assert_eq!(hub.online_count(), 0);
|
|
assert!(!hub.is_online("alice"));
|
|
|
|
// Can't easily construct QuinnTransport in a unit test,
|
|
// so we just test the HashMap logic conceptually.
|
|
// Integration tests cover the full flow.
|
|
}
|
|
}
|