@@ -41,9 +41,8 @@ pub struct AppStateInner {
4141 pub token : CancellationToken ,
4242 pub active_calls : Arc < Mutex < HashMap < String , ActiveCallRef > > > ,
4343 pub stream_engine : Arc < StreamEngine > ,
44- pub callrecord_sender : tokio :: sync :: Mutex < Option < CallRecordSender > > ,
44+ pub callrecord_sender : Option < CallRecordSender > ,
4545 pub routing_state : Arc < RoutingState > ,
46- pub sip_server : Option < SipServer > ,
4746 pub total_calls : AtomicU64 ,
4847 pub total_failed_calls : AtomicU64 ,
4948 pub uptime : DateTime < Utc > ,
@@ -133,7 +132,7 @@ impl AppStateBuilder {
133132 self
134133 }
135134
136- pub async fn build ( self ) -> Result < AppState > {
135+ pub async fn build ( self ) -> Result < ( AppState , Option < SipServer > ) > {
137136 let config: Arc < Config > = Arc :: new ( self . config . unwrap_or_default ( ) ) ;
138137 let token = self
139138 . cancel_token
@@ -157,57 +156,61 @@ impl AppStateBuilder {
157156 } ;
158157 let stream_engine = self . stream_engine . unwrap_or_default ( ) ;
159158
160- let proxy_builder = match self . proxy_builder {
161- Some ( builder) => Some ( builder) ,
159+ let callrecord_sender = if let Some ( sender) = self . callrecord_sender {
160+ Some ( sender)
161+ } else {
162+ if let Some ( ref callrecord) = config. callrecord {
163+ let mut callrecord_manager = CallRecordManagerBuilder :: new ( )
164+ . with_cancel_token ( token. child_token ( ) )
165+ . with_config ( callrecord. clone ( ) )
166+ . build ( ) ;
167+ let sender = callrecord_manager. sender . clone ( ) ;
168+ tokio:: spawn ( async move {
169+ callrecord_manager. serve ( ) . await ;
170+ } ) ;
171+ Some ( sender)
172+ } else {
173+ None
174+ }
175+ } ;
176+ let app_state = Arc :: new ( AppStateInner {
177+ config : config. clone ( ) ,
178+ useragent,
179+ token : token. clone ( ) ,
180+ active_calls : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
181+ stream_engine,
182+ callrecord_sender : callrecord_sender. clone ( ) ,
183+ routing_state : Arc :: new ( RoutingState :: new ( ) ) ,
184+ total_calls : AtomicU64 :: new ( 0 ) ,
185+ total_failed_calls : AtomicU64 :: new ( 0 ) ,
186+ uptime : chrono:: Utc :: now ( ) ,
187+ } ) ;
188+
189+ let sip_server = match self . proxy_builder {
190+ Some ( builder) => builder. build ( app_state. clone ( ) ) . await . ok ( ) ,
162191 None => {
163192 if let Some ( proxy_config) = config. proxy . clone ( ) {
164193 let proxy_config = Arc :: new ( proxy_config) ;
165194 let builder = SipServerBuilder :: new ( proxy_config)
166195 . with_cancel_token ( token. child_token ( ) )
167- . with_callrecord_sender ( self . callrecord_sender . clone ( ) )
196+ . with_callrecord_sender ( callrecord_sender. clone ( ) )
168197 . register_module ( "acl" , AclModule :: create)
169198 . register_module ( "auth" , AuthModule :: create)
170199 . register_module ( "registrar" , RegistrarModule :: create)
171200 . register_module ( "call" , CallModule :: create) ;
172- Some ( builder)
201+ builder. build ( app_state . clone ( ) ) . await . ok ( )
173202 } else {
174203 None
175204 }
176205 }
177206 } ;
178207
179- let sip_server = if let Some ( proxy_builder) = proxy_builder {
180- match proxy_builder. build ( ) . await {
181- Ok ( server) => Some ( server) ,
182- Err ( e) => {
183- warn ! ( "Failed to build proxy server: {}" , e) ;
184- return Err ( anyhow:: anyhow!( "{}" , e) ) ;
185- }
186- }
187- } else {
188- None
189- } ;
190-
191- Ok ( Arc :: new ( AppStateInner {
192- config,
193- useragent,
194- token,
195- active_calls : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
196- stream_engine,
197- callrecord_sender : Mutex :: new ( self . callrecord_sender ) ,
198- routing_state : Arc :: new ( RoutingState :: new ( ) ) ,
199- sip_server,
200- total_calls : AtomicU64 :: new ( 0 ) ,
201- total_failed_calls : AtomicU64 :: new ( 0 ) ,
202- uptime : chrono:: Utc :: now ( ) ,
203- } ) )
208+ Ok ( ( app_state, sip_server) )
204209 }
205210}
206211
207- pub async fn run ( state : AppState ) -> Result < ( ) > {
208- let ua = state. useragent . clone ( ) ;
212+ pub async fn run ( state : AppState , sip_server : Option < SipServer > ) -> Result < ( ) > {
209213 let token = state. token . clone ( ) ;
210-
211214 let mut router = create_router ( state. clone ( ) ) ;
212215 let addr: SocketAddr = state. config . http_addr . parse ( ) ?;
213216 let listener = match TcpListener :: bind ( addr) . await {
@@ -218,29 +221,14 @@ pub async fn run(state: AppState) -> Result<()> {
218221 }
219222 } ;
220223
221- if let Some ( ref callrecord) = state. config . callrecord {
222- let mut callrecord_sender = state. callrecord_sender . lock ( ) . await ;
223- if callrecord_sender. is_none ( ) {
224- let mut callrecord_manager = CallRecordManagerBuilder :: new ( )
225- . with_cancel_token ( token. child_token ( ) )
226- . with_config ( callrecord. clone ( ) )
227- . build ( ) ;
228- callrecord_sender. replace ( callrecord_manager. sender . clone ( ) ) ;
229-
230- tokio:: spawn ( async move {
231- callrecord_manager. serve ( ) . await ;
232- } ) ;
233- }
234- }
235-
236- if let Some ( sip_server) = state. sip_server . clone ( ) {
224+ if let Some ( sip_server) = sip_server {
237225 if let Some ( ref ws_handler) = sip_server. inner . config . ws_handler {
238226 info ! (
239227 "Registering WebSocket handler to sip server: {}" ,
240228 ws_handler
241229 ) ;
242230 let endpoint_ref = sip_server. inner . endpoint . inner . clone ( ) ;
243- let token = sip_server . inner . cancel_token . clone ( ) ;
231+ let token = token . clone ( ) ;
244232 router = router. route (
245233 ws_handler,
246234 axum:: routing:: get (
@@ -278,7 +266,7 @@ pub async fn run(state: AppState) -> Result<()> {
278266 }
279267 }
280268 }
281- ua_result = ua . serve( ) => {
269+ ua_result = state . useragent . serve( ) => {
282270 if let Err ( e) = ua_result {
283271 tracing:: error!( "User agent server error: {}" , e) ;
284272 return Err ( anyhow:: anyhow!( "User agent server error: {}" , e) ) ;
@@ -288,7 +276,6 @@ pub async fn run(state: AppState) -> Result<()> {
288276 info!( "Application shutting down due to cancellation" ) ;
289277 }
290278 }
291- token. cancel ( ) ;
292279 state. useragent . stop ( ) ;
293280 Ok ( ( ) )
294281}
0 commit comments