mirror of
https://github.com/immich-app/immich.git
synced 2026-04-28 11:50:49 -04:00
* add @noble/hashes as a dep for web * hash files in chunks * drop old reference to crypto in test code * use web worker for file hashing
25 lines
778 B
TypeScript
25 lines
778 B
TypeScript
import { sha1 } from '@noble/hashes/legacy.js';
|
|
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
|
|
const HASH_CHUNK_SIZE = 5 * 1024 * 1024;
|
|
|
|
async function hashFile(file: File): Promise<string> {
|
|
const hasher = sha1.create();
|
|
|
|
for (let offset = 0; offset < file.size; offset += HASH_CHUNK_SIZE) {
|
|
const slice = file.slice(offset, Math.min(offset + HASH_CHUNK_SIZE, file.size));
|
|
|
|
const buffer = await slice.arrayBuffer();
|
|
|
|
hasher.update(new Uint8Array(buffer));
|
|
}
|
|
|
|
return bytesToHex(hasher.digest());
|
|
}
|
|
|
|
addEventListener('message', (event: MessageEvent<File>) => {
|
|
void hashFile(event.data)
|
|
.then((result) => postMessage({ result }))
|
|
.catch((error: unknown) => postMessage({ error: error instanceof Error ? error.message : String(error) }));
|
|
});
|