diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2024-04-12 00:17:10 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-12 01:17:10 +0200 |
commit | f358ae627843182fb6aad69dae74f6d29788956b (patch) | |
tree | b955ef5495bd7c7705aa9dbc909966962d44015f /runtime/inspector_server.rs | |
parent | ade0cd5e97e25896457624a0ec6bf524a5fa5c20 (diff) |
fix(inspector): don't panic if port is not free (#22745)
Closes https://github.com/denoland/deno/issues/22113
Closes https://github.com/denoland/deno/issues/23177
Closes https://github.com/denoland/deno/issues/22883
Closes https://github.com/denoland/deno/issues/22377
Diffstat (limited to 'runtime/inspector_server.rs')
-rw-r--r-- | runtime/inspector_server.rs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/runtime/inspector_server.rs b/runtime/inspector_server.rs index 8a90ed463..8d93819e9 100644 --- a/runtime/inspector_server.rs +++ b/runtime/inspector_server.rs @@ -2,6 +2,8 @@ // Alias for the future `!` type. use core::convert::Infallible as Never; +use deno_core::anyhow::Context; +use deno_core::error::AnyError; use deno_core::futures::channel::mpsc; use deno_core::futures::channel::mpsc::UnboundedReceiver; use deno_core::futures::channel::mpsc::UnboundedSender; @@ -45,27 +47,38 @@ pub struct InspectorServer { } impl InspectorServer { - pub fn new(host: SocketAddr, name: &'static str) -> Self { + pub fn new(host: SocketAddr, name: &'static str) -> Result<Self, AnyError> { let (register_inspector_tx, register_inspector_rx) = mpsc::unbounded::<InspectorInfo>(); let (shutdown_server_tx, shutdown_server_rx) = broadcast::channel(1); + let tcp_listener = + std::net::TcpListener::bind(host).with_context(|| { + format!("Failed to start inspector server at \"{}\"", host) + })?; + tcp_listener.set_nonblocking(true)?; + let thread_handle = thread::spawn(move || { let rt = crate::tokio_util::create_basic_runtime(); let local = tokio::task::LocalSet::new(); local.block_on( &rt, - server(host, register_inspector_rx, shutdown_server_rx, name), + server( + tcp_listener, + register_inspector_rx, + shutdown_server_rx, + name, + ), ) }); - Self { + Ok(Self { host, register_inspector_tx, shutdown_server_tx: Some(shutdown_server_tx), thread_handle: Some(thread_handle), - } + }) } pub fn register_inspector( @@ -220,7 +233,7 @@ fn handle_json_version_request( } async fn server( - host: SocketAddr, + listener: std::net::TcpListener, register_inspector_rx: UnboundedReceiver<InspectorInfo>, shutdown_server_rx: broadcast::Receiver<()>, name: &str, @@ -261,7 +274,7 @@ async fn server( }); // Create the server manually so it can use the Local Executor - let listener = match TcpListener::bind(&host).await { + let listener = match TcpListener::from_std(listener) { Ok(l) => l, Err(err) => { eprintln!("Cannot start inspector server: {:?}", err); |