|
1 | | -use merklehash::{MerkleHash, xorb_hash}; |
| 1 | +use merklehash::{DataHashHexParseError, MerkleHash, xorb_hash}; |
2 | 2 | use serde::{Deserialize, Serialize}; |
3 | 3 | use wasm_bindgen::prelude::*; |
4 | 4 |
|
@@ -65,20 +65,45 @@ fn serialize_result<T: Serialize>(result: &T) -> Result<JsValue, JsValue> { |
65 | 65 | res |
66 | 66 | } |
67 | 67 |
|
| 68 | +/// takes an Array of Objects of the form { "hash": string, "length": number } |
| 69 | +/// and returns a string of a hash |
68 | 70 | #[wasm_bindgen] |
69 | 71 | pub fn compute_xorb_hash(chunks_array: JsValue) -> Result<String, JsValue> { |
70 | 72 | let js_chunks: Vec<JsChunk> = |
71 | 73 | serde_wasm_bindgen::from_value::<Vec<JsChunk>>(chunks_array).map_err(|e| JsValue::from(e.to_string()))?; |
72 | 74 |
|
73 | 75 | let chunks: Vec<(MerkleHash, usize)> = js_chunks |
74 | 76 | .into_iter() |
75 | | - .map(|jsc| { |
76 | | - Ok::<_, JsValue>(( |
77 | | - MerkleHash::from_hex(&jsc.hash).map_err(|e| JsValue::from(e.to_string()))?, |
78 | | - jsc.length as usize, |
79 | | - )) |
80 | | - }) |
81 | | - .collect::<Result<Vec<_>, _>>()?; |
| 77 | + .map(|jsc| Ok((MerkleHash::from_hex(&jsc.hash)?, jsc.length as usize))) |
| 78 | + .collect::<Result<_, DataHashHexParseError>>() |
| 79 | + .map_err(|e| JsValue::from(e.to_string()))?; |
82 | 80 |
|
83 | 81 | Ok(xorb_hash(&chunks).hex()) |
84 | 82 | } |
| 83 | + |
| 84 | +/// takes an Array of Objects of the form { "hash": string, "length": number } |
| 85 | +/// and returns a string of a hash |
| 86 | +#[wasm_bindgen] |
| 87 | +pub fn compute_file_hash(chunks_array: JsValue) -> Result<String, JsValue> { |
| 88 | + let js_chunks = |
| 89 | + serde_wasm_bindgen::from_value::<Vec<JsChunk>>(chunks_array).map_err(|e| JsValue::from(e.to_string()))?; |
| 90 | + |
| 91 | + let chunk_list: Vec<(MerkleHash, usize)> = js_chunks |
| 92 | + .into_iter() |
| 93 | + .map(|jsc| Ok((MerkleHash::from_hex(&jsc.hash)?, jsc.length as usize))) |
| 94 | + .collect::<Result<_, DataHashHexParseError>>() |
| 95 | + .map_err(|e| JsValue::from(e.to_string()))?; |
| 96 | + |
| 97 | + Ok(merklehash::file_hash(&chunk_list).hex()) |
| 98 | +} |
| 99 | + |
| 100 | +/// takes an Array of hashes as strings and returns the verification hash for that range of chunk hashes |
| 101 | +#[wasm_bindgen] |
| 102 | +pub fn compute_verification_hash(chunk_hashes: Vec<String>) -> Result<String, JsValue> { |
| 103 | + let chunk_hashes: Vec<MerkleHash> = chunk_hashes |
| 104 | + .into_iter() |
| 105 | + .map(|hash| MerkleHash::from_hex(&hash)) |
| 106 | + .collect::<Result<_, DataHashHexParseError>>() |
| 107 | + .map_err(|e| JsValue::from(e.to_string()))?; |
| 108 | + Ok(mdb_shard::chunk_verification::range_hash_from_chunks(&chunk_hashes).hex()) |
| 109 | +} |
0 commit comments