xypriss 2.0.0 → 2.1.1

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 (185) hide show
  1. package/README.md +171 -381
  2. package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js +10 -0
  3. package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
  4. package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js +10 -0
  5. package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
  6. package/dist/cjs/mods/security/src/components/cache/index.js +10 -2
  7. package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -1
  8. package/dist/cjs/mods/security/src/components/fortified-function/index.js +9 -0
  9. package/dist/cjs/mods/security/src/components/fortified-function/index.js.map +1 -1
  10. package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js +10 -0
  11. package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
  12. package/dist/cjs/mods/security/src/core/crypto.js +14 -0
  13. package/dist/cjs/mods/security/src/core/crypto.js.map +1 -1
  14. package/dist/cjs/mods/security/src/index.js +10 -1
  15. package/dist/cjs/mods/security/src/index.js.map +1 -1
  16. package/dist/cjs/shared/logger/Logger.js +372 -29
  17. package/dist/cjs/shared/logger/Logger.js.map +1 -1
  18. package/dist/cjs/src/cluster/bun-cluster-manager.js +91 -1
  19. package/dist/cjs/src/cluster/bun-cluster-manager.js.map +1 -1
  20. package/dist/cjs/src/cluster/cluster-manager.js +15 -3
  21. package/dist/cjs/src/cluster/cluster-manager.js.map +1 -1
  22. package/dist/cjs/src/cluster/modules/AutoScaler.js +4 -4
  23. package/dist/cjs/src/cluster/modules/AutoScaler.js.map +1 -1
  24. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +2 -2
  25. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  26. package/dist/cjs/src/cluster/modules/EventLoopMonitor.js +270 -0
  27. package/dist/cjs/src/cluster/modules/EventLoopMonitor.js.map +1 -0
  28. package/dist/cjs/src/cluster/modules/GCStatsTracker.js +200 -0
  29. package/dist/cjs/src/cluster/modules/GCStatsTracker.js.map +1 -0
  30. package/dist/cjs/src/cluster/modules/HeapStatsCollector.js +111 -0
  31. package/dist/cjs/src/cluster/modules/HeapStatsCollector.js.map +1 -0
  32. package/dist/cjs/src/cluster/modules/NetworkTracker.js +162 -0
  33. package/dist/cjs/src/cluster/modules/NetworkTracker.js.map +1 -0
  34. package/dist/cjs/src/cluster/modules/ThroughputCalculator.js +186 -0
  35. package/dist/cjs/src/cluster/modules/ThroughputCalculator.js.map +1 -0
  36. package/dist/cjs/src/cluster/modules/WorkerManager.js +14 -15
  37. package/dist/cjs/src/cluster/modules/WorkerManager.js.map +1 -1
  38. package/dist/cjs/src/cluster/modules/{LoadBalancer.js → strategy/LoadBalancer.js} +1 -1
  39. package/dist/cjs/src/cluster/modules/strategy/LoadBalancer.js.map +1 -0
  40. package/dist/cjs/src/middleware/built-in/sqlInjection.js +335 -0
  41. package/dist/cjs/src/middleware/built-in/sqlInjection.js.map +1 -0
  42. package/dist/cjs/src/middleware/safe-json-middleware.js +1 -1
  43. package/dist/cjs/src/middleware/safe-json-middleware.js.map +1 -1
  44. package/dist/cjs/src/middleware/security-middleware.js +447 -332
  45. package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
  46. package/dist/cjs/src/plugins/modules/index.js +9 -3
  47. package/dist/cjs/src/plugins/modules/index.js.map +1 -1
  48. package/dist/cjs/src/server/FastServer.js +41 -1
  49. package/dist/cjs/src/server/FastServer.js.map +1 -1
  50. package/dist/cjs/src/server/ServerFactory.js +62 -2
  51. package/dist/cjs/src/server/ServerFactory.js.map +1 -1
  52. package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +32 -6
  53. package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
  54. package/dist/cjs/src/server/components/fastapi/WorkerPoolComponent.js +206 -0
  55. package/dist/cjs/src/server/components/fastapi/WorkerPoolComponent.js.map +1 -0
  56. package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js +3 -28
  57. package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
  58. package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js +265 -0
  59. package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js.map +1 -0
  60. package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/Logger.js +236 -0
  61. package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/cpu-tasks.js +294 -0
  62. package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/enhanced-cpu-worker.js +433 -0
  63. package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/io-worker.js +1615 -0
  64. package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js +143 -24
  65. package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -1
  66. package/dist/cjs/src/server/const/default.js +23 -9
  67. package/dist/cjs/src/server/const/default.js.map +1 -1
  68. package/dist/cjs/src/server/core/HttpServer.js +8 -8
  69. package/dist/cjs/src/server/core/HttpServer.js.map +1 -1
  70. package/dist/cjs/src/server/core/XyprissApp.js +284 -17
  71. package/dist/cjs/src/server/core/XyprissApp.js.map +1 -1
  72. package/dist/cjs/src/server/handlers/NotFoundHandler.js +1 -1
  73. package/dist/cjs/src/server/handlers/NotFoundHandler.js.map +1 -1
  74. package/dist/cjs/src/server/middleware/MiddlewareManager.js +57 -12
  75. package/dist/cjs/src/server/middleware/MiddlewareManager.js.map +1 -1
  76. package/dist/cjs/src/server/utils/forceClosePort.js +1 -1
  77. package/dist/cjs/src/server/utils/forceClosePort.js.map +1 -1
  78. package/dist/esm/mods/security/src/algorithms/hash-algorithms.js +10 -0
  79. package/dist/esm/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
  80. package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +10 -0
  81. package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
  82. package/dist/esm/mods/security/src/components/cache/index.js +10 -2
  83. package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
  84. package/dist/esm/mods/security/src/components/fortified-function/index.js +9 -0
  85. package/dist/esm/mods/security/src/components/fortified-function/index.js.map +1 -1
  86. package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +10 -0
  87. package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
  88. package/dist/esm/mods/security/src/core/crypto.js +14 -0
  89. package/dist/esm/mods/security/src/core/crypto.js.map +1 -1
  90. package/dist/esm/mods/security/src/index.js +10 -1
  91. package/dist/esm/mods/security/src/index.js.map +1 -1
  92. package/dist/esm/shared/logger/Logger.js +372 -29
  93. package/dist/esm/shared/logger/Logger.js.map +1 -1
  94. package/dist/esm/src/cluster/bun-cluster-manager.js +91 -1
  95. package/dist/esm/src/cluster/bun-cluster-manager.js.map +1 -1
  96. package/dist/esm/src/cluster/cluster-manager.js +15 -3
  97. package/dist/esm/src/cluster/cluster-manager.js.map +1 -1
  98. package/dist/esm/src/cluster/modules/AutoScaler.js +4 -4
  99. package/dist/esm/src/cluster/modules/AutoScaler.js.map +1 -1
  100. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +2 -2
  101. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  102. package/dist/esm/src/cluster/modules/EventLoopMonitor.js +268 -0
  103. package/dist/esm/src/cluster/modules/EventLoopMonitor.js.map +1 -0
  104. package/dist/esm/src/cluster/modules/GCStatsTracker.js +198 -0
  105. package/dist/esm/src/cluster/modules/GCStatsTracker.js.map +1 -0
  106. package/dist/esm/src/cluster/modules/HeapStatsCollector.js +109 -0
  107. package/dist/esm/src/cluster/modules/HeapStatsCollector.js.map +1 -0
  108. package/dist/esm/src/cluster/modules/NetworkTracker.js +160 -0
  109. package/dist/esm/src/cluster/modules/NetworkTracker.js.map +1 -0
  110. package/dist/esm/src/cluster/modules/ThroughputCalculator.js +184 -0
  111. package/dist/esm/src/cluster/modules/ThroughputCalculator.js.map +1 -0
  112. package/dist/esm/src/cluster/modules/WorkerManager.js +14 -14
  113. package/dist/esm/src/cluster/modules/WorkerManager.js.map +1 -1
  114. package/dist/esm/src/cluster/modules/{LoadBalancer.js → strategy/LoadBalancer.js} +1 -1
  115. package/dist/esm/src/cluster/modules/strategy/LoadBalancer.js.map +1 -0
  116. package/dist/esm/src/middleware/built-in/sqlInjection.js +333 -0
  117. package/dist/esm/src/middleware/built-in/sqlInjection.js.map +1 -0
  118. package/dist/esm/src/middleware/safe-json-middleware.js +1 -1
  119. package/dist/esm/src/middleware/safe-json-middleware.js.map +1 -1
  120. package/dist/esm/src/middleware/security-middleware.js +447 -332
  121. package/dist/esm/src/middleware/security-middleware.js.map +1 -1
  122. package/dist/esm/src/plugins/modules/index.js +9 -3
  123. package/dist/esm/src/plugins/modules/index.js.map +1 -1
  124. package/dist/esm/src/server/FastServer.js +41 -1
  125. package/dist/esm/src/server/FastServer.js.map +1 -1
  126. package/dist/esm/src/server/ServerFactory.js +62 -2
  127. package/dist/esm/src/server/ServerFactory.js.map +1 -1
  128. package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +32 -6
  129. package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
  130. package/dist/esm/src/server/components/fastapi/WorkerPoolComponent.js +204 -0
  131. package/dist/esm/src/server/components/fastapi/WorkerPoolComponent.js.map +1 -0
  132. package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js +2 -27
  133. package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
  134. package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js +263 -0
  135. package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js.map +1 -0
  136. package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/Logger.js +236 -0
  137. package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/cpu-tasks.js +294 -0
  138. package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/enhanced-cpu-worker.js +433 -0
  139. package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/io-worker.js +1615 -0
  140. package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js +143 -24
  141. package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -1
  142. package/dist/esm/src/server/const/default.js +23 -9
  143. package/dist/esm/src/server/const/default.js.map +1 -1
  144. package/dist/esm/src/server/core/HttpServer.js +8 -8
  145. package/dist/esm/src/server/core/HttpServer.js.map +1 -1
  146. package/dist/esm/src/server/core/XyprissApp.js +284 -17
  147. package/dist/esm/src/server/core/XyprissApp.js.map +1 -1
  148. package/dist/esm/src/server/handlers/NotFoundHandler.js +1 -1
  149. package/dist/esm/src/server/handlers/NotFoundHandler.js.map +1 -1
  150. package/dist/esm/src/server/middleware/MiddlewareManager.js +57 -12
  151. package/dist/esm/src/server/middleware/MiddlewareManager.js.map +1 -1
  152. package/dist/esm/src/server/utils/forceClosePort.js +1 -1
  153. package/dist/esm/src/server/utils/forceClosePort.js.map +1 -1
  154. package/dist/index.d.ts +675 -516
  155. package/package.json +9 -9
  156. package/dist/cjs/src/cluster/index.js +0 -361
  157. package/dist/cjs/src/cluster/index.js.map +0 -1
  158. package/dist/cjs/src/cluster/modules/ClusterFactory.js +0 -539
  159. package/dist/cjs/src/cluster/modules/ClusterFactory.js.map +0 -1
  160. package/dist/cjs/src/cluster/modules/LoadBalancer.js.map +0 -1
  161. package/dist/cjs/src/server/components/fastapi/UltraFastRequestProcessor.js +0 -668
  162. package/dist/cjs/src/server/components/fastapi/UltraFastRequestProcessor.js.map +0 -1
  163. package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareAPI.js +0 -347
  164. package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareAPI.js.map +0 -1
  165. package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js +0 -204
  166. package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js.map +0 -1
  167. package/dist/cjs/src/server/components/fastapi/middlewares/middlewareManager.js +0 -953
  168. package/dist/cjs/src/server/components/fastapi/middlewares/middlewareManager.js.map +0 -1
  169. package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPool.js +0 -56
  170. package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPool.js.map +0 -1
  171. package/dist/esm/src/cluster/index.js +0 -339
  172. package/dist/esm/src/cluster/index.js.map +0 -1
  173. package/dist/esm/src/cluster/modules/ClusterFactory.js +0 -511
  174. package/dist/esm/src/cluster/modules/ClusterFactory.js.map +0 -1
  175. package/dist/esm/src/cluster/modules/LoadBalancer.js.map +0 -1
  176. package/dist/esm/src/server/components/fastapi/UltraFastRequestProcessor.js +0 -647
  177. package/dist/esm/src/server/components/fastapi/UltraFastRequestProcessor.js.map +0 -1
  178. package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareAPI.js +0 -345
  179. package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareAPI.js.map +0 -1
  180. package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js +0 -202
  181. package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js.map +0 -1
  182. package/dist/esm/src/server/components/fastapi/middlewares/middlewareManager.js +0 -951
  183. package/dist/esm/src/server/components/fastapi/middlewares/middlewareManager.js.map +0 -1
  184. package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPool.js +0 -54
  185. package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPool.js.map +0 -1
@@ -1,647 +0,0 @@
1
- import * as os from 'os';
2
- import { createHash } from 'crypto';
3
- import { readCache, writeCache, getCacheStats } from '../../../../mods/security/src/components/cache/index.js';
4
- import { PerformanceMonitor } from '../../optimization/performance-monitor.js';
5
- import { WorkerPool } from './modules/UFRP/WorkerPool.js';
6
-
7
- /**
8
- * XyPrissJS - Ultra-Fast Request Processor (Optimized Production Version)
9
- * High-performance request processing using existing XyPrissJS components
10
- */
11
- class UltraFastRequestProcessor {
12
- constructor(config) {
13
- this.requestPatterns = new Map();
14
- this.activeRequests = new Map();
15
- this.circuitBreaker = new Map();
16
- this.stats = {
17
- cacheHits: 0,
18
- cacheMisses: 0,
19
- totalRequests: 0,
20
- successfulRequests: 0,
21
- failedRequests: 0,
22
- avgResponseTime: 0,
23
- totalResponseTime: 0,
24
- peakConcurrency: 0,
25
- currentConcurrency: 0,
26
- };
27
- this.intervals = [];
28
- this.isShuttingDown = false;
29
- this.config = this.createFinalConfig(config);
30
- this.maxConcurrency = this.config.workers?.maxConcurrentTasks || 1000;
31
- // Initialize optimized worker pool
32
- this.workerPool = new WorkerPool({
33
- cpu: this.config.workers?.cpu ||
34
- Math.max(2, Math.floor(os.cpus().length * 0.8)),
35
- io: this.config.workers?.io ||
36
- Math.max(4, Math.floor(os.cpus().length * 0.6)),
37
- maxConcurrentTasks: this.maxConcurrency,
38
- });
39
- // Initialize performance monitor with optimized settings
40
- this.performanceMonitor = new PerformanceMonitor({
41
- ...this.config.performance,
42
- // Note: bufferSize and sampleRate are handled internally by PerformanceMonitor
43
- });
44
- // Start optimized pattern analysis
45
- if (this.config.prediction?.enabled) {
46
- this.startOptimizedPatternAnalysis();
47
- }
48
- // Start cleanup processes
49
- this.startCleanupProcesses();
50
- }
51
- createFinalConfig(config) {
52
- const isLegacy = config && ("cpuWorkers" in config || "ioWorkers" in config);
53
- if (isLegacy) {
54
- return this.convertLegacyConfig(config);
55
- }
56
- return this.createDefaultConfig(config);
57
- }
58
- convertLegacyConfig(legacy) {
59
- return {
60
- cache: {
61
- maxSize: legacy.maxCacheSize || 50000,
62
- defaultTTL: legacy.cacheTTL || 300000,
63
- enableCompression: legacy.enableCompression ?? true,
64
- compressionThreshold: 1024,
65
- },
66
- performance: {
67
- enabled: true,
68
- metrics: [
69
- "cpu",
70
- "memory",
71
- "responseTime",
72
- "requests",
73
- "errors",
74
- ],
75
- interval: 10000, // Reduced frequency for production
76
- alerts: [],
77
- },
78
- workers: {
79
- cpu: legacy.cpuWorkers ||
80
- Math.max(2, Math.floor(os.cpus().length * 0.8)),
81
- io: legacy.ioWorkers ||
82
- Math.max(4, Math.floor(os.cpus().length * 0.6)),
83
- maxConcurrentTasks: legacy.maxConcurrentTasks || 1000,
84
- },
85
- prediction: {
86
- enabled: legacy.enablePrediction ?? true,
87
- patternRetentionTime: 1800000, // 30 minutes
88
- analysisInterval: 300000, // 5 minutes
89
- hotPatternThreshold: 50, // Increased threshold
90
- },
91
- };
92
- }
93
- createDefaultConfig(override) {
94
- const cpuCount = os.cpus().length;
95
- const defaults = {
96
- cache: {
97
- maxSize: 50000,
98
- defaultTTL: 300000,
99
- enableCompression: true,
100
- compressionThreshold: 1024,
101
- },
102
- performance: {
103
- enabled: true,
104
- metrics: [
105
- "cpu",
106
- "memory",
107
- "responseTime",
108
- "requests",
109
- "errors",
110
- ],
111
- interval: 10000,
112
- alerts: [],
113
- },
114
- workers: {
115
- cpu: Math.max(2, Math.floor(cpuCount * 0.8)),
116
- io: Math.max(4, Math.floor(cpuCount * 0.6)),
117
- maxConcurrentTasks: 1000,
118
- },
119
- prediction: {
120
- enabled: true,
121
- patternRetentionTime: 1800000,
122
- analysisInterval: 300000,
123
- hotPatternThreshold: 50,
124
- },
125
- };
126
- return this.deepMerge(defaults, override || {});
127
- }
128
- deepMerge(target, source) {
129
- const result = { ...target };
130
- for (const key in source) {
131
- if (source[key] &&
132
- typeof source[key] === "object" &&
133
- !Array.isArray(source[key])) {
134
- result[key] = this.deepMerge(target[key] || {}, source[key]);
135
- }
136
- else {
137
- result[key] = source[key];
138
- }
139
- }
140
- return result;
141
- }
142
- startOptimizedPatternAnalysis() {
143
- const interval = setInterval(() => {
144
- if (!this.isShuttingDown) {
145
- this.analyzeRequestPatterns();
146
- this.updateCircuitBreakers();
147
- }
148
- }, this.config.prediction?.analysisInterval || 300000);
149
- this.intervals.push(interval);
150
- }
151
- startCleanupProcesses() {
152
- // Pattern cleanup
153
- const patternCleanup = setInterval(() => {
154
- if (!this.isShuttingDown) {
155
- this.cleanupOldPatterns();
156
- }
157
- }, 600000); // Every 10 minutes
158
- // Active requests cleanup (for orphaned requests)
159
- const requestCleanup = setInterval(() => {
160
- if (!this.isShuttingDown) {
161
- this.cleanupOrphanedRequests();
162
- }
163
- }, 60000); // Every minute
164
- this.intervals.push(patternCleanup, requestCleanup);
165
- }
166
- analyzeRequestPatterns() {
167
- const now = Date.now();
168
- const patterns = Array.from(this.requestPatterns.entries());
169
- for (const [patternKey, pattern] of patterns) {
170
- const timeSpan = Math.max(1, (now - pattern.lastSeen) / 60000);
171
- pattern.frequency = pattern.count / timeSpan;
172
- pattern.priority = this.calculateOptimizedPriority(pattern);
173
- // Update success rate
174
- pattern.successRate =
175
- pattern.count > 0
176
- ? ((pattern.count - pattern.errorCount) / pattern.count) *
177
- 100
178
- : 100;
179
- }
180
- // Prune low-priority patterns to manage memory
181
- this.prunePatterns(patterns);
182
- }
183
- calculateOptimizedPriority(pattern) {
184
- const now = Date.now();
185
- const recency = Math.max(1, (now - pattern.lastSeen) / 60000);
186
- const frequency = pattern.frequency || 1;
187
- const speed = 1000 / Math.max(pattern.avgResponseTime, 1);
188
- const reliability = pattern.successRate / 100;
189
- const resourceEfficiency = 1 /
190
- Math.max(pattern.resourceUsage.cpu + pattern.resourceUsage.memory, 1);
191
- return ((pattern.count *
192
- frequency *
193
- speed *
194
- reliability *
195
- resourceEfficiency) /
196
- recency);
197
- }
198
- prunePatterns(patterns) {
199
- const maxPatterns = 10000; // Limit memory usage
200
- if (patterns.length <= maxPatterns)
201
- return;
202
- // Sort by priority (ascending) and remove lowest priority patterns
203
- patterns.sort((a, b) => a[1].priority - b[1].priority);
204
- const toRemove = patterns.slice(0, patterns.length - maxPatterns);
205
- for (const [key] of toRemove) {
206
- this.requestPatterns.delete(key);
207
- }
208
- }
209
- updateCircuitBreakers() {
210
- const now = Date.now();
211
- const resetTime = 60000; // 1 minute
212
- for (const [pattern, breaker] of this.circuitBreaker.entries()) {
213
- if (breaker.isOpen && now - breaker.lastFailure > resetTime) {
214
- breaker.isOpen = false;
215
- breaker.failures = 0;
216
- }
217
- }
218
- }
219
- cleanupOldPatterns() {
220
- const now = Date.now();
221
- const retentionTime = this.config.prediction?.patternRetentionTime || 1800000;
222
- for (const [patternKey, pattern] of this.requestPatterns.entries()) {
223
- if (now - pattern.lastSeen > retentionTime) {
224
- this.requestPatterns.delete(patternKey);
225
- }
226
- }
227
- // Also cleanup circuit breakers
228
- for (const [pattern, breaker] of this.circuitBreaker.entries()) {
229
- if (now - breaker.lastFailure > retentionTime) {
230
- this.circuitBreaker.delete(pattern);
231
- }
232
- }
233
- }
234
- cleanupOrphanedRequests() {
235
- const now = Date.now();
236
- const maxAge = 300000; // 5 minutes
237
- for (const [reqId, context] of this.activeRequests.entries()) {
238
- if (now - context.startTime > maxAge) {
239
- this.activeRequests.delete(reqId);
240
- this.stats.currentConcurrency = Math.max(0, this.stats.currentConcurrency - 1);
241
- }
242
- }
243
- }
244
- middleware() {
245
- return async (req, res, next) => {
246
- if (this.isShuttingDown) {
247
- res.status(503).json({ error: "Service shutting down" });
248
- return;
249
- }
250
- // Check concurrency limit
251
- if (this.stats.currentConcurrency >= this.maxConcurrency) {
252
- res.status(429).json({ error: "Too many concurrent requests" });
253
- return;
254
- }
255
- const requestId = this.generateRequestId();
256
- const startTime = Date.now();
257
- const context = {
258
- startTime,
259
- cacheKey: this.generateOptimizedCacheKey(req),
260
- pattern: this.generatePattern(req),
261
- priority: this.calculateRequestPriority(req),
262
- workerType: this.determineWorkerType(req),
263
- taskType: this.determineTaskType(req),
264
- };
265
- this.activeRequests.set(requestId, context);
266
- this.stats.currentConcurrency++;
267
- this.stats.totalRequests++;
268
- this.stats.peakConcurrency = Math.max(this.stats.peakConcurrency, this.stats.currentConcurrency);
269
- try {
270
- // Check circuit breaker
271
- if (this.isCircuitOpen(context.pattern)) {
272
- throw new Error("Circuit breaker open");
273
- }
274
- // Try cache first
275
- const cachedResult = await this.tryCache(context.cacheKey);
276
- if (cachedResult) {
277
- await this.sendCachedResponse(res, cachedResult, requestId, context);
278
- return;
279
- }
280
- // Process request
281
- const result = await this.processOptimizedRequest(req, context);
282
- // Cache result if successful
283
- if (result && !res.headersSent) {
284
- await this.cacheResult(context.cacheKey, result);
285
- await this.sendProcessedResponse(res, result, requestId, context);
286
- }
287
- else if (!res.headersSent) {
288
- // If we couldn't process the request, pass it to the next middleware
289
- next();
290
- return;
291
- }
292
- this.recordSuccess(context, Date.now() - startTime);
293
- }
294
- catch (error) {
295
- this.recordFailure(context, error, Date.now() - startTime);
296
- if (!res.headersSent) {
297
- this.sendErrorResponse(res, error, requestId);
298
- }
299
- }
300
- finally {
301
- this.activeRequests.delete(requestId);
302
- this.stats.currentConcurrency = Math.max(0, this.stats.currentConcurrency - 1);
303
- }
304
- };
305
- }
306
- generateRequestId() {
307
- return `req_${Date.now()}_${Math.random()
308
- .toString(36)
309
- .substring(2, 11)}`;
310
- }
311
- generateOptimizedCacheKey(req) {
312
- // More efficient cache key generation
313
- const keyParts = [
314
- req.method,
315
- req.path,
316
- req.headers["content-type"] || "",
317
- ];
318
- // Only include query params for GET requests
319
- if (req.method === "GET" && Object.keys(req.query).length > 0) {
320
- keyParts.push(JSON.stringify(req.query));
321
- }
322
- return createHash("sha256")
323
- .update(keyParts.join("|"))
324
- .digest("base64url"); // More URL-safe encoding
325
- }
326
- async tryCache(cacheKey) {
327
- try {
328
- const result = await readCache(cacheKey);
329
- if (result &&
330
- typeof result === "object" &&
331
- Object.keys(result).length > 0) {
332
- this.stats.cacheHits++;
333
- return result;
334
- }
335
- }
336
- catch (error) {
337
- // Cache miss or error, continue with processing
338
- }
339
- this.stats.cacheMisses++;
340
- return null;
341
- }
342
- async processOptimizedRequest(req, context) {
343
- ({
344
- id: this.generateRequestId(),
345
- type: context.taskType,
346
- priority: context.priority,
347
- workerType: context.workerType,
348
- createdAt: Date.now(),
349
- data: {
350
- method: req.method,
351
- path: req.path,
352
- query: req.query,
353
- body: req.body,
354
- headers: this.sanitizeHeaders(req.headers),
355
- },
356
- });
357
- // TODO: Implement actual request processing logic
358
- // For now, return null to pass control to next middleware
359
- return null;
360
- }
361
- createTimeoutPromise(ms) {
362
- return new Promise((_, reject) => {
363
- setTimeout(() => reject(new Error("Request timeout")), ms);
364
- });
365
- }
366
- async cacheResult(cacheKey, result) {
367
- try {
368
- await writeCache(cacheKey, result, {
369
- ttl: this.config.cache?.defaultTTL || 300000,
370
- });
371
- }
372
- catch (error) {
373
- // Log cache write errors but don't fail the request
374
- console.warn("Cache write failed:", error);
375
- }
376
- }
377
- async sendCachedResponse(res, result, requestId, context) {
378
- const responseTime = Date.now() - context.startTime;
379
- res.setHeader("X-Cache", "HIT");
380
- res.setHeader("X-Response-Time", `${responseTime}ms`);
381
- res.setHeader("X-Request-ID", requestId);
382
- res.json(result);
383
- }
384
- async sendProcessedResponse(res, result, requestId, context) {
385
- const responseTime = Date.now() - context.startTime;
386
- res.setHeader("X-Cache", "MISS");
387
- res.setHeader("X-Response-Time", `${responseTime}ms`);
388
- res.setHeader("X-Request-ID", requestId);
389
- res.json(result);
390
- }
391
- sendErrorResponse(res, error, requestId) {
392
- const statusCode = error.statusCode || 500;
393
- res.status(statusCode).json({
394
- error: error.message || "Internal server error",
395
- requestId,
396
- timestamp: Date.now(),
397
- });
398
- }
399
- isCircuitOpen(pattern) {
400
- const breaker = this.circuitBreaker.get(pattern);
401
- return breaker?.isOpen || false;
402
- }
403
- recordSuccess(context, responseTime) {
404
- this.stats.successfulRequests++;
405
- this.stats.totalResponseTime += responseTime;
406
- this.stats.avgResponseTime =
407
- this.stats.totalResponseTime / this.stats.totalRequests;
408
- this.updateRequestPattern(context, responseTime, true);
409
- }
410
- recordFailure(context, error, responseTime) {
411
- this.stats.failedRequests++;
412
- this.stats.totalResponseTime += responseTime;
413
- this.stats.avgResponseTime =
414
- this.stats.totalResponseTime / this.stats.totalRequests;
415
- this.updateRequestPattern(context, responseTime, false);
416
- this.updateCircuitBreaker(context.pattern);
417
- }
418
- updateRequestPattern(context, responseTime, success) {
419
- const pattern = this.requestPatterns.get(context.pattern) ||
420
- this.createNewPattern(context);
421
- pattern.count++;
422
- pattern.lastSeen = Date.now();
423
- pattern.avgResponseTime = this.updateAverage(pattern.avgResponseTime, responseTime, pattern.count);
424
- if (!success) {
425
- pattern.errorCount++;
426
- pattern.lastErrorTime = Date.now();
427
- }
428
- pattern.successRate =
429
- ((pattern.count - pattern.errorCount) / pattern.count) * 100;
430
- pattern.priority = this.calculateOptimizedPriority(pattern);
431
- this.requestPatterns.set(context.pattern, pattern);
432
- }
433
- createNewPattern(context) {
434
- return {
435
- count: 0,
436
- lastSeen: 0,
437
- avgResponseTime: 0,
438
- priority: 0,
439
- method: context.pattern.split(":")[0],
440
- path: context.pattern.split(":")[1],
441
- frequency: 0,
442
- trend: "stable",
443
- successRate: 100,
444
- errorCount: 0,
445
- peakUsage: 0,
446
- resourceUsage: { cpu: 0, memory: 0 },
447
- };
448
- }
449
- updateCircuitBreaker(pattern) {
450
- const breaker = this.circuitBreaker.get(pattern) || {
451
- failures: 0,
452
- lastFailure: 0,
453
- isOpen: false,
454
- };
455
- breaker.failures++;
456
- breaker.lastFailure = Date.now();
457
- if (breaker.failures >= 5) {
458
- // Open circuit after 5 failures
459
- breaker.isOpen = true;
460
- }
461
- this.circuitBreaker.set(pattern, breaker);
462
- }
463
- determineTaskType(req) {
464
- if (req.path.includes("/validate") || req.path.includes("/verify"))
465
- return "validate";
466
- switch (req.method) {
467
- case "GET":
468
- case "HEAD":
469
- return "read";
470
- case "POST":
471
- case "PUT":
472
- case "PATCH":
473
- return "write";
474
- case "DELETE":
475
- return "delete";
476
- default:
477
- return "process";
478
- }
479
- }
480
- calculateRequestPriority(req) {
481
- let priority = 5; // Default priority
482
- // Critical paths get highest priority
483
- if (req.path.includes("/health") || req.path.includes("/status")) {
484
- priority = 0;
485
- }
486
- else if (req.path.includes("/auth") || req.path.includes("/login")) {
487
- priority = 1;
488
- }
489
- else if (req.path.includes("/api/admin")) {
490
- priority = 2;
491
- }
492
- else if (req.method === "GET") {
493
- priority = 3;
494
- }
495
- else if (req.method === "POST" || req.method === "PUT") {
496
- priority = 4;
497
- }
498
- // Adjust based on content type
499
- if (req.headers["content-type"]?.includes("application/json")) {
500
- priority = Math.max(0, priority - 1);
501
- }
502
- return priority;
503
- }
504
- determineWorkerType(req) {
505
- // CPU-intensive operations
506
- const cpuPaths = [
507
- "/validate",
508
- "/compute",
509
- "/transform",
510
- "/encrypt",
511
- "/hash",
512
- "/compress",
513
- ];
514
- if (cpuPaths.some((path) => req.path.includes(path))) {
515
- return "cpu";
516
- }
517
- // Default to I/O for database, file system, network operations
518
- return "io";
519
- }
520
- generatePattern(req) {
521
- return [
522
- req.method,
523
- req.route?.path || req.path,
524
- req.headers["content-type"] || "",
525
- ].join(":");
526
- }
527
- updateAverage(currentAvg, newValue, count) {
528
- return (currentAvg * (count - 1) + newValue) / count;
529
- }
530
- sanitizeHeaders(headers) {
531
- const sanitized = {};
532
- const allowedHeaders = [
533
- "content-type",
534
- "accept",
535
- "authorization",
536
- "user-agent",
537
- "x-forwarded-for",
538
- "x-real-ip",
539
- "accept-encoding",
540
- ];
541
- for (const key of allowedHeaders) {
542
- if (headers[key]) {
543
- sanitized[key] = String(headers[key]);
544
- }
545
- }
546
- return sanitized;
547
- }
548
- getStats() {
549
- const performanceMetrics = this.performanceMonitor.getMetrics();
550
- const patternStats = this.getOptimizedPatternStats();
551
- const workerPoolStats = this.workerPool.getStats();
552
- const cacheStats = getCacheStats();
553
- return {
554
- cache: {
555
- hits: this.stats.cacheHits,
556
- misses: this.stats.cacheMisses,
557
- hitRate: this.stats.totalRequests > 0
558
- ? (this.stats.cacheHits / this.stats.totalRequests) *
559
- 100
560
- : 0,
561
- stats: cacheStats,
562
- },
563
- requests: {
564
- total: this.stats.totalRequests,
565
- successful: this.stats.successfulRequests,
566
- failed: this.stats.failedRequests,
567
- successRate: this.stats.totalRequests > 0
568
- ? (this.stats.successfulRequests /
569
- this.stats.totalRequests) *
570
- 100
571
- : 0,
572
- avgResponseTime: this.stats.avgResponseTime,
573
- currentConcurrency: this.stats.currentConcurrency,
574
- peakConcurrency: this.stats.peakConcurrency,
575
- },
576
- patterns: patternStats,
577
- performance: performanceMetrics,
578
- workerPool: workerPoolStats,
579
- circuitBreakers: {
580
- total: this.circuitBreaker.size,
581
- open: Array.from(this.circuitBreaker.values()).filter((b) => b.isOpen).length,
582
- },
583
- memory: {
584
- activeRequests: this.activeRequests.size,
585
- patterns: this.requestPatterns.size,
586
- circuitBreakers: this.circuitBreaker.size,
587
- },
588
- };
589
- }
590
- getOptimizedPatternStats() {
591
- const now = Date.now();
592
- const activePatterns = Array.from(this.requestPatterns.values()).filter((pattern) => now - pattern.lastSeen < 600000);
593
- const hotPatterns = activePatterns.filter((p) => p.priority > (this.config.prediction?.hotPatternThreshold || 50));
594
- return {
595
- totalPatterns: this.requestPatterns.size,
596
- activePatterns: activePatterns.length,
597
- hotPatterns: hotPatterns.length,
598
- avgSuccessRate: activePatterns.length > 0
599
- ? activePatterns.reduce((sum, p) => sum + p.successRate, 0) / activePatterns.length
600
- : 100,
601
- avgResponseTime: activePatterns.length > 0
602
- ? activePatterns.reduce((sum, p) => sum + p.avgResponseTime, 0) / activePatterns.length
603
- : 0,
604
- topPatterns: hotPatterns
605
- .sort((a, b) => b.priority - a.priority)
606
- .slice(0, 10)
607
- .map((p) => ({
608
- method: p.method,
609
- path: p.path,
610
- priority: p.priority,
611
- successRate: p.successRate,
612
- avgResponseTime: p.avgResponseTime,
613
- frequency: p.frequency,
614
- })),
615
- };
616
- }
617
- async destroy() {
618
- this.isShuttingDown = true;
619
- try {
620
- // Wait for active requests to complete (with timeout)
621
- const maxWaitTime = 30000; // 30 seconds
622
- const checkInterval = 100;
623
- let waited = 0;
624
- while (this.activeRequests.size > 0 && waited < maxWaitTime) {
625
- await new Promise((resolve) => setTimeout(resolve, checkInterval));
626
- waited += checkInterval;
627
- }
628
- // Clear all intervals
629
- this.intervals.forEach((interval) => clearInterval(interval));
630
- this.intervals = [];
631
- // Stop performance monitor
632
- this.performanceMonitor.stop();
633
- // Note: WorkerPool doesn't require explicit shutdown as it doesn't create actual worker threads
634
- // Clear all maps
635
- this.requestPatterns.clear();
636
- this.activeRequests.clear();
637
- this.circuitBreaker.clear();
638
- console.log("UltraFastRequestProcessor shutdown complete");
639
- }
640
- catch (error) {
641
- console.error("Error during shutdown:", error);
642
- }
643
- }
644
- }
645
-
646
- export { UltraFastRequestProcessor };
647
- //# sourceMappingURL=UltraFastRequestProcessor.js.map