securequ 1.1.0 → 1.1.1
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 +18 -22
- package/client/Base.js +1 -1
- package/client/Base.js.map +1 -1
- package/client/Base.mjs +1 -1
- package/client/Base.mjs.map +1 -1
- package/client/index.d.ts +7 -7
- package/client/index.js +1 -1
- package/client/index.js.map +1 -1
- package/client/index.mjs +1 -1
- package/client/index.mjs.map +1 -1
- package/client/types.d.ts +35 -30
- package/include/File.js +1 -1
- package/include/File.js.map +1 -1
- package/include/File.mjs +1 -1
- package/include/File.mjs.map +1 -1
- package/include/FileScaner.js +1 -0
- package/include/FileScaner.js.map +1 -0
- package/include/FileScaner.mjs +1 -0
- package/include/FileScaner.mjs.map +1 -0
- package/include/compress.js.map +1 -1
- package/include/compress.mjs.map +1 -1
- package/include/crypto.js.map +1 -1
- package/include/crypto.mjs.map +1 -1
- package/package.json +2 -2
- package/readme.md +54 -54
- package/server/Base.d.ts +19 -19
- package/server/Base.js +1 -1
- package/server/Base.js.map +1 -1
- package/server/Base.mjs +1 -1
- package/server/Base.mjs.map +1 -1
- package/server/Router.d.ts +7 -7
- package/server/Router.js.map +1 -1
- package/server/Router.mjs.map +1 -1
- package/server/index.d.ts +4 -4
- package/server/index.js +1 -1
- package/server/index.js.map +1 -1
- package/server/index.mjs +1 -1
- package/server/index.mjs.map +1 -1
- package/server/types.d.ts +63 -60
package/include/compress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compress.js","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\
|
|
1
|
+
{"version":3,"file":"compress.js","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\nimport sodium from 'libsodium-wrappers';\nimport { unpack, pack } from 'msgpackr';\n\nexport async function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nexport async function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nexport async function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nexport async function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n"],"names":["exports","compressBuffer","async","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack"],"mappings":"kJAcAA,QAAAC,eAVOC,eAA8BC,SAC5BC,EAAOC,MACb,MAAMC,EAASC,EAAAA,KAAKJ,GACpB,OAAOK,EAAAA,aAAaF,EACvB,EAMAN,QAAAS,iBAJOP,eAAgCC,SAC9BC,EAAOC,MACb,MAAMK,EAAWC,EAAAA,eAAeR,GAChC,OAAOS,EAAAA,OAAOF,EACjB"}
|
package/include/compress.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compress.mjs","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\
|
|
1
|
+
{"version":3,"file":"compress.mjs","sources":["../../src/include/compress.ts"],"sourcesContent":["import { compressSync, decompressSync } from 'fflate';\nimport sodium from 'libsodium-wrappers';\nimport { unpack, pack } from 'msgpackr';\n\nexport async function compressBuffer(input: any) {\n await sodium.ready\n const encode = pack(input);\n return compressSync(encode);\n}\n\nexport async function decompressBuffer(input: Uint8Array | Buffer) {\n await sodium.ready\n const compress = decompressSync(input);\n return unpack(compress);\n}\n\nexport async function compress(input: any) {\n const compressed = await compressBuffer(input);\n return sodium.to_base64(compressed, sodium.base64_variants.ORIGINAL);\n}\n\nexport async function decompress(base64Str: string) {\n const compressed = sodium.from_base64(base64Str, sodium.base64_variants.ORIGINAL);\n return await decompressBuffer(compressed);\n}\n"],"names":["async","compressBuffer","input","sodium","ready","encode","pack","compressSync","decompressBuffer","compress","decompressSync","unpack"],"mappings":"wIAIOA,eAAeC,EAAeC,SAC5BC,EAAOC,MACb,MAAMC,EAASC,EAAKJ,GACpB,OAAOK,EAAaF,EACvB,CAEOL,eAAeQ,EAAiBN,SAC9BC,EAAOC,MACb,MAAMK,EAAWC,EAAeR,GAChC,OAAOS,EAAOF,EACjB,QAAAR,oBAAAO"}
|
package/include/crypto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\
|
|
1
|
+
{"version":3,"file":"crypto.js","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport { compressBuffer, decompressBuffer } from \"./compress\";\n\nexport type EncryptInput = string | object | any[];\n\n/** --- Key/Nonce Derivation --- */\nfunction deriveKey(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_KEYBYTES,\n sodium.from_string(secret)\n );\n}\n\nfunction deriveNonce(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_NONCEBYTES,\n sodium.from_string(secret)\n );\n}\n\n/** --- STRING --- */\nexport async function encrypt(input: EncryptInput, secret: string): Promise<string> {\n const encrypted = await encryptBuffer(input, secret);\n return sodium.to_base64(encrypted);\n}\n\nexport async function decrypt(base64: string, secret: string): Promise<any | null> {\n const cipher = sodium.from_base64(base64);\n return await decryptBuffer(cipher, secret);\n}\n\n/** --- BUFFER --- */\n// Encrypt\nexport async function encryptBuffer(input: any, secret: string): Promise<Uint8Array> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n const compressed = await compressBuffer(input);\n return sodium.crypto_secretbox_easy(compressed, nonce, key);\n}\n\n// Decrypt\nexport async function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n try {\n const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);\n if (!opened) return null;\n return await decompressBuffer(opened);\n } catch (error) {\n return null;\n }\n}\n\n/** --- HASH --- */\nexport async function hash(str: string): Promise<string> {\n await sodium.ready;\n const digest = sodium.crypto_generichash(32, sodium.from_string(str));\n return sodium\n .to_base64(digest)\n .replace(/[^a-zA-Z0-9]/g, \"\")\n}\n\nconst crypto = {\n encrypt,\n decrypt,\n encryptBuffer,\n decryptBuffer,\n hash,\n};\n\nexport default crypto;\n"],"names":["Object","defineProperty","exports","value","sodium","require","compress","deriveKey","secret","crypto_generichash","crypto_secretbox_KEYBYTES","from_string","deriveNonce","crypto_secretbox_NONCEBYTES","async","encrypt","input","encrypted","encryptBuffer","to_base64","decrypt","base64","cipher","from_base64","decryptBuffer","ready","key","nonce","compressed","compressBuffer","crypto_secretbox_easy","box","opened","crypto_secretbox_open_easy","decompressBuffer","error","hash","str","digest","replace","crypto"],"mappings":"AAKA,aAAAA,OAAAC,eAAAC,QAAA,aAAA,CAAAC,OAAA,IAAA,IAAAC,EAAAC,QAAA,sBAAAC,EAAAD,QAAA,iBACA,SAASE,EAAUC,GAChB,OAAOJ,EAAOK,mBACXL,EAAOM,0BACPN,EAAOO,YAAYH,GAEzB,CAEA,SAASI,EAAYJ,GAClB,OAAOJ,EAAOK,mBACXL,EAAOS,4BACPT,EAAOO,YAAYH,GAEzB,CAGOM,eAAeC,EAAQC,EAAqBR,GAChD,MAAMS,QAAkBC,EAAcF,EAAOR,GAC7C,OAAOJ,EAAOe,UAAUF,EAC3B,CAEOH,eAAeM,EAAQC,EAAgBb,GAC3C,MAAMc,EAASlB,EAAOmB,YAAYF,GAClC,aAAaG,EAAcF,EAAQd,EACtC,CAIOM,eAAeI,EAAcF,EAAYR,SACvCJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GACpBoB,QAAmBC,EAAAA,eAAeb,GACxC,OAAOZ,EAAO0B,sBAAsBF,EAAYD,EAAOD,EAC1D,CAGOZ,eAAeU,EAAcO,EAAiBvB,SAC5CJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GAC1B,IACG,MAAMwB,EAAS5B,EAAO6B,2BAA2BF,EAAKJ,EAAOD,GAC7D,OAAKM,QACQE,EAAAA,iBAAiBF,GADV,IAEtB,CAAC,MAAOG,GACN,OAAO,IACT,CACJ,CAGOrB,eAAesB,EAAKC,SAClBjC,EAAOqB,MACb,MAAMa,EAASlC,EAAOK,mBAAmB,GAAIL,EAAOO,YAAY0B,IAChE,OAAOjC,EACHe,UAAUmB,GACVC,QAAQ,gBAAiB,GAChC,CAEA,MAAMC,EAAS,CACZzB,UACAK,UACAF,gBACAM,gBACAY"}
|
package/include/crypto.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.mjs","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\
|
|
1
|
+
{"version":3,"file":"crypto.mjs","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport { compressBuffer, decompressBuffer } from \"./compress\";\n\nexport type EncryptInput = string | object | any[];\n\n/** --- Key/Nonce Derivation --- */\nfunction deriveKey(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_KEYBYTES,\n sodium.from_string(secret)\n );\n}\n\nfunction deriveNonce(secret: string): Uint8Array {\n return sodium.crypto_generichash(\n sodium.crypto_secretbox_NONCEBYTES,\n sodium.from_string(secret)\n );\n}\n\n/** --- STRING --- */\nexport async function encrypt(input: EncryptInput, secret: string): Promise<string> {\n const encrypted = await encryptBuffer(input, secret);\n return sodium.to_base64(encrypted);\n}\n\nexport async function decrypt(base64: string, secret: string): Promise<any | null> {\n const cipher = sodium.from_base64(base64);\n return await decryptBuffer(cipher, secret);\n}\n\n/** --- BUFFER --- */\n// Encrypt\nexport async function encryptBuffer(input: any, secret: string): Promise<Uint8Array> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n const compressed = await compressBuffer(input);\n return sodium.crypto_secretbox_easy(compressed, nonce, key);\n}\n\n// Decrypt\nexport async function decryptBuffer(box: Uint8Array, secret: string): Promise<any | null> {\n await sodium.ready;\n const key = deriveKey(secret);\n const nonce = deriveNonce(secret);\n try {\n const opened = sodium.crypto_secretbox_open_easy(box, nonce, key);\n if (!opened) return null;\n return await decompressBuffer(opened);\n } catch (error) {\n return null;\n }\n}\n\n/** --- HASH --- */\nexport async function hash(str: string): Promise<string> {\n await sodium.ready;\n const digest = sodium.crypto_generichash(32, sodium.from_string(str));\n return sodium\n .to_base64(digest)\n .replace(/[^a-zA-Z0-9]/g, \"\")\n}\n\nconst crypto = {\n encrypt,\n decrypt,\n encryptBuffer,\n decryptBuffer,\n hash,\n};\n\nexport default crypto;\n"],"names":["sodium","decompressBuffer","compressBuffer","deriveKey","secret","crypto_generichash","crypto_secretbox_KEYBYTES","from_string","deriveNonce","crypto_secretbox_NONCEBYTES","async","encrypt","input","encrypted","encryptBuffer","to_base64","decrypt","base64","cipher","from_base64","decryptBuffer","ready","key","nonce","compressed","crypto_secretbox_easy","box","opened","crypto_secretbox_open_easy","error","hash","str","digest","replace","crypto"],"mappings":"OAKAA,MAAA,gDAAAC,oBAAAC,MAAA,iBACA,SAASC,EAAUC,GAChB,OAAOJ,EAAOK,mBACXL,EAAOM,0BACPN,EAAOO,YAAYH,GAEzB,CAEA,SAASI,EAAYJ,GAClB,OAAOJ,EAAOK,mBACXL,EAAOS,4BACPT,EAAOO,YAAYH,GAEzB,CAGOM,eAAeC,EAAQC,EAAqBR,GAChD,MAAMS,QAAkBC,EAAcF,EAAOR,GAC7C,OAAOJ,EAAOe,UAAUF,EAC3B,CAEOH,eAAeM,EAAQC,EAAgBb,GAC3C,MAAMc,EAASlB,EAAOmB,YAAYF,GAClC,aAAaG,EAAcF,EAAQd,EACtC,CAIOM,eAAeI,EAAcF,EAAYR,SACvCJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GACpBoB,QAAmBtB,EAAeU,GACxC,OAAOZ,EAAOyB,sBAAsBD,EAAYD,EAAOD,EAC1D,CAGOZ,eAAeU,EAAcM,EAAiBtB,SAC5CJ,EAAOqB,MACb,MAAMC,EAAMnB,EAAUC,GAChBmB,EAAQf,EAAYJ,GAC1B,IACG,MAAMuB,EAAS3B,EAAO4B,2BAA2BF,EAAKH,EAAOD,GAC7D,OAAKK,QACQ1B,EAAiB0B,GADV,IAEtB,CAAC,MAAOE,GACN,OAAO,IACT,CACJ,CAGOnB,eAAeoB,EAAKC,SAClB/B,EAAOqB,MACb,MAAMW,EAAShC,EAAOK,mBAAmB,GAAIL,EAAOO,YAAYwB,IAChE,OAAO/B,EACHe,UAAUiB,GACVC,QAAQ,gBAAiB,GAChC,CAEA,MAAMC,EAAS,CACZvB,UACAK,UACAF,gBACAM,gBACAU"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "securequ",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"sideEffects": false,
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
"xanfetch": "^1.0.8"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"makepack": "^1.7.14",
|
|
16
15
|
"@types/express": "^5.0.3",
|
|
17
16
|
"@types/libsodium-wrappers": "^0.7.14",
|
|
18
17
|
"@types/node": "^22.15.24",
|
|
19
18
|
"@types/react": "^19.0.2",
|
|
20
19
|
"@types/react-dom": "^19.0.2",
|
|
21
20
|
"express": "^5.1.0",
|
|
21
|
+
"makepack": "^1.7.14",
|
|
22
22
|
"react": "^19.0.0",
|
|
23
23
|
"react-dom": "^19.0.0",
|
|
24
24
|
"typescript": "^4.4.2"
|
package/readme.md
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
# securequ
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/securequ)
|
|
4
|
-
[](https://github.com/your-username/securequ/blob/main/LICENSE)
|
|
5
|
-
[](https://www.npmjs.com/package/securequ)
|
|
6
|
-
|
|
7
|
-
A brief description of what your package does and its purpose.
|
|
8
|
-
|
|
9
|
-
## Installation
|
|
10
|
-
|
|
11
|
-
```sh
|
|
12
|
-
npm install securequ
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
or with yarn:
|
|
16
|
-
|
|
17
|
-
```sh
|
|
18
|
-
yarn add securequ
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Usage
|
|
22
|
-
|
|
23
|
-
```js
|
|
24
|
-
import { feature } from "securequ";
|
|
25
|
-
|
|
26
|
-
const result = feature("example");
|
|
27
|
-
console.log(result);
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## API
|
|
31
|
-
|
|
32
|
-
### `feature(input: string): string`
|
|
33
|
-
Description of the function and its parameters.
|
|
34
|
-
|
|
35
|
-
## Configuration (if applicable)
|
|
36
|
-
Explain any configuration options if your package requires setup.
|
|
37
|
-
|
|
38
|
-
## Examples
|
|
39
|
-
Provide additional usage examples for clarity.
|
|
40
|
-
|
|
41
|
-
## Contributing
|
|
42
|
-
Contributions are welcome! Please follow the guidelines in [CONTRIBUTING.md](./CONTRIBUTING.md).
|
|
43
|
-
|
|
44
|
-
## License
|
|
45
|
-
|
|
46
|
-
This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
|
|
47
|
-
|
|
48
|
-
## Links
|
|
49
|
-
- [GitHub Repository](https://github.com/your-username/securequ)
|
|
50
|
-
- [NPM Package](https://www.npmjs.com/package/securequ)
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
Feel free to modify this template based on your package's specific needs.
|
|
1
|
+
# securequ
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/securequ)
|
|
4
|
+
[](https://github.com/your-username/securequ/blob/main/LICENSE)
|
|
5
|
+
[](https://www.npmjs.com/package/securequ)
|
|
6
|
+
|
|
7
|
+
A brief description of what your package does and its purpose.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install securequ
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
or with yarn:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
yarn add securequ
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import { feature } from "securequ";
|
|
25
|
+
|
|
26
|
+
const result = feature("example");
|
|
27
|
+
console.log(result);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## API
|
|
31
|
+
|
|
32
|
+
### `feature(input: string): string`
|
|
33
|
+
Description of the function and its parameters.
|
|
34
|
+
|
|
35
|
+
## Configuration (if applicable)
|
|
36
|
+
Explain any configuration options if your package requires setup.
|
|
37
|
+
|
|
38
|
+
## Examples
|
|
39
|
+
Provide additional usage examples for clarity.
|
|
40
|
+
|
|
41
|
+
## Contributing
|
|
42
|
+
Contributions are welcome! Please follow the guidelines in [CONTRIBUTING.md](./CONTRIBUTING.md).
|
|
43
|
+
|
|
44
|
+
## License
|
|
45
|
+
|
|
46
|
+
This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
|
|
47
|
+
|
|
48
|
+
## Links
|
|
49
|
+
- [GitHub Repository](https://github.com/your-username/securequ)
|
|
50
|
+
- [NPM Package](https://www.npmjs.com/package/securequ)
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
Feel free to modify this template based on your package's specific needs.
|
package/server/Base.d.ts
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import Router from './Router.js';
|
|
2
2
|
import { SecurequServerConfig, UploadFileMeta, HandlerInfo, ArgsInfo } from './types.js';
|
|
3
3
|
|
|
4
|
-
declare class SecurequServerBase extends Router {
|
|
5
|
-
protected config: SecurequServerConfig;
|
|
6
|
-
protected secret: string | null;
|
|
7
|
-
protected clients: Map<string, string>;
|
|
8
|
-
protected uploadMeta: Map<string, UploadFileMeta & {
|
|
9
|
-
expire: number;
|
|
10
|
-
}>;
|
|
11
|
-
constructor(config: SecurequServerConfig);
|
|
12
|
-
protected getSecret(): Promise<string>;
|
|
13
|
-
protected clientInfo(path: string, origin: string): Promise<{
|
|
14
|
-
path: string;
|
|
15
|
-
secret: string;
|
|
16
|
-
hash: string;
|
|
17
|
-
searchParams: {
|
|
18
|
-
[key: string]: any;
|
|
19
|
-
};
|
|
20
|
-
}>;
|
|
21
|
-
protected isValidSigneture(signeture: string | undefined, hash: string): Promise<void>;
|
|
22
|
-
handleRequest(info: HandlerInfo, args?: ArgsInfo): Promise<void>;
|
|
4
|
+
declare class SecurequServerBase extends Router {
|
|
5
|
+
protected config: SecurequServerConfig;
|
|
6
|
+
protected secret: string | null;
|
|
7
|
+
protected clients: Map<string, string>;
|
|
8
|
+
protected uploadMeta: Map<string, UploadFileMeta & {
|
|
9
|
+
expire: number;
|
|
10
|
+
}>;
|
|
11
|
+
constructor(config: SecurequServerConfig);
|
|
12
|
+
protected getSecret(): Promise<string>;
|
|
13
|
+
protected clientInfo(path: string, origin: string): Promise<{
|
|
14
|
+
path: string;
|
|
15
|
+
secret: string;
|
|
16
|
+
hash: string;
|
|
17
|
+
searchParams: {
|
|
18
|
+
[key: string]: any;
|
|
19
|
+
};
|
|
20
|
+
}>;
|
|
21
|
+
protected isValidSigneture(signeture: string | undefined, hash: string): Promise<void>;
|
|
22
|
+
handleRequest(info: HandlerInfo, args?: ArgsInfo): Promise<void>;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export { SecurequServerBase as default };
|
package/server/Base.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../include/crypto.js"),t=require("./Router.js");class s extends t.default{constructor(e){if(super(),this.secret=null,this.clients=new Map,this.uploadMeta=new Map,!e.basepath)throw new Error("Basepath is required");if(!e.clients||0===Object.keys(e.clients).length)throw new Error("Atleast one client is required");e.basepath.startsWith("/")||(e.basepath=`/${e.basepath}`),e.basepath.endsWith("/")&&(e.basepath=e.basepath.substring(0,e.basepath.length-1)),e.upload&&(e.upload.maxFilesize=e.upload.maxFilesize||51200,e.upload.checkFileType=e.upload.checkFileType||!0),this.config=e;for(let e of this.config.clients)this.clients.set(e.origin,e.secret)}async getSecret(){return this.secret||(this.secret=await e.default.hash(Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15))),this.secret}async clientInfo(t,s){const a="/"!==t&&"development"===this.config.mode;let i=t.split("?");const n=(t=(t=(t=(t=i[0]).replace(this.config.basepath+"/","")).endsWith("/")?t.substring(0,t.length-1):t).startsWith("/")?t.substring(1):t).split("/"),r=n.shift();if(!(null==r?void 0:r.length)||!this.clients.has(s))throw new Response("Client not allowed",{status:403});let o=this.clients.get(s).substring(0,r.length),h={};return i.length>1&&(h=a?Object.fromEntries(new URLSearchParams(decodeURIComponent(i[1]))):await e.default.decrypt(decodeURIComponent(i[1]),o)),{path:"/"+n.join("/"),secret:o,hash:r,searchParams:h}}async isValidSigneture(t,s){const a=await this.getSecret();if(this.secret&&t){let i=await e.default.decrypt(t,a),n=i.hash===s,r=i.expire>Date.now();if(!n)throw new Response("Invalid Signeture",{status:403});if(!r)throw new Response("Signeture expired",{status:403})}}async handleRequest(e,t){if(this.config.accept){if(!await this.config.accept(e,t))throw new Response("Request not accepted",{status:403})}const{path:s,method:a}=e;let i=Object.values(this.routes[a]);for(let{test:a,handler:n}of i){const i=a(s);i&&await n(Object.assign(Object.assign({},e),{params:i.params}),t)}}}exports.default=s;//# sourceMappingURL=Base.js.map
|
package/server/Base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Base.js","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\
|
|
1
|
+
{"version":3,"file":"Base.js","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, ArgsInfo } from \"./types\";\n\nclass SecurequServerBase extends Router {\n protected config: SecurequServerConfig;\n protected secret: string | null = null\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\n\n constructor(config: SecurequServerConfig) {\n super()\n if (!config.basepath) throw new Error(\"Basepath is required\");\n if (!config.clients || Object.keys(config.clients).length === 0) throw new Error(\"Atleast one client is required\");\n if (!config.basepath.startsWith(\"/\")) config.basepath = `/${config.basepath}`;\n if (config.basepath.endsWith(\"/\")) config.basepath = config.basepath.substring(0, config.basepath.length - 1);\n if (config.upload) {\n config.upload.maxFilesize = config.upload.maxFilesize || 50 * 1024 // 50MB default\n config.upload.checkFileType = config.upload.checkFileType || true\n }\n this.config = config\n for (let client of this.config.clients) {\n this.clients.set(client.origin, client.secret)\n }\n }\n\n protected async getSecret() {\n if (!this.secret) {\n this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15))\n }\n return this.secret\n }\n\n protected async clientInfo(path: string, origin: string) {\n const isDev = path !== '/' && this.config.mode === 'development'\n let splitUrl = path.split(\"?\")\n path = splitUrl[0]\n path = path.replace(this.config.basepath + \"/\", \"\")\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n path = path.startsWith('/') ? path.substring(1) : path\n\n const split = path.split(\"/\")\n const hash = split.shift()\n if (!hash?.length || !this.clients.has(origin)) throw new Response(\"Client not allowed\", { status: 403 });\n let client = this.clients.get(origin as string) as string;\n let secret = client.substring(0, hash.length as number);\n let searchParams: { [key: string]: any } = {}\n if (splitUrl.length > 1) {\n if (isDev) {\n searchParams = Object.fromEntries(new URLSearchParams(decodeURIComponent(splitUrl[1])))\n } else {\n searchParams = await crypto.decrypt(decodeURIComponent(splitUrl[1]), secret) as any\n }\n }\n return {\n path: \"/\" + split.join('/'),\n secret,\n hash,\n searchParams\n }\n }\n\n protected async isValidSigneture(signeture: string | undefined, hash: string) {\n const serverSecret = await this.getSecret()\n if (this.secret && signeture) {\n let info: any = await crypto.decrypt(signeture, serverSecret)\n let isHashValid = info.hash === hash\n let isNotExpired = info.expire > Date.now()\n if (!isHashValid) throw new Response(\"Invalid Signeture\", { status: 403 });\n if (!isNotExpired) throw new Response(\"Signeture expired\", { status: 403 });\n }\n }\n\n async handleRequest(info: HandlerInfo, args?: ArgsInfo) {\n if (this.config.accept) {\n const is = await this.config.accept(info, args)\n if (!is) throw new Response(\"Request not accepted\", { status: 403 })\n }\n\n const { path, method } = info;\n let values: any = Object.values(this.routes[method]);\n for (let { test, handler } of values) {\n const match = test(path)\n if (match) {\n await handler({ ...info, params: match.params }, args)\n }\n }\n }\n\n}\n\nexport default SecurequServerBase;"],"names":["SecurequServerBase","Router","constructor","config","super","this","secret","clients","Map","uploadMeta","basepath","Error","Object","keys","length","startsWith","endsWith","substring","upload","maxFilesize","checkFileType","client","set","origin","getSecret","crypto","hash","Math","random","toString","clientInfo","path","isDev","mode","splitUrl","split","replace","shift","has","Response","status","get","searchParams","fromEntries","URLSearchParams","decodeURIComponent","decrypt","join","isValidSigneture","signeture","serverSecret","info","isHashValid","isNotExpired","expire","Date","now","handleRequest","args","accept","method","values","routes","test","handler","match","assign","params","exports","default"],"mappings":"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"}
|
package/server/Base.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import t from"../include/crypto.mjs";import e from"./Router.mjs";class s extends e{constructor(t){if(super(),this.secret=null,this.clients=new Map,this.uploadMeta=new Map,!t.basepath)throw new Error("Basepath is required");if(!t.clients||0===Object.keys(t.clients).length)throw new Error("Atleast one client is required");t.basepath.startsWith("/")||(t.basepath=`/${t.basepath}`),t.basepath.endsWith("/")&&(t.basepath=t.basepath.substring(0,t.basepath.length-1)),this.config=t;for(let t of this.config.clients)this.clients.set(t.origin,t.secret)}async getSecret(){return this.secret||(this.secret=await t.hash(Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15))),this.secret}async clientInfo(e,s){
|
|
1
|
+
import t from"../include/crypto.mjs";import e from"./Router.mjs";class s extends e{constructor(t){if(super(),this.secret=null,this.clients=new Map,this.uploadMeta=new Map,!t.basepath)throw new Error("Basepath is required");if(!t.clients||0===Object.keys(t.clients).length)throw new Error("Atleast one client is required");t.basepath.startsWith("/")||(t.basepath=`/${t.basepath}`),t.basepath.endsWith("/")&&(t.basepath=t.basepath.substring(0,t.basepath.length-1)),t.upload&&(t.upload.maxFilesize=t.upload.maxFilesize||51200,t.upload.checkFileType=t.upload.checkFileType||!0),this.config=t;for(let t of this.config.clients)this.clients.set(t.origin,t.secret)}async getSecret(){return this.secret||(this.secret=await t.hash(Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15))),this.secret}async clientInfo(e,s){const i="/"!==e&&"development"===this.config.mode;let a=e.split("?");const n=(e=(e=(e=(e=a[0]).replace(this.config.basepath+"/","")).endsWith("/")?e.substring(0,e.length-1):e).startsWith("/")?e.substring(1):e).split("/"),r=n.shift();if(!(null==r?void 0:r.length)||!this.clients.has(s))throw new Response("Client not allowed",{status:403});let o=this.clients.get(s).substring(0,r.length),h={};return a.length>1&&(h=i?Object.fromEntries(new URLSearchParams(decodeURIComponent(a[1]))):await t.decrypt(decodeURIComponent(a[1]),o)),{path:"/"+n.join("/"),secret:o,hash:r,searchParams:h}}async isValidSigneture(e,s){const i=await this.getSecret();if(this.secret&&e){let a=await t.decrypt(e,i),n=a.hash===s,r=a.expire>Date.now();if(!n)throw new Response("Invalid Signeture",{status:403});if(!r)throw new Response("Signeture expired",{status:403})}}async handleRequest(t,e){if(this.config.accept){if(!await this.config.accept(t,e))throw new Response("Request not accepted",{status:403})}const{path:s,method:i}=t;let a=Object.values(this.routes[i]);for(let{test:i,handler:n}of a){const a=i(s);a&&await n(Object.assign(Object.assign({},t),{params:a.params}),e)}}}export{s as default};//# sourceMappingURL=Base.mjs.map
|
package/server/Base.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Base.mjs","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\
|
|
1
|
+
{"version":3,"file":"Base.mjs","sources":["../../src/server/Base.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport Router from \"./Router\";\nimport { HandlerInfo, SecurequServerConfig, ServerClientSecret, ServerClientOrigin, UploadFileMeta, ArgsInfo } from \"./types\";\n\nclass SecurequServerBase extends Router {\n protected config: SecurequServerConfig;\n protected secret: string | null = null\n protected clients = new Map<ServerClientOrigin, ServerClientSecret>();\n protected uploadMeta = new Map<string, UploadFileMeta & { expire: number }>();\n\n constructor(config: SecurequServerConfig) {\n super()\n if (!config.basepath) throw new Error(\"Basepath is required\");\n if (!config.clients || Object.keys(config.clients).length === 0) throw new Error(\"Atleast one client is required\");\n if (!config.basepath.startsWith(\"/\")) config.basepath = `/${config.basepath}`;\n if (config.basepath.endsWith(\"/\")) config.basepath = config.basepath.substring(0, config.basepath.length - 1);\n if (config.upload) {\n config.upload.maxFilesize = config.upload.maxFilesize || 50 * 1024 // 50MB default\n config.upload.checkFileType = config.upload.checkFileType || true\n }\n this.config = config\n for (let client of this.config.clients) {\n this.clients.set(client.origin, client.secret)\n }\n }\n\n protected async getSecret() {\n if (!this.secret) {\n this.secret = await crypto.hash(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15))\n }\n return this.secret\n }\n\n protected async clientInfo(path: string, origin: string) {\n const isDev = path !== '/' && this.config.mode === 'development'\n let splitUrl = path.split(\"?\")\n path = splitUrl[0]\n path = path.replace(this.config.basepath + \"/\", \"\")\n path = path.endsWith('/') ? path.substring(0, path.length - 1) : path\n path = path.startsWith('/') ? path.substring(1) : path\n\n const split = path.split(\"/\")\n const hash = split.shift()\n if (!hash?.length || !this.clients.has(origin)) throw new Response(\"Client not allowed\", { status: 403 });\n let client = this.clients.get(origin as string) as string;\n let secret = client.substring(0, hash.length as number);\n let searchParams: { [key: string]: any } = {}\n if (splitUrl.length > 1) {\n if (isDev) {\n searchParams = Object.fromEntries(new URLSearchParams(decodeURIComponent(splitUrl[1])))\n } else {\n searchParams = await crypto.decrypt(decodeURIComponent(splitUrl[1]), secret) as any\n }\n }\n return {\n path: \"/\" + split.join('/'),\n secret,\n hash,\n searchParams\n }\n }\n\n protected async isValidSigneture(signeture: string | undefined, hash: string) {\n const serverSecret = await this.getSecret()\n if (this.secret && signeture) {\n let info: any = await crypto.decrypt(signeture, serverSecret)\n let isHashValid = info.hash === hash\n let isNotExpired = info.expire > Date.now()\n if (!isHashValid) throw new Response(\"Invalid Signeture\", { status: 403 });\n if (!isNotExpired) throw new Response(\"Signeture expired\", { status: 403 });\n }\n }\n\n async handleRequest(info: HandlerInfo, args?: ArgsInfo) {\n if (this.config.accept) {\n const is = await this.config.accept(info, args)\n if (!is) throw new Response(\"Request not accepted\", { status: 403 })\n }\n\n const { path, method } = info;\n let values: any = Object.values(this.routes[method]);\n for (let { test, handler } of values) {\n const match = test(path)\n if (match) {\n await handler({ ...info, params: match.params }, args)\n }\n }\n }\n\n}\n\nexport default SecurequServerBase;"],"names":["SecurequServerBase","Router","constructor","config","super","this","secret","clients","Map","uploadMeta","basepath","Error","Object","keys","length","startsWith","endsWith","substring","upload","maxFilesize","checkFileType","client","set","origin","getSecret","crypto","hash","Math","random","toString","clientInfo","path","isDev","mode","splitUrl","split","replace","shift","has","Response","status","get","searchParams","fromEntries","URLSearchParams","decodeURIComponent","decrypt","join","isValidSigneture","signeture","serverSecret","info","isHashValid","isNotExpired","expire","Date","now","handleRequest","args","accept","method","values","routes","test","handler","match","assign","params"],"mappings":"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"}
|
package/server/Router.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { RouteFactory, HTTPMethods, HandlerFunction } from './types.js';
|
|
2
2
|
|
|
3
|
-
declare class Router {
|
|
4
|
-
protected routes: RouteFactory;
|
|
5
|
-
addRoute(path: string, method: HTTPMethods, handler: HandlerFunction): Promise<void>;
|
|
6
|
-
get(path: string, handler: HandlerFunction): Promise<void>;
|
|
7
|
-
post(path: string, handler: HandlerFunction): Promise<void>;
|
|
8
|
-
put(path: string, handler: HandlerFunction): Promise<void>;
|
|
9
|
-
delete(path: string, handler: HandlerFunction): Promise<void>;
|
|
3
|
+
declare class Router {
|
|
4
|
+
protected routes: RouteFactory;
|
|
5
|
+
addRoute(path: string, method: HTTPMethods, handler: HandlerFunction): Promise<void>;
|
|
6
|
+
get(path: string, handler: HandlerFunction): Promise<void>;
|
|
7
|
+
post(path: string, handler: HandlerFunction): Promise<void>;
|
|
8
|
+
put(path: string, handler: HandlerFunction): Promise<void>;
|
|
9
|
+
delete(path: string, handler: HandlerFunction): Promise<void>;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export { Router as default };
|
package/server/Router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.js","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HandlerFunction, HTTPMethods, RouteFactory } from \"./types\"\
|
|
1
|
+
{"version":3,"file":"Router.js","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HandlerFunction, HTTPMethods, RouteFactory } from \"./types\"\nimport { match } from \"path-to-regexp\";\n\nclass Router {\n protected routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n}\n\nexport default Router;"],"names":["Object","defineProperty","exports","value","pathToRegexp","require","default","constructor","this","routes","GET","POST","PUT","DELETE","addRoute","path","method","handler","test","match","get","post","put"],"mappings":"AAGA,aAAAA,OAAAC,eAAAC,QAAA,aAAA,CAAAC,OAAA,IAAA,IAAAC,EAAAC,QAAA,kBA+BCH,QAAAI,QA/BD,MAAA,WAAAC,GACaC,KAAAC,OAAuB,CAC9BC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,OAAQ,CAAA,EA0Bd,CAvBG,cAAMC,CAASC,EAAcC,EAAqBC,GAC3CT,KAAKC,OAAOO,GAAQD,KACxBP,KAAKC,OAAOO,GAAQD,GAAQ,CACzBE,UACAC,KAAMC,EAAAA,MAAMJ,IAElB,CAEA,SAAMK,CAAIL,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,UAAMI,CAAKN,EAAcE,GACtBT,KAAKM,SAASC,EAAM,OAAQE,EAC/B,CAEA,SAAMK,CAAIP,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,YAAM,CAAOF,EAAcE,GACxBT,KAAKM,SAASC,EAAM,SAAUE,EACjC"}
|
package/server/Router.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.mjs","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HandlerFunction, HTTPMethods, RouteFactory } from \"./types\"\
|
|
1
|
+
{"version":3,"file":"Router.mjs","sources":["../../src/server/Router.ts"],"sourcesContent":["import { HandlerFunction, HTTPMethods, RouteFactory } from \"./types\"\nimport { match } from \"path-to-regexp\";\n\nclass Router {\n protected routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n}\n\nexport default Router;"],"names":["match","Router","constructor","this","routes","GET","POST","PUT","DELETE","addRoute","path","method","handler","test","get","post","put"],"mappings":"gBAGAA,MAAA,iBAAA,MAAMC,EAAN,WAAAC,GACaC,KAAAC,OAAuB,CAC9BC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,OAAQ,CAAA,EA0Bd,CAvBG,cAAMC,CAASC,EAAcC,EAAqBC,GAC3CT,KAAKC,OAAOO,GAAQD,KACxBP,KAAKC,OAAOO,GAAQD,GAAQ,CACzBE,UACAC,KAAMb,EAAMU,IAElB,CAEA,SAAMI,CAAIJ,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,UAAMG,CAAKL,EAAcE,GACtBT,KAAKM,SAASC,EAAM,OAAQE,EAC/B,CAEA,SAAMI,CAAIN,EAAcE,GACrBT,KAAKM,SAASC,EAAM,MAAOE,EAC9B,CAEA,YAAM,CAAOF,EAAcE,GACxBT,KAAKM,SAASC,EAAM,SAAUE,EACjC,SACFX"}
|
package/server/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ArgsInfo, ListenerInfo, ServerResponse } from './types.js';
|
|
2
2
|
import SecurequServerBase from './Base.js';
|
|
3
3
|
|
|
4
|
-
declare class SecurequServer extends SecurequServerBase {
|
|
5
|
-
handshake(
|
|
6
|
-
upload(
|
|
7
|
-
listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse>;
|
|
4
|
+
declare class SecurequServer extends SecurequServerBase {
|
|
5
|
+
handshake(body: any, clientInfo: any): Promise<void>;
|
|
6
|
+
upload(body: any, clientInfo: any, signeture: string, args?: ArgsInfo): Promise<void>;
|
|
7
|
+
listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse>;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export { SecurequServer as default };
|
package/server/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../include/crypto.js"),t=require("./Base.js");class a extends t.default{async handshake(t,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../include/crypto.js"),t=require("./Base.js"),i=require("../include/FileScaner.js");class a extends t.default{async handshake(t,i){var a,s;const n=await e.default.decryptBuffer(t,i.secret),o=await this.getSecret();if(!n)throw new Error("Invalid handshake data");if(n.hash!==i.hash)throw new Error("Invalid handshake");if(n.secret!==i.secret)throw new Error("Invalid handshake secret");if(Date.now()-n.clientTime>3e4)throw new Error("Handshake expired");const l=new Date;throw{timeDiffarenc:new Date(n.clientTime).getTime()-l.getTime(),maxFileSize:(null===(a=this.config.upload)||void 0===a?void 0:a.maxFilesize)||null,dev:"development"===this.config.mode,checkFileType:(null===(s=this.config.upload)||void 0===s?void 0:s.checkFileType)||!1,signeture:await e.default.encrypt({expire:Date.now()+3e4,hash:i.hash},o)}}async upload(t,a,s,n){var o;const l=await e.default.decryptBuffer(t,a.secret),r=await e.default.decrypt(s,a.secret);await this.isValidSigneture(r.signeture,a.hash);const d=this.config.upload;if(!(null==d?void 0:d.chunk)||!(null==d?void 0:d.complete))throw new Response("Upload not supported",{status:403});if("failed"===(null==l?void 0:l.type)){const e=this.uploadMeta.get(l.fileid);throw e&&d.failed?(await d.failed(e,n),this.uploadMeta.delete(l.fileid),{success:!0}):new Response("Invalid upload",{status:400})}if("meta"===l.type){if((null==d?void 0:d.maxFilesize)&&l.filesize>1024*d.maxFilesize)throw new Response(`File size exceeds the limit of ${d.maxFilesize} KB`,{status:413});throw this.uploadMeta.set(l.fileid,Object.assign(Object.assign({},l),{expire:Date.now()+36e5})),this.uploadMeta.forEach((e,t)=>{e.expire<Date.now()&&this.uploadMeta.delete(t)}),l}{const{chunk:e,fileId:t,chunkIndex:a}=l,s=this.uploadMeta.get(t);if(!s)throw new Response("Invalid upload meta",{status:400});if(d.checkFileType&&0===a){if(!i.fileScaner(e))throw new Error("Unknown or unsupported file type")}if((null===(o=this.config.upload)||void 0===o?void 0:o.maxFilesize)&&l.filesize>1024*this.config.upload.maxFilesize)throw new Response(`File size exceeds the limit of ${this.config.upload.maxFilesize/1024} MB`,{status:413});if(await d.chunk(e,{filename:s.filename,filesize:s.filesize,filetype:s.filetype,fileid:s.fileid,totalChunks:s.totalChunks,chunkIndex:a},n),a+1===s.totalChunks){const e=await d.complete(s,n);throw this.uploadMeta.delete(t),e}throw l}}async listen({path:t,body:i,method:a,origin:s,signeture:n},o){let l=await this.clientInfo(t,s);const r="/"!==(t=l.path)&&"development"===this.config.mode;try{if("/"===t){if(!["POST","PUT"].includes(a))throw new Response("Invalid method",{status:405});"POST"===a?await this.handshake(i,l):await this.upload(i,l,n,o)}const s=await e.default.decrypt(n,l.secret);if(await this.isValidSigneture(s.signeture,l.hash),s.expire<Date.now())throw new Response("Request expired",{status:403});let d=null;if(i)if(r){const e=(new TextDecoder).decode(i);d=JSON.parse(e)}else d=await e.default.decryptBuffer(i,l.secret);await this.handleRequest({method:a,path:t,body:d,searchParams:l.searchParams,params:{}},o)}catch(t){const i=t instanceof Error,a=t instanceof Response;let s=i?t.message:a?await t.text():t;return r?{status:i?404:(null==t?void 0:t.status)||200,content:JSON.stringify(s)}:{status:i?404:(null==t?void 0:t.status)||200,content:await e.default.encryptBuffer(s,l.secret)}}return r?{status:404,content:"Not found"}:{status:404,content:await e.default.encryptBuffer("Not found",l.secret)}}}exports.default=a;//# sourceMappingURL=index.js.map
|
package/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport { ArgsInfo, ListenerInfo, ServerResponse } from \"./types\";\r\nimport SecurequServerBase from \"./Base\";\r\n\r\nclass SecurequServer extends SecurequServerBase {\r\n\r\n\r\n async handshake(data: any, clientInfo: any) {\r\n const serverSecret = await this.getSecret()\r\n if (!data) throw new Error(\"Invalid handshake data\");\r\n if (data.hash !== clientInfo.hash) {\r\n throw new Error(\"Invalid handshake\");\r\n } else if (data.secret !== clientInfo.secret) {\r\n throw new Error(\"Invalid handshake secret\");\r\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\r\n throw new Error(\"Handshake expired\");\r\n }\r\n\r\n const serverTime = new Date();\r\n const clientDate = new Date(data.clientTime);\r\n const offsetMs = clientDate.getTime() - serverTime.getTime();\r\n\r\n let info = {\r\n timeDiffarenc: offsetMs,\r\n signeture: await crypto.encrypt({\r\n expire: Date.now() + 30000, // 30 seconds\r\n hash: clientInfo.hash\r\n }, serverSecret)\r\n }\r\n throw info\r\n }\r\n\r\n async upload(data: any, clientInfo: any, signeture: string, args?: ArgsInfo) {\r\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\r\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\r\n\r\n if (!this.config.upload?.chunk || !this.config.upload?.complete) {\r\n throw new Response(\"Upload not supported\", { status: 403 })\r\n }\r\n\r\n if (data?.type === 'failed') {\r\n const meta = this.uploadMeta.get(data.fileid)\r\n if (meta && this.config.upload.failed) {\r\n await this.config.upload.failed(meta, args)\r\n this.uploadMeta.delete(data.fileid)\r\n throw { success: true }\r\n } else {\r\n throw new Response(\"Invalid upload\", { status: 400 })\r\n }\r\n } else if (data.type === 'meta') {\r\n this.uploadMeta.set(data.fileid, {\r\n ...data,\r\n expire: Date.now() + 3600000 // 1 hour\r\n })\r\n this.uploadMeta.forEach((meta, key) => {\r\n if (meta.expire < Date.now()) {\r\n this.uploadMeta.delete(key)\r\n }\r\n })\r\n\r\n throw data\r\n } else {\r\n const { chunk, fileId, chunkIndex } = data;\r\n const meta = this.uploadMeta.get(fileId)\r\n if (!meta) {\r\n throw new Response(\"Invalid upload meta\", { status: 400 })\r\n }\r\n const upload = this.config.upload\r\n await upload.chunk(chunk, {\r\n filename: meta.filename,\r\n filesize: meta.filesize,\r\n filetype: meta.filetype,\r\n fileid: meta.fileid,\r\n totalChunks: meta.totalChunks,\r\n chunkIndex,\r\n }, args)\r\n if (chunkIndex + 1 === meta.totalChunks) {\r\n const filepath = await upload.complete(meta, args)\r\n this.uploadMeta.delete(fileId)\r\n throw filepath\r\n }\r\n throw data\r\n }\r\n }\r\n\r\n async listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse> {\r\n let clientInfo = await this.clientInfo(path, origin)\r\n const data: any = body ? await crypto.decryptBuffer(body, clientInfo.secret) : null\r\n path = clientInfo.path\r\n\r\n try {\r\n if (path === '/') {\r\n if (!['POST', 'PUT'].includes(method)) throw new Response(\"Invalid method\", { status: 405 });\r\n method === \"POST\"\r\n ? await this.handshake(data, clientInfo)\r\n : await this.upload(data, clientInfo, signeture, args);\r\n }\r\n\r\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\r\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\r\n\r\n // if reques is expired\r\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\r\n\r\n await this.handleRequest({\r\n method,\r\n path,\r\n body: data,\r\n searchParams: clientInfo.searchParams,\r\n params: {}\r\n }, args);\r\n } catch (info: any) {\r\n const isError = info instanceof Error\r\n const isResponse = info instanceof Response\r\n let content = isError ? info.message : (isResponse ? await info.text() : info);\r\n\r\n return {\r\n status: isError ? 404 : (info?.status || 200),\r\n content: await crypto.encryptBuffer(content, clientInfo.secret)\r\n };\r\n }\r\n\r\n return {\r\n status: 404,\r\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\r\n };\r\n }\r\n\r\n}\r\n\r\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","data","clientInfo","serverSecret","this","getSecret","Error","hash","secret","Date","now","clientTime","serverTime","timeDiffarenc","getTime","signeture","crypto","encrypt","expire","upload","args","decryptSigneture","decrypt","isValidSigneture","_a","config","chunk","_b","complete","Response","status","type","meta","uploadMeta","get","fileid","failed","delete","success","set","Object","assign","forEach","key","fileId","chunkIndex","filename","filesize","filetype","totalChunks","filepath","listen","path","body","method","origin","decryptBuffer","includes","handleRequest","searchParams","params","info","isError","isResponse","content","message","text","encryptBuffer","exports","default"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { ArgsInfo, ListenerInfo, ServerResponse } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/FileScaner\";\n\nclass SecurequServer extends SecurequServerBase {\n\n async handshake(body: any, clientInfo: any) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const serverSecret = await this.getSecret()\n if (!data) throw new Error(\"Invalid handshake data\");\n if (data.hash !== clientInfo.hash) {\n throw new Error(\"Invalid handshake\");\n } else if (data.secret !== clientInfo.secret) {\n throw new Error(\"Invalid handshake secret\");\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\n throw new Error(\"Handshake expired\");\n }\n\n const serverTime = new Date();\n const clientDate = new Date(data.clientTime);\n const offsetMs = clientDate.getTime() - serverTime.getTime();\n\n let info = {\n timeDiffarenc: offsetMs,\n maxFileSize: this.config.upload?.maxFilesize || null,\n dev: this.config.mode === 'development',\n checkFileType: this.config.upload?.checkFileType || false,\n signeture: await crypto.encrypt({\n expire: Date.now() + 30000, // 30 seconds\n hash: clientInfo.hash\n }, serverSecret)\n }\n throw info\n }\n\n async upload(body: any, clientInfo: any, signeture: string, args?: ArgsInfo) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n const upload = this.config.upload\n\n if (!upload?.chunk || !upload?.complete) {\n throw new Response(\"Upload not supported\", { status: 403 })\n }\n\n if (data?.type === 'failed') {\n const meta = this.uploadMeta.get(data.fileid)\n if (meta && upload.failed) {\n await upload.failed(meta, args)\n this.uploadMeta.delete(data.fileid)\n throw { success: true }\n } else {\n throw new Response(\"Invalid upload\", { status: 400 })\n }\n } else if (data.type === 'meta') {\n if (upload?.maxFilesize && data.filesize > upload.maxFilesize * 1024) {\n throw new Response(`File size exceeds the limit of ${upload.maxFilesize} KB`, { status: 413 })\n }\n this.uploadMeta.set(data.fileid, {\n ...data,\n expire: Date.now() + 3600000 // 1 hour\n })\n this.uploadMeta.forEach((meta, key) => {\n if (meta.expire < Date.now()) {\n this.uploadMeta.delete(key)\n }\n })\n\n throw data\n } else {\n const { chunk, fileId, chunkIndex } = data;\n const meta = this.uploadMeta.get(fileId)\n if (!meta) {\n throw new Response(\"Invalid upload meta\", { status: 400 })\n }\n if (upload.checkFileType && chunkIndex === 0) {\n let fileType = fileScaner(chunk);\n if (!fileType) {\n throw new Error(\"Unknown or unsupported file type\");\n }\n }\n\n if (this.config.upload?.maxFilesize && data.filesize > this.config.upload.maxFilesize * 1024) {\n throw new Response(`File size exceeds the limit of ${this.config.upload.maxFilesize / 1024} MB`, { status: 413 })\n }\n await upload.chunk(chunk, {\n filename: meta.filename,\n filesize: meta.filesize,\n filetype: meta.filetype,\n fileid: meta.fileid,\n totalChunks: meta.totalChunks,\n chunkIndex,\n }, args)\n if (chunkIndex + 1 === meta.totalChunks) {\n const filepath = await upload.complete(meta, args)\n this.uploadMeta.delete(fileId)\n throw filepath\n }\n throw data\n }\n }\n\n async listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse> {\n let clientInfo = await this.clientInfo(path, origin)\n path = clientInfo.path\n const isDev = path !== '/' && this.config.mode === 'development'\n try {\n if (path === '/') {\n if (!['POST', 'PUT'].includes(method)) throw new Response(\"Invalid method\", { status: 405 });\n method === \"POST\"\n ? await this.handshake(body, clientInfo)\n : await this.upload(body, clientInfo, signeture, args);\n }\n\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n\n // if reques is expired\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\n let data: any = null\n if (body) {\n if (isDev) {\n const decoder = new TextDecoder();\n const text = decoder.decode(body);\n data = JSON.parse(text)\n } else {\n data = await crypto.decryptBuffer(body, clientInfo.secret)\n }\n }\n\n await this.handleRequest({\n method,\n path,\n body: data,\n searchParams: clientInfo.searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n const isError = info instanceof Error\n const isResponse = info instanceof Response\n let content = isError ? info.message : (isResponse ? await info.text() : info);\n if (path === '/') {\n\n }\n if (isDev) {\n return {\n status: isError ? 404 : (info?.status || 200),\n content: JSON.stringify(content)\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n content: await crypto.encryptBuffer(content, clientInfo.secret)\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n content: \"Not found\"\n };\n }\n\n return {\n status: 404,\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","body","clientInfo","data","crypto","decryptBuffer","secret","serverSecret","this","getSecret","Error","hash","Date","now","clientTime","serverTime","timeDiffarenc","getTime","maxFileSize","_a","config","upload","maxFilesize","dev","mode","checkFileType","_b","signeture","encrypt","expire","args","decryptSigneture","decrypt","isValidSigneture","chunk","complete","Response","status","type","meta","uploadMeta","get","fileid","failed","delete","success","filesize","set","Object","assign","forEach","key","fileId","chunkIndex","fileScaner","filename","filetype","totalChunks","filepath","listen","path","method","origin","isDev","includes","text","TextDecoder","decode","JSON","parse","handleRequest","searchParams","params","info","isError","isResponse","content","message","stringify","encryptBuffer","exports","default"],"mappings":"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"}
|
package/server/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"../include/crypto.mjs";import t from"./Base.mjs";class a extends t{async handshake(t,
|
|
1
|
+
import e from"../include/crypto.mjs";import t from"./Base.mjs";import{fileScaner as i}from"../include/FileScaner.mjs";class a extends t{async handshake(t,i){var a,s;const n=await e.decryptBuffer(t,i.secret),o=await this.getSecret();if(!n)throw new Error("Invalid handshake data");if(n.hash!==i.hash)throw new Error("Invalid handshake");if(n.secret!==i.secret)throw new Error("Invalid handshake secret");if(Date.now()-n.clientTime>3e4)throw new Error("Handshake expired");const l=new Date;throw{timeDiffarenc:new Date(n.clientTime).getTime()-l.getTime(),maxFileSize:(null===(a=this.config.upload)||void 0===a?void 0:a.maxFilesize)||null,dev:"development"===this.config.mode,checkFileType:(null===(s=this.config.upload)||void 0===s?void 0:s.checkFileType)||!1,signeture:await e.encrypt({expire:Date.now()+3e4,hash:i.hash},o)}}async upload(t,a,s,n){var o;const l=await e.decryptBuffer(t,a.secret),r=await e.decrypt(s,a.secret);await this.isValidSigneture(r.signeture,a.hash);const d=this.config.upload;if(!(null==d?void 0:d.chunk)||!(null==d?void 0:d.complete))throw new Response("Upload not supported",{status:403});if("failed"===(null==l?void 0:l.type)){const e=this.uploadMeta.get(l.fileid);throw e&&d.failed?(await d.failed(e,n),this.uploadMeta.delete(l.fileid),{success:!0}):new Response("Invalid upload",{status:400})}if("meta"===l.type){if((null==d?void 0:d.maxFilesize)&&l.filesize>1024*d.maxFilesize)throw new Response(`File size exceeds the limit of ${d.maxFilesize} KB`,{status:413});throw this.uploadMeta.set(l.fileid,Object.assign(Object.assign({},l),{expire:Date.now()+36e5})),this.uploadMeta.forEach((e,t)=>{e.expire<Date.now()&&this.uploadMeta.delete(t)}),l}{const{chunk:e,fileId:t,chunkIndex:a}=l,s=this.uploadMeta.get(t);if(!s)throw new Response("Invalid upload meta",{status:400});if(d.checkFileType&&0===a){if(!i(e))throw new Error("Unknown or unsupported file type")}if((null===(o=this.config.upload)||void 0===o?void 0:o.maxFilesize)&&l.filesize>1024*this.config.upload.maxFilesize)throw new Response(`File size exceeds the limit of ${this.config.upload.maxFilesize/1024} MB`,{status:413});if(await d.chunk(e,{filename:s.filename,filesize:s.filesize,filetype:s.filetype,fileid:s.fileid,totalChunks:s.totalChunks,chunkIndex:a},n),a+1===s.totalChunks){const e=await d.complete(s,n);throw this.uploadMeta.delete(t),e}throw l}}async listen({path:t,body:i,method:a,origin:s,signeture:n},o){let l=await this.clientInfo(t,s);const r="/"!==(t=l.path)&&"development"===this.config.mode;try{if("/"===t){if(!["POST","PUT"].includes(a))throw new Response("Invalid method",{status:405});"POST"===a?await this.handshake(i,l):await this.upload(i,l,n,o)}const s=await e.decrypt(n,l.secret);if(await this.isValidSigneture(s.signeture,l.hash),s.expire<Date.now())throw new Response("Request expired",{status:403});let d=null;if(i)if(r){const e=(new TextDecoder).decode(i);d=JSON.parse(e)}else d=await e.decryptBuffer(i,l.secret);await this.handleRequest({method:a,path:t,body:d,searchParams:l.searchParams,params:{}},o)}catch(t){const i=t instanceof Error,a=t instanceof Response;let s=i?t.message:a?await t.text():t;return r?{status:i?404:(null==t?void 0:t.status)||200,content:JSON.stringify(s)}:{status:i?404:(null==t?void 0:t.status)||200,content:await e.encryptBuffer(s,l.secret)}}return r?{status:404,content:"Not found"}:{status:404,content:await e.encryptBuffer("Not found",l.secret)}}}export{a as default};//# sourceMappingURL=index.mjs.map
|
package/server/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\r\nimport { ArgsInfo, ListenerInfo, ServerResponse } from \"./types\";\r\nimport SecurequServerBase from \"./Base\";\r\n\r\nclass SecurequServer extends SecurequServerBase {\r\n\r\n\r\n async handshake(data: any, clientInfo: any) {\r\n const serverSecret = await this.getSecret()\r\n if (!data) throw new Error(\"Invalid handshake data\");\r\n if (data.hash !== clientInfo.hash) {\r\n throw new Error(\"Invalid handshake\");\r\n } else if (data.secret !== clientInfo.secret) {\r\n throw new Error(\"Invalid handshake secret\");\r\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\r\n throw new Error(\"Handshake expired\");\r\n }\r\n\r\n const serverTime = new Date();\r\n const clientDate = new Date(data.clientTime);\r\n const offsetMs = clientDate.getTime() - serverTime.getTime();\r\n\r\n let info = {\r\n timeDiffarenc: offsetMs,\r\n signeture: await crypto.encrypt({\r\n expire: Date.now() + 30000, // 30 seconds\r\n hash: clientInfo.hash\r\n }, serverSecret)\r\n }\r\n throw info\r\n }\r\n\r\n async upload(data: any, clientInfo: any, signeture: string, args?: ArgsInfo) {\r\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\r\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\r\n\r\n if (!this.config.upload?.chunk || !this.config.upload?.complete) {\r\n throw new Response(\"Upload not supported\", { status: 403 })\r\n }\r\n\r\n if (data?.type === 'failed') {\r\n const meta = this.uploadMeta.get(data.fileid)\r\n if (meta && this.config.upload.failed) {\r\n await this.config.upload.failed(meta, args)\r\n this.uploadMeta.delete(data.fileid)\r\n throw { success: true }\r\n } else {\r\n throw new Response(\"Invalid upload\", { status: 400 })\r\n }\r\n } else if (data.type === 'meta') {\r\n this.uploadMeta.set(data.fileid, {\r\n ...data,\r\n expire: Date.now() + 3600000 // 1 hour\r\n })\r\n this.uploadMeta.forEach((meta, key) => {\r\n if (meta.expire < Date.now()) {\r\n this.uploadMeta.delete(key)\r\n }\r\n })\r\n\r\n throw data\r\n } else {\r\n const { chunk, fileId, chunkIndex } = data;\r\n const meta = this.uploadMeta.get(fileId)\r\n if (!meta) {\r\n throw new Response(\"Invalid upload meta\", { status: 400 })\r\n }\r\n const upload = this.config.upload\r\n await upload.chunk(chunk, {\r\n filename: meta.filename,\r\n filesize: meta.filesize,\r\n filetype: meta.filetype,\r\n fileid: meta.fileid,\r\n totalChunks: meta.totalChunks,\r\n chunkIndex,\r\n }, args)\r\n if (chunkIndex + 1 === meta.totalChunks) {\r\n const filepath = await upload.complete(meta, args)\r\n this.uploadMeta.delete(fileId)\r\n throw filepath\r\n }\r\n throw data\r\n }\r\n }\r\n\r\n async listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse> {\r\n let clientInfo = await this.clientInfo(path, origin)\r\n const data: any = body ? await crypto.decryptBuffer(body, clientInfo.secret) : null\r\n path = clientInfo.path\r\n\r\n try {\r\n if (path === '/') {\r\n if (!['POST', 'PUT'].includes(method)) throw new Response(\"Invalid method\", { status: 405 });\r\n method === \"POST\"\r\n ? await this.handshake(data, clientInfo)\r\n : await this.upload(data, clientInfo, signeture, args);\r\n }\r\n\r\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\r\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\r\n\r\n // if reques is expired\r\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\r\n\r\n await this.handleRequest({\r\n method,\r\n path,\r\n body: data,\r\n searchParams: clientInfo.searchParams,\r\n params: {}\r\n }, args);\r\n } catch (info: any) {\r\n const isError = info instanceof Error\r\n const isResponse = info instanceof Response\r\n let content = isError ? info.message : (isResponse ? await info.text() : info);\r\n\r\n return {\r\n status: isError ? 404 : (info?.status || 200),\r\n content: await crypto.encryptBuffer(content, clientInfo.secret)\r\n };\r\n }\r\n\r\n return {\r\n status: 404,\r\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\r\n };\r\n }\r\n\r\n}\r\n\r\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","data","clientInfo","serverSecret","this","getSecret","Error","hash","secret","Date","now","clientTime","serverTime","timeDiffarenc","getTime","signeture","crypto","encrypt","expire","upload","args","decryptSigneture","decrypt","isValidSigneture","_a","config","chunk","_b","complete","Response","status","type","meta","uploadMeta","get","fileid","failed","delete","success","set","Object","assign","forEach","key","fileId","chunkIndex","filename","filesize","filetype","totalChunks","filepath","listen","path","body","method","origin","decryptBuffer","includes","handleRequest","searchParams","params","info","isError","isResponse","content","message","text","encryptBuffer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/server/index.ts"],"sourcesContent":["import crypto from \"../include/crypto\";\nimport { ArgsInfo, ListenerInfo, ServerResponse } from \"./types\";\nimport SecurequServerBase from \"./Base\";\nimport fileScaner from \"../include/FileScaner\";\n\nclass SecurequServer extends SecurequServerBase {\n\n async handshake(body: any, clientInfo: any) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const serverSecret = await this.getSecret()\n if (!data) throw new Error(\"Invalid handshake data\");\n if (data.hash !== clientInfo.hash) {\n throw new Error(\"Invalid handshake\");\n } else if (data.secret !== clientInfo.secret) {\n throw new Error(\"Invalid handshake secret\");\n } else if (Date.now() - data.clientTime > 30000) { // 30 seconds\n throw new Error(\"Handshake expired\");\n }\n\n const serverTime = new Date();\n const clientDate = new Date(data.clientTime);\n const offsetMs = clientDate.getTime() - serverTime.getTime();\n\n let info = {\n timeDiffarenc: offsetMs,\n maxFileSize: this.config.upload?.maxFilesize || null,\n dev: this.config.mode === 'development',\n checkFileType: this.config.upload?.checkFileType || false,\n signeture: await crypto.encrypt({\n expire: Date.now() + 30000, // 30 seconds\n hash: clientInfo.hash\n }, serverSecret)\n }\n throw info\n }\n\n async upload(body: any, clientInfo: any, signeture: string, args?: ArgsInfo) {\n const data: any = await crypto.decryptBuffer(body, clientInfo.secret)\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n const upload = this.config.upload\n\n if (!upload?.chunk || !upload?.complete) {\n throw new Response(\"Upload not supported\", { status: 403 })\n }\n\n if (data?.type === 'failed') {\n const meta = this.uploadMeta.get(data.fileid)\n if (meta && upload.failed) {\n await upload.failed(meta, args)\n this.uploadMeta.delete(data.fileid)\n throw { success: true }\n } else {\n throw new Response(\"Invalid upload\", { status: 400 })\n }\n } else if (data.type === 'meta') {\n if (upload?.maxFilesize && data.filesize > upload.maxFilesize * 1024) {\n throw new Response(`File size exceeds the limit of ${upload.maxFilesize} KB`, { status: 413 })\n }\n this.uploadMeta.set(data.fileid, {\n ...data,\n expire: Date.now() + 3600000 // 1 hour\n })\n this.uploadMeta.forEach((meta, key) => {\n if (meta.expire < Date.now()) {\n this.uploadMeta.delete(key)\n }\n })\n\n throw data\n } else {\n const { chunk, fileId, chunkIndex } = data;\n const meta = this.uploadMeta.get(fileId)\n if (!meta) {\n throw new Response(\"Invalid upload meta\", { status: 400 })\n }\n if (upload.checkFileType && chunkIndex === 0) {\n let fileType = fileScaner(chunk);\n if (!fileType) {\n throw new Error(\"Unknown or unsupported file type\");\n }\n }\n\n if (this.config.upload?.maxFilesize && data.filesize > this.config.upload.maxFilesize * 1024) {\n throw new Response(`File size exceeds the limit of ${this.config.upload.maxFilesize / 1024} MB`, { status: 413 })\n }\n await upload.chunk(chunk, {\n filename: meta.filename,\n filesize: meta.filesize,\n filetype: meta.filetype,\n fileid: meta.fileid,\n totalChunks: meta.totalChunks,\n chunkIndex,\n }, args)\n if (chunkIndex + 1 === meta.totalChunks) {\n const filepath = await upload.complete(meta, args)\n this.uploadMeta.delete(fileId)\n throw filepath\n }\n throw data\n }\n }\n\n async listen({ path, body, method, origin, signeture }: ListenerInfo, args?: ArgsInfo): Promise<ServerResponse> {\n let clientInfo = await this.clientInfo(path, origin)\n path = clientInfo.path\n const isDev = path !== '/' && this.config.mode === 'development'\n try {\n if (path === '/') {\n if (!['POST', 'PUT'].includes(method)) throw new Response(\"Invalid method\", { status: 405 });\n method === \"POST\"\n ? await this.handshake(body, clientInfo)\n : await this.upload(body, clientInfo, signeture, args);\n }\n\n const decryptSigneture = await crypto.decrypt(signeture, clientInfo.secret) as any\n await this.isValidSigneture(decryptSigneture.signeture, clientInfo.hash)\n\n // if reques is expired\n if (decryptSigneture.expire < Date.now()) throw new Response(\"Request expired\", { status: 403 });\n let data: any = null\n if (body) {\n if (isDev) {\n const decoder = new TextDecoder();\n const text = decoder.decode(body);\n data = JSON.parse(text)\n } else {\n data = await crypto.decryptBuffer(body, clientInfo.secret)\n }\n }\n\n await this.handleRequest({\n method,\n path,\n body: data,\n searchParams: clientInfo.searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n const isError = info instanceof Error\n const isResponse = info instanceof Response\n let content = isError ? info.message : (isResponse ? await info.text() : info);\n if (path === '/') {\n\n }\n if (isDev) {\n return {\n status: isError ? 404 : (info?.status || 200),\n content: JSON.stringify(content)\n };\n }\n return {\n status: isError ? 404 : (info?.status || 200),\n content: await crypto.encryptBuffer(content, clientInfo.secret)\n };\n }\n\n if (isDev) {\n return {\n status: 404,\n content: \"Not found\"\n };\n }\n\n return {\n status: 404,\n content: await crypto.encryptBuffer(\"Not found\", clientInfo.secret)\n };\n }\n\n}\n\nexport default SecurequServer;"],"names":["SecurequServer","SecurequServerBase","handshake","body","clientInfo","data","crypto","decryptBuffer","secret","serverSecret","this","getSecret","Error","hash","Date","now","clientTime","serverTime","timeDiffarenc","getTime","maxFileSize","_a","config","upload","maxFilesize","dev","mode","checkFileType","_b","signeture","encrypt","expire","args","decryptSigneture","decrypt","isValidSigneture","chunk","complete","Response","status","type","meta","uploadMeta","get","fileid","failed","delete","success","filesize","set","Object","assign","forEach","key","fileId","chunkIndex","fileScaner","filename","filetype","totalChunks","filepath","listen","path","method","origin","isDev","includes","text","TextDecoder","decode","JSON","parse","handleRequest","searchParams","params","info","isError","isResponse","content","message","stringify","encryptBuffer"],"mappings":"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"}
|