UNPKG

igir

Version:

🕹 A zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS.

74 lines (73 loc) • 2.52 kB
import crypto from "node:crypto"; import stream from "node:stream"; import zlib from "node:zlib"; import FsReadTransform from "../../streams/fsReadTransform.js"; import StreamUtil from "../../utils/streamUtil.js"; import File from "./file.js"; const ChecksumBitmask = { NONE: 0, CRC32: 1, MD5: 16, SHA1: 256, SHA256: 4096 }; const ChecksumBitmaskInverted = Object.fromEntries( Object.entries(ChecksumBitmask).map(([key, value]) => [value, key]) ); var fileChecksums_default = { async hashData(data, checksumBitmask) { if (!checksumBitmask) { return {}; } const readable = new stream.Readable(); readable.push(data); readable.push(null); return await this.hashStream(readable, checksumBitmask); }, async hashFile(filePath, checksumBitmask, start, end, callback) { if (!checksumBitmask) { return {}; } return await File.createStreamFromFile( filePath, async (readable) => await this.hashStream(readable, checksumBitmask, callback), start, end ); }, async hashStream(readable, checksumBitmask, callback) { if (!checksumBitmask) { return {}; } const streamWithCallback = callback === void 0 ? readable : StreamUtil.withTransforms(readable, new FsReadTransform(callback)); let size = 0; const hasCrc32 = (checksumBitmask & ChecksumBitmask.CRC32) !== 0; let crc = 0; const md5 = checksumBitmask & ChecksumBitmask.MD5 ? crypto.createHash("md5") : void 0; const sha1 = checksumBitmask & ChecksumBitmask.SHA1 ? crypto.createHash("sha1") : void 0; const sha256 = checksumBitmask & ChecksumBitmask.SHA256 ? crypto.createHash("sha256") : void 0; for await (const chunk of streamWithCallback) { size += chunk.length; if (hasCrc32) { crc = zlib.crc32(chunk, crc); } md5?.update(chunk); sha1?.update(chunk); sha256?.update(chunk); } return { size, crc32: hasCrc32 ? (crc >>> 0).toString(16).padStart(8, "0") : void 0, md5: md5?.digest("hex").padStart(32, "0"), sha1: sha1?.digest("hex").padStart(40, "0"), sha256: sha256?.digest("hex").padStart(64, "0") }; }, checksumBitmaskString: (checksumBitmask) => Object.values(ChecksumBitmask).filter((bitmask) => bitmask > 0 && (checksumBitmask & bitmask) > 0).map((bitmask) => ChecksumBitmaskInverted[bitmask]).join(", ") }; export { ChecksumBitmask, ChecksumBitmaskInverted, fileChecksums_default as default }; //# sourceMappingURL=fileChecksums.js.map