@@ -30,17 +30,10 @@ struct State {
3030 tx : Sender < ( ) > ,
3131}
3232
33- pub fn start_dev_server < P : AsRef < Path > > ( path : P , port : Option < u16 > ) -> SocketAddr {
33+ pub fn start_dev_server < P : AsRef < Path > > ( path : P , port : Option < u16 > ) -> crate :: Result < SocketAddr > {
3434 let serve_dir = path. as_ref ( ) . to_path_buf ( ) ;
35- let server_url = SocketAddr :: new (
36- Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) . into ( ) ,
37- port. unwrap_or_else ( || {
38- std:: env:: var ( "TAURI_DEV_SERVER_PORT" )
39- . unwrap_or_else ( |_| "1430" . to_string ( ) )
40- . parse ( )
41- . unwrap ( )
42- } ) ,
43- ) ;
35+
36+ let ( server_url_tx, server_url_rx) = std:: sync:: mpsc:: channel ( ) ;
4437
4538 std:: thread:: spawn ( move || {
4639 tokio:: runtime:: Builder :: new_current_thread ( )
@@ -91,14 +84,50 @@ pub fn start_dev_server<P: AsRef<Path>>(path: P, port: Option<u16>) -> SocketAdd
9184 ws. on_upgrade ( |socket| async move { ws_handler ( socket, state) . await } )
9285 } ) ,
9386 ) ;
94- Server :: bind ( & server_url)
95- . serve ( router. into_make_service ( ) )
96- . await
97- . unwrap ( ) ;
87+
88+ let mut auto_port = false ;
89+ let mut port = port. unwrap_or_else ( || {
90+ std:: env:: var ( "TAURI_DEV_SERVER_PORT" )
91+ . unwrap_or_else ( |_| {
92+ auto_port = true ;
93+ "1430" . to_string ( )
94+ } )
95+ . parse ( )
96+ . unwrap ( )
97+ } ) ;
98+
99+ let ( server, server_url) = loop {
100+ let server_url = SocketAddr :: new ( Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) . into ( ) , port) ;
101+ let server = Server :: try_bind ( & server_url) ;
102+
103+ if !auto_port {
104+ break ( server, server_url) ;
105+ }
106+
107+ if server. is_ok ( ) {
108+ break ( server, server_url) ;
109+ }
110+
111+ port += 1 ;
112+ } ;
113+
114+ match server {
115+ Ok ( server) => {
116+ server_url_tx. send ( Ok ( server_url) ) . unwrap ( ) ;
117+ server. serve ( router. into_make_service ( ) ) . await . unwrap ( ) ;
118+ }
119+ Err ( e) => {
120+ server_url_tx
121+ . send ( Err ( anyhow:: anyhow!(
122+ "failed to start development server on {server_url}: {e}"
123+ ) ) )
124+ . unwrap ( ) ;
125+ }
126+ }
98127 } )
99128 } ) ;
100129
101- server_url
130+ server_url_rx . recv ( ) . unwrap ( )
102131}
103132
104133async fn handler < T > ( req : Request < T > , state : Arc < State > ) -> impl IntoResponse {
0 commit comments