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