{"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   private handshakeInfo: HandshakeInfo | null = null;\n   private secret_length: number = 0;\n   private loadingHandshake: boolean = false;\n   private handshakeErrorCount = 0\n\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   async handshake() {\n      if (this.handshakeInfo) {\n         return this.handshakeInfo\n      }\n\n      if (this.loadingHandshake) {\n         return await new Promise((resolve) => {\n            const interval = setInterval(() => {\n               if (!this.loadingHandshake) {\n                  clearInterval(interval);\n                  resolve(this.handshakeInfo);\n               }\n            }, 10);\n         })\n      }\n\n      this.handshakeInfo = null;\n      this.loadingHandshake = true;\n\n      await this.hooksCall('beforeHandshake');\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      this.handshakeErrorCount = 0\n      await this.hooksCall('afterHandshake', this.handshakeInfo);\n      return res.data\n   }\n\n   async refreshHandshake() {\n      this.handshakeInfo = null\n      return await this.handshake()\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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"}