UNPKG

file-type-checker

Version:

Detect and validate file types by their signatures (✨magic numbers✨)

55 lines (54 loc) 2.72 kB
"use strict"; 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;