use chromiumoxide::browser::Browser;
use chromiumoxide::handler::HandlerConfig;
use futures_util::StreamExt;
use tokio::task::JoinHandle;
use crate::error::SolariError;
use crate::http::{redact_url, scrub_url_from};
use crate::types::Session;
pub struct ConnectedBrowser {
pub browser: Browser,
pub handler: JoinHandle<()>,
}
impl ConnectedBrowser {
pub fn into_parts(self) -> (Browser, JoinHandle<()>) {
(self.browser, self.handler)
}
pub async fn disconnect(self) {
drop(self.browser);
self.handler.abort();
let _ = self.handler.await;
}
}
pub async fn connect(session: &Session) -> Result<ConnectedBrowser, SolariError> {
connect_endpoint(&session.cdp_endpoint).await
}
pub async fn connect_endpoint(cdp_endpoint: &str) -> Result<ConnectedBrowser, SolariError> {
let (browser, mut handler) =
Browser::connect_with_config(cdp_endpoint.to_string(), HandlerConfig::default())
.await
.map_err(|e| SolariError::Connect {
message: format!(
"Solari: failed to connect to {}: {}",
redact_url(cdp_endpoint),
scrub_url_from(&e.to_string(), cdp_endpoint)
),
})?;
let handle = tokio::spawn(async move { while handler.next().await.is_some() {} });
Ok(ConnectedBrowser {
browser,
handler: handle,
})
}