Files
hpc/web/src/views/Files/sha256.worker.ts
T

35 lines
1.2 KiB
TypeScript

export {}
declare const self: {
onmessage: ((e: MessageEvent) => void) | null
postMessage: (message: unknown) => void
}
self.onmessage = async (e: MessageEvent) => {
const file = e.data.file as File
try {
// Read entire file into ArrayBuffer (with progress reporting)
const CHUNK_READ_SIZE = 16 * 1024 * 1024 // 16MB chunks for progress reporting
const buffer = new ArrayBuffer(file.size)
const view = new Uint8Array(buffer)
let offset = 0
while (offset < file.size) {
const end = Math.min(offset + CHUNK_READ_SIZE, file.size)
const slice = file.slice(offset, end)
const chunkBuffer = await slice.arrayBuffer()
view.set(new Uint8Array(chunkBuffer), offset)
offset = end
self.postMessage({ progress: offset / file.size })
}
// Compute SHA256 on entire buffer at once
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer)
const hashArray = Array.from(new Uint8Array(hashBuffer))
const sha256 = hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
self.postMessage({ sha256, progress: 1 })
} catch (error) {
self.postMessage({ error: error instanceof Error ? error.message : 'SHA256 computation failed' })
}
}