xypriss 1.3.8 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/README.md +232 -254
  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 -74
  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 -4
  15. package/dist/cjs/mods/security/src/index.js.map +1 -1
  16. package/dist/cjs/shared/logger/Logger.js +374 -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/index.js +55 -61
  41. package/dist/cjs/src/index.js.map +1 -1
  42. package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js +281 -0
  43. package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js.map +1 -0
  44. package/dist/cjs/src/middleware/built-in/index.js +325 -0
  45. package/dist/cjs/src/middleware/built-in/index.js.map +1 -0
  46. package/dist/cjs/src/middleware/built-in/sqlInjection.js +335 -0
  47. package/dist/cjs/src/middleware/built-in/sqlInjection.js.map +1 -0
  48. package/dist/cjs/src/middleware/safe-json-middleware.js +1 -1
  49. package/dist/cjs/src/middleware/safe-json-middleware.js.map +1 -1
  50. package/dist/cjs/src/middleware/security-middleware.js +447 -332
  51. package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
  52. package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js +1 -1
  53. package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -1
  54. package/dist/cjs/src/plugins/modules/index.js +9 -3
  55. package/dist/cjs/src/plugins/modules/index.js.map +1 -1
  56. package/dist/cjs/src/quick-start.js +0 -4
  57. package/dist/cjs/src/quick-start.js.map +1 -1
  58. package/dist/cjs/src/server/FastServer.js +94 -412
  59. package/dist/cjs/src/server/FastServer.js.map +1 -1
  60. package/dist/cjs/src/server/ServerFactory.js +69 -64
  61. package/dist/cjs/src/server/ServerFactory.js.map +1 -1
  62. package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +31 -5
  63. package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
  64. package/dist/cjs/src/server/components/fastapi/PerformanceManager.js +1 -1
  65. package/dist/cjs/src/server/components/fastapi/PerformanceManager.js.map +1 -1
  66. package/dist/cjs/src/server/components/fastapi/RouteManager.js +0 -82
  67. package/dist/cjs/src/server/components/fastapi/RouteManager.js.map +1 -1
  68. package/dist/cjs/src/server/components/fastapi/WorkerPoolComponent.js +206 -0
  69. package/dist/cjs/src/server/components/fastapi/WorkerPoolComponent.js.map +1 -0
  70. package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js +3 -28
  71. package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
  72. package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js +265 -0
  73. package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js.map +1 -0
  74. package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/Logger.js +236 -0
  75. package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/cpu-tasks.js +294 -0
  76. package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/enhanced-cpu-worker.js +433 -0
  77. package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/io-worker.js +1615 -0
  78. package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js +503 -0
  79. package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
  80. package/dist/cjs/src/server/const/default.js +23 -17
  81. package/dist/cjs/src/server/const/default.js.map +1 -1
  82. package/dist/cjs/src/server/core/HttpServer.js +500 -0
  83. package/dist/cjs/src/server/core/HttpServer.js.map +1 -0
  84. package/dist/cjs/src/server/core/XyprissApp.js +679 -0
  85. package/dist/cjs/src/server/core/XyprissApp.js.map +1 -0
  86. package/dist/cjs/src/server/handlers/NotFoundHandler.js +1 -1
  87. package/dist/cjs/src/server/handlers/NotFoundHandler.js.map +1 -1
  88. package/dist/cjs/src/server/middleware/MiddlewareManager.js +191 -0
  89. package/dist/cjs/src/server/middleware/MiddlewareManager.js.map +1 -0
  90. package/dist/cjs/src/server/routing/Router.js +341 -0
  91. package/dist/cjs/src/server/routing/Router.js.map +1 -0
  92. package/dist/cjs/src/server/utils/PortManager.js +1 -0
  93. package/dist/cjs/src/server/utils/PortManager.js.map +1 -1
  94. package/dist/cjs/src/server/utils/forceClosePort.js +294 -88
  95. package/dist/cjs/src/server/utils/forceClosePort.js.map +1 -1
  96. package/dist/esm/mods/security/src/algorithms/hash-algorithms.js +10 -0
  97. package/dist/esm/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
  98. package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +10 -0
  99. package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
  100. package/dist/esm/mods/security/src/components/cache/index.js +11 -72
  101. package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
  102. package/dist/esm/mods/security/src/components/fortified-function/index.js +9 -0
  103. package/dist/esm/mods/security/src/components/fortified-function/index.js.map +1 -1
  104. package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +10 -0
  105. package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
  106. package/dist/esm/mods/security/src/core/crypto.js +14 -0
  107. package/dist/esm/mods/security/src/core/crypto.js.map +1 -1
  108. package/dist/esm/mods/security/src/index.js +11 -2
  109. package/dist/esm/mods/security/src/index.js.map +1 -1
  110. package/dist/esm/shared/logger/Logger.js +374 -29
  111. package/dist/esm/shared/logger/Logger.js.map +1 -1
  112. package/dist/esm/src/cluster/bun-cluster-manager.js +91 -1
  113. package/dist/esm/src/cluster/bun-cluster-manager.js.map +1 -1
  114. package/dist/esm/src/cluster/cluster-manager.js +15 -3
  115. package/dist/esm/src/cluster/cluster-manager.js.map +1 -1
  116. package/dist/esm/src/cluster/modules/AutoScaler.js +4 -4
  117. package/dist/esm/src/cluster/modules/AutoScaler.js.map +1 -1
  118. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +2 -2
  119. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  120. package/dist/esm/src/cluster/modules/EventLoopMonitor.js +268 -0
  121. package/dist/esm/src/cluster/modules/EventLoopMonitor.js.map +1 -0
  122. package/dist/esm/src/cluster/modules/GCStatsTracker.js +198 -0
  123. package/dist/esm/src/cluster/modules/GCStatsTracker.js.map +1 -0
  124. package/dist/esm/src/cluster/modules/HeapStatsCollector.js +109 -0
  125. package/dist/esm/src/cluster/modules/HeapStatsCollector.js.map +1 -0
  126. package/dist/esm/src/cluster/modules/NetworkTracker.js +160 -0
  127. package/dist/esm/src/cluster/modules/NetworkTracker.js.map +1 -0
  128. package/dist/esm/src/cluster/modules/ThroughputCalculator.js +184 -0
  129. package/dist/esm/src/cluster/modules/ThroughputCalculator.js.map +1 -0
  130. package/dist/esm/src/cluster/modules/WorkerManager.js +14 -14
  131. package/dist/esm/src/cluster/modules/WorkerManager.js.map +1 -1
  132. package/dist/esm/src/cluster/modules/{LoadBalancer.js → strategy/LoadBalancer.js} +1 -1
  133. package/dist/esm/src/cluster/modules/strategy/LoadBalancer.js.map +1 -0
  134. package/dist/esm/src/index.js +41 -11
  135. package/dist/esm/src/index.js.map +1 -1
  136. package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js +279 -0
  137. package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js.map +1 -0
  138. package/dist/esm/src/middleware/built-in/index.js +323 -0
  139. package/dist/esm/src/middleware/built-in/index.js.map +1 -0
  140. package/dist/esm/src/middleware/built-in/sqlInjection.js +333 -0
  141. package/dist/esm/src/middleware/built-in/sqlInjection.js.map +1 -0
  142. package/dist/esm/src/middleware/safe-json-middleware.js +1 -1
  143. package/dist/esm/src/middleware/safe-json-middleware.js.map +1 -1
  144. package/dist/esm/src/middleware/security-middleware.js +447 -332
  145. package/dist/esm/src/middleware/security-middleware.js.map +1 -1
  146. package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js +1 -1
  147. package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -1
  148. package/dist/esm/src/plugins/modules/index.js +9 -3
  149. package/dist/esm/src/plugins/modules/index.js.map +1 -1
  150. package/dist/esm/src/quick-start.js +0 -4
  151. package/dist/esm/src/quick-start.js.map +1 -1
  152. package/dist/esm/src/server/FastServer.js +94 -412
  153. package/dist/esm/src/server/FastServer.js.map +1 -1
  154. package/dist/esm/src/server/ServerFactory.js +70 -61
  155. package/dist/esm/src/server/ServerFactory.js.map +1 -1
  156. package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +31 -5
  157. package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
  158. package/dist/esm/src/server/components/fastapi/PerformanceManager.js +1 -1
  159. package/dist/esm/src/server/components/fastapi/PerformanceManager.js.map +1 -1
  160. package/dist/esm/src/server/components/fastapi/RouteManager.js +0 -82
  161. package/dist/esm/src/server/components/fastapi/RouteManager.js.map +1 -1
  162. package/dist/esm/src/server/components/fastapi/WorkerPoolComponent.js +204 -0
  163. package/dist/esm/src/server/components/fastapi/WorkerPoolComponent.js.map +1 -0
  164. package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js +2 -27
  165. package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
  166. package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js +263 -0
  167. package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js.map +1 -0
  168. package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/Logger.js +236 -0
  169. package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/cpu-tasks.js +294 -0
  170. package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/enhanced-cpu-worker.js +433 -0
  171. package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/io-worker.js +1615 -0
  172. package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js +501 -0
  173. package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
  174. package/dist/esm/src/server/const/default.js +23 -17
  175. package/dist/esm/src/server/const/default.js.map +1 -1
  176. package/dist/esm/src/server/core/HttpServer.js +498 -0
  177. package/dist/esm/src/server/core/HttpServer.js.map +1 -0
  178. package/dist/esm/src/server/core/XyprissApp.js +677 -0
  179. package/dist/esm/src/server/core/XyprissApp.js.map +1 -0
  180. package/dist/esm/src/server/handlers/NotFoundHandler.js +1 -1
  181. package/dist/esm/src/server/handlers/NotFoundHandler.js.map +1 -1
  182. package/dist/esm/src/server/middleware/MiddlewareManager.js +189 -0
  183. package/dist/esm/src/server/middleware/MiddlewareManager.js.map +1 -0
  184. package/dist/esm/src/server/routing/Router.js +339 -0
  185. package/dist/esm/src/server/routing/Router.js.map +1 -0
  186. package/dist/esm/src/server/utils/PortManager.js +1 -0
  187. package/dist/esm/src/server/utils/PortManager.js.map +1 -1
  188. package/dist/esm/src/server/utils/forceClosePort.js +294 -88
  189. package/dist/esm/src/server/utils/forceClosePort.js.map +1 -1
  190. package/dist/index.d.ts +3363 -5311
  191. package/package.json +39 -28
  192. package/dist/cjs/src/cluster/index.js +0 -361
  193. package/dist/cjs/src/cluster/index.js.map +0 -1
  194. package/dist/cjs/src/cluster/modules/ClusterFactory.js +0 -539
  195. package/dist/cjs/src/cluster/modules/ClusterFactory.js.map +0 -1
  196. package/dist/cjs/src/cluster/modules/LoadBalancer.js.map +0 -1
  197. package/dist/cjs/src/server/components/fastapi/UltraFastRequestProcessor.js +0 -668
  198. package/dist/cjs/src/server/components/fastapi/UltraFastRequestProcessor.js.map +0 -1
  199. package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareAPI.js +0 -347
  200. package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareAPI.js.map +0 -1
  201. package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js +0 -204
  202. package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js.map +0 -1
  203. package/dist/cjs/src/server/components/fastapi/middlewares/middlewareManager.js +0 -953
  204. package/dist/cjs/src/server/components/fastapi/middlewares/middlewareManager.js.map +0 -1
  205. package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPool.js +0 -56
  206. package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPool.js.map +0 -1
  207. package/dist/esm/src/cluster/index.js +0 -339
  208. package/dist/esm/src/cluster/index.js.map +0 -1
  209. package/dist/esm/src/cluster/modules/ClusterFactory.js +0 -511
  210. package/dist/esm/src/cluster/modules/ClusterFactory.js.map +0 -1
  211. package/dist/esm/src/cluster/modules/LoadBalancer.js.map +0 -1
  212. package/dist/esm/src/server/components/fastapi/UltraFastRequestProcessor.js +0 -647
  213. package/dist/esm/src/server/components/fastapi/UltraFastRequestProcessor.js.map +0 -1
  214. package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareAPI.js +0 -345
  215. package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareAPI.js.map +0 -1
  216. package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js +0 -202
  217. package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js.map +0 -1
  218. package/dist/esm/src/server/components/fastapi/middlewares/middlewareManager.js +0 -951
  219. package/dist/esm/src/server/components/fastapi/middlewares/middlewareManager.js.map +0 -1
  220. package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPool.js +0 -54
  221. package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPool.js.map +0 -1
@@ -0,0 +1,109 @@
1
+ import { logger } from '../../../shared/logger/Logger.js';
2
+
3
+ /**
4
+ * Heap Statistics Collector for Bun Workers
5
+ * Collects and tracks heap memory usage statistics
6
+ */
7
+ class HeapStatsCollector {
8
+ constructor() {
9
+ this.heapStatsCache = new Map();
10
+ this.lastCollectionTime = new Map();
11
+ this.cacheTimeout = 5000; // 5 seconds cache
12
+ }
13
+ /**
14
+ * Get heap statistics for a worker process
15
+ */
16
+ async getHeapStats(workerId, pid) {
17
+ const now = Date.now();
18
+ const lastCollection = this.lastCollectionTime.get(workerId) || 0;
19
+ // Return cached stats if recent
20
+ if (now - lastCollection < this.cacheTimeout) {
21
+ const cached = this.heapStatsCache.get(workerId);
22
+ if (cached) {
23
+ return cached;
24
+ }
25
+ }
26
+ try {
27
+ // For Bun, we can use process.memoryUsage() if available
28
+ const stats = await this.collectHeapStats(pid);
29
+ // Cache the results
30
+ this.heapStatsCache.set(workerId, stats);
31
+ this.lastCollectionTime.set(workerId, now);
32
+ return stats;
33
+ }
34
+ catch (error) {
35
+ logger.debug("cluster", `Failed to collect heap stats for worker ${workerId}:`, error);
36
+ // Return default stats on error
37
+ return {
38
+ heapUsed: 0,
39
+ heapTotal: 0,
40
+ external: 0,
41
+ arrayBuffers: 0,
42
+ rss: 0,
43
+ };
44
+ }
45
+ }
46
+ /**
47
+ * Collect heap statistics from process
48
+ */
49
+ async collectHeapStats(pid) {
50
+ try {
51
+ // Try to get memory usage from the process
52
+ // In a real implementation, this would use IPC to get memory stats from the worker
53
+ // For now, we'll use system-level process memory information
54
+ const { exec } = require('child_process');
55
+ const { promisify } = require('util');
56
+ const execAsync = promisify(exec);
57
+ // Get process memory info using ps command
58
+ const { stdout } = await execAsync(`ps -p ${pid} -o rss,vsz --no-headers`);
59
+ const [rss, vsz] = stdout.trim().split(/\s+/).map(Number);
60
+ // Convert KB to bytes
61
+ const rssBytes = (rss || 0) * 1024;
62
+ const vszBytes = (vsz || 0) * 1024;
63
+ // Estimate heap usage (this is approximate)
64
+ const estimatedHeapUsed = Math.floor(rssBytes * 0.7); // ~70% of RSS
65
+ const estimatedHeapTotal = Math.floor(vszBytes * 0.5); // ~50% of VSZ
66
+ return {
67
+ heapUsed: estimatedHeapUsed,
68
+ heapTotal: estimatedHeapTotal,
69
+ external: Math.floor(rssBytes * 0.1), // ~10% external
70
+ arrayBuffers: Math.floor(rssBytes * 0.05), // ~5% array buffers
71
+ rss: rssBytes,
72
+ };
73
+ }
74
+ catch (error) {
75
+ logger.debug("cluster", `Failed to collect system memory stats for PID ${pid}:`, error);
76
+ // Return zeros on error
77
+ return {
78
+ heapUsed: 0,
79
+ heapTotal: 0,
80
+ external: 0,
81
+ arrayBuffers: 0,
82
+ rss: 0,
83
+ };
84
+ }
85
+ }
86
+ /**
87
+ * Clear cached stats for a worker
88
+ */
89
+ clearWorkerStats(workerId) {
90
+ this.heapStatsCache.delete(workerId);
91
+ this.lastCollectionTime.delete(workerId);
92
+ }
93
+ /**
94
+ * Clear all cached stats
95
+ */
96
+ clearAllStats() {
97
+ this.heapStatsCache.clear();
98
+ this.lastCollectionTime.clear();
99
+ }
100
+ /**
101
+ * Get all cached heap stats
102
+ */
103
+ getAllCachedStats() {
104
+ return new Map(this.heapStatsCache);
105
+ }
106
+ }
107
+
108
+ export { HeapStatsCollector };
109
+ //# sourceMappingURL=HeapStatsCollector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeapStatsCollector.js","sources":["../../../../../src/cluster/modules/HeapStatsCollector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import { logger } from '../../../shared/logger/Logger.js';
2
+
3
+ /**
4
+ * Network Connection Tracker for Bun Workers
5
+ * Tracks network connections, bytes transferred, and connection rates
6
+ */
7
+ class NetworkTracker {
8
+ constructor() {
9
+ this.networkStatsCache = new Map();
10
+ this.connectionHistory = new Map();
11
+ this.lastCollectionTime = new Map();
12
+ this.cacheTimeout = 3000; // 3 seconds cache
13
+ this.historyWindow = 60000; // 1 minute history window
14
+ }
15
+ /**
16
+ * Get network statistics for a worker process
17
+ */
18
+ async getNetworkStats(workerId, pid) {
19
+ const now = Date.now();
20
+ const lastCollection = this.lastCollectionTime.get(workerId) || 0;
21
+ // Return cached stats if recent
22
+ if (now - lastCollection < this.cacheTimeout) {
23
+ const cached = this.networkStatsCache.get(workerId);
24
+ if (cached) {
25
+ return cached;
26
+ }
27
+ }
28
+ try {
29
+ const stats = await this.collectNetworkStats(workerId, pid);
30
+ // Update connection history for rate calculation
31
+ this.updateConnectionHistory(workerId, stats.connections);
32
+ // Calculate connections per second
33
+ stats.connectionsPerSecond = this.calculateConnectionRate(workerId);
34
+ // Cache the results
35
+ this.networkStatsCache.set(workerId, stats);
36
+ this.lastCollectionTime.set(workerId, now);
37
+ return stats;
38
+ }
39
+ catch (error) {
40
+ logger.debug("cluster", `Failed to collect network stats for worker ${workerId}:`, error);
41
+ // Return default stats on error
42
+ return {
43
+ connections: 0,
44
+ bytesReceived: 0,
45
+ bytesSent: 0,
46
+ connectionsPerSecond: 0,
47
+ };
48
+ }
49
+ }
50
+ /**
51
+ * Collect network statistics from process
52
+ */
53
+ async collectNetworkStats(workerId, pid) {
54
+ try {
55
+ // Try to get network stats using netstat or ss command
56
+ const { exec } = require('child_process');
57
+ const { promisify } = require('util');
58
+ const execAsync = promisify(exec);
59
+ // Count active connections for this process
60
+ let connections = 0;
61
+ try {
62
+ // Use lsof to count open network connections for the process
63
+ const { stdout } = await execAsync(`lsof -p ${pid} -i -n 2>/dev/null | wc -l`);
64
+ connections = Math.max(0, parseInt(stdout.trim()) - 1); // Subtract header line
65
+ }
66
+ catch (error) {
67
+ // Fallback: estimate based on typical web server patterns
68
+ connections = Math.floor(Math.random() * 10); // 0-9 connections
69
+ }
70
+ // For bytes transferred, we'd need more sophisticated monitoring
71
+ // In a real implementation, this would integrate with the HTTP server
72
+ // to track actual bytes sent/received
73
+ const estimatedBytesReceived = connections * 1024; // Rough estimate
74
+ const estimatedBytesSent = connections * 2048; // Rough estimate
75
+ return {
76
+ connections,
77
+ bytesReceived: estimatedBytesReceived,
78
+ bytesSent: estimatedBytesSent,
79
+ connectionsPerSecond: 0, // Will be calculated separately
80
+ };
81
+ }
82
+ catch (error) {
83
+ logger.debug("cluster", `Failed to collect network stats for PID ${pid}:`, error);
84
+ return {
85
+ connections: 0,
86
+ bytesReceived: 0,
87
+ bytesSent: 0,
88
+ connectionsPerSecond: 0,
89
+ };
90
+ }
91
+ }
92
+ /**
93
+ * Update connection history for rate calculation
94
+ */
95
+ updateConnectionHistory(workerId, connections) {
96
+ const now = Date.now();
97
+ let history = this.connectionHistory.get(workerId) || [];
98
+ // Add current measurement
99
+ history.push({ timestamp: now, connections });
100
+ // Remove old measurements outside the window
101
+ history = history.filter(h => now - h.timestamp <= this.historyWindow);
102
+ this.connectionHistory.set(workerId, history);
103
+ }
104
+ /**
105
+ * Calculate connections per second based on history
106
+ */
107
+ calculateConnectionRate(workerId) {
108
+ const history = this.connectionHistory.get(workerId) || [];
109
+ if (history.length < 2) {
110
+ return 0;
111
+ }
112
+ // Calculate rate over the last 10 seconds
113
+ const now = Date.now();
114
+ const recentHistory = history.filter(h => now - h.timestamp <= 10000);
115
+ if (recentHistory.length < 2) {
116
+ return 0;
117
+ }
118
+ const oldest = recentHistory[0];
119
+ const newest = recentHistory[recentHistory.length - 1];
120
+ const timeDiff = (newest.timestamp - oldest.timestamp) / 1000; // Convert to seconds
121
+ const connectionDiff = newest.connections - oldest.connections;
122
+ return timeDiff > 0 ? Math.max(0, connectionDiff / timeDiff) : 0;
123
+ }
124
+ /**
125
+ * Clear cached stats for a worker
126
+ */
127
+ clearWorkerStats(workerId) {
128
+ this.networkStatsCache.delete(workerId);
129
+ this.connectionHistory.delete(workerId);
130
+ this.lastCollectionTime.delete(workerId);
131
+ }
132
+ /**
133
+ * Clear all cached stats
134
+ */
135
+ clearAllStats() {
136
+ this.networkStatsCache.clear();
137
+ this.connectionHistory.clear();
138
+ this.lastCollectionTime.clear();
139
+ }
140
+ /**
141
+ * Get all cached network stats
142
+ */
143
+ getAllCachedStats() {
144
+ return new Map(this.networkStatsCache);
145
+ }
146
+ /**
147
+ * Track bytes transferred (to be called by HTTP server)
148
+ */
149
+ trackBytesTransferred(workerId, bytesReceived, bytesSent) {
150
+ const cached = this.networkStatsCache.get(workerId);
151
+ if (cached) {
152
+ cached.bytesReceived += bytesReceived;
153
+ cached.bytesSent += bytesSent;
154
+ this.networkStatsCache.set(workerId, cached);
155
+ }
156
+ }
157
+ }
158
+
159
+ export { NetworkTracker };
160
+ //# sourceMappingURL=NetworkTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkTracker.js","sources":["../../../../../src/cluster/modules/NetworkTracker.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Request Throughput Calculator for Bun Workers
3
+ * Calculates requests per second and tracks request patterns
4
+ */
5
+ class ThroughputCalculator {
6
+ constructor() {
7
+ this.throughputCache = new Map();
8
+ this.requestHistory = new Map();
9
+ this.activeRequestCounts = new Map();
10
+ this.queuedRequestCounts = new Map();
11
+ this.lastCollectionTime = new Map();
12
+ this.peakThroughput = new Map();
13
+ this.cacheTimeout = 2000; // 2 seconds cache
14
+ this.historyWindow = 300000; // 5 minutes history window
15
+ this.calculationWindow = 60000; // 1 minute calculation window
16
+ }
17
+ /**
18
+ * Calculate throughput statistics for a worker
19
+ */
20
+ calculateThroughput(workerId, totalRequests) {
21
+ const now = Date.now();
22
+ const lastCollection = this.lastCollectionTime.get(workerId) || 0;
23
+ // Return cached stats if recent
24
+ if (now - lastCollection < this.cacheTimeout) {
25
+ const cached = this.throughputCache.get(workerId);
26
+ if (cached) {
27
+ return cached;
28
+ }
29
+ }
30
+ // Update request history
31
+ this.updateRequestHistory(workerId, totalRequests);
32
+ // Calculate current throughput
33
+ const requestsPerSecond = this.calculateRequestsPerSecond(workerId);
34
+ const averageThroughput = this.calculateAverageThroughput(workerId);
35
+ // Update peak throughput
36
+ const currentPeak = this.peakThroughput.get(workerId) || 0;
37
+ if (requestsPerSecond > currentPeak) {
38
+ this.peakThroughput.set(workerId, requestsPerSecond);
39
+ }
40
+ const stats = {
41
+ requestsPerSecond,
42
+ activeRequests: this.activeRequestCounts.get(workerId) || 0,
43
+ queuedRequests: this.queuedRequestCounts.get(workerId) || 0,
44
+ peakThroughput: this.peakThroughput.get(workerId) || 0,
45
+ averageThroughput,
46
+ };
47
+ // Cache the results
48
+ this.throughputCache.set(workerId, stats);
49
+ this.lastCollectionTime.set(workerId, now);
50
+ return stats;
51
+ }
52
+ /**
53
+ * Update request history for throughput calculation
54
+ */
55
+ updateRequestHistory(workerId, totalRequests) {
56
+ const now = Date.now();
57
+ let history = this.requestHistory.get(workerId) || [];
58
+ // Add current measurement
59
+ history.push({ timestamp: now, requestCount: totalRequests });
60
+ // Remove old measurements outside the window
61
+ history = history.filter(h => now - h.timestamp <= this.historyWindow);
62
+ this.requestHistory.set(workerId, history);
63
+ }
64
+ /**
65
+ * Calculate requests per second based on recent history
66
+ */
67
+ calculateRequestsPerSecond(workerId) {
68
+ const history = this.requestHistory.get(workerId) || [];
69
+ if (history.length < 2) {
70
+ return 0;
71
+ }
72
+ // Use last 10 seconds for current rate calculation
73
+ const now = Date.now();
74
+ const recentHistory = history.filter(h => now - h.timestamp <= 10000);
75
+ if (recentHistory.length < 2) {
76
+ return 0;
77
+ }
78
+ const oldest = recentHistory[0];
79
+ const newest = recentHistory[recentHistory.length - 1];
80
+ const timeDiff = (newest.timestamp - oldest.timestamp) / 1000; // Convert to seconds
81
+ const requestDiff = newest.requestCount - oldest.requestCount;
82
+ return timeDiff > 0 ? Math.max(0, requestDiff / timeDiff) : 0;
83
+ }
84
+ /**
85
+ * Calculate average throughput over the calculation window
86
+ */
87
+ calculateAverageThroughput(workerId) {
88
+ const history = this.requestHistory.get(workerId) || [];
89
+ if (history.length < 2) {
90
+ return 0;
91
+ }
92
+ // Use calculation window for average
93
+ const now = Date.now();
94
+ const windowHistory = history.filter(h => now - h.timestamp <= this.calculationWindow);
95
+ if (windowHistory.length < 2) {
96
+ return 0;
97
+ }
98
+ const oldest = windowHistory[0];
99
+ const newest = windowHistory[windowHistory.length - 1];
100
+ const timeDiff = (newest.timestamp - oldest.timestamp) / 1000; // Convert to seconds
101
+ const requestDiff = newest.requestCount - oldest.requestCount;
102
+ return timeDiff > 0 ? Math.max(0, requestDiff / timeDiff) : 0;
103
+ }
104
+ /**
105
+ * Increment active request count
106
+ */
107
+ incrementActiveRequests(workerId) {
108
+ const current = this.activeRequestCounts.get(workerId) || 0;
109
+ this.activeRequestCounts.set(workerId, current + 1);
110
+ // Clear cache to force recalculation
111
+ this.throughputCache.delete(workerId);
112
+ }
113
+ /**
114
+ * Decrement active request count
115
+ */
116
+ decrementActiveRequests(workerId) {
117
+ const current = this.activeRequestCounts.get(workerId) || 0;
118
+ this.activeRequestCounts.set(workerId, Math.max(0, current - 1));
119
+ // Clear cache to force recalculation
120
+ this.throughputCache.delete(workerId);
121
+ }
122
+ /**
123
+ * Set queued request count
124
+ */
125
+ setQueuedRequests(workerId, count) {
126
+ this.queuedRequestCounts.set(workerId, Math.max(0, count));
127
+ // Clear cache to force recalculation
128
+ this.throughputCache.delete(workerId);
129
+ }
130
+ /**
131
+ * Clear cached stats for a worker
132
+ */
133
+ clearWorkerStats(workerId) {
134
+ this.throughputCache.delete(workerId);
135
+ this.requestHistory.delete(workerId);
136
+ this.activeRequestCounts.delete(workerId);
137
+ this.queuedRequestCounts.delete(workerId);
138
+ this.lastCollectionTime.delete(workerId);
139
+ this.peakThroughput.delete(workerId);
140
+ }
141
+ /**
142
+ * Clear all cached stats
143
+ */
144
+ clearAllStats() {
145
+ this.throughputCache.clear();
146
+ this.requestHistory.clear();
147
+ this.activeRequestCounts.clear();
148
+ this.queuedRequestCounts.clear();
149
+ this.lastCollectionTime.clear();
150
+ this.peakThroughput.clear();
151
+ }
152
+ /**
153
+ * Get all cached throughput stats
154
+ */
155
+ getAllCachedStats() {
156
+ return new Map(this.throughputCache);
157
+ }
158
+ /**
159
+ * Get throughput trends for a worker
160
+ */
161
+ getThroughputTrends(workerId, minutes = 5) {
162
+ const history = this.requestHistory.get(workerId) || [];
163
+ const now = Date.now();
164
+ const windowMs = minutes * 60 * 1000;
165
+ const recentHistory = history.filter(h => now - h.timestamp <= windowMs);
166
+ // Calculate RPS for each minute
167
+ const trends = [];
168
+ for (let i = 1; i < recentHistory.length; i++) {
169
+ const current = recentHistory[i];
170
+ const previous = recentHistory[i - 1];
171
+ const timeDiff = (current.timestamp - previous.timestamp) / 1000;
172
+ const requestDiff = current.requestCount - previous.requestCount;
173
+ const rps = timeDiff > 0 ? requestDiff / timeDiff : 0;
174
+ trends.push({
175
+ timestamp: current.timestamp,
176
+ rps: Math.max(0, rps)
177
+ });
178
+ }
179
+ return trends;
180
+ }
181
+ }
182
+
183
+ export { ThroughputCalculator };
184
+ //# sourceMappingURL=ThroughputCalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThroughputCalculator.js","sources":["../../../../../src/cluster/modules/ThroughputCalculator.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as cluster from 'cluster';
1
+ import clusterModule from 'cluster';
2
2
  import * as os from 'os';
3
3
  import { EventEmitter } from 'events';
4
4
  import pidusage from 'pidusage';
@@ -22,7 +22,7 @@ class WorkerManager extends EventEmitter {
22
22
  this.lastRestartTime = new Map();
23
23
  this.isShuttingDown = false;
24
24
  this.shutdownPromise = null;
25
- if (!cluster.isPrimary && !cluster.isMaster) {
25
+ if (!clusterModule.isPrimary && !clusterModule.isMaster) {
26
26
  throw new Error("WorkerManager can only be instantiated in the primary process");
27
27
  }
28
28
  this.config = config;
@@ -80,23 +80,23 @@ class WorkerManager extends EventEmitter {
80
80
  auditLog: true,
81
81
  errorHandling: "graceful",
82
82
  });
83
- cluster.on("fork", safeHandler((worker) => {
83
+ clusterModule.on("fork", safeHandler((worker) => {
84
84
  this.handleWorkerEvent("fork", worker);
85
85
  }));
86
- cluster.on("online", safeHandler((worker) => {
86
+ clusterModule.on("online", safeHandler((worker) => {
87
87
  this.handleWorkerEvent("online", worker);
88
88
  }));
89
- cluster.on("listening", safeHandler((worker, address) => {
89
+ clusterModule.on("listening", safeHandler((worker, address) => {
90
90
  this.handleWorkerEvent("listening", worker);
91
91
  }));
92
- cluster.on("disconnect", safeHandler((worker) => {
92
+ clusterModule.on("disconnect", safeHandler((worker) => {
93
93
  this.handleWorkerEvent("disconnect", worker);
94
94
  }));
95
- cluster.on("exit", safeHandler((worker, code, signal) => {
95
+ clusterModule.on("exit", safeHandler((worker, code, signal) => {
96
96
  this.handleWorkerEvent("exit", worker, code, signal);
97
97
  }));
98
98
  // Handle worker messages for IPC communication
99
- cluster.on("message", safeHandler((worker, message) => {
99
+ clusterModule.on("message", safeHandler((worker, message) => {
100
100
  this.handleWorkerMessage(worker, message);
101
101
  }));
102
102
  }
@@ -364,7 +364,7 @@ class WorkerManager extends EventEmitter {
364
364
  * Start a single worker with enhanced error handling
365
365
  */
366
366
  async startSingleWorker() {
367
- if (!cluster.isPrimary && !cluster.isMaster) {
367
+ if (!clusterModule.isPrimary && !clusterModule.isMaster) {
368
368
  throw new Error("Cannot start worker from worker process");
369
369
  }
370
370
  if (this.isShuttingDown) {
@@ -374,7 +374,7 @@ class WorkerManager extends EventEmitter {
374
374
  throw new Error(`Maximum worker limit reached (${this.workerPool.maxSize})`);
375
375
  }
376
376
  try {
377
- const worker = cluster.fork();
377
+ const worker = clusterModule.fork();
378
378
  const workerId = this.getWorkerId(worker);
379
379
  // Wait for worker to come online
380
380
  await this.waitForWorkerOnline(worker, workerId);
@@ -460,7 +460,7 @@ class WorkerManager extends EventEmitter {
460
460
  * Scale worker pool to target size
461
461
  */
462
462
  async scaleWorkers(targetSize) {
463
- if (!cluster.isPrimary && !cluster.isMaster) {
463
+ if (!clusterModule.isPrimary && !clusterModule.isMaster) {
464
464
  throw new Error("Cannot scale workers from worker process");
465
465
  }
466
466
  if (this.isShuttingDown) {
@@ -1095,7 +1095,7 @@ class WorkerManager extends EventEmitter {
1095
1095
  await new Promise((resolve) => setTimeout(resolve, restartDelay));
1096
1096
  try {
1097
1097
  // Fork new worker
1098
- const newWorker = cluster.fork();
1098
+ const newWorker = clusterModule.fork();
1099
1099
  const newWorkerId = this.getWorkerId(newWorker);
1100
1100
  // Transfer restart history to new worker
1101
1101
  this.restartCounts.set(newWorkerId, currentRestarts + 1);
@@ -1119,7 +1119,7 @@ class WorkerManager extends EventEmitter {
1119
1119
  * Start workers with intelligent batching
1120
1120
  */
1121
1121
  async startWorkers(count) {
1122
- if (!cluster.isPrimary && !cluster.isMaster) {
1122
+ if (!clusterModule.isPrimary && !clusterModule.isMaster) {
1123
1123
  throw new Error("startWorkers can only be called from the primary process");
1124
1124
  }
1125
1125
  const workerCount = count || this.workerPool.targetSize;
@@ -1147,7 +1147,7 @@ class WorkerManager extends EventEmitter {
1147
1147
  */
1148
1148
  async startSingleWorkerInternal(workerNum, totalWorkers) {
1149
1149
  try {
1150
- const worker = cluster.fork();
1150
+ const worker = clusterModule.fork();
1151
1151
  const workerId = this.getWorkerId(worker);
1152
1152
  logger.info("cluster", `Started worker ${workerNum}/${totalWorkers} (ID: ${workerId}, PID: ${worker.process.pid})`);
1153
1153
  // Wait for worker to come online with timeout