From fa80649926bd492b739b4d509008b38c27eeab06 Mon Sep 17 00:00:00 2001 From: Casper Beyer Date: Mon, 12 Oct 2020 01:49:55 +0800 Subject: [PATCH] refactor(cli/repl): get context id from notification (#7864) This takes the execution context id from a notification which is sent on Runtime.enable rather than hard-coding it to a magic value. --- cli/inspector.rs | 14 +++++++++++++- cli/repl.rs | 22 +++++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/cli/inspector.rs b/cli/inspector.rs index 3cc3bf5665..1a916c7c7a 100644 --- a/cli/inspector.rs +++ b/cli/inspector.rs @@ -826,6 +826,7 @@ pub struct InspectorSession { v8_session: v8::UniqueRef, response_tx_map: HashMap>, next_message_id: i32, + notification_queue: Vec, } impl Deref for InspectorSession { @@ -868,8 +869,12 @@ impl v8::inspector::ChannelImpl for InspectorSession { fn send_notification( &mut self, - _message: v8::UniquePtr, + message: v8::UniquePtr, ) { + let raw_message = message.unwrap().string().to_string(); + let message = serde_json::from_str(&raw_message).unwrap(); + + self.notification_queue.push(message); } fn flush_protocol_notifications(&mut self) {} @@ -890,15 +895,22 @@ impl InspectorSession { let response_tx_map = HashMap::new(); let next_message_id = 0; + let notification_queue = Vec::new(); + Self { v8_channel, v8_session, response_tx_map, next_message_id, + notification_queue, } }) } + pub fn notifications(&mut self) -> Vec { + self.notification_queue.split_off(0) + } + pub async fn post_message( &mut self, method: &str, diff --git a/cli/repl.rs b/cli/repl.rs index c5107d5af6..697f679f6e 100644 --- a/cli/repl.rs +++ b/cli/repl.rs @@ -89,9 +89,6 @@ pub async fn run( global_state: &GlobalState, mut worker: MainWorker, ) -> Result<(), AnyError> { - // Our inspector is unable to default to the default context id so we have to specify it here. - let context_id: u32 = 1; - let mut session = worker.create_inspector_session(); let history_file = global_state.dir.root.join("deno_history.txt"); @@ -99,6 +96,25 @@ pub async fn run( post_message_and_poll(&mut *worker, &mut session, "Runtime.enable", None) .await?; + // Enabling the runtime domain will always send trigger one executionContextCreated for each + // context the inspector knows about so we grab the execution context from that since + // our inspector does not support a default context (0 is an invalid context id). + let mut context_id: u64 = 0; + for notification in session.notifications() { + let method = notification.get("method").unwrap().as_str().unwrap(); + let params = notification.get("params").unwrap(); + + if method == "Runtime.executionContextCreated" { + context_id = params + .get("context") + .unwrap() + .get("id") + .unwrap() + .as_u64() + .unwrap(); + } + } + let helper = Helper { validator: MatchingBracketValidator::new(), };