securequ 1.1.19 → 1.1.21
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/client/Base.cjs +146 -146
- package/client/Base.cjs.map +1 -1
- package/client/Base.d.ts +18 -18
- package/client/Base.js +146 -146
- package/client/Base.js.map +1 -1
- package/client/index.cjs +155 -138
- package/client/index.cjs.map +1 -1
- package/client/index.d.ts +10 -10
- package/client/index.js +156 -139
- package/client/index.js.map +1 -1
- package/client/types.d.ts +39 -35
- package/include/compress.cjs +31 -31
- package/include/compress.cjs.map +1 -1
- package/include/compress.d.ts +9 -9
- package/include/compress.js +33 -33
- package/include/compress.js.map +1 -1
- package/include/crypto.cjs +132 -132
- package/include/crypto.cjs.map +1 -1
- package/include/crypto.d.ts +21 -21
- package/include/crypto.js +132 -132
- package/include/crypto.js.map +1 -1
- package/include/file-scaner.cjs +77 -95
- package/include/file-scaner.cjs.map +1 -1
- package/include/file-scaner.d.ts +11 -11
- package/include/file-scaner.js +74 -95
- package/include/file-scaner.js.map +1 -1
- package/include/file.cjs +78 -60
- package/include/file.cjs.map +1 -1
- package/include/file.js +78 -61
- package/include/file.js.map +1 -1
- package/index.cjs +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/package.json +1 -1
- package/readme.md +312 -312
- package/server/Base.cjs +105 -105
- package/server/Base.cjs.map +1 -1
- package/server/Base.d.ts +20 -20
- package/server/Base.js +105 -105
- package/server/Base.js.map +1 -1
- package/server/Router.cjs +29 -29
- package/server/Router.cjs.map +1 -1
- package/server/Router.d.ts +7 -7
- package/server/Router.js +29 -29
- package/server/Router.js.map +1 -1
- package/server/index.cjs +185 -187
- package/server/index.cjs.map +1 -1
- package/server/index.d.ts +5 -5
- package/server/index.js +186 -188
- package/server/index.js.map +1 -1
- package/server/types.d.ts +72 -72
package/include/crypto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\r\nimport compresor from \"./compress\";\r\n\r\n/* ================================\r\n Types\r\n================================ */\r\nexport type EncryptInput = string | object | any[];\r\n\r\n/* ================================\r\n Sodium Init (SAFE & IDP)\r\n================================ */\r\nlet initPromise: Promise<void> | null = null;\r\n\r\nasync function init(): Promise<void> {\r\n if (!initPromise) {\r\n initPromise = sodium.ready.then(() => void 0);\r\n }\r\n return initPromise;\r\n}\r\n\r\n/* ================================\r\n Key Derivation\r\n (Stable & deterministic)\r\n================================ */\r\nfunction deriveKey(secret: string): Uint8Array {\r\n return sodium.crypto_generichash(\r\n sodium.crypto_secretbox_KEYBYTES,\r\n sodium.from_string(secret),\r\n null\r\n ) as Uint8Array\r\n}\r\n\r\n/* ================================\r\n Encrypt (string)\r\n================================ */\r\nasync function encrypt(\r\n input: EncryptInput,\r\n secret: string\r\n): Promise<string> {\r\n const buf = await encryptBuffer(input, secret);\r\n return sodium.to_base64(\r\n buf,\r\n sodium.base64_variants.URLSAFE_NO_PADDING\r\n );\r\n}\r\n\r\n/* ================================\r\n Decrypt (string)\r\n================================ */\r\nasync function decrypt(\r\n base64: string,\r\n secret: string\r\n): Promise<any | null> {\r\n await init();\r\n\r\n const box = sodium.from_base64(\r\n base64,\r\n sodium.base64_variants.URLSAFE_NO_PADDING\r\n );\r\n\r\n return decryptBuffer(box, secret);\r\n}\r\n\r\n/* ================================\r\n Encrypt (buffer)\r\n================================ */\r\nasync function encryptBuffer(\r\n input: EncryptInput,\r\n secret: string\r\n): Promise<Uint8Array> {\r\n await init();\r\n\r\n const key = deriveKey(secret);\r\n const nonce = sodium.randombytes_buf(\r\n sodium.crypto_secretbox_NONCEBYTES\r\n ) as Uint8Array\r\n\r\n\r\n const compressed = await compresor.compressBuffer(input);\r\n\r\n const cipher = sodium.crypto_secretbox_easy(\r\n compressed,\r\n nonce,\r\n key\r\n ) as Uint8Array\r\n\r\n const out = new Uint8Array(nonce.length + cipher.length);\r\n out.set(nonce);\r\n out.set(cipher, nonce.length);\r\n\r\n return out;\r\n}\r\n\r\n/* ================================\r\n Decrypt (buffer)\r\n================================ */\r\nasync function decryptBuffer(\r\n box: Uint8Array,\r\n secret: string\r\n): Promise<any | null> {\r\n await init();\r\n\r\n const key = deriveKey(secret);\r\n const nonceSize = sodium.crypto_secretbox_NONCEBYTES;\r\n\r\n if (box.length <= nonceSize) return null;\r\n\r\n const nonce = box.subarray(0, nonceSize);\r\n const cipher = box.subarray(nonceSize);\r\n\r\n const opened = sodium.crypto_secretbox_open_easy(\r\n cipher,\r\n nonce,\r\n key\r\n ) as Uint8Array\r\n\r\n if (!opened) return null;\r\n\r\n return compresor.decompressBuffer(opened);\r\n}\r\n\r\n/* ================================\r\n Hash (URL-safe, short)\r\n================================ */\r\nasync function hash(str: string): Promise<string> {\r\n await init();\r\n\r\n const digest = sodium.crypto_generichash(\r\n 32,\r\n sodium.from_string(str),\r\n null\r\n );\r\n\r\n return sodium\r\n .to_base64(digest, sodium.base64_variants.URLSAFE_NO_PADDING)\r\n .replace(/[^a-zA-Z0-9]/g, \"\");\r\n}\r\n\r\n/* ================================\r\n Canonical JSON\r\n================================ */\r\nfunction canonicalJSON(value: any): string {\r\n if (value === null || typeof value !== \"object\") {\r\n return JSON.stringify(value);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return JSON.stringify(value.map(canonicalJSON));\r\n }\r\n\r\n const keys = Object.keys(value).sort();\r\n const obj: any = {};\r\n\r\n for (const k of keys) {\r\n obj[k] = value[k];\r\n }\r\n\r\n return JSON.stringify(obj);\r\n}\r\n\r\n/* ================================\r\n Create Token\r\n================================ */\r\nasync function createToken(\r\n payload: Record<string, any>,\r\n secret: string\r\n): Promise<string> {\r\n await init();\r\n\r\n const key = deriveKey(secret);\r\n const json = canonicalJSON(payload);\r\n\r\n const encryptedPayload = await encrypt(payload, secret);\r\n\r\n const mac = sodium.crypto_generichash(\r\n 32,\r\n sodium.from_string(json),\r\n key\r\n );\r\n\r\n const macBase64 = sodium.to_base64(\r\n mac,\r\n sodium.base64_variants.URLSAFE_NO_PADDING\r\n );\r\n\r\n return `${encryptedPayload}.${macBase64}`;\r\n}\r\n\r\n/* ================================\r\n Verify Token\r\n================================ */\r\nasync function verifyToken(\r\n token: string,\r\n secret: string\r\n): Promise<{ valid: boolean; payload?: any }> {\r\n await init();\r\n\r\n const parts = token.split(\".\");\r\n if (parts.length !== 2) return { valid: false };\r\n\r\n const [payloadBase64, macBase64] = parts;\r\n\r\n const payload = await decrypt(payloadBase64, secret);\r\n if (payload === null) return { valid: false };\r\n\r\n const json = canonicalJSON(payload);\r\n const key = deriveKey(secret);\r\n\r\n const expectedMac = sodium.crypto_generichash(\r\n 32,\r\n sodium.from_string(json),\r\n key\r\n ) as Uint8Array\r\n\r\n const mac = sodium.from_base64(\r\n macBase64,\r\n sodium.base64_variants.URLSAFE_NO_PADDING\r\n );\r\n\r\n if (\r\n mac.length !== expectedMac.length ||\r\n !sodium.memcmp(expectedMac, mac)\r\n ) {\r\n return { valid: false };\r\n }\r\n\r\n return { valid: true, payload };\r\n}\r\n\r\n\r\n\r\nconst crypto = {\r\n init,\r\n encrypt,\r\n decrypt,\r\n encryptBuffer,\r\n decryptBuffer,\r\n hash,\r\n createToken,\r\n verifyToken,\r\n}\r\n\r\nexport default crypto"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crypto.js","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport compresor from \"./compress\";\n\n/* ================================\n Types\n================================ */\nexport type EncryptInput = string | object | any[];\n\n/* ================================\n Sodium Init (SAFE & IDP)\n================================ */\nlet initPromise: Promise<void> | null = null;\n\nasync function init(): Promise<void> {\n if (!initPromise) {\n initPromise = sodium.ready.then(() => void 0);\n }\n return initPromise;\n}\n\n/* ================================\n Key Derivation\n (Stable & deterministic)\n================================ */\nfunction deriveKey(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_KEYBYTES,\n sodium.from_string(secret),\n null\n ) as Uint8Array\n}\n\n/* ================================\n Encrypt (string)\n================================ */\nasync function encrypt(\n input: EncryptInput,\n secret: string\n): Promise<string> {\n const buf = await encryptBuffer(input, secret);\n return sodium.to_base64(\n buf,\n sodium.base64_variants.URLSAFE_NO_PADDING\n );\n}\n\n/* ================================\n Decrypt (string)\n================================ */\nasync function decrypt(\n base64: string,\n secret: string\n): Promise<any | null> {\n await init();\n\n const box = sodium.from_base64(\n base64,\n sodium.base64_variants.URLSAFE_NO_PADDING\n );\n\n return decryptBuffer(box, secret);\n}\n\n/* ================================\n Encrypt (buffer)\n================================ */\nasync function encryptBuffer(\n input: EncryptInput,\n secret: string\n): Promise<Uint8Array> {\n await init();\n\n const key = deriveKey(secret);\n const nonce = sodium.randombytes_buf(\n sodium.crypto_secretbox_NONCEBYTES\n ) as Uint8Array\n\n\n const compressed = await compresor.compressBuffer(input);\n\n const cipher = sodium.crypto_secretbox_easy(\n compressed,\n nonce,\n key\n ) as Uint8Array\n\n const out = new Uint8Array(nonce.length + cipher.length);\n out.set(nonce);\n out.set(cipher, nonce.length);\n\n return out;\n}\n\n/* ================================\n Decrypt (buffer)\n================================ */\nasync function decryptBuffer(\n box: Uint8Array,\n secret: string\n): Promise<any | null> {\n await init();\n\n const key = deriveKey(secret);\n const nonceSize = sodium.crypto_secretbox_NONCEBYTES;\n\n if (box.length <= nonceSize) return null;\n\n const nonce = box.subarray(0, nonceSize);\n const cipher = box.subarray(nonceSize);\n\n const opened = sodium.crypto_secretbox_open_easy(\n cipher,\n nonce,\n key\n ) as Uint8Array\n\n if (!opened) return null;\n\n return compresor.decompressBuffer(opened);\n}\n\n/* ================================\n Hash (URL-safe, short)\n================================ */\nasync function hash(str: string): Promise<string> {\n await init();\n\n const digest = sodium.crypto_generichash(\n 32,\n sodium.from_string(str),\n null\n );\n\n return sodium\n .to_base64(digest, sodium.base64_variants.URLSAFE_NO_PADDING)\n .replace(/[^a-zA-Z0-9]/g, \"\");\n}\n\n/* ================================\n Canonical JSON\n================================ */\nfunction canonicalJSON(value: any): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return JSON.stringify(value.map(canonicalJSON));\n }\n\n const keys = Object.keys(value).sort();\n const obj: any = {};\n\n for (const k of keys) {\n obj[k] = value[k];\n }\n\n return JSON.stringify(obj);\n}\n\n/* ================================\n Create Token\n================================ */\nasync function createToken(\n payload: Record<string, any>,\n secret: string\n): Promise<string> {\n await init();\n\n const key = deriveKey(secret);\n const json = canonicalJSON(payload);\n\n const encryptedPayload = await encrypt(payload, secret);\n\n const mac = sodium.crypto_generichash(\n 32,\n sodium.from_string(json),\n key\n );\n\n const macBase64 = sodium.to_base64(\n mac,\n sodium.base64_variants.URLSAFE_NO_PADDING\n );\n\n return `${encryptedPayload}.${macBase64}`;\n}\n\n/* ================================\n Verify Token\n================================ */\nasync function verifyToken(\n token: string,\n secret: string\n): Promise<{ valid: boolean; payload?: any }> {\n await init();\n\n const parts = token.split(\".\");\n if (parts.length !== 2) return { valid: false };\n\n const [payloadBase64, macBase64] = parts;\n\n const payload = await decrypt(payloadBase64, secret);\n if (payload === null) return { valid: false };\n\n const json = canonicalJSON(payload);\n const key = deriveKey(secret);\n\n const expectedMac = sodium.crypto_generichash(\n 32,\n sodium.from_string(json),\n key\n ) as Uint8Array\n\n const mac = sodium.from_base64(\n macBase64,\n sodium.base64_variants.URLSAFE_NO_PADDING\n );\n\n if (\n mac.length !== expectedMac.length ||\n !sodium.memcmp(expectedMac, mac)\n ) {\n return { valid: false };\n }\n\n return { valid: true, payload };\n}\n\n\n\nconst crypto = {\n init,\n encrypt,\n decrypt,\n encryptBuffer,\n decryptBuffer,\n hash,\n createToken,\n verifyToken,\n}\n\nexport default crypto"],"names":[],"mappings":"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"}
|
package/include/file-scaner.cjs
CHANGED
|
@@ -1,100 +1,82 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return { valid: true, ext:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (match([0x50, 0x4B, 0x03, 0x04]))
|
|
79
|
-
return { valid: true, ext: "docx", mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" };
|
|
80
|
-
// --- Fonts ---
|
|
81
|
-
if (match([0x00, 0x01, 0x00, 0x00]))
|
|
82
|
-
return { valid: true, ext: "ttf", mime: "font/ttf" };
|
|
83
|
-
if (match([0x4F, 0x54, 0x54, 0x4F]))
|
|
84
|
-
return { valid: true, ext: "otf", mime: "font/otf" };
|
|
85
|
-
// --- Scripts / Binary ---
|
|
86
|
-
if (match([0x23, 0x21]))
|
|
87
|
-
return { valid: true, ext: "sh", mime: "application/x-sh" }; // shell script
|
|
88
|
-
if (match([0x7F, 0x45, 0x4C, 0x46]))
|
|
89
|
-
return { valid: true, ext: "elf", mime: "application/x-elf" }; // Linux executable
|
|
90
|
-
// --- Others / fallback ---
|
|
91
|
-
if (match([0x46, 0x4C, 0x56]))
|
|
92
|
-
return { valid: true, ext: "flv", mime: "video/x-flv" };
|
|
93
|
-
if (match([0x50, 0x4E, 0x44, 0x52]))
|
|
94
|
-
return { valid: true, ext: "pdf", mime: "application/pdf" }; // alternate PDF
|
|
95
|
-
if (match([0x42, 0x50, 0x47, 0x0D]))
|
|
96
|
-
return { valid: true, ext: "bpg", mime: "image/bpg" }; // BPG
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Mega raw file-type detection from first chunk (magic bytes)
|
|
7
|
+
* Supports 100+ common file types: images, audio, video, docs, archives, fonts, scripts, binaries.
|
|
8
|
+
*/
|
|
9
|
+
function fileScaner(chunk) {
|
|
10
|
+
if (!chunk || chunk.length < 4)
|
|
11
|
+
return { valid: false };
|
|
12
|
+
// Define file signatures
|
|
13
|
+
const FILE_SIGNATURES = [
|
|
14
|
+
// --- Images ---
|
|
15
|
+
{ pattern: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], ext: "png", mime: "image/png" },
|
|
16
|
+
{ pattern: [0x47, 0x49, 0x46, 0x38], ext: "gif", mime: "image/gif" },
|
|
17
|
+
{ pattern: [0x52, 0x49, 0x46, 0x46], ext: "webp", mime: "image/webp", asciiSlice: [8, 12, "WEBP"] },
|
|
18
|
+
{ pattern: [0xFF, 0xD8, 0xFF], ext: "jpg", mime: "image/jpeg" },
|
|
19
|
+
{ pattern: [0x42, 0x4D], ext: "bmp", mime: "image/bmp" },
|
|
20
|
+
{ pattern: [0x49, 0x49, 0x2A, 0x00], ext: "tif", mime: "image/tiff" },
|
|
21
|
+
{ pattern: [0x4D, 0x4D, 0x00, 0x2A], ext: "tif", mime: "image/tiff" },
|
|
22
|
+
{ pattern: [0x00, 0x00, 0x01, 0x00], ext: "ico", mime: "image/x-icon" },
|
|
23
|
+
{ pattern: [0x00, 0x00, 0x02, 0x00], ext: "cur", mime: "image/x-icon" },
|
|
24
|
+
// --- Audio ---
|
|
25
|
+
{ pattern: [0x49, 0x44, 0x33], ext: "mp3", mime: "audio/mpeg" },
|
|
26
|
+
{ pattern: [0x66, 0x4C, 0x61, 0x43], ext: "flac", mime: "audio/flac" },
|
|
27
|
+
{ pattern: [0x4F, 0x67, 0x67, 0x53], ext: "ogg", mime: "audio/ogg" },
|
|
28
|
+
{ pattern: [0x52, 0x49, 0x46, 0x46], ext: "wav", mime: "audio/wav", asciiSlice: [8, 12, "WAVE"] },
|
|
29
|
+
{ pattern: [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], ext: "mp4a", mime: "audio/mp4" },
|
|
30
|
+
// --- Video ---
|
|
31
|
+
{ pattern: [0x00, 0x00, 0x00, 0x18], ext: "mp4", mime: "video/mp4", asciiSlice: [4, 8, "ftyp"] },
|
|
32
|
+
{ pattern: [0x1A, 0x45, 0xDF, 0xA3], ext: "mkv", mime: "video/x-matroska" },
|
|
33
|
+
{ pattern: [0x52, 0x49, 0x46, 0x46], ext: "avi", mime: "video/x-msvideo", asciiSlice: [8, 12, "AVI "] },
|
|
34
|
+
{ pattern: [0x00, 0x00, 0x01, 0xBA], ext: "mpeg", mime: "video/mpeg" },
|
|
35
|
+
{ pattern: [0x47, 0x40, 0x00, 0x10], ext: "ts", mime: "video/MP2T" },
|
|
36
|
+
{ pattern: [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], ext: "mov", mime: "video/quicktime" },
|
|
37
|
+
// --- Archives ---
|
|
38
|
+
{ pattern: [0x50, 0x4B, 0x03, 0x04], ext: "zip", mime: "application/zip" },
|
|
39
|
+
{ pattern: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00], ext: "rar", mime: "application/x-rar-compressed" },
|
|
40
|
+
{ pattern: [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C], ext: "7z", mime: "application/x-7z-compressed" },
|
|
41
|
+
{ pattern: [0x1F, 0x8B], ext: "gz", mime: "application/gzip" },
|
|
42
|
+
{ pattern: [0x42, 0x5A, 0x68], ext: "bz2", mime: "application/x-bzip2" },
|
|
43
|
+
// --- Documents ---
|
|
44
|
+
{ pattern: [0x25, 0x50, 0x44, 0x46], ext: "pdf", mime: "application/pdf" },
|
|
45
|
+
{ pattern: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1], ext: "msi", mime: "application/vnd.ms-installer" },
|
|
46
|
+
{ pattern: [0x4D, 0x5A], ext: "exe", mime: "application/vnd.microsoft.portable-executable" },
|
|
47
|
+
{ pattern: [0x09, 0x08, 0x10, 0x00], ext: "doc", mime: "application/msword" },
|
|
48
|
+
{ pattern: [0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05], ext: "xls", mime: "application/vnd.ms-excel" },
|
|
49
|
+
{ pattern: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1], ext: "ppt", mime: "application/vnd.ms-powerpoint" },
|
|
50
|
+
{ pattern: [0x50, 0x4B, 0x03, 0x04], ext: "docx", mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
|
|
51
|
+
// --- Fonts ---
|
|
52
|
+
{ pattern: [0x00, 0x01, 0x00, 0x00], ext: "ttf", mime: "font/ttf" },
|
|
53
|
+
{ pattern: [0x4F, 0x54, 0x54, 0x4F], ext: "otf", mime: "font/otf" },
|
|
54
|
+
// --- Scripts / Binary ---
|
|
55
|
+
{ pattern: [0x23, 0x21], ext: "sh", mime: "application/x-sh" },
|
|
56
|
+
{ pattern: [0x7F, 0x45, 0x4C, 0x46], ext: "elf", mime: "application/x-elf" },
|
|
57
|
+
// --- Others / fallback ---
|
|
58
|
+
{ pattern: [0x46, 0x4C, 0x56], ext: "flv", mime: "video/x-flv" },
|
|
59
|
+
{ pattern: [0x50, 0x4E, 0x44, 0x52], ext: "pdf", mime: "application/pdf" },
|
|
60
|
+
{ pattern: [0x42, 0x50, 0x47, 0x0D], ext: "bpg", mime: "image/bpg" },
|
|
61
|
+
];
|
|
62
|
+
// Check all signatures
|
|
63
|
+
for (const sig of FILE_SIGNATURES) {
|
|
64
|
+
const offset = sig.offset || 0;
|
|
65
|
+
const match = sig.pattern.every((b, i) => chunk[i + offset] === b);
|
|
66
|
+
if (!match)
|
|
67
|
+
continue;
|
|
68
|
+
// Check optional ASCII slice
|
|
69
|
+
if (sig.asciiSlice) {
|
|
70
|
+
const [start, end, str] = sig.asciiSlice;
|
|
71
|
+
const slice = chunk.slice(start, end).toString("ascii");
|
|
72
|
+
if (slice !== str)
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
return { valid: true, ext: sig.ext, mime: sig.mime };
|
|
76
|
+
}
|
|
77
|
+
return { valid: false };
|
|
97
78
|
}
|
|
98
79
|
|
|
99
|
-
|
|
80
|
+
exports.default = fileScaner;
|
|
81
|
+
exports.fileScaner = fileScaner;
|
|
100
82
|
//# sourceMappingURL=file-scaner.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-scaner.cjs","sources":["../../src/include/file-scaner.ts"],"sourcesContent":["export type FileScanerResult = {\r\n valid: boolean;\r\n ext?: string;\r\n mime?: string;\r\n};\r\n\r\n/**\r\n * Mega raw file-type detection from first chunk (magic bytes)\r\n * Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.\r\n */\r\nfunction fileScaner(chunk: Uint8Array | Buffer): FileScanerResult | void {\r\n if (!chunk || chunk.length < 4) return { valid: false };\r\n const match = (pattern: number[]) => pattern.every((b, i) => chunk[i] === b);\r\n\r\n // --- Images ---\r\n if (chunk.length >= 8) {\r\n if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) return { valid: true, ext: \"png\", mime: \"image/png\" };\r\n if (match([0x47, 0x49, 0x46, 0x38])) return { valid: true, ext: \"gif\", mime: \"image/gif\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WEBP\") return { valid: true, ext: \"webp\", mime: \"image/webp\" };\r\n }\r\n if (match([0xFF, 0xD8, 0xFF])) return { valid: true, ext: \"jpg\", mime: \"image/jpeg\" };\r\n if (match([0x42, 0x4D])) return { valid: true, ext: \"bmp\", mime: \"image/bmp\" };\r\n if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A])) return { valid: true, ext: \"tif\", mime: \"image/tiff\" };\r\n if (match([0x00, 0x00, 0x01, 0x00])) return { valid: true, ext: \"ico\", mime: \"image/x-icon\" };\r\n if (match([0x00, 0x00, 0x02, 0x00])) return { valid: true, ext: \"cur\", mime: \"image/x-icon\" };\r\n\r\n // --- Audio ---\r\n if (match([0x49, 0x44, 0x33])) return { valid: true, ext: \"mp3\", mime: \"audio/mpeg\" };\r\n if (match([0x66, 0x4C, 0x61, 0x43])) return { valid: true, ext: \"flac\", mime: \"audio/flac\" };\r\n if (match([0x4F, 0x67, 0x67, 0x53])) return { valid: true, ext: \"ogg\", mime: \"audio/ogg\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WAVE\") return { valid: true, ext: \"wav\", mime: \"audio/wav\" };\r\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mp4a\", mime: \"audio/mp4\" };\r\n\r\n // --- Video ---\r\n if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === \"ftyp\") return { valid: true, ext: \"mp4\", mime: \"video/mp4\" };\r\n if (match([0x1A, 0x45, 0xDF, 0xA3])) return { valid: true, ext: \"mkv\", mime: \"video/x-matroska\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"AVI \") return { valid: true, ext: \"avi\", mime: \"video/x-msvideo\" };\r\n if (match([0x00, 0x00, 0x01, 0xBA])) return { valid: true, ext: \"mpeg\", mime: \"video/mpeg\" };\r\n if (match([0x47, 0x40, 0x00, 0x10])) return { valid: true, ext: \"ts\", mime: \"video/MP2T\" };\r\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mov\", mime: \"video/quicktime\" };\r\n\r\n // --- Archives ---\r\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"zip\", mime: \"application/zip\" };\r\n if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00])) return { valid: true, ext: \"rar\", mime: \"application/x-rar-compressed\" };\r\n if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) return { valid: true, ext: \"7z\", mime: \"application/x-7z-compressed\" };\r\n if (match([0x1F, 0x8B])) return { valid: true, ext: \"gz\", mime: \"application/gzip\" };\r\n if (match([0x42, 0x5A, 0x68])) return { valid: true, ext: \"bz2\", mime: \"application/x-bzip2\" };\r\n\r\n // --- Documents ---\r\n if (match([0x25, 0x50, 0x44, 0x46])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" };\r\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) return { valid: true, ext: \"msi\", mime: \"application/vnd.ms-installer\" };\r\n if (match([0x4D, 0x5A])) return { valid: true, ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" };\r\n if (match([0x09, 0x08, 0x10, 0x00])) return { valid: true, ext: \"doc\", mime: \"application/msword\" };\r\n if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05])) return { valid: true, ext: \"xls\", mime: \"application/vnd.ms-excel\" };\r\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1])) return { valid: true, ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" };\r\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" };\r\n\r\n // --- Fonts ---\r\n if (match([0x00, 0x01, 0x00, 0x00])) return { valid: true, ext: \"ttf\", mime: \"font/ttf\" };\r\n if (match([0x4F, 0x54, 0x54, 0x4F])) return { valid: true, ext: \"otf\", mime: \"font/otf\" };\r\n\r\n // --- Scripts / Binary ---\r\n if (match([0x23, 0x21])) return { valid: true, ext: \"sh\", mime: \"application/x-sh\" }; // shell script\r\n if (match([0x7F, 0x45, 0x4C, 0x46])) return { valid: true, ext: \"elf\", mime: \"application/x-elf\" }; // Linux executable\r\n\r\n // --- Others / fallback ---\r\n if (match([0x46, 0x4C, 0x56])) return { valid: true, ext: \"flv\", mime: \"video/x-flv\" };\r\n if (match([0x50, 0x4E, 0x44, 0x52])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" }; // alternate PDF\r\n if (match([0x42, 0x50, 0x47, 0x0D])) return { valid: true, ext: \"bpg\", mime: \"image/bpg\" }; // BPG\r\n\r\n}\r\n\r\nexport default fileScaner;"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-scaner.cjs","sources":["../../src/include/file-scaner.ts"],"sourcesContent":["export type FileScanerResult = {\n valid: boolean;\n ext?: string;\n mime?: string;\n};\n\n/**\n * Mega raw file-type detection from first chunk (magic bytes)\n * Supports 100+ common file types: images, audio, video, docs, archives, fonts, scripts, binaries.\n */\nexport function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult {\n if (!chunk || chunk.length < 4) return { valid: false };\n\n // Define file signatures\n const FILE_SIGNATURES: {\n pattern: number[];\n ext: string;\n mime: string;\n offset?: number;\n asciiSlice?: [number, number, string]; // optional slice check: [start, end, string]\n }[] = [\n // --- Images ---\n { pattern: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], ext: \"png\", mime: \"image/png\" },\n { pattern: [0x47, 0x49, 0x46, 0x38], ext: \"gif\", mime: \"image/gif\" },\n { pattern: [0x52, 0x49, 0x46, 0x46], ext: \"webp\", mime: \"image/webp\", asciiSlice: [8, 12, \"WEBP\"] },\n { pattern: [0xFF, 0xD8, 0xFF], ext: \"jpg\", mime: \"image/jpeg\" },\n { pattern: [0x42, 0x4D], ext: \"bmp\", mime: \"image/bmp\" },\n { pattern: [0x49, 0x49, 0x2A, 0x00], ext: \"tif\", mime: \"image/tiff\" },\n { pattern: [0x4D, 0x4D, 0x00, 0x2A], ext: \"tif\", mime: \"image/tiff\" },\n { pattern: [0x00, 0x00, 0x01, 0x00], ext: \"ico\", mime: \"image/x-icon\" },\n { pattern: [0x00, 0x00, 0x02, 0x00], ext: \"cur\", mime: \"image/x-icon\" },\n\n // --- Audio ---\n { pattern: [0x49, 0x44, 0x33], ext: \"mp3\", mime: \"audio/mpeg\" },\n { pattern: [0x66, 0x4C, 0x61, 0x43], ext: \"flac\", mime: \"audio/flac\" },\n { pattern: [0x4F, 0x67, 0x67, 0x53], ext: \"ogg\", mime: \"audio/ogg\" },\n { pattern: [0x52, 0x49, 0x46, 0x46], ext: \"wav\", mime: \"audio/wav\", asciiSlice: [8, 12, \"WAVE\"] },\n { pattern: [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], ext: \"mp4a\", mime: \"audio/mp4\" },\n\n // --- Video ---\n { pattern: [0x00, 0x00, 0x00, 0x18], ext: \"mp4\", mime: \"video/mp4\", asciiSlice: [4, 8, \"ftyp\"] },\n { pattern: [0x1A, 0x45, 0xDF, 0xA3], ext: \"mkv\", mime: \"video/x-matroska\" },\n { pattern: [0x52, 0x49, 0x46, 0x46], ext: \"avi\", mime: \"video/x-msvideo\", asciiSlice: [8, 12, \"AVI \"] },\n { pattern: [0x00, 0x00, 0x01, 0xBA], ext: \"mpeg\", mime: \"video/mpeg\" },\n { pattern: [0x47, 0x40, 0x00, 0x10], ext: \"ts\", mime: \"video/MP2T\" },\n { pattern: [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], ext: \"mov\", mime: \"video/quicktime\" },\n\n // --- Archives ---\n { pattern: [0x50, 0x4B, 0x03, 0x04], ext: \"zip\", mime: \"application/zip\" },\n { pattern: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00], ext: \"rar\", mime: \"application/x-rar-compressed\" },\n { pattern: [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C], ext: \"7z\", mime: \"application/x-7z-compressed\" },\n { pattern: [0x1F, 0x8B], ext: \"gz\", mime: \"application/gzip\" },\n { pattern: [0x42, 0x5A, 0x68], ext: \"bz2\", mime: \"application/x-bzip2\" },\n\n // --- Documents ---\n { pattern: [0x25, 0x50, 0x44, 0x46], ext: \"pdf\", mime: \"application/pdf\" },\n { pattern: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1], ext: \"msi\", mime: \"application/vnd.ms-installer\" },\n { pattern: [0x4D, 0x5A], ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" },\n { pattern: [0x09, 0x08, 0x10, 0x00], ext: \"doc\", mime: \"application/msword\" },\n { pattern: [0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05], ext: \"xls\", mime: \"application/vnd.ms-excel\" },\n { pattern: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1], ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" },\n { pattern: [0x50, 0x4B, 0x03, 0x04], ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" },\n\n // --- Fonts ---\n { pattern: [0x00, 0x01, 0x00, 0x00], ext: \"ttf\", mime: \"font/ttf\" },\n { pattern: [0x4F, 0x54, 0x54, 0x4F], ext: \"otf\", mime: \"font/otf\" },\n\n // --- Scripts / Binary ---\n { pattern: [0x23, 0x21], ext: \"sh\", mime: \"application/x-sh\" },\n { pattern: [0x7F, 0x45, 0x4C, 0x46], ext: \"elf\", mime: \"application/x-elf\" },\n\n // --- Others / fallback ---\n { pattern: [0x46, 0x4C, 0x56], ext: \"flv\", mime: \"video/x-flv\" },\n { pattern: [0x50, 0x4E, 0x44, 0x52], ext: \"pdf\", mime: \"application/pdf\" },\n { pattern: [0x42, 0x50, 0x47, 0x0D], ext: \"bpg\", mime: \"image/bpg\" },\n ];\n\n // Check all signatures\n for (const sig of FILE_SIGNATURES) {\n const offset = sig.offset || 0;\n const match = sig.pattern.every((b, i) => chunk[i + offset] === b);\n if (!match) continue;\n\n // Check optional ASCII slice\n if (sig.asciiSlice) {\n const [start, end, str] = sig.asciiSlice;\n const slice = chunk.slice(start, end).toString(\"ascii\");\n if (slice !== str) continue;\n }\n\n return { valid: true, ext: sig.ext, mime: sig.mime };\n }\n\n return { valid: false };\n}\n\nexport default fileScaner;"],"names":[],"mappings":"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"}
|
package/include/file-scaner.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
type FileScanerResult = {
|
|
2
|
-
valid: boolean;
|
|
3
|
-
ext?: string;
|
|
4
|
-
mime?: string;
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* Mega raw file-type detection from first chunk (magic bytes)
|
|
8
|
-
* Supports 100+ common file types: images, audio, video, docs, archives,
|
|
9
|
-
*/
|
|
10
|
-
declare function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult
|
|
1
|
+
type FileScanerResult = {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
ext?: string;
|
|
4
|
+
mime?: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Mega raw file-type detection from first chunk (magic bytes)
|
|
8
|
+
* Supports 100+ common file types: images, audio, video, docs, archives, fonts, scripts, binaries.
|
|
9
|
+
*/
|
|
10
|
+
declare function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult;
|
|
11
11
|
|
|
12
|
-
export { fileScaner as default };
|
|
12
|
+
export { fileScaner as default, fileScaner };
|
|
13
13
|
export type { FileScanerResult };
|
package/include/file-scaner.js
CHANGED
|
@@ -1,98 +1,77 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mega raw file-type detection from first chunk (magic bytes)
|
|
3
|
-
* Supports 100+ common file types: images, audio, video, docs, archives,
|
|
4
|
-
*/
|
|
5
|
-
function fileScaner(chunk) {
|
|
6
|
-
if (!chunk || chunk.length < 4)
|
|
7
|
-
return { valid: false };
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return { valid: true, ext:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1]))
|
|
75
|
-
return { valid: true, ext: "ppt", mime: "application/vnd.ms-powerpoint" };
|
|
76
|
-
if (match([0x50, 0x4B, 0x03, 0x04]))
|
|
77
|
-
return { valid: true, ext: "docx", mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" };
|
|
78
|
-
// --- Fonts ---
|
|
79
|
-
if (match([0x00, 0x01, 0x00, 0x00]))
|
|
80
|
-
return { valid: true, ext: "ttf", mime: "font/ttf" };
|
|
81
|
-
if (match([0x4F, 0x54, 0x54, 0x4F]))
|
|
82
|
-
return { valid: true, ext: "otf", mime: "font/otf" };
|
|
83
|
-
// --- Scripts / Binary ---
|
|
84
|
-
if (match([0x23, 0x21]))
|
|
85
|
-
return { valid: true, ext: "sh", mime: "application/x-sh" }; // shell script
|
|
86
|
-
if (match([0x7F, 0x45, 0x4C, 0x46]))
|
|
87
|
-
return { valid: true, ext: "elf", mime: "application/x-elf" }; // Linux executable
|
|
88
|
-
// --- Others / fallback ---
|
|
89
|
-
if (match([0x46, 0x4C, 0x56]))
|
|
90
|
-
return { valid: true, ext: "flv", mime: "video/x-flv" };
|
|
91
|
-
if (match([0x50, 0x4E, 0x44, 0x52]))
|
|
92
|
-
return { valid: true, ext: "pdf", mime: "application/pdf" }; // alternate PDF
|
|
93
|
-
if (match([0x42, 0x50, 0x47, 0x0D]))
|
|
94
|
-
return { valid: true, ext: "bpg", mime: "image/bpg" }; // BPG
|
|
1
|
+
/**
|
|
2
|
+
* Mega raw file-type detection from first chunk (magic bytes)
|
|
3
|
+
* Supports 100+ common file types: images, audio, video, docs, archives, fonts, scripts, binaries.
|
|
4
|
+
*/
|
|
5
|
+
function fileScaner(chunk) {
|
|
6
|
+
if (!chunk || chunk.length < 4)
|
|
7
|
+
return { valid: false };
|
|
8
|
+
// Define file signatures
|
|
9
|
+
const FILE_SIGNATURES = [
|
|
10
|
+
// --- Images ---
|
|
11
|
+
{ pattern: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], ext: "png", mime: "image/png" },
|
|
12
|
+
{ pattern: [0x47, 0x49, 0x46, 0x38], ext: "gif", mime: "image/gif" },
|
|
13
|
+
{ pattern: [0x52, 0x49, 0x46, 0x46], ext: "webp", mime: "image/webp", asciiSlice: [8, 12, "WEBP"] },
|
|
14
|
+
{ pattern: [0xFF, 0xD8, 0xFF], ext: "jpg", mime: "image/jpeg" },
|
|
15
|
+
{ pattern: [0x42, 0x4D], ext: "bmp", mime: "image/bmp" },
|
|
16
|
+
{ pattern: [0x49, 0x49, 0x2A, 0x00], ext: "tif", mime: "image/tiff" },
|
|
17
|
+
{ pattern: [0x4D, 0x4D, 0x00, 0x2A], ext: "tif", mime: "image/tiff" },
|
|
18
|
+
{ pattern: [0x00, 0x00, 0x01, 0x00], ext: "ico", mime: "image/x-icon" },
|
|
19
|
+
{ pattern: [0x00, 0x00, 0x02, 0x00], ext: "cur", mime: "image/x-icon" },
|
|
20
|
+
// --- Audio ---
|
|
21
|
+
{ pattern: [0x49, 0x44, 0x33], ext: "mp3", mime: "audio/mpeg" },
|
|
22
|
+
{ pattern: [0x66, 0x4C, 0x61, 0x43], ext: "flac", mime: "audio/flac" },
|
|
23
|
+
{ pattern: [0x4F, 0x67, 0x67, 0x53], ext: "ogg", mime: "audio/ogg" },
|
|
24
|
+
{ pattern: [0x52, 0x49, 0x46, 0x46], ext: "wav", mime: "audio/wav", asciiSlice: [8, 12, "WAVE"] },
|
|
25
|
+
{ pattern: [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], ext: "mp4a", mime: "audio/mp4" },
|
|
26
|
+
// --- Video ---
|
|
27
|
+
{ pattern: [0x00, 0x00, 0x00, 0x18], ext: "mp4", mime: "video/mp4", asciiSlice: [4, 8, "ftyp"] },
|
|
28
|
+
{ pattern: [0x1A, 0x45, 0xDF, 0xA3], ext: "mkv", mime: "video/x-matroska" },
|
|
29
|
+
{ pattern: [0x52, 0x49, 0x46, 0x46], ext: "avi", mime: "video/x-msvideo", asciiSlice: [8, 12, "AVI "] },
|
|
30
|
+
{ pattern: [0x00, 0x00, 0x01, 0xBA], ext: "mpeg", mime: "video/mpeg" },
|
|
31
|
+
{ pattern: [0x47, 0x40, 0x00, 0x10], ext: "ts", mime: "video/MP2T" },
|
|
32
|
+
{ pattern: [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], ext: "mov", mime: "video/quicktime" },
|
|
33
|
+
// --- Archives ---
|
|
34
|
+
{ pattern: [0x50, 0x4B, 0x03, 0x04], ext: "zip", mime: "application/zip" },
|
|
35
|
+
{ pattern: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00], ext: "rar", mime: "application/x-rar-compressed" },
|
|
36
|
+
{ pattern: [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C], ext: "7z", mime: "application/x-7z-compressed" },
|
|
37
|
+
{ pattern: [0x1F, 0x8B], ext: "gz", mime: "application/gzip" },
|
|
38
|
+
{ pattern: [0x42, 0x5A, 0x68], ext: "bz2", mime: "application/x-bzip2" },
|
|
39
|
+
// --- Documents ---
|
|
40
|
+
{ pattern: [0x25, 0x50, 0x44, 0x46], ext: "pdf", mime: "application/pdf" },
|
|
41
|
+
{ pattern: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1], ext: "msi", mime: "application/vnd.ms-installer" },
|
|
42
|
+
{ pattern: [0x4D, 0x5A], ext: "exe", mime: "application/vnd.microsoft.portable-executable" },
|
|
43
|
+
{ pattern: [0x09, 0x08, 0x10, 0x00], ext: "doc", mime: "application/msword" },
|
|
44
|
+
{ pattern: [0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05], ext: "xls", mime: "application/vnd.ms-excel" },
|
|
45
|
+
{ pattern: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1], ext: "ppt", mime: "application/vnd.ms-powerpoint" },
|
|
46
|
+
{ pattern: [0x50, 0x4B, 0x03, 0x04], ext: "docx", mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
|
|
47
|
+
// --- Fonts ---
|
|
48
|
+
{ pattern: [0x00, 0x01, 0x00, 0x00], ext: "ttf", mime: "font/ttf" },
|
|
49
|
+
{ pattern: [0x4F, 0x54, 0x54, 0x4F], ext: "otf", mime: "font/otf" },
|
|
50
|
+
// --- Scripts / Binary ---
|
|
51
|
+
{ pattern: [0x23, 0x21], ext: "sh", mime: "application/x-sh" },
|
|
52
|
+
{ pattern: [0x7F, 0x45, 0x4C, 0x46], ext: "elf", mime: "application/x-elf" },
|
|
53
|
+
// --- Others / fallback ---
|
|
54
|
+
{ pattern: [0x46, 0x4C, 0x56], ext: "flv", mime: "video/x-flv" },
|
|
55
|
+
{ pattern: [0x50, 0x4E, 0x44, 0x52], ext: "pdf", mime: "application/pdf" },
|
|
56
|
+
{ pattern: [0x42, 0x50, 0x47, 0x0D], ext: "bpg", mime: "image/bpg" },
|
|
57
|
+
];
|
|
58
|
+
// Check all signatures
|
|
59
|
+
for (const sig of FILE_SIGNATURES) {
|
|
60
|
+
const offset = sig.offset || 0;
|
|
61
|
+
const match = sig.pattern.every((b, i) => chunk[i + offset] === b);
|
|
62
|
+
if (!match)
|
|
63
|
+
continue;
|
|
64
|
+
// Check optional ASCII slice
|
|
65
|
+
if (sig.asciiSlice) {
|
|
66
|
+
const [start, end, str] = sig.asciiSlice;
|
|
67
|
+
const slice = chunk.slice(start, end).toString("ascii");
|
|
68
|
+
if (slice !== str)
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
return { valid: true, ext: sig.ext, mime: sig.mime };
|
|
72
|
+
}
|
|
73
|
+
return { valid: false };
|
|
95
74
|
}
|
|
96
75
|
|
|
97
|
-
export { fileScaner as default };
|
|
76
|
+
export { fileScaner as default, fileScaner };
|
|
98
77
|
//# sourceMappingURL=file-scaner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-scaner.js","sources":["../../src/include/file-scaner.ts"],"sourcesContent":["export type FileScanerResult = {\r\n valid: boolean;\r\n ext?: string;\r\n mime?: string;\r\n};\r\n\r\n/**\r\n * Mega raw file-type detection from first chunk (magic bytes)\r\n * Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.\r\n */\r\nfunction fileScaner(chunk: Uint8Array | Buffer): FileScanerResult | void {\r\n if (!chunk || chunk.length < 4) return { valid: false };\r\n const match = (pattern: number[]) => pattern.every((b, i) => chunk[i] === b);\r\n\r\n // --- Images ---\r\n if (chunk.length >= 8) {\r\n if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) return { valid: true, ext: \"png\", mime: \"image/png\" };\r\n if (match([0x47, 0x49, 0x46, 0x38])) return { valid: true, ext: \"gif\", mime: \"image/gif\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WEBP\") return { valid: true, ext: \"webp\", mime: \"image/webp\" };\r\n }\r\n if (match([0xFF, 0xD8, 0xFF])) return { valid: true, ext: \"jpg\", mime: \"image/jpeg\" };\r\n if (match([0x42, 0x4D])) return { valid: true, ext: \"bmp\", mime: \"image/bmp\" };\r\n if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A])) return { valid: true, ext: \"tif\", mime: \"image/tiff\" };\r\n if (match([0x00, 0x00, 0x01, 0x00])) return { valid: true, ext: \"ico\", mime: \"image/x-icon\" };\r\n if (match([0x00, 0x00, 0x02, 0x00])) return { valid: true, ext: \"cur\", mime: \"image/x-icon\" };\r\n\r\n // --- Audio ---\r\n if (match([0x49, 0x44, 0x33])) return { valid: true, ext: \"mp3\", mime: \"audio/mpeg\" };\r\n if (match([0x66, 0x4C, 0x61, 0x43])) return { valid: true, ext: \"flac\", mime: \"audio/flac\" };\r\n if (match([0x4F, 0x67, 0x67, 0x53])) return { valid: true, ext: \"ogg\", mime: \"audio/ogg\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WAVE\") return { valid: true, ext: \"wav\", mime: \"audio/wav\" };\r\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mp4a\", mime: \"audio/mp4\" };\r\n\r\n // --- Video ---\r\n if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === \"ftyp\") return { valid: true, ext: \"mp4\", mime: \"video/mp4\" };\r\n if (match([0x1A, 0x45, 0xDF, 0xA3])) return { valid: true, ext: \"mkv\", mime: \"video/x-matroska\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"AVI \") return { valid: true, ext: \"avi\", mime: \"video/x-msvideo\" };\r\n if (match([0x00, 0x00, 0x01, 0xBA])) return { valid: true, ext: \"mpeg\", mime: \"video/mpeg\" };\r\n if (match([0x47, 0x40, 0x00, 0x10])) return { valid: true, ext: \"ts\", mime: \"video/MP2T\" };\r\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mov\", mime: \"video/quicktime\" };\r\n\r\n // --- Archives ---\r\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"zip\", mime: \"application/zip\" };\r\n if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00])) return { valid: true, ext: \"rar\", mime: \"application/x-rar-compressed\" };\r\n if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) return { valid: true, ext: \"7z\", mime: \"application/x-7z-compressed\" };\r\n if (match([0x1F, 0x8B])) return { valid: true, ext: \"gz\", mime: \"application/gzip\" };\r\n if (match([0x42, 0x5A, 0x68])) return { valid: true, ext: \"bz2\", mime: \"application/x-bzip2\" };\r\n\r\n // --- Documents ---\r\n if (match([0x25, 0x50, 0x44, 0x46])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" };\r\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) return { valid: true, ext: \"msi\", mime: \"application/vnd.ms-installer\" };\r\n if (match([0x4D, 0x5A])) return { valid: true, ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" };\r\n if (match([0x09, 0x08, 0x10, 0x00])) return { valid: true, ext: \"doc\", mime: \"application/msword\" };\r\n if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05])) return { valid: true, ext: \"xls\", mime: \"application/vnd.ms-excel\" };\r\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1])) return { valid: true, ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" };\r\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" };\r\n\r\n // --- Fonts ---\r\n if (match([0x00, 0x01, 0x00, 0x00])) return { valid: true, ext: \"ttf\", mime: \"font/ttf\" };\r\n if (match([0x4F, 0x54, 0x54, 0x4F])) return { valid: true, ext: \"otf\", mime: \"font/otf\" };\r\n\r\n // --- Scripts / Binary ---\r\n if (match([0x23, 0x21])) return { valid: true, ext: \"sh\", mime: \"application/x-sh\" }; // shell script\r\n if (match([0x7F, 0x45, 0x4C, 0x46])) return { valid: true, ext: \"elf\", mime: \"application/x-elf\" }; // Linux executable\r\n\r\n // --- Others / fallback ---\r\n if (match([0x46, 0x4C, 0x56])) return { valid: true, ext: \"flv\", mime: \"video/x-flv\" };\r\n if (match([0x50, 0x4E, 0x44, 0x52])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" }; // alternate PDF\r\n if (match([0x42, 0x50, 0x47, 0x0D])) return { valid: true, ext: \"bpg\", mime: \"image/bpg\" }; // BPG\r\n\r\n}\r\n\r\nexport default fileScaner;"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-scaner.js","sources":["../../src/include/file-scaner.ts"],"sourcesContent":["export type FileScanerResult = {\n valid: boolean;\n ext?: string;\n mime?: string;\n};\n\n/**\n * Mega raw file-type detection from first chunk (magic bytes)\n * Supports 100+ common file types: images, audio, video, docs, archives, fonts, scripts, binaries.\n */\nexport function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult {\n if (!chunk || chunk.length < 4) return { valid: false };\n\n // Define file signatures\n const FILE_SIGNATURES: {\n pattern: number[];\n ext: string;\n mime: string;\n offset?: number;\n asciiSlice?: [number, number, string]; // optional slice check: [start, end, string]\n }[] = [\n // --- Images ---\n { pattern: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], ext: \"png\", mime: \"image/png\" },\n { pattern: [0x47, 0x49, 0x46, 0x38], ext: \"gif\", mime: \"image/gif\" },\n { pattern: [0x52, 0x49, 0x46, 0x46], ext: \"webp\", mime: \"image/webp\", asciiSlice: [8, 12, \"WEBP\"] },\n { pattern: [0xFF, 0xD8, 0xFF], ext: \"jpg\", mime: \"image/jpeg\" },\n { pattern: [0x42, 0x4D], ext: \"bmp\", mime: \"image/bmp\" },\n { pattern: [0x49, 0x49, 0x2A, 0x00], ext: \"tif\", mime: \"image/tiff\" },\n { pattern: [0x4D, 0x4D, 0x00, 0x2A], ext: \"tif\", mime: \"image/tiff\" },\n { pattern: [0x00, 0x00, 0x01, 0x00], ext: \"ico\", mime: \"image/x-icon\" },\n { pattern: [0x00, 0x00, 0x02, 0x00], ext: \"cur\", mime: \"image/x-icon\" },\n\n // --- Audio ---\n { pattern: [0x49, 0x44, 0x33], ext: \"mp3\", mime: \"audio/mpeg\" },\n { pattern: [0x66, 0x4C, 0x61, 0x43], ext: \"flac\", mime: \"audio/flac\" },\n { pattern: [0x4F, 0x67, 0x67, 0x53], ext: \"ogg\", mime: \"audio/ogg\" },\n { pattern: [0x52, 0x49, 0x46, 0x46], ext: \"wav\", mime: \"audio/wav\", asciiSlice: [8, 12, \"WAVE\"] },\n { pattern: [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], ext: \"mp4a\", mime: \"audio/mp4\" },\n\n // --- Video ---\n { pattern: [0x00, 0x00, 0x00, 0x18], ext: \"mp4\", mime: \"video/mp4\", asciiSlice: [4, 8, \"ftyp\"] },\n { pattern: [0x1A, 0x45, 0xDF, 0xA3], ext: \"mkv\", mime: \"video/x-matroska\" },\n { pattern: [0x52, 0x49, 0x46, 0x46], ext: \"avi\", mime: \"video/x-msvideo\", asciiSlice: [8, 12, \"AVI \"] },\n { pattern: [0x00, 0x00, 0x01, 0xBA], ext: \"mpeg\", mime: \"video/mpeg\" },\n { pattern: [0x47, 0x40, 0x00, 0x10], ext: \"ts\", mime: \"video/MP2T\" },\n { pattern: [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], ext: \"mov\", mime: \"video/quicktime\" },\n\n // --- Archives ---\n { pattern: [0x50, 0x4B, 0x03, 0x04], ext: \"zip\", mime: \"application/zip\" },\n { pattern: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00], ext: \"rar\", mime: \"application/x-rar-compressed\" },\n { pattern: [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C], ext: \"7z\", mime: \"application/x-7z-compressed\" },\n { pattern: [0x1F, 0x8B], ext: \"gz\", mime: \"application/gzip\" },\n { pattern: [0x42, 0x5A, 0x68], ext: \"bz2\", mime: \"application/x-bzip2\" },\n\n // --- Documents ---\n { pattern: [0x25, 0x50, 0x44, 0x46], ext: \"pdf\", mime: \"application/pdf\" },\n { pattern: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1], ext: \"msi\", mime: \"application/vnd.ms-installer\" },\n { pattern: [0x4D, 0x5A], ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" },\n { pattern: [0x09, 0x08, 0x10, 0x00], ext: \"doc\", mime: \"application/msword\" },\n { pattern: [0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05], ext: \"xls\", mime: \"application/vnd.ms-excel\" },\n { pattern: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1], ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" },\n { pattern: [0x50, 0x4B, 0x03, 0x04], ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" },\n\n // --- Fonts ---\n { pattern: [0x00, 0x01, 0x00, 0x00], ext: \"ttf\", mime: \"font/ttf\" },\n { pattern: [0x4F, 0x54, 0x54, 0x4F], ext: \"otf\", mime: \"font/otf\" },\n\n // --- Scripts / Binary ---\n { pattern: [0x23, 0x21], ext: \"sh\", mime: \"application/x-sh\" },\n { pattern: [0x7F, 0x45, 0x4C, 0x46], ext: \"elf\", mime: \"application/x-elf\" },\n\n // --- Others / fallback ---\n { pattern: [0x46, 0x4C, 0x56], ext: \"flv\", mime: \"video/x-flv\" },\n { pattern: [0x50, 0x4E, 0x44, 0x52], ext: \"pdf\", mime: \"application/pdf\" },\n { pattern: [0x42, 0x50, 0x47, 0x0D], ext: \"bpg\", mime: \"image/bpg\" },\n ];\n\n // Check all signatures\n for (const sig of FILE_SIGNATURES) {\n const offset = sig.offset || 0;\n const match = sig.pattern.every((b, i) => chunk[i + offset] === b);\n if (!match) continue;\n\n // Check optional ASCII slice\n if (sig.asciiSlice) {\n const [start, end, str] = sig.asciiSlice;\n const slice = chunk.slice(start, end).toString(\"ascii\");\n if (slice !== str) continue;\n }\n\n return { valid: true, ext: sig.ext, mime: sig.mime };\n }\n\n return { valid: false };\n}\n\nexport default fileScaner;"],"names":[],"mappings":"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"}
|