T3.3: SignalMessage version field

This commit is contained in:
Siavash Sameni
2026-05-12 06:08:31 +04:00
parent 1b4f7b0772
commit e73f8a7150
30 changed files with 531 additions and 69 deletions

View File

@@ -24,7 +24,7 @@
//! Bob's CallSetup carries Alice's reflex addr — cross-wired
//! through two relays + a federation link.
use wzp_proto::{CallAcceptMode, SignalMessage};
use wzp_proto::{CallAcceptMode, SignalMessage, default_signal_version};
use wzp_relay::call_registry::CallRegistry;
// ────────────────────────────────────────────────────────────────
@@ -42,6 +42,7 @@ const RELAY_B_ADDR: &str = "203.0.113.10:4433";
/// Helper that Alice's place_call sends.
fn alice_offer(call_id: &str) -> SignalMessage {
SignalMessage::DirectCallOffer {
version: default_signal_version(),
caller_fingerprint: "alice".into(),
caller_alias: None,
target_fingerprint: "bob".into(),
@@ -84,6 +85,7 @@ fn relay_a_handle_offer(reg_a: &mut CallRegistry, offer: &SignalMessage) -> Sign
// Build the federation envelope the main loop would
// broadcast.
SignalMessage::FederatedSignalForward {
version: default_signal_version(),
inner: Box::new(offer.clone()),
origin_relay_fp: RELAY_A_TLS_FP.into(),
}
@@ -97,6 +99,7 @@ fn relay_b_handle_forwarded_offer(reg_b: &mut CallRegistry, forward: &SignalMess
SignalMessage::FederatedSignalForward {
inner,
origin_relay_fp,
..
} => (inner.as_ref().clone(), origin_relay_fp.clone()),
_ => panic!("not a forward"),
};
@@ -123,6 +126,7 @@ fn relay_b_handle_forwarded_offer(reg_b: &mut CallRegistry, forward: &SignalMess
/// Bob's answer — AcceptTrusted with his reflex addr.
fn bob_answer(call_id: &str) -> SignalMessage {
SignalMessage::DirectCallAnswer {
version: default_signal_version(),
call_id: call_id.into(),
accept_mode: CallAcceptMode::AcceptTrusted,
identity_pub: None,
@@ -166,12 +170,14 @@ fn relay_b_handle_local_answer(
// Forward the answer back over federation.
let forward = SignalMessage::FederatedSignalForward {
version: default_signal_version(),
inner: Box::new(answer.clone()),
origin_relay_fp: RELAY_B_TLS_FP.into(),
};
// Local CallSetup for Bob — peer_direct_addr = Alice's addr.
let setup_for_bob = SignalMessage::CallSetup {
version: default_signal_version(),
call_id: call_id.clone(),
room: format!("call-{call_id}"),
relay_addr: RELAY_B_ADDR.into(),
@@ -194,6 +200,7 @@ fn relay_a_handle_forwarded_answer(
SignalMessage::FederatedSignalForward {
inner,
origin_relay_fp,
..
} => (inner.as_ref().clone(), origin_relay_fp.clone()),
_ => panic!("not a forward"),
};
@@ -215,6 +222,7 @@ fn relay_a_handle_forwarded_answer(
// Alice's CallSetup — peer_direct_addr = Bob's addr.
SignalMessage::CallSetup {
version: default_signal_version(),
call_id: call_id.clone(),
room: format!("call-{call_id}"),
relay_addr: RELAY_A_ADDR.into(),
@@ -312,6 +320,7 @@ fn cross_relay_loop_prevention_drops_self_sourced_forward() {
// A FederatedSignalForward that circles back to the origin
// relay should be dropped before it hits the call registry.
let forward = SignalMessage::FederatedSignalForward {
version: default_signal_version(),
inner: Box::new(alice_offer("c-loop")),
origin_relay_fp: RELAY_B_TLS_FP.into(),
};

View File

@@ -18,7 +18,7 @@ use std::sync::Arc;
use std::time::Duration;
use bytes::Bytes;
use wzp_proto::{MediaTransport, SignalMessage};
use wzp_proto::{MediaTransport, SignalMessage, default_signal_version};
use wzp_relay::config::{PeerConfig, TrustedConfig};
use wzp_relay::event_log::EventLogger;
use wzp_relay::federation::{FederationManager, room_hash};
@@ -348,7 +348,9 @@ async fn broadcast_signal_sends_to_all_peers() {
.expect("some message");
match hello {
SignalMessage::FederationHello { tls_fingerprint } => {
SignalMessage::FederationHello {
tls_fingerprint, ..
} => {
assert_eq!(tls_fingerprint, "test-relay-fp-abc123");
}
other => panic!(
@@ -367,6 +369,7 @@ async fn broadcast_signal_sends_to_all_peers() {
// Now call broadcast_signal on the FM
let test_msg = SignalMessage::FederatedSignalForward {
version: default_signal_version(),
inner: Box::new(SignalMessage::Reflect),
origin_relay_fp: "other-relay-fp".into(),
};

View File

@@ -9,7 +9,7 @@ use std::sync::Arc;
use wzp_client::perform_handshake;
use wzp_crypto::{KeyExchange, WarzoneKeyExchange};
use wzp_proto::{MediaTransport, SignalMessage};
use wzp_proto::{MediaTransport, SignalMessage, default_signal_version};
use wzp_relay::handshake::accept_handshake;
use wzp_transport::{QuinnTransport, client_config, create_endpoint, server_config};
@@ -129,6 +129,7 @@ async fn handshake_rejects_v1_protocol_version() {
let signature = kx.sign(&sign_data);
let v1_offer = SignalMessage::CallOffer {
version: 1,
identity_pub,
ephemeral_pub,
signature,
@@ -255,7 +256,7 @@ async fn auth_then_handshake() {
.expect("should receive a message");
let token = match auth_msg {
SignalMessage::AuthToken { token } => token,
SignalMessage::AuthToken { token, .. } => token,
other => panic!(
"expected AuthToken, got {:?}",
std::mem::discriminant(&other)
@@ -273,6 +274,7 @@ async fn auth_then_handshake() {
// Caller side: send AuthToken first, then perform_handshake.
let auth = SignalMessage::AuthToken {
version: default_signal_version(),
token: "bearer-test-token-12345".to_string(),
};
client_transport
@@ -344,6 +346,7 @@ async fn handshake_rejects_bad_signature() {
}
let bad_offer = SignalMessage::CallOffer {
version: default_signal_version(),
identity_pub,
ephemeral_pub,
signature,

View File

@@ -20,7 +20,7 @@
//! to reason about, no real network, and what we actually want to
//! test is the cross-wiring logic, not the whole signal stack.
use wzp_proto::{CallAcceptMode, SignalMessage};
use wzp_proto::{CallAcceptMode, SignalMessage, default_signal_version};
use wzp_relay::call_registry::CallRegistry;
/// Helper: simulate the relay's handling of a DirectCallOffer. In
@@ -77,6 +77,7 @@ fn handle_answer_and_build_setups(
};
let setup_for_caller = SignalMessage::CallSetup {
version: default_signal_version(),
call_id: call_id.clone(),
room: room.clone(),
relay_addr: "203.0.113.5:4433".into(),
@@ -85,6 +86,7 @@ fn handle_answer_and_build_setups(
peer_mapped_addr: None,
};
let setup_for_callee = SignalMessage::CallSetup {
version: default_signal_version(),
call_id,
room,
relay_addr: "203.0.113.5:4433".into(),
@@ -97,6 +99,7 @@ fn handle_answer_and_build_setups(
fn mk_offer(call_id: &str, caller_reflexive_addr: Option<&str>) -> SignalMessage {
SignalMessage::DirectCallOffer {
version: default_signal_version(),
caller_fingerprint: "alice".into(),
caller_alias: None,
target_fingerprint: "bob".into(),
@@ -118,6 +121,7 @@ fn mk_answer(
callee_reflexive_addr: Option<&str>,
) -> SignalMessage {
SignalMessage::DirectCallAnswer {
version: default_signal_version(),
call_id: call_id.into(),
accept_mode: mode,
identity_pub: None,

View File

@@ -63,6 +63,7 @@ async fn spawn_mock_relay() -> (SocketAddr, tokio::task::JoinHandle<()>) {
Ok(Some(SignalMessage::RegisterPresence { .. })) => {
let _ = t
.send_signal(&SignalMessage::RegisterPresenceAck {
version: 1,
success: true,
error: None,
relay_build: None,
@@ -74,6 +75,7 @@ async fn spawn_mock_relay() -> (SocketAddr, tokio::task::JoinHandle<()>) {
Ok(Some(SignalMessage::Reflect)) => {
let _ = t
.send_signal(&SignalMessage::ReflectResponse {
version: 1,
observed_addr: observed_addr.to_string(),
})
.await;

View File

@@ -30,7 +30,7 @@ use std::net::{Ipv4Addr, SocketAddr};
use std::sync::Arc;
use std::time::Duration;
use wzp_proto::{MediaTransport, SignalMessage};
use wzp_proto::{MediaTransport, SignalMessage, default_signal_version};
use wzp_transport::{QuinnTransport, client_config, create_endpoint, server_config};
/// Spawn a minimal mock relay that loops over `recv_signal`,
@@ -49,6 +49,7 @@ async fn spawn_mock_relay_with_reflect(
match server_transport.recv_signal().await {
Ok(Some(SignalMessage::Reflect)) => {
let resp = SignalMessage::ReflectResponse {
version: default_signal_version(),
observed_addr: observed.to_string(),
};
// If the send fails the client has gone; just exit.
@@ -164,7 +165,7 @@ async fn reflect_happy_path() {
.expect("some message");
let observed_addr = match resp {
SignalMessage::ReflectResponse { observed_addr } => observed_addr,
SignalMessage::ReflectResponse { observed_addr, .. } => observed_addr,
other => panic!(
"expected ReflectResponse, got {:?}",
std::mem::discriminant(&other)
@@ -251,7 +252,7 @@ async fn reflect_two_clients_distinct_ports() {
.expect("ok")
.expect("some");
match resp {
SignalMessage::ReflectResponse { observed_addr } => observed_addr,
SignalMessage::ReflectResponse { observed_addr, .. } => observed_addr,
_ => panic!("wrong variant"),
}
};