securequ 1.1.24 → 1.1.25
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/index.cjs +1 -1
- package/client/index.cjs.map +1 -1
- package/client/index.js +1 -1
- package/client/index.js.map +1 -1
- package/package.json +1 -1
- package/server/Base.cjs +1 -0
- package/server/Base.cjs.map +1 -1
- package/server/Base.js +1 -0
- package/server/Base.js.map +1 -1
- package/server/index.cjs +34 -2
- package/server/index.cjs.map +1 -1
- package/server/index.js +34 -2
- package/server/index.js.map +1 -1
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
|
}
|
package/client/index.cjs.map
CHANGED
|
@@ -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
|
}
|
package/client/index.js.map
CHANGED
|
@@ -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
package/server/Base.cjs
CHANGED
package/server/Base.cjs.map
CHANGED
|
@@ -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
package/server/Base.js.map
CHANGED
|
@@ -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
|
|
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
|
-
|
|
172
|
-
|
|
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;
|
package/server/index.cjs.map
CHANGED
|
@@ -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
|
-
|
|
170
|
-
|
|
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;
|
package/server/index.js.map
CHANGED
|
@@ -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":"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"}
|
|
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":"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"}
|