diff options
Diffstat (limited to 'cli/tools/repl/session.rs')
-rw-r--r-- | cli/tools/repl/session.rs | 148 |
1 files changed, 94 insertions, 54 deletions
diff --git a/cli/tools/repl/session.rs b/cli/tools/repl/session.rs index 5d458189f..57109eb1d 100644 --- a/cli/tools/repl/session.rs +++ b/cli/tools/repl/session.rs @@ -1,12 +1,13 @@ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. +use crate::cdp; use crate::colors; use crate::lsp::ReplLanguageServer; use deno_ast::DiagnosticsError; use deno_ast::ImportsNotUsedAsValues; use deno_core::error::AnyError; use deno_core::futures::FutureExt; -use deno_core::serde_json::json; +use deno_core::serde_json; use deno_core::serde_json::Value; use deno_core::LocalInspectorSession; use deno_runtime::worker::MainWorker; @@ -58,7 +59,7 @@ impl std::fmt::Display for EvaluationOutput { struct TsEvaluateResponse { ts_code: String, - value: Value, + value: cdp::EvaluateResponse, } pub struct ReplSession { @@ -75,7 +76,9 @@ impl ReplSession { worker .with_event_loop( - session.post_message("Runtime.enable", None).boxed_local(), + session + .post_message::<()>("Runtime.enable", None) + .boxed_local(), ) .await?; @@ -115,9 +118,8 @@ impl ReplSession { let closed = self .evaluate_expression("(this.closed)") .await? - .get("result") - .unwrap() - .get("value") + .result + .value .unwrap() .as_bool() .unwrap(); @@ -125,10 +127,10 @@ impl ReplSession { Ok(closed) } - pub async fn post_message_with_event_loop( + pub async fn post_message_with_event_loop<T: serde::Serialize>( &mut self, method: &str, - params: Option<Value>, + params: Option<T>, ) -> Result<Value, AnyError> { self .worker @@ -156,23 +158,24 @@ impl ReplSession { match self.evaluate_line_with_object_wrapping(line).await { Ok(evaluate_response) => { - let evaluate_result = evaluate_response.value.get("result").unwrap(); - let evaluate_exception_details = - evaluate_response.value.get("exceptionDetails"); + let cdp::EvaluateResponse { + result, + exception_details, + } = evaluate_response.value; - if evaluate_exception_details.is_some() { - self.set_last_thrown_error(evaluate_result).await?; + if exception_details.is_some() { + self.set_last_thrown_error(&result).await?; } else { self .language_server .commit_text(&evaluate_response.ts_code) .await; - self.set_last_eval_result(evaluate_result).await?; + self.set_last_eval_result(&result).await?; } - let value = self.get_eval_value(evaluate_result).await?; - Ok(match evaluate_exception_details { + let value = self.get_eval_value(&result).await?; + Ok(match exception_details { Some(_) => EvaluationOutput::Error(format!("Uncaught {}", value)), None => EvaluationOutput::Value(value), }) @@ -224,7 +227,7 @@ impl ReplSession { .as_ref() .unwrap() .value - .get("exceptionDetails") + .exception_details .is_some()) { self.evaluate_ts_expression(line).await @@ -235,66 +238,90 @@ impl ReplSession { async fn set_last_thrown_error( &mut self, - error: &Value, + error: &cdp::RemoteObject, ) -> Result<(), AnyError> { self.post_message_with_event_loop( "Runtime.callFunctionOn", - Some(json!({ - "executionContextId": self.context_id, - "functionDeclaration": "function (object) { Deno[Deno.internal].lastThrownError = object; }", - "arguments": [ - error, - ], - })), + Some(cdp::CallFunctionOnArgs { + function_declaration: "function (object) { Deno[Deno.internal].lastThrownError = object; }".to_string(), + object_id: None, + arguments: Some(vec![error.into()]), + silent: None, + return_by_value: None, + generate_preview: None, + user_gesture: None, + await_promise: None, + execution_context_id: Some(self.context_id), + object_group: None, + throw_on_side_effect: None + }), ).await?; Ok(()) } async fn set_last_eval_result( &mut self, - evaluate_result: &Value, + evaluate_result: &cdp::RemoteObject, ) -> Result<(), AnyError> { - self.post_message_with_event_loop( - "Runtime.callFunctionOn", - Some(json!({ - "executionContextId": self.context_id, - "functionDeclaration": "function (object) { Deno[Deno.internal].lastEvalResult = object; }", - "arguments": [ - evaluate_result, - ], - })), - ).await?; + self + .post_message_with_event_loop( + "Runtime.callFunctionOn", + Some(cdp::CallFunctionOnArgs { + function_declaration: + "function (object) { Deno[Deno.internal].lastEvalResult = object; }" + .to_string(), + object_id: None, + arguments: Some(vec![evaluate_result.into()]), + silent: None, + return_by_value: None, + generate_preview: None, + user_gesture: None, + await_promise: None, + execution_context_id: Some(self.context_id), + object_group: None, + throw_on_side_effect: None, + }), + ) + .await?; Ok(()) } pub async fn get_eval_value( &mut self, - evaluate_result: &Value, + evaluate_result: &cdp::RemoteObject, ) -> Result<String, AnyError> { // TODO(caspervonb) we should investigate using previews here but to keep things // consistent with the previous implementation we just get the preview result from // Deno.inspectArgs. let inspect_response = self.post_message_with_event_loop( "Runtime.callFunctionOn", - Some(json!({ - "executionContextId": self.context_id, - "functionDeclaration": r#"function (object) { + Some(cdp::CallFunctionOnArgs { + function_declaration: r#"function (object) { try { return Deno[Deno.internal].inspectArgs(["%o", object], { colors: !Deno.noColor }); } catch (err) { return Deno[Deno.internal].inspectArgs(["%o", err]); } - }"#, - "arguments": [ - evaluate_result, - ], - })), + }"#.to_string(), + object_id: None, + arguments: Some(vec![evaluate_result.into()]), + silent: None, + return_by_value: None, + generate_preview: None, + user_gesture: None, + await_promise: None, + execution_context_id: Some(self.context_id), + object_group: None, + throw_on_side_effect: None + }), ).await?; - let inspect_result = inspect_response.get("result").unwrap(); - let value = inspect_result.get("value").unwrap().as_str().unwrap(); + let response: cdp::CallFunctionOnResponse = + serde_json::from_value(inspect_response)?; + let value = response.result.value.unwrap(); + let s = value.as_str().unwrap(); - Ok(value.to_string()) + Ok(s.to_string()) } async fn evaluate_ts_expression( @@ -344,16 +371,29 @@ impl ReplSession { async fn evaluate_expression( &mut self, expression: &str, - ) -> Result<Value, AnyError> { + ) -> Result<cdp::EvaluateResponse, AnyError> { self .post_message_with_event_loop( "Runtime.evaluate", - Some(json!({ - "expression": expression, - "contextId": self.context_id, - "replMode": true, - })), + Some(cdp::EvaluateArgs { + expression: expression.to_string(), + object_group: None, + include_command_line_api: None, + silent: None, + context_id: Some(self.context_id), + return_by_value: None, + generate_preview: None, + user_gesture: None, + await_promise: None, + throw_on_side_effect: None, + timeout: None, + disable_breaks: None, + repl_mode: Some(true), + allow_unsafe_eval_blocked_by_csp: None, + unique_context_id: None, + }), ) .await + .and_then(|res| serde_json::from_value(res).map_err(|e| e.into())) } } |