fix(proxy-engine): fix inbound route browser ringing and provider-facing SDP advertisement while preventing RTP port exhaustion

This commit is contained in:
2026-04-11 18:40:56 +00:00
parent 21ffc1d017
commit 81441e7853
17 changed files with 208 additions and 469 deletions

View File

@@ -10,7 +10,6 @@ mod audio_player;
mod call;
mod call_manager;
mod config;
mod dtmf;
mod ipc;
mod jitter_buffer;
mod leg_io;
@@ -140,7 +139,6 @@ async fn handle_command(
"configure" => handle_configure(engine, out_tx, &cmd).await,
"hangup" => handle_hangup(engine, out_tx, &cmd).await,
"make_call" => handle_make_call(engine, out_tx, &cmd).await,
"get_status" => handle_get_status(engine, out_tx, &cmd).await,
"add_leg" => handle_add_leg(engine, out_tx, &cmd).await,
"remove_leg" => handle_remove_leg(engine, out_tx, &cmd).await,
// WebRTC commands — lock webrtc only (no engine contention).
@@ -330,7 +328,7 @@ async fn handle_sip_packet(
..
} = *eng;
let rtp_pool = rtp_pool.as_mut().unwrap();
let call_id = call_mgr
let inbound = call_mgr
.create_inbound_call(
&msg,
from_addr,
@@ -344,7 +342,7 @@ async fn handle_sip_packet(
)
.await;
if let Some(call_id) = call_id {
if let Some(inbound) = inbound {
// Emit event so TypeScript knows about the call (for dashboard, IVR routing, etc).
let from_header = msg.get_header("From").unwrap_or("");
let from_uri = SipMessage::extract_uri(from_header).unwrap_or("Unknown");
@@ -357,10 +355,11 @@ async fn handle_sip_packet(
&eng.out_tx,
"incoming_call",
serde_json::json!({
"call_id": call_id,
"call_id": inbound.call_id,
"from_uri": from_uri,
"to_number": called_number,
"provider_id": provider_id,
"ring_browsers": inbound.ring_browsers,
}),
);
}
@@ -383,7 +382,7 @@ async fn handle_sip_packet(
let route_result = config_ref.resolve_outbound_route(
&dialed_number,
device_id.as_deref(),
&|pid: &str| {
&|_pid: &str| {
// Can't call async here — use a sync check.
// For now, assume all configured providers are available.
true
@@ -454,13 +453,6 @@ async fn handle_sip_packet(
);
}
/// Handle `get_status` — return active call statuses from Rust.
async fn handle_get_status(engine: Arc<Mutex<ProxyEngine>>, out_tx: &OutTx, cmd: &Command) {
let eng = engine.lock().await;
let calls = eng.call_mgr.get_all_statuses();
respond_ok(out_tx, &cmd.id, serde_json::json!({ "calls": calls }));
}
/// Handle `make_call` — initiate an outbound call to a number via a provider.
async fn handle_make_call(engine: Arc<Mutex<ProxyEngine>>, out_tx: &OutTx, cmd: &Command) {
let number = match cmd.params.get("number").and_then(|v| v.as_str()) {
@@ -665,6 +657,7 @@ async fn handle_webrtc_link(
webrtc_session_id: Some(session_id.clone()),
rtp_socket: None,
rtp_port: 0,
public_ip: None,
remote_media: None,
signaling_addr: None,
metadata: std::collections::HashMap::new(),
@@ -1116,6 +1109,7 @@ async fn handle_add_tool_leg(
webrtc_session_id: None,
rtp_socket: None,
rtp_port: 0,
public_ip: None,
remote_media: None,
signaling_addr: None,
metadata,