From 8c48402585eda3561d61391af60dbae694ffca0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= <55464917+jlucaso1@users.noreply.github.com> Date: Thu, 16 Jul 2026 22:25:25 -0300 Subject: [PATCH 1/3] fix(voip): serialize video upgrade transitions --- Cargo.toml | 2 +- examples/voip-cli/src/main.rs | 90 +++++-- src/client/voip.rs | 4 + src/handlers/call.rs | 288 ++++++++++++++++------ src/voip/facade.rs | 406 +++++++++++++++++++++++++----- src/voip/mod.rs | 2 +- wacore/src/types/call.rs | 30 +++ wacore/src/voip/engine.rs | 6 +- wacore/src/voip/mod.rs | 2 +- wacore/src/voip/registry.rs | 451 ++++++++++++++++++++++++++++++++++ 10 files changed, 1118 insertions(+), 163 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cf9aedf55..7579620f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -221,7 +221,7 @@ hmac = { workspace = true } libc = "0.2" metrics-exporter-prometheus = "0.18" sha2 = { workspace = true } -tokio = { workspace = true, features = ["full"] } +tokio = { workspace = true, features = ["full", "test-util"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] } uuid = { workspace = true, features = ["v4"] } wacore = { workspace = true, features = ["test-util"] } diff --git a/examples/voip-cli/src/main.rs b/examples/voip-cli/src/main.rs index b35eba802..9ab93b6f9 100644 --- a/examples/voip-cli/src/main.rs +++ b/examples/voip-cli/src/main.rs @@ -55,7 +55,7 @@ use whatsapp_rust::voip::audio::{WaOpusDecoder, WaOpusEncoder}; use whatsapp_rust::voip::session::{MediaPipeline, MediaPipelineParams}; #[cfg(feature = "voip-opus")] use whatsapp_rust::voip::{AudioCodec, EncodedAudioFrame}; -use whatsapp_rust::voip::{AudioFormat, CallHandle, VideoState}; +use whatsapp_rust::voip::{AudioFormat, CallHandle, VideoState, VideoUpgradeToken}; mod video; use video::VideoOpts; @@ -977,7 +977,7 @@ struct CallState { #[derive(Clone, Copy, PartialEq)] enum VideoUi { /// The peer asked for video (`UpgradeRequestV2`); `v` accepts it. - PendingPeerRequest, + PendingPeerRequest(VideoUpgradeToken), /// Our video plane is up; `v` downgrades. Active, } @@ -1080,12 +1080,14 @@ impl EventHandler for CallObserver { let audio = self.audio; // Only answer with video when we're allowed to AND the offer is actually a video // call; advertising `