securequ 1.0.15 → 1.1.0
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 +26 -0
- package/client/Base.js +1 -0
- package/client/Base.js.map +1 -0
- package/client/Base.mjs +1 -0
- package/client/Base.mjs.map +1 -0
- package/client/index.d.ts +9 -21
- package/client/index.js +1 -170
- package/client/index.js.map +1 -1
- package/client/index.mjs +1 -170
- package/client/index.mjs.map +1 -1
- package/client/types.d.ts +21 -5
- package/include/File.js +1 -0
- package/include/File.js.map +1 -0
- package/include/File.mjs +1 -0
- package/include/File.mjs.map +1 -0
- package/include/compress.js +1 -0
- package/include/compress.js.map +1 -0
- package/include/compress.mjs +1 -0
- package/include/compress.mjs.map +1 -0
- package/include/crypto.js +1 -0
- package/include/crypto.js.map +1 -0
- package/include/crypto.mjs +1 -0
- package/include/crypto.mjs.map +1 -0
- package/index.js +1 -1
- package/index.mjs +1 -1
- package/package.json +8 -5
- package/readme.md +54 -54
- package/server/Base.d.ts +25 -0
- package/server/Base.js +1 -0
- package/server/Base.js.map +1 -0
- package/server/Base.mjs +1 -0
- package/server/Base.mjs.map +1 -0
- package/server/Router.d.ts +12 -0
- package/server/Router.js +1 -0
- package/server/Router.js.map +1 -0
- package/server/Router.mjs +1 -0
- package/server/Router.mjs.map +1 -0
- package/server/index.d.ts +6 -14
- package/server/index.js +1 -115
- package/server/index.js.map +1 -1
- package/server/index.mjs +1 -115
- package/server/index.mjs.map +1 -1
- package/server/types.d.ts +45 -8
- package/include/lib/base64.js +0 -47
- package/include/lib/base64.js.map +0 -1
- package/include/lib/base64.mjs +0 -47
- package/include/lib/base64.mjs.map +0 -1
- package/include/lib/cache.js +0 -72
- package/include/lib/cache.js.map +0 -1
- package/include/lib/cache.mjs +0 -72
- package/include/lib/cache.mjs.map +0 -1
- package/include/lib/crypto.js +0 -69
- package/include/lib/crypto.js.map +0 -1
- package/include/lib/crypto.mjs +0 -69
- package/include/lib/crypto.mjs.map +0 -1
- package/include/lib/pako.js +0 -28
- package/include/lib/pako.js.map +0 -1
- package/include/lib/pako.mjs +0 -28
- package/include/lib/pako.mjs.map +0 -1
- package/include/lib/reverser.js +0 -25
- package/include/lib/reverser.js.map +0 -1
- package/include/lib/reverser.mjs +0 -25
- package/include/lib/reverser.mjs.map +0 -1
- package/include/lib/urlpath.js +0 -10
- package/include/lib/urlpath.js.map +0 -1
- package/include/lib/urlpath.mjs +0 -10
- package/include/lib/urlpath.mjs.map +0 -1
- package/include/responseValue.js +0 -10
- package/include/responseValue.js.map +0 -1
- package/include/responseValue.mjs +0 -10
- package/include/responseValue.mjs.map +0 -1
- package/include/signeture.js +0 -20
- package/include/signeture.js.map +0 -1
- package/include/signeture.mjs +0 -20
- package/include/signeture.mjs.map +0 -1
package/client/Base.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SecurequClientConfig, HttpRequestInit, SecurequClientResponse } from './types.js';
|
|
2
|
+
|
|
3
|
+
type HandShakeInfo = {
|
|
4
|
+
timeDiffarenc: number;
|
|
5
|
+
signeture: string;
|
|
6
|
+
};
|
|
7
|
+
declare class Base {
|
|
8
|
+
protected config: SecurequClientConfig;
|
|
9
|
+
protected loadingHandshake: boolean;
|
|
10
|
+
protected secret_length: number;
|
|
11
|
+
protected handshakeInfo: HandShakeInfo | null;
|
|
12
|
+
constructor(config: SecurequClientConfig);
|
|
13
|
+
protected hooksCall(hook: keyof NonNullable<SecurequClientConfig['hooks']>, ...args: any[]): any;
|
|
14
|
+
protected getSecret(): Promise<{
|
|
15
|
+
full: string;
|
|
16
|
+
secret: string;
|
|
17
|
+
hash: string;
|
|
18
|
+
}>;
|
|
19
|
+
protected url(path: string): Promise<URL>;
|
|
20
|
+
protected getHeaders(path: string, init?: HttpRequestInit): Promise<any>;
|
|
21
|
+
protected awaitForHandshake(): Promise<void>;
|
|
22
|
+
handshake(): Promise<void>;
|
|
23
|
+
protected fetch(path: string, init?: HttpRequestInit): Promise<SecurequClientResponse>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { Base as default };
|
package/client/Base.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../include/crypto.js"),t=require("xanfetch");const s=new Map;exports.default=class{constructor(e){this.loadingHandshake=!1,this.secret_length=0,this.handshakeInfo=null,this.config=Object.assign({},e);const t=new URL(e.url);if(t.search||t.hash)throw new Error(`Invalid config url ${e.url}. Search params or Hash url is not supported in config.url`);if(e.url=`${t.origin}${t.pathname}`,s.has(e.url))throw new Error("Client is Blocked!")}hooksCall(e,...t){if(this.config.hooks&&this.config.hooks[e])return this.config.hooks[e](...t)}async getSecret(){let t=this.config.secret,s=t.substring(0,this.secret_length);return{full:t,secret:s,hash:(await e.default.hash(s)).substring(0,this.secret_length)}}async url(e){const t=await this.getSecret(),s=this.config.url;return"/"===e&&(e=""),(e=(e=(e=e.trim()).startsWith("/")?e.substring(1):e).endsWith("/")?e.substring(0,e.length-1):e)&&(e=`/${e}`),new URL(`${s}/${t.hash}${e}`)}async getHeaders(t,s){var a,n,i;const r=await this.url(t),h=await this.getSecret();let o={};return this.handshakeInfo&&(o["X-SIGNETURE"]=await e.default.encrypt({signeture:null===(a=this.handshakeInfo)||void 0===a?void 0:a.signeture,expire:Date.now()+this.handshakeInfo.timeDiffarenc+1e4},h.secret)||""),Object.assign(Object.assign(Object.assign(Object.assign({},null===(i=null===(n=this.config)||void 0===n?void 0:n.defaultOptions)||void 0===i?void 0:i.headers),null==s?void 0:s.headers),o),{"Content-Type":"application/octet-stream","X-ORIGIN":r.origin})}async awaitForHandshake(){this.loadingHandshake&&await new Promise(e=>{const t=setInterval(()=>{this.loadingHandshake||(clearInterval(t),e(null))},100)}),this.handshakeInfo||await this.handshake()}async handshake(){await this.hooksCall("beforeHandshake"),this.handshakeInfo=null,this.loadingHandshake=!0;let e=this.config.secret.length,t=3*Math.floor(e/4);this.secret_length=Math.floor(Math.random()*(e-t+1))+t;const s=await this.getSecret(),a=await this.fetch("/",{method:"POST",body:{hash:s.hash,clientTime:(new Date).toISOString(),secret:s.secret}});this.handshakeInfo=a.data,this.loadingHandshake=!1,await this.hooksCall("afterHandshake",this.handshakeInfo)}async fetch(s,a){var n;const i=await this.getSecret(),r=await this.url(s);let h=Object.fromEntries(r.searchParams.entries());const o=Object.assign({},a);let c=Object.assign({},h);if(Object.keys(h).length>0)for(let e in h)r.searchParams.delete(e);if(null==o?void 0:o.params){for(let e in o.params)c[e]=o.params[e];delete o.params}if(Object.keys(c).length>0){const t=await e.default.encrypt(c,i.secret);r.href=r.href+"?"+encodeURIComponent(t)}const l=Object.assign(Object.assign(Object.assign({method:"GET"},null===(n=this.config)||void 0===n?void 0:n.defaultOptions),o),{headers:await this.getHeaders(s,a)});(null==l?void 0:l.body)&&(l.body=await e.default.encryptBuffer(l.body,i.secret));const d=await t(r.href,l),f=await d.arrayBuffer(),u=await e.default.decryptBuffer(new Uint8Array(f),i.secret);return{success:d.ok,message:d.ok?d.statusText:u,data:d.ok?u:null,code:d.status}}};//# sourceMappingURL=Base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base.js","sources":["../../src/client/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport { HttpRequestInit, SecurequClientConfig, SecurequClientResponse } from \"./types\";\r\nimport xanFetch from 'xanfetch'\r\nimport { chunkFile, totalChunks } from \"../include/File\";\r\n\r\ntype HandShakeInfo = {\r\n timeDiffarenc: number;\r\n signeture: string;\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 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 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 const enc = await crypto.encrypt(params, secret.secret)\r\n url.href = url.href + \"?\" + encodeURIComponent(enc)\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 httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);\r\n }\r\n const res = await xanFetch(url.href, httpOption)\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","sparams","fromEntries","searchParams","entries","_init","params","keys","key","delete","enc","href","encodeURIComponent","httpOption","encryptBuffer","arrayBuffer","val","decryptBuffer","Uint8Array","success","ok","message","statusText","code","status"],"mappings":"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"}
|
package/client/Base.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import t from"../include/crypto.mjs";import e from"xanfetch";const s=new Map;class a{constructor(t){this.loadingHandshake=!1,this.secret_length=0,this.handshakeInfo=null,this.config=Object.assign({},t);const e=new URL(t.url);if(e.search||e.hash)throw new Error(`Invalid config url ${t.url}. Search params or Hash url is not supported in config.url`);if(t.url=`${e.origin}${e.pathname}`,s.has(t.url))throw new Error("Client is Blocked!")}hooksCall(t,...e){if(this.config.hooks&&this.config.hooks[t])return this.config.hooks[t](...e)}async getSecret(){let e=this.config.secret,s=e.substring(0,this.secret_length);return{full:e,secret:s,hash:(await t.hash(s)).substring(0,this.secret_length)}}async url(t){const e=await this.getSecret(),s=this.config.url;return"/"===t&&(t=""),(t=(t=(t=t.trim()).startsWith("/")?t.substring(1):t).endsWith("/")?t.substring(0,t.length-1):t)&&(t=`/${t}`),new URL(`${s}/${e.hash}${t}`)}async getHeaders(e,s){var a,n,i;const r=await this.url(e),h=await this.getSecret();let o={};return this.handshakeInfo&&(o["X-SIGNETURE"]=await t.encrypt({signeture:null===(a=this.handshakeInfo)||void 0===a?void 0:a.signeture,expire:Date.now()+this.handshakeInfo.timeDiffarenc+1e4},h.secret)||""),Object.assign(Object.assign(Object.assign(Object.assign({},null===(i=null===(n=this.config)||void 0===n?void 0:n.defaultOptions)||void 0===i?void 0:i.headers),null==s?void 0:s.headers),o),{"Content-Type":"application/octet-stream","X-ORIGIN":r.origin})}async awaitForHandshake(){this.loadingHandshake&&await new Promise(t=>{const e=setInterval(()=>{this.loadingHandshake||(clearInterval(e),t(null))},100)}),this.handshakeInfo||await this.handshake()}async handshake(){await this.hooksCall("beforeHandshake"),this.handshakeInfo=null,this.loadingHandshake=!0;let t=this.config.secret.length,e=3*Math.floor(t/4);this.secret_length=Math.floor(Math.random()*(t-e+1))+e;const s=await this.getSecret(),a=await this.fetch("/",{method:"POST",body:{hash:s.hash,clientTime:(new Date).toISOString(),secret:s.secret}});this.handshakeInfo=a.data,this.loadingHandshake=!1,await this.hooksCall("afterHandshake",this.handshakeInfo)}async fetch(s,a){var n;const i=await this.getSecret(),r=await this.url(s);let h=Object.fromEntries(r.searchParams.entries());const o=Object.assign({},a);let c=Object.assign({},h);if(Object.keys(h).length>0)for(let t in h)r.searchParams.delete(t);if(null==o?void 0:o.params){for(let t in o.params)c[t]=o.params[t];delete o.params}if(Object.keys(c).length>0){const e=await t.encrypt(c,i.secret);r.href=r.href+"?"+encodeURIComponent(e)}const l=Object.assign(Object.assign(Object.assign({method:"GET"},null===(n=this.config)||void 0===n?void 0:n.defaultOptions),o),{headers:await this.getHeaders(s,a)});(null==l?void 0:l.body)&&(l.body=await t.encryptBuffer(l.body,i.secret));const d=await e(r.href,l),f=await d.arrayBuffer(),g=await t.decryptBuffer(new Uint8Array(f),i.secret);return{success:d.ok,message:d.ok?d.statusText:g,data:d.ok?g:null,code:d.status}}}export{a as default};//# sourceMappingURL=Base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base.mjs","sources":["../../src/client/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport { HttpRequestInit, SecurequClientConfig, SecurequClientResponse } from \"./types\";\r\nimport xanFetch from 'xanfetch'\r\nimport { chunkFile, totalChunks } from \"../include/File\";\r\n\r\ntype HandShakeInfo = {\r\n timeDiffarenc: number;\r\n signeture: string;\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 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 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 const enc = await crypto.encrypt(params, secret.secret)\r\n url.href = url.href + \"?\" + encodeURIComponent(enc)\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 httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);\r\n }\r\n const res = await xanFetch(url.href, httpOption)\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","sparams","fromEntries","searchParams","entries","_init","params","keys","key","delete","enc","href","encodeURIComponent","httpOption","encryptBuffer","value","arrayBuffer","val","decryptBuffer","Uint8Array","success","ok","message","statusText","code","status"],"mappings":"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"}
|
package/client/index.d.ts
CHANGED
|
@@ -1,25 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { HttpRequestInit, SecurequClientResponse } from './types.js';
|
|
2
|
+
import Base from './Base.js';
|
|
2
3
|
|
|
3
|
-
declare class SecurequClient {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
private signerure;
|
|
11
|
-
private reqkey;
|
|
12
|
-
constructor(config: SecurequClientConfig);
|
|
13
|
-
private setCache;
|
|
14
|
-
private getCache;
|
|
15
|
-
private PATH_CACHE;
|
|
16
|
-
private path;
|
|
17
|
-
private handshake;
|
|
18
|
-
send(path: string, init?: HttpRequestInit): Promise<Response>;
|
|
19
|
-
get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<string>;
|
|
20
|
-
post(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<string>;
|
|
21
|
-
put(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<string>;
|
|
22
|
-
delete(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<string>;
|
|
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>;
|
|
23
11
|
}
|
|
24
12
|
|
|
25
13
|
export { SecurequClient as default };
|
package/client/index.js
CHANGED
|
@@ -1,170 +1 @@
|
|
|
1
|
-
|
|
2
|
-
constructor(config) {
|
|
3
|
-
this.token = '';
|
|
4
|
-
this.tokenLoading = false;
|
|
5
|
-
this.Cache = new cache.default({ ttl: 1000 * 60 * 60, limit: 100 });
|
|
6
|
-
this.reqkey = '';
|
|
7
|
-
this.PATH_CACHE = new cache.default({ ttl: 1000 * 60 * 60, limit: 100 });
|
|
8
|
-
this.config = Object.assign({}, config);
|
|
9
|
-
const secret = crypto.default.makeSecret(config.secret);
|
|
10
|
-
this.config.secret = secret;
|
|
11
|
-
this.secret_length = secret.length - (Math.floor(Math.random() * 11) + 5);
|
|
12
|
-
this.secret = crypto.default.makeSecret(secret.substring(0, this.secret_length));
|
|
13
|
-
this.signerure = signeture.default.make(this.secret, this.secret);
|
|
14
|
-
}
|
|
15
|
-
setCache(path, method, response) {
|
|
16
|
-
const cacheKey = `${method}:${path}`;
|
|
17
|
-
if (this.config.cache === true) {
|
|
18
|
-
this.Cache.set(cacheKey, response);
|
|
19
|
-
}
|
|
20
|
-
else if (this.config.cache) {
|
|
21
|
-
this.config.cache.set(cacheKey, response);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
getCache(path, method) {
|
|
25
|
-
const cacheKey = `${method}:${path}`;
|
|
26
|
-
if (this.config.cache === true) {
|
|
27
|
-
return this.Cache.get(cacheKey);
|
|
28
|
-
}
|
|
29
|
-
else if (this.config.cache) {
|
|
30
|
-
return this.config.cache.get(cacheKey);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
path(path) {
|
|
34
|
-
let pathKey = path;
|
|
35
|
-
let has = this.PATH_CACHE.get(pathKey);
|
|
36
|
-
if (!has) {
|
|
37
|
-
const { search, pathname } = new URL(path, window.location.origin);
|
|
38
|
-
const params = new URLSearchParams(search);
|
|
39
|
-
const paramsObject = Object.fromEntries(params.entries());
|
|
40
|
-
let split = pathname.split("/").map((s) => urlpath.default.encrypt(s)).filter((s) => s.length > 0);
|
|
41
|
-
path = `${this.config.basepath}/${split.join("/")}`;
|
|
42
|
-
if (Object.keys(paramsObject).length) {
|
|
43
|
-
for (let key in paramsObject) {
|
|
44
|
-
paramsObject[urlpath.default.encrypt(key)] = paramsObject[key];
|
|
45
|
-
delete paramsObject[key];
|
|
46
|
-
}
|
|
47
|
-
const string = JSON.stringify(paramsObject);
|
|
48
|
-
const text = encodeURIComponent(crypto.default.encrypt(string, this.token));
|
|
49
|
-
path += `?${this.reqkey}=${text}`;
|
|
50
|
-
}
|
|
51
|
-
this.PATH_CACHE.set(pathKey, path);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
path = has;
|
|
55
|
-
}
|
|
56
|
-
return path;
|
|
57
|
-
}
|
|
58
|
-
async handshake() {
|
|
59
|
-
var _a, _b, _c;
|
|
60
|
-
this.tokenLoading = true;
|
|
61
|
-
const res = await xanFetch(this.path(`/handshake`), Object.assign(Object.assign({}, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultOptions), { method: "GET", headers: Object.assign(Object.assign({}, (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultOptions) === null || _c === void 0 ? void 0 : _c.headers), { [signeture.default.key]: this.signerure }) }));
|
|
62
|
-
this.tokenLoading = false;
|
|
63
|
-
if (res.ok) {
|
|
64
|
-
const txt = await res.text();
|
|
65
|
-
const value = responseValue.default.decrypt(txt, this.signerure);
|
|
66
|
-
const token = crypto.default.decrypt(value, this.secret);
|
|
67
|
-
this.token = token;
|
|
68
|
-
this.reqkey = token.substring(0, token.length / 2);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
throw new Error("Handshake failed");
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
async send(path, init) {
|
|
75
|
-
var _a, _b, _c;
|
|
76
|
-
if (init === null || init === void 0 ? void 0 : init.params) {
|
|
77
|
-
let url = new URL(path, window.location.origin);
|
|
78
|
-
for (let key in init.params) {
|
|
79
|
-
url.searchParams.set(key, init.params[key]);
|
|
80
|
-
}
|
|
81
|
-
path = url.pathname + url.search;
|
|
82
|
-
delete init.params;
|
|
83
|
-
}
|
|
84
|
-
let url = new URL(path, window.location.origin);
|
|
85
|
-
if (url.pathname === '/handshake') {
|
|
86
|
-
throw new Error("Path is not allowed");
|
|
87
|
-
}
|
|
88
|
-
if (this.tokenLoading) {
|
|
89
|
-
await new Promise((resolve) => {
|
|
90
|
-
const interval = setInterval(() => {
|
|
91
|
-
if (!this.tokenLoading) {
|
|
92
|
-
clearInterval(interval);
|
|
93
|
-
resolve(null);
|
|
94
|
-
}
|
|
95
|
-
}, 100);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
if (!this.token) {
|
|
99
|
-
await this.handshake();
|
|
100
|
-
}
|
|
101
|
-
const httpOption = Object.assign(Object.assign(Object.assign({ method: "GET" }, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultOptions), init), { headers: Object.assign(Object.assign(Object.assign({}, (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultOptions) === null || _c === void 0 ? void 0 : _c.headers), init === null || init === void 0 ? void 0 : init.headers), { [signeture.default.key]: this.signerure }) });
|
|
102
|
-
if (this.config.cache === true || this.config.cache) {
|
|
103
|
-
const cache_res = this.getCache(path, httpOption.method);
|
|
104
|
-
if (cache_res) {
|
|
105
|
-
return cache_res.clone();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (httpOption.body) {
|
|
109
|
-
if (!this.token)
|
|
110
|
-
throw new Error("Token not loaded");
|
|
111
|
-
const body = new FormData();
|
|
112
|
-
let _data = {};
|
|
113
|
-
let hasFile = false;
|
|
114
|
-
for (let key in httpOption.body) {
|
|
115
|
-
let ukey = urlpath.default.encrypt(key);
|
|
116
|
-
if (httpOption.body[key] instanceof File) {
|
|
117
|
-
body.append(ukey, httpOption.body[key]);
|
|
118
|
-
hasFile = true;
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
_data[ukey] = httpOption.body[key];
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
body.append(this.reqkey, crypto.default.encrypt(_data, this.token));
|
|
125
|
-
if (!hasFile) {
|
|
126
|
-
httpOption.body = new URLSearchParams(body);
|
|
127
|
-
if (!httpOption.headers['Content-Type']) {
|
|
128
|
-
httpOption.headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
if (httpOption.method === "GET") {
|
|
133
|
-
httpOption.method = "POST";
|
|
134
|
-
}
|
|
135
|
-
httpOption.body = body;
|
|
136
|
-
if (!httpOption.headers['Content-Type']) {
|
|
137
|
-
httpOption.headers['Content-Type'] = 'multipart/form-data';
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
const response = await xanFetch(this.path(path), httpOption);
|
|
142
|
-
const res = response.clone();
|
|
143
|
-
const text = await response.text();
|
|
144
|
-
const value = responseValue.default.decrypt(text, this.signerure);
|
|
145
|
-
if (!response.ok) {
|
|
146
|
-
throw new Error(value);
|
|
147
|
-
}
|
|
148
|
-
res.text = async () => value;
|
|
149
|
-
if ((this.config.cache === true || this.config.cache) && res.ok) {
|
|
150
|
-
this.setCache(path, httpOption.method, res.clone());
|
|
151
|
-
}
|
|
152
|
-
return res;
|
|
153
|
-
}
|
|
154
|
-
async get(path, init) {
|
|
155
|
-
const res = await this.send(path, init);
|
|
156
|
-
return await res.text();
|
|
157
|
-
}
|
|
158
|
-
async post(path, init) {
|
|
159
|
-
const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "POST" }));
|
|
160
|
-
return await res.text();
|
|
161
|
-
}
|
|
162
|
-
async put(path, init) {
|
|
163
|
-
const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "PUT" }));
|
|
164
|
-
return await res.text();
|
|
165
|
-
}
|
|
166
|
-
async delete(path, init) {
|
|
167
|
-
const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "DELETE" }));
|
|
168
|
-
return await res.text();
|
|
169
|
-
}
|
|
170
|
-
}exports.default=SecurequClient;//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),t=require("../include/File.js"),a=require("./Base.js");class s extends a.default{async send(e,t){await this.awaitForHandshake(),t=await this.hooksCall("beforeRequest",e,t)||t;if("/"===(await this.url(e)).pathname)throw new Error("Path is not allowed");for(let e in null==t?void 0:t.body)(null==t?void 0:t.body[e])instanceof File&&(t.body[e]=await this.upload(t.body[e],null==t?void 0:t.onProgress));const a=await this.fetch(e,t);return["Signeture expired","Request expired"].includes(a.data)?(await this.handshake(),await this.send(e,t)):(await this.hooksCall("afterResponse",a),a)}async upload(a,s){var i,n,o,l;await this.awaitForHandshake();const r=await t.getFileId(a),d=new AbortController,h={filename:(a=await this.hooksCall("beforeUpload",a,r)||a).name,filesize:a.size,filetype:a.type,fileid:r,totalChunks:t.totalChunks(a)},c=async()=>{await this.fetch("/",{method:"PUT",body:Object.assign(Object.assign({},h),{type:"failed"})}),d.abort(),window.removeEventListener("pagehide",c)};window.addEventListener("pagehide",c);const u=await this.fetch("/",{method:"PUT",body:Object.assign(Object.assign({},h),{type:"meta"})});if(!u.success)throw new Error(u.message||"Upload failed");try{for(var w,f=!0,y=e.__asyncValues(t.chunkFile(a));!(i=(w=await y.next()).done);){l=w.value,f=!1;try{let{chunk:e,chunkIndex:t}=l;await this.hooksCall("beforeUploadChunk",e,t,h.totalChunks);const i=await this.fetch("/",{method:"PUT",signal:d.signal,body:{chunk:e,chunkIndex:t,fileId:r},onProgress:e=>{if(s){const a=Math.floor((t+1)/h.totalChunks*100),i=Math.floor(e/100/h.totalChunks*100);s(Math.min(a+i,100))}}});if(!i.success)return await c(),i;if(await this.hooksCall("afterUploadChunk",i,t,h.totalChunks),t+1===h.totalChunks){const e={success:!0,message:"File uploaded successfully",data:i.data,code:i.code};return await this.hooksCall("afterUpload",e,a),e}}finally{f=!0}}}catch(e){n={error:e}}finally{try{f||i||!(o=y.return)||await o.call(y)}finally{if(n)throw n.error}}return{success:!1,message:"File upload failed",data:null,code:0}}async get(e,t){return await this.send(e,t)}async post(e,t){return await this.send(e,Object.assign(Object.assign({},t),{method:"POST"}))}async put(e,t){return await this.send(e,Object.assign(Object.assign({},t),{method:"PUT"}))}async delete(e,t){return await this.send(e,Object.assign(Object.assign({},t),{method:"DELETE"}))}}exports.default=s;//# sourceMappingURL=index.js.map
|
package/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/client/index.ts"],"sourcesContent":["import crypto from \"../include/lib/crypto\";\r\nimport signeture from \"../include/signeture\";\r\nimport urlpath from \"../include/lib/urlpath\";\r\nimport { HttpRequestInit, RequestBody, SecurequClientConfig } from \"./types\";\r\nimport xanFetch from 'xanfetch'\r\nimport responseValue from \"../include/responseValue\";\r\nimport SecurequCache from \"../include/lib/cache\";\r\n\r\nclass SecurequClient {\r\n private config: SecurequClientConfig;\r\n private token: string = '';\r\n private tokenLoading: boolean = false;\r\n private Cache = new SecurequCache<Response>({ ttl: 1000 * 60 * 60, limit: 100 });\r\n\r\n private secret: string;\r\n private secret_length: number;\r\n private signerure: string;\r\n private reqkey: string = '';\r\n\r\n constructor(config: SecurequClientConfig) {\r\n this.config = { ...config }\r\n const secret = crypto.makeSecret(config.secret)\r\n this.config.secret = secret;\r\n this.secret_length = secret.length - (Math.floor(Math.random() * 11) + 5);\r\n this.secret = crypto.makeSecret(secret.substring(0, this.secret_length))\r\n this.signerure = signeture.make(this.secret, this.secret);\r\n }\r\n\r\n private setCache(path: string, method: string, response: any) {\r\n const cacheKey = `${method}:${path}`;\r\n if (this.config.cache === true) {\r\n this.Cache.set(cacheKey, response);\r\n } else if (this.config.cache) {\r\n this.config.cache.set(cacheKey, response);\r\n }\r\n }\r\n\r\n private getCache(path: string, method: string,) {\r\n const cacheKey = `${method}:${path}`;\r\n if (this.config.cache === true) {\r\n return this.Cache.get(cacheKey);\r\n } else if (this.config.cache) {\r\n return this.config.cache.get(cacheKey);\r\n }\r\n }\r\n\r\n private PATH_CACHE = new SecurequCache<string>({ ttl: 1000 * 60 * 60, limit: 100 });\r\n private path(path: string) {\r\n let pathKey = path\r\n let has = this.PATH_CACHE.get(pathKey)\r\n if (!has) {\r\n const { search, pathname } = new URL(path, window.location.origin);\r\n const params = new URLSearchParams(search);\r\n const paramsObject = Object.fromEntries(params.entries());\r\n let split = pathname.split(\"/\").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);\r\n path = `${this.config.basepath}/${split.join(\"/\")}`;\r\n if (Object.keys(paramsObject).length) {\r\n for (let key in paramsObject) {\r\n paramsObject[urlpath.encrypt(key)] = paramsObject[key]\r\n delete paramsObject[key]\r\n }\r\n const string = JSON.stringify(paramsObject)\r\n const text = encodeURIComponent(crypto.encrypt(string, this.token));\r\n path += `?${this.reqkey}=${text}`;\r\n }\r\n this.PATH_CACHE.set(pathKey, path);\r\n } else {\r\n path = has\r\n }\r\n return path\r\n }\r\n\r\n private async handshake() {\r\n this.tokenLoading = true;\r\n const res = await xanFetch(this.path(`/handshake`), {\r\n ...this.config?.defaultOptions,\r\n method: \"GET\",\r\n headers: {\r\n ...this.config?.defaultOptions?.headers,\r\n [signeture.key]: this.signerure\r\n },\r\n })\r\n this.tokenLoading = false;\r\n\r\n if (res.ok) {\r\n const txt = await res.text();\r\n const value: any = responseValue.decrypt(txt, this.signerure)\r\n const token = crypto.decrypt(value, this.secret)\r\n this.token = token;\r\n this.reqkey = token.substring(0, token.length / 2);\r\n } else {\r\n throw new Error(\"Handshake failed\");\r\n }\r\n }\r\n\r\n async send(path: string, init?: HttpRequestInit): Promise<Response> {\r\n if (init?.params) {\r\n let url = new URL(path, window.location.origin);\r\n for (let key in init.params) {\r\n url.searchParams.set(key, (init.params as any)[key]);\r\n }\r\n path = url.pathname + url.search;\r\n delete init.params;\r\n }\r\n let url = new URL(path, window.location.origin);\r\n if (url.pathname === '/handshake') {\r\n throw new Error(\"Path is not allowed\")\r\n }\r\n if (this.tokenLoading) {\r\n await new Promise((resolve) => {\r\n const interval = setInterval(() => {\r\n if (!this.tokenLoading) {\r\n clearInterval(interval);\r\n resolve(null);\r\n }\r\n }, 100);\r\n })\r\n }\r\n\r\n if (!this.token) {\r\n await this.handshake();\r\n }\r\n\r\n const httpOption: any = {\r\n method: \"GET\",\r\n ...this.config?.defaultOptions,\r\n ...init,\r\n headers: {\r\n ...this.config?.defaultOptions?.headers,\r\n ...init?.headers,\r\n [signeture.key]: this.signerure\r\n },\r\n }\r\n\r\n if (this.config.cache === true || this.config.cache) {\r\n const cache_res = this.getCache(path, httpOption.method);\r\n if (cache_res) {\r\n return cache_res.clone();\r\n }\r\n }\r\n\r\n if (httpOption.body) {\r\n if (!this.token) throw new Error(\"Token not loaded\")\r\n const body = new FormData();\r\n let _data: any = {}\r\n let hasFile = false;\r\n for (let key in httpOption.body) {\r\n let ukey = urlpath.encrypt(key);\r\n if (httpOption.body[key] instanceof File) {\r\n body.append(ukey, httpOption.body[key]);\r\n hasFile = true;\r\n } else {\r\n _data[ukey] = httpOption.body[key];\r\n }\r\n }\r\n\r\n body.append(this.reqkey, crypto.encrypt(_data, this.token));\r\n\r\n if (!hasFile) {\r\n httpOption.body = new URLSearchParams(body as any);\r\n if (!httpOption.headers['Content-Type']) {\r\n httpOption.headers['Content-Type'] = 'application/x-www-form-urlencoded';\r\n }\r\n } else {\r\n if (httpOption.method === \"GET\") {\r\n httpOption.method = \"POST\"\r\n }\r\n httpOption.body = body\r\n if (!httpOption.headers['Content-Type']) {\r\n httpOption.headers['Content-Type'] = 'multipart/form-data';\r\n }\r\n }\r\n }\r\n\r\n const response = await xanFetch(this.path(path), httpOption);\r\n const res = response.clone();\r\n const text = await response.text();\r\n const value: any = responseValue.decrypt(text, this.signerure)\r\n if (!response.ok) {\r\n throw new Error(value);\r\n }\r\n res.text = async () => value;\r\n if ((this.config.cache === true || this.config.cache) && res.ok) {\r\n this.setCache(path, httpOption.method, res.clone());\r\n }\r\n return res\r\n }\r\n\r\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\r\n const res = await this.send(path, init);\r\n return await res.text()\r\n }\r\n\r\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n const res = await this.send(path, {\r\n ...init,\r\n method: \"POST\",\r\n });\r\n return await res.text();\r\n }\r\n\r\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n const res = await this.send(path, {\r\n ...init,\r\n method: \"PUT\",\r\n });\r\n return await res.text();\r\n }\r\n\r\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n const res = await this.send(path, {\r\n ...init,\r\n method: \"DELETE\",\r\n });\r\n return await res.text();\r\n }\r\n}\r\n\r\nexport default SecurequClient;"],"names":["SecurequCache","crypto","signeture","urlpath","responseValue"],"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\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.data)) {\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 controller = new AbortController();\r\n file = await this.hooksCall('beforeUpload', file, fileId) || file;\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),\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 if (!metares.success) {\r\n throw new Error(metares.message || 'Upload failed');\r\n }\r\n\r\n for await (let { chunk, chunkIndex } of chunkFile(file)) {\r\n await this.hooksCall('beforeUploadChunk', chunk, chunkIndex, meta.totalChunks);\r\n const res = await this.fetch('/', {\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 if (!res.success) {\r\n await abort()\r\n return res\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","data","handshake","file","fileId","getFileId","controller","AbortController","meta","filename","name","filesize","size","filetype","type","fileid","totalChunks","abort","async","method","window","removeEventListener","addEventListener","metares","success","message","_f","_d","_e","__asyncValues","chunkFile","_a","next","done","_c","value","chunk","chunkIndex","signal","p","totalProgress","Math","floor","currentProgress","min","info","code","get","post","Object","assign","put","exports","default"],"mappings":"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"}
|
package/client/index.mjs
CHANGED
|
@@ -1,170 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
constructor(config) {
|
|
3
|
-
this.token = '';
|
|
4
|
-
this.tokenLoading = false;
|
|
5
|
-
this.Cache = new SecurequCache({ ttl: 1000 * 60 * 60, limit: 100 });
|
|
6
|
-
this.reqkey = '';
|
|
7
|
-
this.PATH_CACHE = new SecurequCache({ ttl: 1000 * 60 * 60, limit: 100 });
|
|
8
|
-
this.config = Object.assign({}, config);
|
|
9
|
-
const secret = crypto.makeSecret(config.secret);
|
|
10
|
-
this.config.secret = secret;
|
|
11
|
-
this.secret_length = secret.length - (Math.floor(Math.random() * 11) + 5);
|
|
12
|
-
this.secret = crypto.makeSecret(secret.substring(0, this.secret_length));
|
|
13
|
-
this.signerure = signeture.make(this.secret, this.secret);
|
|
14
|
-
}
|
|
15
|
-
setCache(path, method, response) {
|
|
16
|
-
const cacheKey = `${method}:${path}`;
|
|
17
|
-
if (this.config.cache === true) {
|
|
18
|
-
this.Cache.set(cacheKey, response);
|
|
19
|
-
}
|
|
20
|
-
else if (this.config.cache) {
|
|
21
|
-
this.config.cache.set(cacheKey, response);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
getCache(path, method) {
|
|
25
|
-
const cacheKey = `${method}:${path}`;
|
|
26
|
-
if (this.config.cache === true) {
|
|
27
|
-
return this.Cache.get(cacheKey);
|
|
28
|
-
}
|
|
29
|
-
else if (this.config.cache) {
|
|
30
|
-
return this.config.cache.get(cacheKey);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
path(path) {
|
|
34
|
-
let pathKey = path;
|
|
35
|
-
let has = this.PATH_CACHE.get(pathKey);
|
|
36
|
-
if (!has) {
|
|
37
|
-
const { search, pathname } = new URL(path, window.location.origin);
|
|
38
|
-
const params = new URLSearchParams(search);
|
|
39
|
-
const paramsObject = Object.fromEntries(params.entries());
|
|
40
|
-
let split = pathname.split("/").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);
|
|
41
|
-
path = `${this.config.basepath}/${split.join("/")}`;
|
|
42
|
-
if (Object.keys(paramsObject).length) {
|
|
43
|
-
for (let key in paramsObject) {
|
|
44
|
-
paramsObject[urlpath.encrypt(key)] = paramsObject[key];
|
|
45
|
-
delete paramsObject[key];
|
|
46
|
-
}
|
|
47
|
-
const string = JSON.stringify(paramsObject);
|
|
48
|
-
const text = encodeURIComponent(crypto.encrypt(string, this.token));
|
|
49
|
-
path += `?${this.reqkey}=${text}`;
|
|
50
|
-
}
|
|
51
|
-
this.PATH_CACHE.set(pathKey, path);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
path = has;
|
|
55
|
-
}
|
|
56
|
-
return path;
|
|
57
|
-
}
|
|
58
|
-
async handshake() {
|
|
59
|
-
var _a, _b, _c;
|
|
60
|
-
this.tokenLoading = true;
|
|
61
|
-
const res = await xanFetch(this.path(`/handshake`), Object.assign(Object.assign({}, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultOptions), { method: "GET", headers: Object.assign(Object.assign({}, (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultOptions) === null || _c === void 0 ? void 0 : _c.headers), { [signeture.key]: this.signerure }) }));
|
|
62
|
-
this.tokenLoading = false;
|
|
63
|
-
if (res.ok) {
|
|
64
|
-
const txt = await res.text();
|
|
65
|
-
const value = responseValue.decrypt(txt, this.signerure);
|
|
66
|
-
const token = crypto.decrypt(value, this.secret);
|
|
67
|
-
this.token = token;
|
|
68
|
-
this.reqkey = token.substring(0, token.length / 2);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
throw new Error("Handshake failed");
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
async send(path, init) {
|
|
75
|
-
var _a, _b, _c;
|
|
76
|
-
if (init === null || init === void 0 ? void 0 : init.params) {
|
|
77
|
-
let url = new URL(path, window.location.origin);
|
|
78
|
-
for (let key in init.params) {
|
|
79
|
-
url.searchParams.set(key, init.params[key]);
|
|
80
|
-
}
|
|
81
|
-
path = url.pathname + url.search;
|
|
82
|
-
delete init.params;
|
|
83
|
-
}
|
|
84
|
-
let url = new URL(path, window.location.origin);
|
|
85
|
-
if (url.pathname === '/handshake') {
|
|
86
|
-
throw new Error("Path is not allowed");
|
|
87
|
-
}
|
|
88
|
-
if (this.tokenLoading) {
|
|
89
|
-
await new Promise((resolve) => {
|
|
90
|
-
const interval = setInterval(() => {
|
|
91
|
-
if (!this.tokenLoading) {
|
|
92
|
-
clearInterval(interval);
|
|
93
|
-
resolve(null);
|
|
94
|
-
}
|
|
95
|
-
}, 100);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
if (!this.token) {
|
|
99
|
-
await this.handshake();
|
|
100
|
-
}
|
|
101
|
-
const httpOption = Object.assign(Object.assign(Object.assign({ method: "GET" }, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultOptions), init), { headers: Object.assign(Object.assign(Object.assign({}, (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultOptions) === null || _c === void 0 ? void 0 : _c.headers), init === null || init === void 0 ? void 0 : init.headers), { [signeture.key]: this.signerure }) });
|
|
102
|
-
if (this.config.cache === true || this.config.cache) {
|
|
103
|
-
const cache_res = this.getCache(path, httpOption.method);
|
|
104
|
-
if (cache_res) {
|
|
105
|
-
return cache_res.clone();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (httpOption.body) {
|
|
109
|
-
if (!this.token)
|
|
110
|
-
throw new Error("Token not loaded");
|
|
111
|
-
const body = new FormData();
|
|
112
|
-
let _data = {};
|
|
113
|
-
let hasFile = false;
|
|
114
|
-
for (let key in httpOption.body) {
|
|
115
|
-
let ukey = urlpath.encrypt(key);
|
|
116
|
-
if (httpOption.body[key] instanceof File) {
|
|
117
|
-
body.append(ukey, httpOption.body[key]);
|
|
118
|
-
hasFile = true;
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
_data[ukey] = httpOption.body[key];
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
body.append(this.reqkey, crypto.encrypt(_data, this.token));
|
|
125
|
-
if (!hasFile) {
|
|
126
|
-
httpOption.body = new URLSearchParams(body);
|
|
127
|
-
if (!httpOption.headers['Content-Type']) {
|
|
128
|
-
httpOption.headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
if (httpOption.method === "GET") {
|
|
133
|
-
httpOption.method = "POST";
|
|
134
|
-
}
|
|
135
|
-
httpOption.body = body;
|
|
136
|
-
if (!httpOption.headers['Content-Type']) {
|
|
137
|
-
httpOption.headers['Content-Type'] = 'multipart/form-data';
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
const response = await xanFetch(this.path(path), httpOption);
|
|
142
|
-
const res = response.clone();
|
|
143
|
-
const text = await response.text();
|
|
144
|
-
const value = responseValue.decrypt(text, this.signerure);
|
|
145
|
-
if (!response.ok) {
|
|
146
|
-
throw new Error(value);
|
|
147
|
-
}
|
|
148
|
-
res.text = async () => value;
|
|
149
|
-
if ((this.config.cache === true || this.config.cache) && res.ok) {
|
|
150
|
-
this.setCache(path, httpOption.method, res.clone());
|
|
151
|
-
}
|
|
152
|
-
return res;
|
|
153
|
-
}
|
|
154
|
-
async get(path, init) {
|
|
155
|
-
const res = await this.send(path, init);
|
|
156
|
-
return await res.text();
|
|
157
|
-
}
|
|
158
|
-
async post(path, init) {
|
|
159
|
-
const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "POST" }));
|
|
160
|
-
return await res.text();
|
|
161
|
-
}
|
|
162
|
-
async put(path, init) {
|
|
163
|
-
const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "PUT" }));
|
|
164
|
-
return await res.text();
|
|
165
|
-
}
|
|
166
|
-
async delete(path, init) {
|
|
167
|
-
const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "DELETE" }));
|
|
168
|
-
return await res.text();
|
|
169
|
-
}
|
|
170
|
-
}export{SecurequClient as default};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
import{__asyncValues as t}from"tslib";import{getFileId as a,totalChunks as e,chunkFile as s}from"../include/File.mjs";import i from"./Base.mjs";class o extends i{async send(t,a){await this.awaitForHandshake(),a=await this.hooksCall("beforeRequest",t,a)||a;if("/"===(await this.url(t)).pathname)throw new Error("Path is not allowed");for(let t in null==a?void 0:a.body)(null==a?void 0:a.body[t])instanceof File&&(a.body[t]=await this.upload(a.body[t],null==a?void 0:a.onProgress));const e=await this.fetch(t,a);return["Signeture expired","Request expired"].includes(e.data)?(await this.handshake(),await this.send(t,a)):(await this.hooksCall("afterResponse",e),e)}async upload(i,o){var n,l,r,d;await this.awaitForHandshake();const h=await a(i),c=new AbortController,u={filename:(i=await this.hooksCall("beforeUpload",i,h)||i).name,filesize:i.size,filetype:i.type,fileid:h,totalChunks:e(i)},f=async()=>{await this.fetch("/",{method:"PUT",body:Object.assign(Object.assign({},u),{type:"failed"})}),c.abort(),window.removeEventListener("pagehide",f)};window.addEventListener("pagehide",f);const w=await this.fetch("/",{method:"PUT",body:Object.assign(Object.assign({},u),{type:"meta"})});if(!w.success)throw new Error(w.message||"Upload failed");try{for(var p,y=!0,b=t(s(i));!(n=(p=await b.next()).done);){d=p.value,y=!1;try{let{chunk:t,chunkIndex:a}=d;await this.hooksCall("beforeUploadChunk",t,a,u.totalChunks);const e=await this.fetch("/",{method:"PUT",signal:c.signal,body:{chunk:t,chunkIndex:a,fileId:h},onProgress:t=>{if(o){const e=Math.floor((a+1)/u.totalChunks*100),s=Math.floor(t/100/u.totalChunks*100);o(Math.min(e+s,100))}}});if(!e.success)return await f(),e;if(await this.hooksCall("afterUploadChunk",e,a,u.totalChunks),a+1===u.totalChunks){const t={success:!0,message:"File uploaded successfully",data:e.data,code:e.code};return await this.hooksCall("afterUpload",t,i),t}}finally{y=!0}}}catch(t){l={error:t}}finally{try{y||n||!(r=b.return)||await r.call(b)}finally{if(l)throw l.error}}return{success:!1,message:"File upload failed",data:null,code:0}}async get(t,a){return await this.send(t,a)}async post(t,a){return await this.send(t,Object.assign(Object.assign({},a),{method:"POST"}))}async put(t,a){return await this.send(t,Object.assign(Object.assign({},a),{method:"PUT"}))}async delete(t,a){return await this.send(t,Object.assign(Object.assign({},a),{method:"DELETE"}))}}export{o as default};//# sourceMappingURL=index.mjs.map
|
package/client/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/client/index.ts"],"sourcesContent":["import crypto from \"../include/lib/crypto\";\r\nimport signeture from \"../include/signeture\";\r\nimport urlpath from \"../include/lib/urlpath\";\r\nimport { HttpRequestInit, RequestBody, SecurequClientConfig } from \"./types\";\r\nimport xanFetch from 'xanfetch'\r\nimport responseValue from \"../include/responseValue\";\r\nimport SecurequCache from \"../include/lib/cache\";\r\n\r\nclass SecurequClient {\r\n private config: SecurequClientConfig;\r\n private token: string = '';\r\n private tokenLoading: boolean = false;\r\n private Cache = new SecurequCache<Response>({ ttl: 1000 * 60 * 60, limit: 100 });\r\n\r\n private secret: string;\r\n private secret_length: number;\r\n private signerure: string;\r\n private reqkey: string = '';\r\n\r\n constructor(config: SecurequClientConfig) {\r\n this.config = { ...config }\r\n const secret = crypto.makeSecret(config.secret)\r\n this.config.secret = secret;\r\n this.secret_length = secret.length - (Math.floor(Math.random() * 11) + 5);\r\n this.secret = crypto.makeSecret(secret.substring(0, this.secret_length))\r\n this.signerure = signeture.make(this.secret, this.secret);\r\n }\r\n\r\n private setCache(path: string, method: string, response: any) {\r\n const cacheKey = `${method}:${path}`;\r\n if (this.config.cache === true) {\r\n this.Cache.set(cacheKey, response);\r\n } else if (this.config.cache) {\r\n this.config.cache.set(cacheKey, response);\r\n }\r\n }\r\n\r\n private getCache(path: string, method: string,) {\r\n const cacheKey = `${method}:${path}`;\r\n if (this.config.cache === true) {\r\n return this.Cache.get(cacheKey);\r\n } else if (this.config.cache) {\r\n return this.config.cache.get(cacheKey);\r\n }\r\n }\r\n\r\n private PATH_CACHE = new SecurequCache<string>({ ttl: 1000 * 60 * 60, limit: 100 });\r\n private path(path: string) {\r\n let pathKey = path\r\n let has = this.PATH_CACHE.get(pathKey)\r\n if (!has) {\r\n const { search, pathname } = new URL(path, window.location.origin);\r\n const params = new URLSearchParams(search);\r\n const paramsObject = Object.fromEntries(params.entries());\r\n let split = pathname.split(\"/\").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);\r\n path = `${this.config.basepath}/${split.join(\"/\")}`;\r\n if (Object.keys(paramsObject).length) {\r\n for (let key in paramsObject) {\r\n paramsObject[urlpath.encrypt(key)] = paramsObject[key]\r\n delete paramsObject[key]\r\n }\r\n const string = JSON.stringify(paramsObject)\r\n const text = encodeURIComponent(crypto.encrypt(string, this.token));\r\n path += `?${this.reqkey}=${text}`;\r\n }\r\n this.PATH_CACHE.set(pathKey, path);\r\n } else {\r\n path = has\r\n }\r\n return path\r\n }\r\n\r\n private async handshake() {\r\n this.tokenLoading = true;\r\n const res = await xanFetch(this.path(`/handshake`), {\r\n ...this.config?.defaultOptions,\r\n method: \"GET\",\r\n headers: {\r\n ...this.config?.defaultOptions?.headers,\r\n [signeture.key]: this.signerure\r\n },\r\n })\r\n this.tokenLoading = false;\r\n\r\n if (res.ok) {\r\n const txt = await res.text();\r\n const value: any = responseValue.decrypt(txt, this.signerure)\r\n const token = crypto.decrypt(value, this.secret)\r\n this.token = token;\r\n this.reqkey = token.substring(0, token.length / 2);\r\n } else {\r\n throw new Error(\"Handshake failed\");\r\n }\r\n }\r\n\r\n async send(path: string, init?: HttpRequestInit): Promise<Response> {\r\n if (init?.params) {\r\n let url = new URL(path, window.location.origin);\r\n for (let key in init.params) {\r\n url.searchParams.set(key, (init.params as any)[key]);\r\n }\r\n path = url.pathname + url.search;\r\n delete init.params;\r\n }\r\n let url = new URL(path, window.location.origin);\r\n if (url.pathname === '/handshake') {\r\n throw new Error(\"Path is not allowed\")\r\n }\r\n if (this.tokenLoading) {\r\n await new Promise((resolve) => {\r\n const interval = setInterval(() => {\r\n if (!this.tokenLoading) {\r\n clearInterval(interval);\r\n resolve(null);\r\n }\r\n }, 100);\r\n })\r\n }\r\n\r\n if (!this.token) {\r\n await this.handshake();\r\n }\r\n\r\n const httpOption: any = {\r\n method: \"GET\",\r\n ...this.config?.defaultOptions,\r\n ...init,\r\n headers: {\r\n ...this.config?.defaultOptions?.headers,\r\n ...init?.headers,\r\n [signeture.key]: this.signerure\r\n },\r\n }\r\n\r\n if (this.config.cache === true || this.config.cache) {\r\n const cache_res = this.getCache(path, httpOption.method);\r\n if (cache_res) {\r\n return cache_res.clone();\r\n }\r\n }\r\n\r\n if (httpOption.body) {\r\n if (!this.token) throw new Error(\"Token not loaded\")\r\n const body = new FormData();\r\n let _data: any = {}\r\n let hasFile = false;\r\n for (let key in httpOption.body) {\r\n let ukey = urlpath.encrypt(key);\r\n if (httpOption.body[key] instanceof File) {\r\n body.append(ukey, httpOption.body[key]);\r\n hasFile = true;\r\n } else {\r\n _data[ukey] = httpOption.body[key];\r\n }\r\n }\r\n\r\n body.append(this.reqkey, crypto.encrypt(_data, this.token));\r\n\r\n if (!hasFile) {\r\n httpOption.body = new URLSearchParams(body as any);\r\n if (!httpOption.headers['Content-Type']) {\r\n httpOption.headers['Content-Type'] = 'application/x-www-form-urlencoded';\r\n }\r\n } else {\r\n if (httpOption.method === \"GET\") {\r\n httpOption.method = \"POST\"\r\n }\r\n httpOption.body = body\r\n if (!httpOption.headers['Content-Type']) {\r\n httpOption.headers['Content-Type'] = 'multipart/form-data';\r\n }\r\n }\r\n }\r\n\r\n const response = await xanFetch(this.path(path), httpOption);\r\n const res = response.clone();\r\n const text = await response.text();\r\n const value: any = responseValue.decrypt(text, this.signerure)\r\n if (!response.ok) {\r\n throw new Error(value);\r\n }\r\n res.text = async () => value;\r\n if ((this.config.cache === true || this.config.cache) && res.ok) {\r\n this.setCache(path, httpOption.method, res.clone());\r\n }\r\n return res\r\n }\r\n\r\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\r\n const res = await this.send(path, init);\r\n return await res.text()\r\n }\r\n\r\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n const res = await this.send(path, {\r\n ...init,\r\n method: \"POST\",\r\n });\r\n return await res.text();\r\n }\r\n\r\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n const res = await this.send(path, {\r\n ...init,\r\n method: \"PUT\",\r\n });\r\n return await res.text();\r\n }\r\n\r\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\r\n const res = await this.send(path, {\r\n ...init,\r\n method: \"DELETE\",\r\n });\r\n return await res.text();\r\n }\r\n}\r\n\r\nexport default SecurequClient;"],"names":[],"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\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.data)) {\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 controller = new AbortController();\r\n file = await this.hooksCall('beforeUpload', file, fileId) || file;\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),\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 if (!metares.success) {\r\n throw new Error(metares.message || 'Upload failed');\r\n }\r\n\r\n for await (let { chunk, chunkIndex } of chunkFile(file)) {\r\n await this.hooksCall('beforeUploadChunk', chunk, chunkIndex, meta.totalChunks);\r\n const res = await this.fetch('/', {\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 if (!res.success) {\r\n await abort()\r\n return res\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","data","handshake","file","fileId","getFileId","controller","AbortController","meta","filename","name","filesize","size","filetype","type","fileid","totalChunks","abort","async","method","window","removeEventListener","addEventListener","metares","success","message","_f","_d","_e","__asyncValues","chunkFile","_a","next","done","_c","value","chunk","chunkIndex","signal","p","totalProgress","Math","floor","currentProgress","min","info","code","get","post","Object","assign","put"],"mappings":"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"}
|