securequ 1.1.6 → 1.1.7

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.
@@ -1 +1,95 @@
1
- function i(i){if(!i||i.length<4)return{valid:!1};const e=e=>e.every((e,m)=>i[m]===e);if(i.length>=8){if(e([137,80,78,71,13,10,26,10]))return{valid:!0,ext:"png",mime:"image/png"};if(e([71,73,70,56]))return{valid:!0,ext:"gif",mime:"image/gif"};if(e([82,73,70,70])&&"WEBP"===i.slice(8,12).toString())return{valid:!0,ext:"webp",mime:"image/webp"}}return e([255,216,255])?{valid:!0,ext:"jpg",mime:"image/jpeg"}:e([66,77])?{valid:!0,ext:"bmp",mime:"image/bmp"}:e([73,73,42,0])||e([77,77,0,42])?{valid:!0,ext:"tif",mime:"image/tiff"}:e([0,0,1,0])?{valid:!0,ext:"ico",mime:"image/x-icon"}:e([0,0,2,0])?{valid:!0,ext:"cur",mime:"image/x-icon"}:e([73,68,51])?{valid:!0,ext:"mp3",mime:"audio/mpeg"}:e([102,76,97,67])?{valid:!0,ext:"flac",mime:"audio/flac"}:e([79,103,103,83])?{valid:!0,ext:"ogg",mime:"audio/ogg"}:e([82,73,70,70])&&"WAVE"===i.slice(8,12).toString()?{valid:!0,ext:"wav",mime:"audio/wav"}:e([102,116,121,112,109,112,52,50])?{valid:!0,ext:"mp4a",mime:"audio/mp4"}:e([0,0,0,24])&&"ftyp"===i.slice(4,8).toString()?{valid:!0,ext:"mp4",mime:"video/mp4"}:e([26,69,223,163])?{valid:!0,ext:"mkv",mime:"video/x-matroska"}:e([82,73,70,70])&&"AVI "===i.slice(8,12).toString()?{valid:!0,ext:"avi",mime:"video/x-msvideo"}:e([0,0,1,186])?{valid:!0,ext:"mpeg",mime:"video/mpeg"}:e([71,64,0,16])?{valid:!0,ext:"ts",mime:"video/MP2T"}:e([102,116,121,112,109,112,52,50])?{valid:!0,ext:"mov",mime:"video/quicktime"}:e([80,75,3,4])?{valid:!0,ext:"zip",mime:"application/zip"}:e([82,97,114,33,26,7,0])?{valid:!0,ext:"rar",mime:"application/x-rar-compressed"}:e([55,122,188,175,39,28])?{valid:!0,ext:"7z",mime:"application/x-7z-compressed"}:e([31,139])?{valid:!0,ext:"gz",mime:"application/gzip"}:e([66,90,104])?{valid:!0,ext:"bz2",mime:"application/x-bzip2"}:e([37,80,68,70])?{valid:!0,ext:"pdf",mime:"application/pdf"}:e([208,207,17,224,161,177,26,225])?{valid:!0,ext:"msi",mime:"application/vnd.ms-installer"}:e([77,90])?{valid:!0,ext:"exe",mime:"application/vnd.microsoft.portable-executable"}:e([9,8,16,0])?{valid:!0,ext:"doc",mime:"application/msword"}:e([9,8,16,0,0,6,5])?{valid:!0,ext:"xls",mime:"application/vnd.ms-excel"}:e([208,207,17,224,161,177])?{valid:!0,ext:"ppt",mime:"application/vnd.ms-powerpoint"}:e([80,75,3,4])?{valid:!0,ext:"docx",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}:e([0,1,0,0])?{valid:!0,ext:"ttf",mime:"font/ttf"}:e([79,84,84,79])?{valid:!0,ext:"otf",mime:"font/otf"}:e([35,33])?{valid:!0,ext:"sh",mime:"application/x-sh"}:e([127,69,76,70])?{valid:!0,ext:"elf",mime:"application/x-elf"}:e([70,76,86])?{valid:!0,ext:"flv",mime:"video/x-flv"}:e([80,78,68,82])?{valid:!0,ext:"pdf",mime:"application/pdf"}:e([66,80,71,13])?{valid:!0,ext:"bpg",mime:"image/bpg"}:void 0}export{i as default,i as fileScaner};//# sourceMappingURL=FileScaner.mjs.map
1
+ /**
2
+ * Mega raw file-type detection from first chunk (magic bytes)
3
+ * Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.
4
+ */
5
+ function fileScaner(chunk) {
6
+ if (!chunk || chunk.length < 4)
7
+ return { valid: false };
8
+ const match = (pattern) => pattern.every((b, i) => chunk[i] === b);
9
+ // --- Images ---
10
+ if (chunk.length >= 8) {
11
+ if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]))
12
+ return { valid: true, ext: "png", mime: "image/png" };
13
+ if (match([0x47, 0x49, 0x46, 0x38]))
14
+ return { valid: true, ext: "gif", mime: "image/gif" };
15
+ if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === "WEBP")
16
+ return { valid: true, ext: "webp", mime: "image/webp" };
17
+ }
18
+ if (match([0xFF, 0xD8, 0xFF]))
19
+ return { valid: true, ext: "jpg", mime: "image/jpeg" };
20
+ if (match([0x42, 0x4D]))
21
+ return { valid: true, ext: "bmp", mime: "image/bmp" };
22
+ if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A]))
23
+ return { valid: true, ext: "tif", mime: "image/tiff" };
24
+ if (match([0x00, 0x00, 0x01, 0x00]))
25
+ return { valid: true, ext: "ico", mime: "image/x-icon" };
26
+ if (match([0x00, 0x00, 0x02, 0x00]))
27
+ return { valid: true, ext: "cur", mime: "image/x-icon" };
28
+ // --- Audio ---
29
+ if (match([0x49, 0x44, 0x33]))
30
+ return { valid: true, ext: "mp3", mime: "audio/mpeg" };
31
+ if (match([0x66, 0x4C, 0x61, 0x43]))
32
+ return { valid: true, ext: "flac", mime: "audio/flac" };
33
+ if (match([0x4F, 0x67, 0x67, 0x53]))
34
+ return { valid: true, ext: "ogg", mime: "audio/ogg" };
35
+ if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === "WAVE")
36
+ return { valid: true, ext: "wav", mime: "audio/wav" };
37
+ if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32]))
38
+ return { valid: true, ext: "mp4a", mime: "audio/mp4" };
39
+ // --- Video ---
40
+ if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === "ftyp")
41
+ return { valid: true, ext: "mp4", mime: "video/mp4" };
42
+ if (match([0x1A, 0x45, 0xDF, 0xA3]))
43
+ return { valid: true, ext: "mkv", mime: "video/x-matroska" };
44
+ if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === "AVI ")
45
+ return { valid: true, ext: "avi", mime: "video/x-msvideo" };
46
+ if (match([0x00, 0x00, 0x01, 0xBA]))
47
+ return { valid: true, ext: "mpeg", mime: "video/mpeg" };
48
+ if (match([0x47, 0x40, 0x00, 0x10]))
49
+ return { valid: true, ext: "ts", mime: "video/MP2T" };
50
+ if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32]))
51
+ return { valid: true, ext: "mov", mime: "video/quicktime" };
52
+ // --- Archives ---
53
+ if (match([0x50, 0x4B, 0x03, 0x04]))
54
+ return { valid: true, ext: "zip", mime: "application/zip" };
55
+ if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00]))
56
+ return { valid: true, ext: "rar", mime: "application/x-rar-compressed" };
57
+ if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C]))
58
+ return { valid: true, ext: "7z", mime: "application/x-7z-compressed" };
59
+ if (match([0x1F, 0x8B]))
60
+ return { valid: true, ext: "gz", mime: "application/gzip" };
61
+ if (match([0x42, 0x5A, 0x68]))
62
+ return { valid: true, ext: "bz2", mime: "application/x-bzip2" };
63
+ // --- Documents ---
64
+ if (match([0x25, 0x50, 0x44, 0x46]))
65
+ return { valid: true, ext: "pdf", mime: "application/pdf" };
66
+ if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1]))
67
+ return { valid: true, ext: "msi", mime: "application/vnd.ms-installer" };
68
+ if (match([0x4D, 0x5A]))
69
+ return { valid: true, ext: "exe", mime: "application/vnd.microsoft.portable-executable" };
70
+ if (match([0x09, 0x08, 0x10, 0x00]))
71
+ return { valid: true, ext: "doc", mime: "application/msword" };
72
+ if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05]))
73
+ return { valid: true, ext: "xls", mime: "application/vnd.ms-excel" };
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
95
+ }export{fileScaner as default,fileScaner};//# sourceMappingURL=FileScaner.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileScaner.mjs","sources":["../../src/include/FileScaner.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, installers, fonts, binaries.\n */\nexport function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult | void {\n if (!chunk || chunk.length < 4) return { valid: false };\n const match = (pattern: number[]) => pattern.every((b, i) => chunk[i] === b);\n\n // --- Images ---\n if (chunk.length >= 8) {\n if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) return { valid: true, ext: \"png\", mime: \"image/png\" };\n if (match([0x47, 0x49, 0x46, 0x38])) return { valid: true, ext: \"gif\", mime: \"image/gif\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WEBP\") return { valid: true, ext: \"webp\", mime: \"image/webp\" };\n }\n if (match([0xFF, 0xD8, 0xFF])) return { valid: true, ext: \"jpg\", mime: \"image/jpeg\" };\n if (match([0x42, 0x4D])) return { valid: true, ext: \"bmp\", mime: \"image/bmp\" };\n if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A])) return { valid: true, ext: \"tif\", mime: \"image/tiff\" };\n if (match([0x00, 0x00, 0x01, 0x00])) return { valid: true, ext: \"ico\", mime: \"image/x-icon\" };\n if (match([0x00, 0x00, 0x02, 0x00])) return { valid: true, ext: \"cur\", mime: \"image/x-icon\" };\n\n // --- Audio ---\n if (match([0x49, 0x44, 0x33])) return { valid: true, ext: \"mp3\", mime: \"audio/mpeg\" };\n if (match([0x66, 0x4C, 0x61, 0x43])) return { valid: true, ext: \"flac\", mime: \"audio/flac\" };\n if (match([0x4F, 0x67, 0x67, 0x53])) return { valid: true, ext: \"ogg\", mime: \"audio/ogg\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WAVE\") return { valid: true, ext: \"wav\", mime: \"audio/wav\" };\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mp4a\", mime: \"audio/mp4\" };\n\n // --- Video ---\n if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === \"ftyp\") return { valid: true, ext: \"mp4\", mime: \"video/mp4\" };\n if (match([0x1A, 0x45, 0xDF, 0xA3])) return { valid: true, ext: \"mkv\", mime: \"video/x-matroska\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"AVI \") return { valid: true, ext: \"avi\", mime: \"video/x-msvideo\" };\n if (match([0x00, 0x00, 0x01, 0xBA])) return { valid: true, ext: \"mpeg\", mime: \"video/mpeg\" };\n if (match([0x47, 0x40, 0x00, 0x10])) return { valid: true, ext: \"ts\", mime: \"video/MP2T\" };\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mov\", mime: \"video/quicktime\" };\n\n // --- Archives ---\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"zip\", mime: \"application/zip\" };\n if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00])) return { valid: true, ext: \"rar\", mime: \"application/x-rar-compressed\" };\n if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) return { valid: true, ext: \"7z\", mime: \"application/x-7z-compressed\" };\n if (match([0x1F, 0x8B])) return { valid: true, ext: \"gz\", mime: \"application/gzip\" };\n if (match([0x42, 0x5A, 0x68])) return { valid: true, ext: \"bz2\", mime: \"application/x-bzip2\" };\n\n // --- Documents ---\n if (match([0x25, 0x50, 0x44, 0x46])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" };\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) return { valid: true, ext: \"msi\", mime: \"application/vnd.ms-installer\" };\n if (match([0x4D, 0x5A])) return { valid: true, ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" };\n if (match([0x09, 0x08, 0x10, 0x00])) return { valid: true, ext: \"doc\", mime: \"application/msword\" };\n if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05])) return { valid: true, ext: \"xls\", mime: \"application/vnd.ms-excel\" };\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1])) return { valid: true, ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" };\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" };\n\n // --- Fonts ---\n if (match([0x00, 0x01, 0x00, 0x00])) return { valid: true, ext: \"ttf\", mime: \"font/ttf\" };\n if (match([0x4F, 0x54, 0x54, 0x4F])) return { valid: true, ext: \"otf\", mime: \"font/otf\" };\n\n // --- Scripts / Binary ---\n if (match([0x23, 0x21])) return { valid: true, ext: \"sh\", mime: \"application/x-sh\" }; // shell script\n if (match([0x7F, 0x45, 0x4C, 0x46])) return { valid: true, ext: \"elf\", mime: \"application/x-elf\" }; // Linux executable\n\n // --- Others / fallback ---\n if (match([0x46, 0x4C, 0x56])) return { valid: true, ext: \"flv\", mime: \"video/x-flv\" };\n if (match([0x50, 0x4E, 0x44, 0x52])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" }; // alternate PDF\n if (match([0x42, 0x50, 0x47, 0x0D])) return { valid: true, ext: \"bpg\", mime: \"image/bpg\" }; // BPG\n\n}\n\nexport default fileScaner;"],"names":["fileScaner","chunk","length","valid","match","pattern","every","b","i","ext","mime","slice","toString"],"mappings":"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"}
1
+ {"version":3,"file":"FileScaner.mjs","sources":["../../src/include/FileScaner.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, installers, fonts, binaries.\n */\nexport function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult | void {\n if (!chunk || chunk.length < 4) return { valid: false };\n const match = (pattern: number[]) => pattern.every((b, i) => chunk[i] === b);\n\n // --- Images ---\n if (chunk.length >= 8) {\n if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) return { valid: true, ext: \"png\", mime: \"image/png\" };\n if (match([0x47, 0x49, 0x46, 0x38])) return { valid: true, ext: \"gif\", mime: \"image/gif\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WEBP\") return { valid: true, ext: \"webp\", mime: \"image/webp\" };\n }\n if (match([0xFF, 0xD8, 0xFF])) return { valid: true, ext: \"jpg\", mime: \"image/jpeg\" };\n if (match([0x42, 0x4D])) return { valid: true, ext: \"bmp\", mime: \"image/bmp\" };\n if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A])) return { valid: true, ext: \"tif\", mime: \"image/tiff\" };\n if (match([0x00, 0x00, 0x01, 0x00])) return { valid: true, ext: \"ico\", mime: \"image/x-icon\" };\n if (match([0x00, 0x00, 0x02, 0x00])) return { valid: true, ext: \"cur\", mime: \"image/x-icon\" };\n\n // --- Audio ---\n if (match([0x49, 0x44, 0x33])) return { valid: true, ext: \"mp3\", mime: \"audio/mpeg\" };\n if (match([0x66, 0x4C, 0x61, 0x43])) return { valid: true, ext: \"flac\", mime: \"audio/flac\" };\n if (match([0x4F, 0x67, 0x67, 0x53])) return { valid: true, ext: \"ogg\", mime: \"audio/ogg\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WAVE\") return { valid: true, ext: \"wav\", mime: \"audio/wav\" };\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mp4a\", mime: \"audio/mp4\" };\n\n // --- Video ---\n if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === \"ftyp\") return { valid: true, ext: \"mp4\", mime: \"video/mp4\" };\n if (match([0x1A, 0x45, 0xDF, 0xA3])) return { valid: true, ext: \"mkv\", mime: \"video/x-matroska\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"AVI \") return { valid: true, ext: \"avi\", mime: \"video/x-msvideo\" };\n if (match([0x00, 0x00, 0x01, 0xBA])) return { valid: true, ext: \"mpeg\", mime: \"video/mpeg\" };\n if (match([0x47, 0x40, 0x00, 0x10])) return { valid: true, ext: \"ts\", mime: \"video/MP2T\" };\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mov\", mime: \"video/quicktime\" };\n\n // --- Archives ---\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"zip\", mime: \"application/zip\" };\n if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00])) return { valid: true, ext: \"rar\", mime: \"application/x-rar-compressed\" };\n if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) return { valid: true, ext: \"7z\", mime: \"application/x-7z-compressed\" };\n if (match([0x1F, 0x8B])) return { valid: true, ext: \"gz\", mime: \"application/gzip\" };\n if (match([0x42, 0x5A, 0x68])) return { valid: true, ext: \"bz2\", mime: \"application/x-bzip2\" };\n\n // --- Documents ---\n if (match([0x25, 0x50, 0x44, 0x46])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" };\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) return { valid: true, ext: \"msi\", mime: \"application/vnd.ms-installer\" };\n if (match([0x4D, 0x5A])) return { valid: true, ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" };\n if (match([0x09, 0x08, 0x10, 0x00])) return { valid: true, ext: \"doc\", mime: \"application/msword\" };\n if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05])) return { valid: true, ext: \"xls\", mime: \"application/vnd.ms-excel\" };\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1])) return { valid: true, ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" };\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" };\n\n // --- Fonts ---\n if (match([0x00, 0x01, 0x00, 0x00])) return { valid: true, ext: \"ttf\", mime: \"font/ttf\" };\n if (match([0x4F, 0x54, 0x54, 0x4F])) return { valid: true, ext: \"otf\", mime: \"font/otf\" };\n\n // --- Scripts / Binary ---\n if (match([0x23, 0x21])) return { valid: true, ext: \"sh\", mime: \"application/x-sh\" }; // shell script\n if (match([0x7F, 0x45, 0x4C, 0x46])) return { valid: true, ext: \"elf\", mime: \"application/x-elf\" }; // Linux executable\n\n // --- Others / fallback ---\n if (match([0x46, 0x4C, 0x56])) return { valid: true, ext: \"flv\", mime: \"video/x-flv\" };\n if (match([0x50, 0x4E, 0x44, 0x52])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" }; // alternate PDF\n if (match([0x42, 0x50, 0x47, 0x0D])) return { valid: true, ext: \"bpg\", mime: \"image/bpg\" }; // BPG\n\n}\n\nexport default fileScaner;"],"names":[],"mappings":"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"}
@@ -1 +1,19 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("fflate"),r=require("libsodium-wrappers"),s=require("msgpackr");async function a(a){await r.ready;const t=s.pack(a);return e.compressSync(t)}async function t(a){await r.ready;const t=e.decompressSync(a);return s.unpack(t)}const n={compress:async function(e){const s=await a(e);return r.to_base64(s,r.base64_variants.ORIGINAL)},decompress:async function(e){const s=r.from_base64(e,r.base64_variants.ORIGINAL);return await t(s)},compressBuffer:a,decompressBuffer:t};exports.default=n;//# sourceMappingURL=compress.js.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var fflate=require('fflate'),sodium=require('libsodium-wrappers'),msgpackr=require('msgpackr');async function compressBuffer(input) {
2
+ await sodium.ready;
3
+ const encode = msgpackr.pack(input);
4
+ return fflate.compressSync(encode);
5
+ }
6
+ async function decompressBuffer(input) {
7
+ await sodium.ready;
8
+ const compress = fflate.decompressSync(input);
9
+ return msgpackr.unpack(compress);
10
+ }
11
+ async function compress(input) {
12
+ const compressed = await compressBuffer(input);
13
+ return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);
14
+ }
15
+ async function decompress(base64Str) {
16
+ const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);
17
+ return await decompressBuffer(compressed);
18
+ }
19
+ const compresor = { compress, decompress, compressBuffer, decompressBuffer };exports.default=compresor;//# sourceMappingURL=compress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compress.js","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\nimport sodium from 'libsodium-wrappers';\nimport { unpack, pack } from 'msgpackr';\n\nasync function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nasync function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nasync function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nasync function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n\nconst compresor = { compress, decompress, compressBuffer, decompressBuffer };\nexport default compresor;"],"names":["async","compressBuffer","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack","compresor","compressed","to_base64","base64_variants","ORIGINAL","decompress","base64Str","from_base64","exports","default"],"mappings":"kJAIAA,eAAeC,EAAeC,SACrBC,EAAOC,MACb,MAAMC,EAASC,EAAAA,KAAKJ,GACpB,OAAOK,EAAAA,aAAaF,EACvB,CAEAL,eAAeQ,EAAiBN,SACvBC,EAAOC,MACb,MAAMK,EAAWC,EAAAA,eAAeR,GAChC,OAAOS,EAAAA,OAAOF,EACjB,CAYA,MAAMG,EAAY,CAAEH,SAVpBT,eAAwBE,GACrB,MAAMW,QAAmBZ,EAAeC,GACxC,OAAOC,EAAOW,UAAUD,EAAYV,EAAOY,gBAAgBC,SAC9D,EAO8BC,WAL9BjB,eAA0BkB,GACvB,MAAML,EAAaV,EAAOgB,YAAYD,EAAWf,EAAOY,gBAAgBC,UACxE,aAAaR,EAAiBK,EACjC,EAE0CZ,iBAAgBO,oBAAgBY,QAAAC,QAAAT"}
1
+ {"version":3,"file":"compress.js","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\nimport sodium from 'libsodium-wrappers';\nimport { unpack, pack } from 'msgpackr';\n\nasync function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nasync function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nasync function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nasync function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n\nconst compresor = { compress, decompress, compressBuffer, decompressBuffer };\nexport default compresor;"],"names":["pack","compressSync","decompressSync","unpack"],"mappings":"qKAIA,eAAe,cAAc,CAAC,KAAU,EAAA;IACrC,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,MAAM,GAAGA,aAAI,CAAC,KAAK,CAAC;AAC1B,IAAA,OAAOC,mBAAY,CAAC,MAAM,CAAC;AAC9B;AAEA,eAAe,gBAAgB,CAAC,KAA0B,EAAA;IACvD,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,QAAQ,GAAGC,qBAAc,CAAC,KAAK,CAAC;AACtC,IAAA,OAAOC,eAAM,CAAC,QAAQ,CAAC;AAC1B;AAEA,eAAe,QAAQ,CAAC,KAAU,EAAA;AAC/B,IAAA,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC;AAC9C,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;AACvE;AAEA,eAAe,UAAU,CAAC,SAAiB,EAAA;AACxC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;AACjF,IAAA,OAAO,MAAM,gBAAgB,CAAC,UAAU,CAAC;AAC5C;AAEA,MAAM,SAAS,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB"}
@@ -1 +1,19 @@
1
- import{compressSync as r,decompressSync as a}from"fflate";import s from"libsodium-wrappers";import{pack as t,unpack as n}from"msgpackr";async function o(a){await s.ready;const n=t(a);return r(n)}async function e(r){await s.ready;const t=a(r);return n(t)}const c={compress:async function(r){const a=await o(r);return s.to_base64(a,s.base64_variants.ORIGINAL)},decompress:async function(r){const a=s.from_base64(r,s.base64_variants.ORIGINAL);return await e(a)},compressBuffer:o,decompressBuffer:e};export{c as default};//# sourceMappingURL=compress.mjs.map
1
+ import {compressSync,decompressSync}from'fflate';import sodium from'libsodium-wrappers';import {pack,unpack}from'msgpackr';async function compressBuffer(input) {
2
+ await sodium.ready;
3
+ const encode = pack(input);
4
+ return compressSync(encode);
5
+ }
6
+ async function decompressBuffer(input) {
7
+ await sodium.ready;
8
+ const compress = decompressSync(input);
9
+ return unpack(compress);
10
+ }
11
+ async function compress(input) {
12
+ const compressed = await compressBuffer(input);
13
+ return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);
14
+ }
15
+ async function decompress(base64Str) {
16
+ const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);
17
+ return await decompressBuffer(compressed);
18
+ }
19
+ const compresor = { compress, decompress, compressBuffer, decompressBuffer };export{compresor as default};//# sourceMappingURL=compress.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"compress.mjs","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\nimport sodium from 'libsodium-wrappers';\nimport { unpack, pack } from 'msgpackr';\n\nasync function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nasync function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nasync function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nasync function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n\nconst compresor = { compress, decompress, compressBuffer, decompressBuffer };\nexport default compresor;"],"names":["async","compressBuffer","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack","compresor","compressed","to_base64","base64_variants","ORIGINAL","decompress","base64Str","from_base64"],"mappings":"wIAIAA,eAAeC,EAAeC,SACrBC,EAAOC,MACb,MAAMC,EAASC,EAAKJ,GACpB,OAAOK,EAAaF,EACvB,CAEAL,eAAeQ,EAAiBN,SACvBC,EAAOC,MACb,MAAMK,EAAWC,EAAeR,GAChC,OAAOS,EAAOF,EACjB,CAYA,MAAMG,EAAY,CAAEH,SAVpBT,eAAwBE,GACrB,MAAMW,QAAmBZ,EAAeC,GACxC,OAAOC,EAAOW,UAAUD,EAAYV,EAAOY,gBAAgBC,SAC9D,EAO8BC,WAL9BjB,eAA0BkB,GACvB,MAAML,EAAaV,EAAOgB,YAAYD,EAAWf,EAAOY,gBAAgBC,UACxE,aAAaR,EAAiBK,EACjC,EAE0CZ,iBAAgBO,2BAAgBI"}
1
+ {"version":3,"file":"compress.mjs","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\nimport sodium from 'libsodium-wrappers';\nimport { unpack, pack } from 'msgpackr';\n\nasync function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nasync function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nasync function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nasync function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n\nconst compresor = { compress, decompress, compressBuffer, decompressBuffer };\nexport default compresor;"],"names":[],"mappings":"2HAIA,eAAe,cAAc,CAAC,KAAU,EAAA;IACrC,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;AAC1B,IAAA,OAAO,YAAY,CAAC,MAAM,CAAC;AAC9B;AAEA,eAAe,gBAAgB,CAAC,KAA0B,EAAA;IACvD,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;AACtC,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC;AAC1B;AAEA,eAAe,QAAQ,CAAC,KAAU,EAAA;AAC/B,IAAA,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC;AAC9C,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;AACvE;AAEA,eAAe,UAAU,CAAC,SAAiB,EAAA;AACxC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;AACjF,IAAA,OAAO,MAAM,gBAAgB,CAAC,UAAU,CAAC;AAC5C;AAEA,MAAM,SAAS,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB"}
package/include/crypto.js CHANGED
@@ -1 +1,55 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=require("libsodium-wrappers"),e=require("./compress.js");function t(e){return r.crypto_generichash(r.crypto_secretbox_KEYBYTES,r.from_string(e))}function c(e){return r.crypto_generichash(r.crypto_secretbox_NONCEBYTES,r.from_string(e))}async function n(e,t){const c=await o(e,t);return r.to_base64(c)}async function s(e,t){const c=r.from_base64(e);return await a(c,t)}async function o(n,s){await r.ready;const o=t(s),a=c(s),u=await e.default.compressBuffer(n);return r.crypto_secretbox_easy(u,a,o)}async function a(n,s){await r.ready;const o=t(s),a=c(s);try{const t=r.crypto_secretbox_open_easy(n,a,o);return t?await e.default.decompressBuffer(t):null}catch(r){return null}}async function u(e){await r.ready;const t=r.crypto_generichash(32,r.from_string(e));return r.to_base64(t).replace(/[^a-zA-Z0-9]/g,"")}const p={encrypt:n,decrypt:s,encryptBuffer:o,decryptBuffer:a,hash:u};exports.decrypt=s,exports.decryptBuffer=a,exports.default=p,exports.encrypt=n,exports.encryptBuffer=o,exports.hash=u;//# sourceMappingURL=crypto.js.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var sodium=require('libsodium-wrappers'),compress=require('./compress.js');/** --- Key/Nonce Derivation --- */
2
+ function deriveKey(secret) {
3
+ return sodium.crypto_generichash(sodium.crypto_secretbox_KEYBYTES, sodium.from_string(secret));
4
+ }
5
+ function deriveNonce(secret) {
6
+ return sodium.crypto_generichash(sodium.crypto_secretbox_NONCEBYTES, sodium.from_string(secret));
7
+ }
8
+ /** --- STRING --- */
9
+ async function encrypt(input, secret) {
10
+ const encrypted = await encryptBuffer(input, secret);
11
+ return sodium.to_base64(encrypted);
12
+ }
13
+ async function decrypt(base64, secret) {
14
+ const cipher = sodium.from_base64(base64);
15
+ return await decryptBuffer(cipher, secret);
16
+ }
17
+ /** --- BUFFER --- */
18
+ // Encrypt
19
+ async function encryptBuffer(input, secret) {
20
+ await sodium.ready;
21
+ const key = deriveKey(secret);
22
+ const nonce = deriveNonce(secret);
23
+ const compressed = await compress.default.compressBuffer(input);
24
+ return sodium.crypto_secretbox_easy(compressed, nonce, key);
25
+ }
26
+ // Decrypt
27
+ async function decryptBuffer(box, secret) {
28
+ await sodium.ready;
29
+ const key = deriveKey(secret);
30
+ const nonce = deriveNonce(secret);
31
+ try {
32
+ const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);
33
+ if (!opened)
34
+ return null;
35
+ return await compress.default.decompressBuffer(opened);
36
+ }
37
+ catch (error) {
38
+ return null;
39
+ }
40
+ }
41
+ /** --- HASH --- */
42
+ async function hash(str) {
43
+ await sodium.ready;
44
+ const digest = sodium.crypto_generichash(32, sodium.from_string(str));
45
+ return sodium
46
+ .to_base64(digest)
47
+ .replace(/[^a-zA-Z0-9]/g, "");
48
+ }
49
+ const crypto = {
50
+ encrypt,
51
+ decrypt,
52
+ encryptBuffer,
53
+ decryptBuffer,
54
+ hash,
55
+ };exports.decrypt=decrypt;exports.decryptBuffer=decryptBuffer;exports.default=crypto;exports.encrypt=encrypt;exports.encryptBuffer=encryptBuffer;exports.hash=hash;//# sourceMappingURL=crypto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport compresor from \"./compress\";\n\nexport type EncryptInput = string | object | any[];\n\n/** --- Key/Nonce Derivation --- */\nfunction deriveKey(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_KEYBYTES,\n sodium.from_string(secret)\n );\n}\n\nfunction deriveNonce(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_NONCEBYTES,\n sodium.from_string(secret)\n );\n}\n\n/** --- STRING --- */\nexport async function encrypt(input: EncryptInput, secret: string): Promise<string> {\n const encrypted = await encryptBuffer(input, secret);\n return sodium.to_base64(encrypted);\n}\n\nexport async function decrypt(base64: string, secret: string): Promise<any | null> {\n const cipher = sodium.from_base64(base64);\n return await decryptBuffer(cipher, secret);\n}\n\n/** --- BUFFER --- */\n// Encrypt\nexport async function encryptBuffer(input: any, secret: string): Promise<Uint8Array> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n const compressed = await compresor.compressBuffer(input);\n return sodium.crypto_secretbox_easy(compressed, nonce, key);\n}\n\n// Decrypt\nexport async function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n try {\n const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);\n if (!opened) return null;\n return await compresor.decompressBuffer(opened);\n } catch (error) {\n return null;\n }\n}\n\n/** --- HASH --- */\nexport async function hash(str: string): Promise<string> {\n await sodium.ready;\n const digest = sodium.crypto_generichash(32, sodium.from_string(str));\n return sodium\n .to_base64(digest)\n .replace(/[^a-zA-Z0-9]/g, \"\")\n}\n\nconst crypto = {\n encrypt,\n decrypt,\n encryptBuffer,\n decryptBuffer,\n hash,\n};\n\nexport default crypto;\n"],"names":["Object","defineProperty","exports","value","sodium","require","compress","deriveKey","secret","crypto_generichash","crypto_secretbox_KEYBYTES","from_string","deriveNonce","crypto_secretbox_NONCEBYTES","async","encrypt","input","encrypted","encryptBuffer","to_base64","decrypt","base64","cipher","from_base64","decryptBuffer","ready","key","nonce","compressed","compresor","compressBuffer","crypto_secretbox_easy","box","opened","crypto_secretbox_open_easy","decompressBuffer","error","hash","str","digest","replace","crypto"],"mappings":"AAKA,aAAAA,OAAAC,eAAAC,QAAA,aAAA,CAAAC,OAAA,IAAA,IAAAC,EAAAC,QAAA,sBAAAC,EAAAD,QAAA,iBACA,SAASE,EAAUC,GAChB,OAAOJ,EAAOK,mBACXL,EAAOM,0BACPN,EAAOO,YAAYH,GAEzB,CAEA,SAASI,EAAYJ,GAClB,OAAOJ,EAAOK,mBACXL,EAAOS,4BACPT,EAAOO,YAAYH,GAEzB,CAGOM,eAAeC,EAAQC,EAAqBR,GAChD,MAAMS,QAAkBC,EAAcF,EAAOR,GAC7C,OAAOJ,EAAOe,UAAUF,EAC3B,CAEOH,eAAeM,EAAQC,EAAgBb,GAC3C,MAAMc,EAASlB,EAAOmB,YAAYF,GAClC,aAAaG,EAAcF,EAAQd,EACtC,CAIOM,eAAeI,EAAcF,EAAYR,SACvCJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GACpBoB,QAAmBC,UAAUC,eAAed,GAClD,OAAOZ,EAAO2B,sBAAsBH,EAAYD,EAAOD,EAC1D,CAGOZ,eAAeU,EAAcQ,EAAiBxB,SAC5CJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GAC1B,IACG,MAAMyB,EAAS7B,EAAO8B,2BAA2BF,EAAKL,EAAOD,GAC7D,OAAKO,QACQJ,EAAAA,QAAUM,iBAAiBF,GADpB,IAEtB,CAAC,MAAOG,GACN,OAAO,IACT,CACJ,CAGOtB,eAAeuB,EAAKC,SAClBlC,EAAOqB,MACb,MAAMc,EAASnC,EAAOK,mBAAmB,GAAIL,EAAOO,YAAY2B,IAChE,OAAOlC,EACHe,UAAUoB,GACVC,QAAQ,gBAAiB,GAChC,CAEA,MAAMC,EAAS,CACZ1B,UACAK,UACAF,gBACAM,gBACAa"}
1
+ {"version":3,"file":"crypto.js","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport compresor from \"./compress\";\n\nexport type EncryptInput = string | object | any[];\n\n/** --- Key/Nonce Derivation --- */\nfunction deriveKey(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_KEYBYTES,\n sodium.from_string(secret)\n );\n}\n\nfunction deriveNonce(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_NONCEBYTES,\n sodium.from_string(secret)\n );\n}\n\n/** --- STRING --- */\nexport async function encrypt(input: EncryptInput, secret: string): Promise<string> {\n const encrypted = await encryptBuffer(input, secret);\n return sodium.to_base64(encrypted);\n}\n\nexport async function decrypt(base64: string, secret: string): Promise<any | null> {\n const cipher = sodium.from_base64(base64);\n return await decryptBuffer(cipher, secret);\n}\n\n/** --- BUFFER --- */\n// Encrypt\nexport async function encryptBuffer(input: any, secret: string): Promise<Uint8Array> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n const compressed = await compresor.compressBuffer(input);\n return sodium.crypto_secretbox_easy(compressed, nonce, key);\n}\n\n// Decrypt\nexport async function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n try {\n const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);\n if (!opened) return null;\n return await compresor.decompressBuffer(opened);\n } catch (error) {\n return null;\n }\n}\n\n/** --- HASH --- */\nexport async function hash(str: string): Promise<string> {\n await sodium.ready;\n const digest = sodium.crypto_generichash(32, sodium.from_string(str));\n return sodium\n .to_base64(digest)\n .replace(/[^a-zA-Z0-9]/g, \"\")\n}\n\nconst crypto = {\n encrypt,\n decrypt,\n encryptBuffer,\n decryptBuffer,\n hash,\n};\n\nexport default crypto;\n"],"names":["compresor"],"mappings":"iJAKA;AACA,SAAS,SAAS,CAAC,MAAc,EAAA;AAC9B,IAAA,OAAO,MAAM,CAAC,kBAAkB,CAC7B,MAAM,CAAC,yBAAyB,EAChC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAC5B;AACJ;AAEA,SAAS,WAAW,CAAC,MAAc,EAAA;AAChC,IAAA,OAAO,MAAM,CAAC,kBAAkB,CAC7B,MAAM,CAAC,2BAA2B,EAClC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAC5B;AACJ;AAEA;AACO,eAAe,OAAO,CAAC,KAAmB,EAAE,MAAc,EAAA;IAC9D,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC;AACpD,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;AACrC;AAEO,eAAe,OAAO,CAAC,MAAc,EAAE,MAAc,EAAA;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;AACzC,IAAA,OAAO,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;AAC7C;AAEA;AACA;AACO,eAAe,aAAa,CAAC,KAAU,EAAE,MAAc,EAAA;IAC3D,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;IACjC,MAAM,UAAU,GAAG,MAAMA,gBAAS,CAAC,cAAc,CAAC,KAAK,CAAC;IACxD,OAAO,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC;AAC9D;AAEA;AACO,eAAe,aAAa,CAAC,GAAe,EAAE,MAAc,EAAA;IAChE,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;IACjC,IAAI;AACD,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;AACjE,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AACxB,QAAA,OAAO,MAAMA,gBAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACjD,IAAA;AAAC,IAAA,OAAO,KAAK,EAAE;AACb,QAAA,OAAO,IAAI;AACb,IAAA;AACJ;AAEA;AACO,eAAe,IAAI,CAAC,GAAW,EAAA;IACnC,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACrE,IAAA,OAAO;SACH,SAAS,CAAC,MAAM;AAChB,SAAA,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;AACnC;AAEA,MAAM,MAAM,GAAG;IACZ,OAAO;IACP,OAAO;IACP,aAAa;IACb,aAAa;IACb,IAAI;"}
@@ -1 +1,55 @@
1
- import r from"libsodium-wrappers";import t from"./compress.mjs";function e(t){return r.crypto_generichash(r.crypto_secretbox_KEYBYTES,r.from_string(t))}function n(t){return r.crypto_generichash(r.crypto_secretbox_NONCEBYTES,r.from_string(t))}async function c(t,e){const n=await s(t,e);return r.to_base64(n)}async function o(t,e){const n=r.from_base64(t);return await a(n,e)}async function s(c,o){await r.ready;const s=e(o),a=n(o),i=await t.compressBuffer(c);return r.crypto_secretbox_easy(i,a,s)}async function a(c,o){await r.ready;const s=e(o),a=n(o);try{const e=r.crypto_secretbox_open_easy(c,a,s);return e?await t.decompressBuffer(e):null}catch(r){return null}}async function i(t){await r.ready;const e=r.crypto_generichash(32,r.from_string(t));return r.to_base64(e).replace(/[^a-zA-Z0-9]/g,"")}const u={encrypt:c,decrypt:o,encryptBuffer:s,decryptBuffer:a,hash:i};export{o as decrypt,a as decryptBuffer,u as default,c as encrypt,s as encryptBuffer,i as hash};//# sourceMappingURL=crypto.mjs.map
1
+ import sodium from'libsodium-wrappers';import compresor from'./compress.mjs';/** --- Key/Nonce Derivation --- */
2
+ function deriveKey(secret) {
3
+ return sodium.crypto_generichash(sodium.crypto_secretbox_KEYBYTES, sodium.from_string(secret));
4
+ }
5
+ function deriveNonce(secret) {
6
+ return sodium.crypto_generichash(sodium.crypto_secretbox_NONCEBYTES, sodium.from_string(secret));
7
+ }
8
+ /** --- STRING --- */
9
+ async function encrypt(input, secret) {
10
+ const encrypted = await encryptBuffer(input, secret);
11
+ return sodium.to_base64(encrypted);
12
+ }
13
+ async function decrypt(base64, secret) {
14
+ const cipher = sodium.from_base64(base64);
15
+ return await decryptBuffer(cipher, secret);
16
+ }
17
+ /** --- BUFFER --- */
18
+ // Encrypt
19
+ async function encryptBuffer(input, secret) {
20
+ await sodium.ready;
21
+ const key = deriveKey(secret);
22
+ const nonce = deriveNonce(secret);
23
+ const compressed = await compresor.compressBuffer(input);
24
+ return sodium.crypto_secretbox_easy(compressed, nonce, key);
25
+ }
26
+ // Decrypt
27
+ async function decryptBuffer(box, secret) {
28
+ await sodium.ready;
29
+ const key = deriveKey(secret);
30
+ const nonce = deriveNonce(secret);
31
+ try {
32
+ const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);
33
+ if (!opened)
34
+ return null;
35
+ return await compresor.decompressBuffer(opened);
36
+ }
37
+ catch (error) {
38
+ return null;
39
+ }
40
+ }
41
+ /** --- HASH --- */
42
+ async function hash(str) {
43
+ await sodium.ready;
44
+ const digest = sodium.crypto_generichash(32, sodium.from_string(str));
45
+ return sodium
46
+ .to_base64(digest)
47
+ .replace(/[^a-zA-Z0-9]/g, "");
48
+ }
49
+ const crypto = {
50
+ encrypt,
51
+ decrypt,
52
+ encryptBuffer,
53
+ decryptBuffer,
54
+ hash,
55
+ };export{decrypt,decryptBuffer,crypto as default,encrypt,encryptBuffer,hash};//# sourceMappingURL=crypto.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.mjs","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport compresor from \"./compress\";\n\nexport type EncryptInput = string | object | any[];\n\n/** --- Key/Nonce Derivation --- */\nfunction deriveKey(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_KEYBYTES,\n sodium.from_string(secret)\n );\n}\n\nfunction deriveNonce(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_NONCEBYTES,\n sodium.from_string(secret)\n );\n}\n\n/** --- STRING --- */\nexport async function encrypt(input: EncryptInput, secret: string): Promise<string> {\n const encrypted = await encryptBuffer(input, secret);\n return sodium.to_base64(encrypted);\n}\n\nexport async function decrypt(base64: string, secret: string): Promise<any | null> {\n const cipher = sodium.from_base64(base64);\n return await decryptBuffer(cipher, secret);\n}\n\n/** --- BUFFER --- */\n// Encrypt\nexport async function encryptBuffer(input: any, secret: string): Promise<Uint8Array> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n const compressed = await compresor.compressBuffer(input);\n return sodium.crypto_secretbox_easy(compressed, nonce, key);\n}\n\n// Decrypt\nexport async function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n try {\n const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);\n if (!opened) return null;\n return await compresor.decompressBuffer(opened);\n } catch (error) {\n return null;\n }\n}\n\n/** --- HASH --- */\nexport async function hash(str: string): Promise<string> {\n await sodium.ready;\n const digest = sodium.crypto_generichash(32, sodium.from_string(str));\n return sodium\n .to_base64(digest)\n .replace(/[^a-zA-Z0-9]/g, \"\")\n}\n\nconst crypto = {\n encrypt,\n decrypt,\n encryptBuffer,\n decryptBuffer,\n hash,\n};\n\nexport default crypto;\n"],"names":["sodium","compresor","deriveKey","secret","crypto_generichash","crypto_secretbox_KEYBYTES","from_string","deriveNonce","crypto_secretbox_NONCEBYTES","async","encrypt","input","encrypted","encryptBuffer","to_base64","decrypt","base64","cipher","from_base64","decryptBuffer","ready","key","nonce","compressed","compressBuffer","crypto_secretbox_easy","box","opened","crypto_secretbox_open_easy","decompressBuffer","error","hash","str","digest","replace","crypto"],"mappings":"OAKAA,MAAA,4BAAAC,MAAA,iBACA,SAASC,EAAUC,GAChB,OAAOH,EAAOI,mBACXJ,EAAOK,0BACPL,EAAOM,YAAYH,GAEzB,CAEA,SAASI,EAAYJ,GAClB,OAAOH,EAAOI,mBACXJ,EAAOQ,4BACPR,EAAOM,YAAYH,GAEzB,CAGOM,eAAeC,EAAQC,EAAqBR,GAChD,MAAMS,QAAkBC,EAAcF,EAAOR,GAC7C,OAAOH,EAAOc,UAAUF,EAC3B,CAEOH,eAAeM,EAAQC,EAAgBb,GAC3C,MAAMc,EAASjB,EAAOkB,YAAYF,GAClC,aAAaG,EAAcF,EAAQd,EACtC,CAIOM,eAAeI,EAAcF,EAAYR,SACvCH,EAAOoB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GACpBoB,QAAmBtB,EAAUuB,eAAeb,GAClD,OAAOX,EAAOyB,sBAAsBF,EAAYD,EAAOD,EAC1D,CAGOZ,eAAeU,EAAcO,EAAiBvB,SAC5CH,EAAOoB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GAC1B,IACG,MAAMwB,EAAS3B,EAAO4B,2BAA2BF,EAAKJ,EAAOD,GAC7D,OAAKM,QACQ1B,EAAU4B,iBAAiBF,GADpB,IAEtB,CAAC,MAAOG,GACN,OAAO,IACT,CACJ,CAGOrB,eAAesB,EAAKC,SAClBhC,EAAOoB,MACb,MAAMa,EAASjC,EAAOI,mBAAmB,GAAIJ,EAAOM,YAAY0B,IAChE,OAAOhC,EACHc,UAAUmB,GACVC,QAAQ,gBAAiB,GAChC,CAEA,MAAMC,EAAS,CACZzB,UACAK,UACAF,gBACAM,gBACAY"}
1
+ {"version":3,"file":"crypto.mjs","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport compresor from \"./compress\";\n\nexport type EncryptInput = string | object | any[];\n\n/** --- Key/Nonce Derivation --- */\nfunction deriveKey(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_KEYBYTES,\n sodium.from_string(secret)\n );\n}\n\nfunction deriveNonce(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_NONCEBYTES,\n sodium.from_string(secret)\n );\n}\n\n/** --- STRING --- */\nexport async function encrypt(input: EncryptInput, secret: string): Promise<string> {\n const encrypted = await encryptBuffer(input, secret);\n return sodium.to_base64(encrypted);\n}\n\nexport async function decrypt(base64: string, secret: string): Promise<any | null> {\n const cipher = sodium.from_base64(base64);\n return await decryptBuffer(cipher, secret);\n}\n\n/** --- BUFFER --- */\n// Encrypt\nexport async function encryptBuffer(input: any, secret: string): Promise<Uint8Array> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n const compressed = await compresor.compressBuffer(input);\n return sodium.crypto_secretbox_easy(compressed, nonce, key);\n}\n\n// Decrypt\nexport async function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n try {\n const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);\n if (!opened) return null;\n return await compresor.decompressBuffer(opened);\n } catch (error) {\n return null;\n }\n}\n\n/** --- HASH --- */\nexport async function hash(str: string): Promise<string> {\n await sodium.ready;\n const digest = sodium.crypto_generichash(32, sodium.from_string(str));\n return sodium\n .to_base64(digest)\n .replace(/[^a-zA-Z0-9]/g, \"\")\n}\n\nconst crypto = {\n encrypt,\n decrypt,\n encryptBuffer,\n decryptBuffer,\n hash,\n};\n\nexport default crypto;\n"],"names":[],"mappings":"6EAKA;AACA,SAAS,SAAS,CAAC,MAAc,EAAA;AAC9B,IAAA,OAAO,MAAM,CAAC,kBAAkB,CAC7B,MAAM,CAAC,yBAAyB,EAChC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAC5B;AACJ;AAEA,SAAS,WAAW,CAAC,MAAc,EAAA;AAChC,IAAA,OAAO,MAAM,CAAC,kBAAkB,CAC7B,MAAM,CAAC,2BAA2B,EAClC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAC5B;AACJ;AAEA;AACO,eAAe,OAAO,CAAC,KAAmB,EAAE,MAAc,EAAA;IAC9D,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC;AACpD,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;AACrC;AAEO,eAAe,OAAO,CAAC,MAAc,EAAE,MAAc,EAAA;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;AACzC,IAAA,OAAO,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;AAC7C;AAEA;AACA;AACO,eAAe,aAAa,CAAC,KAAU,EAAE,MAAc,EAAA;IAC3D,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC;IACxD,OAAO,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC;AAC9D;AAEA;AACO,eAAe,aAAa,CAAC,GAAe,EAAE,MAAc,EAAA;IAChE,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;IACjC,IAAI;AACD,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;AACjE,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AACxB,QAAA,OAAO,MAAM,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACjD,IAAA;AAAC,IAAA,OAAO,KAAK,EAAE;AACb,QAAA,OAAO,IAAI;AACb,IAAA;AACJ;AAEA;AACO,eAAe,IAAI,CAAC,GAAW,EAAA;IACnC,MAAM,MAAM,CAAC,KAAK;AAClB,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACrE,IAAA,OAAO;SACH,SAAS,CAAC,MAAM;AAChB,SAAA,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;AACnC;AAEA,MAAM,MAAM,GAAG;IACZ,OAAO;IACP,OAAO;IACP,aAAa;IACb,aAAa;IACb,IAAI;"}
package/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./server/index.js"),r=require("./client/index.js"),t=require("./include/crypto.js"),u=require("./include/compress.js");exports.SecurequServer=e.default,exports.SecurequClient=r.default,exports.crypto=t.default,exports.compresor=u.default;//# sourceMappingURL=index.js.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var index=require('./server/index.js'),index$1=require('./client/index.js'),crypto=require('./include/crypto.js'),compress=require('./include/compress.js');exports.SecurequServer=index.default;exports.SecurequClient=index$1.default;exports.crypto=crypto.default;exports.compresor=compress.default;//# sourceMappingURL=index.js.map
package/index.mjs CHANGED
@@ -1 +1 @@
1
- export{default as SecurequServer}from"./server/index.mjs";export{default as SecurequClient}from"./client/index.mjs";export{default as crypto}from"./include/crypto.mjs";export{default as compresor}from"./include/compress.mjs";//# sourceMappingURL=index.mjs.map
1
+ export{default as SecurequServer}from'./server/index.mjs';export{default as SecurequClient}from'./client/index.mjs';export{default as crypto}from'./include/crypto.mjs';export{default as compresor}from'./include/compress.mjs';//# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securequ",
3
- "version": "1.1.6",
3
+ "version": "1.1.7",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "sideEffects": false,
package/server/Base.js CHANGED
@@ -1 +1,102 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../include/crypto.js"),t=require("./Router.js");class s extends t.default{constructor(e){if(super(),this.secret=null,this.clients=new Map,this.uploadMeta=new Map,this.CONTENT_TYPE="application/octet-stream",!e.basepath)throw new Error("Basepath is required");if(!e.clients||0===Object.keys(e.clients).length)throw new Error("Atleast one client is required");e.basepath.startsWith("/")||(e.basepath=`/${e.basepath}`),e.basepath.endsWith("/")&&(e.basepath=e.basepath.substring(0,e.basepath.length-1)),e.file&&(e.file.maxFilesize=e.file.maxFilesize||51200,e.file.checkFileType=e.file.checkFileType||!0),e.mode=["production","development"].includes(e.mode||"")?e.mode:"production",this.config=e;for(let e of this.config.clients)this.clients.set(e.origin,e.secret)}async getSecret(){return this.secret||(this.secret=await e.default.hash(Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15))),this.secret}async clientInfo(t,s){const i="/"!==t&&"development"===this.config.mode;let a=t.split("?");const n=(t=(t=(t=(t=a[0]).replace(this.config.basepath+"/","")).endsWith("/")?t.substring(0,t.length-1):t).startsWith("/")?t.substring(1):t).split("/"),r=n.shift();let c=this.clients.get(s);if(c||(c=this.clients.get("*")),!(null==r?void 0:r.length)||!c)return null;let o=c.substring(0,r.length),h={};return a.length>1&&(h=i?Object.fromEntries(new URLSearchParams(decodeURIComponent(a[1]))):await e.default.decrypt(decodeURIComponent(a[1]),o)),{path:"/"+n.join("/"),secret:o,hash:r,searchParams:h}}async isValidSigneture(t,s){const i=await this.getSecret();if(this.secret&&t){let a=await e.default.decrypt(t,i),n=a.hash===s,r=a.expire>Date.now();if(!n)throw new Response("Invalid Signeture",{status:403});if(!r)throw new Response("Signeture expired",{status:403})}}async handleRequest(e,t){if(this.config.accept){if(!await this.config.accept(e,t))throw new Response("Request not accepted",{status:403})}const{path:s,method:i}=e;let a=Object.values(this.routes[i]);for(let{test:i,handler:n}of a){const a=i(s);a&&await n(Object.assign(Object.assign({},e),{params:a.params}),t)}}}exports.default=s;//# sourceMappingURL=Base.js.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var crypto=require('../include/crypto.js'),Router=require('./Router.js');class SecurequServerBase extends Router.default {
2
+ constructor(config) {
3
+ super();
4
+ this.secret = null;
5
+ this.clients = new Map();
6
+ this.uploadMeta = new Map();
7
+ this.CONTENT_TYPE = "application/octet-stream";
8
+ if (!config.basepath)
9
+ throw new Error("Basepath is required");
10
+ if (!config.clients || Object.keys(config.clients).length === 0)
11
+ throw new Error("Atleast one client is required");
12
+ if (!config.basepath.startsWith("/"))
13
+ config.basepath = `/${config.basepath}`;
14
+ if (config.basepath.endsWith("/"))
15
+ config.basepath = config.basepath.substring(0, config.basepath.length - 1);
16
+ if (config.file) {
17
+ config.file.maxFilesize = config.file.maxFilesize || 50 * 1024; // 50MB default
18
+ config.file.checkFileType = config.file.checkFileType || true;
19
+ }
20
+ config.mode = ["production", 'development'].includes(config.mode || "") ? config.mode : "production";
21
+ this.config = config;
22
+ for (let client of this.config.clients) {
23
+ this.clients.set(client.origin, client.secret);
24
+ }
25
+ }
26
+ async getSecret() {
27
+ if (!this.secret) {
28
+ this.secret = await crypto.default.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15));
29
+ }
30
+ return this.secret;
31
+ }
32
+ async clientInfo(path, origin) {
33
+ const isDev = path !== '/' && this.config.mode === 'development';
34
+ let splitUrl = path.split("?");
35
+ path = splitUrl[0];
36
+ path = path.replace(this.config.basepath + "/", "");
37
+ path = path.endsWith('/') ? path.substring(0, path.length - 1) : path;
38
+ path = path.startsWith('/') ? path.substring(1) : path;
39
+ const split = path.split("/");
40
+ const hash = split.shift();
41
+ let client = this.clients.get(origin);
42
+ if (!client) {
43
+ client = this.clients.get("*");
44
+ }
45
+ if (!(hash === null || hash === void 0 ? void 0 : hash.length) || !client)
46
+ return null;
47
+ let secret = client.substring(0, hash.length);
48
+ let searchParams = {};
49
+ if (splitUrl.length > 1) {
50
+ const uparams = new URLSearchParams(decodeURIComponent(splitUrl[1]));
51
+ if (isDev) {
52
+ searchParams = Object.fromEntries(uparams);
53
+ }
54
+ else {
55
+ const keys = Array.from(uparams.keys());
56
+ if (keys.length) {
57
+ const key = keys[0];
58
+ const value = uparams.get(key);
59
+ const decrypted = await crypto.default.decrypt(value, secret);
60
+ if (decrypted && decrypted.key === key) {
61
+ searchParams = decrypted.params || {};
62
+ }
63
+ }
64
+ }
65
+ }
66
+ return {
67
+ path: "/" + split.join('/'),
68
+ secret,
69
+ hash,
70
+ searchParams
71
+ };
72
+ }
73
+ async isValidSigneture(signeture, hash) {
74
+ const serverSecret = await this.getSecret();
75
+ if (this.secret && signeture) {
76
+ let info = await crypto.default.decrypt(signeture, serverSecret);
77
+ if (!info)
78
+ throw new Response("Invalid Signeture", { status: 403 });
79
+ let isHashValid = info.hash === hash;
80
+ let isNotExpired = info.expire > Date.now();
81
+ if (!isHashValid)
82
+ throw new Response("Invalid Signeture", { status: 403 });
83
+ if (!isNotExpired)
84
+ throw new Response("Signeture expired", { status: 403 });
85
+ }
86
+ }
87
+ async handleRequest(info, metadata) {
88
+ if (this.config.accept) {
89
+ const is = await this.config.accept(info, metadata);
90
+ if (!is)
91
+ throw new Response("Request not accepted", { status: 403 });
92
+ }
93
+ const { path, method } = info;
94
+ let values = Object.values(this.routes[method]);
95
+ for (let { test, handler } of values) {
96
+ const match = test(path);
97
+ if (match) {
98
+ await handler(Object.assign(Object.assign({}, info), { params: match.params }), metadata);
99
+ }
100
+ }
101
+ }
102
+ }exports.default=SecurequServerBase;//# sourceMappingURL=Base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Base.js","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, Metadata } from \"./types\";\n\nclass SecurequServerBase extends Router {\n protected config: SecurequServerConfig;\n protected secret: string | null = null\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n constructor(config: SecurequServerConfig) {\n super()\n if (!config.basepath) throw new Error(\"Basepath is required\");\n if (!config.clients || Object.keys(config.clients).length === 0) throw new Error(\"Atleast one client is required\");\n if (!config.basepath.startsWith(\"/\")) config.basepath = `/${config.basepath}`;\n if (config.basepath.endsWith(\"/\")) config.basepath = config.basepath.substring(0, config.basepath.length - 1);\n if (config.file) {\n config.file.maxFilesize = config.file.maxFilesize || 50 * 1024 // 50MB default\n config.file.checkFileType = config.file.checkFileType || true\n }\n config.mode = [\"production\", 'development'].includes(config.mode || \"\") ? config.mode : \"production\"\n this.config = config\n for (let client of this.config.clients) {\n this.clients.set(client.origin, client.secret)\n }\n }\n\n protected async getSecret() {\n if (!this.secret) {\n this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15))\n }\n return this.secret\n }\n\n protected async clientInfo(path: string, origin: string) {\n const isDev = path !== '/' && this.config.mode === 'development'\n let splitUrl = path.split(\"?\")\n path = splitUrl[0]\n path = path.replace(this.config.basepath + \"/\", \"\")\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n path = path.startsWith('/') ? path.substring(1) : path\n\n const split = path.split(\"/\")\n const hash = split.shift()\n let client = this.clients.get(origin)\n if (!client) {\n client = this.clients.get(\"*\")\n }\n\n if (!hash?.length || !client) return null\n let secret = client.substring(0, hash.length as number);\n let searchParams: { [key: string]: any } = {}\n if (splitUrl.length > 1) {\n if (isDev) {\n searchParams = Object.fromEntries(new URLSearchParams(decodeURIComponent(splitUrl[1])))\n } else {\n searchParams = await crypto.decrypt(decodeURIComponent(splitUrl[1]), secret) as any\n }\n }\n return {\n path: \"/\" + split.join('/'),\n secret,\n hash,\n searchParams\n }\n }\n\n protected async isValidSigneture(signeture: string | undefined, hash: string) {\n const serverSecret = await this.getSecret()\n if (this.secret && signeture) {\n let info: any = await crypto.decrypt(signeture, serverSecret)\n let isHashValid = info.hash === hash\n let isNotExpired = info.expire > Date.now()\n if (!isHashValid) throw new Response(\"Invalid Signeture\", { status: 403 });\n if (!isNotExpired) throw new Response(\"Signeture expired\", { status: 403 });\n }\n }\n\n async handleRequest(info: HandlerInfo, metadata?: Metadata) {\n if (this.config.accept) {\n const is = await this.config.accept(info, metadata)\n if (!is) throw new Response(\"Request not accepted\", { status: 403 })\n }\n\n const { path, method } = info;\n let values: any = Object.values(this.routes[method]);\n for (let { test, handler } of values) {\n const match = test(path)\n if (match) {\n await handler({ ...info, params: match.params }, metadata)\n }\n }\n }\n\n}\n\nexport default SecurequServerBase;"],"names":["SecurequServerBase","Router","constructor","config","super","this","secret","clients","Map","uploadMeta","CONTENT_TYPE","basepath","Error","Object","keys","length","startsWith","endsWith","substring","file","maxFilesize","checkFileType","mode","includes","client","set","origin","getSecret","crypto","hash","Math","random","toString","clientInfo","path","isDev","splitUrl","split","replace","shift","get","searchParams","fromEntries","URLSearchParams","decodeURIComponent","decrypt","join","isValidSigneture","signeture","serverSecret","info","isHashValid","isNotExpired","expire","Date","now","Response","status","handleRequest","metadata","accept","method","values","routes","test","handler","match","assign","params","exports","default"],"mappings":"mIAIA,MAAMA,UAA2BC,EAAAA,QAO9B,WAAAC,CAAYC,GAET,GADAC,QANOC,KAAAC,OAAwB,KACxBD,KAAAE,QAAU,IAAIC,IACdH,KAAAI,WAAa,IAAID,IAClBH,KAAAK,aAAe,4BAIhBP,EAAOQ,SAAU,MAAM,IAAIC,MAAM,wBACtC,IAAKT,EAAOI,SAAkD,IAAvCM,OAAOC,KAAKX,EAAOI,SAASQ,OAAc,MAAM,IAAIH,MAAM,kCAC5ET,EAAOQ,SAASK,WAAW,OAAMb,EAAOQ,SAAW,IAAIR,EAAOQ,YAC/DR,EAAOQ,SAASM,SAAS,OAAMd,EAAOQ,SAAWR,EAAOQ,SAASO,UAAU,EAAGf,EAAOQ,SAASI,OAAS,IACvGZ,EAAOgB,OACRhB,EAAOgB,KAAKC,YAAcjB,EAAOgB,KAAKC,aAAe,MACrDjB,EAAOgB,KAAKE,cAAgBlB,EAAOgB,KAAKE,gBAAiB,GAE5DlB,EAAOmB,KAAO,CAAC,aAAc,eAAeC,SAASpB,EAAOmB,MAAQ,IAAMnB,EAAOmB,KAAO,aACxFjB,KAAKF,OAASA,EACd,IAAK,IAAIqB,KAAUnB,KAAKF,OAAOI,QAC5BF,KAAKE,QAAQkB,IAAID,EAAOE,OAAQF,EAAOlB,OAE7C,CAEU,eAAMqB,GAIb,OAHKtB,KAAKC,SACPD,KAAKC,aAAesB,EAAAA,QAAOC,KAAKC,KAAKC,SAASC,SAAS,IAAId,UAAU,EAAG,IAAMY,KAAKC,SAASC,SAAS,IAAId,UAAU,EAAG,MAElHb,KAAKC,MACf,CAEU,gBAAM2B,CAAWC,EAAcR,GACtC,MAAMS,EAAiB,MAATD,GAAqC,gBAArB7B,KAAKF,OAAOmB,KAC1C,IAAIc,EAAWF,EAAKG,MAAM,KAM1B,MAAMA,GAFNH,GADAA,GADAA,GADAA,EAAOE,EAAS,IACJE,QAAQjC,KAAKF,OAAOQ,SAAW,IAAK,KACpCM,SAAS,KAAOiB,EAAKhB,UAAU,EAAGgB,EAAKnB,OAAS,GAAKmB,GACrDlB,WAAW,KAAOkB,EAAKhB,UAAU,GAAKgB,GAE/BG,MAAM,KACnBR,EAAOQ,EAAME,QACnB,IAAIf,EAASnB,KAAKE,QAAQiC,IAAId,GAK9B,GAJKF,IACFA,EAASnB,KAAKE,QAAQiC,IAAI,QAGxBX,aAAI,EAAJA,EAAMd,UAAWS,EAAQ,OAAO,KACrC,IAAIlB,EAASkB,EAAON,UAAU,EAAGW,EAAKd,QAClC0B,EAAuC,CAAA,EAQ3C,OAPIL,EAASrB,OAAS,IAEhB0B,EADCN,EACctB,OAAO6B,YAAY,IAAIC,gBAAgBC,mBAAmBR,EAAS,YAE7DR,EAAAA,QAAOiB,QAAQD,mBAAmBR,EAAS,IAAK9B,IAGpE,CACJ4B,KAAM,IAAMG,EAAMS,KAAK,KACvBxC,SACAuB,OACAY,eAEN,CAEU,sBAAMM,CAAiBC,EAA+BnB,GAC7D,MAAMoB,QAAqB5C,KAAKsB,YAChC,GAAItB,KAAKC,QAAU0C,EAAW,CAC3B,IAAIE,QAAkBtB,EAAAA,QAAOiB,QAAQG,EAAWC,GAC5CE,EAAcD,EAAKrB,OAASA,EAC5BuB,EAAeF,EAAKG,OAASC,KAAKC,MACtC,IAAKJ,EAAa,MAAM,IAAIK,SAAS,oBAAqB,CAAEC,OAAQ,MACpE,IAAKL,EAAc,MAAM,IAAII,SAAS,oBAAqB,CAAEC,OAAQ,KACvE,CACJ,CAEA,mBAAMC,CAAcR,EAAmBS,GACpC,GAAItD,KAAKF,OAAOyD,OAAQ,CAErB,UADiBvD,KAAKF,OAAOyD,OAAOV,EAAMS,GACjC,MAAM,IAAIH,SAAS,uBAAwB,CAAEC,OAAQ,KAChE,CAED,MAAMvB,KAAEA,EAAI2B,OAAEA,GAAWX,EACzB,IAAIY,EAAcjD,OAAOiD,OAAOzD,KAAK0D,OAAOF,IAC5C,IAAK,IAAIG,KAAEA,EAAIC,QAAEA,KAAaH,EAAQ,CACnC,MAAMI,EAAQF,EAAK9B,GACfgC,SACKD,EAAOpD,OAAAsD,OAAAtD,OAAAsD,OAAA,CAAA,EAAMjB,GAAI,CAAEkB,OAAQF,EAAME,SAAUT,EAEtD,CACJ,EAEFU,QAAAC,QAAAtE"}
1
+ {"version":3,"file":"Base.js","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, Metadata } from \"./types\";\n\nclass SecurequServerBase extends Router {\n protected config: SecurequServerConfig;\n protected secret: string | null = null\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n constructor(config: SecurequServerConfig) {\n super()\n if (!config.basepath) throw new Error(\"Basepath is required\");\n if (!config.clients || Object.keys(config.clients).length === 0) throw new Error(\"Atleast one client is required\");\n if (!config.basepath.startsWith(\"/\")) config.basepath = `/${config.basepath}`;\n if (config.basepath.endsWith(\"/\")) config.basepath = config.basepath.substring(0, config.basepath.length - 1);\n if (config.file) {\n config.file.maxFilesize = config.file.maxFilesize || 50 * 1024 // 50MB default\n config.file.checkFileType = config.file.checkFileType || true\n }\n config.mode = [\"production\", 'development'].includes(config.mode || \"\") ? config.mode : \"production\"\n this.config = config\n for (let client of this.config.clients) {\n this.clients.set(client.origin, client.secret)\n }\n }\n\n protected async getSecret() {\n if (!this.secret) {\n this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15))\n }\n return this.secret\n }\n\n protected async clientInfo(path: string, origin: string) {\n const isDev = path !== '/' && this.config.mode === 'development'\n let splitUrl = path.split(\"?\")\n path = splitUrl[0]\n path = path.replace(this.config.basepath + \"/\", \"\")\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n path = path.startsWith('/') ? path.substring(1) : path\n\n const split = path.split(\"/\")\n const hash = split.shift()\n let client = this.clients.get(origin)\n if (!client) {\n client = this.clients.get(\"*\")\n }\n\n if (!hash?.length || !client) return null\n let secret = client.substring(0, hash.length as number);\n let searchParams: { [key: string]: any } = {}\n if (splitUrl.length > 1) {\n const uparams = new URLSearchParams(decodeURIComponent(splitUrl[1]))\n if (isDev) {\n searchParams = Object.fromEntries(uparams)\n } else {\n const keys = Array.from(uparams.keys());\n if (keys.length) {\n const key = keys[0]\n const value = uparams.get(key) as string;\n const decrypted: any = await crypto.decrypt(value, secret)\n if (decrypted && decrypted.key === key) {\n searchParams = decrypted.params || {}\n }\n }\n }\n }\n return {\n path: \"/\" + split.join('/'),\n secret,\n hash,\n searchParams\n }\n }\n\n protected async isValidSigneture(signeture: string | undefined, hash: string) {\n const serverSecret = await this.getSecret()\n if (this.secret && signeture) {\n let info: any = await crypto.decrypt(signeture, serverSecret)\n if (!info) throw new Response(\"Invalid Signeture\", { status: 403 });\n let isHashValid = info.hash === hash\n let isNotExpired = info.expire > Date.now()\n if (!isHashValid) throw new Response(\"Invalid Signeture\", { status: 403 });\n if (!isNotExpired) throw new Response(\"Signeture expired\", { status: 403 });\n }\n }\n\n async handleRequest(info: HandlerInfo, metadata?: Metadata) {\n if (this.config.accept) {\n const is = await this.config.accept(info, metadata)\n if (!is) throw new Response(\"Request not accepted\", { status: 403 })\n }\n\n const { path, method } = info;\n let values: any = Object.values(this.routes[method]);\n for (let { test, handler } of values) {\n const match = test(path)\n if (match) {\n await handler({ ...info, params: match.params }, metadata)\n }\n }\n }\n\n}\n\nexport default SecurequServerBase;"],"names":["Router","crypto"],"mappings":"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"}