Skip to main content

hash_wasm_rs/hash/
file_render.rs

1use 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}