use crate::api::unified::{BridgeError, BridgeHandle, UnifiedCoordinator};
use crate::server::bridge::sip_bridge;
use crate::SessionId;
use std::sync::Arc;
#[derive(Debug, thiserror::Error)]
pub enum B2buaError {
#[error("session error: {0}")]
Session(#[from] crate::errors::SessionError),
#[error("bridge error: {0}")]
Bridge(BridgeError),
}
impl From<BridgeError> for B2buaError {
fn from(err: BridgeError) -> Self {
B2buaError::Bridge(err)
}
}
#[derive(Clone)]
pub struct SipB2bua {
coordinator: Arc<UnifiedCoordinator>,
}
impl SipB2bua {
pub fn new(coordinator: Arc<UnifiedCoordinator>) -> Self {
Self { coordinator }
}
pub async fn handle_inbound(
&self,
from_uri: &str,
incoming: &SessionId,
target_uri: &str,
) -> Result<BridgeHandle, B2buaError> {
self.coordinator.accept_call(incoming).await?;
let outbound = self
.coordinator
.invite(Some(from_uri.to_string()), target_uri.to_string())
.send()
.await?;
let handle = sip_bridge(&self.coordinator, incoming, &outbound).await?;
Ok(handle)
}
}