#![cfg(feature = "cdp-backend")]
use std::sync::Arc;
use async_trait::async_trait;
use url::Url;
use crate::queue::Job;
use crate::render::{RenderPool, RenderedPage};
use crate::runner::{FetchOutput, Fetcher, SessionContext};
use crate::Result;
pub struct RenderFetcher {
pool: Arc<RenderPool>,
}
impl RenderFetcher {
pub fn new(pool: Arc<RenderPool>) -> Self {
Self { pool }
}
pub fn pool(&self) -> &Arc<RenderPool> {
&self.pool
}
pub async fn render_with_script(
&self,
url: &Url,
wait: &crate::wait_strategy::WaitStrategy,
script: &crate::script::ScriptSpec,
events: Option<Arc<dyn crate::events::EventSink>>,
run_id: Option<u64>,
proxy: Option<&Url>,
) -> Result<(RenderedPage, crate::script::RunOutcome)> {
self.pool
.render_with_script(url, wait, script, events, run_id, proxy)
.await
}
}
#[async_trait]
impl Fetcher for RenderFetcher {
async fn fetch(&self, job: &Job, _ctx: &SessionContext) -> Result<FetchOutput> {
let script = empty_script_spec();
let wait = crate::wait_strategy::WaitStrategy::default();
let (page, _outcome) = self
.pool
.render_with_script(&job.url, &wait, &script, None, None, None)
.await?;
Ok(FetchOutput::Rendered(Box::new(page)))
}
}
fn empty_script_spec() -> crate::script::ScriptSpec {
crate::script::ScriptSpec {
version: crate::script::SCRIPT_SPEC_VERSION,
defaults: Default::default(),
selectors: Default::default(),
steps: Vec::new(),
captures: Vec::new(),
assertions: Vec::new(),
exports: Default::default(),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn render_fetcher_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<RenderFetcher>();
}
#[test]
fn render_fetcher_is_object_safe() {
fn _accepts(_f: Arc<dyn Fetcher>) {}
}
}