xypriss 1.3.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +219 -31
- package/dist/cjs/mods/security/src/components/cache/index.js +0 -72
- package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/cjs/mods/security/src/index.js +0 -3
- package/dist/cjs/mods/security/src/index.js.map +1 -1
- package/dist/cjs/shared/logger/Logger.js +2 -0
- package/dist/cjs/shared/logger/Logger.js.map +1 -1
- package/dist/cjs/src/index.js +55 -61
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js +281 -0
- package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/index.js +325 -0
- package/dist/cjs/src/middleware/built-in/index.js.map +1 -0
- package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js +1 -1
- package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -1
- package/dist/cjs/src/quick-start.js +0 -4
- package/dist/cjs/src/quick-start.js.map +1 -1
- package/dist/cjs/src/server/FastServer.js +53 -411
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/ServerFactory.js +7 -62
- package/dist/cjs/src/server/ServerFactory.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +1 -1
- package/dist/cjs/src/server/components/fastapi/PerformanceManager.js +1 -1
- package/dist/cjs/src/server/components/fastapi/PerformanceManager.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/RouteManager.js +0 -82
- package/dist/cjs/src/server/components/fastapi/RouteManager.js.map +1 -1
- package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js +384 -0
- package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
- package/dist/cjs/src/server/const/default.js +0 -8
- package/dist/cjs/src/server/const/default.js.map +1 -1
- package/dist/cjs/src/server/core/HttpServer.js +500 -0
- package/dist/cjs/src/server/core/HttpServer.js.map +1 -0
- package/dist/cjs/src/server/core/XyprissApp.js +412 -0
- package/dist/cjs/src/server/core/XyprissApp.js.map +1 -0
- package/dist/cjs/src/server/middleware/MiddlewareManager.js +146 -0
- package/dist/cjs/src/server/middleware/MiddlewareManager.js.map +1 -0
- package/dist/cjs/src/server/routing/Router.js +341 -0
- package/dist/cjs/src/server/routing/Router.js.map +1 -0
- package/dist/cjs/src/server/utils/PortManager.js +1 -0
- package/dist/cjs/src/server/utils/PortManager.js.map +1 -1
- package/dist/cjs/src/server/utils/forceClosePort.js +294 -88
- package/dist/cjs/src/server/utils/forceClosePort.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/index.js +1 -70
- package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/esm/mods/security/src/index.js +1 -1
- package/dist/esm/shared/logger/Logger.js +2 -0
- package/dist/esm/shared/logger/Logger.js.map +1 -1
- package/dist/esm/src/index.js +41 -11
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js +279 -0
- package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js.map +1 -0
- package/dist/esm/src/middleware/built-in/index.js +323 -0
- package/dist/esm/src/middleware/built-in/index.js.map +1 -0
- package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js +1 -1
- package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -1
- package/dist/esm/src/quick-start.js +0 -4
- package/dist/esm/src/quick-start.js.map +1 -1
- package/dist/esm/src/server/FastServer.js +53 -411
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/ServerFactory.js +8 -59
- package/dist/esm/src/server/ServerFactory.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +1 -1
- package/dist/esm/src/server/components/fastapi/PerformanceManager.js +1 -1
- package/dist/esm/src/server/components/fastapi/PerformanceManager.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/RouteManager.js +0 -82
- package/dist/esm/src/server/components/fastapi/RouteManager.js.map +1 -1
- package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js +382 -0
- package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
- package/dist/esm/src/server/const/default.js +0 -8
- package/dist/esm/src/server/const/default.js.map +1 -1
- package/dist/esm/src/server/core/HttpServer.js +498 -0
- package/dist/esm/src/server/core/HttpServer.js.map +1 -0
- package/dist/esm/src/server/core/XyprissApp.js +410 -0
- package/dist/esm/src/server/core/XyprissApp.js.map +1 -0
- package/dist/esm/src/server/middleware/MiddlewareManager.js +144 -0
- package/dist/esm/src/server/middleware/MiddlewareManager.js.map +1 -0
- package/dist/esm/src/server/routing/Router.js +339 -0
- package/dist/esm/src/server/routing/Router.js.map +1 -0
- package/dist/esm/src/server/utils/PortManager.js +1 -0
- package/dist/esm/src/server/utils/PortManager.js.map +1 -1
- package/dist/esm/src/server/utils/forceClosePort.js +294 -88
- package/dist/esm/src/server/utils/forceClosePort.js.map +1 -1
- package/dist/index.d.ts +2166 -4273
- package/package.json +31 -19
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
import { createServer } from 'http';
|
|
2
|
+
import { parse } from 'url';
|
|
3
|
+
import { parse as parse$1 } from 'querystring';
|
|
4
|
+
import { MiddlewareManager } from '../middleware/MiddlewareManager.js';
|
|
5
|
+
import { NotFoundHandler } from '../handlers/NotFoundHandler.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* XyPrisHttpServer - Express-free HTTP server implementation
|
|
9
|
+
*
|
|
10
|
+
* This module provides a XyPris HTTP server that replaces Express with
|
|
11
|
+
* direct Node.js HTTP handling for maximum performance and control.
|
|
12
|
+
* It maintains API compatibility while removing Express overhead.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* XyPrissHttpServer - XPris HTTP server implementation
|
|
16
|
+
*/
|
|
17
|
+
class XyPrissHttpServer {
|
|
18
|
+
constructor(logger) {
|
|
19
|
+
this.routes = [];
|
|
20
|
+
this.logger = logger;
|
|
21
|
+
this.middlewareManager = new MiddlewareManager(logger);
|
|
22
|
+
this.notFoundHandler = new NotFoundHandler();
|
|
23
|
+
this.server = createServer(this.handleRequest.bind(this));
|
|
24
|
+
this.setupDefaultErrorHandler();
|
|
25
|
+
this.logger.debug("server", "[XyPrissHttpServer] Created new HTTP server with middleware manager");
|
|
26
|
+
}
|
|
27
|
+
use(pathOrMiddleware, middleware) {
|
|
28
|
+
if (typeof pathOrMiddleware === "function") {
|
|
29
|
+
this.middlewareManager.use(pathOrMiddleware);
|
|
30
|
+
}
|
|
31
|
+
else if (middleware) {
|
|
32
|
+
// Path-specific middleware - wrap it to check path
|
|
33
|
+
const pathMiddleware = (req, res, next) => {
|
|
34
|
+
if (req.path.startsWith(pathOrMiddleware)) {
|
|
35
|
+
return middleware(req, res, next);
|
|
36
|
+
}
|
|
37
|
+
next?.();
|
|
38
|
+
};
|
|
39
|
+
this.middlewareManager.use(pathMiddleware, {
|
|
40
|
+
name: `path_middleware_${pathOrMiddleware}`,
|
|
41
|
+
description: `Path-specific middleware for ${pathOrMiddleware}`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Add HTTP method routes
|
|
47
|
+
*/
|
|
48
|
+
get(path, ...handlers) {
|
|
49
|
+
this.addRoute("GET", path, handlers);
|
|
50
|
+
}
|
|
51
|
+
post(path, ...handlers) {
|
|
52
|
+
this.addRoute("POST", path, handlers);
|
|
53
|
+
}
|
|
54
|
+
put(path, ...handlers) {
|
|
55
|
+
this.addRoute("PUT", path, handlers);
|
|
56
|
+
}
|
|
57
|
+
delete(path, ...handlers) {
|
|
58
|
+
this.addRoute("DELETE", path, handlers);
|
|
59
|
+
}
|
|
60
|
+
patch(path, ...handlers) {
|
|
61
|
+
this.addRoute("PATCH", path, handlers);
|
|
62
|
+
}
|
|
63
|
+
options(path, ...handlers) {
|
|
64
|
+
this.addRoute("OPTIONS", path, handlers);
|
|
65
|
+
}
|
|
66
|
+
head(path, ...handlers) {
|
|
67
|
+
this.addRoute("HEAD", path, handlers);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Add a route with middleware and handler
|
|
71
|
+
*/
|
|
72
|
+
addRoute(method, path, handlers) {
|
|
73
|
+
const middleware = handlers.slice(0, -1);
|
|
74
|
+
const handler = handlers[handlers.length - 1];
|
|
75
|
+
this.routes.push({
|
|
76
|
+
method,
|
|
77
|
+
path,
|
|
78
|
+
handler,
|
|
79
|
+
middleware,
|
|
80
|
+
});
|
|
81
|
+
// Debug logging
|
|
82
|
+
this.logger.debug("server", `Route registered: ${method} ${path} (Total routes: ${this.routes.length})`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Add a route with parameter names (for RegExp routes from router)
|
|
86
|
+
*/
|
|
87
|
+
addRouteWithParams(method, path, paramNames, handlers) {
|
|
88
|
+
const middleware = handlers.slice(0, -1);
|
|
89
|
+
const handler = handlers[handlers.length - 1];
|
|
90
|
+
this.routes.push({
|
|
91
|
+
method,
|
|
92
|
+
path,
|
|
93
|
+
handler,
|
|
94
|
+
middleware,
|
|
95
|
+
paramNames,
|
|
96
|
+
});
|
|
97
|
+
// Debug logging
|
|
98
|
+
this.logger.debug("server", `Route registered with params: ${method} ${path} (params: ${paramNames.join(", ")}) (Total routes: ${this.routes.length})`);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Start the server
|
|
102
|
+
*/
|
|
103
|
+
listen(port, host, callback) {
|
|
104
|
+
this.logger.debug("server", `listen() called: ${host}:${port}`);
|
|
105
|
+
return this.server.listen(port, host, callback);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Handle incoming HTTP requests
|
|
109
|
+
*/
|
|
110
|
+
async handleRequest(req, res) {
|
|
111
|
+
this.logger.debug("server", `🔍 ===== HANDLING REQUEST: ${req.method} ${req.url} =====`);
|
|
112
|
+
const XyPrisReq = this.enhanceRequest(req);
|
|
113
|
+
const XyPrisRes = this.enhanceResponse(res);
|
|
114
|
+
try {
|
|
115
|
+
// Parse request body for POST/PUT/PATCH requests
|
|
116
|
+
if (["POST", "PUT", "PATCH"].includes(XyPrisReq.method)) {
|
|
117
|
+
await this.parseBody(XyPrisReq);
|
|
118
|
+
}
|
|
119
|
+
// Execute middleware chain using MiddlewareManager
|
|
120
|
+
this.logger.debug("server", `Executing middleware chain...`);
|
|
121
|
+
const middlewareChainCompleted = await this.middlewareManager.execute(XyPrisReq, XyPrisRes);
|
|
122
|
+
if (!middlewareChainCompleted) {
|
|
123
|
+
this.logger.debug("server", `Middleware chain was stopped - not executing route handler`);
|
|
124
|
+
return; // Stop processing if middleware chain was stopped
|
|
125
|
+
}
|
|
126
|
+
this.logger.debug("server", `🔍 Middleware chain completed, looking for routes...`);
|
|
127
|
+
// Find and execute matching route
|
|
128
|
+
const route = this.findRoute(XyPrisReq.method, XyPrisReq.path, XyPrisReq);
|
|
129
|
+
this.logger.debug("server", `🔍 Route found:`, route ? `${route.method} ${route.path}` : "null");
|
|
130
|
+
if (route) {
|
|
131
|
+
// Execute route-specific middleware
|
|
132
|
+
for (const middleware of route.middleware) {
|
|
133
|
+
await this.executeMiddlewareFunction(middleware, XyPrisReq, XyPrisRes);
|
|
134
|
+
}
|
|
135
|
+
// Execute route handler
|
|
136
|
+
await route.handler(XyPrisReq, XyPrisRes);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// No route found - 404
|
|
140
|
+
this.send404(XyPrisReq, XyPrisRes);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
this.handleError(error, XyPrisReq, XyPrisRes);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Enhance the request object with Express-like properties
|
|
149
|
+
*/
|
|
150
|
+
enhanceRequest(req) {
|
|
151
|
+
const parsedUrl = parse(req.url || "", true);
|
|
152
|
+
const XyPrisReq = req;
|
|
153
|
+
XyPrisReq.params = {};
|
|
154
|
+
XyPrisReq.query = parsedUrl.query || {};
|
|
155
|
+
XyPrisReq.body = {};
|
|
156
|
+
XyPrisReq.path = parsedUrl.pathname || "/";
|
|
157
|
+
XyPrisReq.originalUrl = req.url || "";
|
|
158
|
+
XyPrisReq.baseUrl = "";
|
|
159
|
+
XyPrisReq.method = req.method || "GET";
|
|
160
|
+
// Express compatibility properties
|
|
161
|
+
XyPrisReq.ip = this.getClientIP(req);
|
|
162
|
+
XyPrisReq.ips = [XyPrisReq.ip];
|
|
163
|
+
XyPrisReq.cookies = this.parseCookies(req.headers.cookie || "");
|
|
164
|
+
XyPrisReq.app = {
|
|
165
|
+
get: (key) => {
|
|
166
|
+
// Simple app settings storage
|
|
167
|
+
const settings = {
|
|
168
|
+
"trust proxy": false,
|
|
169
|
+
"x-powered-by": false,
|
|
170
|
+
};
|
|
171
|
+
return settings[key];
|
|
172
|
+
},
|
|
173
|
+
set: (key, value) => {
|
|
174
|
+
// Simple app settings storage (could be enhanced)
|
|
175
|
+
this.logger.debug("server", `App setting: ${key} = ${value}`);
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
// Additional Express-like properties
|
|
179
|
+
XyPrisReq.protocol =
|
|
180
|
+
req.headers["x-forwarded-proto"] || "http";
|
|
181
|
+
XyPrisReq.secure = XyPrisReq.protocol === "https";
|
|
182
|
+
XyPrisReq.hostname = req.headers.host?.split(":")[0] || "localhost";
|
|
183
|
+
XyPrisReq.subdomains = XyPrisReq.hostname.split(".").slice(0, -2);
|
|
184
|
+
XyPrisReq.fresh = false; // Could be implemented based on cache headers
|
|
185
|
+
XyPrisReq.stale = true;
|
|
186
|
+
XyPrisReq.xhr = req.headers["x-requested-with"] === "XMLHttpRequest";
|
|
187
|
+
return XyPrisReq;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get client IP address from request
|
|
191
|
+
*/
|
|
192
|
+
getClientIP(req) {
|
|
193
|
+
// Check for forwarded headers first
|
|
194
|
+
const forwarded = req.headers["x-forwarded-for"];
|
|
195
|
+
if (forwarded) {
|
|
196
|
+
return forwarded.split(",")[0].trim();
|
|
197
|
+
}
|
|
198
|
+
const realIP = req.headers["x-real-ip"];
|
|
199
|
+
if (realIP) {
|
|
200
|
+
return realIP;
|
|
201
|
+
}
|
|
202
|
+
// Fallback to socket remote address
|
|
203
|
+
return req.socket.remoteAddress || "127.0.0.1";
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Parse cookies from cookie header
|
|
207
|
+
*/
|
|
208
|
+
parseCookies(cookieHeader) {
|
|
209
|
+
const cookies = {};
|
|
210
|
+
if (!cookieHeader) {
|
|
211
|
+
return cookies;
|
|
212
|
+
}
|
|
213
|
+
cookieHeader.split(";").forEach((cookie) => {
|
|
214
|
+
const [name, ...rest] = cookie.trim().split("=");
|
|
215
|
+
if (name && rest.length > 0) {
|
|
216
|
+
cookies[name] = rest.join("=");
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
return cookies;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Enhance the response object with Express-like methods
|
|
223
|
+
*/
|
|
224
|
+
enhanceResponse(res) {
|
|
225
|
+
const XyPrisRes = res;
|
|
226
|
+
XyPrisRes.locals = {};
|
|
227
|
+
// JSON response method
|
|
228
|
+
XyPrisRes.json = (data) => {
|
|
229
|
+
XyPrisRes.setHeader("Content-Type", "application/json");
|
|
230
|
+
XyPrisRes.end(JSON.stringify(data));
|
|
231
|
+
};
|
|
232
|
+
// Send method
|
|
233
|
+
XyPrisRes.send = (data) => {
|
|
234
|
+
if (typeof data === "object") {
|
|
235
|
+
XyPrisRes.json(data);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
// XyPrisRes.setHeader("Content-Type", "text/plain");
|
|
239
|
+
XyPrisRes.end(String(data));
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
// Status method
|
|
243
|
+
XyPrisRes.status = (code) => {
|
|
244
|
+
XyPrisRes.statusCode = code;
|
|
245
|
+
return XyPrisRes;
|
|
246
|
+
};
|
|
247
|
+
// Enhanced setHeader that returns this
|
|
248
|
+
const originalSetHeader = XyPrisRes.setHeader.bind(XyPrisRes);
|
|
249
|
+
XyPrisRes.setHeader = (name, value) => {
|
|
250
|
+
originalSetHeader(name, value);
|
|
251
|
+
return XyPrisRes;
|
|
252
|
+
};
|
|
253
|
+
// Set method (Express-compatible)
|
|
254
|
+
XyPrisRes.set = (field, value) => {
|
|
255
|
+
if (typeof field === "string" && value !== undefined) {
|
|
256
|
+
XyPrisRes.setHeader(field, value);
|
|
257
|
+
}
|
|
258
|
+
else if (typeof field === "object") {
|
|
259
|
+
Object.entries(field).forEach(([key, val]) => {
|
|
260
|
+
XyPrisRes.setHeader(key, val);
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return XyPrisRes;
|
|
264
|
+
};
|
|
265
|
+
// Redirect method
|
|
266
|
+
XyPrisRes.redirect = (statusOrUrl, url) => {
|
|
267
|
+
if (typeof statusOrUrl === "number" && url) {
|
|
268
|
+
XyPrisRes.statusCode = statusOrUrl;
|
|
269
|
+
XyPrisRes.setHeader("Location", url);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
XyPrisRes.statusCode = 302;
|
|
273
|
+
XyPrisRes.setHeader("Location", statusOrUrl);
|
|
274
|
+
}
|
|
275
|
+
XyPrisRes.end();
|
|
276
|
+
};
|
|
277
|
+
// Cookie methods (basic implementation)
|
|
278
|
+
XyPrisRes.cookie = (name, value, options = {}) => {
|
|
279
|
+
let cookieString = `${name}=${value}`;
|
|
280
|
+
if (options.maxAge)
|
|
281
|
+
cookieString += `; Max-Age=${options.maxAge}`;
|
|
282
|
+
if (options.httpOnly)
|
|
283
|
+
cookieString += "; HttpOnly";
|
|
284
|
+
if (options.secure)
|
|
285
|
+
cookieString += "; Secure";
|
|
286
|
+
if (options.sameSite)
|
|
287
|
+
cookieString += `; SameSite=${options.sameSite}`;
|
|
288
|
+
const existingCookies = XyPrisRes.getHeader("Set-Cookie") || [];
|
|
289
|
+
existingCookies.push(cookieString);
|
|
290
|
+
XyPrisRes.setHeader("Set-Cookie", existingCookies);
|
|
291
|
+
};
|
|
292
|
+
XyPrisRes.clearCookie = (name, options = {}) => {
|
|
293
|
+
XyPrisRes.cookie(name, "", { ...options, maxAge: 0 });
|
|
294
|
+
};
|
|
295
|
+
return XyPrisRes;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Parse request body
|
|
299
|
+
*/
|
|
300
|
+
async parseBody(req) {
|
|
301
|
+
return new Promise((resolve, reject) => {
|
|
302
|
+
let body = "";
|
|
303
|
+
req.on("data", (chunk) => {
|
|
304
|
+
body += chunk.toString();
|
|
305
|
+
});
|
|
306
|
+
req.on("end", () => {
|
|
307
|
+
try {
|
|
308
|
+
const contentType = req.headers["content-type"] || "";
|
|
309
|
+
if (contentType.includes("application/json")) {
|
|
310
|
+
req.body = body ? JSON.parse(body) : {};
|
|
311
|
+
}
|
|
312
|
+
else if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
313
|
+
req.body = parse$1(body);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
req.body = body;
|
|
317
|
+
}
|
|
318
|
+
resolve();
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
reject(error);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
req.on("error", reject);
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Execute a single middleware function
|
|
329
|
+
*/
|
|
330
|
+
async executeMiddlewareFunction(middleware, req, res) {
|
|
331
|
+
return new Promise((resolve, reject) => {
|
|
332
|
+
let nextCalled = false;
|
|
333
|
+
const next = (error) => {
|
|
334
|
+
if (nextCalled)
|
|
335
|
+
return;
|
|
336
|
+
nextCalled = true;
|
|
337
|
+
if (error) {
|
|
338
|
+
reject(error);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
resolve();
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
try {
|
|
345
|
+
const result = middleware(req, res, next);
|
|
346
|
+
if (result instanceof Promise) {
|
|
347
|
+
result.catch(reject);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
reject(error);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Find matching route
|
|
357
|
+
*/
|
|
358
|
+
findRoute(method, path, req) {
|
|
359
|
+
this.logger.debug("server", `🔍 Looking for route: ${method} ${path} (${this.routes.length} routes available)`);
|
|
360
|
+
for (const route of this.routes) {
|
|
361
|
+
this.logger.debug("server", `🔍 Checking route: ${route.method} ${route.path} (type: ${typeof route.path})`);
|
|
362
|
+
if (route.method !== method)
|
|
363
|
+
continue;
|
|
364
|
+
if (typeof route.path === "string") {
|
|
365
|
+
const params = this.matchPath(route.path, path);
|
|
366
|
+
if (params !== null) {
|
|
367
|
+
// Add extracted parameters to request
|
|
368
|
+
req.params = { ...req.params, ...params };
|
|
369
|
+
this.logger.debug("server", `Route matched: ${method} ${route.path}`);
|
|
370
|
+
return route;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
else if (route.path instanceof RegExp) {
|
|
374
|
+
this.logger.debug("server", `🔍 Testing RegExp: ${route.path} against ${path}`);
|
|
375
|
+
const match = route.path.exec(path);
|
|
376
|
+
this.logger.debug("server", `🔍 RegExp match result:`, match);
|
|
377
|
+
if (match) {
|
|
378
|
+
// Extract parameters from regex groups using parameter names if available
|
|
379
|
+
const params = {};
|
|
380
|
+
// If there are capture groups, add them as parameters
|
|
381
|
+
if (match.length > 1 && route.paramNames) {
|
|
382
|
+
// Use parameter names from route definition
|
|
383
|
+
for (let i = 1; i < match.length; i++) {
|
|
384
|
+
if (match[i] !== undefined && route.paramNames[i - 1]) {
|
|
385
|
+
const paramName = route.paramNames[i - 1];
|
|
386
|
+
params[paramName] = match[i];
|
|
387
|
+
this.logger.debug("server", `🔍 Extracted param: ${paramName} = ${match[i]}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else if (match.length > 1) {
|
|
392
|
+
// Fallback to generic parameter names if no paramNames available
|
|
393
|
+
if (match[1] !== undefined) {
|
|
394
|
+
params["*"] = match[1];
|
|
395
|
+
}
|
|
396
|
+
// Add other captured groups as numbered parameters
|
|
397
|
+
for (let i = 2; i < match.length; i++) {
|
|
398
|
+
if (match[i] !== undefined) {
|
|
399
|
+
params[`param${i - 1}`] = match[i];
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Add extracted parameters to request
|
|
404
|
+
req.params = { ...req.params, ...params };
|
|
405
|
+
this.logger.debug("routing", `Route matched (regex): ${method} ${route.path} with params: ${JSON.stringify(params)}`);
|
|
406
|
+
return route;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
this.logger.debug("server", `No route found for: ${method} ${path}`);
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Match path with parameters
|
|
415
|
+
*/
|
|
416
|
+
matchPath(routePath, requestPath) {
|
|
417
|
+
// Simple path matching - exact match
|
|
418
|
+
if (routePath === requestPath)
|
|
419
|
+
return {};
|
|
420
|
+
this.logger.debug("server", "[HttpServer] matchPath:", routePath, requestPath);
|
|
421
|
+
// Handle parameters (:param)
|
|
422
|
+
const routeParts = routePath.split("/");
|
|
423
|
+
const requestParts = requestPath.split("/");
|
|
424
|
+
if (routeParts.length !== requestParts.length)
|
|
425
|
+
return null;
|
|
426
|
+
const params = {};
|
|
427
|
+
for (let i = 0; i < routeParts.length; i++) {
|
|
428
|
+
const routePart = routeParts[i];
|
|
429
|
+
const requestPart = requestParts[i];
|
|
430
|
+
if (routePart.startsWith(":")) {
|
|
431
|
+
this.logger.debug("server", `[HttpServer] matchPath: Found parameter ${routePart} with value ${requestPart}`);
|
|
432
|
+
// Parameter - extract value
|
|
433
|
+
const paramName = routePart.substring(1);
|
|
434
|
+
params[paramName] = requestPart;
|
|
435
|
+
}
|
|
436
|
+
else if (routePart !== requestPart) {
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return params;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Send 404 response using NotFoundHandler
|
|
444
|
+
*/
|
|
445
|
+
send404(req, res) {
|
|
446
|
+
// Use the NotFoundHandler to send a beautiful 404 page
|
|
447
|
+
this.notFoundHandler.handler(req, res);
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Handle errors
|
|
451
|
+
*/
|
|
452
|
+
handleError(error, req, res) {
|
|
453
|
+
this.logger.error("server", `Request error: ${error.message}`);
|
|
454
|
+
if (this.errorHandler) {
|
|
455
|
+
this.errorHandler(error, req, res, () => { });
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
if (!res.headersSent) {
|
|
459
|
+
res.status(500).json({ error: "Internal Server Error" });
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Set error handler
|
|
465
|
+
*/
|
|
466
|
+
setErrorHandler(handler) {
|
|
467
|
+
this.errorHandler = handler;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Setup default error handler
|
|
471
|
+
*/
|
|
472
|
+
setupDefaultErrorHandler() {
|
|
473
|
+
this.server.on("error", (error) => {
|
|
474
|
+
this.logger.error("server", `Server error: ${error.message}`);
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Get the underlying HTTP server
|
|
479
|
+
*/
|
|
480
|
+
getServer() {
|
|
481
|
+
return this.server;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Close the server
|
|
485
|
+
*/
|
|
486
|
+
close(callback) {
|
|
487
|
+
this.server.close(callback);
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Get server address
|
|
491
|
+
*/
|
|
492
|
+
address() {
|
|
493
|
+
return this.server.address();
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
export { XyPrissHttpServer };
|
|
498
|
+
//# sourceMappingURL=HttpServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpServer.js","sources":["../../../../../src/server/core/HttpServer.ts"],"sourcesContent":[null],"names":["createHttpServer","parseUrl","parseQuery"],"mappings":"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"}
|