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,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Adds a simple way to create HTTP/S and WS/S servers.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import _LoggerManager from '../LoggerManager/LoggerManager.js';
|
|
7
|
+
import _Config from '../Config.js';
|
|
8
|
+
import _Request from "./Request.js";
|
|
9
|
+
import _Response from "./Response.js";
|
|
10
|
+
import _Session from "./Session.js";
|
|
11
|
+
import _Cookie from "./Cookie.js";
|
|
12
|
+
import _WebSocket from "./WebSocket/WebSocket.js";
|
|
13
|
+
import _Rule from './Rule.js';
|
|
14
|
+
export declare class Server {
|
|
15
|
+
private protocol;
|
|
16
|
+
private HttpServer;
|
|
17
|
+
private HttpsServer;
|
|
18
|
+
private rules;
|
|
19
|
+
config: Server.Config;
|
|
20
|
+
logger: Server.LoggerManager;
|
|
21
|
+
/**
|
|
22
|
+
* Creates an HTTP/S server.
|
|
23
|
+
* @param port - The port the server will listen on.
|
|
24
|
+
* @param host - The host the server will bind to.
|
|
25
|
+
* @param sslOptions - The SSL configuration.
|
|
26
|
+
*/
|
|
27
|
+
constructor(options?: Server.Config.options | Server.Config);
|
|
28
|
+
/**
|
|
29
|
+
* Starts the server.
|
|
30
|
+
*/
|
|
31
|
+
start(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Stops the server.
|
|
34
|
+
*/
|
|
35
|
+
stop(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Stops the HTTP server.
|
|
38
|
+
*/
|
|
39
|
+
private stopHTTP;
|
|
40
|
+
/**
|
|
41
|
+
* Stops the HTTPS server.
|
|
42
|
+
*/
|
|
43
|
+
private stopHTTPS;
|
|
44
|
+
/**
|
|
45
|
+
* Restarts the server.
|
|
46
|
+
*/
|
|
47
|
+
restart(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Initializes the HTTP server.
|
|
50
|
+
* @param port - The port the HTTP server will listen on.
|
|
51
|
+
* @param host - The host the HTTP server will bind to.
|
|
52
|
+
* @returns A promise that resolves with the created HTTP server.
|
|
53
|
+
*/
|
|
54
|
+
private initHTTP;
|
|
55
|
+
/**
|
|
56
|
+
* Initializes the HTTPS server.
|
|
57
|
+
* @param host - The host the HTTPS server will bind to.
|
|
58
|
+
* @param sslOptions - The SSL configuration.
|
|
59
|
+
* @returns A promise that resolves with the created HTTPS server.
|
|
60
|
+
*/
|
|
61
|
+
private initHTTPS;
|
|
62
|
+
/**
|
|
63
|
+
* Adds one or more routing rules to the server.
|
|
64
|
+
* @param rules - The rule(s) to be added.
|
|
65
|
+
*/
|
|
66
|
+
addRules(...rules: Server.Rule[]): Server;
|
|
67
|
+
/**
|
|
68
|
+
* Adds an action routing rule.
|
|
69
|
+
* @param method - The HTTP method to respond to.
|
|
70
|
+
* @param urlRule - The URL path for the action.
|
|
71
|
+
* @param action - The action to be executed.
|
|
72
|
+
* @param auth - The optional authorization check function.
|
|
73
|
+
*/
|
|
74
|
+
addAction(method: Server.Request.Method, urlRule: string, action: Server.Rule.ActionExec, auth?: Server.Rule.AuthExec): Server;
|
|
75
|
+
/**
|
|
76
|
+
* Adds a file routing rule.
|
|
77
|
+
* @param urlRule - The URL path to listen on.
|
|
78
|
+
* @param source - The path to the file to be served.
|
|
79
|
+
* @param auth - The optional authorization check function.
|
|
80
|
+
*/
|
|
81
|
+
addFile(urlRule: string, source: string, auth?: Server.Rule.AuthExec): Server;
|
|
82
|
+
/**
|
|
83
|
+
* Adds a folder routing rule.
|
|
84
|
+
* @param urlRule - The URL path to listen on.
|
|
85
|
+
* @param source - The directory path to be served.
|
|
86
|
+
* @param auth - The optional authorization check function.
|
|
87
|
+
*/
|
|
88
|
+
addFolder(urlRule: string, source: string, auth?: Server.Rule.AuthExec): Server;
|
|
89
|
+
/**
|
|
90
|
+
* Adds a WebSocket routing rule.
|
|
91
|
+
* @param urlRule - The URL path to listen on.
|
|
92
|
+
* @param action - The action to be executed on connection.
|
|
93
|
+
* @param auth - The optional authorization check function.
|
|
94
|
+
*/
|
|
95
|
+
addWebSocket(urlRule: string, action: Server.Rule.WebSocketExec, auth?: Server.Rule.AuthExec): Server;
|
|
96
|
+
/**
|
|
97
|
+
* Defines default `.vhtml` templates for the server.
|
|
98
|
+
* @param name - The name of the template.
|
|
99
|
+
* @param path - The path to the `.vhtml` template file.
|
|
100
|
+
*/
|
|
101
|
+
setTemplate(name: keyof Server.Config.Templates, path: string): Server;
|
|
102
|
+
/**
|
|
103
|
+
* Routes incoming HTTP requests to be processed.
|
|
104
|
+
* @param request - The received HTTP request.
|
|
105
|
+
* @param response - The server response handler.
|
|
106
|
+
* @throws If no routing rule matches the request.
|
|
107
|
+
*/
|
|
108
|
+
private routeRequest;
|
|
109
|
+
/**
|
|
110
|
+
* Routes WebSocket connection requests.
|
|
111
|
+
* @param request - The received HTTP request.
|
|
112
|
+
* @param webSocket - The WebSocket connection with the client.
|
|
113
|
+
* @throws If no WebSocket routing rule matches.
|
|
114
|
+
*/
|
|
115
|
+
private routeWebSocket;
|
|
116
|
+
/**
|
|
117
|
+
* Triggered when the server receives an HTTP request.
|
|
118
|
+
* @param HttpRequest - The incoming HTTP request.
|
|
119
|
+
* @param HttpResponse - The server response stream.
|
|
120
|
+
*/
|
|
121
|
+
private requestManager;
|
|
122
|
+
/**
|
|
123
|
+
* Will be executed when the server receives an upgrade request.
|
|
124
|
+
* @param HttpRequest The request received by the server.
|
|
125
|
+
* @param Socket The socket to respond with (WebSocket upgrade).
|
|
126
|
+
*/
|
|
127
|
+
private upgradeManager;
|
|
128
|
+
/**
|
|
129
|
+
* Loads the SSL key and certificate and returns their content as strings.
|
|
130
|
+
* @param pathCert Path to the SSL certificate.
|
|
131
|
+
* @param pathKey Path to the SSL key.
|
|
132
|
+
* @returns An object containing the certificate and key as Buffers.
|
|
133
|
+
*/
|
|
134
|
+
static loadCertificates(pathCert: string, pathKey: string): Promise<Server.Certificates>;
|
|
135
|
+
}
|
|
136
|
+
export declare namespace Server {
|
|
137
|
+
export import Config = _Config;
|
|
138
|
+
export import Cookie = _Cookie;
|
|
139
|
+
export import Request = _Request;
|
|
140
|
+
export import Response = _Response;
|
|
141
|
+
export import Session = _Session;
|
|
142
|
+
export import WebSocket = _WebSocket;
|
|
143
|
+
export import Rule = _Rule;
|
|
144
|
+
export import LoggerManager = _LoggerManager;
|
|
145
|
+
interface Certificates {
|
|
146
|
+
cert: Buffer | string;
|
|
147
|
+
key: Buffer | string;
|
|
148
|
+
}
|
|
149
|
+
type SSLOptions = {
|
|
150
|
+
pubKey: string;
|
|
151
|
+
privKey: string;
|
|
152
|
+
port?: number;
|
|
153
|
+
};
|
|
154
|
+
type Protocol = 'HTTP' | 'HTTPS' | 'HTTP/S';
|
|
155
|
+
type Rules = Array<Rule>;
|
|
156
|
+
}
|
|
157
|
+
export default Server;
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Adds a simple way to create HTTP/S and WS/S servers.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import HTTP from 'http';
|
|
7
|
+
import FS from 'fs';
|
|
8
|
+
import HTTPS from 'https';
|
|
9
|
+
import Utilities from '../Utilities/Utilities.js';
|
|
10
|
+
import _LoggerManager from '../LoggerManager/LoggerManager.js';
|
|
11
|
+
import _Config from '../Config.js';
|
|
12
|
+
import _Request from "./Request.js";
|
|
13
|
+
import _Response from "./Response.js";
|
|
14
|
+
import _Session from "./Session.js";
|
|
15
|
+
import _Cookie from "./Cookie.js";
|
|
16
|
+
import _WebSocket from "./WebSocket/WebSocket.js";
|
|
17
|
+
import _Rule from './Rule.js';
|
|
18
|
+
const $logger = _LoggerManager.getInstance();
|
|
19
|
+
export class Server {
|
|
20
|
+
protocol;
|
|
21
|
+
HttpServer;
|
|
22
|
+
HttpsServer;
|
|
23
|
+
rules;
|
|
24
|
+
config;
|
|
25
|
+
logger;
|
|
26
|
+
/**
|
|
27
|
+
* Creates an HTTP/S server.
|
|
28
|
+
* @param port - The port the server will listen on.
|
|
29
|
+
* @param host - The host the server will bind to.
|
|
30
|
+
* @param sslOptions - The SSL configuration.
|
|
31
|
+
*/
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.config = options instanceof Server.Config ? options : new Server.Config(options);
|
|
34
|
+
this.rules = [];
|
|
35
|
+
this.HttpServer = null;
|
|
36
|
+
this.HttpsServer = null;
|
|
37
|
+
this.protocol = null;
|
|
38
|
+
this.logger = _LoggerManager.getInstance();
|
|
39
|
+
this.addFolder('/NetFeez-Labs:Global', Utilities.Path.normalize(`${Utilities.Path.moduleDir}/global`));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Starts the server.
|
|
43
|
+
*/
|
|
44
|
+
async start() {
|
|
45
|
+
const { port, host, ssl: sslOptions } = this.config;
|
|
46
|
+
this.protocol = sslOptions ? 'HTTP/S' : 'HTTP';
|
|
47
|
+
$logger.info('&C(255,180,220)╭─────────────────────────────────────────────');
|
|
48
|
+
$logger.info('&C(255,180,220)│ &C1Vortez by NetFeez');
|
|
49
|
+
$logger.info('&C(255,180,220)│ &C1Server starting...');
|
|
50
|
+
$logger.info('&C(255,180,220)├─────────────────────────────────────────────');
|
|
51
|
+
try {
|
|
52
|
+
this.HttpServer = await this.initHTTP(port, host);
|
|
53
|
+
$logger.info(`&C(255,180,220)│ &C3Protocol: &R${this.protocol}`);
|
|
54
|
+
$logger.info(`&C(255,180,220)│ &C3Host: &R${host}`);
|
|
55
|
+
$logger.info(`&C(255,180,220)│ &C3HTTP Port: &R${port}`);
|
|
56
|
+
$logger.info(`&C(255,180,220)│ &C3HTTP URL: &C6http://${host}:${port}`);
|
|
57
|
+
try {
|
|
58
|
+
if (sslOptions) {
|
|
59
|
+
this.HttpsServer = await this.initHTTPS(host, sslOptions);
|
|
60
|
+
$logger.info(`&C(255,180,220)│ &C3HTTPS Port: &R${sslOptions.port ?? 443}`);
|
|
61
|
+
$logger.info(`&C(255,180,220)│ &C3HTTPS URL: &C6https://${host}:${sslOptions.port ?? 443}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw Error('Certificate error ' + (error instanceof Error ? error.message : error), { cause: error });
|
|
66
|
+
}
|
|
67
|
+
$logger.info('&C(255,180,220)╰─────────────────────────────────────────────');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
$logger.error(`&C(255,180,220)│ &C1✖ Error starting server: &R&C6${error instanceof Error ? error.message : error}`);
|
|
71
|
+
$logger.info('&C(255,180,220)╰─────────────────────────────────────────────');
|
|
72
|
+
this.stop();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Stops the server.
|
|
77
|
+
*/
|
|
78
|
+
async stop() {
|
|
79
|
+
try {
|
|
80
|
+
$logger.info('&C6╭─────────────────────────────');
|
|
81
|
+
$logger.info('&C6│ &C1Stopping server...');
|
|
82
|
+
if (this.HttpServer) {
|
|
83
|
+
await this.stopHTTP();
|
|
84
|
+
$logger.info('&C6│ &C3✔ HTTP server stopped');
|
|
85
|
+
}
|
|
86
|
+
if (this.HttpsServer) {
|
|
87
|
+
await this.stopHTTPS();
|
|
88
|
+
$logger.info('&C6│ &C3✔ HTTPS server stopped');
|
|
89
|
+
}
|
|
90
|
+
$logger.info('&C6│ &C2✔ All servers stopped successfully');
|
|
91
|
+
$logger.info('&C6╰─────────────────────────────');
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
$logger.error('&C1✖ Error stopping server: &R&C6' + (error instanceof Error ? error.message : error));
|
|
95
|
+
$logger.info('&C2╰─────────────────────────────');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Stops the HTTP server.
|
|
100
|
+
*/
|
|
101
|
+
async stopHTTP() {
|
|
102
|
+
return new Promise((resolve, reject) => {
|
|
103
|
+
if (this.HttpServer)
|
|
104
|
+
this.HttpServer.close((error) => error ? reject(error) : resolve());
|
|
105
|
+
else
|
|
106
|
+
resolve();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Stops the HTTPS server.
|
|
111
|
+
*/
|
|
112
|
+
async stopHTTPS() {
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
if (this.HttpsServer)
|
|
115
|
+
this.HttpsServer.close((error) => error ? reject(error) : resolve());
|
|
116
|
+
else
|
|
117
|
+
resolve();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Restarts the server.
|
|
122
|
+
*/
|
|
123
|
+
async restart() {
|
|
124
|
+
await this.stop();
|
|
125
|
+
await this.start();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Initializes the HTTP server.
|
|
129
|
+
* @param port - The port the HTTP server will listen on.
|
|
130
|
+
* @param host - The host the HTTP server will bind to.
|
|
131
|
+
* @returns A promise that resolves with the created HTTP server.
|
|
132
|
+
*/
|
|
133
|
+
async initHTTP(port, host) {
|
|
134
|
+
const http = HTTP.createServer();
|
|
135
|
+
http.on('request', this.requestManager.bind(this));
|
|
136
|
+
http.on('upgrade', this.upgradeManager.bind(this));
|
|
137
|
+
return new Promise((resolve) => http.listen(port, host, () => resolve(http)));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Initializes the HTTPS server.
|
|
141
|
+
* @param host - The host the HTTPS server will bind to.
|
|
142
|
+
* @param sslOptions - The SSL configuration.
|
|
143
|
+
* @returns A promise that resolves with the created HTTPS server.
|
|
144
|
+
*/
|
|
145
|
+
async initHTTPS(host, sslOptions) {
|
|
146
|
+
const port = sslOptions.port ?? 443;
|
|
147
|
+
const cert = await Server.loadCertificates(sslOptions.pubKey, sslOptions.privKey);
|
|
148
|
+
const https = HTTPS.createServer(cert);
|
|
149
|
+
https.on('request', this.requestManager.bind(this));
|
|
150
|
+
https.on('upgrade', this.upgradeManager.bind(this));
|
|
151
|
+
return new Promise((resolve) => https.listen(port, host, () => resolve(https)));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Adds one or more routing rules to the server.
|
|
155
|
+
* @param rules - The rule(s) to be added.
|
|
156
|
+
*/
|
|
157
|
+
addRules(...rules) {
|
|
158
|
+
this.rules = this.rules.concat(rules);
|
|
159
|
+
return this;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Adds an action routing rule.
|
|
163
|
+
* @param method - The HTTP method to respond to.
|
|
164
|
+
* @param urlRule - The URL path for the action.
|
|
165
|
+
* @param action - The action to be executed.
|
|
166
|
+
* @param auth - The optional authorization check function.
|
|
167
|
+
*/
|
|
168
|
+
addAction(method, urlRule, action, auth) {
|
|
169
|
+
this.addRules(new Server.Rule('Action', method, urlRule, action, auth));
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Adds a file routing rule.
|
|
174
|
+
* @param urlRule - The URL path to listen on.
|
|
175
|
+
* @param source - The path to the file to be served.
|
|
176
|
+
* @param auth - The optional authorization check function.
|
|
177
|
+
*/
|
|
178
|
+
addFile(urlRule, source, auth) {
|
|
179
|
+
this.addRules(new Server.Rule('File', 'GET', urlRule, source, auth));
|
|
180
|
+
return this;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Adds a folder routing rule.
|
|
184
|
+
* @param urlRule - The URL path to listen on.
|
|
185
|
+
* @param source - The directory path to be served.
|
|
186
|
+
* @param auth - The optional authorization check function.
|
|
187
|
+
*/
|
|
188
|
+
addFolder(urlRule, source, auth) {
|
|
189
|
+
this.addRules(new Server.Rule('Folder', 'GET', urlRule, source, auth));
|
|
190
|
+
return this;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Adds a WebSocket routing rule.
|
|
194
|
+
* @param urlRule - The URL path to listen on.
|
|
195
|
+
* @param action - The action to be executed on connection.
|
|
196
|
+
* @param auth - The optional authorization check function.
|
|
197
|
+
*/
|
|
198
|
+
addWebSocket(urlRule, action, auth) {
|
|
199
|
+
this.addRules(new Server.Rule('WebSocket', 'ALL', urlRule, action, auth));
|
|
200
|
+
return this;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Defines default `.vhtml` templates for the server.
|
|
204
|
+
* @param name - The name of the template.
|
|
205
|
+
* @param path - The path to the `.vhtml` template file.
|
|
206
|
+
*/
|
|
207
|
+
setTemplate(name, path) {
|
|
208
|
+
this.config.templates[name] = path;
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Routes incoming HTTP requests to be processed.
|
|
213
|
+
* @param request - The received HTTP request.
|
|
214
|
+
* @param response - The server response handler.
|
|
215
|
+
* @throws If no routing rule matches the request.
|
|
216
|
+
*/
|
|
217
|
+
routeRequest(request, response) {
|
|
218
|
+
let routed = false;
|
|
219
|
+
for (const rule of this.rules) {
|
|
220
|
+
if (rule.test(request)) {
|
|
221
|
+
if (rule.testAuth(request)) {
|
|
222
|
+
try {
|
|
223
|
+
rule.exec(request, response);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
$logger.request.error('&C1Error executing rule:&R&C6', (error instanceof Error ? error.message : error));
|
|
227
|
+
$logger.request.error('&C1Route:', request.method, request.url);
|
|
228
|
+
response.sendError(500, 'Internal Server Error');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else
|
|
232
|
+
response.sendError(403, `You don't have permission to access: ${request.method} -> ${request.url}`);
|
|
233
|
+
routed = true;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (!(routed))
|
|
238
|
+
response.sendError(400, `No router for: ${request.method} -> ${request.url}`);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Routes WebSocket connection requests.
|
|
242
|
+
* @param request - The received HTTP request.
|
|
243
|
+
* @param webSocket - The WebSocket connection with the client.
|
|
244
|
+
* @throws If no WebSocket routing rule matches.
|
|
245
|
+
*/
|
|
246
|
+
routeWebSocket(request, webSocket) {
|
|
247
|
+
let routed = false;
|
|
248
|
+
for (const rule of this.rules) {
|
|
249
|
+
if (rule.test(request, true)) {
|
|
250
|
+
if (rule.testAuth(request)) {
|
|
251
|
+
const AcceptKey = (request.headers['sec-websocket-key'] ?? '').trim();
|
|
252
|
+
webSocket.acceptConnection(AcceptKey, request.cookies);
|
|
253
|
+
try {
|
|
254
|
+
rule.exec(request, webSocket);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
$logger.webSocket.error('&C1Error executing rule:&R&C6', (error instanceof Error ? error.message : error));
|
|
258
|
+
$logger.webSocket.error('&C1Route:', request.method, request.url);
|
|
259
|
+
webSocket.send('HTTP/1.1 500 Internal Server Error\r\nConnection: close\r\n\r\n');
|
|
260
|
+
webSocket.end();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
webSocket.send('HTTP/1.1 403 Forbidden\r\nConnection: close\r\n\r\n');
|
|
265
|
+
webSocket.end();
|
|
266
|
+
}
|
|
267
|
+
routed = true;
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (!(routed))
|
|
272
|
+
webSocket.send(`HTTP/1.1 400 Bad request\r\nNo router for: ${request.method} -> ${request.url}\r\n\r\n`);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Triggered when the server receives an HTTP request.
|
|
276
|
+
* @param HttpRequest - The incoming HTTP request.
|
|
277
|
+
* @param HttpResponse - The server response stream.
|
|
278
|
+
*/
|
|
279
|
+
requestManager(HttpRequest, HttpResponse) {
|
|
280
|
+
const request = new Server.Request(HttpRequest);
|
|
281
|
+
const response = new Server.Response(request, HttpResponse, this.config.templates);
|
|
282
|
+
const sessionID = request.cookies.get('Session');
|
|
283
|
+
$logger.request.log(request.ip, request.method, request.url, sessionID);
|
|
284
|
+
this.routeRequest(request, response);
|
|
285
|
+
}
|
|
286
|
+
;
|
|
287
|
+
/**
|
|
288
|
+
* Will be executed when the server receives an upgrade request.
|
|
289
|
+
* @param HttpRequest The request received by the server.
|
|
290
|
+
* @param Socket The socket to respond with (WebSocket upgrade).
|
|
291
|
+
*/
|
|
292
|
+
upgradeManager(HttpRequest, Socket) {
|
|
293
|
+
const request = new Server.Request(HttpRequest);
|
|
294
|
+
const webSocket = new Server.WebSocket(Socket);
|
|
295
|
+
const sessionID = request.cookies.get('Session');
|
|
296
|
+
$logger.webSocket.log(request.ip, request.method, request.url, sessionID);
|
|
297
|
+
this.routeWebSocket(request, webSocket);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Loads the SSL key and certificate and returns their content as strings.
|
|
301
|
+
* @param pathCert Path to the SSL certificate.
|
|
302
|
+
* @param pathKey Path to the SSL key.
|
|
303
|
+
* @returns An object containing the certificate and key as Buffers.
|
|
304
|
+
*/
|
|
305
|
+
static async loadCertificates(pathCert, pathKey) {
|
|
306
|
+
pathCert = Utilities.Path.normalize(pathCert);
|
|
307
|
+
pathKey = Utilities.Path.normalize(pathKey);
|
|
308
|
+
const certInfo = await FS.promises.stat(pathCert);
|
|
309
|
+
const keyInfo = await FS.promises.stat(pathKey);
|
|
310
|
+
if (!(certInfo.isFile()))
|
|
311
|
+
return Promise.reject('The certificate path is not a file');
|
|
312
|
+
if (!(keyInfo.isFile()))
|
|
313
|
+
return Promise.reject('The key path is not a file');
|
|
314
|
+
const cert = await FS.promises.readFile(pathCert);
|
|
315
|
+
const key = await FS.promises.readFile(pathKey);
|
|
316
|
+
return { cert, key };
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
(function (Server) {
|
|
320
|
+
Server.Config = _Config;
|
|
321
|
+
Server.Cookie = _Cookie;
|
|
322
|
+
Server.Request = _Request;
|
|
323
|
+
Server.Response = _Response;
|
|
324
|
+
Server.Session = _Session;
|
|
325
|
+
Server.WebSocket = _WebSocket;
|
|
326
|
+
Server.Rule = _Rule;
|
|
327
|
+
Server.LoggerManager = _LoggerManager;
|
|
328
|
+
})(Server || (Server = {}));
|
|
329
|
+
export default Server;
|
|
330
|
+
//# sourceMappingURL=Server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Server.js","sourceRoot":"","sources":["../../src/Server/Server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Adds a session system to `Vortez`.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import EVENTS from 'events';
|
|
7
|
+
import Cookie from './Cookie.js';
|
|
8
|
+
export declare class Session extends EVENTS {
|
|
9
|
+
/** Stores session instances. */
|
|
10
|
+
private static sessions;
|
|
11
|
+
/** Stores session data. */
|
|
12
|
+
private data;
|
|
13
|
+
/** Stores the session's SS_UUID. */
|
|
14
|
+
private sessionID;
|
|
15
|
+
/**
|
|
16
|
+
* Creates or retrieves the current session instance from cookies.
|
|
17
|
+
* @param cookies - The Cookie instance from the request.
|
|
18
|
+
* @returns The current session instance.
|
|
19
|
+
*/
|
|
20
|
+
static getInstance(cookies: Cookie): Session;
|
|
21
|
+
/**
|
|
22
|
+
* Constructs a session instance with the given ID.
|
|
23
|
+
* @param sessionID - The session's unique ID.
|
|
24
|
+
*/
|
|
25
|
+
private constructor();
|
|
26
|
+
/**
|
|
27
|
+
* Returns the session's SS_UUID.
|
|
28
|
+
* @returns The session ID string.
|
|
29
|
+
*/
|
|
30
|
+
getID(): string;
|
|
31
|
+
/**
|
|
32
|
+
* Checks whether a given key exists in the session.
|
|
33
|
+
* @param name - The key to check in the session data.
|
|
34
|
+
* @returns True if the key exists, false otherwise.
|
|
35
|
+
*/
|
|
36
|
+
has(name: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Retrieves a session value by its key, if it exists.
|
|
39
|
+
* @param name - The key to retrieve from the session.
|
|
40
|
+
* @returns The value associated with the key or undefined.
|
|
41
|
+
*/
|
|
42
|
+
get(name: string): any | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Returns a plain object containing all session data.
|
|
45
|
+
* - The returned object is not reactive; changes to it won't affect the session.
|
|
46
|
+
* @returns An object with all session key-value pairs.
|
|
47
|
+
*/
|
|
48
|
+
getAll(): Session.SessionObject;
|
|
49
|
+
/**
|
|
50
|
+
* Sets or replaces a session value by key.
|
|
51
|
+
* @param name - The key to set in the session.
|
|
52
|
+
* @param value - The value to assign to the key.
|
|
53
|
+
*/
|
|
54
|
+
set(name: string, value: any): void;
|
|
55
|
+
/**
|
|
56
|
+
* Deletes a session value by key, if it exists.
|
|
57
|
+
* @param name - The key to delete from the session.
|
|
58
|
+
*/
|
|
59
|
+
delete(name: string): void;
|
|
60
|
+
}
|
|
61
|
+
export declare namespace Session {
|
|
62
|
+
interface SessionObject {
|
|
63
|
+
[key: string]: any;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export default Session;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author NetFeez <codefeez.dev@gmail.com>
|
|
3
|
+
* @description Adds a session system to `Vortez`.
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
// Note: sessions could be stored persistently in the future.
|
|
7
|
+
// Note: it's necessary to check the validity of a ss_uuid, because
|
|
8
|
+
// if a 'SS_UUID' cookie exists and its session is not in 'sessions',
|
|
9
|
+
// a new session will be created even if it's not valid.
|
|
10
|
+
// Note: a public/private key system should be implemented to prevent
|
|
11
|
+
// users from using someone else's ss_uuid to access their data.
|
|
12
|
+
import CRYPTO from 'crypto';
|
|
13
|
+
import EVENTS from 'events';
|
|
14
|
+
export class Session extends EVENTS {
|
|
15
|
+
/** Stores session instances. */
|
|
16
|
+
static sessions = new Map;
|
|
17
|
+
/** Stores session data. */
|
|
18
|
+
data;
|
|
19
|
+
/** Stores the session's SS_UUID. */
|
|
20
|
+
sessionID;
|
|
21
|
+
/**
|
|
22
|
+
* Creates or retrieves the current session instance from cookies.
|
|
23
|
+
* @param cookies - The Cookie instance from the request.
|
|
24
|
+
* @returns The current session instance.
|
|
25
|
+
*/
|
|
26
|
+
static getInstance(cookies) {
|
|
27
|
+
let sessionID = cookies.get('Session');
|
|
28
|
+
if (!sessionID) {
|
|
29
|
+
sessionID = CRYPTO.randomUUID();
|
|
30
|
+
cookies.set('Session', sessionID, {
|
|
31
|
+
secure: true,
|
|
32
|
+
httpOnly: true,
|
|
33
|
+
path: '/',
|
|
34
|
+
expires: (() => {
|
|
35
|
+
const date = new Date();
|
|
36
|
+
date.setFullYear(date.getFullYear() + 1);
|
|
37
|
+
return date;
|
|
38
|
+
})()
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
let session = Session.sessions.get(sessionID);
|
|
42
|
+
if (!session) {
|
|
43
|
+
session = new Session(sessionID);
|
|
44
|
+
Session.sessions.set(sessionID, session);
|
|
45
|
+
}
|
|
46
|
+
return session;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Constructs a session instance with the given ID.
|
|
50
|
+
* @param sessionID - The session's unique ID.
|
|
51
|
+
*/
|
|
52
|
+
constructor(sessionID) {
|
|
53
|
+
super();
|
|
54
|
+
this.data = new Map();
|
|
55
|
+
this.sessionID = sessionID;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Returns the session's SS_UUID.
|
|
59
|
+
* @returns The session ID string.
|
|
60
|
+
*/
|
|
61
|
+
getID() { return this.sessionID; }
|
|
62
|
+
/**
|
|
63
|
+
* Checks whether a given key exists in the session.
|
|
64
|
+
* @param name - The key to check in the session data.
|
|
65
|
+
* @returns True if the key exists, false otherwise.
|
|
66
|
+
*/
|
|
67
|
+
has(name) { return this.data.has(name); }
|
|
68
|
+
/**
|
|
69
|
+
* Retrieves a session value by its key, if it exists.
|
|
70
|
+
* @param name - The key to retrieve from the session.
|
|
71
|
+
* @returns The value associated with the key or undefined.
|
|
72
|
+
*/
|
|
73
|
+
get(name) { return this.data.get(name); }
|
|
74
|
+
/**
|
|
75
|
+
* Returns a plain object containing all session data.
|
|
76
|
+
* - The returned object is not reactive; changes to it won't affect the session.
|
|
77
|
+
* @returns An object with all session key-value pairs.
|
|
78
|
+
*/
|
|
79
|
+
getAll() {
|
|
80
|
+
const Data = {};
|
|
81
|
+
this.data.forEach((Value, Key) => Data[Key] = Value);
|
|
82
|
+
return Data;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Sets or replaces a session value by key.
|
|
86
|
+
* @param name - The key to set in the session.
|
|
87
|
+
* @param value - The value to assign to the key.
|
|
88
|
+
*/
|
|
89
|
+
set(name, value) { this.data.set(name, value); }
|
|
90
|
+
/**
|
|
91
|
+
* Deletes a session value by key, if it exists.
|
|
92
|
+
* @param name - The key to delete from the session.
|
|
93
|
+
*/
|
|
94
|
+
delete(name) { this.data.delete(name); }
|
|
95
|
+
}
|
|
96
|
+
export default Session;
|
|
97
|
+
//# sourceMappingURL=Session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Session.js","sourceRoot":"","sources":["../../src/Server/Session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,6DAA6D;AAC7D,mEAAmE;AACnE,uEAAuE;AACvE,0DAA0D;AAC1D,qEAAqE;AACrE,kEAAkE;AAElE,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B,MAAM,OAAO,OAAQ,SAAQ,MAAM;IAC/B,gCAAgC;IACxB,MAAM,CAAC,QAAQ,GAAyB,IAAI,GAAG,CAAC;IACxD,2BAA2B;IACnB,IAAI,CAAmB;IAC/B,oCAAoC;IAC5B,SAAS,CAAS;IAC1B;;;;OAIG;IACI,MAAM,CAAC,WAAW,CAAC,OAAe;QACrC,IAAI,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE;gBAC9B,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,CAAC,GAAG,EAAE;oBACX,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;oBACzC,OAAO,IAAI,CAAC;gBAChB,CAAC,CAAC,EAAE;aACP,CAAC,CAAC;QACP,CAAC;QACD,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;YACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IACD;;;OAGG;IACH,YAAoB,SAAiB;QAAI,KAAK,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IACD;;;OAGG;IACI,KAAK,KAAa,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD;;;;OAIG;IACI,GAAG,CAAC,IAAY,IAAa,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjE;;;;OAIG;IACI,GAAG,CAAC,IAAY,IAAqB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzE;;;;OAIG;IACI,MAAM;QACT,MAAM,IAAI,GAA0B,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,GAAG,CAAC,IAAY,EAAE,KAAU,IAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1E;;;OAGG;IACI,MAAM,CAAC,IAAY,IAAU,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;AASjE,eAAe,OAAO,CAAC"}
|