From a01c55e38d40b2228098c315c0bc83dcf6d4d834 Mon Sep 17 00:00:00 2001 From: Kevin Yue Date: Sun, 19 May 2024 10:19:21 +0800 Subject: [PATCH] fix: do not panic when failed to start service (fix #362) --- apps/gpservice/src/ws_server.rs | 47 +++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/apps/gpservice/src/ws_server.rs b/apps/gpservice/src/ws_server.rs index 7bdb328..5d550eb 100644 --- a/apps/gpservice/src/ws_server.rs +++ b/apps/gpservice/src/ws_server.rs @@ -118,28 +118,41 @@ impl WsServer { } pub async fn start(&self, shutdown_tx: mpsc::Sender<()>) { - if let Ok(listener) = TcpListener::bind("127.0.0.1:0").await { - let local_addr = listener.local_addr().unwrap(); - - self.lock_file.lock(local_addr.port().to_string()).unwrap(); - - info!("WS server listening on port: {}", local_addr.port()); - - tokio::select! { - _ = watch_vpn_state(self.ctx.vpn_state_rx(), Arc::clone(&self.ctx)) => { - info!("VPN state watch task completed"); - } - _ = start_server(listener, self.ctx.clone()) => { - info!("WS server stopped"); - } - _ = self.cancel_token.cancelled() => { - info!("WS server cancelled"); - } + let listener = match self.start_tcp_server().await { + Ok(listener) => listener, + Err(err) => { + warn!("Failed to start WS server: {}", err); + let _ = shutdown_tx.send(()).await; + return; + }, + }; + + tokio::select! { + _ = watch_vpn_state(self.ctx.vpn_state_rx(), Arc::clone(&self.ctx)) => { + info!("VPN state watch task completed"); + } + _ = start_server(listener, self.ctx.clone()) => { + info!("WS server stopped"); + } + _ = self.cancel_token.cancelled() => { + info!("WS server cancelled"); } } let _ = shutdown_tx.send(()).await; } + + async fn start_tcp_server(&self) -> anyhow::Result { + let listener = TcpListener::bind("127.0.0.1:0").await?; + let local_addr = listener.local_addr()?; + let port = local_addr.port(); + + info!("WS server listening on port: {}", port); + + self.lock_file.lock(port.to_string())?; + + Ok(listener) + } } async fn watch_vpn_state(mut vpn_state_rx: watch::Receiver, ctx: Arc) {