xypriss 2.0.0 → 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 +170 -380
- 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 -2
- 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 -1
- package/dist/cjs/mods/security/src/index.js.map +1 -1
- package/dist/cjs/shared/logger/Logger.js +372 -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/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/index.js +9 -3
- package/dist/cjs/src/plugins/modules/index.js.map +1 -1
- package/dist/cjs/src/server/FastServer.js +41 -1
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/ServerFactory.js +62 -2
- package/dist/cjs/src/server/ServerFactory.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +32 -6
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.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 +143 -24
- package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -1
- package/dist/cjs/src/server/const/default.js +23 -9
- package/dist/cjs/src/server/const/default.js.map +1 -1
- package/dist/cjs/src/server/core/HttpServer.js +8 -8
- package/dist/cjs/src/server/core/HttpServer.js.map +1 -1
- package/dist/cjs/src/server/core/XyprissApp.js +284 -17
- package/dist/cjs/src/server/core/XyprissApp.js.map +1 -1
- 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 +57 -12
- package/dist/cjs/src/server/middleware/MiddlewareManager.js.map +1 -1
- package/dist/cjs/src/server/utils/forceClosePort.js +1 -1
- 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 +10 -2
- 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 +10 -1
- package/dist/esm/mods/security/src/index.js.map +1 -1
- package/dist/esm/shared/logger/Logger.js +372 -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/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/index.js +9 -3
- package/dist/esm/src/plugins/modules/index.js.map +1 -1
- package/dist/esm/src/server/FastServer.js +41 -1
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/ServerFactory.js +62 -2
- package/dist/esm/src/server/ServerFactory.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +32 -6
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.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 +143 -24
- package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -1
- package/dist/esm/src/server/const/default.js +23 -9
- package/dist/esm/src/server/const/default.js.map +1 -1
- package/dist/esm/src/server/core/HttpServer.js +8 -8
- package/dist/esm/src/server/core/HttpServer.js.map +1 -1
- package/dist/esm/src/server/core/XyprissApp.js +284 -17
- package/dist/esm/src/server/core/XyprissApp.js.map +1 -1
- 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 +57 -12
- package/dist/esm/src/server/middleware/MiddlewareManager.js.map +1 -1
- package/dist/esm/src/server/utils/forceClosePort.js +1 -1
- package/dist/esm/src/server/utils/forceClosePort.js.map +1 -1
- package/dist/index.d.ts +675 -516
- package/package.json +10 -11
- 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,953 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var express = require('express');
|
|
4
|
-
var helmet = require('helmet');
|
|
5
|
-
var cors = require('cors');
|
|
6
|
-
var compression = require('compression');
|
|
7
|
-
var rateLimit = require('express-rate-limit');
|
|
8
|
-
var Logger = require('../../../../../shared/logger/Logger.js');
|
|
9
|
-
var nehoid = require('nehoid');
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* MiddlewareManager - Advanced middleware system with optimization, caching, and performance tracking
|
|
13
|
-
* Provides comprehensive middleware management withXyPriss FastXyPrissServer (FFS)performance enhancements
|
|
14
|
-
*/
|
|
15
|
-
class MiddlewareManager {
|
|
16
|
-
constructor(options, dependencies) {
|
|
17
|
-
// Middleware registry and management
|
|
18
|
-
this.middlewareRegistry = new Map();
|
|
19
|
-
this.middlewareCache = new Map();
|
|
20
|
-
this.executionOrder = [];
|
|
21
|
-
// Performance tracking
|
|
22
|
-
this.performanceMetrics = {
|
|
23
|
-
totalRequests: 0,
|
|
24
|
-
totalExecutionTime: 0,
|
|
25
|
-
averageExecutionTime: 0,
|
|
26
|
-
fastestExecution: Infinity,
|
|
27
|
-
slowestExecution: 0,
|
|
28
|
-
cacheHitRate: 0,
|
|
29
|
-
errorRate: 0,
|
|
30
|
-
throughput: 0,
|
|
31
|
-
optimizationGain: 0,
|
|
32
|
-
};
|
|
33
|
-
// Configuration
|
|
34
|
-
this.optimizationConfig = {
|
|
35
|
-
enableCaching: true,
|
|
36
|
-
enableBatching: true,
|
|
37
|
-
enablePrioritization: true,
|
|
38
|
-
enablePerformanceTracking: true,
|
|
39
|
-
cacheWarming: true,
|
|
40
|
-
optimizationThreshold: 10,
|
|
41
|
-
maxCacheSize: 1000,
|
|
42
|
-
defaultTTL: 300000, // 5 minutes
|
|
43
|
-
};
|
|
44
|
-
this.initialized = false;
|
|
45
|
-
this.options = options;
|
|
46
|
-
this.dependencies = dependencies;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Initialize the middleware manager
|
|
50
|
-
*/
|
|
51
|
-
async initialize() {
|
|
52
|
-
if (this.initialized)
|
|
53
|
-
return;
|
|
54
|
-
Logger.logger.debug("middleware", "Initializing Middleware Manager...");
|
|
55
|
-
// Configure built-in middleware
|
|
56
|
-
this.configureBuiltInMiddleware();
|
|
57
|
-
// Configure optimization middleware
|
|
58
|
-
this.configureOptimizationMiddleware();
|
|
59
|
-
// Configure request processing middleware
|
|
60
|
-
this.configureRequestProcessingMiddleware();
|
|
61
|
-
// Warm up cache if enabled
|
|
62
|
-
if (this.optimizationConfig.cacheWarming) {
|
|
63
|
-
await this.warmCache();
|
|
64
|
-
}
|
|
65
|
-
this.initialized = true;
|
|
66
|
-
Logger.logger.debug("middleware", " Middleware Manager initialized");
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Register custom middleware
|
|
70
|
-
*/
|
|
71
|
-
register(middleware, options) {
|
|
72
|
-
const id = nehoid.NehoID.generate({ prefix: "ufs.middleware", size: 16 });
|
|
73
|
-
const name = options?.name || `middleware-${id.slice(0, 8)}`;
|
|
74
|
-
let handler;
|
|
75
|
-
let priority = options?.priority || "normal";
|
|
76
|
-
let routes = options?.routes;
|
|
77
|
-
let cacheable = options?.cacheable === true; // Only cache if explicitly set to true
|
|
78
|
-
let ttl = options?.ttl || this.optimizationConfig.defaultTTL;
|
|
79
|
-
if (typeof middleware === "function") {
|
|
80
|
-
handler = middleware;
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
handler = middleware.handler;
|
|
84
|
-
priority = middleware.priority || priority;
|
|
85
|
-
routes = middleware.routes || routes;
|
|
86
|
-
cacheable = middleware.cacheable || cacheable;
|
|
87
|
-
ttl = middleware.ttl || ttl;
|
|
88
|
-
}
|
|
89
|
-
const entry = {
|
|
90
|
-
id,
|
|
91
|
-
name,
|
|
92
|
-
handler: this.wrapMiddleware(handler, name),
|
|
93
|
-
priority,
|
|
94
|
-
order: this.calculateOrder(priority),
|
|
95
|
-
routes,
|
|
96
|
-
enabled: true,
|
|
97
|
-
cacheable,
|
|
98
|
-
ttl,
|
|
99
|
-
metadata: {},
|
|
100
|
-
stats: {
|
|
101
|
-
executionCount: 0,
|
|
102
|
-
totalExecutionTime: 0,
|
|
103
|
-
averageExecutionTime: 0,
|
|
104
|
-
cacheHits: 0,
|
|
105
|
-
cacheMisses: 0,
|
|
106
|
-
errors: 0,
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
this.middlewareRegistry.set(id, entry);
|
|
110
|
-
this.updateExecutionOrder();
|
|
111
|
-
// Apply middleware to Express app immediately
|
|
112
|
-
this.applyMiddlewareToApp(entry);
|
|
113
|
-
Logger.logger.debug("middleware", `Registered middleware: ${name} (${id})`);
|
|
114
|
-
return id;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Unregister middleware
|
|
118
|
-
*/
|
|
119
|
-
unregister(id) {
|
|
120
|
-
const entry = this.middlewareRegistry.get(id);
|
|
121
|
-
if (!entry)
|
|
122
|
-
return false;
|
|
123
|
-
this.middlewareRegistry.delete(id);
|
|
124
|
-
this.updateExecutionOrder();
|
|
125
|
-
Logger.logger.debug("middleware", `Unregistered middleware: ${entry.name} (${id})`);
|
|
126
|
-
return true;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Enable middleware
|
|
130
|
-
*/
|
|
131
|
-
enable(id) {
|
|
132
|
-
const entry = this.middlewareRegistry.get(id);
|
|
133
|
-
if (!entry)
|
|
134
|
-
return false;
|
|
135
|
-
entry.enabled = true;
|
|
136
|
-
this.updateExecutionOrder();
|
|
137
|
-
Logger.logger.debug("middleware", `Enabled middleware: ${entry.name} (${id})`);
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Disable middleware
|
|
142
|
-
*/
|
|
143
|
-
disable(id) {
|
|
144
|
-
const entry = this.middlewareRegistry.get(id);
|
|
145
|
-
if (!entry)
|
|
146
|
-
return false;
|
|
147
|
-
entry.enabled = false;
|
|
148
|
-
this.updateExecutionOrder();
|
|
149
|
-
Logger.logger.debug("middleware", `Disabled middleware: ${entry.name} (${id})`);
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Enable security middleware
|
|
154
|
-
*/
|
|
155
|
-
enableSecurity(options) {
|
|
156
|
-
if (this.options.security?.helmet !== false) {
|
|
157
|
-
try {
|
|
158
|
-
this.dependencies.app.use(helmet(options?.helmet));
|
|
159
|
-
Logger.logger.debug("middleware", "Security headers (Helmet) enabled");
|
|
160
|
-
}
|
|
161
|
-
catch (error) {
|
|
162
|
-
Logger.logger.warn("middleware", "Helmet not available, skipping security headers");
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
if (this.options.security?.cors !== false) {
|
|
166
|
-
try {
|
|
167
|
-
this.dependencies.app.use(cors(options?.cors));
|
|
168
|
-
Logger.logger.debug("middleware", "CORS enabled");
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
Logger.logger.warn("middleware", "CORS not available, skipping CORS headers");
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Enable compression middleware
|
|
177
|
-
*/
|
|
178
|
-
enableCompression(options) {
|
|
179
|
-
if (this.options.performance?.compression !== false) {
|
|
180
|
-
try {
|
|
181
|
-
this.dependencies.app.use(compression(options));
|
|
182
|
-
Logger.logger.debug("middleware", "Compression enabled");
|
|
183
|
-
}
|
|
184
|
-
catch (error) {
|
|
185
|
-
Logger.logger.warn("middleware", "Compression not available, skipping compression");
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Enable rate limiting middleware
|
|
191
|
-
*/
|
|
192
|
-
enableRateLimit(options) {
|
|
193
|
-
if (this.options.security?.rateLimit !== false) {
|
|
194
|
-
try {
|
|
195
|
-
const rateLimitOptions = {
|
|
196
|
-
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
197
|
-
max: 100, // limit each IP to 100 requests per windowMs
|
|
198
|
-
standardHeaders: true,
|
|
199
|
-
legacyHeaders: false,
|
|
200
|
-
...options,
|
|
201
|
-
};
|
|
202
|
-
this.dependencies.app.use(rateLimit(rateLimitOptions));
|
|
203
|
-
Logger.logger.debug("middleware", "Rate limiting enabled");
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
Logger.logger.warn("middleware", "Rate limiting not available, skipping rate limiting");
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Apply immediate middleware configuration during server initialization
|
|
212
|
-
* This method provides basic middleware functionality before the full system is initialized
|
|
213
|
-
*/
|
|
214
|
-
applyImmediateMiddleware(config) {
|
|
215
|
-
// console.log("Applying immediate middleware configuration...");
|
|
216
|
-
Logger.logger.debug("middleware", "Applying immediate middleware configuration...");
|
|
217
|
-
// console.log("conf: ", config);
|
|
218
|
-
// Apply rate limiting if configured
|
|
219
|
-
if (config?.rateLimit && config.rateLimit !== true) {
|
|
220
|
-
try {
|
|
221
|
-
const rateLimitConfig = config.rateLimit;
|
|
222
|
-
const limiter = rateLimit({
|
|
223
|
-
windowMs: rateLimitConfig.windowMs || 15 * 60 * 1000,
|
|
224
|
-
max: rateLimitConfig.max || 100,
|
|
225
|
-
message: "Too many requests from this IP, please try again later (msg2).",
|
|
226
|
-
standardHeaders: true,
|
|
227
|
-
legacyHeaders: false,
|
|
228
|
-
});
|
|
229
|
-
this.dependencies.app.use(limiter);
|
|
230
|
-
Logger.logger.debug("middleware", "Rate limiting applied immediately");
|
|
231
|
-
}
|
|
232
|
-
catch (error) {
|
|
233
|
-
Logger.logger.warn("middleware", "Failed to apply rate limiting:", error);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
// Apply CORS if configured
|
|
237
|
-
if (config?.cors && config.cors !== true) {
|
|
238
|
-
try {
|
|
239
|
-
const corsConfig = config.cors;
|
|
240
|
-
const corsOptions = {
|
|
241
|
-
origin: corsConfig.origin || "*",
|
|
242
|
-
methods: corsConfig.methods || [
|
|
243
|
-
"GET",
|
|
244
|
-
"POST",
|
|
245
|
-
"PUT",
|
|
246
|
-
"DELETE",
|
|
247
|
-
"OPTIONS",
|
|
248
|
-
],
|
|
249
|
-
allowedHeaders: corsConfig.allowedHeaders || [
|
|
250
|
-
"Origin",
|
|
251
|
-
"X-Requested-With",
|
|
252
|
-
"Content-Type",
|
|
253
|
-
"Accept",
|
|
254
|
-
"Authorization",
|
|
255
|
-
],
|
|
256
|
-
credentials: corsConfig.credentials !== false,
|
|
257
|
-
};
|
|
258
|
-
this.dependencies.app.use(cors(corsOptions));
|
|
259
|
-
Logger.logger.debug("middleware", "CORS applied immediately");
|
|
260
|
-
}
|
|
261
|
-
catch (error) {
|
|
262
|
-
Logger.logger.warn("middleware", "Failed to apply CORS:", error);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
// Apply security headers if configured
|
|
266
|
-
if (config?.security && config.security !== true) {
|
|
267
|
-
try {
|
|
268
|
-
this.dependencies.app.use(helmet());
|
|
269
|
-
Logger.logger.debug("middleware", "Helmet security headers applied immediately");
|
|
270
|
-
}
|
|
271
|
-
catch (error) {
|
|
272
|
-
Logger.logger.warn("middleware", "Failed to apply helmet:", error);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
// Apply compression if configured
|
|
276
|
-
if (config?.compression && config.compression !== true) {
|
|
277
|
-
try {
|
|
278
|
-
this.dependencies.app.use(compression());
|
|
279
|
-
Logger.logger.debug("middleware", "Compression applied immediately");
|
|
280
|
-
}
|
|
281
|
-
catch (error) {
|
|
282
|
-
Logger.logger.warn("middleware", "Failed to apply compression:", error);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
Logger.logger.debug("middleware", "Immediate middleware configuration completed");
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Enable CORS middleware
|
|
289
|
-
*/
|
|
290
|
-
enableCors(options) {
|
|
291
|
-
try {
|
|
292
|
-
// Transform XyPrissJS CORS config to standard cors package config
|
|
293
|
-
const corsConfig = this.transformCorsConfig(options);
|
|
294
|
-
this.dependencies.app.use(cors(corsConfig));
|
|
295
|
-
Logger.logger.debug("middleware", "CORS enabled with config:", corsConfig);
|
|
296
|
-
}
|
|
297
|
-
catch (error) {
|
|
298
|
-
Logger.logger.warn("middleware", "CORS not available, skipping CORS headers");
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Transform XyPrissJS CORS configuration to standard cors package configuration
|
|
303
|
-
*/
|
|
304
|
-
transformCorsConfig(XyPrissConfig) {
|
|
305
|
-
if (!XyPrissConfig)
|
|
306
|
-
return {};
|
|
307
|
-
const corsConfig = {};
|
|
308
|
-
// Map XyPrissJS config to standard cors config
|
|
309
|
-
if (XyPrissConfig.origin !== undefined) {
|
|
310
|
-
corsConfig.origin = XyPrissConfig.origin;
|
|
311
|
-
}
|
|
312
|
-
if (XyPrissConfig.methods !== undefined) {
|
|
313
|
-
corsConfig.methods = XyPrissConfig.methods;
|
|
314
|
-
}
|
|
315
|
-
if (XyPrissConfig.allowedHeaders !== undefined) {
|
|
316
|
-
corsConfig.allowedHeaders = XyPrissConfig.allowedHeaders;
|
|
317
|
-
}
|
|
318
|
-
if (XyPrissConfig.credentials !== undefined) {
|
|
319
|
-
corsConfig.credentials = XyPrissConfig.credentials;
|
|
320
|
-
}
|
|
321
|
-
if (XyPrissConfig.maxAge !== undefined) {
|
|
322
|
-
corsConfig.maxAge = XyPrissConfig.maxAge;
|
|
323
|
-
}
|
|
324
|
-
if (XyPrissConfig.preflightContinue !== undefined) {
|
|
325
|
-
corsConfig.preflightContinue = XyPrissConfig.preflightContinue;
|
|
326
|
-
}
|
|
327
|
-
if (XyPrissConfig.optionsSuccessStatus !== undefined) {
|
|
328
|
-
corsConfig.optionsSuccessStatus =
|
|
329
|
-
XyPrissConfig.optionsSuccessStatus;
|
|
330
|
-
}
|
|
331
|
-
// Don't pass the 'enabled' property to cors package
|
|
332
|
-
// Remove any other XyPrissJS-specific properties
|
|
333
|
-
return corsConfig;
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Get middleware information
|
|
337
|
-
*/
|
|
338
|
-
getInfo(id) {
|
|
339
|
-
if (id) {
|
|
340
|
-
const entry = this.middlewareRegistry.get(id);
|
|
341
|
-
if (!entry)
|
|
342
|
-
throw new Error(`Middleware not found: ${id}`);
|
|
343
|
-
return this.entryToInfo(entry);
|
|
344
|
-
}
|
|
345
|
-
return Array.from(this.middlewareRegistry.values()).map((entry) => this.entryToInfo(entry));
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Get middleware statistics
|
|
349
|
-
*/
|
|
350
|
-
getStats() {
|
|
351
|
-
const entries = Array.from(this.middlewareRegistry.values());
|
|
352
|
-
const enabledCount = entries.filter((e) => e.enabled).length;
|
|
353
|
-
const byPriority = entries.reduce((acc, entry) => {
|
|
354
|
-
acc[entry.priority] = (acc[entry.priority] || 0) + 1;
|
|
355
|
-
return acc;
|
|
356
|
-
}, {});
|
|
357
|
-
const byType = entries.reduce((acc, entry) => {
|
|
358
|
-
acc[entry.name] = this.entryToInfo(entry);
|
|
359
|
-
return acc;
|
|
360
|
-
}, {});
|
|
361
|
-
return {
|
|
362
|
-
totalMiddleware: entries.length,
|
|
363
|
-
enabledMiddleware: enabledCount,
|
|
364
|
-
totalExecutions: this.performanceMetrics.totalRequests,
|
|
365
|
-
averageExecutionTime: this.performanceMetrics.averageExecutionTime,
|
|
366
|
-
cacheHitRate: this.performanceMetrics.cacheHitRate,
|
|
367
|
-
optimizationRate: this.performanceMetrics.optimizationGain,
|
|
368
|
-
byPriority,
|
|
369
|
-
byType,
|
|
370
|
-
performance: {
|
|
371
|
-
fastestMiddleware: this.findFastestMiddleware(),
|
|
372
|
-
slowestMiddleware: this.findSlowestMiddleware(),
|
|
373
|
-
mostUsedMiddleware: this.findMostUsedMiddleware(),
|
|
374
|
-
cacheEfficiency: this.calculateCacheEfficiency(),
|
|
375
|
-
},
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Get performance metrics
|
|
380
|
-
*/
|
|
381
|
-
getPerformanceMetrics() {
|
|
382
|
-
return { ...this.performanceMetrics };
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Optimize middleware execution
|
|
386
|
-
*/
|
|
387
|
-
async optimize() {
|
|
388
|
-
Logger.logger.debug("middleware", "Optimizing middleware execution...");
|
|
389
|
-
// Reorder middleware based on performance data
|
|
390
|
-
this.optimizeExecutionOrder();
|
|
391
|
-
// Clean up cache
|
|
392
|
-
this.cleanupCache();
|
|
393
|
-
// Update optimization metrics
|
|
394
|
-
this.updateOptimizationMetrics();
|
|
395
|
-
Logger.logger.debug("middleware", "Middleware optimization completed");
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* Warm up middleware cache
|
|
399
|
-
*/
|
|
400
|
-
async warmCache() {
|
|
401
|
-
Logger.logger.debug("middleware", "Warming up middleware cache...");
|
|
402
|
-
// Pre-cache common middleware results
|
|
403
|
-
const commonPaths = ["/health", "/ping", "/status"];
|
|
404
|
-
const commonMethods = ["GET", "POST"];
|
|
405
|
-
for (const path of commonPaths) {
|
|
406
|
-
for (const method of commonMethods) {
|
|
407
|
-
const cacheKey = `${method}:${path}`;
|
|
408
|
-
// Pre-populate cache with empty results for faster lookup
|
|
409
|
-
this.middlewareCache.set(cacheKey, {
|
|
410
|
-
result: null,
|
|
411
|
-
timestamp: Date.now(),
|
|
412
|
-
ttl: this.optimizationConfig.defaultTTL,
|
|
413
|
-
hits: 0,
|
|
414
|
-
middleware: "warmup",
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
Logger.logger.debug("middleware", "Middleware cache warmed up");
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* Clear middleware cache
|
|
422
|
-
*/
|
|
423
|
-
clearCache() {
|
|
424
|
-
this.middlewareCache.clear();
|
|
425
|
-
Logger.logger.debug("middleware", "Middleware cache cleared");
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* Execute middleware chain
|
|
429
|
-
*/
|
|
430
|
-
async executeMiddleware(req, res, next) {
|
|
431
|
-
const startTime = performance.now();
|
|
432
|
-
try {
|
|
433
|
-
// Get applicable middleware for this request
|
|
434
|
-
const applicableMiddleware = this.matchRoute(req.path, req.method);
|
|
435
|
-
// Execute middleware in priority order
|
|
436
|
-
for (const entry of applicableMiddleware) {
|
|
437
|
-
if (!entry.enabled)
|
|
438
|
-
continue;
|
|
439
|
-
const middlewareStartTime = performance.now();
|
|
440
|
-
try {
|
|
441
|
-
await this.executeMiddlewareEntry(entry, req, res, next);
|
|
442
|
-
const executionTime = performance.now() - middlewareStartTime;
|
|
443
|
-
this.updateMiddlewareStats(entry, executionTime, false);
|
|
444
|
-
}
|
|
445
|
-
catch (error) {
|
|
446
|
-
const executionTime = performance.now() - middlewareStartTime;
|
|
447
|
-
this.updateMiddlewareStats(entry, executionTime, true);
|
|
448
|
-
throw error;
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
const totalExecutionTime = performance.now() - startTime;
|
|
452
|
-
this.updatePerformanceMetrics(totalExecutionTime, false);
|
|
453
|
-
}
|
|
454
|
-
catch (error) {
|
|
455
|
-
const totalExecutionTime = performance.now() - startTime;
|
|
456
|
-
this.updatePerformanceMetrics(totalExecutionTime, true);
|
|
457
|
-
throw error;
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* Match middleware to route
|
|
462
|
-
*/
|
|
463
|
-
matchRoute(path, method) {
|
|
464
|
-
return this.executionOrder
|
|
465
|
-
.map((id) => this.middlewareRegistry.get(id))
|
|
466
|
-
.filter((entry) => {
|
|
467
|
-
if (!entry || !entry.enabled)
|
|
468
|
-
return false;
|
|
469
|
-
// If no routes specified, apply to all routes
|
|
470
|
-
if (!entry.routes || entry.routes.length === 0)
|
|
471
|
-
return true;
|
|
472
|
-
// Check if path matches any of the specified routes
|
|
473
|
-
return entry.routes.some((route) => {
|
|
474
|
-
if (typeof route === "string") {
|
|
475
|
-
return path === route || path.startsWith(route);
|
|
476
|
-
}
|
|
477
|
-
return false;
|
|
478
|
-
});
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
/**
|
|
482
|
-
* Configure middleware
|
|
483
|
-
*/
|
|
484
|
-
configure(config) {
|
|
485
|
-
this.options.middleware = { ...this.options.middleware, ...config };
|
|
486
|
-
// Apply configuration changes
|
|
487
|
-
if (config.enableOptimization !== undefined) {
|
|
488
|
-
this.optimizationConfig.enableCaching = config.enableOptimization;
|
|
489
|
-
}
|
|
490
|
-
if (config.enableCaching !== undefined) {
|
|
491
|
-
this.optimizationConfig.enableCaching = config.enableCaching;
|
|
492
|
-
}
|
|
493
|
-
if (config.enablePerformanceTracking !== undefined) {
|
|
494
|
-
this.optimizationConfig.enablePerformanceTracking =
|
|
495
|
-
config.enablePerformanceTracking;
|
|
496
|
-
}
|
|
497
|
-
Logger.logger.debug("middleware", "Middleware configuration updated");
|
|
498
|
-
}
|
|
499
|
-
/**
|
|
500
|
-
* Get current configuration
|
|
501
|
-
*/
|
|
502
|
-
getConfiguration() {
|
|
503
|
-
return { ...this.options.middleware };
|
|
504
|
-
}
|
|
505
|
-
/**
|
|
506
|
-
* Clear all middleware
|
|
507
|
-
*/
|
|
508
|
-
clear() {
|
|
509
|
-
this.middlewareRegistry.clear();
|
|
510
|
-
this.middlewareCache.clear();
|
|
511
|
-
this.executionOrder = [];
|
|
512
|
-
Logger.logger.debug("middleware", "All middleware cleared");
|
|
513
|
-
}
|
|
514
|
-
/**
|
|
515
|
-
* Create cache middleware for route optimization
|
|
516
|
-
*/
|
|
517
|
-
createCacheMiddleware(options) {
|
|
518
|
-
const ttl = options?.ttl || this.optimizationConfig.defaultTTL;
|
|
519
|
-
const keyGenerator = options?.keyGenerator ||
|
|
520
|
-
((req) => `${req.method}:${req.path}`);
|
|
521
|
-
return (req, res, next) => {
|
|
522
|
-
const cacheKey = keyGenerator(req);
|
|
523
|
-
const cached = this.middlewareCache.get(cacheKey);
|
|
524
|
-
if (cached && this.isCacheValid(cached)) {
|
|
525
|
-
cached.hits++;
|
|
526
|
-
Logger.logger.debug("middleware", `Cache hit for route: ${cacheKey}`);
|
|
527
|
-
return next();
|
|
528
|
-
}
|
|
529
|
-
// Cache miss - continue with normal processing
|
|
530
|
-
const originalSend = res.send;
|
|
531
|
-
const self = this;
|
|
532
|
-
res.send = function (body) {
|
|
533
|
-
// Cache the response
|
|
534
|
-
self.middlewareCache.set(cacheKey, {
|
|
535
|
-
result: body,
|
|
536
|
-
timestamp: Date.now(),
|
|
537
|
-
ttl,
|
|
538
|
-
hits: 0,
|
|
539
|
-
middleware: "route-cache",
|
|
540
|
-
});
|
|
541
|
-
return originalSend.call(this, body);
|
|
542
|
-
};
|
|
543
|
-
next();
|
|
544
|
-
};
|
|
545
|
-
}
|
|
546
|
-
/**
|
|
547
|
-
* Shutdown middleware manager
|
|
548
|
-
*/
|
|
549
|
-
async shutdown() {
|
|
550
|
-
Logger.logger.debug("middleware", "Shutting down Middleware Manager...");
|
|
551
|
-
this.middlewareRegistry.clear();
|
|
552
|
-
this.middlewareCache.clear();
|
|
553
|
-
this.executionOrder = [];
|
|
554
|
-
this.initialized = false;
|
|
555
|
-
Logger.logger.debug("middleware", " Middleware Manager shut down");
|
|
556
|
-
}
|
|
557
|
-
// ===== PRIVATE METHODS =====
|
|
558
|
-
/**
|
|
559
|
-
* Apply middleware to Express app
|
|
560
|
-
*/
|
|
561
|
-
applyMiddlewareToApp(entry) {
|
|
562
|
-
if (!entry.enabled)
|
|
563
|
-
return;
|
|
564
|
-
// If routes are specified, apply middleware only to those routes
|
|
565
|
-
if (entry.routes && entry.routes.length > 0) {
|
|
566
|
-
entry.routes.forEach((route) => {
|
|
567
|
-
this.dependencies.app.use(route, entry.handler);
|
|
568
|
-
Logger.logger.debug("middleware", `Applied middleware "${entry.name}" to route: ${route}`);
|
|
569
|
-
});
|
|
570
|
-
}
|
|
571
|
-
else {
|
|
572
|
-
// Apply to all routes
|
|
573
|
-
this.dependencies.app.use(entry.handler);
|
|
574
|
-
Logger.logger.debug("middleware", `Applied middleware "${entry.name}" globally`);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
/**
|
|
578
|
-
* Configure built-in middleware
|
|
579
|
-
*/
|
|
580
|
-
configureBuiltInMiddleware() {
|
|
581
|
-
Logger.logger.debug("middleware", "Configuring built-in middleware...");
|
|
582
|
-
this.configureTrustProxy();
|
|
583
|
-
this.configureSecurityMiddleware();
|
|
584
|
-
this.configurePerformanceMiddleware();
|
|
585
|
-
this.configureBodyParsing();
|
|
586
|
-
Logger.logger.debug("middleware", "Built-in middleware configured");
|
|
587
|
-
}
|
|
588
|
-
/**
|
|
589
|
-
* Configure trust proxy settings
|
|
590
|
-
*/
|
|
591
|
-
configureTrustProxy() {
|
|
592
|
-
if (this.options.server?.trustProxy) {
|
|
593
|
-
this.dependencies.app.set("trust proxy", true);
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
/**
|
|
597
|
-
* Configure security middleware
|
|
598
|
-
*/
|
|
599
|
-
configureSecurityMiddleware() {
|
|
600
|
-
if (this.options.security?.helmet) {
|
|
601
|
-
this.enableSecurity();
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
/**
|
|
605
|
-
* Configure performance middleware
|
|
606
|
-
*/
|
|
607
|
-
configurePerformanceMiddleware() {
|
|
608
|
-
if (this.options.performance?.compression) {
|
|
609
|
-
this.enableCompression();
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
/**
|
|
613
|
-
* Configure body parsing middleware
|
|
614
|
-
*/
|
|
615
|
-
configureBodyParsing() {
|
|
616
|
-
this.dependencies.app.use(express.json({
|
|
617
|
-
limit: this.options.server?.jsonLimit,
|
|
618
|
-
}));
|
|
619
|
-
this.dependencies.app.use(express.urlencoded({
|
|
620
|
-
extended: true,
|
|
621
|
-
limit: this.options.server?.urlEncodedLimit,
|
|
622
|
-
}));
|
|
623
|
-
}
|
|
624
|
-
/**
|
|
625
|
-
* Configure optimization middleware
|
|
626
|
-
*/
|
|
627
|
-
configureOptimizationMiddleware() {
|
|
628
|
-
// This will be handled by the existing MiddlewareManager for now
|
|
629
|
-
// to maintain backward compatibility
|
|
630
|
-
}
|
|
631
|
-
/**
|
|
632
|
-
* Configure request processing middleware
|
|
633
|
-
*/
|
|
634
|
-
configureRequestProcessingMiddleware() {
|
|
635
|
-
this.dependencies.app.use(async (req, res, next) => {
|
|
636
|
-
// Start performance measurement
|
|
637
|
-
const requestId = this.dependencies.performanceProfiler.startMeasurement(req);
|
|
638
|
-
req.requestId = requestId;
|
|
639
|
-
req.startTime = performance.now();
|
|
640
|
-
try {
|
|
641
|
-
// Execute middleware chain
|
|
642
|
-
await this.executeMiddleware(req, res, next);
|
|
643
|
-
// Classify request for optimal execution path
|
|
644
|
-
const classification = this.dependencies.executionPredictor.classify(req);
|
|
645
|
-
this.dependencies.performanceProfiler.setRequestType(requestId, classification.type, classification.executionPath);
|
|
646
|
-
// Update optimization stats
|
|
647
|
-
this.dependencies.optimizationStats.totalRequests++;
|
|
648
|
-
if (classification.type === "ultra-fast") {
|
|
649
|
-
this.dependencies.optimizationStats.ultraFastRequests++;
|
|
650
|
-
}
|
|
651
|
-
else if (classification.type === "fast") {
|
|
652
|
-
this.dependencies.optimizationStats.fastRequests++;
|
|
653
|
-
}
|
|
654
|
-
else {
|
|
655
|
-
this.dependencies.optimizationStats.standardRequests++;
|
|
656
|
-
}
|
|
657
|
-
// Route to appropriate execution path
|
|
658
|
-
if (classification.type === "ultra-fast" &&
|
|
659
|
-
this.dependencies.optimizationEnabled) {
|
|
660
|
-
return await this.dependencies.handleUltraFastPath(req, res, next, requestId, classification);
|
|
661
|
-
}
|
|
662
|
-
else if (classification.type === "fast" &&
|
|
663
|
-
this.dependencies.optimizationEnabled) {
|
|
664
|
-
return await this.dependencies.handleFastPath(req, res, next, requestId, classification);
|
|
665
|
-
}
|
|
666
|
-
else {
|
|
667
|
-
return await this.dependencies.handleStandardPath(req, res, next, requestId, classification);
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
catch (optimizationError) {
|
|
671
|
-
// Graceful fallback to standard path on optimization failure
|
|
672
|
-
Logger.logger.warn("middleware", `Optimization failed for ${req.method} ${req.path}:`, optimizationError.message);
|
|
673
|
-
this.dependencies.optimizationStats.optimizationFailures++;
|
|
674
|
-
return await this.dependencies.handleStandardPath(req, res, next, requestId, {
|
|
675
|
-
type: "standard",
|
|
676
|
-
confidence: 1.0,
|
|
677
|
-
executionPath: "fallback",
|
|
678
|
-
cacheStrategy: "standard",
|
|
679
|
-
skipMiddleware: [],
|
|
680
|
-
reason: "Optimization failure fallback",
|
|
681
|
-
overhead: 0,
|
|
682
|
-
});
|
|
683
|
-
}
|
|
684
|
-
});
|
|
685
|
-
}
|
|
686
|
-
/**
|
|
687
|
-
* Wrap middleware with performance tracking and caching
|
|
688
|
-
*/
|
|
689
|
-
wrapMiddleware(handler, name) {
|
|
690
|
-
return async (req, res, next) => {
|
|
691
|
-
const startTime = performance.now();
|
|
692
|
-
try {
|
|
693
|
-
// Check cache if middleware is cacheable AND the specific middleware entry allows caching
|
|
694
|
-
const cacheKey = this.generateCacheKey(req, name);
|
|
695
|
-
const middlewareEntry = Array.from(this.middlewareRegistry.values()).find((entry) => entry.name === name);
|
|
696
|
-
if (this.optimizationConfig.enableCaching &&
|
|
697
|
-
middlewareEntry?.cacheable === true) {
|
|
698
|
-
const cached = this.middlewareCache.get(cacheKey);
|
|
699
|
-
if (cached && this.isCacheValid(cached)) {
|
|
700
|
-
cached.hits++;
|
|
701
|
-
const executionTime = performance.now() - startTime;
|
|
702
|
-
Logger.logger.debug("middleware", `Cache hit for ${name}: ${executionTime}ms`);
|
|
703
|
-
return next();
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
// Execute middleware (Express middleware uses callbacks, not promises)
|
|
707
|
-
handler(req, res, (error) => {
|
|
708
|
-
const executionTime = performance.now() - startTime;
|
|
709
|
-
if (error) {
|
|
710
|
-
Logger.logger.error("middleware", `Error in ${name}: ${error} (${executionTime}ms)`);
|
|
711
|
-
return next(error);
|
|
712
|
-
}
|
|
713
|
-
// Cache result if applicable
|
|
714
|
-
if (this.optimizationConfig.enableCaching &&
|
|
715
|
-
executionTime < 10) {
|
|
716
|
-
this.middlewareCache.set(cacheKey, {
|
|
717
|
-
result: null,
|
|
718
|
-
timestamp: Date.now(),
|
|
719
|
-
ttl: this.optimizationConfig.defaultTTL,
|
|
720
|
-
hits: 0,
|
|
721
|
-
middleware: name,
|
|
722
|
-
});
|
|
723
|
-
}
|
|
724
|
-
Logger.logger.debug("middleware", `Executed ${name}: ${executionTime}ms`);
|
|
725
|
-
next();
|
|
726
|
-
});
|
|
727
|
-
}
|
|
728
|
-
catch (error) {
|
|
729
|
-
const executionTime = performance.now() - startTime;
|
|
730
|
-
Logger.logger.error("middleware", `Error in ${name}: ${error} (${executionTime}ms)`);
|
|
731
|
-
next(error);
|
|
732
|
-
}
|
|
733
|
-
};
|
|
734
|
-
}
|
|
735
|
-
/**
|
|
736
|
-
* Calculate execution order based on priority
|
|
737
|
-
*/
|
|
738
|
-
calculateOrder(priority) {
|
|
739
|
-
const priorityOrder = {
|
|
740
|
-
critical: 1000,
|
|
741
|
-
high: 800,
|
|
742
|
-
normal: 500,
|
|
743
|
-
low: 200,
|
|
744
|
-
};
|
|
745
|
-
return priorityOrder[priority] + Math.random() * 100; // Add randomness for same priority
|
|
746
|
-
}
|
|
747
|
-
/**
|
|
748
|
-
* Update execution order based on priority and performance
|
|
749
|
-
*/
|
|
750
|
-
updateExecutionOrder() {
|
|
751
|
-
this.executionOrder = Array.from(this.middlewareRegistry.entries())
|
|
752
|
-
.filter(([_, entry]) => entry.enabled)
|
|
753
|
-
.sort(([_, a], [__, b]) => b.order - a.order)
|
|
754
|
-
.map(([id, _]) => id);
|
|
755
|
-
}
|
|
756
|
-
/**
|
|
757
|
-
* Execute a single middleware entry
|
|
758
|
-
*/
|
|
759
|
-
async executeMiddlewareEntry(entry, req, res, next) {
|
|
760
|
-
return new Promise((resolve, reject) => {
|
|
761
|
-
try {
|
|
762
|
-
entry.handler(req, res, (error) => {
|
|
763
|
-
if (error) {
|
|
764
|
-
reject(error);
|
|
765
|
-
}
|
|
766
|
-
else {
|
|
767
|
-
resolve();
|
|
768
|
-
}
|
|
769
|
-
});
|
|
770
|
-
}
|
|
771
|
-
catch (error) {
|
|
772
|
-
reject(error);
|
|
773
|
-
}
|
|
774
|
-
});
|
|
775
|
-
}
|
|
776
|
-
/**
|
|
777
|
-
* Update middleware statistics
|
|
778
|
-
*/
|
|
779
|
-
updateMiddlewareStats(entry, executionTime, hasError) {
|
|
780
|
-
entry.stats.executionCount++;
|
|
781
|
-
entry.stats.totalExecutionTime += executionTime;
|
|
782
|
-
entry.stats.averageExecutionTime =
|
|
783
|
-
entry.stats.totalExecutionTime / entry.stats.executionCount;
|
|
784
|
-
entry.stats.lastExecuted = new Date();
|
|
785
|
-
if (hasError) {
|
|
786
|
-
entry.stats.errors++;
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
/**
|
|
790
|
-
* Update performance metrics
|
|
791
|
-
*/
|
|
792
|
-
updatePerformanceMetrics(executionTime, hasError) {
|
|
793
|
-
this.performanceMetrics.totalRequests++;
|
|
794
|
-
this.performanceMetrics.totalExecutionTime += executionTime;
|
|
795
|
-
this.performanceMetrics.averageExecutionTime =
|
|
796
|
-
this.performanceMetrics.totalExecutionTime /
|
|
797
|
-
this.performanceMetrics.totalRequests;
|
|
798
|
-
if (executionTime < this.performanceMetrics.fastestExecution) {
|
|
799
|
-
this.performanceMetrics.fastestExecution = executionTime;
|
|
800
|
-
}
|
|
801
|
-
if (executionTime > this.performanceMetrics.slowestExecution) {
|
|
802
|
-
this.performanceMetrics.slowestExecution = executionTime;
|
|
803
|
-
}
|
|
804
|
-
if (hasError) {
|
|
805
|
-
this.performanceMetrics.errorRate =
|
|
806
|
-
(this.performanceMetrics.errorRate *
|
|
807
|
-
(this.performanceMetrics.totalRequests - 1) +
|
|
808
|
-
1) /
|
|
809
|
-
this.performanceMetrics.totalRequests;
|
|
810
|
-
}
|
|
811
|
-
// Calculate cache hit rate
|
|
812
|
-
const totalCacheAttempts = Array.from(this.middlewareCache.values()).reduce((sum, entry) => sum + entry.hits, 0);
|
|
813
|
-
this.performanceMetrics.cacheHitRate =
|
|
814
|
-
totalCacheAttempts / this.performanceMetrics.totalRequests;
|
|
815
|
-
// Calculate throughput (requests per second)
|
|
816
|
-
const now = Date.now();
|
|
817
|
-
this.performanceMetrics.throughput =
|
|
818
|
-
this.performanceMetrics.totalRequests /
|
|
819
|
-
((now - (now - this.performanceMetrics.totalExecutionTime)) / 1000);
|
|
820
|
-
}
|
|
821
|
-
/**
|
|
822
|
-
* Convert registry entry to middleware info
|
|
823
|
-
*/
|
|
824
|
-
entryToInfo(entry) {
|
|
825
|
-
return {
|
|
826
|
-
name: entry.name,
|
|
827
|
-
priority: entry.priority,
|
|
828
|
-
enabled: entry.enabled,
|
|
829
|
-
order: entry.order,
|
|
830
|
-
routes: entry.routes,
|
|
831
|
-
executionCount: entry.stats.executionCount,
|
|
832
|
-
averageExecutionTime: entry.stats.averageExecutionTime,
|
|
833
|
-
lastExecuted: entry.stats.lastExecuted,
|
|
834
|
-
cacheEnabled: entry.cacheable,
|
|
835
|
-
optimized: entry.stats.averageExecutionTime < 5, // Consider optimized if < 5ms
|
|
836
|
-
};
|
|
837
|
-
}
|
|
838
|
-
/**
|
|
839
|
-
* Generate cache key for middleware
|
|
840
|
-
*/
|
|
841
|
-
generateCacheKey(req, middlewareName) {
|
|
842
|
-
return `middleware:${middlewareName}:${req.method}:${req.path}`;
|
|
843
|
-
}
|
|
844
|
-
/**
|
|
845
|
-
* Check if cache entry is valid
|
|
846
|
-
*/
|
|
847
|
-
isCacheValid(entry) {
|
|
848
|
-
return Date.now() - entry.timestamp < entry.ttl;
|
|
849
|
-
}
|
|
850
|
-
/**
|
|
851
|
-
* Optimize execution order based on performance data
|
|
852
|
-
*/
|
|
853
|
-
optimizeExecutionOrder() {
|
|
854
|
-
// Sort by average execution time (fastest first) within same priority
|
|
855
|
-
this.executionOrder = Array.from(this.middlewareRegistry.entries())
|
|
856
|
-
.filter(([_, entry]) => entry.enabled)
|
|
857
|
-
.sort(([_, a], [__, b]) => {
|
|
858
|
-
// First by priority
|
|
859
|
-
if (a.priority !== b.priority) {
|
|
860
|
-
return b.order - a.order;
|
|
861
|
-
}
|
|
862
|
-
// Then by performance (faster first)
|
|
863
|
-
return (a.stats.averageExecutionTime - b.stats.averageExecutionTime);
|
|
864
|
-
})
|
|
865
|
-
.map(([id, _]) => id);
|
|
866
|
-
}
|
|
867
|
-
/**
|
|
868
|
-
* Clean up expired cache entries
|
|
869
|
-
*/
|
|
870
|
-
cleanupCache() {
|
|
871
|
-
const now = Date.now();
|
|
872
|
-
for (const [key, entry] of this.middlewareCache.entries()) {
|
|
873
|
-
if (now - entry.timestamp > entry.ttl) {
|
|
874
|
-
this.middlewareCache.delete(key);
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
// Limit cache size
|
|
878
|
-
if (this.middlewareCache.size > this.optimizationConfig.maxCacheSize) {
|
|
879
|
-
const entries = Array.from(this.middlewareCache.entries()).sort(([_, a], [__, b]) => a.hits - b.hits); // Remove least used first
|
|
880
|
-
const toRemove = this.middlewareCache.size -
|
|
881
|
-
this.optimizationConfig.maxCacheSize;
|
|
882
|
-
for (let i = 0; i < toRemove; i++) {
|
|
883
|
-
this.middlewareCache.delete(entries[i][0]);
|
|
884
|
-
}
|
|
885
|
-
}
|
|
886
|
-
}
|
|
887
|
-
/**
|
|
888
|
-
* Update optimization metrics
|
|
889
|
-
*/
|
|
890
|
-
updateOptimizationMetrics() {
|
|
891
|
-
const totalMiddleware = this.middlewareRegistry.size;
|
|
892
|
-
const optimizedMiddleware = Array.from(this.middlewareRegistry.values()).filter((entry) => entry.stats.averageExecutionTime < 5).length;
|
|
893
|
-
this.performanceMetrics.optimizationGain =
|
|
894
|
-
totalMiddleware > 0
|
|
895
|
-
? (optimizedMiddleware / totalMiddleware) * 100
|
|
896
|
-
: 0;
|
|
897
|
-
}
|
|
898
|
-
/**
|
|
899
|
-
* Find fastest middleware
|
|
900
|
-
*/
|
|
901
|
-
findFastestMiddleware() {
|
|
902
|
-
let fastest = "";
|
|
903
|
-
let fastestTime = Infinity;
|
|
904
|
-
for (const entry of this.middlewareRegistry.values()) {
|
|
905
|
-
if (entry.stats.averageExecutionTime < fastestTime) {
|
|
906
|
-
fastestTime = entry.stats.averageExecutionTime;
|
|
907
|
-
fastest = entry.name;
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
return fastest;
|
|
911
|
-
}
|
|
912
|
-
/**
|
|
913
|
-
* Find slowest middleware
|
|
914
|
-
*/
|
|
915
|
-
findSlowestMiddleware() {
|
|
916
|
-
let slowest = "";
|
|
917
|
-
let slowestTime = 0;
|
|
918
|
-
for (const entry of this.middlewareRegistry.values()) {
|
|
919
|
-
if (entry.stats.averageExecutionTime > slowestTime) {
|
|
920
|
-
slowestTime = entry.stats.averageExecutionTime;
|
|
921
|
-
slowest = entry.name;
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
return slowest;
|
|
925
|
-
}
|
|
926
|
-
/**
|
|
927
|
-
* Find most used middleware
|
|
928
|
-
*/
|
|
929
|
-
findMostUsedMiddleware() {
|
|
930
|
-
let mostUsed = "";
|
|
931
|
-
let mostUsedCount = 0;
|
|
932
|
-
for (const entry of this.middlewareRegistry.values()) {
|
|
933
|
-
if (entry.stats.executionCount > mostUsedCount) {
|
|
934
|
-
mostUsedCount = entry.stats.executionCount;
|
|
935
|
-
mostUsed = entry.name;
|
|
936
|
-
}
|
|
937
|
-
}
|
|
938
|
-
return mostUsed;
|
|
939
|
-
}
|
|
940
|
-
/**
|
|
941
|
-
* Calculate cache efficiency
|
|
942
|
-
*/
|
|
943
|
-
calculateCacheEfficiency() {
|
|
944
|
-
const totalCacheAttempts = Array.from(this.middlewareCache.values()).reduce((sum, entry) => sum + entry.hits, 0);
|
|
945
|
-
const totalRequests = this.performanceMetrics.totalRequests;
|
|
946
|
-
return totalRequests > 0
|
|
947
|
-
? (totalCacheAttempts / totalRequests) * 100
|
|
948
|
-
: 0;
|
|
949
|
-
}
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
exports.MiddlewareManager = MiddlewareManager;
|
|
953
|
-
//# sourceMappingURL=middlewareManager.js.map
|