securequ 1.1.11 → 1.1.13
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.mjs → Base.cjs} +10 -2
- package/client/Base.cjs.map +1 -0
- package/client/Base.js +13 -7
- package/client/Base.js.map +1 -1
- package/client/{index.mjs → index.cjs} +16 -6
- package/client/index.cjs.map +1 -0
- package/client/index.js +14 -6
- package/client/index.js.map +1 -1
- package/include/{File.mjs → File.cjs} +16 -5
- package/include/File.cjs.map +1 -0
- package/include/File.js +12 -6
- package/include/File.js.map +1 -1
- package/include/{FileScaner.mjs → FileScaner.cjs} +6 -1
- package/include/FileScaner.cjs.map +1 -0
- package/include/FileScaner.js +5 -2
- package/include/FileScaner.js.map +1 -1
- package/include/compress.cjs +45 -0
- package/include/compress.cjs.map +1 -0
- package/include/compress.d.ts +1 -1
- package/include/compress.js +33 -9
- package/include/compress.js.map +1 -1
- package/include/crypto.cjs +144 -0
- package/include/crypto.cjs.map +1 -0
- package/include/crypto.d.ts +3 -7
- package/include/crypto.js +97 -66
- package/include/crypto.js.map +1 -1
- package/index.cjs +14 -0
- package/index.cjs.map +1 -0
- package/index.js +5 -1
- package/index.js.map +1 -1
- package/package.json +11 -21
- package/server/{Base.mjs → Base.cjs} +10 -2
- package/server/Base.cjs.map +1 -0
- package/server/Base.js +11 -5
- package/server/Base.js.map +1 -1
- package/server/{Router.mjs → Router.cjs} +10 -3
- package/server/{Router.mjs.map → Router.cjs.map} +1 -1
- package/server/Router.js +8 -3
- package/server/Router.js.map +1 -1
- package/server/{index.mjs → index.cjs} +18 -7
- package/server/index.cjs.map +1 -0
- package/server/index.js +22 -13
- package/server/index.js.map +1 -1
- package/client/Base.mjs.map +0 -1
- package/client/index.mjs.map +0 -1
- package/include/File.mjs.map +0 -1
- package/include/FileScaner.mjs.map +0 -1
- package/include/compress.mjs +0 -19
- package/include/compress.mjs.map +0 -1
- package/include/crypto.mjs +0 -111
- package/include/crypto.mjs.map +0 -1
- package/index.mjs +0 -1
- package/index.mjs.map +0 -1
- package/server/Base.mjs.map +0 -1
- package/server/index.mjs.map +0 -1
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var crypto = require('../include/crypto.cjs');
|
|
4
|
+
var xanFetch = require('xanfetch');
|
|
5
|
+
|
|
6
|
+
const Clients = new Map();
|
|
2
7
|
class Base {
|
|
3
8
|
constructor(config) {
|
|
4
9
|
this.loadingHandshake = false;
|
|
@@ -144,4 +149,7 @@ class Base {
|
|
|
144
149
|
code: res.status
|
|
145
150
|
};
|
|
146
151
|
}
|
|
147
|
-
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
module.exports = Base;
|
|
155
|
+
//# sourceMappingURL=Base.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base.cjs","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 readonly CONTENT_TYPE = \"application/octet-stream\";\r\n\r\n constructor(config: SecurequClientConfig) {\r\n this.config = {\r\n defaultOptions: {},\r\n ...config,\r\n }\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\r\n headers = {\r\n ...this.config?.defaultOptions?.headers,\r\n ...init?.headers,\r\n ...headers,\r\n 'Content-Type': this.CONTENT_TYPE,\r\n \"X-ORIGIN\": url.origin,\r\n \"X-METHOD\": (init?.method || 'GET').toUpperCase()\r\n }\r\n\r\n return headers;\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 key = Math.random().toString(36).substring(2, 8);\r\n const enc = await crypto.encrypt({ params, key }, secret.secret)\r\n url.href = `${url.href}?${key}=${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\r\n return {\r\n success: res.ok,\r\n message: res.ok ? res.statusText : (val || res.statusText),\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":[],"mappings":"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"}
|
package/client/Base.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import crypto from '../include/crypto.js';
|
|
2
|
+
import xanFetch from 'xanfetch';
|
|
3
|
+
|
|
4
|
+
const Clients = new Map();
|
|
2
5
|
class Base {
|
|
3
6
|
constructor(config) {
|
|
4
7
|
this.loadingHandshake = false;
|
|
@@ -22,7 +25,7 @@ class Base {
|
|
|
22
25
|
async getSecret() {
|
|
23
26
|
let full = this.config.secret;
|
|
24
27
|
let secret = full.substring(0, this.secret_length);
|
|
25
|
-
let hash = (await crypto.
|
|
28
|
+
let hash = (await crypto.hash(secret)).substring(0, this.secret_length);
|
|
26
29
|
return { full, secret, hash };
|
|
27
30
|
}
|
|
28
31
|
async url(path) {
|
|
@@ -43,7 +46,7 @@ class Base {
|
|
|
43
46
|
const secret = await this.getSecret();
|
|
44
47
|
let headers = {};
|
|
45
48
|
if (this.handshakeInfo) {
|
|
46
|
-
headers["X-SIGNETURE"] = await crypto.
|
|
49
|
+
headers["X-SIGNETURE"] = await crypto.encrypt({
|
|
47
50
|
signeture: (_a = this.handshakeInfo) === null || _a === void 0 ? void 0 : _a.signeture,
|
|
48
51
|
expire: Date.now() + this.handshakeInfo.timeDiffarenc + 10000 // 10 seconds
|
|
49
52
|
}, secret.secret) || '';
|
|
@@ -111,7 +114,7 @@ class Base {
|
|
|
111
114
|
}
|
|
112
115
|
else {
|
|
113
116
|
const key = Math.random().toString(36).substring(2, 8);
|
|
114
|
-
const enc = await crypto.
|
|
117
|
+
const enc = await crypto.encrypt({ params, key }, secret.secret);
|
|
115
118
|
url.href = `${url.href}?${key}=${encodeURIComponent(enc)}`;
|
|
116
119
|
}
|
|
117
120
|
}
|
|
@@ -121,7 +124,7 @@ class Base {
|
|
|
121
124
|
httpOption.body = JSON.stringify(httpOption.body);
|
|
122
125
|
}
|
|
123
126
|
else {
|
|
124
|
-
httpOption.body = await crypto.
|
|
127
|
+
httpOption.body = await crypto.encryptBuffer(httpOption.body, secret.secret);
|
|
125
128
|
}
|
|
126
129
|
}
|
|
127
130
|
const res = await xanFetch(url.href, httpOption);
|
|
@@ -136,7 +139,7 @@ class Base {
|
|
|
136
139
|
};
|
|
137
140
|
}
|
|
138
141
|
const value = await res.arrayBuffer();
|
|
139
|
-
const val = await crypto.
|
|
142
|
+
const val = await crypto.decryptBuffer(new Uint8Array(value), secret.secret);
|
|
140
143
|
return {
|
|
141
144
|
success: res.ok,
|
|
142
145
|
message: res.ok ? res.statusText : (val || res.statusText),
|
|
@@ -144,4 +147,7 @@ class Base {
|
|
|
144
147
|
code: res.status
|
|
145
148
|
};
|
|
146
149
|
}
|
|
147
|
-
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export { Base as default };
|
|
153
|
+
//# sourceMappingURL=Base.js.map
|
package/client/Base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 readonly CONTENT_TYPE = \"application/octet-stream\";\r\n\r\n constructor(config: SecurequClientConfig) {\r\n this.config = {\r\n defaultOptions: {},\r\n ...config,\r\n }\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\r\n headers = {\r\n ...this.config?.defaultOptions?.headers,\r\n ...init?.headers,\r\n ...headers,\r\n 'Content-Type': this.CONTENT_TYPE,\r\n \"X-ORIGIN\": url.origin,\r\n \"X-METHOD\": (init?.method || 'GET').toUpperCase()\r\n }\r\n\r\n return headers;\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 key = Math.random().toString(36).substring(2, 8);\r\n const enc = await crypto.encrypt({ params, key }, secret.secret)\r\n url.href = `${url.href}?${key}=${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\r\n return {\r\n success: res.ok,\r\n message: res.ok ? res.statusText : (val || res.statusText),\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"],"mappings":"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"}
|
|
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 readonly CONTENT_TYPE = \"application/octet-stream\";\r\n\r\n constructor(config: SecurequClientConfig) {\r\n this.config = {\r\n defaultOptions: {},\r\n ...config,\r\n }\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\r\n headers = {\r\n ...this.config?.defaultOptions?.headers,\r\n ...init?.headers,\r\n ...headers,\r\n 'Content-Type': this.CONTENT_TYPE,\r\n \"X-ORIGIN\": url.origin,\r\n \"X-METHOD\": (init?.method || 'GET').toUpperCase()\r\n }\r\n\r\n return headers;\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 key = Math.random().toString(36).substring(2, 8);\r\n const enc = await crypto.encrypt({ params, key }, secret.secret)\r\n url.href = `${url.href}?${key}=${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\r\n return {\r\n success: res.ok,\r\n message: res.ok ? res.statusText : (val || res.statusText),\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":[],"mappings":"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"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tslib = require('tslib');
|
|
4
|
+
var File$1 = require('../include/File.cjs');
|
|
5
|
+
var Base = require('./Base.cjs');
|
|
6
|
+
var FileScaner = require('../include/FileScaner.cjs');
|
|
7
|
+
|
|
8
|
+
class SecurequClient extends Base {
|
|
2
9
|
async send(path, init) {
|
|
3
10
|
await this.awaitForHandshake();
|
|
4
11
|
init = await this.hooksCall('beforeRequest', path, init) || init;
|
|
@@ -22,7 +29,7 @@ import {__asyncValues}from'tslib';import {getFileId,totalChunks,chunkFile}from'.
|
|
|
22
29
|
var _a, e_1, _b, _c;
|
|
23
30
|
var _d, _e, _f;
|
|
24
31
|
await this.awaitForHandshake();
|
|
25
|
-
const fileId = await getFileId(file);
|
|
32
|
+
const fileId = await File$1.getFileId(file);
|
|
26
33
|
const controller = new AbortController();
|
|
27
34
|
let _file = await this.hooksCall('beforeUpload', file, fileId) || file;
|
|
28
35
|
const maxFileSize = (_d = this.handshakeInfo) === null || _d === void 0 ? void 0 : _d.maxFileSize;
|
|
@@ -36,7 +43,7 @@ import {__asyncValues}from'tslib';import {getFileId,totalChunks,chunkFile}from'.
|
|
|
36
43
|
name: _file.name,
|
|
37
44
|
size: _file.size,
|
|
38
45
|
type: _file.type,
|
|
39
|
-
totalChunks: totalChunks(_file, chunkSize),
|
|
46
|
+
totalChunks: File$1.totalChunks(_file, chunkSize),
|
|
40
47
|
chunkIndex: 0,
|
|
41
48
|
isFinish: false
|
|
42
49
|
};
|
|
@@ -47,12 +54,12 @@ import {__asyncValues}from'tslib';import {getFileId,totalChunks,chunkFile}from'.
|
|
|
47
54
|
};
|
|
48
55
|
window.addEventListener("pagehide", abort);
|
|
49
56
|
try {
|
|
50
|
-
for (var _g = true, _h = __asyncValues(chunkFile(_file, chunkSize)), _j; _j = await _h.next(), _a = _j.done, !_a;) {
|
|
57
|
+
for (var _g = true, _h = tslib.__asyncValues(File$1.chunkFile(_file, chunkSize)), _j; _j = await _h.next(), _a = _j.done, !_a;) {
|
|
51
58
|
_c = _j.value;
|
|
52
59
|
_g = false;
|
|
53
60
|
try {
|
|
54
61
|
let { chunk, chunkIndex } = _c;
|
|
55
|
-
if (chunkIndex === 0 && ((_f = this.handshakeInfo) === null || _f === void 0 ? void 0 : _f.checkFileType) && !
|
|
62
|
+
if (chunkIndex === 0 && ((_f = this.handshakeInfo) === null || _f === void 0 ? void 0 : _f.checkFileType) && !FileScaner(chunk)) {
|
|
56
63
|
await abort();
|
|
57
64
|
return {
|
|
58
65
|
success: false,
|
|
@@ -136,4 +143,7 @@ import {__asyncValues}from'tslib';import {getFileId,totalChunks,chunkFile}from'.
|
|
|
136
143
|
async delete(path, init) {
|
|
137
144
|
return await this.send(path, Object.assign(Object.assign({}, init), { method: "DELETE" }));
|
|
138
145
|
}
|
|
139
|
-
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
module.exports = SecurequClient;
|
|
149
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","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\nimport { UploadFileMeta } from \"../server/types\";\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.uploadFile(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 uploadFile(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\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\r\n const chunkSize = this.handshakeInfo?.chunkSize\r\n\r\n // send metadata\r\n const filemeta: UploadFileMeta = {\r\n fileId: fileId,\r\n name: _file.name,\r\n size: _file.size,\r\n type: _file.type,\r\n totalChunks: totalChunks(_file, chunkSize),\r\n chunkIndex: 0,\r\n isFinish: false\r\n }\r\n\r\n const abort = async () => {\r\n await this.deleteFile(fileId);\r\n controller.abort();\r\n window.removeEventListener(\"pagehide\", abort);\r\n }\r\n\r\n window.addEventListener(\"pagehide\", abort);\r\n\r\n for await (let { chunk, chunkIndex } of chunkFile(_file, chunkSize)) {\r\n if (chunkIndex === 0 && this.handshakeInfo?.checkFileType && !fileScaner(chunk)) {\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 filemeta.chunkIndex = chunkIndex;\r\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\r\n\r\n const info: any = {\r\n method: 'PUT',\r\n signal: controller.signal,\r\n body: {\r\n chunk,\r\n filemeta\r\n },\r\n onProgress: (p: number) => {\r\n if (onProgress) {\r\n const totalProgress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\r\n const currentProgress = Math.floor((p / 100) / filemeta.totalChunks * 100)\r\n onProgress(Math.min(totalProgress + currentProgress, 100))\r\n }\r\n }\r\n }\r\n await this.hooksCall('beforeUploadChunk', chunk, filemeta);\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(res.message)) {\r\n await this.handshake();\r\n window.removeEventListener(\"pagehide\", abort);\r\n res = await this.uploadFile(file, onProgress);\r\n } else {\r\n await abort()\r\n return res\r\n }\r\n }\r\n await this.hooksCall('afterUploadChunk', res, filemeta);\r\n }\r\n\r\n window.removeEventListener(\"pagehide\", abort);\r\n\r\n const info = {\r\n success: true,\r\n message: 'File uploaded successfully',\r\n data: filemeta,\r\n code: 200\r\n }\r\n await this.hooksCall('afterUpload', info, _file);\r\n return info\r\n }\r\n\r\n async deleteFile(fileId: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse> {\r\n await this.awaitForHandshake();\r\n const res = await this.fetch('/', {\r\n ...init,\r\n method: 'DELETE',\r\n body: { fileId }\r\n });\r\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\r\n await this.handshake();\r\n return await this.deleteFile(fileId, init);\r\n }\r\n return res;\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":["getFileId","totalChunks","__asyncValues","chunkFile","fileScaner"],"mappings":";;;;;;;AAMA,MAAM,cAAe,SAAQ,IAAI,CAAA;AAE9B,IAAA,MAAM,IAAI,CAAC,IAAY,EAAE,IAAsB,EAAA;AAC5C,QAAA,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC/B,QAAA,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAChC,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QAEhE,KAAK,IAAI,GAAG,IAAI,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,IAAI,EAAE;AACzB,YAAA,IAAI,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,IAAI,CAAC,GAAG,CAAC,aAAY,IAAI,EAAE;gBAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,UAAU,CAAC,CAAA;AAC1E,YAAA,CAAA;AACH,QAAA,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACjE,YAAA,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,CAAA;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAC3C,QAAA,OAAO,GAAG,CAAC;IACd,CAAC;AAED,IAAA,MAAM,UAAU,CAAC,IAAU,EAAE,UAAgC,EAAA;;;AAC1D,QAAA,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAG,MAAMA,gBAAS,CAAC,IAAI,CAAC,CAAC;AACrC,QAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;AAEzC,QAAA,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;QACvE,MAAM,WAAW,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,CAAA;QACnD,IAAI,WAAW,IAAI,KAAK,CAAC,IAAI,GAAG,WAAW,GAAG,IAAI,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,CAAA,+BAAA,EAAkC,WAAW,GAAG,IAAI,CAAA,GAAA,CAAK,CAAC,CAAA;AAC5E,QAAA,CAAA;QAED,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,CAAA;;AAG/C,QAAA,MAAM,QAAQ,GAAmB;AAC9B,YAAA,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,YAAA,WAAW,EAAEC,kBAAW,CAAC,KAAK,EAAE,SAAS,CAAC;AAC1C,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,QAAQ,EAAE,KAAK;SACjB,CAAA;AAED,QAAA,MAAM,KAAK,GAAG,YAAW;AACtB,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;AACnB,YAAA,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AACjD,QAAA,CAAC,CAAA;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;;YAE3C,KAAwC,IAAA,EAAA,GAAA,IAAA,EAAA,EAAA,GAAAC,mBAAA,CAAAC,gBAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA,EAAA,EAAA,EAAA,EAAA,GAAA,MAAA,EAAA,CAAA,IAAA,EAAA,EAAA,EAAA,GAAA,EAAA,CAAA,IAAA,EAAA,CAAA,EAAA,GAAA;gBAA3B,EAAA,GAAA,EAAA,CAAA,KAAA,CAA2B;gBAA3B,EAAA,GAAA,KAAA,CAA2B;;AAAxD,oBAAA,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAA,CAAA;AACjC,oBAAA,IAAI,UAAU,KAAK,CAAC,KAAI,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,aAAa,CAAA,IAAI,CAACC,UAAU,CAAC,KAAK,CAAC,EAAE;wBAC9E,MAAM,KAAK,EAAE,CAAA;wBACb,OAAO;AACJ,4BAAA,OAAO,EAAE,KAAK;AACd,4BAAA,OAAO,EAAE,kCAAkC;AAC3C,4BAAA,IAAI,EAAE,IAAI;AACV,4BAAA,IAAI,EAAE,CAAC;yBACT,CAAA;AACH,oBAAA,CAAA;AAED,oBAAA,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;oBACjC,QAAQ,CAAC,QAAQ,GAAG,UAAU,GAAG,CAAC,KAAK,QAAQ,CAAC,WAAW,CAAC;AAE5D,oBAAA,MAAM,IAAI,GAAQ;AACf,wBAAA,MAAM,EAAE,KAAK;wBACb,MAAM,EAAE,UAAU,CAAC,MAAM;AACzB,wBAAA,IAAI,EAAE;4BACH,KAAK;4BACL,QAAQ;AACV,yBAAA;AACD,wBAAA,UAAU,EAAE,CAAC,CAAS,KAAI;AACvB,4BAAA,IAAI,UAAU,EAAE;gCACb,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC,CAAA;AACjF,gCAAA,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC,CAAA;AAC1E,gCAAA,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5D,4BAAA,CAAA;wBACJ,CAAC;qBACH,CAAA;oBACD,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAE3D,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AAErC,oBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AACf,wBAAA,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACjE,4BAAA,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;AACvB,4BAAA,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;4BAC9C,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAChD,wBAAA,CAAA;AAAM,6BAAA;4BACJ,MAAM,KAAK,EAAE,CAAA;AACb,4BAAA,OAAO,GAAG,CAAA;AACZ,wBAAA,CAAA;AACH,oBAAA,CAAA;oBACD,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;;;;;AAC1D,YAAA,CAAA;;;;;;;;;AAED,QAAA,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAE9C,QAAA,MAAM,IAAI,GAAG;AACV,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,OAAO,EAAE,4BAA4B;AACrC,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,IAAI,EAAE,GAAG;SACX,CAAA;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACjD,QAAA,OAAO,IAAI,CAAA;IACd,CAAC;AAED,IAAA,MAAM,UAAU,CAAC,MAAc,EAAE,IAA+C,EAAA;AAC7E,QAAA,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC1B,IAAI,KACP,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,EAAE,MAAM,EAAE,EAAA,CAAA,CACjB,CAAC;AACH,QAAA,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACjE,YAAA,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC7C,QAAA,CAAA;AACD,QAAA,OAAO,GAAG,CAAC;IACd,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,IAAY,EAAE,IAA+C,EAAA;QACpE,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;AAED,IAAA,MAAM,IAAI,CAAC,IAAY,EAAE,IAAsC,EAAA;AAC5D,QAAA,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAO,IAAI,CAAA,EAAA,EAAE,MAAM,EAAE,MAAM,IAAG,CAAC;IAC7D,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,IAAY,EAAE,IAAsC,EAAA;AAC3D,QAAA,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAO,IAAI,CAAA,EAAA,EAAE,MAAM,EAAE,KAAK,IAAG,CAAC;IAC5D,CAAC;AAED,IAAA,MAAM,MAAM,CAAC,IAAY,EAAE,IAAsC,EAAA;AAC9D,QAAA,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAO,IAAI,CAAA,EAAA,EAAE,MAAM,EAAE,QAAQ,IAAG,CAAC;IAC/D,CAAC;AAEH;;;;"}
|
package/client/index.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { __asyncValues } from 'tslib';
|
|
2
|
+
import { getFileId, totalChunks, chunkFile } from '../include/File.js';
|
|
3
|
+
import Base from './Base.js';
|
|
4
|
+
import fileScaner from '../include/FileScaner.js';
|
|
5
|
+
|
|
6
|
+
class SecurequClient extends Base {
|
|
2
7
|
async send(path, init) {
|
|
3
8
|
await this.awaitForHandshake();
|
|
4
9
|
init = await this.hooksCall('beforeRequest', path, init) || init;
|
|
@@ -22,7 +27,7 @@
|
|
|
22
27
|
var _a, e_1, _b, _c;
|
|
23
28
|
var _d, _e, _f;
|
|
24
29
|
await this.awaitForHandshake();
|
|
25
|
-
const fileId = await
|
|
30
|
+
const fileId = await getFileId(file);
|
|
26
31
|
const controller = new AbortController();
|
|
27
32
|
let _file = await this.hooksCall('beforeUpload', file, fileId) || file;
|
|
28
33
|
const maxFileSize = (_d = this.handshakeInfo) === null || _d === void 0 ? void 0 : _d.maxFileSize;
|
|
@@ -36,7 +41,7 @@
|
|
|
36
41
|
name: _file.name,
|
|
37
42
|
size: _file.size,
|
|
38
43
|
type: _file.type,
|
|
39
|
-
totalChunks:
|
|
44
|
+
totalChunks: totalChunks(_file, chunkSize),
|
|
40
45
|
chunkIndex: 0,
|
|
41
46
|
isFinish: false
|
|
42
47
|
};
|
|
@@ -47,12 +52,12 @@
|
|
|
47
52
|
};
|
|
48
53
|
window.addEventListener("pagehide", abort);
|
|
49
54
|
try {
|
|
50
|
-
for (var _g = true, _h =
|
|
55
|
+
for (var _g = true, _h = __asyncValues(chunkFile(_file, chunkSize)), _j; _j = await _h.next(), _a = _j.done, !_a;) {
|
|
51
56
|
_c = _j.value;
|
|
52
57
|
_g = false;
|
|
53
58
|
try {
|
|
54
59
|
let { chunk, chunkIndex } = _c;
|
|
55
|
-
if (chunkIndex === 0 && ((_f = this.handshakeInfo) === null || _f === void 0 ? void 0 : _f.checkFileType) && !
|
|
60
|
+
if (chunkIndex === 0 && ((_f = this.handshakeInfo) === null || _f === void 0 ? void 0 : _f.checkFileType) && !fileScaner(chunk)) {
|
|
56
61
|
await abort();
|
|
57
62
|
return {
|
|
58
63
|
success: false,
|
|
@@ -136,4 +141,7 @@
|
|
|
136
141
|
async delete(path, init) {
|
|
137
142
|
return await this.send(path, Object.assign(Object.assign({}, init), { method: "DELETE" }));
|
|
138
143
|
}
|
|
139
|
-
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export { SecurequClient as default };
|
|
147
|
+
//# 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 { HttpRequestInit, SecurequClientResponse } from \"./types\";\r\nimport { chunkFile, getFileId, totalChunks } from \"../include/File\";\r\nimport Base from \"./Base\";\r\nimport fileScaner from '../include/FileScaner';\r\nimport { UploadFileMeta } from \"../server/types\";\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.uploadFile(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 uploadFile(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\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\r\n const chunkSize = this.handshakeInfo?.chunkSize\r\n\r\n // send metadata\r\n const filemeta: UploadFileMeta = {\r\n fileId: fileId,\r\n name: _file.name,\r\n size: _file.size,\r\n type: _file.type,\r\n totalChunks: totalChunks(_file, chunkSize),\r\n chunkIndex: 0,\r\n isFinish: false\r\n }\r\n\r\n const abort = async () => {\r\n await this.deleteFile(fileId);\r\n controller.abort();\r\n window.removeEventListener(\"pagehide\", abort);\r\n }\r\n\r\n window.addEventListener(\"pagehide\", abort);\r\n\r\n for await (let { chunk, chunkIndex } of chunkFile(_file, chunkSize)) {\r\n if (chunkIndex === 0 && this.handshakeInfo?.checkFileType && !fileScaner(chunk)) {\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 filemeta.chunkIndex = chunkIndex;\r\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\r\n\r\n const info: any = {\r\n method: 'PUT',\r\n signal: controller.signal,\r\n body: {\r\n chunk,\r\n filemeta\r\n },\r\n onProgress: (p: number) => {\r\n if (onProgress) {\r\n const totalProgress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\r\n const currentProgress = Math.floor((p / 100) / filemeta.totalChunks * 100)\r\n onProgress(Math.min(totalProgress + currentProgress, 100))\r\n }\r\n }\r\n }\r\n await this.hooksCall('beforeUploadChunk', chunk, filemeta);\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(res.message)) {\r\n await this.handshake();\r\n window.removeEventListener(\"pagehide\", abort);\r\n res = await this.uploadFile(file, onProgress);\r\n } else {\r\n await abort()\r\n return res\r\n }\r\n }\r\n await this.hooksCall('afterUploadChunk', res, filemeta);\r\n }\r\n\r\n window.removeEventListener(\"pagehide\", abort);\r\n\r\n const info = {\r\n success: true,\r\n message: 'File uploaded successfully',\r\n data: filemeta,\r\n code: 200\r\n }\r\n await this.hooksCall('afterUpload', info, _file);\r\n return info\r\n }\r\n\r\n async deleteFile(fileId: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse> {\r\n await this.awaitForHandshake();\r\n const res = await this.fetch('/', {\r\n ...init,\r\n method: 'DELETE',\r\n body: { fileId }\r\n });\r\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\r\n await this.handshake();\r\n return await this.deleteFile(fileId, init);\r\n }\r\n return res;\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":["Base","getFileId","totalChunks","__asyncValues","chunkFile","fileScaner"],"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\nimport { UploadFileMeta } from \"../server/types\";\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.uploadFile(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 uploadFile(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\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\r\n const chunkSize = this.handshakeInfo?.chunkSize\r\n\r\n // send metadata\r\n const filemeta: UploadFileMeta = {\r\n fileId: fileId,\r\n name: _file.name,\r\n size: _file.size,\r\n type: _file.type,\r\n totalChunks: totalChunks(_file, chunkSize),\r\n chunkIndex: 0,\r\n isFinish: false\r\n }\r\n\r\n const abort = async () => {\r\n await this.deleteFile(fileId);\r\n controller.abort();\r\n window.removeEventListener(\"pagehide\", abort);\r\n }\r\n\r\n window.addEventListener(\"pagehide\", abort);\r\n\r\n for await (let { chunk, chunkIndex } of chunkFile(_file, chunkSize)) {\r\n if (chunkIndex === 0 && this.handshakeInfo?.checkFileType && !fileScaner(chunk)) {\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 filemeta.chunkIndex = chunkIndex;\r\n filemeta.isFinish = chunkIndex + 1 === filemeta.totalChunks;\r\n\r\n const info: any = {\r\n method: 'PUT',\r\n signal: controller.signal,\r\n body: {\r\n chunk,\r\n filemeta\r\n },\r\n onProgress: (p: number) => {\r\n if (onProgress) {\r\n const totalProgress = Math.floor(((chunkIndex + 1) / filemeta.totalChunks) * 100)\r\n const currentProgress = Math.floor((p / 100) / filemeta.totalChunks * 100)\r\n onProgress(Math.min(totalProgress + currentProgress, 100))\r\n }\r\n }\r\n }\r\n await this.hooksCall('beforeUploadChunk', chunk, filemeta);\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(res.message)) {\r\n await this.handshake();\r\n window.removeEventListener(\"pagehide\", abort);\r\n res = await this.uploadFile(file, onProgress);\r\n } else {\r\n await abort()\r\n return res\r\n }\r\n }\r\n await this.hooksCall('afterUploadChunk', res, filemeta);\r\n }\r\n\r\n window.removeEventListener(\"pagehide\", abort);\r\n\r\n const info = {\r\n success: true,\r\n message: 'File uploaded successfully',\r\n data: filemeta,\r\n code: 200\r\n }\r\n await this.hooksCall('afterUpload', info, _file);\r\n return info\r\n }\r\n\r\n async deleteFile(fileId: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<SecurequClientResponse> {\r\n await this.awaitForHandshake();\r\n const res = await this.fetch('/', {\r\n ...init,\r\n method: 'DELETE',\r\n body: { fileId }\r\n });\r\n if ([\"Signeture expired\", \"Request expired\"].includes(res.message)) {\r\n await this.handshake();\r\n return await this.deleteFile(fileId, init);\r\n }\r\n return res;\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":[],"mappings":"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"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tslib = require('tslib');
|
|
4
|
+
var crypto = require('./crypto.cjs');
|
|
5
|
+
|
|
6
|
+
function getChunkSize(fileSize) {
|
|
2
7
|
// fileSize in bytes
|
|
3
8
|
const MB = 1024 * 1024;
|
|
4
9
|
if (fileSize <= 1 * MB) {
|
|
@@ -28,14 +33,14 @@ import {__asyncGenerator,__await}from'tslib';import crypto from'./crypto.mjs';fu
|
|
|
28
33
|
}
|
|
29
34
|
const totalChunks = (file, chunkSize) => Math.ceil(file.size / (chunkSize || getChunkSize(file.size)));
|
|
30
35
|
function chunkFile(file, chunkSize) {
|
|
31
|
-
return __asyncGenerator(this, arguments, function* chunkFile_1() {
|
|
36
|
+
return tslib.__asyncGenerator(this, arguments, function* chunkFile_1() {
|
|
32
37
|
const fileSize = file.size;
|
|
33
38
|
chunkSize = chunkSize || getChunkSize(fileSize);
|
|
34
39
|
let offset = 0;
|
|
35
40
|
while (offset < fileSize) {
|
|
36
41
|
const chunk = file.slice(offset, offset + chunkSize);
|
|
37
|
-
const buffer = new Uint8Array(yield __await(chunk.arrayBuffer()));
|
|
38
|
-
yield yield __await({ chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) });
|
|
42
|
+
const buffer = new Uint8Array(yield tslib.__await(chunk.arrayBuffer()));
|
|
43
|
+
yield yield tslib.__await({ chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) });
|
|
39
44
|
offset += chunkSize;
|
|
40
45
|
}
|
|
41
46
|
});
|
|
@@ -57,4 +62,10 @@ async function getFileId(file) {
|
|
|
57
62
|
const ext = file.name.split('.').pop() || '';
|
|
58
63
|
const id = await crypto.hash(meta);
|
|
59
64
|
return `${id}.${ext}`;
|
|
60
|
-
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
exports.chunkFile = chunkFile;
|
|
68
|
+
exports.getChunkSize = getChunkSize;
|
|
69
|
+
exports.getFileId = getFileId;
|
|
70
|
+
exports.totalChunks = totalChunks;
|
|
71
|
+
//# sourceMappingURL=File.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"File.cjs","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\r\n\r\nexport function getChunkSize(fileSize: number): number {\r\n // fileSize in bytes\r\n const MB = 1024 * 1024;\r\n\r\n if (fileSize <= 1 * MB) {\r\n // Very small files (<1MB): single small chunk\r\n return 64 * 1024; // 64 KB\r\n } else if (fileSize <= 10 * MB) {\r\n // Small files (1–10MB): medium chunks\r\n return 256 * 1024; // 256 KB\r\n } else if (fileSize <= 100 * MB) {\r\n // Medium files (10–100MB): faster upload, moderate size\r\n return 512 * 1024; // 512 KB\r\n } else if (fileSize <= 500 * MB) {\r\n // Large files (100–500MB): larger chunks to reduce overhead\r\n return 1 * MB; // 1 MB\r\n } else if (fileSize <= 2 * 1024 * MB) {\r\n // Very large files (500MB–2GB): fewer but larger parts\r\n return 2 * MB; // 2 MB\r\n } else {\r\n // Extremely large files (>2GB)\r\n return 4 * MB; // 4 MB max chunk size\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 let data: any[] = [];\r\n if (typeof window !== 'undefined') {\r\n 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 ]\r\n }\r\n\r\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data.join(\"||\")}`\r\n const ext = file.name.split('.').pop() || ''\r\n const id = await crypto.hash(meta);\r\n return `${id}.${ext}`;\r\n}"],"names":["__await"],"mappings":"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"}
|
package/include/File.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { __asyncGenerator, __await } from 'tslib';
|
|
2
|
+
import crypto from './crypto.js';
|
|
3
|
+
|
|
4
|
+
function getChunkSize(fileSize) {
|
|
2
5
|
// fileSize in bytes
|
|
3
6
|
const MB = 1024 * 1024;
|
|
4
7
|
if (fileSize <= 1 * MB) {
|
|
@@ -28,14 +31,14 @@
|
|
|
28
31
|
}
|
|
29
32
|
const totalChunks = (file, chunkSize) => Math.ceil(file.size / (chunkSize || getChunkSize(file.size)));
|
|
30
33
|
function chunkFile(file, chunkSize) {
|
|
31
|
-
return
|
|
34
|
+
return __asyncGenerator(this, arguments, function* chunkFile_1() {
|
|
32
35
|
const fileSize = file.size;
|
|
33
36
|
chunkSize = chunkSize || getChunkSize(fileSize);
|
|
34
37
|
let offset = 0;
|
|
35
38
|
while (offset < fileSize) {
|
|
36
39
|
const chunk = file.slice(offset, offset + chunkSize);
|
|
37
|
-
const buffer = new Uint8Array(yield
|
|
38
|
-
yield yield
|
|
40
|
+
const buffer = new Uint8Array(yield __await(chunk.arrayBuffer()));
|
|
41
|
+
yield yield __await({ chunk: buffer, chunkIndex: Math.floor(offset / chunkSize) });
|
|
39
42
|
offset += chunkSize;
|
|
40
43
|
}
|
|
41
44
|
});
|
|
@@ -55,6 +58,9 @@ async function getFileId(file) {
|
|
|
55
58
|
}
|
|
56
59
|
const meta = `${file.name}||${file.size}||${file.lastModified}||${data.join("||")}`;
|
|
57
60
|
const ext = file.name.split('.').pop() || '';
|
|
58
|
-
const id = await crypto.
|
|
61
|
+
const id = await crypto.hash(meta);
|
|
59
62
|
return `${id}.${ext}`;
|
|
60
|
-
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { chunkFile, getChunkSize, getFileId, totalChunks };
|
|
66
|
+
//# sourceMappingURL=File.js.map
|
package/include/File.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"File.js","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\r\n\r\nexport function getChunkSize(fileSize: number): number {\r\n // fileSize in bytes\r\n const MB = 1024 * 1024;\r\n\r\n if (fileSize <= 1 * MB) {\r\n // Very small files (<1MB): single small chunk\r\n return 64 * 1024; // 64 KB\r\n } else if (fileSize <= 10 * MB) {\r\n // Small files (1–10MB): medium chunks\r\n return 256 * 1024; // 256 KB\r\n } else if (fileSize <= 100 * MB) {\r\n // Medium files (10–100MB): faster upload, moderate size\r\n return 512 * 1024; // 512 KB\r\n } else if (fileSize <= 500 * MB) {\r\n // Large files (100–500MB): larger chunks to reduce overhead\r\n return 1 * MB; // 1 MB\r\n } else if (fileSize <= 2 * 1024 * MB) {\r\n // Very large files (500MB–2GB): fewer but larger parts\r\n return 2 * MB; // 2 MB\r\n } else {\r\n // Extremely large files (>2GB)\r\n return 4 * MB; // 4 MB max chunk size\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 let data: any[] = [];\r\n if (typeof window !== 'undefined') {\r\n 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 ]\r\n }\r\n\r\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data.join(\"||\")}`\r\n const ext = file.name.split('.').pop() || ''\r\n const id = await crypto.hash(meta);\r\n return `${id}.${ext}`;\r\n}"],"names":[
|
|
1
|
+
{"version":3,"file":"File.js","sources":["../../src/include/File.ts"],"sourcesContent":["import crypto from \"./crypto\";\r\n\r\nexport function getChunkSize(fileSize: number): number {\r\n // fileSize in bytes\r\n const MB = 1024 * 1024;\r\n\r\n if (fileSize <= 1 * MB) {\r\n // Very small files (<1MB): single small chunk\r\n return 64 * 1024; // 64 KB\r\n } else if (fileSize <= 10 * MB) {\r\n // Small files (1–10MB): medium chunks\r\n return 256 * 1024; // 256 KB\r\n } else if (fileSize <= 100 * MB) {\r\n // Medium files (10–100MB): faster upload, moderate size\r\n return 512 * 1024; // 512 KB\r\n } else if (fileSize <= 500 * MB) {\r\n // Large files (100–500MB): larger chunks to reduce overhead\r\n return 1 * MB; // 1 MB\r\n } else if (fileSize <= 2 * 1024 * MB) {\r\n // Very large files (500MB–2GB): fewer but larger parts\r\n return 2 * MB; // 2 MB\r\n } else {\r\n // Extremely large files (>2GB)\r\n return 4 * MB; // 4 MB max chunk size\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 let data: any[] = [];\r\n if (typeof window !== 'undefined') {\r\n 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 ]\r\n }\r\n\r\n const meta = `${file.name}||${file.size}||${file.lastModified}||${data.join(\"||\")}`\r\n const ext = file.name.split('.').pop() || ''\r\n const id = await crypto.hash(meta);\r\n return `${id}.${ext}`;\r\n}"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Mega raw file-type detection from first chunk (magic bytes)
|
|
3
5
|
* Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.
|
|
@@ -92,4 +94,7 @@ function fileScaner(chunk) {
|
|
|
92
94
|
return { valid: true, ext: "pdf", mime: "application/pdf" }; // alternate PDF
|
|
93
95
|
if (match([0x42, 0x50, 0x47, 0x0D]))
|
|
94
96
|
return { valid: true, ext: "bpg", mime: "image/bpg" }; // BPG
|
|
95
|
-
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
module.exports = fileScaner;
|
|
100
|
+
//# sourceMappingURL=FileScaner.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileScaner.cjs","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\nfunction 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":[],"mappings":"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"}
|
package/include/FileScaner.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
2
|
* Mega raw file-type detection from first chunk (magic bytes)
|
|
3
3
|
* Supports 100+ common file types: images, audio, video, docs, archives, installers, fonts, binaries.
|
|
4
4
|
*/
|
|
@@ -92,4 +92,7 @@ function fileScaner(chunk) {
|
|
|
92
92
|
return { valid: true, ext: "pdf", mime: "application/pdf" }; // alternate PDF
|
|
93
93
|
if (match([0x42, 0x50, 0x47, 0x0D]))
|
|
94
94
|
return { valid: true, ext: "bpg", mime: "image/bpg" }; // BPG
|
|
95
|
-
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export { fileScaner as default };
|
|
98
|
+
//# sourceMappingURL=FileScaner.js.map
|