@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,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProcessPersistence - Handles process state persistence
|
|
3
|
+
*
|
|
4
|
+
* This class is responsible for:
|
|
5
|
+
* - Saving and loading process state to/from persistent storage
|
|
6
|
+
* - Atomic file operations with backup management
|
|
7
|
+
* - File I/O operations with proper permissions
|
|
8
|
+
* - State serialization and deserialization
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
import { promises as fs } from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { DEBOUNCE_SAVE_STATE_DELAY } from '../shared/constants.js';
|
|
14
|
+
/**
|
|
15
|
+
* Type guard to check if an error has a code property
|
|
16
|
+
*/
|
|
17
|
+
function hasErrorCode(error) {
|
|
18
|
+
return ('code' in error &&
|
|
19
|
+
typeof error.code === 'string');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Debounce function for state saving
|
|
23
|
+
*/
|
|
24
|
+
function createDebounce(func, delay) {
|
|
25
|
+
let timeoutId = null;
|
|
26
|
+
const trigger = () => {
|
|
27
|
+
if (timeoutId) {
|
|
28
|
+
clearTimeout(timeoutId);
|
|
29
|
+
}
|
|
30
|
+
timeoutId = setTimeout(() => {
|
|
31
|
+
func().catch((error) => {
|
|
32
|
+
console.error('[ProcessPersistence] Debounced save error:', error);
|
|
33
|
+
});
|
|
34
|
+
}, delay);
|
|
35
|
+
};
|
|
36
|
+
const cleanup = () => {
|
|
37
|
+
if (timeoutId) {
|
|
38
|
+
clearTimeout(timeoutId);
|
|
39
|
+
timeoutId = null;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
return { trigger, cleanup };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* ProcessPersistence implementation
|
|
46
|
+
*/
|
|
47
|
+
export class ProcessPersistenceImpl extends EventEmitter {
|
|
48
|
+
processes;
|
|
49
|
+
config;
|
|
50
|
+
debouncedSave = null;
|
|
51
|
+
isInitialized = false;
|
|
52
|
+
constructor(processes) {
|
|
53
|
+
super();
|
|
54
|
+
this.processes = processes;
|
|
55
|
+
this.config = {
|
|
56
|
+
filePath: '',
|
|
57
|
+
saveDelay: DEBOUNCE_SAVE_STATE_DELAY,
|
|
58
|
+
enableBackup: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Initialize persistence with configuration
|
|
63
|
+
*/
|
|
64
|
+
initialize(config) {
|
|
65
|
+
this.config = { ...this.config, ...config };
|
|
66
|
+
this.isInitialized = true;
|
|
67
|
+
// Setup debounced save
|
|
68
|
+
this.debouncedSave = createDebounce(async () => {
|
|
69
|
+
await this.forceSaveState(this.collectProcessStates());
|
|
70
|
+
}, this.config.saveDelay);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Save current process state to persistent storage
|
|
74
|
+
*/
|
|
75
|
+
async saveState(processes) {
|
|
76
|
+
if (!this.isInitialized) {
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
error: 'Persistence not initialized',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (this.debouncedSave) {
|
|
83
|
+
this.debouncedSave.trigger();
|
|
84
|
+
return {
|
|
85
|
+
success: true,
|
|
86
|
+
metadata: {
|
|
87
|
+
processCount: processes.length,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return this.forceSaveState(processes);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Force save state immediately (bypassing debounce)
|
|
95
|
+
*/
|
|
96
|
+
async forceSaveState(processes) {
|
|
97
|
+
if (!this.isInitialized) {
|
|
98
|
+
return {
|
|
99
|
+
success: false,
|
|
100
|
+
error: 'Persistence not initialized',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
// Create the proper structure for persistence
|
|
105
|
+
const persistenceData = {
|
|
106
|
+
version: '1.0',
|
|
107
|
+
timestamp: Date.now(),
|
|
108
|
+
processes: processes,
|
|
109
|
+
};
|
|
110
|
+
const jsonState = JSON.stringify(persistenceData, null, 2);
|
|
111
|
+
// Use atomic write pattern
|
|
112
|
+
const tempFilePath = `${this.config.filePath}.tmp`;
|
|
113
|
+
const backupFilePath = `${this.config.filePath}.bak`;
|
|
114
|
+
// Ensure directory exists with secure permissions
|
|
115
|
+
await fs.mkdir(path.dirname(this.config.filePath), {
|
|
116
|
+
recursive: true,
|
|
117
|
+
mode: 0o700,
|
|
118
|
+
});
|
|
119
|
+
// Create backup of existing file if it exists and backup is enabled
|
|
120
|
+
if (this.config.enableBackup) {
|
|
121
|
+
try {
|
|
122
|
+
await fs.access(this.config.filePath);
|
|
123
|
+
await fs.copyFile(this.config.filePath, backupFilePath);
|
|
124
|
+
// Set secure permissions for backup file
|
|
125
|
+
try {
|
|
126
|
+
await fs.chmod(backupFilePath, 0o600);
|
|
127
|
+
}
|
|
128
|
+
catch (chmodError) {
|
|
129
|
+
console.warn(`[ProcessPersistence] Could not set permissions for backup file ${backupFilePath}:`, chmodError);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
134
|
+
if (hasErrorCode(error) && error.code !== 'ENOENT') {
|
|
135
|
+
console.warn(`[ProcessPersistence] Could not create backup of ${this.config.filePath}:`, error.message);
|
|
136
|
+
}
|
|
137
|
+
// Continue with save even if backup fails
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Write to temporary file first
|
|
141
|
+
await fs.writeFile(tempFilePath, jsonState, 'utf-8');
|
|
142
|
+
// Set secure file permissions (read/write for owner only)
|
|
143
|
+
try {
|
|
144
|
+
await fs.chmod(tempFilePath, 0o600);
|
|
145
|
+
}
|
|
146
|
+
catch (chmodError) {
|
|
147
|
+
console.warn(`[ProcessPersistence] Could not set file permissions for ${tempFilePath}:`, chmodError);
|
|
148
|
+
}
|
|
149
|
+
// Atomically move temp file to final location
|
|
150
|
+
await fs.rename(tempFilePath, this.config.filePath);
|
|
151
|
+
this.emit('persistence:saved', {
|
|
152
|
+
filePath: this.config.filePath,
|
|
153
|
+
processCount: processes.length,
|
|
154
|
+
});
|
|
155
|
+
return {
|
|
156
|
+
success: true,
|
|
157
|
+
metadata: {
|
|
158
|
+
filePath: this.config.filePath,
|
|
159
|
+
processCount: processes.length,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
165
|
+
this.emit('persistence:save-error', {
|
|
166
|
+
filePath: this.config.filePath,
|
|
167
|
+
error: error instanceof Error ? error : new Error(errorMessage),
|
|
168
|
+
});
|
|
169
|
+
return {
|
|
170
|
+
success: false,
|
|
171
|
+
error: `Error saving process state: ${errorMessage}`,
|
|
172
|
+
metadata: {
|
|
173
|
+
filePath: this.config.filePath,
|
|
174
|
+
processCount: processes.length,
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Load process state from persistent storage
|
|
181
|
+
*/
|
|
182
|
+
async loadState() {
|
|
183
|
+
if (!this.isInitialized) {
|
|
184
|
+
console.warn('[ProcessPersistence] Cannot load state: not initialized');
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
const data = await fs.readFile(this.config.filePath, 'utf-8');
|
|
189
|
+
const parsedData = JSON.parse(data);
|
|
190
|
+
// Handle both old format (array) and new format (object with version)
|
|
191
|
+
let persistedProcs;
|
|
192
|
+
if (Array.isArray(parsedData)) {
|
|
193
|
+
// Old format - direct array
|
|
194
|
+
persistedProcs = parsedData;
|
|
195
|
+
}
|
|
196
|
+
else if (parsedData &&
|
|
197
|
+
typeof parsedData === 'object' &&
|
|
198
|
+
parsedData.processes) {
|
|
199
|
+
// New format with version
|
|
200
|
+
persistedProcs = parsedData.processes;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
throw new Error('Invalid persistence file format');
|
|
204
|
+
}
|
|
205
|
+
this.emit('persistence:loaded', {
|
|
206
|
+
filePath: this.config.filePath,
|
|
207
|
+
processCount: persistedProcs.length,
|
|
208
|
+
usedBackup: false,
|
|
209
|
+
});
|
|
210
|
+
return persistedProcs;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
214
|
+
if (hasErrorCode(err) && err.code === 'ENOENT') {
|
|
215
|
+
// File not found - this is normal on first run
|
|
216
|
+
console.log('[ProcessPersistence] No persistence file found, starting fresh');
|
|
217
|
+
return [];
|
|
218
|
+
}
|
|
219
|
+
if (error instanceof SyntaxError) {
|
|
220
|
+
// JSON parse error - try loading from backup
|
|
221
|
+
console.warn(`[ProcessPersistence] Corrupted persistence file, attempting backup recovery:`, err.message);
|
|
222
|
+
return this.loadFromBackup();
|
|
223
|
+
}
|
|
224
|
+
this.emit('persistence:load-error', {
|
|
225
|
+
filePath: this.config.filePath,
|
|
226
|
+
error: err,
|
|
227
|
+
});
|
|
228
|
+
console.error(`[ProcessPersistence] Error loading process state:`, err);
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Load process state from backup file
|
|
234
|
+
*/
|
|
235
|
+
async loadFromBackup() {
|
|
236
|
+
if (!this.isInitialized) {
|
|
237
|
+
console.warn('[ProcessPersistence] Cannot load from backup: not initialized');
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
const backupFilePath = `${this.config.filePath}.bak`;
|
|
241
|
+
try {
|
|
242
|
+
const data = await fs.readFile(backupFilePath, 'utf-8');
|
|
243
|
+
const parsedData = JSON.parse(data);
|
|
244
|
+
// Handle both old format (array) and new format (object with version)
|
|
245
|
+
let persistedProcs;
|
|
246
|
+
if (Array.isArray(parsedData)) {
|
|
247
|
+
// Old format - direct array
|
|
248
|
+
persistedProcs = parsedData;
|
|
249
|
+
}
|
|
250
|
+
else if (parsedData &&
|
|
251
|
+
typeof parsedData === 'object' &&
|
|
252
|
+
parsedData.processes) {
|
|
253
|
+
// New format with version
|
|
254
|
+
persistedProcs = parsedData.processes;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
throw new Error('Invalid backup file format');
|
|
258
|
+
}
|
|
259
|
+
console.log(`[ProcessPersistence] Successfully loaded state from backup: ${backupFilePath}`);
|
|
260
|
+
this.emit('persistence:loaded', {
|
|
261
|
+
filePath: backupFilePath,
|
|
262
|
+
processCount: persistedProcs.length,
|
|
263
|
+
usedBackup: true,
|
|
264
|
+
});
|
|
265
|
+
return persistedProcs;
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
269
|
+
console.error(`[ProcessPersistence] Error loading from backup file:`, err);
|
|
270
|
+
this.emit('persistence:load-error', {
|
|
271
|
+
filePath: backupFilePath,
|
|
272
|
+
error: err,
|
|
273
|
+
});
|
|
274
|
+
return [];
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get the persistence file path
|
|
279
|
+
*/
|
|
280
|
+
getFilePath() {
|
|
281
|
+
return this.config.filePath;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Check if persistence file exists
|
|
285
|
+
*/
|
|
286
|
+
async exists() {
|
|
287
|
+
try {
|
|
288
|
+
await fs.access(this.config.filePath);
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Check if backup file exists
|
|
297
|
+
*/
|
|
298
|
+
async backupExists() {
|
|
299
|
+
try {
|
|
300
|
+
const backupFilePath = `${this.config.filePath}.bak`;
|
|
301
|
+
await fs.access(backupFilePath);
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Create a backup of the current persistence file
|
|
310
|
+
*/
|
|
311
|
+
async createBackup() {
|
|
312
|
+
if (!this.isInitialized) {
|
|
313
|
+
return {
|
|
314
|
+
success: false,
|
|
315
|
+
error: 'Persistence not initialized',
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
const backupFilePath = `${this.config.filePath}.bak`;
|
|
319
|
+
try {
|
|
320
|
+
await fs.copyFile(this.config.filePath, backupFilePath);
|
|
321
|
+
// Set secure permissions for backup file
|
|
322
|
+
try {
|
|
323
|
+
await fs.chmod(backupFilePath, 0o600);
|
|
324
|
+
}
|
|
325
|
+
catch (chmodError) {
|
|
326
|
+
console.warn(`[ProcessPersistence] Could not set permissions for backup file ${backupFilePath}:`, chmodError);
|
|
327
|
+
}
|
|
328
|
+
this.emit('persistence:backup-created', { filePath: backupFilePath });
|
|
329
|
+
return {
|
|
330
|
+
success: true,
|
|
331
|
+
metadata: {
|
|
332
|
+
filePath: backupFilePath,
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
338
|
+
return {
|
|
339
|
+
success: false,
|
|
340
|
+
error: `Error creating backup: ${errorMessage}`,
|
|
341
|
+
metadata: {
|
|
342
|
+
filePath: backupFilePath,
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Cleanup persistence resources
|
|
349
|
+
*/
|
|
350
|
+
cleanup() {
|
|
351
|
+
if (this.debouncedSave) {
|
|
352
|
+
this.debouncedSave.cleanup();
|
|
353
|
+
this.debouncedSave = null;
|
|
354
|
+
}
|
|
355
|
+
this.isInitialized = false;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Collect current process states
|
|
359
|
+
*/
|
|
360
|
+
collectProcessStates() {
|
|
361
|
+
return Array.from(this.processes.values()).map((process) => process.toJSON());
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=process-persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-persistence.js","sourceRoot":"","sources":["../../../src/process-manager/process-persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutex implementation for process operations
|
|
3
|
+
*
|
|
4
|
+
* This utility provides mutual exclusion for asynchronous operations
|
|
5
|
+
* to prevent race conditions when multiple operations are performed
|
|
6
|
+
* on the same process concurrently.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Mutex for managing exclusive access to resources
|
|
10
|
+
*/
|
|
11
|
+
export declare class Mutex {
|
|
12
|
+
private locked;
|
|
13
|
+
private queue;
|
|
14
|
+
/**
|
|
15
|
+
* Acquire the mutex lock
|
|
16
|
+
* @returns Promise that resolves when lock is acquired
|
|
17
|
+
*/
|
|
18
|
+
acquire(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Release the mutex lock
|
|
21
|
+
*/
|
|
22
|
+
release(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Check if mutex is currently locked
|
|
25
|
+
*/
|
|
26
|
+
isLocked(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get the number of waiters in queue
|
|
29
|
+
*/
|
|
30
|
+
getQueueLength(): number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* KeyedMutex for managing exclusive access to multiple resources by key
|
|
34
|
+
*/
|
|
35
|
+
export declare class KeyedMutex<K = string> {
|
|
36
|
+
private mutexes;
|
|
37
|
+
/**
|
|
38
|
+
* Acquire mutex for a specific key
|
|
39
|
+
* @param key The key to lock
|
|
40
|
+
* @returns Promise that resolves when lock is acquired
|
|
41
|
+
*/
|
|
42
|
+
acquire(key: K): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Release mutex for a specific key
|
|
45
|
+
* @param key The key to unlock
|
|
46
|
+
*/
|
|
47
|
+
release(key: K): void;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a specific key is locked
|
|
50
|
+
* @param key The key to check
|
|
51
|
+
*/
|
|
52
|
+
isLocked(key: K): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Get all currently locked keys
|
|
55
|
+
*/
|
|
56
|
+
getLockedKeys(): K[];
|
|
57
|
+
/**
|
|
58
|
+
* Clear all mutexes (use with caution)
|
|
59
|
+
*/
|
|
60
|
+
clear(): void;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Decorator for wrapping async methods with mutex
|
|
64
|
+
* @param keyExtractor Function to extract mutex key from method arguments
|
|
65
|
+
*/
|
|
66
|
+
export declare function withMutex(mutexKey: string | ((args: any[]) => string)): MethodDecorator;
|
|
67
|
+
/**
|
|
68
|
+
* Helper to run an async operation with mutex protection
|
|
69
|
+
* @param mutex The mutex to use
|
|
70
|
+
* @param operation The async operation to run
|
|
71
|
+
* @returns Result of the operation
|
|
72
|
+
*/
|
|
73
|
+
export declare function withLock<T>(mutex: Mutex, operation: () => Promise<T>): Promise<T>;
|
|
74
|
+
/**
|
|
75
|
+
* Helper to run an async operation with keyed mutex protection
|
|
76
|
+
* @param keyedMutex The keyed mutex to use
|
|
77
|
+
* @param key The key to lock
|
|
78
|
+
* @param operation The async operation to run
|
|
79
|
+
* @returns Result of the operation
|
|
80
|
+
*/
|
|
81
|
+
export declare function withKeyedLock<K, T>(keyedMutex: KeyedMutex<K>, key: K, operation: () => Promise<T>): Promise<T>;
|
|
82
|
+
//# sourceMappingURL=mutex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.d.ts","sourceRoot":"","sources":["../../../../src/process-manager/utils/mutex.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAyB;IAEtC;;;OAGG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrC;;OAEG;IACI,OAAO,IAAI,IAAI;IAYtB;;OAEG;IACI,QAAQ,IAAI,OAAO;IAI1B;;OAEG;IACI,cAAc,IAAI,MAAM;CAGhC;AAED;;GAEG;AACH,qBAAa,UAAU,CAAC,CAAC,GAAG,MAAM;IAChC,OAAO,CAAC,OAAO,CAAuB;IAEtC;;;;OAIG;IACU,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3C;;;OAGG;IACI,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI;IAW5B;;;OAGG;IACI,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAKhC;;OAEG;IACI,aAAa,IAAI,CAAC,EAAE;IAU3B;;OAEG;IACI,KAAK,IAAI,IAAI;CAGrB;AAED;;;GAGG;AAEH,wBAAgB,SAAS,CAEvB,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GAC3C,eAAe,CA6BjB;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EACtC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,GAAG,EAAE,CAAC,EACN,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAOZ"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutex implementation for process operations
|
|
3
|
+
*
|
|
4
|
+
* This utility provides mutual exclusion for asynchronous operations
|
|
5
|
+
* to prevent race conditions when multiple operations are performed
|
|
6
|
+
* on the same process concurrently.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Mutex for managing exclusive access to resources
|
|
10
|
+
*/
|
|
11
|
+
export class Mutex {
|
|
12
|
+
locked = false;
|
|
13
|
+
queue = [];
|
|
14
|
+
/**
|
|
15
|
+
* Acquire the mutex lock
|
|
16
|
+
* @returns Promise that resolves when lock is acquired
|
|
17
|
+
*/
|
|
18
|
+
async acquire() {
|
|
19
|
+
if (!this.locked) {
|
|
20
|
+
this.locked = true;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
this.queue.push(resolve);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Release the mutex lock
|
|
29
|
+
*/
|
|
30
|
+
release() {
|
|
31
|
+
if (this.queue.length > 0) {
|
|
32
|
+
const next = this.queue.shift();
|
|
33
|
+
if (next) {
|
|
34
|
+
// Keep locked and pass to next waiter
|
|
35
|
+
next();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
this.locked = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if mutex is currently locked
|
|
44
|
+
*/
|
|
45
|
+
isLocked() {
|
|
46
|
+
return this.locked;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the number of waiters in queue
|
|
50
|
+
*/
|
|
51
|
+
getQueueLength() {
|
|
52
|
+
return this.queue.length;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* KeyedMutex for managing exclusive access to multiple resources by key
|
|
57
|
+
*/
|
|
58
|
+
export class KeyedMutex {
|
|
59
|
+
mutexes = new Map();
|
|
60
|
+
/**
|
|
61
|
+
* Acquire mutex for a specific key
|
|
62
|
+
* @param key The key to lock
|
|
63
|
+
* @returns Promise that resolves when lock is acquired
|
|
64
|
+
*/
|
|
65
|
+
async acquire(key) {
|
|
66
|
+
let mutex = this.mutexes.get(key);
|
|
67
|
+
if (!mutex) {
|
|
68
|
+
mutex = new Mutex();
|
|
69
|
+
this.mutexes.set(key, mutex);
|
|
70
|
+
}
|
|
71
|
+
await mutex.acquire();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Release mutex for a specific key
|
|
75
|
+
* @param key The key to unlock
|
|
76
|
+
*/
|
|
77
|
+
release(key) {
|
|
78
|
+
const mutex = this.mutexes.get(key);
|
|
79
|
+
if (mutex) {
|
|
80
|
+
mutex.release();
|
|
81
|
+
// Clean up if no one is waiting
|
|
82
|
+
if (!mutex.isLocked() && mutex.getQueueLength() === 0) {
|
|
83
|
+
this.mutexes.delete(key);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a specific key is locked
|
|
89
|
+
* @param key The key to check
|
|
90
|
+
*/
|
|
91
|
+
isLocked(key) {
|
|
92
|
+
const mutex = this.mutexes.get(key);
|
|
93
|
+
return mutex ? mutex.isLocked() : false;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get all currently locked keys
|
|
97
|
+
*/
|
|
98
|
+
getLockedKeys() {
|
|
99
|
+
const locked = [];
|
|
100
|
+
for (const [key, mutex] of this.mutexes) {
|
|
101
|
+
if (mutex.isLocked()) {
|
|
102
|
+
locked.push(key);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return locked;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Clear all mutexes (use with caution)
|
|
109
|
+
*/
|
|
110
|
+
clear() {
|
|
111
|
+
this.mutexes.clear();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Decorator for wrapping async methods with mutex
|
|
116
|
+
* @param keyExtractor Function to extract mutex key from method arguments
|
|
117
|
+
*/
|
|
118
|
+
export function withMutex(
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
120
|
+
mutexKey) {
|
|
121
|
+
const keyedMutex = new KeyedMutex();
|
|
122
|
+
return function (
|
|
123
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
124
|
+
target, propertyKey, descriptor) {
|
|
125
|
+
const originalMethod = descriptor.value;
|
|
126
|
+
descriptor.value = async function (...args
|
|
127
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
128
|
+
) {
|
|
129
|
+
const key = typeof mutexKey === 'function' ? mutexKey(args) : mutexKey;
|
|
130
|
+
await keyedMutex.acquire(key);
|
|
131
|
+
try {
|
|
132
|
+
return await originalMethod.apply(this, args);
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
keyedMutex.release(key);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
return descriptor;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Helper to run an async operation with mutex protection
|
|
143
|
+
* @param mutex The mutex to use
|
|
144
|
+
* @param operation The async operation to run
|
|
145
|
+
* @returns Result of the operation
|
|
146
|
+
*/
|
|
147
|
+
export async function withLock(mutex, operation) {
|
|
148
|
+
await mutex.acquire();
|
|
149
|
+
try {
|
|
150
|
+
return await operation();
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
mutex.release();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Helper to run an async operation with keyed mutex protection
|
|
158
|
+
* @param keyedMutex The keyed mutex to use
|
|
159
|
+
* @param key The key to lock
|
|
160
|
+
* @param operation The async operation to run
|
|
161
|
+
* @returns Result of the operation
|
|
162
|
+
*/
|
|
163
|
+
export async function withKeyedLock(keyedMutex, key, operation) {
|
|
164
|
+
await keyedMutex.acquire(key);
|
|
165
|
+
try {
|
|
166
|
+
return await operation();
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
keyedMutex.release(key);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=mutex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../../../src/process-manager/utils/mutex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|