use { crate::route::{CACHE_RATE, ROUTES}, std::sync::{LazyLock, Mutex}, tokio::time::Instant, windmark::context::HookContext, }; fn cache(context: &windmark::context::HookContext, response: &str) { static LAST_CACHED: LazyLock> = LazyLock::new(|| Mutex::new(Instant::now())); if (*LAST_CACHED.lock().unwrap()).elapsed() >= std::time::Duration::from_secs(CACHE_RATE) || (*ROUTES.lock().unwrap()) .get(context.url.path()) .is_some_and(|r| r.text_cache.is_empty()) { (*LAST_CACHED.lock().unwrap()) = Instant::now(); if let Some(route) = (*ROUTES.lock().unwrap()).get_mut(context.url.path()) { route.text_cache = response.to_string(); info!("cache set for {}", context.url.path()); } else { warn!( "cache could not be set for {} as it is not being tracked", context.url.path() ); } trace!("recache for {}", { let path = context.url.path(); if path.is_empty() { "/" } else { path } }); } } pub fn module(router: &mut windmark::router::Router) { router.set_pre_route_callback(move |context: HookContext| { info!( "accepted connection from {} to {}", context.peer_address.unwrap().ip(), context.url, ); super::ticker::module(&context); }); router.set_post_route_callback({ |context: HookContext, response: &mut windmark::response::Response| { info!( "closed connection from {} to {}", context.peer_address.unwrap().ip(), context.url, ); cache(&context, &response.content); // if let Some(language) = // windmark::utilities::queries_from_url(&context.url).get("translate") // { // if super::translate::module(&context, response, language).is_err() { // response.content = format!( // "An error occurred during the translation process. Your language // \ might not be supported.\n\n=> {} View Original\n\n{}", // context // .url // .to_string() // .replace(&format!("translate={language}"), ""), // response.content // ); // } // } } }); }