xypriss 1.2.4 → 1.3.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 (109) hide show
  1. package/README.md +51 -3
  2. package/dist/cjs/mods/security/src/components/cache/index.js +1 -1
  3. package/dist/cjs/shared/logger/Logger.js +2 -0
  4. package/dist/cjs/shared/logger/Logger.js.map +1 -1
  5. package/dist/cjs/src/cluster/bun-cluster-manager.js +1567 -0
  6. package/dist/cjs/src/cluster/bun-cluster-manager.js.map +1 -0
  7. package/dist/cjs/src/cluster/cluster-manager.js +1 -1
  8. package/dist/cjs/src/cluster/cluster-manager.js.map +1 -1
  9. package/dist/cjs/src/cluster/index.js +25 -6
  10. package/dist/cjs/src/cluster/index.js.map +1 -1
  11. package/dist/cjs/src/cluster/memory-manager.js +486 -0
  12. package/dist/cjs/src/cluster/memory-manager.js.map +1 -0
  13. package/dist/cjs/src/cluster/modules/BunIPCManager.js +603 -0
  14. package/dist/cjs/src/cluster/modules/BunIPCManager.js.map +1 -0
  15. package/dist/cjs/src/cluster/modules/ClusterFactory.js +22 -1
  16. package/dist/cjs/src/cluster/modules/ClusterFactory.js.map +1 -1
  17. package/dist/cjs/src/cluster/modules/CpuMonitor.js +658 -0
  18. package/dist/cjs/src/cluster/modules/CpuMonitor.js.map +1 -0
  19. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +257 -0
  20. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -0
  21. package/dist/cjs/src/cluster/modules/ProcessMonitor.js +513 -0
  22. package/dist/cjs/src/cluster/modules/ProcessMonitor.js.map +1 -0
  23. package/dist/cjs/src/plugins/server-maintenance-plugin.js +79 -14
  24. package/dist/cjs/src/plugins/server-maintenance-plugin.js.map +1 -1
  25. package/dist/cjs/src/server/FastServer.js +64 -43
  26. package/dist/cjs/src/server/FastServer.js.map +1 -1
  27. package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +226 -10
  28. package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
  29. package/dist/cjs/src/server/const/Cluster.config.js +174 -31
  30. package/dist/cjs/src/server/const/Cluster.config.js.map +1 -1
  31. package/dist/cjs/src/server/const/default.js +11 -2
  32. package/dist/cjs/src/server/const/default.js.map +1 -1
  33. package/dist/cjs/src/server/utils/PortManager.js +26 -15
  34. package/dist/cjs/src/server/utils/PortManager.js.map +1 -1
  35. package/dist/esm/mods/security/src/components/cache/index.js +1 -1
  36. package/dist/esm/shared/logger/Logger.js +2 -0
  37. package/dist/esm/shared/logger/Logger.js.map +1 -1
  38. package/dist/esm/src/cluster/bun-cluster-manager.js +1565 -0
  39. package/dist/esm/src/cluster/bun-cluster-manager.js.map +1 -0
  40. package/dist/esm/src/cluster/cluster-manager.js +1 -1
  41. package/dist/esm/src/cluster/cluster-manager.js.map +1 -1
  42. package/dist/esm/src/cluster/index.js +25 -6
  43. package/dist/esm/src/cluster/index.js.map +1 -1
  44. package/dist/esm/src/cluster/memory-manager.js +484 -0
  45. package/dist/esm/src/cluster/memory-manager.js.map +1 -0
  46. package/dist/esm/src/cluster/modules/BunIPCManager.js +601 -0
  47. package/dist/esm/src/cluster/modules/BunIPCManager.js.map +1 -0
  48. package/dist/esm/src/cluster/modules/ClusterFactory.js +22 -1
  49. package/dist/esm/src/cluster/modules/ClusterFactory.js.map +1 -1
  50. package/dist/esm/src/cluster/modules/CpuMonitor.js +656 -0
  51. package/dist/esm/src/cluster/modules/CpuMonitor.js.map +1 -0
  52. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +255 -0
  53. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -0
  54. package/dist/esm/src/cluster/modules/ProcessMonitor.js +511 -0
  55. package/dist/esm/src/cluster/modules/ProcessMonitor.js.map +1 -0
  56. package/dist/esm/src/plugins/server-maintenance-plugin.js +79 -14
  57. package/dist/esm/src/plugins/server-maintenance-plugin.js.map +1 -1
  58. package/dist/esm/src/server/FastServer.js +64 -43
  59. package/dist/esm/src/server/FastServer.js.map +1 -1
  60. package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +226 -10
  61. package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
  62. package/dist/esm/src/server/const/Cluster.config.js +174 -31
  63. package/dist/esm/src/server/const/Cluster.config.js.map +1 -1
  64. package/dist/esm/src/server/const/default.js +11 -2
  65. package/dist/esm/src/server/const/default.js.map +1 -1
  66. package/dist/esm/src/server/utils/PortManager.js +26 -15
  67. package/dist/esm/src/server/utils/PortManager.js.map +1 -1
  68. package/dist/index.d.ts +90 -2
  69. package/package.json +6 -1
  70. package/dist/cjs/src/plugins/modules/network/index.js +0 -120
  71. package/dist/cjs/src/plugins/modules/network/index.js.map +0 -1
  72. package/dist/cjs/src/server/plugins/PluginEngine.js +0 -378
  73. package/dist/cjs/src/server/plugins/PluginEngine.js.map +0 -1
  74. package/dist/cjs/src/server/plugins/PluginRegistry.js +0 -339
  75. package/dist/cjs/src/server/plugins/PluginRegistry.js.map +0 -1
  76. package/dist/cjs/src/server/plugins/builtin/JWTAuthPlugin.js +0 -591
  77. package/dist/cjs/src/server/plugins/builtin/JWTAuthPlugin.js.map +0 -1
  78. package/dist/cjs/src/server/plugins/builtin/ResponseTimePlugin.js +0 -413
  79. package/dist/cjs/src/server/plugins/builtin/ResponseTimePlugin.js.map +0 -1
  80. package/dist/cjs/src/server/plugins/builtin/SmartCachePlugin.js +0 -843
  81. package/dist/cjs/src/server/plugins/builtin/SmartCachePlugin.js.map +0 -1
  82. package/dist/cjs/src/server/plugins/core/CachePlugin.js +0 -1975
  83. package/dist/cjs/src/server/plugins/core/CachePlugin.js.map +0 -1
  84. package/dist/cjs/src/server/plugins/core/PerformancePlugin.js +0 -894
  85. package/dist/cjs/src/server/plugins/core/PerformancePlugin.js.map +0 -1
  86. package/dist/cjs/src/server/plugins/core/SecurityPlugin.js +0 -799
  87. package/dist/cjs/src/server/plugins/core/SecurityPlugin.js.map +0 -1
  88. package/dist/cjs/src/server/plugins/types/PluginTypes.js +0 -47
  89. package/dist/cjs/src/server/plugins/types/PluginTypes.js.map +0 -1
  90. package/dist/esm/src/plugins/modules/network/index.js +0 -109
  91. package/dist/esm/src/plugins/modules/network/index.js.map +0 -1
  92. package/dist/esm/src/server/plugins/PluginEngine.js +0 -376
  93. package/dist/esm/src/server/plugins/PluginEngine.js.map +0 -1
  94. package/dist/esm/src/server/plugins/PluginRegistry.js +0 -337
  95. package/dist/esm/src/server/plugins/PluginRegistry.js.map +0 -1
  96. package/dist/esm/src/server/plugins/builtin/JWTAuthPlugin.js +0 -589
  97. package/dist/esm/src/server/plugins/builtin/JWTAuthPlugin.js.map +0 -1
  98. package/dist/esm/src/server/plugins/builtin/ResponseTimePlugin.js +0 -411
  99. package/dist/esm/src/server/plugins/builtin/ResponseTimePlugin.js.map +0 -1
  100. package/dist/esm/src/server/plugins/builtin/SmartCachePlugin.js +0 -841
  101. package/dist/esm/src/server/plugins/builtin/SmartCachePlugin.js.map +0 -1
  102. package/dist/esm/src/server/plugins/core/CachePlugin.js +0 -1973
  103. package/dist/esm/src/server/plugins/core/CachePlugin.js.map +0 -1
  104. package/dist/esm/src/server/plugins/core/PerformancePlugin.js +0 -872
  105. package/dist/esm/src/server/plugins/core/PerformancePlugin.js.map +0 -1
  106. package/dist/esm/src/server/plugins/core/SecurityPlugin.js +0 -797
  107. package/dist/esm/src/server/plugins/core/SecurityPlugin.js.map +0 -1
  108. package/dist/esm/src/server/plugins/types/PluginTypes.js +0 -47
  109. package/dist/esm/src/server/plugins/types/PluginTypes.js.map +0 -1
@@ -0,0 +1,484 @@
1
+ import { EventEmitter } from 'events';
2
+ import { logger } from '../../shared/logger/Logger.js';
3
+ import { ProcessMonitor } from './modules/ProcessMonitor.js';
4
+ import { CrossPlatformMemory } from './modules/CrossPlatformMemory.js';
5
+
6
+ /**
7
+ * Memory management utilities for cluster operations
8
+ */
9
+ /**
10
+ * Advanced memory management for cluster operations using ProcessMonitor
11
+ */
12
+ class MemoryManager extends EventEmitter {
13
+ constructor(config) {
14
+ super();
15
+ this.memoryHistory = new Map();
16
+ this.lastGCHint = new Map();
17
+ this.isLowMemoryMode = false;
18
+ this.config = config || {};
19
+ this.processMonitor = new ProcessMonitor();
20
+ this.crossPlatformMemory = new CrossPlatformMemory(true); // Enable fallback
21
+ this.isLowMemoryMode =
22
+ config?.performanceOptimization?.lowMemoryMode || false;
23
+ // Log which memory detection method is being used
24
+ if (this.crossPlatformMemory.isCliAvailable()) {
25
+ logger.info("cluster", "MemoryManager initialized with CrossPlatformMemory CLI");
26
+ }
27
+ else {
28
+ logger.info("cluster", "MemoryManager initialized with ProcessMonitor fallback");
29
+ }
30
+ }
31
+ /**
32
+ * Start memory monitoring
33
+ */
34
+ startMonitoring() {
35
+ const interval = this.config?.memoryManagement?.memoryCheckInterval || 30000;
36
+ logger.info("cluster", `Starting memory monitoring (interval: ${interval}ms)`);
37
+ this.monitoringInterval = setInterval(async () => {
38
+ await this.checkMemoryUsage();
39
+ }, interval);
40
+ // Initial check
41
+ this.checkMemoryUsage();
42
+ }
43
+ /**
44
+ * Stop memory monitoring
45
+ */
46
+ stopMonitoring() {
47
+ if (this.monitoringInterval) {
48
+ clearInterval(this.monitoringInterval);
49
+ this.monitoringInterval = undefined;
50
+ logger.info("cluster", "Memory monitoring stopped");
51
+ }
52
+ }
53
+ /**
54
+ * Get system memory statistics using CrossPlatformMemory CLI with ProcessMonitor fallback
55
+ */
56
+ async getSystemMemoryStats() {
57
+ try {
58
+ // Try CrossPlatformMemory CLI first for most accurate results
59
+ if (this.crossPlatformMemory.isCliAvailable()) {
60
+ const memInfo = await this.crossPlatformMemory.getMemoryInfo();
61
+ return {
62
+ totalMemory: memInfo.totalMemory,
63
+ usedMemory: memInfo.usedMemory,
64
+ freeMemory: memInfo.availableMemory, // Use available memory for applications
65
+ usagePercentage: memInfo.usagePercentage,
66
+ swapUsed: memInfo.swapUsed,
67
+ swapTotal: memInfo.swapTotal,
68
+ swapPercentage: memInfo.swapTotal > 0
69
+ ? (memInfo.swapUsed / memInfo.swapTotal) * 100
70
+ : 0,
71
+ };
72
+ }
73
+ // Fallback to ProcessMonitor
74
+ this.systemStats = await this.processMonitor.getSystemStats();
75
+ const { memory, swap } = this.systemStats;
76
+ return {
77
+ totalMemory: memory.total,
78
+ usedMemory: memory.used,
79
+ freeMemory: memory.available || memory.free, // Use available memory when possible
80
+ usagePercentage: memory.usagePercentage,
81
+ swapUsed: swap.used,
82
+ swapTotal: swap.total,
83
+ swapPercentage: swap.usagePercentage,
84
+ };
85
+ }
86
+ catch (error) {
87
+ logger.error("cluster", "Failed to get system memory stats from both CLI and ProcessMonitor:", error);
88
+ // Final fallback to basic OS stats
89
+ const os = require("os");
90
+ const totalMemory = os.totalmem();
91
+ const freeMemory = os.freemem();
92
+ const usedMemory = totalMemory - freeMemory;
93
+ const usagePercentage = (usedMemory / totalMemory) * 100;
94
+ return {
95
+ totalMemory,
96
+ usedMemory,
97
+ freeMemory,
98
+ usagePercentage,
99
+ swapUsed: 0,
100
+ swapTotal: 0,
101
+ swapPercentage: 0,
102
+ };
103
+ }
104
+ }
105
+ /**
106
+ * Get swap memory information using platform-specific methods
107
+ */
108
+ getSwapMemoryInfo() {
109
+ try {
110
+ if (process.platform === "linux") {
111
+ return this.getLinuxSwapInfo();
112
+ }
113
+ else if (process.platform === "darwin") {
114
+ return this.getMacOSSwapInfo();
115
+ }
116
+ else if (process.platform === "win32") {
117
+ return this.getWindowsSwapInfo();
118
+ }
119
+ else {
120
+ return { swapUsed: 0, swapTotal: 0, swapPercentage: 0 };
121
+ }
122
+ }
123
+ catch (error) {
124
+ logger.warn("cluster", "Failed to get swap memory info:", error);
125
+ return { swapUsed: 0, swapTotal: 0, swapPercentage: 0 };
126
+ }
127
+ }
128
+ /**
129
+ * Get swap information on Linux
130
+ */
131
+ getLinuxSwapInfo() {
132
+ try {
133
+ const fs = require("fs");
134
+ const meminfo = fs.readFileSync("/proc/meminfo", "utf8");
135
+ const swapTotalMatch = meminfo.match(/SwapTotal:\s+(\d+)\s+kB/);
136
+ const swapFreeMatch = meminfo.match(/SwapFree:\s+(\d+)\s+kB/);
137
+ const swapTotal = swapTotalMatch
138
+ ? parseInt(swapTotalMatch[1]) * 1024
139
+ : 0;
140
+ const swapFree = swapFreeMatch
141
+ ? parseInt(swapFreeMatch[1]) * 1024
142
+ : 0;
143
+ const swapUsed = swapTotal - swapFree;
144
+ const swapPercentage = swapTotal > 0 ? (swapUsed / swapTotal) * 100 : 0;
145
+ return { swapUsed, swapTotal, swapPercentage };
146
+ }
147
+ catch (error) {
148
+ throw new Error(`Failed to get Linux swap info: ${error}`);
149
+ }
150
+ }
151
+ /**
152
+ * Get swap information on macOS
153
+ */
154
+ getMacOSSwapInfo() {
155
+ try {
156
+ const { execSync } = require("child_process");
157
+ const swapUsage = execSync("sysctl vm.swapusage", {
158
+ encoding: "utf8",
159
+ });
160
+ // Parse output like: vm.swapusage: total = 2048.00M used = 617.75M free = 1430.25M (encrypted)
161
+ const totalMatch = swapUsage.match(/total = ([\d.]+)([MG])/);
162
+ const usedMatch = swapUsage.match(/used = ([\d.]+)([MG])/);
163
+ let swapTotal = 0;
164
+ let swapUsed = 0;
165
+ if (totalMatch) {
166
+ const value = parseFloat(totalMatch[1]);
167
+ const unit = totalMatch[2];
168
+ swapTotal =
169
+ unit === "G"
170
+ ? value * 1024 * 1024 * 1024
171
+ : value * 1024 * 1024;
172
+ }
173
+ if (usedMatch) {
174
+ const value = parseFloat(usedMatch[1]);
175
+ const unit = usedMatch[2];
176
+ swapUsed =
177
+ unit === "G"
178
+ ? value * 1024 * 1024 * 1024
179
+ : value * 1024 * 1024;
180
+ }
181
+ const swapPercentage = swapTotal > 0 ? (swapUsed / swapTotal) * 100 : 0;
182
+ return { swapUsed, swapTotal, swapPercentage };
183
+ }
184
+ catch (error) {
185
+ throw new Error(`Failed to get macOS swap info: ${error}`);
186
+ }
187
+ }
188
+ /**
189
+ * Get swap information on Windows
190
+ */
191
+ getWindowsSwapInfo() {
192
+ try {
193
+ const { execSync } = require("child_process");
194
+ // Use wmic to get page file information
195
+ const pageFileInfo = execSync("wmic pagefile get Size,Usage /format:csv", { encoding: "utf8" });
196
+ const lines = pageFileInfo
197
+ .split("\n")
198
+ .filter((line) => line.trim() && !line.includes("Node"));
199
+ let totalSize = 0;
200
+ let totalUsage = 0;
201
+ for (const line of lines) {
202
+ const parts = line.split(",");
203
+ if (parts.length >= 3) {
204
+ const size = parseInt(parts[1]) || 0;
205
+ const usage = parseInt(parts[2]) || 0;
206
+ totalSize += size;
207
+ totalUsage += usage;
208
+ }
209
+ }
210
+ const swapTotal = totalSize * 1024 * 1024; // Convert MB to bytes
211
+ const swapUsed = totalUsage * 1024 * 1024;
212
+ const swapPercentage = swapTotal > 0 ? (swapUsed / swapTotal) * 100 : 0;
213
+ return { swapUsed, swapTotal, swapPercentage };
214
+ }
215
+ catch (error) {
216
+ throw new Error(`Failed to get Windows swap info: ${error}`);
217
+ }
218
+ }
219
+ /**
220
+ * Get worker memory statistics using actual process monitoring
221
+ */
222
+ async getWorkerMemoryStats(workerId, pid) {
223
+ try {
224
+ const processStats = await this.processMonitor.getProcessStats(pid);
225
+ return {
226
+ workerId,
227
+ pid,
228
+ memoryUsage: {
229
+ rss: processStats.memory.rss,
230
+ heapTotal: processStats.memory.heapTotal,
231
+ heapUsed: processStats.memory.heapUsed,
232
+ external: processStats.memory.external,
233
+ arrayBuffers: processStats.memory.arrayBuffers,
234
+ },
235
+ cpuUsage: processStats.cpu.usage,
236
+ uptime: processStats.uptime,
237
+ };
238
+ }
239
+ catch (error) {
240
+ logger.error("cluster", `Failed to get memory stats for worker ${workerId} (PID: ${pid}):`, error);
241
+ // Return minimal stats on error
242
+ return {
243
+ workerId,
244
+ pid,
245
+ memoryUsage: {
246
+ rss: 0,
247
+ heapTotal: 0,
248
+ heapUsed: 0,
249
+ external: 0,
250
+ arrayBuffers: 0,
251
+ },
252
+ cpuUsage: 0,
253
+ uptime: 0,
254
+ };
255
+ }
256
+ }
257
+ /**
258
+ * Check if memory usage is within limits
259
+ */
260
+ checkMemoryLimits(workerId, memoryUsage) {
261
+ const maxMemory = this.parseMemoryString(this.config?.maxMemoryPerWorker || "1GB");
262
+ const warningThreshold = this.config?.memoryManagement?.memoryWarningThreshold || 80;
263
+ const criticalThreshold = this.config?.memoryManagement?.memoryCriticalThreshold || 95;
264
+ const usagePercentage = (memoryUsage / maxMemory) * 100;
265
+ if (usagePercentage >= criticalThreshold) {
266
+ return {
267
+ withinLimits: false,
268
+ action: this.config?.enforcement?.enforceHardLimits
269
+ ? "restart"
270
+ : "scale_down",
271
+ message: `Worker ${workerId} memory usage critical: ${usagePercentage.toFixed(1)}%`,
272
+ };
273
+ }
274
+ if (usagePercentage >= warningThreshold) {
275
+ return {
276
+ withinLimits: true,
277
+ action: "warning",
278
+ message: `Worker ${workerId} memory usage high: ${usagePercentage.toFixed(1)}%`,
279
+ };
280
+ }
281
+ return {
282
+ withinLimits: true,
283
+ action: "none",
284
+ message: `Worker ${workerId} memory usage normal: ${usagePercentage.toFixed(1)}%`,
285
+ };
286
+ }
287
+ /**
288
+ * Detect memory leaks in workers
289
+ */
290
+ detectMemoryLeak(workerId, memoryUsage) {
291
+ if (!this.config?.memoryManagement?.memoryLeakDetection) {
292
+ return false;
293
+ }
294
+ const history = this.memoryHistory.get(workerId) || [];
295
+ history.push(memoryUsage);
296
+ // Keep only last 10 measurements
297
+ if (history.length > 10) {
298
+ history.shift();
299
+ }
300
+ this.memoryHistory.set(workerId, history);
301
+ // Detect consistent memory growth
302
+ if (history.length >= 5) {
303
+ const trend = this.calculateMemoryTrend(history);
304
+ const leakThreshold = 0.1; // 10% consistent growth
305
+ if (trend > leakThreshold) {
306
+ logger.warn("cluster", `Memory leak detected in worker ${workerId}`);
307
+ this.emitMemoryAlert({
308
+ type: "leak_detected",
309
+ workerId,
310
+ message: `Memory leak detected in worker ${workerId}`,
311
+ memoryUsage,
312
+ threshold: leakThreshold,
313
+ timestamp: Date.now(),
314
+ action: "restart_worker",
315
+ });
316
+ return true;
317
+ }
318
+ }
319
+ return false;
320
+ }
321
+ /**
322
+ * Suggest garbage collection for worker
323
+ */
324
+ suggestGarbageCollection(workerId) {
325
+ if (!this.config?.memoryManagement?.garbageCollectionHint) {
326
+ return false;
327
+ }
328
+ const lastGC = this.lastGCHint.get(workerId) || 0;
329
+ const gcCooldown = 60000; // 1 minute cooldown
330
+ if (Date.now() - lastGC > gcCooldown) {
331
+ this.lastGCHint.set(workerId, Date.now());
332
+ logger.debug("cluster", `Suggesting garbage collection for worker ${workerId}`);
333
+ return true;
334
+ }
335
+ return false;
336
+ }
337
+ /**
338
+ * Get memory optimization recommendations
339
+ */
340
+ async getMemoryOptimizationRecommendations() {
341
+ const systemStats = await this.getSystemMemoryStats();
342
+ const recommendations = [];
343
+ if (systemStats.usagePercentage > 85) {
344
+ recommendations.push("System memory usage is high (>85%). Consider reducing worker count.");
345
+ }
346
+ if (systemStats.usagePercentage > 95) {
347
+ recommendations.push("Critical memory usage! Enable low memory mode immediately.");
348
+ }
349
+ if (!this.config?.performanceOptimization?.lowMemoryMode &&
350
+ systemStats.usagePercentage > 70) {
351
+ recommendations.push("Consider enabling low memory mode for better resource utilization.");
352
+ }
353
+ if (!this.config?.memoryManagement?.memoryLeakDetection) {
354
+ recommendations.push("Enable memory leak detection for better stability.");
355
+ }
356
+ const maxWorkers = await this.calculateOptimalWorkerCount(systemStats);
357
+ return {
358
+ recommendations,
359
+ canEnableLowMemoryMode: systemStats.usagePercentage > 70,
360
+ suggestedWorkerCount: maxWorkers,
361
+ };
362
+ }
363
+ /**
364
+ * Calculate optimal worker count based on available memory
365
+ */
366
+ async calculateOptimalWorkerCount(systemStats) {
367
+ const stats = systemStats || (await this.getSystemMemoryStats());
368
+ const maxMemoryPerWorker = this.parseMemoryString(this.config?.maxMemoryPerWorker || "512MB");
369
+ const reservedMemory = this.parseMemoryString(this.config?.memoryManagement?.memoryReservation || "1GB");
370
+ const availableMemory = stats.totalMemory - reservedMemory;
371
+ const maxWorkers = Math.floor(availableMemory / maxMemoryPerWorker);
372
+ // Ensure at least 1 worker, but respect system limits
373
+ return Math.max(1, Math.min(maxWorkers, require("os").cpus().length));
374
+ }
375
+ /**
376
+ * Enable low memory mode
377
+ */
378
+ enableLowMemoryMode() {
379
+ this.isLowMemoryMode = true;
380
+ logger.info("cluster", "Low memory mode enabled");
381
+ this.emit("low_memory_mode_enabled", {
382
+ timestamp: Date.now(),
383
+ systemStats: this.getSystemMemoryStats(),
384
+ });
385
+ }
386
+ /**
387
+ * Disable low memory mode
388
+ */
389
+ disableLowMemoryMode() {
390
+ this.isLowMemoryMode = false;
391
+ logger.info("cluster", "Low memory mode disabled");
392
+ this.emit("low_memory_mode_disabled", {
393
+ timestamp: Date.now(),
394
+ systemStats: this.getSystemMemoryStats(),
395
+ });
396
+ }
397
+ /**
398
+ * Check current memory usage and emit alerts if needed
399
+ */
400
+ async checkMemoryUsage() {
401
+ const systemStats = await this.getSystemMemoryStats();
402
+ const warningThreshold = this.config?.memoryManagement?.memoryWarningThreshold || 80;
403
+ const criticalThreshold = this.config?.memoryManagement?.memoryCriticalThreshold || 95;
404
+ if (systemStats.usagePercentage >= criticalThreshold) {
405
+ this.emitMemoryAlert({
406
+ type: "critical",
407
+ message: `Critical system memory usage: ${systemStats.usagePercentage.toFixed(1)}%`,
408
+ memoryUsage: systemStats.usedMemory,
409
+ threshold: criticalThreshold,
410
+ timestamp: Date.now(),
411
+ action: "scale_down",
412
+ });
413
+ if (!this.isLowMemoryMode) {
414
+ this.enableLowMemoryMode();
415
+ }
416
+ }
417
+ else if (systemStats.usagePercentage >= warningThreshold) {
418
+ this.emitMemoryAlert({
419
+ type: "warning",
420
+ message: `High system memory usage: ${systemStats.usagePercentage.toFixed(1)}%`,
421
+ memoryUsage: systemStats.usedMemory,
422
+ threshold: warningThreshold,
423
+ timestamp: Date.now(),
424
+ action: "alert_only",
425
+ });
426
+ }
427
+ else if (this.isLowMemoryMode &&
428
+ systemStats.usagePercentage < warningThreshold - 10) {
429
+ // Exit low memory mode if usage drops significantly
430
+ this.disableLowMemoryMode();
431
+ }
432
+ }
433
+ /**
434
+ * Parse memory string to bytes
435
+ */
436
+ parseMemoryString(memoryStr) {
437
+ const units = {
438
+ B: 1,
439
+ KB: 1024,
440
+ MB: 1024 * 1024,
441
+ GB: 1024 * 1024 * 1024,
442
+ TB: 1024 * 1024 * 1024 * 1024,
443
+ };
444
+ const match = memoryStr.match(/^(\d+(?:\.\d+)?)\s*([KMGT]?B)$/i);
445
+ if (!match) {
446
+ throw new Error(`Invalid memory format: ${memoryStr}`);
447
+ }
448
+ const value = parseFloat(match[1]);
449
+ const unit = match[2].toUpperCase();
450
+ return value * (units[unit] || 1);
451
+ }
452
+ /**
453
+ * Calculate memory trend from history
454
+ */
455
+ calculateMemoryTrend(history) {
456
+ if (history.length < 2)
457
+ return 0;
458
+ const first = history[0];
459
+ const last = history[history.length - 1];
460
+ return (last - first) / first;
461
+ }
462
+ // Removed - using ProcessMonitor module instead
463
+ /**
464
+ * Emit memory alert
465
+ */
466
+ emitMemoryAlert(alert) {
467
+ logger.warn("cluster", `Memory Alert: ${alert.message}`);
468
+ this.emit("memory_alert", alert);
469
+ }
470
+ /**
471
+ * Clean up resources and stop monitoring
472
+ */
473
+ destroy() {
474
+ this.stopMonitoring();
475
+ this.processMonitor.destroy();
476
+ this.memoryHistory.clear();
477
+ this.lastGCHint.clear();
478
+ this.removeAllListeners();
479
+ logger.info("cluster", "MemoryManager destroyed");
480
+ }
481
+ }
482
+
483
+ export { MemoryManager };
484
+ //# sourceMappingURL=memory-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-manager.js","sources":["../../../../src/cluster/memory-manager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}