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
JavaScript
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