mirror of
https://github.com/codedread/bitjs
synced 2025-10-03 09:39:16 +02:00
Add ICO image to the file sniffer. Update the manifest to 1.0.11.
This commit is contained in:
parent
73c4080579
commit
83a07c970d
4 changed files with 24 additions and 11 deletions
|
@ -159,7 +159,7 @@ export function getFullMIMEString(info) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (codecFrags.length === 0) return contentType;
|
if (codecFrags.size === 0) return contentType;
|
||||||
return contentType + '; codecs="' + Array.from(codecFrags).join(',') + '"';
|
return contentType + '; codecs="' + Array.from(codecFrags).join(',') + '"';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,22 +13,25 @@
|
||||||
const fileSignatures = {
|
const fileSignatures = {
|
||||||
// Document formats.
|
// Document formats.
|
||||||
'application/pdf': [[0x25, 0x50, 0x44, 0x46, 0x2d]],
|
'application/pdf': [[0x25, 0x50, 0x44, 0x46, 0x2d]],
|
||||||
|
|
||||||
// Archive formats:
|
// Archive formats:
|
||||||
'application/x-tar': [
|
'application/x-tar': [
|
||||||
[0x75, 0x73, 0x74, 0x61, 0x72, 0x00, 0x30, 0x30],
|
[0x75, 0x73, 0x74, 0x61, 0x72, 0x00, 0x30, 0x30],
|
||||||
[0x75, 0x73, 0x74, 0x61, 0x72, 0x20, 0x20, 0x00],
|
[0x75, 0x73, 0x74, 0x61, 0x72, 0x20, 0x20, 0x00],
|
||||||
],
|
],
|
||||||
// Compressed archive formats.
|
|
||||||
'application/x-7z-compressed': [[0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C]],
|
'application/x-7z-compressed': [[0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C]],
|
||||||
'application/x-bzip2': [[0x42, 0x5A, 0x68]],
|
'application/x-bzip2': [[0x42, 0x5A, 0x68]],
|
||||||
'application/x-rar-compressed': [[0x52, 0x61, 0x72, 0x21, 0x1A, 0x07]],
|
'application/x-rar-compressed': [[0x52, 0x61, 0x72, 0x21, 0x1A, 0x07]],
|
||||||
'application/zip': [[0x50, 0x4B, 0x03, 0x04], [0x50, 0x4B, 0x05, 0x06], [0x50, 0x4B, 0x07, 0x08]],
|
'application/zip': [[0x50, 0x4B, 0x03, 0x04], [0x50, 0x4B, 0x05, 0x06], [0x50, 0x4B, 0x07, 0x08]],
|
||||||
|
|
||||||
// Image formats.
|
// Image formats.
|
||||||
'image/bmp': [[0x42, 0x4D]],
|
'image/bmp': [[0x42, 0x4D]],
|
||||||
'image/gif': [[0x47, 0x49, 0x46, 0x38]],
|
'image/gif': [[0x47, 0x49, 0x46, 0x38]],
|
||||||
'image/jpeg': [[0xFF, 0xD8, 0xFF]],
|
'image/jpeg': [[0xFF, 0xD8, 0xFF]],
|
||||||
'image/png': [[0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]],
|
'image/png': [[0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]],
|
||||||
'image/webp': [[0x52, 0x49, 0x46, 0x46, '??', '??', '??', '??', 0x57, 0x45, 0x42, 0x50]],
|
'image/webp': [[0x52, 0x49, 0x46, 0x46, '??', '??', '??', '??', 0x57, 0x45, 0x42, 0x50]],
|
||||||
|
'image/x-icon': [[0x00, 0x00, 0x01, 0x00]],
|
||||||
|
|
||||||
// Audio/Video formats.
|
// Audio/Video formats.
|
||||||
'application/ogg': [[0x4F, 0x67, 0x67, 0x53]],
|
'application/ogg': [[0x4F, 0x67, 0x67, 0x53]],
|
||||||
'audio/flac': [[0x66, 0x4C, 0x61, 0x43]],
|
'audio/flac': [[0x66, 0x4C, 0x61, 0x43]],
|
||||||
|
@ -77,8 +80,12 @@ export function initialize() {
|
||||||
for (const byte of signature) {
|
for (const byte of signature) {
|
||||||
if (curNode.children[byte] === undefined) {
|
if (curNode.children[byte] === undefined) {
|
||||||
if (byte === '??' && !curNode.children['??'] && Object.keys(curNode.children).length > 0) {
|
if (byte === '??' && !curNode.children['??'] && Object.keys(curNode.children).length > 0) {
|
||||||
|
// Reset the byte tree, it is bogus.
|
||||||
|
root = null;
|
||||||
throw 'Cannot add a placeholder child to a node that has non-placeholder children';
|
throw 'Cannot add a placeholder child to a node that has non-placeholder children';
|
||||||
} else if (byte !== '??' && curNode.children['??']) {
|
} else if (byte !== '??' && curNode.children['??']) {
|
||||||
|
// Reset the byte tree, it is bogus.
|
||||||
|
root = null;
|
||||||
throw 'Cannot add a non-placeholder child to a node that has a placeholder child';
|
throw 'Cannot add a non-placeholder child to a node that has a placeholder child';
|
||||||
}
|
}
|
||||||
curNode.children[byte] = new Node(byte);
|
curNode.children[byte] = new Node(byte);
|
||||||
|
@ -114,6 +121,7 @@ export function findMimeType(ab) {
|
||||||
const depth = ab.byteLength < maxDepth ? ab.byteLength : maxDepth;
|
const depth = ab.byteLength < maxDepth ? ab.byteLength : maxDepth;
|
||||||
const arr = new Uint8Array(ab).subarray(0, depth);
|
const arr = new Uint8Array(ab).subarray(0, depth);
|
||||||
let curNode = root;
|
let curNode = root;
|
||||||
|
let mimeType;
|
||||||
// Step through bytes, updating curNode as it walks down the byte tree.
|
// Step through bytes, updating curNode as it walks down the byte tree.
|
||||||
for (const byte of arr) {
|
for (const byte of arr) {
|
||||||
// If this node has a placeholder child, just step into it.
|
// If this node has a placeholder child, just step into it.
|
||||||
|
@ -123,6 +131,10 @@ export function findMimeType(ab) {
|
||||||
}
|
}
|
||||||
if (curNode.children[byte] === undefined) return undefined;
|
if (curNode.children[byte] === undefined) return undefined;
|
||||||
curNode = curNode.children[byte];
|
curNode = curNode.children[byte];
|
||||||
if (curNode.mimeType) return curNode.mimeType;
|
if (curNode.mimeType) {
|
||||||
|
mimeType = curNode.mimeType;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return mimeType;
|
||||||
}
|
}
|
||||||
|
|
16
package.json
16
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@codedread/bitjs",
|
"name": "@codedread/bitjs",
|
||||||
"version": "1.0.10",
|
"version": "1.0.11",
|
||||||
"description": "Binary Tools for JavaScript",
|
"description": "Binary Tools for JavaScript",
|
||||||
"homepage": "https://github.com/codedread/bitjs",
|
"homepage": "https://github.com/codedread/bitjs",
|
||||||
"author": "Jeff Schiller",
|
"author": "Jeff Schiller",
|
||||||
|
@ -33,6 +33,12 @@
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/codedread/bitjs/issues"
|
"url": "https://github.com/codedread/bitjs/issues"
|
||||||
},
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"devDependencies": {
|
||||||
|
"chai": "^4.3.4",
|
||||||
|
"mocha": "^10.1.0",
|
||||||
|
"typescript": "^4.8.0"
|
||||||
|
},
|
||||||
"directories": {
|
"directories": {
|
||||||
"doc": "docs",
|
"doc": "docs",
|
||||||
"test": "tests"
|
"test": "tests"
|
||||||
|
@ -40,11 +46,5 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build-webpshim": "cd build; make",
|
"build-webpshim": "cd build; make",
|
||||||
"test": "./node_modules/.bin/mocha tests/*.spec.js"
|
"test": "./node_modules/.bin/mocha tests/*.spec.js"
|
||||||
},
|
}
|
||||||
"devDependencies": {
|
|
||||||
"chai": "^4.3.4",
|
|
||||||
"mocha": "^10.1.0",
|
|
||||||
"typescript": "^4.8.0"
|
|
||||||
},
|
|
||||||
"dependencies": {}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ describe('bitjs.file.sniffer', () => {
|
||||||
it('JPG', () => { sniffTest('image/jpeg', [0xFF, 0xD8, 0xFF, 0x23]); });
|
it('JPG', () => { sniffTest('image/jpeg', [0xFF, 0xD8, 0xFF, 0x23]); });
|
||||||
it('PNG', () => { sniffTest('image/png', [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0xFF]); });
|
it('PNG', () => { sniffTest('image/png', [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0xFF]); });
|
||||||
it('WebP', () => { sniffTest('image/webp', [0x52, 0x49, 0x46, 0x46, 0x01, 0x02, 0x03, 0x04, 0x57, 0x45, 0x42, 0x50, 0x81]); });
|
it('WebP', () => { sniffTest('image/webp', [0x52, 0x49, 0x46, 0x46, 0x01, 0x02, 0x03, 0x04, 0x57, 0x45, 0x42, 0x50, 0x81]); });
|
||||||
|
it('ICO', () => { sniffTest('image/x-icon', [0x00, 0x00, 0x01, 0x00, 0x69])});
|
||||||
it('ZIP', () => { sniffTest('application/zip', [0x50, 0x4B, 0x03, 0x04, 0x20]); });
|
it('ZIP', () => { sniffTest('application/zip', [0x50, 0x4B, 0x03, 0x04, 0x20]); });
|
||||||
it('ZIP_empty', () => { sniffTest('application/zip', [0x50, 0x4B, 0x05, 0x06, 0x20]); });
|
it('ZIP_empty', () => { sniffTest('application/zip', [0x50, 0x4B, 0x05, 0x06, 0x20]); });
|
||||||
it('ZIP_spanned', () => { sniffTest('application/zip', [0x50, 0x4B, 0x07, 0x08, 0x20]); });
|
it('ZIP_spanned', () => { sniffTest('application/zip', [0x50, 0x4B, 0x07, 0x08, 0x20]); });
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue