use playwright_cdp::options::LaunchOptions;
use playwright_cdp::{Browser, BrowserType, Playwright};
pub async fn browser() -> Option<Browser> {
Playwright::launch()
.await
.ok()?
.chromium()
.launch_with_options(LaunchOptions::default())
.await
.ok()
}
#[allow(dead_code)]
pub async fn http_server(body: &'static str) -> String {
let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
let port = listener.local_addr().unwrap().port();
tokio::spawn(async move {
loop {
let Ok((sock, _)) = listener.accept().await else { break };
let body = body;
tokio::spawn(async move {
use tokio::io::{AsyncReadExt, AsyncWriteExt};
let mut sock = sock;
let mut buf = [0u8; 4096];
let _ = sock.read(&mut buf).await;
let resp = format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}",
body.len(),
body
);
let _ = sock.write_all(resp.as_bytes()).await;
let _ = sock.flush().await;
});
}
});
format!("http://127.0.0.1:{port}/")
}
#[allow(dead_code)]
fn _touch(_b: BrowserType) {}
#[allow(dead_code)]
pub async fn http_server_routes(routes: &[(&'static str, &'static str)]) -> String {
use std::collections::HashMap;
let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
let port = listener.local_addr().unwrap().port();
let mut bodies: HashMap<&'static str, &'static str> = HashMap::new();
let default = routes
.iter()
.find(|(p, _)| *p == "/")
.map(|(_, b)| *b)
.unwrap_or("");
for (p, b) in routes {
bodies.insert(*p, *b);
}
tokio::spawn(async move {
loop {
let Ok((sock, _)) = listener.accept().await else { break };
let bodies = bodies.clone();
tokio::spawn(async move {
use tokio::io::{AsyncReadExt, AsyncWriteExt};
let mut sock = sock;
let mut buf = [0u8; 4096];
let _ = sock.read(&mut buf).await;
let req = String::from_utf8_lossy(&buf);
let path = req
.split_whitespace()
.nth(1)
.unwrap_or("/")
.to_string();
let body = bodies.get(path.as_str()).copied().unwrap_or(default);
let resp = format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}",
body.len(),
body
);
let _ = sock.write_all(resp.as_bytes()).await;
let _ = sock.flush().await;
});
}
});
format!("http://127.0.0.1:{port}")
}