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.
- package/client/Base.js +147 -1
- package/client/Base.js.map +1 -1
- package/client/Base.mjs +147 -1
- package/client/Base.mjs.map +1 -1
- package/client/index.js +139 -1
- package/client/index.js.map +1 -1
- package/client/index.mjs +139 -1
- package/client/index.mjs.map +1 -1
- package/include/File.js +60 -1
- package/include/File.js.map +1 -1
- package/include/File.mjs +60 -1
- package/include/File.mjs.map +1 -1
- package/include/FileScaner.js +95 -1
- package/include/FileScaner.js.map +1 -1
- package/include/FileScaner.mjs +95 -1
- package/include/FileScaner.mjs.map +1 -1
- package/include/compress.js +19 -1
- package/include/compress.js.map +1 -1
- package/include/compress.mjs +19 -1
- package/include/compress.mjs.map +1 -1
- package/include/crypto.js +55 -1
- package/include/crypto.js.map +1 -1
- package/include/crypto.mjs +55 -1
- package/include/crypto.mjs.map +1 -1
- package/index.js +1 -1
- package/index.mjs +1 -1
- package/package.json +1 -1
- package/server/Base.js +102 -1
- package/server/Base.js.map +1 -1
- package/server/Base.mjs +102 -1
- package/server/Base.mjs.map +1 -1
- package/server/Router.js +30 -1
- package/server/Router.js.map +1 -1
- package/server/Router.mjs +30 -1
- package/server/Router.mjs.map +1 -1
- package/server/index.js +179 -1
- package/server/index.js.map +1 -1
- package/server/index.mjs +179 -1
- package/server/index.mjs.map +1 -1
- package/server/types.d.ts +1 -1
package/include/FileScaner.mjs
CHANGED
|
@@ -1 +1,95 @@
|
|
|
1
|
-
|
|
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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"}
|
package/include/compress.js
CHANGED
|
@@ -1 +1,19 @@
|
|
|
1
|
-
|
|
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
|
package/include/compress.js.map
CHANGED
|
@@ -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":["
|
|
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"}
|
package/include/compress.mjs
CHANGED
|
@@ -1 +1,19 @@
|
|
|
1
|
-
import{compressSync
|
|
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
|
package/include/compress.mjs.map
CHANGED
|
@@ -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":[
|
|
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
|
-
|
|
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
|
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\";\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":["
|
|
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;"}
|
package/include/crypto.mjs
CHANGED
|
@@ -1 +1,55 @@
|
|
|
1
|
-
import
|
|
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
|
package/include/crypto.mjs.map
CHANGED
|
@@ -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":[
|
|
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
|
-
|
|
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
|
|
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
package/server/Base.js
CHANGED
|
@@ -1 +1,102 @@
|
|
|
1
|
-
|
|
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
|
package/server/Base.js.map
CHANGED
|
@@ -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(
|
|
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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"}
|