summaryrefslogtreecommitdiff
path: root/runtime/inspector_server.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2024-04-12 00:17:10 +0100
committerGitHub <noreply@github.com>2024-04-12 01:17:10 +0200
commitf358ae627843182fb6aad69dae74f6d29788956b (patch)
treeb955ef5495bd7c7705aa9dbc909966962d44015f /runtime/inspector_server.rs
parentade0cd5e97e25896457624a0ec6bf524a5fa5c20 (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.rs25
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);