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
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var rateLimit = require('express-rate-limit');
|
|
3
|
+
var XyprissApp = require('./core/XyprissApp.js');
|
|
5
4
|
var PluginManager = require('./components/fastapi/PluginManager.js');
|
|
6
5
|
var pluginManager = require('../plugins/plugin-manager.js');
|
|
7
6
|
require('../plugins/modules/core/SecurityPlugin.js');
|
|
@@ -40,6 +39,7 @@ require('../../mods/security/src/core/keys/keys-types.js');
|
|
|
40
39
|
require('../../mods/security/src/core/keys/keys-logger.js');
|
|
41
40
|
require('../../mods/security/src/core/keys/keys-utils.js');
|
|
42
41
|
require('../../mods/security/src/core/keys/algorithms/mods/PBKDF2Algo.js');
|
|
42
|
+
var securityMiddleware = require('../middleware/security-middleware.js');
|
|
43
43
|
require('../../mods/security/src/core/password/index.js');
|
|
44
44
|
require('systeminformation');
|
|
45
45
|
require('pidusage');
|
|
@@ -56,22 +56,15 @@ var forceClosePort = require('./utils/forceClosePort.js');
|
|
|
56
56
|
var ConfigLoader = require('./utils/ConfigLoader.js');
|
|
57
57
|
var _default = require('./const/default.js');
|
|
58
58
|
var CacheManager = require('./components/fastapi/CacheManager.js');
|
|
59
|
-
var MiddlewareMethodsManager = require('./components/fastapi/middlewares/MiddlewareMethodsManager.js');
|
|
60
|
-
var RequestProcessor = require('./components/fastapi/RequestProcessor.js');
|
|
61
|
-
var RouteManager = require('./components/fastapi/RouteManager.js');
|
|
62
59
|
var PerformanceManager = require('./components/fastapi/PerformanceManager.js');
|
|
63
|
-
var MonitoringManager = require('./components/fastapi/MonitoringManager.js');
|
|
64
60
|
var ClusterManagerComponent = require('./components/fastapi/ClusterManagerComponent.js');
|
|
65
61
|
var FileWatcherManager = require('./components/fastapi/FileWatcherManager.js');
|
|
66
|
-
var
|
|
67
|
-
var RedirectManager = require('./components/fastapi/RedirectManager.js');
|
|
68
|
-
var ConsoleInterceptor = require('./components/fastapi/console/ConsoleInterceptor.js');
|
|
69
|
-
var UltraFastRequestProcessor = require('./components/fastapi/UltraFastRequestProcessor.js');
|
|
62
|
+
var WorkerPoolComponent = require('./components/fastapi/WorkerPoolComponent.js');
|
|
70
63
|
var safeJsonMiddleware = require('../middleware/safe-json-middleware.js');
|
|
71
64
|
var networkConnectionConf = require('./conf/networkConnectionConf.js');
|
|
72
65
|
var rateLimitConfig = require('./conf/rateLimitConfig.js');
|
|
73
66
|
var proxyConfig = require('./conf/proxyConfig.js');
|
|
74
|
-
var
|
|
67
|
+
var ServerLifecycleManager = require('./components/lifecycle/ServerLifecycleManager.js');
|
|
75
68
|
|
|
76
69
|
/**
|
|
77
70
|
* XyPrissJS - Fast and Secure Express Server
|
|
@@ -88,7 +81,6 @@ class XyPrissServer {
|
|
|
88
81
|
}) {
|
|
89
82
|
this.ready = false;
|
|
90
83
|
this.initPromise = Promise.resolve();
|
|
91
|
-
this.currentPort = 0; // Track the actual running port
|
|
92
84
|
// Load configuration from file system if available
|
|
93
85
|
const fileConfig = ConfigLoader.ConfigLoader.loadConfig();
|
|
94
86
|
// Merge configurations: defaults < file config < user options
|
|
@@ -96,37 +88,34 @@ class XyPrissServer {
|
|
|
96
88
|
// Initialize logger with user configuration
|
|
97
89
|
this.logger = Logger.initializeLogger(this.options.logging);
|
|
98
90
|
this.logger.startup("server", "Creating server...");
|
|
99
|
-
// Create
|
|
100
|
-
this.app =
|
|
91
|
+
// Create custom HTTP server app (Express-free)
|
|
92
|
+
this.app = new XyprissApp.XyprissApp(this.logger);
|
|
101
93
|
// Expose logger on app object for debugging
|
|
102
94
|
this.app.logger = this.logger;
|
|
103
|
-
//
|
|
104
|
-
this.
|
|
105
|
-
// Add basic middleware methods immediately for developer-friendly API
|
|
106
|
-
this.addImmediateMiddlewareMethods();
|
|
107
|
-
// Initialize ultra-fast processor first (using legacy config for backward compatibility)
|
|
108
|
-
this.ultraFastProcessor = new UltraFastRequestProcessor.UltraFastRequestProcessor({
|
|
109
|
-
cpuWorkers: this.options.performance?.workers?.cpu || 4,
|
|
110
|
-
ioWorkers: this.options.performance?.workers?.io || 2,
|
|
111
|
-
maxCacheSize: this.options.cache?.maxSize || 1000,
|
|
112
|
-
enablePrediction: true,
|
|
113
|
-
enableCompression: true,
|
|
114
|
-
maxConcurrentTasks: 100,
|
|
115
|
-
});
|
|
95
|
+
// Initialize lifecycle manager
|
|
96
|
+
this.initializeLifecycleManager();
|
|
116
97
|
// Add automatic JSON and URL-encoded body parsing (unless disabled)
|
|
117
98
|
if (this.options.server?.autoParseJson !== false) {
|
|
118
99
|
this.addBodyParsingMiddleware();
|
|
119
100
|
}
|
|
120
101
|
// Add safe JSON middleware to handle circular references
|
|
121
102
|
this.addSafeJsonMiddleware();
|
|
122
|
-
// Add ultra-fast middleware with type coercion
|
|
123
|
-
this.app.use((req, res, next) => {
|
|
124
|
-
const handler = this.ultraFastProcessor.middleware();
|
|
125
|
-
handler(req, res, next, "", {}).catch(next);
|
|
126
|
-
});
|
|
127
103
|
// Initialize other components asynchronously
|
|
128
104
|
this.initPromise = this.initializeComponentsAsync();
|
|
129
|
-
this.logger.debug("server", "
|
|
105
|
+
this.logger.debug("server", "XyPriss server created with optimized request processing");
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Initialize the ServerLifecycleManager
|
|
109
|
+
*/
|
|
110
|
+
initializeLifecycleManager() {
|
|
111
|
+
const dependencies = {
|
|
112
|
+
app: this.app,
|
|
113
|
+
options: this.options,
|
|
114
|
+
logger: this.logger,
|
|
115
|
+
};
|
|
116
|
+
this.lifecycleManager = new ServerLifecycleManager.ServerLifecycleManager(dependencies);
|
|
117
|
+
// Add start method immediately so it's available right away
|
|
118
|
+
this.lifecycleManager.addStartMethod(() => this.waitForReady());
|
|
130
119
|
}
|
|
131
120
|
async initializeComponentsAsync() {
|
|
132
121
|
// Initialize components in parallel for faster startup
|
|
@@ -136,6 +125,8 @@ class XyPrissServer {
|
|
|
136
125
|
this.initializePlugins(),
|
|
137
126
|
this.initializeCluster(),
|
|
138
127
|
this.initializeFileWatcher(),
|
|
128
|
+
this.initializeWorkerPool(),
|
|
129
|
+
this.initializeSecurity(),
|
|
139
130
|
]);
|
|
140
131
|
// Initialize components that depend on others
|
|
141
132
|
await this.initializeDependentComponents();
|
|
@@ -143,8 +134,10 @@ class XyPrissServer {
|
|
|
143
134
|
this.routeManager.addMethods();
|
|
144
135
|
this.monitoringManager.addMonitoringEndpoints();
|
|
145
136
|
this.addConsoleInterceptionMethods();
|
|
146
|
-
//
|
|
147
|
-
|
|
137
|
+
// Note: 404 handler is now handled properly in HttpServer.handleRequest()
|
|
138
|
+
// after route matching fails, not as middleware
|
|
139
|
+
// Mark lifecycle manager as ready
|
|
140
|
+
this.lifecycleManager.markReady();
|
|
148
141
|
this.ready = true;
|
|
149
142
|
}
|
|
150
143
|
async initializeCache() {
|
|
@@ -198,83 +191,71 @@ class XyPrissServer {
|
|
|
198
191
|
clusterManager: this.clusterManager,
|
|
199
192
|
});
|
|
200
193
|
}
|
|
194
|
+
async initializeWorkerPool() {
|
|
195
|
+
// Only initialize worker pool if it's explicitly configured and enabled
|
|
196
|
+
if (this.options.workerPool?.enabled) {
|
|
197
|
+
this.workerPoolComponent = new WorkerPoolComponent.WorkerPoolComponent({
|
|
198
|
+
workerPool: this.options.workerPool,
|
|
199
|
+
}, {
|
|
200
|
+
app: this.app,
|
|
201
|
+
serverOptions: this.options,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async initializeSecurity() {
|
|
206
|
+
// Initialize security middleware if security is configured and enabled
|
|
207
|
+
if (this.options.security?.enabled) {
|
|
208
|
+
this.logger.debug("server", "Initializing security middleware...");
|
|
209
|
+
// Create security middleware with the provided configuration
|
|
210
|
+
// The SecurityMiddleware class implements all SecurityConfig options
|
|
211
|
+
this.securityMiddleware = new securityMiddleware.SecurityMiddleware(this.options.security, this.logger);
|
|
212
|
+
// Apply the comprehensive security middleware stack
|
|
213
|
+
// This handles all security features based on configuration
|
|
214
|
+
this.app.use(this.securityMiddleware.getMiddleware());
|
|
215
|
+
this.logger.debug("server", "Security middleware initialized successfully");
|
|
216
|
+
this.logger.debug("server", `Security level: ${this.options.security.level || "enhanced"}`);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.logger.debug("server", "Security middleware disabled or not configured");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
201
222
|
async initializeDependentComponents() {
|
|
202
|
-
//
|
|
203
|
-
this.
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
this.
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
.bind(this.ultraFastProcessor),
|
|
225
|
-
handleFastPath: this.requestProcessor.handleFastPath.bind(this.requestProcessor),
|
|
226
|
-
handleStandardPath: this.requestProcessor.handleStandardPath.bind(this.requestProcessor),
|
|
227
|
-
});
|
|
228
|
-
// Initialize remaining components
|
|
229
|
-
this.middlewareMethodsManager = new MiddlewareMethodsManager.MiddlewareMethodsManager({
|
|
230
|
-
app: this.app,
|
|
231
|
-
middlewareManager: this.middlewareManager,
|
|
232
|
-
});
|
|
233
|
-
// Add middleware methods to the app (this will upgrade the immediate methods)
|
|
234
|
-
this.middlewareMethodsManager.addMiddlewareMethods();
|
|
235
|
-
// Process any middleware that was queued during immediate usage
|
|
236
|
-
this.processQueuedMiddleware();
|
|
223
|
+
// Update lifecycle manager with initialized components
|
|
224
|
+
this.lifecycleManager.dependencies.cacheManager = this.cacheManager;
|
|
225
|
+
this.lifecycleManager.dependencies.performanceManager =
|
|
226
|
+
this.performanceManager;
|
|
227
|
+
this.lifecycleManager.dependencies.pluginManager = this.pluginManager;
|
|
228
|
+
this.lifecycleManager.dependencies.clusterManager = this.clusterManager;
|
|
229
|
+
this.lifecycleManager.dependencies.fileWatcherManager =
|
|
230
|
+
this.fileWatcherManager;
|
|
231
|
+
this.lifecycleManager.dependencies.workerPoolComponent =
|
|
232
|
+
this.workerPoolComponent;
|
|
233
|
+
// Use lifecycle manager to initialize dependent components
|
|
234
|
+
await this.lifecycleManager.initializeDependentComponents();
|
|
235
|
+
// Get the initialized components from lifecycle manager
|
|
236
|
+
this.routeManager = this.lifecycleManager.dependencies.routeManager;
|
|
237
|
+
this.monitoringManager =
|
|
238
|
+
this.lifecycleManager.dependencies.monitoringManager;
|
|
239
|
+
this.consoleInterceptor =
|
|
240
|
+
this.lifecycleManager.dependencies.consoleInterceptor;
|
|
241
|
+
this.notFoundHandler =
|
|
242
|
+
this.lifecycleManager.dependencies.notFoundHandler;
|
|
243
|
+
// FastRouteHandler is now available through lifecycle manager
|
|
244
|
+
// Access it via: this.lifecycleManager.dependencies.fastRouteHandler
|
|
237
245
|
// Process any configs queued before middlewareManager was ready
|
|
238
246
|
const appAny = this.app;
|
|
239
247
|
if (appAny._immediateMiddlewareConfigs &&
|
|
240
248
|
Array.isArray(appAny._immediateMiddlewareConfigs)) {
|
|
241
249
|
appAny._immediateMiddlewareConfigs.forEach((config) => {
|
|
242
|
-
try {
|
|
243
|
-
this.middlewareManager.applyImmediateMiddleware(config);
|
|
244
|
-
}
|
|
245
|
-
catch (error) {
|
|
246
|
-
this.logger.warn("middleware", `Failed to apply queued middleware config: ${error}`);
|
|
247
|
-
}
|
|
248
250
|
});
|
|
249
251
|
appAny._immediateMiddlewareConfigs = [];
|
|
250
252
|
}
|
|
251
|
-
this.routeManager = new RouteManager.RouteManager({
|
|
252
|
-
app: this.app,
|
|
253
|
-
cacheManager: this.cacheManager,
|
|
254
|
-
middlewareManager: this.middlewareManager,
|
|
255
|
-
ultraFastOptimizer: this.performanceManager.getUltraFastOptimizer(),
|
|
256
|
-
});
|
|
257
|
-
this.monitoringManager = new MonitoringManager.MonitoringManager({
|
|
258
|
-
monitoring: this.options.monitoring,
|
|
259
|
-
}, {
|
|
260
|
-
app: this.app,
|
|
261
|
-
cacheManager: this.cacheManager,
|
|
262
|
-
performanceManager: this.performanceManager,
|
|
263
|
-
});
|
|
264
253
|
// Initialize request management middleware
|
|
265
254
|
this.initializeRequestManagement();
|
|
266
255
|
// Initialize server plugins
|
|
267
256
|
this.initializeServerPlugins();
|
|
268
257
|
// Initialize network plugins automatically
|
|
269
258
|
await this.initializeNetworkPlugins();
|
|
270
|
-
this.redirectManager = new RedirectManager.RedirectManager(this.logger);
|
|
271
|
-
this.consoleInterceptor = new ConsoleInterceptor.ConsoleInterceptor(this.logger, this.options.logging);
|
|
272
|
-
// Initialize custom 404 handler
|
|
273
|
-
this.notFoundHandler = NotFoundHandler.createNotFoundHandler(this.options);
|
|
274
|
-
if (this.options.logging?.consoleInterception?.enabled) {
|
|
275
|
-
this.consoleInterceptor.start();
|
|
276
|
-
this.logger.info("console", "Console interception system activated");
|
|
277
|
-
}
|
|
278
259
|
if (this.options.fileWatcher?.enabled) {
|
|
279
260
|
this.fileWatcherManager.addFileWatcherMonitoringEndpoints("/XyPriss");
|
|
280
261
|
}
|
|
@@ -285,6 +266,12 @@ class XyPrissServer {
|
|
|
285
266
|
getApp() {
|
|
286
267
|
return this.app;
|
|
287
268
|
}
|
|
269
|
+
/**
|
|
270
|
+
* Get the security middleware instance
|
|
271
|
+
*/
|
|
272
|
+
getSecurityMiddleware() {
|
|
273
|
+
return this.securityMiddleware;
|
|
274
|
+
}
|
|
288
275
|
/**
|
|
289
276
|
* Get the server plugin manager
|
|
290
277
|
*/
|
|
@@ -348,6 +335,7 @@ class XyPrissServer {
|
|
|
348
335
|
}
|
|
349
336
|
/**
|
|
350
337
|
* Start server with error handling and port switching
|
|
338
|
+
* @deprecated - Now handled by ServerLifecycleManager
|
|
351
339
|
*/
|
|
352
340
|
async startServerWithPortHandling(port, host, callback) {
|
|
353
341
|
try {
|
|
@@ -376,7 +364,7 @@ class XyPrissServer {
|
|
|
376
364
|
// Try to start server on the requested port
|
|
377
365
|
return new Promise((resolve, reject) => {
|
|
378
366
|
const server = this.app.listen(port, host, () => {
|
|
379
|
-
this.currentPort
|
|
367
|
+
this.lifecycleManager.updateState({ currentPort: port }); // Track the actual running port
|
|
380
368
|
this.logger.info("server", `Server running on ${host}:${port}`);
|
|
381
369
|
this.logger.debug("server", `State: ${this.ready ? "Ready" : "Initializing..."}`);
|
|
382
370
|
if (callback)
|
|
@@ -420,16 +408,13 @@ class XyPrissServer {
|
|
|
420
408
|
* Add automatic body parsing middleware for JSON and URL-encoded data
|
|
421
409
|
*/
|
|
422
410
|
addBodyParsingMiddleware() {
|
|
423
|
-
// JSON body parsing
|
|
424
|
-
this.app.use(
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
limit: this.options.server?.urlEncodedLimit || "10mb",
|
|
431
|
-
}));
|
|
432
|
-
this.logger.debug("middleware", "Automatic body parsing middleware added (JSON and URL-encoded)");
|
|
411
|
+
// Custom JSON body parsing middleware (replaces express.json)
|
|
412
|
+
this.app.use((_req, _res, next) => {
|
|
413
|
+
// Body parsing is already handled in CustomHttpServer
|
|
414
|
+
// This middleware is kept for compatibility
|
|
415
|
+
next();
|
|
416
|
+
});
|
|
417
|
+
this.logger.debug("middleware", "Custom body parsing middleware added (JSON and URL-encoded handled by CustomHttpServer)");
|
|
433
418
|
}
|
|
434
419
|
/**
|
|
435
420
|
* Add safe JSON middleware to handle circular references
|
|
@@ -444,153 +429,6 @@ class XyPrissServer {
|
|
|
444
429
|
this.app.use(safeJsonMiddleware.createSafeJsonMiddleware(safeJsonOptions));
|
|
445
430
|
this.logger.debug("middleware", "Safe JSON middleware added for circular reference handling");
|
|
446
431
|
}
|
|
447
|
-
/**
|
|
448
|
-
* Apply middleware directly when MiddlewareManager is not available
|
|
449
|
-
* Fallback method for immediate middleware application
|
|
450
|
-
*/
|
|
451
|
-
applyMiddlewareDirectly(config) {
|
|
452
|
-
// Apply rate limiting if configured
|
|
453
|
-
if (config?.rateLimit && config.rateLimit !== true) {
|
|
454
|
-
try {
|
|
455
|
-
// const rateLimit = require("express-rate-limit");
|
|
456
|
-
const rateLimitConfig = config.rateLimit;
|
|
457
|
-
const limiter = rateLimit({
|
|
458
|
-
windowMs: rateLimitConfig.windowMs || 15 * 60 * 1000,
|
|
459
|
-
max: rateLimitConfig.max || 100,
|
|
460
|
-
message: rateLimitConfig.message ||
|
|
461
|
-
"Too many requests from this IP, please try again later.",
|
|
462
|
-
standardHeaders: rateLimitConfig.standardHeaders || true,
|
|
463
|
-
legacyHeaders: rateLimitConfig.legacyHeaders || false,
|
|
464
|
-
handler: rateLimitConfig.onLimitReached,
|
|
465
|
-
});
|
|
466
|
-
this.app.use(limiter);
|
|
467
|
-
}
|
|
468
|
-
catch (error) { }
|
|
469
|
-
}
|
|
470
|
-
// Apply CORS if configured
|
|
471
|
-
if (config?.cors && config.cors !== true) {
|
|
472
|
-
try {
|
|
473
|
-
const cors = require("cors");
|
|
474
|
-
const corsConfig = config.cors;
|
|
475
|
-
const corsOptions = {
|
|
476
|
-
origin: corsConfig.origin || "*",
|
|
477
|
-
methods: corsConfig.methods || [
|
|
478
|
-
"GET",
|
|
479
|
-
"POST",
|
|
480
|
-
"PUT",
|
|
481
|
-
"DELETE",
|
|
482
|
-
"OPTIONS",
|
|
483
|
-
],
|
|
484
|
-
allowedHeaders: corsConfig.allowedHeaders || [
|
|
485
|
-
"Origin",
|
|
486
|
-
"X-Requested-With",
|
|
487
|
-
"Content-Type",
|
|
488
|
-
"Accept",
|
|
489
|
-
"Authorization",
|
|
490
|
-
],
|
|
491
|
-
credentials: corsConfig.credentials !== false,
|
|
492
|
-
};
|
|
493
|
-
this.app.use(cors(corsOptions));
|
|
494
|
-
}
|
|
495
|
-
catch (error) { }
|
|
496
|
-
}
|
|
497
|
-
// Apply security headers if configured
|
|
498
|
-
if (config?.security && config.security !== true) {
|
|
499
|
-
try {
|
|
500
|
-
const helmet = require("helmet");
|
|
501
|
-
this.app.use(helmet());
|
|
502
|
-
}
|
|
503
|
-
catch (error) { }
|
|
504
|
-
}
|
|
505
|
-
// Apply compression if configured
|
|
506
|
-
if (config?.compression && config.compression !== true) {
|
|
507
|
-
try {
|
|
508
|
-
const compression = require("compression");
|
|
509
|
-
this.app.use(compression());
|
|
510
|
-
}
|
|
511
|
-
catch (error) {
|
|
512
|
-
this.logger.error("server", "Failed to apply compression:", error);
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
/**
|
|
517
|
-
* Add immediate middleware methods for developer-friendly API
|
|
518
|
-
* These work immediately without waiting for async initialization
|
|
519
|
-
*/
|
|
520
|
-
addImmediateMiddlewareMethods() {
|
|
521
|
-
// Create a simple middleware queue for immediate use
|
|
522
|
-
const middlewareQueue = [];
|
|
523
|
-
// Add immediate middleware() method that implements MiddlewareAPIInterface
|
|
524
|
-
this.app.middleware = (config) => {
|
|
525
|
-
// Always queue or apply middleware depending on initialization state
|
|
526
|
-
if (config) {
|
|
527
|
-
if (this.middlewareManager) {
|
|
528
|
-
// MiddlewareManager is ready, apply immediately
|
|
529
|
-
// console.log("using builtin class");
|
|
530
|
-
this.middlewareManager.applyImmediateMiddleware(config);
|
|
531
|
-
}
|
|
532
|
-
else {
|
|
533
|
-
// console.log("using dirrect msg");
|
|
534
|
-
// MiddlewareManager not ready, queue for later processing
|
|
535
|
-
this.logger.debug("server", "MiddlewareManager not available, queuing for later processing");
|
|
536
|
-
// Store config for later application
|
|
537
|
-
if (!this.app._immediateMiddlewareConfigs) {
|
|
538
|
-
this.app._immediateMiddlewareConfigs = [];
|
|
539
|
-
}
|
|
540
|
-
this.app._immediateMiddlewareConfigs.push(config);
|
|
541
|
-
this.applyMiddlewareDirectly(config);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
return {
|
|
545
|
-
register: (handler, options) => {
|
|
546
|
-
// Store middleware for later registration
|
|
547
|
-
middlewareQueue.push({ handler, options });
|
|
548
|
-
// Also add it immediately to Express for basic functionality
|
|
549
|
-
this.app.use(handler);
|
|
550
|
-
return this; // Return for chaining
|
|
551
|
-
},
|
|
552
|
-
enable: (_id) => this,
|
|
553
|
-
disable: (_id) => this,
|
|
554
|
-
getInfo: () => [],
|
|
555
|
-
getStats: () => ({}),
|
|
556
|
-
unregister: (_id) => this,
|
|
557
|
-
getConfig: () => config || {},
|
|
558
|
-
clear: () => this,
|
|
559
|
-
optimize: async () => this,
|
|
560
|
-
};
|
|
561
|
-
};
|
|
562
|
-
// Store the queue for later processing
|
|
563
|
-
this.app._middlewareQueue = middlewareQueue;
|
|
564
|
-
// Add basic convenience methods
|
|
565
|
-
this.app.enableSecurity = (_options) => {
|
|
566
|
-
// Basic security headers immediately
|
|
567
|
-
this.app.use((_req, res, next) => {
|
|
568
|
-
res.setHeader("X-Content-Type-Options", "nosniff");
|
|
569
|
-
res.setHeader("X-Frame-Options", "DENY");
|
|
570
|
-
res.setHeader("X-XSS-Protection", "1; mode=block");
|
|
571
|
-
next();
|
|
572
|
-
});
|
|
573
|
-
return this.app;
|
|
574
|
-
};
|
|
575
|
-
this.app.enableCors = (_options) => {
|
|
576
|
-
// Basic CORS immediately
|
|
577
|
-
this.app.use((_req, res, next) => {
|
|
578
|
-
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
579
|
-
res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
|
|
580
|
-
res.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");
|
|
581
|
-
next();
|
|
582
|
-
});
|
|
583
|
-
return this.app;
|
|
584
|
-
};
|
|
585
|
-
this.app.enableCompression = (_options) => {
|
|
586
|
-
// Basic compression will be added when full middleware manager is ready
|
|
587
|
-
return this.app;
|
|
588
|
-
};
|
|
589
|
-
this.app.enableRateLimit = (_options) => {
|
|
590
|
-
// Basic rate limiting will be added when full middleware manager is ready
|
|
591
|
-
return this.app;
|
|
592
|
-
};
|
|
593
|
-
}
|
|
594
432
|
/**
|
|
595
433
|
* Initialize request management middleware for timeouts, network quality, and concurrency control
|
|
596
434
|
*/
|
|
@@ -754,160 +592,6 @@ class XyPrissServer {
|
|
|
754
592
|
this.logger.error("server", "Failed to initialize network plugins:", error.message);
|
|
755
593
|
}
|
|
756
594
|
}
|
|
757
|
-
/**
|
|
758
|
-
* Process middleware that was queued during immediate usage
|
|
759
|
-
*/
|
|
760
|
-
processQueuedMiddleware() {
|
|
761
|
-
const queue = this.app._middlewareQueue;
|
|
762
|
-
if (queue && Array.isArray(queue)) {
|
|
763
|
-
// Process each queued middleware with the full middleware manager
|
|
764
|
-
queue.forEach(({ handler, options }) => {
|
|
765
|
-
try {
|
|
766
|
-
this.middlewareManager.register(handler, options);
|
|
767
|
-
}
|
|
768
|
-
catch (error) {
|
|
769
|
-
this.logger.warn("middleware", `Failed to register queued middleware: ${error}`);
|
|
770
|
-
}
|
|
771
|
-
});
|
|
772
|
-
// Clear the queue
|
|
773
|
-
this.app._middlewareQueue = [];
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
/**
|
|
777
|
-
* Add start method to app with cluster support (full version)
|
|
778
|
-
*/
|
|
779
|
-
addStartMethod() {
|
|
780
|
-
const start = async (port, callback) => {
|
|
781
|
-
// **INTERNAL HANDLING**: Wait for server to be ready before starting
|
|
782
|
-
// This ensures developers don't need to handle async initialization timing
|
|
783
|
-
if (!this.ready) {
|
|
784
|
-
this.logger.debug("server", "Waiting for initialization to complete...");
|
|
785
|
-
await this.waitForReady();
|
|
786
|
-
this.logger.info("server", "Initialization complete, starting server...");
|
|
787
|
-
}
|
|
788
|
-
const serverPort = port || this.options.server?.port || 3000;
|
|
789
|
-
const host = this.options.server?.host || "localhost";
|
|
790
|
-
// If we're in main process and hot reloader is enabled, start it first
|
|
791
|
-
if (this.fileWatcherManager.isInMainProcess() &&
|
|
792
|
-
this.fileWatcherManager.getHotReloader()) {
|
|
793
|
-
this.logger.debug("server", "Taking hot reload mode path");
|
|
794
|
-
this.logger.startup("fileWatcher", "Starting with hot reload support...");
|
|
795
|
-
try {
|
|
796
|
-
// Start the hot reloader (which will spawn child process)
|
|
797
|
-
await this.fileWatcherManager.getHotReloader().start();
|
|
798
|
-
// Start file watcher in main process to monitor changes
|
|
799
|
-
if (this.fileWatcherManager.getFileWatcher()) {
|
|
800
|
-
await this.fileWatcherManager.startFileWatcherWithHotReload();
|
|
801
|
-
}
|
|
802
|
-
// Start the actual HTTP server in the main process too
|
|
803
|
-
this.httpServer = await this.startServerWithPortHandling(serverPort, host, async () => {
|
|
804
|
-
this.fileWatcherManager.setHttpServer(this.httpServer);
|
|
805
|
-
if (callback)
|
|
806
|
-
callback();
|
|
807
|
-
});
|
|
808
|
-
return this.httpServer;
|
|
809
|
-
}
|
|
810
|
-
catch (error) {
|
|
811
|
-
this.logger.error("fileWatcher", "Hot reload startup failed:", error.message);
|
|
812
|
-
// Fall through to regular startup
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
// Regular startup (child process or hot reload disabled)
|
|
816
|
-
// If cluster is enabled, use cluster manager
|
|
817
|
-
if (this.clusterManager?.isClusterEnabled()) {
|
|
818
|
-
// Double-check we're not in worker mode
|
|
819
|
-
if (process.env.CLUSTER_MODE === "true" ||
|
|
820
|
-
process.env.NODE_ENV === "worker") {
|
|
821
|
-
this.logger.debug("server", "Worker mode detected - falling back to single process");
|
|
822
|
-
// Fall through to single process mode
|
|
823
|
-
}
|
|
824
|
-
else {
|
|
825
|
-
this.logger.debug("server", "Taking cluster mode path");
|
|
826
|
-
// console.log("Starting cluster...");
|
|
827
|
-
try {
|
|
828
|
-
// Start cluster manager
|
|
829
|
-
await this.clusterManager.startCluster();
|
|
830
|
-
// Check if we're in master or worker process
|
|
831
|
-
if (process.env.NODE_ENV !== "worker") {
|
|
832
|
-
this.logger.startup("cluster", "Starting as cluster master process");
|
|
833
|
-
// Setup cluster event handlers
|
|
834
|
-
this.clusterManager.setupClusterEventHandlers();
|
|
835
|
-
// Start HTTP server in master process
|
|
836
|
-
this.httpServer =
|
|
837
|
-
await this.startServerWithPortHandling(serverPort, host, async () => {
|
|
838
|
-
// Set HTTP server reference for file watcher restarts
|
|
839
|
-
this.fileWatcherManager.setHttpServer(this.httpServer);
|
|
840
|
-
const clusterStats = await this.clusterManager.getClusterStats();
|
|
841
|
-
this.logger.debug("cluster", `Cluster master started with ${clusterStats.workers?.total || 0} workers`);
|
|
842
|
-
// Start file watcher if enabled
|
|
843
|
-
if (this.fileWatcherManager.getFileWatcher()) {
|
|
844
|
-
if (this.fileWatcherManager.isInMainProcess()) {
|
|
845
|
-
// Main process: start with hot reload
|
|
846
|
-
await this.fileWatcherManager.startFileWatcherWithHotReload();
|
|
847
|
-
}
|
|
848
|
-
else {
|
|
849
|
-
// Child process: start regular file watcher
|
|
850
|
-
await this.fileWatcherManager.startFileWatcher();
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
if (callback)
|
|
854
|
-
callback();
|
|
855
|
-
});
|
|
856
|
-
return this.httpServer;
|
|
857
|
-
}
|
|
858
|
-
else {
|
|
859
|
-
// Worker process
|
|
860
|
-
this.logger.startup("cluster", `Worker ${process.pid} started`);
|
|
861
|
-
const httpServer = await this.startServerWithPortHandling(serverPort, host, () => {
|
|
862
|
-
this.logger.info("cluster", `Worker ${process.pid} listening on ${host}:${serverPort}`);
|
|
863
|
-
if (callback)
|
|
864
|
-
callback();
|
|
865
|
-
});
|
|
866
|
-
return httpServer;
|
|
867
|
-
}
|
|
868
|
-
}
|
|
869
|
-
catch (error) {
|
|
870
|
-
this.logger.error("cluster", "Failed to start cluster:", error.message);
|
|
871
|
-
// Fallback to single process
|
|
872
|
-
this.logger.info("cluster", "Falling back to single process mode");
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
// Single process mode (default)
|
|
877
|
-
this.logger.debug("server", "Taking single process mode path");
|
|
878
|
-
this.httpServer = await this.startServerWithPortHandling(serverPort, host, async () => {
|
|
879
|
-
// Set HTTP server reference for file watcher restarts
|
|
880
|
-
this.fileWatcherManager.setHttpServer(this.httpServer);
|
|
881
|
-
// Start file watcher if enabled
|
|
882
|
-
if (this.fileWatcherManager.getFileWatcher()) {
|
|
883
|
-
if (this.fileWatcherManager.isInMainProcess()) {
|
|
884
|
-
// Main process: start with hot reload
|
|
885
|
-
await this.fileWatcherManager.startFileWatcherWithHotReload();
|
|
886
|
-
}
|
|
887
|
-
else {
|
|
888
|
-
// Child process: start regular file watcher
|
|
889
|
-
await this.fileWatcherManager.startFileWatcher();
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
if (callback)
|
|
893
|
-
callback();
|
|
894
|
-
});
|
|
895
|
-
return this.httpServer;
|
|
896
|
-
};
|
|
897
|
-
this.app.start = start;
|
|
898
|
-
this.app.waitForReady = () => this.waitForReady();
|
|
899
|
-
// Add port management methods
|
|
900
|
-
this.app.getPort = () => this.getPort();
|
|
901
|
-
this.app.forceClosePort = (port) => this.forceClosePort(port);
|
|
902
|
-
this.app.redirectFromPort = (fromPort, toPort, options) => this.redirectManager.redirectFromPort(fromPort, toPort, options);
|
|
903
|
-
// Add advanced redirect management methods
|
|
904
|
-
this.app.getRedirectInstance = (fromPort) => this.redirectManager.getRedirectInstance(fromPort);
|
|
905
|
-
this.app.getAllRedirectInstances = () => this.redirectManager.getAllRedirectInstances();
|
|
906
|
-
this.app.disconnectRedirect = (fromPort) => this.redirectManager.disconnectRedirect(fromPort);
|
|
907
|
-
this.app.disconnectAllRedirects = () => this.redirectManager.disconnectAllRedirects();
|
|
908
|
-
this.app.getRedirectStats = (fromPort) => this.redirectManager.getRedirectStats(fromPort);
|
|
909
|
-
// Cluster methods are already added in constructor if cluster is enabled
|
|
910
|
-
}
|
|
911
595
|
// File watcher functionality now handled by FileWatcherManager component
|
|
912
596
|
/**
|
|
913
597
|
* Stop file watcher
|
|
@@ -1110,7 +794,7 @@ class XyPrissServer {
|
|
|
1110
794
|
* @returns The current port the server is running on
|
|
1111
795
|
*/
|
|
1112
796
|
getPort() {
|
|
1113
|
-
return this.
|
|
797
|
+
return this.lifecycleManager.getCurrentPort();
|
|
1114
798
|
}
|
|
1115
799
|
/**
|
|
1116
800
|
* Attempt to forcefully close/free up the specified port
|
|
@@ -1121,8 +805,6 @@ class XyPrissServer {
|
|
|
1121
805
|
return await new forceClosePort.Port(port).forceClosePort();
|
|
1122
806
|
}
|
|
1123
807
|
async stop() {
|
|
1124
|
-
// Cleanup ultra-fast processor
|
|
1125
|
-
this.ultraFastProcessor.destroy();
|
|
1126
808
|
// Stop other components
|
|
1127
809
|
if (this.httpServer) {
|
|
1128
810
|
await new Promise((resolve) => {
|