diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/inspector.rs | 18 | ||||
-rw-r--r-- | core/runtime.rs | 11 |
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, )); } |