hash_wasm_rs/hash/
file_render.rs1use js_sys::Promise;
2use wasm_bindgen::prelude::*;
3use wasm_bindgen_futures::JsFuture;
4use web_sys::{
5 Blob, File, FileReader,
6 js_sys::{ArrayBuffer, JsString, Uint8Array},
7};
8
9#[derive(Debug, Clone, PartialEq)]
10#[wasm_bindgen]
11pub struct GetFileResult {
12 #[wasm_bindgen(js_name = arrayBuffer)]
13 pub(crate) array_buffer: ArrayBuffer,
14 #[wasm_bindgen(js_name = uint8Array)]
15 pub(crate) uint8_array: Vec<u8>,
16 pub(crate) blob: Blob,
17}
18
19#[wasm_bindgen]
20pub async fn get_file_uint8array_and_blob(file: &File) -> Result<GetFileResult, JsValue> {
21 let file_reader = FileReader::new()?;
22 let promise = Promise::new(&mut |resolve, reject| {
23 file_reader.set_onload(Some(&resolve));
24 file_reader.set_onerror(Some(&reject));
25 if let Err(e) = file_reader.read_as_array_buffer(file) {
26 let _ = reject.call1(&JsValue::NULL, &e);
27 }
28 });
29 let _ = JsFuture::from(promise).await?;
30
31 let js_array_buffer: JsValue = file_reader.result()?;
32 let array_buffer: ArrayBuffer = js_array_buffer.dyn_into()?;
33
34 let uint8_array = Uint8Array::new(&array_buffer);
35 let blob = Blob::new_with_u8_array_sequence(&uint8_array)?;
36
37 Ok(GetFileResult {
38 array_buffer,
39 uint8_array: uint8_array.to_vec(),
40 blob,
41 })
42}
43
44#[wasm_bindgen]
45pub async fn get_data_as_bytes(data: &JsValue) -> Result<Vec<u8>, JsValue> {
46 if let Some(uint8_array) = data.dyn_ref::<Uint8Array>() {
47 Ok(uint8_array.to_vec())
48 } else if let Some(file) = data.dyn_ref::<File>() {
49 let file_result = get_file_uint8array_and_blob(file).await?;
50 Ok(file_result.uint8_array)
51 } else if let Some(js_string) = data.dyn_ref::<JsString>() {
52 let string: String = js_string.into();
53 Ok(string.as_bytes().to_vec())
54 } else {
55 Err(JsValue::from_str(
56 "Invalid input type to hash, should be Uint8Array, File or String",
57 ))
58 }
59}