playwright_cdp/cdp/
session.rs1use crate::cdp::connection::CdpConnection;
9use crate::cdp::messages::CdpEvent;
10use crate::error::{Error, Result};
11use serde_json::Value;
12use std::sync::atomic::{AtomicU64, Ordering};
13use std::sync::Arc;
14use std::time::Duration;
15use tokio::sync::broadcast;
16
17const DEFAULT_TIMEOUT_MS: u64 = 30_000;
19
20pub struct CdpSession {
22 conn: Arc<CdpConnection>,
23 session_id: Option<String>,
24 timeout_ms: AtomicU64,
25}
26
27impl CdpSession {
28 pub fn browser(conn: Arc<CdpConnection>) -> Self {
30 Self {
31 conn,
32 session_id: None,
33 timeout_ms: AtomicU64::new(DEFAULT_TIMEOUT_MS),
34 }
35 }
36
37 pub fn target(conn: Arc<CdpConnection>, session_id: impl Into<String>) -> Self {
39 Self {
40 conn,
41 session_id: Some(session_id.into()),
42 timeout_ms: AtomicU64::new(DEFAULT_TIMEOUT_MS),
43 }
44 }
45
46 pub fn session_id(&self) -> Option<&str> {
48 self.session_id.as_deref()
49 }
50
51 pub fn set_default_timeout_ms(&self, ms: u64) {
52 self.timeout_ms.store(ms, Ordering::Relaxed);
53 }
54
55 pub async fn send(&self, method: &str, params: Value) -> Result<Value> {
57 self.send_with_timeout(method, params, self.current_timeout()).await
58 }
59
60 pub async fn send_with_timeout(
62 &self,
63 method: &str,
64 params: Value,
65 timeout: Duration,
66 ) -> Result<Value> {
67 let fut = self.conn.send_command(self.session_id.as_deref(), method, params);
68 tokio::time::timeout(timeout, fut)
69 .await
70 .map_err(|_| {
71 Error::Timeout(format!("{method} timed out after {}ms", timeout.as_millis()))
72 })?
73 }
74
75 pub async fn send_no_timeout(&self, method: &str, params: Value) -> Result<Value> {
77 self.conn.send_command(self.session_id.as_deref(), method, params).await
78 }
79
80 fn current_timeout(&self) -> Duration {
81 Duration::from_millis(self.timeout_ms.load(Ordering::Relaxed))
82 }
83
84 pub fn subscribe(&self) -> broadcast::Receiver<CdpEvent> {
87 self.conn.subscribe(self.session_id.clone())
88 }
89
90 pub fn connection(&self) -> &Arc<CdpConnection> {
92 &self.conn
93 }
94}