@better-media/plugin-validation 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +32 -0
- package/dist/index.d.mts +110 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.js +2957 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2949 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js","../../../../node_modules/.pnpm/peek-readable@5.4.2/node_modules/peek-readable/lib/EndOfStreamError.js","../../../../node_modules/.pnpm/peek-readable@5.4.2/node_modules/peek-readable/lib/AbstractStreamReader.js","../../../../node_modules/.pnpm/peek-readable@5.4.2/node_modules/peek-readable/lib/WebStreamReader.js","../../../../node_modules/.pnpm/strtok3@9.1.1/node_modules/strtok3/lib/AbstractTokenizer.js","../../../../node_modules/.pnpm/strtok3@9.1.1/node_modules/strtok3/lib/ReadStreamTokenizer.js","../../../../node_modules/.pnpm/strtok3@9.1.1/node_modules/strtok3/lib/BufferTokenizer.js","../../../../node_modules/.pnpm/strtok3@9.1.1/node_modules/strtok3/lib/core.js","../../../../node_modules/.pnpm/token-types@6.1.2/node_modules/token-types/lib/index.js","../../../../node_modules/.pnpm/@borewit+text-codec@0.2.2/node_modules/@borewit/text-codec/lib/index.js","../../../../node_modules/.pnpm/uint8array-extras@1.5.0/node_modules/uint8array-extras/index.js","../../../../node_modules/.pnpm/file-type@19.6.0/node_modules/file-type/util.js","../../../../node_modules/.pnpm/file-type@19.6.0/node_modules/file-type/supported.js","../../../../node_modules/.pnpm/file-type@19.6.0/node_modules/file-type/core.js","../src/extract-metadata.ts","../src/validators/file-type.ts","../src/validators/file-size.ts","../src/validators/dimensions.ts","../src/validators/checksum.ts","../src/validators/checksum-uniqueness.ts","../src/validators/security-scanner.ts","../src/validators/index.ts","../src/runtime/runner.ts","../src/index.ts"],"names":["exports","b2","cp","b3","valid","maxBufferSize","crypto","path","EXTENSION_TO_MIME_MAP","imageSize","fs","randomUUID","result","markFileContentVerified"],"mappings":"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","file":"index.js","sourcesContent":["/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","export const defaultMessages = 'End-Of-Stream';\n/**\n * Thrown on read operation of the end of file or stream has been reached\n */\nexport class EndOfStreamError extends Error {\n constructor() {\n super(defaultMessages);\n }\n}\n","import { EndOfStreamError } from \"./EndOfStreamError.js\";\nexport class AbstractStreamReader {\n constructor() {\n /**\n * Maximum request length on read-stream operation\n */\n this.maxStreamReadSize = 1 * 1024 * 1024;\n this.endOfStream = false;\n /**\n * Store peeked data\n * @type {Array}\n */\n this.peekQueue = [];\n }\n async peek(uint8Array, offset, length) {\n const bytesRead = await this.read(uint8Array, offset, length);\n this.peekQueue.push(uint8Array.subarray(offset, offset + bytesRead)); // Put read data back to peek buffer\n return bytesRead;\n }\n async read(buffer, offset, length) {\n if (length === 0) {\n return 0;\n }\n let bytesRead = this.readFromPeekBuffer(buffer, offset, length);\n bytesRead += await this.readRemainderFromStream(buffer, offset + bytesRead, length - bytesRead);\n if (bytesRead === 0) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n /**\n * Read chunk from stream\n * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n * @param offset - Offset target\n * @param length - Number of bytes to read\n * @returns Number of bytes read\n */\n readFromPeekBuffer(buffer, offset, length) {\n let remaining = length;\n let bytesRead = 0;\n // consume peeked data first\n while (this.peekQueue.length > 0 && remaining > 0) {\n const peekData = this.peekQueue.pop(); // Front of queue\n if (!peekData)\n throw new Error('peekData should be defined');\n const lenCopy = Math.min(peekData.length, remaining);\n buffer.set(peekData.subarray(0, lenCopy), offset + bytesRead);\n bytesRead += lenCopy;\n remaining -= lenCopy;\n if (lenCopy < peekData.length) {\n // remainder back to queue\n this.peekQueue.push(peekData.subarray(lenCopy));\n }\n }\n return bytesRead;\n }\n async readRemainderFromStream(buffer, offset, initialRemaining) {\n let remaining = initialRemaining;\n let bytesRead = 0;\n // Continue reading from stream if required\n while (remaining > 0 && !this.endOfStream) {\n const reqLen = Math.min(remaining, this.maxStreamReadSize);\n const chunkLen = await this.readFromStream(buffer, offset + bytesRead, reqLen);\n if (chunkLen === 0)\n break;\n bytesRead += chunkLen;\n remaining -= chunkLen;\n }\n return bytesRead;\n }\n}\n","import { EndOfStreamError } from './EndOfStreamError.js';\nexport { EndOfStreamError } from './EndOfStreamError.js';\nimport { AbstractStreamReader } from \"./AbstractStreamReader.js\";\n/**\n * Read from a WebStream\n * Reference: https://nodejs.org/api/webstreams.html#class-readablestreambyobreader\n */\nexport class WebStreamReader extends AbstractStreamReader {\n constructor(stream) {\n super();\n this.reader = stream.getReader({ mode: 'byob' });\n }\n async readFromStream(buffer, offset, length) {\n if (this.endOfStream) {\n throw new EndOfStreamError();\n }\n const result = await this.reader.read(new Uint8Array(length));\n if (result.done) {\n this.endOfStream = result.done;\n }\n if (result.value) {\n buffer.set(result.value, offset);\n return result.value.byteLength;\n }\n return 0;\n }\n abort() {\n return this.reader.cancel(); // Signals a loss of interest in the stream by a consumer\n }\n async close() {\n await this.abort();\n this.reader.releaseLock();\n }\n}\n","import { EndOfStreamError } from 'peek-readable';\n/**\n * Core tokenizer\n */\nexport class AbstractTokenizer {\n /**\n * Constructor\n * @param options Tokenizer options\n * @protected\n */\n constructor(options) {\n this.numBuffer = new Uint8Array(8);\n /**\n * Tokenizer-stream position\n */\n this.position = 0;\n this.onClose = options?.onClose;\n if (options?.abortSignal) {\n options.abortSignal.addEventListener('abort', () => {\n this.abort();\n });\n }\n }\n /**\n * Read a token from the tokenizer-stream\n * @param token - The token to read\n * @param position - If provided, the desired position in the tokenizer-stream\n * @returns Promise with token data\n */\n async readToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.readBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Peek a token from the tokenizer-stream.\n * @param token - Token to peek from the tokenizer-stream.\n * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.\n * @returns Promise with token data\n */\n async peekToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.peekBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async readNumber(token) {\n const len = await this.readBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async peekNumber(token) {\n const len = await this.peekBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to ignore\n * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available\n */\n async ignore(length) {\n if (this.fileInfo.size !== undefined) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length > bytesLeft) {\n this.position += bytesLeft;\n return bytesLeft;\n }\n }\n this.position += length;\n return length;\n }\n async close() {\n await this.abort();\n await this.onClose?.();\n }\n normalizeOptions(uint8Array, options) {\n if (options && options.position !== undefined && options.position < this.position) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n if (options) {\n return {\n mayBeLess: options.mayBeLess === true,\n offset: options.offset ? options.offset : 0,\n length: options.length ? options.length : (uint8Array.length - (options.offset ? options.offset : 0)),\n position: options.position ? options.position : this.position\n };\n }\n return {\n mayBeLess: false,\n offset: 0,\n length: uint8Array.length,\n position: this.position\n };\n }\n abort() {\n return Promise.resolve(); // Ignore abort signal\n }\n}\n","import { AbstractTokenizer } from './AbstractTokenizer.js';\nimport { EndOfStreamError } from 'peek-readable';\nconst maxBufferSize = 256000;\nexport class ReadStreamTokenizer extends AbstractTokenizer {\n /**\n * Constructor\n * @param streamReader stream-reader to read from\n * @param options Tokenizer options\n */\n constructor(streamReader, options) {\n super(options);\n this.streamReader = streamReader;\n this.fileInfo = options?.fileInfo ?? {};\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Target Uint8Array to fill with data read from the tokenizer-stream\n * @param options - Read behaviour options\n * @returns Promise with number of bytes read\n */\n async readBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const skipBytes = normOptions.position - this.position;\n if (skipBytes > 0) {\n await this.ignore(skipBytes);\n return this.readBuffer(uint8Array, options);\n }\n if (skipBytes < 0) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n if (normOptions.length === 0) {\n return 0;\n }\n const bytesRead = await this.streamReader.read(uint8Array, normOptions.offset, normOptions.length);\n this.position += bytesRead;\n if ((!options || !options.mayBeLess) && bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8Array - Uint8Array (or Buffer) to write data to\n * @param options - Read behaviour options\n * @returns Promise with number of bytes peeked\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n let bytesRead = 0;\n if (normOptions.position) {\n const skipBytes = normOptions.position - this.position;\n if (skipBytes > 0) {\n const skipBuffer = new Uint8Array(normOptions.length + skipBytes);\n bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: normOptions.mayBeLess });\n uint8Array.set(skipBuffer.subarray(skipBytes), normOptions.offset);\n return bytesRead - skipBytes;\n }\n if (skipBytes < 0) {\n throw new Error('Cannot peek from a negative offset in a stream');\n }\n }\n if (normOptions.length > 0) {\n try {\n bytesRead = await this.streamReader.peek(uint8Array, normOptions.offset, normOptions.length);\n }\n catch (err) {\n if (options?.mayBeLess && err instanceof EndOfStreamError) {\n return 0;\n }\n throw err;\n }\n if ((!normOptions.mayBeLess) && bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n }\n return bytesRead;\n }\n async ignore(length) {\n // debug(`ignore ${this.position}...${this.position + length - 1}`);\n const bufSize = Math.min(maxBufferSize, length);\n const buf = new Uint8Array(bufSize);\n let totBytesRead = 0;\n while (totBytesRead < length) {\n const remaining = length - totBytesRead;\n const bytesRead = await this.readBuffer(buf, { length: Math.min(bufSize, remaining) });\n if (bytesRead < 0) {\n return bytesRead;\n }\n totBytesRead += bytesRead;\n }\n return totBytesRead;\n }\n abort() {\n return this.streamReader.abort();\n }\n supportsRandomAccess() {\n return false;\n }\n}\n","import { EndOfStreamError } from 'peek-readable';\nimport { AbstractTokenizer } from './AbstractTokenizer.js';\nexport class BufferTokenizer extends AbstractTokenizer {\n /**\n * Construct BufferTokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param options Tokenizer options\n */\n constructor(uint8Array, options) {\n super(options);\n this.uint8Array = uint8Array;\n this.fileInfo = { ...options?.fileInfo ?? {}, ...{ size: uint8Array.length } };\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async readBuffer(uint8Array, options) {\n if (options?.position) {\n if (options.position < this.position) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n this.position = options.position;\n }\n const bytesRead = await this.peekBuffer(uint8Array, options);\n this.position += bytesRead;\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8Array\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length);\n if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) {\n throw new EndOfStreamError();\n }\n uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read), normOptions.offset);\n return bytes2read;\n }\n close() {\n return super.close();\n }\n supportsRandomAccess() {\n return true;\n }\n setPosition(position) {\n this.position = position;\n }\n}\n","import { StreamReader, WebStreamReader } from 'peek-readable';\nimport { ReadStreamTokenizer } from './ReadStreamTokenizer.js';\nimport { BufferTokenizer } from './BufferTokenizer.js';\nexport { EndOfStreamError } from 'peek-readable';\nexport { AbstractTokenizer } from './AbstractTokenizer.js';\n/**\n * Construct ReadStreamTokenizer from given Stream.\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param stream - Read from Node.js Stream.Readable\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nexport function fromStream(stream, options) {\n return new ReadStreamTokenizer(new StreamReader(stream), options);\n}\n/**\n * Construct ReadStreamTokenizer from given ReadableStream (WebStream API).\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param webStream - Read from Node.js Stream.Readable (must be a byte stream)\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nexport function fromWebStream(webStream, options) {\n return new ReadStreamTokenizer(new WebStreamReader(webStream), options);\n}\n/**\n * Construct ReadStreamTokenizer from given Buffer.\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Tokenizer options\n * @returns BufferTokenizer\n */\nexport function fromBuffer(uint8Array, options) {\n return new BufferTokenizer(uint8Array, options);\n}\n","import * as ieee754 from 'ieee754';\nimport { textDecode } from \"@borewit/text-codec\";\n// Primitive types\nfunction dv(array) {\n return new DataView(array.buffer, array.byteOffset);\n}\n/*\n * 8-bit unsigned integer\n */\nexport const UINT8 = {\n len: 1,\n get(array, offset) {\n return dv(array).getUint8(offset);\n },\n put(array, offset, value) {\n dv(array).setUint8(offset, value);\n return offset + 1;\n }\n};\n/**\n * 16-bit unsigned integer, Little Endian byte order\n */\nexport const UINT16_LE = {\n len: 2,\n get(array, offset) {\n return dv(array).getUint16(offset, true);\n },\n put(array, offset, value) {\n dv(array).setUint16(offset, value, true);\n return offset + 2;\n }\n};\n/**\n * 16-bit unsigned integer, Big Endian byte order\n */\nexport const UINT16_BE = {\n len: 2,\n get(array, offset) {\n return dv(array).getUint16(offset);\n },\n put(array, offset, value) {\n dv(array).setUint16(offset, value);\n return offset + 2;\n }\n};\n/**\n * 24-bit unsigned integer, Little Endian byte order\n */\nexport const UINT24_LE = {\n len: 3,\n get(array, offset) {\n const dataView = dv(array);\n return dataView.getUint8(offset) + (dataView.getUint16(offset + 1, true) << 8);\n },\n put(array, offset, value) {\n const dataView = dv(array);\n dataView.setUint8(offset, value & 0xff);\n dataView.setUint16(offset + 1, value >> 8, true);\n return offset + 3;\n }\n};\n/**\n * 24-bit unsigned integer, Big Endian byte order\n */\nexport const UINT24_BE = {\n len: 3,\n get(array, offset) {\n const dataView = dv(array);\n return (dataView.getUint16(offset) << 8) + dataView.getUint8(offset + 2);\n },\n put(array, offset, value) {\n const dataView = dv(array);\n dataView.setUint16(offset, value >> 8);\n dataView.setUint8(offset + 2, value & 0xff);\n return offset + 3;\n }\n};\n/**\n * 32-bit unsigned integer, Little Endian byte order\n */\nexport const UINT32_LE = {\n len: 4,\n get(array, offset) {\n return dv(array).getUint32(offset, true);\n },\n put(array, offset, value) {\n dv(array).setUint32(offset, value, true);\n return offset + 4;\n }\n};\n/**\n * 32-bit unsigned integer, Big Endian byte order\n */\nexport const UINT32_BE = {\n len: 4,\n get(array, offset) {\n return dv(array).getUint32(offset);\n },\n put(array, offset, value) {\n dv(array).setUint32(offset, value);\n return offset + 4;\n }\n};\n/**\n * 8-bit signed integer\n */\nexport const INT8 = {\n len: 1,\n get(array, offset) {\n return dv(array).getInt8(offset);\n },\n put(array, offset, value) {\n dv(array).setInt8(offset, value);\n return offset + 1;\n }\n};\n/**\n * 16-bit signed integer, Big Endian byte order\n */\nexport const INT16_BE = {\n len: 2,\n get(array, offset) {\n return dv(array).getInt16(offset);\n },\n put(array, offset, value) {\n dv(array).setInt16(offset, value);\n return offset + 2;\n }\n};\n/**\n * 16-bit signed integer, Little Endian byte order\n */\nexport const INT16_LE = {\n len: 2,\n get(array, offset) {\n return dv(array).getInt16(offset, true);\n },\n put(array, offset, value) {\n dv(array).setInt16(offset, value, true);\n return offset + 2;\n }\n};\n/**\n * 24-bit signed integer, Little Endian byte order\n */\nexport const INT24_LE = {\n len: 3,\n get(array, offset) {\n const unsigned = UINT24_LE.get(array, offset);\n return unsigned > 0x7fffff ? unsigned - 0x1000000 : unsigned;\n },\n put(array, offset, value) {\n const dataView = dv(array);\n dataView.setUint8(offset, value & 0xff);\n dataView.setUint16(offset + 1, value >> 8, true);\n return offset + 3;\n }\n};\n/**\n * 24-bit signed integer, Big Endian byte order\n */\nexport const INT24_BE = {\n len: 3,\n get(array, offset) {\n const unsigned = UINT24_BE.get(array, offset);\n return unsigned > 0x7fffff ? unsigned - 0x1000000 : unsigned;\n },\n put(array, offset, value) {\n const dataView = dv(array);\n dataView.setUint16(offset, value >> 8);\n dataView.setUint8(offset + 2, value & 0xff);\n return offset + 3;\n }\n};\n/**\n * 32-bit signed integer, Big Endian byte order\n */\nexport const INT32_BE = {\n len: 4,\n get(array, offset) {\n return dv(array).getInt32(offset);\n },\n put(array, offset, value) {\n dv(array).setInt32(offset, value);\n return offset + 4;\n }\n};\n/**\n * 32-bit signed integer, Big Endian byte order\n */\nexport const INT32_LE = {\n len: 4,\n get(array, offset) {\n return dv(array).getInt32(offset, true);\n },\n put(array, offset, value) {\n dv(array).setInt32(offset, value, true);\n return offset + 4;\n }\n};\n/**\n * 64-bit unsigned integer, Little Endian byte order\n */\nexport const UINT64_LE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigUint64(offset, true);\n },\n put(array, offset, value) {\n dv(array).setBigUint64(offset, value, true);\n return offset + 8;\n }\n};\n/**\n * 64-bit signed integer, Little Endian byte order\n */\nexport const INT64_LE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigInt64(offset, true);\n },\n put(array, offset, value) {\n dv(array).setBigInt64(offset, value, true);\n return offset + 8;\n }\n};\n/**\n * 64-bit unsigned integer, Big Endian byte order\n */\nexport const UINT64_BE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigUint64(offset);\n },\n put(array, offset, value) {\n dv(array).setBigUint64(offset, value);\n return offset + 8;\n }\n};\n/**\n * 64-bit signed integer, Big Endian byte order\n */\nexport const INT64_BE = {\n len: 8,\n get(array, offset) {\n return dv(array).getBigInt64(offset);\n },\n put(array, offset, value) {\n dv(array).setBigInt64(offset, value);\n return offset + 8;\n }\n};\n/**\n * IEEE 754 16-bit (half precision) float, big endian\n */\nexport const Float16_BE = {\n len: 2,\n get(dataView, offset) {\n return ieee754.read(dataView, offset, false, 10, this.len);\n },\n put(dataView, offset, value) {\n ieee754.write(dataView, value, offset, false, 10, this.len);\n return offset + this.len;\n }\n};\n/**\n * IEEE 754 16-bit (half precision) float, little endian\n */\nexport const Float16_LE = {\n len: 2,\n get(array, offset) {\n return ieee754.read(array, offset, true, 10, this.len);\n },\n put(array, offset, value) {\n ieee754.write(array, value, offset, true, 10, this.len);\n return offset + this.len;\n }\n};\n/**\n * IEEE 754 32-bit (single precision) float, big endian\n */\nexport const Float32_BE = {\n len: 4,\n get(array, offset) {\n return dv(array).getFloat32(offset);\n },\n put(array, offset, value) {\n dv(array).setFloat32(offset, value);\n return offset + 4;\n }\n};\n/**\n * IEEE 754 32-bit (single precision) float, little endian\n */\nexport const Float32_LE = {\n len: 4,\n get(array, offset) {\n return dv(array).getFloat32(offset, true);\n },\n put(array, offset, value) {\n dv(array).setFloat32(offset, value, true);\n return offset + 4;\n }\n};\n/**\n * IEEE 754 64-bit (double precision) float, big endian\n */\nexport const Float64_BE = {\n len: 8,\n get(array, offset) {\n return dv(array).getFloat64(offset);\n },\n put(array, offset, value) {\n dv(array).setFloat64(offset, value);\n return offset + 8;\n }\n};\n/**\n * IEEE 754 64-bit (double precision) float, little endian\n */\nexport const Float64_LE = {\n len: 8,\n get(array, offset) {\n return dv(array).getFloat64(offset, true);\n },\n put(array, offset, value) {\n dv(array).setFloat64(offset, value, true);\n return offset + 8;\n }\n};\n/**\n * IEEE 754 80-bit (extended precision) float, big endian\n */\nexport const Float80_BE = {\n len: 10,\n get(array, offset) {\n return ieee754.read(array, offset, false, 63, this.len);\n },\n put(array, offset, value) {\n ieee754.write(array, value, offset, false, 63, this.len);\n return offset + this.len;\n }\n};\n/**\n * IEEE 754 80-bit (extended precision) float, little endian\n */\nexport const Float80_LE = {\n len: 10,\n get(array, offset) {\n return ieee754.read(array, offset, true, 63, this.len);\n },\n put(array, offset, value) {\n ieee754.write(array, value, offset, true, 63, this.len);\n return offset + this.len;\n }\n};\n/**\n * Ignore a given number of bytes\n */\nexport class IgnoreType {\n /**\n * @param len number of bytes to ignore\n */\n constructor(len) {\n this.len = len;\n }\n // ToDo: don't read, but skip data\n get(_array, _off) {\n }\n}\nexport class Uint8ArrayType {\n constructor(len) {\n this.len = len;\n }\n get(array, offset) {\n return array.subarray(offset, offset + this.len);\n }\n}\n/**\n * Consume a fixed number of bytes from the stream and return a string with a specified encoding.\n * Supports all encodings supported by TextDecoder, plus 'windows-1252'.\n */\nexport class StringType {\n constructor(len, encoding) {\n this.len = len;\n this.encoding = encoding;\n }\n get(data, offset = 0) {\n const bytes = data.subarray(offset, offset + this.len);\n return textDecode(bytes, this.encoding);\n }\n}\n/**\n * ANSI Latin 1 String using Windows-1252 (Code Page 1252)\n * Windows-1252 is a superset of ISO 8859-1 / Latin-1.\n */\nexport class AnsiStringType extends StringType {\n constructor(len) {\n super(len, 'windows-1252');\n }\n}\n","const WINDOWS_1252_EXTRA = {\n 0x80: \"€\", 0x82: \"‚\", 0x83: \"ƒ\", 0x84: \"„\", 0x85: \"…\", 0x86: \"†\",\n 0x87: \"‡\", 0x88: \"ˆ\", 0x89: \"‰\", 0x8a: \"Š\", 0x8b: \"‹\", 0x8c: \"Œ\",\n 0x8e: \"Ž\", 0x91: \"‘\", 0x92: \"’\", 0x93: \"“\", 0x94: \"”\", 0x95: \"•\",\n 0x96: \"–\", 0x97: \"—\", 0x98: \"˜\", 0x99: \"™\", 0x9a: \"š\", 0x9b: \"›\",\n 0x9c: \"œ\", 0x9e: \"ž\", 0x9f: \"Ÿ\",\n};\nconst WINDOWS_1252_REVERSE = {};\nfor (const [code, char] of Object.entries(WINDOWS_1252_EXTRA)) {\n WINDOWS_1252_REVERSE[char] = Number.parseInt(code, 10);\n}\nlet _utf8Decoder;\nlet _utf8Encoder;\nfunction utf8Decoder() {\n if (typeof globalThis.TextDecoder === \"undefined\")\n return undefined;\n return (_utf8Decoder !== null && _utf8Decoder !== void 0 ? _utf8Decoder : (_utf8Decoder = new globalThis.TextDecoder(\"utf-8\")));\n}\nfunction utf8Encoder() {\n if (typeof globalThis.TextEncoder === \"undefined\")\n return undefined;\n return (_utf8Encoder !== null && _utf8Encoder !== void 0 ? _utf8Encoder : (_utf8Encoder = new globalThis.TextEncoder()));\n}\nconst CHUNK = 32 * 1024;\nconst REPLACEMENT = 0xfffd;\n/**\n * Decode text from binary data\n */\nexport function textDecode(bytes, encoding = \"utf-8\") {\n switch (encoding.toLowerCase()) {\n case \"utf-8\":\n case \"utf8\": {\n const dec = utf8Decoder();\n return dec ? dec.decode(bytes) : decodeUTF8(bytes);\n }\n case \"utf-16le\":\n return decodeUTF16LE(bytes);\n case \"us-ascii\":\n case \"ascii\":\n return decodeASCII(bytes);\n case \"latin1\":\n case \"iso-8859-1\":\n return decodeLatin1(bytes);\n case \"windows-1252\":\n return decodeWindows1252(bytes);\n default:\n throw new RangeError(`Encoding '${encoding}' not supported`);\n }\n}\nexport function textEncode(input = \"\", encoding = \"utf-8\") {\n switch (encoding.toLowerCase()) {\n case \"utf-8\":\n case \"utf8\": {\n const enc = utf8Encoder();\n return enc ? enc.encode(input) : encodeUTF8(input);\n }\n case \"utf-16le\":\n return encodeUTF16LE(input);\n case \"us-ascii\":\n case \"ascii\":\n return encodeASCII(input);\n case \"latin1\":\n case \"iso-8859-1\":\n return encodeLatin1(input);\n case \"windows-1252\":\n return encodeWindows1252(input);\n default:\n throw new RangeError(`Encoding '${encoding}' not supported`);\n }\n}\nfunction appendCodePoint(out, cp) {\n if (cp <= 0xffff) {\n out.push(String.fromCharCode(cp));\n return;\n }\n cp -= 0x10000;\n out.push(String.fromCharCode(0xd800 + (cp >> 10), 0xdc00 + (cp & 0x3ff)));\n}\nfunction flushChunk(parts, chunk) {\n if (chunk.length === 0)\n return;\n parts.push(String.fromCharCode.apply(null, chunk));\n chunk.length = 0;\n}\nfunction pushCodeUnit(parts, chunk, codeUnit) {\n chunk.push(codeUnit);\n if (chunk.length >= CHUNK)\n flushChunk(parts, chunk);\n}\nfunction pushCodePoint(parts, chunk, cp) {\n if (cp <= 0xffff) {\n pushCodeUnit(parts, chunk, cp);\n return;\n }\n cp -= 0x10000;\n pushCodeUnit(parts, chunk, 0xd800 + (cp >> 10));\n pushCodeUnit(parts, chunk, 0xdc00 + (cp & 0x3ff));\n}\nfunction decodeUTF8(bytes) {\n const parts = [];\n const chunk = [];\n let i = 0;\n // Match TextDecoder(\"utf-8\") default BOM handling\n if (bytes.length >= 3 &&\n bytes[0] === 0xef &&\n bytes[1] === 0xbb &&\n bytes[2] === 0xbf) {\n i = 3;\n }\n while (i < bytes.length) {\n const b1 = bytes[i];\n if (b1 <= 0x7f) {\n pushCodeUnit(parts, chunk, b1);\n i++;\n continue;\n }\n // Invalid leading bytes: continuation byte or impossible prefixes\n if (b1 < 0xc2 || b1 > 0xf4) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n i++;\n continue;\n }\n // 2-byte sequence\n if (b1 <= 0xdf) {\n if (i + 1 >= bytes.length) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n i++;\n continue;\n }\n const b2 = bytes[i + 1];\n if ((b2 & 0xc0) !== 0x80) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n i++;\n continue;\n }\n const cp = ((b1 & 0x1f) << 6) | (b2 & 0x3f);\n pushCodeUnit(parts, chunk, cp);\n i += 2;\n continue;\n }\n // 3-byte sequence\n if (b1 <= 0xef) {\n if (i + 2 >= bytes.length) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n i++;\n continue;\n }\n const b2 = bytes[i + 1];\n const b3 = bytes[i + 2];\n const valid = (b2 & 0xc0) === 0x80 &&\n (b3 & 0xc0) === 0x80 &&\n !(b1 === 0xe0 && b2 < 0xa0) && // overlong\n !(b1 === 0xed && b2 >= 0xa0); // surrogate range\n if (!valid) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n i++;\n continue;\n }\n const cp = ((b1 & 0x0f) << 12) |\n ((b2 & 0x3f) << 6) |\n (b3 & 0x3f);\n pushCodeUnit(parts, chunk, cp);\n i += 3;\n continue;\n }\n // 4-byte sequence\n if (i + 3 >= bytes.length) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n i++;\n continue;\n }\n const b2 = bytes[i + 1];\n const b3 = bytes[i + 2];\n const b4 = bytes[i + 3];\n const valid = (b2 & 0xc0) === 0x80 &&\n (b3 & 0xc0) === 0x80 &&\n (b4 & 0xc0) === 0x80 &&\n !(b1 === 0xf0 && b2 < 0x90) && // overlong\n !(b1 === 0xf4 && b2 > 0x8f); // > U+10FFFF\n if (!valid) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n i++;\n continue;\n }\n const cp = ((b1 & 0x07) << 18) |\n ((b2 & 0x3f) << 12) |\n ((b3 & 0x3f) << 6) |\n (b4 & 0x3f);\n pushCodePoint(parts, chunk, cp);\n i += 4;\n }\n flushChunk(parts, chunk);\n return parts.join(\"\");\n}\nfunction decodeUTF16LE(bytes) {\n const parts = [];\n const chunk = [];\n const len = bytes.length;\n let i = 0;\n while (i + 1 < len) {\n const u1 = bytes[i] | (bytes[i + 1] << 8);\n i += 2;\n // High surrogate\n if (u1 >= 0xd800 && u1 <= 0xdbff) {\n if (i + 1 < len) {\n const u2 = bytes[i] | (bytes[i + 1] << 8);\n if (u2 >= 0xdc00 && u2 <= 0xdfff) {\n pushCodeUnit(parts, chunk, u1);\n pushCodeUnit(parts, chunk, u2);\n i += 2;\n }\n else {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n }\n }\n else {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n }\n continue;\n }\n // Lone low surrogate\n if (u1 >= 0xdc00 && u1 <= 0xdfff) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n continue;\n }\n pushCodeUnit(parts, chunk, u1);\n }\n // Odd trailing byte\n if (i < len) {\n pushCodeUnit(parts, chunk, REPLACEMENT);\n }\n flushChunk(parts, chunk);\n return parts.join(\"\");\n}\nfunction decodeASCII(bytes) {\n const parts = [];\n for (let i = 0; i < bytes.length; i += CHUNK) {\n const end = Math.min(bytes.length, i + CHUNK);\n const codes = new Array(end - i);\n for (let j = i, k = 0; j < end; j++, k++) {\n codes[k] = bytes[j] & 0x7f;\n }\n parts.push(String.fromCharCode.apply(null, codes));\n }\n return parts.join(\"\");\n}\nfunction decodeLatin1(bytes) {\n const parts = [];\n for (let i = 0; i < bytes.length; i += CHUNK) {\n const end = Math.min(bytes.length, i + CHUNK);\n const codes = new Array(end - i);\n for (let j = i, k = 0; j < end; j++, k++) {\n codes[k] = bytes[j];\n }\n parts.push(String.fromCharCode.apply(null, codes));\n }\n return parts.join(\"\");\n}\nfunction decodeWindows1252(bytes) {\n const parts = [];\n let out = \"\";\n for (let i = 0; i < bytes.length; i++) {\n const b = bytes[i];\n const extra = b >= 0x80 && b <= 0x9f ? WINDOWS_1252_EXTRA[b] : undefined;\n out += extra !== null && extra !== void 0 ? extra : String.fromCharCode(b);\n if (out.length >= CHUNK) {\n parts.push(out);\n out = \"\";\n }\n }\n if (out)\n parts.push(out);\n return parts.join(\"\");\n}\nfunction encodeUTF8(str) {\n const out = [];\n for (let i = 0; i < str.length; i++) {\n let cp = str.charCodeAt(i);\n // Valid surrogate pair\n if (cp >= 0xd800 && cp <= 0xdbff) {\n if (i + 1 < str.length) {\n const lo = str.charCodeAt(i + 1);\n if (lo >= 0xdc00 && lo <= 0xdfff) {\n cp = 0x10000 + ((cp - 0xd800) << 10) + (lo - 0xdc00);\n i++;\n }\n else {\n cp = REPLACEMENT;\n }\n }\n else {\n cp = REPLACEMENT;\n }\n }\n else if (cp >= 0xdc00 && cp <= 0xdfff) {\n // Lone low surrogate\n cp = REPLACEMENT;\n }\n if (cp < 0x80) {\n out.push(cp);\n }\n else if (cp < 0x800) {\n out.push(0xc0 | (cp >> 6), 0x80 | (cp & 0x3f));\n }\n else if (cp < 0x10000) {\n out.push(0xe0 | (cp >> 12), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));\n }\n else {\n out.push(0xf0 | (cp >> 18), 0x80 | ((cp >> 12) & 0x3f), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));\n }\n }\n return new Uint8Array(out);\n}\nfunction encodeUTF16LE(str) {\n // Preserve JS string code units, but do not emit non-well-formed UTF-16.\n // Replace lone surrogates with U+FFFD.\n const units = [];\n for (let i = 0; i < str.length; i++) {\n const u = str.charCodeAt(i);\n if (u >= 0xd800 && u <= 0xdbff) {\n if (i + 1 < str.length) {\n const lo = str.charCodeAt(i + 1);\n if (lo >= 0xdc00 && lo <= 0xdfff) {\n units.push(u, lo);\n i++;\n }\n else {\n units.push(REPLACEMENT);\n }\n }\n else {\n units.push(REPLACEMENT);\n }\n continue;\n }\n if (u >= 0xdc00 && u <= 0xdfff) {\n units.push(REPLACEMENT);\n continue;\n }\n units.push(u);\n }\n const out = new Uint8Array(units.length * 2);\n for (let i = 0; i < units.length; i++) {\n const code = units[i];\n const o = i * 2;\n out[o] = code & 0xff;\n out[o + 1] = code >>> 8;\n }\n return out;\n}\nfunction encodeASCII(str) {\n const out = new Uint8Array(str.length);\n for (let i = 0; i < str.length; i++)\n out[i] = str.charCodeAt(i) & 0x7f;\n return out;\n}\nfunction encodeLatin1(str) {\n const out = new Uint8Array(str.length);\n for (let i = 0; i < str.length; i++)\n out[i] = str.charCodeAt(i) & 0xff;\n return out;\n}\nfunction encodeWindows1252(str) {\n const out = new Uint8Array(str.length);\n for (let i = 0; i < str.length; i++) {\n const ch = str[i];\n const code = ch.charCodeAt(0);\n if (WINDOWS_1252_REVERSE[ch] !== undefined) {\n out[i] = WINDOWS_1252_REVERSE[ch];\n continue;\n }\n if ((code >= 0x00 && code <= 0x7f) ||\n (code >= 0xa0 && code <= 0xff)) {\n out[i] = code;\n continue;\n }\n out[i] = 0x3f; // '?'\n }\n return out;\n}\n","const objectToString = Object.prototype.toString;\nconst uint8ArrayStringified = '[object Uint8Array]';\nconst arrayBufferStringified = '[object ArrayBuffer]';\n\nfunction isType(value, typeConstructor, typeStringified) {\n\tif (!value) {\n\t\treturn false;\n\t}\n\n\tif (value.constructor === typeConstructor) {\n\t\treturn true;\n\t}\n\n\treturn objectToString.call(value) === typeStringified;\n}\n\nexport function isUint8Array(value) {\n\treturn isType(value, Uint8Array, uint8ArrayStringified);\n}\n\nfunction isArrayBuffer(value) {\n\treturn isType(value, ArrayBuffer, arrayBufferStringified);\n}\n\nfunction isUint8ArrayOrArrayBuffer(value) {\n\treturn isUint8Array(value) || isArrayBuffer(value);\n}\n\nexport function assertUint8Array(value) {\n\tif (!isUint8Array(value)) {\n\t\tthrow new TypeError(`Expected \\`Uint8Array\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nexport function assertUint8ArrayOrArrayBuffer(value) {\n\tif (!isUint8ArrayOrArrayBuffer(value)) {\n\t\tthrow new TypeError(`Expected \\`Uint8Array\\` or \\`ArrayBuffer\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nexport function toUint8Array(value) {\n\tif (value instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(value);\n\t}\n\n\tif (ArrayBuffer.isView(value)) {\n\t\treturn new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n\t}\n\n\tthrow new TypeError(`Unsupported value, got \\`${typeof value}\\`.`);\n}\n\nexport function concatUint8Arrays(arrays, totalLength) {\n\tif (arrays.length === 0) {\n\t\treturn new Uint8Array(0);\n\t}\n\n\ttotalLength ??= arrays.reduce((accumulator, currentValue) => accumulator + currentValue.length, 0);\n\n\tconst returnValue = new Uint8Array(totalLength);\n\n\tlet offset = 0;\n\tfor (const array of arrays) {\n\t\tassertUint8Array(array);\n\t\treturnValue.set(array, offset);\n\t\toffset += array.length;\n\t}\n\n\treturn returnValue;\n}\n\nexport function areUint8ArraysEqual(a, b) {\n\tassertUint8Array(a);\n\tassertUint8Array(b);\n\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a.length !== b.length) {\n\t\treturn false;\n\t}\n\n\t// eslint-disable-next-line unicorn/no-for-loop\n\tfor (let index = 0; index < a.length; index++) {\n\t\tif (a[index] !== b[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport function compareUint8Arrays(a, b) {\n\tassertUint8Array(a);\n\tassertUint8Array(b);\n\n\tconst length = Math.min(a.length, b.length);\n\n\tfor (let index = 0; index < length; index++) {\n\t\tconst diff = a[index] - b[index];\n\t\tif (diff !== 0) {\n\t\t\treturn Math.sign(diff);\n\t\t}\n\t}\n\n\t// At this point, all the compared elements are equal.\n\t// The shorter array should come first if the arrays are of different lengths.\n\treturn Math.sign(a.length - b.length);\n}\n\nconst cachedDecoders = {\n\tutf8: new globalThis.TextDecoder('utf8'),\n};\n\nexport function uint8ArrayToString(array, encoding = 'utf8') {\n\tassertUint8ArrayOrArrayBuffer(array);\n\tcachedDecoders[encoding] ??= new globalThis.TextDecoder(encoding);\n\treturn cachedDecoders[encoding].decode(array);\n}\n\nfunction assertString(value) {\n\tif (typeof value !== 'string') {\n\t\tthrow new TypeError(`Expected \\`string\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nconst cachedEncoder = new globalThis.TextEncoder();\n\nexport function stringToUint8Array(string) {\n\tassertString(string);\n\treturn cachedEncoder.encode(string);\n}\n\nfunction base64ToBase64Url(base64) {\n\treturn base64.replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');\n}\n\nfunction base64UrlToBase64(base64url) {\n\tconst base64 = base64url.replaceAll('-', '+').replaceAll('_', '/');\n\tconst padding = (4 - (base64.length % 4)) % 4;\n\treturn base64 + '='.repeat(padding);\n}\n\n// Reference: https://phuoc.ng/collection/this-vs-that/concat-vs-push/\n// Important: Keep this value divisible by 3 so intermediate chunks produce no Base64 padding.\nconst MAX_BLOCK_SIZE = 65_535;\n\nexport function uint8ArrayToBase64(array, {urlSafe = false} = {}) {\n\tassertUint8Array(array);\n\n\tlet base64 = '';\n\n\tfor (let index = 0; index < array.length; index += MAX_BLOCK_SIZE) {\n\t\tconst chunk = array.subarray(index, index + MAX_BLOCK_SIZE);\n\t\t// Required as `btoa` and `atob` don't properly support Unicode: https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem\n\t\tbase64 += globalThis.btoa(String.fromCodePoint.apply(undefined, chunk));\n\t}\n\n\treturn urlSafe ? base64ToBase64Url(base64) : base64;\n}\n\nexport function base64ToUint8Array(base64String) {\n\tassertString(base64String);\n\treturn Uint8Array.from(globalThis.atob(base64UrlToBase64(base64String)), x => x.codePointAt(0));\n}\n\nexport function stringToBase64(string, {urlSafe = false} = {}) {\n\tassertString(string);\n\treturn uint8ArrayToBase64(stringToUint8Array(string), {urlSafe});\n}\n\nexport function base64ToString(base64String) {\n\tassertString(base64String);\n\treturn uint8ArrayToString(base64ToUint8Array(base64String));\n}\n\nconst byteToHexLookupTable = Array.from({length: 256}, (_, index) => index.toString(16).padStart(2, '0'));\n\nexport function uint8ArrayToHex(array) {\n\tassertUint8Array(array);\n\n\t// Concatenating a string is faster than using an array.\n\tlet hexString = '';\n\n\t// eslint-disable-next-line unicorn/no-for-loop -- Max performance is critical.\n\tfor (let index = 0; index < array.length; index++) {\n\t\thexString += byteToHexLookupTable[array[index]];\n\t}\n\n\treturn hexString;\n}\n\nconst hexToDecimalLookupTable = {\n\t0: 0,\n\t1: 1,\n\t2: 2,\n\t3: 3,\n\t4: 4,\n\t5: 5,\n\t6: 6,\n\t7: 7,\n\t8: 8,\n\t9: 9,\n\ta: 10,\n\tb: 11,\n\tc: 12,\n\td: 13,\n\te: 14,\n\tf: 15,\n\tA: 10,\n\tB: 11,\n\tC: 12,\n\tD: 13,\n\tE: 14,\n\tF: 15,\n};\n\nexport function hexToUint8Array(hexString) {\n\tassertString(hexString);\n\n\tif (hexString.length % 2 !== 0) {\n\t\tthrow new Error('Invalid Hex string length.');\n\t}\n\n\tconst resultLength = hexString.length / 2;\n\tconst bytes = new Uint8Array(resultLength);\n\n\tfor (let index = 0; index < resultLength; index++) {\n\t\tconst highNibble = hexToDecimalLookupTable[hexString[index * 2]];\n\t\tconst lowNibble = hexToDecimalLookupTable[hexString[(index * 2) + 1]];\n\n\t\tif (highNibble === undefined || lowNibble === undefined) {\n\t\t\tthrow new Error(`Invalid Hex character encountered at position ${index * 2}`);\n\t\t}\n\n\t\tbytes[index] = (highNibble << 4) | lowNibble; // eslint-disable-line no-bitwise\n\t}\n\n\treturn bytes;\n}\n\n/**\n@param {DataView} view\n@returns {number}\n*/\nexport function getUintBE(view) {\n\tconst {byteLength} = view;\n\n\tif (byteLength === 6) {\n\t\treturn (view.getUint16(0) * (2 ** 32)) + view.getUint32(2);\n\t}\n\n\tif (byteLength === 5) {\n\t\treturn (view.getUint8(0) * (2 ** 32)) + view.getUint32(1);\n\t}\n\n\tif (byteLength === 4) {\n\t\treturn view.getUint32(0);\n\t}\n\n\tif (byteLength === 3) {\n\t\treturn (view.getUint8(0) * (2 ** 16)) + view.getUint16(1);\n\t}\n\n\tif (byteLength === 2) {\n\t\treturn view.getUint16(0);\n\t}\n\n\tif (byteLength === 1) {\n\t\treturn view.getUint8(0);\n\t}\n}\n\n/**\n@param {Uint8Array} array\n@param {Uint8Array} value\n@returns {number}\n*/\nexport function indexOf(array, value) {\n\tconst arrayLength = array.length;\n\tconst valueLength = value.length;\n\n\tif (valueLength === 0) {\n\t\treturn -1;\n\t}\n\n\tif (valueLength > arrayLength) {\n\t\treturn -1;\n\t}\n\n\tconst validOffsetLength = arrayLength - valueLength;\n\n\tfor (let index = 0; index <= validOffsetLength; index++) {\n\t\tlet isMatch = true;\n\t\tfor (let index2 = 0; index2 < valueLength; index2++) {\n\t\t\tif (array[index + index2] !== value[index2]) {\n\t\t\t\tisMatch = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (isMatch) {\n\t\t\treturn index;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n@param {Uint8Array} array\n@param {Uint8Array} value\n@returns {boolean}\n*/\nexport function includes(array, value) {\n\treturn indexOf(array, value) !== -1;\n}\n","import {StringType} from 'token-types';\n\nexport function stringToBytes(string) {\n\treturn [...string].map(character => character.charCodeAt(0)); // eslint-disable-line unicorn/prefer-code-point\n}\n\n/**\nChecks whether the TAR checksum is valid.\n\n@param {Uint8Array} arrayBuffer - The TAR header `[offset ... offset + 512]`.\n@param {number} offset - TAR header offset.\n@returns {boolean} `true` if the TAR checksum is valid, otherwise `false`.\n*/\nexport function tarHeaderChecksumMatches(arrayBuffer, offset = 0) {\n\tconst readSum = Number.parseInt(new StringType(6).get(arrayBuffer, 148).replace(/\\0.*$/, '').trim(), 8); // Read sum in header\n\tif (Number.isNaN(readSum)) {\n\t\treturn false;\n\t}\n\n\tlet sum = 8 * 0x20; // Initialize signed bit sum\n\n\tfor (let index = offset; index < offset + 148; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\tfor (let index = offset + 156; index < offset + 512; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\treturn readSum === sum;\n}\n\n/**\nID3 UINT32 sync-safe tokenizer token.\n28 bits (representing up to 256MB) integer, the msb is 0 to avoid \"false syncsignals\".\n*/\nexport const uint32SyncSafeToken = {\n\tget: (buffer, offset) => (buffer[offset + 3] & 0x7F) | ((buffer[offset + 2]) << 7) | ((buffer[offset + 1]) << 14) | ((buffer[offset]) << 21),\n\tlen: 4,\n};\n","export const extensions = [\n\t'jpg',\n\t'png',\n\t'apng',\n\t'gif',\n\t'webp',\n\t'flif',\n\t'xcf',\n\t'cr2',\n\t'cr3',\n\t'orf',\n\t'arw',\n\t'dng',\n\t'nef',\n\t'rw2',\n\t'raf',\n\t'tif',\n\t'bmp',\n\t'icns',\n\t'jxr',\n\t'psd',\n\t'indd',\n\t'zip',\n\t'tar',\n\t'rar',\n\t'gz',\n\t'bz2',\n\t'7z',\n\t'dmg',\n\t'mp4',\n\t'mid',\n\t'mkv',\n\t'webm',\n\t'mov',\n\t'avi',\n\t'mpg',\n\t'mp2',\n\t'mp3',\n\t'm4a',\n\t'oga',\n\t'ogg',\n\t'ogv',\n\t'opus',\n\t'flac',\n\t'wav',\n\t'spx',\n\t'amr',\n\t'pdf',\n\t'epub',\n\t'elf',\n\t'macho',\n\t'exe',\n\t'swf',\n\t'rtf',\n\t'wasm',\n\t'woff',\n\t'woff2',\n\t'eot',\n\t'ttf',\n\t'otf',\n\t'ico',\n\t'flv',\n\t'ps',\n\t'xz',\n\t'sqlite',\n\t'nes',\n\t'crx',\n\t'xpi',\n\t'cab',\n\t'deb',\n\t'ar',\n\t'rpm',\n\t'Z',\n\t'lz',\n\t'cfb',\n\t'mxf',\n\t'mts',\n\t'blend',\n\t'bpg',\n\t'docx',\n\t'pptx',\n\t'xlsx',\n\t'3gp',\n\t'3g2',\n\t'j2c',\n\t'jp2',\n\t'jpm',\n\t'jpx',\n\t'mj2',\n\t'aif',\n\t'qcp',\n\t'odt',\n\t'ods',\n\t'odp',\n\t'xml',\n\t'mobi',\n\t'heic',\n\t'cur',\n\t'ktx',\n\t'ape',\n\t'wv',\n\t'dcm',\n\t'ics',\n\t'glb',\n\t'pcap',\n\t'dsf',\n\t'lnk',\n\t'alias',\n\t'voc',\n\t'ac3',\n\t'm4v',\n\t'm4p',\n\t'm4b',\n\t'f4v',\n\t'f4p',\n\t'f4b',\n\t'f4a',\n\t'mie',\n\t'asf',\n\t'ogm',\n\t'ogx',\n\t'mpc',\n\t'arrow',\n\t'shp',\n\t'aac',\n\t'mp1',\n\t'it',\n\t's3m',\n\t'xm',\n\t'ai',\n\t'skp',\n\t'avif',\n\t'eps',\n\t'lzh',\n\t'pgp',\n\t'asar',\n\t'stl',\n\t'chm',\n\t'3mf',\n\t'zst',\n\t'jxl',\n\t'vcf',\n\t'jls',\n\t'pst',\n\t'dwg',\n\t'parquet',\n\t'class',\n\t'arj',\n\t'cpio',\n\t'ace',\n\t'avro',\n\t'icc',\n\t'fbx',\n\t'vsdx',\n\t'vtt',\n\t'apk',\n];\n\nexport const mimeTypes = [\n\t'image/jpeg',\n\t'image/png',\n\t'image/gif',\n\t'image/webp',\n\t'image/flif',\n\t'image/x-xcf',\n\t'image/x-canon-cr2',\n\t'image/x-canon-cr3',\n\t'image/tiff',\n\t'image/bmp',\n\t'image/vnd.ms-photo',\n\t'image/vnd.adobe.photoshop',\n\t'application/x-indesign',\n\t'application/epub+zip',\n\t'application/x-xpinstall',\n\t'application/vnd.oasis.opendocument.text',\n\t'application/vnd.oasis.opendocument.spreadsheet',\n\t'application/vnd.oasis.opendocument.presentation',\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t'application/zip',\n\t'application/x-tar',\n\t'application/x-rar-compressed',\n\t'application/gzip',\n\t'application/x-bzip2',\n\t'application/x-7z-compressed',\n\t'application/x-apple-diskimage',\n\t'application/x-apache-arrow',\n\t'video/mp4',\n\t'audio/midi',\n\t'video/x-matroska',\n\t'video/webm',\n\t'video/quicktime',\n\t'video/vnd.avi',\n\t'audio/wav',\n\t'audio/qcelp',\n\t'audio/x-ms-asf',\n\t'video/x-ms-asf',\n\t'application/vnd.ms-asf',\n\t'video/mpeg',\n\t'video/3gpp',\n\t'audio/mpeg',\n\t'audio/mp4', // RFC 4337\n\t'video/ogg',\n\t'audio/ogg',\n\t'audio/ogg; codecs=opus',\n\t'application/ogg',\n\t'audio/x-flac',\n\t'audio/ape',\n\t'audio/wavpack',\n\t'audio/amr',\n\t'application/pdf',\n\t'application/x-elf',\n\t'application/x-mach-binary',\n\t'application/x-msdownload',\n\t'application/x-shockwave-flash',\n\t'application/rtf',\n\t'application/wasm',\n\t'font/woff',\n\t'font/woff2',\n\t'application/vnd.ms-fontobject',\n\t'font/ttf',\n\t'font/otf',\n\t'image/x-icon',\n\t'video/x-flv',\n\t'application/postscript',\n\t'application/eps',\n\t'application/x-xz',\n\t'application/x-sqlite3',\n\t'application/x-nintendo-nes-rom',\n\t'application/x-google-chrome-extension',\n\t'application/vnd.ms-cab-compressed',\n\t'application/x-deb',\n\t'application/x-unix-archive',\n\t'application/x-rpm',\n\t'application/x-compress',\n\t'application/x-lzip',\n\t'application/x-cfb',\n\t'application/x-mie',\n\t'application/mxf',\n\t'video/mp2t',\n\t'application/x-blender',\n\t'image/bpg',\n\t'image/j2c',\n\t'image/jp2',\n\t'image/jpx',\n\t'image/jpm',\n\t'image/mj2',\n\t'audio/aiff',\n\t'application/xml',\n\t'application/x-mobipocket-ebook',\n\t'image/heif',\n\t'image/heif-sequence',\n\t'image/heic',\n\t'image/heic-sequence',\n\t'image/icns',\n\t'image/ktx',\n\t'application/dicom',\n\t'audio/x-musepack',\n\t'text/calendar',\n\t'text/vcard',\n\t'text/vtt',\n\t'model/gltf-binary',\n\t'application/vnd.tcpdump.pcap',\n\t'audio/x-dsf', // Non-standard\n\t'application/x.ms.shortcut', // Invented by us\n\t'application/x.apple.alias', // Invented by us\n\t'audio/x-voc',\n\t'audio/vnd.dolby.dd-raw',\n\t'audio/x-m4a',\n\t'image/apng',\n\t'image/x-olympus-orf',\n\t'image/x-sony-arw',\n\t'image/x-adobe-dng',\n\t'image/x-nikon-nef',\n\t'image/x-panasonic-rw2',\n\t'image/x-fujifilm-raf',\n\t'video/x-m4v',\n\t'video/3gpp2',\n\t'application/x-esri-shape',\n\t'audio/aac',\n\t'audio/x-it',\n\t'audio/x-s3m',\n\t'audio/x-xm',\n\t'video/MP1S',\n\t'video/MP2P',\n\t'application/vnd.sketchup.skp',\n\t'image/avif',\n\t'application/x-lzh-compressed',\n\t'application/pgp-encrypted',\n\t'application/x-asar',\n\t'model/stl',\n\t'application/vnd.ms-htmlhelp',\n\t'model/3mf',\n\t'image/jxl',\n\t'application/zstd',\n\t'image/jls',\n\t'application/vnd.ms-outlook',\n\t'image/vnd.dwg',\n\t'application/x-parquet',\n\t'application/java-vm',\n\t'application/x-arj',\n\t'application/x-cpio',\n\t'application/x-ace-compressed',\n\t'application/avro',\n\t'application/vnd.iccprofile',\n\t'application/x.autodesk.fbx', // Invented by us\n\t'application/vnd.visio',\n\t'application/vnd.android.package-archive',\n];\n","/**\nPrimary entry point, Node.js specific entry point is index.js\n*/\n\nimport * as Token from 'token-types';\nimport * as strtok3 from 'strtok3/core';\nimport {includes, indexOf, getUintBE} from 'uint8array-extras';\nimport {\n\tstringToBytes,\n\ttarHeaderChecksumMatches,\n\tuint32SyncSafeToken,\n} from './util.js';\nimport {extensions, mimeTypes} from './supported.js';\n\nexport const reasonableDetectionSizeInBytes = 4100; // A fair amount of file-types are detectable within this range.\n\nexport async function fileTypeFromStream(stream) {\n\treturn new FileTypeParser().fromStream(stream);\n}\n\nexport async function fileTypeFromBuffer(input) {\n\treturn new FileTypeParser().fromBuffer(input);\n}\n\nexport async function fileTypeFromBlob(blob) {\n\treturn new FileTypeParser().fromBlob(blob);\n}\n\nfunction _check(buffer, headers, options) {\n\toptions = {\n\t\toffset: 0,\n\t\t...options,\n\t};\n\n\tfor (const [index, header] of headers.entries()) {\n\t\t// If a bitmask is set\n\t\tif (options.mask) {\n\t\t\t// If header doesn't equal `buf` with bits masked off\n\t\t\tif (header !== (options.mask[index] & buffer[index + options.offset])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (header !== buffer[index + options.offset]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport async function fileTypeFromTokenizer(tokenizer) {\n\treturn new FileTypeParser().fromTokenizer(tokenizer);\n}\n\nexport async function fileTypeStream(webStream, options) {\n\treturn new FileTypeParser(options).toDetectionStream(webStream, options);\n}\n\nexport class FileTypeParser {\n\tconstructor(options) {\n\t\tthis.detectors = options?.customDetectors;\n\t\tthis.tokenizerOptions = {\n\t\t\tabortSignal: options?.signal,\n\t\t};\n\t\tthis.fromTokenizer = this.fromTokenizer.bind(this);\n\t\tthis.fromBuffer = this.fromBuffer.bind(this);\n\t\tthis.parse = this.parse.bind(this);\n\t}\n\n\tasync fromTokenizer(tokenizer) {\n\t\tconst initialPosition = tokenizer.position;\n\n\t\tfor (const detector of this.detectors || []) {\n\t\t\tconst fileType = await detector(tokenizer);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\n\t\t\tif (initialPosition !== tokenizer.position) {\n\t\t\t\treturn undefined; // Cannot proceed scanning of the tokenizer is at an arbitrary position\n\t\t\t}\n\t\t}\n\n\t\treturn this.parse(tokenizer);\n\t}\n\n\tasync fromBuffer(input) {\n\t\tif (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) {\n\t\t\tthrow new TypeError(`Expected the \\`input\\` argument to be of type \\`Uint8Array\\` or \\`ArrayBuffer\\`, got \\`${typeof input}\\``);\n\t\t}\n\n\t\tconst buffer = input instanceof Uint8Array ? input : new Uint8Array(input);\n\n\t\tif (!(buffer?.length > 1)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.fromTokenizer(strtok3.fromBuffer(buffer, this.tokenizerOptions));\n\t}\n\n\tasync fromBlob(blob) {\n\t\treturn this.fromStream(blob.stream());\n\t}\n\n\tasync fromStream(stream) {\n\t\tconst tokenizer = await strtok3.fromWebStream(stream, this.tokenizerOptions);\n\t\ttry {\n\t\t\treturn await this.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync toDetectionStream(stream, options) {\n\t\tconst {sampleSize = reasonableDetectionSizeInBytes} = options;\n\t\tlet detectedFileType;\n\t\tlet firstChunk;\n\n\t\tconst reader = stream.getReader({mode: 'byob'});\n\t\ttry {\n\t\t\t// Read the first chunk from the stream\n\t\t\tconst {value: chunk, done} = await reader.read(new Uint8Array(sampleSize));\n\t\t\tfirstChunk = chunk;\n\t\t\tif (!done && chunk) {\n\t\t\t\ttry {\n\t\t\t\t\t// Attempt to detect the file type from the chunk\n\t\t\t\t\tdetectedFileType = await this.fromBuffer(chunk.slice(0, sampleSize));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\t\tthrow error; // Re-throw non-EndOfStreamError\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedFileType = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirstChunk = chunk;\n\t\t} finally {\n\t\t\treader.releaseLock(); // Ensure the reader is released\n\t\t}\n\n\t\t// Create a new ReadableStream to manage locking issues\n\t\tconst transformStream = new TransformStream({\n\t\t\tasync start(controller) {\n\t\t\t\tcontroller.enqueue(firstChunk); // Enqueue the initial chunk\n\t\t\t},\n\t\t\ttransform(chunk, controller) {\n\t\t\t\t// Pass through the chunks without modification\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t},\n\t\t});\n\n\t\tconst newStream = stream.pipeThrough(transformStream);\n\t\tnewStream.fileType = detectedFileType;\n\n\t\treturn newStream;\n\t}\n\n\tcheck(header, options) {\n\t\treturn _check(this.buffer, header, options);\n\t}\n\n\tcheckString(header, options) {\n\t\treturn this.check(stringToBytes(header), options);\n\t}\n\n\tasync parse(tokenizer) {\n\t\tthis.buffer = new Uint8Array(reasonableDetectionSizeInBytes);\n\n\t\t// Keep reading until EOF if the file size is unknown.\n\t\tif (tokenizer.fileInfo.size === undefined) {\n\t\t\ttokenizer.fileInfo.size = Number.MAX_SAFE_INTEGER;\n\t\t}\n\n\t\tthis.tokenizer = tokenizer;\n\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: 12, mayBeLess: true});\n\n\t\t// -- 2-byte signatures --\n\n\t\tif (this.check([0x42, 0x4D])) {\n\t\t\treturn {\n\t\t\t\text: 'bmp',\n\t\t\t\tmime: 'image/bmp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x0B, 0x77])) {\n\t\t\treturn {\n\t\t\t\text: 'ac3',\n\t\t\t\tmime: 'audio/vnd.dolby.dd-raw',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x78, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'dmg',\n\t\t\t\tmime: 'application/x-apple-diskimage',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4D, 0x5A])) {\n\t\t\treturn {\n\t\t\t\text: 'exe',\n\t\t\t\tmime: 'application/x-msdownload',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x25, 0x21])) {\n\t\t\tawait tokenizer.peekBuffer(this.buffer, {length: 24, mayBeLess: true});\n\n\t\t\tif (\n\t\t\t\tthis.checkString('PS-Adobe-', {offset: 2})\n\t\t\t\t&& this.checkString(' EPSF-', {offset: 14})\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'eps',\n\t\t\t\t\tmime: 'application/eps',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ps',\n\t\t\t\tmime: 'application/postscript',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x1F, 0xA0])\n\t\t\t|| this.check([0x1F, 0x9D])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'Z',\n\t\t\t\tmime: 'application/x-compress',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC7, 0x71])) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x60, 0xEA])) {\n\t\t\treturn {\n\t\t\t\text: 'arj',\n\t\t\t\tmime: 'application/x-arj',\n\t\t\t};\n\t\t}\n\n\t\t// -- 3-byte signatures --\n\n\t\tif (this.check([0xEF, 0xBB, 0xBF])) { // UTF-8-BOM\n\t\t\t// Strip off UTF-8-BOM\n\t\t\tthis.tokenizer.ignore(3);\n\t\t\treturn this.parse(tokenizer);\n\t\t}\n\n\t\tif (this.check([0x47, 0x49, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'gif',\n\t\t\t\tmime: 'image/gif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x49, 0x49, 0xBC])) {\n\t\t\treturn {\n\t\t\t\text: 'jxr',\n\t\t\t\tmime: 'image/vnd.ms-photo',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x1F, 0x8B, 0x8])) {\n\t\t\treturn {\n\t\t\t\text: 'gz',\n\t\t\t\tmime: 'application/gzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x5A, 0x68])) {\n\t\t\treturn {\n\t\t\t\text: 'bz2',\n\t\t\t\tmime: 'application/x-bzip2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('ID3')) {\n\t\t\tawait tokenizer.ignore(6); // Skip ID3 header until the header size\n\t\t\tconst id3HeaderLength = await tokenizer.readToken(uint32SyncSafeToken);\n\t\t\tif (tokenizer.position + id3HeaderLength > tokenizer.fileInfo.size) {\n\t\t\t\t// Guess file type based on ID3 header for backward compatibility\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(id3HeaderLength);\n\t\t\treturn this.fromTokenizer(tokenizer); // Skip ID3 header, recursion\n\t\t}\n\n\t\t// Musepack, SV7\n\t\tif (this.checkString('MP+')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\t(this.buffer[0] === 0x43 || this.buffer[0] === 0x46)\n\t\t\t&& this.check([0x57, 0x53], {offset: 1})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'swf',\n\t\t\t\tmime: 'application/x-shockwave-flash',\n\t\t\t};\n\t\t}\n\n\t\t// -- 4-byte signatures --\n\n\t\t// Requires a sample size of 4 bytes\n\t\tif (this.check([0xFF, 0xD8, 0xFF])) {\n\t\t\tif (this.check([0xF7], {offset: 3})) { // JPG7/SOF55, indicating a ISO/IEC 14495 / JPEG-LS file\n\t\t\t\treturn {\n\t\t\t\t\text: 'jls',\n\t\t\t\t\tmime: 'image/jls',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'jpg',\n\t\t\t\tmime: 'image/jpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4F, 0x62, 0x6A, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'avro',\n\t\t\t\tmime: 'application/avro',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FLIF')) {\n\t\t\treturn {\n\t\t\t\text: 'flif',\n\t\t\t\tmime: 'image/flif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('8BPS')) {\n\t\t\treturn {\n\t\t\t\text: 'psd',\n\t\t\t\tmime: 'image/vnd.adobe.photoshop',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('WEBP', {offset: 8})) {\n\t\t\treturn {\n\t\t\t\text: 'webp',\n\t\t\t\tmime: 'image/webp',\n\t\t\t};\n\t\t}\n\n\t\t// Musepack, SV8\n\t\tif (this.checkString('MPCK')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FORM')) {\n\t\t\treturn {\n\t\t\t\text: 'aif',\n\t\t\t\tmime: 'audio/aiff',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('icns', {offset: 0})) {\n\t\t\treturn {\n\t\t\t\text: 'icns',\n\t\t\t\tmime: 'image/icns',\n\t\t\t};\n\t\t}\n\n\t\t// Zip-based file formats\n\t\t// Need to be before the `zip` check\n\t\tif (this.check([0x50, 0x4B, 0x3, 0x4])) { // Local file header signature\n\t\t\ttry {\n\t\t\t\twhile (tokenizer.position + 30 < tokenizer.fileInfo.size) {\n\t\t\t\t\tawait tokenizer.readBuffer(this.buffer, {length: 30});\n\n\t\t\t\t\tconst view = new DataView(this.buffer.buffer);\n\n\t\t\t\t\t// https://en.wikipedia.org/wiki/Zip_(file_format)#File_headers\n\t\t\t\t\tconst zipHeader = {\n\t\t\t\t\t\tcompressedSize: view.getUint32(18, true),\n\t\t\t\t\t\tuncompressedSize: view.getUint32(22, true),\n\t\t\t\t\t\tfilenameLength: view.getUint16(26, true),\n\t\t\t\t\t\textraFieldLength: view.getUint16(28, true),\n\t\t\t\t\t};\n\n\t\t\t\t\tzipHeader.filename = await tokenizer.readToken(new Token.StringType(zipHeader.filenameLength, 'utf-8'));\n\t\t\t\t\tawait tokenizer.ignore(zipHeader.extraFieldLength);\n\n\t\t\t\t\tif (/classes\\d*\\.dex/.test(zipHeader.filename)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'apk',\n\t\t\t\t\t\t\tmime: 'application/vnd.android.package-archive',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Assumes signed `.xpi` from addons.mozilla.org\n\t\t\t\t\tif (zipHeader.filename === 'META-INF/mozilla.rsa') {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'xpi',\n\t\t\t\t\t\t\tmime: 'application/x-xpinstall',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (zipHeader.filename.endsWith('.rels') || zipHeader.filename.endsWith('.xml')) {\n\t\t\t\t\t\tconst type = zipHeader.filename.split('/')[0];\n\t\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\t\tcase '_rels':\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'word':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'docx',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'ppt':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'pptx',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'xl':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'xlsx',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'visio':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'vsdx',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.visio',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (zipHeader.filename.startsWith('xl/')) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'xlsx',\n\t\t\t\t\t\t\tmime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (zipHeader.filename.startsWith('3D/') && zipHeader.filename.endsWith('.model')) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: '3mf',\n\t\t\t\t\t\t\tmime: 'model/3mf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// The docx, xlsx and pptx file types extend the Office Open XML file format:\n\t\t\t\t\t// https://en.wikipedia.org/wiki/Office_Open_XML_file_formats\n\t\t\t\t\t// We look for:\n\t\t\t\t\t// - one entry named '[Content_Types].xml' or '_rels/.rels',\n\t\t\t\t\t// - one entry indicating specific type of file.\n\t\t\t\t\t// MS Office, OpenOffice and LibreOffice may put the parts in different order, so the check should not rely on it.\n\t\t\t\t\tif (zipHeader.filename === 'mimetype' && zipHeader.compressedSize === zipHeader.uncompressedSize) {\n\t\t\t\t\t\tlet mimeType = await tokenizer.readToken(new Token.StringType(zipHeader.compressedSize, 'utf-8'));\n\t\t\t\t\t\tmimeType = mimeType.trim();\n\n\t\t\t\t\t\tswitch (mimeType) {\n\t\t\t\t\t\t\tcase 'application/epub+zip':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'epub',\n\t\t\t\t\t\t\t\t\tmime: 'application/epub+zip',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'application/vnd.oasis.opendocument.text':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'odt',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.oasis.opendocument.text',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'application/vnd.oasis.opendocument.spreadsheet':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'ods',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.oasis.opendocument.spreadsheet',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'application/vnd.oasis.opendocument.presentation':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'odp',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.oasis.opendocument.presentation',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Try to find next header manually when current one is corrupted\n\t\t\t\t\tif (zipHeader.compressedSize === 0) {\n\t\t\t\t\t\tlet nextHeaderIndex = -1;\n\n\t\t\t\t\t\twhile (nextHeaderIndex < 0 && (tokenizer.position < tokenizer.fileInfo.size)) {\n\t\t\t\t\t\t\tawait tokenizer.peekBuffer(this.buffer, {mayBeLess: true});\n\n\t\t\t\t\t\t\tnextHeaderIndex = indexOf(this.buffer, new Uint8Array([0x50, 0x4B, 0x03, 0x04]));\n\n\t\t\t\t\t\t\t// Move position to the next header if found, skip the whole buffer otherwise\n\t\t\t\t\t\t\tawait tokenizer.ignore(nextHeaderIndex >= 0 ? nextHeaderIndex : this.buffer.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait tokenizer.ignore(zipHeader.compressedSize);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('OggS')) {\n\t\t\t// This is an OGG container\n\t\t\tawait tokenizer.ignore(28);\n\t\t\tconst type = new Uint8Array(8);\n\t\t\tawait tokenizer.readBuffer(type);\n\n\t\t\t// Needs to be before `ogg` check\n\t\t\tif (_check(type, [0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'opus',\n\t\t\t\t\tmime: 'audio/ogg; codecs=opus',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' theora' in header.\n\t\t\tif (_check(type, [0x80, 0x74, 0x68, 0x65, 0x6F, 0x72, 0x61])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogv',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01video' in header.\n\t\t\tif (_check(type, [0x01, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x00])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogm',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' FLAC' in header https://xiph.org/flac/faq.html\n\t\t\tif (_check(type, [0x7F, 0x46, 0x4C, 0x41, 0x43])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'oga',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// 'Speex ' in header https://en.wikipedia.org/wiki/Speex\n\t\t\tif (_check(type, [0x53, 0x70, 0x65, 0x65, 0x78, 0x20, 0x20])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'spx',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01vorbis' in header\n\t\t\tif (_check(type, [0x01, 0x76, 0x6F, 0x72, 0x62, 0x69, 0x73])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogg',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Default OGG container https://www.iana.org/assignments/media-types/application/ogg\n\t\t\treturn {\n\t\t\t\text: 'ogx',\n\t\t\t\tmime: 'application/ogg',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x50, 0x4B])\n\t\t\t&& (this.buffer[2] === 0x3 || this.buffer[2] === 0x5 || this.buffer[2] === 0x7)\n\t\t\t&& (this.buffer[3] === 0x4 || this.buffer[3] === 0x6 || this.buffer[3] === 0x8)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\t//\n\n\t\t// File Type Box (https://en.wikipedia.org/wiki/ISO_base_media_file_format)\n\t\t// It's not required to be first, but it's recommended to be. Almost all ISO base media files start with `ftyp` box.\n\t\t// `ftyp` box must contain a brand major identifier, which must consist of ISO 8859-1 printable characters.\n\t\t// Here we check for 8859-1 printable characters (for simplicity, it's a mask which also catches one non-printable character).\n\t\tif (\n\t\t\tthis.checkString('ftyp', {offset: 4})\n\t\t\t&& (this.buffer[8] & 0x60) !== 0x00 // Brand major, first character ASCII?\n\t\t) {\n\t\t\t// They all can have MIME `video/mp4` except `application/mp4` special-case which is hard to detect.\n\t\t\t// For some cases, we're specific, everything else falls to `video/mp4` with `mp4` extension.\n\t\t\tconst brandMajor = new Token.StringType(4, 'latin1').get(this.buffer, 8).replace('\\0', ' ').trim();\n\t\t\tswitch (brandMajor) {\n\t\t\t\tcase 'avif':\n\t\t\t\tcase 'avis':\n\t\t\t\t\treturn {ext: 'avif', mime: 'image/avif'};\n\t\t\t\tcase 'mif1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif'};\n\t\t\t\tcase 'msf1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif-sequence'};\n\t\t\t\tcase 'heic':\n\t\t\t\tcase 'heix':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic'};\n\t\t\t\tcase 'hevc':\n\t\t\t\tcase 'hevx':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic-sequence'};\n\t\t\t\tcase 'qt':\n\t\t\t\t\treturn {ext: 'mov', mime: 'video/quicktime'};\n\t\t\t\tcase 'M4V':\n\t\t\t\tcase 'M4VH':\n\t\t\t\tcase 'M4VP':\n\t\t\t\t\treturn {ext: 'm4v', mime: 'video/x-m4v'};\n\t\t\t\tcase 'M4P':\n\t\t\t\t\treturn {ext: 'm4p', mime: 'video/mp4'};\n\t\t\t\tcase 'M4B':\n\t\t\t\t\treturn {ext: 'm4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'M4A':\n\t\t\t\t\treturn {ext: 'm4a', mime: 'audio/x-m4a'};\n\t\t\t\tcase 'F4V':\n\t\t\t\t\treturn {ext: 'f4v', mime: 'video/mp4'};\n\t\t\t\tcase 'F4P':\n\t\t\t\t\treturn {ext: 'f4p', mime: 'video/mp4'};\n\t\t\t\tcase 'F4A':\n\t\t\t\t\treturn {ext: 'f4a', mime: 'audio/mp4'};\n\t\t\t\tcase 'F4B':\n\t\t\t\t\treturn {ext: 'f4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'crx':\n\t\t\t\t\treturn {ext: 'cr3', mime: 'image/x-canon-cr3'};\n\t\t\t\tdefault:\n\t\t\t\t\tif (brandMajor.startsWith('3g')) {\n\t\t\t\t\t\tif (brandMajor.startsWith('3g2')) {\n\t\t\t\t\t\t\treturn {ext: '3g2', mime: 'video/3gpp2'};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {ext: '3gp', mime: 'video/3gpp'};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {ext: 'mp4', mime: 'video/mp4'};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('MThd')) {\n\t\t\treturn {\n\t\t\t\text: 'mid',\n\t\t\t\tmime: 'audio/midi',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOFF')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff',\n\t\t\t\tmime: 'font/woff',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOF2')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff2',\n\t\t\t\tmime: 'font/woff2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xD4, 0xC3, 0xB2, 0xA1]) || this.check([0xA1, 0xB2, 0xC3, 0xD4])) {\n\t\t\treturn {\n\t\t\t\text: 'pcap',\n\t\t\t\tmime: 'application/vnd.tcpdump.pcap',\n\t\t\t};\n\t\t}\n\n\t\t// Sony DSD Stream File (DSF)\n\t\tif (this.checkString('DSD ')) {\n\t\t\treturn {\n\t\t\t\text: 'dsf',\n\t\t\t\tmime: 'audio/x-dsf', // Non-standard\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('LZIP')) {\n\t\t\treturn {\n\t\t\t\text: 'lz',\n\t\t\t\tmime: 'application/x-lzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('fLaC')) {\n\t\t\treturn {\n\t\t\t\text: 'flac',\n\t\t\t\tmime: 'audio/x-flac',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x50, 0x47, 0xFB])) {\n\t\t\treturn {\n\t\t\t\text: 'bpg',\n\t\t\t\tmime: 'image/bpg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('wvpk')) {\n\t\t\treturn {\n\t\t\t\text: 'wv',\n\t\t\t\tmime: 'audio/wavpack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('%PDF')) {\n\t\t\ttry {\n\t\t\t\tawait tokenizer.ignore(1350);\n\t\t\t\tconst maxBufferSize = 10 * 1024 * 1024;\n\t\t\t\tconst buffer = new Uint8Array(Math.min(maxBufferSize, tokenizer.fileInfo.size));\n\t\t\t\tawait tokenizer.readBuffer(buffer, {mayBeLess: true});\n\n\t\t\t\t// Check if this is an Adobe Illustrator file\n\t\t\t\tif (includes(buffer, new TextEncoder().encode('AIPrivateData'))) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'ai',\n\t\t\t\t\t\tmime: 'application/postscript',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// Swallow end of stream error if file is too small for the Adobe AI check\n\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Assume this is just a normal PDF\n\t\t\treturn {\n\t\t\t\text: 'pdf',\n\t\t\t\tmime: 'application/pdf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x61, 0x73, 0x6D])) {\n\t\t\treturn {\n\t\t\t\text: 'wasm',\n\t\t\t\tmime: 'application/wasm',\n\t\t\t};\n\t\t}\n\n\t\t// TIFF, little-endian type\n\t\tif (this.check([0x49, 0x49])) {\n\t\t\tconst fileType = await this.readTiffHeader(false);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\t// TIFF, big-endian type\n\t\tif (this.check([0x4D, 0x4D])) {\n\t\t\tconst fileType = await this.readTiffHeader(true);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('MAC ')) {\n\t\t\treturn {\n\t\t\t\text: 'ape',\n\t\t\t\tmime: 'audio/ape',\n\t\t\t};\n\t\t}\n\n\t\t// https://github.com/file/file/blob/master/magic/Magdir/matroska\n\t\tif (this.check([0x1A, 0x45, 0xDF, 0xA3])) { // Root element: EBML\n\t\t\tasync function readField() {\n\t\t\t\tconst msb = await tokenizer.peekNumber(Token.UINT8);\n\t\t\t\tlet mask = 0x80;\n\t\t\t\tlet ic = 0; // 0 = A, 1 = B, 2 = C, 3 = D\n\n\t\t\t\twhile ((msb & mask) === 0 && mask !== 0) {\n\t\t\t\t\t++ic;\n\t\t\t\t\tmask >>= 1;\n\t\t\t\t}\n\n\t\t\t\tconst id = new Uint8Array(ic + 1);\n\t\t\t\tawait tokenizer.readBuffer(id);\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\tasync function readElement() {\n\t\t\t\tconst idField = await readField();\n\t\t\t\tconst lengthField = await readField();\n\n\t\t\t\tlengthField[0] ^= 0x80 >> (lengthField.length - 1);\n\t\t\t\tconst nrLength = Math.min(6, lengthField.length); // JavaScript can max read 6 bytes integer\n\n\t\t\t\tconst idView = new DataView(idField.buffer);\n\t\t\t\tconst lengthView = new DataView(lengthField.buffer, lengthField.length - nrLength, nrLength);\n\n\t\t\t\treturn {\n\t\t\t\t\tid: getUintBE(idView),\n\t\t\t\t\tlen: getUintBE(lengthView),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tasync function readChildren(children) {\n\t\t\t\twhile (children > 0) {\n\t\t\t\t\tconst element = await readElement();\n\t\t\t\t\tif (element.id === 0x42_82) {\n\t\t\t\t\t\tconst rawValue = await tokenizer.readToken(new Token.StringType(element.len));\n\t\t\t\t\t\treturn rawValue.replaceAll(/\\00.*$/g, ''); // Return DocType\n\t\t\t\t\t}\n\n\t\t\t\t\tawait tokenizer.ignore(element.len); // ignore payload\n\t\t\t\t\t--children;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst re = await readElement();\n\t\t\tconst docType = await readChildren(re.len);\n\n\t\t\tswitch (docType) {\n\t\t\t\tcase 'webm':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'webm',\n\t\t\t\t\t\tmime: 'video/webm',\n\t\t\t\t\t};\n\n\t\t\t\tcase 'matroska':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mkv',\n\t\t\t\t\t\tmime: 'video/x-matroska',\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// RIFF file format which might be AVI, WAV, QCP, etc\n\t\tif (this.check([0x52, 0x49, 0x46, 0x46])) {\n\t\t\tif (this.check([0x41, 0x56, 0x49], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'avi',\n\t\t\t\t\tmime: 'video/vnd.avi',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0x57, 0x41, 0x56, 0x45], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'wav',\n\t\t\t\t\tmime: 'audio/wav',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// QLCM, QCP file\n\t\t\tif (this.check([0x51, 0x4C, 0x43, 0x4D], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'qcp',\n\t\t\t\t\tmime: 'audio/qcelp',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('SQLi')) {\n\t\t\treturn {\n\t\t\t\text: 'sqlite',\n\t\t\t\tmime: 'application/x-sqlite3',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4E, 0x45, 0x53, 0x1A])) {\n\t\t\treturn {\n\t\t\t\text: 'nes',\n\t\t\t\tmime: 'application/x-nintendo-nes-rom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Cr24')) {\n\t\t\treturn {\n\t\t\t\text: 'crx',\n\t\t\t\tmime: 'application/x-google-chrome-extension',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('MSCF')\n\t\t\t|| this.checkString('ISc(')\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'cab',\n\t\t\t\tmime: 'application/vnd.ms-cab-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xED, 0xAB, 0xEE, 0xDB])) {\n\t\t\treturn {\n\t\t\t\text: 'rpm',\n\t\t\t\tmime: 'application/x-rpm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC5, 0xD0, 0xD3, 0xC6])) {\n\t\t\treturn {\n\t\t\t\text: 'eps',\n\t\t\t\tmime: 'application/eps',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x28, 0xB5, 0x2F, 0xFD])) {\n\t\t\treturn {\n\t\t\t\text: 'zst',\n\t\t\t\tmime: 'application/zstd',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x7F, 0x45, 0x4C, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'elf',\n\t\t\t\tmime: 'application/x-elf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x21, 0x42, 0x44, 0x4E])) {\n\t\t\treturn {\n\t\t\t\text: 'pst',\n\t\t\t\tmime: 'application/vnd.ms-outlook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('PAR1')) {\n\t\t\treturn {\n\t\t\t\text: 'parquet',\n\t\t\t\tmime: 'application/x-parquet',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xCF, 0xFA, 0xED, 0xFE])) {\n\t\t\treturn {\n\t\t\t\text: 'macho',\n\t\t\t\tmime: 'application/x-mach-binary',\n\t\t\t};\n\t\t}\n\n\t\t// -- 5-byte signatures --\n\n\t\tif (this.check([0x4F, 0x54, 0x54, 0x4F, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'otf',\n\t\t\t\tmime: 'font/otf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('#!AMR')) {\n\t\t\treturn {\n\t\t\t\text: 'amr',\n\t\t\t\tmime: 'audio/amr',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('{\\\\rtf')) {\n\t\t\treturn {\n\t\t\t\text: 'rtf',\n\t\t\t\tmime: 'application/rtf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x46, 0x4C, 0x56, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'flv',\n\t\t\t\tmime: 'video/x-flv',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('IMPM')) {\n\t\t\treturn {\n\t\t\t\text: 'it',\n\t\t\t\tmime: 'audio/x-it',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('-lh0-', {offset: 2})\n\t\t\t|| this.checkString('-lh1-', {offset: 2})\n\t\t\t|| this.checkString('-lh2-', {offset: 2})\n\t\t\t|| this.checkString('-lh3-', {offset: 2})\n\t\t\t|| this.checkString('-lh4-', {offset: 2})\n\t\t\t|| this.checkString('-lh5-', {offset: 2})\n\t\t\t|| this.checkString('-lh6-', {offset: 2})\n\t\t\t|| this.checkString('-lh7-', {offset: 2})\n\t\t\t|| this.checkString('-lzs-', {offset: 2})\n\t\t\t|| this.checkString('-lz4-', {offset: 2})\n\t\t\t|| this.checkString('-lz5-', {offset: 2})\n\t\t\t|| this.checkString('-lhd-', {offset: 2})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'lzh',\n\t\t\t\tmime: 'application/x-lzh-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// MPEG program stream (PS or MPEG-PS)\n\t\tif (this.check([0x00, 0x00, 0x01, 0xBA])) {\n\t\t\t// MPEG-PS, MPEG-1 Part 1\n\t\t\tif (this.check([0x21], {offset: 4, mask: [0xF1]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .ps, .mpeg\n\t\t\t\t\tmime: 'video/MP1S',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG-PS, MPEG-2 Part 1\n\t\t\tif (this.check([0x44], {offset: 4, mask: [0xC4]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .mpg, .m2p, .vob or .sub\n\t\t\t\t\tmime: 'video/MP2P',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('ITSF')) {\n\t\t\treturn {\n\t\t\t\text: 'chm',\n\t\t\t\tmime: 'application/vnd.ms-htmlhelp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xCA, 0xFE, 0xBA, 0xBE])) {\n\t\t\treturn {\n\t\t\t\text: 'class',\n\t\t\t\tmime: 'application/java-vm',\n\t\t\t};\n\t\t}\n\n\t\t// -- 6-byte signatures --\n\n\t\tif (this.check([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'xz',\n\t\t\t\tmime: 'application/x-xz',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('<?xml ')) {\n\t\t\treturn {\n\t\t\t\text: 'xml',\n\t\t\t\tmime: 'application/xml',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) {\n\t\t\treturn {\n\t\t\t\text: '7z',\n\t\t\t\tmime: 'application/x-7z-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x52, 0x61, 0x72, 0x21, 0x1A, 0x7])\n\t\t\t&& (this.buffer[6] === 0x0 || this.buffer[6] === 0x1)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'rar',\n\t\t\t\tmime: 'application/x-rar-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('solid ')) {\n\t\t\treturn {\n\t\t\t\text: 'stl',\n\t\t\t\tmime: 'model/stl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('AC')) {\n\t\t\tconst version = new Token.StringType(4, 'latin1').get(this.buffer, 2);\n\t\t\tif (version.match('^d*') && version >= 1000 && version <= 1050) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'dwg',\n\t\t\t\t\tmime: 'image/vnd.dwg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('070707')) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\t// -- 7-byte signatures --\n\n\t\tif (this.checkString('BLENDER')) {\n\t\t\treturn {\n\t\t\t\text: 'blend',\n\t\t\t\tmime: 'application/x-blender',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('!<arch>')) {\n\t\t\tawait tokenizer.ignore(8);\n\t\t\tconst string = await tokenizer.readToken(new Token.StringType(13, 'ascii'));\n\t\t\tif (string === 'debian-binary') {\n\t\t\t\treturn {\n\t\t\t\t\text: 'deb',\n\t\t\t\t\tmime: 'application/x-deb',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ar',\n\t\t\t\tmime: 'application/x-unix-archive',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('WEBVTT')\n\t\t\t&&\t(\n\t\t\t\t// One of LF, CR, tab, space, or end of file must follow \"WEBVTT\" per the spec (see `fixture/fixture-vtt-*.vtt` for examples). Note that `\\0` is technically the null character (there is no such thing as an EOF character). However, checking for `\\0` gives us the same result as checking for the end of the stream.\n\t\t\t\t(['\\n', '\\r', '\\t', ' ', '\\0'].some(char7 => this.checkString(char7, {offset: 6}))))\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'vtt',\n\t\t\t\tmime: 'text/vtt',\n\t\t\t};\n\t\t}\n\n\t\t// -- 8-byte signatures --\n\n\t\tif (this.check([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\t// APNG format (https://wiki.mozilla.org/APNG_Specification)\n\t\t\t// 1. Find the first IDAT (image data) chunk (49 44 41 54)\n\t\t\t// 2. Check if there is an \"acTL\" chunk before the IDAT one (61 63 54 4C)\n\n\t\t\t// Offset calculated as follows:\n\t\t\t// - 8 bytes: PNG signature\n\t\t\t// - 4 (length) + 4 (chunk type) + 13 (chunk data) + 4 (CRC): IHDR chunk\n\n\t\t\tawait tokenizer.ignore(8); // ignore PNG signature\n\n\t\t\tasync function readChunkHeader() {\n\t\t\t\treturn {\n\t\t\t\t\tlength: await tokenizer.readToken(Token.INT32_BE),\n\t\t\t\t\ttype: await tokenizer.readToken(new Token.StringType(4, 'latin1')),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\tconst chunk = await readChunkHeader();\n\t\t\t\tif (chunk.length < 0) {\n\t\t\t\t\treturn; // Invalid chunk length\n\t\t\t\t}\n\n\t\t\t\tswitch (chunk.type) {\n\t\t\t\t\tcase 'IDAT':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'png',\n\t\t\t\t\t\t\tmime: 'image/png',\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'acTL':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'apng',\n\t\t\t\t\t\t\tmime: 'image/apng',\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tawait tokenizer.ignore(chunk.length + 4); // Ignore chunk-data + CRC\n\t\t\t\t}\n\t\t\t} while (tokenizer.position + 8 < tokenizer.fileInfo.size);\n\n\t\t\treturn {\n\t\t\t\text: 'png',\n\t\t\t\tmime: 'image/png',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x41, 0x52, 0x52, 0x4F, 0x57, 0x31, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'arrow',\n\t\t\t\tmime: 'application/x-apache-arrow',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x67, 0x6C, 0x54, 0x46, 0x02, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'glb',\n\t\t\t\tmime: 'model/gltf-binary',\n\t\t\t};\n\t\t}\n\n\t\t// `mov` format variants\n\t\tif (\n\t\t\tthis.check([0x66, 0x72, 0x65, 0x65], {offset: 4}) // `free`\n\t\t\t|| this.check([0x6D, 0x64, 0x61, 0x74], {offset: 4}) // `mdat` MJPEG\n\t\t\t|| this.check([0x6D, 0x6F, 0x6F, 0x76], {offset: 4}) // `moov`\n\t\t\t|| this.check([0x77, 0x69, 0x64, 0x65], {offset: 4}) // `wide`\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mov',\n\t\t\t\tmime: 'video/quicktime',\n\t\t\t};\n\t\t}\n\n\t\t// -- 9-byte signatures --\n\n\t\tif (this.check([0x49, 0x49, 0x52, 0x4F, 0x08, 0x00, 0x00, 0x00, 0x18])) {\n\t\t\treturn {\n\t\t\t\text: 'orf',\n\t\t\t\tmime: 'image/x-olympus-orf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('gimp xcf ')) {\n\t\t\treturn {\n\t\t\t\text: 'xcf',\n\t\t\t\tmime: 'image/x-xcf',\n\t\t\t};\n\t\t}\n\n\t\t// -- 12-byte signatures --\n\n\t\tif (this.check([0x49, 0x49, 0x55, 0x00, 0x18, 0x00, 0x00, 0x00, 0x88, 0xE7, 0x74, 0xD8])) {\n\t\t\treturn {\n\t\t\t\text: 'rw2',\n\t\t\t\tmime: 'image/x-panasonic-rw2',\n\t\t\t};\n\t\t}\n\n\t\t// ASF_Header_Object first 80 bytes\n\t\tif (this.check([0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9])) {\n\t\t\tasync function readHeader() {\n\t\t\t\tconst guid = new Uint8Array(16);\n\t\t\t\tawait tokenizer.readBuffer(guid);\n\t\t\t\treturn {\n\t\t\t\t\tid: guid,\n\t\t\t\t\tsize: Number(await tokenizer.readToken(Token.UINT64_LE)),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(30);\n\t\t\t// Search for header should be in first 1KB of file.\n\t\t\twhile (tokenizer.position + 24 < tokenizer.fileInfo.size) {\n\t\t\t\tconst header = await readHeader();\n\t\t\t\tlet payload = header.size - 24;\n\t\t\t\tif (_check(header.id, [0x91, 0x07, 0xDC, 0xB7, 0xB7, 0xA9, 0xCF, 0x11, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65])) {\n\t\t\t\t\t// Sync on Stream-Properties-Object (B7DC0791-A9B7-11CF-8EE6-00C00C205365)\n\t\t\t\t\tconst typeId = new Uint8Array(16);\n\t\t\t\t\tpayload -= await tokenizer.readBuffer(typeId);\n\n\t\t\t\t\tif (_check(typeId, [0x40, 0x9E, 0x69, 0xF8, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found audio:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'audio/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_check(typeId, [0xC0, 0xEF, 0x19, 0xBC, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found video:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'video/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tawait tokenizer.ignore(payload);\n\t\t\t}\n\n\t\t\t// Default to ASF generic extension\n\t\t\treturn {\n\t\t\t\text: 'asf',\n\t\t\t\tmime: 'application/vnd.ms-asf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\treturn {\n\t\t\t\text: 'ktx',\n\t\t\t\tmime: 'image/ktx',\n\t\t\t};\n\t\t}\n\n\t\tif ((this.check([0x7E, 0x10, 0x04]) || this.check([0x7E, 0x18, 0x04])) && this.check([0x30, 0x4D, 0x49, 0x45], {offset: 4})) {\n\t\t\treturn {\n\t\t\t\text: 'mie',\n\t\t\t\tmime: 'application/x-mie',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], {offset: 2})) {\n\t\t\treturn {\n\t\t\t\text: 'shp',\n\t\t\t\tmime: 'application/x-esri-shape',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0x4F, 0xFF, 0x51])) {\n\t\t\treturn {\n\t\t\t\text: 'j2c',\n\t\t\t\tmime: 'image/j2c',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A])) {\n\t\t\t// JPEG-2000 family\n\n\t\t\tawait tokenizer.ignore(20);\n\t\t\tconst type = await tokenizer.readToken(new Token.StringType(4, 'ascii'));\n\t\t\tswitch (type) {\n\t\t\t\tcase 'jp2 ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jp2',\n\t\t\t\t\t\tmime: 'image/jp2',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpx ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpx',\n\t\t\t\t\t\tmime: 'image/jpx',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpm ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpm',\n\t\t\t\t\t\tmime: 'image/jpm',\n\t\t\t\t\t};\n\t\t\t\tcase 'mjp2':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mj2',\n\t\t\t\t\t\tmime: 'image/mj2',\n\t\t\t\t\t};\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0xFF, 0x0A])\n\t\t\t|| this.check([0x00, 0x00, 0x00, 0x0C, 0x4A, 0x58, 0x4C, 0x20, 0x0D, 0x0A, 0x87, 0x0A])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'jxl',\n\t\t\t\tmime: 'image/jxl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFE, 0xFF])) { // UTF-16-BOM-LE\n\t\t\tif (this.check([0, 60, 0, 63, 0, 120, 0, 109, 0, 108], {offset: 2})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some unknown text based format\n\t\t}\n\n\t\t// -- Unsafe signatures --\n\n\t\tif (\n\t\t\tthis.check([0x0, 0x0, 0x1, 0xBA])\n\t\t\t|| this.check([0x0, 0x0, 0x1, 0xB3])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mpg',\n\t\t\t\tmime: 'video/mpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x01, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ttf',\n\t\t\t\tmime: 'font/ttf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x01, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ico',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x02, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'cur',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) {\n\t\t\t// Detected Microsoft Compound File Binary File (MS-CFB) Format.\n\t\t\treturn {\n\t\t\t\text: 'cfb',\n\t\t\t\tmime: 'application/x-cfb',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 12 to 256.\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\tif (this.check([0x61, 0x63, 0x73, 0x70], {offset: 36})) {\n\t\t\treturn {\n\t\t\t\text: 'icc',\n\t\t\t\tmime: 'application/vnd.iccprofile',\n\t\t\t};\n\t\t}\n\n\t\t// ACE: requires 14 bytes in the buffer\n\t\tif (this.checkString('**ACE', {offset: 7}) && this.checkString('**', {offset: 12})) {\n\t\t\treturn {\n\t\t\t\text: 'ace',\n\t\t\t\tmime: 'application/x-ace-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// -- 15-byte signatures --\n\n\t\tif (this.checkString('BEGIN:')) {\n\t\t\tif (this.checkString('VCARD', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'vcf',\n\t\t\t\t\tmime: 'text/vcard',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.checkString('VCALENDAR', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ics',\n\t\t\t\t\tmime: 'text/calendar',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// `raf` is here just to keep all the raw image detectors together.\n\t\tif (this.checkString('FUJIFILMCCD-RAW')) {\n\t\t\treturn {\n\t\t\t\text: 'raf',\n\t\t\t\tmime: 'image/x-fujifilm-raf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Extended Module:')) {\n\t\t\treturn {\n\t\t\t\text: 'xm',\n\t\t\t\tmime: 'audio/x-xm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Creative Voice File')) {\n\t\t\treturn {\n\t\t\t\text: 'voc',\n\t\t\t\tmime: 'audio/x-voc',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x04, 0x00, 0x00, 0x00]) && this.buffer.length >= 16) { // Rough & quick check Pickle/ASAR\n\t\t\tconst jsonSize = new DataView(this.buffer.buffer).getUint32(12, true);\n\n\t\t\tif (jsonSize > 12 && this.buffer.length >= jsonSize + 16) {\n\t\t\t\ttry {\n\t\t\t\t\tconst header = new TextDecoder().decode(this.buffer.slice(16, jsonSize + 16));\n\t\t\t\t\tconst json = JSON.parse(header);\n\t\t\t\t\t// Check if Pickle is ASAR\n\t\t\t\t\tif (json.files) { // Final check, assuring Pickle/ASAR format\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asar',\n\t\t\t\t\t\t\tmime: 'application/x-asar',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tif (this.check([0x06, 0x0E, 0x2B, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0D, 0x01, 0x02, 0x01, 0x01, 0x02])) {\n\t\t\treturn {\n\t\t\t\text: 'mxf',\n\t\t\t\tmime: 'application/mxf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('SCRM', {offset: 44})) {\n\t\t\treturn {\n\t\t\t\text: 's3m',\n\t\t\t\tmime: 'audio/x-s3m',\n\t\t\t};\n\t\t}\n\n\t\t// Raw MPEG-2 transport stream (188-byte packets)\n\t\tif (this.check([0x47]) && this.check([0x47], {offset: 188})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\t// Blu-ray Disc Audio-Video (BDAV) MPEG-2 transport stream has 4-byte TP_extra_header before each 188-byte packet\n\t\tif (this.check([0x47], {offset: 4}) && this.check([0x47], {offset: 196})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x4F, 0x4F, 0x4B, 0x4D, 0x4F, 0x42, 0x49], {offset: 60})) {\n\t\t\treturn {\n\t\t\t\text: 'mobi',\n\t\t\t\tmime: 'application/x-mobipocket-ebook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x44, 0x49, 0x43, 0x4D], {offset: 128})) {\n\t\t\treturn {\n\t\t\t\text: 'dcm',\n\t\t\t\tmime: 'application/dicom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'lnk',\n\t\t\t\tmime: 'application/x.ms.shortcut', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x62, 0x6F, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x72, 0x6B, 0x00, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'alias',\n\t\t\t\tmime: 'application/x.apple.alias', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Kaydara FBX Binary \\u0000')) {\n\t\t\treturn {\n\t\t\t\text: 'fbx',\n\t\t\t\tmime: 'application/x.autodesk.fbx', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x4C, 0x50], {offset: 34})\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x00, 0x01], {offset: 8})\n\t\t\t\t|| this.check([0x01, 0x00, 0x02], {offset: 8})\n\t\t\t\t|| this.check([0x02, 0x00, 0x02], {offset: 8})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'eot',\n\t\t\t\tmime: 'application/vnd.ms-fontobject',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x06, 0x06, 0xED, 0xF5, 0xD8, 0x1D, 0x46, 0xE5, 0xBD, 0x31, 0xEF, 0xE7, 0xFE, 0x74, 0xB7, 0x1D])) {\n\t\t\treturn {\n\t\t\t\text: 'indd',\n\t\t\t\tmime: 'application/x-indesign',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 256 to 512\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\t// Requires a buffer size of 512 bytes\n\t\tif (tarHeaderChecksumMatches(this.buffer)) {\n\t\t\treturn {\n\t\t\t\text: 'tar',\n\t\t\t\tmime: 'application/x-tar',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0xFE])) { // UTF-16-BOM-BE\n\t\t\tif (this.check([60, 0, 63, 0, 120, 0, 109, 0, 108, 0], {offset: 2})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0xFF, 0x0E, 0x53, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x55, 0x00, 0x70, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6C, 0x00], {offset: 2})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'skp',\n\t\t\t\t\tmime: 'application/vnd.sketchup.skp',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some text based format\n\t\t}\n\n\t\tif (this.checkString('-----BEGIN PGP MESSAGE-----')) {\n\t\t\treturn {\n\t\t\t\text: 'pgp',\n\t\t\t\tmime: 'application/pgp-encrypted',\n\t\t\t};\n\t\t}\n\n\t\t// Check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE)\n\t\tif (this.buffer.length >= 2 && this.check([0xFF, 0xE0], {offset: 0, mask: [0xFF, 0xE0]})) {\n\t\t\tif (this.check([0x10], {offset: 1, mask: [0x16]})) {\n\t\t\t\t// Check for (ADTS) MPEG-2\n\t\t\t\tif (this.check([0x08], {offset: 1, mask: [0x08]})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'aac',\n\t\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Must be (ADTS) MPEG-4\n\t\t\t\treturn {\n\t\t\t\t\text: 'aac',\n\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG 1 or 2 Layer 3 header\n\t\t\t// Check for MPEG layer 3\n\t\t\tif (this.check([0x02], {offset: 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 2\n\t\t\tif (this.check([0x04], {offset: 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp2',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 1\n\t\t\tif (this.check([0x06], {offset: 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp1',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readTiffTag(bigEndian) {\n\t\tconst tagId = await this.tokenizer.readToken(bigEndian ? Token.UINT16_BE : Token.UINT16_LE);\n\t\tthis.tokenizer.ignore(10);\n\t\tswitch (tagId) {\n\t\t\tcase 50_341:\n\t\t\t\treturn {\n\t\t\t\t\text: 'arw',\n\t\t\t\t\tmime: 'image/x-sony-arw',\n\t\t\t\t};\n\t\t\tcase 50_706:\n\t\t\t\treturn {\n\t\t\t\t\text: 'dng',\n\t\t\t\t\tmime: 'image/x-adobe-dng',\n\t\t\t\t};\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tasync readTiffIFD(bigEndian) {\n\t\tconst numberOfTags = await this.tokenizer.readToken(bigEndian ? Token.UINT16_BE : Token.UINT16_LE);\n\t\tfor (let n = 0; n < numberOfTags; ++n) {\n\t\t\tconst fileType = await this.readTiffTag(bigEndian);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readTiffHeader(bigEndian) {\n\t\tconst version = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 2);\n\t\tconst ifdOffset = (bigEndian ? Token.UINT32_BE : Token.UINT32_LE).get(this.buffer, 4);\n\n\t\tif (version === 42) {\n\t\t\t// TIFF file header\n\t\t\tif (ifdOffset >= 6) {\n\t\t\t\tif (this.checkString('CR', {offset: 8})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'cr2',\n\t\t\t\t\t\tmime: 'image/x-canon-cr2',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (ifdOffset >= 8 && (this.check([0x1C, 0x00, 0xFE, 0x00], {offset: 8}) || this.check([0x1F, 0x00, 0x0B, 0x00], {offset: 8}))) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'nef',\n\t\t\t\t\t\tmime: 'image/x-nikon-nef',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.tokenizer.ignore(ifdOffset);\n\t\t\tconst fileType = await this.readTiffIFD(bigEndian);\n\t\t\treturn fileType ?? {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\n\t\tif (version === 43) {\t// Big TIFF file header\n\t\t\treturn {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\t}\n}\n\nexport const supportedExtensions = new Set(extensions);\nexport const supportedMimeTypes = new Set(mimeTypes);\n","import crypto from \"node:crypto\";\nimport { fileTypeFromBuffer } from \"file-type\";\nimport type { PipelineContext, TrustedMetadata } from \"@better-media/core\";\nimport type { ValidationPluginOptions } from \"./interfaces/options.interface\";\n\n/**\n * Extract critical metadata from file buffer.\n * Returns a TrustedMetadata patch.\n */\nexport async function extractMetadataFromBuffer(\n buffer: Buffer,\n context: PipelineContext,\n opts: ValidationPluginOptions\n): Promise<TrustedMetadata> {\n const extract = opts.extractMetadata !== false;\n\n if (!extract) {\n return {};\n }\n\n const patch: TrustedMetadata = {\n file: {},\n checksums: {},\n };\n\n const { trusted } = context;\n\n // Size: set if not already present\n if (trusted.file?.size == null) {\n patch.file!.size = buffer.length;\n }\n\n // MIME type and Extension: set if not already present; from magic bytes\n if (trusted.file?.mimeType == null || trusted.file?.extension == null) {\n const ft = await fileTypeFromBuffer(buffer);\n if (ft) {\n if (trusted.file?.mimeType == null) patch.file!.mimeType = ft.mime;\n if (trusted.file?.extension == null) {\n // Ensure extension has a leading dot\n patch.file!.extension = ft.ext.startsWith(\".\") ? ft.ext : `.${ft.ext}`;\n }\n }\n }\n\n // Checksums: set if not already present\n const algorithms = opts.extractChecksums ?? [\"sha256\"];\n for (const algo of algorithms) {\n if (algo === \"sha256\" && trusted.checksums?.sha256 == null) {\n patch.checksums!.sha256 = crypto.createHash(\"sha256\").update(buffer).digest(\"hex\");\n } else if (algo === \"md5\" && trusted.checksums?.md5 == null) {\n patch.checksums!.md5 = crypto.createHash(\"md5\").update(buffer).digest(\"hex\");\n }\n }\n\n return patch;\n}\n","import { fileTypeFromBuffer } from \"file-type\";\nimport path from \"node:path\";\nimport { type FileInfo, EXTENSION_TO_MIME_MAP } from \"@better-media/core\";\nimport type { ValidationPluginOptions } from \"../interfaces/options.interface\";\nimport type { ValidationErrorItem } from \"../interfaces/error-item.interface\";\n\nexport async function validateFileType(\n buffer: Buffer,\n file: FileInfo,\n metadata: Record<string, unknown>,\n opts: ValidationPluginOptions\n): Promise<ValidationErrorItem[]> {\n const errors: ValidationErrorItem[] = [];\n const ext = path.extname(file.key).toLowerCase();\n\n if (opts.allowedExtensions && opts.allowedExtensions.length > 0) {\n const allowed = opts.allowedExtensions.map((e) => e.toLowerCase().replace(/^\\.?/, \".\"));\n if (!allowed.includes(ext)) {\n errors.push({\n rule: \"extension\",\n message: `Extension ${ext} not allowed. Allowed: ${allowed.join(\", \")}`,\n details: { extension: ext, allowedExtensions: opts.allowedExtensions },\n });\n }\n }\n\n // Detect MIME via magic bytes\n let detectedMime: string | undefined;\n let magicMime: string | undefined;\n\n const useMagicBytes = opts.useMagicBytes !== false;\n\n if (useMagicBytes) {\n const ft = await fileTypeFromBuffer(buffer);\n magicMime = ft?.mime;\n\n if (!magicMime && opts.allowedMimeTypes && opts.allowedMimeTypes.length > 0) {\n errors.push({\n rule: \"magic-bytes\",\n message: \"Could not detect MIME type from file content (magic bytes)\",\n details: { fileKey: file.key },\n });\n }\n\n // OWASP: Spoofing detection (Magic bytes vs Extension)\n if (ext) {\n const allowedMimes = EXTENSION_TO_MIME_MAP[ext];\n\n if (allowedMimes) {\n if (!magicMime) {\n // Failure to detect magic bytes for a known binary extension is a threat.\n // However, for generic types like text/plain or octet-stream, magic bytes are often absent.\n const isGeneric = allowedMimes.some(\n (m: string) => m === \"application/octet-stream\" || m === \"text/plain\"\n );\n\n if (!isGeneric) {\n errors.push({\n rule: \"mime-spoof\",\n message: `MIME spoofing detected: file content does not match expected ${ext} format`,\n details: { extension: ext, magicMime: \"none\" },\n });\n }\n } else if (!allowedMimes.includes(magicMime)) {\n errors.push({\n rule: \"mime-spoof\",\n message: `MIME spoofing detected: content is ${magicMime} but extension is ${ext}`,\n details: { extension: ext, magicMime },\n });\n }\n }\n }\n\n detectedMime = magicMime;\n }\n\n // Fallback to metadata if magic bytes not used or failed\n if (!detectedMime) {\n const metaMime =\n file.mimeType ?? metadata.contentType ?? metadata.mimeType ?? metadata[\"content-type\"];\n detectedMime = typeof metaMime === \"string\" ? metaMime : undefined;\n }\n\n if (opts.allowedMimeTypes && opts.allowedMimeTypes.length > 0) {\n if (detectedMime && !opts.allowedMimeTypes.includes(detectedMime)) {\n errors.push({\n rule: \"mime-type\",\n message: `MIME type ${detectedMime} not allowed. Allowed: ${opts.allowedMimeTypes.join(\", \")}`,\n details: { mime: detectedMime, allowedMimeTypes: opts.allowedMimeTypes },\n });\n } else if (!detectedMime) {\n errors.push({\n rule: \"mime-type-missing\",\n message: \"MIME type could not be determined for validation\",\n details: { fileKey: file.key },\n });\n }\n }\n\n return errors;\n}\n","import type { ValidationPluginOptions } from \"../interfaces/options.interface\";\nimport type { ValidationErrorItem } from \"../interfaces/error-item.interface\";\n\nexport function validateFileSize(\n buffer: Buffer,\n opts: ValidationPluginOptions\n): ValidationErrorItem[] {\n const errors: ValidationErrorItem[] = [];\n const size = buffer.length;\n\n if (opts.minBytes != null && size < opts.minBytes) {\n errors.push({\n rule: \"min-size\",\n message: `File size ${size} bytes is below minimum ${opts.minBytes} bytes`,\n details: { size, minBytes: opts.minBytes },\n });\n }\n\n if (opts.maxBytes != null && size > opts.maxBytes) {\n errors.push({\n rule: \"max-size\",\n message: `File size ${size} bytes exceeds maximum ${opts.maxBytes} bytes`,\n details: { size, maxBytes: opts.maxBytes },\n });\n }\n\n return errors;\n}\n","import { imageSize } from \"image-size\";\nimport type { ValidationPluginOptions } from \"../interfaces/options.interface\";\nimport type { ValidationErrorItem } from \"../interfaces/error-item.interface\";\n\nexport function validateDimensions(\n buffer: Buffer,\n opts: ValidationPluginOptions\n): ValidationErrorItem[] {\n const errors: ValidationErrorItem[] = [];\n const dims = imageSize(buffer);\n\n if (!dims || !dims.width || !dims.height) {\n // Not an image or unsupported format - skip dimension checks\n return errors;\n }\n\n const { width, height } = dims;\n\n if (opts.minWidth != null && width < opts.minWidth) {\n errors.push({\n rule: \"min-width\",\n message: `Image width ${width}px is below minimum ${opts.minWidth}px`,\n details: { width, minWidth: opts.minWidth },\n });\n }\n\n if (opts.maxWidth != null && width > opts.maxWidth) {\n errors.push({\n rule: \"max-width\",\n message: `Image width ${width}px exceeds maximum ${opts.maxWidth}px`,\n details: { width, maxWidth: opts.maxWidth },\n });\n }\n\n if (opts.minHeight != null && height < opts.minHeight) {\n errors.push({\n rule: \"min-height\",\n message: `Image height ${height}px is below minimum ${opts.minHeight}px`,\n details: { height, minHeight: opts.minHeight },\n });\n }\n\n if (opts.maxHeight != null && height > opts.maxHeight) {\n errors.push({\n rule: \"max-height\",\n message: `Image height ${height}px exceeds maximum ${opts.maxHeight}px`,\n details: { height, maxHeight: opts.maxHeight },\n });\n }\n\n return errors;\n}\n","import crypto from \"node:crypto\";\nimport type { ValidationPluginOptions } from \"../interfaces/options.interface\";\nimport type { ValidationErrorItem } from \"../interfaces/error-item.interface\";\n\nexport function validateChecksum(\n buffer: Buffer,\n metadata: Record<string, unknown>,\n opts: ValidationPluginOptions\n): ValidationErrorItem[] {\n const errors: ValidationErrorItem[] = [];\n const cfg = opts.checksum;\n if (!cfg) return errors;\n\n const algo = cfg.algorithm;\n const expected = cfg.metadataKey != null ? metadata[cfg.metadataKey] : undefined;\n if (expected == null || typeof expected !== \"string\") {\n errors.push({\n rule: \"checksum\",\n message: `Expected checksum not found in metadata (key: ${cfg.metadataKey ?? \"default\"})`,\n details: { metadataKey: cfg.metadataKey },\n });\n return errors;\n }\n\n const hash = crypto.createHash(algo).update(buffer).digest(\"hex\");\n const expectedNorm = expected.toLowerCase().trim();\n if (hash.toLowerCase() !== expectedNorm) {\n errors.push({\n rule: \"checksum\",\n message: `${algo} hash mismatch`,\n details: { expected: expectedNorm, computed: hash },\n });\n }\n\n return errors;\n}\n","import crypto from \"node:crypto\";\nimport type { DatabaseAdapter } from \"@better-media/core\";\nimport type { ValidationPluginOptions } from \"../interfaces/options.interface\";\nimport type { ValidationErrorItem } from \"../interfaces/error-item.interface\";\n\nexport async function validateChecksumUniqueness(\n buffer: Buffer,\n fileKey: string,\n database: DatabaseAdapter,\n opts: ValidationPluginOptions\n): Promise<ValidationErrorItem[]> {\n const errors: ValidationErrorItem[] = [];\n const cfg = opts.preventDuplicates;\n if (!cfg) return errors;\n\n // Authoritative uniqueness check must use the same algorithm as the media table (sha256)\n const algo = \"sha256\";\n const hash = crypto.createHash(algo).update(buffer).digest(\"hex\");\n\n const existing = await database.findOne({\n model: \"media\",\n where: [{ field: \"checksum\", value: hash }],\n });\n\n if (existing && existing.id !== fileKey) {\n errors.push({\n rule: \"duplicate-content\",\n message: `File with same ${algo} checksum already exists: ${existing.id}`,\n details: { duplicateId: existing.id, checksum: hash, algorithm: algo },\n });\n }\n\n return errors;\n}\n","import { ValidationErrorItem } from \"../interfaces/error-item.interface\";\n\n/**\n * OWASP-level patterns for mandatory injection detection.\n */\nconst INJECTION_PATTERNS = [\n /(%27)|(')|(--)|(%23)|(#)/i, // SQL basics\n /(<script)/i, // XSS basics\n /(\\$where)/i, // NoSQL basics\n /(%|\\\\x)[0-9a-f]{2}/i, // Malicious encoding\n];\n\n/**\n * Recursively scan objects, arrays, and strings for mandatory OWASP security threats.\n * Achieve Zero-Config security by scanning everything passed into the plugin.\n */\nexport function runSecurityScan(value: unknown, path: string = \"root\"): ValidationErrorItem[] {\n const errors: ValidationErrorItem[] = [];\n\n if (typeof value === \"string\") {\n if (INJECTION_PATTERNS.some((p) => p.test(value))) {\n errors.push({\n rule: \"security-threat\",\n message: `Suspicious activity detected in ${path}`,\n details: { path, value: value.length > 50 ? `${value.substring(0, 50)}...` : value },\n });\n }\n } else if (Array.isArray(value)) {\n value.forEach((item, index) => {\n errors.push(...runSecurityScan(item, `${path}[${index}]`));\n });\n } else if (value !== null && typeof value === \"object\") {\n Object.entries(value).forEach(([key, val]) => {\n errors.push(...runSecurityScan(val, `${path}.${key}`));\n });\n }\n\n return errors;\n}\n","import type { FileInfo, DatabaseAdapter } from \"@better-media/core\";\nimport type { ValidationPluginOptions } from \"../interfaces/options.interface\";\nimport type { ValidationErrorItem } from \"../interfaces/error-item.interface\";\nimport { validateFileType } from \"./file-type\";\nimport { validateFileSize } from \"./file-size\";\nimport { validateDimensions } from \"./dimensions\";\nimport { validateChecksum } from \"./checksum\";\nimport { validateChecksumUniqueness } from \"./checksum-uniqueness\";\nimport { runSecurityScan } from \"./security-scanner\";\n\nexport async function runValidators(\n buffer: Buffer,\n file: FileInfo,\n metadata: Record<string, unknown>,\n database: DatabaseAdapter,\n opts: ValidationPluginOptions\n): Promise<ValidationErrorItem[]> {\n const allErrors: ValidationErrorItem[] = [];\n\n // 1. Mandatory Security Scan (Zero-Config OWASP Layer)\n // Scans filename and all metadata recursively for injection patterns.\n allErrors.push(...runSecurityScan(file.key, \"fileKey\"));\n if (file.originalName) {\n allErrors.push(...runSecurityScan(file.originalName, \"filename\"));\n }\n allErrors.push(...runSecurityScan(metadata, \"metadata\"));\n\n // 2. File-Specific Validators (Mandatory magic bytes/spoofing check by default)\n if (opts.allowedExtensions || opts.allowedMimeTypes || opts.useMagicBytes !== false) {\n allErrors.push(...(await validateFileType(buffer, file, metadata, opts)));\n }\n\n if (opts.minBytes || opts.maxBytes) {\n allErrors.push(...validateFileSize(buffer, opts));\n }\n\n if (opts.minWidth || opts.maxWidth || opts.minHeight || opts.maxHeight) {\n allErrors.push(...(await validateDimensions(buffer, opts)));\n }\n\n if (opts.checksum) {\n allErrors.push(...validateChecksum(buffer, metadata, opts));\n }\n\n if (opts.preventDuplicates) {\n allErrors.push(...(await validateChecksumUniqueness(buffer, file.key, database, opts)));\n }\n\n // 3. Custom Validators\n if (opts.customValidators) {\n for (const v of opts.customValidators) {\n const e = await v(buffer, metadata, file.key);\n allErrors.push(...e);\n }\n }\n\n return allErrors;\n}\n\nexport const ValidatorService = {\n run: runValidators,\n scan: runSecurityScan,\n};\n","import fs from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport type {\n PipelineContext,\n ValidationResult,\n StorageAdapter,\n DatabaseAdapter,\n PluginApi,\n} from \"@better-media/core\";\nimport { markFileContentVerified } from \"@better-media/core\";\nimport type { ValidationPluginOptions } from \"../interfaces/options.interface\";\nimport { ValidationErrorItem } from \"../interfaces/error-item.interface\";\nimport { extractMetadataFromBuffer } from \"../extract-metadata\";\nimport { runValidators, ValidatorService } from \"../validators\";\n\n// Boilerplate Logger (Industry Standard Placeholder)\nconst SecurityLogger = {\n logSuspiciousActivity: (fileKey: string, errors: ValidationErrorItem[]) => {\n const threats = errors.filter((e) => e.rule === \"security-threat\" || e.rule === \"magic-bytes\");\n if (threats.length > 0) {\n console.warn(`[SECURITY ALERT] Suspicious activity on ${fileKey}:`, threats);\n }\n },\n};\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchWithRetry(\n storage: StorageAdapter,\n fileKey: string,\n opts: ValidationPluginOptions\n): Promise<Buffer | null> {\n const behavior = opts.fileNotFoundBehavior ?? \"fail\";\n const retryOpts = opts.retryOptions ?? { maxAttempts: 3, delayMs: 1000, backoff: \"exponential\" };\n const maxAttempts = retryOpts.maxAttempts ?? 3;\n const delayMs = retryOpts.delayMs ?? 1000;\n const backoff = retryOpts.backoff ?? \"exponential\";\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const buffer = await storage.get(fileKey);\n if (buffer != null) return buffer;\n\n if (behavior === \"skip\") return null;\n if (behavior === \"fail\" || attempt === maxAttempts) return null;\n\n const wait = backoff === \"exponential\" ? delayMs * Math.pow(2, attempt - 1) : delayMs * attempt;\n await sleep(wait);\n }\n\n return null;\n}\n\nasync function readBufferForValidation(context: PipelineContext): Promise<Buffer | null> {\n const fileContent = context.utilities?.fileContent;\n if (fileContent?.buffer) return fileContent.buffer;\n if (fileContent?.tempPath) return fs.readFile(fileContent.tempPath);\n return null;\n}\n\nasync function recordValidationResult(\n database: DatabaseAdapter,\n recordId: string,\n valid: boolean,\n errors: ValidationErrorItem[]\n): Promise<void> {\n const model = \"media_validation_results\";\n const pluginId = \"better-media-validation\";\n const data = {\n mediaId: recordId,\n valid,\n pluginId,\n errors,\n createdAt: new Date().toISOString(),\n };\n\n const existing = await database.findOne({\n model,\n where: [\n { field: \"mediaId\", value: recordId },\n { field: \"pluginId\", value: pluginId },\n ],\n });\n\n if (existing) {\n await database.update({\n model,\n where: [{ field: \"id\", value: existing.id }],\n update: data,\n });\n } else {\n await database.create({\n model,\n data: { id: randomUUID(), ...data },\n });\n }\n}\n\nexport async function runValidation(\n context: PipelineContext,\n api: PluginApi,\n opts: ValidationPluginOptions\n): Promise<void | ValidationResult> {\n const { file, metadata, storage, database } = context;\n const fileKey = file.key;\n\n let buffer = await readBufferForValidation(context);\n if (buffer == null) buffer = await fetchWithRetry(storage, fileKey, opts);\n\n if (buffer == null) {\n const notFoundError: ValidationErrorItem = {\n rule: \"file-not-found\",\n message:\n opts.fileNotFoundBehavior === \"retry\"\n ? \"File not found in storage after retries (e.g. presigned URL upload not complete)\"\n : \"File not found in storage\",\n details: { fileKey },\n };\n\n if (opts.fileNotFoundBehavior === \"skip\") {\n return; // Skip validation, let pipeline continue\n }\n\n await recordValidationResult(database, context.recordId, false, [notFoundError]);\n\n if (opts.onFailure === \"continue\" || opts.onFailure === \"custom\") {\n if (opts.onFailure === \"custom\" && opts.onFailureCallback) {\n const result = await opts.onFailureCallback(fileKey, [notFoundError]);\n if (result && result.valid === false) return result;\n }\n return;\n }\n\n return {\n valid: false,\n message: notFoundError.message,\n };\n }\n\n // Provenance: bytes were read from storage (utilities or retry path) — required for proposeTrusted guard\n markFileContentVerified(context);\n\n // Extract critical metadata: first-writer-wins via PluginApi (skip when nothing to merge)\n const patch = await extractMetadataFromBuffer(buffer, context, opts);\n const hasTrustedPatch =\n (patch.file && Object.keys(patch.file).length > 0) ||\n (patch.checksums && Object.keys(patch.checksums).length > 0) ||\n (patch.media && Object.keys(patch.media).length > 0);\n if (hasTrustedPatch) {\n api.proposeTrusted(patch);\n }\n\n const errors = await runValidators(buffer, context.file, metadata, database, opts);\n\n if (errors.length === 0) {\n await recordValidationResult(database, context.recordId, true, []);\n return;\n }\n\n // Security Logging (Mandatory for threats)\n SecurityLogger.logSuspiciousActivity(fileKey, errors);\n\n await recordValidationResult(database, context.recordId, false, errors);\n\n const message = errors.map((e) => e.message).join(\"; \");\n const result: ValidationResult = { valid: false, message };\n\n switch (opts.onFailure ?? \"abort\") {\n case \"continue\":\n return;\n case \"custom\":\n if (opts.onFailureCallback) {\n const customResult = await opts.onFailureCallback(fileKey, errors);\n if (customResult && customResult.valid === false) return customResult;\n }\n return result;\n case \"abort\":\n default:\n return result;\n }\n}\n\nexport { ValidatorService };\n","import type { PipelinePlugin, MediaRuntime, PipelineContext, PluginApi } from \"@better-media/core\";\nimport type { ValidationPluginOptions } from \"./interfaces/options.interface\";\nimport { runValidation } from \"./runtime/runner\";\n\nexport type { ValidationPluginOptions } from \"./interfaces/options.interface\";\n\n/**\n * Validation plugin for the Better Media pipeline.\n * Supports file type, size, dimensions, checksum, and custom validators.\n * Configurable failure behavior and file-not-found handling (presigned URLs).\n */\nexport function validationPlugin(opts: ValidationPluginOptions = {}): PipelinePlugin {\n const executionMode = opts.executionMode ?? \"background\";\n const isBackground = executionMode === \"background\";\n\n return {\n name: \"validation\",\n runtimeManifest: {\n id: \"better-media-validation\",\n version: \"1.0.0\",\n trustLevel: \"trusted\", // Authorized for core metadata (size, mime, checksums)\n capabilities: [\"file.read\", \"metadata.write.own\", \"processing.write.own\", \"trusted.propose\"],\n namespace: \"validation\",\n },\n executionMode,\n intensive: isBackground,\n apply(runtime: MediaRuntime) {\n runtime.hooks[\"validation:run\"].tap(\n \"validation\",\n async (context: PipelineContext, api: PluginApi) => {\n return runValidation(context, api, opts);\n },\n { mode: executionMode }\n );\n },\n };\n}\n"]}
|