{"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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"}