@masuidrive/procman 0.1.1 → 0.2.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/dist/src/cli/commands/help.d.ts.map +1 -1
- package/dist/src/cli/commands/help.js +3 -1
- package/dist/src/cli/commands/help.js.map +1 -1
- package/dist/src/cli/index.js +6 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/parser.d.ts.map +1 -1
- package/dist/src/cli/parser.js +20 -0
- package/dist/src/cli/parser.js.map +1 -1
- package/dist/src/cli/utils/find-package-json.d.ts +4 -0
- package/dist/src/cli/utils/find-package-json.d.ts.map +1 -0
- package/dist/src/cli/utils/find-package-json.js +15 -0
- package/dist/src/cli/utils/find-package-json.js.map +1 -0
- package/dist/src/config/config-loader.d.ts +1 -0
- package/dist/src/config/config-loader.d.ts.map +1 -1
- package/dist/src/config/config-loader.js +16 -6
- package/dist/src/config/config-loader.js.map +1 -1
- package/dist/src/config/config-validator.d.ts +18 -49
- package/dist/src/config/config-validator.d.ts.map +1 -1
- package/dist/src/config/config-validator.js +64 -172
- package/dist/src/config/config-validator.js.map +1 -1
- package/dist/src/config/path-security-validator.d.ts +39 -0
- package/dist/src/config/path-security-validator.d.ts.map +1 -0
- package/dist/src/config/path-security-validator.js +134 -0
- package/dist/src/config/path-security-validator.js.map +1 -0
- package/dist/src/config/secure-config-loader.d.ts.map +1 -1
- package/dist/src/config/secure-config-loader.js +10 -2
- package/dist/src/config/secure-config-loader.js.map +1 -1
- package/dist/src/config/validation-suggestions.d.ts +13 -0
- package/dist/src/config/validation-suggestions.d.ts.map +1 -0
- package/dist/src/config/validation-suggestions.js +40 -0
- package/dist/src/config/validation-suggestions.js.map +1 -0
- package/dist/src/config/validation-types.d.ts +38 -0
- package/dist/src/config/validation-types.d.ts.map +1 -0
- package/dist/src/config/validation-types.js +7 -0
- package/dist/src/config/validation-types.js.map +1 -0
- package/dist/src/daemon/component-command-wiring.d.ts +19 -0
- package/dist/src/daemon/component-command-wiring.d.ts.map +1 -0
- package/dist/src/daemon/component-command-wiring.js +27 -0
- package/dist/src/daemon/component-command-wiring.js.map +1 -0
- package/dist/src/daemon/component-daemon-interface.d.ts +38 -0
- package/dist/src/daemon/component-daemon-interface.d.ts.map +1 -0
- package/dist/src/daemon/component-daemon-interface.js +72 -0
- package/dist/src/daemon/component-daemon-interface.js.map +1 -0
- package/dist/src/daemon/component-health.d.ts +38 -0
- package/dist/src/daemon/component-health.d.ts.map +1 -0
- package/dist/src/daemon/component-health.js +146 -0
- package/dist/src/daemon/component-health.js.map +1 -0
- package/dist/src/daemon/component-manager-errors.d.ts +20 -0
- package/dist/src/daemon/component-manager-errors.d.ts.map +1 -0
- package/dist/src/daemon/component-manager-errors.js +30 -0
- package/dist/src/daemon/component-manager-errors.js.map +1 -0
- package/dist/src/daemon/component-manager-types.d.ts +23 -0
- package/dist/src/daemon/component-manager-types.d.ts.map +1 -0
- package/dist/src/daemon/component-manager-types.js +5 -0
- package/dist/src/daemon/component-manager-types.js.map +1 -0
- package/dist/src/daemon/component-manager.d.ts +16 -64
- package/dist/src/daemon/component-manager.d.ts.map +1 -1
- package/dist/src/daemon/component-manager.js +72 -509
- package/dist/src/daemon/component-manager.js.map +1 -1
- package/dist/src/daemon/component-registration.d.ts +14 -0
- package/dist/src/daemon/component-registration.d.ts.map +1 -0
- package/dist/src/daemon/component-registration.js +92 -0
- package/dist/src/daemon/component-registration.js.map +1 -0
- package/dist/src/daemon/component-streaming.d.ts +36 -0
- package/dist/src/daemon/component-streaming.d.ts.map +1 -0
- package/dist/src/daemon/component-streaming.js +112 -0
- package/dist/src/daemon/component-streaming.js.map +1 -0
- package/dist/src/daemon/daemon-lifecycle.d.ts +37 -0
- package/dist/src/daemon/daemon-lifecycle.d.ts.map +1 -0
- package/dist/src/daemon/daemon-lifecycle.js +362 -0
- package/dist/src/daemon/daemon-lifecycle.js.map +1 -0
- package/dist/src/daemon/daemon-queries.d.ts +53 -0
- package/dist/src/daemon/daemon-queries.d.ts.map +1 -0
- package/dist/src/daemon/daemon-queries.js +113 -0
- package/dist/src/daemon/daemon-queries.js.map +1 -0
- package/dist/src/daemon/daemon-types.d.ts +30 -0
- package/dist/src/daemon/daemon-types.d.ts.map +1 -0
- package/dist/src/daemon/daemon-types.js +8 -0
- package/dist/src/daemon/daemon-types.js.map +1 -0
- package/dist/src/daemon/disposable-base.d.ts +49 -0
- package/dist/src/daemon/disposable-base.d.ts.map +1 -0
- package/dist/src/daemon/disposable-base.js +70 -0
- package/dist/src/daemon/disposable-base.js.map +1 -0
- package/dist/src/daemon/disposal-guard.d.ts +27 -0
- package/dist/src/daemon/disposal-guard.d.ts.map +1 -0
- package/dist/src/daemon/disposal-guard.js +58 -0
- package/dist/src/daemon/disposal-guard.js.map +1 -0
- package/dist/src/daemon/ipc-command-handler.d.ts +8 -34
- package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -1
- package/dist/src/daemon/ipc-command-handler.js +14 -362
- package/dist/src/daemon/ipc-command-handler.js.map +1 -1
- package/dist/src/daemon/log-command-handlers.d.ts +19 -0
- package/dist/src/daemon/log-command-handlers.d.ts.map +1 -0
- package/dist/src/daemon/log-command-handlers.js +114 -0
- package/dist/src/daemon/log-command-handlers.js.map +1 -0
- package/dist/src/daemon/process-command-handlers.d.ts +32 -0
- package/dist/src/daemon/process-command-handlers.d.ts.map +1 -0
- package/dist/src/daemon/process-command-handlers.js +223 -0
- package/dist/src/daemon/process-command-handlers.js.map +1 -0
- package/dist/src/daemon/procman-daemon.d.ts +22 -98
- package/dist/src/daemon/procman-daemon.d.ts.map +1 -1
- package/dist/src/daemon/procman-daemon.js +107 -604
- package/dist/src/daemon/procman-daemon.js.map +1 -1
- package/dist/src/daemon/resource-manager.d.ts +6 -124
- package/dist/src/daemon/resource-manager.d.ts.map +1 -1
- package/dist/src/daemon/resource-manager.js +5 -231
- package/dist/src/daemon/resource-manager.js.map +1 -1
- package/dist/src/daemon/resource-types.d.ts +23 -0
- package/dist/src/daemon/resource-types.d.ts.map +1 -0
- package/dist/src/daemon/resource-types.js +7 -0
- package/dist/src/daemon/resource-types.js.map +1 -0
- package/dist/src/daemon/shutdown-orchestrator.d.ts +32 -0
- package/dist/src/daemon/shutdown-orchestrator.d.ts.map +1 -0
- package/dist/src/daemon/shutdown-orchestrator.js +123 -0
- package/dist/src/daemon/shutdown-orchestrator.js.map +1 -0
- package/dist/src/daemon/tracked-resources.d.ts +60 -0
- package/dist/src/daemon/tracked-resources.d.ts.map +1 -0
- package/dist/src/daemon/tracked-resources.js +124 -0
- package/dist/src/daemon/tracked-resources.js.map +1 -0
- package/dist/src/process-manager/index.d.ts +5 -1
- package/dist/src/process-manager/index.d.ts.map +1 -1
- package/dist/src/process-manager/index.js +3 -0
- package/dist/src/process-manager/index.js.map +1 -1
- package/dist/src/process-manager/interfaces/process-group.d.ts +6 -0
- package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -1
- package/dist/src/process-manager/managed-process-events.d.ts +22 -0
- package/dist/src/process-manager/managed-process-events.d.ts.map +1 -0
- package/dist/src/process-manager/managed-process-events.js +5 -0
- package/dist/src/process-manager/managed-process-events.js.map +1 -0
- package/dist/src/process-manager/managed-process-info.d.ts +11 -53
- package/dist/src/process-manager/managed-process-info.d.ts.map +1 -1
- package/dist/src/process-manager/managed-process-info.js +46 -133
- package/dist/src/process-manager/managed-process-info.js.map +1 -1
- package/dist/src/process-manager/process-batch-operations.d.ts +62 -0
- package/dist/src/process-manager/process-batch-operations.d.ts.map +1 -0
- package/dist/src/process-manager/process-batch-operations.js +80 -0
- package/dist/src/process-manager/process-batch-operations.js.map +1 -0
- package/dist/src/process-manager/process-config.d.ts +49 -0
- package/dist/src/process-manager/process-config.d.ts.map +1 -0
- package/dist/src/process-manager/process-config.js +68 -0
- package/dist/src/process-manager/process-config.js.map +1 -0
- package/dist/src/process-manager/process-event-forwarding.d.ts +18 -0
- package/dist/src/process-manager/process-event-forwarding.d.ts.map +1 -0
- package/dist/src/process-manager/process-event-forwarding.js +105 -0
- package/dist/src/process-manager/process-event-forwarding.js.map +1 -0
- package/dist/src/process-manager/process-group-manager.d.ts.map +1 -1
- package/dist/src/process-manager/process-group-manager.js +0 -1
- package/dist/src/process-manager/process-group-manager.js.map +1 -1
- package/dist/src/process-manager/process-info-queries.d.ts +48 -0
- package/dist/src/process-manager/process-info-queries.d.ts.map +1 -0
- package/dist/src/process-manager/process-info-queries.js +92 -0
- package/dist/src/process-manager/process-info-queries.js.map +1 -0
- package/dist/src/process-manager/process-manager.d.ts +5 -174
- package/dist/src/process-manager/process-manager.d.ts.map +1 -1
- package/dist/src/process-manager/process-manager.js +58 -398
- package/dist/src/process-manager/process-manager.js.map +1 -1
- package/dist/src/process-manager/process-monitoring.d.ts +80 -0
- package/dist/src/process-manager/process-monitoring.d.ts.map +1 -0
- package/dist/src/process-manager/process-monitoring.js +142 -0
- package/dist/src/process-manager/process-monitoring.js.map +1 -0
- package/dist/src/process-manager/process-statistics.d.ts +37 -0
- package/dist/src/process-manager/process-statistics.d.ts.map +1 -0
- package/dist/src/process-manager/process-statistics.js +24 -0
- package/dist/src/process-manager/process-statistics.js.map +1 -0
- package/dist/src/process-manager/restart-manager.d.ts +82 -0
- package/dist/src/process-manager/restart-manager.d.ts.map +1 -0
- package/dist/src/process-manager/restart-manager.js +150 -0
- package/dist/src/process-manager/restart-manager.js.map +1 -0
- package/dist/src/services/app-logger.d.ts +144 -0
- package/dist/src/services/app-logger.d.ts.map +1 -0
- package/dist/src/services/app-logger.js +489 -0
- package/dist/src/services/app-logger.js.map +1 -0
- package/dist/src/services/log-buffer.d.ts +35 -0
- package/dist/src/services/log-buffer.d.ts.map +1 -0
- package/dist/src/services/log-buffer.js +87 -0
- package/dist/src/services/log-buffer.js.map +1 -0
- package/dist/src/services/log-event-manager.d.ts +32 -0
- package/dist/src/services/log-event-manager.d.ts.map +1 -0
- package/dist/src/services/log-event-manager.js +31 -0
- package/dist/src/services/log-event-manager.js.map +1 -0
- package/dist/src/services/log-file-manager.d.ts +46 -0
- package/dist/src/services/log-file-manager.d.ts.map +1 -0
- package/dist/src/services/log-file-manager.js +156 -0
- package/dist/src/services/log-file-manager.js.map +1 -0
- package/dist/src/services/log-level-strategy.d.ts +19 -0
- package/dist/src/services/log-level-strategy.d.ts.map +1 -0
- package/dist/src/services/log-level-strategy.js +40 -0
- package/dist/src/services/log-level-strategy.js.map +1 -0
- package/dist/src/services/log-manager-types.d.ts +117 -0
- package/dist/src/services/log-manager-types.d.ts.map +1 -0
- package/dist/src/services/log-manager-types.js +12 -0
- package/dist/src/services/log-manager-types.js.map +1 -0
- package/dist/src/services/log-manager.d.ts +8 -35
- package/dist/src/services/log-manager.d.ts.map +1 -1
- package/dist/src/services/log-manager.js +10 -870
- package/dist/src/services/log-manager.js.map +1 -1
- package/dist/src/services/log-preprocessor.d.ts +30 -0
- package/dist/src/services/log-preprocessor.d.ts.map +1 -0
- package/dist/src/services/log-preprocessor.js +65 -0
- package/dist/src/services/log-preprocessor.js.map +1 -0
- package/dist/src/services/process-log-integration.d.ts +7 -2
- package/dist/src/services/process-log-integration.d.ts.map +1 -1
- package/dist/src/services/process-log-integration.js.map +1 -1
- package/package.json +5 -7
|
@@ -11,33 +11,18 @@ import { ProcessManager } from '../process-manager/process-manager.js';
|
|
|
11
11
|
import { LogManager } from '../services/log-manager.js';
|
|
12
12
|
import { createIPCServer } from './ipc-factory.js';
|
|
13
13
|
import { IPCCommandHandler } from './ipc-command-handler.js';
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Component cleanup error
|
|
30
|
-
*/
|
|
31
|
-
export class ComponentCleanupError extends Error {
|
|
32
|
-
componentName;
|
|
33
|
-
originalError;
|
|
34
|
-
constructor(componentName, originalError) {
|
|
35
|
-
super(`Failed to cleanup component '${componentName}': ${originalError.message}`);
|
|
36
|
-
this.componentName = componentName;
|
|
37
|
-
this.originalError = originalError;
|
|
38
|
-
this.name = 'ComponentCleanupError';
|
|
39
|
-
}
|
|
40
|
-
}
|
|
14
|
+
import { ComponentInitializationError, ComponentCleanupError, } from './component-manager-errors.js';
|
|
15
|
+
import { StreamingSessionManager } from './component-streaming.js';
|
|
16
|
+
import { performHealthChecks } from './component-health.js';
|
|
17
|
+
import { createComponentWrapper } from './component-registration.js';
|
|
18
|
+
import { createDaemonInterface } from './component-daemon-interface.js';
|
|
19
|
+
import { wireCommandHandlers } from './component-command-wiring.js';
|
|
20
|
+
export { ComponentInitializationError, ComponentCleanupError, } from './component-manager-errors.js';
|
|
21
|
+
export { StreamingSessionManager } from './component-streaming.js';
|
|
22
|
+
export { performHealthChecks, } from './component-health.js';
|
|
23
|
+
export { createComponentWrapper, convertAppConfigToProcessConfig, } from './component-registration.js';
|
|
24
|
+
export { createDaemonInterface, } from './component-daemon-interface.js';
|
|
25
|
+
export { wireCommandHandlers } from './component-command-wiring.js';
|
|
41
26
|
/**
|
|
42
27
|
* Component manager class
|
|
43
28
|
*
|
|
@@ -58,10 +43,11 @@ export class ComponentManager extends EventEmitter {
|
|
|
58
43
|
commandHandler;
|
|
59
44
|
// Add EventCleanupHelper for proper listener cleanup
|
|
60
45
|
listenerCleanup = new EventCleanupHelper();
|
|
46
|
+
// Streaming session manager
|
|
47
|
+
streamingManager = new StreamingSessionManager();
|
|
61
48
|
constructor(dataDirectory) {
|
|
62
49
|
super();
|
|
63
50
|
this.dataDirectory = dataDirectory;
|
|
64
|
-
// No initialization needed for EventCleanupHelper
|
|
65
51
|
}
|
|
66
52
|
/**
|
|
67
53
|
* Private method to register and track listeners
|
|
@@ -75,24 +61,20 @@ export class ComponentManager extends EventEmitter {
|
|
|
75
61
|
async initializeAll() {
|
|
76
62
|
this.initializationErrors = [];
|
|
77
63
|
const startTime = Date.now();
|
|
64
|
+
const steps = [
|
|
65
|
+
['ConfigLoader', () => this.initializeConfigLoader()],
|
|
66
|
+
['ProcessManager', () => this.initializeProcessManager()],
|
|
67
|
+
['LogManager', () => this.initializeLogManager()],
|
|
68
|
+
['IPCServer', () => this.initializeIPCServer()],
|
|
69
|
+
['CommandHandler', () => this.initializeCommandHandler()],
|
|
70
|
+
];
|
|
78
71
|
try {
|
|
79
72
|
console.log('Starting daemon component initialization...');
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
await this.initializeProcessManager();
|
|
86
|
-
console.log('ProcessManager initialized successfully');
|
|
87
|
-
console.log('Initializing LogManager...');
|
|
88
|
-
await this.initializeLogManager();
|
|
89
|
-
console.log('LogManager initialized successfully');
|
|
90
|
-
console.log('Initializing IPCServer...');
|
|
91
|
-
await this.initializeIPCServer();
|
|
92
|
-
console.log('IPCServer initialized successfully');
|
|
93
|
-
console.log('Initializing CommandHandler...');
|
|
94
|
-
await this.initializeCommandHandler();
|
|
95
|
-
console.log('CommandHandler initialized successfully');
|
|
73
|
+
for (const [name, initFn] of steps) {
|
|
74
|
+
console.log(`Initializing ${name}...`);
|
|
75
|
+
await initFn();
|
|
76
|
+
console.log(`${name} initialized successfully`);
|
|
77
|
+
}
|
|
96
78
|
const totalTime = Date.now() - startTime;
|
|
97
79
|
console.log(`All daemon components initialized successfully in ${totalTime}ms`);
|
|
98
80
|
this.emit('allComponentsStarted');
|
|
@@ -100,7 +82,6 @@ export class ComponentManager extends EventEmitter {
|
|
|
100
82
|
catch (error) {
|
|
101
83
|
const totalTime = Date.now() - startTime;
|
|
102
84
|
console.error(`Component initialization failed after ${totalTime}ms:`, error);
|
|
103
|
-
// Rollback any initialized components
|
|
104
85
|
await this.rollbackInitialization();
|
|
105
86
|
throw error;
|
|
106
87
|
}
|
|
@@ -111,7 +92,7 @@ export class ComponentManager extends EventEmitter {
|
|
|
111
92
|
async cleanupAll() {
|
|
112
93
|
const errors = [];
|
|
113
94
|
// Cleanup all streaming sessions first
|
|
114
|
-
this.cleanupAllStreamingSessions();
|
|
95
|
+
this.streamingManager.cleanupAllStreamingSessions();
|
|
115
96
|
// Cleanup in reverse order of initialization
|
|
116
97
|
const componentsToCleanup = [...this.cleanupOrder].reverse();
|
|
117
98
|
for (const componentName of componentsToCleanup) {
|
|
@@ -130,10 +111,9 @@ export class ComponentManager extends EventEmitter {
|
|
|
130
111
|
}
|
|
131
112
|
// Clear component references
|
|
132
113
|
this.clearComponents();
|
|
133
|
-
// Clean up listener management
|
|
114
|
+
// Clean up listener management
|
|
134
115
|
await this.cleanupListeners();
|
|
135
116
|
this.emit('allComponentsStopped');
|
|
136
|
-
// Throw aggregated errors if any occurred
|
|
137
117
|
if (errors.length > 0) {
|
|
138
118
|
const errorMessage = `Component cleanup failed: ${errors.map((e) => e.message).join('; ')}`;
|
|
139
119
|
throw new Error(errorMessage);
|
|
@@ -166,152 +146,15 @@ export class ComponentManager extends EventEmitter {
|
|
|
166
146
|
}
|
|
167
147
|
/**
|
|
168
148
|
* Perform comprehensive health checks on all components
|
|
169
|
-
* Verifies each component is not just initialized but actually functional
|
|
170
149
|
*/
|
|
171
150
|
async performHealthChecks() {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const isReady = true;
|
|
180
|
-
details.configLoader = {
|
|
181
|
-
status: isReady ? 'healthy' : 'unhealthy',
|
|
182
|
-
message: isReady
|
|
183
|
-
? 'ConfigLoader is ready'
|
|
184
|
-
: 'ConfigLoader not initialized',
|
|
185
|
-
};
|
|
186
|
-
if (!isReady)
|
|
187
|
-
allHealthy = false;
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
details.configLoader = {
|
|
191
|
-
status: 'unhealthy',
|
|
192
|
-
message: `ConfigLoader error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
193
|
-
};
|
|
194
|
-
allHealthy = false;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
details.configLoader = {
|
|
199
|
-
status: 'unhealthy',
|
|
200
|
-
message: 'ConfigLoader not available',
|
|
201
|
-
};
|
|
202
|
-
allHealthy = false;
|
|
203
|
-
}
|
|
204
|
-
// Check ProcessManager health
|
|
205
|
-
if (this.processManager) {
|
|
206
|
-
try {
|
|
207
|
-
// ProcessManager is healthy if it exists and is properly initialized
|
|
208
|
-
// Since there's no isRunning method, assume healthy if instance exists
|
|
209
|
-
const isReady = true;
|
|
210
|
-
details.processManager = {
|
|
211
|
-
status: isReady ? 'healthy' : 'unhealthy',
|
|
212
|
-
message: isReady
|
|
213
|
-
? 'ProcessManager is running'
|
|
214
|
-
: 'ProcessManager not running',
|
|
215
|
-
};
|
|
216
|
-
if (!isReady)
|
|
217
|
-
allHealthy = false;
|
|
218
|
-
}
|
|
219
|
-
catch (error) {
|
|
220
|
-
details.processManager = {
|
|
221
|
-
status: 'unhealthy',
|
|
222
|
-
message: `ProcessManager error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
223
|
-
};
|
|
224
|
-
allHealthy = false;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
details.processManager = {
|
|
229
|
-
status: 'unhealthy',
|
|
230
|
-
message: 'ProcessManager not available',
|
|
231
|
-
};
|
|
232
|
-
allHealthy = false;
|
|
233
|
-
}
|
|
234
|
-
// Check LogManager health
|
|
235
|
-
if (this.logManager) {
|
|
236
|
-
try {
|
|
237
|
-
// LogManager is healthy if it exists and is properly initialized
|
|
238
|
-
// Since there's no isRunning method, assume healthy if instance exists
|
|
239
|
-
const isReady = true;
|
|
240
|
-
details.logManager = {
|
|
241
|
-
status: isReady ? 'healthy' : 'unhealthy',
|
|
242
|
-
message: isReady ? 'LogManager is running' : 'LogManager not running',
|
|
243
|
-
};
|
|
244
|
-
if (!isReady)
|
|
245
|
-
allHealthy = false;
|
|
246
|
-
}
|
|
247
|
-
catch (error) {
|
|
248
|
-
details.logManager = {
|
|
249
|
-
status: 'unhealthy',
|
|
250
|
-
message: `LogManager error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
251
|
-
};
|
|
252
|
-
allHealthy = false;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
details.logManager = {
|
|
257
|
-
status: 'unhealthy',
|
|
258
|
-
message: 'LogManager not available',
|
|
259
|
-
};
|
|
260
|
-
allHealthy = false;
|
|
261
|
-
}
|
|
262
|
-
// Check IPCServer health - most critical for readiness
|
|
263
|
-
if (this.ipcServer) {
|
|
264
|
-
try {
|
|
265
|
-
const isListening = this.ipcServer.isServerListening?.();
|
|
266
|
-
details.ipcServer = {
|
|
267
|
-
status: isListening ? 'healthy' : 'unhealthy',
|
|
268
|
-
message: isListening
|
|
269
|
-
? 'IPC Server is listening and ready'
|
|
270
|
-
: 'IPC Server not listening',
|
|
271
|
-
};
|
|
272
|
-
if (!isListening)
|
|
273
|
-
allHealthy = false;
|
|
274
|
-
}
|
|
275
|
-
catch (error) {
|
|
276
|
-
details.ipcServer = {
|
|
277
|
-
status: 'unhealthy',
|
|
278
|
-
message: `IPCServer error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
279
|
-
};
|
|
280
|
-
allHealthy = false;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
details.ipcServer = {
|
|
285
|
-
status: 'unhealthy',
|
|
286
|
-
message: 'IPC Server not available',
|
|
287
|
-
};
|
|
288
|
-
allHealthy = false;
|
|
289
|
-
}
|
|
290
|
-
// Check CommandHandler health
|
|
291
|
-
if (this.commandHandler) {
|
|
292
|
-
try {
|
|
293
|
-
// CommandHandler is healthy if it exists (no specific health check method)
|
|
294
|
-
details.commandHandler = {
|
|
295
|
-
status: 'healthy',
|
|
296
|
-
message: 'CommandHandler is ready',
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
catch (error) {
|
|
300
|
-
details.commandHandler = {
|
|
301
|
-
status: 'unhealthy',
|
|
302
|
-
message: `CommandHandler error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
303
|
-
};
|
|
304
|
-
allHealthy = false;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
details.commandHandler = {
|
|
309
|
-
status: 'unhealthy',
|
|
310
|
-
message: 'CommandHandler not available',
|
|
311
|
-
};
|
|
312
|
-
allHealthy = false;
|
|
313
|
-
}
|
|
314
|
-
return { healthy: allHealthy, details };
|
|
151
|
+
return performHealthChecks({
|
|
152
|
+
configLoader: this.configLoader,
|
|
153
|
+
processManager: this.processManager,
|
|
154
|
+
logManager: this.logManager,
|
|
155
|
+
ipcServer: this.ipcServer,
|
|
156
|
+
commandHandler: this.commandHandler,
|
|
157
|
+
});
|
|
315
158
|
}
|
|
316
159
|
/**
|
|
317
160
|
* Get initialization errors
|
|
@@ -320,59 +163,56 @@ export class ComponentManager extends EventEmitter {
|
|
|
320
163
|
return [...this.initializationErrors];
|
|
321
164
|
}
|
|
322
165
|
/**
|
|
323
|
-
*
|
|
166
|
+
* Helper to initialize a component with standard error handling
|
|
324
167
|
*/
|
|
325
|
-
async
|
|
168
|
+
async initializeWithErrorHandling(componentName, initFn) {
|
|
326
169
|
try {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
this.emit('componentStarted', 'configLoader');
|
|
170
|
+
await initFn();
|
|
171
|
+
this.emit('componentStarted', componentName);
|
|
330
172
|
}
|
|
331
173
|
catch (error) {
|
|
332
|
-
|
|
174
|
+
if (componentName === 'ipcServer') {
|
|
175
|
+
console.error('IPC server initialization failed:', error);
|
|
176
|
+
}
|
|
177
|
+
const initError = new ComponentInitializationError(componentName, error);
|
|
333
178
|
this.initializationErrors.push(initError);
|
|
334
|
-
this.emit('componentError',
|
|
179
|
+
this.emit('componentError', componentName, initError);
|
|
335
180
|
throw initError;
|
|
336
181
|
}
|
|
337
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* Initialize config loader
|
|
185
|
+
*/
|
|
186
|
+
async initializeConfigLoader() {
|
|
187
|
+
await this.initializeWithErrorHandling('configLoader', async () => {
|
|
188
|
+
this.configLoader = new ConfigLoader();
|
|
189
|
+
await this.registerComponent('configLoader', this.configLoader);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
338
192
|
/**
|
|
339
193
|
* Initialize process manager
|
|
340
194
|
*/
|
|
341
195
|
async initializeProcessManager() {
|
|
342
|
-
|
|
196
|
+
await this.initializeWithErrorHandling('processManager', async () => {
|
|
343
197
|
this.processManager = ProcessManager.create();
|
|
344
198
|
await this.registerComponent('processManager', this.processManager);
|
|
345
|
-
|
|
346
|
-
}
|
|
347
|
-
catch (error) {
|
|
348
|
-
const initError = new ComponentInitializationError('processManager', error);
|
|
349
|
-
this.initializationErrors.push(initError);
|
|
350
|
-
this.emit('componentError', 'processManager', initError);
|
|
351
|
-
throw initError;
|
|
352
|
-
}
|
|
199
|
+
});
|
|
353
200
|
}
|
|
354
201
|
/**
|
|
355
202
|
* Initialize log manager
|
|
356
203
|
*/
|
|
357
204
|
async initializeLogManager() {
|
|
358
|
-
|
|
205
|
+
await this.initializeWithErrorHandling('logManager', async () => {
|
|
359
206
|
const logDir = await this.dataDirectory.getLogDirectory();
|
|
360
207
|
this.logManager = new LogManager(logDir);
|
|
361
208
|
await this.registerComponent('logManager', this.logManager);
|
|
362
|
-
|
|
363
|
-
}
|
|
364
|
-
catch (error) {
|
|
365
|
-
const initError = new ComponentInitializationError('logManager', error);
|
|
366
|
-
this.initializationErrors.push(initError);
|
|
367
|
-
this.emit('componentError', 'logManager', initError);
|
|
368
|
-
throw initError;
|
|
369
|
-
}
|
|
209
|
+
});
|
|
370
210
|
}
|
|
371
211
|
/**
|
|
372
212
|
* Initialize IPC server
|
|
373
213
|
*/
|
|
374
214
|
async initializeIPCServer() {
|
|
375
|
-
|
|
215
|
+
await this.initializeWithErrorHandling('ipcServer', async () => {
|
|
376
216
|
const startTime = Date.now();
|
|
377
217
|
console.log('Getting socket path...');
|
|
378
218
|
const socketPath = await this.dataDirectory.getSocketPath();
|
|
@@ -383,111 +223,37 @@ export class ComponentManager extends EventEmitter {
|
|
|
383
223
|
await this.registerComponent('ipcServer', this.ipcServer);
|
|
384
224
|
const totalTime = Date.now() - startTime;
|
|
385
225
|
console.log(`IPC server initialized in ${totalTime}ms`);
|
|
386
|
-
|
|
387
|
-
}
|
|
388
|
-
catch (error) {
|
|
389
|
-
console.error('IPC server initialization failed:', error);
|
|
390
|
-
const initError = new ComponentInitializationError('ipcServer', error);
|
|
391
|
-
this.initializationErrors.push(initError);
|
|
392
|
-
this.emit('componentError', 'ipcServer', initError);
|
|
393
|
-
throw initError;
|
|
394
|
-
}
|
|
226
|
+
});
|
|
395
227
|
}
|
|
396
228
|
/**
|
|
397
229
|
* Initialize command handler
|
|
398
230
|
*/
|
|
399
231
|
async initializeCommandHandler() {
|
|
400
|
-
|
|
232
|
+
await this.initializeWithErrorHandling('commandHandler', async () => {
|
|
401
233
|
if (!this.configLoader ||
|
|
402
234
|
!this.processManager ||
|
|
403
235
|
!this.logManager ||
|
|
404
236
|
!this.ipcServer) {
|
|
405
237
|
throw new Error('Required components not initialized');
|
|
406
238
|
}
|
|
407
|
-
// Create a mock daemon object for the command handler
|
|
408
239
|
const daemonInterface = this.createDaemonInterface();
|
|
409
240
|
this.commandHandler = new IPCCommandHandler(daemonInterface);
|
|
410
241
|
await this.registerComponent('commandHandler', this.commandHandler);
|
|
411
242
|
// Register command handlers with IPC server
|
|
412
243
|
this.registerCommandHandlers();
|
|
413
|
-
|
|
414
|
-
}
|
|
415
|
-
catch (error) {
|
|
416
|
-
const initError = new ComponentInitializationError('commandHandler', error);
|
|
417
|
-
this.initializationErrors.push(initError);
|
|
418
|
-
this.emit('componentError', 'commandHandler', initError);
|
|
419
|
-
throw initError;
|
|
420
|
-
}
|
|
244
|
+
});
|
|
421
245
|
}
|
|
422
246
|
/**
|
|
423
247
|
* Create daemon interface for command handler
|
|
424
248
|
*/
|
|
425
249
|
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
426
250
|
createDaemonInterface() {
|
|
427
|
-
return {
|
|
251
|
+
return createDaemonInterface({
|
|
428
252
|
getConfigLoader: () => this.configLoader,
|
|
429
253
|
getProcessManager: () => this.processManager,
|
|
430
254
|
getLogManager: () => this.logManager,
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
const processInfos = this.processManager.getAllProcessInfo();
|
|
434
|
-
const statusPromises = processInfos.map(async (processInfo) => {
|
|
435
|
-
const info = processInfo;
|
|
436
|
-
if (!info)
|
|
437
|
-
return null;
|
|
438
|
-
// Get process stats from monitor
|
|
439
|
-
const stats = await this.processManager.monitor.getProcessStats(info.name);
|
|
440
|
-
return {
|
|
441
|
-
name: info.name,
|
|
442
|
-
namespace: info.namespace || 'default',
|
|
443
|
-
pid: info.pid,
|
|
444
|
-
status: info.status,
|
|
445
|
-
uptime: info.uptime,
|
|
446
|
-
memory: stats?.memory || 0,
|
|
447
|
-
cpu: stats?.cpu || 0,
|
|
448
|
-
restarts: info.restarts,
|
|
449
|
-
};
|
|
450
|
-
});
|
|
451
|
-
const results = await Promise.all(statusPromises);
|
|
452
|
-
return results.filter((result) => result !== null);
|
|
453
|
-
},
|
|
454
|
-
getConfig: () => {
|
|
455
|
-
// This will be set by the calling code
|
|
456
|
-
return undefined;
|
|
457
|
-
},
|
|
458
|
-
loadConfig: async (configFilePath) => {
|
|
459
|
-
const config = await this.configLoader.load(configFilePath);
|
|
460
|
-
// Stop all existing processes
|
|
461
|
-
const allProcesses = this.processManager.getAllProcessInfo();
|
|
462
|
-
if (allProcesses.length > 0) {
|
|
463
|
-
const processNames = allProcesses
|
|
464
|
-
.map((processInfo) => {
|
|
465
|
-
const info = processInfo;
|
|
466
|
-
return info?.name || '';
|
|
467
|
-
})
|
|
468
|
-
.filter((name) => name !== '');
|
|
469
|
-
await this.processManager.stopProcesses(processNames);
|
|
470
|
-
}
|
|
471
|
-
// Configure new processes
|
|
472
|
-
for (const app of config.apps) {
|
|
473
|
-
this.processManager.configureProcess(app);
|
|
474
|
-
// Setup log manager for this app if log files are configured
|
|
475
|
-
if (this.logManager &&
|
|
476
|
-
(app.log_file || app.out_file || app.error_file)) {
|
|
477
|
-
await this.logManager.setupAppLogs(app.name, {
|
|
478
|
-
logFile: app.log_file,
|
|
479
|
-
outFile: app.out_file,
|
|
480
|
-
errorFile: app.error_file,
|
|
481
|
-
namespace: app.namespace,
|
|
482
|
-
});
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
return config.apps;
|
|
486
|
-
},
|
|
487
|
-
stop: async () => {
|
|
488
|
-
await this.cleanupAll();
|
|
489
|
-
},
|
|
490
|
-
};
|
|
255
|
+
cleanupAll: () => this.cleanupAll(),
|
|
256
|
+
});
|
|
491
257
|
}
|
|
492
258
|
/**
|
|
493
259
|
* Register command handlers with IPC server
|
|
@@ -496,148 +262,27 @@ export class ComponentManager extends EventEmitter {
|
|
|
496
262
|
if (!this.ipcServer || !this.commandHandler) {
|
|
497
263
|
return;
|
|
498
264
|
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
'log',
|
|
506
|
-
'clear-log',
|
|
507
|
-
'exit',
|
|
508
|
-
];
|
|
509
|
-
for (const commandType of commandTypes) {
|
|
510
|
-
this.ipcServer.registerHandler(commandType, async (message, connection) => {
|
|
511
|
-
// Pass connection info to command handler for log streaming
|
|
512
|
-
return this.commandHandler.handleMessage(message, connection);
|
|
513
|
-
});
|
|
514
|
-
}
|
|
515
|
-
// ログストリーミングのセットアップ
|
|
516
|
-
this.setupLogStreaming();
|
|
517
|
-
}
|
|
518
|
-
// ストリーミングセッション管理用のマップ
|
|
519
|
-
// Map to track active streaming sessions with connection info
|
|
520
|
-
streamingSessions = new Map();
|
|
521
|
-
/**
|
|
522
|
-
* Setup log streaming functionality
|
|
523
|
-
*/
|
|
524
|
-
setupLogStreaming() {
|
|
525
|
-
if (!this.commandHandler || !this.ipcServer || !this.logManager) {
|
|
526
|
-
return;
|
|
527
|
-
}
|
|
528
|
-
// コマンドハンドラーからのログストリーミング開始イベントをリッスン
|
|
529
|
-
// Note: We need connectionId to send logs to specific client only
|
|
530
|
-
// This requires passing connectionId from IPCServer through IPCCommandHandler
|
|
531
|
-
this.registerListener(this.commandHandler, LOG_STREAM_EVENTS.START_LOG_STREAM,
|
|
532
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
533
|
-
(streamConfig) => {
|
|
534
|
-
const { messageId, target, connectionId } = streamConfig;
|
|
535
|
-
const sessionId = `${STREAM_CONFIG.SESSION_PREFIX}-${messageId}-${Date.now()}`;
|
|
536
|
-
// 既存のセッションがあれば停止
|
|
537
|
-
this.stopLogStream(sessionId);
|
|
538
|
-
// Get specific connection instead of all connections
|
|
539
|
-
const connection = connectionId
|
|
540
|
-
? this.ipcServer.getConnection(connectionId)
|
|
541
|
-
: null;
|
|
542
|
-
if (!connection) {
|
|
543
|
-
console.error(`Cannot start log streaming: connection ${connectionId} not found`);
|
|
544
|
-
return;
|
|
545
|
-
}
|
|
546
|
-
// ログマネージャーでストリーミングを開始
|
|
547
|
-
const cleanup = this.logManager.startLogStream(target, (logEntry) => {
|
|
548
|
-
// 新しいログエントリを受信したら特定のIPCクライアントに送信
|
|
549
|
-
const streamMessage = {
|
|
550
|
-
id: `${STREAM_CONFIG.SESSION_PREFIX}-${Date.now()}`,
|
|
551
|
-
type: STREAM_MESSAGE_TYPES.LOG_STREAM,
|
|
552
|
-
payload: {
|
|
553
|
-
entry: logEntry,
|
|
554
|
-
app: logEntry.app,
|
|
555
|
-
namespace: logEntry.namespace || 'default',
|
|
556
|
-
},
|
|
557
|
-
timestamp: Date.now(),
|
|
558
|
-
sessionId, // セッションIDを追加
|
|
559
|
-
};
|
|
560
|
-
// 特定の接続にのみメッセージを送信
|
|
561
|
-
try {
|
|
562
|
-
// IPCサーバーの送信メソッドを使用
|
|
563
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
564
|
-
connection.send(JSON.stringify(streamMessage) + '\n');
|
|
565
|
-
}
|
|
566
|
-
catch (error) {
|
|
567
|
-
console.error('Failed to send log stream message:', error);
|
|
568
|
-
// エラーが発生した接続のストリーミングを停止
|
|
569
|
-
this.stopLogStream(sessionId);
|
|
570
|
-
}
|
|
571
|
-
});
|
|
572
|
-
// クリーンアップ関数とconnection情報を保存
|
|
573
|
-
this.streamingSessions.set(sessionId, {
|
|
574
|
-
cleanup,
|
|
575
|
-
connectionId: connectionId || '',
|
|
576
|
-
messageId,
|
|
577
|
-
});
|
|
578
|
-
// 接続が切断された時にストリーミングを停止
|
|
579
|
-
this.setupStreamCleanupOnDisconnect(sessionId);
|
|
265
|
+
wireCommandHandlers({
|
|
266
|
+
ipcServer: this.ipcServer,
|
|
267
|
+
commandHandler: this.commandHandler,
|
|
268
|
+
logManager: this.logManager,
|
|
269
|
+
streamingManager: this.streamingManager,
|
|
270
|
+
registerListener: this.registerListener.bind(this),
|
|
580
271
|
});
|
|
581
|
-
// stop-log-streamイベントのリスナーを追加
|
|
582
|
-
this.registerListener(this.commandHandler, LOG_STREAM_EVENTS.STOP_LOG_STREAM,
|
|
583
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
584
|
-
(config) => {
|
|
585
|
-
const { sessionId } = config;
|
|
586
|
-
this.stopLogStream(sessionId);
|
|
587
|
-
});
|
|
588
|
-
}
|
|
589
|
-
/**
|
|
590
|
-
* Stop log streaming for a specific session
|
|
591
|
-
*/
|
|
592
|
-
stopLogStream(sessionId) {
|
|
593
|
-
const sessionInfo = this.streamingSessions.get(sessionId);
|
|
594
|
-
if (sessionInfo) {
|
|
595
|
-
sessionInfo.cleanup();
|
|
596
|
-
this.streamingSessions.delete(sessionId);
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
/**
|
|
600
|
-
* Setup cleanup when connection disconnects
|
|
601
|
-
*/
|
|
602
|
-
setupStreamCleanupOnDisconnect(sessionId) {
|
|
603
|
-
// IPCサーバーの切断イベントを監視
|
|
604
|
-
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
605
|
-
const disconnectHandler = () => {
|
|
606
|
-
// 該当するセッションのストリーミングを停止
|
|
607
|
-
this.stopLogStream(sessionId);
|
|
608
|
-
};
|
|
609
|
-
// 一度だけ実行されるようにする
|
|
610
|
-
// Note: IPCServerBase doesn't extend EventEmitter, so we can't use EventCleanupHelper for it
|
|
611
|
-
// This is acceptable as IPCServerBase has its own cleanup mechanisms
|
|
612
|
-
this.ipcServer?.once('disconnect', disconnectHandler);
|
|
613
|
-
}
|
|
614
|
-
/**
|
|
615
|
-
* Cleanup all streaming sessions
|
|
616
|
-
*/
|
|
617
|
-
cleanupAllStreamingSessions() {
|
|
618
|
-
for (const [, sessionInfo] of this.streamingSessions) {
|
|
619
|
-
sessionInfo.cleanup();
|
|
620
|
-
}
|
|
621
|
-
this.streamingSessions.clear();
|
|
622
272
|
}
|
|
623
273
|
/**
|
|
624
274
|
* Clean up all managed listeners and components
|
|
625
275
|
*/
|
|
626
276
|
async cleanup() {
|
|
627
|
-
|
|
628
|
-
this.cleanupAllStreamingSessions();
|
|
629
|
-
// Clean up listeners
|
|
277
|
+
this.streamingManager.cleanupAllStreamingSessions();
|
|
630
278
|
await this.cleanupListeners();
|
|
631
279
|
}
|
|
632
280
|
/**
|
|
633
281
|
* Clean up only listeners (without streaming sessions)
|
|
634
282
|
*/
|
|
635
283
|
async cleanupListeners() {
|
|
636
|
-
// Clean up all tracked listeners
|
|
637
284
|
await this.listenerCleanup.dispose();
|
|
638
|
-
// Clean up our own listeners
|
|
639
285
|
this.removeAllListeners();
|
|
640
|
-
// Listeners cleaned up by EventCleanupHelper
|
|
641
286
|
}
|
|
642
287
|
/**
|
|
643
288
|
* Get statistics about listener management
|
|
@@ -660,64 +305,7 @@ export class ComponentManager extends EventEmitter {
|
|
|
660
305
|
async registerComponent(name, instance) {
|
|
661
306
|
const startTime = Date.now();
|
|
662
307
|
console.log(`Registering component: ${name}`);
|
|
663
|
-
const component =
|
|
664
|
-
name,
|
|
665
|
-
initialize: async () => {
|
|
666
|
-
console.log(`Initializing component: ${name}`);
|
|
667
|
-
if (instance == null) {
|
|
668
|
-
throw new Error(`Component ${name} instance is null or undefined`);
|
|
669
|
-
}
|
|
670
|
-
// Handle component-specific initialization methods
|
|
671
|
-
let startMethod = null;
|
|
672
|
-
if (name === 'processManager' &&
|
|
673
|
-
instance.startMonitoring &&
|
|
674
|
-
typeof instance.startMonitoring === 'function') {
|
|
675
|
-
startMethod = instance.startMonitoring.bind(instance);
|
|
676
|
-
}
|
|
677
|
-
else if (instance.start && typeof instance.start === 'function') {
|
|
678
|
-
startMethod = instance.start.bind(instance);
|
|
679
|
-
}
|
|
680
|
-
if (startMethod) {
|
|
681
|
-
const initStartTime = Date.now();
|
|
682
|
-
// Add timeout for component initialization
|
|
683
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
684
|
-
setTimeout(() => {
|
|
685
|
-
reject(new Error(`Component ${name} initialization timed out after 30 seconds`));
|
|
686
|
-
}, 30000); // 30 second timeout
|
|
687
|
-
});
|
|
688
|
-
try {
|
|
689
|
-
// Handle both async and sync start methods
|
|
690
|
-
const startPromise = Promise.resolve(startMethod());
|
|
691
|
-
await Promise.race([startPromise, timeoutPromise]);
|
|
692
|
-
const initTime = Date.now() - initStartTime;
|
|
693
|
-
console.log(`Component ${name} initialization completed in ${initTime}ms`);
|
|
694
|
-
}
|
|
695
|
-
catch (error) {
|
|
696
|
-
console.error(`Component ${name} initialization failed:`, error);
|
|
697
|
-
throw error;
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
else {
|
|
701
|
-
console.log(`Component ${name} has no start() method - assuming ready`);
|
|
702
|
-
}
|
|
703
|
-
},
|
|
704
|
-
cleanup: async () => {
|
|
705
|
-
console.log(`Cleaning up component: ${name}`);
|
|
706
|
-
if (instance.stop && typeof instance.stop === 'function') {
|
|
707
|
-
await instance.stop();
|
|
708
|
-
}
|
|
709
|
-
else if (instance.cleanup && typeof instance.cleanup === 'function') {
|
|
710
|
-
await instance.cleanup();
|
|
711
|
-
}
|
|
712
|
-
console.log(`Component ${name} cleanup completed`);
|
|
713
|
-
},
|
|
714
|
-
isInitialized: () => {
|
|
715
|
-
if (instance.isRunning && typeof instance.isRunning === 'function') {
|
|
716
|
-
return instance.isRunning();
|
|
717
|
-
}
|
|
718
|
-
return true; // Assume initialized if no status method
|
|
719
|
-
},
|
|
720
|
-
};
|
|
308
|
+
const component = createComponentWrapper(name, instance);
|
|
721
309
|
this.components.set(name, component);
|
|
722
310
|
this.initializationOrder.push(name);
|
|
723
311
|
this.cleanupOrder.push(name);
|
|
@@ -756,31 +344,6 @@ export class ComponentManager extends EventEmitter {
|
|
|
756
344
|
this.ipcServer = undefined;
|
|
757
345
|
this.commandHandler = undefined;
|
|
758
346
|
}
|
|
759
|
-
/**
|
|
760
|
-
* Convert AppConfig to ProcessConfig format
|
|
761
|
-
*/
|
|
762
|
-
convertAppConfigToProcessConfig(
|
|
763
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
764
|
-
appConfig, appName
|
|
765
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
766
|
-
) {
|
|
767
|
-
return {
|
|
768
|
-
name: appName,
|
|
769
|
-
script: appConfig.script || appConfig.exec || 'node',
|
|
770
|
-
namespace: appConfig.namespace || 'default',
|
|
771
|
-
args: appConfig.args || [],
|
|
772
|
-
cwd: appConfig.cwd || process.cwd(),
|
|
773
|
-
env: { ...process.env, ...appConfig.env },
|
|
774
|
-
instances: appConfig.instances || 1,
|
|
775
|
-
autorestart: appConfig.autorestart ?? true,
|
|
776
|
-
watch: appConfig.watch ?? false,
|
|
777
|
-
max_memory_restart: appConfig.max_memory_restart || undefined,
|
|
778
|
-
max_restarts: appConfig.max_restarts || 15,
|
|
779
|
-
min_uptime: appConfig.min_uptime || 1000,
|
|
780
|
-
restart_delay: appConfig.restart_delay || 0,
|
|
781
|
-
note: appConfig.note || undefined,
|
|
782
|
-
};
|
|
783
|
-
}
|
|
784
347
|
/**
|
|
785
348
|
* Override EventEmitter methods for type safety
|
|
786
349
|
*/
|