41 lines
1.7 KiB
Rust
41 lines
1.7 KiB
Rust
use wasm_bindgen::JsCast;
|
|
|
|
pub struct HttpClient;
|
|
|
|
impl HttpClient {
|
|
/// Fetch tile data with caching
|
|
pub async fn fetch_cached(url: &str) -> Option<Vec<u8>> {
|
|
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())
|
|
}
|
|
}
|