27 lines
1.2 KiB
JavaScript
27 lines
1.2 KiB
JavaScript
/* ============================================================================
|
|
* hash-worker.js — SHA-256 of a file already saved in OPFS, off the main
|
|
* thread, read in 4 MiB slices (never the whole video in memory).
|
|
*
|
|
* In: { name } file name under OPFS videos/ (e.g. "abc.mp4")
|
|
^ * Out: { ok: true, sha256, size, engine } | { ok: false, error }
|
|
* ========================================================================== */
|
|
'use strict';
|
|
importScripts('/sha256.js');
|
|
|
|
self.onmessage = async (e) => {
|
|
const { name } = e.data || {};
|
|
try {
|
|
const root = await navigator.storage.getDirectory();
|
|
const dir = await root.getDirectoryHandle('videos');
|
|
const file = await (await dir.getFileHandle(String(name))).getFile();
|
|
const h = self.Sha256.create();
|
|
const STEP = 4 * 1024 * 1024;
|
|
for (let pos = 0; pos < file.size; pos += STEP) {
|
|
h.update(new Uint8Array(await file.slice(pos, pos + STEP).arrayBuffer()));
|
|
}
|
|
self.postMessage({ ok: true, sha256: h.hex(), size: file.size, engine: self.Sha256.engine() });
|
|
} catch (err) {
|
|
self.postMessage({ ok: false, error: err && err.message ? err.message : String(err) });
|
|
}
|
|
};
|