file-type-checker
Version:
Detect and validate file types by their signatures (✨magic numbers✨)
55 lines (54 loc) • 2.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.detectFile = void 0;
const core_1 = require("../core");
const utils_1 = require("../utils");
/**
* Detect a file by searching for a valid file signature inside the file content
*
* @param file File content represents in Array<number> / ArrayBuffer / Uint8Array
* @param options Optional parameters for additional actions
*
* @returns {DetectedFileInfo | undefined} DetectedFileInfo if detected a valid signature inside the file contentof, otherwise undefined
*/
function detectFile(file, options) {
var _a;
if (options &&
Object.prototype.hasOwnProperty.call(options, "chunkSize") &&
((_a = options === null || options === void 0 ? void 0 : options.chunkSize) !== null && _a !== void 0 ? _a : 0) <= 0)
throw new RangeError("chunkSize must be bigger than zero");
const fileChunk = (0, utils_1.getFileChunk)(file, (options === null || options === void 0 ? void 0 : options.chunkSize) || 64); // Take chunk from the beginning of the file
if (fileChunk.length === 0)
return undefined;
const detectedFiles = [];
const filesRequiredAdditionalCheck = [];
for (const type in core_1.FileTypes) {
if (Object.prototype.hasOwnProperty.call(core_1.FileTypes, type)) {
const signatures = core_1.FileTypes.getSignaturesByName(type);
const matchedSignature = core_1.FileTypes.detectbBySignatures(fileChunk, signatures);
if (matchedSignature) {
const fileType = core_1.FileTypes.getInfoByName(type);
if (core_1.FILE_TYPES_REQUIRED_ADDITIONAL_CHECK.includes(fileType.extension)) {
filesRequiredAdditionalCheck.push(fileType.extension);
}
const fileInfo = {
extension: fileType.extension,
mimeType: fileType.mimeType,
description: fileType.description,
signature: Object.assign(Object.assign({}, matchedSignature), { sequence: matchedSignature.sequence.map((num) => num.toString(16)) }),
};
detectedFiles.push(fileInfo);
}
}
}
if (detectedFiles.length === 0)
return undefined;
if (detectedFiles.length === 1 && filesRequiredAdditionalCheck.length === 0)
return detectedFiles[0];
// Some files share the same signature. Additional check required
const detectedType = core_1.FileTypes.detectTypeByAdditionalCheck(fileChunk, detectedFiles);
if (!detectedType)
return undefined;
return detectedFiles.find((df) => df.extension === detectedType);
}
exports.detectFile = detectFile;