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.
- package/README.md +232 -254
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js +10 -0
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js +10 -0
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
- package/dist/cjs/mods/security/src/components/cache/index.js +10 -74
- package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/index.js +9 -0
- package/dist/cjs/mods/security/src/components/fortified-function/index.js.map +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js +10 -0
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
- package/dist/cjs/mods/security/src/core/crypto.js +14 -0
- package/dist/cjs/mods/security/src/core/crypto.js.map +1 -1
- package/dist/cjs/mods/security/src/index.js +10 -4
- package/dist/cjs/mods/security/src/index.js.map +1 -1
- package/dist/cjs/shared/logger/Logger.js +374 -29
- package/dist/cjs/shared/logger/Logger.js.map +1 -1
- package/dist/cjs/src/cluster/bun-cluster-manager.js +91 -1
- package/dist/cjs/src/cluster/bun-cluster-manager.js.map +1 -1
- package/dist/cjs/src/cluster/cluster-manager.js +15 -3
- package/dist/cjs/src/cluster/cluster-manager.js.map +1 -1
- package/dist/cjs/src/cluster/modules/AutoScaler.js +4 -4
- package/dist/cjs/src/cluster/modules/AutoScaler.js.map +1 -1
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +2 -2
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
- package/dist/cjs/src/cluster/modules/EventLoopMonitor.js +270 -0
- package/dist/cjs/src/cluster/modules/EventLoopMonitor.js.map +1 -0
- package/dist/cjs/src/cluster/modules/GCStatsTracker.js +200 -0
- package/dist/cjs/src/cluster/modules/GCStatsTracker.js.map +1 -0
- package/dist/cjs/src/cluster/modules/HeapStatsCollector.js +111 -0
- package/dist/cjs/src/cluster/modules/HeapStatsCollector.js.map +1 -0
- package/dist/cjs/src/cluster/modules/NetworkTracker.js +162 -0
- package/dist/cjs/src/cluster/modules/NetworkTracker.js.map +1 -0
- package/dist/cjs/src/cluster/modules/ThroughputCalculator.js +186 -0
- package/dist/cjs/src/cluster/modules/ThroughputCalculator.js.map +1 -0
- package/dist/cjs/src/cluster/modules/WorkerManager.js +14 -15
- package/dist/cjs/src/cluster/modules/WorkerManager.js.map +1 -1
- package/dist/cjs/src/cluster/modules/{LoadBalancer.js → strategy/LoadBalancer.js} +1 -1
- package/dist/cjs/src/cluster/modules/strategy/LoadBalancer.js.map +1 -0
- package/dist/cjs/src/index.js +55 -61
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js +281 -0
- package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/index.js +325 -0
- package/dist/cjs/src/middleware/built-in/index.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/sqlInjection.js +335 -0
- package/dist/cjs/src/middleware/built-in/sqlInjection.js.map +1 -0
- package/dist/cjs/src/middleware/safe-json-middleware.js +1 -1
- package/dist/cjs/src/middleware/safe-json-middleware.js.map +1 -1
- package/dist/cjs/src/middleware/security-middleware.js +447 -332
- package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
- package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js +1 -1
- package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -1
- package/dist/cjs/src/plugins/modules/index.js +9 -3
- package/dist/cjs/src/plugins/modules/index.js.map +1 -1
- package/dist/cjs/src/quick-start.js +0 -4
- package/dist/cjs/src/quick-start.js.map +1 -1
- package/dist/cjs/src/server/FastServer.js +94 -412
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/ServerFactory.js +69 -64
- package/dist/cjs/src/server/ServerFactory.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +31 -5
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/PerformanceManager.js +1 -1
- package/dist/cjs/src/server/components/fastapi/PerformanceManager.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/RouteManager.js +0 -82
- package/dist/cjs/src/server/components/fastapi/RouteManager.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/WorkerPoolComponent.js +206 -0
- package/dist/cjs/src/server/components/fastapi/WorkerPoolComponent.js.map +1 -0
- package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js +3 -28
- package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js +265 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js.map +1 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/Logger.js +236 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/cpu-tasks.js +294 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/enhanced-cpu-worker.js +433 -0
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/workers/io-worker.js +1615 -0
- package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js +503 -0
- package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
- package/dist/cjs/src/server/const/default.js +23 -17
- package/dist/cjs/src/server/const/default.js.map +1 -1
- package/dist/cjs/src/server/core/HttpServer.js +500 -0
- package/dist/cjs/src/server/core/HttpServer.js.map +1 -0
- package/dist/cjs/src/server/core/XyprissApp.js +679 -0
- package/dist/cjs/src/server/core/XyprissApp.js.map +1 -0
- package/dist/cjs/src/server/handlers/NotFoundHandler.js +1 -1
- package/dist/cjs/src/server/handlers/NotFoundHandler.js.map +1 -1
- package/dist/cjs/src/server/middleware/MiddlewareManager.js +191 -0
- package/dist/cjs/src/server/middleware/MiddlewareManager.js.map +1 -0
- package/dist/cjs/src/server/routing/Router.js +341 -0
- package/dist/cjs/src/server/routing/Router.js.map +1 -0
- package/dist/cjs/src/server/utils/PortManager.js +1 -0
- package/dist/cjs/src/server/utils/PortManager.js.map +1 -1
- package/dist/cjs/src/server/utils/forceClosePort.js +294 -88
- package/dist/cjs/src/server/utils/forceClosePort.js.map +1 -1
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js +10 -0
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +10 -0
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/index.js +11 -72
- package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/index.js +9 -0
- package/dist/esm/mods/security/src/components/fortified-function/index.js.map +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +10 -0
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
- package/dist/esm/mods/security/src/core/crypto.js +14 -0
- package/dist/esm/mods/security/src/core/crypto.js.map +1 -1
- package/dist/esm/mods/security/src/index.js +11 -2
- package/dist/esm/mods/security/src/index.js.map +1 -1
- package/dist/esm/shared/logger/Logger.js +374 -29
- package/dist/esm/shared/logger/Logger.js.map +1 -1
- package/dist/esm/src/cluster/bun-cluster-manager.js +91 -1
- package/dist/esm/src/cluster/bun-cluster-manager.js.map +1 -1
- package/dist/esm/src/cluster/cluster-manager.js +15 -3
- package/dist/esm/src/cluster/cluster-manager.js.map +1 -1
- package/dist/esm/src/cluster/modules/AutoScaler.js +4 -4
- package/dist/esm/src/cluster/modules/AutoScaler.js.map +1 -1
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +2 -2
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
- package/dist/esm/src/cluster/modules/EventLoopMonitor.js +268 -0
- package/dist/esm/src/cluster/modules/EventLoopMonitor.js.map +1 -0
- package/dist/esm/src/cluster/modules/GCStatsTracker.js +198 -0
- package/dist/esm/src/cluster/modules/GCStatsTracker.js.map +1 -0
- package/dist/esm/src/cluster/modules/HeapStatsCollector.js +109 -0
- package/dist/esm/src/cluster/modules/HeapStatsCollector.js.map +1 -0
- package/dist/esm/src/cluster/modules/NetworkTracker.js +160 -0
- package/dist/esm/src/cluster/modules/NetworkTracker.js.map +1 -0
- package/dist/esm/src/cluster/modules/ThroughputCalculator.js +184 -0
- package/dist/esm/src/cluster/modules/ThroughputCalculator.js.map +1 -0
- package/dist/esm/src/cluster/modules/WorkerManager.js +14 -14
- package/dist/esm/src/cluster/modules/WorkerManager.js.map +1 -1
- package/dist/esm/src/cluster/modules/{LoadBalancer.js → strategy/LoadBalancer.js} +1 -1
- package/dist/esm/src/cluster/modules/strategy/LoadBalancer.js.map +1 -0
- package/dist/esm/src/index.js +41 -11
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js +279 -0
- package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js.map +1 -0
- package/dist/esm/src/middleware/built-in/index.js +323 -0
- package/dist/esm/src/middleware/built-in/index.js.map +1 -0
- package/dist/esm/src/middleware/built-in/sqlInjection.js +333 -0
- package/dist/esm/src/middleware/built-in/sqlInjection.js.map +1 -0
- package/dist/esm/src/middleware/safe-json-middleware.js +1 -1
- package/dist/esm/src/middleware/safe-json-middleware.js.map +1 -1
- package/dist/esm/src/middleware/security-middleware.js +447 -332
- package/dist/esm/src/middleware/security-middleware.js.map +1 -1
- package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js +1 -1
- package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -1
- package/dist/esm/src/plugins/modules/index.js +9 -3
- package/dist/esm/src/plugins/modules/index.js.map +1 -1
- package/dist/esm/src/quick-start.js +0 -4
- package/dist/esm/src/quick-start.js.map +1 -1
- package/dist/esm/src/server/FastServer.js +94 -412
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/ServerFactory.js +70 -61
- package/dist/esm/src/server/ServerFactory.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +31 -5
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/PerformanceManager.js +1 -1
- package/dist/esm/src/server/components/fastapi/PerformanceManager.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/RouteManager.js +0 -82
- package/dist/esm/src/server/components/fastapi/RouteManager.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/WorkerPoolComponent.js +204 -0
- package/dist/esm/src/server/components/fastapi/WorkerPoolComponent.js.map +1 -0
- package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js +2 -27
- package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js +263 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPoolManager.js.map +1 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/Logger.js +236 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/cpu-tasks.js +294 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/enhanced-cpu-worker.js +433 -0
- package/dist/esm/src/server/components/fastapi/modules/UFRP/workers/io-worker.js +1615 -0
- package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js +501 -0
- package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
- package/dist/esm/src/server/const/default.js +23 -17
- package/dist/esm/src/server/const/default.js.map +1 -1
- package/dist/esm/src/server/core/HttpServer.js +498 -0
- package/dist/esm/src/server/core/HttpServer.js.map +1 -0
- package/dist/esm/src/server/core/XyprissApp.js +677 -0
- package/dist/esm/src/server/core/XyprissApp.js.map +1 -0
- package/dist/esm/src/server/handlers/NotFoundHandler.js +1 -1
- package/dist/esm/src/server/handlers/NotFoundHandler.js.map +1 -1
- package/dist/esm/src/server/middleware/MiddlewareManager.js +189 -0
- package/dist/esm/src/server/middleware/MiddlewareManager.js.map +1 -0
- package/dist/esm/src/server/routing/Router.js +339 -0
- package/dist/esm/src/server/routing/Router.js.map +1 -0
- package/dist/esm/src/server/utils/PortManager.js +1 -0
- package/dist/esm/src/server/utils/PortManager.js.map +1 -1
- package/dist/esm/src/server/utils/forceClosePort.js +294 -88
- package/dist/esm/src/server/utils/forceClosePort.js.map +1 -1
- package/dist/index.d.ts +3363 -5311
- package/package.json +39 -28
- package/dist/cjs/src/cluster/index.js +0 -361
- package/dist/cjs/src/cluster/index.js.map +0 -1
- package/dist/cjs/src/cluster/modules/ClusterFactory.js +0 -539
- package/dist/cjs/src/cluster/modules/ClusterFactory.js.map +0 -1
- package/dist/cjs/src/cluster/modules/LoadBalancer.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/UltraFastRequestProcessor.js +0 -668
- package/dist/cjs/src/server/components/fastapi/UltraFastRequestProcessor.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareAPI.js +0 -347
- package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareAPI.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js +0 -204
- package/dist/cjs/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/middlewares/middlewareManager.js +0 -953
- package/dist/cjs/src/server/components/fastapi/middlewares/middlewareManager.js.map +0 -1
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPool.js +0 -56
- package/dist/cjs/src/server/components/fastapi/modules/UFRP/WorkerPool.js.map +0 -1
- package/dist/esm/src/cluster/index.js +0 -339
- package/dist/esm/src/cluster/index.js.map +0 -1
- package/dist/esm/src/cluster/modules/ClusterFactory.js +0 -511
- package/dist/esm/src/cluster/modules/ClusterFactory.js.map +0 -1
- package/dist/esm/src/cluster/modules/LoadBalancer.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/UltraFastRequestProcessor.js +0 -647
- package/dist/esm/src/server/components/fastapi/UltraFastRequestProcessor.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareAPI.js +0 -345
- package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareAPI.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js +0 -202
- package/dist/esm/src/server/components/fastapi/middlewares/MiddlewareMethodsManager.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/middlewares/middlewareManager.js +0 -951
- package/dist/esm/src/server/components/fastapi/middlewares/middlewareManager.js.map +0 -1
- package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPool.js +0 -54
- package/dist/esm/src/server/components/fastapi/modules/UFRP/WorkerPool.js.map +0 -1
|
@@ -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
|
|
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 (!
|
|
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
|
-
|
|
83
|
+
clusterModule.on("fork", safeHandler((worker) => {
|
|
84
84
|
this.handleWorkerEvent("fork", worker);
|
|
85
85
|
}));
|
|
86
|
-
|
|
86
|
+
clusterModule.on("online", safeHandler((worker) => {
|
|
87
87
|
this.handleWorkerEvent("online", worker);
|
|
88
88
|
}));
|
|
89
|
-
|
|
89
|
+
clusterModule.on("listening", safeHandler((worker, address) => {
|
|
90
90
|
this.handleWorkerEvent("listening", worker);
|
|
91
91
|
}));
|
|
92
|
-
|
|
92
|
+
clusterModule.on("disconnect", safeHandler((worker) => {
|
|
93
93
|
this.handleWorkerEvent("disconnect", worker);
|
|
94
94
|
}));
|
|
95
|
-
|
|
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
|
-
|
|
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 (!
|
|
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 =
|
|
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 (!
|
|
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 =
|
|
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 (!
|
|
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 =
|
|
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
|