eoka_server/
page_context.rs1use eoka::Page;
2use eoka_protocol::PageContext;
3use std::{fmt::Write, time::Duration};
4
5pub async fn capture(page: &Page) -> Option<PageContext> {
6 let mut context: PageContext = tokio::time::timeout(
7 Duration::from_secs(2),
8 page.evaluate_sync(include_str!("js/page_context.js")),
9 )
10 .await
11 .ok()?
12 .ok()?;
13 context.tab_id = page.target_id().to_owned();
14 Some(context)
15}
16
17pub fn format(context: &PageContext) -> String {
18 let mut text = format!(
19 "URL: {}\nTitle: {}\nDocument: {} (application readiness not inferred)\n",
20 context.url, context.title, context.ready_state
21 );
22 for heading in &context.headings {
23 let _ = writeln!(text, "Heading: {heading}");
24 }
25 for message in &context.messages {
26 let _ = writeln!(text, "Page message: {message}");
27 }
28 if !context.text_excerpt.is_empty() {
29 let _ = writeln!(text, "Page text: {}", context.text_excerpt);
30 }
31 if context.truncated {
32 text.push_str("Page context truncated.\n");
33 }
34 text
35}