use std::collections::HashMap;
use std::sync::Arc;
use std::time::Instant;
use tracing::debug;
use crate::page::WaitUntil;
use crate::pool::BrowserPool;
use super::{ValidationResult, ValidationTarget};
pub fn run_creepjs(pool: &Arc<BrowserPool>) -> ValidationResult {
let start = Instant::now();
let result = creepjs_impl(pool);
ValidationResult {
elapsed: start.elapsed(),
..result
}
}
fn creepjs_impl(_pool: &Arc<BrowserPool>) -> ValidationResult {
ValidationResult {
target: ValidationTarget::CreepJs,
passed: false,
score: None,
details: HashMap::from([("phase".to_string(), "stub-not-yet-implemented".to_string())]),
screenshot: None,
elapsed: std::time::Duration::ZERO,
}
}
pub fn run_browserscan(pool: &Arc<BrowserPool>) -> ValidationResult {
let start = Instant::now();
let result = browserscan_impl(pool);
ValidationResult {
elapsed: start.elapsed(),
..result
}
}
fn browserscan_impl(_pool: &Arc<BrowserPool>) -> ValidationResult {
ValidationResult {
target: ValidationTarget::BrowserScan,
passed: false,
score: None,
details: HashMap::from([("phase".to_string(), "stub-not-yet-implemented".to_string())]),
screenshot: None,
elapsed: std::time::Duration::ZERO,
}
}
pub async fn run_kasada(pool: &Arc<BrowserPool>) -> ValidationResult {
let start = Instant::now();
let result = kasada_impl(pool).await;
ValidationResult {
elapsed: start.elapsed(),
..result
}
}
async fn kasada_impl(pool: &Arc<BrowserPool>) -> ValidationResult {
let url = ValidationTarget::Kasada.url();
debug!("Kasada validator: navigating to {url}");
match pool.acquire().await {
Ok(session) => {
match session.browser() {
Some(browser) => {
match browser.new_page().await {
Ok(mut page) => {
let navigate_result = page
.navigate(
url,
WaitUntil::DomContentLoaded,
std::time::Duration::from_secs(20),
)
.await;
let passed = match navigate_result {
Ok(()) => {
true
}
Err(e) => {
debug!("Kasada: navigation failed: {}", e);
false
}
};
page.close().await.ok();
ValidationResult {
target: ValidationTarget::Kasada,
passed,
score: None,
details: HashMap::from([(
"phase".to_string(),
"load-check".to_string(),
)]),
screenshot: None,
elapsed: std::time::Duration::ZERO,
}
}
Err(e) => {
ValidationResult::failed(ValidationTarget::Kasada, &e.to_string())
}
}
}
None => ValidationResult::failed(ValidationTarget::Kasada, "browser handle lost"),
}
}
Err(e) => ValidationResult::failed(ValidationTarget::Kasada, &e.to_string()),
}
}
pub async fn run_cloudflare(pool: &Arc<BrowserPool>) -> ValidationResult {
let start = Instant::now();
let result = cloudflare_impl(pool).await;
ValidationResult {
elapsed: start.elapsed(),
..result
}
}
async fn cloudflare_impl(pool: &Arc<BrowserPool>) -> ValidationResult {
let url = ValidationTarget::Cloudflare.url();
debug!("Cloudflare validator: navigating to {url}");
match pool.acquire().await {
Ok(session) => match session.browser() {
Some(browser) => match browser.new_page().await {
Ok(mut page) => {
let navigate_result = page
.navigate(
url,
WaitUntil::DomContentLoaded,
std::time::Duration::from_secs(20),
)
.await;
let passed = navigate_result.is_ok();
page.close().await.ok();
ValidationResult {
target: ValidationTarget::Cloudflare,
passed,
score: None,
details: HashMap::from([("phase".to_string(), "load-check".to_string())]),
screenshot: None,
elapsed: std::time::Duration::ZERO,
}
}
Err(e) => ValidationResult::failed(ValidationTarget::Cloudflare, &e.to_string()),
},
None => ValidationResult::failed(ValidationTarget::Cloudflare, "browser handle lost"),
},
Err(e) => ValidationResult::failed(ValidationTarget::Cloudflare, &e.to_string()),
}
}
pub async fn run_akamai(pool: &Arc<BrowserPool>) -> ValidationResult {
let start = Instant::now();
let result = akamai_impl(pool).await;
ValidationResult {
elapsed: start.elapsed(),
..result
}
}
async fn akamai_impl(pool: &Arc<BrowserPool>) -> ValidationResult {
let url = ValidationTarget::Akamai.url();
debug!("Akamai validator: navigating to {url}");
match pool.acquire().await {
Ok(session) => match session.browser() {
Some(browser) => match browser.new_page().await {
Ok(mut page) => {
let navigate_result = page
.navigate(
url,
WaitUntil::DomContentLoaded,
std::time::Duration::from_secs(20),
)
.await;
let passed = navigate_result.is_ok();
page.close().await.ok();
ValidationResult {
target: ValidationTarget::Akamai,
passed,
score: None,
details: HashMap::from([("phase".to_string(), "load-check".to_string())]),
screenshot: None,
elapsed: std::time::Duration::ZERO,
}
}
Err(e) => ValidationResult::failed(ValidationTarget::Akamai, &e.to_string()),
},
None => ValidationResult::failed(ValidationTarget::Akamai, "browser handle lost"),
},
Err(e) => ValidationResult::failed(ValidationTarget::Akamai, &e.to_string()),
}
}