update
This commit is contained in:
40
frontend/src/repositories/http_client.rs
Normal file
40
frontend/src/repositories/http_client.rs
Normal file
@@ -0,0 +1,40 @@
|
||||
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())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user