From 6de3d7f184a4490d342a4c43af6a04b0b26f8cfd Mon Sep 17 00:00:00 2001 From: David Sherret Date: Fri, 25 Nov 2022 18:38:08 -0500 Subject: refactor: move cdp.rs to tools/repl (#16821) --- cli/tools/repl/cdp.rs | 426 ++++++++++++++++++++++++++++++++++++++++++++++ cli/tools/repl/editor.rs | 2 +- cli/tools/repl/mod.rs | 1 + cli/tools/repl/session.rs | 3 +- 4 files changed, 430 insertions(+), 2 deletions(-) create mode 100644 cli/tools/repl/cdp.rs (limited to 'cli/tools') diff --git a/cli/tools/repl/cdp.rs b/cli/tools/repl/cdp.rs new file mode 100644 index 000000000..de2d784f7 --- /dev/null +++ b/cli/tools/repl/cdp.rs @@ -0,0 +1,426 @@ +// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. + +/// +use deno_core::serde_json; +use deno_core::serde_json::Value; +use serde::Deserialize; +use serde::Deserializer; +use serde::Serialize; + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct AwaitPromiseArgs { + pub promise_object_id: RemoteObjectId, + #[serde(skip_serializing_if = "Option::is_none")] + pub return_by_value: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub generate_preview: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AwaitPromiseResponse { + pub result: RemoteObject, + pub exception_details: Option, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct CallFunctionOnArgs { + pub function_declaration: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub object_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub arguments: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub silent: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub return_by_value: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub generate_preview: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub user_gesture: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub await_promise: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub execution_context_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub object_group: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub throw_on_side_effect: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CallFunctionOnResponse { + pub result: RemoteObject, + pub exception_details: Option, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct CompileScriptArgs { + pub expression: String, + #[serde(rename = "sourceURL")] + pub source_url: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub execution_context_id: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CompileScriptResponse { + pub script_id: Option, + pub exception_details: Option, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct EvaluateArgs { + pub expression: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub object_group: Option, + #[serde( + rename = "includeCommandLineAPI", + skip_serializing_if = "Option::is_none" + )] + pub include_command_line_api: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub silent: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub context_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub return_by_value: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub generate_preview: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub user_gesture: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub await_promise: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub throw_on_side_effect: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub timeout: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub disable_breaks: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub repl_mode: Option, + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(rename = "allowUnsafeEvalBlockedByCSP")] + pub allow_unsafe_eval_blocked_by_csp: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub unique_context_id: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct EvaluateResponse { + pub result: RemoteObject, + pub exception_details: Option, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct GetPropertiesArgs { + pub object_id: RemoteObjectId, + #[serde(skip_serializing_if = "Option::is_none")] + pub own_properties: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub accessor_properties_only: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub generate_preview: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub non_indexed_properties_only: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct GetPropertiesResponse { + pub result: Vec, + pub internal_properties: Option>, + pub private_properties: Option>, + pub exception_details: Option, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct GlobalLexicalScopeNamesArgs { + #[serde(skip_serializing_if = "Option::is_none")] + pub execution_context_id: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct GlobalLexicalScopeNamesResponse { + pub names: Vec, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct QueryObjectsArgs { + pub prototype_object_id: RemoteObjectId, + #[serde(skip_serializing_if = "Option::is_none")] + pub object_group: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct QueryObjectsResponse { + pub objects: RemoteObject, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ReleaseObjectArgs { + pub object_id: RemoteObjectId, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ReleaseObjectGroupArgs { + pub object_group: String, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct RunScriptArgs { + pub script_id: ScriptId, + #[serde(skip_serializing_if = "Option::is_none")] + pub execution_context_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub object_group: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub silent: Option, + #[serde( + rename = "includeCommandLineAPI", + skip_serializing_if = "Option::is_none" + )] + pub include_command_line_api: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub return_by_value: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub generate_preview: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub await_promise: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RunScriptResponse { + pub result: RemoteObject, + pub exception_details: Option, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SetAsyncCallStackDepthArgs { + pub max_depth: u64, +} + +// types + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RemoteObject { + #[serde(rename = "type")] + pub kind: String, + pub subtype: Option, + pub class_name: Option, + #[serde(default, deserialize_with = "deserialize_some")] + pub value: Option, + pub unserializable_value: Option, + pub description: Option, + pub object_id: Option, + pub preview: Option, + pub custom_preview: Option, +} + +// Any value that is present is considered Some value, including null. +// ref: https://github.com/serde-rs/serde/issues/984#issuecomment-314143738 +fn deserialize_some<'de, T, D>(deserializer: D) -> Result, D::Error> +where + T: Deserialize<'de>, + D: Deserializer<'de>, +{ + Deserialize::deserialize(deserializer).map(Some) +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ObjectPreview { + #[serde(rename = "type")] + pub kind: String, + pub subtype: Option, + pub description: Option, + pub overflow: bool, + pub properties: Vec, + pub entries: Option>, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PropertyPreview { + pub name: String, + #[serde(rename = "type")] + pub kind: String, + pub value: Option, + pub value_preview: Option, + pub subtype: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct EntryPreview { + pub key: Option, + pub value: ObjectPreview, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CustomPreview { + pub header: String, + pub body_getter_id: RemoteObjectId, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ExceptionDetails { + pub exception_id: u64, + pub text: String, + pub line_number: u64, + pub column_number: u64, + pub script_id: Option, + pub url: Option, + pub stack_trace: Option, + pub exception: Option, + pub execution_context_id: Option, + pub exception_meta_data: Option>, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StackTrace { + pub description: Option, + pub call_frames: Vec, + pub parent: Option>, + pub parent_id: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CallFrame { + pub function_name: String, + pub script_id: ScriptId, + pub url: String, + pub line_number: u64, + pub column_number: u64, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StackTraceId { + pub id: String, + pub debugger_id: Option, +} + +/// +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct CallArgument { + #[serde(skip_serializing_if = "Option::is_none")] + pub value: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub unserializable_value: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub object_id: Option, +} + +impl From<&RemoteObject> for CallArgument { + fn from(obj: &RemoteObject) -> Self { + Self { + value: obj.value.clone(), + unserializable_value: obj.unserializable_value.clone(), + object_id: obj.object_id.clone(), + } + } +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PropertyDescriptor { + pub name: String, + pub value: Option, + pub writable: Option, + pub get: Option, + pub set: Option, + pub configurable: bool, + pub enumerable: bool, + pub was_thrown: Option, + pub is_own: Option, + pub symbol: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct InternalPropertyDescriptor { + pub name: String, + pub value: Option, +} + +/// +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PrivatePropertyDescriptor { + pub name: String, + pub value: Option, + pub get: Option, + pub set: Option, +} + +/// +pub type RemoteObjectId = String; + +/// +pub type ExecutionContextId = u64; + +/// +pub type ScriptId = String; + +/// +pub type TimeDelta = u64; + +/// +pub type UnserializableValue = String; + +/// +pub type UniqueDebuggerId = String; diff --git a/cli/tools/repl/editor.rs b/cli/tools/repl/editor.rs index 73196d3f3..2ff9ee0b4 100644 --- a/cli/tools/repl/editor.rs +++ b/cli/tools/repl/editor.rs @@ -1,6 +1,5 @@ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. -use crate::cdp; use crate::colors; use deno_ast::swc::parser::error::SyntaxError; use deno_ast::swc::parser::token::Token; @@ -32,6 +31,7 @@ use std::sync::atomic::AtomicBool; use std::sync::atomic::Ordering::Relaxed; use std::sync::Arc; +use super::cdp; use super::channel::RustylineSyncMessageSender; // Provides helpers to the editor like validation for multi-line edits, completion candidates for diff --git a/cli/tools/repl/mod.rs b/cli/tools/repl/mod.rs index e37591583..597b3ff5f 100644 --- a/cli/tools/repl/mod.rs +++ b/cli/tools/repl/mod.rs @@ -6,6 +6,7 @@ use deno_runtime::permissions::Permissions; use deno_runtime::worker::MainWorker; use rustyline::error::ReadlineError; +mod cdp; mod channel; mod editor; mod session; diff --git a/cli/tools/repl/session.rs b/cli/tools/repl/session.rs index f2cdfe568..e3bdac3b2 100644 --- a/cli/tools/repl/session.rs +++ b/cli/tools/repl/session.rs @@ -1,6 +1,5 @@ // 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; @@ -12,6 +11,8 @@ use deno_core::serde_json::Value; use deno_core::LocalInspectorSession; use deno_runtime::worker::MainWorker; +use super::cdp; + static PRELUDE: &str = r#" Object.defineProperty(globalThis, "_", { configurable: true, -- cgit v1.2.3