use js_sys::{Promise, Uint8Array};
use wasm_bindgen::JsCast;
use wasm_bindgen_futures::JsFuture;
use web_sys::{Blob, FileReader, Request, RequestInit, RequestMode, Response};
use crate::{JsError, PaddleResult};
pub async fn load_blob(url: &str) -> PaddleResult<Blob> {
let mut opts = RequestInit::new();
opts.method("GET");
opts.mode(RequestMode::Cors);
let request = Request::new_with_str_and_init(&url, &opts).map_err(JsError::from_js_value)?;
request
.headers()
.set("Accept", "*/*")
.map_err(JsError::from_js_value)?;
let window = web_sys::window().unwrap();
let resp_value = JsFuture::from(window.fetch_with_request(&request))
.await
.map_err(JsError::from_js_value)?;
let resp: Response = resp_value.dyn_into().unwrap();
let promise = resp.blob().map_err(JsError::from_js_value)?;
let js_blob = JsFuture::from(promise)
.await
.map_err(JsError::from_js_value)?;
let rust_blob = js_blob.dyn_into().map_err(JsError::from_js_value)?;
Ok(rust_blob)
}
pub async fn load_file(url: &str) -> PaddleResult<Vec<u8>> {
let blob = load_blob(url).await?;
let fr = FileReader::new().map_err(JsError::from_js_value)?;
let promise = Promise::new(&mut |resolve, reject| {
fr.set_onload(Some(&resolve));
fr.set_onabort(Some(&reject));
});
fr.read_as_array_buffer(&blob)
.map_err(JsError::from_js_value)?;
let future = JsFuture::from(promise);
let _ok = future.await.map_err(JsError::from_js_value)?;
let result = fr.result().map_err(JsError::from_js_value)?;
let typed_array = Uint8Array::new(&result);
let data = typed_array.to_vec();
Ok(data)
}