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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import { match } from \"path-to-regexp\";\nimport crypto from \"../include/lib/crypto\";\nimport reverser from \"../include/lib/reverser\";\nimport responseValue from \"../include/responseValue\";\nimport signeture from \"../include/signeture\";\nimport { HandlerFunction, HandlerInfo, HTTPMethods, ListenerInfo, RouteFactory, ServerResponse, SecurequServerConfig } from \"./types\";\nimport SecurequCache from \"../include/lib/cache\";\n\nclass SecurequServer {\n private HandlerCache = new SecurequCache<HandlerFunction>({ ttl: 1000 * 60 * 60, limit: 100 });\n private routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n private config: SecurequServerConfig;\n private secret: string = crypto.makeSecret(Math.random().toString(36).substring(7));\n\n constructor(config: SecurequServerConfig) {\n this.config = { ...config }\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 async handleRequest(info: HandlerInfo, args?: any) {\n const { path, method } = info;\n let cacheHandler = this.HandlerCache.get(`${method}:${path}`);\n if (cacheHandler) {\n await cacheHandler(info, args)\n return\n }\n let values: any = Object.values(this.routes[method]);\n for (let value of values) {\n let { test, handler } = value\n const match = test(path)\n if (match) {\n info.params = match.params;\n await handler(info, args)\n this.HandlerCache.set(`${method}:${path}`, handler)\n }\n }\n }\n\n async listen(listenerInfo: ListenerInfo, args?: any): Promise<ServerResponse> {\n try {\n if (!listenerInfo.signeture || !listenerInfo.path || !listenerInfo.method) throw new Error(\"Invalid Request\");\n\n const clientSecret = signeture.verify(listenerInfo.signeture);\n const { path, body, method } = listenerInfo;\n const url = new URL(path, \"http://localhost\");\n url.pathname = url.pathname.replace(this.config.basepath, \"/\")\n let split = url.pathname.split(\"/\").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);\n url.pathname = `/${split.join(\"/\")}`;\n\n // handle handshake \n const handshakeSecret = crypto.makeSecret(this.secret + clientSecret);\n const reqkey = handshakeSecret.substring(0, handshakeSecret.length / 2);\n\n if (method === 'GET' && url.pathname === \"/handshake\") {\n throw crypto.encrypt(handshakeSecret, clientSecret)\n }\n\n let data: any = {}, searchParams: any = {}\n\n if (url.searchParams.has(reqkey)) {\n let decripted: any = crypto.decrypt(url.searchParams.get(reqkey) as string, handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n searchParams[ukey] = decripted[key]\n }\n }\n\n if (body && body[reqkey]) {\n let decripted: any = crypto.decrypt(body[reqkey], handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n data[ukey] = decripted[key]\n }\n }\n\n // handle the request\n await this.handleRequest({\n method,\n path: url.pathname,\n body: data,\n searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n if (info instanceof Error) {\n return {\n status: 404,\n value: responseValue.encrypt(info.message, listenerInfo.signeture)\n }\n } else if (info instanceof Response) {\n let text = await info.text();\n return {\n status: info.status,\n value: responseValue.encrypt(text, listenerInfo.signeture)\n }\n }\n return {\n status: 200,\n value: responseValue.encrypt(info, listenerInfo.signeture)\n };\n }\n\n return {\n status: 404,\n value: 'Not Found'\n };\n }\n}\n\nexport default SecurequServer;"],"names":["SecurequCache","match"],"mappings":"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"}
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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"}
package/server/index.mjs CHANGED
@@ -1,115 +1 @@
1
- import {match}from'path-to-regexp';import crypto from'../include/lib/crypto.mjs';import reverser from'../include/lib/reverser.mjs';import responseValue from'../include/responseValue.mjs';import signeture from'../include/signeture.mjs';import SecurequCache from'../include/lib/cache.mjs';class SecurequServer {
2
- constructor(config) {
3
- this.HandlerCache = new SecurequCache({ 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: 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
- }export{SecurequServer as default};//# sourceMappingURL=index.mjs.map
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 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/server/index.ts"],"sourcesContent":["import { match } from \"path-to-regexp\";\nimport crypto from \"../include/lib/crypto\";\nimport reverser from \"../include/lib/reverser\";\nimport responseValue from \"../include/responseValue\";\nimport signeture from \"../include/signeture\";\nimport { HandlerFunction, HandlerInfo, HTTPMethods, ListenerInfo, RouteFactory, ServerResponse, SecurequServerConfig } from \"./types\";\nimport SecurequCache from \"../include/lib/cache\";\n\nclass SecurequServer {\n private HandlerCache = new SecurequCache<HandlerFunction>({ ttl: 1000 * 60 * 60, limit: 100 });\n private routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n private config: SecurequServerConfig;\n private secret: string = crypto.makeSecret(Math.random().toString(36).substring(7));\n\n constructor(config: SecurequServerConfig) {\n this.config = { ...config }\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 async handleRequest(info: HandlerInfo, args?: any) {\n const { path, method } = info;\n let cacheHandler = this.HandlerCache.get(`${method}:${path}`);\n if (cacheHandler) {\n await cacheHandler(info, args)\n return\n }\n let values: any = Object.values(this.routes[method]);\n for (let value of values) {\n let { test, handler } = value\n const match = test(path)\n if (match) {\n info.params = match.params;\n await handler(info, args)\n this.HandlerCache.set(`${method}:${path}`, handler)\n }\n }\n }\n\n async listen(listenerInfo: ListenerInfo, args?: any): Promise<ServerResponse> {\n try {\n if (!listenerInfo.signeture || !listenerInfo.path || !listenerInfo.method) throw new Error(\"Invalid Request\");\n\n const clientSecret = signeture.verify(listenerInfo.signeture);\n const { path, body, method } = listenerInfo;\n const url = new URL(path, \"http://localhost\");\n url.pathname = url.pathname.replace(this.config.basepath, \"/\")\n let split = url.pathname.split(\"/\").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);\n url.pathname = `/${split.join(\"/\")}`;\n\n // handle handshake \n const handshakeSecret = crypto.makeSecret(this.secret + clientSecret);\n const reqkey = handshakeSecret.substring(0, handshakeSecret.length / 2);\n\n if (method === 'GET' && url.pathname === \"/handshake\") {\n throw crypto.encrypt(handshakeSecret, clientSecret)\n }\n\n let data: any = {}, searchParams: any = {}\n\n if (url.searchParams.has(reqkey)) {\n let decripted: any = crypto.decrypt(url.searchParams.get(reqkey) as string, handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n searchParams[ukey] = decripted[key]\n }\n }\n\n if (body && body[reqkey]) {\n let decripted: any = crypto.decrypt(body[reqkey], handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n data[ukey] = decripted[key]\n }\n }\n\n // handle the request\n await this.handleRequest({\n method,\n path: url.pathname,\n body: data,\n searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n if (info instanceof Error) {\n return {\n status: 404,\n value: responseValue.encrypt(info.message, listenerInfo.signeture)\n }\n } else if (info instanceof Response) {\n let text = await info.text();\n return {\n status: info.status,\n value: responseValue.encrypt(text, listenerInfo.signeture)\n }\n }\n return {\n status: 200,\n value: responseValue.encrypt(info, listenerInfo.signeture)\n };\n }\n\n return {\n status: 404,\n value: 'Not Found'\n };\n }\n}\n\nexport default SecurequServer;"],"names":[],"mappings":"+RAQA,MAAM,cAAc,CAAA;AAWjB,IAAA,WAAA,CAAY,MAA4B,EAAA;AAVhC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,aAAa,CAAkB,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACtF,QAAA,IAAA,CAAA,MAAM,GAAiB;AAC5B,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,MAAM,EAAE;SACV;QAEO,IAAA,CAAA,MAAM,GAAW,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAGhF,QAAA,IAAI,CAAC,MAAM,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAQ,MAAM,CAAE;IAC9B;AAEA,IAAA,MAAM,QAAQ,CAAC,IAAY,EAAE,MAAmB,EAAE,OAAwB,EAAA;QACvE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YAAE;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG;YACzB,OAAO;AACP,YAAA,IAAI,EAAE,KAAK,CAAC,IAAI;SAClB;IACJ;AAEA,IAAA,MAAM,GAAG,CAAC,IAAY,EAAE,OAAwB,EAAA;QAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;IACtC;AAEA,IAAA,MAAM,IAAI,CAAC,IAAY,EAAE,OAAwB,EAAA;QAC9C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;IACvC;AAEA,IAAA,MAAM,GAAG,CAAC,IAAY,EAAE,OAAwB,EAAA;QAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;IACtC;AAEA,IAAA,MAAM,MAAM,CAAC,IAAY,EAAE,OAAwB,EAAA;QAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;IACzC;AAEA,IAAA,MAAM,aAAa,CAAC,IAAiB,EAAE,IAAU,EAAA;AAC9C,QAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;AAC7B,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC;AAC7D,QAAA,IAAI,YAAY,EAAE;AACf,YAAA,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;YAC9B;AACF,QAAA;AACD,QAAA,IAAI,MAAM,GAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACpD,QAAA,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE;AACvB,YAAA,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,KAAK,EAAE;AACR,gBAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;AAC1B,gBAAA,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AACzB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,EAAE,OAAO,CAAC;AACrD,YAAA;AACH,QAAA;IACJ;AAEA,IAAA,MAAM,MAAM,CAAC,YAA0B,EAAE,IAAU,EAAA;QAChD,IAAI;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;YAE7G,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC;YAC7D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY;YAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC;AAC7C,YAAA,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC;AAC9D,YAAA,IAAI,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/F,GAAG,CAAC,QAAQ,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE;;AAGpC,YAAA,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;AACrE,YAAA,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;YAEvE,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE;gBACpD,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC;AACrD,YAAA;AAED,YAAA,IAAI,IAAI,GAAQ,EAAE,EAAE,YAAY,GAAQ,EAAE;YAE1C,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC/B,gBAAA,IAAI,SAAS,GAAQ,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAW,EAAE,eAAe,CAAC;AAC5F,gBAAA,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE;oBACxB,IAAI,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;oBAChC,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC;AACrC,gBAAA;AACH,YAAA;AAED,YAAA,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;AACvB,gBAAA,IAAI,SAAS,GAAQ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;AAClE,gBAAA,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE;oBACxB,IAAI,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;oBAChC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC;AAC7B,gBAAA;AACH,YAAA;;YAGD,MAAM,IAAI,CAAC,aAAa,CAAC;gBACtB,MAAM;gBACN,IAAI,EAAE,GAAG,CAAC,QAAQ;AAClB,gBAAA,IAAI,EAAE,IAAI;gBACV,YAAY;AACZ,gBAAA,MAAM,EAAE;aACV,EAAE,IAAI,CAAC;AACV,QAAA;AAAC,QAAA,OAAO,IAAS,EAAE;YACjB,IAAI,IAAI,YAAY,KAAK,EAAE;gBACxB,OAAO;AACJ,oBAAA,MAAM,EAAE,GAAG;AACX,oBAAA,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS;iBACnE;AACH,YAAA;iBAAM,IAAI,IAAI,YAAY,QAAQ,EAAE;AAClC,gBAAA,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;gBAC5B,OAAO;oBACJ,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS;iBAC3D;AACH,YAAA;YACD,OAAO;AACJ,gBAAA,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS;aAC3D;AACH,QAAA;QAED,OAAO;AACJ,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,KAAK,EAAE;SACT;IACJ;AACF"}
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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"}
package/server/types.d.ts CHANGED
@@ -1,28 +1,65 @@
1
- type SecurequServerConfig = {
2
- basepath: string;
3
- cache?: boolean | {
4
- get: (key: string) => any;
5
- set: (key: string, response: Response) => void;
6
- };
7
- };
8
- type HTTPMethods = "GET" | "POST" | "PUT" | "DELETE";
9
- type ListenerInfo = {
10
- signeture: string;
11
- path: string;
12
- body: any;
13
- method: HTTPMethods;
14
- };
15
- type HandlerInfo = {
16
- path: string;
17
- body: object;
18
- searchParams: Object;
19
- params: Object;
20
- method: HTTPMethods;
21
- };
22
- type ServerResponse = {
23
- value: string;
24
- status: number;
1
+ import { MatchFunction } from 'path-to-regexp';
2
+
3
+ type ServerClientSecret = string;
4
+ type ServerClient = {
5
+ origin: string;
6
+ secret: ServerClientSecret;
7
+ };
8
+ type UploadFileMeta = {
9
+ filename: string;
10
+ filesize: number;
11
+ filetype: string;
12
+ fileid: string;
13
+ chunkIndex: number;
14
+ totalChunks: number;
15
+ };
16
+ type UploadFilePath = string;
17
+ type ArgsInfo = {
18
+ [key: string]: any;
19
+ };
20
+ type SecurequServerConfig = {
21
+ basepath: string;
22
+ clients: ServerClient[];
23
+ upload?: {
24
+ chunk: (chunk: Uint8Array, meta: UploadFileMeta, args?: ArgsInfo) => Promise<boolean>;
25
+ complete: (meta: UploadFileMeta, args?: ArgsInfo) => Promise<UploadFilePath>;
26
+ failed?: (meta: UploadFileMeta, args?: ArgsInfo) => Promise<boolean>;
27
+ };
28
+ accept?: (info: HandlerInfo, args?: ArgsInfo) => boolean | Promise<boolean>;
29
+ };
30
+ type HTTPMethods = "GET" | "POST" | "PUT" | "DELETE";
31
+ type ListenerInfo = {
32
+ signeture: string;
33
+ path: string;
34
+ body: any;
35
+ method: HTTPMethods;
36
+ origin: string;
37
+ };
38
+ type HandlerInfo = {
39
+ path: string;
40
+ body: object;
41
+ method: HTTPMethods;
42
+ searchParams: {
43
+ [key: string]: any;
44
+ };
45
+ params: {
46
+ [key: string]: any;
47
+ };
48
+ };
49
+ type ServerResponse = {
50
+ content: Uint8Array;
51
+ status: number;
52
+ };
53
+ type HandlerFunction = (info: HandlerInfo, args?: any) => (any | void) | Promise<Partial<any> | void>;
54
+ type RouteFactory = {
55
+ [key in HTTPMethods]: {
56
+ [path: string]: {
57
+ handler: HandlerFunction;
58
+ test: MatchFunction<{
59
+ [key: string]: string;
60
+ }>;
61
+ };
62
+ };
25
63
  };
26
- type HandlerFunction = (info: HandlerInfo, args?: any) => (any | void) | Promise<Partial<any> | void>;
27
64
 
28
- export type { HTTPMethods, HandlerFunction, HandlerInfo, ListenerInfo, SecurequServerConfig, ServerResponse };
65
+ export type { ArgsInfo, HTTPMethods, HandlerFunction, HandlerInfo, ListenerInfo, RouteFactory, SecurequServerConfig, ServerClient, ServerClientSecret, ServerResponse, UploadFileMeta, UploadFilePath };
@@ -1,47 +0,0 @@
1
- 'use strict';/**
2
- * Encodes a Uint8Array to Base64 (for browser or Node.js).
3
- * @param data - The Uint8Array data to encode.
4
- * @returns The Base64-encoded string.
5
- */
6
- function encode(data) {
7
- let base64 = "";
8
- if (typeof window !== "undefined") {
9
- base64 = btoa(String.fromCharCode(...Array.from(data)));
10
- }
11
- else {
12
- base64 = Buffer.from(data).toString("base64");
13
- }
14
- let paddingCount = (base64.match(/=+$/) || [''])[0].length;
15
- if (paddingCount > 0) {
16
- base64 = base64.replace(/=+$/, () => `$${paddingCount}`);
17
- }
18
- return base64;
19
- }
20
- /**
21
- * Decodes a Base64 string to a Uint8Array (for browser or Node.js).
22
- * @param base64String - The Base64 string to decode.
23
- * @returns The decoded Uint8Array.
24
- */
25
- function decode(base64) {
26
- try {
27
- base64 = base64.replace(/\$(\d)/, (_match, count) => '='.repeat(parseInt(count)));
28
- if (typeof window !== "undefined") {
29
- const binaryString = atob(base64);
30
- const byteArray = new Uint8Array(binaryString.length);
31
- for (let i = 0; i < binaryString.length; i++) {
32
- byteArray[i] = binaryString.charCodeAt(i);
33
- }
34
- return byteArray;
35
- }
36
- else {
37
- return Uint8Array.from(Buffer.from(base64, "base64"));
38
- }
39
- }
40
- catch (error) {
41
- throw new Error("Invalid Base64 string.");
42
- }
43
- }
44
- const base64 = {
45
- encode,
46
- decode
47
- };module.exports=base64;//# sourceMappingURL=base64.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base64.js","sources":["../../../src/include/lib/base64.ts"],"sourcesContent":["/**\n * Encodes a Uint8Array to Base64 (for browser or Node.js).\n * @param data - The Uint8Array data to encode.\n * @returns The Base64-encoded string.\n */\nfunction encode(data: Uint8Array): string {\n let base64 = \"\";\n if (typeof window !== \"undefined\") {\n base64 = btoa(String.fromCharCode(...Array.from(data)));\n } else {\n base64 = Buffer.from(data).toString(\"base64\");\n }\n let paddingCount = (base64.match(/=+$/) || [''])[0].length;\n if (paddingCount > 0) {\n base64 = base64.replace(/=+$/, () => `$${paddingCount}`);\n }\n return base64\n}\n\n/**\n * Decodes a Base64 string to a Uint8Array (for browser or Node.js).\n * @param base64String - The Base64 string to decode.\n * @returns The decoded Uint8Array.\n */\nfunction decode(base64: string): Uint8Array {\n try {\n base64 = base64.replace(/\\$(\\d)/, (_match, count) => '='.repeat(parseInt(count)));\n if (typeof window !== \"undefined\") {\n const binaryString = atob(base64);\n const byteArray = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n byteArray[i] = binaryString.charCodeAt(i);\n }\n return byteArray;\n } else {\n return Uint8Array.from(Buffer.from(base64, \"base64\"));\n }\n } catch (error) {\n throw new Error(\"Invalid Base64 string.\");\n }\n}\n\nconst base64 = {\n encode,\n decode\n}\n\nexport default base64;"],"names":[],"mappings":"aAAA;;;;AAIG;AACH,SAAS,MAAM,CAAC,IAAgB,EAAA;IAC7B,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,QAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,IAAA;AAAM,SAAA;AACJ,QAAA,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC/C,IAAA;AACD,IAAA,IAAI,YAAY,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;IAC1D,IAAI,YAAY,GAAG,CAAC,EAAE;AACnB,QAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAC;AAC1D,IAAA;AACD,IAAA,OAAO,MAAM;AAChB;AAEA;;;;AAIG;AACH,SAAS,MAAM,CAAC,MAAc,EAAA;IAC3B,IAAI;QACD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACjF,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC;AACrD,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC3C,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3C,YAAA;AACD,YAAA,OAAO,SAAS;AAClB,QAAA;AAAM,aAAA;AACJ,YAAA,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACvD,QAAA;AACH,IAAA;AAAC,IAAA,OAAO,KAAK,EAAE;AACb,QAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AAC3C,IAAA;AACJ;AAEA,MAAM,MAAM,GAAG;IACZ,MAAM;IACN;"}
@@ -1,47 +0,0 @@
1
- /**
2
- * Encodes a Uint8Array to Base64 (for browser or Node.js).
3
- * @param data - The Uint8Array data to encode.
4
- * @returns The Base64-encoded string.
5
- */
6
- function encode(data) {
7
- let base64 = "";
8
- if (typeof window !== "undefined") {
9
- base64 = btoa(String.fromCharCode(...Array.from(data)));
10
- }
11
- else {
12
- base64 = Buffer.from(data).toString("base64");
13
- }
14
- let paddingCount = (base64.match(/=+$/) || [''])[0].length;
15
- if (paddingCount > 0) {
16
- base64 = base64.replace(/=+$/, () => `$${paddingCount}`);
17
- }
18
- return base64;
19
- }
20
- /**
21
- * Decodes a Base64 string to a Uint8Array (for browser or Node.js).
22
- * @param base64String - The Base64 string to decode.
23
- * @returns The decoded Uint8Array.
24
- */
25
- function decode(base64) {
26
- try {
27
- base64 = base64.replace(/\$(\d)/, (_match, count) => '='.repeat(parseInt(count)));
28
- if (typeof window !== "undefined") {
29
- const binaryString = atob(base64);
30
- const byteArray = new Uint8Array(binaryString.length);
31
- for (let i = 0; i < binaryString.length; i++) {
32
- byteArray[i] = binaryString.charCodeAt(i);
33
- }
34
- return byteArray;
35
- }
36
- else {
37
- return Uint8Array.from(Buffer.from(base64, "base64"));
38
- }
39
- }
40
- catch (error) {
41
- throw new Error("Invalid Base64 string.");
42
- }
43
- }
44
- const base64 = {
45
- encode,
46
- decode
47
- };export{base64 as default};//# sourceMappingURL=base64.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base64.mjs","sources":["../../../src/include/lib/base64.ts"],"sourcesContent":["/**\n * Encodes a Uint8Array to Base64 (for browser or Node.js).\n * @param data - The Uint8Array data to encode.\n * @returns The Base64-encoded string.\n */\nfunction encode(data: Uint8Array): string {\n let base64 = \"\";\n if (typeof window !== \"undefined\") {\n base64 = btoa(String.fromCharCode(...Array.from(data)));\n } else {\n base64 = Buffer.from(data).toString(\"base64\");\n }\n let paddingCount = (base64.match(/=+$/) || [''])[0].length;\n if (paddingCount > 0) {\n base64 = base64.replace(/=+$/, () => `$${paddingCount}`);\n }\n return base64\n}\n\n/**\n * Decodes a Base64 string to a Uint8Array (for browser or Node.js).\n * @param base64String - The Base64 string to decode.\n * @returns The decoded Uint8Array.\n */\nfunction decode(base64: string): Uint8Array {\n try {\n base64 = base64.replace(/\\$(\\d)/, (_match, count) => '='.repeat(parseInt(count)));\n if (typeof window !== \"undefined\") {\n const binaryString = atob(base64);\n const byteArray = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n byteArray[i] = binaryString.charCodeAt(i);\n }\n return byteArray;\n } else {\n return Uint8Array.from(Buffer.from(base64, \"base64\"));\n }\n } catch (error) {\n throw new Error(\"Invalid Base64 string.\");\n }\n}\n\nconst base64 = {\n encode,\n decode\n}\n\nexport default base64;"],"names":[],"mappings":"AAAA;;;;AAIG;AACH,SAAS,MAAM,CAAC,IAAgB,EAAA;IAC7B,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,QAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,IAAA;AAAM,SAAA;AACJ,QAAA,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC/C,IAAA;AACD,IAAA,IAAI,YAAY,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;IAC1D,IAAI,YAAY,GAAG,CAAC,EAAE;AACnB,QAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAC;AAC1D,IAAA;AACD,IAAA,OAAO,MAAM;AAChB;AAEA;;;;AAIG;AACH,SAAS,MAAM,CAAC,MAAc,EAAA;IAC3B,IAAI;QACD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACjF,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC;AACrD,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC3C,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3C,YAAA;AACD,YAAA,OAAO,SAAS;AAClB,QAAA;AAAM,aAAA;AACJ,YAAA,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACvD,QAAA;AACH,IAAA;AAAC,IAAA,OAAO,KAAK,EAAE;AACb,QAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AAC3C,IAAA;AACJ;AAEA,MAAM,MAAM,GAAG;IACZ,MAAM;IACN;"}
@@ -1,72 +0,0 @@
1
- 'use strict';class SecurequCache {
2
- constructor(config) {
3
- this.store = new Map();
4
- this.defaultTTL = config.ttl;
5
- this.limit = config.limit;
6
- }
7
- /**
8
- * Set a value in the cache with a global TTL
9
- * @param key - Cache key
10
- * @param value - Cache value
11
- */
12
- set(key, value) {
13
- // If the cache exceeds the limit, remove the oldest (least recently used) item
14
- if (this.store.size >= this.limit) {
15
- const firstKey = this.store.keys().next().value;
16
- this.store.delete(firstKey);
17
- }
18
- // If the key already exists, remove the old timeout
19
- if (this.store.has(key)) {
20
- clearTimeout(this.store.get(key).timeout);
21
- }
22
- // Set the new expiration timeout
23
- const timeout = setTimeout(() => {
24
- this.store.delete(key); // Delete expired cache entry
25
- }, this.defaultTTL);
26
- // Store the value and its expiration info
27
- this.store.set(key, { value, timeout, expiresAt: Date.now() + this.defaultTTL });
28
- }
29
- /**
30
- * Get a value from the cache and auto-renew the TTL if not expired
31
- * @param key - Cache key
32
- * @returns The cached value or null if expired
33
- */
34
- get(key) {
35
- const entry = this.store.get(key);
36
- if (!entry) {
37
- return null; // No data found in cache
38
- }
39
- // Check if the cache has expired
40
- if (Date.now() > entry.expiresAt) {
41
- this.store.delete(key); // Automatically delete expired cache entry
42
- return null;
43
- }
44
- this.set(key, entry.value);
45
- return entry.value;
46
- }
47
- /**
48
- * Delete a key from the cache
49
- * @param key - Cache key
50
- */
51
- delete(key) {
52
- const entry = this.store.get(key);
53
- if (entry) {
54
- clearTimeout(entry.timeout); // Clear the timeout
55
- this.store.delete(key); // Delete from cache
56
- }
57
- }
58
- /**
59
- * Clear the entire cache
60
- */
61
- clear() {
62
- this.store.forEach((entry) => clearTimeout(entry.timeout)); // Clear all timeouts
63
- this.store.clear(); // Clear the store
64
- }
65
- /**
66
- * Get the current size of the cache
67
- * @returns The number of items in the cache
68
- */
69
- size() {
70
- return this.store.size;
71
- }
72
- }module.exports=SecurequCache;//# sourceMappingURL=cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sources":["../../../src/include/lib/cache.ts"],"sourcesContent":["class SecurequCache<T> {\n private store: Map<string, { value: T; timeout: NodeJS.Timeout; expiresAt: number }>;\n private defaultTTL: number; // Global TTL for all cache entries\n private limit: number; // Limit on the number of cache entries\n\n constructor(config: { ttl: number; limit: number }) {\n this.store = new Map();\n this.defaultTTL = config.ttl;\n this.limit = config.limit;\n }\n\n /**\n * Set a value in the cache with a global TTL\n * @param key - Cache key\n * @param value - Cache value\n */\n set(key: string, value: T): void {\n // If the cache exceeds the limit, remove the oldest (least recently used) item\n if (this.store.size >= this.limit) {\n const firstKey: any = this.store.keys().next().value;\n this.store.delete(firstKey);\n }\n\n // If the key already exists, remove the old timeout\n if (this.store.has(key)) {\n clearTimeout(this.store.get(key)!.timeout);\n }\n\n // Set the new expiration timeout\n const timeout = setTimeout(() => {\n this.store.delete(key); // Delete expired cache entry\n }, this.defaultTTL);\n\n // Store the value and its expiration info\n this.store.set(key, { value, timeout, expiresAt: Date.now() + this.defaultTTL });\n }\n\n /**\n * Get a value from the cache and auto-renew the TTL if not expired\n * @param key - Cache key\n * @returns The cached value or null if expired\n */\n get(key: string): T | null {\n const entry = this.store.get(key);\n\n if (!entry) {\n return null; // No data found in cache\n }\n\n // Check if the cache has expired\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key); // Automatically delete expired cache entry\n return null;\n }\n\n this.set(key, entry.value);\n return entry.value;\n }\n\n /**\n * Delete a key from the cache\n * @param key - Cache key\n */\n delete(key: string): void {\n const entry = this.store.get(key);\n if (entry) {\n clearTimeout(entry.timeout); // Clear the timeout\n this.store.delete(key); // Delete from cache\n }\n }\n\n /**\n * Clear the entire cache\n */\n clear(): void {\n this.store.forEach((entry) => clearTimeout(entry.timeout)); // Clear all timeouts\n this.store.clear(); // Clear the store\n }\n\n /**\n * Get the current size of the cache\n * @returns The number of items in the cache\n */\n size(): number {\n return this.store.size;\n }\n}\n\n\nexport default SecurequCache"],"names":[],"mappings":"aAAA,MAAM,aAAa,CAAA;AAKhB,IAAA,WAAA,CAAY,MAAsC,EAAA;AAC/C,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG;AAC5B,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;IAC5B;AAEA;;;;AAIG;IACH,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAA;;QAEtB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAChC,YAAA,MAAM,QAAQ,GAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;AACpD,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC7B,QAAA;;QAGD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,OAAO,CAAC;AAC5C,QAAA;;AAGD,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,MAAK;YAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1B,QAAA,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;;QAGnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACnF;AAEA;;;;AAIG;AACH,IAAA,GAAG,CAAC,GAAW,EAAA;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE;YACT,OAAO,IAAI,CAAC;AACd,QAAA;;QAGD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE;YAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACvB,YAAA,OAAO,IAAI;AACb,QAAA;QAED,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;QAC1B,OAAO,KAAK,CAAC,KAAK;IACrB;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,GAAW,EAAA;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACjC,QAAA,IAAI,KAAK,EAAE;AACR,YAAA,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,QAAA;IACJ;AAEA;;AAEG;IACH,KAAK,GAAA;AACF,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB;AAEA;;;AAGG;IACH,IAAI,GAAA;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI;IACzB;AACF"}