Skip to content

Commit 1949cc4

Browse files
committed
fix: connect_bridge non-blocking, spawn monitor for return_ivr [latest]
1 parent 086ad72 commit 1949cc4

1 file changed

Lines changed: 28 additions & 24 deletions

File tree

src/proxy/proxy_call/sip_session/transfer.rs

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -836,34 +836,38 @@ impl SipSession {
836836
conf_id: Some(format!("bridge-{}", self.id.0)),
837837
};
838838

839-
info!(%leg_id, endpoint = %endpoint, "Bridge established");
840-
841-
// ── 9. Wait for bridge to disconnect ─────────────────────────
842-
let bridge_done = async {
843-
let _ = forward_handle.await;
844-
let _ = reverse_handle.await;
845-
};
846-
tokio::pin!(bridge_done);
847-
848-
tokio::select! {
849-
_ = self.cancel_token.cancelled() => {
850-
info!(%leg_id, "Session cancelled while bridge active");
851-
}
852-
_ = &mut bridge_done => {
853-
info!(%leg_id, "Bridge disconnected");
854-
}
855-
}
856-
857-
self.conference_bridge.stop_bridge();
858-
859-
// ── 10. Return to IVR if configured ──────────────────────────
839+
// ── 9. Spawn monitor for return_ivr if configured ────────────
860840
if let Some(ref ivr_name) = return_ivr {
861-
if !self.cancel_token.is_cancelled() {
862-
info!(%leg_id, ivr = %ivr_name, "Bridge disconnected; returning to IVR");
863-
self.start_ivr_app(ivr_name, HashMap::new()).await?;
841+
if let Some(ref cmd_tx) = self.cmd_tx {
842+
let cancel = self.cancel_token.child_token();
843+
let ivr_target = format!("ivr:{}", ivr_name);
844+
let tx = cmd_tx.clone();
845+
let mon_leg_id = leg_id.clone();
846+
let mon = crate::utils::spawn(async move {
847+
tokio::select! {
848+
biased;
849+
_ = cancel.cancelled() => {}
850+
_ = async {
851+
let _ = forward_handle.await;
852+
let _ = reverse_handle.await;
853+
} => {
854+
if !cancel.is_cancelled() {
855+
info!("Bridge disconnected; returning to IVR: {}", ivr_target);
856+
let cmd = CallCommand::Transfer {
857+
leg_id: mon_leg_id,
858+
target: ivr_target,
859+
attended: false,
860+
};
861+
let _ = tx.send(cmd).await;
862+
}
863+
}
864+
}
865+
});
866+
self.legs.tasks.entry(leg_id.clone()).or_default().push(mon);
864867
}
865868
}
866869

870+
info!(%leg_id, endpoint = %endpoint, "Bridge established");
867871
Ok(())
868872
}
869873

0 commit comments

Comments
 (0)