use anyhow::{anyhow, Result};
use chromiumoxide::{Browser as CdpBrowser, Page};
use futures_util::StreamExt;
use tokio::task::JoinHandle;
use crate::browser::BrowserSession;
pub struct Session {
pub browser: CdpBrowser,
pub engine: BrowserSession,
handler: JoinHandle<()>,
}
impl Session {
pub(crate) async fn connect(engine: BrowserSession) -> Result<Self> {
let ws = engine
.cdp_url
.clone()
.ok_or_else(|| anyhow!("CDP endpoint unavailable — launch with cdp = true"))?;
let (browser, mut handler) = CdpBrowser::connect(ws).await?;
let handler = tokio::spawn(async move { while handler.next().await.is_some() {} });
Ok(Self {
browser,
engine,
handler,
})
}
pub fn cdp_url(&self) -> Option<&str> {
self.engine.cdp_url.as_deref()
}
pub async fn new_page(&self, url: &str) -> Result<Page> {
Ok(self.browser.new_page(url).await?)
}
pub async fn close(mut self) -> Result<()> {
let _ = self.browser.close().await;
self.handler.abort();
self.engine.stop().await?;
Ok(())
}
}
impl Drop for Session {
fn drop(&mut self) {
self.handler.abort();
}
}