securequ 1.1.0 → 1.1.1

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 @@
1
- {"version":3,"file":"compress.js","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\r\nimport sodium from 'libsodium-wrappers';\r\nimport { unpack, pack } from 'msgpackr';\r\n\r\nexport async function compressBuffer(input: any) {\r\n await sodium.ready\r\n const encode = pack(input);\r\n return compressSync(encode);\r\n}\r\n\r\nexport async function decompressBuffer(input: Uint8Array | Buffer) {\r\n await sodium.ready\r\n const compress = decompressSync(input);\r\n return unpack(compress);\r\n}\r\n\r\nexport async function compress(input: any) {\r\n const compressed = await compressBuffer(input);\r\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\r\n}\r\n\r\nexport async function decompress(base64Str: string) {\r\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\r\n return await decompressBuffer(compressed);\r\n}\r\n"],"names":["exports","compressBuffer","async","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack"],"mappings":"kJAcAA,QAAAC,eAVOC,eAA8BC,SAC5BC,EAAOC,MACb,MAAMC,EAASC,OAAKJ,GACpB,OAAOK,EAAAA,aAAaF,EACvB,EAMAN,QAAAS,iBAJOP,eAAgCC,SAC9BC,EAAOC,MACb,MAAMK,EAAWC,iBAAeR,GAChC,OAAOS,EAAAA,OAAOF,EACjB"}
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\nexport async function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nexport async function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nexport async function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nexport async function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n"],"names":["exports","compressBuffer","async","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack"],"mappings":"kJAcAA,QAAAC,eAVOC,eAA8BC,SAC5BC,EAAOC,MACb,MAAMC,EAASC,EAAAA,KAAKJ,GACpB,OAAOK,EAAAA,aAAaF,EACvB,EAMAN,QAAAS,iBAJOP,eAAgCC,SAC9BC,EAAOC,MACb,MAAMK,EAAWC,EAAAA,eAAeR,GAChC,OAAOS,EAAAA,OAAOF,EACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"compress.mjs","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\r\nimport sodium from 'libsodium-wrappers';\r\nimport { unpack, pack } from 'msgpackr';\r\n\r\nexport async function compressBuffer(input: any) {\r\n await sodium.ready\r\n const encode = pack(input);\r\n return compressSync(encode);\r\n}\r\n\r\nexport async function decompressBuffer(input: Uint8Array | Buffer) {\r\n await sodium.ready\r\n const compress = decompressSync(input);\r\n return unpack(compress);\r\n}\r\n\r\nexport async function compress(input: any) {\r\n const compressed = await compressBuffer(input);\r\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\r\n}\r\n\r\nexport async function decompress(base64Str: string) {\r\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\r\n return await decompressBuffer(compressed);\r\n}\r\n"],"names":["async","compressBuffer","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack"],"mappings":"wIAIOA,eAAeC,EAAeC,SAC5BC,EAAOC,MACb,MAAMC,EAASC,EAAKJ,GACpB,OAAOK,EAAaF,EACvB,CAEOL,eAAeQ,EAAiBN,SAC9BC,EAAOC,MACb,MAAMK,EAAWC,EAAeR,GAChC,OAAOS,EAAOF,EACjB,QAAAR,oBAAAO"}
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\nexport async function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nexport async function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nexport async function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nexport async function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n"],"names":["async","compressBuffer","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack"],"mappings":"wIAIOA,eAAeC,EAAeC,SAC5BC,EAAOC,MACb,MAAMC,EAASC,EAAKJ,GACpB,OAAOK,EAAaF,EACvB,CAEOL,eAAeQ,EAAiBN,SAC9BC,EAAOC,MACb,MAAMK,EAAWC,EAAeR,GAChC,OAAOS,EAAOF,EACjB,QAAAR,oBAAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\r\nimport { compressBuffer, decompressBuffer } from \"./compress\";\r\n\r\nexport type EncryptInput = string | object | any[];\r\n\r\n/** --- Key/Nonce Derivation --- */\r\nfunction deriveKey(secret: string): Uint8Array {\r\n return sodium.crypto_generichash(\r\n sodium.crypto_secretbox_KEYBYTES,\r\n sodium.from_string(secret)\r\n );\r\n}\r\n\r\nfunction deriveNonce(secret: string): Uint8Array {\r\n return sodium.crypto_generichash(\r\n sodium.crypto_secretbox_NONCEBYTES,\r\n sodium.from_string(secret)\r\n );\r\n}\r\n\r\n/** --- STRING --- */\r\nexport async function encrypt(input: EncryptInput, secret: string): Promise<string> {\r\n const encrypted = await encryptBuffer(input, secret);\r\n return sodium.to_base64(encrypted);\r\n}\r\n\r\nexport async function decrypt(base64: string, secret: string): Promise<any | null> {\r\n const cipher = sodium.from_base64(base64);\r\n return await decryptBuffer(cipher, secret);\r\n}\r\n\r\n/** --- BUFFER --- */\r\n// Encrypt\r\nexport async function encryptBuffer(input: any, secret: string): Promise<Uint8Array> {\r\n await sodium.ready;\r\n const key = deriveKey(secret);\r\n const nonce = deriveNonce(secret);\r\n const compressed = await compressBuffer(input);\r\n return sodium.crypto_secretbox_easy(compressed, nonce, key);\r\n}\r\n\r\n// Decrypt\r\nexport async function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null> {\r\n await sodium.ready;\r\n const key = deriveKey(secret);\r\n const nonce = deriveNonce(secret);\r\n try {\r\n const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);\r\n if (!opened) return null;\r\n return await decompressBuffer(opened);\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/** --- HASH --- */\r\nexport async function hash(str: string): Promise<string> {\r\n await sodium.ready;\r\n const digest = sodium.crypto_generichash(32, sodium.from_string(str));\r\n return sodium\r\n .to_base64(digest)\r\n .replace(/[^a-zA-Z0-9]/g, \"\")\r\n}\r\n\r\nconst crypto = {\r\n encrypt,\r\n decrypt,\r\n encryptBuffer,\r\n decryptBuffer,\r\n hash,\r\n};\r\n\r\nexport default crypto;\r\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","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,iBAAeb,GACxC,OAAOZ,EAAO0B,sBAAsBF,EAAYD,EAAOD,EAC1D,CAGOZ,eAAeU,EAAcO,EAAiBvB,SAC5CJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GAC1B,IACG,MAAMwB,EAAS5B,EAAO6B,2BAA2BF,EAAKJ,EAAOD,GAC7D,OAAKM,QACQE,EAAAA,iBAAiBF,GADV,IAEtB,CAAC,MAAOG,GACN,OAAO,IACT,CACJ,CAGOrB,eAAesB,EAAKC,SAClBjC,EAAOqB,MACb,MAAMa,EAASlC,EAAOK,mBAAmB,GAAIL,EAAOO,YAAY0B,IAChE,OAAOjC,EACHe,UAAUmB,GACVC,QAAQ,gBAAiB,GAChC,CAEA,MAAMC,EAAS,CACZzB,UACAK,UACAF,gBACAM,gBACAY"}
1
+ {"version":3,"file":"crypto.js","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport { compressBuffer, decompressBuffer } 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 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 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","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,EAAAA,eAAeb,GACxC,OAAOZ,EAAO0B,sBAAsBF,EAAYD,EAAOD,EAC1D,CAGOZ,eAAeU,EAAcO,EAAiBvB,SAC5CJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GAC1B,IACG,MAAMwB,EAAS5B,EAAO6B,2BAA2BF,EAAKJ,EAAOD,GAC7D,OAAKM,QACQE,EAAAA,iBAAiBF,GADV,IAEtB,CAAC,MAAOG,GACN,OAAO,IACT,CACJ,CAGOrB,eAAesB,EAAKC,SAClBjC,EAAOqB,MACb,MAAMa,EAASlC,EAAOK,mBAAmB,GAAIL,EAAOO,YAAY0B,IAChE,OAAOjC,EACHe,UAAUmB,GACVC,QAAQ,gBAAiB,GAChC,CAEA,MAAMC,EAAS,CACZzB,UACAK,UACAF,gBACAM,gBACAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.mjs","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\r\nimport { compressBuffer, decompressBuffer } from \"./compress\";\r\n\r\nexport type EncryptInput = string | object | any[];\r\n\r\n/** --- Key/Nonce Derivation --- */\r\nfunction deriveKey(secret: string): Uint8Array {\r\n return sodium.crypto_generichash(\r\n sodium.crypto_secretbox_KEYBYTES,\r\n sodium.from_string(secret)\r\n );\r\n}\r\n\r\nfunction deriveNonce(secret: string): Uint8Array {\r\n return sodium.crypto_generichash(\r\n sodium.crypto_secretbox_NONCEBYTES,\r\n sodium.from_string(secret)\r\n );\r\n}\r\n\r\n/** --- STRING --- */\r\nexport async function encrypt(input: EncryptInput, secret: string): Promise<string> {\r\n const encrypted = await encryptBuffer(input, secret);\r\n return sodium.to_base64(encrypted);\r\n}\r\n\r\nexport async function decrypt(base64: string, secret: string): Promise<any | null> {\r\n const cipher = sodium.from_base64(base64);\r\n return await decryptBuffer(cipher, secret);\r\n}\r\n\r\n/** --- BUFFER --- */\r\n// Encrypt\r\nexport async function encryptBuffer(input: any, secret: string): Promise<Uint8Array> {\r\n await sodium.ready;\r\n const key = deriveKey(secret);\r\n const nonce = deriveNonce(secret);\r\n const compressed = await compressBuffer(input);\r\n return sodium.crypto_secretbox_easy(compressed, nonce, key);\r\n}\r\n\r\n// Decrypt\r\nexport async function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null> {\r\n await sodium.ready;\r\n const key = deriveKey(secret);\r\n const nonce = deriveNonce(secret);\r\n try {\r\n const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);\r\n if (!opened) return null;\r\n return await decompressBuffer(opened);\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/** --- HASH --- */\r\nexport async function hash(str: string): Promise<string> {\r\n await sodium.ready;\r\n const digest = sodium.crypto_generichash(32, sodium.from_string(str));\r\n return sodium\r\n .to_base64(digest)\r\n .replace(/[^a-zA-Z0-9]/g, \"\")\r\n}\r\n\r\nconst crypto = {\r\n encrypt,\r\n decrypt,\r\n encryptBuffer,\r\n decryptBuffer,\r\n hash,\r\n};\r\n\r\nexport default crypto;\r\n"],"names":["sodium","decompressBuffer","compressBuffer","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","crypto_secretbox_easy","box","opened","crypto_secretbox_open_easy","error","hash","str","digest","replace","crypto"],"mappings":"OAKAA,MAAA,gDAAAC,oBAAAC,MAAA,iBACA,SAASC,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,QAAmBtB,EAAeU,GACxC,OAAOZ,EAAOyB,sBAAsBD,EAAYD,EAAOD,EAC1D,CAGOZ,eAAeU,EAAcM,EAAiBtB,SAC5CJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GAC1B,IACG,MAAMuB,EAAS3B,EAAO4B,2BAA2BF,EAAKH,EAAOD,GAC7D,OAAKK,QACQ1B,EAAiB0B,GADV,IAEtB,CAAC,MAAOE,GACN,OAAO,IACT,CACJ,CAGOnB,eAAeoB,EAAKC,SAClB/B,EAAOqB,MACb,MAAMW,EAAShC,EAAOK,mBAAmB,GAAIL,EAAOO,YAAYwB,IAChE,OAAO/B,EACHe,UAAUiB,GACVC,QAAQ,gBAAiB,GAChC,CAEA,MAAMC,EAAS,CACZvB,UACAK,UACAF,gBACAM,gBACAU"}
1
+ {"version":3,"file":"crypto.mjs","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport { compressBuffer, decompressBuffer } 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 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 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","decompressBuffer","compressBuffer","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","crypto_secretbox_easy","box","opened","crypto_secretbox_open_easy","error","hash","str","digest","replace","crypto"],"mappings":"OAKAA,MAAA,gDAAAC,oBAAAC,MAAA,iBACA,SAASC,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,QAAmBtB,EAAeU,GACxC,OAAOZ,EAAOyB,sBAAsBD,EAAYD,EAAOD,EAC1D,CAGOZ,eAAeU,EAAcM,EAAiBtB,SAC5CJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GAC1B,IACG,MAAMuB,EAAS3B,EAAO4B,2BAA2BF,EAAKH,EAAOD,GAC7D,OAAKK,QACQ1B,EAAiB0B,GADV,IAEtB,CAAC,MAAOE,GACN,OAAO,IACT,CACJ,CAGOnB,eAAeoB,EAAKC,SAClB/B,EAAOqB,MACb,MAAMW,EAAShC,EAAOK,mBAAmB,GAAIL,EAAOO,YAAYwB,IAChE,OAAO/B,EACHe,UAAUiB,GACVC,QAAQ,gBAAiB,GAChC,CAEA,MAAMC,EAAS,CACZvB,UACAK,UACAF,gBACAM,gBACAU"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securequ",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "sideEffects": false,
@@ -12,13 +12,13 @@
12
12
  "xanfetch": "^1.0.8"
13
13
  },
14
14
  "devDependencies": {
15
- "makepack": "^1.7.14",
16
15
  "@types/express": "^5.0.3",
17
16
  "@types/libsodium-wrappers": "^0.7.14",
18
17
  "@types/node": "^22.15.24",
19
18
  "@types/react": "^19.0.2",
20
19
  "@types/react-dom": "^19.0.2",
21
20
  "express": "^5.1.0",
21
+ "makepack": "^1.7.14",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0",
24
24
  "typescript": "^4.4.2"
package/readme.md CHANGED
@@ -1,54 +1,54 @@
1
- # securequ
2
-
3
- [![npm version](https://img.shields.io/npm/v/securequ.svg)](https://www.npmjs.com/package/securequ)
4
- [![License](https://img.shields.io/npm/l/securequ.svg)](https://github.com/your-username/securequ/blob/main/LICENSE)
5
- [![Downloads](https://img.shields.io/npm/dt/securequ.svg)](https://www.npmjs.com/package/securequ)
6
-
7
- A brief description of what your package does and its purpose.
8
-
9
- ## Installation
10
-
11
- ```sh
12
- npm install securequ
13
- ```
14
-
15
- or with yarn:
16
-
17
- ```sh
18
- yarn add securequ
19
- ```
20
-
21
- ## Usage
22
-
23
- ```js
24
- import { feature } from "securequ";
25
-
26
- const result = feature("example");
27
- console.log(result);
28
- ```
29
-
30
- ## API
31
-
32
- ### `feature(input: string): string`
33
- Description of the function and its parameters.
34
-
35
- ## Configuration (if applicable)
36
- Explain any configuration options if your package requires setup.
37
-
38
- ## Examples
39
- Provide additional usage examples for clarity.
40
-
41
- ## Contributing
42
- Contributions are welcome! Please follow the guidelines in [CONTRIBUTING.md](./CONTRIBUTING.md).
43
-
44
- ## License
45
-
46
- This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
47
-
48
- ## Links
49
- - [GitHub Repository](https://github.com/your-username/securequ)
50
- - [NPM Package](https://www.npmjs.com/package/securequ)
51
-
52
- ---
53
-
54
- Feel free to modify this template based on your package's specific needs.
1
+ # securequ
2
+
3
+ [![npm version](https://img.shields.io/npm/v/securequ.svg)](https://www.npmjs.com/package/securequ)
4
+ [![License](https://img.shields.io/npm/l/securequ.svg)](https://github.com/your-username/securequ/blob/main/LICENSE)
5
+ [![Downloads](https://img.shields.io/npm/dt/securequ.svg)](https://www.npmjs.com/package/securequ)
6
+
7
+ A brief description of what your package does and its purpose.
8
+
9
+ ## Installation
10
+
11
+ ```sh
12
+ npm install securequ
13
+ ```
14
+
15
+ or with yarn:
16
+
17
+ ```sh
18
+ yarn add securequ
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ ```js
24
+ import { feature } from "securequ";
25
+
26
+ const result = feature("example");
27
+ console.log(result);
28
+ ```
29
+
30
+ ## API
31
+
32
+ ### `feature(input: string): string`
33
+ Description of the function and its parameters.
34
+
35
+ ## Configuration (if applicable)
36
+ Explain any configuration options if your package requires setup.
37
+
38
+ ## Examples
39
+ Provide additional usage examples for clarity.
40
+
41
+ ## Contributing
42
+ Contributions are welcome! Please follow the guidelines in [CONTRIBUTING.md](./CONTRIBUTING.md).
43
+
44
+ ## License
45
+
46
+ This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
47
+
48
+ ## Links
49
+ - [GitHub Repository](https://github.com/your-username/securequ)
50
+ - [NPM Package](https://www.npmjs.com/package/securequ)
51
+
52
+ ---
53
+
54
+ Feel free to modify this template based on your package's specific needs.
package/server/Base.d.ts CHANGED
@@ -1,25 +1,25 @@
1
1
  import Router from './Router.js';
2
2
  import { SecurequServerConfig, UploadFileMeta, HandlerInfo, ArgsInfo } from './types.js';
3
3
 
4
- declare class SecurequServerBase extends Router {
5
- protected config: SecurequServerConfig;
6
- protected secret: string | null;
7
- protected clients: Map<string, string>;
8
- protected uploadMeta: Map<string, UploadFileMeta & {
9
- expire: number;
10
- }>;
11
- constructor(config: SecurequServerConfig);
12
- protected getSecret(): Promise<string>;
13
- protected clientInfo(path: string, origin: string): Promise<{
14
- path: string;
15
- secret: string;
16
- hash: string;
17
- searchParams: {
18
- [key: string]: any;
19
- };
20
- }>;
21
- protected isValidSigneture(signeture: string | undefined, hash: string): Promise<void>;
22
- handleRequest(info: HandlerInfo, args?: ArgsInfo): Promise<void>;
4
+ declare class SecurequServerBase extends Router {
5
+ protected config: SecurequServerConfig;
6
+ protected secret: string | null;
7
+ protected clients: Map<string, string>;
8
+ protected uploadMeta: Map<string, UploadFileMeta & {
9
+ expire: number;
10
+ }>;
11
+ constructor(config: SecurequServerConfig);
12
+ protected getSecret(): Promise<string>;
13
+ protected clientInfo(path: string, origin: string): Promise<{
14
+ path: string;
15
+ secret: string;
16
+ hash: string;
17
+ searchParams: {
18
+ [key: string]: any;
19
+ };
20
+ }>;
21
+ protected isValidSigneture(signeture: string | undefined, hash: string): Promise<void>;
22
+ handleRequest(info: HandlerInfo, args?: ArgsInfo): Promise<void>;
23
23
  }
24
24
 
25
25
  export { SecurequServerBase as default };
package/server/Base.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("../include/crypto.js"),e=require("./Router.js");class s extends e.default{constructor(t){if(super(),this.secret=null,this.clients=new Map,this.uploadMeta=new Map,!t.basepath)throw new Error("Basepath is required");if(!t.clients||0===Object.keys(t.clients).length)throw new Error("Atleast one client is required");t.basepath.startsWith("/")||(t.basepath=`/${t.basepath}`),t.basepath.endsWith("/")&&(t.basepath=t.basepath.substring(0,t.basepath.length-1)),this.config=t;for(let t of this.config.clients)this.clients.set(t.origin,t.secret)}async getSecret(){return this.secret||(this.secret=await t.default.hash(Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15))),this.secret}async clientInfo(e,s){let a=e.split("?");const i=(e=(e=(e=(e=a[0]).replace(this.config.basepath+"/","")).endsWith("/")?e.substring(0,e.length-1):e).startsWith("/")?e.substring(1):e).split("/"),n=i.shift();if(!(null==n?void 0:n.length)||!this.clients.has(s))throw new Response("Client not allowed",{status:403});let r=this.clients.get(s).substring(0,n.length),h={};return a.length>1&&(h=await t.default.decrypt(decodeURIComponent(a[1]),r)),{path:"/"+i.join("/"),secret:r,hash:n,searchParams:h}}async isValidSigneture(e,s){const a=await this.getSecret();if(this.secret&&e){let i=await t.default.decrypt(e,a),n=i.hash===s,r=i.expire>Date.now();if(!n)throw new Response("Invalid Signeture",{status:403});if(!r)throw new Response("Signeture Expired",{status:403})}}async handleRequest(t,e){if(this.config.accept){if(!await this.config.accept(t,e))throw new Response("Request not accepted",{status:403})}const{path:s,method:a}=t;let i=Object.values(this.routes[a]);for(let{test:a,handler:n}of i){const i=a(s);i&&await n(Object.assign(Object.assign({},t),{params:i.params}),e)}}}exports.default=s;//# sourceMappingURL=Base.js.map
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,!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.upload&&(e.upload.maxFilesize=e.upload.maxFilesize||51200,e.upload.checkFileType=e.upload.checkFileType||!0),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 a="/"!==t&&"development"===this.config.mode;let i=t.split("?");const n=(t=(t=(t=(t=i[0]).replace(this.config.basepath+"/","")).endsWith("/")?t.substring(0,t.length-1):t).startsWith("/")?t.substring(1):t).split("/"),r=n.shift();if(!(null==r?void 0:r.length)||!this.clients.has(s))throw new Response("Client not allowed",{status:403});let o=this.clients.get(s).substring(0,r.length),h={};return i.length>1&&(h=a?Object.fromEntries(new URLSearchParams(decodeURIComponent(i[1]))):await e.default.decrypt(decodeURIComponent(i[1]),o)),{path:"/"+n.join("/"),secret:o,hash:r,searchParams:h}}async isValidSigneture(t,s){const a=await this.getSecret();if(this.secret&&t){let i=await e.default.decrypt(t,a),n=i.hash===s,r=i.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:a}=e;let i=Object.values(this.routes[a]);for(let{test:a,handler:n}of i){const i=a(s);i&&await n(Object.assign(Object.assign({},e),{params:i.params}),t)}}}exports.default=s;//# sourceMappingURL=Base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Base.js","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport Router from \"./Router\";\r\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, ArgsInfo } from \"./types\";\r\n\r\nclass SecurequServerBase extends Router {\r\n protected config: SecurequServerConfig;\r\n protected secret: string | null = null\r\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\r\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\r\n\r\n constructor(config: SecurequServerConfig) {\r\n super()\r\n if (!config.basepath) throw new Error(\"Basepath is required\");\r\n if (!config.clients || Object.keys(config.clients).length === 0) throw new Error(\"Atleast one client is required\");\r\n if (!config.basepath.startsWith(\"/\")) config.basepath = `/${config.basepath}`;\r\n if (config.basepath.endsWith(\"/\")) config.basepath = config.basepath.substring(0, config.basepath.length - 1);\r\n this.config = config\r\n for (let client of this.config.clients) {\r\n this.clients.set(client.origin, client.secret)\r\n }\r\n }\r\n\r\n protected async getSecret() {\r\n if (!this.secret) {\r\n this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15))\r\n }\r\n return this.secret\r\n }\r\n\r\n protected async clientInfo(path: string, origin: string) {\r\n let splitUrl = path.split(\"?\")\r\n path = splitUrl[0]\r\n path = path.replace(this.config.basepath + \"/\", \"\")\r\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\r\n path = path.startsWith('/') ? path.substring(1) : path\r\n\r\n const split = path.split(\"/\")\r\n const hash = split.shift()\r\n if (!hash?.length || !this.clients.has(origin)) throw new Response(\"Client not allowed\", { status: 403 });\r\n let client = this.clients.get(origin as string) as string;\r\n let secret = client.substring(0, hash.length as number);\r\n\r\n let searchParams: { [key: string]: any } = {}\r\n if (splitUrl.length > 1) {\r\n searchParams = await crypto.decrypt(decodeURIComponent(splitUrl[1]), secret) as any\r\n }\r\n\r\n return {\r\n path: \"/\" + split.join('/'),\r\n secret,\r\n hash,\r\n searchParams\r\n }\r\n }\r\n\r\n protected async isValidSigneture(signeture: string | undefined, hash: string) {\r\n const serverSecret = await this.getSecret()\r\n if (this.secret && signeture) {\r\n let info: any = await crypto.decrypt(signeture, serverSecret)\r\n let isHashValid = info.hash === hash\r\n let isNotExpired = info.expire > Date.now()\r\n if (!isHashValid) throw new Response(\"Invalid Signeture\", { status: 403 });\r\n if (!isNotExpired) throw new Response(\"Signeture Expired\", { status: 403 });\r\n }\r\n }\r\n\r\n async handleRequest(info: HandlerInfo, args?: ArgsInfo) {\r\n if (this.config.accept) {\r\n const is = await this.config.accept(info, args)\r\n if (!is) throw new Response(\"Request not accepted\", { status: 403 })\r\n }\r\n\r\n const { path, method } = info;\r\n let values: any = Object.values(this.routes[method]);\r\n for (let { test, handler } of values) {\r\n const match = test(path)\r\n if (match) {\r\n await handler({ ...info, params: match.params }, args)\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default SecurequServerBase;"],"names":["SecurequServerBase","Router","constructor","config","super","this","secret","clients","Map","uploadMeta","basepath","Error","Object","keys","length","startsWith","endsWith","substring","client","set","origin","getSecret","crypto","hash","Math","random","toString","clientInfo","path","splitUrl","split","replace","shift","has","Response","status","get","searchParams","decrypt","decodeURIComponent","join","isValidSigneture","signeture","serverSecret","info","isHashValid","isNotExpired","expire","Date","now","handleRequest","args","accept","method","values","routes","test","handler","match","assign","params","exports","default"],"mappings":"mIAIA,MAAMA,UAA2BC,EAAAA,QAM9B,WAAAC,CAAYC,GAET,GADAC,QALOC,KAAAC,OAAwB,KACxBD,KAAAE,QAAU,IAAIC,IACdH,KAAAI,WAAa,IAAID,KAInBL,EAAOO,SAAU,MAAM,IAAIC,MAAM,wBACtC,IAAKR,EAAOI,SAAkD,IAAvCK,OAAOC,KAAKV,EAAOI,SAASO,OAAc,MAAM,IAAIH,MAAM,kCAC5ER,EAAOO,SAASK,WAAW,OAAMZ,EAAOO,SAAW,IAAIP,EAAOO,YAC/DP,EAAOO,SAASM,SAAS,OAAMb,EAAOO,SAAWP,EAAOO,SAASO,UAAU,EAAGd,EAAOO,SAASI,OAAS,IAC3GT,KAAKF,OAASA,EACd,IAAK,IAAIe,KAAUb,KAAKF,OAAOI,QAC5BF,KAAKE,QAAQY,IAAID,EAAOE,OAAQF,EAAOZ,OAE7C,CAEU,eAAMe,GAIb,OAHKhB,KAAKC,SACPD,KAAKC,aAAegB,EAAAA,QAAOC,KAAKC,KAAKC,SAASC,SAAS,IAAIT,UAAU,EAAG,IAAMO,KAAKC,SAASC,SAAS,IAAIT,UAAU,EAAG,MAElHZ,KAAKC,MACf,CAEU,gBAAMqB,CAAWC,EAAcR,GACtC,IAAIS,EAAWD,EAAKE,MAAM,KAM1B,MAAMA,GAFNF,GADAA,GADAA,GADAA,EAAOC,EAAS,IACJE,QAAQ1B,KAAKF,OAAOO,SAAW,IAAK,KACpCM,SAAS,KAAOY,EAAKX,UAAU,EAAGW,EAAKd,OAAS,GAAKc,GACrDb,WAAW,KAAOa,EAAKX,UAAU,GAAKW,GAE/BE,MAAM,KACnBP,EAAOO,EAAME,QACnB,KAAKT,aAAI,EAAJA,EAAMT,UAAWT,KAAKE,QAAQ0B,IAAIb,GAAS,MAAM,IAAIc,SAAS,qBAAsB,CAAEC,OAAQ,MACnG,IACI7B,EADSD,KAAKE,QAAQ6B,IAAIhB,GACVH,UAAU,EAAGM,EAAKT,QAElCuB,EAAuC,CAAA,EAK3C,OAJIR,EAASf,OAAS,IACnBuB,QAAqBf,EAAAA,QAAOgB,QAAQC,mBAAmBV,EAAS,IAAKvB,IAGjE,CACJsB,KAAM,IAAME,EAAMU,KAAK,KACvBlC,SACAiB,OACAc,eAEN,CAEU,sBAAMI,CAAiBC,EAA+BnB,GAC7D,MAAMoB,QAAqBtC,KAAKgB,YAChC,GAAIhB,KAAKC,QAAUoC,EAAW,CAC3B,IAAIE,QAAkBtB,EAAAA,QAAOgB,QAAQI,EAAWC,GAC5CE,EAAcD,EAAKrB,OAASA,EAC5BuB,EAAeF,EAAKG,OAASC,KAAKC,MACtC,IAAKJ,EAAa,MAAM,IAAIX,SAAS,oBAAqB,CAAEC,OAAQ,MACpE,IAAKW,EAAc,MAAM,IAAIZ,SAAS,oBAAqB,CAAEC,OAAQ,KACvE,CACJ,CAEA,mBAAMe,CAAcN,EAAmBO,GACpC,GAAI9C,KAAKF,OAAOiD,OAAQ,CAErB,UADiB/C,KAAKF,OAAOiD,OAAOR,EAAMO,GACjC,MAAM,IAAIjB,SAAS,uBAAwB,CAAEC,OAAQ,KAChE,CAED,MAAMP,KAAEA,EAAIyB,OAAEA,GAAWT,EACzB,IAAIU,EAAc1C,OAAO0C,OAAOjD,KAAKkD,OAAOF,IAC5C,IAAK,IAAIG,KAAEA,EAAIC,QAAEA,KAAaH,EAAQ,CACnC,MAAMI,EAAQF,EAAK5B,GACf8B,SACKD,EAAO7C,OAAA+C,OAAA/C,OAAA+C,OAAA,CAAA,EAAMf,GAAI,CAAEgB,OAAQF,EAAME,SAAUT,EAEtD,CACJ,EAEFU,QAAAC,QAAA9D"}
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, ArgsInfo } 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\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.upload) {\n config.upload.maxFilesize = config.upload.maxFilesize || 50 * 1024 // 50MB default\n config.upload.checkFileType = config.upload.checkFileType || true\n }\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 if (!hash?.length || !this.clients.has(origin)) throw new Response(\"Client not allowed\", { status: 403 });\n let client = this.clients.get(origin as string) as string;\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, args?: ArgsInfo) {\n if (this.config.accept) {\n const is = await this.config.accept(info, args)\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 }, args)\n }\n }\n }\n\n}\n\nexport default SecurequServerBase;"],"names":["SecurequServerBase","Router","constructor","config","super","this","secret","clients","Map","uploadMeta","basepath","Error","Object","keys","length","startsWith","endsWith","substring","upload","maxFilesize","checkFileType","client","set","origin","getSecret","crypto","hash","Math","random","toString","clientInfo","path","isDev","mode","splitUrl","split","replace","shift","has","Response","status","get","searchParams","fromEntries","URLSearchParams","decodeURIComponent","decrypt","join","isValidSigneture","signeture","serverSecret","info","isHashValid","isNotExpired","expire","Date","now","handleRequest","args","accept","method","values","routes","test","handler","match","assign","params","exports","default"],"mappings":"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"}
package/server/Base.mjs CHANGED
@@ -1 +1 @@
1
- import t from"../include/crypto.mjs";import e from"./Router.mjs";class s extends e{constructor(t){if(super(),this.secret=null,this.clients=new Map,this.uploadMeta=new Map,!t.basepath)throw new Error("Basepath is required");if(!t.clients||0===Object.keys(t.clients).length)throw new Error("Atleast one client is required");t.basepath.startsWith("/")||(t.basepath=`/${t.basepath}`),t.basepath.endsWith("/")&&(t.basepath=t.basepath.substring(0,t.basepath.length-1)),this.config=t;for(let t of this.config.clients)this.clients.set(t.origin,t.secret)}async getSecret(){return this.secret||(this.secret=await t.hash(Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15))),this.secret}async clientInfo(e,s){let i=e.split("?");const a=(e=(e=(e=(e=i[0]).replace(this.config.basepath+"/","")).endsWith("/")?e.substring(0,e.length-1):e).startsWith("/")?e.substring(1):e).split("/"),n=a.shift();if(!(null==n?void 0:n.length)||!this.clients.has(s))throw new Response("Client not allowed",{status:403});let r=this.clients.get(s).substring(0,n.length),h={};return i.length>1&&(h=await t.decrypt(decodeURIComponent(i[1]),r)),{path:"/"+a.join("/"),secret:r,hash:n,searchParams:h}}async isValidSigneture(e,s){const i=await this.getSecret();if(this.secret&&e){let a=await t.decrypt(e,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(t,e){if(this.config.accept){if(!await this.config.accept(t,e))throw new Response("Request not accepted",{status:403})}const{path:s,method:i}=t;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({},t),{params:a.params}),e)}}}export{s as default};//# sourceMappingURL=Base.mjs.map
1
+ import t from"../include/crypto.mjs";import e from"./Router.mjs";class s extends e{constructor(t){if(super(),this.secret=null,this.clients=new Map,this.uploadMeta=new Map,!t.basepath)throw new Error("Basepath is required");if(!t.clients||0===Object.keys(t.clients).length)throw new Error("Atleast one client is required");t.basepath.startsWith("/")||(t.basepath=`/${t.basepath}`),t.basepath.endsWith("/")&&(t.basepath=t.basepath.substring(0,t.basepath.length-1)),t.upload&&(t.upload.maxFilesize=t.upload.maxFilesize||51200,t.upload.checkFileType=t.upload.checkFileType||!0),this.config=t;for(let t of this.config.clients)this.clients.set(t.origin,t.secret)}async getSecret(){return this.secret||(this.secret=await t.hash(Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15))),this.secret}async clientInfo(e,s){const i="/"!==e&&"development"===this.config.mode;let a=e.split("?");const n=(e=(e=(e=(e=a[0]).replace(this.config.basepath+"/","")).endsWith("/")?e.substring(0,e.length-1):e).startsWith("/")?e.substring(1):e).split("/"),r=n.shift();if(!(null==r?void 0:r.length)||!this.clients.has(s))throw new Response("Client not allowed",{status:403});let o=this.clients.get(s).substring(0,r.length),h={};return a.length>1&&(h=i?Object.fromEntries(new URLSearchParams(decodeURIComponent(a[1]))):await t.decrypt(decodeURIComponent(a[1]),o)),{path:"/"+n.join("/"),secret:o,hash:r,searchParams:h}}async isValidSigneture(e,s){const i=await this.getSecret();if(this.secret&&e){let a=await t.decrypt(e,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(t,e){if(this.config.accept){if(!await this.config.accept(t,e))throw new Response("Request not accepted",{status:403})}const{path:s,method:i}=t;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({},t),{params:a.params}),e)}}}export{s as default};//# sourceMappingURL=Base.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Base.mjs","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport Router from \"./Router\";\r\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, ArgsInfo } from \"./types\";\r\n\r\nclass SecurequServerBase extends Router {\r\n protected config: SecurequServerConfig;\r\n protected secret: string | null = null\r\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\r\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\r\n\r\n constructor(config: SecurequServerConfig) {\r\n super()\r\n if (!config.basepath) throw new Error(\"Basepath is required\");\r\n if (!config.clients || Object.keys(config.clients).length === 0) throw new Error(\"Atleast one client is required\");\r\n if (!config.basepath.startsWith(\"/\")) config.basepath = `/${config.basepath}`;\r\n if (config.basepath.endsWith(\"/\")) config.basepath = config.basepath.substring(0, config.basepath.length - 1);\r\n this.config = config\r\n for (let client of this.config.clients) {\r\n this.clients.set(client.origin, client.secret)\r\n }\r\n }\r\n\r\n protected async getSecret() {\r\n if (!this.secret) {\r\n this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15))\r\n }\r\n return this.secret\r\n }\r\n\r\n protected async clientInfo(path: string, origin: string) {\r\n let splitUrl = path.split(\"?\")\r\n path = splitUrl[0]\r\n path = path.replace(this.config.basepath + \"/\", \"\")\r\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\r\n path = path.startsWith('/') ? path.substring(1) : path\r\n\r\n const split = path.split(\"/\")\r\n const hash = split.shift()\r\n if (!hash?.length || !this.clients.has(origin)) throw new Response(\"Client not allowed\", { status: 403 });\r\n let client = this.clients.get(origin as string) as string;\r\n let secret = client.substring(0, hash.length as number);\r\n\r\n let searchParams: { [key: string]: any } = {}\r\n if (splitUrl.length > 1) {\r\n searchParams = await crypto.decrypt(decodeURIComponent(splitUrl[1]), secret) as any\r\n }\r\n\r\n return {\r\n path: \"/\" + split.join('/'),\r\n secret,\r\n hash,\r\n searchParams\r\n }\r\n }\r\n\r\n protected async isValidSigneture(signeture: string | undefined, hash: string) {\r\n const serverSecret = await this.getSecret()\r\n if (this.secret && signeture) {\r\n let info: any = await crypto.decrypt(signeture, serverSecret)\r\n let isHashValid = info.hash === hash\r\n let isNotExpired = info.expire > Date.now()\r\n if (!isHashValid) throw new Response(\"Invalid Signeture\", { status: 403 });\r\n if (!isNotExpired) throw new Response(\"Signeture Expired\", { status: 403 });\r\n }\r\n }\r\n\r\n async handleRequest(info: HandlerInfo, args?: ArgsInfo) {\r\n if (this.config.accept) {\r\n const is = await this.config.accept(info, args)\r\n if (!is) throw new Response(\"Request not accepted\", { status: 403 })\r\n }\r\n\r\n const { path, method } = info;\r\n let values: any = Object.values(this.routes[method]);\r\n for (let { test, handler } of values) {\r\n const match = test(path)\r\n if (match) {\r\n await handler({ ...info, params: match.params }, args)\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default SecurequServerBase;"],"names":["SecurequServerBase","Router","constructor","config","super","this","secret","clients","Map","uploadMeta","basepath","Error","Object","keys","length","startsWith","endsWith","substring","client","set","origin","getSecret","crypto","hash","Math","random","toString","clientInfo","path","splitUrl","split","replace","shift","has","Response","status","get","searchParams","decrypt","decodeURIComponent","join","isValidSigneture","signeture","serverSecret","info","isHashValid","isNotExpired","expire","Date","now","handleRequest","args","accept","method","values","routes","test","handler","match","assign","params"],"mappings":"iEAIA,MAAMA,UAA2BC,EAM9B,WAAAC,CAAYC,GAET,GADAC,QALOC,KAAAC,OAAwB,KACxBD,KAAAE,QAAU,IAAIC,IACdH,KAAAI,WAAa,IAAID,KAInBL,EAAOO,SAAU,MAAM,IAAIC,MAAM,wBACtC,IAAKR,EAAOI,SAAkD,IAAvCK,OAAOC,KAAKV,EAAOI,SAASO,OAAc,MAAM,IAAIH,MAAM,kCAC5ER,EAAOO,SAASK,WAAW,OAAMZ,EAAOO,SAAW,IAAIP,EAAOO,YAC/DP,EAAOO,SAASM,SAAS,OAAMb,EAAOO,SAAWP,EAAOO,SAASO,UAAU,EAAGd,EAAOO,SAASI,OAAS,IAC3GT,KAAKF,OAASA,EACd,IAAK,IAAIe,KAAUb,KAAKF,OAAOI,QAC5BF,KAAKE,QAAQY,IAAID,EAAOE,OAAQF,EAAOZ,OAE7C,CAEU,eAAMe,GAIb,OAHKhB,KAAKC,SACPD,KAAKC,aAAegB,EAAOC,KAAKC,KAAKC,SAASC,SAAS,IAAIT,UAAU,EAAG,IAAMO,KAAKC,SAASC,SAAS,IAAIT,UAAU,EAAG,MAElHZ,KAAKC,MACf,CAEU,gBAAMqB,CAAWC,EAAcR,GACtC,IAAIS,EAAWD,EAAKE,MAAM,KAM1B,MAAMA,GAFNF,GADAA,GADAA,GADAA,EAAOC,EAAS,IACJE,QAAQ1B,KAAKF,OAAOO,SAAW,IAAK,KACpCM,SAAS,KAAOY,EAAKX,UAAU,EAAGW,EAAKd,OAAS,GAAKc,GACrDb,WAAW,KAAOa,EAAKX,UAAU,GAAKW,GAE/BE,MAAM,KACnBP,EAAOO,EAAME,QACnB,KAAKT,aAAI,EAAJA,EAAMT,UAAWT,KAAKE,QAAQ0B,IAAIb,GAAS,MAAM,IAAIc,SAAS,qBAAsB,CAAEC,OAAQ,MACnG,IACI7B,EADSD,KAAKE,QAAQ6B,IAAIhB,GACVH,UAAU,EAAGM,EAAKT,QAElCuB,EAAuC,CAAA,EAK3C,OAJIR,EAASf,OAAS,IACnBuB,QAAqBf,EAAOgB,QAAQC,mBAAmBV,EAAS,IAAKvB,IAGjE,CACJsB,KAAM,IAAME,EAAMU,KAAK,KACvBlC,SACAiB,OACAc,eAEN,CAEU,sBAAMI,CAAiBC,EAA+BnB,GAC7D,MAAMoB,QAAqBtC,KAAKgB,YAChC,GAAIhB,KAAKC,QAAUoC,EAAW,CAC3B,IAAIE,QAAkBtB,EAAOgB,QAAQI,EAAWC,GAC5CE,EAAcD,EAAKrB,OAASA,EAC5BuB,EAAeF,EAAKG,OAASC,KAAKC,MACtC,IAAKJ,EAAa,MAAM,IAAIX,SAAS,oBAAqB,CAAEC,OAAQ,MACpE,IAAKW,EAAc,MAAM,IAAIZ,SAAS,oBAAqB,CAAEC,OAAQ,KACvE,CACJ,CAEA,mBAAMe,CAAcN,EAAmBO,GACpC,GAAI9C,KAAKF,OAAOiD,OAAQ,CAErB,UADiB/C,KAAKF,OAAOiD,OAAOR,EAAMO,GACjC,MAAM,IAAIjB,SAAS,uBAAwB,CAAEC,OAAQ,KAChE,CAED,MAAMP,KAAEA,EAAIyB,OAAEA,GAAWT,EACzB,IAAIU,EAAc1C,OAAO0C,OAAOjD,KAAKkD,OAAOF,IAC5C,IAAK,IAAIG,KAAEA,EAAIC,QAAEA,KAAaH,EAAQ,CACnC,MAAMI,EAAQF,EAAK5B,GACf8B,SACKD,EAAO7C,OAAA+C,OAAA/C,OAAA+C,OAAA,CAAA,EAAMf,GAAI,CAAEgB,OAAQF,EAAME,SAAUT,EAEtD,CACJ,SAEFnD"}
1
+ {"version":3,"file":"Base.mjs","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, ArgsInfo } 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\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.upload) {\n config.upload.maxFilesize = config.upload.maxFilesize || 50 * 1024 // 50MB default\n config.upload.checkFileType = config.upload.checkFileType || true\n }\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 if (!hash?.length || !this.clients.has(origin)) throw new Response(\"Client not allowed\", { status: 403 });\n let client = this.clients.get(origin as string) as string;\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, args?: ArgsInfo) {\n if (this.config.accept) {\n const is = await this.config.accept(info, args)\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 }, args)\n }\n }\n }\n\n}\n\nexport default SecurequServerBase;"],"names":["SecurequServerBase","Router","constructor","config","super","this","secret","clients","Map","uploadMeta","basepath","Error","Object","keys","length","startsWith","endsWith","substring","upload","maxFilesize","checkFileType","client","set","origin","getSecret","crypto","hash","Math","random","toString","clientInfo","path","isDev","mode","splitUrl","split","replace","shift","has","Response","status","get","searchParams","fromEntries","URLSearchParams","decodeURIComponent","decrypt","join","isValidSigneture","signeture","serverSecret","info","isHashValid","isNotExpired","expire","Date","now","handleRequest","args","accept","method","values","routes","test","handler","match","assign","params"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { RouteFactory, HTTPMethods, HandlerFunction } from './types.js';
2
2
 
3
- declare class Router {
4
- protected routes: RouteFactory;
5
- addRoute(path: string, method: HTTPMethods, handler: HandlerFunction): Promise<void>;
6
- get(path: string, handler: HandlerFunction): Promise<void>;
7
- post(path: string, handler: HandlerFunction): Promise<void>;
8
- put(path: string, handler: HandlerFunction): Promise<void>;
9
- delete(path: string, handler: HandlerFunction): Promise<void>;
3
+ declare class Router {
4
+ protected routes: RouteFactory;
5
+ addRoute(path: string, method: HTTPMethods, handler: HandlerFunction): Promise<void>;
6
+ get(path: string, handler: HandlerFunction): Promise<void>;
7
+ post(path: string, handler: HandlerFunction): Promise<void>;
8
+ put(path: string, handler: HandlerFunction): Promise<void>;
9
+ delete(path: string, handler: HandlerFunction): Promise<void>;
10
10
  }
11
11
 
12
12
  export { Router as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Router.js","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HandlerFunction, HTTPMethods, RouteFactory } from \"./types\"\r\nimport { match } from \"path-to-regexp\";\r\n\r\nclass Router {\r\n protected routes: RouteFactory = {\r\n GET: {},\r\n POST: {},\r\n PUT: {},\r\n DELETE: {}\r\n };\r\n\r\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\r\n if (this.routes[method][path]) return\r\n this.routes[method][path] = {\r\n handler,\r\n test: match(path)\r\n }\r\n }\r\n\r\n async get(path: string, handler: HandlerFunction) {\r\n this.addRoute(path, 'GET', handler)\r\n }\r\n\r\n async post(path: string, handler: HandlerFunction) {\r\n this.addRoute(path, 'POST', handler)\r\n }\r\n\r\n async put(path: string, handler: HandlerFunction) {\r\n this.addRoute(path, 'PUT', handler)\r\n }\r\n\r\n async delete(path: string, handler: HandlerFunction) {\r\n this.addRoute(path, 'DELETE', handler)\r\n }\r\n}\r\n\r\nexport default Router;"],"names":["Object","defineProperty","exports","value","pathToRegexp","require","default","constructor","this","routes","GET","POST","PUT","DELETE","addRoute","path","method","handler","test","match","get","post","put"],"mappings":"AAGA,aAAAA,OAAAC,eAAAC,QAAA,aAAA,CAAAC,OAAA,IAAA,IAAAC,EAAAC,QAAA,kBA+BCH,QAAAI,QA/BD,MAAA,WAAAC,GACaC,KAAAC,OAAuB,CAC9BC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,OAAQ,CAAA,EA0Bd,CAvBG,cAAMC,CAASC,EAAcC,EAAqBC,GAC3CT,KAAKC,OAAOO,GAAQD,KACxBP,KAAKC,OAAOO,GAAQD,GAAQ,CACzBE,UACAC,KAAMC,EAAAA,MAAMJ,IAElB,CAEA,SAAMK,CAAIL,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,UAAMI,CAAKN,EAAcE,GACtBT,KAAKM,SAASC,EAAM,OAAQE,EAC/B,CAEA,SAAMK,CAAIP,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,YAAM,CAAOF,EAAcE,GACxBT,KAAKM,SAASC,EAAM,SAAUE,EACjC"}
1
+ {"version":3,"file":"Router.js","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HandlerFunction, HTTPMethods, RouteFactory } from \"./types\"\nimport { match } from \"path-to-regexp\";\n\nclass Router {\n protected routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n}\n\nexport default Router;"],"names":["Object","defineProperty","exports","value","pathToRegexp","require","default","constructor","this","routes","GET","POST","PUT","DELETE","addRoute","path","method","handler","test","match","get","post","put"],"mappings":"AAGA,aAAAA,OAAAC,eAAAC,QAAA,aAAA,CAAAC,OAAA,IAAA,IAAAC,EAAAC,QAAA,kBA+BCH,QAAAI,QA/BD,MAAA,WAAAC,GACaC,KAAAC,OAAuB,CAC9BC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,OAAQ,CAAA,EA0Bd,CAvBG,cAAMC,CAASC,EAAcC,EAAqBC,GAC3CT,KAAKC,OAAOO,GAAQD,KACxBP,KAAKC,OAAOO,GAAQD,GAAQ,CACzBE,UACAC,KAAMC,EAAAA,MAAMJ,IAElB,CAEA,SAAMK,CAAIL,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,UAAMI,CAAKN,EAAcE,GACtBT,KAAKM,SAASC,EAAM,OAAQE,EAC/B,CAEA,SAAMK,CAAIP,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,YAAM,CAAOF,EAAcE,GACxBT,KAAKM,SAASC,EAAM,SAAUE,EACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Router.mjs","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HandlerFunction, HTTPMethods, RouteFactory } from \"./types\"\r\nimport { match } from \"path-to-regexp\";\r\n\r\nclass Router {\r\n protected routes: RouteFactory = {\r\n GET: {},\r\n POST: {},\r\n PUT: {},\r\n DELETE: {}\r\n };\r\n\r\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\r\n if (this.routes[method][path]) return\r\n this.routes[method][path] = {\r\n handler,\r\n test: match(path)\r\n }\r\n }\r\n\r\n async get(path: string, handler: HandlerFunction) {\r\n this.addRoute(path, 'GET', handler)\r\n }\r\n\r\n async post(path: string, handler: HandlerFunction) {\r\n this.addRoute(path, 'POST', handler)\r\n }\r\n\r\n async put(path: string, handler: HandlerFunction) {\r\n this.addRoute(path, 'PUT', handler)\r\n }\r\n\r\n async delete(path: string, handler: HandlerFunction) {\r\n this.addRoute(path, 'DELETE', handler)\r\n }\r\n}\r\n\r\nexport default Router;"],"names":["match","Router","constructor","this","routes","GET","POST","PUT","DELETE","addRoute","path","method","handler","test","get","post","put"],"mappings":"gBAGAA,MAAA,iBAAA,MAAMC,EAAN,WAAAC,GACaC,KAAAC,OAAuB,CAC9BC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,OAAQ,CAAA,EA0Bd,CAvBG,cAAMC,CAASC,EAAcC,EAAqBC,GAC3CT,KAAKC,OAAOO,GAAQD,KACxBP,KAAKC,OAAOO,GAAQD,GAAQ,CACzBE,UACAC,KAAMb,EAAMU,IAElB,CAEA,SAAMI,CAAIJ,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,UAAMG,CAAKL,EAAcE,GACtBT,KAAKM,SAASC,EAAM,OAAQE,EAC/B,CAEA,SAAMI,CAAIN,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,YAAM,CAAOF,EAAcE,GACxBT,KAAKM,SAASC,EAAM,SAAUE,EACjC,SACFX"}
1
+ {"version":3,"file":"Router.mjs","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HandlerFunction, HTTPMethods, RouteFactory } from \"./types\"\nimport { match } from \"path-to-regexp\";\n\nclass Router {\n protected routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n}\n\nexport default Router;"],"names":["match","Router","constructor","this","routes","GET","POST","PUT","DELETE","addRoute","path","method","handler","test","get","post","put"],"mappings":"gBAGAA,MAAA,iBAAA,MAAMC,EAAN,WAAAC,GACaC,KAAAC,OAAuB,CAC9BC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,OAAQ,CAAA,EA0Bd,CAvBG,cAAMC,CAASC,EAAcC,EAAqBC,GAC3CT,KAAKC,OAAOO,GAAQD,KACxBP,KAAKC,OAAOO,GAAQD,GAAQ,CACzBE,UACAC,KAAMb,EAAMU,IAElB,CAEA,SAAMI,CAAIJ,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,UAAMG,CAAKL,EAAcE,GACtBT,KAAKM,SAASC,EAAM,OAAQE,EAC/B,CAEA,SAAMI,CAAIN,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,YAAM,CAAOF,EAAcE,GACxBT,KAAKM,SAASC,EAAM,SAAUE,EACjC,SACFX"}
package/server/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { ArgsInfo, ListenerInfo, ServerResponse } from './types.js';
2
2
  import SecurequServerBase from './Base.js';
3
3
 
4
- declare class SecurequServer extends SecurequServerBase {
5
- handshake(data: any, clientInfo: any): Promise<void>;
6
- upload(data: any, clientInfo: any, signeture: string, args?: ArgsInfo): Promise<void>;
7
- listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse>;
4
+ declare class SecurequServer extends SecurequServerBase {
5
+ handshake(body: any, clientInfo: any): Promise<void>;
6
+ upload(body: any, clientInfo: any, signeture: string, args?: ArgsInfo): Promise<void>;
7
+ listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse>;
8
8
  }
9
9
 
10
10
  export { SecurequServer as default };
package/server/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../include/crypto.js"),t=require("./Base.js");class a extends t.default{async handshake(t,a){const i=await this.getSecret();if(!t)throw new Error("Invalid handshake data");if(t.hash!==a.hash)throw new Error("Invalid handshake");if(t.secret!==a.secret)throw new Error("Invalid handshake secret");if(Date.now()-t.clientTime>3e4)throw new Error("Handshake expired");const s=new Date;throw{timeDiffarenc:new Date(t.clientTime).getTime()-s.getTime(),signeture:await e.default.encrypt({expire:Date.now()+3e4,hash:a.hash},i)}}async upload(t,a,i,s){var n,o;const r=await e.default.decrypt(i,a.secret);if(await this.isValidSigneture(r.signeture,a.hash),!(null===(n=this.config.upload)||void 0===n?void 0:n.chunk)||!(null===(o=this.config.upload)||void 0===o?void 0:o.complete))throw new Response("Upload not supported",{status:403});if("failed"===(null==t?void 0:t.type)){const e=this.uploadMeta.get(t.fileid);throw e&&this.config.upload.failed?(await this.config.upload.failed(e,s),this.uploadMeta.delete(t.fileid),{success:!0}):new Response("Invalid upload",{status:400})}if("meta"===t.type)throw this.uploadMeta.set(t.fileid,Object.assign(Object.assign({},t),{expire:Date.now()+36e5})),this.uploadMeta.forEach((e,t)=>{e.expire<Date.now()&&this.uploadMeta.delete(t)}),t;{const{chunk:e,fileId:a,chunkIndex:i}=t,n=this.uploadMeta.get(a);if(!n)throw new Response("Invalid upload meta",{status:400});const o=this.config.upload;if(await o.chunk(e,{filename:n.filename,filesize:n.filesize,filetype:n.filetype,fileid:n.fileid,totalChunks:n.totalChunks,chunkIndex:i},s),i+1===n.totalChunks){const e=await o.complete(n,s);throw this.uploadMeta.delete(a),e}throw t}}async listen({path:t,body:a,method:i,origin:s,signeture:n},o){let r=await this.clientInfo(t,s);const d=a?await e.default.decryptBuffer(a,r.secret):null;t=r.path;try{if("/"===t){if(!["POST","PUT"].includes(i))throw new Response("Invalid method",{status:405});"POST"===i?await this.handshake(d,r):await this.upload(d,r,n,o)}const a=await e.default.decrypt(n,r.secret);if(await this.isValidSigneture(a.signeture,r.hash),a.expire<Date.now())throw new Response("Request expired",{status:403});await this.handleRequest({method:i,path:t,body:d,searchParams:r.searchParams,params:{}},o)}catch(t){const a=t instanceof Error,i=t instanceof Response;let s=a?t.message:i?await t.text():t;return{status:a?404:(null==t?void 0:t.status)||200,content:await e.default.encryptBuffer(s,r.secret)}}return{status:404,content:await e.default.encryptBuffer("Not found",r.secret)}}}exports.default=a;//# sourceMappingURL=index.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../include/crypto.js"),t=require("./Base.js"),i=require("../include/FileScaner.js");class a extends t.default{async handshake(t,i){var a,s;const n=await e.default.decryptBuffer(t,i.secret),o=await this.getSecret();if(!n)throw new Error("Invalid handshake data");if(n.hash!==i.hash)throw new Error("Invalid handshake");if(n.secret!==i.secret)throw new Error("Invalid handshake secret");if(Date.now()-n.clientTime>3e4)throw new Error("Handshake expired");const l=new Date;throw{timeDiffarenc:new Date(n.clientTime).getTime()-l.getTime(),maxFileSize:(null===(a=this.config.upload)||void 0===a?void 0:a.maxFilesize)||null,dev:"development"===this.config.mode,checkFileType:(null===(s=this.config.upload)||void 0===s?void 0:s.checkFileType)||!1,signeture:await e.default.encrypt({expire:Date.now()+3e4,hash:i.hash},o)}}async upload(t,a,s,n){var o;const l=await e.default.decryptBuffer(t,a.secret),r=await e.default.decrypt(s,a.secret);await this.isValidSigneture(r.signeture,a.hash);const d=this.config.upload;if(!(null==d?void 0:d.chunk)||!(null==d?void 0:d.complete))throw new Response("Upload not supported",{status:403});if("failed"===(null==l?void 0:l.type)){const e=this.uploadMeta.get(l.fileid);throw e&&d.failed?(await d.failed(e,n),this.uploadMeta.delete(l.fileid),{success:!0}):new Response("Invalid upload",{status:400})}if("meta"===l.type){if((null==d?void 0:d.maxFilesize)&&l.filesize>1024*d.maxFilesize)throw new Response(`File size exceeds the limit of ${d.maxFilesize} KB`,{status:413});throw this.uploadMeta.set(l.fileid,Object.assign(Object.assign({},l),{expire:Date.now()+36e5})),this.uploadMeta.forEach((e,t)=>{e.expire<Date.now()&&this.uploadMeta.delete(t)}),l}{const{chunk:e,fileId:t,chunkIndex:a}=l,s=this.uploadMeta.get(t);if(!s)throw new Response("Invalid upload meta",{status:400});if(d.checkFileType&&0===a){if(!i.fileScaner(e))throw new Error("Unknown or unsupported file type")}if((null===(o=this.config.upload)||void 0===o?void 0:o.maxFilesize)&&l.filesize>1024*this.config.upload.maxFilesize)throw new Response(`File size exceeds the limit of ${this.config.upload.maxFilesize/1024} MB`,{status:413});if(await d.chunk(e,{filename:s.filename,filesize:s.filesize,filetype:s.filetype,fileid:s.fileid,totalChunks:s.totalChunks,chunkIndex:a},n),a+1===s.totalChunks){const e=await d.complete(s,n);throw this.uploadMeta.delete(t),e}throw l}}async listen({path:t,body:i,method:a,origin:s,signeture:n},o){let l=await this.clientInfo(t,s);const r="/"!==(t=l.path)&&"development"===this.config.mode;try{if("/"===t){if(!["POST","PUT"].includes(a))throw new Response("Invalid method",{status:405});"POST"===a?await this.handshake(i,l):await this.upload(i,l,n,o)}const s=await e.default.decrypt(n,l.secret);if(await this.isValidSigneture(s.signeture,l.hash),s.expire<Date.now())throw new Response("Request expired",{status:403});let d=null;if(i)if(r){const e=(new TextDecoder).decode(i);d=JSON.parse(e)}else d=await e.default.decryptBuffer(i,l.secret);await this.handleRequest({method:a,path:t,body:d,searchParams:l.searchParams,params:{}},o)}catch(t){const i=t instanceof Error,a=t instanceof Response;let s=i?t.message:a?await t.text():t;return r?{status:i?404:(null==t?void 0:t.status)||200,content:JSON.stringify(s)}:{status:i?404:(null==t?void 0:t.status)||200,content:await e.default.encryptBuffer(s,l.secret)}}return r?{status:404,content:"Not found"}:{status:404,content:await e.default.encryptBuffer("Not found",l.secret)}}}exports.default=a;//# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport { ArgsInfo, ListenerInfo, ServerResponse } from \"./types\";\r\nimport SecurequServerBase from \"./Base\";\r\n\r\nclass SecurequServer extends SecurequServerBase {\r\n\r\n\r\n async handshake(data: any, clientInfo: any) {\r\n const serverSecret = await this.getSecret()\r\n if (!data) throw new Error(\"Invalid handshake data\");\r\n if (data.hash !== clientInfo.hash) {\r\n throw new Error(\"Invalid handshake\");\r\n } else if (data.secret !== clientInfo.secret) {\r\n throw new Error(\"Invalid handshake secret\");\r\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\r\n throw new Error(\"Handshake expired\");\r\n }\r\n\r\n const serverTime = new Date();\r\n const clientDate = new Date(data.clientTime);\r\n const offsetMs = clientDate.getTime() - serverTime.getTime();\r\n\r\n let info = {\r\n timeDiffarenc: offsetMs,\r\n signeture: await crypto.encrypt({\r\n expire: Date.now() + 30000, // 30 seconds\r\n hash: clientInfo.hash\r\n }, serverSecret)\r\n }\r\n throw info\r\n }\r\n\r\n async upload(data: any, clientInfo: any, signeture: string, args?: ArgsInfo) {\r\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\r\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\r\n\r\n if (!this.config.upload?.chunk || !this.config.upload?.complete) {\r\n throw new Response(\"Upload not supported\", { status: 403 })\r\n }\r\n\r\n if (data?.type === 'failed') {\r\n const meta = this.uploadMeta.get(data.fileid)\r\n if (meta && this.config.upload.failed) {\r\n await this.config.upload.failed(meta, args)\r\n this.uploadMeta.delete(data.fileid)\r\n throw { success: true }\r\n } else {\r\n throw new Response(\"Invalid upload\", { status: 400 })\r\n }\r\n } else if (data.type === 'meta') {\r\n this.uploadMeta.set(data.fileid, {\r\n ...data,\r\n expire: Date.now() + 3600000 // 1 hour\r\n })\r\n this.uploadMeta.forEach((meta, key) => {\r\n if (meta.expire < Date.now()) {\r\n this.uploadMeta.delete(key)\r\n }\r\n })\r\n\r\n throw data\r\n } else {\r\n const { chunk, fileId, chunkIndex } = data;\r\n const meta = this.uploadMeta.get(fileId)\r\n if (!meta) {\r\n throw new Response(\"Invalid upload meta\", { status: 400 })\r\n }\r\n const upload = this.config.upload\r\n await upload.chunk(chunk, {\r\n filename: meta.filename,\r\n filesize: meta.filesize,\r\n filetype: meta.filetype,\r\n fileid: meta.fileid,\r\n totalChunks: meta.totalChunks,\r\n chunkIndex,\r\n }, args)\r\n if (chunkIndex + 1 === meta.totalChunks) {\r\n const filepath = await upload.complete(meta, args)\r\n this.uploadMeta.delete(fileId)\r\n throw filepath\r\n }\r\n throw data\r\n }\r\n }\r\n\r\n async listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse> {\r\n let clientInfo = await this.clientInfo(path, origin)\r\n const data: any = body ? await crypto.decryptBuffer(body, clientInfo.secret) : null\r\n path = clientInfo.path\r\n\r\n try {\r\n if (path === '/') {\r\n if (!['POST', 'PUT'].includes(method)) throw new Response(\"Invalid method\", { status: 405 });\r\n method === \"POST\"\r\n ? await this.handshake(data, clientInfo)\r\n : await this.upload(data, clientInfo, signeture, args);\r\n }\r\n\r\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\r\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\r\n\r\n // if reques is expired\r\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\r\n\r\n await this.handleRequest({\r\n method,\r\n path,\r\n body: data,\r\n searchParams: clientInfo.searchParams,\r\n params: {}\r\n }, args);\r\n } catch (info: any) {\r\n const isError = info instanceof Error\r\n const isResponse = info instanceof Response\r\n let content = isError ? info.message : (isResponse ? await info.text() : info);\r\n\r\n return {\r\n status: isError ? 404 : (info?.status || 200),\r\n content: await crypto.encryptBuffer(content, clientInfo.secret)\r\n };\r\n }\r\n\r\n return {\r\n status: 404,\r\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\r\n };\r\n }\r\n\r\n}\r\n\r\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","data","clientInfo","serverSecret","this","getSecret","Error","hash","secret","Date","now","clientTime","serverTime","timeDiffarenc","getTime","signeture","crypto","encrypt","expire","upload","args","decryptSigneture","decrypt","isValidSigneture","_a","config","chunk","_b","complete","Response","status","type","meta","uploadMeta","get","fileid","failed","delete","success","set","Object","assign","forEach","key","fileId","chunkIndex","filename","filesize","filetype","totalChunks","filepath","listen","path","body","method","origin","decryptBuffer","includes","handleRequest","searchParams","params","info","isError","isResponse","content","message","text","encryptBuffer","exports","default"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { ArgsInfo, ListenerInfo, ServerResponse } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/FileScaner\";\n\nclass SecurequServer extends SecurequServerBase {\n\n async handshake(body: any, clientInfo: any) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const serverSecret = await this.getSecret()\n if (!data) throw new Error(\"Invalid handshake data\");\n if (data.hash !== clientInfo.hash) {\n throw new Error(\"Invalid handshake\");\n } else if (data.secret !== clientInfo.secret) {\n throw new Error(\"Invalid handshake secret\");\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\n throw new Error(\"Handshake expired\");\n }\n\n const serverTime = new Date();\n const clientDate = new Date(data.clientTime);\n const offsetMs = clientDate.getTime() - serverTime.getTime();\n\n let info = {\n timeDiffarenc: offsetMs,\n maxFileSize: this.config.upload?.maxFilesize || null,\n dev: this.config.mode === 'development',\n checkFileType: this.config.upload?.checkFileType || false,\n signeture: await crypto.encrypt({\n expire: Date.now() + 30000, // 30 seconds\n hash: clientInfo.hash\n }, serverSecret)\n }\n throw info\n }\n\n async upload(body: any, clientInfo: any, signeture: string, args?: ArgsInfo) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n const upload = this.config.upload\n\n if (!upload?.chunk || !upload?.complete) {\n throw new Response(\"Upload not supported\", { status: 403 })\n }\n\n if (data?.type === 'failed') {\n const meta = this.uploadMeta.get(data.fileid)\n if (meta && upload.failed) {\n await upload.failed(meta, args)\n this.uploadMeta.delete(data.fileid)\n throw { success: true }\n } else {\n throw new Response(\"Invalid upload\", { status: 400 })\n }\n } else if (data.type === 'meta') {\n if (upload?.maxFilesize && data.filesize > upload.maxFilesize * 1024) {\n throw new Response(`File size exceeds the limit of ${upload.maxFilesize} KB`, { status: 413 })\n }\n this.uploadMeta.set(data.fileid, {\n ...data,\n expire: Date.now() + 3600000 // 1 hour\n })\n this.uploadMeta.forEach((meta, key) => {\n if (meta.expire < Date.now()) {\n this.uploadMeta.delete(key)\n }\n })\n\n throw data\n } else {\n const { chunk, fileId, chunkIndex } = data;\n const meta = this.uploadMeta.get(fileId)\n if (!meta) {\n throw new Response(\"Invalid upload meta\", { status: 400 })\n }\n if (upload.checkFileType && chunkIndex === 0) {\n let fileType = fileScaner(chunk);\n if (!fileType) {\n throw new Error(\"Unknown or unsupported file type\");\n }\n }\n\n if (this.config.upload?.maxFilesize && data.filesize > this.config.upload.maxFilesize * 1024) {\n throw new Response(`File size exceeds the limit of ${this.config.upload.maxFilesize / 1024} MB`, { status: 413 })\n }\n await upload.chunk(chunk, {\n filename: meta.filename,\n filesize: meta.filesize,\n filetype: meta.filetype,\n fileid: meta.fileid,\n totalChunks: meta.totalChunks,\n chunkIndex,\n }, args)\n if (chunkIndex + 1 === meta.totalChunks) {\n const filepath = await upload.complete(meta, args)\n this.uploadMeta.delete(fileId)\n throw filepath\n }\n throw data\n }\n }\n\n async listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse> {\n let clientInfo = await this.clientInfo(path, origin)\n path = clientInfo.path\n const isDev = path !== '/' && this.config.mode === 'development'\n try {\n if (path === '/') {\n if (!['POST', 'PUT'].includes(method)) throw new Response(\"Invalid method\", { status: 405 });\n method === \"POST\"\n ? await this.handshake(body, clientInfo)\n : await this.upload(body, clientInfo, signeture, args);\n }\n\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n\n // if reques is expired\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\n let data: any = null\n if (body) {\n if (isDev) {\n const decoder = new TextDecoder();\n const text = decoder.decode(body);\n data = JSON.parse(text)\n } else {\n data = await crypto.decryptBuffer(body, clientInfo.secret)\n }\n }\n\n await this.handleRequest({\n method,\n path,\n body: data,\n searchParams: clientInfo.searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n const isError = info instanceof Error\n const isResponse = info instanceof Response\n let content = isError ? info.message : (isResponse ? await info.text() : info);\n if (path === '/') {\n\n }\n if (isDev) {\n return {\n status: isError ? 404 : (info?.status || 200),\n content: JSON.stringify(content)\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n content: await crypto.encryptBuffer(content, clientInfo.secret)\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n content: \"Not found\"\n };\n }\n\n return {\n status: 404,\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","body","clientInfo","data","crypto","decryptBuffer","secret","serverSecret","this","getSecret","Error","hash","Date","now","clientTime","serverTime","timeDiffarenc","getTime","maxFileSize","_a","config","upload","maxFilesize","dev","mode","checkFileType","_b","signeture","encrypt","expire","args","decryptSigneture","decrypt","isValidSigneture","chunk","complete","Response","status","type","meta","uploadMeta","get","fileid","failed","delete","success","filesize","set","Object","assign","forEach","key","fileId","chunkIndex","fileScaner","filename","filetype","totalChunks","filepath","listen","path","method","origin","isDev","includes","text","TextDecoder","decode","JSON","parse","handleRequest","searchParams","params","info","isError","isResponse","content","message","stringify","encryptBuffer","exports","default"],"mappings":"uKAKA,MAAMA,UAAuBC,EAAAA,QAE1B,eAAMC,CAAUC,EAAWC,WACxB,MAAMC,QAAkBC,EAAAA,QAAOC,cAAcJ,EAAMC,EAAWI,QACxDC,QAAqBC,KAAKC,YAChC,IAAKN,EAAM,MAAM,IAAIO,MAAM,0BAC3B,GAAIP,EAAKQ,OAAST,EAAWS,KAC1B,MAAM,IAAID,MAAM,qBACZ,GAAIP,EAAKG,SAAWJ,EAAWI,OACnC,MAAM,IAAII,MAAM,4BACZ,GAAIE,KAAKC,MAAQV,EAAKW,WAAa,IACvC,MAAM,IAAIJ,MAAM,qBAGnB,MAAMK,EAAa,IAAIH,KAcvB,KAVW,CACRI,cAJgB,IAAIJ,KAAKT,EAAKW,YACLG,UAAYF,EAAWE,UAIhDC,aAA+B,QAAlBC,EAAAX,KAAKY,OAAOC,cAAM,IAAAF,OAAA,EAAAA,EAAEG,cAAe,KAChDC,IAA0B,gBAArBf,KAAKY,OAAOI,KACjBC,eAAiC,QAAlBC,EAAAlB,KAAKY,OAAOC,cAAM,IAAAK,OAAA,EAAAA,EAAED,iBAAiB,EACpDE,gBAAiBvB,EAAAA,QAAOwB,QAAQ,CAC7BC,OAAQjB,KAAKC,MAAQ,IACrBF,KAAMT,EAAWS,MACjBJ,GAGT,CAEA,YAAMc,CAAOpB,EAAWC,EAAiByB,EAAmBG,SACzD,MAAM3B,QAAkBC,EAAAA,QAAOC,cAAcJ,EAAMC,EAAWI,QACxDyB,QAAyB3B,EAAAA,QAAO4B,QAAQL,EAAWzB,EAAWI,cAC9DE,KAAKyB,iBAAiBF,EAAiBJ,UAAWzB,EAAWS,MACnE,MAAMU,EAASb,KAAKY,OAAOC,OAE3B,KAAKA,aAAM,EAANA,EAAQa,UAAUb,eAAAA,EAAQc,UAC5B,MAAM,IAAIC,SAAS,uBAAwB,CAAEC,OAAQ,MAGxD,GAAmB,YAAflC,aAAI,EAAJA,EAAMmC,MAAmB,CAC1B,MAAMC,EAAO/B,KAAKgC,WAAWC,IAAItC,EAAKuC,QACtC,MAAIH,GAAQlB,EAAOsB,cACVtB,EAAOsB,OAAOJ,EAAMT,GAC1BtB,KAAKgC,WAAWI,OAAOzC,EAAKuC,QACtB,CAAEG,SAAS,IAEX,IAAIT,SAAS,iBAAkB,CAAEC,OAAQ,KAEpD,CAAM,GAAkB,SAAdlC,EAAKmC,KAAiB,CAC9B,IAAIjB,aAAM,EAANA,EAAQC,cAAenB,EAAK2C,SAAgC,KAArBzB,EAAOC,YAC/C,MAAM,IAAIc,SAAS,kCAAkCf,EAAOC,iBAAkB,CAAEe,OAAQ,MAY3F,MAVA7B,KAAKgC,WAAWO,IAAI5C,EAAKuC,OAAMM,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACzB9C,IACH0B,OAAQjB,KAAKC,MAAQ,QAExBL,KAAKgC,WAAWU,QAAQ,CAACX,EAAMY,KACxBZ,EAAKV,OAASjB,KAAKC,OACpBL,KAAKgC,WAAWI,OAAOO,KAIvBhD,CACR,CAAM,CACJ,MAAM+B,MAAEA,EAAKkB,OAAEA,EAAMC,WAAEA,GAAelD,EAChCoC,EAAO/B,KAAKgC,WAAWC,IAAIW,GACjC,IAAKb,EACF,MAAM,IAAIH,SAAS,sBAAuB,CAAEC,OAAQ,MAEvD,GAAIhB,EAAOI,eAAgC,IAAf4B,EAAkB,CAE3C,IADeC,EAAAA,WAAWpB,GAEvB,MAAM,IAAIxB,MAAM,mCAErB,CAED,IAAsB,UAAlBF,KAAKY,OAAOC,cAAM,IAAAF,OAAA,EAAAA,EAAEG,cAAenB,EAAK2C,SAA4C,KAAjCtC,KAAKY,OAAOC,OAAOC,YACvE,MAAM,IAAIc,SAAS,kCAAkC5B,KAAKY,OAAOC,OAAOC,YAAc,UAAW,CAAEe,OAAQ,MAU9G,SARMhB,EAAOa,MAAMA,EAAO,CACvBqB,SAAUhB,EAAKgB,SACfT,SAAUP,EAAKO,SACfU,SAAUjB,EAAKiB,SACfd,OAAQH,EAAKG,OACbe,YAAalB,EAAKkB,YAClBJ,cACAvB,GACCuB,EAAa,IAAMd,EAAKkB,YAAa,CACtC,MAAMC,QAAiBrC,EAAOc,SAASI,EAAMT,GAE7C,MADAtB,KAAKgC,WAAWI,OAAOQ,GACjBM,CACR,CACD,MAAMvD,CACR,CACJ,CAEA,YAAMwD,EAAOC,KAAEA,EAAI3D,KAAEA,EAAI4D,OAAEA,EAAMC,OAAEA,EAAMnC,UAAEA,GAA2BG,GACnE,IAAI5B,QAAmBM,KAAKN,WAAW0D,EAAME,GAE7C,MAAMC,EAAiB,OADvBH,EAAO1D,EAAW0D,OACiC,gBAArBpD,KAAKY,OAAOI,KAC1C,IACG,GAAa,MAAToC,EAAc,CACf,IAAK,CAAC,OAAQ,OAAOI,SAASH,GAAS,MAAM,IAAIzB,SAAS,iBAAkB,CAAEC,OAAQ,MAC3E,SAAXwB,QACWrD,KAAKR,UAAUC,EAAMC,SACrBM,KAAKa,OAAOpB,EAAMC,EAAYyB,EAAWG,EACtD,CAED,MAAMC,QAAyB3B,EAAAA,QAAO4B,QAAQL,EAAWzB,EAAWI,QAIpE,SAHME,KAAKyB,iBAAiBF,EAAiBJ,UAAWzB,EAAWS,MAG/DoB,EAAiBF,OAASjB,KAAKC,MAAO,MAAM,IAAIuB,SAAS,kBAAmB,CAAEC,OAAQ,MAC1F,IAAIlC,EAAY,KAChB,GAAIF,EACD,GAAI8D,EAAO,CACR,MACME,GADU,IAAIC,aACCC,OAAOlE,GAC5BE,EAAOiE,KAAKC,MAAMJ,EACpB,MACE9D,QAAaC,EAAAA,QAAOC,cAAcJ,EAAMC,EAAWI,cAInDE,KAAK8D,cAAc,CACtBT,SACAD,OACA3D,KAAME,EACNoE,aAAcrE,EAAWqE,aACzBC,OAAQ,CAAA,GACR1C,EACL,CAAC,MAAO2C,GACN,MAAMC,EAAUD,aAAgB/D,MAC1BiE,EAAaF,aAAgBrC,SACnC,IAAIwC,EAAUF,EAAUD,EAAKI,QAAWF,QAAmBF,EAAKR,OAASQ,EAIzE,OAAIV,EACM,CACJ1B,OAAQqC,EAAU,KAAOD,aAAI,EAAJA,EAAMpC,SAAU,IACzCuC,QAASR,KAAKU,UAAUF,IAGvB,CACJvC,OAAQqC,EAAU,KAAOD,aAAI,EAAJA,EAAMpC,SAAU,IACzCuC,cAAexE,EAAAA,QAAO2E,cAAcH,EAAS1E,EAAWI,QAE7D,CAED,OAAIyD,EACM,CACJ1B,OAAQ,IACRuC,QAAS,aAIR,CACJvC,OAAQ,IACRuC,cAAexE,EAAAA,QAAO2E,cAAc,YAAa7E,EAAWI,QAElE,EAEF0E,QAAAC,QAAAnF"}
package/server/index.mjs CHANGED
@@ -1 +1 @@
1
- import e from"../include/crypto.mjs";import t from"./Base.mjs";class a extends t{async handshake(t,a){const i=await this.getSecret();if(!t)throw new Error("Invalid handshake data");if(t.hash!==a.hash)throw new Error("Invalid handshake");if(t.secret!==a.secret)throw new Error("Invalid handshake secret");if(Date.now()-t.clientTime>3e4)throw new Error("Handshake expired");const s=new Date;throw{timeDiffarenc:new Date(t.clientTime).getTime()-s.getTime(),signeture:await e.encrypt({expire:Date.now()+3e4,hash:a.hash},i)}}async upload(t,a,i,s){var n,o;const r=await e.decrypt(i,a.secret);if(await this.isValidSigneture(r.signeture,a.hash),!(null===(n=this.config.upload)||void 0===n?void 0:n.chunk)||!(null===(o=this.config.upload)||void 0===o?void 0:o.complete))throw new Response("Upload not supported",{status:403});if("failed"===(null==t?void 0:t.type)){const e=this.uploadMeta.get(t.fileid);throw e&&this.config.upload.failed?(await this.config.upload.failed(e,s),this.uploadMeta.delete(t.fileid),{success:!0}):new Response("Invalid upload",{status:400})}if("meta"===t.type)throw this.uploadMeta.set(t.fileid,Object.assign(Object.assign({},t),{expire:Date.now()+36e5})),this.uploadMeta.forEach((e,t)=>{e.expire<Date.now()&&this.uploadMeta.delete(t)}),t;{const{chunk:e,fileId:a,chunkIndex:i}=t,n=this.uploadMeta.get(a);if(!n)throw new Response("Invalid upload meta",{status:400});const o=this.config.upload;if(await o.chunk(e,{filename:n.filename,filesize:n.filesize,filetype:n.filetype,fileid:n.fileid,totalChunks:n.totalChunks,chunkIndex:i},s),i+1===n.totalChunks){const e=await o.complete(n,s);throw this.uploadMeta.delete(a),e}throw t}}async listen({path:t,body:a,method:i,origin:s,signeture:n},o){let r=await this.clientInfo(t,s);const h=a?await e.decryptBuffer(a,r.secret):null;t=r.path;try{if("/"===t){if(!["POST","PUT"].includes(i))throw new Response("Invalid method",{status:405});"POST"===i?await this.handshake(h,r):await this.upload(h,r,n,o)}const a=await e.decrypt(n,r.secret);if(await this.isValidSigneture(a.signeture,r.hash),a.expire<Date.now())throw new Response("Request expired",{status:403});await this.handleRequest({method:i,path:t,body:h,searchParams:r.searchParams,params:{}},o)}catch(t){const a=t instanceof Error,i=t instanceof Response;let s=a?t.message:i?await t.text():t;return{status:a?404:(null==t?void 0:t.status)||200,content:await e.encryptBuffer(s,r.secret)}}return{status:404,content:await e.encryptBuffer("Not found",r.secret)}}}export{a as default};//# sourceMappingURL=index.mjs.map
1
+ import e from"../include/crypto.mjs";import t from"./Base.mjs";import{fileScaner as i}from"../include/FileScaner.mjs";class a extends t{async handshake(t,i){var a,s;const n=await e.decryptBuffer(t,i.secret),o=await this.getSecret();if(!n)throw new Error("Invalid handshake data");if(n.hash!==i.hash)throw new Error("Invalid handshake");if(n.secret!==i.secret)throw new Error("Invalid handshake secret");if(Date.now()-n.clientTime>3e4)throw new Error("Handshake expired");const l=new Date;throw{timeDiffarenc:new Date(n.clientTime).getTime()-l.getTime(),maxFileSize:(null===(a=this.config.upload)||void 0===a?void 0:a.maxFilesize)||null,dev:"development"===this.config.mode,checkFileType:(null===(s=this.config.upload)||void 0===s?void 0:s.checkFileType)||!1,signeture:await e.encrypt({expire:Date.now()+3e4,hash:i.hash},o)}}async upload(t,a,s,n){var o;const l=await e.decryptBuffer(t,a.secret),r=await e.decrypt(s,a.secret);await this.isValidSigneture(r.signeture,a.hash);const d=this.config.upload;if(!(null==d?void 0:d.chunk)||!(null==d?void 0:d.complete))throw new Response("Upload not supported",{status:403});if("failed"===(null==l?void 0:l.type)){const e=this.uploadMeta.get(l.fileid);throw e&&d.failed?(await d.failed(e,n),this.uploadMeta.delete(l.fileid),{success:!0}):new Response("Invalid upload",{status:400})}if("meta"===l.type){if((null==d?void 0:d.maxFilesize)&&l.filesize>1024*d.maxFilesize)throw new Response(`File size exceeds the limit of ${d.maxFilesize} KB`,{status:413});throw this.uploadMeta.set(l.fileid,Object.assign(Object.assign({},l),{expire:Date.now()+36e5})),this.uploadMeta.forEach((e,t)=>{e.expire<Date.now()&&this.uploadMeta.delete(t)}),l}{const{chunk:e,fileId:t,chunkIndex:a}=l,s=this.uploadMeta.get(t);if(!s)throw new Response("Invalid upload meta",{status:400});if(d.checkFileType&&0===a){if(!i(e))throw new Error("Unknown or unsupported file type")}if((null===(o=this.config.upload)||void 0===o?void 0:o.maxFilesize)&&l.filesize>1024*this.config.upload.maxFilesize)throw new Response(`File size exceeds the limit of ${this.config.upload.maxFilesize/1024} MB`,{status:413});if(await d.chunk(e,{filename:s.filename,filesize:s.filesize,filetype:s.filetype,fileid:s.fileid,totalChunks:s.totalChunks,chunkIndex:a},n),a+1===s.totalChunks){const e=await d.complete(s,n);throw this.uploadMeta.delete(t),e}throw l}}async listen({path:t,body:i,method:a,origin:s,signeture:n},o){let l=await this.clientInfo(t,s);const r="/"!==(t=l.path)&&"development"===this.config.mode;try{if("/"===t){if(!["POST","PUT"].includes(a))throw new Response("Invalid method",{status:405});"POST"===a?await this.handshake(i,l):await this.upload(i,l,n,o)}const s=await e.decrypt(n,l.secret);if(await this.isValidSigneture(s.signeture,l.hash),s.expire<Date.now())throw new Response("Request expired",{status:403});let d=null;if(i)if(r){const e=(new TextDecoder).decode(i);d=JSON.parse(e)}else d=await e.decryptBuffer(i,l.secret);await this.handleRequest({method:a,path:t,body:d,searchParams:l.searchParams,params:{}},o)}catch(t){const i=t instanceof Error,a=t instanceof Response;let s=i?t.message:a?await t.text():t;return r?{status:i?404:(null==t?void 0:t.status)||200,content:JSON.stringify(s)}:{status:i?404:(null==t?void 0:t.status)||200,content:await e.encryptBuffer(s,l.secret)}}return r?{status:404,content:"Not found"}:{status:404,content:await e.encryptBuffer("Not found",l.secret)}}}export{a as default};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport { ArgsInfo, ListenerInfo, ServerResponse } from \"./types\";\r\nimport SecurequServerBase from \"./Base\";\r\n\r\nclass SecurequServer extends SecurequServerBase {\r\n\r\n\r\n async handshake(data: any, clientInfo: any) {\r\n const serverSecret = await this.getSecret()\r\n if (!data) throw new Error(\"Invalid handshake data\");\r\n if (data.hash !== clientInfo.hash) {\r\n throw new Error(\"Invalid handshake\");\r\n } else if (data.secret !== clientInfo.secret) {\r\n throw new Error(\"Invalid handshake secret\");\r\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\r\n throw new Error(\"Handshake expired\");\r\n }\r\n\r\n const serverTime = new Date();\r\n const clientDate = new Date(data.clientTime);\r\n const offsetMs = clientDate.getTime() - serverTime.getTime();\r\n\r\n let info = {\r\n timeDiffarenc: offsetMs,\r\n signeture: await crypto.encrypt({\r\n expire: Date.now() + 30000, // 30 seconds\r\n hash: clientInfo.hash\r\n }, serverSecret)\r\n }\r\n throw info\r\n }\r\n\r\n async upload(data: any, clientInfo: any, signeture: string, args?: ArgsInfo) {\r\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\r\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\r\n\r\n if (!this.config.upload?.chunk || !this.config.upload?.complete) {\r\n throw new Response(\"Upload not supported\", { status: 403 })\r\n }\r\n\r\n if (data?.type === 'failed') {\r\n const meta = this.uploadMeta.get(data.fileid)\r\n if (meta && this.config.upload.failed) {\r\n await this.config.upload.failed(meta, args)\r\n this.uploadMeta.delete(data.fileid)\r\n throw { success: true }\r\n } else {\r\n throw new Response(\"Invalid upload\", { status: 400 })\r\n }\r\n } else if (data.type === 'meta') {\r\n this.uploadMeta.set(data.fileid, {\r\n ...data,\r\n expire: Date.now() + 3600000 // 1 hour\r\n })\r\n this.uploadMeta.forEach((meta, key) => {\r\n if (meta.expire < Date.now()) {\r\n this.uploadMeta.delete(key)\r\n }\r\n })\r\n\r\n throw data\r\n } else {\r\n const { chunk, fileId, chunkIndex } = data;\r\n const meta = this.uploadMeta.get(fileId)\r\n if (!meta) {\r\n throw new Response(\"Invalid upload meta\", { status: 400 })\r\n }\r\n const upload = this.config.upload\r\n await upload.chunk(chunk, {\r\n filename: meta.filename,\r\n filesize: meta.filesize,\r\n filetype: meta.filetype,\r\n fileid: meta.fileid,\r\n totalChunks: meta.totalChunks,\r\n chunkIndex,\r\n }, args)\r\n if (chunkIndex + 1 === meta.totalChunks) {\r\n const filepath = await upload.complete(meta, args)\r\n this.uploadMeta.delete(fileId)\r\n throw filepath\r\n }\r\n throw data\r\n }\r\n }\r\n\r\n async listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse> {\r\n let clientInfo = await this.clientInfo(path, origin)\r\n const data: any = body ? await crypto.decryptBuffer(body, clientInfo.secret) : null\r\n path = clientInfo.path\r\n\r\n try {\r\n if (path === '/') {\r\n if (!['POST', 'PUT'].includes(method)) throw new Response(\"Invalid method\", { status: 405 });\r\n method === \"POST\"\r\n ? await this.handshake(data, clientInfo)\r\n : await this.upload(data, clientInfo, signeture, args);\r\n }\r\n\r\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\r\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\r\n\r\n // if reques is expired\r\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\r\n\r\n await this.handleRequest({\r\n method,\r\n path,\r\n body: data,\r\n searchParams: clientInfo.searchParams,\r\n params: {}\r\n }, args);\r\n } catch (info: any) {\r\n const isError = info instanceof Error\r\n const isResponse = info instanceof Response\r\n let content = isError ? info.message : (isResponse ? await info.text() : info);\r\n\r\n return {\r\n status: isError ? 404 : (info?.status || 200),\r\n content: await crypto.encryptBuffer(content, clientInfo.secret)\r\n };\r\n }\r\n\r\n return {\r\n status: 404,\r\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\r\n };\r\n }\r\n\r\n}\r\n\r\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","data","clientInfo","serverSecret","this","getSecret","Error","hash","secret","Date","now","clientTime","serverTime","timeDiffarenc","getTime","signeture","crypto","encrypt","expire","upload","args","decryptSigneture","decrypt","isValidSigneture","_a","config","chunk","_b","complete","Response","status","type","meta","uploadMeta","get","fileid","failed","delete","success","set","Object","assign","forEach","key","fileId","chunkIndex","filename","filesize","filetype","totalChunks","filepath","listen","path","body","method","origin","decryptBuffer","includes","handleRequest","searchParams","params","info","isError","isResponse","content","message","text","encryptBuffer"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { ArgsInfo, ListenerInfo, ServerResponse } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/FileScaner\";\n\nclass SecurequServer extends SecurequServerBase {\n\n async handshake(body: any, clientInfo: any) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const serverSecret = await this.getSecret()\n if (!data) throw new Error(\"Invalid handshake data\");\n if (data.hash !== clientInfo.hash) {\n throw new Error(\"Invalid handshake\");\n } else if (data.secret !== clientInfo.secret) {\n throw new Error(\"Invalid handshake secret\");\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\n throw new Error(\"Handshake expired\");\n }\n\n const serverTime = new Date();\n const clientDate = new Date(data.clientTime);\n const offsetMs = clientDate.getTime() - serverTime.getTime();\n\n let info = {\n timeDiffarenc: offsetMs,\n maxFileSize: this.config.upload?.maxFilesize || null,\n dev: this.config.mode === 'development',\n checkFileType: this.config.upload?.checkFileType || false,\n signeture: await crypto.encrypt({\n expire: Date.now() + 30000, // 30 seconds\n hash: clientInfo.hash\n }, serverSecret)\n }\n throw info\n }\n\n async upload(body: any, clientInfo: any, signeture: string, args?: ArgsInfo) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n const upload = this.config.upload\n\n if (!upload?.chunk || !upload?.complete) {\n throw new Response(\"Upload not supported\", { status: 403 })\n }\n\n if (data?.type === 'failed') {\n const meta = this.uploadMeta.get(data.fileid)\n if (meta && upload.failed) {\n await upload.failed(meta, args)\n this.uploadMeta.delete(data.fileid)\n throw { success: true }\n } else {\n throw new Response(\"Invalid upload\", { status: 400 })\n }\n } else if (data.type === 'meta') {\n if (upload?.maxFilesize && data.filesize > upload.maxFilesize * 1024) {\n throw new Response(`File size exceeds the limit of ${upload.maxFilesize} KB`, { status: 413 })\n }\n this.uploadMeta.set(data.fileid, {\n ...data,\n expire: Date.now() + 3600000 // 1 hour\n })\n this.uploadMeta.forEach((meta, key) => {\n if (meta.expire < Date.now()) {\n this.uploadMeta.delete(key)\n }\n })\n\n throw data\n } else {\n const { chunk, fileId, chunkIndex } = data;\n const meta = this.uploadMeta.get(fileId)\n if (!meta) {\n throw new Response(\"Invalid upload meta\", { status: 400 })\n }\n if (upload.checkFileType && chunkIndex === 0) {\n let fileType = fileScaner(chunk);\n if (!fileType) {\n throw new Error(\"Unknown or unsupported file type\");\n }\n }\n\n if (this.config.upload?.maxFilesize && data.filesize > this.config.upload.maxFilesize * 1024) {\n throw new Response(`File size exceeds the limit of ${this.config.upload.maxFilesize / 1024} MB`, { status: 413 })\n }\n await upload.chunk(chunk, {\n filename: meta.filename,\n filesize: meta.filesize,\n filetype: meta.filetype,\n fileid: meta.fileid,\n totalChunks: meta.totalChunks,\n chunkIndex,\n }, args)\n if (chunkIndex + 1 === meta.totalChunks) {\n const filepath = await upload.complete(meta, args)\n this.uploadMeta.delete(fileId)\n throw filepath\n }\n throw data\n }\n }\n\n async listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse> {\n let clientInfo = await this.clientInfo(path, origin)\n path = clientInfo.path\n const isDev = path !== '/' && this.config.mode === 'development'\n try {\n if (path === '/') {\n if (!['POST', 'PUT'].includes(method)) throw new Response(\"Invalid method\", { status: 405 });\n method === \"POST\"\n ? await this.handshake(body, clientInfo)\n : await this.upload(body, clientInfo, signeture, args);\n }\n\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n\n // if reques is expired\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\n let data: any = null\n if (body) {\n if (isDev) {\n const decoder = new TextDecoder();\n const text = decoder.decode(body);\n data = JSON.parse(text)\n } else {\n data = await crypto.decryptBuffer(body, clientInfo.secret)\n }\n }\n\n await this.handleRequest({\n method,\n path,\n body: data,\n searchParams: clientInfo.searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n const isError = info instanceof Error\n const isResponse = info instanceof Response\n let content = isError ? info.message : (isResponse ? await info.text() : info);\n if (path === '/') {\n\n }\n if (isDev) {\n return {\n status: isError ? 404 : (info?.status || 200),\n content: JSON.stringify(content)\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n content: await crypto.encryptBuffer(content, clientInfo.secret)\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n content: \"Not found\"\n };\n }\n\n return {\n status: 404,\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","body","clientInfo","data","crypto","decryptBuffer","secret","serverSecret","this","getSecret","Error","hash","Date","now","clientTime","serverTime","timeDiffarenc","getTime","maxFileSize","_a","config","upload","maxFilesize","dev","mode","checkFileType","_b","signeture","encrypt","expire","args","decryptSigneture","decrypt","isValidSigneture","chunk","complete","Response","status","type","meta","uploadMeta","get","fileid","failed","delete","success","filesize","set","Object","assign","forEach","key","fileId","chunkIndex","fileScaner","filename","filetype","totalChunks","filepath","listen","path","method","origin","isDev","includes","text","TextDecoder","decode","JSON","parse","handleRequest","searchParams","params","info","isError","isResponse","content","message","stringify","encryptBuffer"],"mappings":"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"}