securequ 1.1.24 → 1.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client/Base.cjs CHANGED
@@ -10,6 +10,7 @@ class Base {
10
10
  this.secret_length = 0;
11
11
  this.handshakeInfo = null;
12
12
  this.CONTENT_TYPE = "application/octet-stream";
13
+ this.handshakeErrorCount = 0;
13
14
  this.config = Object.assign({ defaultOptions: {} }, config);
14
15
  const url = new URL(config.url);
15
16
  if (url.search || url.hash)
@@ -87,6 +88,12 @@ class Base {
87
88
  secret: secret.secret,
88
89
  }
89
90
  });
91
+ if (!res.data) {
92
+ this.handshakeErrorCount++;
93
+ if (this.handshakeErrorCount < 10) {
94
+ await this.handshake();
95
+ }
96
+ }
90
97
  this.handshakeInfo = res.data;
91
98
  this.loadingHandshake = false;
92
99
  await this.hooksCall('afterHandshake', this.handshakeInfo);
@@ -1 +1 @@
1
- {"version":3,"file":"Base.cjs","sources":["../../src/client/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { HandshakeInfo, HttpRequestInit, SecurequClientConfig, SecurequClientResponse } from \"./types\";\nimport xanFetch from 'xanfetch'\n\n\nconst Clients = new Map<string, Base>()\n\nclass Base {\n protected config: SecurequClientConfig;\n protected loadingHandshake: boolean = false;\n protected secret_length: number = 0;\n protected handshakeInfo: HandshakeInfo | null = null;\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n constructor(config: SecurequClientConfig) {\n this.config = {\n defaultOptions: {},\n ...config,\n }\n const url = new URL(config.url)\n if (url.search || url.hash) throw new Error(`Invalid config url ${config.url}. Search params or Hash url is not supported in config.url`)\n config.url = `${url.origin}${url.pathname}`\n\n if (Clients.has(config.url)) {\n throw new Error(`Client is Blocked!`);\n }\n }\n\n protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]) {\n if (this.config.hooks && this.config.hooks[hook]) {\n return (this.config.hooks[hook] as Function)(...args)\n }\n }\n\n protected async getSecret() {\n let full = this.config.secret\n let secret = full.substring(0, this.secret_length)\n let hash = (await crypto.hash(secret)).substring(0, this.secret_length)\n return { full, secret, hash }\n }\n\n protected async url(path: string) {\n const secret = await this.getSecret()\n const base = this.config.url;\n if (path === '/') path = ''\n path = path.trim();\n path = path.startsWith('/') ? path.substring(1) : path\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n if (path) path = `/${path}`\n return new URL(`${base}/${secret.hash}${path}`);\n }\n\n protected async getHeaders(path: string, init?: HttpRequestInit) {\n const url = await this.url(path)\n const secret = await this.getSecret()\n let headers: any = {};\n if (this.handshakeInfo) {\n headers[\"X-SIGNETURE\"] = await crypto.encrypt({\n signeture: this.handshakeInfo?.signeture,\n expire: Date.now() + this.handshakeInfo!.timeDiffarenc + 10000 // 10 seconds\n }, secret.secret) || '';\n }\n\n headers = {\n ...this.config?.defaultOptions?.headers,\n ...init?.headers,\n ...headers,\n 'Content-Type': this.CONTENT_TYPE,\n \"X-ORIGIN\": url.origin,\n \"X-METHOD\": (init?.method || 'GET').toUpperCase()\n }\n\n return headers;\n }\n\n protected async awaitForHandshake() {\n if (this.loadingHandshake) {\n await new Promise((resolve) => {\n const interval = setInterval(() => {\n if (!this.loadingHandshake) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n })\n }\n if (!this.handshakeInfo) {\n await this.handshake();\n }\n }\n\n async handshake() {\n await this.hooksCall('beforeHandshake');\n this.handshakeInfo = null;\n this.loadingHandshake = true;\n\n let max = this.config.secret.length\n let min = Math.floor(max / 4) * 3\n this.secret_length = Math.floor(Math.random() * (max - min + 1)) + min\n\n const secret = await this.getSecret()\n const res = await this.fetch('/', {\n method: 'POST',\n body: {\n hash: secret.hash,\n clientTime: new Date().toISOString(),\n secret: secret.secret,\n }\n })\n this.handshakeInfo = res.data\n this.loadingHandshake = false;\n await this.hooksCall('afterHandshake', this.handshakeInfo);\n }\n\n async fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\n const isDev = path !== '/' && this.handshakeInfo?.dev\n const secret = await this.getSecret()\n const url = await this.url(path)\n let sparams = Object.fromEntries(url.searchParams.entries())\n const _init = { ...init }\n let params: any = {\n ...sparams,\n }\n\n if (Object.keys(sparams).length > 0) {\n for (let key in sparams) {\n url.searchParams.delete(key)\n }\n }\n\n if (_init?.params) {\n for (let key in _init.params) {\n params[key] = _init.params[key]\n }\n delete _init.params\n }\n\n if (Object.keys(params).length > 0) {\n if (isDev) {\n _init.params = params\n } else {\n const key = Math.random().toString(36).substring(2, 8);\n const enc = await crypto.encrypt({ params, key }, secret.secret)\n url.href = `${url.href}?${key}=${encodeURIComponent(enc)}`\n }\n }\n\n const httpOption: any = {\n method: \"GET\",\n ...this.config?.defaultOptions,\n ..._init,\n headers: await this.getHeaders(path, _init)\n }\n\n if (httpOption?.body) {\n if (isDev) {\n httpOption.body = JSON.stringify(httpOption.body)\n } else {\n httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);\n }\n }\n const res = await xanFetch(url.href, httpOption)\n if (isDev) {\n const value = await res.text()\n let val = value\n try {\n val = JSON.parse(value)\n } catch (error) {\n\n }\n return {\n success: res.ok,\n message: res.ok ? res.statusText : val,\n data: res.ok ? val : null,\n code: res.status\n }\n }\n const value = await res.arrayBuffer()\n const val = await crypto.decryptBuffer(new Uint8Array(value), secret.secret) as any\n\n return {\n success: res.ok,\n message: res.ok ? res.statusText : (val || res.statusText),\n data: res.ok ? val : null,\n code: res.status\n }\n }\n\n}\n\nexport default Base;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Base.cjs","sources":["../../src/client/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { HandshakeInfo, HttpRequestInit, SecurequClientConfig, SecurequClientResponse } from \"./types\";\nimport xanFetch from 'xanfetch'\n\n\nconst Clients = new Map<string, Base>()\n\nclass Base {\n protected config: SecurequClientConfig;\n protected loadingHandshake: boolean = false;\n protected secret_length: number = 0;\n protected handshakeInfo: HandshakeInfo | null = null;\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n constructor(config: SecurequClientConfig) {\n this.config = {\n defaultOptions: {},\n ...config,\n }\n const url = new URL(config.url)\n if (url.search || url.hash) throw new Error(`Invalid config url ${config.url}. Search params or Hash url is not supported in config.url`)\n config.url = `${url.origin}${url.pathname}`\n\n if (Clients.has(config.url)) {\n throw new Error(`Client is Blocked!`);\n }\n }\n\n protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]) {\n if (this.config.hooks && this.config.hooks[hook]) {\n return (this.config.hooks[hook] as Function)(...args)\n }\n }\n\n protected async getSecret() {\n let full = this.config.secret\n let secret = full.substring(0, this.secret_length)\n let hash = (await crypto.hash(secret)).substring(0, this.secret_length)\n return { full, secret, hash }\n }\n\n protected async url(path: string) {\n const secret = await this.getSecret()\n const base = this.config.url;\n if (path === '/') path = ''\n path = path.trim();\n path = path.startsWith('/') ? path.substring(1) : path\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n if (path) path = `/${path}`\n return new URL(`${base}/${secret.hash}${path}`);\n }\n\n protected async getHeaders(path: string, init?: HttpRequestInit) {\n const url = await this.url(path)\n const secret = await this.getSecret()\n let headers: any = {};\n if (this.handshakeInfo) {\n headers[\"X-SIGNETURE\"] = await crypto.encrypt({\n signeture: this.handshakeInfo?.signeture,\n expire: Date.now() + this.handshakeInfo!.timeDiffarenc + 10000 // 10 seconds\n }, secret.secret) || '';\n }\n\n headers = {\n ...this.config?.defaultOptions?.headers,\n ...init?.headers,\n ...headers,\n 'Content-Type': this.CONTENT_TYPE,\n \"X-ORIGIN\": url.origin,\n \"X-METHOD\": (init?.method || 'GET').toUpperCase()\n }\n\n return headers;\n }\n\n protected async awaitForHandshake() {\n if (this.loadingHandshake) {\n await new Promise((resolve) => {\n const interval = setInterval(() => {\n if (!this.loadingHandshake) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n })\n }\n if (!this.handshakeInfo) {\n await this.handshake();\n }\n }\n\n private handshakeErrorCount = 0\n async handshake() {\n await this.hooksCall('beforeHandshake');\n this.handshakeInfo = null;\n this.loadingHandshake = true;\n\n let max = this.config.secret.length\n let min = Math.floor(max / 4) * 3\n this.secret_length = Math.floor(Math.random() * (max - min + 1)) + min\n\n const secret = await this.getSecret()\n const res = await this.fetch('/', {\n method: 'POST',\n body: {\n hash: secret.hash,\n clientTime: new Date().toISOString(),\n secret: secret.secret,\n }\n })\n if (!res.data) {\n this.handshakeErrorCount++\n if (this.handshakeErrorCount < 10) {\n await this.handshake()\n }\n }\n this.handshakeInfo = res.data\n this.loadingHandshake = false;\n await this.hooksCall('afterHandshake', this.handshakeInfo);\n }\n\n async fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\n const isDev = path !== '/' && this.handshakeInfo?.dev\n const secret = await this.getSecret()\n const url = await this.url(path)\n let sparams = Object.fromEntries(url.searchParams.entries())\n const _init = { ...init }\n let params: any = {\n ...sparams,\n }\n\n if (Object.keys(sparams).length > 0) {\n for (let key in sparams) {\n url.searchParams.delete(key)\n }\n }\n\n if (_init?.params) {\n for (let key in _init.params) {\n params[key] = _init.params[key]\n }\n delete _init.params\n }\n\n if (Object.keys(params).length > 0) {\n if (isDev) {\n _init.params = params\n } else {\n const key = Math.random().toString(36).substring(2, 8);\n const enc = await crypto.encrypt({ params, key }, secret.secret)\n url.href = `${url.href}?${key}=${encodeURIComponent(enc)}`\n }\n }\n\n const httpOption: any = {\n method: \"GET\",\n ...this.config?.defaultOptions,\n ..._init,\n headers: await this.getHeaders(path, _init)\n }\n\n if (httpOption?.body) {\n if (isDev) {\n httpOption.body = JSON.stringify(httpOption.body)\n } else {\n httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);\n }\n }\n const res = await xanFetch(url.href, httpOption)\n if (isDev) {\n const value = await res.text()\n let val = value\n try {\n val = JSON.parse(value)\n } catch (error) {\n\n }\n return {\n success: res.ok,\n message: res.ok ? res.statusText : val,\n data: res.ok ? val : null,\n code: res.status\n }\n }\n const value = await res.arrayBuffer()\n const val = await crypto.decryptBuffer(new Uint8Array(value), secret.secret) as any\n\n return {\n success: res.ok,\n message: res.ok ? res.statusText : (val || res.statusText),\n data: res.ok ? val : null,\n code: res.status\n }\n }\n\n}\n\nexport default Base;\n"],"names":[],"mappings":"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"}
package/client/Base.d.ts CHANGED
@@ -16,6 +16,7 @@ declare class Base {
16
16
  protected url(path: string): Promise<URL>;
17
17
  protected getHeaders(path: string, init?: HttpRequestInit): Promise<any>;
18
18
  protected awaitForHandshake(): Promise<void>;
19
+ private handshakeErrorCount;
19
20
  handshake(): Promise<void>;
20
21
  fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse>;
21
22
  }
package/client/Base.js CHANGED
@@ -8,6 +8,7 @@ class Base {
8
8
  this.secret_length = 0;
9
9
  this.handshakeInfo = null;
10
10
  this.CONTENT_TYPE = "application/octet-stream";
11
+ this.handshakeErrorCount = 0;
11
12
  this.config = Object.assign({ defaultOptions: {} }, config);
12
13
  const url = new URL(config.url);
13
14
  if (url.search || url.hash)
@@ -85,6 +86,12 @@ class Base {
85
86
  secret: secret.secret,
86
87
  }
87
88
  });
89
+ if (!res.data) {
90
+ this.handshakeErrorCount++;
91
+ if (this.handshakeErrorCount < 10) {
92
+ await this.handshake();
93
+ }
94
+ }
88
95
  this.handshakeInfo = res.data;
89
96
  this.loadingHandshake = false;
90
97
  await this.hooksCall('afterHandshake', this.handshakeInfo);
@@ -1 +1 @@
1
- {"version":3,"file":"Base.js","sources":["../../src/client/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { HandshakeInfo, HttpRequestInit, SecurequClientConfig, SecurequClientResponse } from \"./types\";\nimport xanFetch from 'xanfetch'\n\n\nconst Clients = new Map<string, Base>()\n\nclass Base {\n protected config: SecurequClientConfig;\n protected loadingHandshake: boolean = false;\n protected secret_length: number = 0;\n protected handshakeInfo: HandshakeInfo | null = null;\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n constructor(config: SecurequClientConfig) {\n this.config = {\n defaultOptions: {},\n ...config,\n }\n const url = new URL(config.url)\n if (url.search || url.hash) throw new Error(`Invalid config url ${config.url}. Search params or Hash url is not supported in config.url`)\n config.url = `${url.origin}${url.pathname}`\n\n if (Clients.has(config.url)) {\n throw new Error(`Client is Blocked!`);\n }\n }\n\n protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]) {\n if (this.config.hooks && this.config.hooks[hook]) {\n return (this.config.hooks[hook] as Function)(...args)\n }\n }\n\n protected async getSecret() {\n let full = this.config.secret\n let secret = full.substring(0, this.secret_length)\n let hash = (await crypto.hash(secret)).substring(0, this.secret_length)\n return { full, secret, hash }\n }\n\n protected async url(path: string) {\n const secret = await this.getSecret()\n const base = this.config.url;\n if (path === '/') path = ''\n path = path.trim();\n path = path.startsWith('/') ? path.substring(1) : path\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n if (path) path = `/${path}`\n return new URL(`${base}/${secret.hash}${path}`);\n }\n\n protected async getHeaders(path: string, init?: HttpRequestInit) {\n const url = await this.url(path)\n const secret = await this.getSecret()\n let headers: any = {};\n if (this.handshakeInfo) {\n headers[\"X-SIGNETURE\"] = await crypto.encrypt({\n signeture: this.handshakeInfo?.signeture,\n expire: Date.now() + this.handshakeInfo!.timeDiffarenc + 10000 // 10 seconds\n }, secret.secret) || '';\n }\n\n headers = {\n ...this.config?.defaultOptions?.headers,\n ...init?.headers,\n ...headers,\n 'Content-Type': this.CONTENT_TYPE,\n \"X-ORIGIN\": url.origin,\n \"X-METHOD\": (init?.method || 'GET').toUpperCase()\n }\n\n return headers;\n }\n\n protected async awaitForHandshake() {\n if (this.loadingHandshake) {\n await new Promise((resolve) => {\n const interval = setInterval(() => {\n if (!this.loadingHandshake) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n })\n }\n if (!this.handshakeInfo) {\n await this.handshake();\n }\n }\n\n async handshake() {\n await this.hooksCall('beforeHandshake');\n this.handshakeInfo = null;\n this.loadingHandshake = true;\n\n let max = this.config.secret.length\n let min = Math.floor(max / 4) * 3\n this.secret_length = Math.floor(Math.random() * (max - min + 1)) + min\n\n const secret = await this.getSecret()\n const res = await this.fetch('/', {\n method: 'POST',\n body: {\n hash: secret.hash,\n clientTime: new Date().toISOString(),\n secret: secret.secret,\n }\n })\n this.handshakeInfo = res.data\n this.loadingHandshake = false;\n await this.hooksCall('afterHandshake', this.handshakeInfo);\n }\n\n async fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\n const isDev = path !== '/' && this.handshakeInfo?.dev\n const secret = await this.getSecret()\n const url = await this.url(path)\n let sparams = Object.fromEntries(url.searchParams.entries())\n const _init = { ...init }\n let params: any = {\n ...sparams,\n }\n\n if (Object.keys(sparams).length > 0) {\n for (let key in sparams) {\n url.searchParams.delete(key)\n }\n }\n\n if (_init?.params) {\n for (let key in _init.params) {\n params[key] = _init.params[key]\n }\n delete _init.params\n }\n\n if (Object.keys(params).length > 0) {\n if (isDev) {\n _init.params = params\n } else {\n const key = Math.random().toString(36).substring(2, 8);\n const enc = await crypto.encrypt({ params, key }, secret.secret)\n url.href = `${url.href}?${key}=${encodeURIComponent(enc)}`\n }\n }\n\n const httpOption: any = {\n method: \"GET\",\n ...this.config?.defaultOptions,\n ..._init,\n headers: await this.getHeaders(path, _init)\n }\n\n if (httpOption?.body) {\n if (isDev) {\n httpOption.body = JSON.stringify(httpOption.body)\n } else {\n httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);\n }\n }\n const res = await xanFetch(url.href, httpOption)\n if (isDev) {\n const value = await res.text()\n let val = value\n try {\n val = JSON.parse(value)\n } catch (error) {\n\n }\n return {\n success: res.ok,\n message: res.ok ? res.statusText : val,\n data: res.ok ? val : null,\n code: res.status\n }\n }\n const value = await res.arrayBuffer()\n const val = await crypto.decryptBuffer(new Uint8Array(value), secret.secret) as any\n\n return {\n success: res.ok,\n message: res.ok ? res.statusText : (val || res.statusText),\n data: res.ok ? val : null,\n code: res.status\n }\n }\n\n}\n\nexport default Base;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Base.js","sources":["../../src/client/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { HandshakeInfo, HttpRequestInit, SecurequClientConfig, SecurequClientResponse } from \"./types\";\nimport xanFetch from 'xanfetch'\n\n\nconst Clients = new Map<string, Base>()\n\nclass Base {\n protected config: SecurequClientConfig;\n protected loadingHandshake: boolean = false;\n protected secret_length: number = 0;\n protected handshakeInfo: HandshakeInfo | null = null;\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n constructor(config: SecurequClientConfig) {\n this.config = {\n defaultOptions: {},\n ...config,\n }\n const url = new URL(config.url)\n if (url.search || url.hash) throw new Error(`Invalid config url ${config.url}. Search params or Hash url is not supported in config.url`)\n config.url = `${url.origin}${url.pathname}`\n\n if (Clients.has(config.url)) {\n throw new Error(`Client is Blocked!`);\n }\n }\n\n protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]) {\n if (this.config.hooks && this.config.hooks[hook]) {\n return (this.config.hooks[hook] as Function)(...args)\n }\n }\n\n protected async getSecret() {\n let full = this.config.secret\n let secret = full.substring(0, this.secret_length)\n let hash = (await crypto.hash(secret)).substring(0, this.secret_length)\n return { full, secret, hash }\n }\n\n protected async url(path: string) {\n const secret = await this.getSecret()\n const base = this.config.url;\n if (path === '/') path = ''\n path = path.trim();\n path = path.startsWith('/') ? path.substring(1) : path\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n if (path) path = `/${path}`\n return new URL(`${base}/${secret.hash}${path}`);\n }\n\n protected async getHeaders(path: string, init?: HttpRequestInit) {\n const url = await this.url(path)\n const secret = await this.getSecret()\n let headers: any = {};\n if (this.handshakeInfo) {\n headers[\"X-SIGNETURE\"] = await crypto.encrypt({\n signeture: this.handshakeInfo?.signeture,\n expire: Date.now() + this.handshakeInfo!.timeDiffarenc + 10000 // 10 seconds\n }, secret.secret) || '';\n }\n\n headers = {\n ...this.config?.defaultOptions?.headers,\n ...init?.headers,\n ...headers,\n 'Content-Type': this.CONTENT_TYPE,\n \"X-ORIGIN\": url.origin,\n \"X-METHOD\": (init?.method || 'GET').toUpperCase()\n }\n\n return headers;\n }\n\n protected async awaitForHandshake() {\n if (this.loadingHandshake) {\n await new Promise((resolve) => {\n const interval = setInterval(() => {\n if (!this.loadingHandshake) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n })\n }\n if (!this.handshakeInfo) {\n await this.handshake();\n }\n }\n\n private handshakeErrorCount = 0\n async handshake() {\n await this.hooksCall('beforeHandshake');\n this.handshakeInfo = null;\n this.loadingHandshake = true;\n\n let max = this.config.secret.length\n let min = Math.floor(max / 4) * 3\n this.secret_length = Math.floor(Math.random() * (max - min + 1)) + min\n\n const secret = await this.getSecret()\n const res = await this.fetch('/', {\n method: 'POST',\n body: {\n hash: secret.hash,\n clientTime: new Date().toISOString(),\n secret: secret.secret,\n }\n })\n if (!res.data) {\n this.handshakeErrorCount++\n if (this.handshakeErrorCount < 10) {\n await this.handshake()\n }\n }\n this.handshakeInfo = res.data\n this.loadingHandshake = false;\n await this.hooksCall('afterHandshake', this.handshakeInfo);\n }\n\n async fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\n const isDev = path !== '/' && this.handshakeInfo?.dev\n const secret = await this.getSecret()\n const url = await this.url(path)\n let sparams = Object.fromEntries(url.searchParams.entries())\n const _init = { ...init }\n let params: any = {\n ...sparams,\n }\n\n if (Object.keys(sparams).length > 0) {\n for (let key in sparams) {\n url.searchParams.delete(key)\n }\n }\n\n if (_init?.params) {\n for (let key in _init.params) {\n params[key] = _init.params[key]\n }\n delete _init.params\n }\n\n if (Object.keys(params).length > 0) {\n if (isDev) {\n _init.params = params\n } else {\n const key = Math.random().toString(36).substring(2, 8);\n const enc = await crypto.encrypt({ params, key }, secret.secret)\n url.href = `${url.href}?${key}=${encodeURIComponent(enc)}`\n }\n }\n\n const httpOption: any = {\n method: \"GET\",\n ...this.config?.defaultOptions,\n ..._init,\n headers: await this.getHeaders(path, _init)\n }\n\n if (httpOption?.body) {\n if (isDev) {\n httpOption.body = JSON.stringify(httpOption.body)\n } else {\n httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);\n }\n }\n const res = await xanFetch(url.href, httpOption)\n if (isDev) {\n const value = await res.text()\n let val = value\n try {\n val = JSON.parse(value)\n } catch (error) {\n\n }\n return {\n success: res.ok,\n message: res.ok ? res.statusText : val,\n data: res.ok ? val : null,\n code: res.status\n }\n }\n const value = await res.arrayBuffer()\n const val = await crypto.decryptBuffer(new Uint8Array(value), secret.secret) as any\n\n return {\n success: res.ok,\n message: res.ok ? res.statusText : (val || res.statusText),\n data: res.ok ? val : null,\n code: res.status\n }\n }\n\n}\n\nexport default Base;\n"],"names":[],"mappings":";;;AAKA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB;AAEvC,MAAM,IAAI,CAAA;AAOP,IAAA,WAAA,CAAY,MAA4B,EAAA;QAL9B,IAAA,CAAA,gBAAgB,GAAY,KAAK;QACjC,IAAA,CAAA,aAAa,GAAW,CAAC;QACzB,IAAA,CAAA,aAAa,GAAyB,IAAI;QAC3C,IAAA,CAAA,YAAY,GAAG,0BAA0B;QA+E1C,IAAA,CAAA,mBAAmB,GAAG,CAAC;QA5E5B,IAAI,CAAC,MAAM,GAAA,MAAA,CAAA,MAAA,CAAA,EACR,cAAc,EAAE,EAAE,EAAA,EACf,MAAM,CACX;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;AAC/B,QAAA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,CAAA,mBAAA,EAAsB,MAAM,CAAC,GAAG,CAAA,0DAAA,CAA4D,CAAC;AACzI,QAAA,MAAM,CAAC,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,MAAM,CAAA,EAAG,GAAG,CAAC,QAAQ,CAAA,CAAE;QAE3C,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;AAC1B,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,kBAAA,CAAoB,CAAC;AACvC,QAAA;IACJ;AAEU,IAAA,SAAS,CAAC,IAAsD,EAAE,GAAG,IAAW,EAAA;AACvF,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AAC/C,YAAA,OAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC,GAAG,IAAI,CAAC;AACvD,QAAA;IACJ;AAEU,IAAA,MAAM,SAAS,GAAA;AACtB,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;AAC7B,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC;QAClD,IAAI,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC;AACvE,QAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAChC;IAEU,MAAM,GAAG,CAAC,IAAY,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;QAC5B,IAAI,IAAI,KAAK,GAAG;YAAE,IAAI,GAAG,EAAE;AAC3B,QAAA,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QAClB,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;QACtD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI;AACrE,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;AAC3B,QAAA,OAAO,IAAI,GAAG,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAA,EAAG,IAAI,CAAA,CAAE,CAAC;IAClD;AAEU,IAAA,MAAM,UAAU,CAAC,IAAY,EAAE,IAAsB,EAAA;;QAC5D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;QACrC,IAAI,OAAO,GAAQ,EAAE;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE;YACrB,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;AAC3C,gBAAA,SAAS,EAAE,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,0CAAE,SAAS;AACxC,gBAAA,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAc,CAAC,aAAa,GAAG,KAAK;AAChE,aAAA,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACzB,QAAA;QAED,OAAO,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACD,MAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,CAAA,EACpC,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,OAAO,GACb,OAAO,CAAA,EAAA,EACV,cAAc,EAAE,IAAI,CAAC,YAAY,EACjC,UAAU,EAAE,GAAG,CAAC,MAAM,EACtB,UAAU,EAAE,CAAC,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,MAAM,KAAI,KAAK,EAAE,WAAW,EAAE,EAAA,CACnD;AAED,QAAA,OAAO,OAAO;IACjB;AAEU,IAAA,MAAM,iBAAiB,GAAA;QAC9B,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACxB,YAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC3B,gBAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAK;AAC/B,oBAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;wBACzB,aAAa,CAAC,QAAQ,CAAC;wBACvB,OAAO,CAAC,IAAI,CAAC;AACf,oBAAA;gBACJ,CAAC,EAAE,GAAG,CAAC;AACV,YAAA,CAAC,CAAC;AACJ,QAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,MAAM,IAAI,CAAC,SAAS,EAAE;AACxB,QAAA;IACJ;AAGA,IAAA,MAAM,SAAS,GAAA;AACZ,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;AACvC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAE5B,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;AACnC,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;AAEtE,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;AAC/B,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE;gBACH,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,gBAAA,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,MAAM,EAAE,MAAM,CAAC,MAAM;AACvB;AACH,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YACZ,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,IAAI,CAAC,mBAAmB,GAAG,EAAE,EAAE;AAChC,gBAAA,MAAM,IAAI,CAAC,SAAS,EAAE;AACxB,YAAA;AACH,QAAA;AACD,QAAA,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,IAAI;AAC7B,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC7B,MAAM,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC;IAC7D;AAEA,IAAA,MAAM,KAAK,CAAC,IAAY,EAAE,IAAsB,EAAA;;AAC7C,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,KAAI,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,GAAG,CAAA;AACrD,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;AAC5D,QAAA,MAAM,KAAK,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAQ,IAAI,CAAE;AACzB,QAAA,IAAI,MAAM,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACJ,OAAO,CACZ;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAClC,YAAA,KAAK,IAAI,GAAG,IAAI,OAAO,EAAE;AACtB,gBAAA,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,YAAA;AACH,QAAA;AAED,QAAA,IAAI,KAAK,KAAA,IAAA,IAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,EAAE;AAChB,YAAA,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;gBAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AACjC,YAAA;YACD,OAAO,KAAK,CAAC,MAAM;AACrB,QAAA;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,IAAI,KAAK,EAAE;AACR,gBAAA,KAAK,CAAC,MAAM,GAAG,MAAM;AACvB,YAAA;AAAM,iBAAA;AACJ,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AACtD,gBAAA,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;AAChE,gBAAA,GAAG,CAAC,IAAI,GAAG,CAAA,EAAG,GAAG,CAAC,IAAI,CAAA,CAAA,EAAI,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE;AAC5D,YAAA;AACH,QAAA;QAED,MAAM,UAAU,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EACb,MAAM,EAAE,KAAK,EAAA,EACV,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,cAAc,CAAA,EAC3B,KAAK,CAAA,EAAA,EACR,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAA,CAC7C;AAED,QAAA,IAAI,UAAU,KAAA,IAAA,IAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,EAAE;AACnB,YAAA,IAAI,KAAK,EAAE;gBACR,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;AACnD,YAAA;AAAM,iBAAA;AACJ,gBAAA,UAAU,CAAC,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;AAC9E,YAAA;AACH,QAAA;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC;AAChD,QAAA,IAAI,KAAK,EAAE;AACR,YAAA,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;YAC9B,IAAI,GAAG,GAAG,KAAK;YACf,IAAI;AACD,gBAAA,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACzB,YAAA;AAAC,YAAA,OAAO,KAAK,EAAE;AAEf,YAAA;YACD,OAAO;gBACJ,OAAO,EAAE,GAAG,CAAC,EAAE;AACf,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG;gBACtC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI;gBACzB,IAAI,EAAE,GAAG,CAAC;aACZ;AACH,QAAA;AACD,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE;AACrC,QAAA,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,CAAQ;QAEnF,OAAO;YACJ,OAAO,EAAE,GAAG,CAAC,EAAE;AACf,YAAA,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC;YAC1D,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI;YACzB,IAAI,EAAE,GAAG,CAAC;SACZ;IACJ;AAEF;;;;"}
package/client/index.cjs CHANGED
@@ -18,7 +18,7 @@ class SecurequClient extends Base {
18
18
  }
19
19
  }
20
20
  const res = await this.fetch(path, init);
21
- if (["Signeture expired", "Request expired"].includes(res.message)) {
21
+ if (["Signeture expired", "Request expired", "Invalid Signeture"].includes(res.message)) {
22
22
  await this.handshake();
23
23
  return await this.send(path, init);
24
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/client/index.ts"],"sourcesContent":["import { FileUploadArgs, HttpRequestInit, SecurequClientResponse } from \"./types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/file\";\nimport Base from \"./Base\";\nimport fileScaner from '../include/file-scaner';\nimport { UploadFileMeta } from \"../server/types\";\n\nexport * from \"./types\"\n\nclass SecurequClient extends Base {\n\n async send(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n init = await this.hooksCall('beforeRequest', path, init) || init;\n const url = await this.url(path)\n if (url.pathname === '/') throw new Error(\"Path is not allowed\")\n\n for (let key in init?.body) {\n if (init?.body[key] instanceof File) {\n init.body[key] = await this.uploadFile(init.body[key], init?.onProgress)\n }\n }\n\n const res = await this.fetch(path, init);\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n return await this.send(path, init);\n }\n await this.hooksCall('afterResponse', res);\n return res;\n }\n\n async uploadFile(file: FileUploadArgs, onProgress?: (p: number) => void): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n\n if (!(file instanceof File)) {\n const controller = new AbortController();\n const chunk = file.chunk\n const filemeta = file.meta\n const chunkIndex = filemeta.chunkIndex;\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\n const fileId = filemeta.fileId\n const maxFileSize = this.handshakeInfo?.maxFileSize\n if (maxFileSize && filemeta.size > maxFileSize * 1024) {\n throw new Error(`File size exceeds the limit of ${maxFileSize / 1024} MB`)\n }\n\n const abort = async () => {\n await this.deleteFile(fileId);\n controller.abort();\n window.removeEventListener(\"pagehide\", abort);\n }\n\n if (chunkIndex === 0 && this.handshakeInfo?.checkFileType && !fileScaner(chunk).valid) {\n await abort()\n return {\n success: false,\n message: \"Unknown or unsupported file type\",\n data: null,\n code: 0\n }\n }\n\n const info: any = {\n method: 'PUT',\n signal: controller.signal,\n body: {\n chunk,\n filemeta\n },\n onProgress: (p: number) => {\n if (onProgress) {\n const totalProgress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\n const currentProgress = Math.floor((p / 100) / filemeta.totalChunks * 100)\n onProgress(Math.min(totalProgress + currentProgress, 100))\n }\n }\n }\n\n await this.hooksCall('beforeUploadChunk', chunk, filemeta);\n\n let res = await this.fetch('/', info)\n\n if (!res.success) {\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n window.removeEventListener(\"pagehide\", abort);\n res = await this.uploadFile(file, onProgress);\n } else {\n await abort()\n return res\n }\n }\n await this.hooksCall('afterUploadChunk', res, filemeta);\n window.removeEventListener(\"pagehide\", abort);\n return {\n success: true,\n message: 'File uploaded successfully',\n data: filemeta,\n code: 200\n }\n } else {\n const fileId = await getFileId(file);\n const _file = await this.hooksCall('beforeUpload', file, fileId) || file;\n const chunkSize = this.handshakeInfo?.chunkSize\n\n // send metadata\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 filemeta.chunkIndex = chunkIndex;\n await this.uploadFile({\n chunk,\n meta: filemeta\n })\n }\n\n const info = {\n success: true,\n message: 'File uploaded successfully',\n data: filemeta,\n code: 200\n }\n await this.hooksCall('afterUpload', info, _file);\n return info\n }\n }\n\n async deleteFile(fileId: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n const res = await this.fetch('/', {\n ...init,\n method: 'DELETE',\n body: { fileId }\n });\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n return await this.deleteFile(fileId, init);\n }\n return res;\n }\n\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\n return await this.send(path, init);\n }\n\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"POST\" });\n }\n\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"PUT\" });\n }\n\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"DELETE\" });\n }\n\n}\n\nexport default SecurequClient;\n"],"names":["file","getFileId","totalChunks","__asyncValues","chunkFile"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/client/index.ts"],"sourcesContent":["import { FileUploadArgs, HttpRequestInit, SecurequClientResponse } from \"./types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/file\";\nimport Base from \"./Base\";\nimport fileScaner from '../include/file-scaner';\nimport { UploadFileMeta } from \"../server/types\";\n\nexport * from \"./types\"\n\nclass SecurequClient extends Base {\n\n async send(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n init = await this.hooksCall('beforeRequest', path, init) || init;\n const url = await this.url(path)\n if (url.pathname === '/') throw new Error(\"Path is not allowed\")\n\n for (let key in init?.body) {\n if (init?.body[key] instanceof File) {\n init.body[key] = await this.uploadFile(init.body[key], init?.onProgress)\n }\n }\n\n const res = await this.fetch(path, init);\n if ([\"Signeture expired\", \"Request expired\", \"Invalid Signeture\"].includes(res.message)) {\n await this.handshake();\n return await this.send(path, init);\n }\n await this.hooksCall('afterResponse', res);\n return res;\n }\n\n async uploadFile(file: FileUploadArgs, onProgress?: (p: number) => void): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n\n if (!(file instanceof File)) {\n const controller = new AbortController();\n const chunk = file.chunk\n const filemeta = file.meta\n const chunkIndex = filemeta.chunkIndex;\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\n const fileId = filemeta.fileId\n const maxFileSize = this.handshakeInfo?.maxFileSize\n if (maxFileSize && filemeta.size > maxFileSize * 1024) {\n throw new Error(`File size exceeds the limit of ${maxFileSize / 1024} MB`)\n }\n\n const abort = async () => {\n await this.deleteFile(fileId);\n controller.abort();\n window.removeEventListener(\"pagehide\", abort);\n }\n\n if (chunkIndex === 0 && this.handshakeInfo?.checkFileType && !fileScaner(chunk).valid) {\n await abort()\n return {\n success: false,\n message: \"Unknown or unsupported file type\",\n data: null,\n code: 0\n }\n }\n\n const info: any = {\n method: 'PUT',\n signal: controller.signal,\n body: {\n chunk,\n filemeta\n },\n onProgress: (p: number) => {\n if (onProgress) {\n const totalProgress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\n const currentProgress = Math.floor((p / 100) / filemeta.totalChunks * 100)\n onProgress(Math.min(totalProgress + currentProgress, 100))\n }\n }\n }\n\n await this.hooksCall('beforeUploadChunk', chunk, filemeta);\n\n let res = await this.fetch('/', info)\n\n if (!res.success) {\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n window.removeEventListener(\"pagehide\", abort);\n res = await this.uploadFile(file, onProgress);\n } else {\n await abort()\n return res\n }\n }\n await this.hooksCall('afterUploadChunk', res, filemeta);\n window.removeEventListener(\"pagehide\", abort);\n return {\n success: true,\n message: 'File uploaded successfully',\n data: filemeta,\n code: 200\n }\n } else {\n const fileId = await getFileId(file);\n const _file = await this.hooksCall('beforeUpload', file, fileId) || file;\n const chunkSize = this.handshakeInfo?.chunkSize\n\n // send metadata\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 filemeta.chunkIndex = chunkIndex;\n await this.uploadFile({\n chunk,\n meta: filemeta\n })\n }\n\n const info = {\n success: true,\n message: 'File uploaded successfully',\n data: filemeta,\n code: 200\n }\n await this.hooksCall('afterUpload', info, _file);\n return info\n }\n }\n\n async deleteFile(fileId: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n const res = await this.fetch('/', {\n ...init,\n method: 'DELETE',\n body: { fileId }\n });\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n return await this.deleteFile(fileId, init);\n }\n return res;\n }\n\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\n return await this.send(path, init);\n }\n\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"POST\" });\n }\n\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"PUT\" });\n }\n\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"DELETE\" });\n }\n\n}\n\nexport default SecurequClient;\n"],"names":["file","getFileId","totalChunks","__asyncValues","chunkFile"],"mappings":"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"}
package/client/index.js CHANGED
@@ -16,7 +16,7 @@ class SecurequClient extends Base {
16
16
  }
17
17
  }
18
18
  const res = await this.fetch(path, init);
19
- if (["Signeture expired", "Request expired"].includes(res.message)) {
19
+ if (["Signeture expired", "Request expired", "Invalid Signeture"].includes(res.message)) {
20
20
  await this.handshake();
21
21
  return await this.send(path, init);
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/client/index.ts"],"sourcesContent":["import { FileUploadArgs, HttpRequestInit, SecurequClientResponse } from \"./types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/file\";\nimport Base from \"./Base\";\nimport fileScaner from '../include/file-scaner';\nimport { UploadFileMeta } from \"../server/types\";\n\nexport * from \"./types\"\n\nclass SecurequClient extends Base {\n\n async send(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n init = await this.hooksCall('beforeRequest', path, init) || init;\n const url = await this.url(path)\n if (url.pathname === '/') throw new Error(\"Path is not allowed\")\n\n for (let key in init?.body) {\n if (init?.body[key] instanceof File) {\n init.body[key] = await this.uploadFile(init.body[key], init?.onProgress)\n }\n }\n\n const res = await this.fetch(path, init);\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n return await this.send(path, init);\n }\n await this.hooksCall('afterResponse', res);\n return res;\n }\n\n async uploadFile(file: FileUploadArgs, onProgress?: (p: number) => void): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n\n if (!(file instanceof File)) {\n const controller = new AbortController();\n const chunk = file.chunk\n const filemeta = file.meta\n const chunkIndex = filemeta.chunkIndex;\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\n const fileId = filemeta.fileId\n const maxFileSize = this.handshakeInfo?.maxFileSize\n if (maxFileSize && filemeta.size > maxFileSize * 1024) {\n throw new Error(`File size exceeds the limit of ${maxFileSize / 1024} MB`)\n }\n\n const abort = async () => {\n await this.deleteFile(fileId);\n controller.abort();\n window.removeEventListener(\"pagehide\", abort);\n }\n\n if (chunkIndex === 0 && this.handshakeInfo?.checkFileType && !fileScaner(chunk).valid) {\n await abort()\n return {\n success: false,\n message: \"Unknown or unsupported file type\",\n data: null,\n code: 0\n }\n }\n\n const info: any = {\n method: 'PUT',\n signal: controller.signal,\n body: {\n chunk,\n filemeta\n },\n onProgress: (p: number) => {\n if (onProgress) {\n const totalProgress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\n const currentProgress = Math.floor((p / 100) / filemeta.totalChunks * 100)\n onProgress(Math.min(totalProgress + currentProgress, 100))\n }\n }\n }\n\n await this.hooksCall('beforeUploadChunk', chunk, filemeta);\n\n let res = await this.fetch('/', info)\n\n if (!res.success) {\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n window.removeEventListener(\"pagehide\", abort);\n res = await this.uploadFile(file, onProgress);\n } else {\n await abort()\n return res\n }\n }\n await this.hooksCall('afterUploadChunk', res, filemeta);\n window.removeEventListener(\"pagehide\", abort);\n return {\n success: true,\n message: 'File uploaded successfully',\n data: filemeta,\n code: 200\n }\n } else {\n const fileId = await getFileId(file);\n const _file = await this.hooksCall('beforeUpload', file, fileId) || file;\n const chunkSize = this.handshakeInfo?.chunkSize\n\n // send metadata\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 filemeta.chunkIndex = chunkIndex;\n await this.uploadFile({\n chunk,\n meta: filemeta\n })\n }\n\n const info = {\n success: true,\n message: 'File uploaded successfully',\n data: filemeta,\n code: 200\n }\n await this.hooksCall('afterUpload', info, _file);\n return info\n }\n }\n\n async deleteFile(fileId: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n const res = await this.fetch('/', {\n ...init,\n method: 'DELETE',\n body: { fileId }\n });\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n return await this.deleteFile(fileId, init);\n }\n return res;\n }\n\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\n return await this.send(path, init);\n }\n\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"POST\" });\n }\n\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"PUT\" });\n }\n\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"DELETE\" });\n }\n\n}\n\nexport default SecurequClient;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/client/index.ts"],"sourcesContent":["import { FileUploadArgs, HttpRequestInit, SecurequClientResponse } from \"./types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/file\";\nimport Base from \"./Base\";\nimport fileScaner from '../include/file-scaner';\nimport { UploadFileMeta } from \"../server/types\";\n\nexport * from \"./types\"\n\nclass SecurequClient extends Base {\n\n async send(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n init = await this.hooksCall('beforeRequest', path, init) || init;\n const url = await this.url(path)\n if (url.pathname === '/') throw new Error(\"Path is not allowed\")\n\n for (let key in init?.body) {\n if (init?.body[key] instanceof File) {\n init.body[key] = await this.uploadFile(init.body[key], init?.onProgress)\n }\n }\n\n const res = await this.fetch(path, init);\n if ([\"Signeture expired\", \"Request expired\", \"Invalid Signeture\"].includes(res.message)) {\n await this.handshake();\n return await this.send(path, init);\n }\n await this.hooksCall('afterResponse', res);\n return res;\n }\n\n async uploadFile(file: FileUploadArgs, onProgress?: (p: number) => void): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n\n if (!(file instanceof File)) {\n const controller = new AbortController();\n const chunk = file.chunk\n const filemeta = file.meta\n const chunkIndex = filemeta.chunkIndex;\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\n const fileId = filemeta.fileId\n const maxFileSize = this.handshakeInfo?.maxFileSize\n if (maxFileSize && filemeta.size > maxFileSize * 1024) {\n throw new Error(`File size exceeds the limit of ${maxFileSize / 1024} MB`)\n }\n\n const abort = async () => {\n await this.deleteFile(fileId);\n controller.abort();\n window.removeEventListener(\"pagehide\", abort);\n }\n\n if (chunkIndex === 0 && this.handshakeInfo?.checkFileType && !fileScaner(chunk).valid) {\n await abort()\n return {\n success: false,\n message: \"Unknown or unsupported file type\",\n data: null,\n code: 0\n }\n }\n\n const info: any = {\n method: 'PUT',\n signal: controller.signal,\n body: {\n chunk,\n filemeta\n },\n onProgress: (p: number) => {\n if (onProgress) {\n const totalProgress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\n const currentProgress = Math.floor((p / 100) / filemeta.totalChunks * 100)\n onProgress(Math.min(totalProgress + currentProgress, 100))\n }\n }\n }\n\n await this.hooksCall('beforeUploadChunk', chunk, filemeta);\n\n let res = await this.fetch('/', info)\n\n if (!res.success) {\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n window.removeEventListener(\"pagehide\", abort);\n res = await this.uploadFile(file, onProgress);\n } else {\n await abort()\n return res\n }\n }\n await this.hooksCall('afterUploadChunk', res, filemeta);\n window.removeEventListener(\"pagehide\", abort);\n return {\n success: true,\n message: 'File uploaded successfully',\n data: filemeta,\n code: 200\n }\n } else {\n const fileId = await getFileId(file);\n const _file = await this.hooksCall('beforeUpload', file, fileId) || file;\n const chunkSize = this.handshakeInfo?.chunkSize\n\n // send metadata\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 filemeta.chunkIndex = chunkIndex;\n await this.uploadFile({\n chunk,\n meta: filemeta\n })\n }\n\n const info = {\n success: true,\n message: 'File uploaded successfully',\n data: filemeta,\n code: 200\n }\n await this.hooksCall('afterUpload', info, _file);\n return info\n }\n }\n\n async deleteFile(fileId: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n const res = await this.fetch('/', {\n ...init,\n method: 'DELETE',\n body: { fileId }\n });\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\n await this.handshake();\n return await this.deleteFile(fileId, init);\n }\n return res;\n }\n\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\n return await this.send(path, init);\n }\n\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"POST\" });\n }\n\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"PUT\" });\n }\n\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n return await this.send(path, { ...init, method: \"DELETE\" });\n }\n\n}\n\nexport default SecurequClient;\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securequ",
3
- "version": "1.1.24",
3
+ "version": "1.1.26",
4
4
  "type": "module",
5
5
  "description": "High‑level encrypted & compressed HTTP request + chunked upload toolkit for browser ↔ server applications.",
6
6
  "keywords": [],
package/server/Base.cjs CHANGED
@@ -111,6 +111,7 @@ class SecurequServerBase extends Router {
111
111
  await handler(Object.assign(Object.assign({}, info), { params: match.params }), metadata);
112
112
  }
113
113
  }
114
+ throw new Response("Request not accepted", { status: 404 });
114
115
  }
115
116
  }
116
117
 
@@ -1 +1 @@
1
- {"version":3,"file":"Base.cjs","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 get RESPONSE_CONTENT_TYPE() {\n const isDev = this.config.mode === 'development'\n return isDev ? \"application/json\" : \"application/octet-stream\"\n }\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) {\n throw new Response(\"Invalid client\", { status: 403 });\n }\n\n let secret = client.substring(0, hash.length);\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 } else {\n throw new Response(\"Invalid Signeture\", { 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":"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"}
1
+ {"version":3,"file":"Base.cjs","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 get RESPONSE_CONTENT_TYPE() {\n const isDev = this.config.mode === 'development'\n return isDev ? \"application/json\" : \"application/octet-stream\"\n }\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) {\n throw new Response(\"Invalid client\", { status: 403 });\n }\n\n let secret = client.substring(0, hash.length);\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 } else {\n throw new Response(\"Invalid Signeture\", { 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 throw new Response(\"Request not accepted\", { status: 404 })\n }\n}\n\nexport default SecurequServerBase;"],"names":[],"mappings":"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"}
package/server/Base.js CHANGED
@@ -109,6 +109,7 @@ class SecurequServerBase extends Router {
109
109
  await handler(Object.assign(Object.assign({}, info), { params: match.params }), metadata);
110
110
  }
111
111
  }
112
+ throw new Response("Request not accepted", { status: 404 });
112
113
  }
113
114
  }
114
115
 
@@ -1 +1 @@
1
- {"version":3,"file":"Base.js","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, Metadata } from \"./types\";\n\nclass SecurequServerBase extends Router {\n protected config: SecurequServerConfig;\n protected secret: string | null = null\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n get RESPONSE_CONTENT_TYPE() {\n const isDev = this.config.mode === 'development'\n return isDev ? \"application/json\" : \"application/octet-stream\"\n }\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) {\n throw new Response(\"Invalid client\", { status: 403 });\n }\n\n let secret = client.substring(0, hash.length);\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 } else {\n throw new Response(\"Invalid Signeture\", { 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":"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"}
1
+ {"version":3,"file":"Base.js","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, Metadata } from \"./types\";\n\nclass SecurequServerBase extends Router {\n protected config: SecurequServerConfig;\n protected secret: string | null = null\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\n readonly CONTENT_TYPE = \"application/octet-stream\";\n\n get RESPONSE_CONTENT_TYPE() {\n const isDev = this.config.mode === 'development'\n return isDev ? \"application/json\" : \"application/octet-stream\"\n }\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) {\n throw new Response(\"Invalid client\", { status: 403 });\n }\n\n let secret = client.substring(0, hash.length);\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 } else {\n throw new Response(\"Invalid Signeture\", { 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 throw new Response(\"Request not accepted\", { status: 404 })\n }\n}\n\nexport default SecurequServerBase;"],"names":[],"mappings":"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"}
package/server/index.cjs CHANGED
@@ -168,9 +168,41 @@ class SecurequServer extends Base {
168
168
  }
169
169
  catch (info) {
170
170
  if (this.config.debug) {
171
- console.log(`URL: ${url}`);
172
- console.log('RESPONSE:');
171
+ let data = null;
172
+ if (body) {
173
+ if (isDev) {
174
+ const decoder = new TextDecoder();
175
+ const text = decoder.decode(body).trim();
176
+ if (text) {
177
+ try {
178
+ data = JSON.parse(text);
179
+ }
180
+ catch (error) {
181
+ }
182
+ }
183
+ }
184
+ else {
185
+ data = await crypto.decryptBuffer(body, clientInfo.secret);
186
+ }
187
+ }
188
+ const colors = {
189
+ reset: "\x1b[0m",
190
+ cyan: "\x1b[36m",
191
+ yellow: "\x1b[33m",
192
+ green: "\x1b[32m",
193
+ magenta: "\x1b[35m",
194
+ blue: "\x1b[34m",
195
+ bold: "\x1b[1m"
196
+ };
197
+ console.log(`${colors.blue}======================${colors.reset}`);
198
+ console.log(`${colors.bold}${colors.cyan}URL:${colors.reset} ${url}`);
199
+ console.log(`${colors.bold}${colors.yellow}METHOD:${colors.reset} ${method}`);
200
+ console.log(`${colors.bold}${colors.magenta}SIGNATURE:${colors.reset} ${signeture}`);
201
+ console.log(`${colors.bold}${colors.green}REQUEST BODY:${colors.reset}`);
202
+ console.log(data);
203
+ console.log(`${colors.bold}${colors.blue}RESPONSE:${colors.reset}`);
173
204
  console.log(info);
205
+ console.log(`${colors.blue}======================${colors.reset}`);
174
206
  }
175
207
  const isError = info instanceof Error;
176
208
  const isResponse = info instanceof Response;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { ListenerInfo, ServerResponse, UploadFileMeta } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/file-scaner\";\nimport { HTTPMethods } from \"../client/types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/file\";\nexport * from './types'\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 && !fileScaner(chunk).valid) {\n 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 const signeture = headers['x-signeture'] || '';\n const origin = headers['x-origin'] || '';\n const method: HTTPMethods = headers['x-method'] || 'POST' as any\n let clientInfo = await this.clientInfo(url, origin)\n\n\n if (!clientInfo) {\n return {\n status: 403,\n value: \"Client not allowed\",\n contentType: 'text/plain'\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 if (!signeture) {\n throw new Response(\"Signeture is required\", { status: 403 });\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).trim();\n if (text) {\n try {\n data = JSON.parse(text)\n } catch (error) {\n\n }\n }\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 if (this.config.debug) {\n console.log(`URL: ${url}`);\n console.log('RESPONSE:');\n console.log(info);\n }\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 contentType: 'application/json'\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n value: await crypto.encryptBuffer(value, clientInfo.secret),\n contentType: 'application/octet-stream'\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n value: \"404 page not found\",\n contentType: 'text/plain'\n };\n }\n\n return {\n status: 404,\n value: await crypto.encryptBuffer(\"404 page not found\", clientInfo.secret),\n contentType: 'application/octet-stream'\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":["SecurequServerBase","file","getFileId","totalChunks","__asyncValues","chunkFile"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { ListenerInfo, ServerResponse, UploadFileMeta } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/file-scaner\";\nimport { HTTPMethods } from \"../client/types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/file\";\nexport * from './types'\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 && !fileScaner(chunk).valid) {\n 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 const signeture = headers['x-signeture'] || '';\n const origin = headers['x-origin'] || '';\n const method: HTTPMethods = headers['x-method'] || 'POST' as any\n let clientInfo = await this.clientInfo(url, origin)\n\n\n if (!clientInfo) {\n return {\n status: 403,\n value: \"Client not allowed\",\n contentType: 'text/plain'\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 if (!signeture) {\n throw new Response(\"Signeture is required\", { status: 403 });\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).trim();\n if (text) {\n try {\n data = JSON.parse(text)\n } catch (error) {\n\n }\n }\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 if (this.config.debug) {\n let data: any = null\n if (body) {\n if (isDev) {\n const decoder = new TextDecoder();\n const text = decoder.decode(body).trim();\n if (text) {\n try {\n data = JSON.parse(text)\n } catch (error) {\n\n }\n }\n } else {\n data = await crypto.decryptBuffer(body, clientInfo.secret)\n }\n }\n const colors = {\n reset: \"\\x1b[0m\",\n cyan: \"\\x1b[36m\",\n yellow: \"\\x1b[33m\",\n green: \"\\x1b[32m\",\n magenta: \"\\x1b[35m\",\n blue: \"\\x1b[34m\",\n bold: \"\\x1b[1m\"\n };\n\n console.log(`${colors.blue}======================${colors.reset}`);\n console.log(`${colors.bold}${colors.cyan}URL:${colors.reset} ${url}`);\n console.log(`${colors.bold}${colors.yellow}METHOD:${colors.reset} ${method}`);\n console.log(`${colors.bold}${colors.magenta}SIGNATURE:${colors.reset} ${signeture}`);\n\n console.log(`${colors.bold}${colors.green}REQUEST BODY:${colors.reset}`);\n console.log(data);\n\n console.log(`${colors.bold}${colors.blue}RESPONSE:${colors.reset}`);\n console.log(info);\n\n console.log(`${colors.blue}======================${colors.reset}`);\n }\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 contentType: 'application/json'\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n value: await crypto.encryptBuffer(value, clientInfo.secret),\n contentType: 'application/octet-stream'\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n value: \"404 page not found\",\n contentType: 'text/plain'\n };\n }\n\n return {\n status: 404,\n value: await crypto.encryptBuffer(\"404 page not found\", clientInfo.secret),\n contentType: 'application/octet-stream'\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":["SecurequServerBase","file","getFileId","totalChunks","__asyncValues","chunkFile"],"mappings":"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"}
package/server/index.js CHANGED
@@ -166,9 +166,41 @@ class SecurequServer extends SecurequServerBase {
166
166
  }
167
167
  catch (info) {
168
168
  if (this.config.debug) {
169
- console.log(`URL: ${url}`);
170
- console.log('RESPONSE:');
169
+ let data = null;
170
+ if (body) {
171
+ if (isDev) {
172
+ const decoder = new TextDecoder();
173
+ const text = decoder.decode(body).trim();
174
+ if (text) {
175
+ try {
176
+ data = JSON.parse(text);
177
+ }
178
+ catch (error) {
179
+ }
180
+ }
181
+ }
182
+ else {
183
+ data = await crypto.decryptBuffer(body, clientInfo.secret);
184
+ }
185
+ }
186
+ const colors = {
187
+ reset: "\x1b[0m",
188
+ cyan: "\x1b[36m",
189
+ yellow: "\x1b[33m",
190
+ green: "\x1b[32m",
191
+ magenta: "\x1b[35m",
192
+ blue: "\x1b[34m",
193
+ bold: "\x1b[1m"
194
+ };
195
+ console.log(`${colors.blue}======================${colors.reset}`);
196
+ console.log(`${colors.bold}${colors.cyan}URL:${colors.reset} ${url}`);
197
+ console.log(`${colors.bold}${colors.yellow}METHOD:${colors.reset} ${method}`);
198
+ console.log(`${colors.bold}${colors.magenta}SIGNATURE:${colors.reset} ${signeture}`);
199
+ console.log(`${colors.bold}${colors.green}REQUEST BODY:${colors.reset}`);
200
+ console.log(data);
201
+ console.log(`${colors.bold}${colors.blue}RESPONSE:${colors.reset}`);
171
202
  console.log(info);
203
+ console.log(`${colors.blue}======================${colors.reset}`);
172
204
  }
173
205
  const isError = info instanceof Error;
174
206
  const isResponse = info instanceof Response;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { ListenerInfo, ServerResponse, UploadFileMeta } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/file-scaner\";\nimport { HTTPMethods } from \"../client/types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/file\";\nexport * from './types'\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 && !fileScaner(chunk).valid) {\n 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 const signeture = headers['x-signeture'] || '';\n const origin = headers['x-origin'] || '';\n const method: HTTPMethods = headers['x-method'] || 'POST' as any\n let clientInfo = await this.clientInfo(url, origin)\n\n\n if (!clientInfo) {\n return {\n status: 403,\n value: \"Client not allowed\",\n contentType: 'text/plain'\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 if (!signeture) {\n throw new Response(\"Signeture is required\", { status: 403 });\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).trim();\n if (text) {\n try {\n data = JSON.parse(text)\n } catch (error) {\n\n }\n }\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 if (this.config.debug) {\n console.log(`URL: ${url}`);\n console.log('RESPONSE:');\n console.log(info);\n }\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 contentType: 'application/json'\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n value: await crypto.encryptBuffer(value, clientInfo.secret),\n contentType: 'application/octet-stream'\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n value: \"404 page not found\",\n contentType: 'text/plain'\n };\n }\n\n return {\n status: 404,\n value: await crypto.encryptBuffer(\"404 page not found\", clientInfo.secret),\n contentType: 'application/octet-stream'\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":[],"mappings":";;;;;;AAQA,MAAM,cAAe,SAAQ,kBAAkB,CAAA;AAE5C,IAAA,MAAM,SAAS,CAAC,IAAS,EAAE,UAAe,EAAA;;AACvC,QAAA,MAAM,IAAI,GAAQ,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;AACrE,QAAA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;AAC3C,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AACpD,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE;AAChC,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;AACtC,QAAA;AAAM,aAAA,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE;AAC3C,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;AAC7C,QAAA;AAAM,aAAA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,EAAE;AAC9C,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;AACtC,QAAA;AAED,QAAA,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE;QAC7B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE;AAE5D,QAAA,IAAI,IAAI,GAAG;AACR,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa;AACvC,YAAA,aAAa,EAAE,QAAQ;YACvB,WAAW,EAAE,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,KAAI,IAAI;YAClD,aAAa,EAAE,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,aAAa,KAAI,KAAK;AACvD,YAAA,SAAS,EAAE,MAAM,MAAM,CAAC,OAAO,CAAC;AAC7B,gBAAA,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC1B,IAAI,EAAE,UAAU,CAAC;AACnB,aAAA,EAAE,YAAY;SACjB;AACD,QAAA,MAAM,IAAI;IACb;AAEA,IAAA,MAAM,UAAU,CAAC,IAAU,EAAE,UAAgC,EAAA;;;QAC1D,IAAI,EAAC,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,CAAA;YAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAE1F,QAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;AAC5C,QAAA,MAAM,QAAQ,GAAmB;AAC9B,YAAA,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC;AACzC,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,QAAQ,EAAE;SACZ;;YAED,KAAwC,IAAA,EAAA,GAAA,IAAA,EAAA,EAAA,GAAA,aAAA,CAAA,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA,EAAA,EAAA,EAAA,EAAA,GAAA,MAAA,EAAA,CAAA,IAAA,EAAA,EAAA,EAAA,GAAA,EAAA,CAAA,IAAA,EAAA,CAAA,EAAA,GAAA;gBAA1B,EAAA,GAAA,EAAA,CAAA,KAAA;gBAAA,EAAA,GAAA,KAAA;;AAA7B,oBAAA,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAA;AACjC,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;AACjF,wBAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;AACrD,oBAAA;AACD,oBAAA,QAAQ,CAAC,UAAU,GAAG,UAAU;oBAChC,QAAQ,CAAC,QAAQ,GAAG,UAAU,GAAG,CAAC,KAAK,QAAQ,CAAC,WAAW;AAC3D,oBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC;AAC9C,oBAAA,IAAI,UAAU,EAAE;wBACb,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC;wBAC5E,UAAU,CAAC,QAAQ,CAAC;AACtB,oBAAA;;;;;AACH,YAAA;;;;;;;;;AACD,QAAA,OAAO,QAAQ;IAClB;IAEA,MAAM,UAAU,CAAC,MAAc,EAAA;;QAC5B,IAAI,EAAC,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,CAAA;YAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC1F,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACxC;IAEA,MAAM,MAAM,CAAC,GAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAgB,EAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE;QACxC,MAAM,MAAM,GAAgB,OAAO,CAAC,UAAU,CAAC,IAAI,MAAa;QAChE,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;QAGnD,IAAI,CAAC,UAAU,EAAE;YACd,OAAO;AACJ,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,KAAK,EAAE,oBAAoB;AAC3B,gBAAA,WAAW,EAAE;aACf;AACH,QAAA;AACD,QAAA,IAAI,IAAI,GAAG,UAAU,CAAC,IAAI;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa;QAChE,IAAI;AACD,YAAA,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,KAAK,MAAM,EAAE;gBACpC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC;AACxC,YAAA;AAED,YAAA,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;gBAAE,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YAE3F,IAAI,CAAC,SAAS,EAAE;gBACb,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC9D,YAAA;AACD,YAAA,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAQ;AAClF,YAAA,IAAI,CAAC,gBAAgB;gBAAE,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC/E,YAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;gBAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAEhG,YAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC;YAExE,IAAI,IAAI,GAAQ,IAAI;AACpB,YAAA,IAAI,IAAI,EAAE;AACP,gBAAA,IAAI,KAAK,EAAE;AACR,oBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;oBACjC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AACxC,oBAAA,IAAI,IAAI,EAAE;wBACP,IAAI;AACD,4BAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACzB,wBAAA;AAAC,wBAAA,OAAO,KAAK,EAAE;AAEf,wBAAA;AACH,oBAAA;AACH,gBAAA;AAAM,qBAAA;AACJ,oBAAA,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;AAC5D,gBAAA;AACH,YAAA;YAED,IAAI,IAAI,KAAK,GAAG,EAAE;AAEf,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;;gBAGnC,IAAI,MAAM,KAAK,KAAK,EAAE;oBACnB,IAAI,EAAC,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,MAAM,CAAA;wBAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAEpF,oBAAA,MAAM,QAAQ,GAAmB,IAAI,CAAC,QAAQ;AAC9C,oBAAA,MAAM,KAAK,GAAe,IAAI,CAAC,KAAK;AAEpC,oBAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC,IAAI,UAAU,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC9E,wBAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;AACrD,oBAAA;oBAED,MAAM,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC;AACxC,oBAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;AACzB,gBAAA;qBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE;oBAC7B,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;AAClC,oBAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;AACzB,gBAAA;AAAM,qBAAA;oBACJ,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACvD,gBAAA;AACH,YAAA;YAED,MAAM,IAAI,CAAC,aAAa,CAAC;gBACtB,MAAM;gBACN,IAAI;AACJ,gBAAA,IAAI,EAAE,IAAI;gBACV,YAAY,EAAE,UAAU,CAAC,YAAY;AACrC,gBAAA,MAAM,EAAE;aACV,EAAE,QAAQ,CAAC;AAEd,QAAA;AAAC,QAAA,OAAO,IAAS,EAAE;AACjB,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACpB,gBAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAA,CAAE,CAAC;AAC1B,gBAAA,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACxB,gBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA;AACD,YAAA,MAAM,OAAO,GAAG,IAAI,YAAY,KAAK;AACrC,YAAA,MAAM,UAAU,GAAG,IAAI,YAAY,QAAQ;YAC3C,IAAI,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5E,YAAA,IAAI,KAAK,EAAE;gBACR,OAAO;oBACJ,MAAM,EAAE,OAAO,GAAG,GAAG,IAAI,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,MAAM,KAAI,GAAG,CAAC;AAC7C,oBAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5B,oBAAA,WAAW,EAAE;iBACf;AACH,YAAA;YACD,OAAO;gBACJ,MAAM,EAAE,OAAO,GAAG,GAAG,IAAI,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,MAAM,KAAI,GAAG,CAAC;gBAC7C,KAAK,EAAE,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC;AAC3D,gBAAA,WAAW,EAAE;aACf;AACH,QAAA;AAED,QAAA,IAAI,KAAK,EAAE;YACR,OAAO;AACJ,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,KAAK,EAAE,oBAAoB;AAC3B,gBAAA,WAAW,EAAE;aACf;AACH,QAAA;QAED,OAAO;AACJ,YAAA,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,EAAE,UAAU,CAAC,MAAM,CAAC;AAC1E,YAAA,WAAW,EAAE;SACf;IACJ;AAEF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { ListenerInfo, ServerResponse, UploadFileMeta } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/file-scaner\";\nimport { HTTPMethods } from \"../client/types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/file\";\nexport * from './types'\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 && !fileScaner(chunk).valid) {\n 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 const signeture = headers['x-signeture'] || '';\n const origin = headers['x-origin'] || '';\n const method: HTTPMethods = headers['x-method'] || 'POST' as any\n let clientInfo = await this.clientInfo(url, origin)\n\n\n if (!clientInfo) {\n return {\n status: 403,\n value: \"Client not allowed\",\n contentType: 'text/plain'\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 if (!signeture) {\n throw new Response(\"Signeture is required\", { status: 403 });\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).trim();\n if (text) {\n try {\n data = JSON.parse(text)\n } catch (error) {\n\n }\n }\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 if (this.config.debug) {\n let data: any = null\n if (body) {\n if (isDev) {\n const decoder = new TextDecoder();\n const text = decoder.decode(body).trim();\n if (text) {\n try {\n data = JSON.parse(text)\n } catch (error) {\n\n }\n }\n } else {\n data = await crypto.decryptBuffer(body, clientInfo.secret)\n }\n }\n const colors = {\n reset: \"\\x1b[0m\",\n cyan: \"\\x1b[36m\",\n yellow: \"\\x1b[33m\",\n green: \"\\x1b[32m\",\n magenta: \"\\x1b[35m\",\n blue: \"\\x1b[34m\",\n bold: \"\\x1b[1m\"\n };\n\n console.log(`${colors.blue}======================${colors.reset}`);\n console.log(`${colors.bold}${colors.cyan}URL:${colors.reset} ${url}`);\n console.log(`${colors.bold}${colors.yellow}METHOD:${colors.reset} ${method}`);\n console.log(`${colors.bold}${colors.magenta}SIGNATURE:${colors.reset} ${signeture}`);\n\n console.log(`${colors.bold}${colors.green}REQUEST BODY:${colors.reset}`);\n console.log(data);\n\n console.log(`${colors.bold}${colors.blue}RESPONSE:${colors.reset}`);\n console.log(info);\n\n console.log(`${colors.blue}======================${colors.reset}`);\n }\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 contentType: 'application/json'\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n value: await crypto.encryptBuffer(value, clientInfo.secret),\n contentType: 'application/octet-stream'\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n value: \"404 page not found\",\n contentType: 'text/plain'\n };\n }\n\n return {\n status: 404,\n value: await crypto.encryptBuffer(\"404 page not found\", clientInfo.secret),\n contentType: 'application/octet-stream'\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":[],"mappings":";;;;;;AAQA,MAAM,cAAe,SAAQ,kBAAkB,CAAA;AAE5C,IAAA,MAAM,SAAS,CAAC,IAAS,EAAE,UAAe,EAAA;;AACvC,QAAA,MAAM,IAAI,GAAQ,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;AACrE,QAAA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;AAC3C,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AACpD,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE;AAChC,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;AACtC,QAAA;AAAM,aAAA,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE;AAC3C,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;AAC7C,QAAA;AAAM,aAAA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,EAAE;AAC9C,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;AACtC,QAAA;AAED,QAAA,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE;QAC7B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE;AAE5D,QAAA,IAAI,IAAI,GAAG;AACR,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa;AACvC,YAAA,aAAa,EAAE,QAAQ;YACvB,WAAW,EAAE,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,KAAI,IAAI;YAClD,aAAa,EAAE,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,aAAa,KAAI,KAAK;AACvD,YAAA,SAAS,EAAE,MAAM,MAAM,CAAC,OAAO,CAAC;AAC7B,gBAAA,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC1B,IAAI,EAAE,UAAU,CAAC;AACnB,aAAA,EAAE,YAAY;SACjB;AACD,QAAA,MAAM,IAAI;IACb;AAEA,IAAA,MAAM,UAAU,CAAC,IAAU,EAAE,UAAgC,EAAA;;;QAC1D,IAAI,EAAC,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,CAAA;YAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAE1F,QAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;AAC5C,QAAA,MAAM,QAAQ,GAAmB;AAC9B,YAAA,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC;AACzC,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,QAAQ,EAAE;SACZ;;YAED,KAAwC,IAAA,EAAA,GAAA,IAAA,EAAA,EAAA,GAAA,aAAA,CAAA,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA,EAAA,EAAA,EAAA,EAAA,GAAA,MAAA,EAAA,CAAA,IAAA,EAAA,EAAA,EAAA,GAAA,EAAA,CAAA,IAAA,EAAA,CAAA,EAAA,GAAA;gBAA1B,EAAA,GAAA,EAAA,CAAA,KAAA;gBAAA,EAAA,GAAA,KAAA;;AAA7B,oBAAA,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAA;AACjC,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;AACjF,wBAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;AACrD,oBAAA;AACD,oBAAA,QAAQ,CAAC,UAAU,GAAG,UAAU;oBAChC,QAAQ,CAAC,QAAQ,GAAG,UAAU,GAAG,CAAC,KAAK,QAAQ,CAAC,WAAW;AAC3D,oBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC;AAC9C,oBAAA,IAAI,UAAU,EAAE;wBACb,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC;wBAC5E,UAAU,CAAC,QAAQ,CAAC;AACtB,oBAAA;;;;;AACH,YAAA;;;;;;;;;AACD,QAAA,OAAO,QAAQ;IAClB;IAEA,MAAM,UAAU,CAAC,MAAc,EAAA;;QAC5B,IAAI,EAAC,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,CAAA;YAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC1F,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACxC;IAEA,MAAM,MAAM,CAAC,GAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAgB,EAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE;QACxC,MAAM,MAAM,GAAgB,OAAO,CAAC,UAAU,CAAC,IAAI,MAAa;QAChE,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;QAGnD,IAAI,CAAC,UAAU,EAAE;YACd,OAAO;AACJ,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,KAAK,EAAE,oBAAoB;AAC3B,gBAAA,WAAW,EAAE;aACf;AACH,QAAA;AACD,QAAA,IAAI,IAAI,GAAG,UAAU,CAAC,IAAI;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa;QAChE,IAAI;AACD,YAAA,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,KAAK,MAAM,EAAE;gBACpC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC;AACxC,YAAA;AAED,YAAA,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;gBAAE,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YAE3F,IAAI,CAAC,SAAS,EAAE;gBACb,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC9D,YAAA;AACD,YAAA,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAQ;AAClF,YAAA,IAAI,CAAC,gBAAgB;gBAAE,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC/E,YAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;gBAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAEhG,YAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC;YAExE,IAAI,IAAI,GAAQ,IAAI;AACpB,YAAA,IAAI,IAAI,EAAE;AACP,gBAAA,IAAI,KAAK,EAAE;AACR,oBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;oBACjC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AACxC,oBAAA,IAAI,IAAI,EAAE;wBACP,IAAI;AACD,4BAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACzB,wBAAA;AAAC,wBAAA,OAAO,KAAK,EAAE;AAEf,wBAAA;AACH,oBAAA;AACH,gBAAA;AAAM,qBAAA;AACJ,oBAAA,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;AAC5D,gBAAA;AACH,YAAA;YAED,IAAI,IAAI,KAAK,GAAG,EAAE;AAEf,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;;gBAGnC,IAAI,MAAM,KAAK,KAAK,EAAE;oBACnB,IAAI,EAAC,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,MAAM,CAAA;wBAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAEpF,oBAAA,MAAM,QAAQ,GAAmB,IAAI,CAAC,QAAQ;AAC9C,oBAAA,MAAM,KAAK,GAAe,IAAI,CAAC,KAAK;AAEpC,oBAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC,IAAI,UAAU,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC9E,wBAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;AACrD,oBAAA;oBAED,MAAM,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC;AACxC,oBAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;AACzB,gBAAA;qBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE;oBAC7B,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;AAClC,oBAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;AACzB,gBAAA;AAAM,qBAAA;oBACJ,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACvD,gBAAA;AACH,YAAA;YAED,MAAM,IAAI,CAAC,aAAa,CAAC;gBACtB,MAAM;gBACN,IAAI;AACJ,gBAAA,IAAI,EAAE,IAAI;gBACV,YAAY,EAAE,UAAU,CAAC,YAAY;AACrC,gBAAA,MAAM,EAAE;aACV,EAAE,QAAQ,CAAC;AAEd,QAAA;AAAC,QAAA,OAAO,IAAS,EAAE;AACjB,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBACpB,IAAI,IAAI,GAAQ,IAAI;AACpB,gBAAA,IAAI,IAAI,EAAE;AACP,oBAAA,IAAI,KAAK,EAAE;AACR,wBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;wBACjC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AACxC,wBAAA,IAAI,IAAI,EAAE;4BACP,IAAI;AACD,gCAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACzB,4BAAA;AAAC,4BAAA,OAAO,KAAK,EAAE;AAEf,4BAAA;AACH,wBAAA;AACH,oBAAA;AAAM,yBAAA;AACJ,wBAAA,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;AAC5D,oBAAA;AACH,gBAAA;AACD,gBAAA,MAAM,MAAM,GAAG;AACZ,oBAAA,KAAK,EAAE,SAAS;AAChB,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,MAAM,EAAE,UAAU;AAClB,oBAAA,KAAK,EAAE,UAAU;AACjB,oBAAA,OAAO,EAAE,UAAU;AACnB,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,IAAI,EAAE;iBACR;AAED,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,sBAAA,EAAyB,MAAM,CAAC,KAAK,CAAA,CAAE,CAAC;AAClE,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,IAAA,EAAO,MAAM,CAAC,KAAK,IAAI,GAAG,CAAA,CAAE,CAAC;AACrE,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAA,EAAG,MAAM,CAAC,MAAM,CAAA,OAAA,EAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAA,CAAE,CAAC;AAC7E,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAA,EAAG,MAAM,CAAC,OAAO,CAAA,UAAA,EAAa,MAAM,CAAC,KAAK,IAAI,SAAS,CAAA,CAAE,CAAC;AAEpF,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,EAAG,MAAM,CAAC,KAAK,CAAA,aAAA,EAAgB,MAAM,CAAC,KAAK,CAAA,CAAE,CAAC;AACxE,gBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEjB,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,SAAA,EAAY,MAAM,CAAC,KAAK,CAAA,CAAE,CAAC;AACnE,gBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEjB,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,sBAAA,EAAyB,MAAM,CAAC,KAAK,CAAA,CAAE,CAAC;AACpE,YAAA;AACD,YAAA,MAAM,OAAO,GAAG,IAAI,YAAY,KAAK;AACrC,YAAA,MAAM,UAAU,GAAG,IAAI,YAAY,QAAQ;YAC3C,IAAI,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5E,YAAA,IAAI,KAAK,EAAE;gBACR,OAAO;oBACJ,MAAM,EAAE,OAAO,GAAG,GAAG,IAAI,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,MAAM,KAAI,GAAG,CAAC;AAC7C,oBAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5B,oBAAA,WAAW,EAAE;iBACf;AACH,YAAA;YACD,OAAO;gBACJ,MAAM,EAAE,OAAO,GAAG,GAAG,IAAI,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,MAAM,KAAI,GAAG,CAAC;gBAC7C,KAAK,EAAE,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC;AAC3D,gBAAA,WAAW,EAAE;aACf;AACH,QAAA;AAED,QAAA,IAAI,KAAK,EAAE;YACR,OAAO;AACJ,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,KAAK,EAAE,oBAAoB;AAC3B,gBAAA,WAAW,EAAE;aACf;AACH,QAAA;QAED,OAAO;AACJ,YAAA,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,EAAE,UAAU,CAAC,MAAM,CAAC;AAC1E,YAAA,WAAW,EAAE;SACf;IACJ;AAEF;;;;"}