@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.
Files changed (204) hide show
  1. package/dist/src/cli/commands/help.d.ts.map +1 -1
  2. package/dist/src/cli/commands/help.js +3 -1
  3. package/dist/src/cli/commands/help.js.map +1 -1
  4. package/dist/src/cli/index.js +6 -2
  5. package/dist/src/cli/index.js.map +1 -1
  6. package/dist/src/cli/parser.d.ts.map +1 -1
  7. package/dist/src/cli/parser.js +20 -0
  8. package/dist/src/cli/parser.js.map +1 -1
  9. package/dist/src/cli/utils/find-package-json.d.ts +4 -0
  10. package/dist/src/cli/utils/find-package-json.d.ts.map +1 -0
  11. package/dist/src/cli/utils/find-package-json.js +15 -0
  12. package/dist/src/cli/utils/find-package-json.js.map +1 -0
  13. package/dist/src/config/config-loader.d.ts +1 -0
  14. package/dist/src/config/config-loader.d.ts.map +1 -1
  15. package/dist/src/config/config-loader.js +16 -6
  16. package/dist/src/config/config-loader.js.map +1 -1
  17. package/dist/src/config/config-validator.d.ts +18 -49
  18. package/dist/src/config/config-validator.d.ts.map +1 -1
  19. package/dist/src/config/config-validator.js +64 -172
  20. package/dist/src/config/config-validator.js.map +1 -1
  21. package/dist/src/config/path-security-validator.d.ts +39 -0
  22. package/dist/src/config/path-security-validator.d.ts.map +1 -0
  23. package/dist/src/config/path-security-validator.js +134 -0
  24. package/dist/src/config/path-security-validator.js.map +1 -0
  25. package/dist/src/config/secure-config-loader.d.ts.map +1 -1
  26. package/dist/src/config/secure-config-loader.js +10 -2
  27. package/dist/src/config/secure-config-loader.js.map +1 -1
  28. package/dist/src/config/validation-suggestions.d.ts +13 -0
  29. package/dist/src/config/validation-suggestions.d.ts.map +1 -0
  30. package/dist/src/config/validation-suggestions.js +40 -0
  31. package/dist/src/config/validation-suggestions.js.map +1 -0
  32. package/dist/src/config/validation-types.d.ts +38 -0
  33. package/dist/src/config/validation-types.d.ts.map +1 -0
  34. package/dist/src/config/validation-types.js +7 -0
  35. package/dist/src/config/validation-types.js.map +1 -0
  36. package/dist/src/daemon/component-command-wiring.d.ts +19 -0
  37. package/dist/src/daemon/component-command-wiring.d.ts.map +1 -0
  38. package/dist/src/daemon/component-command-wiring.js +27 -0
  39. package/dist/src/daemon/component-command-wiring.js.map +1 -0
  40. package/dist/src/daemon/component-daemon-interface.d.ts +38 -0
  41. package/dist/src/daemon/component-daemon-interface.d.ts.map +1 -0
  42. package/dist/src/daemon/component-daemon-interface.js +72 -0
  43. package/dist/src/daemon/component-daemon-interface.js.map +1 -0
  44. package/dist/src/daemon/component-health.d.ts +38 -0
  45. package/dist/src/daemon/component-health.d.ts.map +1 -0
  46. package/dist/src/daemon/component-health.js +146 -0
  47. package/dist/src/daemon/component-health.js.map +1 -0
  48. package/dist/src/daemon/component-manager-errors.d.ts +20 -0
  49. package/dist/src/daemon/component-manager-errors.d.ts.map +1 -0
  50. package/dist/src/daemon/component-manager-errors.js +30 -0
  51. package/dist/src/daemon/component-manager-errors.js.map +1 -0
  52. package/dist/src/daemon/component-manager-types.d.ts +23 -0
  53. package/dist/src/daemon/component-manager-types.d.ts.map +1 -0
  54. package/dist/src/daemon/component-manager-types.js +5 -0
  55. package/dist/src/daemon/component-manager-types.js.map +1 -0
  56. package/dist/src/daemon/component-manager.d.ts +16 -64
  57. package/dist/src/daemon/component-manager.d.ts.map +1 -1
  58. package/dist/src/daemon/component-manager.js +72 -509
  59. package/dist/src/daemon/component-manager.js.map +1 -1
  60. package/dist/src/daemon/component-registration.d.ts +14 -0
  61. package/dist/src/daemon/component-registration.d.ts.map +1 -0
  62. package/dist/src/daemon/component-registration.js +92 -0
  63. package/dist/src/daemon/component-registration.js.map +1 -0
  64. package/dist/src/daemon/component-streaming.d.ts +36 -0
  65. package/dist/src/daemon/component-streaming.d.ts.map +1 -0
  66. package/dist/src/daemon/component-streaming.js +112 -0
  67. package/dist/src/daemon/component-streaming.js.map +1 -0
  68. package/dist/src/daemon/daemon-lifecycle.d.ts +37 -0
  69. package/dist/src/daemon/daemon-lifecycle.d.ts.map +1 -0
  70. package/dist/src/daemon/daemon-lifecycle.js +362 -0
  71. package/dist/src/daemon/daemon-lifecycle.js.map +1 -0
  72. package/dist/src/daemon/daemon-queries.d.ts +53 -0
  73. package/dist/src/daemon/daemon-queries.d.ts.map +1 -0
  74. package/dist/src/daemon/daemon-queries.js +113 -0
  75. package/dist/src/daemon/daemon-queries.js.map +1 -0
  76. package/dist/src/daemon/daemon-types.d.ts +30 -0
  77. package/dist/src/daemon/daemon-types.d.ts.map +1 -0
  78. package/dist/src/daemon/daemon-types.js +8 -0
  79. package/dist/src/daemon/daemon-types.js.map +1 -0
  80. package/dist/src/daemon/disposable-base.d.ts +49 -0
  81. package/dist/src/daemon/disposable-base.d.ts.map +1 -0
  82. package/dist/src/daemon/disposable-base.js +70 -0
  83. package/dist/src/daemon/disposable-base.js.map +1 -0
  84. package/dist/src/daemon/disposal-guard.d.ts +27 -0
  85. package/dist/src/daemon/disposal-guard.d.ts.map +1 -0
  86. package/dist/src/daemon/disposal-guard.js +58 -0
  87. package/dist/src/daemon/disposal-guard.js.map +1 -0
  88. package/dist/src/daemon/ipc-command-handler.d.ts +8 -34
  89. package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -1
  90. package/dist/src/daemon/ipc-command-handler.js +14 -362
  91. package/dist/src/daemon/ipc-command-handler.js.map +1 -1
  92. package/dist/src/daemon/log-command-handlers.d.ts +19 -0
  93. package/dist/src/daemon/log-command-handlers.d.ts.map +1 -0
  94. package/dist/src/daemon/log-command-handlers.js +114 -0
  95. package/dist/src/daemon/log-command-handlers.js.map +1 -0
  96. package/dist/src/daemon/process-command-handlers.d.ts +32 -0
  97. package/dist/src/daemon/process-command-handlers.d.ts.map +1 -0
  98. package/dist/src/daemon/process-command-handlers.js +223 -0
  99. package/dist/src/daemon/process-command-handlers.js.map +1 -0
  100. package/dist/src/daemon/procman-daemon.d.ts +22 -98
  101. package/dist/src/daemon/procman-daemon.d.ts.map +1 -1
  102. package/dist/src/daemon/procman-daemon.js +107 -604
  103. package/dist/src/daemon/procman-daemon.js.map +1 -1
  104. package/dist/src/daemon/resource-manager.d.ts +6 -124
  105. package/dist/src/daemon/resource-manager.d.ts.map +1 -1
  106. package/dist/src/daemon/resource-manager.js +5 -231
  107. package/dist/src/daemon/resource-manager.js.map +1 -1
  108. package/dist/src/daemon/resource-types.d.ts +23 -0
  109. package/dist/src/daemon/resource-types.d.ts.map +1 -0
  110. package/dist/src/daemon/resource-types.js +7 -0
  111. package/dist/src/daemon/resource-types.js.map +1 -0
  112. package/dist/src/daemon/shutdown-orchestrator.d.ts +32 -0
  113. package/dist/src/daemon/shutdown-orchestrator.d.ts.map +1 -0
  114. package/dist/src/daemon/shutdown-orchestrator.js +123 -0
  115. package/dist/src/daemon/shutdown-orchestrator.js.map +1 -0
  116. package/dist/src/daemon/tracked-resources.d.ts +60 -0
  117. package/dist/src/daemon/tracked-resources.d.ts.map +1 -0
  118. package/dist/src/daemon/tracked-resources.js +124 -0
  119. package/dist/src/daemon/tracked-resources.js.map +1 -0
  120. package/dist/src/process-manager/index.d.ts +5 -1
  121. package/dist/src/process-manager/index.d.ts.map +1 -1
  122. package/dist/src/process-manager/index.js +3 -0
  123. package/dist/src/process-manager/index.js.map +1 -1
  124. package/dist/src/process-manager/interfaces/process-group.d.ts +6 -0
  125. package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -1
  126. package/dist/src/process-manager/managed-process-events.d.ts +22 -0
  127. package/dist/src/process-manager/managed-process-events.d.ts.map +1 -0
  128. package/dist/src/process-manager/managed-process-events.js +5 -0
  129. package/dist/src/process-manager/managed-process-events.js.map +1 -0
  130. package/dist/src/process-manager/managed-process-info.d.ts +11 -53
  131. package/dist/src/process-manager/managed-process-info.d.ts.map +1 -1
  132. package/dist/src/process-manager/managed-process-info.js +46 -133
  133. package/dist/src/process-manager/managed-process-info.js.map +1 -1
  134. package/dist/src/process-manager/process-batch-operations.d.ts +62 -0
  135. package/dist/src/process-manager/process-batch-operations.d.ts.map +1 -0
  136. package/dist/src/process-manager/process-batch-operations.js +80 -0
  137. package/dist/src/process-manager/process-batch-operations.js.map +1 -0
  138. package/dist/src/process-manager/process-config.d.ts +49 -0
  139. package/dist/src/process-manager/process-config.d.ts.map +1 -0
  140. package/dist/src/process-manager/process-config.js +68 -0
  141. package/dist/src/process-manager/process-config.js.map +1 -0
  142. package/dist/src/process-manager/process-event-forwarding.d.ts +18 -0
  143. package/dist/src/process-manager/process-event-forwarding.d.ts.map +1 -0
  144. package/dist/src/process-manager/process-event-forwarding.js +105 -0
  145. package/dist/src/process-manager/process-event-forwarding.js.map +1 -0
  146. package/dist/src/process-manager/process-group-manager.d.ts.map +1 -1
  147. package/dist/src/process-manager/process-group-manager.js +0 -1
  148. package/dist/src/process-manager/process-group-manager.js.map +1 -1
  149. package/dist/src/process-manager/process-info-queries.d.ts +48 -0
  150. package/dist/src/process-manager/process-info-queries.d.ts.map +1 -0
  151. package/dist/src/process-manager/process-info-queries.js +92 -0
  152. package/dist/src/process-manager/process-info-queries.js.map +1 -0
  153. package/dist/src/process-manager/process-manager.d.ts +5 -174
  154. package/dist/src/process-manager/process-manager.d.ts.map +1 -1
  155. package/dist/src/process-manager/process-manager.js +58 -398
  156. package/dist/src/process-manager/process-manager.js.map +1 -1
  157. package/dist/src/process-manager/process-monitoring.d.ts +80 -0
  158. package/dist/src/process-manager/process-monitoring.d.ts.map +1 -0
  159. package/dist/src/process-manager/process-monitoring.js +142 -0
  160. package/dist/src/process-manager/process-monitoring.js.map +1 -0
  161. package/dist/src/process-manager/process-statistics.d.ts +37 -0
  162. package/dist/src/process-manager/process-statistics.d.ts.map +1 -0
  163. package/dist/src/process-manager/process-statistics.js +24 -0
  164. package/dist/src/process-manager/process-statistics.js.map +1 -0
  165. package/dist/src/process-manager/restart-manager.d.ts +82 -0
  166. package/dist/src/process-manager/restart-manager.d.ts.map +1 -0
  167. package/dist/src/process-manager/restart-manager.js +150 -0
  168. package/dist/src/process-manager/restart-manager.js.map +1 -0
  169. package/dist/src/services/app-logger.d.ts +144 -0
  170. package/dist/src/services/app-logger.d.ts.map +1 -0
  171. package/dist/src/services/app-logger.js +489 -0
  172. package/dist/src/services/app-logger.js.map +1 -0
  173. package/dist/src/services/log-buffer.d.ts +35 -0
  174. package/dist/src/services/log-buffer.d.ts.map +1 -0
  175. package/dist/src/services/log-buffer.js +87 -0
  176. package/dist/src/services/log-buffer.js.map +1 -0
  177. package/dist/src/services/log-event-manager.d.ts +32 -0
  178. package/dist/src/services/log-event-manager.d.ts.map +1 -0
  179. package/dist/src/services/log-event-manager.js +31 -0
  180. package/dist/src/services/log-event-manager.js.map +1 -0
  181. package/dist/src/services/log-file-manager.d.ts +46 -0
  182. package/dist/src/services/log-file-manager.d.ts.map +1 -0
  183. package/dist/src/services/log-file-manager.js +156 -0
  184. package/dist/src/services/log-file-manager.js.map +1 -0
  185. package/dist/src/services/log-level-strategy.d.ts +19 -0
  186. package/dist/src/services/log-level-strategy.d.ts.map +1 -0
  187. package/dist/src/services/log-level-strategy.js +40 -0
  188. package/dist/src/services/log-level-strategy.js.map +1 -0
  189. package/dist/src/services/log-manager-types.d.ts +117 -0
  190. package/dist/src/services/log-manager-types.d.ts.map +1 -0
  191. package/dist/src/services/log-manager-types.js +12 -0
  192. package/dist/src/services/log-manager-types.js.map +1 -0
  193. package/dist/src/services/log-manager.d.ts +8 -35
  194. package/dist/src/services/log-manager.d.ts.map +1 -1
  195. package/dist/src/services/log-manager.js +10 -870
  196. package/dist/src/services/log-manager.js.map +1 -1
  197. package/dist/src/services/log-preprocessor.d.ts +30 -0
  198. package/dist/src/services/log-preprocessor.d.ts.map +1 -0
  199. package/dist/src/services/log-preprocessor.js +65 -0
  200. package/dist/src/services/log-preprocessor.js.map +1 -0
  201. package/dist/src/services/process-log-integration.d.ts +7 -2
  202. package/dist/src/services/process-log-integration.d.ts.map +1 -1
  203. package/dist/src/services/process-log-integration.js.map +1 -1
  204. 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 { LOG_STREAM_EVENTS, STREAM_CONFIG, STREAM_MESSAGE_TYPES, } from '../shared/constants-streaming.js';
15
- /**
16
- * Component initialization error
17
- */
18
- export class ComponentInitializationError extends Error {
19
- componentName;
20
- originalError;
21
- constructor(componentName, originalError) {
22
- super(`Failed to initialize component '${componentName}': ${originalError.message}`);
23
- this.componentName = componentName;
24
- this.originalError = originalError;
25
- this.name = 'ComponentInitializationError';
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
- // Initialize components in order with progress logging
81
- console.log('Initializing ConfigLoader...');
82
- await this.initializeConfigLoader();
83
- console.log('ConfigLoader initialized successfully');
84
- console.log('Initializing ProcessManager...');
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 (after streaming sessions are already cleaned up)
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
- const details = {};
173
- let allHealthy = true;
174
- // Check ConfigLoader health
175
- if (this.configLoader) {
176
- try {
177
- // ConfigLoader is healthy if it exists and can load configuration
178
- // Since there's no isInitialized method, assume healthy if instance exists
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
- * Initialize config loader
166
+ * Helper to initialize a component with standard error handling
324
167
  */
325
- async initializeConfigLoader() {
168
+ async initializeWithErrorHandling(componentName, initFn) {
326
169
  try {
327
- this.configLoader = new ConfigLoader();
328
- await this.registerComponent('configLoader', this.configLoader);
329
- this.emit('componentStarted', 'configLoader');
170
+ await initFn();
171
+ this.emit('componentStarted', componentName);
330
172
  }
331
173
  catch (error) {
332
- const initError = new ComponentInitializationError('configLoader', error);
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', 'configLoader', initError);
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
- try {
196
+ await this.initializeWithErrorHandling('processManager', async () => {
343
197
  this.processManager = ProcessManager.create();
344
198
  await this.registerComponent('processManager', this.processManager);
345
- this.emit('componentStarted', 'processManager');
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
- try {
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
- this.emit('componentStarted', 'logManager');
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
- try {
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
- this.emit('componentStarted', 'ipcServer');
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
- try {
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
- this.emit('componentStarted', 'commandHandler');
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
- getAllProcessStatuses: async () => {
432
- // Implementation moved from ProcmanDaemon
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
- const commandTypes = [
500
- 'load',
501
- 'start',
502
- 'stop',
503
- 'restart',
504
- 'list',
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
- // Clean up streaming sessions first
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
  */