@masuidrive/procman 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/src/cli/commands/clear-log.d.ts +10 -0
- package/dist/src/cli/commands/clear-log.d.ts.map +1 -0
- package/dist/src/cli/commands/clear-log.js +77 -0
- package/dist/src/cli/commands/clear-log.js.map +1 -0
- package/dist/src/cli/commands/exit.d.ts +10 -0
- package/dist/src/cli/commands/exit.d.ts.map +1 -0
- package/dist/src/cli/commands/exit.js +65 -0
- package/dist/src/cli/commands/exit.js.map +1 -0
- package/dist/src/cli/commands/help.d.ts +10 -0
- package/dist/src/cli/commands/help.d.ts.map +1 -0
- package/dist/src/cli/commands/help.js +340 -0
- package/dist/src/cli/commands/help.js.map +1 -0
- package/dist/src/cli/commands/list.d.ts +11 -0
- package/dist/src/cli/commands/list.d.ts.map +1 -0
- package/dist/src/cli/commands/list.js +130 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/load.d.ts +11 -0
- package/dist/src/cli/commands/load.d.ts.map +1 -0
- package/dist/src/cli/commands/load.js +250 -0
- package/dist/src/cli/commands/load.js.map +1 -0
- package/dist/src/cli/commands/log.d.ts +18 -0
- package/dist/src/cli/commands/log.d.ts.map +1 -0
- package/dist/src/cli/commands/log.js +282 -0
- package/dist/src/cli/commands/log.js.map +1 -0
- package/dist/src/cli/commands/restart.d.ts +11 -0
- package/dist/src/cli/commands/restart.d.ts.map +1 -0
- package/dist/src/cli/commands/restart.js +99 -0
- package/dist/src/cli/commands/restart.js.map +1 -0
- package/dist/src/cli/commands/start.d.ts +11 -0
- package/dist/src/cli/commands/start.d.ts.map +1 -0
- package/dist/src/cli/commands/start.js +105 -0
- package/dist/src/cli/commands/start.js.map +1 -0
- package/dist/src/cli/commands/stop.d.ts +12 -0
- package/dist/src/cli/commands/stop.d.ts.map +1 -0
- package/dist/src/cli/commands/stop.js +105 -0
- package/dist/src/cli/commands/stop.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +28 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/parser.d.ts +14 -0
- package/dist/src/cli/parser.d.ts.map +1 -0
- package/dist/src/cli/parser.js +131 -0
- package/dist/src/cli/parser.js.map +1 -0
- package/dist/src/cli/signal-handler.d.ts +51 -0
- package/dist/src/cli/signal-handler.d.ts.map +1 -0
- package/dist/src/cli/signal-handler.js +129 -0
- package/dist/src/cli/signal-handler.js.map +1 -0
- package/dist/src/cli/utils/error-handler.d.ts +39 -0
- package/dist/src/cli/utils/error-handler.d.ts.map +1 -0
- package/dist/src/cli/utils/error-handler.js +200 -0
- package/dist/src/cli/utils/error-handler.js.map +1 -0
- package/dist/src/cli/utils/error-utils.d.ts +16 -0
- package/dist/src/cli/utils/error-utils.d.ts.map +1 -0
- package/dist/src/cli/utils/error-utils.js +48 -0
- package/dist/src/cli/utils/error-utils.js.map +1 -0
- package/dist/src/cli/utils/ipc-client.d.ts +80 -0
- package/dist/src/cli/utils/ipc-client.d.ts.map +1 -0
- package/dist/src/cli/utils/ipc-client.js +275 -0
- package/dist/src/cli/utils/ipc-client.js.map +1 -0
- package/dist/src/config/config-loader.d.ts +74 -0
- package/dist/src/config/config-loader.d.ts.map +1 -0
- package/dist/src/config/config-loader.js +229 -0
- package/dist/src/config/config-loader.js.map +1 -0
- package/dist/src/config/config-normalizer.d.ts +135 -0
- package/dist/src/config/config-normalizer.d.ts.map +1 -0
- package/dist/src/config/config-normalizer.js +309 -0
- package/dist/src/config/config-normalizer.js.map +1 -0
- package/dist/src/config/config-reporter.d.ts +183 -0
- package/dist/src/config/config-reporter.d.ts.map +1 -0
- package/dist/src/config/config-reporter.js +311 -0
- package/dist/src/config/config-reporter.js.map +1 -0
- package/dist/src/config/config-validator.d.ts +163 -0
- package/dist/src/config/config-validator.d.ts.map +1 -0
- package/dist/src/config/config-validator.js +489 -0
- package/dist/src/config/config-validator.js.map +1 -0
- package/dist/src/config/config-watcher.d.ts +161 -0
- package/dist/src/config/config-watcher.d.ts.map +1 -0
- package/dist/src/config/config-watcher.js +245 -0
- package/dist/src/config/config-watcher.js.map +1 -0
- package/dist/src/config/index.d.ts +36 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +41 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/secure-config-loader.d.ts +77 -0
- package/dist/src/config/secure-config-loader.d.ts.map +1 -0
- package/dist/src/config/secure-config-loader.js +326 -0
- package/dist/src/config/secure-config-loader.js.map +1 -0
- package/dist/src/daemon/base-socket-connection.d.ts +66 -0
- package/dist/src/daemon/base-socket-connection.d.ts.map +1 -0
- package/dist/src/daemon/base-socket-connection.js +192 -0
- package/dist/src/daemon/base-socket-connection.js.map +1 -0
- package/dist/src/daemon/component-manager.d.ts +180 -0
- package/dist/src/daemon/component-manager.d.ts.map +1 -0
- package/dist/src/daemon/component-manager.js +794 -0
- package/dist/src/daemon/component-manager.js.map +1 -0
- package/dist/src/daemon/crash-recovery.d.ts +71 -0
- package/dist/src/daemon/crash-recovery.d.ts.map +1 -0
- package/dist/src/daemon/crash-recovery.js +282 -0
- package/dist/src/daemon/crash-recovery.js.map +1 -0
- package/dist/src/daemon/daemon-main.d.ts +18 -0
- package/dist/src/daemon/daemon-main.d.ts.map +1 -0
- package/dist/src/daemon/daemon-main.js +160 -0
- package/dist/src/daemon/daemon-main.js.map +1 -0
- package/dist/src/daemon/daemon-state-manager.d.ts +111 -0
- package/dist/src/daemon/daemon-state-manager.d.ts.map +1 -0
- package/dist/src/daemon/daemon-state-manager.js +194 -0
- package/dist/src/daemon/daemon-state-manager.js.map +1 -0
- package/dist/src/daemon/data-directory.d.ts +51 -0
- package/dist/src/daemon/data-directory.d.ts.map +1 -0
- package/dist/src/daemon/data-directory.js +136 -0
- package/dist/src/daemon/data-directory.js.map +1 -0
- package/dist/src/daemon/index.d.ts +20 -0
- package/dist/src/daemon/index.d.ts.map +1 -0
- package/dist/src/daemon/index.js +24 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/ipc-client-base.d.ts +153 -0
- package/dist/src/daemon/ipc-client-base.d.ts.map +1 -0
- package/dist/src/daemon/ipc-client-base.js +476 -0
- package/dist/src/daemon/ipc-client-base.js.map +1 -0
- package/dist/src/daemon/ipc-command-handler.d.ts +107 -0
- package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -0
- package/dist/src/daemon/ipc-command-handler.js +483 -0
- package/dist/src/daemon/ipc-command-handler.js.map +1 -0
- package/dist/src/daemon/ipc-factory.d.ts +92 -0
- package/dist/src/daemon/ipc-factory.d.ts.map +1 -0
- package/dist/src/daemon/ipc-factory.js +210 -0
- package/dist/src/daemon/ipc-factory.js.map +1 -0
- package/dist/src/daemon/ipc-server-base.d.ts +158 -0
- package/dist/src/daemon/ipc-server-base.d.ts.map +1 -0
- package/dist/src/daemon/ipc-server-base.js +491 -0
- package/dist/src/daemon/ipc-server-base.js.map +1 -0
- package/dist/src/daemon/message-protocol.d.ts +132 -0
- package/dist/src/daemon/message-protocol.d.ts.map +1 -0
- package/dist/src/daemon/message-protocol.js +252 -0
- package/dist/src/daemon/message-protocol.js.map +1 -0
- package/dist/src/daemon/named-pipe-client.d.ts +61 -0
- package/dist/src/daemon/named-pipe-client.d.ts.map +1 -0
- package/dist/src/daemon/named-pipe-client.js +221 -0
- package/dist/src/daemon/named-pipe-client.js.map +1 -0
- package/dist/src/daemon/named-pipe-server.d.ts +40 -0
- package/dist/src/daemon/named-pipe-server.d.ts.map +1 -0
- package/dist/src/daemon/named-pipe-server.js +102 -0
- package/dist/src/daemon/named-pipe-server.js.map +1 -0
- package/dist/src/daemon/orphan-detector.d.ts +66 -0
- package/dist/src/daemon/orphan-detector.d.ts.map +1 -0
- package/dist/src/daemon/orphan-detector.js +208 -0
- package/dist/src/daemon/orphan-detector.js.map +1 -0
- package/dist/src/daemon/pid-manager.d.ts +49 -0
- package/dist/src/daemon/pid-manager.d.ts.map +1 -0
- package/dist/src/daemon/pid-manager.js +110 -0
- package/dist/src/daemon/pid-manager.js.map +1 -0
- package/dist/src/daemon/procman-daemon.d.ts +188 -0
- package/dist/src/daemon/procman-daemon.d.ts.map +1 -0
- package/dist/src/daemon/procman-daemon.js +802 -0
- package/dist/src/daemon/procman-daemon.js.map +1 -0
- package/dist/src/daemon/reconnection-system.d.ts +113 -0
- package/dist/src/daemon/reconnection-system.d.ts.map +1 -0
- package/dist/src/daemon/reconnection-system.js +223 -0
- package/dist/src/daemon/reconnection-system.js.map +1 -0
- package/dist/src/daemon/resource-manager.d.ts +204 -0
- package/dist/src/daemon/resource-manager.d.ts.map +1 -0
- package/dist/src/daemon/resource-manager.js +423 -0
- package/dist/src/daemon/resource-manager.js.map +1 -0
- package/dist/src/daemon/signal-handler.d.ts +58 -0
- package/dist/src/daemon/signal-handler.d.ts.map +1 -0
- package/dist/src/daemon/signal-handler.js +142 -0
- package/dist/src/daemon/signal-handler.js.map +1 -0
- package/dist/src/daemon/simple-resource-manager.d.ts +95 -0
- package/dist/src/daemon/simple-resource-manager.d.ts.map +1 -0
- package/dist/src/daemon/simple-resource-manager.js +180 -0
- package/dist/src/daemon/simple-resource-manager.js.map +1 -0
- package/dist/src/daemon/unix-socket-client.d.ts +69 -0
- package/dist/src/daemon/unix-socket-client.d.ts.map +1 -0
- package/dist/src/daemon/unix-socket-client.js +313 -0
- package/dist/src/daemon/unix-socket-client.js.map +1 -0
- package/dist/src/daemon/unix-socket-server.d.ts +61 -0
- package/dist/src/daemon/unix-socket-server.d.ts.map +1 -0
- package/dist/src/daemon/unix-socket-server.js +262 -0
- package/dist/src/daemon/unix-socket-server.js.map +1 -0
- package/dist/src/daemon/zombie-reaper.d.ts +83 -0
- package/dist/src/daemon/zombie-reaper.d.ts.map +1 -0
- package/dist/src/daemon/zombie-reaper.js +278 -0
- package/dist/src/daemon/zombie-reaper.js.map +1 -0
- package/dist/src/process-manager/index.d.ts +13 -0
- package/dist/src/process-manager/index.d.ts.map +1 -0
- package/dist/src/process-manager/index.js +11 -0
- package/dist/src/process-manager/index.js.map +1 -0
- package/dist/src/process-manager/interfaces/index.d.ts +31 -0
- package/dist/src/process-manager/interfaces/index.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/index.js +14 -0
- package/dist/src/process-manager/interfaces/index.js.map +1 -0
- package/dist/src/process-manager/interfaces/process-group.d.ts +200 -0
- package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/process-group.js +10 -0
- package/dist/src/process-manager/interfaces/process-group.js.map +1 -0
- package/dist/src/process-manager/interfaces/process-lifecycle.d.ts +97 -0
- package/dist/src/process-manager/interfaces/process-lifecycle.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/process-lifecycle.js +10 -0
- package/dist/src/process-manager/interfaces/process-lifecycle.js.map +1 -0
- package/dist/src/process-manager/interfaces/process-monitor.d.ts +118 -0
- package/dist/src/process-manager/interfaces/process-monitor.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/process-monitor.js +10 -0
- package/dist/src/process-manager/interfaces/process-monitor.js.map +1 -0
- package/dist/src/process-manager/interfaces/process-persistence.d.ts +125 -0
- package/dist/src/process-manager/interfaces/process-persistence.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/process-persistence.js +10 -0
- package/dist/src/process-manager/interfaces/process-persistence.js.map +1 -0
- package/dist/src/process-manager/managed-process-info.d.ts +307 -0
- package/dist/src/process-manager/managed-process-info.d.ts.map +1 -0
- package/dist/src/process-manager/managed-process-info.js +650 -0
- package/dist/src/process-manager/managed-process-info.js.map +1 -0
- package/dist/src/process-manager/process-group-manager.d.ts +103 -0
- package/dist/src/process-manager/process-group-manager.d.ts.map +1 -0
- package/dist/src/process-manager/process-group-manager.js +400 -0
- package/dist/src/process-manager/process-group-manager.js.map +1 -0
- package/dist/src/process-manager/process-lifecycle-manager.d.ts +68 -0
- package/dist/src/process-manager/process-lifecycle-manager.d.ts.map +1 -0
- package/dist/src/process-manager/process-lifecycle-manager.js +372 -0
- package/dist/src/process-manager/process-lifecycle-manager.js.map +1 -0
- package/dist/src/process-manager/process-manager.d.ts +296 -0
- package/dist/src/process-manager/process-manager.d.ts.map +1 -0
- package/dist/src/process-manager/process-manager.js +659 -0
- package/dist/src/process-manager/process-manager.js.map +1 -0
- package/dist/src/process-manager/process-monitor.d.ts +95 -0
- package/dist/src/process-manager/process-monitor.d.ts.map +1 -0
- package/dist/src/process-manager/process-monitor.js +357 -0
- package/dist/src/process-manager/process-monitor.js.map +1 -0
- package/dist/src/process-manager/process-persistence.d.ts +68 -0
- package/dist/src/process-manager/process-persistence.d.ts.map +1 -0
- package/dist/src/process-manager/process-persistence.js +364 -0
- package/dist/src/process-manager/process-persistence.js.map +1 -0
- package/dist/src/process-manager/utils/mutex.d.ts +82 -0
- package/dist/src/process-manager/utils/mutex.d.ts.map +1 -0
- package/dist/src/process-manager/utils/mutex.js +172 -0
- package/dist/src/process-manager/utils/mutex.js.map +1 -0
- package/dist/src/services/index.d.ts +8 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +8 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/log-manager-config.d.ts +65 -0
- package/dist/src/services/log-manager-config.d.ts.map +1 -0
- package/dist/src/services/log-manager-config.js +145 -0
- package/dist/src/services/log-manager-config.js.map +1 -0
- package/dist/src/services/log-manager-factory.d.ts +134 -0
- package/dist/src/services/log-manager-factory.d.ts.map +1 -0
- package/dist/src/services/log-manager-factory.js +203 -0
- package/dist/src/services/log-manager-factory.js.map +1 -0
- package/dist/src/services/log-manager.d.ts +170 -0
- package/dist/src/services/log-manager.d.ts.map +1 -0
- package/dist/src/services/log-manager.js +1199 -0
- package/dist/src/services/log-manager.js.map +1 -0
- package/dist/src/services/log-path-validator.d.ts +121 -0
- package/dist/src/services/log-path-validator.d.ts.map +1 -0
- package/dist/src/services/log-path-validator.js +302 -0
- package/dist/src/services/log-path-validator.js.map +1 -0
- package/dist/src/services/process-log-integration.d.ts +62 -0
- package/dist/src/services/process-log-integration.d.ts.map +1 -0
- package/dist/src/services/process-log-integration.js +157 -0
- package/dist/src/services/process-log-integration.js.map +1 -0
- package/dist/src/shared/config.d.ts +67 -0
- package/dist/src/shared/config.d.ts.map +1 -0
- package/dist/src/shared/config.js +92 -0
- package/dist/src/shared/config.js.map +1 -0
- package/dist/src/shared/constants-streaming.d.ts +39 -0
- package/dist/src/shared/constants-streaming.d.ts.map +1 -0
- package/dist/src/shared/constants-streaming.js +39 -0
- package/dist/src/shared/constants-streaming.js.map +1 -0
- package/dist/src/shared/constants.d.ts +60 -0
- package/dist/src/shared/constants.d.ts.map +1 -0
- package/dist/src/shared/constants.js +71 -0
- package/dist/src/shared/constants.js.map +1 -0
- package/dist/src/shared/errors.d.ts +70 -0
- package/dist/src/shared/errors.d.ts.map +1 -0
- package/dist/src/shared/errors.js +101 -0
- package/dist/src/shared/errors.js.map +1 -0
- package/dist/src/shared/index.d.ts +14 -0
- package/dist/src/shared/index.d.ts.map +1 -0
- package/dist/src/shared/index.js +22 -0
- package/dist/src/shared/index.js.map +1 -0
- package/dist/src/shared/ipc.d.ts +402 -0
- package/dist/src/shared/ipc.d.ts.map +1 -0
- package/dist/src/shared/ipc.js +85 -0
- package/dist/src/shared/ipc.js.map +1 -0
- package/dist/src/shared/logger.d.ts +38 -0
- package/dist/src/shared/logger.d.ts.map +1 -0
- package/dist/src/shared/logger.js +139 -0
- package/dist/src/shared/logger.js.map +1 -0
- package/dist/src/shared/logs.d.ts +53 -0
- package/dist/src/shared/logs.d.ts.map +1 -0
- package/dist/src/shared/logs.js +26 -0
- package/dist/src/shared/logs.js.map +1 -0
- package/dist/src/shared/process.d.ts +102 -0
- package/dist/src/shared/process.d.ts.map +1 -0
- package/dist/src/shared/process.js +55 -0
- package/dist/src/shared/process.js.map +1 -0
- package/dist/src/shared/types.d.ts +15 -0
- package/dist/src/shared/types.d.ts.map +1 -0
- package/dist/src/shared/types.js +8 -0
- package/dist/src/shared/types.js.map +1 -0
- package/dist/src/types/index.d.ts +19 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +5 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/event-cleanup.d.ts +30 -0
- package/dist/src/utils/event-cleanup.d.ts.map +1 -0
- package/dist/src/utils/event-cleanup.js +32 -0
- package/dist/src/utils/event-cleanup.js.map +1 -0
- package/dist/src/utils/memory/memory-monitor.d.ts +126 -0
- package/dist/src/utils/memory/memory-monitor.d.ts.map +1 -0
- package/dist/src/utils/memory/memory-monitor.js +246 -0
- package/dist/src/utils/memory/memory-monitor.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Validator
|
|
3
|
+
*
|
|
4
|
+
* Handles validation logic for procman configuration files.
|
|
5
|
+
* Provides comprehensive validation with detailed error reporting and suggestions.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { parseMemorySize } from '../shared/config.js';
|
|
9
|
+
import { ProcmanError, createError } from '../shared/errors.js';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration validator class
|
|
12
|
+
* Responsible for validating procman configuration structure and content
|
|
13
|
+
*/
|
|
14
|
+
export class ConfigValidator {
|
|
15
|
+
projectRoot;
|
|
16
|
+
collectIssues;
|
|
17
|
+
validationIssues = [];
|
|
18
|
+
constructor(options = {}) {
|
|
19
|
+
this.projectRoot = options.projectRoot || process.cwd();
|
|
20
|
+
this.collectIssues = options.collectIssues || false;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate configuration structure and content
|
|
24
|
+
* @param config Configuration object to validate
|
|
25
|
+
* @throws ProcmanError if validation fails
|
|
26
|
+
*/
|
|
27
|
+
validateConfig(config) {
|
|
28
|
+
this.validationIssues = []; // Reset issues for new validation
|
|
29
|
+
// Enhanced type guards with better error messages
|
|
30
|
+
if (!this.isValidConfigObject(config)) {
|
|
31
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
32
|
+
message: this.getConfigTypeErrorMessage(config),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const configObj = config;
|
|
36
|
+
// Validate apps array exists
|
|
37
|
+
if (!('apps' in configObj)) {
|
|
38
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
39
|
+
message: 'Configuration must contain an "apps" array',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Validate apps is an array
|
|
43
|
+
if (!Array.isArray(configObj.apps)) {
|
|
44
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
45
|
+
message: 'Configuration "apps" property must be an array',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Validate apps array is not empty
|
|
49
|
+
if (configObj.apps.length === 0) {
|
|
50
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
51
|
+
message: 'Configuration "apps" array cannot be empty',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Track app names to check for duplicates
|
|
55
|
+
const appNames = new Set();
|
|
56
|
+
// Validate each app configuration
|
|
57
|
+
configObj.apps.forEach((app, index) => {
|
|
58
|
+
this.validateAppConfig(app, index, appNames);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate individual app configuration
|
|
63
|
+
* @param app App configuration to validate
|
|
64
|
+
* @param index Index in the apps array (for error reporting)
|
|
65
|
+
* @param appNames Set to track duplicate names
|
|
66
|
+
* @throws ProcmanError if validation fails
|
|
67
|
+
*/
|
|
68
|
+
validateAppConfig(app, index, appNames) {
|
|
69
|
+
// Basic structure check
|
|
70
|
+
if (!app || typeof app !== 'object') {
|
|
71
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
72
|
+
message: `App configuration at index ${index} must be an object`,
|
|
73
|
+
details: { appIndex: index },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const appConfig = app;
|
|
77
|
+
// Validate required fields
|
|
78
|
+
this.validateRequiredField(appConfig, 'name', 'string', index);
|
|
79
|
+
this.validateRequiredField(appConfig, 'script', 'string', index);
|
|
80
|
+
// Get name for duplicate checking
|
|
81
|
+
const appName = appConfig.name;
|
|
82
|
+
// Validate name format (must be non-empty and valid identifier)
|
|
83
|
+
if (!appName.trim()) {
|
|
84
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
85
|
+
message: `App configuration at index ${index}: name cannot be empty`,
|
|
86
|
+
details: { appIndex: index, field: 'name' },
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// Check for valid app name format (alphanumeric, dash, underscore)
|
|
90
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(appName)) {
|
|
91
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
92
|
+
message: `App configuration at index ${index}: name "${appName}" contains invalid characters. Only alphanumeric, dash, and underscore are allowed`,
|
|
93
|
+
details: { appIndex: index, field: 'name', value: appName },
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Check for duplicate names
|
|
97
|
+
if (appNames.has(appName)) {
|
|
98
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
99
|
+
message: `App configuration at index ${index}: duplicate app name "${appName}"`,
|
|
100
|
+
details: { appIndex: index, field: 'name', value: appName },
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
appNames.add(appName);
|
|
104
|
+
// Validate script is non-empty
|
|
105
|
+
const script = appConfig.script;
|
|
106
|
+
if (!script.trim()) {
|
|
107
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
108
|
+
message: `App configuration at index ${index}: script cannot be empty`,
|
|
109
|
+
details: { appIndex: index, field: 'script' },
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Validate optional fields
|
|
113
|
+
this.validateOptionalField(appConfig, 'namespace', 'string', index);
|
|
114
|
+
this.validateOptionalField(appConfig, 'args', 'string', index);
|
|
115
|
+
this.validateOptionalField(appConfig, 'cwd', 'string', index);
|
|
116
|
+
this.validateOptionalField(appConfig, 'note', 'string', index);
|
|
117
|
+
this.validateOptionalField(appConfig, 'out_log', 'string', index);
|
|
118
|
+
this.validateOptionalField(appConfig, 'error_log', 'string', index);
|
|
119
|
+
this.validateOptionalField(appConfig, 'merge_logs', 'boolean', index);
|
|
120
|
+
this.validateOptionalField(appConfig, 'max_memory_restart', 'string', index);
|
|
121
|
+
// Validate env object if present
|
|
122
|
+
if ('env' in appConfig && appConfig.env !== undefined) {
|
|
123
|
+
this.validateEnvObject(appConfig.env, index);
|
|
124
|
+
}
|
|
125
|
+
// Validate memory size if present
|
|
126
|
+
if ('max_memory_restart' in appConfig && appConfig.max_memory_restart) {
|
|
127
|
+
this.validateMemorySize(appConfig.max_memory_restart, index);
|
|
128
|
+
}
|
|
129
|
+
// Validate script path security
|
|
130
|
+
this.validateScriptPathSecurity(script, index);
|
|
131
|
+
this.validatePathSecurity(script, index, 'script');
|
|
132
|
+
// Validate file paths for security
|
|
133
|
+
if ('cwd' in appConfig && appConfig.cwd) {
|
|
134
|
+
this.validatePathSecurity(appConfig.cwd, index, 'cwd');
|
|
135
|
+
}
|
|
136
|
+
if ('out_log' in appConfig && appConfig.out_log) {
|
|
137
|
+
this.validatePathSecurity(appConfig.out_log, index, 'out_log');
|
|
138
|
+
}
|
|
139
|
+
if ('error_log' in appConfig && appConfig.error_log) {
|
|
140
|
+
this.validatePathSecurity(appConfig.error_log, index, 'error_log');
|
|
141
|
+
}
|
|
142
|
+
if ('log_file' in appConfig && appConfig.log_file) {
|
|
143
|
+
this.validatePathSecurity(appConfig.log_file, index, 'log_file');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Validate required field exists and has correct type
|
|
148
|
+
* @param obj Object to validate
|
|
149
|
+
* @param field Field name
|
|
150
|
+
* @param expectedType Expected type
|
|
151
|
+
* @param appIndex App index for error reporting
|
|
152
|
+
* @throws ProcmanError if validation fails
|
|
153
|
+
*/
|
|
154
|
+
validateRequiredField(obj, field, expectedType, appIndex) {
|
|
155
|
+
if (!(field in obj) || obj[field] === undefined || obj[field] === null) {
|
|
156
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
157
|
+
message: `App configuration at index ${appIndex}: missing required field "${field}"`,
|
|
158
|
+
details: { appIndex, field },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (typeof obj[field] !== expectedType) {
|
|
162
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
163
|
+
message: `App configuration at index ${appIndex}: field "${field}" must be of type ${expectedType}, got ${typeof obj[field]}`,
|
|
164
|
+
details: { appIndex, field, value: String(obj[field]) },
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Validate optional field has correct type if present
|
|
170
|
+
* @param obj Object to validate
|
|
171
|
+
* @param field Field name
|
|
172
|
+
* @param expectedType Expected type
|
|
173
|
+
* @param appIndex App index for error reporting
|
|
174
|
+
* @throws ProcmanError if validation fails
|
|
175
|
+
*/
|
|
176
|
+
validateOptionalField(obj, field, expectedType, appIndex) {
|
|
177
|
+
if (field in obj && obj[field] !== undefined && obj[field] !== null) {
|
|
178
|
+
if (typeof obj[field] !== expectedType) {
|
|
179
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
180
|
+
message: `App configuration at index ${appIndex}: field "${field}" must be of type ${expectedType}, got ${typeof obj[field]}`,
|
|
181
|
+
details: { appIndex, field, value: String(obj[field]) },
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Validate environment variables object
|
|
188
|
+
* @param env Environment variables object
|
|
189
|
+
* @param appIndex App index for error reporting
|
|
190
|
+
* @throws ProcmanError if validation fails
|
|
191
|
+
*/
|
|
192
|
+
validateEnvObject(env, appIndex) {
|
|
193
|
+
if (env === null || env === undefined) {
|
|
194
|
+
return; // Allow null/undefined
|
|
195
|
+
}
|
|
196
|
+
if (typeof env !== 'object' || Array.isArray(env)) {
|
|
197
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
198
|
+
message: `App configuration at index ${appIndex}: env must be an object`,
|
|
199
|
+
details: { appIndex, field: 'env' },
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
const envObj = env;
|
|
203
|
+
for (const [key, value] of Object.entries(envObj)) {
|
|
204
|
+
// Validate environment variable name
|
|
205
|
+
if (!/^[A-Z_][A-Z0-9_]*$/i.test(key)) {
|
|
206
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
207
|
+
message: `App configuration at index ${appIndex}: Invalid environment variable name "${key}". Use uppercase letters, numbers, and underscores only.`,
|
|
208
|
+
details: { appIndex, field: 'env', value: key },
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
// Validate environment variable value (must be string for portability)
|
|
212
|
+
if (typeof value !== 'string') {
|
|
213
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
214
|
+
message: `App configuration at index ${appIndex}: env["${key}"] must be a string, got ${typeof value}`,
|
|
215
|
+
details: { appIndex, field: 'env', value: key },
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Validate memory size format and convert to bytes
|
|
222
|
+
* @param memorySize Memory size string (e.g., "300M", "1G")
|
|
223
|
+
* @param appIndex App index for error reporting
|
|
224
|
+
* @throws ProcmanError if validation fails
|
|
225
|
+
*/
|
|
226
|
+
validateMemorySize(memorySize, appIndex) {
|
|
227
|
+
const result = parseMemorySize(memorySize);
|
|
228
|
+
if (!result.success) {
|
|
229
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
230
|
+
message: `App configuration at index ${appIndex}: invalid memory size format "${memorySize}": ${result.error}`,
|
|
231
|
+
details: { appIndex, field: 'max_memory_restart', value: memorySize },
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
const bytes = result.value;
|
|
235
|
+
// Reject very small memory limits (less than 1MB)
|
|
236
|
+
if (bytes < 1024 * 1024) {
|
|
237
|
+
// Less than 1MB
|
|
238
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
239
|
+
message: `App configuration at index ${appIndex}: Memory limit "${memorySize}" below minimum limit (1MB)`,
|
|
240
|
+
details: { appIndex, field: 'max_memory_restart', value: memorySize },
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
// Reject extremely unrealistic memory limits (more than 1EB for boundary testing)
|
|
244
|
+
if (bytes > 1024 * 1024 * 1024 * 1024 * 1024 * 1024) {
|
|
245
|
+
// More than 1EB - clearly unrealistic
|
|
246
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
247
|
+
message: `App configuration at index ${appIndex}: Memory limit "${memorySize}" exceeds maximum limit (1EB)`,
|
|
248
|
+
details: { appIndex, field: 'max_memory_restart', value: memorySize },
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Validate script path for security issues
|
|
254
|
+
* @param scriptPath Script path to validate
|
|
255
|
+
* @param appIndex App index for error reporting
|
|
256
|
+
*/
|
|
257
|
+
validateScriptPathSecurity(scriptPath, appIndex) {
|
|
258
|
+
// Check for potentially dangerous script patterns
|
|
259
|
+
const dangerousPatterns = [
|
|
260
|
+
/^\s*sudo\s+/i, // sudo commands
|
|
261
|
+
/^\s*su\s+/i, // su commands
|
|
262
|
+
/[|&;`$(){}]/, // Shell injection characters
|
|
263
|
+
/\beval\b/i, // eval functions
|
|
264
|
+
/\bexec\b/i, // exec functions
|
|
265
|
+
];
|
|
266
|
+
for (const pattern of dangerousPatterns) {
|
|
267
|
+
if (pattern.test(scriptPath)) {
|
|
268
|
+
this.addValidationIssue({
|
|
269
|
+
severity: 'warning',
|
|
270
|
+
category: 'security',
|
|
271
|
+
message: `Script "${scriptPath}" contains potentially dangerous patterns`,
|
|
272
|
+
location: { appIndex, field: 'script', value: scriptPath },
|
|
273
|
+
suggestion: 'Review script for security implications',
|
|
274
|
+
});
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Validate file path for security issues
|
|
281
|
+
* @param filePath File path to validate
|
|
282
|
+
* @param appIndex App index for error reporting
|
|
283
|
+
* @param fieldName Field name for error reporting
|
|
284
|
+
*/
|
|
285
|
+
validatePathSecurity(filePath, appIndex, fieldName) {
|
|
286
|
+
try {
|
|
287
|
+
this.sanitizeFilePath(filePath);
|
|
288
|
+
// For relative paths, ensure they don't escape project boundaries
|
|
289
|
+
if (!path.isAbsolute(filePath)) {
|
|
290
|
+
this.validatePathWithinProject(filePath, this.projectRoot);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
if (error instanceof ProcmanError &&
|
|
295
|
+
error.code === 'CONFIG_SECURITY_ERROR') {
|
|
296
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
297
|
+
message: `App configuration at index ${appIndex}: ${error.message}`,
|
|
298
|
+
details: { appIndex, field: fieldName, value: filePath },
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
throw error;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Add validation issue to collection (if enabled)
|
|
306
|
+
* @param issue Validation issue to add
|
|
307
|
+
*/
|
|
308
|
+
addValidationIssue(issue) {
|
|
309
|
+
if (this.collectIssues) {
|
|
310
|
+
this.validationIssues.push(issue);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get collected validation issues
|
|
315
|
+
* @returns Array of validation issues
|
|
316
|
+
*/
|
|
317
|
+
getValidationIssues() {
|
|
318
|
+
return [...this.validationIssues];
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Clear collected validation issues
|
|
322
|
+
*/
|
|
323
|
+
clearValidationIssues() {
|
|
324
|
+
this.validationIssues = [];
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Sanitize file path to prevent path traversal attacks
|
|
328
|
+
* @param filePath File path to sanitize
|
|
329
|
+
* @returns Sanitized file path
|
|
330
|
+
* @throws ProcmanError if path is potentially malicious
|
|
331
|
+
*/
|
|
332
|
+
sanitizeFilePath(filePath) {
|
|
333
|
+
if (typeof filePath !== 'string') {
|
|
334
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
335
|
+
message: 'File path must be a string',
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
const trimmedPath = filePath.trim();
|
|
339
|
+
if (trimmedPath === '') {
|
|
340
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
341
|
+
message: 'File path cannot be empty',
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
// Check for null bytes (directory traversal attack)
|
|
345
|
+
if (trimmedPath.includes('\0')) {
|
|
346
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
347
|
+
message: 'File path contains null bytes',
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
// Check for suspicious characters
|
|
351
|
+
const suspiciousChars = ['<', '>', '|', '*', '?'];
|
|
352
|
+
for (const char of suspiciousChars) {
|
|
353
|
+
if (trimmedPath.includes(char)) {
|
|
354
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
355
|
+
message: `File path contains suspicious character: ${char}`,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Normalize the path to resolve . and .. segments
|
|
360
|
+
const normalizedPath = path.normalize(trimmedPath);
|
|
361
|
+
// Additional check after normalization
|
|
362
|
+
if (normalizedPath !== trimmedPath && normalizedPath.includes('..')) {
|
|
363
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
364
|
+
message: 'Normalized path contains directory traversal patterns',
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
return normalizedPath;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Validate that a path stays within the project boundaries
|
|
371
|
+
* @param filePath File path to validate (relative)
|
|
372
|
+
* @param basePath Base path to resolve against
|
|
373
|
+
* @returns Resolved absolute path
|
|
374
|
+
* @throws ProcmanError if path escapes project boundaries
|
|
375
|
+
*/
|
|
376
|
+
validatePathWithinProject(filePath, basePath) {
|
|
377
|
+
// Only validate relative paths - absolute paths are allowed as explicit admin choice
|
|
378
|
+
if (path.isAbsolute(filePath)) {
|
|
379
|
+
return filePath;
|
|
380
|
+
}
|
|
381
|
+
// Block relative paths with .. that could escape project
|
|
382
|
+
if (filePath.includes('..')) {
|
|
383
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
384
|
+
message: `Path traversal attack detected: ${filePath}`,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
const resolvedPath = path.resolve(basePath, filePath);
|
|
388
|
+
const normalizedRoot = path.normalize(basePath);
|
|
389
|
+
if (!path.normalize(resolvedPath).startsWith(normalizedRoot)) {
|
|
390
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
391
|
+
message: `Path traversal attack detected - path is outside of the project root: ${filePath}`,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
return resolvedPath;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Generate suggestions for validation errors
|
|
398
|
+
* @param errorCode Error code
|
|
399
|
+
* @param field Field name (optional)
|
|
400
|
+
* @returns Array of suggestions
|
|
401
|
+
*/
|
|
402
|
+
generateSuggestions(errorCode, field) {
|
|
403
|
+
const suggestions = [];
|
|
404
|
+
switch (errorCode) {
|
|
405
|
+
case 'CONFIG_VALIDATION_ERROR':
|
|
406
|
+
if (field === 'name') {
|
|
407
|
+
suggestions.push('Use only alphanumeric characters, dashes, and underscores');
|
|
408
|
+
suggestions.push('Ensure the name is unique across all apps');
|
|
409
|
+
}
|
|
410
|
+
else if (field === 'script') {
|
|
411
|
+
suggestions.push('Provide the full command to execute');
|
|
412
|
+
suggestions.push('Use absolute paths for executables if needed');
|
|
413
|
+
}
|
|
414
|
+
else if (field === 'max_memory_restart') {
|
|
415
|
+
suggestions.push('Use format like "300M", "1G", or "512000K"');
|
|
416
|
+
suggestions.push('Ensure the unit (K/M/G) is specified');
|
|
417
|
+
}
|
|
418
|
+
break;
|
|
419
|
+
case 'CONFIG_SECURITY_ERROR':
|
|
420
|
+
suggestions.push('Use relative paths within the project directory');
|
|
421
|
+
suggestions.push('Avoid ".." in paths to prevent directory traversal');
|
|
422
|
+
suggestions.push('Use absolute paths only when explicitly needed');
|
|
423
|
+
break;
|
|
424
|
+
default:
|
|
425
|
+
suggestions.push('Check the configuration documentation');
|
|
426
|
+
suggestions.push('Verify all required fields are present');
|
|
427
|
+
}
|
|
428
|
+
return suggestions;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Enhanced type guard for configuration objects
|
|
432
|
+
* @param config Unknown input to validate
|
|
433
|
+
* @returns Type predicate indicating if config is a valid object
|
|
434
|
+
*/
|
|
435
|
+
isValidConfigObject(config) {
|
|
436
|
+
return (config !== null &&
|
|
437
|
+
config !== undefined &&
|
|
438
|
+
typeof config === 'object' &&
|
|
439
|
+
!Array.isArray(config) &&
|
|
440
|
+
// Check for common invalid objects
|
|
441
|
+
!(config instanceof Date) &&
|
|
442
|
+
!(config instanceof RegExp) &&
|
|
443
|
+
!(config instanceof Error));
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Generate detailed error message for invalid config types
|
|
447
|
+
* @param config Invalid config to analyze
|
|
448
|
+
* @returns Descriptive error message
|
|
449
|
+
*/
|
|
450
|
+
getConfigTypeErrorMessage(config) {
|
|
451
|
+
if (config === null) {
|
|
452
|
+
return 'Configuration cannot be null. Expected an object with an "apps" array.';
|
|
453
|
+
}
|
|
454
|
+
if (config === undefined) {
|
|
455
|
+
return 'Configuration is undefined. Expected an object with an "apps" array.';
|
|
456
|
+
}
|
|
457
|
+
if (Array.isArray(config)) {
|
|
458
|
+
return 'Configuration cannot be an array. Expected an object with an "apps" property.';
|
|
459
|
+
}
|
|
460
|
+
if (typeof config === 'string') {
|
|
461
|
+
return `Configuration cannot be a string ('${config.slice(0, 50)}${config.length > 50 ? '...' : ''}'). Expected an object.`;
|
|
462
|
+
}
|
|
463
|
+
if (typeof config === 'number') {
|
|
464
|
+
return `Configuration cannot be a number (${config}). Expected an object.`;
|
|
465
|
+
}
|
|
466
|
+
if (typeof config === 'boolean') {
|
|
467
|
+
return `Configuration cannot be a boolean (${config}). Expected an object.`;
|
|
468
|
+
}
|
|
469
|
+
if (config instanceof Date) {
|
|
470
|
+
return `Configuration cannot be a Date object (${config.toISOString()}). Expected a plain object.`;
|
|
471
|
+
}
|
|
472
|
+
if (config instanceof Error) {
|
|
473
|
+
return `Configuration cannot be an Error object (${config.message}). Expected a plain object.`;
|
|
474
|
+
}
|
|
475
|
+
if (typeof config === 'function') {
|
|
476
|
+
return 'Configuration cannot be a function. Expected an object.';
|
|
477
|
+
}
|
|
478
|
+
return `Configuration must be a plain object, got ${typeof config}.`;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Create a new configuration validator instance
|
|
483
|
+
* @param options Validator options
|
|
484
|
+
* @returns ConfigValidator instance
|
|
485
|
+
*/
|
|
486
|
+
export function createConfigValidator(options) {
|
|
487
|
+
return new ConfigValidator(options);
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=config-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../../../src/config/config-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Watcher
|
|
3
|
+
*
|
|
4
|
+
* Handles file watching functionality for procman configuration files.
|
|
5
|
+
* Provides change detection and notification capabilities.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
/**
|
|
9
|
+
* File change event types
|
|
10
|
+
*/
|
|
11
|
+
export type FileChangeEvent = 'change' | 'rename';
|
|
12
|
+
/**
|
|
13
|
+
* Watch callback function type
|
|
14
|
+
*/
|
|
15
|
+
export type WatchCallback = (event: FileChangeEvent, filename?: string) => void;
|
|
16
|
+
/**
|
|
17
|
+
* ConfigWatcher event types
|
|
18
|
+
*/
|
|
19
|
+
export interface ConfigWatcherEvents {
|
|
20
|
+
configChanged: (filePath: string) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Watcher disposal interface
|
|
24
|
+
*/
|
|
25
|
+
export interface WatcherDisposal {
|
|
26
|
+
dispose: () => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Configuration watcher options
|
|
30
|
+
*/
|
|
31
|
+
export interface ConfigWatcherOptions {
|
|
32
|
+
/** Polling interval for file watching in milliseconds (default: 1000) */
|
|
33
|
+
interval?: number;
|
|
34
|
+
/** Whether to watch for file existence changes (default: true) */
|
|
35
|
+
persistent?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Configuration watcher class
|
|
39
|
+
* Responsible for monitoring configuration file changes
|
|
40
|
+
*/
|
|
41
|
+
export declare class ConfigWatcher extends EventEmitter {
|
|
42
|
+
private fileWatchers;
|
|
43
|
+
private interval;
|
|
44
|
+
private persistent;
|
|
45
|
+
constructor(options?: ConfigWatcherOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Watch a configuration file for changes
|
|
48
|
+
* @param filePath Path to configuration file to watch
|
|
49
|
+
* @param callback Callback function for change events
|
|
50
|
+
* @returns Disposal object to stop watching
|
|
51
|
+
*/
|
|
52
|
+
watchConfig(filePath: string, callback: WatchCallback): WatcherDisposal;
|
|
53
|
+
/**
|
|
54
|
+
* Watch multiple configuration files
|
|
55
|
+
* @param filePaths Array of file paths to watch
|
|
56
|
+
* @param callback Callback function for change events
|
|
57
|
+
* @returns Disposal object to stop watching all files
|
|
58
|
+
*/
|
|
59
|
+
watchMultiple(filePaths: string[], callback: WatchCallback): WatcherDisposal;
|
|
60
|
+
/**
|
|
61
|
+
* Stop watching a configuration file
|
|
62
|
+
* @param filePath Path to stop watching
|
|
63
|
+
*/
|
|
64
|
+
stopWatching(filePath: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Stop watching all configuration files
|
|
67
|
+
*/
|
|
68
|
+
stopAllWatching(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Check if a file is currently being watched
|
|
71
|
+
* @param filePath Path to check
|
|
72
|
+
* @returns True if file is being watched
|
|
73
|
+
*/
|
|
74
|
+
isWatching(filePath: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Get list of all watched file paths
|
|
77
|
+
* @returns Array of watched file paths
|
|
78
|
+
*/
|
|
79
|
+
getWatchedFiles(): string[];
|
|
80
|
+
/**
|
|
81
|
+
* Check if configuration file has changed since last check
|
|
82
|
+
* @param filePath Path to configuration file
|
|
83
|
+
* @param lastCheckTime Timestamp of last check
|
|
84
|
+
* @returns Promise resolving to true if file has changed
|
|
85
|
+
*/
|
|
86
|
+
hasConfigChanged(filePath: string, lastCheckTime: number): Promise<boolean>;
|
|
87
|
+
/**
|
|
88
|
+
* Get file modification time
|
|
89
|
+
* @param filePath Path to file
|
|
90
|
+
* @returns Promise resolving to modification time timestamp
|
|
91
|
+
*/
|
|
92
|
+
getFileModTime(filePath: string): Promise<number>;
|
|
93
|
+
/**
|
|
94
|
+
* Watch for configuration changes with debouncing
|
|
95
|
+
* @param filePath Path to configuration file
|
|
96
|
+
* @param callback Callback function for change events
|
|
97
|
+
* @param debounceMs Debounce delay in milliseconds (default: 100)
|
|
98
|
+
* @returns Disposal object to stop watching
|
|
99
|
+
*/
|
|
100
|
+
watchConfigDebounced(filePath: string, callback: WatchCallback, debounceMs?: number): WatcherDisposal;
|
|
101
|
+
/**
|
|
102
|
+
* Listen for configuration change events (type-safe version)
|
|
103
|
+
* @param event Event name
|
|
104
|
+
* @param listener Event listener function
|
|
105
|
+
*/
|
|
106
|
+
on<K extends keyof ConfigWatcherEvents>(event: K, listener: ConfigWatcherEvents[K]): this;
|
|
107
|
+
on(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
108
|
+
/**
|
|
109
|
+
* Remove configuration change event listener (type-safe version)
|
|
110
|
+
* @param event Event name
|
|
111
|
+
* @param listener Event listener function
|
|
112
|
+
*/
|
|
113
|
+
off<K extends keyof ConfigWatcherEvents>(event: K, listener: ConfigWatcherEvents[K]): this;
|
|
114
|
+
off(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
115
|
+
/**
|
|
116
|
+
* Dispose of all watchers and cleanup resources
|
|
117
|
+
*/
|
|
118
|
+
dispose(): void;
|
|
119
|
+
/**
|
|
120
|
+
* Get resource usage information
|
|
121
|
+
* @returns Object with watcher count and memory usage
|
|
122
|
+
*/
|
|
123
|
+
getResourceUsage(): {
|
|
124
|
+
watcherCount: number;
|
|
125
|
+
watchedFiles: string[];
|
|
126
|
+
memoryUsage: ReturnType<typeof process.memoryUsage>;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Set polling interval for file watching
|
|
130
|
+
* @param interval New interval in milliseconds
|
|
131
|
+
*/
|
|
132
|
+
setInterval(interval: number): void;
|
|
133
|
+
/**
|
|
134
|
+
* Get current polling interval
|
|
135
|
+
* @returns Current interval in milliseconds
|
|
136
|
+
*/
|
|
137
|
+
getInterval(): number;
|
|
138
|
+
/**
|
|
139
|
+
* Enable or disable persistent watching
|
|
140
|
+
* @param persistent Whether to keep the process alive for watching
|
|
141
|
+
*/
|
|
142
|
+
setPersistent(persistent: boolean): void;
|
|
143
|
+
/**
|
|
144
|
+
* Check if persistent watching is enabled
|
|
145
|
+
* @returns True if persistent watching is enabled
|
|
146
|
+
*/
|
|
147
|
+
isPersistent(): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Create backup of configuration file
|
|
150
|
+
* @param filePath Path to configuration file
|
|
151
|
+
* @returns Path to backup file
|
|
152
|
+
*/
|
|
153
|
+
createBackup(filePath: string): Promise<string>;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Create a new configuration watcher instance
|
|
157
|
+
* @param options Watcher options
|
|
158
|
+
* @returns ConfigWatcher instance
|
|
159
|
+
*/
|
|
160
|
+
export declare function createConfigWatcher(options?: ConfigWatcherOptions): ConfigWatcher;
|
|
161
|
+
//# sourceMappingURL=config-watcher.d.ts.map
|