securequ 1.1.6 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/server/Base.mjs CHANGED
@@ -1 +1,102 @@
1
- import e from"../include/crypto.mjs";import t from"./Router.mjs";class s extends t{constructor(e){if(super(),this.secret=null,this.clients=new Map,this.uploadMeta=new Map,this.CONTENT_TYPE="application/octet-stream",!e.basepath)throw new Error("Basepath is required");if(!e.clients||0===Object.keys(e.clients).length)throw new Error("Atleast one client is required");e.basepath.startsWith("/")||(e.basepath=`/${e.basepath}`),e.basepath.endsWith("/")&&(e.basepath=e.basepath.substring(0,e.basepath.length-1)),e.file&&(e.file.maxFilesize=e.file.maxFilesize||51200,e.file.checkFileType=e.file.checkFileType||!0),e.mode=["production","development"].includes(e.mode||"")?e.mode:"production",this.config=e;for(let e of this.config.clients)this.clients.set(e.origin,e.secret)}async getSecret(){return this.secret||(this.secret=await e.hash(Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15))),this.secret}async clientInfo(t,s){const i="/"!==t&&"development"===this.config.mode;let n=t.split("?");const a=(t=(t=(t=(t=n[0]).replace(this.config.basepath+"/","")).endsWith("/")?t.substring(0,t.length-1):t).startsWith("/")?t.substring(1):t).split("/"),r=a.shift();let o=this.clients.get(s);if(o||(o=this.clients.get("*")),!(null==r?void 0:r.length)||!o)return null;let c=o.substring(0,r.length),h={};return n.length>1&&(h=i?Object.fromEntries(new URLSearchParams(decodeURIComponent(n[1]))):await e.decrypt(decodeURIComponent(n[1]),c)),{path:"/"+a.join("/"),secret:c,hash:r,searchParams:h}}async isValidSigneture(t,s){const i=await this.getSecret();if(this.secret&&t){let n=await e.decrypt(t,i),a=n.hash===s,r=n.expire>Date.now();if(!a)throw new Response("Invalid Signeture",{status:403});if(!r)throw new Response("Signeture expired",{status:403})}}async handleRequest(e,t){if(this.config.accept){if(!await this.config.accept(e,t))throw new Response("Request not accepted",{status:403})}const{path:s,method:i}=e;let n=Object.values(this.routes[i]);for(let{test:i,handler:a}of n){const n=i(s);n&&await a(Object.assign(Object.assign({},e),{params:n.params}),t)}}}export{s as default};//# sourceMappingURL=Base.mjs.map
1
+ import crypto from'../include/crypto.mjs';import Router from'./Router.mjs';class SecurequServerBase extends Router {
2
+ constructor(config) {
3
+ super();
4
+ this.secret = null;
5
+ this.clients = new Map();
6
+ this.uploadMeta = new Map();
7
+ this.CONTENT_TYPE = "application/octet-stream";
8
+ if (!config.basepath)
9
+ throw new Error("Basepath is required");
10
+ if (!config.clients || Object.keys(config.clients).length === 0)
11
+ throw new Error("Atleast one client is required");
12
+ if (!config.basepath.startsWith("/"))
13
+ config.basepath = `/${config.basepath}`;
14
+ if (config.basepath.endsWith("/"))
15
+ config.basepath = config.basepath.substring(0, config.basepath.length - 1);
16
+ if (config.file) {
17
+ config.file.maxFilesize = config.file.maxFilesize || 50 * 1024; // 50MB default
18
+ config.file.checkFileType = config.file.checkFileType || true;
19
+ }
20
+ config.mode = ["production", 'development'].includes(config.mode || "") ? config.mode : "production";
21
+ this.config = config;
22
+ for (let client of this.config.clients) {
23
+ this.clients.set(client.origin, client.secret);
24
+ }
25
+ }
26
+ async getSecret() {
27
+ if (!this.secret) {
28
+ this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15));
29
+ }
30
+ return this.secret;
31
+ }
32
+ async clientInfo(path, origin) {
33
+ const isDev = path !== '/' && this.config.mode === 'development';
34
+ let splitUrl = path.split("?");
35
+ path = splitUrl[0];
36
+ path = path.replace(this.config.basepath + "/", "");
37
+ path = path.endsWith('/') ? path.substring(0, path.length - 1) : path;
38
+ path = path.startsWith('/') ? path.substring(1) : path;
39
+ const split = path.split("/");
40
+ const hash = split.shift();
41
+ let client = this.clients.get(origin);
42
+ if (!client) {
43
+ client = this.clients.get("*");
44
+ }
45
+ if (!(hash === null || hash === void 0 ? void 0 : hash.length) || !client)
46
+ return null;
47
+ let secret = client.substring(0, hash.length);
48
+ let searchParams = {};
49
+ if (splitUrl.length > 1) {
50
+ const uparams = new URLSearchParams(decodeURIComponent(splitUrl[1]));
51
+ if (isDev) {
52
+ searchParams = Object.fromEntries(uparams);
53
+ }
54
+ else {
55
+ const keys = Array.from(uparams.keys());
56
+ if (keys.length) {
57
+ const key = keys[0];
58
+ const value = uparams.get(key);
59
+ const decrypted = await crypto.decrypt(value, secret);
60
+ if (decrypted && decrypted.key === key) {
61
+ searchParams = decrypted.params || {};
62
+ }
63
+ }
64
+ }
65
+ }
66
+ return {
67
+ path: "/" + split.join('/'),
68
+ secret,
69
+ hash,
70
+ searchParams
71
+ };
72
+ }
73
+ async isValidSigneture(signeture, hash) {
74
+ const serverSecret = await this.getSecret();
75
+ if (this.secret && signeture) {
76
+ let info = await crypto.decrypt(signeture, serverSecret);
77
+ if (!info)
78
+ throw new Response("Invalid Signeture", { status: 403 });
79
+ let isHashValid = info.hash === hash;
80
+ let isNotExpired = info.expire > Date.now();
81
+ if (!isHashValid)
82
+ throw new Response("Invalid Signeture", { status: 403 });
83
+ if (!isNotExpired)
84
+ throw new Response("Signeture expired", { status: 403 });
85
+ }
86
+ }
87
+ async handleRequest(info, metadata) {
88
+ if (this.config.accept) {
89
+ const is = await this.config.accept(info, metadata);
90
+ if (!is)
91
+ throw new Response("Request not accepted", { status: 403 });
92
+ }
93
+ const { path, method } = info;
94
+ let values = Object.values(this.routes[method]);
95
+ for (let { test, handler } of values) {
96
+ const match = test(path);
97
+ if (match) {
98
+ await handler(Object.assign(Object.assign({}, info), { params: match.params }), metadata);
99
+ }
100
+ }
101
+ }
102
+ }export{SecurequServerBase as default};//# sourceMappingURL=Base.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Base.mjs","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, Metadata } from \"./types\";\n\nclass SecurequServerBase extends Router {\n protected config: SecurequServerConfig;\n protected secret: string | null = null\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n constructor(config: SecurequServerConfig) {\n super()\n if (!config.basepath) throw new Error(\"Basepath is required\");\n if (!config.clients || Object.keys(config.clients).length === 0) throw new Error(\"Atleast one client is required\");\n if (!config.basepath.startsWith(\"/\")) config.basepath = `/${config.basepath}`;\n if (config.basepath.endsWith(\"/\")) config.basepath = config.basepath.substring(0, config.basepath.length - 1);\n if (config.file) {\n config.file.maxFilesize = config.file.maxFilesize || 50 * 1024 // 50MB default\n config.file.checkFileType = config.file.checkFileType || true\n }\n config.mode = [\"production\", 'development'].includes(config.mode || \"\") ? config.mode : \"production\"\n this.config = config\n for (let client of this.config.clients) {\n this.clients.set(client.origin, client.secret)\n }\n }\n\n protected async getSecret() {\n if (!this.secret) {\n this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15))\n }\n return this.secret\n }\n\n protected async clientInfo(path: string, origin: string) {\n const isDev = path !== '/' && this.config.mode === 'development'\n let splitUrl = path.split(\"?\")\n path = splitUrl[0]\n path = path.replace(this.config.basepath + \"/\", \"\")\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n path = path.startsWith('/') ? path.substring(1) : path\n\n const split = path.split(\"/\")\n const hash = split.shift()\n let client = this.clients.get(origin)\n if (!client) {\n client = this.clients.get(\"*\")\n }\n\n if (!hash?.length || !client) return null\n let secret = client.substring(0, hash.length as number);\n let searchParams: { [key: string]: any } = {}\n if (splitUrl.length > 1) {\n if (isDev) {\n searchParams = Object.fromEntries(new URLSearchParams(decodeURIComponent(splitUrl[1])))\n } else {\n searchParams = await crypto.decrypt(decodeURIComponent(splitUrl[1]), secret) as any\n }\n }\n return {\n path: \"/\" + split.join('/'),\n secret,\n hash,\n searchParams\n }\n }\n\n protected async isValidSigneture(signeture: string | undefined, hash: string) {\n const serverSecret = await this.getSecret()\n if (this.secret && signeture) {\n let info: any = await crypto.decrypt(signeture, serverSecret)\n let isHashValid = info.hash === hash\n let isNotExpired = info.expire > Date.now()\n if (!isHashValid) throw new Response(\"Invalid Signeture\", { status: 403 });\n if (!isNotExpired) throw new Response(\"Signeture expired\", { status: 403 });\n }\n }\n\n async handleRequest(info: HandlerInfo, metadata?: Metadata) {\n if (this.config.accept) {\n const is = await this.config.accept(info, metadata)\n if (!is) throw new Response(\"Request not accepted\", { status: 403 })\n }\n\n const { path, method } = info;\n let values: any = Object.values(this.routes[method]);\n for (let { test, handler } of values) {\n const match = test(path)\n if (match) {\n await handler({ ...info, params: match.params }, metadata)\n }\n }\n }\n\n}\n\nexport default SecurequServerBase;"],"names":["SecurequServerBase","Router","constructor","config","super","this","secret","clients","Map","uploadMeta","CONTENT_TYPE","basepath","Error","Object","keys","length","startsWith","endsWith","substring","file","maxFilesize","checkFileType","mode","includes","client","set","origin","getSecret","crypto","hash","Math","random","toString","clientInfo","path","isDev","splitUrl","split","replace","shift","get","searchParams","fromEntries","URLSearchParams","decodeURIComponent","decrypt","join","isValidSigneture","signeture","serverSecret","info","isHashValid","isNotExpired","expire","Date","now","Response","status","handleRequest","metadata","accept","method","values","routes","test","handler","match","assign","params"],"mappings":"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"}
1
+ {"version":3,"file":"Base.mjs","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, Metadata } from \"./types\";\n\nclass SecurequServerBase extends Router {\n protected config: SecurequServerConfig;\n protected secret: string | null = null\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n constructor(config: SecurequServerConfig) {\n super()\n if (!config.basepath) throw new Error(\"Basepath is required\");\n if (!config.clients || Object.keys(config.clients).length === 0) throw new Error(\"Atleast one client is required\");\n if (!config.basepath.startsWith(\"/\")) config.basepath = `/${config.basepath}`;\n if (config.basepath.endsWith(\"/\")) config.basepath = config.basepath.substring(0, config.basepath.length - 1);\n if (config.file) {\n config.file.maxFilesize = config.file.maxFilesize || 50 * 1024 // 50MB default\n config.file.checkFileType = config.file.checkFileType || true\n }\n config.mode = [\"production\", 'development'].includes(config.mode || \"\") ? config.mode : \"production\"\n this.config = config\n for (let client of this.config.clients) {\n this.clients.set(client.origin, client.secret)\n }\n }\n\n protected async getSecret() {\n if (!this.secret) {\n this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15))\n }\n return this.secret\n }\n\n protected async clientInfo(path: string, origin: string) {\n const isDev = path !== '/' && this.config.mode === 'development'\n let splitUrl = path.split(\"?\")\n path = splitUrl[0]\n path = path.replace(this.config.basepath + \"/\", \"\")\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n path = path.startsWith('/') ? path.substring(1) : path\n\n const split = path.split(\"/\")\n const hash = split.shift()\n let client = this.clients.get(origin)\n if (!client) {\n client = this.clients.get(\"*\")\n }\n\n if (!hash?.length || !client) return null\n let secret = client.substring(0, hash.length as number);\n let searchParams: { [key: string]: any } = {}\n if (splitUrl.length > 1) {\n const uparams = new URLSearchParams(decodeURIComponent(splitUrl[1]))\n if (isDev) {\n searchParams = Object.fromEntries(uparams)\n } else {\n const keys = Array.from(uparams.keys());\n if (keys.length) {\n const key = keys[0]\n const value = uparams.get(key) as string;\n const decrypted: any = await crypto.decrypt(value, secret)\n if (decrypted && decrypted.key === key) {\n searchParams = decrypted.params || {}\n }\n }\n }\n }\n return {\n path: \"/\" + split.join('/'),\n secret,\n hash,\n searchParams\n }\n }\n\n protected async isValidSigneture(signeture: string | undefined, hash: string) {\n const serverSecret = await this.getSecret()\n if (this.secret && signeture) {\n let info: any = await crypto.decrypt(signeture, serverSecret)\n if (!info) throw new Response(\"Invalid Signeture\", { status: 403 });\n let isHashValid = info.hash === hash\n let isNotExpired = info.expire > Date.now()\n if (!isHashValid) throw new Response(\"Invalid Signeture\", { status: 403 });\n if (!isNotExpired) throw new Response(\"Signeture expired\", { status: 403 });\n }\n }\n\n async handleRequest(info: HandlerInfo, metadata?: Metadata) {\n if (this.config.accept) {\n const is = await this.config.accept(info, metadata)\n if (!is) throw new Response(\"Request not accepted\", { status: 403 })\n }\n\n const { path, method } = info;\n let values: any = Object.values(this.routes[method]);\n for (let { test, handler } of values) {\n const match = test(path)\n if (match) {\n await handler({ ...info, params: match.params }, metadata)\n }\n }\n }\n\n}\n\nexport default SecurequServerBase;"],"names":[],"mappings":"2EAIA,MAAM,kBAAmB,SAAQ,MAAM,CAAA;AAOpC,IAAA,WAAA,CAAY,MAA4B,EAAA;AACrC,QAAA,KAAK,EAAE;QANA,IAAA,CAAA,MAAM,GAAkB,IAAI;AAC5B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,GAAG,EAA0C;AAC3D,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,GAAG,EAA+C;QACpE,IAAA,CAAA,YAAY,GAAG,0BAA0B;QAI/C,IAAI,CAAC,MAAM,CAAC,QAAQ;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;AAC7D,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;QAClH,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,QAAQ,GAAG,CAAA,CAAA,EAAI,MAAM,CAAC,QAAQ,EAAE;AAC7E,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7G,IAAI,MAAM,CAAC,IAAI,EAAE;AACd,YAAA,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,GAAG,IAAI,CAAA;AAC9D,YAAA,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI;AAC/D,QAAA;QACD,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,YAAY;AACpG,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACrC,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;AAChD,QAAA;IACJ;AAEU,IAAA,MAAM,SAAS,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5H,QAAA;QACD,OAAO,IAAI,CAAC,MAAM;IACrB;AAEU,IAAA,MAAM,UAAU,CAAC,IAAY,EAAE,MAAc,EAAA;AACpD,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa;QAChE,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC;AAClB,QAAA,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,EAAE,CAAC;QACnD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI;QACrE,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;QAEtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC7B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE;QAC1B,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE;YACV,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,QAAA;AAED,QAAA,IAAI,EAAC,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,MAAM,CAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AACzC,QAAA,IAAI,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAgB,CAAC;QACvD,IAAI,YAAY,GAA2B,EAAE;AAC7C,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,YAAA,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,YAAA,IAAI,KAAK,EAAE;AACR,gBAAA,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;AAC5C,YAAA;AAAM,iBAAA;gBACJ,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,MAAM,EAAE;AACd,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;oBACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAW;oBACxC,MAAM,SAAS,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AAC1D,oBAAA,IAAI,SAAS,IAAI,SAAS,CAAC,GAAG,KAAK,GAAG,EAAE;AACrC,wBAAA,YAAY,GAAG,SAAS,CAAC,MAAM,IAAI,EAAE;AACvC,oBAAA;AACH,gBAAA;AACH,YAAA;AACH,QAAA;QACD,OAAO;YACJ,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;YAC3B,MAAM;YACN,IAAI;YACJ;SACF;IACJ;AAEU,IAAA,MAAM,gBAAgB,CAAC,SAA6B,EAAE,IAAY,EAAA;AACzE,QAAA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;AAC3C,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE;YAC3B,IAAI,IAAI,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC;AAC7D,YAAA,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACnE,YAAA,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI;YACpC,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AAC3C,YAAA,IAAI,CAAC,WAAW;gBAAE,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC1E,YAAA,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC7E,QAAA;IACJ;AAEA,IAAA,MAAM,aAAa,CAAC,IAAiB,EAAE,QAAmB,EAAA;AACvD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACrB,YAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;AACnD,YAAA,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACtE,QAAA;AAED,QAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;AAC7B,QAAA,IAAI,MAAM,GAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,KAAK,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,MAAM,EAAE;AACnC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,KAAK,EAAE;AACR,gBAAA,MAAM,OAAO,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,IAAI,CAAA,EAAA,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAA,CAAA,EAAI,QAAQ,CAAC;AAC5D,YAAA;AACH,QAAA;IACJ;AAEF"}
package/server/Router.js CHANGED
@@ -1 +1,30 @@
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
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var pathToRegexp=require('path-to-regexp');class Router {
2
+ constructor() {
3
+ this.routes = {
4
+ GET: {},
5
+ POST: {},
6
+ PUT: {},
7
+ DELETE: {}
8
+ };
9
+ }
10
+ async addRoute(path, method, handler) {
11
+ if (this.routes[method][path])
12
+ return;
13
+ this.routes[method][path] = {
14
+ handler,
15
+ test: pathToRegexp.match(path)
16
+ };
17
+ }
18
+ async get(path, handler) {
19
+ this.addRoute(path, 'GET', handler);
20
+ }
21
+ async post(path, handler) {
22
+ this.addRoute(path, 'POST', handler);
23
+ }
24
+ async put(path, handler) {
25
+ this.addRoute(path, 'PUT', handler);
26
+ }
27
+ async delete(path, handler) {
28
+ this.addRoute(path, 'DELETE', handler);
29
+ }
30
+ }exports.default=Router;//# sourceMappingURL=Router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Router.js","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HTTPMethods } from \"../client/types\";\nimport { HandlerFunction, RouteFactory } from \"./types\"\nimport { match } from \"path-to-regexp\";\n\nclass Router {\n protected routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n}\n\nexport default Router;"],"names":["Object","defineProperty","exports","value","pathToRegexp","require","default","constructor","this","routes","GET","POST","PUT","DELETE","addRoute","path","method","handler","test","match","get","post","put"],"mappings":"AAIA,aAAAA,OAAAC,eAAAC,QAAA,aAAA,CAAAC,OAAA,IAAA,IAAAC,EAAAC,QAAA,kBA+BCH,QAAAI,QA/BD,MAAA,WAAAC,GACaC,KAAAC,OAAuB,CAC9BC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,OAAQ,CAAA,EA0Bd,CAvBG,cAAMC,CAASC,EAAcC,EAAqBC,GAC3CT,KAAKC,OAAOO,GAAQD,KACxBP,KAAKC,OAAOO,GAAQD,GAAQ,CACzBE,UACAC,KAAMC,EAAAA,MAAMJ,IAElB,CAEA,SAAMK,CAAIL,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,UAAMI,CAAKN,EAAcE,GACtBT,KAAKM,SAASC,EAAM,OAAQE,EAC/B,CAEA,SAAMK,CAAIP,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,YAAM,CAAOF,EAAcE,GACxBT,KAAKM,SAASC,EAAM,SAAUE,EACjC"}
1
+ {"version":3,"file":"Router.js","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HTTPMethods } from \"../client/types\";\nimport { HandlerFunction, RouteFactory } from \"./types\"\nimport { match } from \"path-to-regexp\";\n\nclass Router {\n protected routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n}\n\nexport default Router;"],"names":["match"],"mappings":"iHAIA,MAAM,MAAM,CAAA;AAAZ,IAAA,WAAA,GAAA;AACa,QAAA,IAAA,CAAA,MAAM,GAAiB;AAC9B,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,MAAM,EAAE;SACV;IAyBJ;AAvBG,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,EAAEA,kBAAK,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;AACF"}
package/server/Router.mjs CHANGED
@@ -1 +1,30 @@
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
1
+ import {match}from'path-to-regexp';class Router {
2
+ constructor() {
3
+ this.routes = {
4
+ GET: {},
5
+ POST: {},
6
+ PUT: {},
7
+ DELETE: {}
8
+ };
9
+ }
10
+ async addRoute(path, method, handler) {
11
+ if (this.routes[method][path])
12
+ return;
13
+ this.routes[method][path] = {
14
+ handler,
15
+ test: match(path)
16
+ };
17
+ }
18
+ async get(path, handler) {
19
+ this.addRoute(path, 'GET', handler);
20
+ }
21
+ async post(path, handler) {
22
+ this.addRoute(path, 'POST', handler);
23
+ }
24
+ async put(path, handler) {
25
+ this.addRoute(path, 'PUT', handler);
26
+ }
27
+ async delete(path, handler) {
28
+ this.addRoute(path, 'DELETE', handler);
29
+ }
30
+ }export{Router as default};//# sourceMappingURL=Router.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Router.mjs","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HTTPMethods } from \"../client/types\";\nimport { HandlerFunction, RouteFactory } from \"./types\"\nimport { match } from \"path-to-regexp\";\n\nclass Router {\n protected routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n}\n\nexport default Router;"],"names":["match","Router","constructor","this","routes","GET","POST","PUT","DELETE","addRoute","path","method","handler","test","get","post","put"],"mappings":"gBAIAA,MAAA,iBAAA,MAAMC,EAAN,WAAAC,GACaC,KAAAC,OAAuB,CAC9BC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,OAAQ,CAAA,EA0Bd,CAvBG,cAAMC,CAASC,EAAcC,EAAqBC,GAC3CT,KAAKC,OAAOO,GAAQD,KACxBP,KAAKC,OAAOO,GAAQD,GAAQ,CACzBE,UACAC,KAAMb,EAAMU,IAElB,CAEA,SAAMI,CAAIJ,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,UAAMG,CAAKL,EAAcE,GACtBT,KAAKM,SAASC,EAAM,OAAQE,EAC/B,CAEA,SAAMI,CAAIN,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,YAAM,CAAOF,EAAcE,GACxBT,KAAKM,SAASC,EAAM,SAAUE,EACjC,SACFX"}
1
+ {"version":3,"file":"Router.mjs","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HTTPMethods } from \"../client/types\";\nimport { HandlerFunction, RouteFactory } from \"./types\"\nimport { match } from \"path-to-regexp\";\n\nclass Router {\n protected routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n}\n\nexport default Router;"],"names":[],"mappings":"mCAIA,MAAM,MAAM,CAAA;AAAZ,IAAA,WAAA,GAAA;AACa,QAAA,IAAA,CAAA,MAAM,GAAiB;AAC9B,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,MAAM,EAAE;SACV;IAyBJ;AAvBG,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;AACF"}
package/server/index.js CHANGED
@@ -1 +1,179 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),t=require("../include/crypto.js"),i=require("./Base.js"),n=require("../include/FileScaner.js"),a=require("../include/File.js");class s extends i.default{async handshake(e,i){var n,a;const s=await t.default.decryptBuffer(e,i.secret),r=await this.getSecret();if(!s)throw new Error("Invalid handshake data");if(s.hash!==i.hash)throw new Error("Invalid handshake");if(s.secret!==i.secret)throw new Error("Invalid handshake secret");if(Date.now()-s.clientTime>3e4)throw new Error("Handshake expired");const o=new Date,l=new Date(s.clientTime).getTime()-o.getTime();throw{dev:"development"===this.config.mode,timeDiffarenc:l,maxFileSize:(null===(n=this.config.file)||void 0===n?void 0:n.maxFilesize)||null,checkFileType:(null===(a=this.config.file)||void 0===a?void 0:a.checkFileType)||!1,signeture:await t.default.encrypt({expire:Date.now()+3e4,hash:i.hash},r)}}async uploadFile(t,i){var s,r,o,l,c;if(!(null===(c=this.config.file)||void 0===c?void 0:c.upload))throw new Response("Upload not supported",{status:403});const d=await a.getFileId(t),u=this.config.file.chunkSize,h={fileId:d,name:t.name,size:t.size,type:t.type,totalChunks:a.totalChunks(t,u),chunkIndex:0,isFinish:!1};try{for(var f,w=!0,p=e.__asyncValues(a.chunkFile(t,u));!(s=(f=await p.next()).done);){l=f.value,w=!1;try{let{chunk:e,chunkIndex:t}=l;if(this.config.file.checkFileType&&0===t){if(!n.fileScaner(e))throw new Error("Unknown or unsupported file type")}if(h.chunkIndex=t,h.isFinish=t+1===h.totalChunks,await this.config.file.upload(e,h),i){i(Math.floor((t+1)/h.totalChunks*100))}}finally{w=!0}}}catch(e){r={error:e}}finally{try{w||s||!(o=p.return)||await o.call(p)}finally{if(r)throw r.error}}return h}async deleteFile(e){var t;if(!(null===(t=this.config.file)||void 0===t?void 0:t.delete))throw new Response("Delete not supported",{status:403});await this.config.file.delete(e)}async listen(e,{body:i,headers:a,metadata:s}){const r=a["x-signeture"]||"",o=a["x-origin"]||"",l=a["x-method"]||"POST";let c=await this.clientInfo(e,o);if(!c)return{status:403,content:"Client not allowed"};let d=c.path;const u="/"!==d&&"development"===this.config.mode;try{if("/"===d&&"POST"===l&&await this.handshake(i,c),"/"===d&&"GET"===l)throw new Response("Invalid method",{status:405});const e=await t.default.decrypt(r,c.secret);if(e.expire<Date.now())throw new Response("Request expired",{status:403});await this.isValidSigneture(e.signeture,c.hash);let a=null;if(i)if(u){const e=(new TextDecoder).decode(i);a=JSON.parse(e)}else a=await t.default.decryptBuffer(i,c.secret);if("/"===d){const e=this.config.file;if("PUT"===l){if(!(null==e?void 0:e.upload))throw new Response("Upload not supported",{status:403});const t=a.filemeta,i=a.chunk;if(0===t.chunkIndex&&e.checkFileType&&!n.fileScaner(i))throw new Error("Unknown or unsupported file type");throw await e.upload(i,t),{success:!0}}throw"DELETE"===l?(await this.deleteFile(a.fileId),{success:!0}):new Response("Invalid method",{status:405})}await this.handleRequest({method:l,path:d,body:a,searchParams:c.searchParams,params:{}},s)}catch(e){const i=e instanceof Error,n=e instanceof Response;let a=i?e.message:n?await e.text():e;return u?{status:i?404:(null==e?void 0:e.status)||200,content:JSON.stringify(a)}:{status:i?404:(null==e?void 0:e.status)||200,content:await t.default.encryptBuffer(a,c.secret)}}return u?{status:404,content:"Not found"}:{status:404,content:await t.default.encryptBuffer("Not found",c.secret)}}}exports.default=s;//# sourceMappingURL=index.js.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var tslib=require('tslib'),crypto=require('../include/crypto.js'),Base=require('./Base.js'),FileScaner=require('../include/FileScaner.js'),File=require('../include/File.js');class SecurequServer extends Base.default {
2
+ async handshake(body, clientInfo) {
3
+ var _a, _b;
4
+ const data = await crypto.default.decryptBuffer(body, clientInfo.secret);
5
+ const serverSecret = await this.getSecret();
6
+ if (!data)
7
+ throw new Error("Invalid handshake data");
8
+ if (data.hash !== clientInfo.hash) {
9
+ throw new Error("Invalid handshake");
10
+ }
11
+ else if (data.secret !== clientInfo.secret) {
12
+ throw new Error("Invalid handshake secret");
13
+ }
14
+ else if (Date.now() - data.clientTime > 30000) { // 30 seconds
15
+ throw new Error("Handshake expired");
16
+ }
17
+ const serverTime = new Date();
18
+ const clientDate = new Date(data.clientTime);
19
+ const offsetMs = clientDate.getTime() - serverTime.getTime();
20
+ let info = {
21
+ dev: this.config.mode === 'development',
22
+ timeDiffarenc: offsetMs,
23
+ maxFileSize: ((_a = this.config.file) === null || _a === void 0 ? void 0 : _a.maxFilesize) || null,
24
+ checkFileType: ((_b = this.config.file) === null || _b === void 0 ? void 0 : _b.checkFileType) || false,
25
+ signeture: await crypto.default.encrypt({
26
+ expire: Date.now() + 30000,
27
+ hash: clientInfo.hash
28
+ }, serverSecret)
29
+ };
30
+ throw info;
31
+ }
32
+ async uploadFile(file, onProgress) {
33
+ var _a, e_1, _b, _c;
34
+ var _d;
35
+ if (!((_d = this.config.file) === null || _d === void 0 ? void 0 : _d.upload))
36
+ throw new Response("Upload not supported", { status: 403 });
37
+ const fileId = await File.getFileId(file);
38
+ const chunkSize = this.config.file.chunkSize;
39
+ const filemeta = {
40
+ fileId: fileId,
41
+ name: file.name,
42
+ size: file.size,
43
+ type: file.type,
44
+ totalChunks: File.totalChunks(file, chunkSize),
45
+ chunkIndex: 0,
46
+ isFinish: false
47
+ };
48
+ try {
49
+ for (var _e = true, _f = tslib.__asyncValues(File.chunkFile(file, chunkSize)), _g; _g = await _f.next(), _a = _g.done, !_a;) {
50
+ _c = _g.value;
51
+ _e = false;
52
+ try {
53
+ let { chunk, chunkIndex } = _c;
54
+ if (this.config.file.checkFileType && chunkIndex === 0) {
55
+ let fileType = FileScaner.fileScaner(chunk);
56
+ if (!fileType)
57
+ throw new Error("Unknown or unsupported file type");
58
+ }
59
+ filemeta.chunkIndex = chunkIndex;
60
+ filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;
61
+ await this.config.file.upload(chunk, filemeta);
62
+ if (onProgress) {
63
+ const progress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100);
64
+ onProgress(progress);
65
+ }
66
+ }
67
+ finally {
68
+ _e = true;
69
+ }
70
+ }
71
+ }
72
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
73
+ finally {
74
+ try {
75
+ if (!_e && !_a && (_b = _f.return)) await _b.call(_f);
76
+ }
77
+ finally { if (e_1) throw e_1.error; }
78
+ }
79
+ return filemeta;
80
+ }
81
+ async deleteFile(fileId) {
82
+ var _a;
83
+ if (!((_a = this.config.file) === null || _a === void 0 ? void 0 : _a.delete))
84
+ throw new Response("Delete not supported", { status: 403 });
85
+ await this.config.file.delete(fileId);
86
+ }
87
+ async listen(url, { body, headers, metadata }) {
88
+ const signeture = headers['x-signeture'] || '';
89
+ const origin = headers['x-origin'] || '';
90
+ const method = headers['x-method'] || 'POST';
91
+ let clientInfo = await this.clientInfo(url, origin);
92
+ if (!clientInfo) {
93
+ return {
94
+ status: 403,
95
+ value: "Client not allowed"
96
+ };
97
+ }
98
+ let path = clientInfo.path;
99
+ const isDev = path !== '/' && this.config.mode === 'development';
100
+ try {
101
+ if (path === '/' && method === "POST") {
102
+ await this.handshake(body, clientInfo);
103
+ }
104
+ if (path === '/' && method === 'GET')
105
+ throw new Response("Invalid method", { status: 405 });
106
+ const decryptSigneture = await crypto.default.decrypt(signeture, clientInfo.secret);
107
+ if (!decryptSigneture)
108
+ throw new Response("Invalid Signeture", { status: 403 });
109
+ if (decryptSigneture.expire < Date.now())
110
+ throw new Response("Request expired", { status: 403 });
111
+ await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash);
112
+ let data = null;
113
+ if (body) {
114
+ if (isDev) {
115
+ const decoder = new TextDecoder();
116
+ const text = decoder.decode(body);
117
+ data = JSON.parse(text);
118
+ }
119
+ else {
120
+ data = await crypto.default.decryptBuffer(body, clientInfo.secret);
121
+ }
122
+ }
123
+ if (path === '/') {
124
+ const fileConfig = this.config.file;
125
+ // handle file upload
126
+ if (method === "PUT") {
127
+ if (!(fileConfig === null || fileConfig === void 0 ? void 0 : fileConfig.upload))
128
+ throw new Response("Upload not supported", { status: 403 });
129
+ const filemeta = data.filemeta;
130
+ const chunk = data.chunk;
131
+ if (filemeta.chunkIndex === 0 && fileConfig.checkFileType && !FileScaner.fileScaner(chunk)) {
132
+ throw new Error("Unknown or unsupported file type");
133
+ }
134
+ await fileConfig.upload(chunk, filemeta);
135
+ throw { success: true };
136
+ }
137
+ else if (method === "DELETE") {
138
+ await this.deleteFile(data.fileId);
139
+ throw { success: true };
140
+ }
141
+ else {
142
+ throw new Response("Invalid method", { status: 405 });
143
+ }
144
+ }
145
+ await this.handleRequest({
146
+ method,
147
+ path,
148
+ body: data,
149
+ searchParams: clientInfo.searchParams,
150
+ params: {}
151
+ }, metadata);
152
+ }
153
+ catch (info) {
154
+ const isError = info instanceof Error;
155
+ const isResponse = info instanceof Response;
156
+ let value = isError ? info.message : (isResponse ? await info.text() : info);
157
+ if (isDev) {
158
+ return {
159
+ status: isError ? 404 : ((info === null || info === void 0 ? void 0 : info.status) || 200),
160
+ value: JSON.stringify(value)
161
+ };
162
+ }
163
+ return {
164
+ status: isError ? 404 : ((info === null || info === void 0 ? void 0 : info.status) || 200),
165
+ value: await crypto.default.encryptBuffer(value, clientInfo.secret)
166
+ };
167
+ }
168
+ if (isDev) {
169
+ return {
170
+ status: 404,
171
+ value: "Not found"
172
+ };
173
+ }
174
+ return {
175
+ status: 404,
176
+ value: await crypto.default.encryptBuffer("Not found", clientInfo.secret)
177
+ };
178
+ }
179
+ }exports.default=SecurequServer;//# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { Metadata, ListenerInfo, ServerResponse, UploadFileMeta } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/FileScaner\";\nimport { HTTPMethods } from \"../client/types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/File\";\n\nclass SecurequServer extends SecurequServerBase {\n\n async handshake(body: any, clientInfo: any) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const serverSecret = await this.getSecret()\n if (!data) throw new Error(\"Invalid handshake data\");\n if (data.hash !== clientInfo.hash) {\n throw new Error(\"Invalid handshake\");\n } else if (data.secret !== clientInfo.secret) {\n throw new Error(\"Invalid handshake secret\");\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\n throw new Error(\"Handshake expired\");\n }\n\n const serverTime = new Date();\n const clientDate = new Date(data.clientTime);\n const offsetMs = clientDate.getTime() - serverTime.getTime();\n\n let info = {\n dev: this.config.mode === 'development',\n timeDiffarenc: offsetMs,\n maxFileSize: this.config.file?.maxFilesize || null,\n checkFileType: this.config.file?.checkFileType || false,\n signeture: await crypto.encrypt({\n expire: Date.now() + 30000, // 30 seconds\n hash: clientInfo.hash\n }, serverSecret)\n }\n throw info\n }\n\n async uploadFile(file: File, onProgress?: (p: number) => void): Promise<UploadFileMeta> {\n if (!this.config.file?.upload) throw new Response(\"Upload not supported\", { status: 403 });\n\n const fileId = await getFileId(file);\n const chunkSize = this.config.file.chunkSize\n const filemeta: UploadFileMeta = {\n fileId: fileId,\n name: file.name,\n size: file.size,\n type: file.type,\n totalChunks: totalChunks(file, chunkSize),\n chunkIndex: 0,\n isFinish: false\n }\n\n for await (let { chunk, chunkIndex } of chunkFile(file, chunkSize)) {\n if (this.config.file.checkFileType && chunkIndex === 0) {\n let fileType = fileScaner(chunk);\n if (!fileType) throw new Error(\"Unknown or unsupported file type\");\n }\n filemeta.chunkIndex = chunkIndex;\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\n await this.config.file.upload(chunk, filemeta);\n if (onProgress) {\n const progress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\n onProgress(progress);\n }\n }\n return filemeta\n }\n\n async deleteFile(fileId: string): Promise<void> {\n if (!this.config.file?.delete) throw new Response(\"Delete not supported\", { status: 403 })\n await this.config.file.delete(fileId);\n }\n\n async listen(url: string, { body, headers, metadata }: ListenerInfo): Promise<ServerResponse> {\n\n const signeture = headers['x-signeture'] || '';\n const origin = headers['x-origin'] || '';\n const method: HTTPMethods = headers['x-method'] || 'POST' as any\n\n let clientInfo = await this.clientInfo(url, origin)\n if (!clientInfo) {\n return {\n status: 403,\n content: \"Client not allowed\"\n }\n }\n let path = clientInfo.path\n const isDev = path !== '/' && this.config.mode === 'development'\n try {\n if (path === '/' && method === \"POST\") {\n await this.handshake(body, clientInfo)\n }\n\n if (path === '/' && method === 'GET') throw new Response(\"Invalid method\", { status: 405 })\n\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\n\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n\n let data: any = null\n if (body) {\n if (isDev) {\n const decoder = new TextDecoder();\n const text = decoder.decode(body);\n data = JSON.parse(text)\n } else {\n data = await crypto.decryptBuffer(body, clientInfo.secret)\n }\n }\n\n if (path === '/') {\n\n const fileConfig = this.config.file\n\n // handle file upload\n if (method === \"PUT\") {\n if (!fileConfig?.upload) throw new Response(\"Upload not supported\", { status: 403 })\n\n const filemeta: UploadFileMeta = data.filemeta\n const chunk: Uint8Array = data.chunk\n\n if (filemeta.chunkIndex === 0 && fileConfig.checkFileType && !fileScaner(chunk)) {\n throw new Error(\"Unknown or unsupported file type\");\n }\n\n await fileConfig.upload(chunk, filemeta)\n throw { success: true }\n } else if (method === \"DELETE\") {\n await this.deleteFile(data.fileId)\n throw { success: true }\n } else {\n throw new Response(\"Invalid method\", { status: 405 });\n }\n }\n\n await this.handleRequest({\n method,\n path,\n body: data,\n searchParams: clientInfo.searchParams,\n params: {}\n }, metadata);\n\n } catch (info: any) {\n const isError = info instanceof Error\n const isResponse = info instanceof Response\n let content = isError ? info.message : (isResponse ? await info.text() : info);\n if (isDev) {\n return {\n status: isError ? 404 : (info?.status || 200),\n content: JSON.stringify(content)\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n content: await crypto.encryptBuffer(content, clientInfo.secret)\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n content: \"Not found\"\n };\n }\n\n return {\n status: 404,\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","body","clientInfo","data","crypto","decryptBuffer","secret","serverSecret","this","getSecret","Error","hash","Date","now","clientTime","serverTime","offsetMs","getTime","dev","config","mode","timeDiffarenc","maxFileSize","_a","file","maxFilesize","checkFileType","_b","signeture","encrypt","expire","uploadFile","onProgress","_d","upload","Response","status","fileId","getFileId","chunkSize","filemeta","name","size","type","totalChunks","chunkIndex","isFinish","_g","_e","_f","__asyncValues","chunkFile","next","done","_c","value","chunk","fileScaner","Math","floor","deleteFile","delete","listen","url","headers","metadata","origin","method","content","path","isDev","decryptSigneture","decrypt","isValidSigneture","text","TextDecoder","decode","JSON","parse","fileConfig","success","handleRequest","searchParams","params","info","isError","isResponse","message","stringify","encryptBuffer","exports","default"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { Metadata, ListenerInfo, ServerResponse, UploadFileMeta } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/FileScaner\";\nimport { HTTPMethods } from \"../client/types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/File\";\n\nclass SecurequServer extends SecurequServerBase {\n\n async handshake(body: any, clientInfo: any) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const serverSecret = await this.getSecret()\n if (!data) throw new Error(\"Invalid handshake data\");\n if (data.hash !== clientInfo.hash) {\n throw new Error(\"Invalid handshake\");\n } else if (data.secret !== clientInfo.secret) {\n throw new Error(\"Invalid handshake secret\");\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\n throw new Error(\"Handshake expired\");\n }\n\n const serverTime = new Date();\n const clientDate = new Date(data.clientTime);\n const offsetMs = clientDate.getTime() - serverTime.getTime();\n\n let info = {\n dev: this.config.mode === 'development',\n timeDiffarenc: offsetMs,\n maxFileSize: this.config.file?.maxFilesize || null,\n checkFileType: this.config.file?.checkFileType || false,\n signeture: await crypto.encrypt({\n expire: Date.now() + 30000, // 30 seconds\n hash: clientInfo.hash\n }, serverSecret)\n }\n throw info\n }\n\n async uploadFile(file: File, onProgress?: (p: number) => void): Promise<UploadFileMeta> {\n if (!this.config.file?.upload) throw new Response(\"Upload not supported\", { status: 403 });\n\n const fileId = await getFileId(file);\n const chunkSize = this.config.file.chunkSize\n const filemeta: UploadFileMeta = {\n fileId: fileId,\n name: file.name,\n size: file.size,\n type: file.type,\n totalChunks: totalChunks(file, chunkSize),\n chunkIndex: 0,\n isFinish: false\n }\n\n for await (let { chunk, chunkIndex } of chunkFile(file, chunkSize)) {\n if (this.config.file.checkFileType && chunkIndex === 0) {\n let fileType = fileScaner(chunk);\n if (!fileType) throw new Error(\"Unknown or unsupported file type\");\n }\n filemeta.chunkIndex = chunkIndex;\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\n await this.config.file.upload(chunk, filemeta);\n if (onProgress) {\n const progress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\n onProgress(progress);\n }\n }\n return filemeta\n }\n\n async deleteFile(fileId: string): Promise<void> {\n if (!this.config.file?.delete) throw new Response(\"Delete not supported\", { status: 403 })\n await this.config.file.delete(fileId);\n }\n\n async listen(url: string, { body, headers, metadata }: ListenerInfo): Promise<ServerResponse> {\n\n const signeture = headers['x-signeture'] || '';\n const origin = headers['x-origin'] || '';\n const method: HTTPMethods = headers['x-method'] || 'POST' as any\n\n let clientInfo = await this.clientInfo(url, origin)\n if (!clientInfo) {\n return {\n status: 403,\n value: \"Client not allowed\"\n }\n }\n let path = clientInfo.path\n const isDev = path !== '/' && this.config.mode === 'development'\n try {\n if (path === '/' && method === \"POST\") {\n await this.handshake(body, clientInfo)\n }\n\n if (path === '/' && method === 'GET') throw new Response(\"Invalid method\", { status: 405 })\n\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n if (!decryptSigneture) throw new Response(\"Invalid Signeture\", { status: 403 });\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\n\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n\n let data: any = null\n if (body) {\n if (isDev) {\n const decoder = new TextDecoder();\n const text = decoder.decode(body);\n data = JSON.parse(text)\n } else {\n data = await crypto.decryptBuffer(body, clientInfo.secret)\n }\n }\n\n if (path === '/') {\n\n const fileConfig = this.config.file\n\n // handle file upload\n if (method === \"PUT\") {\n if (!fileConfig?.upload) throw new Response(\"Upload not supported\", { status: 403 })\n\n const filemeta: UploadFileMeta = data.filemeta\n const chunk: Uint8Array = data.chunk\n\n if (filemeta.chunkIndex === 0 && fileConfig.checkFileType && !fileScaner(chunk)) {\n throw new Error(\"Unknown or unsupported file type\");\n }\n\n await fileConfig.upload(chunk, filemeta)\n throw { success: true }\n } else if (method === \"DELETE\") {\n await this.deleteFile(data.fileId)\n throw { success: true }\n } else {\n throw new Response(\"Invalid method\", { status: 405 });\n }\n }\n\n await this.handleRequest({\n method,\n path,\n body: data,\n searchParams: clientInfo.searchParams,\n params: {}\n }, metadata);\n\n } catch (info: any) {\n const isError = info instanceof Error\n const isResponse = info instanceof Response\n let value = isError ? info.message : (isResponse ? await info.text() : info);\n if (isDev) {\n return {\n status: isError ? 404 : (info?.status || 200),\n value: JSON.stringify(value)\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n value: await crypto.encryptBuffer(value, clientInfo.secret)\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n value: \"Not found\"\n };\n }\n\n return {\n status: 404,\n value: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":["SecurequServerBase","crypto","getFileId","totalChunks","__asyncValues","chunkFile","fileScaner"],"mappings":"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"}