xypriss 1.3.8 → 2.1.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 +232 -254
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js +10 -0
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js +10 -0
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
- package/dist/cjs/mods/security/src/components/cache/index.js +10 -74
- package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/index.js +9 -0
- package/dist/cjs/mods/security/src/components/fortified-function/index.js.map +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js +10 -0
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
- package/dist/cjs/mods/security/src/core/crypto.js +14 -0
- package/dist/cjs/mods/security/src/core/crypto.js.map +1 -1
- package/dist/cjs/mods/security/src/index.js +10 -4
- package/dist/cjs/mods/security/src/index.js.map +1 -1
- package/dist/cjs/shared/logger/Logger.js +374 -29
- package/dist/cjs/shared/logger/Logger.js.map +1 -1
- package/dist/cjs/src/cluster/bun-cluster-manager.js +91 -1
- package/dist/cjs/src/cluster/bun-cluster-manager.js.map +1 -1
- package/dist/cjs/src/cluster/cluster-manager.js +15 -3
- package/dist/cjs/src/cluster/cluster-manager.js.map +1 -1
- package/dist/cjs/src/cluster/modules/AutoScaler.js +4 -4
- package/dist/cjs/src/cluster/modules/AutoScaler.js.map +1 -1
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +2 -2
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
- package/dist/cjs/src/cluster/modules/EventLoopMonitor.js +270 -0
- package/dist/cjs/src/cluster/modules/EventLoopMonitor.js.map +1 -0
- package/dist/cjs/src/cluster/modules/GCStatsTracker.js +200 -0
- package/dist/cjs/src/cluster/modules/GCStatsTracker.js.map +1 -0
- package/dist/cjs/src/cluster/modules/HeapStatsCollector.js +111 -0
- package/dist/cjs/src/cluster/modules/HeapStatsCollector.js.map +1 -0
- package/dist/cjs/src/cluster/modules/NetworkTracker.js +162 -0
- package/dist/cjs/src/cluster/modules/NetworkTracker.js.map +1 -0
- package/dist/cjs/src/cluster/modules/ThroughputCalculator.js +186 -0
- package/dist/cjs/src/cluster/modules/ThroughputCalculator.js.map +1 -0
- package/dist/cjs/src/cluster/modules/WorkerManager.js +14 -15
- package/dist/cjs/src/cluster/modules/WorkerManager.js.map +1 -1
- package/dist/cjs/src/cluster/modules/{LoadBalancer.js → strategy/LoadBalancer.js} +1 -1
- package/dist/cjs/src/cluster/modules/strategy/LoadBalancer.js.map +1 -0
- 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/middleware/built-in/sqlInjection.js +335 -0
- package/dist/cjs/src/middleware/built-in/sqlInjection.js.map +1 -0
- package/dist/cjs/src/middleware/safe-json-middleware.js +1 -1
- package/dist/cjs/src/middleware/safe-json-middleware.js.map +1 -1
- package/dist/cjs/src/middleware/security-middleware.js +447 -332
- package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
- 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/plugins/modules/index.js +9 -3
- package/dist/cjs/src/plugins/modules/index.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 +94 -412
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/ServerFactory.js +69 -64
- package/dist/cjs/src/server/ServerFactory.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +31 -5
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js.map +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/fastapi/WorkerPoolComponent.js +206 -0
- package/dist/cjs/src/server/components/fastapi/WorkerPoolComponent.js.map +1 -0
- package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js +3 -28
- package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js +265 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js.map +1 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/Logger.js +236 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/cpu-tasks.js +294 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/enhanced-cpu-worker.js +433 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/io-worker.js +1615 -0
- package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js +503 -0
- package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
- package/dist/cjs/src/server/const/default.js +23 -17
- 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 +679 -0
- package/dist/cjs/src/server/core/XyprissApp.js.map +1 -0
- package/dist/cjs/src/server/handlers/NotFoundHandler.js +1 -1
- package/dist/cjs/src/server/handlers/NotFoundHandler.js.map +1 -1
- package/dist/cjs/src/server/middleware/MiddlewareManager.js +191 -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/algorithms/hash-algorithms.js +10 -0
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +10 -0
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/index.js +11 -72
- package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/index.js +9 -0
- package/dist/esm/mods/security/src/components/fortified-function/index.js.map +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +10 -0
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
- package/dist/esm/mods/security/src/core/crypto.js +14 -0
- package/dist/esm/mods/security/src/core/crypto.js.map +1 -1
- package/dist/esm/mods/security/src/index.js +11 -2
- package/dist/esm/mods/security/src/index.js.map +1 -1
- package/dist/esm/shared/logger/Logger.js +374 -29
- package/dist/esm/shared/logger/Logger.js.map +1 -1
- package/dist/esm/src/cluster/bun-cluster-manager.js +91 -1
- package/dist/esm/src/cluster/bun-cluster-manager.js.map +1 -1
- package/dist/esm/src/cluster/cluster-manager.js +15 -3
- package/dist/esm/src/cluster/cluster-manager.js.map +1 -1
- package/dist/esm/src/cluster/modules/AutoScaler.js +4 -4
- package/dist/esm/src/cluster/modules/AutoScaler.js.map +1 -1
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +2 -2
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
- package/dist/esm/src/cluster/modules/EventLoopMonitor.js +268 -0
- package/dist/esm/src/cluster/modules/EventLoopMonitor.js.map +1 -0
- package/dist/esm/src/cluster/modules/GCStatsTracker.js +198 -0
- package/dist/esm/src/cluster/modules/GCStatsTracker.js.map +1 -0
- package/dist/esm/src/cluster/modules/HeapStatsCollector.js +109 -0
- package/dist/esm/src/cluster/modules/HeapStatsCollector.js.map +1 -0
- package/dist/esm/src/cluster/modules/NetworkTracker.js +160 -0
- package/dist/esm/src/cluster/modules/NetworkTracker.js.map +1 -0
- package/dist/esm/src/cluster/modules/ThroughputCalculator.js +184 -0
- package/dist/esm/src/cluster/modules/ThroughputCalculator.js.map +1 -0
- package/dist/esm/src/cluster/modules/WorkerManager.js +14 -14
- package/dist/esm/src/cluster/modules/WorkerManager.js.map +1 -1
- package/dist/esm/src/cluster/modules/{LoadBalancer.js → strategy/LoadBalancer.js} +1 -1
- package/dist/esm/src/cluster/modules/strategy/LoadBalancer.js.map +1 -0
- 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/middleware/built-in/sqlInjection.js +333 -0
- package/dist/esm/src/middleware/built-in/sqlInjection.js.map +1 -0
- package/dist/esm/src/middleware/safe-json-middleware.js +1 -1
- package/dist/esm/src/middleware/safe-json-middleware.js.map +1 -1
- package/dist/esm/src/middleware/security-middleware.js +447 -332
- package/dist/esm/src/middleware/security-middleware.js.map +1 -1
- 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/plugins/modules/index.js +9 -3
- package/dist/esm/src/plugins/modules/index.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 +94 -412
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/ServerFactory.js +70 -61
- package/dist/esm/src/server/ServerFactory.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +31 -5
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js.map +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/fastapi/WorkerPoolComponent.js +204 -0
- package/dist/esm/src/server/components/fastapi/WorkerPoolComponent.js.map +1 -0
- package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js +2 -27
- package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js +263 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js.map +1 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/Logger.js +236 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/cpu-tasks.js +294 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/enhanced-cpu-worker.js +433 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/io-worker.js +1615 -0
- package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js +501 -0
- package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
- package/dist/esm/src/server/const/default.js +23 -17
- 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 +677 -0
- package/dist/esm/src/server/core/XyprissApp.js.map +1 -0
- package/dist/esm/src/server/handlers/NotFoundHandler.js +1 -1
- package/dist/esm/src/server/handlers/NotFoundHandler.js.map +1 -1
- package/dist/esm/src/server/middleware/MiddlewareManager.js +189 -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 +3363 -5311
- package/package.json +39 -28
- package/dist/cjs/src/cluster/index.js +0 -361
- package/dist/cjs/src/cluster/index.js.map +0 -1
- package/dist/cjs/src/cluster/modules/ClusterFactory.js +0 -539
- package/dist/cjs/src/cluster/modules/ClusterFactory.js.map +0 -1
- package/dist/cjs/src/cluster/modules/LoadBalancer.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/UltraFastRequestProcessor.js +0 -668
- package/dist/cjs/src/server/components/fastapi/UltraFastRequestProcessor.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareAPI.js +0 -347
- package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareAPI.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js +0 -204
- package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/middlewares/middlewareManager.js +0 -953
- package/dist/cjs/src/server/components/fastapi/middlewares/middlewareManager.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPool.js +0 -56
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPool.js.map +0 -1
- package/dist/esm/src/cluster/index.js +0 -339
- package/dist/esm/src/cluster/index.js.map +0 -1
- package/dist/esm/src/cluster/modules/ClusterFactory.js +0 -511
- package/dist/esm/src/cluster/modules/ClusterFactory.js.map +0 -1
- package/dist/esm/src/cluster/modules/LoadBalancer.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/UltraFastRequestProcessor.js +0 -647
- package/dist/esm/src/server/components/fastapi/UltraFastRequestProcessor.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareAPI.js +0 -345
- package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareAPI.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js +0 -202
- package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/middlewares/middlewareManager.js +0 -951
- package/dist/esm/src/server/components/fastapi/middlewares/middlewareManager.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPool.js +0 -54
- package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPool.js.map +0 -1
|
@@ -0,0 +1,679 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('../../../shared/logger/Logger.js');
|
|
4
|
+
var HttpServer = require('./HttpServer.js');
|
|
5
|
+
var XyPrissMiddlewareAPI = require('../../middleware/XyPrissMiddlewareAPI.js');
|
|
6
|
+
var Router = require('../routing/Router.js');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* XyprissApp - Express-free UltraFastApp implementation
|
|
10
|
+
*
|
|
11
|
+
* This module provides a complete UltraFastApp implementation that doesn't
|
|
12
|
+
* depend on Express, using our XyPrisHttpServer for maximum performance.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* UltraFastApp implementation without Express dependency
|
|
16
|
+
*/
|
|
17
|
+
class XyprissApp {
|
|
18
|
+
constructor(logger) {
|
|
19
|
+
this.isStarted = false;
|
|
20
|
+
// App properties
|
|
21
|
+
this.locals = {};
|
|
22
|
+
this.mountpath = "/";
|
|
23
|
+
this.settings = {};
|
|
24
|
+
// ===== MISSING ULTRAFASTAPP METHODS (STUB IMPLEMENTATIONS) =====
|
|
25
|
+
this.invalidateCache = async (pattern) => {
|
|
26
|
+
if (this.cache) {
|
|
27
|
+
try {
|
|
28
|
+
// Get all cache keys and filter by pattern
|
|
29
|
+
const stats = await this.cache.getStats();
|
|
30
|
+
let invalidatedCount = 0;
|
|
31
|
+
// For pattern-based invalidation, we need to implement a key scanning approach
|
|
32
|
+
// Since the cache doesn't expose all keys directly, we'll use tags if available
|
|
33
|
+
if (pattern.includes("*")) {
|
|
34
|
+
// Convert glob pattern to regex
|
|
35
|
+
const regexPattern = pattern
|
|
36
|
+
.replace(/\*/g, ".*")
|
|
37
|
+
.replace(/\?/g, ".");
|
|
38
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
39
|
+
// For now, we'll clear all cache if it's a wildcard pattern
|
|
40
|
+
// In a production system, you'd want to implement key scanning
|
|
41
|
+
if (pattern === "*" || pattern === "**") {
|
|
42
|
+
await this.cache.clear();
|
|
43
|
+
invalidatedCount = stats.memory.size || 0;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// For specific patterns, we'd need to implement key enumeration
|
|
47
|
+
// This is a limitation of the current cache implementation
|
|
48
|
+
this.logger.warn("server", `Pattern-based cache invalidation not fully supported: ${pattern}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Direct key deletion
|
|
53
|
+
const deleted = await this.cache.delete(pattern);
|
|
54
|
+
invalidatedCount = deleted ? 1 : 0;
|
|
55
|
+
}
|
|
56
|
+
this.logger.debug("server", `Cache invalidation completed for pattern: ${pattern}, invalidated: ${invalidatedCount} entries`);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
this.logger.error("server", `Cache invalidation failed for pattern ${pattern}: ${error}`);
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
this.getCacheStats = async () => {
|
|
65
|
+
if (this.cache) {
|
|
66
|
+
try {
|
|
67
|
+
const stats = await this.cache.getStats();
|
|
68
|
+
// Transform cache stats to a more user-friendly format
|
|
69
|
+
return {
|
|
70
|
+
memory: {
|
|
71
|
+
hitRate: stats.memory.hitRate || 0,
|
|
72
|
+
missRate: 1 - (stats.memory.hitRate || 0),
|
|
73
|
+
size: stats.memory.size || 0,
|
|
74
|
+
hits: stats.memory.hits || 0,
|
|
75
|
+
misses: stats.memory.misses || 0,
|
|
76
|
+
totalOperations: (stats.memory.hits || 0) +
|
|
77
|
+
(stats.memory.misses || 0),
|
|
78
|
+
memoryUsage: stats.memory.memoryUsage || 0,
|
|
79
|
+
evictions: stats.memory.evictions || 0,
|
|
80
|
+
},
|
|
81
|
+
redis: stats.redis
|
|
82
|
+
? {
|
|
83
|
+
connected: stats.redis.connected,
|
|
84
|
+
hitRate: stats.redis.hitRate || 0,
|
|
85
|
+
hits: stats.redis.hits || 0,
|
|
86
|
+
misses: stats.redis.misses || 0,
|
|
87
|
+
keys: stats.redis.keys || 0,
|
|
88
|
+
memoryUsage: stats.redis.memoryUsage,
|
|
89
|
+
uptime: stats.redis.uptime || 0,
|
|
90
|
+
}
|
|
91
|
+
: null,
|
|
92
|
+
performance: stats.performance
|
|
93
|
+
? {
|
|
94
|
+
totalOperations: stats.performance.totalOperations || 0,
|
|
95
|
+
averageResponseTime: stats.performance.averageResponseTime || 0,
|
|
96
|
+
compressionRatio: stats.performance.compressionRatio || 0,
|
|
97
|
+
}
|
|
98
|
+
: null,
|
|
99
|
+
security: stats.security
|
|
100
|
+
? {
|
|
101
|
+
encryptedEntries: stats.security.encryptedEntries || 0,
|
|
102
|
+
keyRotations: stats.security.keyRotations || 0,
|
|
103
|
+
}
|
|
104
|
+
: null,
|
|
105
|
+
timestamp: Date.now(),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
this.logger.error("server", `Failed to get cache stats: ${error}`);
|
|
110
|
+
return { error: "Failed to retrieve cache statistics" };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
};
|
|
115
|
+
this.warmUpCache = async (data) => {
|
|
116
|
+
if (this.cache && data && data.length > 0) {
|
|
117
|
+
try {
|
|
118
|
+
this.logger.debug("server", `Starting cache warmup for ${data.length} entries`);
|
|
119
|
+
let successCount = 0;
|
|
120
|
+
let errorCount = 0;
|
|
121
|
+
const batchSize = 10; // Process in batches to avoid overwhelming the cache
|
|
122
|
+
// Process entries in batches
|
|
123
|
+
for (let i = 0; i < data.length; i += batchSize) {
|
|
124
|
+
const batch = data.slice(i, i + batchSize);
|
|
125
|
+
const batchPromises = batch.map(async (entry) => {
|
|
126
|
+
try {
|
|
127
|
+
const options = entry.ttl
|
|
128
|
+
? { ttl: entry.ttl }
|
|
129
|
+
: undefined;
|
|
130
|
+
await this.cache.set(entry.key, entry.value, options);
|
|
131
|
+
successCount++;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
errorCount++;
|
|
135
|
+
this.logger.warn("server", `Failed to warm up cache entry ${entry.key}: ${error}`);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
// Wait for batch to complete
|
|
139
|
+
await Promise.allSettled(batchPromises);
|
|
140
|
+
// Small delay between batches to prevent overwhelming the system
|
|
141
|
+
if (i + batchSize < data.length) {
|
|
142
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
this.logger.debug("server", `Cache warmup completed: ${successCount} successful, ${errorCount} failed`);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
this.logger.error("server", `Cache warmup failed: ${error}`);
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
this.getRequestPreCompiler = () => {
|
|
154
|
+
// RequestPreCompiler is not implemented in the current architecture
|
|
155
|
+
// This would be a component for pre-compiling request handlers for performance
|
|
156
|
+
this.logger.debug("server", "RequestPreCompiler not implemented");
|
|
157
|
+
return {
|
|
158
|
+
compile: (routes) => {
|
|
159
|
+
this.logger.debug("server", `Pre-compiling ${routes.length} routes`);
|
|
160
|
+
return routes; // Pass-through for now
|
|
161
|
+
},
|
|
162
|
+
isEnabled: () => false,
|
|
163
|
+
getStats: () => ({ compiledRoutes: 0, compilationTime: 0 }),
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
this.getConsoleInterceptor = () => null;
|
|
167
|
+
this.enableConsoleInterception = () => { };
|
|
168
|
+
this.disableConsoleInterception = () => { };
|
|
169
|
+
this.getConsoleStats = () => null;
|
|
170
|
+
this.resetConsoleStats = () => { };
|
|
171
|
+
this.getFileWatcherStatus = () => null;
|
|
172
|
+
this.getFileWatcherStats = () => null;
|
|
173
|
+
this.stopFileWatcher = async () => { };
|
|
174
|
+
this.getFileWatcherManager = () => null;
|
|
175
|
+
this.checkTypeScript = async (files) => null;
|
|
176
|
+
this.getTypeScriptStatus = () => null;
|
|
177
|
+
this.enableTypeScriptChecking = () => { };
|
|
178
|
+
this.disableTypeScriptChecking = () => { };
|
|
179
|
+
this.ultraGet = (path, options, handler) => {
|
|
180
|
+
return this.get(path, handler);
|
|
181
|
+
};
|
|
182
|
+
this.ultraPost = (path, options, handler) => {
|
|
183
|
+
return this.post(path, handler);
|
|
184
|
+
};
|
|
185
|
+
this.ultraPut = (path, options, handler) => {
|
|
186
|
+
return this.put(path, handler);
|
|
187
|
+
};
|
|
188
|
+
this.ultraDelete = (path, options, handler) => {
|
|
189
|
+
return this.delete(path, handler);
|
|
190
|
+
};
|
|
191
|
+
this.ultraRoutes = (routes) => {
|
|
192
|
+
if (!routes || !Array.isArray(routes)) {
|
|
193
|
+
this.logger.warn("server", "Invalid routes array provided to ultraRoutes");
|
|
194
|
+
return this;
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
this.logger.debug("server", `Bulk registering ${routes.length} routes`);
|
|
198
|
+
let successCount = 0;
|
|
199
|
+
let errorCount = 0;
|
|
200
|
+
routes.forEach((route, index) => {
|
|
201
|
+
try {
|
|
202
|
+
const { method, path, handler } = route;
|
|
203
|
+
if (!method || !path || !handler) {
|
|
204
|
+
throw new Error(`Invalid route at index ${index}: missing method, path, or handler`);
|
|
205
|
+
}
|
|
206
|
+
// Register route based on method
|
|
207
|
+
switch (method.toUpperCase()) {
|
|
208
|
+
case "GET":
|
|
209
|
+
this.get(path, handler);
|
|
210
|
+
break;
|
|
211
|
+
case "POST":
|
|
212
|
+
this.post(path, handler);
|
|
213
|
+
break;
|
|
214
|
+
case "PUT":
|
|
215
|
+
this.put(path, handler);
|
|
216
|
+
break;
|
|
217
|
+
case "DELETE":
|
|
218
|
+
this.delete(path, handler);
|
|
219
|
+
break;
|
|
220
|
+
case "PATCH":
|
|
221
|
+
this.patch(path, handler);
|
|
222
|
+
break;
|
|
223
|
+
case "OPTIONS":
|
|
224
|
+
this.options(path, handler);
|
|
225
|
+
break;
|
|
226
|
+
case "HEAD":
|
|
227
|
+
this.head(path, handler);
|
|
228
|
+
break;
|
|
229
|
+
default:
|
|
230
|
+
throw new Error(`Unsupported HTTP method: ${method}`);
|
|
231
|
+
}
|
|
232
|
+
successCount++;
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
errorCount++;
|
|
236
|
+
this.logger.error("server", `Failed to register route at index ${index}: ${error}`);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
this.logger.debug("server", `Bulk route registration completed: ${successCount} successful, ${errorCount} failed`);
|
|
240
|
+
return this;
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
this.logger.error("server", `Bulk route registration failed: ${error}`);
|
|
244
|
+
return this;
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
this.getRouterStats = () => null;
|
|
248
|
+
this.getRouterInfo = () => null;
|
|
249
|
+
this.warmUpRoutes = async () => { };
|
|
250
|
+
this.resetRouterStats = () => { };
|
|
251
|
+
this.useCached = (middleware, ttl) => {
|
|
252
|
+
if (!this.cache) {
|
|
253
|
+
this.logger.warn("server", "Cache not available, using middleware without caching");
|
|
254
|
+
return this.use(middleware);
|
|
255
|
+
}
|
|
256
|
+
// Create a caching wrapper for the middleware
|
|
257
|
+
const cachedMiddleware = async (req, res, next) => {
|
|
258
|
+
try {
|
|
259
|
+
// Generate cache key based on request
|
|
260
|
+
const cacheKey = `middleware:${req.method}:${req.path}:${JSON.stringify(req.query)}`;
|
|
261
|
+
// Check if response is cached
|
|
262
|
+
const cachedResponse = await this.cache.get(cacheKey);
|
|
263
|
+
if (cachedResponse) {
|
|
264
|
+
this.logger.debug("server", `Serving cached middleware response for ${cacheKey}`);
|
|
265
|
+
res.json(cachedResponse);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
// Intercept response to cache it
|
|
269
|
+
const originalJson = res.json;
|
|
270
|
+
const self = this;
|
|
271
|
+
res.json = function (data) {
|
|
272
|
+
// Cache the response
|
|
273
|
+
if (ttl && self.cache) {
|
|
274
|
+
self.cache
|
|
275
|
+
.set(cacheKey, data, { ttl })
|
|
276
|
+
.catch((error) => {
|
|
277
|
+
self.logger.warn("server", `Failed to cache middleware response: ${error}`);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return originalJson.call(this, data);
|
|
281
|
+
};
|
|
282
|
+
// Execute original middleware
|
|
283
|
+
middleware(req, res, next);
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
this.logger.error("server", `Cached middleware error: ${error}`);
|
|
287
|
+
middleware(req, res, next);
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
return this.use(cachedMiddleware);
|
|
291
|
+
};
|
|
292
|
+
this.removeMiddleware = (name) => {
|
|
293
|
+
try {
|
|
294
|
+
// Middleware removal is complex in the current architecture
|
|
295
|
+
// This would require tracking middleware by name and rebuilding the middleware stack
|
|
296
|
+
this.logger.warn("server", `Middleware removal not fully implemented for: ${name}`);
|
|
297
|
+
// For now, we can only disable middleware through the middleware API
|
|
298
|
+
if (this.middlewareAPI) {
|
|
299
|
+
const disabled = this.middlewareAPI.disable(name);
|
|
300
|
+
if (disabled) {
|
|
301
|
+
this.logger.debug("server", `Disabled middleware: ${name}`);
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
this.logger.error("server", `Failed to remove middleware ${name}: ${error}`);
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
this.enableSecurity = (options) => {
|
|
313
|
+
try {
|
|
314
|
+
this.logger.debug("server", "Enabling security middleware");
|
|
315
|
+
if (this.middlewareAPI) {
|
|
316
|
+
// Enable all security middleware
|
|
317
|
+
const securityMiddleware = [
|
|
318
|
+
"helmet",
|
|
319
|
+
"cors",
|
|
320
|
+
"rateLimit",
|
|
321
|
+
"csrf",
|
|
322
|
+
"compression",
|
|
323
|
+
"hpp",
|
|
324
|
+
"mongoSanitize",
|
|
325
|
+
"xss",
|
|
326
|
+
];
|
|
327
|
+
securityMiddleware.forEach((middleware) => {
|
|
328
|
+
try {
|
|
329
|
+
this.middlewareAPI.enable(middleware);
|
|
330
|
+
this.logger.debug("server", `Enabled security middleware: ${middleware}`);
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
this.logger.warn("server", `Failed to enable ${middleware}: ${error}`);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
// Apply custom security options if provided
|
|
337
|
+
if (options) {
|
|
338
|
+
if (options.helmet) {
|
|
339
|
+
this.middlewareAPI.helmet(options.helmet);
|
|
340
|
+
}
|
|
341
|
+
if (options.cors) {
|
|
342
|
+
this.middlewareAPI.cors(options.cors);
|
|
343
|
+
}
|
|
344
|
+
if (options.rateLimit) {
|
|
345
|
+
this.middlewareAPI.rateLimit(options.rateLimit);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
this.logger.debug("server", "Security middleware enabled successfully");
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
this.logger.warn("server", "Middleware API not available, cannot enable security");
|
|
352
|
+
}
|
|
353
|
+
return this;
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
this.logger.error("server", `Failed to enable security middleware: ${error}`);
|
|
357
|
+
return this;
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
// More missing methods
|
|
361
|
+
this.enableConsoleEncryption = () => { };
|
|
362
|
+
this.disableConsoleEncryption = () => { };
|
|
363
|
+
this.encrypt = (data) => data;
|
|
364
|
+
this.setConsoleEncryptionKey = (key) => { };
|
|
365
|
+
this.enableCors = (options) => this;
|
|
366
|
+
this.enableCompression = (options) => this;
|
|
367
|
+
this.enableRateLimit = (options) => this;
|
|
368
|
+
this.getWithCache = (path, options, handler) => this.get(path, handler);
|
|
369
|
+
this.postWithCache = (path, options, handler) => this.post(path, handler);
|
|
370
|
+
this.putWithCache = (path, options, handler) => this.put(path, handler);
|
|
371
|
+
this.deleteWithCache = (path, options, handler) => this.delete(path, handler);
|
|
372
|
+
this.patchWithCache = (path, options, handler) => this.patch(path, handler);
|
|
373
|
+
this.optionsWithCache = (path, options, handler) => this.options(path, handler);
|
|
374
|
+
this.headWithCache = (path, options, handler) => this.head(path, handler);
|
|
375
|
+
// Final missing methods
|
|
376
|
+
this.setConsoleEncryptionDisplayMode = (_mode) => { };
|
|
377
|
+
this.getEncryptedLogs = () => [];
|
|
378
|
+
this.restoreConsoleFromEncrypted = async (_encryptedData, _key) => [];
|
|
379
|
+
this.isConsoleEncryptionEnabled = () => false;
|
|
380
|
+
this.getConsoleEncryptionKey = () => "";
|
|
381
|
+
this.clearEncryptedLogs = () => { };
|
|
382
|
+
this.exportEncryptedLogs = (_format) => null;
|
|
383
|
+
this.importEncryptedLogs = (_data) => { };
|
|
384
|
+
this.getConsoleEncryptionStats = () => null;
|
|
385
|
+
this.getConsoleEncryptionStatus = () => null;
|
|
386
|
+
this.useSecure = (_options) => this;
|
|
387
|
+
this.usePerformance = (_options) => this;
|
|
388
|
+
this.getMiddleware = () => null;
|
|
389
|
+
this.getMiddlewareStats = () => null;
|
|
390
|
+
this.logger = logger;
|
|
391
|
+
this.httpServer = new HttpServer.XyPrissHttpServer(logger);
|
|
392
|
+
this.middlewareAPI = new XyPrissMiddlewareAPI.XyPrissMiddleware(this);
|
|
393
|
+
this.setupDefaultSettings();
|
|
394
|
+
this.logger.debug("routing", "XyprissApp created with new XyPrisHttpServer");
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Setup default Express-like settings
|
|
398
|
+
*/
|
|
399
|
+
setupDefaultSettings() {
|
|
400
|
+
this.settings = {
|
|
401
|
+
"x-powered-by": false,
|
|
402
|
+
etag: "weak",
|
|
403
|
+
env: process.env.NODE_ENV || "development",
|
|
404
|
+
"subdomain offset": 2,
|
|
405
|
+
"trust proxy": false,
|
|
406
|
+
"view cache": true,
|
|
407
|
+
"view engine": false,
|
|
408
|
+
views: process.cwd() + "/views",
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
// ===== HTTP METHOD IMPLEMENTATIONS =====
|
|
412
|
+
get(path, ...handlers) {
|
|
413
|
+
this.logger.debug("server", `Registering GET route: ${path}`);
|
|
414
|
+
this.httpServer.get(path, ...this.convertHandlers(handlers));
|
|
415
|
+
}
|
|
416
|
+
post(path, ...handlers) {
|
|
417
|
+
this.httpServer.post(path, ...this.convertHandlers(handlers));
|
|
418
|
+
}
|
|
419
|
+
put(path, ...handlers) {
|
|
420
|
+
this.httpServer.put(path, ...this.convertHandlers(handlers));
|
|
421
|
+
}
|
|
422
|
+
delete(path, ...handlers) {
|
|
423
|
+
this.httpServer.delete(path, ...this.convertHandlers(handlers));
|
|
424
|
+
}
|
|
425
|
+
patch(path, ...handlers) {
|
|
426
|
+
this.httpServer.patch(path, ...this.convertHandlers(handlers));
|
|
427
|
+
}
|
|
428
|
+
options(path, ...handlers) {
|
|
429
|
+
this.httpServer.options(path, ...this.convertHandlers(handlers));
|
|
430
|
+
}
|
|
431
|
+
head(path, ...handlers) {
|
|
432
|
+
this.httpServer.head(path, ...this.convertHandlers(handlers));
|
|
433
|
+
}
|
|
434
|
+
all(path, ...handlers) {
|
|
435
|
+
// Implement all HTTP methods
|
|
436
|
+
const convertedHandlers = this.convertHandlers(handlers);
|
|
437
|
+
this.httpServer.get(path, ...convertedHandlers);
|
|
438
|
+
this.httpServer.post(path, ...convertedHandlers);
|
|
439
|
+
this.httpServer.put(path, ...convertedHandlers);
|
|
440
|
+
this.httpServer.delete(path, ...convertedHandlers);
|
|
441
|
+
this.httpServer.patch(path, ...convertedHandlers);
|
|
442
|
+
this.httpServer.options(path, ...convertedHandlers);
|
|
443
|
+
this.httpServer.head(path, ...convertedHandlers);
|
|
444
|
+
}
|
|
445
|
+
// ===== MIDDLEWARE METHODS =====
|
|
446
|
+
use(pathOrRouter, router) {
|
|
447
|
+
if (typeof pathOrRouter === "string" &&
|
|
448
|
+
router instanceof Router.XyPrissRouter) {
|
|
449
|
+
// app.use('/api', router)
|
|
450
|
+
this.mountRouter(pathOrRouter, router);
|
|
451
|
+
}
|
|
452
|
+
else if (pathOrRouter instanceof Router.XyPrissRouter) {
|
|
453
|
+
// app.use(router)
|
|
454
|
+
this.mountRouter("/", pathOrRouter);
|
|
455
|
+
}
|
|
456
|
+
else if (typeof pathOrRouter === "function") {
|
|
457
|
+
// app.use(middleware)
|
|
458
|
+
this.httpServer.use(pathOrRouter);
|
|
459
|
+
}
|
|
460
|
+
else if (typeof pathOrRouter === "string" &&
|
|
461
|
+
typeof router === "function") {
|
|
462
|
+
// app.use(path, middleware)
|
|
463
|
+
this.httpServer.use(pathOrRouter, router);
|
|
464
|
+
}
|
|
465
|
+
return this;
|
|
466
|
+
}
|
|
467
|
+
listen(port, hostnameOrCallback, callback) {
|
|
468
|
+
let hostname = "localhost";
|
|
469
|
+
let cb = callback;
|
|
470
|
+
if (typeof hostnameOrCallback === "string") {
|
|
471
|
+
hostname = hostnameOrCallback;
|
|
472
|
+
}
|
|
473
|
+
else if (typeof hostnameOrCallback === "function") {
|
|
474
|
+
cb = hostnameOrCallback;
|
|
475
|
+
}
|
|
476
|
+
this.logger.debug("server", `listen() called: ${hostname}:${port}`);
|
|
477
|
+
const server = this.httpServer.listen(port, hostname, cb);
|
|
478
|
+
this.logger.debug("server", `listen() returning server: ${typeof server}, has 'on': ${typeof server?.on}`);
|
|
479
|
+
return server;
|
|
480
|
+
}
|
|
481
|
+
set(setting, val) {
|
|
482
|
+
this.settings[setting] = val;
|
|
483
|
+
}
|
|
484
|
+
getSetting(setting) {
|
|
485
|
+
return this.settings[setting];
|
|
486
|
+
}
|
|
487
|
+
enabled(setting) {
|
|
488
|
+
return Boolean(this.settings[setting]);
|
|
489
|
+
}
|
|
490
|
+
disabled(setting) {
|
|
491
|
+
return !this.settings[setting];
|
|
492
|
+
}
|
|
493
|
+
enable(setting) {
|
|
494
|
+
this.settings[setting] = true;
|
|
495
|
+
}
|
|
496
|
+
disable(setting) {
|
|
497
|
+
this.settings[setting] = false;
|
|
498
|
+
}
|
|
499
|
+
engine(ext, fn) {
|
|
500
|
+
// Template engine support - basic implementation
|
|
501
|
+
this.settings[`engine:${ext}`] = fn;
|
|
502
|
+
return this;
|
|
503
|
+
}
|
|
504
|
+
param(name, handler) {
|
|
505
|
+
// Parameter preprocessing - basic implementation
|
|
506
|
+
this.settings[`param:${name}`] = handler;
|
|
507
|
+
}
|
|
508
|
+
path() {
|
|
509
|
+
return this.mountpath;
|
|
510
|
+
}
|
|
511
|
+
render(_view, _options, callback) {
|
|
512
|
+
// Template rendering - basic implementation
|
|
513
|
+
if (callback) {
|
|
514
|
+
callback(new Error("Template rendering not implemented"));
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
route(path) {
|
|
518
|
+
// Route creation - basic implementation
|
|
519
|
+
return {
|
|
520
|
+
get: (handler) => this.get(path, handler),
|
|
521
|
+
post: (handler) => this.post(path, handler),
|
|
522
|
+
put: (handler) => this.put(path, handler),
|
|
523
|
+
delete: (handler) => this.delete(path, handler),
|
|
524
|
+
patch: (handler) => this.patch(path, handler),
|
|
525
|
+
options: (handler) => this.options(path, handler),
|
|
526
|
+
head: (handler) => this.head(path, handler),
|
|
527
|
+
all: (handler) => this.all(path, handler),
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
// ===== CACHE METHODS =====
|
|
531
|
+
setCache(cache) {
|
|
532
|
+
this.cache = cache;
|
|
533
|
+
}
|
|
534
|
+
getCache() {
|
|
535
|
+
return this.cache;
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Access the middleware management API
|
|
539
|
+
*/
|
|
540
|
+
middleware(config) {
|
|
541
|
+
return this.middlewareAPI;
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Mount a router at a specific path
|
|
545
|
+
*/
|
|
546
|
+
mountRouter(basePath, router) {
|
|
547
|
+
const routes = router.getRoutes();
|
|
548
|
+
const middleware = router.getMiddleware();
|
|
549
|
+
this.logger.debug("server", `🔧 Mounting router at ${basePath} with ${routes.length} routes`);
|
|
550
|
+
routes.forEach((route) => {
|
|
551
|
+
this.logger.debug("server", `🔧 Router route: ${route.method} ${route.path} (has pattern: ${!!route.pattern})`);
|
|
552
|
+
});
|
|
553
|
+
// Register router middleware first
|
|
554
|
+
middleware.forEach((mw) => {
|
|
555
|
+
this.httpServer.use(mw);
|
|
556
|
+
});
|
|
557
|
+
// Register all routes from the router
|
|
558
|
+
routes.forEach((route) => {
|
|
559
|
+
const fullPath = this.joinPaths(basePath, route.path);
|
|
560
|
+
// Register route-specific middleware
|
|
561
|
+
route.middleware.forEach((mw) => {
|
|
562
|
+
this.httpServer.use(mw);
|
|
563
|
+
});
|
|
564
|
+
// If the route has a compiled pattern, we need to create a new pattern
|
|
565
|
+
// that includes the base path
|
|
566
|
+
let routePath = fullPath;
|
|
567
|
+
if (route.pattern && basePath !== "/") {
|
|
568
|
+
// Create a new pattern that includes the base path
|
|
569
|
+
const originalPattern = route.pattern.source;
|
|
570
|
+
const flags = route.pattern.flags;
|
|
571
|
+
// Remove the ^ and $ anchors from the original pattern
|
|
572
|
+
const cleanPattern = originalPattern
|
|
573
|
+
.replace(/^\^/, "")
|
|
574
|
+
.replace(/\$$/, "");
|
|
575
|
+
// Create new pattern with base path
|
|
576
|
+
const basePathEscaped = basePath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
577
|
+
const newPatternSource = `^${basePathEscaped}${cleanPattern}$`;
|
|
578
|
+
routePath = new RegExp(newPatternSource, flags);
|
|
579
|
+
this.logger.debug("server", `🔧 Registering route: ${route.method} ${fullPath} (compiled pattern with base path)`);
|
|
580
|
+
}
|
|
581
|
+
else if (route.pattern) {
|
|
582
|
+
// Use the original pattern if no base path
|
|
583
|
+
routePath = route.pattern;
|
|
584
|
+
this.logger.debug("server", `🔧 Registering route: ${route.method} ${fullPath} (original compiled pattern)`);
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
this.logger.debug("server", `🔧 Registering route: ${route.method} ${fullPath} (string path)`);
|
|
588
|
+
}
|
|
589
|
+
// Register the route using the appropriate HTTP method
|
|
590
|
+
const allHandlers = [...route.middleware, route.handler];
|
|
591
|
+
// For RegExp routes, we need to manually add the route with parameter names
|
|
592
|
+
if (routePath instanceof RegExp && route.paramNames) {
|
|
593
|
+
// Manually add route to HTTP server with parameter names
|
|
594
|
+
this.httpServer.addRouteWithParams(route.method.toUpperCase(), routePath, route.paramNames, allHandlers);
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
// Use standard HTTP method registration
|
|
598
|
+
switch (route.method.toUpperCase()) {
|
|
599
|
+
case "GET":
|
|
600
|
+
this.httpServer.get(routePath, ...allHandlers);
|
|
601
|
+
break;
|
|
602
|
+
case "POST":
|
|
603
|
+
this.httpServer.post(routePath, ...allHandlers);
|
|
604
|
+
break;
|
|
605
|
+
case "PUT":
|
|
606
|
+
this.httpServer.put(routePath, ...allHandlers);
|
|
607
|
+
break;
|
|
608
|
+
case "DELETE":
|
|
609
|
+
this.httpServer.delete(routePath, ...allHandlers);
|
|
610
|
+
break;
|
|
611
|
+
case "PATCH":
|
|
612
|
+
this.httpServer.patch(routePath, ...allHandlers);
|
|
613
|
+
break;
|
|
614
|
+
case "OPTIONS":
|
|
615
|
+
this.httpServer.options(routePath, ...allHandlers);
|
|
616
|
+
break;
|
|
617
|
+
case "HEAD":
|
|
618
|
+
this.httpServer.head(routePath, ...allHandlers);
|
|
619
|
+
break;
|
|
620
|
+
default:
|
|
621
|
+
this.logger.warn("server", `Unsupported HTTP method: ${route.method}`);
|
|
622
|
+
break;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
this.logger.debug("server", `Mounted route: ${route.method} ${fullPath}`);
|
|
626
|
+
});
|
|
627
|
+
this.logger.debug("server", `Mounted router at ${basePath} with ${routes.length} routes`);
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Join two paths correctly
|
|
631
|
+
*/
|
|
632
|
+
joinPaths(basePath, subPath) {
|
|
633
|
+
const normalizedBase = basePath.endsWith("/")
|
|
634
|
+
? basePath.slice(0, -1)
|
|
635
|
+
: basePath;
|
|
636
|
+
const normalizedSub = subPath.startsWith("/") ? subPath : "/" + subPath;
|
|
637
|
+
if (normalizedBase === "" || normalizedBase === "/") {
|
|
638
|
+
return normalizedSub;
|
|
639
|
+
}
|
|
640
|
+
return normalizedBase + normalizedSub;
|
|
641
|
+
}
|
|
642
|
+
// ===== HELPER METHODS =====
|
|
643
|
+
/**
|
|
644
|
+
* Convert Express RequestHandler to XyPrisHttpServer handler
|
|
645
|
+
*/
|
|
646
|
+
convertHandler(handler) {
|
|
647
|
+
return (req, res, next) => {
|
|
648
|
+
// Type assertion to make it compatible
|
|
649
|
+
return handler(req, res, next);
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Convert array of Express RequestHandlers to XyPrisHttpServer handlers
|
|
654
|
+
*/
|
|
655
|
+
convertHandlers(handlers) {
|
|
656
|
+
return handlers.map((handler) => this.convertHandler(handler));
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Get the underlying HTTP server
|
|
660
|
+
*/
|
|
661
|
+
getHttpServer() {
|
|
662
|
+
return this.httpServer;
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Close the server
|
|
666
|
+
*/
|
|
667
|
+
close(callback) {
|
|
668
|
+
this.httpServer.close(callback);
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* Get server address
|
|
672
|
+
*/
|
|
673
|
+
address() {
|
|
674
|
+
return this.httpServer.address();
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
exports.XyprissApp = XyprissApp;
|
|
679
|
+
//# sourceMappingURL=XyprissApp.js.map
|