vortez 4.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/.gitignore +13 -0
- package/LICENSE +201 -0
- package/Notes.md +12 -0
- package/README.md +372 -0
- package/build/Beta/JwtManager.d.ts +114 -0
- package/build/Beta/JwtManager.js +249 -0
- package/build/Beta/JwtManager.js.map +1 -0
- package/build/Beta/Mail.d.ts +60 -0
- package/build/Beta/Mail.js +192 -0
- package/build/Beta/Mail.js.map +1 -0
- package/build/Config.d.ts +39 -0
- package/build/Config.js +33 -0
- package/build/Config.js.map +1 -0
- package/build/ConsoleUI.d.ts +57 -0
- package/build/ConsoleUI.js +110 -0
- package/build/ConsoleUI.js.map +1 -0
- package/build/Debug.d.ts +154 -0
- package/build/Debug.js +256 -0
- package/build/Debug.js.map +1 -0
- package/build/LoggerManager/Logger.d.ts +23 -0
- package/build/LoggerManager/Logger.js +23 -0
- package/build/LoggerManager/Logger.js.map +1 -0
- package/build/LoggerManager/LoggerManager.d.ts +18 -0
- package/build/LoggerManager/LoggerManager.js +30 -0
- package/build/LoggerManager/LoggerManager.js.map +1 -0
- package/build/Server/BodyParser.d.ts +125 -0
- package/build/Server/BodyParser.js +162 -0
- package/build/Server/BodyParser.js.map +1 -0
- package/build/Server/Cookie.d.ts +72 -0
- package/build/Server/Cookie.js +102 -0
- package/build/Server/Cookie.js.map +1 -0
- package/build/Server/Request.d.ts +61 -0
- package/build/Server/Request.js +79 -0
- package/build/Server/Request.js.map +1 -0
- package/build/Server/Response.d.ts +90 -0
- package/build/Server/Response.js +241 -0
- package/build/Server/Response.js.map +1 -0
- package/build/Server/Rule.d.ts +81 -0
- package/build/Server/Rule.js +146 -0
- package/build/Server/Rule.js.map +1 -0
- package/build/Server/Server.d.ts +157 -0
- package/build/Server/Server.js +330 -0
- package/build/Server/Server.js.map +1 -0
- package/build/Server/Session.d.ts +66 -0
- package/build/Server/Session.js +97 -0
- package/build/Server/Session.js.map +1 -0
- package/build/Server/WebSocket/Chunk.d.ts +36 -0
- package/build/Server/WebSocket/Chunk.js +81 -0
- package/build/Server/WebSocket/Chunk.js.map +1 -0
- package/build/Server/WebSocket/WebSocket.d.ts +70 -0
- package/build/Server/WebSocket/WebSocket.js +184 -0
- package/build/Server/WebSocket/WebSocket.js.map +1 -0
- package/build/Template.d.ts +32 -0
- package/build/Template.js +69 -0
- package/build/Template.js.map +1 -0
- package/build/Utilities/Env.d.ts +75 -0
- package/build/Utilities/Env.js +123 -0
- package/build/Utilities/Env.js.map +1 -0
- package/build/Utilities/Path.d.ts +18 -0
- package/build/Utilities/Path.js +27 -0
- package/build/Utilities/Path.js.map +1 -0
- package/build/Utilities/Utilities.d.ts +147 -0
- package/build/Utilities/Utilities.js +110 -0
- package/build/Utilities/Utilities.js.map +1 -0
- package/build/Vortez.d.ts +20 -0
- package/build/Vortez.js +22 -0
- package/build/Vortez.js.map +1 -0
- package/changes.md +89 -0
- package/examples/in-docs.js +96 -0
- package/global/Source/Logo_960.png +0 -0
- package/global/Source/Logo_SM_960.png +0 -0
- package/global/Style/Template/Error.css +30 -0
- package/global/Style/Template/Folder.css +77 -0
- package/global/Style/Template/Template.css +128 -0
- package/global/Template/Error.vhtml +29 -0
- package/global/Template/Folder.vhtml +41 -0
- package/package.json +47 -0
- package/tests/Template/template.js +18 -0
- package/tests/Template/template.txt +13 -0
- package/tests/Template/template.vhtml +23 -0
- package/tests/debug.js +28 -0
- package/tests/jwtManager/jwtManager.js +110 -0
- package/tests/test.js +129 -0
- package/tests/test.vhtml +14 -0
- package/tests/utilities.js +28 -0
- package/tests/websocket.vhtml +86 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Añade la forma de WebSockets a `Vortez`.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare class Chunk implements Chunk.Info {
|
|
7
|
+
fin: Boolean;
|
|
8
|
+
rsv: number;
|
|
9
|
+
opCode: number;
|
|
10
|
+
mask: Boolean;
|
|
11
|
+
size: number | bigint;
|
|
12
|
+
maskKeys: Buffer | null;
|
|
13
|
+
infoSize: number;
|
|
14
|
+
chunkSize: number;
|
|
15
|
+
chunk: Buffer;
|
|
16
|
+
surplus: Buffer;
|
|
17
|
+
constructor(chunk: Buffer);
|
|
18
|
+
pushData(data: Buffer): void;
|
|
19
|
+
getChunk(): Buffer;
|
|
20
|
+
isWaiting(): boolean;
|
|
21
|
+
decode(): Buffer;
|
|
22
|
+
static getInfo(chunk: Buffer): Chunk.Info;
|
|
23
|
+
static decode(chunk: Buffer, bytesInfo: number, maskKeys: Buffer | undefined): Buffer<ArrayBuffer>;
|
|
24
|
+
}
|
|
25
|
+
export declare namespace Chunk {
|
|
26
|
+
interface Info {
|
|
27
|
+
fin: Boolean;
|
|
28
|
+
rsv: number;
|
|
29
|
+
opCode: number;
|
|
30
|
+
mask: Boolean;
|
|
31
|
+
size: number | bigint;
|
|
32
|
+
maskKeys: Buffer | null;
|
|
33
|
+
infoSize: number;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export default Chunk;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Añade la forma de WebSockets a `Vortez`.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export class Chunk {
|
|
7
|
+
fin;
|
|
8
|
+
rsv;
|
|
9
|
+
opCode;
|
|
10
|
+
mask;
|
|
11
|
+
size;
|
|
12
|
+
maskKeys;
|
|
13
|
+
infoSize;
|
|
14
|
+
chunkSize;
|
|
15
|
+
chunk;
|
|
16
|
+
surplus;
|
|
17
|
+
constructor(chunk) {
|
|
18
|
+
const { fin, rsv, opCode, mask, size, maskKeys, infoSize: infoSize } = Chunk.getInfo(chunk);
|
|
19
|
+
this.fin = fin;
|
|
20
|
+
this.rsv = rsv;
|
|
21
|
+
this.opCode = opCode;
|
|
22
|
+
this.mask = mask;
|
|
23
|
+
this.size = size;
|
|
24
|
+
this.maskKeys = maskKeys;
|
|
25
|
+
this.infoSize = infoSize;
|
|
26
|
+
this.chunkSize = Number(size) + infoSize;
|
|
27
|
+
if (chunk.length > (BigInt(size) + BigInt(infoSize))) {
|
|
28
|
+
this.surplus = chunk.subarray(this.chunkSize);
|
|
29
|
+
this.chunk = chunk.subarray(0, this.chunkSize);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.surplus = Buffer.alloc(0);
|
|
33
|
+
this.chunk = chunk;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
pushData(data) {
|
|
37
|
+
this.chunk = Buffer.concat([this.chunk, data]);
|
|
38
|
+
if (this.chunk.length > this.chunkSize) {
|
|
39
|
+
this.surplus = this.chunk.subarray(this.chunkSize);
|
|
40
|
+
this.chunk = this.chunk.subarray(0, this.chunkSize);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
getChunk() { return this.chunk; }
|
|
44
|
+
isWaiting() { return this.chunk.length < this.chunkSize; }
|
|
45
|
+
decode() {
|
|
46
|
+
return Chunk.decode(this.chunk, this.infoSize, this.maskKeys ?? undefined);
|
|
47
|
+
}
|
|
48
|
+
static getInfo(chunk) {
|
|
49
|
+
const fin = Boolean(((chunk[0] >>> 0x7) & 0x01));
|
|
50
|
+
const rsv = ((chunk[0] >>> 0x4) & 0x07);
|
|
51
|
+
const opCode = (chunk[0] & 0x0f);
|
|
52
|
+
const mask = Boolean(((chunk[1] >>> 0x7) & 0x01));
|
|
53
|
+
let size = (chunk[1] & 0x7f);
|
|
54
|
+
let maskKeys = null;
|
|
55
|
+
let bytesInfo = null;
|
|
56
|
+
if (size == 0x7f) {
|
|
57
|
+
size = chunk.readBigUint64BE(2);
|
|
58
|
+
maskKeys = mask ? chunk.subarray(10, 14) : null;
|
|
59
|
+
bytesInfo = mask ? 14 : 10;
|
|
60
|
+
}
|
|
61
|
+
else if (size == 0x7e) {
|
|
62
|
+
size = chunk.readUint16BE(2);
|
|
63
|
+
maskKeys = mask ? chunk.subarray(4, 8) : null;
|
|
64
|
+
bytesInfo = mask ? 8 : 4;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
maskKeys = mask ? chunk.subarray(2, 6) : null;
|
|
68
|
+
bytesInfo = mask ? 6 : 2;
|
|
69
|
+
}
|
|
70
|
+
return { fin, rsv, opCode, mask, size, maskKeys, infoSize: bytesInfo };
|
|
71
|
+
}
|
|
72
|
+
static decode(chunk, bytesInfo, maskKeys) {
|
|
73
|
+
const decoded = [];
|
|
74
|
+
for (let index = bytesInfo, indexMask = 0; index < chunk.length; index++, indexMask++) {
|
|
75
|
+
decoded.push(chunk[index] ^ (maskKeys ? maskKeys[indexMask % 4] : 0));
|
|
76
|
+
}
|
|
77
|
+
return Buffer.from(decoded);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export default Chunk;
|
|
81
|
+
//# sourceMappingURL=Chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chunk.js","sourceRoot":"","sources":["../../../src/Server/WebSocket/Chunk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Añade la forma de WebSockets a `Vortez`.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import EVENTS from 'events';
|
|
7
|
+
import { Duplex } from 'stream';
|
|
8
|
+
import Cookie from '../Cookie.js';
|
|
9
|
+
export declare class WebSocket extends EVENTS {
|
|
10
|
+
/**Contiene la conexión con el cliente. */
|
|
11
|
+
private connection;
|
|
12
|
+
/**
|
|
13
|
+
* Crea una conexión WebSocket.
|
|
14
|
+
* @param client La conexión Duplex con el cliente.
|
|
15
|
+
*/
|
|
16
|
+
constructor(client: Duplex);
|
|
17
|
+
/**
|
|
18
|
+
* Acepta la conexión del cliente.
|
|
19
|
+
* @param acceptKey La llave de conexión `sec-websocket-key`.
|
|
20
|
+
*/
|
|
21
|
+
acceptConnection(acceptKey: string, cookies?: Cookie): void;
|
|
22
|
+
/** Finaliza la conexión esperando a que se terminen de enviar/recibir los datos pendientes. */
|
|
23
|
+
end(): void;
|
|
24
|
+
/** Finaliza la conexión de forma abrupta. */
|
|
25
|
+
destroy(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Envía un dato como respuesta.
|
|
28
|
+
* @param data El dato que se enviara.
|
|
29
|
+
*/
|
|
30
|
+
send(data: String | Buffer): void;
|
|
31
|
+
/**
|
|
32
|
+
* Envía un JSON como respuesta.
|
|
33
|
+
* @param data los datos que enviaras como JSON.
|
|
34
|
+
*/
|
|
35
|
+
SendJson(data: any): void;
|
|
36
|
+
/**
|
|
37
|
+
* Codifica los datos para enviar por el WebSocket.
|
|
38
|
+
* @param data Los datos que se van a codificar.
|
|
39
|
+
* @param Text indica si el contenido es texto o no.
|
|
40
|
+
*/
|
|
41
|
+
private encode;
|
|
42
|
+
/**
|
|
43
|
+
* Convierte un string en un Buffer.
|
|
44
|
+
* @param message El string a transformar.
|
|
45
|
+
*/
|
|
46
|
+
private stringToBuffer;
|
|
47
|
+
/**Añade los disparadores de evento.*/
|
|
48
|
+
private initEvents;
|
|
49
|
+
on(event: 'close', listener: WebSocket.listener.close): this;
|
|
50
|
+
on(event: 'error', listener: WebSocket.listener.error): this;
|
|
51
|
+
on(event: 'finish', listener: WebSocket.listener.finish): this;
|
|
52
|
+
on(event: 'message', listener: WebSocket.listener.message): this;
|
|
53
|
+
off(event: 'close', listener: WebSocket.listener.close): this;
|
|
54
|
+
off(event: 'error', listener: WebSocket.listener.error): this;
|
|
55
|
+
off(event: 'finish', listener: WebSocket.listener.finish): this;
|
|
56
|
+
off(event: 'message', listener: WebSocket.listener.message): this;
|
|
57
|
+
}
|
|
58
|
+
export declare namespace WebSocket {
|
|
59
|
+
namespace listener {
|
|
60
|
+
type close = () => void;
|
|
61
|
+
type error = (error: Error) => void;
|
|
62
|
+
type finish = () => void;
|
|
63
|
+
type message = (datos: Buffer, info: dataInfo) => void;
|
|
64
|
+
}
|
|
65
|
+
interface dataInfo {
|
|
66
|
+
opCode: number;
|
|
67
|
+
size: number | bigint;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export default WebSocket;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Añade la forma de WebSockets a `Vortez`.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import EVENTS from 'events';
|
|
7
|
+
import CRYPTO from 'crypto';
|
|
8
|
+
import Chunk from './Chunk.js';
|
|
9
|
+
export class WebSocket extends EVENTS {
|
|
10
|
+
/**Contiene la conexión con el cliente. */
|
|
11
|
+
connection;
|
|
12
|
+
/**
|
|
13
|
+
* Crea una conexión WebSocket.
|
|
14
|
+
* @param client La conexión Duplex con el cliente.
|
|
15
|
+
*/
|
|
16
|
+
constructor(client) {
|
|
17
|
+
super();
|
|
18
|
+
this.connection = client;
|
|
19
|
+
this.initEvents();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Acepta la conexión del cliente.
|
|
23
|
+
* @param acceptKey La llave de conexión `sec-websocket-key`.
|
|
24
|
+
*/
|
|
25
|
+
acceptConnection(acceptKey, cookies) {
|
|
26
|
+
const cookieSetters = cookies
|
|
27
|
+
? cookies.getSetters().map((setter) => `Set-Cookie: ${setter}`)
|
|
28
|
+
: [];
|
|
29
|
+
const acceptToken = CRYPTO.createHash('SHA1').update(acceptKey + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11').digest('base64');
|
|
30
|
+
const headers = [
|
|
31
|
+
'HTTP/1.1 101 Switching Protocols',
|
|
32
|
+
'Upgrade: websocket',
|
|
33
|
+
'Connection: Upgrade',
|
|
34
|
+
`Sec-WebSocket-Accept: ${acceptToken}`,
|
|
35
|
+
...cookieSetters, '\r\n'
|
|
36
|
+
].join('\r\n');
|
|
37
|
+
this.connection.write(headers);
|
|
38
|
+
}
|
|
39
|
+
/** Finaliza la conexión esperando a que se terminen de enviar/recibir los datos pendientes. */
|
|
40
|
+
end() { this.connection.end(); }
|
|
41
|
+
/** Finaliza la conexión de forma abrupta. */
|
|
42
|
+
destroy() { this.connection.destroy(); }
|
|
43
|
+
/**
|
|
44
|
+
* Envía un dato como respuesta.
|
|
45
|
+
* @param data El dato que se enviara.
|
|
46
|
+
*/
|
|
47
|
+
send(data) {
|
|
48
|
+
const [buffer, isText] = typeof data == 'string'
|
|
49
|
+
? [this.stringToBuffer(data), true]
|
|
50
|
+
: data instanceof Buffer
|
|
51
|
+
? [data, false]
|
|
52
|
+
: [this.stringToBuffer('[Error]: Dato enviado no soportado por NetFeez-Labs/WebSocket'), true];
|
|
53
|
+
const message = this.encode(buffer, isText);
|
|
54
|
+
this.connection.write(message);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Envía un JSON como respuesta.
|
|
58
|
+
* @param data los datos que enviaras como JSON.
|
|
59
|
+
*/
|
|
60
|
+
SendJson(data) {
|
|
61
|
+
const message = JSON.stringify(data);
|
|
62
|
+
this.send(message);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Codifica los datos para enviar por el WebSocket.
|
|
66
|
+
* @param data Los datos que se van a codificar.
|
|
67
|
+
* @param Text indica si el contenido es texto o no.
|
|
68
|
+
*/
|
|
69
|
+
encode(data, isText = false) {
|
|
70
|
+
const encoded = isText ? [129] : [130];
|
|
71
|
+
if (data.length <= 125) {
|
|
72
|
+
encoded[1] = data.length;
|
|
73
|
+
}
|
|
74
|
+
else if (data.length >= 126 && data.length <= 65535) {
|
|
75
|
+
encoded[1] = 126;
|
|
76
|
+
encoded[2] = (data.length >> 8) & 255;
|
|
77
|
+
encoded[3] = (data.length) & 255;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
encoded[1] = 127;
|
|
81
|
+
encoded[2] = (data.length >> 56) & 255;
|
|
82
|
+
encoded[3] = (data.length >> 48) & 255;
|
|
83
|
+
encoded[4] = (data.length >> 40) & 255;
|
|
84
|
+
encoded[5] = (data.length >> 32) & 255;
|
|
85
|
+
encoded[6] = (data.length >> 24) & 255;
|
|
86
|
+
encoded[7] = (data.length >> 16) & 255;
|
|
87
|
+
encoded[8] = (data.length >> 8) & 255;
|
|
88
|
+
encoded[9] = (data.length) & 255;
|
|
89
|
+
}
|
|
90
|
+
/* for (let index = 0; index < data.length; index ++) {
|
|
91
|
+
encoded.push(data[index]);
|
|
92
|
+
} */
|
|
93
|
+
encoded.push(...data);
|
|
94
|
+
return Buffer.from(encoded);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Convierte un string en un Buffer.
|
|
98
|
+
* @param message El string a transformar.
|
|
99
|
+
*/
|
|
100
|
+
stringToBuffer(message) {
|
|
101
|
+
return Buffer.from(message, 'utf-8');
|
|
102
|
+
}
|
|
103
|
+
/**Añade los disparadores de evento.*/
|
|
104
|
+
initEvents() {
|
|
105
|
+
let surplus = Buffer.alloc(0);
|
|
106
|
+
let currentChunk = null;
|
|
107
|
+
let chunks = [];
|
|
108
|
+
this.connection.on('data', (data) => {
|
|
109
|
+
if (surplus) {
|
|
110
|
+
data = Buffer.concat([surplus, data]);
|
|
111
|
+
surplus = Buffer.alloc(0);
|
|
112
|
+
}
|
|
113
|
+
if (!currentChunk)
|
|
114
|
+
currentChunk = new Chunk(data);
|
|
115
|
+
else if (currentChunk.isWaiting())
|
|
116
|
+
currentChunk.pushData(data);
|
|
117
|
+
if (!currentChunk.isWaiting()) {
|
|
118
|
+
chunks.push(currentChunk);
|
|
119
|
+
surplus = currentChunk.surplus;
|
|
120
|
+
if (currentChunk.fin) {
|
|
121
|
+
const decoded = Buffer.concat(chunks.map(chunk => chunk.decode()));
|
|
122
|
+
this.emit('message', decoded, {
|
|
123
|
+
opCode: chunks[0].opCode,
|
|
124
|
+
size: chunks[0].size
|
|
125
|
+
});
|
|
126
|
+
chunks = [];
|
|
127
|
+
}
|
|
128
|
+
currentChunk = null;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
this.connection.on('close', () => this.emit('close'));
|
|
132
|
+
this.connection.on('end', () => this.emit('finish'));
|
|
133
|
+
this.connection.on('error', (error) => this.emit('error', error));
|
|
134
|
+
}
|
|
135
|
+
on(event, listener) {
|
|
136
|
+
return super.on(event, listener);
|
|
137
|
+
}
|
|
138
|
+
off(event, listener) {
|
|
139
|
+
return super.off(event, listener);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export default WebSocket;
|
|
143
|
+
/* Para aceptar las peticiones de conexión a WebSocket
|
|
144
|
+
*
|
|
145
|
+
* HTTP/1.1 101 Switching Protocols
|
|
146
|
+
* Upgrade: websocket
|
|
147
|
+
* Connection: Upgrade
|
|
148
|
+
* Sec-WebSocket-Accept: Sec-Websocket-key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
|
|
149
|
+
* en HASH SHA-1 Codificado en Base64
|
|
150
|
+
*
|
|
151
|
+
** Formato del intercambio de datos
|
|
152
|
+
* 0 1 2 3
|
|
153
|
+
* 0 1 2 3
|
|
154
|
+
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
155
|
+
* +-+-+-+-+-------+-+-------------+-------------------------------+
|
|
156
|
+
* |F|R|R|R| opcode|M| Payload len | Extended payload length |
|
|
157
|
+
* |I|S|S|S| (4) |A| (7) | (16/64) |
|
|
158
|
+
* |N|V|V|V| |S| | (if payload len==126/127) |
|
|
159
|
+
* | |1|2|3| |K| | |
|
|
160
|
+
* +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|
|
161
|
+
* | Extended payload length continued, if payload len == 127 |
|
|
162
|
+
* + - - - - - - - - - - - - - - - +-------------------------------+
|
|
163
|
+
* | |Masking-key, if MASK set to 1 |
|
|
164
|
+
* +-------------------------------+-------------------------------+
|
|
165
|
+
* | Masking-key (continued) | Payload Data |
|
|
166
|
+
* +-------------------------------- - - - - - - - - - - - - - - - +
|
|
167
|
+
* : Payload Data continued ... :
|
|
168
|
+
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
|
169
|
+
* | Payload Data continued ... |
|
|
170
|
+
* +---------------------------------------------------------------+
|
|
171
|
+
*
|
|
172
|
+
*
|
|
173
|
+
* FIN y OPCODE funcionan juntos para entregar mensajes con marco separado
|
|
174
|
+
* Solo esta disponible en OPCODE 0x0 a 0x2
|
|
175
|
+
*
|
|
176
|
+
* OPCODES:
|
|
177
|
+
* Continuación = 0x0
|
|
178
|
+
* Texto = 0x1
|
|
179
|
+
* Binario = 0x2
|
|
180
|
+
* Cierre = 0x8
|
|
181
|
+
* Ping = 0x9
|
|
182
|
+
* Pong = 0xa
|
|
183
|
+
*/
|
|
184
|
+
//# sourceMappingURL=WebSocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocket.js","sourceRoot":"","sources":["../../../src/Server/WebSocket/WebSocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Add the HNetFeez-Labs template engine to the Vortez.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare class Template {
|
|
7
|
+
/** Regular expressions used to compile the template */
|
|
8
|
+
private static expressions;
|
|
9
|
+
/**
|
|
10
|
+
* Load and compile a template.
|
|
11
|
+
* @param path - The path to the template file.
|
|
12
|
+
* @param data - The data used to compile the template.
|
|
13
|
+
* @returns The compiled template.
|
|
14
|
+
* @throws Error if the path is not a file.
|
|
15
|
+
* @throws Error if the file does not exist.
|
|
16
|
+
*/
|
|
17
|
+
static load(path: string, data: Template.dataObject): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Compile a template.
|
|
20
|
+
* @param Content - The content of the template.
|
|
21
|
+
* @param data - The data used to compile the template.
|
|
22
|
+
* @returns The compiled template.
|
|
23
|
+
* @throws Error if key and value names are equal in object blocks.
|
|
24
|
+
*/
|
|
25
|
+
private static compile;
|
|
26
|
+
}
|
|
27
|
+
export declare namespace Template {
|
|
28
|
+
interface dataObject {
|
|
29
|
+
[key: string]: any;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export default Template;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Add the HNetFeez-Labs template engine to the Vortez.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import FS from 'fs';
|
|
7
|
+
import Utilities from './Utilities/Utilities.js';
|
|
8
|
+
export class Template {
|
|
9
|
+
/** Regular expressions used to compile the template */
|
|
10
|
+
static expressions = {
|
|
11
|
+
variable: /\$\{(.+?)\}/ig,
|
|
12
|
+
object: {
|
|
13
|
+
block: /\$ ?\((.+)\) ?\{([^]+?)\}/g,
|
|
14
|
+
replaces: /\%(.+?)%/g
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Load and compile a template.
|
|
19
|
+
* @param path - The path to the template file.
|
|
20
|
+
* @param data - The data used to compile the template.
|
|
21
|
+
* @returns The compiled template.
|
|
22
|
+
* @throws Error if the path is not a file.
|
|
23
|
+
* @throws Error if the file does not exist.
|
|
24
|
+
*/
|
|
25
|
+
static async load(path, data) {
|
|
26
|
+
path = Utilities.Path.normalize(path);
|
|
27
|
+
const details = await FS.promises.stat(path);
|
|
28
|
+
if (!details.isFile())
|
|
29
|
+
throw new Error('the path is not a template file');
|
|
30
|
+
const template = await FS.promises.readFile(path);
|
|
31
|
+
return this.compile(template.toString('utf-8'), data);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Compile a template.
|
|
35
|
+
* @param Content - The content of the template.
|
|
36
|
+
* @param data - The data used to compile the template.
|
|
37
|
+
* @returns The compiled template.
|
|
38
|
+
* @throws Error if key and value names are equal in object blocks.
|
|
39
|
+
*/
|
|
40
|
+
static compile(Content, data) {
|
|
41
|
+
Content = Content.replace(this.expressions.variable, (text, name) => {
|
|
42
|
+
return name && name in data ? data[name] : text;
|
|
43
|
+
});
|
|
44
|
+
Content = Content.replace(this.expressions.object.block, (block, sentence, loop) => {
|
|
45
|
+
const [name, keyName = 'key', valueName = 'value'] = sentence.split(/, ?/gi);
|
|
46
|
+
if (keyName === valueName)
|
|
47
|
+
throw new Error('the key and value names must be different in block: ' + block);
|
|
48
|
+
return name && name in data && data[name] instanceof Object ? Object.keys(data[name]).map((key) => {
|
|
49
|
+
return loop.replace(this.expressions.object.replaces, (SubText, varName) => {
|
|
50
|
+
if (keyName == varName)
|
|
51
|
+
return key;
|
|
52
|
+
else if (valueName == varName)
|
|
53
|
+
return data[name][key];
|
|
54
|
+
});
|
|
55
|
+
}).join('') : block;
|
|
56
|
+
});
|
|
57
|
+
return Content;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export default Template;
|
|
61
|
+
/*
|
|
62
|
+
Variables: ${name}
|
|
63
|
+
Objects/Arrays: $(name, keyName, valueName) { the key is $keyName and value $valueName }
|
|
64
|
+
Objects/Arrays: $(name) { the key is %key% and value %value% }
|
|
65
|
+
Objects/Arrays: $(name, customKeyName, customValueName) {
|
|
66
|
+
the key is %customKeyName% and value %customValueName%
|
|
67
|
+
}
|
|
68
|
+
*/
|
|
69
|
+
//# sourceMappingURL=Template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Template.js","sourceRoot":"","sources":["../src/Template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,SAAS,MAAM,0BAA0B,CAAC;AAEjD,MAAM,OAAO,QAAQ;IACpB,uDAAuD;IAC/C,MAAM,CAAC,WAAW,GAAG;QAC5B,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE;YACP,KAAK,EAAE,4BAA4B;YACnC,QAAQ,EAAE,WAAW;SACrB;KACD,CAAC;IACF;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,IAAyB;QAC/D,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,OAAO,CAAC,OAAe,EAAE,IAAyB;QAChE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACnE,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAa,EAAE,QAAgB,EAAE,IAAY,EAAE,EAAE;YAC1G,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7E,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,GAAG,KAAK,CAAC,CAAC;YAC3G,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjG,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;oBAC1E,IAAI,OAAO,IAAI,OAAO;wBAAE,OAAO,GAAG,CAAA;yBAC7B,IAAI,SAAS,IAAI,OAAO;wBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACvD,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IAChB,CAAC;;AASF,eAAe,QAAQ,CAAC;AACxB;;;;;;;EAOE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export declare class Env {
|
|
2
|
+
static get variables(): Env.EnvList;
|
|
3
|
+
/**
|
|
4
|
+
* Check if a file exists
|
|
5
|
+
* @param path - The path to the file
|
|
6
|
+
* @returns A promise that resolves to true if the file exists, false otherwise
|
|
7
|
+
*/
|
|
8
|
+
static fileExists(path: string): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Load the environment variables from the given path
|
|
11
|
+
* @param path - The path to the environment variables file
|
|
12
|
+
* @param options - Options to load the environment variables
|
|
13
|
+
* @returns The loaded environment variables as an object
|
|
14
|
+
* @throws Error if the environment variables file does not exist and cannot be created
|
|
15
|
+
* @throws Error if the environment variables file is not readable
|
|
16
|
+
*/
|
|
17
|
+
static load(path: string, options?: Env.LoadOptions): Promise<Env.EnvList>;
|
|
18
|
+
static loadSync(path: string, options?: Env.LoadOptions): Env.EnvList;
|
|
19
|
+
/**
|
|
20
|
+
* Extract the environment variables from the given content
|
|
21
|
+
* @param content - The content to extract the environment variables from
|
|
22
|
+
* @param defaultEnv - The default environment variables to use if none are found
|
|
23
|
+
* @returns The extracted environment variables as an object
|
|
24
|
+
*/
|
|
25
|
+
private static extractEnv;
|
|
26
|
+
/**
|
|
27
|
+
* Get the value of an environment variable
|
|
28
|
+
* @param key - The environment variable key
|
|
29
|
+
* @param options - Options to get the environment variable
|
|
30
|
+
* @param options.default - The default value to return if the environment variable is not set
|
|
31
|
+
* @param options.warning - Whether to show a warning if the environment variable is not set
|
|
32
|
+
* @returns The value of the environment variable or undefined if not set
|
|
33
|
+
*/
|
|
34
|
+
static get(key: string, options: Env.getOptionsGranted): string;
|
|
35
|
+
static get(key: string, options: Env.getOptions): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Set an environment variable
|
|
38
|
+
* @param key - The environment variable key
|
|
39
|
+
* @param value - The value to set
|
|
40
|
+
*/
|
|
41
|
+
static set(key: string, value: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Set multiple environment variables at once
|
|
44
|
+
* @param env - An object containing key-value pairs of environment variables
|
|
45
|
+
*/
|
|
46
|
+
static setMany(env: Env.EnvList): void;
|
|
47
|
+
/**
|
|
48
|
+
* Delete an environment variable
|
|
49
|
+
* @param key - The environment variable key to delete
|
|
50
|
+
*/
|
|
51
|
+
static delete(key: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Convert an EnvList to a .env-formatted string
|
|
54
|
+
* @param env - The environment variables object
|
|
55
|
+
* @returns A string in .env format
|
|
56
|
+
*/
|
|
57
|
+
static toEnv(env: Env.EnvList): string;
|
|
58
|
+
}
|
|
59
|
+
export declare namespace Env {
|
|
60
|
+
interface EnvList {
|
|
61
|
+
[key: string]: string | undefined;
|
|
62
|
+
}
|
|
63
|
+
interface LoadOptions {
|
|
64
|
+
setEnv?: boolean;
|
|
65
|
+
defaultEnv?: EnvList;
|
|
66
|
+
}
|
|
67
|
+
interface getOptions {
|
|
68
|
+
default?: string;
|
|
69
|
+
warning?: boolean;
|
|
70
|
+
}
|
|
71
|
+
type getOptionsGranted = getOptions & {
|
|
72
|
+
default: string;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export default Env;
|