summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tools/repl/session.rs15
-rw-r--r--core/inspector.rs15
2 files changed, 22 insertions, 8 deletions
diff --git a/cli/tools/repl/session.rs b/cli/tools/repl/session.rs
index b636a4949..f67396d42 100644
--- a/cli/tools/repl/session.rs
+++ b/cli/tools/repl/session.rs
@@ -12,7 +12,9 @@ use deno_ast::DiagnosticsError;
use deno_ast::ImportsNotUsedAsValues;
use deno_ast::ModuleSpecifier;
use deno_core::error::AnyError;
+use deno_core::futures::channel::mpsc::UnboundedReceiver;
use deno_core::futures::FutureExt;
+use deno_core::futures::StreamExt;
use deno_core::serde_json;
use deno_core::serde_json::Value;
use deno_core::LocalInspectorSession;
@@ -92,6 +94,10 @@ pub struct ReplSession {
pub language_server: ReplLanguageServer,
has_initialized_node_runtime: bool,
referrer: ModuleSpecifier,
+ // FIXME(bartlomieju): this field should be used to listen
+ // for "exceptionThrown" notifications
+ #[allow(dead_code)]
+ notification_rx: UnboundedReceiver<Value>,
}
impl ReplSession {
@@ -113,8 +119,11 @@ impl ReplSession {
// 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 context_id: u64;
+ let mut notification_rx = session.take_notification_rx();
+
+ loop {
+ let notification = notification_rx.next().await.unwrap();
let method = notification.get("method").unwrap().as_str().unwrap();
let params = notification.get("params").unwrap();
if method == "Runtime.executionContextCreated" {
@@ -127,6 +136,7 @@ impl ReplSession {
.as_bool()
.unwrap());
context_id = context.get("id").unwrap().as_u64().unwrap();
+ break;
}
}
assert_ne!(context_id, 0);
@@ -141,6 +151,7 @@ impl ReplSession {
language_server,
has_initialized_node_runtime: false,
referrer,
+ notification_rx,
};
// inject prelude
diff --git a/core/inspector.rs b/core/inspector.rs
index b9a5908ed..0b04bf5f8 100644
--- a/core/inspector.rs
+++ b/core/inspector.rs
@@ -696,7 +696,8 @@ pub struct LocalInspectorSession {
v8_session_rx: UnboundedReceiver<InspectorMsg>,
response_tx_map: HashMap<i32, oneshot::Sender<serde_json::Value>>,
next_message_id: i32,
- notification_queue: Vec<Value>,
+ notification_tx: UnboundedSender<Value>,
+ notification_rx: Option<UnboundedReceiver<Value>>,
}
impl LocalInspectorSession {
@@ -707,19 +708,20 @@ impl LocalInspectorSession {
let response_tx_map = HashMap::new();
let next_message_id = 0;
- let notification_queue = Vec::new();
+ let (notification_tx, notification_rx) = mpsc::unbounded::<Value>();
Self {
v8_session_tx,
v8_session_rx,
response_tx_map,
next_message_id,
- notification_queue,
+ notification_tx,
+ notification_rx: Some(notification_rx),
}
}
- pub fn notifications(&mut self) -> Vec<Value> {
- self.notification_queue.split_off(0)
+ pub fn take_notification_rx(&mut self) -> UnboundedReceiver<Value> {
+ self.notification_rx.take().unwrap()
}
pub async fn post_message<T: serde::Serialize>(
@@ -795,7 +797,8 @@ impl LocalInspectorSession {
.unwrap();
} else {
let message = serde_json::from_str(&inspector_msg.content).unwrap();
- self.notification_queue.push(message);
+ // Ignore if the receiver has been dropped.
+ let _ = self.notification_tx.unbounded_send(message);
}
}
}