@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
|
@@ -19,10 +19,10 @@ import { ProcessMonitorImpl } from './process-monitor.js';
|
|
|
19
19
|
import { ProcessPersistenceImpl } from './process-persistence.js';
|
|
20
20
|
import { ProcessGroupManagerImpl } from './process-group-manager.js';
|
|
21
21
|
import { ManagedProcessInfo } from './managed-process-info.js';
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
*
|
|
25
|
-
|
|
22
|
+
import { validateAppConfig, convertAppConfigToProcessConfig, } from './process-config.js';
|
|
23
|
+
import { setupEventForwarding, setupInternalEventHandlers, } from './process-event-forwarding.js';
|
|
24
|
+
import * as ProcessInfoQueries from './process-info-queries.js';
|
|
25
|
+
import * as BatchOps from './process-batch-operations.js';
|
|
26
26
|
/**
|
|
27
27
|
* ProcessManager - Main facade class for process management
|
|
28
28
|
*
|
|
@@ -51,7 +51,6 @@ export class ProcessManager extends EventEmitter {
|
|
|
51
51
|
this.monitor = new ProcessMonitorImpl(this.processes, this.childProcesses);
|
|
52
52
|
this.persistence = new ProcessPersistenceImpl(this.processes);
|
|
53
53
|
// Initialize persistence with default config
|
|
54
|
-
// Enhanced HOME detection: process.env.HOME || os.homedir()
|
|
55
54
|
const homeDir = process.env.HOME || os.homedir();
|
|
56
55
|
if (!homeDir && !persistenceFilePath) {
|
|
57
56
|
throw new Error('Unable to determine home directory for persistence path');
|
|
@@ -69,107 +68,9 @@ export class ProcessManager extends EventEmitter {
|
|
|
69
68
|
restartProcess: (name) => this.lifecycle.restartProcess(name),
|
|
70
69
|
});
|
|
71
70
|
// Forward events from components
|
|
72
|
-
this.
|
|
71
|
+
setupEventForwarding(this, this.processes, this.lifecycle, this.monitor, this.persistence, this.groups);
|
|
73
72
|
// Setup internal event handlers
|
|
74
|
-
this.
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Set up event forwarding from components to maintain compatibility
|
|
78
|
-
*/
|
|
79
|
-
setupEventForwarding() {
|
|
80
|
-
// Cast components to EventEmitter for event forwarding
|
|
81
|
-
const lifecycleEmitter = this.lifecycle;
|
|
82
|
-
const monitorEmitter = this.monitor;
|
|
83
|
-
const persistenceEmitter = this.persistence;
|
|
84
|
-
const groupsEmitter = this.groups;
|
|
85
|
-
// Forward lifecycle events
|
|
86
|
-
lifecycleEmitter.on('process:started', (name) => {
|
|
87
|
-
const processInfo = this.processes.get(name)?.getProcessInfo();
|
|
88
|
-
if (processInfo) {
|
|
89
|
-
this.emit('process:started', name, processInfo);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
lifecycleEmitter.on('process:stopped', (name) => {
|
|
93
|
-
const processInfo = this.processes.get(name)?.getProcessInfo();
|
|
94
|
-
if (processInfo) {
|
|
95
|
-
this.emit('process:stopped', name, processInfo);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
lifecycleEmitter.on('process:exit', (name, code, signal) => {
|
|
99
|
-
this.emit('process:exit', name, code, signal);
|
|
100
|
-
});
|
|
101
|
-
lifecycleEmitter.on('process:error', (name, error) => {
|
|
102
|
-
this.emit('process:error', name, error);
|
|
103
|
-
});
|
|
104
|
-
lifecycleEmitter.on('process:restart', (name) => {
|
|
105
|
-
this.emit('process:restart', name);
|
|
106
|
-
});
|
|
107
|
-
lifecycleEmitter.on('process:restarted', (name) => {
|
|
108
|
-
this.emit('process:restarted', name);
|
|
109
|
-
});
|
|
110
|
-
// Forward monitor events
|
|
111
|
-
monitorEmitter.on('process:memory-limit', (data) => {
|
|
112
|
-
this.emit('process:memory-limit', data.name, data.usage, data.limit);
|
|
113
|
-
});
|
|
114
|
-
monitorEmitter.on('process:unhealthy', (data) => {
|
|
115
|
-
this.emit('process:unhealthy', data.name, data.consecutiveFailures);
|
|
116
|
-
});
|
|
117
|
-
monitorEmitter.on('process:died', (data) => {
|
|
118
|
-
this.emit('process:died', data.name);
|
|
119
|
-
});
|
|
120
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
121
|
-
monitorEmitter.on('process:stats', (data) => {
|
|
122
|
-
this.emit('process:stats', data.name, data.stats);
|
|
123
|
-
});
|
|
124
|
-
// Forward persistence events
|
|
125
|
-
persistenceEmitter.on('persistence:saved', (filePath) => {
|
|
126
|
-
this.emit('persistence:saved', filePath);
|
|
127
|
-
});
|
|
128
|
-
persistenceEmitter.on('persistence:save-error', (error) => {
|
|
129
|
-
this.emit('persistence:save-error', error);
|
|
130
|
-
});
|
|
131
|
-
persistenceEmitter.on('persistence:loaded', (filePath, processCount) => {
|
|
132
|
-
this.emit('persistence:loaded', filePath, processCount);
|
|
133
|
-
});
|
|
134
|
-
persistenceEmitter.on('persistence:load-error', (error) => {
|
|
135
|
-
this.emit('persistence:load-error', error);
|
|
136
|
-
});
|
|
137
|
-
// Forward group events
|
|
138
|
-
groupsEmitter.on('namespace:operation-start', (namespace, operation) => {
|
|
139
|
-
this.emit('namespace:operation-start', namespace, operation);
|
|
140
|
-
});
|
|
141
|
-
groupsEmitter.on('namespace:operation-complete',
|
|
142
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
143
|
-
(namespace, operation, results) => {
|
|
144
|
-
this.emit('namespace:operation-complete', namespace, operation, results);
|
|
145
|
-
});
|
|
146
|
-
groupsEmitter.on('batch:operation-start', (processNames, operation) => {
|
|
147
|
-
this.emit('batch:operation-start', processNames, operation);
|
|
148
|
-
});
|
|
149
|
-
groupsEmitter.on('batch:operation-complete',
|
|
150
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
151
|
-
(operation, results) => {
|
|
152
|
-
this.emit('batch:operation-complete', operation, results);
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Set up internal event handlers for process management
|
|
157
|
-
*/
|
|
158
|
-
setupInternalEventHandlers() {
|
|
159
|
-
// Handle memory limit exceeded - trigger restart
|
|
160
|
-
this.on('process:memory-limit', async (name, usage, limit) => {
|
|
161
|
-
console.log(`Process '${name}' exceeded memory limit: ${Math.round(usage / 1024 / 1024)}MB > ${Math.round(limit / 1024 / 1024)}MB`);
|
|
162
|
-
const managedProcess = this.processes.get(name);
|
|
163
|
-
if (managedProcess && managedProcess.isAutoRestartEnabled()) {
|
|
164
|
-
console.log(`Auto-restarting process '${name}' due to memory limit`);
|
|
165
|
-
try {
|
|
166
|
-
await this.restartProcess(name);
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
console.error(`Failed to restart process '${name}' after memory limit:`, error);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
});
|
|
73
|
+
setupInternalEventHandlers(this, this.processes, (name) => this.restartProcess(name));
|
|
173
74
|
}
|
|
174
75
|
/**
|
|
175
76
|
* Static factory method to create ProcessManager with default components
|
|
@@ -178,134 +79,46 @@ export class ProcessManager extends EventEmitter {
|
|
|
178
79
|
return new ProcessManager(healthCheckInterval, memoryCheckInterval, persistenceFilePath);
|
|
179
80
|
}
|
|
180
81
|
// ===== CONFIGURATION MANAGEMENT =====
|
|
181
|
-
/**
|
|
182
|
-
* Configure a process from app configuration
|
|
183
|
-
*/
|
|
184
82
|
configureProcess(appConfig) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
throw new Error('App configuration cannot be null or undefined');
|
|
188
|
-
}
|
|
189
|
-
if (typeof appConfig !== 'object') {
|
|
190
|
-
throw new Error('App configuration must be an object');
|
|
191
|
-
}
|
|
192
|
-
if (!appConfig.name || typeof appConfig.name !== 'string') {
|
|
193
|
-
throw new Error('App configuration must have a valid name');
|
|
194
|
-
}
|
|
195
|
-
// Validate process name contains only safe characters
|
|
196
|
-
const namePattern = /^[a-zA-Z0-9_-]+$/;
|
|
197
|
-
if (!namePattern.test(appConfig.name.trim())) {
|
|
198
|
-
throw new Error(`Invalid process name: "${appConfig.name}". Name must contain only alphanumeric characters, hyphens, and underscores`);
|
|
199
|
-
}
|
|
200
|
-
const processConfig = this.convertAppConfigToProcessConfig(appConfig);
|
|
83
|
+
validateAppConfig(appConfig);
|
|
84
|
+
const processConfig = convertAppConfigToProcessConfig(appConfig);
|
|
201
85
|
this.processConfigs.set(appConfig.name, processConfig);
|
|
202
|
-
// Initialize process info if not exists
|
|
203
86
|
if (!this.processes.has(appConfig.name)) {
|
|
204
87
|
this.initializeProcess(appConfig.name);
|
|
205
88
|
}
|
|
206
89
|
}
|
|
207
|
-
/**
|
|
208
|
-
* Remove process configuration
|
|
209
|
-
*/
|
|
210
90
|
removeProcessConfig(name) {
|
|
211
91
|
this.processConfigs.delete(name);
|
|
212
92
|
}
|
|
213
|
-
/**
|
|
214
|
-
* Get process configuration
|
|
215
|
-
*/
|
|
216
93
|
getProcessConfig(name) {
|
|
217
94
|
return this.processConfigs.get(name);
|
|
218
95
|
}
|
|
219
|
-
// ===== PROCESS INFO ACCESS =====
|
|
220
|
-
/**
|
|
221
|
-
* Get process information
|
|
222
|
-
*/
|
|
96
|
+
// ===== PROCESS INFO ACCESS (delegated to ProcessInfoQueries) =====
|
|
223
97
|
getProcessInfo(name) {
|
|
224
|
-
|
|
225
|
-
return processInfo?.getProcessInfo();
|
|
98
|
+
return ProcessInfoQueries.getProcessInfo(this.processes, name);
|
|
226
99
|
}
|
|
227
|
-
/**
|
|
228
|
-
* Get all process information
|
|
229
|
-
*/
|
|
230
100
|
getAllProcessInfo() {
|
|
231
|
-
return
|
|
101
|
+
return ProcessInfoQueries.getAllProcessInfo(this.processes);
|
|
232
102
|
}
|
|
233
|
-
/**
|
|
234
|
-
* Get processes by namespace
|
|
235
|
-
*/
|
|
236
103
|
getProcessesByNamespace(namespace) {
|
|
237
|
-
return
|
|
238
|
-
.filter((p) => p.getProcessInfo().namespace === namespace)
|
|
239
|
-
.map((p) => p.getProcessInfo());
|
|
104
|
+
return ProcessInfoQueries.getProcessesByNamespace(this.processes, namespace);
|
|
240
105
|
}
|
|
241
|
-
/**
|
|
242
|
-
* Get process names by namespace
|
|
243
|
-
*/
|
|
244
106
|
getProcessNamesByNamespace(namespace) {
|
|
245
|
-
return
|
|
246
|
-
.filter((p) => p.getProcessInfo().namespace === namespace)
|
|
247
|
-
.map((p) => p.getProcessInfo().name);
|
|
107
|
+
return ProcessInfoQueries.getProcessNamesByNamespace(this.processes, namespace);
|
|
248
108
|
}
|
|
249
|
-
/**
|
|
250
|
-
* Get all namespaces
|
|
251
|
-
*/
|
|
252
109
|
getNamespaces() {
|
|
253
|
-
|
|
254
|
-
for (const processInfo of this.processes.values()) {
|
|
255
|
-
namespaces.add(processInfo.getProcessInfo().namespace || 'default');
|
|
256
|
-
}
|
|
257
|
-
return Array.from(namespaces).sort();
|
|
110
|
+
return ProcessInfoQueries.getNamespaces(this.processes);
|
|
258
111
|
}
|
|
259
|
-
/**
|
|
260
|
-
* Get namespace status
|
|
261
|
-
*/
|
|
262
112
|
getNamespaceStatus(namespace) {
|
|
263
|
-
|
|
264
|
-
const status = {
|
|
265
|
-
total: processes.length,
|
|
266
|
-
online: 0,
|
|
267
|
-
stopped: 0,
|
|
268
|
-
errored: 0,
|
|
269
|
-
starting: 0,
|
|
270
|
-
stopping: 0,
|
|
271
|
-
};
|
|
272
|
-
for (const process of processes) {
|
|
273
|
-
switch (process.status) {
|
|
274
|
-
case 'online':
|
|
275
|
-
status.online++;
|
|
276
|
-
break;
|
|
277
|
-
case 'stopped':
|
|
278
|
-
status.stopped++;
|
|
279
|
-
break;
|
|
280
|
-
case 'errored':
|
|
281
|
-
status.errored++;
|
|
282
|
-
break;
|
|
283
|
-
case 'starting':
|
|
284
|
-
status.starting++;
|
|
285
|
-
break;
|
|
286
|
-
case 'stopping':
|
|
287
|
-
status.stopping++;
|
|
288
|
-
break;
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
return status;
|
|
113
|
+
return ProcessInfoQueries.getNamespaceStatus(this.processes, namespace);
|
|
292
114
|
}
|
|
293
|
-
/**
|
|
294
|
-
* Get all process names
|
|
295
|
-
*/
|
|
296
115
|
getProcessNames() {
|
|
297
|
-
return
|
|
116
|
+
return ProcessInfoQueries.getProcessNames(this.processes);
|
|
298
117
|
}
|
|
299
|
-
/**
|
|
300
|
-
* Check if process exists
|
|
301
|
-
*/
|
|
302
118
|
hasProcess(name) {
|
|
303
|
-
return this.processes
|
|
119
|
+
return ProcessInfoQueries.hasProcess(this.processes, name);
|
|
304
120
|
}
|
|
305
121
|
// ===== PROCESS LIFECYCLE MANAGEMENT =====
|
|
306
|
-
/**
|
|
307
|
-
* Initialize a process (create ManagedProcessInfo)
|
|
308
|
-
*/
|
|
309
122
|
initializeProcess(name) {
|
|
310
123
|
if (this.processes.has(name)) {
|
|
311
124
|
return false;
|
|
@@ -316,7 +129,6 @@ export class ProcessManager extends EventEmitter {
|
|
|
316
129
|
}
|
|
317
130
|
const processInfo = new ManagedProcessInfo(config);
|
|
318
131
|
this.processes.set(name, processInfo);
|
|
319
|
-
// Forward ManagedProcessInfo events
|
|
320
132
|
processInfo.on('start', () => {
|
|
321
133
|
this.emit('process:started', name, processInfo.getProcessInfo());
|
|
322
134
|
});
|
|
@@ -328,25 +140,17 @@ export class ProcessManager extends EventEmitter {
|
|
|
328
140
|
});
|
|
329
141
|
return true;
|
|
330
142
|
}
|
|
331
|
-
/**
|
|
332
|
-
* Remove a process
|
|
333
|
-
*/
|
|
334
143
|
removeProcess(name) {
|
|
335
144
|
const processInfo = this.processes.get(name);
|
|
336
145
|
if (!processInfo) {
|
|
337
146
|
return false;
|
|
338
147
|
}
|
|
339
|
-
// Clean up and remove
|
|
340
148
|
processInfo.dispose();
|
|
341
149
|
this.processes.delete(name);
|
|
342
150
|
this.processConfigs.delete(name);
|
|
343
151
|
return true;
|
|
344
152
|
}
|
|
345
|
-
/**
|
|
346
|
-
* Start a process
|
|
347
|
-
*/
|
|
348
153
|
async startProcess(name) {
|
|
349
|
-
// t_wada boundary principle: validate inputs at boundaries
|
|
350
154
|
if (name == null) {
|
|
351
155
|
throw new Error('Process name cannot be null or undefined');
|
|
352
156
|
}
|
|
@@ -361,250 +165,147 @@ export class ProcessManager extends EventEmitter {
|
|
|
361
165
|
throw new Error(result.error || `Failed to start process: ${name}`);
|
|
362
166
|
}
|
|
363
167
|
}
|
|
364
|
-
/**
|
|
365
|
-
* Stop a process
|
|
366
|
-
*/
|
|
367
168
|
async stopProcess(name) {
|
|
368
169
|
const result = await this.lifecycle.stopProcess(name);
|
|
369
170
|
if (!result.success) {
|
|
370
171
|
throw new Error(result.error || `Failed to stop process: ${name}`);
|
|
371
172
|
}
|
|
372
173
|
}
|
|
373
|
-
/**
|
|
374
|
-
* Restart a process
|
|
375
|
-
*/
|
|
376
174
|
async restartProcess(name) {
|
|
377
175
|
const result = await this.lifecycle.restartProcess(name);
|
|
378
176
|
if (!result.success) {
|
|
379
177
|
throw new Error(result.error || `Failed to restart process: ${name}`);
|
|
380
178
|
}
|
|
381
179
|
}
|
|
382
|
-
// ===== BATCH OPERATIONS =====
|
|
383
|
-
/**
|
|
384
|
-
* Start multiple processes
|
|
385
|
-
*/
|
|
180
|
+
// ===== BATCH OPERATIONS (delegated to BatchOps) =====
|
|
386
181
|
async startProcesses(names) {
|
|
387
|
-
|
|
388
|
-
return result.results;
|
|
182
|
+
return BatchOps.startProcesses(this.groups, names);
|
|
389
183
|
}
|
|
390
|
-
/**
|
|
391
|
-
* Stop multiple processes
|
|
392
|
-
*/
|
|
393
184
|
async stopProcesses(names) {
|
|
394
|
-
|
|
395
|
-
return result.results;
|
|
185
|
+
return BatchOps.stopProcesses(this.groups, names);
|
|
396
186
|
}
|
|
397
|
-
/**
|
|
398
|
-
* Restart multiple processes
|
|
399
|
-
*/
|
|
400
187
|
async restartProcesses(names) {
|
|
401
|
-
|
|
402
|
-
return result.results;
|
|
188
|
+
return BatchOps.restartProcesses(this.groups, names);
|
|
403
189
|
}
|
|
404
|
-
/**
|
|
405
|
-
* Start all processes in a namespace
|
|
406
|
-
*/
|
|
407
190
|
async startNamespace(namespace) {
|
|
408
|
-
|
|
409
|
-
return result.results;
|
|
191
|
+
return BatchOps.startNamespace(this.groups, namespace);
|
|
410
192
|
}
|
|
411
|
-
/**
|
|
412
|
-
* Stop all processes in a namespace
|
|
413
|
-
*/
|
|
414
193
|
async stopNamespace(namespace) {
|
|
415
|
-
|
|
416
|
-
return result.results;
|
|
194
|
+
return BatchOps.stopNamespace(this.groups, namespace);
|
|
417
195
|
}
|
|
418
|
-
/**
|
|
419
|
-
* Restart all processes in a namespace
|
|
420
|
-
*/
|
|
421
196
|
async restartNamespace(namespace) {
|
|
422
|
-
|
|
423
|
-
return result.results;
|
|
197
|
+
return BatchOps.restartNamespace(this.groups, namespace);
|
|
424
198
|
}
|
|
425
199
|
// ===== MONITORING MANAGEMENT =====
|
|
426
|
-
/**
|
|
427
|
-
* Start monitoring all processes
|
|
428
|
-
*/
|
|
429
200
|
startMonitoring() {
|
|
430
201
|
this.monitor.startMonitoring({
|
|
431
202
|
healthCheckInterval: this.healthCheckInterval,
|
|
432
203
|
memoryCheckInterval: this.memoryCheckInterval,
|
|
433
204
|
});
|
|
434
205
|
}
|
|
435
|
-
/**
|
|
436
|
-
* Stop monitoring all processes
|
|
437
|
-
*/
|
|
438
206
|
stopMonitoring() {
|
|
439
207
|
this.monitor.stopMonitoring();
|
|
440
208
|
}
|
|
441
209
|
// ===== AUTO-RESTART MANAGEMENT =====
|
|
442
|
-
/**
|
|
443
|
-
* Enable auto-restart for a process
|
|
444
|
-
*/
|
|
445
210
|
enableAutoRestart(name) {
|
|
446
211
|
const processInfo = this.processes.get(name);
|
|
447
|
-
if (processInfo
|
|
448
|
-
|
|
449
|
-
processInfo.enableAutoRestart();
|
|
212
|
+
if (processInfo) {
|
|
213
|
+
processInfo.setAutoRestartEnabled(true);
|
|
450
214
|
}
|
|
451
215
|
}
|
|
452
|
-
/**
|
|
453
|
-
* Disable auto-restart for a process
|
|
454
|
-
*/
|
|
455
216
|
disableAutoRestart(name) {
|
|
456
217
|
const processInfo = this.processes.get(name);
|
|
457
|
-
if (processInfo
|
|
458
|
-
|
|
459
|
-
processInfo.disableAutoRestart();
|
|
218
|
+
if (processInfo) {
|
|
219
|
+
processInfo.setAutoRestartEnabled(false);
|
|
460
220
|
}
|
|
461
221
|
}
|
|
462
|
-
/**
|
|
463
|
-
* Reset restart failures for a process
|
|
464
|
-
*/
|
|
465
222
|
resetRestartFailures(name) {
|
|
466
223
|
const processInfo = this.processes.get(name);
|
|
467
|
-
if (processInfo
|
|
468
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
224
|
+
if (processInfo) {
|
|
469
225
|
processInfo.resetRestartFailures();
|
|
470
226
|
}
|
|
471
227
|
}
|
|
472
|
-
/**
|
|
473
|
-
* Get auto-restart status for a process
|
|
474
|
-
*/
|
|
475
228
|
getAutoRestartStatus(name) {
|
|
476
229
|
const processInfo = this.processes.get(name);
|
|
477
|
-
if (!processInfo
|
|
478
|
-
return {
|
|
479
|
-
enabled: false,
|
|
480
|
-
consecutiveFailures: 0,
|
|
481
|
-
};
|
|
230
|
+
if (!processInfo) {
|
|
231
|
+
return { enabled: false, consecutiveFailures: 0 };
|
|
482
232
|
}
|
|
483
|
-
|
|
484
|
-
|
|
233
|
+
return {
|
|
234
|
+
enabled: processInfo.isAutoRestartEnabled(),
|
|
235
|
+
consecutiveFailures: processInfo.getConsecutiveFailures(),
|
|
236
|
+
};
|
|
485
237
|
}
|
|
486
|
-
// ===== DEPENDENCY MANAGEMENT =====
|
|
487
|
-
/**
|
|
488
|
-
* Configure a process dependency
|
|
489
|
-
*/
|
|
238
|
+
// ===== DEPENDENCY MANAGEMENT (delegated to BatchOps) =====
|
|
490
239
|
configureDependency(dependency) {
|
|
491
|
-
this.groups
|
|
240
|
+
BatchOps.configureDependency(this.groups, dependency);
|
|
492
241
|
}
|
|
493
|
-
/**
|
|
494
|
-
* Remove a process dependency
|
|
495
|
-
*/
|
|
496
242
|
removeDependency(name) {
|
|
497
|
-
this.groups
|
|
243
|
+
BatchOps.removeDependency(this.groups, name);
|
|
498
244
|
}
|
|
499
|
-
/**
|
|
500
|
-
* Get process dependency
|
|
501
|
-
*/
|
|
502
245
|
getDependency(name) {
|
|
503
|
-
return this.groups
|
|
246
|
+
return BatchOps.getDependency(this.groups, name);
|
|
504
247
|
}
|
|
505
|
-
/**
|
|
506
|
-
* Get all dependencies
|
|
507
|
-
*/
|
|
508
248
|
getAllDependencies() {
|
|
509
|
-
return this.groups
|
|
249
|
+
return BatchOps.getAllDependencies(this.groups);
|
|
510
250
|
}
|
|
511
|
-
/**
|
|
512
|
-
* Resolve dependencies for a set of processes
|
|
513
|
-
*/
|
|
514
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
515
251
|
resolveDependencies(names) {
|
|
516
|
-
return this.groups
|
|
252
|
+
return BatchOps.resolveDependencies(this.groups, names);
|
|
517
253
|
}
|
|
518
|
-
/**
|
|
519
|
-
* Start processes with dependencies
|
|
520
|
-
*/
|
|
521
254
|
async startProcessesWithDependencies(processNames) {
|
|
522
|
-
// This is a placeholder for future implementation
|
|
523
|
-
// For now, just start processes in order
|
|
524
255
|
return this.startProcesses(processNames);
|
|
525
256
|
}
|
|
526
|
-
/**
|
|
527
|
-
* Start dependency monitoring
|
|
528
|
-
*/
|
|
529
257
|
startDependencyMonitoring() {
|
|
530
258
|
// Placeholder for future implementation
|
|
531
259
|
}
|
|
532
|
-
/**
|
|
533
|
-
* Stop dependency monitoring
|
|
534
|
-
*/
|
|
535
260
|
stopDependencyMonitoring() {
|
|
536
261
|
// Placeholder for future implementation
|
|
537
262
|
}
|
|
538
263
|
// ===== PERSISTENCE MANAGEMENT =====
|
|
539
|
-
/**
|
|
540
|
-
* Initialize the process manager
|
|
541
|
-
*/
|
|
542
264
|
async initialize() {
|
|
543
265
|
if (this.isInitialized) {
|
|
544
266
|
return;
|
|
545
267
|
}
|
|
546
|
-
// Load persisted state
|
|
547
268
|
const persistedProcesses = await this.persistence.loadState();
|
|
548
|
-
// Restore process states
|
|
549
269
|
for (const persistedProcess of persistedProcesses) {
|
|
550
|
-
// Check if we have a configuration for this process
|
|
551
270
|
const processInfo = this.processes.get(persistedProcess.name);
|
|
552
271
|
if (processInfo) {
|
|
553
|
-
// Restore the state
|
|
554
272
|
processInfo.restoreState(persistedProcess);
|
|
555
273
|
}
|
|
556
274
|
}
|
|
557
275
|
this.isInitialized = true;
|
|
558
276
|
}
|
|
559
|
-
/**
|
|
560
|
-
* Save current state
|
|
561
|
-
*/
|
|
562
277
|
async saveState() {
|
|
563
278
|
const processData = Array.from(this.processes.values()).map((p) => p.toJSON());
|
|
564
279
|
await this.persistence.saveState(processData);
|
|
565
280
|
}
|
|
566
|
-
/**
|
|
567
|
-
* Force save state immediately
|
|
568
|
-
*/
|
|
569
281
|
async forceSaveState() {
|
|
570
282
|
const processData = Array.from(this.processes.values()).map((p) => p.toJSON());
|
|
571
283
|
await this.persistence.forceSaveState(processData);
|
|
572
284
|
}
|
|
573
|
-
/**
|
|
574
|
-
* Get persistence file path
|
|
575
|
-
*/
|
|
576
285
|
getPersistenceFilePath() {
|
|
577
286
|
return this.persistence.getFilePath();
|
|
578
287
|
}
|
|
579
288
|
// ===== CLEANUP =====
|
|
580
|
-
/**
|
|
581
|
-
* Clean up all resources
|
|
582
|
-
*/
|
|
583
289
|
async cleanup() {
|
|
584
|
-
// Stop monitoring
|
|
585
290
|
this.stopMonitoring();
|
|
586
|
-
// Save final state
|
|
587
291
|
await this.forceSaveState();
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
cleanupPromises.push(this.groups.cleanup());
|
|
605
|
-
}
|
|
292
|
+
const cleanupIfAvailable = (component) => {
|
|
293
|
+
if ('cleanup' in component &&
|
|
294
|
+
typeof component.cleanup ===
|
|
295
|
+
'function') {
|
|
296
|
+
return component.cleanup();
|
|
297
|
+
}
|
|
298
|
+
return undefined;
|
|
299
|
+
};
|
|
300
|
+
const cleanupPromises = [
|
|
301
|
+
this.lifecycle,
|
|
302
|
+
this.monitor,
|
|
303
|
+
this.persistence,
|
|
304
|
+
this.groups,
|
|
305
|
+
]
|
|
306
|
+
.map(cleanupIfAvailable)
|
|
307
|
+
.filter(Boolean);
|
|
606
308
|
await Promise.all(cleanupPromises);
|
|
607
|
-
// Clean up processes
|
|
608
309
|
for (const processInfo of this.processes.values()) {
|
|
609
310
|
processInfo.dispose();
|
|
610
311
|
}
|
|
@@ -612,48 +313,7 @@ export class ProcessManager extends EventEmitter {
|
|
|
612
313
|
this.processConfigs.clear();
|
|
613
314
|
this.isInitialized = false;
|
|
614
315
|
}
|
|
615
|
-
// ===== HELPER METHODS =====
|
|
616
|
-
/**
|
|
617
|
-
* Convert AppConfig to ProcessConfig
|
|
618
|
-
*/
|
|
619
|
-
convertAppConfigToProcessConfig(appConfig) {
|
|
620
|
-
// Parse memory limit if specified
|
|
621
|
-
let max_memory_restart;
|
|
622
|
-
if (appConfig.max_memory_restart) {
|
|
623
|
-
const result = parseMemorySize(appConfig.max_memory_restart);
|
|
624
|
-
if (result.success && result.value) {
|
|
625
|
-
max_memory_restart = result.value;
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
const processConfig = {
|
|
629
|
-
name: appConfig.name,
|
|
630
|
-
script: appConfig.script,
|
|
631
|
-
cwd: appConfig.cwd || process.cwd(),
|
|
632
|
-
args: appConfig.args
|
|
633
|
-
? appConfig.args.split(' ').filter((arg) => arg.length > 0)
|
|
634
|
-
: [],
|
|
635
|
-
namespace: appConfig.namespace || 'default',
|
|
636
|
-
instances: 1, // AppConfig doesn't have instances
|
|
637
|
-
autorestart: true, // Default to true for auto-restart
|
|
638
|
-
watch: false, // AppConfig doesn't have watch
|
|
639
|
-
max_memory_restart,
|
|
640
|
-
max_restarts: 10, // Default max restarts
|
|
641
|
-
min_uptime: 1000, // Default min uptime
|
|
642
|
-
restart_delay: 1000, // Default restart delay
|
|
643
|
-
note: appConfig.note,
|
|
644
|
-
env: {},
|
|
645
|
-
};
|
|
646
|
-
// Process environment variables (remove undefined values)
|
|
647
|
-
if (appConfig.env) {
|
|
648
|
-
for (const [key, value] of Object.entries(appConfig.env)) {
|
|
649
|
-
if (value !== undefined) {
|
|
650
|
-
processConfig.env[key] = value;
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
return processConfig;
|
|
655
|
-
}
|
|
656
316
|
}
|
|
657
|
-
|
|
317
|
+
export { validateAppConfig, convertAppConfigToProcessConfig, } from './process-config.js';
|
|
658
318
|
export { ManagedProcessInfo, };
|
|
659
319
|
//# sourceMappingURL=process-manager.js.map
|