use wasm_bindgen::JsCast; pub struct HttpClient; impl HttpClient { /// Fetch tile data with caching pub async fn fetch_cached(url: &str) -> Option> { let window = web_sys::window()?; let caches = window.caches().ok()?; let cache_name = "map-data-v5-sand"; let cache = wasm_bindgen_futures::JsFuture::from(caches.open(cache_name)).await.ok()?; let cache: web_sys::Cache = cache.dyn_into().ok()?; let request = web_sys::Request::new_with_str(url).ok()?; let match_promise = cache.match_with_request(&request); let match_val = wasm_bindgen_futures::JsFuture::from(match_promise).await.ok()?; if !match_val.is_undefined() { let response: web_sys::Response = match_val.dyn_into().ok()?; let buffer_promise = response.array_buffer().ok()?; let buffer = wasm_bindgen_futures::JsFuture::from(buffer_promise).await.ok()?; let array = js_sys::Uint8Array::new(&buffer); return Some(array.to_vec()); } // Network fetch let response_val = wasm_bindgen_futures::JsFuture::from(window.fetch_with_request(&request)).await.ok()?; let response: web_sys::Response = response_val.dyn_into().ok()?; // Clone response for cache let response_clone = response.clone().ok()?; let put_promise = cache.put_with_request(&request, &response_clone); wasm_bindgen_futures::JsFuture::from(put_promise).await.ok()?; let buffer_promise = response.array_buffer().ok()?; let buffer = wasm_bindgen_futures::JsFuture::from(buffer_promise).await.ok()?; let array = js_sys::Uint8Array::new(&buffer); Some(array.to_vec()) } }