xypriss 1.2.4 → 1.3.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 +51 -3
- package/dist/cjs/mods/security/src/components/cache/index.js +1 -1
- package/dist/cjs/shared/logger/Logger.js +1 -0
- package/dist/cjs/shared/logger/Logger.js.map +1 -1
- package/dist/cjs/src/cluster/bun-cluster-manager.js +1567 -0
- package/dist/cjs/src/cluster/bun-cluster-manager.js.map +1 -0
- package/dist/cjs/src/cluster/cluster-manager.js +1 -1
- package/dist/cjs/src/cluster/cluster-manager.js.map +1 -1
- package/dist/cjs/src/cluster/index.js +25 -6
- package/dist/cjs/src/cluster/index.js.map +1 -1
- package/dist/cjs/src/cluster/memory-manager.js +463 -0
- package/dist/cjs/src/cluster/memory-manager.js.map +1 -0
- package/dist/cjs/src/cluster/modules/BunIPCManager.js +603 -0
- package/dist/cjs/src/cluster/modules/BunIPCManager.js.map +1 -0
- package/dist/cjs/src/cluster/modules/ClusterFactory.js +22 -1
- package/dist/cjs/src/cluster/modules/ClusterFactory.js.map +1 -1
- package/dist/cjs/src/cluster/modules/CpuMonitor.js +658 -0
- package/dist/cjs/src/cluster/modules/CpuMonitor.js.map +1 -0
- package/dist/cjs/src/cluster/modules/ProcessMonitor.js +513 -0
- package/dist/cjs/src/cluster/modules/ProcessMonitor.js.map +1 -0
- package/dist/cjs/src/plugins/server-maintenance-plugin.js +1 -1
- package/dist/cjs/src/server/FastServer.js +64 -43
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +226 -10
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
- package/dist/cjs/src/server/const/Cluster.config.js +174 -31
- package/dist/cjs/src/server/const/Cluster.config.js.map +1 -1
- package/dist/cjs/src/server/const/default.js +11 -2
- package/dist/cjs/src/server/const/default.js.map +1 -1
- package/dist/cjs/src/server/utils/PortManager.js +26 -15
- package/dist/cjs/src/server/utils/PortManager.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/index.js +1 -1
- package/dist/esm/shared/logger/Logger.js +1 -0
- package/dist/esm/shared/logger/Logger.js.map +1 -1
- package/dist/esm/src/cluster/bun-cluster-manager.js +1565 -0
- package/dist/esm/src/cluster/bun-cluster-manager.js.map +1 -0
- package/dist/esm/src/cluster/cluster-manager.js +1 -1
- package/dist/esm/src/cluster/cluster-manager.js.map +1 -1
- package/dist/esm/src/cluster/index.js +25 -6
- package/dist/esm/src/cluster/index.js.map +1 -1
- package/dist/esm/src/cluster/memory-manager.js +461 -0
- package/dist/esm/src/cluster/memory-manager.js.map +1 -0
- package/dist/esm/src/cluster/modules/BunIPCManager.js +601 -0
- package/dist/esm/src/cluster/modules/BunIPCManager.js.map +1 -0
- package/dist/esm/src/cluster/modules/ClusterFactory.js +22 -1
- package/dist/esm/src/cluster/modules/ClusterFactory.js.map +1 -1
- package/dist/esm/src/cluster/modules/CpuMonitor.js +656 -0
- package/dist/esm/src/cluster/modules/CpuMonitor.js.map +1 -0
- package/dist/esm/src/cluster/modules/ProcessMonitor.js +511 -0
- package/dist/esm/src/cluster/modules/ProcessMonitor.js.map +1 -0
- package/dist/esm/src/plugins/server-maintenance-plugin.js +1 -1
- package/dist/esm/src/server/FastServer.js +64 -43
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +226 -10
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
- package/dist/esm/src/server/const/Cluster.config.js +174 -31
- package/dist/esm/src/server/const/Cluster.config.js.map +1 -1
- package/dist/esm/src/server/const/default.js +11 -2
- package/dist/esm/src/server/const/default.js.map +1 -1
- package/dist/esm/src/server/utils/PortManager.js +26 -15
- package/dist/esm/src/server/utils/PortManager.js.map +1 -1
- package/dist/index.d.ts +78 -1
- package/package.json +3 -1
- package/dist/cjs/src/plugins/modules/network/index.js +0 -120
- package/dist/cjs/src/plugins/modules/network/index.js.map +0 -1
- package/dist/cjs/src/server/plugins/PluginEngine.js +0 -378
- package/dist/cjs/src/server/plugins/PluginEngine.js.map +0 -1
- package/dist/cjs/src/server/plugins/PluginRegistry.js +0 -339
- package/dist/cjs/src/server/plugins/PluginRegistry.js.map +0 -1
- package/dist/cjs/src/server/plugins/builtin/JWTAuthPlugin.js +0 -591
- package/dist/cjs/src/server/plugins/builtin/JWTAuthPlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/builtin/ResponseTimePlugin.js +0 -413
- package/dist/cjs/src/server/plugins/builtin/ResponseTimePlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/builtin/SmartCachePlugin.js +0 -843
- package/dist/cjs/src/server/plugins/builtin/SmartCachePlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/core/CachePlugin.js +0 -1975
- package/dist/cjs/src/server/plugins/core/CachePlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/core/PerformancePlugin.js +0 -894
- package/dist/cjs/src/server/plugins/core/PerformancePlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/core/SecurityPlugin.js +0 -799
- package/dist/cjs/src/server/plugins/core/SecurityPlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/types/PluginTypes.js +0 -47
- package/dist/cjs/src/server/plugins/types/PluginTypes.js.map +0 -1
- package/dist/esm/src/plugins/modules/network/index.js +0 -109
- package/dist/esm/src/plugins/modules/network/index.js.map +0 -1
- package/dist/esm/src/server/plugins/PluginEngine.js +0 -376
- package/dist/esm/src/server/plugins/PluginEngine.js.map +0 -1
- package/dist/esm/src/server/plugins/PluginRegistry.js +0 -337
- package/dist/esm/src/server/plugins/PluginRegistry.js.map +0 -1
- package/dist/esm/src/server/plugins/builtin/JWTAuthPlugin.js +0 -589
- package/dist/esm/src/server/plugins/builtin/JWTAuthPlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/builtin/ResponseTimePlugin.js +0 -411
- package/dist/esm/src/server/plugins/builtin/ResponseTimePlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/builtin/SmartCachePlugin.js +0 -841
- package/dist/esm/src/server/plugins/builtin/SmartCachePlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/core/CachePlugin.js +0 -1973
- package/dist/esm/src/server/plugins/core/CachePlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/core/PerformancePlugin.js +0 -872
- package/dist/esm/src/server/plugins/core/PerformancePlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/core/SecurityPlugin.js +0 -797
- package/dist/esm/src/server/plugins/core/SecurityPlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/types/PluginTypes.js +0 -47
- package/dist/esm/src/server/plugins/types/PluginTypes.js.map +0 -1
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var events = require('events');
|
|
4
|
+
var Logger = require('../../../shared/logger/Logger.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Bun IPC Manager - Inter-Process Communication for Bun Workers
|
|
8
|
+
* Handles message passing between master and worker processes
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Bun IPC Manager for handling communication between master and workers
|
|
12
|
+
*/
|
|
13
|
+
class BunIPCManager extends events.EventEmitter {
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
this.workers = new Map();
|
|
17
|
+
this.messageHandlers = new Map();
|
|
18
|
+
this.pendingResponses = new Map();
|
|
19
|
+
this.MESSAGE_TIMEOUT = 30000; // 30 seconds
|
|
20
|
+
this.HEARTBEAT_INTERVAL = 5000; // 5 seconds
|
|
21
|
+
this.isWorker =
|
|
22
|
+
process.env.CLUSTER_MODE === "true" ||
|
|
23
|
+
process.env.NODE_ENV === "worker";
|
|
24
|
+
this.workerId = process.env.WORKER_ID;
|
|
25
|
+
if (this.isWorker) {
|
|
26
|
+
this.initializeWorkerIPC();
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.initializeMasterIPC();
|
|
30
|
+
}
|
|
31
|
+
Logger.logger.info("ipc", `BunIPCManager initialized in ${this.isWorker ? "worker" : "master"} mode`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize IPC for worker processes
|
|
35
|
+
*/
|
|
36
|
+
initializeWorkerIPC() {
|
|
37
|
+
// Listen for messages from master via stdin
|
|
38
|
+
process.stdin.on("data", (data) => {
|
|
39
|
+
try {
|
|
40
|
+
const messages = data.toString().trim().split("\n");
|
|
41
|
+
for (const messageStr of messages) {
|
|
42
|
+
if (messageStr.trim()) {
|
|
43
|
+
const message = JSON.parse(messageStr);
|
|
44
|
+
this.handleIncomingMessage(message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
Logger.logger.error("ipc", "Failed to parse message from master:", error);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// Start heartbeat
|
|
53
|
+
this.startHeartbeat();
|
|
54
|
+
// Register default handlers
|
|
55
|
+
this.registerHandler("ping", async () => ({
|
|
56
|
+
status: "alive",
|
|
57
|
+
workerId: this.workerId,
|
|
58
|
+
}));
|
|
59
|
+
this.registerHandler("shutdown", async () => {
|
|
60
|
+
Logger.logger.info("ipc", "Received shutdown signal from master");
|
|
61
|
+
process.exit(0);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Initialize IPC for master process
|
|
66
|
+
*/
|
|
67
|
+
initializeMasterIPC() {
|
|
68
|
+
// Master process initialization
|
|
69
|
+
Logger.logger.debug("ipc", "Master IPC initialized");
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Register a worker connection (master only)
|
|
73
|
+
*/
|
|
74
|
+
registerWorker(workerId, subprocess) {
|
|
75
|
+
if (this.isWorker)
|
|
76
|
+
return;
|
|
77
|
+
const connection = {
|
|
78
|
+
id: workerId,
|
|
79
|
+
subprocess,
|
|
80
|
+
isAlive: true,
|
|
81
|
+
lastPing: Date.now(),
|
|
82
|
+
messageQueue: [],
|
|
83
|
+
};
|
|
84
|
+
this.workers.set(workerId, connection);
|
|
85
|
+
// Listen for messages from this worker (Bun-compatible)
|
|
86
|
+
if (subprocess.stdout && typeof subprocess.stdout.on === "function") {
|
|
87
|
+
// Node.js-style subprocess
|
|
88
|
+
subprocess.stdout.on("data", (data) => {
|
|
89
|
+
try {
|
|
90
|
+
const messages = data.toString().trim().split("\n");
|
|
91
|
+
for (const messageStr of messages) {
|
|
92
|
+
if (messageStr.trim() && messageStr.startsWith("{")) {
|
|
93
|
+
const message = JSON.parse(messageStr);
|
|
94
|
+
if (message.from === "worker") {
|
|
95
|
+
this.handleIncomingMessage(message);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// Ignore non-JSON output (regular logs, etc.)
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else if (subprocess.stdout &&
|
|
106
|
+
typeof subprocess.stdout.readable === "function") {
|
|
107
|
+
// Bun-style subprocess - use readable stream
|
|
108
|
+
this._setupBunIPCListener(workerId, subprocess);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Fallback: disable IPC for this worker but don't fail
|
|
112
|
+
Logger.logger.warn("ipc", `Worker ${workerId} subprocess doesn't support IPC communication`);
|
|
113
|
+
connection.isAlive = false;
|
|
114
|
+
}
|
|
115
|
+
Logger.logger.info("ipc", `Worker ${workerId} registered for IPC`);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Setup sophisticated IPC listener for Bun subprocess
|
|
119
|
+
*/
|
|
120
|
+
async _setupBunIPCListener(workerId, subprocess) {
|
|
121
|
+
try {
|
|
122
|
+
Logger.logger.debug("ipc", `Setting up sophisticated Bun IPC listener for worker ${workerId}`);
|
|
123
|
+
const connection = this.workers.get(workerId);
|
|
124
|
+
if (!connection) {
|
|
125
|
+
throw new Error(`Worker connection not found for ${workerId}`);
|
|
126
|
+
}
|
|
127
|
+
// Setup stdout reader for IPC messages
|
|
128
|
+
if (subprocess.stdout) {
|
|
129
|
+
await this._setupBunStdoutReader(workerId, subprocess.stdout, connection);
|
|
130
|
+
}
|
|
131
|
+
// Setup stderr reader for error handling
|
|
132
|
+
if (subprocess.stderr) {
|
|
133
|
+
await this._setupBunStderrReader(workerId, subprocess.stderr);
|
|
134
|
+
}
|
|
135
|
+
// Setup stdin writer for sending messages
|
|
136
|
+
if (subprocess.stdin) {
|
|
137
|
+
connection.subprocess.stdin = subprocess.stdin;
|
|
138
|
+
}
|
|
139
|
+
// Mark connection as alive and ready
|
|
140
|
+
connection.isAlive = true;
|
|
141
|
+
Logger.logger.info("ipc", `Sophisticated Bun IPC setup completed for worker ${workerId}`);
|
|
142
|
+
// Send initial ping to test communication
|
|
143
|
+
setTimeout(async () => {
|
|
144
|
+
try {
|
|
145
|
+
await this.sendToWorker(workerId, "ping", { test: true });
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
Logger.logger.warn("ipc", `Initial ping failed for worker ${workerId}:`, error);
|
|
149
|
+
}
|
|
150
|
+
}, 1000);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
Logger.logger.error("ipc", `Failed to setup sophisticated Bun IPC listener for worker ${workerId}:`, error);
|
|
154
|
+
const connection = this.workers.get(workerId);
|
|
155
|
+
if (connection) {
|
|
156
|
+
connection.isAlive = false;
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Setup Bun stdout reader for IPC messages
|
|
163
|
+
*/
|
|
164
|
+
async _setupBunStdoutReader(workerId, stdout, connection) {
|
|
165
|
+
try {
|
|
166
|
+
const reader = stdout.getReader();
|
|
167
|
+
const decoder = new TextDecoder();
|
|
168
|
+
let buffer = "";
|
|
169
|
+
// Start reading loop
|
|
170
|
+
const readLoop = async () => {
|
|
171
|
+
try {
|
|
172
|
+
while (true) {
|
|
173
|
+
const { done, value } = await reader.read();
|
|
174
|
+
if (done) {
|
|
175
|
+
Logger.logger.debug("ipc", `Stdout stream ended for worker ${workerId}`);
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
// Decode chunk and add to buffer
|
|
179
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
180
|
+
buffer += chunk;
|
|
181
|
+
// Process complete lines
|
|
182
|
+
const lines = buffer.split("\n");
|
|
183
|
+
buffer = lines.pop() || ""; // Keep incomplete line in buffer
|
|
184
|
+
for (const line of lines) {
|
|
185
|
+
if (line.trim()) {
|
|
186
|
+
await this._processBunIPCMessage(workerId, line.trim(), connection);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
if (!connection.isAlive) {
|
|
193
|
+
// Worker is shutting down, this is expected
|
|
194
|
+
Logger.logger.debug("ipc", `Stdout reader stopped for worker ${workerId} (shutdown)`);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
Logger.logger.error("ipc", `Stdout reader error for worker ${workerId}:`, error);
|
|
198
|
+
connection.isAlive = false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
reader.releaseLock();
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
// Start reading in background
|
|
206
|
+
readLoop().catch((error) => {
|
|
207
|
+
Logger.logger.error("ipc", `Stdout read loop failed for worker ${workerId}:`, error);
|
|
208
|
+
connection.isAlive = false;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
Logger.logger.error("ipc", `Failed to setup stdout reader for worker ${workerId}:`, error);
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Setup Bun stderr reader for error monitoring
|
|
218
|
+
*/
|
|
219
|
+
async _setupBunStderrReader(workerId, stderr) {
|
|
220
|
+
try {
|
|
221
|
+
const reader = stderr.getReader();
|
|
222
|
+
const decoder = new TextDecoder();
|
|
223
|
+
// Start reading loop for error monitoring
|
|
224
|
+
const readLoop = async () => {
|
|
225
|
+
try {
|
|
226
|
+
while (true) {
|
|
227
|
+
const { done, value } = await reader.read();
|
|
228
|
+
if (done) {
|
|
229
|
+
Logger.logger.debug("ipc", `Stderr stream ended for worker ${workerId}`);
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
233
|
+
const lines = chunk.split("\n");
|
|
234
|
+
for (const line of lines) {
|
|
235
|
+
if (line.trim()) {
|
|
236
|
+
Logger.logger.warn("ipc", `[${workerId}] stderr: ${line.trim()}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
Logger.logger.debug("ipc", `Stderr reader stopped for worker ${workerId}:`, error);
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
reader.releaseLock();
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
// Start reading in background
|
|
249
|
+
readLoop().catch((error) => {
|
|
250
|
+
Logger.logger.error("ipc", `Stderr read loop failed for worker ${workerId}:`, error);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
Logger.logger.error("ipc", `Failed to setup stderr reader for worker ${workerId}:`, error);
|
|
255
|
+
// Don't throw here as stderr is not critical for IPC
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Process IPC message from Bun worker
|
|
260
|
+
*/
|
|
261
|
+
async _processBunIPCMessage(workerId, messageStr, connection) {
|
|
262
|
+
try {
|
|
263
|
+
// Check if this looks like a JSON IPC message
|
|
264
|
+
if (!messageStr.startsWith("{")) {
|
|
265
|
+
// Regular log output, ignore for IPC
|
|
266
|
+
Logger.logger.debug("ipc", `[${workerId}] log: ${messageStr}`);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const message = JSON.parse(messageStr);
|
|
270
|
+
// Validate message structure
|
|
271
|
+
if (!message.type || !message.from) {
|
|
272
|
+
Logger.logger.debug("ipc", `Invalid IPC message from worker ${workerId}: ${messageStr}`);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
// Update connection heartbeat
|
|
276
|
+
connection.lastPing = Date.now();
|
|
277
|
+
// Handle the message
|
|
278
|
+
await this.handleIncomingMessage(message);
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
// If JSON parsing fails, treat as regular log output
|
|
282
|
+
if (error instanceof SyntaxError) {
|
|
283
|
+
Logger.logger.debug("ipc", `[${workerId}] log: ${messageStr}`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
Logger.logger.error("ipc", `Error processing IPC message from worker ${workerId}:`, error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Unregister a worker connection (master only)
|
|
292
|
+
*/
|
|
293
|
+
unregisterWorker(workerId) {
|
|
294
|
+
if (this.isWorker)
|
|
295
|
+
return;
|
|
296
|
+
const worker = this.workers.get(workerId);
|
|
297
|
+
if (worker) {
|
|
298
|
+
worker.isAlive = false;
|
|
299
|
+
this.workers.delete(workerId);
|
|
300
|
+
Logger.logger.info("ipc", `Worker ${workerId} unregistered from IPC`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Send message to a specific worker (master only)
|
|
305
|
+
*/
|
|
306
|
+
async sendToWorker(workerId, type, data) {
|
|
307
|
+
if (this.isWorker) {
|
|
308
|
+
throw new Error("Workers cannot send messages to other workers directly");
|
|
309
|
+
}
|
|
310
|
+
const worker = this.workers.get(workerId);
|
|
311
|
+
if (!worker || !worker.isAlive) {
|
|
312
|
+
Logger.logger.debug("ipc", `Worker ${workerId} is not available for IPC, returning mock response`);
|
|
313
|
+
// Return a mock response for Bun workers that don't have full IPC support
|
|
314
|
+
return {
|
|
315
|
+
status: "ok",
|
|
316
|
+
message: "IPC not fully supported in Bun mode",
|
|
317
|
+
timestamp: Date.now(),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
const message = {
|
|
321
|
+
id: this.generateMessageId(),
|
|
322
|
+
type,
|
|
323
|
+
data,
|
|
324
|
+
timestamp: Date.now(),
|
|
325
|
+
from: "master",
|
|
326
|
+
to: workerId,
|
|
327
|
+
};
|
|
328
|
+
try {
|
|
329
|
+
return await this.sendMessage(worker.subprocess, message);
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
Logger.logger.debug("ipc", `Failed to send IPC message to worker ${workerId}, returning mock response:`, error);
|
|
333
|
+
// Return a mock response if IPC fails
|
|
334
|
+
return {
|
|
335
|
+
status: "fallback",
|
|
336
|
+
message: "IPC communication failed",
|
|
337
|
+
timestamp: Date.now(),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Broadcast message to all workers (master only)
|
|
343
|
+
*/
|
|
344
|
+
async broadcastToWorkers(type, data) {
|
|
345
|
+
if (this.isWorker) {
|
|
346
|
+
throw new Error("Workers cannot broadcast messages");
|
|
347
|
+
}
|
|
348
|
+
const promises = [];
|
|
349
|
+
for (const [workerId, worker] of this.workers) {
|
|
350
|
+
if (worker.isAlive) {
|
|
351
|
+
promises.push(this.sendToWorker(workerId, type, data).catch((error) => ({
|
|
352
|
+
workerId,
|
|
353
|
+
error: error.message,
|
|
354
|
+
})));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return Promise.all(promises);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Send message to a random worker (master only)
|
|
361
|
+
*/
|
|
362
|
+
async sendToRandomWorker(type, data) {
|
|
363
|
+
if (this.isWorker) {
|
|
364
|
+
throw new Error("Workers cannot send messages to other workers directly");
|
|
365
|
+
}
|
|
366
|
+
const aliveWorkers = Array.from(this.workers.values()).filter((w) => w.isAlive);
|
|
367
|
+
if (aliveWorkers.length === 0) {
|
|
368
|
+
throw new Error("No alive workers available");
|
|
369
|
+
}
|
|
370
|
+
const randomWorker = aliveWorkers[Math.floor(Math.random() * aliveWorkers.length)];
|
|
371
|
+
return this.sendToWorker(randomWorker.id, type, data);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Send message to master (worker only)
|
|
375
|
+
*/
|
|
376
|
+
async sendToMaster(type, data) {
|
|
377
|
+
if (!this.isWorker) {
|
|
378
|
+
throw new Error("Only workers can send messages to master");
|
|
379
|
+
}
|
|
380
|
+
const message = {
|
|
381
|
+
id: this.generateMessageId(),
|
|
382
|
+
type,
|
|
383
|
+
data,
|
|
384
|
+
timestamp: Date.now(),
|
|
385
|
+
from: "worker",
|
|
386
|
+
};
|
|
387
|
+
return this.sendMessage(process.stdout, message);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Register a message handler
|
|
391
|
+
*/
|
|
392
|
+
registerHandler(type, handler) {
|
|
393
|
+
this.messageHandlers.set(type, handler);
|
|
394
|
+
Logger.logger.debug("ipc", `Handler registered for message type: ${type}`);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Unregister a message handler
|
|
398
|
+
*/
|
|
399
|
+
unregisterHandler(type) {
|
|
400
|
+
this.messageHandlers.delete(type);
|
|
401
|
+
Logger.logger.debug("ipc", `Handler unregistered for message type: ${type}`);
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Send a message and wait for response
|
|
405
|
+
*/
|
|
406
|
+
async sendMessage(target, message) {
|
|
407
|
+
return new Promise((resolve, reject) => {
|
|
408
|
+
const correlationId = this.generateMessageId();
|
|
409
|
+
message.correlationId = correlationId;
|
|
410
|
+
// Set up response handler
|
|
411
|
+
const timeout = setTimeout(() => {
|
|
412
|
+
this.pendingResponses.delete(correlationId);
|
|
413
|
+
reject(new Error(`Message timeout after ${this.MESSAGE_TIMEOUT}ms`));
|
|
414
|
+
}, this.MESSAGE_TIMEOUT);
|
|
415
|
+
this.pendingResponses.set(correlationId, {
|
|
416
|
+
resolve,
|
|
417
|
+
reject,
|
|
418
|
+
timeout,
|
|
419
|
+
});
|
|
420
|
+
// Send message
|
|
421
|
+
try {
|
|
422
|
+
const messageStr = JSON.stringify(message) + "\n";
|
|
423
|
+
if (target.write) {
|
|
424
|
+
// Node.js style stream
|
|
425
|
+
target.write(messageStr);
|
|
426
|
+
}
|
|
427
|
+
else if (target.stdin) {
|
|
428
|
+
// Check if it's a Bun WritableStream
|
|
429
|
+
if (target.stdin.getWriter) {
|
|
430
|
+
// Bun WritableStream
|
|
431
|
+
this._sendToBunWritableStream(target.stdin, messageStr).catch((error) => {
|
|
432
|
+
clearTimeout(timeout);
|
|
433
|
+
this.pendingResponses.delete(correlationId);
|
|
434
|
+
reject(error);
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
// Node.js style stdin
|
|
439
|
+
target.stdin.write(messageStr);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
throw new Error("Invalid target for message sending");
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch (error) {
|
|
447
|
+
clearTimeout(timeout);
|
|
448
|
+
this.pendingResponses.delete(correlationId);
|
|
449
|
+
reject(error);
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Send message to Bun WritableStream
|
|
455
|
+
*/
|
|
456
|
+
async _sendToBunWritableStream(stream, message) {
|
|
457
|
+
try {
|
|
458
|
+
const writer = stream.getWriter();
|
|
459
|
+
const encoder = new TextEncoder();
|
|
460
|
+
const data = encoder.encode(message);
|
|
461
|
+
await writer.write(data);
|
|
462
|
+
writer.releaseLock();
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
throw new Error(`Failed to write to Bun WritableStream: ${error}`);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Handle incoming messages
|
|
470
|
+
*/
|
|
471
|
+
async handleIncomingMessage(message) {
|
|
472
|
+
try {
|
|
473
|
+
// Check if this is a response to a pending request
|
|
474
|
+
if (message.correlationId &&
|
|
475
|
+
this.pendingResponses.has(message.correlationId)) {
|
|
476
|
+
const pending = this.pendingResponses.get(message.correlationId);
|
|
477
|
+
clearTimeout(pending.timeout);
|
|
478
|
+
this.pendingResponses.delete(message.correlationId);
|
|
479
|
+
pending.resolve(message.data);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
// Handle regular messages
|
|
483
|
+
const handler = this.messageHandlers.get(message.type);
|
|
484
|
+
if (handler) {
|
|
485
|
+
const response = await handler(message);
|
|
486
|
+
// Send response if correlation ID is present
|
|
487
|
+
if (message.correlationId) {
|
|
488
|
+
const responseMessage = {
|
|
489
|
+
id: this.generateMessageId(),
|
|
490
|
+
type: `${message.type}_response`,
|
|
491
|
+
data: response,
|
|
492
|
+
timestamp: Date.now(),
|
|
493
|
+
from: this.isWorker ? "worker" : "master",
|
|
494
|
+
correlationId: message.correlationId,
|
|
495
|
+
};
|
|
496
|
+
const target = this.isWorker
|
|
497
|
+
? process.stdout
|
|
498
|
+
: this.workers.get(message.from === "worker" ? message.to || "" : "")?.subprocess;
|
|
499
|
+
if (target) {
|
|
500
|
+
const messageStr = JSON.stringify(responseMessage) + "\n";
|
|
501
|
+
if (target.write) {
|
|
502
|
+
target.write(messageStr);
|
|
503
|
+
}
|
|
504
|
+
else if (target.stdin) {
|
|
505
|
+
target.stdin.write(messageStr);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
Logger.logger.warn("ipc", `No handler found for message type: ${message.type}`);
|
|
512
|
+
}
|
|
513
|
+
// Emit event for external listeners
|
|
514
|
+
this.emit("message", message);
|
|
515
|
+
}
|
|
516
|
+
catch (error) {
|
|
517
|
+
Logger.logger.error("ipc", "Error handling incoming message:", error);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Start heartbeat mechanism
|
|
522
|
+
*/
|
|
523
|
+
startHeartbeat() {
|
|
524
|
+
if (this.heartbeatInterval)
|
|
525
|
+
return;
|
|
526
|
+
this.heartbeatInterval = setInterval(async () => {
|
|
527
|
+
if (this.isWorker) {
|
|
528
|
+
// Worker sends heartbeat to master
|
|
529
|
+
try {
|
|
530
|
+
await this.sendToMaster("heartbeat", {
|
|
531
|
+
workerId: this.workerId,
|
|
532
|
+
timestamp: Date.now(),
|
|
533
|
+
memoryUsage: process.memoryUsage(),
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
catch (error) {
|
|
537
|
+
Logger.logger.error("ipc", "Failed to send heartbeat:", error);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
// Master checks worker heartbeats
|
|
542
|
+
const now = Date.now();
|
|
543
|
+
for (const [workerId, worker] of this.workers) {
|
|
544
|
+
if (worker.isAlive &&
|
|
545
|
+
now - worker.lastPing > this.HEARTBEAT_INTERVAL * 3) {
|
|
546
|
+
Logger.logger.warn("ipc", `Worker ${workerId} missed heartbeat, marking as potentially dead`);
|
|
547
|
+
worker.isAlive = false;
|
|
548
|
+
this.emit("worker_timeout", workerId);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}, this.HEARTBEAT_INTERVAL);
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Stop heartbeat mechanism
|
|
556
|
+
*/
|
|
557
|
+
stopHeartbeat() {
|
|
558
|
+
if (this.heartbeatInterval) {
|
|
559
|
+
clearInterval(this.heartbeatInterval);
|
|
560
|
+
this.heartbeatInterval = undefined;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Generate unique message ID
|
|
565
|
+
*/
|
|
566
|
+
generateMessageId() {
|
|
567
|
+
return `msg_${Date.now()}_${Math.random()
|
|
568
|
+
.toString(36)
|
|
569
|
+
.substring(2, 11)}`;
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Get worker statistics (master only)
|
|
573
|
+
*/
|
|
574
|
+
getWorkerStats() {
|
|
575
|
+
if (this.isWorker) {
|
|
576
|
+
return { total: 0, alive: 0, dead: 0 };
|
|
577
|
+
}
|
|
578
|
+
const total = this.workers.size;
|
|
579
|
+
const alive = Array.from(this.workers.values()).filter((w) => w.isAlive).length;
|
|
580
|
+
const dead = total - alive;
|
|
581
|
+
return { total, alive, dead };
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Cleanup and destroy IPC manager
|
|
585
|
+
*/
|
|
586
|
+
destroy() {
|
|
587
|
+
this.stopHeartbeat();
|
|
588
|
+
// Clear pending responses
|
|
589
|
+
for (const [, pending] of this.pendingResponses) {
|
|
590
|
+
clearTimeout(pending.timeout);
|
|
591
|
+
pending.reject(new Error("IPC Manager destroyed"));
|
|
592
|
+
}
|
|
593
|
+
this.pendingResponses.clear();
|
|
594
|
+
// Clear workers
|
|
595
|
+
this.workers.clear();
|
|
596
|
+
// Remove all listeners
|
|
597
|
+
this.removeAllListeners();
|
|
598
|
+
Logger.logger.info("ipc", "BunIPCManager destroyed");
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
exports.BunIPCManager = BunIPCManager;
|
|
603
|
+
//# sourceMappingURL=BunIPCManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BunIPCManager.js","sources":["../../../../../src/cluster/modules/BunIPCManager.ts"],"sourcesContent":[null],"names":["EventEmitter","logger"],"mappings":"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"}
|
|
@@ -285,12 +285,33 @@ class ClusterFactory {
|
|
|
285
285
|
encryptIPC: true,
|
|
286
286
|
},
|
|
287
287
|
resources: {
|
|
288
|
-
maxMemoryPerWorker:
|
|
288
|
+
maxMemoryPerWorker: this._getConservativeMemoryPerWorker(memoryGB, cpuCount),
|
|
289
289
|
maxCpuPerWorker: Math.floor(100 / Math.max(2, cpuCount - 1)),
|
|
290
290
|
priorityLevel: "normal",
|
|
291
291
|
},
|
|
292
292
|
};
|
|
293
293
|
}
|
|
294
|
+
/**
|
|
295
|
+
* Get conservative memory per worker based on system resources
|
|
296
|
+
*/
|
|
297
|
+
_getConservativeMemoryPerWorker(memoryGB, cpuCount) {
|
|
298
|
+
// Conservative memory allocation strategy
|
|
299
|
+
if (memoryGB <= 2) {
|
|
300
|
+
return "256MB"; // Very low memory systems
|
|
301
|
+
}
|
|
302
|
+
else if (memoryGB <= 4) {
|
|
303
|
+
return "512MB"; // Low memory systems
|
|
304
|
+
}
|
|
305
|
+
else if (memoryGB <= 8) {
|
|
306
|
+
return "512MB"; // Medium memory systems - still conservative
|
|
307
|
+
}
|
|
308
|
+
else if (memoryGB <= 16) {
|
|
309
|
+
return "1GB"; // High memory systems
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
return "2GB"; // Very high memory systems
|
|
313
|
+
}
|
|
314
|
+
}
|
|
294
315
|
/**
|
|
295
316
|
* Get environment-specific configuration
|
|
296
317
|
*/
|