v0.0.21: WZP integration groundwork — CallSignal + token validation

WZP-FC-1: CallSignal WireMessage variant
- CallSignalType enum: Offer, Answer, IceCandidate, Hangup, Reject, Ringing, Busy
- Routed through existing E2E encrypted channels
- Server dedup handles new variant
- TUI shows "📞 Call signal: Offer" etc
- CLI recv prints call signals

WZP-FC-4: Token validation endpoint
- POST /v1/auth/validate { "token": "..." }
- Returns: { "valid": true, "fingerprint": "...", "alias": "..." }
- WZP relay calls this to verify featherChat bearer tokens
- Resolves alias alongside fingerprint

These two unblock WZP integration tasks WZP-S-2 (accept FC tokens)
and WZP-S-3 (signaling bridge mode).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Siavash Sameni
2026-03-28 09:13:23 +04:00
parent 65f639052e
commit 064a730b42
8 changed files with 97 additions and 8 deletions

View File

@@ -129,6 +129,9 @@ pub async fn run(server_url: &str, identity: &IdentityKeyPair) -> Result<()> {
Ok(WireMessage::SenderKeyDistribution { sender_fingerprint, group_name, .. }) => {
println!(" [sender key] received key from {} for #{}", sender_fingerprint, group_name);
}
Ok(WireMessage::CallSignal { sender_fingerprint, signal_type, target, .. }) => {
println!(" [call] {:?} from {}{}", signal_type, sender_fingerprint, target);
}
Err(e) => {
eprintln!(" failed to deserialize message: {}", e);
}

View File

@@ -1542,6 +1542,22 @@ fn process_wire_message(
message_id: None,
});
}
WireMessage::CallSignal {
id: _,
sender_fingerprint,
signal_type,
payload: _,
target: _,
} => {
let type_str = format!("{:?}", signal_type);
messages.lock().unwrap().push(ChatLine {
sender: sender_fingerprint[..sender_fingerprint.len().min(12)].to_string(),
text: format!("📞 Call signal: {}", type_str),
is_system: false,
is_self: false,
message_id: None,
});
}
}
}