use std::path::PathBuf;
use tracing::debug;
use crate::error::NetworkError;
use crate::network::{HarRecorder, HarRecordingBuilder, HarRecordingOptions};
use super::BrowserContext;
impl BrowserContext {
pub async fn record_har(
&self,
path: impl Into<PathBuf>,
) -> Result<HarRecordingBuilder, NetworkError> {
if self.is_closed() {
return Err(NetworkError::Aborted);
}
let recorder = self.har_recorder.read().await;
if recorder.is_some() {
return Err(NetworkError::AlreadyHandled);
}
drop(recorder);
Ok(HarRecordingBuilder::new(path))
}
pub async fn start_har_recording(
&self,
options: HarRecordingOptions,
) -> Result<(), NetworkError> {
if self.is_closed() {
return Err(NetworkError::Aborted);
}
let mut recorder_lock = self.har_recorder.write().await;
if recorder_lock.is_some() {
return Err(NetworkError::AlreadyHandled);
}
let recorder = HarRecorder::new(options)?;
*recorder_lock = Some(recorder);
debug!("Started HAR recording");
Ok(())
}
pub async fn save_har(&self) -> Result<PathBuf, NetworkError> {
let recorder = self.har_recorder.read().await;
match recorder.as_ref() {
Some(rec) => rec.save().await,
None => Err(NetworkError::InvalidResponse(
"No HAR recording is active".to_string(),
)),
}
}
pub async fn stop_har_recording(&self, save: bool) -> Result<Option<PathBuf>, NetworkError> {
let mut recorder_lock = self.har_recorder.write().await;
if let Some(recorder) = recorder_lock.take() {
if save {
let path = recorder.save().await?;
return Ok(Some(path));
}
}
Ok(None)
}
}