Skip to content

Commit

Permalink
refactor(cli/repl): get context id from notification (denoland#7864)
Browse files Browse the repository at this point in the history
This takes the execution context id from a notification which is sent on
Runtime.enable rather than hard-coding it to a magic value.
  • Loading branch information
caspervonb committed Oct 11, 2020
1 parent 527628e commit fa80649
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
14 changes: 13 additions & 1 deletion cli/inspector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,7 @@ pub struct InspectorSession {
v8_session: v8::UniqueRef<v8::inspector::V8InspectorSession>,
response_tx_map: HashMap<i32, oneshot::Sender<serde_json::Value>>,
next_message_id: i32,
notification_queue: Vec<Value>,
}

impl Deref for InspectorSession {
Expand Down Expand Up @@ -868,8 +869,12 @@ impl v8::inspector::ChannelImpl for InspectorSession {

fn send_notification(
&mut self,
_message: v8::UniquePtr<v8::inspector::StringBuffer>,
message: v8::UniquePtr<v8::inspector::StringBuffer>,
) {
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) {}
Expand All @@ -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<Value> {
self.notification_queue.split_off(0)
}

pub async fn post_message(
&mut self,
method: &str,
Expand Down
22 changes: 19 additions & 3 deletions cli/repl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,32 @@ 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");

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(),
};
Expand Down

0 comments on commit fa80649

Please sign in to comment.