securequ 1.0.14 → 1.0.16

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.
Files changed (75) hide show
  1. package/client/Base.d.ts +26 -0
  2. package/client/Base.js +1 -0
  3. package/client/Base.js.map +1 -0
  4. package/client/Base.mjs +1 -0
  5. package/client/Base.mjs.map +1 -0
  6. package/client/index.d.ts +9 -21
  7. package/client/index.js +1 -169
  8. package/client/index.js.map +1 -1
  9. package/client/index.mjs +1 -169
  10. package/client/index.mjs.map +1 -1
  11. package/client/types.d.ts +31 -15
  12. package/include/File.js +1 -0
  13. package/include/File.js.map +1 -0
  14. package/include/File.mjs +1 -0
  15. package/include/File.mjs.map +1 -0
  16. package/include/compress.js +1 -0
  17. package/include/compress.js.map +1 -0
  18. package/include/compress.mjs +1 -0
  19. package/include/compress.mjs.map +1 -0
  20. package/include/crypto.js +1 -0
  21. package/include/crypto.js.map +1 -0
  22. package/include/crypto.mjs +1 -0
  23. package/include/crypto.mjs.map +1 -0
  24. package/index.js +1 -1
  25. package/index.mjs +1 -1
  26. package/package.json +13 -6
  27. package/readme.md +54 -54
  28. package/server/Base.d.ts +25 -0
  29. package/server/Base.js +1 -0
  30. package/server/Base.js.map +1 -0
  31. package/server/Base.mjs +1 -0
  32. package/server/Base.mjs.map +1 -0
  33. package/server/Router.d.ts +12 -0
  34. package/server/Router.js +1 -0
  35. package/server/Router.js.map +1 -0
  36. package/server/Router.mjs +1 -0
  37. package/server/Router.mjs.map +1 -0
  38. package/server/index.d.ts +6 -14
  39. package/server/index.js +1 -115
  40. package/server/index.js.map +1 -1
  41. package/server/index.mjs +1 -115
  42. package/server/index.mjs.map +1 -1
  43. package/server/types.d.ts +63 -26
  44. package/include/lib/base64.js +0 -47
  45. package/include/lib/base64.js.map +0 -1
  46. package/include/lib/base64.mjs +0 -47
  47. package/include/lib/base64.mjs.map +0 -1
  48. package/include/lib/cache.js +0 -72
  49. package/include/lib/cache.js.map +0 -1
  50. package/include/lib/cache.mjs +0 -72
  51. package/include/lib/cache.mjs.map +0 -1
  52. package/include/lib/crypto.js +0 -69
  53. package/include/lib/crypto.js.map +0 -1
  54. package/include/lib/crypto.mjs +0 -69
  55. package/include/lib/crypto.mjs.map +0 -1
  56. package/include/lib/pako.js +0 -28
  57. package/include/lib/pako.js.map +0 -1
  58. package/include/lib/pako.mjs +0 -28
  59. package/include/lib/pako.mjs.map +0 -1
  60. package/include/lib/reverser.js +0 -25
  61. package/include/lib/reverser.js.map +0 -1
  62. package/include/lib/reverser.mjs +0 -25
  63. package/include/lib/reverser.mjs.map +0 -1
  64. package/include/lib/urlpath.js +0 -10
  65. package/include/lib/urlpath.js.map +0 -1
  66. package/include/lib/urlpath.mjs +0 -10
  67. package/include/lib/urlpath.mjs.map +0 -1
  68. package/include/responseValue.js +0 -10
  69. package/include/responseValue.js.map +0 -1
  70. package/include/responseValue.mjs +0 -10
  71. package/include/responseValue.mjs.map +0 -1
  72. package/include/signeture.js +0 -20
  73. package/include/signeture.js.map +0 -1
  74. package/include/signeture.mjs +0 -20
  75. package/include/signeture.mjs.map +0 -1
package/client/types.d.ts CHANGED
@@ -1,19 +1,35 @@
1
1
  import { XanFetchOptions } from 'xanfetch/types';
2
2
 
3
- type SecurequClientConfig = {
4
- secret: string;
5
- basepath?: string;
6
- defaultOptions?: XanFetchOptions;
7
- cache?: boolean | {
8
- get: (key: string) => any;
9
- set: (key: string, response: Response) => void;
10
- };
11
- };
12
- type RequestBody = {
13
- [key: string]: any;
14
- };
15
- type HttpRequestInit = Omit<XanFetchOptions, 'body'> & {
16
- body?: RequestBody;
3
+ type HandshakeInfo = {
4
+ timeDiffarenc: number;
5
+ signeture: string;
6
+ };
7
+ type SecurequClientConfig = {
8
+ url: string;
9
+ secret: string;
10
+ defaultOptions?: XanFetchOptions;
11
+ hooks?: {
12
+ beforeHandshake?: () => Promise<void> | void;
13
+ afterHandshake?: (info: HandshakeInfo) => Promise<void> | void;
14
+ beforeRequest?: (url: string, init?: HttpRequestInit) => Promise<HttpRequestInit> | void;
15
+ afterResponse?: (response: Response) => Promise<void> | void;
16
+ beforeUpload?: (file: File, fileId: string) => Promise<File> | void;
17
+ afterUpload?: (response: SecurequClientResponse, file: File) => Promise<void> | void;
18
+ beforeUploadChunk?: (chunk: Blob, chunkIndex: number, totalChunks: number) => Promise<void> | void;
19
+ afterUploadChunk?: (response: SecurequClientResponse, chunkIndex: number, totalChunks: number) => Promise<void> | void;
20
+ };
21
+ };
22
+ type SecurequClientResponse = {
23
+ success: boolean;
24
+ message: string;
25
+ data: any;
26
+ code: number;
27
+ };
28
+ type RequestBody = {
29
+ [key: string]: any;
30
+ };
31
+ type HttpRequestInit = Omit<XanFetchOptions, 'body'> & {
32
+ body?: RequestBody;
17
33
  };
18
34
 
19
- export type { HttpRequestInit, RequestBody, SecurequClientConfig };
35
+ export type { HandshakeInfo, HttpRequestInit, RequestBody, SecurequClientConfig, SecurequClientResponse };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),t=require("./crypto.js");function n(e){return e<=5242880?131072:e<=52428800?262144:e<=209715200?524288:1048576}exports.chunkFile=function(t){return e.__asyncGenerator(this,arguments,function*(){const r=t.size,i=n(r);let a=0;for(;a<r;){const n=t.slice(a,a+i),r=new Uint8Array(yield e.__await(n.arrayBuffer()));yield yield e.__await({chunk:r,chunkIndex:Math.floor(a/i)}),a+=i}})},exports.getFileId=async function(e){const n=[navigator.userAgent,navigator.language,screen.width,screen.height,screen.colorDepth,(new Date).getTimezoneOffset(),Intl.DateTimeFormat().resolvedOptions().timeZone||""].join("||"),r=`${e.name}||${e.size}||${e.lastModified}||${n}`;return await t.default.hash(r)},exports.totalChunks=e=>Math.ceil(e.size/n(e.size));//# sourceMappingURL=File.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"File.js","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\r\n\r\nfunction getChunkSize(fileSize: number): number {\r\n // fileSize in bytes\r\n if (fileSize <= 5 * 1024 * 1024) {\r\n // <= 5MB → 128KB\r\n return 128 * 1024;\r\n } else if (fileSize <= 50 * 1024 * 1024) {\r\n // 5–50MB → 256KB\r\n\r\n return 256 * 1024;\r\n } else if (fileSize <= 200 * 1024 * 1024) {\r\n // 50–200MB → 512KB\r\n return 512 * 1024;\r\n } else {\r\n // > 200MB → 1MB (max)\r\n return 1024 * 1024;\r\n }\r\n}\r\n\r\n\r\nexport const totalChunks = (file: File) => Math.ceil(file.size / getChunkSize(file.size));\r\n\r\nexport async function* chunkFile(file: File) {\r\n const fileSize = file.size;\r\n const chunkSize = getChunkSize(fileSize);\r\n let offset = 0;\r\n\r\n while (offset < fileSize) {\r\n const chunk = file.slice(offset, offset + chunkSize);\r\n const buffer = new Uint8Array(await chunk.arrayBuffer());\r\n yield { chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) };\r\n offset += chunkSize;\r\n }\r\n}\r\n\r\n\r\nexport async function getFileId(file: File): Promise<string> {\r\n const data = [\r\n navigator.userAgent,\r\n navigator.language,\r\n screen.width,\r\n screen.height,\r\n screen.colorDepth,\r\n new Date().getTimezoneOffset(),\r\n Intl.DateTimeFormat().resolvedOptions().timeZone || \"\"\r\n ].join(\"||\");\r\n\r\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data}`\r\n return await crypto.hash(meta);\r\n}\r\n\r\n"],"names":["getChunkSize","fileSize","exports","chunkFile","file","size","chunkSize","offset","chunk","slice","buffer","Uint8Array","__await","arrayBuffer","chunkIndex","Math","floor","getFileId","async","data","navigator","userAgent","language","screen","width","height","colorDepth","Date","getTimezoneOffset","Intl","DateTimeFormat","resolvedOptions","timeZone","join","meta","name","lastModified","crypto","hash","totalChunks","ceil"],"mappings":"oHAEA,SAASA,EAAaC,GAEnB,OAAIA,GAAY,QAEN,OACCA,GAAY,SAGb,OACCA,GAAY,UAEb,OAGA,OAEb,CAgCAC,QAAAC,UA3BM,SAA2BC,wDAC9B,MAAMH,EAAWG,EAAKC,KAChBC,EAAYN,EAAaC,GAC/B,IAAIM,EAAS,EAEb,KAAOA,EAASN,GAAU,CACvB,MAAMO,EAAQJ,EAAKK,MAAMF,EAAQA,EAASD,GACpCI,EAAS,IAAIC,iBAAWC,EAAAA,QAAMJ,EAAMK,4BAC1CD,EAAAA,QAAM,CAAEJ,MAAOE,EAAQI,WAAYC,KAAKC,MAAMT,EAASD,KACvDC,GAAUD,CACZ,CACJ,EAAC,EAgBDJ,QAAAe,UAbOC,eAAyBd,GAC7B,MAAMe,EAAO,CACVC,UAAUC,UACVD,UAAUE,SACVC,OAAOC,MACPD,OAAOE,OACPF,OAAOG,YACP,IAAIC,MAAOC,oBACXC,KAAKC,iBAAiBC,kBAAkBC,UAAY,IACrDC,KAAK,MAEDC,EAAO,GAAG9B,EAAK+B,SAAS/B,EAAKC,SAASD,EAAKgC,iBAAiBjB,IAClE,aAAakB,EAAAA,QAAOC,KAAKJ,EAC5B,EAAAhC,QAAAqC,YA7B4BnC,GAAeW,KAAKyB,KAAKpC,EAAKC,KAAOL,EAAaI,EAAKC"}
@@ -0,0 +1 @@
1
+ import{__asyncGenerator as e,__await as t}from"tslib";import n from"./crypto.mjs";function i(e){return e<=5242880?131072:e<=52428800?262144:e<=209715200?524288:1048576}const o=e=>Math.ceil(e.size/i(e.size));function r(n){return e(this,arguments,function*(){const e=n.size,o=i(e);let r=0;for(;r<e;){const e=n.slice(r,r+o),i=new Uint8Array(yield t(e.arrayBuffer()));yield yield t({chunk:i,chunkIndex:Math.floor(r/o)}),r+=o}})}async function s(e){const t=[navigator.userAgent,navigator.language,screen.width,screen.height,screen.colorDepth,(new Date).getTimezoneOffset(),Intl.DateTimeFormat().resolvedOptions().timeZone||""].join("||"),i=`${e.name}||${e.size}||${e.lastModified}||${t}`;return await n.hash(i)}export{r as chunkFile,s as getFileId,o as totalChunks};//# sourceMappingURL=File.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"File.mjs","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\r\n\r\nfunction getChunkSize(fileSize: number): number {\r\n // fileSize in bytes\r\n if (fileSize <= 5 * 1024 * 1024) {\r\n // <= 5MB → 128KB\r\n return 128 * 1024;\r\n } else if (fileSize <= 50 * 1024 * 1024) {\r\n // 5–50MB → 256KB\r\n\r\n return 256 * 1024;\r\n } else if (fileSize <= 200 * 1024 * 1024) {\r\n // 50–200MB → 512KB\r\n return 512 * 1024;\r\n } else {\r\n // > 200MB → 1MB (max)\r\n return 1024 * 1024;\r\n }\r\n}\r\n\r\n\r\nexport const totalChunks = (file: File) => Math.ceil(file.size / getChunkSize(file.size));\r\n\r\nexport async function* chunkFile(file: File) {\r\n const fileSize = file.size;\r\n const chunkSize = getChunkSize(fileSize);\r\n let offset = 0;\r\n\r\n while (offset < fileSize) {\r\n const chunk = file.slice(offset, offset + chunkSize);\r\n const buffer = new Uint8Array(await chunk.arrayBuffer());\r\n yield { chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) };\r\n offset += chunkSize;\r\n }\r\n}\r\n\r\n\r\nexport async function getFileId(file: File): Promise<string> {\r\n const data = [\r\n navigator.userAgent,\r\n navigator.language,\r\n screen.width,\r\n screen.height,\r\n screen.colorDepth,\r\n new Date().getTimezoneOffset(),\r\n Intl.DateTimeFormat().resolvedOptions().timeZone || \"\"\r\n ].join(\"||\");\r\n\r\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data}`\r\n return await crypto.hash(meta);\r\n}\r\n\r\n"],"names":["getChunkSize","fileSize","totalChunks","file","Math","ceil","size","chunkFile","chunkSize","offset","chunk","slice","buffer","Uint8Array","__await","arrayBuffer","chunkIndex","floor","async","getFileId","data","navigator","userAgent","language","screen","width","height","colorDepth","Date","getTimezoneOffset","Intl","DateTimeFormat","resolvedOptions","timeZone","join","meta","name","lastModified","crypto","hash"],"mappings":"kFAEA,SAASA,EAAaC,GAEnB,OAAIA,GAAY,QAEN,OACCA,GAAY,SAGb,OACCA,GAAY,UAEb,OAGA,OAEb,CAGO,MAAMC,EAAeC,GAAeC,KAAKC,KAAKF,EAAKG,KAAON,EAAaG,EAAKG,OAE7E,SAAiBC,EAAUJ,uCAC9B,MAAMF,EAAWE,EAAKG,KAChBE,EAAYR,EAAaC,GAC/B,IAAIQ,EAAS,EAEb,KAAOA,EAASR,GAAU,CACvB,MAAMS,EAAQP,EAAKQ,MAAMF,EAAQA,EAASD,GACpCI,EAAS,IAAIC,iBAAWC,EAAMJ,EAAMK,4BAC1CD,EAAM,CAAEJ,MAAOE,EAAQI,WAAYZ,KAAKa,MAAMR,EAASD,KACvDC,GAAUD,CACZ,CACJ,EAAC,CAGMU,eAAeC,EAAUhB,GAC7B,MAAMiB,EAAO,CACVC,UAAUC,UACVD,UAAUE,SACVC,OAAOC,MACPD,OAAOE,OACPF,OAAOG,YACP,IAAIC,MAAOC,oBACXC,KAAKC,iBAAiBC,kBAAkBC,UAAY,IACrDC,KAAK,MAEDC,EAAO,GAAGhC,EAAKiC,SAASjC,EAAKG,SAASH,EAAKkC,iBAAiBjB,IAClE,aAAakB,EAAOC,KAAKJ,EAC5B,QAAA5B,eAAAY,eAAAjB"}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("fflate"),r=require("libsodium-wrappers"),s=require("msgpackr");exports.compressBuffer=async function(c){await r.ready;const t=s.pack(c);return e.compressSync(t)},exports.decompressBuffer=async function(c){await r.ready;const t=e.decompressSync(c);return s.unpack(t)};//# sourceMappingURL=compress.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ import{decompressSync as r,compressSync as t}from"fflate";import o from"libsodium-wrappers";import{unpack as a,pack as n}from"msgpackr";async function i(r){await o.ready;const a=n(r);return t(a)}async function m(t){await o.ready;const n=r(t);return a(n)}export{i as compressBuffer,m as decompressBuffer};//# sourceMappingURL=compress.mjs.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=require("libsodium-wrappers"),e=require("./compress.js");function t(e){return r.crypto_generichash(r.crypto_secretbox_KEYBYTES,r.from_string(e))}function c(e){return r.crypto_generichash(r.crypto_secretbox_NONCEBYTES,r.from_string(e))}async function n(e,t){const c=await o(e,t);return r.to_base64(c)}async function s(e,t){const c=r.from_base64(e);return await a(c,t)}async function o(n,s){await r.ready;const o=t(s),a=c(s),p=await e.compressBuffer(n);return r.crypto_secretbox_easy(p,a,o)}async function a(n,s){await r.ready;const o=t(s),a=c(s);try{const t=r.crypto_secretbox_open_easy(n,a,o);return t?await e.decompressBuffer(t):null}catch(r){return null}}async function p(e){await r.ready;const t=r.crypto_generichash(32,r.from_string(e));return r.to_base64(t).replace(/[^a-zA-Z0-9]/g,"")}const u={encrypt:n,decrypt:s,encryptBuffer:o,decryptBuffer:a,hash:p};exports.decrypt=s,exports.decryptBuffer=a,exports.default=u,exports.encrypt=n,exports.encryptBuffer=o,exports.hash=p;//# sourceMappingURL=crypto.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ import r from"libsodium-wrappers";import{decompressBuffer as t,compressBuffer as n}from"./compress.mjs";function e(t){return r.crypto_generichash(r.crypto_secretbox_KEYBYTES,r.from_string(t))}function c(t){return r.crypto_generichash(r.crypto_secretbox_NONCEBYTES,r.from_string(t))}async function o(t,n){const e=await s(t,n);return r.to_base64(e)}async function a(t,n){const e=r.from_base64(t);return await i(e,n)}async function s(t,o){await r.ready;const a=e(o),s=c(o),i=await n(t);return r.crypto_secretbox_easy(i,s,a)}async function i(n,o){await r.ready;const a=e(o),s=c(o);try{const e=r.crypto_secretbox_open_easy(n,s,a);return e?await t(e):null}catch(r){return null}}async function y(t){await r.ready;const n=r.crypto_generichash(32,r.from_string(t));return r.to_base64(n).replace(/[^a-zA-Z0-9]/g,"")}const u={encrypt:o,decrypt:a,encryptBuffer:s,decryptBuffer:i,hash:y};export{a as decrypt,i as decryptBuffer,u as default,o as encrypt,s as encryptBuffer,y as hash};//# sourceMappingURL=crypto.mjs.map
@@ -0,0 +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"}
package/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var index=require('./server/index.js'),index$1=require('./client/index.js');exports.SecurequServer=index;exports.SecurequClient=index$1;//# sourceMappingURL=index.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./server/index.js"),r=require("./client/index.js");exports.SecurequServer=e.default,exports.SecurequClient=r.default;//# sourceMappingURL=index.js.map
package/index.mjs CHANGED
@@ -1 +1 @@
1
- export{default as SecurequServer}from'./server/index.mjs';export{default as SecurequClient}from'./client/index.mjs';//# sourceMappingURL=index.mjs.map
1
+ export{default as SecurequServer}from"./server/index.mjs";export{default as SecurequClient}from"./client/index.mjs";//# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,24 +1,31 @@
1
1
  {
2
2
  "name": "securequ",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "",
5
5
  "keywords": [],
6
+ "sideEffects": false,
6
7
  "dependencies": {
7
- "pako": "^2.1.0",
8
+ "fflate": "^0.8.2",
9
+ "libsodium-wrappers": "^0.7.15",
10
+ "lz4-wasm": "^0.9.2",
11
+ "makepack": "^1.7.14",
12
+ "msgpackr": "^1.11.5",
8
13
  "path-to-regexp": "^8.2.0",
9
- "tweetnacl": "^1.0.3",
10
14
  "xanfetch": "^1.0.8"
11
15
  },
12
16
  "devDependencies": {
17
+ "@types/express": "^5.0.3",
18
+ "@types/libsodium-wrappers": "^0.7.14",
19
+ "@types/lz4": "^0.6.4",
13
20
  "@types/node": "^22.15.24",
14
- "@types/pako": "^2.0.3",
15
21
  "@types/react": "^19.0.2",
16
22
  "@types/react-dom": "^19.0.2",
17
23
  "express": "^5.1.0",
18
- "makepack": "^1.7.7",
19
24
  "react": "^19.0.0",
20
25
  "react-dom": "^19.0.0",
21
- "typescript": "^4.4.2"
26
+ "rollup-plugin-wasm": "^3.0.0",
27
+ "typescript": "^4.4.2",
28
+ "vite-plugin-wasm": "^3.5.0"
22
29
  },
23
30
  "exports": {
24
31
  ".": {
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.
@@ -0,0 +1,25 @@
1
+ import Router from './Router.js';
2
+ import { SecurequServerConfig, UploadFileMeta, HandlerInfo, ArgsInfo } from './types.js';
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>;
23
+ }
24
+
25
+ export { SecurequServerBase as default };
package/server/Base.js ADDED
@@ -0,0 +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
@@ -0,0 +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"}
@@ -0,0 +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
@@ -0,0 +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"}
@@ -0,0 +1,12 @@
1
+ import { RouteFactory, HTTPMethods, HandlerFunction } from './types.js';
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>;
10
+ }
11
+
12
+ export { Router as default };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("path-to-regexp");exports.default=class{constructor(){this.routes={GET:{},POST:{},PUT:{},DELETE:{}}}async addRoute(e,s,a){this.routes[s][e]||(this.routes[s][e]={handler:a,test:t.match(e)})}async get(t,e){this.addRoute(t,"GET",e)}async post(t,e){this.addRoute(t,"POST",e)}async put(t,e){this.addRoute(t,"PUT",e)}async delete(t,e){this.addRoute(t,"DELETE",e)}};//# sourceMappingURL=Router.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ import{match as t}from"path-to-regexp";class s{constructor(){this.routes={GET:{},POST:{},PUT:{},DELETE:{}}}async addRoute(s,e,a){this.routes[e][s]||(this.routes[e][s]={handler:a,test:t(s)})}async get(t,s){this.addRoute(t,"GET",s)}async post(t,s){this.addRoute(t,"POST",s)}async put(t,s){this.addRoute(t,"PUT",s)}async delete(t,s){this.addRoute(t,"DELETE",s)}}export{s as default};//# sourceMappingURL=Router.mjs.map
@@ -0,0 +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"}
package/server/index.d.ts CHANGED
@@ -1,18 +1,10 @@
1
- import { SecurequServerConfig, HTTPMethods, HandlerFunction, HandlerInfo, ListenerInfo, ServerResponse } from './types.js';
1
+ import { ArgsInfo, ListenerInfo, ServerResponse } from './types.js';
2
+ import SecurequServerBase from './Base.js';
2
3
 
3
- declare class SecurequServer {
4
- private HandlerCache;
5
- private routes;
6
- private config;
7
- private secret;
8
- constructor(config: SecurequServerConfig);
9
- addRoute(path: string, method: HTTPMethods, handler: HandlerFunction): Promise<void>;
10
- get(path: string, handler: HandlerFunction): Promise<void>;
11
- post(path: string, handler: HandlerFunction): Promise<void>;
12
- put(path: string, handler: HandlerFunction): Promise<void>;
13
- delete(path: string, handler: HandlerFunction): Promise<void>;
14
- handleRequest(info: HandlerInfo, args?: any): Promise<void>;
15
- listen(listenerInfo: ListenerInfo, args?: any): Promise<ServerResponse>;
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>;
16
8
  }
17
9
 
18
10
  export { SecurequServer as default };
package/server/index.js CHANGED
@@ -1,115 +1 @@
1
- 'use strict';var pathToRegexp=require('path-to-regexp'),crypto=require('../include/lib/crypto.js'),reverser=require('../include/lib/reverser.js'),responseValue=require('../include/responseValue.js'),signeture=require('../include/signeture.js'),cache=require('../include/lib/cache.js');class SecurequServer {
2
- constructor(config) {
3
- this.HandlerCache = new cache({ ttl: 1000 * 60 * 60, limit: 100 });
4
- this.routes = {
5
- GET: {},
6
- POST: {},
7
- PUT: {},
8
- DELETE: {}
9
- };
10
- this.secret = crypto.makeSecret(Math.random().toString(36).substring(7));
11
- this.config = Object.assign({}, config);
12
- }
13
- async addRoute(path, method, handler) {
14
- if (this.routes[method][path])
15
- return;
16
- this.routes[method][path] = {
17
- handler,
18
- test: pathToRegexp.match(path)
19
- };
20
- }
21
- async get(path, handler) {
22
- this.addRoute(path, 'GET', handler);
23
- }
24
- async post(path, handler) {
25
- this.addRoute(path, 'POST', handler);
26
- }
27
- async put(path, handler) {
28
- this.addRoute(path, 'PUT', handler);
29
- }
30
- async delete(path, handler) {
31
- this.addRoute(path, 'DELETE', handler);
32
- }
33
- async handleRequest(info, args) {
34
- const { path, method } = info;
35
- let cacheHandler = this.HandlerCache.get(`${method}:${path}`);
36
- if (cacheHandler) {
37
- await cacheHandler(info, args);
38
- return;
39
- }
40
- let values = Object.values(this.routes[method]);
41
- for (let value of values) {
42
- let { test, handler } = value;
43
- const match = test(path);
44
- if (match) {
45
- info.params = match.params;
46
- await handler(info, args);
47
- this.HandlerCache.set(`${method}:${path}`, handler);
48
- }
49
- }
50
- }
51
- async listen(listenerInfo, args) {
52
- try {
53
- if (!listenerInfo.signeture || !listenerInfo.path || !listenerInfo.method)
54
- throw new Error("Invalid Request");
55
- const clientSecret = signeture.verify(listenerInfo.signeture);
56
- const { path, body, method } = listenerInfo;
57
- const url = new URL(path, "http://localhost");
58
- url.pathname = url.pathname.replace(this.config.basepath, "/");
59
- let split = url.pathname.split("/").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);
60
- url.pathname = `/${split.join("/")}`;
61
- // handle handshake
62
- const handshakeSecret = crypto.makeSecret(this.secret + clientSecret);
63
- const reqkey = handshakeSecret.substring(0, handshakeSecret.length / 2);
64
- if (method === 'GET' && url.pathname === "/handshake") {
65
- throw crypto.encrypt(handshakeSecret, clientSecret);
66
- }
67
- let data = {}, searchParams = {};
68
- if (url.searchParams.has(reqkey)) {
69
- let decripted = crypto.decrypt(url.searchParams.get(reqkey), handshakeSecret);
70
- for (let key in decripted) {
71
- let ukey = reverser.decrypt(key);
72
- searchParams[ukey] = decripted[key];
73
- }
74
- }
75
- if (body && body[reqkey]) {
76
- let decripted = crypto.decrypt(body[reqkey], handshakeSecret);
77
- for (let key in decripted) {
78
- let ukey = reverser.decrypt(key);
79
- data[ukey] = decripted[key];
80
- }
81
- }
82
- // handle the request
83
- await this.handleRequest({
84
- method,
85
- path: url.pathname,
86
- body: data,
87
- searchParams,
88
- params: {}
89
- }, args);
90
- }
91
- catch (info) {
92
- if (info instanceof Error) {
93
- return {
94
- status: 404,
95
- value: responseValue.encrypt(info.message, listenerInfo.signeture)
96
- };
97
- }
98
- else if (info instanceof Response) {
99
- let text = await info.text();
100
- return {
101
- status: info.status,
102
- value: responseValue.encrypt(text, listenerInfo.signeture)
103
- };
104
- }
105
- return {
106
- status: 200,
107
- value: responseValue.encrypt(info, listenerInfo.signeture)
108
- };
109
- }
110
- return {
111
- status: 404,
112
- value: 'Not Found'
113
- };
114
- }
115
- }module.exports=SecurequServer;//# sourceMappingURL=index.js.map
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