@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,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Named Pipe Server Implementation
|
|
3
|
+
*
|
|
4
|
+
* Concrete implementation of IPC server using Named Pipes.
|
|
5
|
+
* Supports Windows systems.
|
|
6
|
+
*/
|
|
7
|
+
import * as net from 'net';
|
|
8
|
+
import { setTimeout, clearTimeout } from 'timers';
|
|
9
|
+
import { IPCServerBase } from './ipc-server-base.js';
|
|
10
|
+
import { BaseSocketConnection } from './base-socket-connection.js';
|
|
11
|
+
/**
|
|
12
|
+
* Named Pipe connection implementation
|
|
13
|
+
*/
|
|
14
|
+
class NamedPipeConnection extends BaseSocketConnection {
|
|
15
|
+
constructor(socket) {
|
|
16
|
+
super(socket);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Named Pipe Server
|
|
21
|
+
*/
|
|
22
|
+
export class NamedPipeServer extends IPCServerBase {
|
|
23
|
+
server = null;
|
|
24
|
+
pipePath;
|
|
25
|
+
constructor(config = { path: '' }) {
|
|
26
|
+
super(config);
|
|
27
|
+
// Determine pipe path
|
|
28
|
+
this.pipePath =
|
|
29
|
+
config.namedPipePath || config.path || '\\\\.\\pipe\\masuidrive-procman';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Start the Named Pipe server
|
|
33
|
+
*/
|
|
34
|
+
async startServer() {
|
|
35
|
+
// Create server
|
|
36
|
+
this.server = net.createServer();
|
|
37
|
+
// Set up server event handlers
|
|
38
|
+
this.setupServerHandlers();
|
|
39
|
+
// Start listening on named pipe
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this.server.listen(this.pipePath, () => {
|
|
42
|
+
resolve();
|
|
43
|
+
});
|
|
44
|
+
this.server.on('error', reject);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Stop the Named Pipe server
|
|
49
|
+
*/
|
|
50
|
+
async stopServer() {
|
|
51
|
+
if (!this.server) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
// Set timeout to prevent hanging
|
|
56
|
+
const timeout = setTimeout(() => {
|
|
57
|
+
this.server = null;
|
|
58
|
+
resolve();
|
|
59
|
+
}, 5000);
|
|
60
|
+
this.server.close((error) => {
|
|
61
|
+
clearTimeout(timeout);
|
|
62
|
+
if (error) {
|
|
63
|
+
reject(error);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.server = null;
|
|
67
|
+
resolve();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the pipe path
|
|
74
|
+
*/
|
|
75
|
+
getPipePath() {
|
|
76
|
+
return this.pipePath;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Set up server event handlers
|
|
80
|
+
*/
|
|
81
|
+
setupServerHandlers() {
|
|
82
|
+
if (!this.server) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.server.on('connection', (socket) => {
|
|
86
|
+
const connection = new NamedPipeConnection(socket);
|
|
87
|
+
this.setupConnectionEvents(connection);
|
|
88
|
+
});
|
|
89
|
+
this.setupCommonServerEvents(this.server);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get server-specific resource stats
|
|
93
|
+
*/
|
|
94
|
+
getServerStats() {
|
|
95
|
+
return {
|
|
96
|
+
...this.getResourceStats(),
|
|
97
|
+
pipePath: this.pipePath,
|
|
98
|
+
serverListening: !!this.server?.listening,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=named-pipe-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"named-pipe-server.js","sourceRoot":"","sources":["../../../src/daemon/named-pipe-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrphanProcessDetector - Detects and manages orphaned processes
|
|
3
|
+
*
|
|
4
|
+
* This class is responsible for:
|
|
5
|
+
* - Scanning system processes to find orphaned procman-managed processes
|
|
6
|
+
* - Identifying processes that were managed by a crashed daemon
|
|
7
|
+
* - Providing a list of recoverable processes
|
|
8
|
+
*
|
|
9
|
+
* Following SOLID principles:
|
|
10
|
+
* - Single Responsibility: Only detects orphaned processes
|
|
11
|
+
* - Dependency Inversion: Depends on interfaces, not concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
export interface ProcessInfo {
|
|
14
|
+
pid: number;
|
|
15
|
+
ppid: number;
|
|
16
|
+
command: string;
|
|
17
|
+
cwd: string;
|
|
18
|
+
name: string;
|
|
19
|
+
namespace?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface IOrphanDetector {
|
|
22
|
+
detectOrphanedProcesses(): Promise<ProcessInfo[]>;
|
|
23
|
+
isProcessOrphaned(pid: number): Promise<boolean>;
|
|
24
|
+
isProcmanManagedProcess(processInfo: ProcessInfo): boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare class OrphanProcessDetector implements IOrphanDetector {
|
|
27
|
+
private readonly dataDir;
|
|
28
|
+
private readonly processIdentifiers;
|
|
29
|
+
constructor(dataDir?: string);
|
|
30
|
+
/**
|
|
31
|
+
* Detect all orphaned processes that were managed by procman
|
|
32
|
+
*/
|
|
33
|
+
detectOrphanedProcesses(): Promise<ProcessInfo[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a specific process is orphaned
|
|
36
|
+
*/
|
|
37
|
+
isProcessOrphaned(pid: number): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Determine if a process was managed by procman
|
|
40
|
+
*/
|
|
41
|
+
isProcmanManagedProcess(processInfo: ProcessInfo): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get information about all running processes
|
|
44
|
+
*/
|
|
45
|
+
private getAllProcesses;
|
|
46
|
+
/**
|
|
47
|
+
* Get detailed information about a specific process
|
|
48
|
+
*/
|
|
49
|
+
private getProcessInfo;
|
|
50
|
+
/**
|
|
51
|
+
* Get the current working directory of a process
|
|
52
|
+
*/
|
|
53
|
+
private getProcessCwd;
|
|
54
|
+
/**
|
|
55
|
+
* Extract a meaningful name from the command string
|
|
56
|
+
*/
|
|
57
|
+
private extractProcessName;
|
|
58
|
+
/**
|
|
59
|
+
* Try to recover process metadata from saved state
|
|
60
|
+
*/
|
|
61
|
+
recoverProcessMetadata(pid: number): Promise<{
|
|
62
|
+
name?: string;
|
|
63
|
+
namespace?: string;
|
|
64
|
+
} | null>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=orphan-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-detector.d.ts","sourceRoot":"","sources":["../../../src/daemon/orphan-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,uBAAuB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC;CAC5D;AAED,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAIjC;gBAGA,OAAO,GAAE,MAAiE;IAK5E;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBvD;;OAEG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BtD;;OAEG;IACH,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IA0B1D;;OAEG;YACW,eAAe;IAqC7B;;OAEG;YACW,cAAc;IAyB5B;;OAEG;YACW,aAAa;IAsB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACG,sBAAsB,CAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAUzD"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrphanProcessDetector - Detects and manages orphaned processes
|
|
3
|
+
*
|
|
4
|
+
* This class is responsible for:
|
|
5
|
+
* - Scanning system processes to find orphaned procman-managed processes
|
|
6
|
+
* - Identifying processes that were managed by a crashed daemon
|
|
7
|
+
* - Providing a list of recoverable processes
|
|
8
|
+
*
|
|
9
|
+
* Following SOLID principles:
|
|
10
|
+
* - Single Responsibility: Only detects orphaned processes
|
|
11
|
+
* - Dependency Inversion: Depends on interfaces, not concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs/promises';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import { exec } from 'child_process';
|
|
16
|
+
import { promisify } from 'util';
|
|
17
|
+
const execAsync = promisify(exec);
|
|
18
|
+
export class OrphanProcessDetector {
|
|
19
|
+
dataDir;
|
|
20
|
+
processIdentifiers = [
|
|
21
|
+
'node', // Node.js processes
|
|
22
|
+
'test-process.js', // Our test processes
|
|
23
|
+
'/workspaces/procman', // Processes in our project directory
|
|
24
|
+
];
|
|
25
|
+
constructor(dataDir = path.join(process.env.HOME || '', '.masuidrive-procman')) {
|
|
26
|
+
this.dataDir = dataDir;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Detect all orphaned processes that were managed by procman
|
|
30
|
+
*/
|
|
31
|
+
async detectOrphanedProcesses() {
|
|
32
|
+
const allProcesses = await this.getAllProcesses();
|
|
33
|
+
const orphanedProcesses = [];
|
|
34
|
+
for (const proc of allProcesses) {
|
|
35
|
+
if ((await this.isProcessOrphaned(proc.pid)) &&
|
|
36
|
+
this.isProcmanManagedProcess(proc)) {
|
|
37
|
+
orphanedProcesses.push(proc);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return orphanedProcesses;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if a specific process is orphaned
|
|
44
|
+
*/
|
|
45
|
+
async isProcessOrphaned(pid) {
|
|
46
|
+
try {
|
|
47
|
+
// Check if process exists
|
|
48
|
+
process.kill(pid, 0);
|
|
49
|
+
// Get process info
|
|
50
|
+
const proc = await this.getProcessInfo(pid);
|
|
51
|
+
if (!proc)
|
|
52
|
+
return false;
|
|
53
|
+
// A process is orphaned if:
|
|
54
|
+
// 1. Its parent is init (ppid = 1)
|
|
55
|
+
// 2. Or its parent doesn't exist
|
|
56
|
+
if (proc.ppid === 1) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
// Check if parent process exists
|
|
60
|
+
try {
|
|
61
|
+
process.kill(proc.ppid, 0);
|
|
62
|
+
return false; // Parent exists, not orphaned
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return true; // Parent doesn't exist, process is orphaned
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false; // Process doesn't exist
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Determine if a process was managed by procman
|
|
74
|
+
*/
|
|
75
|
+
isProcmanManagedProcess(processInfo) {
|
|
76
|
+
// Check if command contains our identifiers
|
|
77
|
+
for (const identifier of this.processIdentifiers) {
|
|
78
|
+
if (processInfo.command.includes(identifier)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Check if process was started from our working directory
|
|
83
|
+
if (processInfo.cwd && processInfo.cwd.includes('/workspaces/procman')) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
// Check for specific test process patterns
|
|
87
|
+
if (processInfo.command.includes('test-process') ||
|
|
88
|
+
processInfo.command.includes('crash-after') ||
|
|
89
|
+
processInfo.command.includes('zombie-creator') ||
|
|
90
|
+
processInfo.command.includes('memory-leaker')) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get information about all running processes
|
|
97
|
+
*/
|
|
98
|
+
async getAllProcesses() {
|
|
99
|
+
try {
|
|
100
|
+
// Use ps command to get process information
|
|
101
|
+
// Format: PID PPID COMMAND
|
|
102
|
+
const { stdout } = await execAsync('ps axo pid,ppid,command');
|
|
103
|
+
const lines = stdout.trim().split('\n').slice(1); // Skip header
|
|
104
|
+
const processes = [];
|
|
105
|
+
for (const line of lines) {
|
|
106
|
+
const match = line.match(/^\s*(\d+)\s+(\d+)\s+(.+)$/);
|
|
107
|
+
if (match) {
|
|
108
|
+
const pid = parseInt(match[1], 10);
|
|
109
|
+
const ppid = parseInt(match[2], 10);
|
|
110
|
+
const command = match[3];
|
|
111
|
+
// Try to get additional info
|
|
112
|
+
const cwd = await this.getProcessCwd(pid);
|
|
113
|
+
const name = this.extractProcessName(command);
|
|
114
|
+
processes.push({
|
|
115
|
+
pid,
|
|
116
|
+
ppid,
|
|
117
|
+
command,
|
|
118
|
+
cwd,
|
|
119
|
+
name,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return processes;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error('Failed to get process list:', error);
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get detailed information about a specific process
|
|
132
|
+
*/
|
|
133
|
+
async getProcessInfo(pid) {
|
|
134
|
+
try {
|
|
135
|
+
const { stdout } = await execAsync(`ps -p ${pid} -o pid,ppid,command`);
|
|
136
|
+
const lines = stdout.trim().split('\n');
|
|
137
|
+
if (lines.length < 2)
|
|
138
|
+
return null;
|
|
139
|
+
const match = lines[1].match(/^\s*(\d+)\s+(\d+)\s+(.+)$/);
|
|
140
|
+
if (!match)
|
|
141
|
+
return null;
|
|
142
|
+
const cwd = await this.getProcessCwd(pid);
|
|
143
|
+
const command = match[3];
|
|
144
|
+
return {
|
|
145
|
+
pid: parseInt(match[1], 10),
|
|
146
|
+
ppid: parseInt(match[2], 10),
|
|
147
|
+
command,
|
|
148
|
+
cwd,
|
|
149
|
+
name: this.extractProcessName(command),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get the current working directory of a process
|
|
158
|
+
*/
|
|
159
|
+
async getProcessCwd(pid) {
|
|
160
|
+
try {
|
|
161
|
+
// On Linux, we can read the cwd from /proc
|
|
162
|
+
if (process.platform === 'linux') {
|
|
163
|
+
const cwdLink = `/proc/${pid}/cwd`;
|
|
164
|
+
return await fs.readlink(cwdLink);
|
|
165
|
+
}
|
|
166
|
+
// On macOS, use lsof
|
|
167
|
+
if (process.platform === 'darwin') {
|
|
168
|
+
const { stdout } = await execAsync(`lsof -p ${pid} | grep cwd | awk '{print $NF}'`);
|
|
169
|
+
return stdout.trim();
|
|
170
|
+
}
|
|
171
|
+
return '';
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return '';
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Extract a meaningful name from the command string
|
|
179
|
+
*/
|
|
180
|
+
extractProcessName(command) {
|
|
181
|
+
// Extract the main executable or script name
|
|
182
|
+
const parts = command.split(/\s+/);
|
|
183
|
+
if (parts.length === 0)
|
|
184
|
+
return 'unknown';
|
|
185
|
+
// Find the main script or executable
|
|
186
|
+
for (const part of parts) {
|
|
187
|
+
if (part.endsWith('.js') || part.endsWith('.ts')) {
|
|
188
|
+
return path.basename(part);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return path.basename(parts[0]);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Try to recover process metadata from saved state
|
|
195
|
+
*/
|
|
196
|
+
async recoverProcessMetadata(pid) {
|
|
197
|
+
try {
|
|
198
|
+
// Look for saved process state in data directory
|
|
199
|
+
const stateFile = path.join(this.dataDir, 'processes', `${pid}.json`);
|
|
200
|
+
const data = await fs.readFile(stateFile, 'utf-8');
|
|
201
|
+
return JSON.parse(data);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=orphan-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-detector.js","sourceRoot":"","sources":["../../../src/daemon/orphan-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PID file management for procman daemon
|
|
3
|
+
*
|
|
4
|
+
* Manages the daemon.pid file for preventing duplicate daemon processes
|
|
5
|
+
* and tracking daemon process status.
|
|
6
|
+
*/
|
|
7
|
+
import { DataDirectory } from './data-directory.js';
|
|
8
|
+
/**
|
|
9
|
+
* Manages PID file for daemon process lifecycle
|
|
10
|
+
*/
|
|
11
|
+
export declare class PIDManager {
|
|
12
|
+
private readonly dataDirectory;
|
|
13
|
+
constructor(dataDirectory: DataDirectory);
|
|
14
|
+
/**
|
|
15
|
+
* Get the path to the PID file
|
|
16
|
+
*/
|
|
17
|
+
getPIDFilePath(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Write current process PID to the PID file
|
|
20
|
+
*/
|
|
21
|
+
writePIDFile(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Read PID from the PID file
|
|
24
|
+
* @returns PID number or null if file doesn't exist or contains invalid data
|
|
25
|
+
*/
|
|
26
|
+
readPIDFile(): Promise<number | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Remove the PID file
|
|
29
|
+
*/
|
|
30
|
+
removePIDFile(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a process with given PID is running
|
|
33
|
+
*/
|
|
34
|
+
isProcessRunning(pid: number): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Check if daemon is currently running based on PID file
|
|
37
|
+
*/
|
|
38
|
+
isDaemonRunning(): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Ensure no daemon is currently running
|
|
41
|
+
* Throws error if daemon is running, cleans up stale PID files
|
|
42
|
+
*/
|
|
43
|
+
ensureNoDaemonRunning(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Cleanup PID file (typically called on daemon shutdown)
|
|
46
|
+
*/
|
|
47
|
+
cleanup(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=pid-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid-manager.d.ts","sourceRoot":"","sources":["../../../src/daemon/pid-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAElC,aAAa,EAAE,aAAa;IAIxC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnC;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgB3C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IASpC;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAetC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAUzC;;;OAGG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PID file management for procman daemon
|
|
3
|
+
*
|
|
4
|
+
* Manages the daemon.pid file for preventing duplicate daemon processes
|
|
5
|
+
* and tracking daemon process status.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
/**
|
|
9
|
+
* Manages PID file for daemon process lifecycle
|
|
10
|
+
*/
|
|
11
|
+
export class PIDManager {
|
|
12
|
+
dataDirectory;
|
|
13
|
+
constructor(dataDirectory) {
|
|
14
|
+
this.dataDirectory = dataDirectory;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get the path to the PID file
|
|
18
|
+
*/
|
|
19
|
+
getPIDFilePath() {
|
|
20
|
+
return this.dataDirectory.getSubPath('daemon.pid');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Write current process PID to the PID file
|
|
24
|
+
*/
|
|
25
|
+
async writePIDFile() {
|
|
26
|
+
const pidFilePath = this.getPIDFilePath();
|
|
27
|
+
const pid = process.pid.toString();
|
|
28
|
+
await this.dataDirectory.createFileWithPermissions(pidFilePath, pid);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Read PID from the PID file
|
|
32
|
+
* @returns PID number or null if file doesn't exist or contains invalid data
|
|
33
|
+
*/
|
|
34
|
+
async readPIDFile() {
|
|
35
|
+
try {
|
|
36
|
+
const pidFilePath = this.getPIDFilePath();
|
|
37
|
+
const pidContent = await fs.readFile(pidFilePath, 'utf-8');
|
|
38
|
+
const pid = parseInt(pidContent.trim(), 10);
|
|
39
|
+
if (isNaN(pid) || pid <= 0) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return pid;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Remove the PID file
|
|
50
|
+
*/
|
|
51
|
+
async removePIDFile() {
|
|
52
|
+
try {
|
|
53
|
+
const pidFilePath = this.getPIDFilePath();
|
|
54
|
+
await fs.unlink(pidFilePath);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Ignore errors - file might not exist
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a process with given PID is running
|
|
62
|
+
*/
|
|
63
|
+
isProcessRunning(pid) {
|
|
64
|
+
if (pid <= 0) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
// Signal 0 can be used to check if process exists
|
|
69
|
+
// This doesn't actually send a signal, just checks permissions
|
|
70
|
+
process.kill(pid, 0);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if daemon is currently running based on PID file
|
|
79
|
+
*/
|
|
80
|
+
async isDaemonRunning() {
|
|
81
|
+
const pid = await this.readPIDFile();
|
|
82
|
+
if (pid === null) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return this.isProcessRunning(pid);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Ensure no daemon is currently running
|
|
89
|
+
* Throws error if daemon is running, cleans up stale PID files
|
|
90
|
+
*/
|
|
91
|
+
async ensureNoDaemonRunning() {
|
|
92
|
+
const pid = await this.readPIDFile();
|
|
93
|
+
if (pid === null) {
|
|
94
|
+
// No PID file exists
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (this.isProcessRunning(pid)) {
|
|
98
|
+
throw new Error(`Daemon is already running with PID ${pid}`);
|
|
99
|
+
}
|
|
100
|
+
// Clean up stale PID file
|
|
101
|
+
await this.removePIDFile();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Cleanup PID file (typically called on daemon shutdown)
|
|
105
|
+
*/
|
|
106
|
+
async cleanup() {
|
|
107
|
+
await this.removePIDFile();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=pid-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid-manager.js","sourceRoot":"","sources":["../../../src/daemon/pid-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAGlC;;GAEG;AACH,MAAM,OAAO,UAAU;IACJ,aAAa,CAAgB;IAE9C,YAAY,aAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAEnC,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAE5C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,GAAW;QAC1B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,kDAAkD;YAClD,+DAA+D;YAC/D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,qBAAqB;QACzB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,qBAAqB;YACrB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,0BAA0B;QAC1B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;CACF"}
|