summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/inspector.rs18
-rw-r--r--core/runtime.rs11
2 files changed, 27 insertions, 2 deletions
diff --git a/core/inspector.rs b/core/inspector.rs
index daedd291d..e3db65afe 100644
--- a/core/inspector.rs
+++ b/core/inspector.rs
@@ -150,6 +150,7 @@ impl JsRuntimeInspector {
pub fn new(
isolate: &mut v8::OwnedIsolate,
context: v8::Global<v8::Context>,
+ is_main: bool,
) -> Rc<RefCell<Self>> {
let scope = &mut v8::HandleScope::new(isolate);
@@ -183,13 +184,26 @@ impl JsRuntimeInspector {
// Tell the inspector about the global context.
let context = v8::Local::new(scope, context);
let context_name = v8::inspector::StringView::from(&b"global context"[..]);
- let aux_data = v8::inspector::StringView::from(&b""[..]);
+ // NOTE(bartlomieju): this is what Node.js does and it turns out some
+ // debuggers (like VSCode) rely on this information to disconnect after
+ // program completes
+ let aux_data = if is_main {
+ r#"{"isDefault": true}"#
+ } else {
+ r#"{"isDefault": false}"#
+ };
+ let aux_data_view = v8::inspector::StringView::from(aux_data.as_bytes());
self_
.v8_inspector
.borrow_mut()
.as_mut()
.unwrap()
- .context_created(context, Self::CONTEXT_GROUP_ID, context_name, aux_data);
+ .context_created(
+ context,
+ Self::CONTEXT_GROUP_ID,
+ context_name,
+ aux_data_view,
+ );
// Poll the session handler so we will get notified whenever there is
// new incoming debugger activity.
diff --git a/core/runtime.rs b/core/runtime.rs
index b1ce14883..8cb38de2f 100644
--- a/core/runtime.rs
+++ b/core/runtime.rs
@@ -88,6 +88,8 @@ pub struct JsRuntime {
allocations: IsolateAllocations,
extensions: Vec<Extension>,
event_loop_middlewares: Vec<Box<OpEventLoopFn>>,
+ // Marks if this is considered the top-level runtime. Used only be inspector.
+ is_main: bool,
}
pub(crate) struct DynImportModEvaluate {
@@ -274,7 +276,13 @@ pub struct RuntimeOptions {
/// [CompiledWasmModuleStore]. If no [CompiledWasmModuleStore] is specified,
/// `WebAssembly.Module` objects cannot be serialized.
pub compiled_wasm_module_store: Option<CompiledWasmModuleStore>,
+
+ /// Start inspector instance to allow debuggers to connect.
pub inspector: bool,
+
+ /// Describe if this is the main runtime instance, used by debuggers in some
+ /// situation - like disconnecting when program finishes running.
+ pub is_main: bool,
}
#[derive(Copy, Clone, PartialEq, Eq)]
@@ -498,6 +506,7 @@ impl JsRuntime {
Some(JsRuntimeInspector::new(
&mut isolate,
global_context.clone(),
+ options.is_main,
))
} else {
None
@@ -532,6 +541,7 @@ impl JsRuntime {
extensions: options.extensions,
state: state_rc,
module_map: Some(module_map_rc),
+ is_main: options.is_main,
};
// Init resources and ops before extensions to make sure they are
@@ -949,6 +959,7 @@ impl JsRuntime {
state.inspector = Some(JsRuntimeInspector::new(
self.v8_isolate.as_mut().unwrap(),
state.global_realm.clone().unwrap().0,
+ self.is_main,
));
}