pub struct CDPClient { /* private fields */ }Expand description
Core CDP client that manages WebSocket connection and message routing.
Concurrency model:
- Outgoing writes go through an unbounded mpsc channel feeding a dedicated
writer task (
spawn_writer_task). Many callers can send concurrently without contending on a lock. - Incoming reads are dispatched by
Connection::runcallinghandle_message, which only briefly holds a sync mutex onpending_responses, with no awaits while the lock is held.
Implementations§
Source§impl CDPClient
impl CDPClient
Sourcepub fn set_writer(&self, tx: UnboundedSender<Message>)
pub fn set_writer(&self, tx: UnboundedSender<Message>)
Install the writer-task mailbox. Called once by
Browser::connect_internal right after the writer task is spawned.
Sourcepub async fn connect(
&self,
) -> Result<WebSocketStream<MaybeTlsStream<TcpStream>>>
pub async fn connect( &self, ) -> Result<WebSocketStream<MaybeTlsStream<TcpStream>>>
Connect to the Chrome DevTools Protocol WebSocket
Sourcepub fn send_raw(&self, msg: String) -> Result<()>
pub fn send_raw(&self, msg: String) -> Result<()>
Send raw message through the writer task. Synchronous and (modulo one brief sync-mutex acquire) lock-free, because the mpsc channel fan-in is the contention point now, not a per-call lock.
Sourcepub fn subscribe_events(&self) -> Receiver<CDPMessage>
pub fn subscribe_events(&self) -> Receiver<CDPMessage>
Subscribe to all CDP events (unfiltered broadcast receiver).
Callers are responsible for filtering by msg.method and
msg.session_id as needed.
IMPORTANT: Subscribe before sending the CDP command that triggers the event to avoid the race where Chrome replies before the receiver is registered.
Sourcepub async fn send_command(
&self,
method: String,
params: Option<Value>,
) -> Result<Value>
pub async fn send_command( &self, method: String, params: Option<Value>, ) -> Result<Value>
Send a command and wait for response with timeout.
The response handler is registered before the message is sent so that fast Chrome replies are never dropped.
Sourcepub async fn send_command_with_session(
&self,
session_id: &str,
method: String,
params: Option<Value>,
) -> Result<Value>
pub async fn send_command_with_session( &self, session_id: &str, method: String, params: Option<Value>, ) -> Result<Value>
Send a command to a specific page session.
The response handler is registered before the message is sent.
Sourcepub fn register_response_handler(&self, id: u32, tx: Sender<Value>)
pub fn register_response_handler(&self, id: u32, tx: Sender<Value>)
Register a pending response handler. Synchronous: the sync mutex only protects the HashMap insert.
Sourcepub fn fail_all_pending(&self, reason: &str)
pub fn fail_all_pending(&self, reason: &str)
Drop every pending response sender. Any send_command currently
awaiting one of these will see its oneshot close immediately and
return BrowserError::command_failed("…", "response channel closed…"),
instead of waiting out the 30-second timeout. Call this when the
underlying WebSocket dies.
Sourcepub fn handle_message(&self, msg: CDPMessage) -> Result<()>
pub fn handle_message(&self, msg: CDPMessage) -> Result<()>
Handle an incoming CDP message; called by Connection::run.
Synchronous: no .await happens while the pending-responses mutex
is held.
Auto Trait Implementations§
impl Freeze for CDPClient
impl !RefUnwindSafe for CDPClient
impl Send for CDPClient
impl Sync for CDPClient
impl Unpin for CDPClient
impl UnsafeUnpin for CDPClient
impl !UnwindSafe for CDPClient
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more