securequ 1.1.1 → 1.1.3

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.d.ts CHANGED
@@ -1,22 +1,22 @@
1
1
  import { SecurequClientConfig, HandshakeInfo, HttpRequestInit, SecurequClientResponse } from './types.js';
2
2
 
3
- declare class Base {
4
- protected config: SecurequClientConfig;
5
- protected loadingHandshake: boolean;
6
- protected secret_length: number;
7
- protected handshakeInfo: HandshakeInfo | null;
8
- constructor(config: SecurequClientConfig);
9
- protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]): any;
10
- protected getSecret(): Promise<{
11
- full: string;
12
- secret: string;
13
- hash: string;
14
- }>;
15
- protected url(path: string): Promise<URL>;
16
- protected getHeaders(path: string, init?: HttpRequestInit): Promise<any>;
17
- protected awaitForHandshake(): Promise<void>;
18
- handshake(): Promise<void>;
19
- protected fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse>;
3
+ declare class Base {
4
+ protected config: SecurequClientConfig;
5
+ protected loadingHandshake: boolean;
6
+ protected secret_length: number;
7
+ protected handshakeInfo: HandshakeInfo | null;
8
+ constructor(config: SecurequClientConfig);
9
+ protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]): any;
10
+ protected getSecret(): Promise<{
11
+ full: string;
12
+ secret: string;
13
+ hash: string;
14
+ }>;
15
+ protected url(path: string): Promise<URL>;
16
+ protected getHeaders(path: string, init?: HttpRequestInit): Promise<any>;
17
+ protected awaitForHandshake(): Promise<void>;
18
+ handshake(): Promise<void>;
19
+ protected fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse>;
20
20
  }
21
21
 
22
22
  export { Base as default };
@@ -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\n constructor(config: SecurequClientConfig) {\n this.config = { ...config }\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 return {\n ...this.config?.defaultOptions?.headers,\n ...init?.headers,\n ...headers,\n 'Content-Type': 'application/octet-stream',\n \"X-ORIGIN\": url.origin\n }\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 protected 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 enc = await crypto.encrypt(params, secret.secret)\n url.href = url.href + \"?\" + 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 const val = JSON.parse(value)\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 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\n}\n\nexport default Base;\n"],"names":["Object","defineProperty","exports","value","crypto","require","xanFetch","Clients","Map","default","constructor","config","this","loadingHandshake","secret_length","handshakeInfo","assign","url","URL","search","hash","Error","origin","pathname","has","hooksCall","hook","args","hooks","getSecret","full","secret","substring","path","base","trim","startsWith","endsWith","length","getHeaders","init","headers","encrypt","signeture","_a","expire","Date","now","timeDiffarenc","_c","_b","defaultOptions","awaitForHandshake","Promise","resolve","interval","setInterval","clearInterval","handshake","max","min","Math","floor","random","res","fetch","method","body","clientTime","toISOString","data","isDev","dev","sparams","fromEntries","searchParams","entries","_init","params","keys","key","delete","enc","href","encodeURIComponent","httpOption","JSON","stringify","encryptBuffer","text","val","parse","success","ok","message","statusText","code","status","arrayBuffer","decryptBuffer","Uint8Array"],"mappings":"AAKA,aAAAA,OAAAC,eAAAC,QAAA,aAAA,CAAAC,OAAA,IAAA,IAAAC,EAAAC,QAAA,wBAAAC,EAAAD,QAAA,YAAA,MAAME,EAAU,IAAIC,IAwKnBN,QAAAO,QAtKD,MAMG,WAAAC,CAAYC,GAJFC,KAAAC,kBAA4B,EAC5BD,KAAAE,cAAwB,EACxBF,KAAAG,cAAsC,KAG7CH,KAAKD,OAAMX,OAAAgB,OAAA,CAAA,EAAQL,GACnB,MAAMM,EAAM,IAAIC,IAAIP,EAAOM,KAC3B,GAAIA,EAAIE,QAAUF,EAAIG,KAAM,MAAM,IAAIC,MAAM,sBAAsBV,EAAOM,iEAGzE,GAFAN,EAAOM,IAAM,GAAGA,EAAIK,SAASL,EAAIM,WAE7BhB,EAAQiB,IAAIb,EAAOM,KACpB,MAAM,IAAII,MAAM,qBAEtB,CAEU,SAAAI,CAAUC,KAA2DC,GAC5E,GAAIf,KAAKD,OAAOiB,OAAShB,KAAKD,OAAOiB,MAAMF,GACxC,OAAQd,KAAKD,OAAOiB,MAAMF,MAAsBC,EAEtD,CAEU,eAAME,GACb,IAAIC,EAAOlB,KAAKD,OAAOoB,OACnBA,EAASD,EAAKE,UAAU,EAAGpB,KAAKE,eAEpC,MAAO,CAAEgB,OAAMC,SAAQX,YADLhB,EAAAA,QAAOgB,KAAKW,IAASC,UAAU,EAAGpB,KAAKE,eAE5D,CAEU,SAAMG,CAAIgB,GACjB,MAAMF,QAAenB,KAAKiB,YACpBK,EAAOtB,KAAKD,OAAOM,IAMzB,MALa,MAATgB,IAAcA,EAAO,KAGzBA,GADAA,GADAA,EAAOA,EAAKE,QACAC,WAAW,KAAOH,EAAKD,UAAU,GAAKC,GACtCI,SAAS,KAAOJ,EAAKD,UAAU,EAAGC,EAAKK,OAAS,GAAKL,KACvDA,EAAO,IAAIA,KACd,IAAIf,IAAI,GAAGgB,KAAQH,EAAOX,OAAOa,IAC3C,CAEU,gBAAMM,CAAWN,EAAcO,aACtC,MAAMvB,QAAYL,KAAKK,IAAIgB,GACrBF,QAAenB,KAAKiB,YAC1B,IAAIY,EAAe,CAAA,EAOnB,OANI7B,KAAKG,gBACN0B,EAAQ,qBAAuBrC,EAAAA,QAAOsC,QAAQ,CAC3CC,kBAAWC,EAAAhC,KAAKG,oCAAe4B,UAC/BE,OAAQC,KAAKC,MAAQnC,KAAKG,cAAeiC,cAAgB,KACzDjB,EAAOA,SAAW,IAExB/B,OAAAgB,OAAAhB,OAAAgB,OAAAhB,OAAAgB,OAAAhB,OAAAgB,OAAA,CAAA,EACiC,QAA3BiC,EAAW,QAAXC,EAAAtC,KAAKD,cAAM,IAAAuC,OAAA,EAAAA,EAAEC,sBAAc,IAAAF,OAAA,EAAAA,EAAER,SAC7BD,aAAI,EAAJA,EAAMC,SACNA,GAAO,CACV,eAAgB,2BAChB,WAAYxB,EAAIK,QAEtB,CAEU,uBAAM8B,GACTxC,KAAKC,wBACA,IAAIwC,QAASC,IAChB,MAAMC,EAAWC,YAAY,KACrB5C,KAAKC,mBACP4C,cAAcF,GACdD,EAAQ,QAEX,OAGJ1C,KAAKG,qBACDH,KAAK8C,WAEjB,CAEA,eAAMA,SACG9C,KAAKa,UAAU,mBACrBb,KAAKG,cAAgB,KACrBH,KAAKC,kBAAmB,EAExB,IAAI8C,EAAM/C,KAAKD,OAAOoB,OAAOO,OACzBsB,EAA4B,EAAtBC,KAAKC,MAAMH,EAAM,GAC3B/C,KAAKE,cAAgB+C,KAAKC,MAAMD,KAAKE,UAAYJ,EAAMC,EAAM,IAAMA,EAEnE,MAAM7B,QAAenB,KAAKiB,YACpBmC,QAAYpD,KAAKqD,MAAM,IAAK,CAC/BC,OAAQ,OACRC,KAAM,CACH/C,KAAMW,EAAOX,KACbgD,YAAY,IAAItB,MAAOuB,cACvBtC,OAAQA,EAAOA,UAGrBnB,KAAKG,cAAgBiD,EAAIM,KACzB1D,KAAKC,kBAAmB,QAClBD,KAAKa,UAAU,iBAAkBb,KAAKG,cAC/C,CAEU,WAAMkD,CAAMhC,EAAcO,WACjC,MAAM+B,EAAiB,MAATtC,IAAkC,QAAlBW,EAAAhC,KAAKG,qBAAa,IAAA6B,OAAA,EAAAA,EAAE4B,KAC5CzC,QAAenB,KAAKiB,YACpBZ,QAAYL,KAAKK,IAAIgB,GAC3B,IAAIwC,EAAUzE,OAAO0E,YAAYzD,EAAI0D,aAAaC,WAClD,MAAMC,EAAK7E,OAAAgB,OAAA,CAAA,EAAQwB,GACnB,IAAIsC,EAAM9E,OAAAgB,OAAA,CAAA,EACJyD,GAGN,GAAIzE,OAAO+E,KAAKN,GAASnC,OAAS,EAC/B,IAAK,IAAI0C,KAAOP,EACbxD,EAAI0D,aAAaM,OAAOD,GAI9B,GAAIH,eAAAA,EAAOC,OAAQ,CAChB,IAAK,IAAIE,KAAOH,EAAMC,OACnBA,EAAOE,GAAOH,EAAMC,OAAOE,UAEvBH,EAAMC,MACf,CAED,GAAI9E,OAAO+E,KAAKD,GAAQxC,OAAS,EAC9B,GAAIiC,EACDM,EAAMC,OAASA,MACX,CACJ,MAAMI,QAAY9E,EAAAA,QAAOsC,QAAQoC,EAAQ/C,EAAOA,QAChDd,EAAIkE,KAAOlE,EAAIkE,KAAO,IAAMC,mBAAmBF,EACjD,CAGJ,MAAMG,EAAUrF,OAAAgB,OAAAhB,OAAAgB,OAAAhB,OAAAgB,OAAA,CACbkD,OAAQ,OACM,QAAXhB,EAAAtC,KAAKD,cAAM,IAAAuC,OAAA,EAAAA,EAAEC,gBACb0B,GAAK,CACRpC,cAAe7B,KAAK2B,WAAWN,EAAMO,MAGpC6C,eAAAA,EAAYlB,QAEVkB,EAAWlB,KADVI,EACiBe,KAAKC,UAAUF,EAAWlB,YAEpB/D,UAAOoF,cAAcH,EAAWlB,KAAMpC,EAAOA,SAG3E,MAAMiC,QAAY1D,EAASW,EAAIkE,KAAME,GACrC,GAAId,EAAO,CACR,MAAMpE,QAAc6D,EAAIyB,OAClBC,EAAMJ,KAAKK,MAAMxF,GACvB,MAAO,CACJyF,QAAS5B,EAAI6B,GACbC,QAAS9B,EAAI6B,GAAK7B,EAAI+B,WAAaL,EACnCpB,KAAMN,EAAI6B,GAAKH,EAAM,KACrBM,KAAMhC,EAAIiC,OAEf,CACD,MAAM9F,QAAc6D,EAAIkC,cAClBR,QAAYtF,EAAAA,QAAO+F,cAAc,IAAIC,WAAWjG,GAAQ4B,EAAOA,QACrE,MAAO,CACJ6D,QAAS5B,EAAI6B,GACbC,QAAS9B,EAAI6B,GAAK7B,EAAI+B,WAAaL,EACnCpB,KAAMN,EAAI6B,GAAKH,EAAM,KACrBM,KAAMhC,EAAIiC,OAEhB"}
1
+ {"version":3,"file":"Base.js","sources":["../../src/client/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport { HandshakeInfo, HttpRequestInit, SecurequClientConfig, SecurequClientResponse } from \"./types\";\r\nimport xanFetch from 'xanfetch'\r\n\r\n\r\nconst Clients = new Map<string, Base>()\r\n\r\nclass Base {\r\n protected config: SecurequClientConfig;\r\n protected loadingHandshake: boolean = false;\r\n protected secret_length: number = 0;\r\n protected handshakeInfo: HandshakeInfo | null = null;\r\n\r\n constructor(config: SecurequClientConfig) {\r\n this.config = { ...config }\r\n const url = new URL(config.url)\r\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`)\r\n config.url = `${url.origin}${url.pathname}`\r\n\r\n if (Clients.has(config.url)) {\r\n throw new Error(`Client is Blocked!`);\r\n }\r\n }\r\n\r\n protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]) {\r\n if (this.config.hooks && this.config.hooks[hook]) {\r\n return (this.config.hooks[hook] as Function)(...args)\r\n }\r\n }\r\n\r\n protected async getSecret() {\r\n let full = this.config.secret\r\n let secret = full.substring(0, this.secret_length)\r\n let hash = (await crypto.hash(secret)).substring(0, this.secret_length)\r\n return { full, secret, hash }\r\n }\r\n\r\n protected async url(path: string) {\r\n const secret = await this.getSecret()\r\n const base = this.config.url;\r\n if (path === '/') path = ''\r\n path = path.trim();\r\n path = path.startsWith('/') ? path.substring(1) : path\r\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\r\n if (path) path = `/${path}`\r\n return new URL(`${base}/${secret.hash}${path}`);\r\n }\r\n\r\n protected async getHeaders(path: string, init?: HttpRequestInit) {\r\n const url = await this.url(path)\r\n const secret = await this.getSecret()\r\n let headers: any = {};\r\n if (this.handshakeInfo) {\r\n headers[\"X-SIGNETURE\"] = await crypto.encrypt({\r\n signeture: this.handshakeInfo?.signeture,\r\n expire: Date.now() + this.handshakeInfo!.timeDiffarenc + 10000 // 10 seconds\r\n }, secret.secret) || '';\r\n }\r\n return {\r\n ...this.config?.defaultOptions?.headers,\r\n ...init?.headers,\r\n ...headers,\r\n 'Content-Type': 'application/octet-stream',\r\n \"X-ORIGIN\": url.origin\r\n }\r\n }\r\n\r\n protected async awaitForHandshake() {\r\n if (this.loadingHandshake) {\r\n await new Promise((resolve) => {\r\n const interval = setInterval(() => {\r\n if (!this.loadingHandshake) {\r\n clearInterval(interval);\r\n resolve(null);\r\n }\r\n }, 100);\r\n })\r\n }\r\n if (!this.handshakeInfo) {\r\n await this.handshake();\r\n }\r\n }\r\n\r\n async handshake() {\r\n await this.hooksCall('beforeHandshake');\r\n this.handshakeInfo = null;\r\n this.loadingHandshake = true;\r\n\r\n let max = this.config.secret.length\r\n let min = Math.floor(max / 4) * 3\r\n this.secret_length = Math.floor(Math.random() * (max - min + 1)) + min\r\n\r\n const secret = await this.getSecret()\r\n const res = await this.fetch('/', {\r\n method: 'POST',\r\n body: {\r\n hash: secret.hash,\r\n clientTime: new Date().toISOString(),\r\n secret: secret.secret,\r\n }\r\n })\r\n this.handshakeInfo = res.data\r\n this.loadingHandshake = false;\r\n await this.hooksCall('afterHandshake', this.handshakeInfo);\r\n }\r\n\r\n protected async fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\r\n const isDev = path !== '/' && this.handshakeInfo?.dev\r\n const secret = await this.getSecret()\r\n const url = await this.url(path)\r\n let sparams = Object.fromEntries(url.searchParams.entries())\r\n const _init = { ...init }\r\n let params: any = {\r\n ...sparams,\r\n }\r\n\r\n if (Object.keys(sparams).length > 0) {\r\n for (let key in sparams) {\r\n url.searchParams.delete(key)\r\n }\r\n }\r\n\r\n if (_init?.params) {\r\n for (let key in _init.params) {\r\n params[key] = _init.params[key]\r\n }\r\n delete _init.params\r\n }\r\n\r\n if (Object.keys(params).length > 0) {\r\n if (isDev) {\r\n _init.params = params\r\n } else {\r\n const enc = await crypto.encrypt(params, secret.secret)\r\n url.href = url.href + \"?\" + encodeURIComponent(enc)\r\n }\r\n }\r\n\r\n const httpOption: any = {\r\n method: \"GET\",\r\n ...this.config?.defaultOptions,\r\n ..._init,\r\n headers: await this.getHeaders(path, init)\r\n }\r\n\r\n if (httpOption?.body) {\r\n if (isDev) {\r\n httpOption.body = JSON.stringify(httpOption.body)\r\n } else {\r\n httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);\r\n }\r\n }\r\n const res = await xanFetch(url.href, httpOption)\r\n if (isDev) {\r\n const value = await res.text()\r\n const val = JSON.parse(value)\r\n return {\r\n success: res.ok,\r\n message: res.ok ? res.statusText : val,\r\n data: res.ok ? val : null,\r\n code: res.status\r\n }\r\n }\r\n const value = await res.arrayBuffer()\r\n const val = await crypto.decryptBuffer(new Uint8Array(value), secret.secret) as any\r\n return {\r\n success: res.ok,\r\n message: res.ok ? res.statusText : val,\r\n data: res.ok ? val : null,\r\n code: res.status\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Base;\r\n"],"names":["Object","defineProperty","exports","value","crypto","require","xanFetch","Clients","Map","default","constructor","config","this","loadingHandshake","secret_length","handshakeInfo","assign","url","URL","search","hash","Error","origin","pathname","has","hooksCall","hook","args","hooks","getSecret","full","secret","substring","path","base","trim","startsWith","endsWith","length","getHeaders","init","headers","encrypt","signeture","_a","expire","Date","now","timeDiffarenc","_c","_b","defaultOptions","awaitForHandshake","Promise","resolve","interval","setInterval","clearInterval","handshake","max","min","Math","floor","random","res","fetch","method","body","clientTime","toISOString","data","isDev","dev","sparams","fromEntries","searchParams","entries","_init","params","keys","key","delete","enc","href","encodeURIComponent","httpOption","JSON","stringify","encryptBuffer","text","val","parse","success","ok","message","statusText","code","status","arrayBuffer","decryptBuffer","Uint8Array"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Base.mjs","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\n constructor(config: SecurequClientConfig) {\n this.config = { ...config }\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 return {\n ...this.config?.defaultOptions?.headers,\n ...init?.headers,\n ...headers,\n 'Content-Type': 'application/octet-stream',\n \"X-ORIGIN\": url.origin\n }\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 protected 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 enc = await crypto.encrypt(params, secret.secret)\n url.href = url.href + \"?\" + 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 const val = JSON.parse(value)\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 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\n}\n\nexport default Base;\n"],"names":["crypto","xanFetch","Clients","Map","Base","constructor","config","this","loadingHandshake","secret_length","handshakeInfo","Object","assign","url","URL","search","hash","Error","origin","pathname","has","hooksCall","hook","args","hooks","getSecret","full","secret","substring","path","base","trim","startsWith","endsWith","length","getHeaders","init","headers","encrypt","signeture","_a","expire","Date","now","timeDiffarenc","_c","_b","defaultOptions","awaitForHandshake","Promise","resolve","interval","setInterval","clearInterval","handshake","max","min","Math","floor","random","res","fetch","method","body","clientTime","toISOString","data","isDev","dev","sparams","fromEntries","searchParams","entries","_init","params","keys","key","delete","enc","href","encodeURIComponent","httpOption","JSON","stringify","encryptBuffer","value","text","val","parse","success","ok","message","statusText","code","status","arrayBuffer","decryptBuffer","Uint8Array"],"mappings":"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"}
1
+ {"version":3,"file":"Base.mjs","sources":["../../src/client/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport { HandshakeInfo, HttpRequestInit, SecurequClientConfig, SecurequClientResponse } from \"./types\";\r\nimport xanFetch from 'xanfetch'\r\n\r\n\r\nconst Clients = new Map<string, Base>()\r\n\r\nclass Base {\r\n protected config: SecurequClientConfig;\r\n protected loadingHandshake: boolean = false;\r\n protected secret_length: number = 0;\r\n protected handshakeInfo: HandshakeInfo | null = null;\r\n\r\n constructor(config: SecurequClientConfig) {\r\n this.config = { ...config }\r\n const url = new URL(config.url)\r\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`)\r\n config.url = `${url.origin}${url.pathname}`\r\n\r\n if (Clients.has(config.url)) {\r\n throw new Error(`Client is Blocked!`);\r\n }\r\n }\r\n\r\n protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]) {\r\n if (this.config.hooks && this.config.hooks[hook]) {\r\n return (this.config.hooks[hook] as Function)(...args)\r\n }\r\n }\r\n\r\n protected async getSecret() {\r\n let full = this.config.secret\r\n let secret = full.substring(0, this.secret_length)\r\n let hash = (await crypto.hash(secret)).substring(0, this.secret_length)\r\n return { full, secret, hash }\r\n }\r\n\r\n protected async url(path: string) {\r\n const secret = await this.getSecret()\r\n const base = this.config.url;\r\n if (path === '/') path = ''\r\n path = path.trim();\r\n path = path.startsWith('/') ? path.substring(1) : path\r\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\r\n if (path) path = `/${path}`\r\n return new URL(`${base}/${secret.hash}${path}`);\r\n }\r\n\r\n protected async getHeaders(path: string, init?: HttpRequestInit) {\r\n const url = await this.url(path)\r\n const secret = await this.getSecret()\r\n let headers: any = {};\r\n if (this.handshakeInfo) {\r\n headers[\"X-SIGNETURE\"] = await crypto.encrypt({\r\n signeture: this.handshakeInfo?.signeture,\r\n expire: Date.now() + this.handshakeInfo!.timeDiffarenc + 10000 // 10 seconds\r\n }, secret.secret) || '';\r\n }\r\n return {\r\n ...this.config?.defaultOptions?.headers,\r\n ...init?.headers,\r\n ...headers,\r\n 'Content-Type': 'application/octet-stream',\r\n \"X-ORIGIN\": url.origin\r\n }\r\n }\r\n\r\n protected async awaitForHandshake() {\r\n if (this.loadingHandshake) {\r\n await new Promise((resolve) => {\r\n const interval = setInterval(() => {\r\n if (!this.loadingHandshake) {\r\n clearInterval(interval);\r\n resolve(null);\r\n }\r\n }, 100);\r\n })\r\n }\r\n if (!this.handshakeInfo) {\r\n await this.handshake();\r\n }\r\n }\r\n\r\n async handshake() {\r\n await this.hooksCall('beforeHandshake');\r\n this.handshakeInfo = null;\r\n this.loadingHandshake = true;\r\n\r\n let max = this.config.secret.length\r\n let min = Math.floor(max / 4) * 3\r\n this.secret_length = Math.floor(Math.random() * (max - min + 1)) + min\r\n\r\n const secret = await this.getSecret()\r\n const res = await this.fetch('/', {\r\n method: 'POST',\r\n body: {\r\n hash: secret.hash,\r\n clientTime: new Date().toISOString(),\r\n secret: secret.secret,\r\n }\r\n })\r\n this.handshakeInfo = res.data\r\n this.loadingHandshake = false;\r\n await this.hooksCall('afterHandshake', this.handshakeInfo);\r\n }\r\n\r\n protected async fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\r\n const isDev = path !== '/' && this.handshakeInfo?.dev\r\n const secret = await this.getSecret()\r\n const url = await this.url(path)\r\n let sparams = Object.fromEntries(url.searchParams.entries())\r\n const _init = { ...init }\r\n let params: any = {\r\n ...sparams,\r\n }\r\n\r\n if (Object.keys(sparams).length > 0) {\r\n for (let key in sparams) {\r\n url.searchParams.delete(key)\r\n }\r\n }\r\n\r\n if (_init?.params) {\r\n for (let key in _init.params) {\r\n params[key] = _init.params[key]\r\n }\r\n delete _init.params\r\n }\r\n\r\n if (Object.keys(params).length > 0) {\r\n if (isDev) {\r\n _init.params = params\r\n } else {\r\n const enc = await crypto.encrypt(params, secret.secret)\r\n url.href = url.href + \"?\" + encodeURIComponent(enc)\r\n }\r\n }\r\n\r\n const httpOption: any = {\r\n method: \"GET\",\r\n ...this.config?.defaultOptions,\r\n ..._init,\r\n headers: await this.getHeaders(path, init)\r\n }\r\n\r\n if (httpOption?.body) {\r\n if (isDev) {\r\n httpOption.body = JSON.stringify(httpOption.body)\r\n } else {\r\n httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);\r\n }\r\n }\r\n const res = await xanFetch(url.href, httpOption)\r\n if (isDev) {\r\n const value = await res.text()\r\n const val = JSON.parse(value)\r\n return {\r\n success: res.ok,\r\n message: res.ok ? res.statusText : val,\r\n data: res.ok ? val : null,\r\n code: res.status\r\n }\r\n }\r\n const value = await res.arrayBuffer()\r\n const val = await crypto.decryptBuffer(new Uint8Array(value), secret.secret) as any\r\n return {\r\n success: res.ok,\r\n message: res.ok ? res.statusText : val,\r\n data: res.ok ? val : null,\r\n code: res.status\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Base;\r\n"],"names":["crypto","xanFetch","Clients","Map","Base","constructor","config","this","loadingHandshake","secret_length","handshakeInfo","Object","assign","url","URL","search","hash","Error","origin","pathname","has","hooksCall","hook","args","hooks","getSecret","full","secret","substring","path","base","trim","startsWith","endsWith","length","getHeaders","init","headers","encrypt","signeture","_a","expire","Date","now","timeDiffarenc","_c","_b","defaultOptions","awaitForHandshake","Promise","resolve","interval","setInterval","clearInterval","handshake","max","min","Math","floor","random","res","fetch","method","body","clientTime","toISOString","data","isDev","dev","sparams","fromEntries","searchParams","entries","_init","params","keys","key","delete","enc","href","encodeURIComponent","httpOption","JSON","stringify","encryptBuffer","value","text","val","parse","success","ok","message","statusText","code","status","arrayBuffer","decryptBuffer","Uint8Array"],"mappings":"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"}
package/client/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { HttpRequestInit, SecurequClientResponse } from './types.js';
2
2
  import Base from './Base.js';
3
3
 
4
- declare class SecurequClient extends Base {
5
- send(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse>;
6
- upload(file: File, onProgress?: (p: number) => void): Promise<SecurequClientResponse>;
7
- get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse>;
8
- post(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<SecurequClientResponse>;
9
- put(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<SecurequClientResponse>;
10
- delete(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<SecurequClientResponse>;
4
+ declare class SecurequClient extends Base {
5
+ send(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse>;
6
+ upload(file: File, onProgress?: (p: number) => void): Promise<SecurequClientResponse>;
7
+ get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse>;
8
+ post(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<SecurequClientResponse>;
9
+ put(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<SecurequClientResponse>;
10
+ delete(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<SecurequClientResponse>;
11
11
  }
12
12
 
13
13
  export { SecurequClient as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/client/index.ts"],"sourcesContent":["import { fileTypeFromBuffer } from 'file-type';\nimport { HttpRequestInit, SecurequClientResponse } from \"./types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/File\";\nimport Base from \"./Base\";\nimport fileScaner from '../include/FileScaner';\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.upload(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 upload(file: File, onProgress?: (p: number) => void): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n const fileId = await getFileId(file);\n const chunkSize = this.config.chunkSize\n const controller = new AbortController();\n let _file = await this.hooksCall('beforeUpload', file, fileId) || file;\n const maxFileSize = this.handshakeInfo?.maxFileSize\n if (maxFileSize && _file.size > maxFileSize * 1024) {\n throw new Error(`File size exceeds the limit of ${maxFileSize / 1024} MB`)\n }\n // send metadata\n const meta = {\n filename: file.name,\n filesize: file.size,\n filetype: file.type,\n fileid: fileId,\n totalChunks: totalChunks(file, chunkSize),\n }\n\n const abort = async () => {\n await this.fetch('/', {\n method: 'PUT',\n body: { ...meta, type: 'failed' },\n })\n controller.abort();\n window.removeEventListener(\"pagehide\", abort);\n }\n window.addEventListener(\"pagehide\", abort);\n\n const metares = await this.fetch('/', {\n method: 'PUT',\n body: { ...meta, type: 'meta' }\n })\n\n\n if (!metares.success) {\n if ([\"Signeture expired\", \"Request expired\"].includes(metares.message)) {\n await this.handshake();\n return await this.upload(file, onProgress);\n }\n await abort()\n return metares\n }\n\n\n for await (let { chunk, chunkIndex } of chunkFile(_file, chunkSize)) {\n\n if (this.handshakeInfo?.checkFileType && chunkIndex === 0) {\n let fileType = fileScaner(chunk);\n if (!fileType) {\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\n await this.hooksCall('beforeUploadChunk', chunk, chunkIndex, meta.totalChunks);\n const info: any = {\n method: 'PUT',\n signal: controller.signal,\n body: { chunk, chunkIndex, fileId },\n onProgress: (p: number) => {\n if (onProgress) {\n const totalProgress = Math.floor(((chunkIndex + 1) / meta.totalChunks) * 100)\n const currentProgress = Math.floor((p / 100) / meta.totalChunks * 100)\n onProgress(Math.min(totalProgress + currentProgress, 100))\n }\n }\n }\n\n let res = await this.fetch('/', info)\n\n if (!res.success) {\n if ([\"Signeture expired\", \"Request expired\"].includes(metares.message)) {\n await this.handshake();\n res = await this.fetch('/', info)\n } else {\n await abort()\n return res\n }\n }\n await this.hooksCall('afterUploadChunk', res, chunkIndex, meta.totalChunks);\n\n if (chunkIndex + 1 === meta.totalChunks) {\n const info = {\n success: true,\n message: 'File uploaded successfully',\n data: res.data,\n code: res.code\n }\n await this.hooksCall('afterUpload', info, _file);\n return info\n }\n }\n return {\n success: false,\n message: 'File upload failed',\n data: null,\n code: 0\n }\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":["SecurequClient","Base","send","path","init","this","awaitForHandshake","hooksCall","url","pathname","Error","key","body","File","upload","onProgress","res","fetch","includes","message","handshake","file","fileId","getFileId","chunkSize","config","controller","AbortController","_file","maxFileSize","_d","handshakeInfo","size","meta","filename","name","filesize","filetype","type","fileid","totalChunks","abort","async","method","window","removeEventListener","addEventListener","metares","success","_h","_f","_g","__asyncValues","chunkFile","_a","next","done","_c","value","chunk","chunkIndex","_e","checkFileType","fileScaner","data","code","info","signal","p","totalProgress","Math","floor","currentProgress","min","get","post","Object","assign","put","exports","default"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/client/index.ts"],"sourcesContent":["import { HttpRequestInit, SecurequClientResponse } from \"./types\";\r\nimport { chunkFile, getFileId, totalChunks } from \"../include/File\";\r\nimport Base from \"./Base\";\r\nimport fileScaner from '../include/FileScaner';\r\n\r\nclass SecurequClient extends Base {\r\n\r\n async send(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\r\n await this.awaitForHandshake();\r\n init = await this.hooksCall('beforeRequest', path, init) || init;\r\n const url = await this.url(path)\r\n if (url.pathname === '/') throw new Error(\"Path is not allowed\")\r\n\r\n for (let key in init?.body) {\r\n if (init?.body[key] instanceof File) {\r\n init.body[key] = await this.upload(init.body[key], init?.onProgress)\r\n }\r\n }\r\n\r\n const res = await this.fetch(path, init);\r\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\r\n await this.handshake();\r\n return await this.send(path, init);\r\n }\r\n await this.hooksCall('afterResponse', res);\r\n return res;\r\n }\r\n\r\n async upload(file: File, onProgress?: (p: number) => void): Promise<SecurequClientResponse> {\r\n await this.awaitForHandshake();\r\n const fileId = await getFileId(file);\r\n const chunkSize = this.config.chunkSize\r\n const controller = new AbortController();\r\n let _file = await this.hooksCall('beforeUpload', file, fileId) || file;\r\n const maxFileSize = this.handshakeInfo?.maxFileSize\r\n if (maxFileSize && _file.size > maxFileSize * 1024) {\r\n throw new Error(`File size exceeds the limit of ${maxFileSize / 1024} MB`)\r\n }\r\n // send metadata\r\n const meta = {\r\n filename: file.name,\r\n filesize: file.size,\r\n filetype: file.type,\r\n fileid: fileId,\r\n totalChunks: totalChunks(file, chunkSize),\r\n }\r\n\r\n const abort = async () => {\r\n await this.fetch('/', {\r\n method: 'PUT',\r\n body: { ...meta, type: 'failed' },\r\n })\r\n controller.abort();\r\n window.removeEventListener(\"pagehide\", abort);\r\n }\r\n window.addEventListener(\"pagehide\", abort);\r\n\r\n const metares = await this.fetch('/', {\r\n method: 'PUT',\r\n body: { ...meta, type: 'meta' }\r\n })\r\n\r\n\r\n if (!metares.success) {\r\n if ([\"Signeture expired\", \"Request expired\"].includes(metares.message)) {\r\n await this.handshake();\r\n return await this.upload(file, onProgress);\r\n }\r\n await abort()\r\n return metares\r\n }\r\n\r\n\r\n for await (let { chunk, chunkIndex } of chunkFile(_file, chunkSize)) {\r\n\r\n if (this.handshakeInfo?.checkFileType && chunkIndex === 0) {\r\n let fileType = fileScaner(chunk);\r\n if (!fileType) {\r\n await abort()\r\n return {\r\n success: false,\r\n message: \"Unknown or unsupported file type\",\r\n data: null,\r\n code: 0\r\n }\r\n }\r\n }\r\n\r\n await this.hooksCall('beforeUploadChunk', chunk, chunkIndex, meta.totalChunks);\r\n const info: any = {\r\n method: 'PUT',\r\n signal: controller.signal,\r\n body: { chunk, chunkIndex, fileId },\r\n onProgress: (p: number) => {\r\n if (onProgress) {\r\n const totalProgress = Math.floor(((chunkIndex + 1) / meta.totalChunks) * 100)\r\n const currentProgress = Math.floor((p / 100) / meta.totalChunks * 100)\r\n onProgress(Math.min(totalProgress + currentProgress, 100))\r\n }\r\n }\r\n }\r\n\r\n let res = await this.fetch('/', info)\r\n\r\n if (!res.success) {\r\n if ([\"Signeture expired\", \"Request expired\"].includes(metares.message)) {\r\n await this.handshake();\r\n res = await this.fetch('/', info)\r\n } else {\r\n await abort()\r\n return res\r\n }\r\n }\r\n await this.hooksCall('afterUploadChunk', res, chunkIndex, meta.totalChunks);\r\n\r\n if (chunkIndex + 1 === meta.totalChunks) {\r\n const info = {\r\n success: true,\r\n message: 'File uploaded successfully',\r\n data: res.data,\r\n code: res.code\r\n }\r\n await this.hooksCall('afterUpload', info, _file);\r\n return info\r\n }\r\n }\r\n return {\r\n success: false,\r\n message: 'File upload failed',\r\n data: null,\r\n code: 0\r\n }\r\n }\r\n\r\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\r\n return await this.send(path, init);\r\n }\r\n\r\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n return await this.send(path, { ...init, method: \"POST\" });\r\n }\r\n\r\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n return await this.send(path, { ...init, method: \"PUT\" });\r\n }\r\n\r\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n return await this.send(path, { ...init, method: \"DELETE\" });\r\n }\r\n\r\n}\r\n\r\nexport default SecurequClient;\r\n"],"names":["SecurequClient","Base","send","path","init","this","awaitForHandshake","hooksCall","url","pathname","Error","key","body","File","upload","onProgress","res","fetch","includes","message","handshake","file","fileId","getFileId","chunkSize","config","controller","AbortController","_file","maxFileSize","_d","handshakeInfo","size","meta","filename","name","filesize","filetype","type","fileid","totalChunks","abort","async","method","window","removeEventListener","addEventListener","metares","success","_h","_f","_g","__asyncValues","chunkFile","_a","next","done","_c","value","chunk","chunkIndex","_e","checkFileType","fileScaner","data","code","info","signal","p","totalProgress","Math","floor","currentProgress","min","get","post","Object","assign","put","exports","default"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/client/index.ts"],"sourcesContent":["import { fileTypeFromBuffer } from 'file-type';\nimport { HttpRequestInit, SecurequClientResponse } from \"./types\";\nimport { chunkFile, getFileId, totalChunks } from \"../include/File\";\nimport Base from \"./Base\";\nimport fileScaner from '../include/FileScaner';\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.upload(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 upload(file: File, onProgress?: (p: number) => void): Promise<SecurequClientResponse> {\n await this.awaitForHandshake();\n const fileId = await getFileId(file);\n const chunkSize = this.config.chunkSize\n const controller = new AbortController();\n let _file = await this.hooksCall('beforeUpload', file, fileId) || file;\n const maxFileSize = this.handshakeInfo?.maxFileSize\n if (maxFileSize && _file.size > maxFileSize * 1024) {\n throw new Error(`File size exceeds the limit of ${maxFileSize / 1024} MB`)\n }\n // send metadata\n const meta = {\n filename: file.name,\n filesize: file.size,\n filetype: file.type,\n fileid: fileId,\n totalChunks: totalChunks(file, chunkSize),\n }\n\n const abort = async () => {\n await this.fetch('/', {\n method: 'PUT',\n body: { ...meta, type: 'failed' },\n })\n controller.abort();\n window.removeEventListener(\"pagehide\", abort);\n }\n window.addEventListener(\"pagehide\", abort);\n\n const metares = await this.fetch('/', {\n method: 'PUT',\n body: { ...meta, type: 'meta' }\n })\n\n\n if (!metares.success) {\n if ([\"Signeture expired\", \"Request expired\"].includes(metares.message)) {\n await this.handshake();\n return await this.upload(file, onProgress);\n }\n await abort()\n return metares\n }\n\n\n for await (let { chunk, chunkIndex } of chunkFile(_file, chunkSize)) {\n\n if (this.handshakeInfo?.checkFileType && chunkIndex === 0) {\n let fileType = fileScaner(chunk);\n if (!fileType) {\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\n await this.hooksCall('beforeUploadChunk', chunk, chunkIndex, meta.totalChunks);\n const info: any = {\n method: 'PUT',\n signal: controller.signal,\n body: { chunk, chunkIndex, fileId },\n onProgress: (p: number) => {\n if (onProgress) {\n const totalProgress = Math.floor(((chunkIndex + 1) / meta.totalChunks) * 100)\n const currentProgress = Math.floor((p / 100) / meta.totalChunks * 100)\n onProgress(Math.min(totalProgress + currentProgress, 100))\n }\n }\n }\n\n let res = await this.fetch('/', info)\n\n if (!res.success) {\n if ([\"Signeture expired\", \"Request expired\"].includes(metares.message)) {\n await this.handshake();\n res = await this.fetch('/', info)\n } else {\n await abort()\n return res\n }\n }\n await this.hooksCall('afterUploadChunk', res, chunkIndex, meta.totalChunks);\n\n if (chunkIndex + 1 === meta.totalChunks) {\n const info = {\n success: true,\n message: 'File uploaded successfully',\n data: res.data,\n code: res.code\n }\n await this.hooksCall('afterUpload', info, _file);\n return info\n }\n }\n return {\n success: false,\n message: 'File upload failed',\n data: null,\n code: 0\n }\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":["SecurequClient","Base","send","path","init","this","awaitForHandshake","hooksCall","url","pathname","Error","key","body","File","upload","onProgress","res","fetch","includes","message","handshake","file","fileId","getFileId","chunkSize","config","controller","AbortController","_file","maxFileSize","_d","handshakeInfo","size","meta","filename","name","filesize","filetype","type","fileid","totalChunks","abort","async","method","window","removeEventListener","addEventListener","metares","success","_h","_f","_g","__asyncValues","chunkFile","_a","next","done","_c","value","chunk","chunkIndex","_e","checkFileType","fileScaner","data","code","info","signal","p","totalProgress","Math","floor","currentProgress","min","get","post","Object","assign","put"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/client/index.ts"],"sourcesContent":["import { HttpRequestInit, SecurequClientResponse } from \"./types\";\r\nimport { chunkFile, getFileId, totalChunks } from \"../include/File\";\r\nimport Base from \"./Base\";\r\nimport fileScaner from '../include/FileScaner';\r\n\r\nclass SecurequClient extends Base {\r\n\r\n async send(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse> {\r\n await this.awaitForHandshake();\r\n init = await this.hooksCall('beforeRequest', path, init) || init;\r\n const url = await this.url(path)\r\n if (url.pathname === '/') throw new Error(\"Path is not allowed\")\r\n\r\n for (let key in init?.body) {\r\n if (init?.body[key] instanceof File) {\r\n init.body[key] = await this.upload(init.body[key], init?.onProgress)\r\n }\r\n }\r\n\r\n const res = await this.fetch(path, init);\r\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\r\n await this.handshake();\r\n return await this.send(path, init);\r\n }\r\n await this.hooksCall('afterResponse', res);\r\n return res;\r\n }\r\n\r\n async upload(file: File, onProgress?: (p: number) => void): Promise<SecurequClientResponse> {\r\n await this.awaitForHandshake();\r\n const fileId = await getFileId(file);\r\n const chunkSize = this.config.chunkSize\r\n const controller = new AbortController();\r\n let _file = await this.hooksCall('beforeUpload', file, fileId) || file;\r\n const maxFileSize = this.handshakeInfo?.maxFileSize\r\n if (maxFileSize && _file.size > maxFileSize * 1024) {\r\n throw new Error(`File size exceeds the limit of ${maxFileSize / 1024} MB`)\r\n }\r\n // send metadata\r\n const meta = {\r\n filename: file.name,\r\n filesize: file.size,\r\n filetype: file.type,\r\n fileid: fileId,\r\n totalChunks: totalChunks(file, chunkSize),\r\n }\r\n\r\n const abort = async () => {\r\n await this.fetch('/', {\r\n method: 'PUT',\r\n body: { ...meta, type: 'failed' },\r\n })\r\n controller.abort();\r\n window.removeEventListener(\"pagehide\", abort);\r\n }\r\n window.addEventListener(\"pagehide\", abort);\r\n\r\n const metares = await this.fetch('/', {\r\n method: 'PUT',\r\n body: { ...meta, type: 'meta' }\r\n })\r\n\r\n\r\n if (!metares.success) {\r\n if ([\"Signeture expired\", \"Request expired\"].includes(metares.message)) {\r\n await this.handshake();\r\n return await this.upload(file, onProgress);\r\n }\r\n await abort()\r\n return metares\r\n }\r\n\r\n\r\n for await (let { chunk, chunkIndex } of chunkFile(_file, chunkSize)) {\r\n\r\n if (this.handshakeInfo?.checkFileType && chunkIndex === 0) {\r\n let fileType = fileScaner(chunk);\r\n if (!fileType) {\r\n await abort()\r\n return {\r\n success: false,\r\n message: \"Unknown or unsupported file type\",\r\n data: null,\r\n code: 0\r\n }\r\n }\r\n }\r\n\r\n await this.hooksCall('beforeUploadChunk', chunk, chunkIndex, meta.totalChunks);\r\n const info: any = {\r\n method: 'PUT',\r\n signal: controller.signal,\r\n body: { chunk, chunkIndex, fileId },\r\n onProgress: (p: number) => {\r\n if (onProgress) {\r\n const totalProgress = Math.floor(((chunkIndex + 1) / meta.totalChunks) * 100)\r\n const currentProgress = Math.floor((p / 100) / meta.totalChunks * 100)\r\n onProgress(Math.min(totalProgress + currentProgress, 100))\r\n }\r\n }\r\n }\r\n\r\n let res = await this.fetch('/', info)\r\n\r\n if (!res.success) {\r\n if ([\"Signeture expired\", \"Request expired\"].includes(metares.message)) {\r\n await this.handshake();\r\n res = await this.fetch('/', info)\r\n } else {\r\n await abort()\r\n return res\r\n }\r\n }\r\n await this.hooksCall('afterUploadChunk', res, chunkIndex, meta.totalChunks);\r\n\r\n if (chunkIndex + 1 === meta.totalChunks) {\r\n const info = {\r\n success: true,\r\n message: 'File uploaded successfully',\r\n data: res.data,\r\n code: res.code\r\n }\r\n await this.hooksCall('afterUpload', info, _file);\r\n return info\r\n }\r\n }\r\n return {\r\n success: false,\r\n message: 'File upload failed',\r\n data: null,\r\n code: 0\r\n }\r\n }\r\n\r\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\r\n return await this.send(path, init);\r\n }\r\n\r\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n return await this.send(path, { ...init, method: \"POST\" });\r\n }\r\n\r\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n return await this.send(path, { ...init, method: \"PUT\" });\r\n }\r\n\r\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n return await this.send(path, { ...init, method: \"DELETE\" });\r\n }\r\n\r\n}\r\n\r\nexport default SecurequClient;\r\n"],"names":["SecurequClient","Base","send","path","init","this","awaitForHandshake","hooksCall","url","pathname","Error","key","body","File","upload","onProgress","res","fetch","includes","message","handshake","file","fileId","getFileId","chunkSize","config","controller","AbortController","_file","maxFileSize","_d","handshakeInfo","size","meta","filename","name","filesize","filetype","type","fileid","totalChunks","abort","async","method","window","removeEventListener","addEventListener","metares","success","_h","_f","_g","__asyncValues","chunkFile","_a","next","done","_c","value","chunk","chunkIndex","_e","checkFileType","fileScaner","data","code","info","signal","p","totalProgress","Math","floor","currentProgress","min","get","post","Object","assign","put"],"mappings":"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"}
package/client/types.d.ts CHANGED
@@ -1,40 +1,40 @@
1
1
  import { XanFetchOptions } from 'xanfetch/types';
2
2
 
3
- type HandshakeInfo = {
4
- timeDiffarenc: number;
5
- signeture: string;
6
- maxFileSize: number | null;
7
- dev: boolean;
8
- checkFileType: boolean;
9
- };
10
- type Kilobyte = number;
11
- type SecurequClientConfig = {
12
- url: string;
13
- secret: string;
14
- defaultOptions?: XanFetchOptions;
15
- chunkSize?: Kilobyte;
16
- hooks?: {
17
- beforeHandshake?: () => Promise<void> | void;
18
- afterHandshake?: (info: HandshakeInfo) => Promise<void> | void;
19
- beforeRequest?: (url: string, init?: HttpRequestInit) => Promise<HttpRequestInit> | void;
20
- afterResponse?: (response: Response) => Promise<void> | void;
21
- beforeUpload?: (file: File, fileId: string) => Promise<File> | void;
22
- afterUpload?: (response: SecurequClientResponse, file: File) => Promise<void> | void;
23
- beforeUploadChunk?: (chunk: Blob, chunkIndex: number, totalChunks: number) => Promise<void> | void;
24
- afterUploadChunk?: (response: SecurequClientResponse, chunkIndex: number, totalChunks: number) => Promise<void> | void;
25
- };
26
- };
27
- type SecurequClientResponse = {
28
- success: boolean;
29
- message: string;
30
- data: any;
31
- code: number;
32
- };
33
- type RequestBody = {
34
- [key: string]: any;
35
- };
36
- type HttpRequestInit = Omit<XanFetchOptions, 'body'> & {
37
- body?: RequestBody;
3
+ type HandshakeInfo = {
4
+ timeDiffarenc: number;
5
+ signeture: string;
6
+ maxFileSize: number | null;
7
+ dev: boolean;
8
+ checkFileType: boolean;
9
+ };
10
+ type Kilobyte = number;
11
+ type SecurequClientConfig = {
12
+ url: string;
13
+ secret: string;
14
+ defaultOptions?: XanFetchOptions;
15
+ chunkSize?: Kilobyte;
16
+ hooks?: {
17
+ beforeHandshake?: () => Promise<void> | void;
18
+ afterHandshake?: (info: HandshakeInfo) => Promise<void> | void;
19
+ beforeRequest?: (url: string, init?: HttpRequestInit) => Promise<HttpRequestInit> | void;
20
+ afterResponse?: (response: Response) => Promise<void> | void;
21
+ beforeUpload?: (file: File, fileId: string) => Promise<File> | void;
22
+ afterUpload?: (response: SecurequClientResponse, file: File) => Promise<void> | void;
23
+ beforeUploadChunk?: (chunk: Blob, chunkIndex: number, totalChunks: number) => Promise<void> | void;
24
+ afterUploadChunk?: (response: SecurequClientResponse, chunkIndex: number, totalChunks: number) => Promise<void> | void;
25
+ };
26
+ };
27
+ type SecurequClientResponse = {
28
+ success: boolean;
29
+ message: string;
30
+ data: any;
31
+ code: number;
32
+ };
33
+ type HTTPMethods = "GET" | "POST" | "PUT" | "DELETE";
34
+ type HttpRequestInit = Omit<XanFetchOptions, 'body'> & {
35
+ body?: {
36
+ [key: string]: any;
37
+ };
38
38
  };
39
39
 
40
- export type { HandshakeInfo, HttpRequestInit, RequestBody, SecurequClientConfig, SecurequClientResponse };
40
+ export type { HTTPMethods, HandshakeInfo, HttpRequestInit, SecurequClientConfig, SecurequClientResponse };
@@ -1 +1 @@
1
- {"version":3,"file":"File.js","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\n\nfunction getChunkSize(fileSize: number): number {\n // fileSize in bytes\n if (fileSize <= 5 * 1024 * 1024) {\n // <= 5MB → 128KB\n return 128 * 1024;\n } else if (fileSize <= 50 * 1024 * 1024) {\n // 5–50MB → 256KB\n\n return 256 * 1024;\n } else if (fileSize <= 200 * 1024 * 1024) {\n // 50–200MB → 512KB\n return 512 * 1024;\n } else {\n // > 200MB → 1MB (max)\n return 1024 * 1024;\n }\n}\n\n\nexport const totalChunks = (file: File, chunkSize?: number) => Math.ceil(file.size / (chunkSize || getChunkSize(file.size)));\n\nexport async function* chunkFile(file: File, chunkSize?: number) {\n const fileSize = file.size;\n chunkSize = chunkSize || getChunkSize(fileSize);\n let offset = 0;\n\n while (offset < fileSize) {\n const chunk = file.slice(offset, offset + chunkSize);\n const buffer = new Uint8Array(await chunk.arrayBuffer());\n yield { chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) };\n offset += chunkSize;\n }\n}\n\n\nexport async function getFileId(file: File): Promise<string> {\n const data = [\n navigator.userAgent,\n navigator.language,\n screen.width,\n screen.height,\n screen.colorDepth,\n new Date().getTimezoneOffset(),\n Intl.DateTimeFormat().resolvedOptions().timeZone || \"\"\n ].join(\"||\");\n\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data}`\n return await crypto.hash(meta);\n}"],"names":["getChunkSize","fileSize","exports","chunkFile","file","chunkSize","size","offset","chunk","slice","buffer","Uint8Array","__await","arrayBuffer","chunkIndex","Math","floor","getFileId","async","data","navigator","userAgent","language","screen","width","height","colorDepth","Date","getTimezoneOffset","Intl","DateTimeFormat","resolvedOptions","timeZone","join","meta","name","lastModified","crypto","hash","totalChunks","ceil"],"mappings":"oHAEA,SAASA,EAAaC,GAEnB,OAAIA,GAAY,QAEN,OACCA,GAAY,SAGb,OACCA,GAAY,UAEb,OAGA,OAEb,CAgCAC,QAAAC,UA3BM,SAA2BC,EAAYC,wDAC1C,MAAMJ,EAAWG,EAAKE,KACtBD,EAAYA,GAAaL,EAAaC,GACtC,IAAIM,EAAS,EAEb,KAAOA,EAASN,GAAU,CACvB,MAAMO,EAAQJ,EAAKK,MAAMF,EAAQA,EAASF,GACpCK,EAAS,IAAIC,iBAAWC,EAAAA,QAAMJ,EAAMK,4BAC1CD,EAAAA,QAAM,CAAEJ,MAAOE,EAAQI,WAAYC,KAAKC,MAAMT,EAASF,KACvDE,GAAUF,CACZ,CACJ,EAAC,EAgBDH,QAAAe,UAbOC,eAAyBd,GAC7B,MAAMe,EAAO,CACVC,UAAUC,UACVD,UAAUE,SACVC,OAAOC,MACPD,OAAOE,OACPF,OAAOG,YACP,IAAIC,MAAOC,oBACXC,KAAKC,iBAAiBC,kBAAkBC,UAAY,IACrDC,KAAK,MAEDC,EAAO,GAAG9B,EAAK+B,SAAS/B,EAAKE,SAASF,EAAKgC,iBAAiBjB,IAClE,aAAakB,EAAAA,QAAOC,KAAKJ,EAC5B,EAAAhC,QAAAqC,YA7B2B,CAACnC,EAAYC,IAAuBU,KAAKyB,KAAKpC,EAAKE,MAAQD,GAAaL,EAAaI,EAAKE"}
1
+ {"version":3,"file":"File.js","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\r\n\r\nfunction getChunkSize(fileSize: number): number {\r\n // fileSize in bytes\r\n if (fileSize <= 5 * 1024 * 1024) {\r\n // <= 5MB → 128KB\r\n return 128 * 1024;\r\n } else if (fileSize <= 50 * 1024 * 1024) {\r\n // 5–50MB → 256KB\r\n\r\n return 256 * 1024;\r\n } else if (fileSize <= 200 * 1024 * 1024) {\r\n // 50–200MB → 512KB\r\n return 512 * 1024;\r\n } else {\r\n // > 200MB → 1MB (max)\r\n return 1024 * 1024;\r\n }\r\n}\r\n\r\n\r\nexport const totalChunks = (file: File, chunkSize?: number) => Math.ceil(file.size / (chunkSize || getChunkSize(file.size)));\r\n\r\nexport async function* chunkFile(file: File, chunkSize?: number) {\r\n const fileSize = file.size;\r\n chunkSize = chunkSize || getChunkSize(fileSize);\r\n let offset = 0;\r\n\r\n while (offset < fileSize) {\r\n const chunk = file.slice(offset, offset + chunkSize);\r\n const buffer = new Uint8Array(await chunk.arrayBuffer());\r\n yield { chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) };\r\n offset += chunkSize;\r\n }\r\n}\r\n\r\n\r\nexport async function getFileId(file: File): Promise<string> {\r\n const data = [\r\n navigator.userAgent,\r\n navigator.language,\r\n screen.width,\r\n screen.height,\r\n screen.colorDepth,\r\n new Date().getTimezoneOffset(),\r\n Intl.DateTimeFormat().resolvedOptions().timeZone || \"\"\r\n ].join(\"||\");\r\n\r\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data}`\r\n return await crypto.hash(meta);\r\n}"],"names":["getChunkSize","fileSize","exports","chunkFile","file","chunkSize","size","offset","chunk","slice","buffer","Uint8Array","__await","arrayBuffer","chunkIndex","Math","floor","getFileId","async","data","navigator","userAgent","language","screen","width","height","colorDepth","Date","getTimezoneOffset","Intl","DateTimeFormat","resolvedOptions","timeZone","join","meta","name","lastModified","crypto","hash","totalChunks","ceil"],"mappings":"oHAEA,SAASA,EAAaC,GAEnB,OAAIA,GAAY,QAEN,OACCA,GAAY,SAGb,OACCA,GAAY,UAEb,OAGA,OAEb,CAgCAC,QAAAC,UA3BM,SAA2BC,EAAYC,wDAC1C,MAAMJ,EAAWG,EAAKE,KACtBD,EAAYA,GAAaL,EAAaC,GACtC,IAAIM,EAAS,EAEb,KAAOA,EAASN,GAAU,CACvB,MAAMO,EAAQJ,EAAKK,MAAMF,EAAQA,EAASF,GACpCK,EAAS,IAAIC,iBAAWC,EAAAA,QAAMJ,EAAMK,4BAC1CD,EAAAA,QAAM,CAAEJ,MAAOE,EAAQI,WAAYC,KAAKC,MAAMT,EAASF,KACvDE,GAAUF,CACZ,CACJ,EAAC,EAgBDH,QAAAe,UAbOC,eAAyBd,GAC7B,MAAMe,EAAO,CACVC,UAAUC,UACVD,UAAUE,SACVC,OAAOC,MACPD,OAAOE,OACPF,OAAOG,YACP,IAAIC,MAAOC,oBACXC,KAAKC,iBAAiBC,kBAAkBC,UAAY,IACrDC,KAAK,MAEDC,EAAO,GAAG9B,EAAK+B,SAAS/B,EAAKE,SAASF,EAAKgC,iBAAiBjB,IAClE,aAAakB,EAAAA,QAAOC,KAAKJ,EAC5B,EAAAhC,QAAAqC,YA7B2B,CAACnC,EAAYC,IAAuBU,KAAKyB,KAAKpC,EAAKE,MAAQD,GAAaL,EAAaI,EAAKE"}
@@ -1 +1 @@
1
- {"version":3,"file":"File.mjs","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\n\nfunction getChunkSize(fileSize: number): number {\n // fileSize in bytes\n if (fileSize <= 5 * 1024 * 1024) {\n // <= 5MB → 128KB\n return 128 * 1024;\n } else if (fileSize <= 50 * 1024 * 1024) {\n // 5–50MB → 256KB\n\n return 256 * 1024;\n } else if (fileSize <= 200 * 1024 * 1024) {\n // 50–200MB → 512KB\n return 512 * 1024;\n } else {\n // > 200MB → 1MB (max)\n return 1024 * 1024;\n }\n}\n\n\nexport const totalChunks = (file: File, chunkSize?: number) => Math.ceil(file.size / (chunkSize || getChunkSize(file.size)));\n\nexport async function* chunkFile(file: File, chunkSize?: number) {\n const fileSize = file.size;\n chunkSize = chunkSize || getChunkSize(fileSize);\n let offset = 0;\n\n while (offset < fileSize) {\n const chunk = file.slice(offset, offset + chunkSize);\n const buffer = new Uint8Array(await chunk.arrayBuffer());\n yield { chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) };\n offset += chunkSize;\n }\n}\n\n\nexport async function getFileId(file: File): Promise<string> {\n const data = [\n navigator.userAgent,\n navigator.language,\n screen.width,\n screen.height,\n screen.colorDepth,\n new Date().getTimezoneOffset(),\n Intl.DateTimeFormat().resolvedOptions().timeZone || \"\"\n ].join(\"||\");\n\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data}`\n return await crypto.hash(meta);\n}"],"names":["getChunkSize","fileSize","totalChunks","file","chunkSize","Math","ceil","size","chunkFile","offset","chunk","slice","buffer","Uint8Array","__await","arrayBuffer","chunkIndex","floor","async","getFileId","data","navigator","userAgent","language","screen","width","height","colorDepth","Date","getTimezoneOffset","Intl","DateTimeFormat","resolvedOptions","timeZone","join","meta","name","lastModified","crypto","hash"],"mappings":"kFAEA,SAASA,EAAaC,GAEnB,OAAIA,GAAY,QAEN,OACCA,GAAY,SAGb,OACCA,GAAY,UAEb,OAGA,OAEb,CAGO,MAAMC,EAAc,CAACC,EAAYC,IAAuBC,KAAKC,KAAKH,EAAKI,MAAQH,GAAaJ,EAAaG,EAAKI,QAE/G,SAAiBC,EAAUL,EAAYC,uCAC1C,MAAMH,EAAWE,EAAKI,KACtBH,EAAYA,GAAaJ,EAAaC,GACtC,IAAIQ,EAAS,EAEb,KAAOA,EAASR,GAAU,CACvB,MAAMS,EAAQP,EAAKQ,MAAMF,EAAQA,EAASL,GACpCQ,EAAS,IAAIC,iBAAWC,EAAMJ,EAAMK,4BAC1CD,EAAM,CAAEJ,MAAOE,EAAQI,WAAYX,KAAKY,MAAMR,EAASL,KACvDK,GAAUL,CACZ,CACJ,EAAC,CAGMc,eAAeC,EAAUhB,GAC7B,MAAMiB,EAAO,CACVC,UAAUC,UACVD,UAAUE,SACVC,OAAOC,MACPD,OAAOE,OACPF,OAAOG,YACP,IAAIC,MAAOC,oBACXC,KAAKC,iBAAiBC,kBAAkBC,UAAY,IACrDC,KAAK,MAEDC,EAAO,GAAGhC,EAAKiC,SAASjC,EAAKI,SAASJ,EAAKkC,iBAAiBjB,IAClE,aAAakB,EAAOC,KAAKJ,EAC5B,QAAA3B,eAAAW,eAAAjB"}
1
+ {"version":3,"file":"File.mjs","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\r\n\r\nfunction getChunkSize(fileSize: number): number {\r\n // fileSize in bytes\r\n if (fileSize <= 5 * 1024 * 1024) {\r\n // <= 5MB → 128KB\r\n return 128 * 1024;\r\n } else if (fileSize <= 50 * 1024 * 1024) {\r\n // 5–50MB → 256KB\r\n\r\n return 256 * 1024;\r\n } else if (fileSize <= 200 * 1024 * 1024) {\r\n // 50–200MB → 512KB\r\n return 512 * 1024;\r\n } else {\r\n // > 200MB → 1MB (max)\r\n return 1024 * 1024;\r\n }\r\n}\r\n\r\n\r\nexport const totalChunks = (file: File, chunkSize?: number) => Math.ceil(file.size / (chunkSize || getChunkSize(file.size)));\r\n\r\nexport async function* chunkFile(file: File, chunkSize?: number) {\r\n const fileSize = file.size;\r\n chunkSize = chunkSize || getChunkSize(fileSize);\r\n let offset = 0;\r\n\r\n while (offset < fileSize) {\r\n const chunk = file.slice(offset, offset + chunkSize);\r\n const buffer = new Uint8Array(await chunk.arrayBuffer());\r\n yield { chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) };\r\n offset += chunkSize;\r\n }\r\n}\r\n\r\n\r\nexport async function getFileId(file: File): Promise<string> {\r\n const data = [\r\n navigator.userAgent,\r\n navigator.language,\r\n screen.width,\r\n screen.height,\r\n screen.colorDepth,\r\n new Date().getTimezoneOffset(),\r\n Intl.DateTimeFormat().resolvedOptions().timeZone || \"\"\r\n ].join(\"||\");\r\n\r\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data}`\r\n return await crypto.hash(meta);\r\n}"],"names":["getChunkSize","fileSize","totalChunks","file","chunkSize","Math","ceil","size","chunkFile","offset","chunk","slice","buffer","Uint8Array","__await","arrayBuffer","chunkIndex","floor","async","getFileId","data","navigator","userAgent","language","screen","width","height","colorDepth","Date","getTimezoneOffset","Intl","DateTimeFormat","resolvedOptions","timeZone","join","meta","name","lastModified","crypto","hash"],"mappings":"kFAEA,SAASA,EAAaC,GAEnB,OAAIA,GAAY,QAEN,OACCA,GAAY,SAGb,OACCA,GAAY,UAEb,OAGA,OAEb,CAGO,MAAMC,EAAc,CAACC,EAAYC,IAAuBC,KAAKC,KAAKH,EAAKI,MAAQH,GAAaJ,EAAaG,EAAKI,QAE/G,SAAiBC,EAAUL,EAAYC,uCAC1C,MAAMH,EAAWE,EAAKI,KACtBH,EAAYA,GAAaJ,EAAaC,GACtC,IAAIQ,EAAS,EAEb,KAAOA,EAASR,GAAU,CACvB,MAAMS,EAAQP,EAAKQ,MAAMF,EAAQA,EAASL,GACpCQ,EAAS,IAAIC,iBAAWC,EAAMJ,EAAMK,4BAC1CD,EAAM,CAAEJ,MAAOE,EAAQI,WAAYX,KAAKY,MAAMR,EAASL,KACvDK,GAAUL,CACZ,CACJ,EAAC,CAGMc,eAAeC,EAAUhB,GAC7B,MAAMiB,EAAO,CACVC,UAAUC,UACVD,UAAUE,SACVC,OAAOC,MACPD,OAAOE,OACPF,OAAOG,YACP,IAAIC,MAAOC,oBACXC,KAAKC,iBAAiBC,kBAAkBC,UAAY,IACrDC,KAAK,MAEDC,EAAO,GAAGhC,EAAKiC,SAASjC,EAAKI,SAASJ,EAAKkC,iBAAiBjB,IAClE,aAAakB,EAAOC,KAAKJ,EAC5B,QAAA3B,eAAAW,eAAAjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileScaner.js","sources":["../../src/include/FileScaner.ts"],"sourcesContent":["export type FileScanerResult = {\n valid: boolean;\n ext?: string;\n mime?: string;\n};\n\n/**\n * Mega raw file-type detection from first chunk (magic bytes)\n * Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.\n */\nexport function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult | void {\n if (!chunk || chunk.length < 4) return { valid: false };\n const match = (pattern: number[]) => pattern.every((b, i) => chunk[i] === b);\n\n // --- Images ---\n if (chunk.length >= 8) {\n if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) return { valid: true, ext: \"png\", mime: \"image/png\" };\n if (match([0x47, 0x49, 0x46, 0x38])) return { valid: true, ext: \"gif\", mime: \"image/gif\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WEBP\") return { valid: true, ext: \"webp\", mime: \"image/webp\" };\n }\n if (match([0xFF, 0xD8, 0xFF])) return { valid: true, ext: \"jpg\", mime: \"image/jpeg\" };\n if (match([0x42, 0x4D])) return { valid: true, ext: \"bmp\", mime: \"image/bmp\" };\n if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A])) return { valid: true, ext: \"tif\", mime: \"image/tiff\" };\n if (match([0x00, 0x00, 0x01, 0x00])) return { valid: true, ext: \"ico\", mime: \"image/x-icon\" };\n if (match([0x00, 0x00, 0x02, 0x00])) return { valid: true, ext: \"cur\", mime: \"image/x-icon\" };\n\n // --- Audio ---\n if (match([0x49, 0x44, 0x33])) return { valid: true, ext: \"mp3\", mime: \"audio/mpeg\" };\n if (match([0x66, 0x4C, 0x61, 0x43])) return { valid: true, ext: \"flac\", mime: \"audio/flac\" };\n if (match([0x4F, 0x67, 0x67, 0x53])) return { valid: true, ext: \"ogg\", mime: \"audio/ogg\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WAVE\") return { valid: true, ext: \"wav\", mime: \"audio/wav\" };\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mp4a\", mime: \"audio/mp4\" };\n\n // --- Video ---\n if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === \"ftyp\") return { valid: true, ext: \"mp4\", mime: \"video/mp4\" };\n if (match([0x1A, 0x45, 0xDF, 0xA3])) return { valid: true, ext: \"mkv\", mime: \"video/x-matroska\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"AVI \") return { valid: true, ext: \"avi\", mime: \"video/x-msvideo\" };\n if (match([0x00, 0x00, 0x01, 0xBA])) return { valid: true, ext: \"mpeg\", mime: \"video/mpeg\" };\n if (match([0x47, 0x40, 0x00, 0x10])) return { valid: true, ext: \"ts\", mime: \"video/MP2T\" };\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mov\", mime: \"video/quicktime\" };\n\n // --- Archives ---\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"zip\", mime: \"application/zip\" };\n if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00])) return { valid: true, ext: \"rar\", mime: \"application/x-rar-compressed\" };\n if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) return { valid: true, ext: \"7z\", mime: \"application/x-7z-compressed\" };\n if (match([0x1F, 0x8B])) return { valid: true, ext: \"gz\", mime: \"application/gzip\" };\n if (match([0x42, 0x5A, 0x68])) return { valid: true, ext: \"bz2\", mime: \"application/x-bzip2\" };\n\n // --- Documents ---\n if (match([0x25, 0x50, 0x44, 0x46])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" };\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) return { valid: true, ext: \"msi\", mime: \"application/vnd.ms-installer\" };\n if (match([0x4D, 0x5A])) return { valid: true, ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" };\n if (match([0x09, 0x08, 0x10, 0x00])) return { valid: true, ext: \"doc\", mime: \"application/msword\" };\n if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05])) return { valid: true, ext: \"xls\", mime: \"application/vnd.ms-excel\" };\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1])) return { valid: true, ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" };\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" };\n\n // --- Fonts ---\n if (match([0x00, 0x01, 0x00, 0x00])) return { valid: true, ext: \"ttf\", mime: \"font/ttf\" };\n if (match([0x4F, 0x54, 0x54, 0x4F])) return { valid: true, ext: \"otf\", mime: \"font/otf\" };\n\n // --- Scripts / Binary ---\n if (match([0x23, 0x21])) return { valid: true, ext: \"sh\", mime: \"application/x-sh\" }; // shell script\n if (match([0x7F, 0x45, 0x4C, 0x46])) return { valid: true, ext: \"elf\", mime: \"application/x-elf\" }; // Linux executable\n\n // --- Others / fallback ---\n if (match([0x46, 0x4C, 0x56])) return { valid: true, ext: \"flv\", mime: \"video/x-flv\" };\n if (match([0x50, 0x4E, 0x44, 0x52])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" }; // alternate PDF\n if (match([0x42, 0x50, 0x47, 0x0D])) return { valid: true, ext: \"bpg\", mime: \"image/bpg\" }; // BPG\n\n}\n\nexport default fileScaner;"],"names":["fileScaner","chunk","length","valid","match","pattern","every","b","i","ext","mime","slice","toString","Object","defineProperty","exports","value","default"],"mappings":"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"}
1
+ {"version":3,"file":"FileScaner.js","sources":["../../src/include/FileScaner.ts"],"sourcesContent":["export type FileScanerResult = {\r\n valid: boolean;\r\n ext?: string;\r\n mime?: string;\r\n};\r\n\r\n/**\r\n * Mega raw file-type detection from first chunk (magic bytes)\r\n * Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.\r\n */\r\nexport function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult | void {\r\n if (!chunk || chunk.length < 4) return { valid: false };\r\n const match = (pattern: number[]) => pattern.every((b, i) => chunk[i] === b);\r\n\r\n // --- Images ---\r\n if (chunk.length >= 8) {\r\n if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) return { valid: true, ext: \"png\", mime: \"image/png\" };\r\n if (match([0x47, 0x49, 0x46, 0x38])) return { valid: true, ext: \"gif\", mime: \"image/gif\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WEBP\") return { valid: true, ext: \"webp\", mime: \"image/webp\" };\r\n }\r\n if (match([0xFF, 0xD8, 0xFF])) return { valid: true, ext: \"jpg\", mime: \"image/jpeg\" };\r\n if (match([0x42, 0x4D])) return { valid: true, ext: \"bmp\", mime: \"image/bmp\" };\r\n if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A])) return { valid: true, ext: \"tif\", mime: \"image/tiff\" };\r\n if (match([0x00, 0x00, 0x01, 0x00])) return { valid: true, ext: \"ico\", mime: \"image/x-icon\" };\r\n if (match([0x00, 0x00, 0x02, 0x00])) return { valid: true, ext: \"cur\", mime: \"image/x-icon\" };\r\n\r\n // --- Audio ---\r\n if (match([0x49, 0x44, 0x33])) return { valid: true, ext: \"mp3\", mime: \"audio/mpeg\" };\r\n if (match([0x66, 0x4C, 0x61, 0x43])) return { valid: true, ext: \"flac\", mime: \"audio/flac\" };\r\n if (match([0x4F, 0x67, 0x67, 0x53])) return { valid: true, ext: \"ogg\", mime: \"audio/ogg\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WAVE\") return { valid: true, ext: \"wav\", mime: \"audio/wav\" };\r\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mp4a\", mime: \"audio/mp4\" };\r\n\r\n // --- Video ---\r\n if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === \"ftyp\") return { valid: true, ext: \"mp4\", mime: \"video/mp4\" };\r\n if (match([0x1A, 0x45, 0xDF, 0xA3])) return { valid: true, ext: \"mkv\", mime: \"video/x-matroska\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"AVI \") return { valid: true, ext: \"avi\", mime: \"video/x-msvideo\" };\r\n if (match([0x00, 0x00, 0x01, 0xBA])) return { valid: true, ext: \"mpeg\", mime: \"video/mpeg\" };\r\n if (match([0x47, 0x40, 0x00, 0x10])) return { valid: true, ext: \"ts\", mime: \"video/MP2T\" };\r\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mov\", mime: \"video/quicktime\" };\r\n\r\n // --- Archives ---\r\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"zip\", mime: \"application/zip\" };\r\n if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00])) return { valid: true, ext: \"rar\", mime: \"application/x-rar-compressed\" };\r\n if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) return { valid: true, ext: \"7z\", mime: \"application/x-7z-compressed\" };\r\n if (match([0x1F, 0x8B])) return { valid: true, ext: \"gz\", mime: \"application/gzip\" };\r\n if (match([0x42, 0x5A, 0x68])) return { valid: true, ext: \"bz2\", mime: \"application/x-bzip2\" };\r\n\r\n // --- Documents ---\r\n if (match([0x25, 0x50, 0x44, 0x46])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" };\r\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) return { valid: true, ext: \"msi\", mime: \"application/vnd.ms-installer\" };\r\n if (match([0x4D, 0x5A])) return { valid: true, ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" };\r\n if (match([0x09, 0x08, 0x10, 0x00])) return { valid: true, ext: \"doc\", mime: \"application/msword\" };\r\n if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05])) return { valid: true, ext: \"xls\", mime: \"application/vnd.ms-excel\" };\r\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1])) return { valid: true, ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" };\r\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" };\r\n\r\n // --- Fonts ---\r\n if (match([0x00, 0x01, 0x00, 0x00])) return { valid: true, ext: \"ttf\", mime: \"font/ttf\" };\r\n if (match([0x4F, 0x54, 0x54, 0x4F])) return { valid: true, ext: \"otf\", mime: \"font/otf\" };\r\n\r\n // --- Scripts / Binary ---\r\n if (match([0x23, 0x21])) return { valid: true, ext: \"sh\", mime: \"application/x-sh\" }; // shell script\r\n if (match([0x7F, 0x45, 0x4C, 0x46])) return { valid: true, ext: \"elf\", mime: \"application/x-elf\" }; // Linux executable\r\n\r\n // --- Others / fallback ---\r\n if (match([0x46, 0x4C, 0x56])) return { valid: true, ext: \"flv\", mime: \"video/x-flv\" };\r\n if (match([0x50, 0x4E, 0x44, 0x52])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" }; // alternate PDF\r\n if (match([0x42, 0x50, 0x47, 0x0D])) return { valid: true, ext: \"bpg\", mime: \"image/bpg\" }; // BPG\r\n\r\n}\r\n\r\nexport default fileScaner;"],"names":["fileScaner","chunk","length","valid","match","pattern","every","b","i","ext","mime","slice","toString","Object","defineProperty","exports","value","default"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileScaner.mjs","sources":["../../src/include/FileScaner.ts"],"sourcesContent":["export type FileScanerResult = {\n valid: boolean;\n ext?: string;\n mime?: string;\n};\n\n/**\n * Mega raw file-type detection from first chunk (magic bytes)\n * Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.\n */\nexport function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult | void {\n if (!chunk || chunk.length < 4) return { valid: false };\n const match = (pattern: number[]) => pattern.every((b, i) => chunk[i] === b);\n\n // --- Images ---\n if (chunk.length >= 8) {\n if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) return { valid: true, ext: \"png\", mime: \"image/png\" };\n if (match([0x47, 0x49, 0x46, 0x38])) return { valid: true, ext: \"gif\", mime: \"image/gif\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WEBP\") return { valid: true, ext: \"webp\", mime: \"image/webp\" };\n }\n if (match([0xFF, 0xD8, 0xFF])) return { valid: true, ext: \"jpg\", mime: \"image/jpeg\" };\n if (match([0x42, 0x4D])) return { valid: true, ext: \"bmp\", mime: \"image/bmp\" };\n if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A])) return { valid: true, ext: \"tif\", mime: \"image/tiff\" };\n if (match([0x00, 0x00, 0x01, 0x00])) return { valid: true, ext: \"ico\", mime: \"image/x-icon\" };\n if (match([0x00, 0x00, 0x02, 0x00])) return { valid: true, ext: \"cur\", mime: \"image/x-icon\" };\n\n // --- Audio ---\n if (match([0x49, 0x44, 0x33])) return { valid: true, ext: \"mp3\", mime: \"audio/mpeg\" };\n if (match([0x66, 0x4C, 0x61, 0x43])) return { valid: true, ext: \"flac\", mime: \"audio/flac\" };\n if (match([0x4F, 0x67, 0x67, 0x53])) return { valid: true, ext: \"ogg\", mime: \"audio/ogg\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WAVE\") return { valid: true, ext: \"wav\", mime: \"audio/wav\" };\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mp4a\", mime: \"audio/mp4\" };\n\n // --- Video ---\n if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === \"ftyp\") return { valid: true, ext: \"mp4\", mime: \"video/mp4\" };\n if (match([0x1A, 0x45, 0xDF, 0xA3])) return { valid: true, ext: \"mkv\", mime: \"video/x-matroska\" };\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"AVI \") return { valid: true, ext: \"avi\", mime: \"video/x-msvideo\" };\n if (match([0x00, 0x00, 0x01, 0xBA])) return { valid: true, ext: \"mpeg\", mime: \"video/mpeg\" };\n if (match([0x47, 0x40, 0x00, 0x10])) return { valid: true, ext: \"ts\", mime: \"video/MP2T\" };\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mov\", mime: \"video/quicktime\" };\n\n // --- Archives ---\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"zip\", mime: \"application/zip\" };\n if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00])) return { valid: true, ext: \"rar\", mime: \"application/x-rar-compressed\" };\n if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) return { valid: true, ext: \"7z\", mime: \"application/x-7z-compressed\" };\n if (match([0x1F, 0x8B])) return { valid: true, ext: \"gz\", mime: \"application/gzip\" };\n if (match([0x42, 0x5A, 0x68])) return { valid: true, ext: \"bz2\", mime: \"application/x-bzip2\" };\n\n // --- Documents ---\n if (match([0x25, 0x50, 0x44, 0x46])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" };\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) return { valid: true, ext: \"msi\", mime: \"application/vnd.ms-installer\" };\n if (match([0x4D, 0x5A])) return { valid: true, ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" };\n if (match([0x09, 0x08, 0x10, 0x00])) return { valid: true, ext: \"doc\", mime: \"application/msword\" };\n if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05])) return { valid: true, ext: \"xls\", mime: \"application/vnd.ms-excel\" };\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1])) return { valid: true, ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" };\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" };\n\n // --- Fonts ---\n if (match([0x00, 0x01, 0x00, 0x00])) return { valid: true, ext: \"ttf\", mime: \"font/ttf\" };\n if (match([0x4F, 0x54, 0x54, 0x4F])) return { valid: true, ext: \"otf\", mime: \"font/otf\" };\n\n // --- Scripts / Binary ---\n if (match([0x23, 0x21])) return { valid: true, ext: \"sh\", mime: \"application/x-sh\" }; // shell script\n if (match([0x7F, 0x45, 0x4C, 0x46])) return { valid: true, ext: \"elf\", mime: \"application/x-elf\" }; // Linux executable\n\n // --- Others / fallback ---\n if (match([0x46, 0x4C, 0x56])) return { valid: true, ext: \"flv\", mime: \"video/x-flv\" };\n if (match([0x50, 0x4E, 0x44, 0x52])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" }; // alternate PDF\n if (match([0x42, 0x50, 0x47, 0x0D])) return { valid: true, ext: \"bpg\", mime: \"image/bpg\" }; // BPG\n\n}\n\nexport default fileScaner;"],"names":["fileScaner","chunk","length","valid","match","pattern","every","b","i","ext","mime","slice","toString"],"mappings":"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"}
1
+ {"version":3,"file":"FileScaner.mjs","sources":["../../src/include/FileScaner.ts"],"sourcesContent":["export type FileScanerResult = {\r\n valid: boolean;\r\n ext?: string;\r\n mime?: string;\r\n};\r\n\r\n/**\r\n * Mega raw file-type detection from first chunk (magic bytes)\r\n * Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.\r\n */\r\nexport function fileScaner(chunk: Uint8Array | Buffer): FileScanerResult | void {\r\n if (!chunk || chunk.length < 4) return { valid: false };\r\n const match = (pattern: number[]) => pattern.every((b, i) => chunk[i] === b);\r\n\r\n // --- Images ---\r\n if (chunk.length >= 8) {\r\n if (match([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) return { valid: true, ext: \"png\", mime: \"image/png\" };\r\n if (match([0x47, 0x49, 0x46, 0x38])) return { valid: true, ext: \"gif\", mime: \"image/gif\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WEBP\") return { valid: true, ext: \"webp\", mime: \"image/webp\" };\r\n }\r\n if (match([0xFF, 0xD8, 0xFF])) return { valid: true, ext: \"jpg\", mime: \"image/jpeg\" };\r\n if (match([0x42, 0x4D])) return { valid: true, ext: \"bmp\", mime: \"image/bmp\" };\r\n if (match([0x49, 0x49, 0x2A, 0x00]) || match([0x4D, 0x4D, 0x00, 0x2A])) return { valid: true, ext: \"tif\", mime: \"image/tiff\" };\r\n if (match([0x00, 0x00, 0x01, 0x00])) return { valid: true, ext: \"ico\", mime: \"image/x-icon\" };\r\n if (match([0x00, 0x00, 0x02, 0x00])) return { valid: true, ext: \"cur\", mime: \"image/x-icon\" };\r\n\r\n // --- Audio ---\r\n if (match([0x49, 0x44, 0x33])) return { valid: true, ext: \"mp3\", mime: \"audio/mpeg\" };\r\n if (match([0x66, 0x4C, 0x61, 0x43])) return { valid: true, ext: \"flac\", mime: \"audio/flac\" };\r\n if (match([0x4F, 0x67, 0x67, 0x53])) return { valid: true, ext: \"ogg\", mime: \"audio/ogg\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"WAVE\") return { valid: true, ext: \"wav\", mime: \"audio/wav\" };\r\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mp4a\", mime: \"audio/mp4\" };\r\n\r\n // --- Video ---\r\n if (match([0x00, 0x00, 0x00, 0x18]) && chunk.slice(4, 8).toString() === \"ftyp\") return { valid: true, ext: \"mp4\", mime: \"video/mp4\" };\r\n if (match([0x1A, 0x45, 0xDF, 0xA3])) return { valid: true, ext: \"mkv\", mime: \"video/x-matroska\" };\r\n if (match([0x52, 0x49, 0x46, 0x46]) && chunk.slice(8, 12).toString() === \"AVI \") return { valid: true, ext: \"avi\", mime: \"video/x-msvideo\" };\r\n if (match([0x00, 0x00, 0x01, 0xBA])) return { valid: true, ext: \"mpeg\", mime: \"video/mpeg\" };\r\n if (match([0x47, 0x40, 0x00, 0x10])) return { valid: true, ext: \"ts\", mime: \"video/MP2T\" };\r\n if (match([0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32])) return { valid: true, ext: \"mov\", mime: \"video/quicktime\" };\r\n\r\n // --- Archives ---\r\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"zip\", mime: \"application/zip\" };\r\n if (match([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00])) return { valid: true, ext: \"rar\", mime: \"application/x-rar-compressed\" };\r\n if (match([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) return { valid: true, ext: \"7z\", mime: \"application/x-7z-compressed\" };\r\n if (match([0x1F, 0x8B])) return { valid: true, ext: \"gz\", mime: \"application/gzip\" };\r\n if (match([0x42, 0x5A, 0x68])) return { valid: true, ext: \"bz2\", mime: \"application/x-bzip2\" };\r\n\r\n // --- Documents ---\r\n if (match([0x25, 0x50, 0x44, 0x46])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" };\r\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) return { valid: true, ext: \"msi\", mime: \"application/vnd.ms-installer\" };\r\n if (match([0x4D, 0x5A])) return { valid: true, ext: \"exe\", mime: \"application/vnd.microsoft.portable-executable\" };\r\n if (match([0x09, 0x08, 0x10, 0x00])) return { valid: true, ext: \"doc\", mime: \"application/msword\" };\r\n if (match([0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05])) return { valid: true, ext: \"xls\", mime: \"application/vnd.ms-excel\" };\r\n if (match([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1])) return { valid: true, ext: \"ppt\", mime: \"application/vnd.ms-powerpoint\" };\r\n if (match([0x50, 0x4B, 0x03, 0x04])) return { valid: true, ext: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" };\r\n\r\n // --- Fonts ---\r\n if (match([0x00, 0x01, 0x00, 0x00])) return { valid: true, ext: \"ttf\", mime: \"font/ttf\" };\r\n if (match([0x4F, 0x54, 0x54, 0x4F])) return { valid: true, ext: \"otf\", mime: \"font/otf\" };\r\n\r\n // --- Scripts / Binary ---\r\n if (match([0x23, 0x21])) return { valid: true, ext: \"sh\", mime: \"application/x-sh\" }; // shell script\r\n if (match([0x7F, 0x45, 0x4C, 0x46])) return { valid: true, ext: \"elf\", mime: \"application/x-elf\" }; // Linux executable\r\n\r\n // --- Others / fallback ---\r\n if (match([0x46, 0x4C, 0x56])) return { valid: true, ext: \"flv\", mime: \"video/x-flv\" };\r\n if (match([0x50, 0x4E, 0x44, 0x52])) return { valid: true, ext: \"pdf\", mime: \"application/pdf\" }; // alternate PDF\r\n if (match([0x42, 0x50, 0x47, 0x0D])) return { valid: true, ext: \"bpg\", mime: \"image/bpg\" }; // BPG\r\n\r\n}\r\n\r\nexport default fileScaner;"],"names":["fileScaner","chunk","length","valid","match","pattern","every","b","i","ext","mime","slice","toString"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ declare function compressBuffer(input: any): Promise<Uint8Array>;
2
+ declare function decompressBuffer(input: Uint8Array | Buffer): Promise<any>;
3
+ declare function compress(input: any): Promise<string>;
4
+ declare function decompress(base64Str: string): Promise<any>;
5
+ declare const compresor: {
6
+ compress: typeof compress;
7
+ decompress: typeof decompress;
8
+ compressBuffer: typeof compressBuffer;
9
+ decompressBuffer: typeof decompressBuffer;
10
+ };
11
+
12
+ export { compresor as default };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("fflate"),r=require("libsodium-wrappers"),s=require("msgpackr");exports.compressBuffer=async function(c){await r.ready;const t=s.pack(c);return e.compressSync(t)},exports.decompressBuffer=async function(c){await r.ready;const t=e.decompressSync(c);return s.unpack(t)};//# sourceMappingURL=compress.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("fflate"),r=require("libsodium-wrappers"),s=require("msgpackr");async function a(a){await r.ready;const t=s.pack(a);return e.compressSync(t)}async function t(a){await r.ready;const t=e.decompressSync(a);return s.unpack(t)}const n={compress:async function(e){const s=await a(e);return r.to_base64(s,r.base64_variants.ORIGINAL)},decompress:async function(e){const s=r.from_base64(e,r.base64_variants.ORIGINAL);return await t(s)},compressBuffer:a,decompressBuffer:t};exports.default=n;//# sourceMappingURL=compress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compress.js","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\nimport sodium from 'libsodium-wrappers';\nimport { unpack, pack } from 'msgpackr';\n\nexport async function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nexport async function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nexport async function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nexport async function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n"],"names":["exports","compressBuffer","async","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack"],"mappings":"kJAcAA,QAAAC,eAVOC,eAA8BC,SAC5BC,EAAOC,MACb,MAAMC,EAASC,EAAAA,KAAKJ,GACpB,OAAOK,EAAAA,aAAaF,EACvB,EAMAN,QAAAS,iBAJOP,eAAgCC,SAC9BC,EAAOC,MACb,MAAMK,EAAWC,EAAAA,eAAeR,GAChC,OAAOS,EAAAA,OAAOF,EACjB"}
1
+ {"version":3,"file":"compress.js","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\r\nimport sodium from 'libsodium-wrappers';\r\nimport { unpack, pack } from 'msgpackr';\r\n\r\nasync function compressBuffer(input: any) {\r\n await sodium.ready\r\n const encode = pack(input);\r\n return compressSync(encode);\r\n}\r\n\r\nasync function decompressBuffer(input: Uint8Array | Buffer) {\r\n await sodium.ready\r\n const compress = decompressSync(input);\r\n return unpack(compress);\r\n}\r\n\r\nasync function compress(input: any) {\r\n const compressed = await compressBuffer(input);\r\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\r\n}\r\n\r\nasync function decompress(base64Str: string) {\r\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\r\n return await decompressBuffer(compressed);\r\n}\r\n\r\nconst compresor = { compress, decompress, compressBuffer, decompressBuffer };\r\nexport default compresor;"],"names":["async","compressBuffer","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack","compresor","compressed","to_base64","base64_variants","ORIGINAL","decompress","base64Str","from_base64","exports","default"],"mappings":"kJAIAA,eAAeC,EAAeC,SACrBC,EAAOC,MACb,MAAMC,EAASC,OAAKJ,GACpB,OAAOK,EAAAA,aAAaF,EACvB,CAEAL,eAAeQ,EAAiBN,SACvBC,EAAOC,MACb,MAAMK,EAAWC,iBAAeR,GAChC,OAAOS,EAAAA,OAAOF,EACjB,CAYA,MAAMG,EAAY,CAAEH,SAVpBT,eAAwBE,GACrB,MAAMW,QAAmBZ,EAAeC,GACxC,OAAOC,EAAOW,UAAUD,EAAYV,EAAOY,gBAAgBC,SAC9D,EAO8BC,WAL9BjB,eAA0BkB,GACvB,MAAML,EAAaV,EAAOgB,YAAYD,EAAWf,EAAOY,gBAAgBC,UACxE,aAAaR,EAAiBK,EACjC,EAE0CZ,iBAAgBO,oBAAgBY,QAAAC,QAAAT"}
@@ -1 +1 @@
1
- import{decompressSync as r,compressSync as t}from"fflate";import o from"libsodium-wrappers";import{unpack as a,pack as n}from"msgpackr";async function i(r){await o.ready;const a=n(r);return t(a)}async function m(t){await o.ready;const n=r(t);return a(n)}export{i as compressBuffer,m as decompressBuffer};//# sourceMappingURL=compress.mjs.map
1
+ import{compressSync as r,decompressSync as a}from"fflate";import s from"libsodium-wrappers";import{pack as t,unpack as n}from"msgpackr";async function o(a){await s.ready;const n=t(a);return r(n)}async function e(r){await s.ready;const t=a(r);return n(t)}const c={compress:async function(r){const a=await o(r);return s.to_base64(a,s.base64_variants.ORIGINAL)},decompress:async function(r){const a=s.from_base64(r,s.base64_variants.ORIGINAL);return await e(a)},compressBuffer:o,decompressBuffer:e};export{c as default};//# sourceMappingURL=compress.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"compress.mjs","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\nimport sodium from 'libsodium-wrappers';\nimport { unpack, pack } from 'msgpackr';\n\nexport async function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nexport async function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nexport async function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nexport async function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n"],"names":["async","compressBuffer","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack"],"mappings":"wIAIOA,eAAeC,EAAeC,SAC5BC,EAAOC,MACb,MAAMC,EAASC,EAAKJ,GACpB,OAAOK,EAAaF,EACvB,CAEOL,eAAeQ,EAAiBN,SAC9BC,EAAOC,MACb,MAAMK,EAAWC,EAAeR,GAChC,OAAOS,EAAOF,EACjB,QAAAR,oBAAAO"}
1
+ {"version":3,"file":"compress.mjs","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\r\nimport sodium from 'libsodium-wrappers';\r\nimport { unpack, pack } from 'msgpackr';\r\n\r\nasync function compressBuffer(input: any) {\r\n await sodium.ready\r\n const encode = pack(input);\r\n return compressSync(encode);\r\n}\r\n\r\nasync function decompressBuffer(input: Uint8Array | Buffer) {\r\n await sodium.ready\r\n const compress = decompressSync(input);\r\n return unpack(compress);\r\n}\r\n\r\nasync function compress(input: any) {\r\n const compressed = await compressBuffer(input);\r\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\r\n}\r\n\r\nasync function decompress(base64Str: string) {\r\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\r\n return await decompressBuffer(compressed);\r\n}\r\n\r\nconst compresor = { compress, decompress, compressBuffer, decompressBuffer };\r\nexport default compresor;"],"names":["async","compressBuffer","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack","compresor","compressed","to_base64","base64_variants","ORIGINAL","decompress","base64Str","from_base64"],"mappings":"wIAIAA,eAAeC,EAAeC,SACrBC,EAAOC,MACb,MAAMC,EAASC,EAAKJ,GACpB,OAAOK,EAAaF,EACvB,CAEAL,eAAeQ,EAAiBN,SACvBC,EAAOC,MACb,MAAMK,EAAWC,EAAeR,GAChC,OAAOS,EAAOF,EACjB,CAYA,MAAMG,EAAY,CAAEH,SAVpBT,eAAwBE,GACrB,MAAMW,QAAmBZ,EAAeC,GACxC,OAAOC,EAAOW,UAAUD,EAAYV,EAAOY,gBAAgBC,SAC9D,EAO8BC,WAL9BjB,eAA0BkB,GACvB,MAAML,EAAaV,EAAOgB,YAAYD,EAAWf,EAAOY,gBAAgBC,UACxE,aAAaR,EAAiBK,EACjC,EAE0CZ,iBAAgBO,2BAAgBI"}
@@ -0,0 +1,19 @@
1
+ type EncryptInput = string | object | any[];
2
+ /** --- STRING --- */
3
+ declare function encrypt(input: EncryptInput, secret: string): Promise<string>;
4
+ declare function decrypt(base64: string, secret: string): Promise<any | null>;
5
+ /** --- BUFFER --- */
6
+ declare function encryptBuffer(input: any, secret: string): Promise<Uint8Array>;
7
+ declare function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null>;
8
+ /** --- HASH --- */
9
+ declare function hash(str: string): Promise<string>;
10
+ declare const crypto: {
11
+ encrypt: typeof encrypt;
12
+ decrypt: typeof decrypt;
13
+ encryptBuffer: typeof encryptBuffer;
14
+ decryptBuffer: typeof decryptBuffer;
15
+ hash: typeof hash;
16
+ };
17
+
18
+ export { decrypt, decryptBuffer, crypto as default, encrypt, encryptBuffer, hash };
19
+ export type { EncryptInput };
package/include/crypto.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=require("libsodium-wrappers"),e=require("./compress.js");function t(e){return r.crypto_generichash(r.crypto_secretbox_KEYBYTES,r.from_string(e))}function c(e){return r.crypto_generichash(r.crypto_secretbox_NONCEBYTES,r.from_string(e))}async function n(e,t){const c=await o(e,t);return r.to_base64(c)}async function s(e,t){const c=r.from_base64(e);return await a(c,t)}async function o(n,s){await r.ready;const o=t(s),a=c(s),p=await e.compressBuffer(n);return r.crypto_secretbox_easy(p,a,o)}async function a(n,s){await r.ready;const o=t(s),a=c(s);try{const t=r.crypto_secretbox_open_easy(n,a,o);return t?await e.decompressBuffer(t):null}catch(r){return null}}async function p(e){await r.ready;const t=r.crypto_generichash(32,r.from_string(e));return r.to_base64(t).replace(/[^a-zA-Z0-9]/g,"")}const u={encrypt:n,decrypt:s,encryptBuffer:o,decryptBuffer:a,hash:p};exports.decrypt=s,exports.decryptBuffer=a,exports.default=u,exports.encrypt=n,exports.encryptBuffer=o,exports.hash=p;//# sourceMappingURL=crypto.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=require("libsodium-wrappers"),e=require("./compress.js");function t(e){return r.crypto_generichash(r.crypto_secretbox_KEYBYTES,r.from_string(e))}function c(e){return r.crypto_generichash(r.crypto_secretbox_NONCEBYTES,r.from_string(e))}async function n(e,t){const c=await o(e,t);return r.to_base64(c)}async function s(e,t){const c=r.from_base64(e);return await a(c,t)}async function o(n,s){await r.ready;const o=t(s),a=c(s),u=await e.default.compressBuffer(n);return r.crypto_secretbox_easy(u,a,o)}async function a(n,s){await r.ready;const o=t(s),a=c(s);try{const t=r.crypto_secretbox_open_easy(n,a,o);return t?await e.default.decompressBuffer(t):null}catch(r){return null}}async function u(e){await r.ready;const t=r.crypto_generichash(32,r.from_string(e));return r.to_base64(t).replace(/[^a-zA-Z0-9]/g,"")}const p={encrypt:n,decrypt:s,encryptBuffer:o,decryptBuffer:a,hash:u};exports.decrypt=s,exports.decryptBuffer=a,exports.default=p,exports.encrypt=n,exports.encryptBuffer=o,exports.hash=u;//# sourceMappingURL=crypto.js.map