@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,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Resource Manager - PM2 Style
|
|
3
|
+
*
|
|
4
|
+
* Lightweight resource management inspired by PM2's approach (~150 lines).
|
|
5
|
+
* Replaces the over-engineered ResourceManager with simple timeout/interval tracking.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { setTimeout, setInterval } from 'timers';
|
|
9
|
+
/**
|
|
10
|
+
* Simple disposable interface
|
|
11
|
+
*/
|
|
12
|
+
export interface SimpleDisposable {
|
|
13
|
+
dispose(): void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Simple timeout wrapper for cleanup tracking
|
|
17
|
+
*/
|
|
18
|
+
export declare class SimpleTimeout implements SimpleDisposable {
|
|
19
|
+
private handle;
|
|
20
|
+
private disposed;
|
|
21
|
+
constructor(handle: ReturnType<typeof setTimeout>);
|
|
22
|
+
dispose(): void;
|
|
23
|
+
isDisposed(): boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Simple interval wrapper for cleanup tracking
|
|
27
|
+
*/
|
|
28
|
+
export declare class SimpleInterval implements SimpleDisposable {
|
|
29
|
+
private handle;
|
|
30
|
+
private disposed;
|
|
31
|
+
constructor(handle: ReturnType<typeof setInterval>);
|
|
32
|
+
dispose(): void;
|
|
33
|
+
isDisposed(): boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Simple resource cleanup manager
|
|
37
|
+
* PM2-style lightweight implementation
|
|
38
|
+
*/
|
|
39
|
+
export declare class SimpleResourceManager {
|
|
40
|
+
private timeouts;
|
|
41
|
+
private intervals;
|
|
42
|
+
private listeners;
|
|
43
|
+
private disposed;
|
|
44
|
+
/**
|
|
45
|
+
* Create and track a timeout (PM2 style)
|
|
46
|
+
*/
|
|
47
|
+
setTimeout(callback: () => void, delay: number): SimpleTimeout;
|
|
48
|
+
/**
|
|
49
|
+
* Create and track an interval (PM2 style)
|
|
50
|
+
*/
|
|
51
|
+
setInterval(callback: () => void, interval: number): SimpleInterval;
|
|
52
|
+
/**
|
|
53
|
+
* Track event listener for cleanup (PM2 style)
|
|
54
|
+
*/
|
|
55
|
+
addEventListener(emitter: EventEmitter, event: string, listener: (...args: any[]) => void): void;
|
|
56
|
+
/**
|
|
57
|
+
* Clean up all resources (PM2 graceful shutdown style)
|
|
58
|
+
*/
|
|
59
|
+
dispose(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get current resource count (basic monitoring)
|
|
62
|
+
*/
|
|
63
|
+
getResourceCount(): {
|
|
64
|
+
timeouts: number;
|
|
65
|
+
intervals: number;
|
|
66
|
+
listeners: number;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Base class with simple resource management
|
|
71
|
+
* Replaces the over-engineered DisposableBase
|
|
72
|
+
*/
|
|
73
|
+
export declare abstract class SimpleDisposableBase implements SimpleDisposable {
|
|
74
|
+
protected resources: SimpleResourceManager;
|
|
75
|
+
protected disposed: boolean;
|
|
76
|
+
dispose(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Override for custom cleanup logic
|
|
79
|
+
*/
|
|
80
|
+
protected disposeCore(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Simple timeout creation (PM2 style)
|
|
83
|
+
*/
|
|
84
|
+
protected setTimeout(callback: () => void, delay: number): SimpleTimeout;
|
|
85
|
+
/**
|
|
86
|
+
* Simple interval creation (PM2 style)
|
|
87
|
+
*/
|
|
88
|
+
protected setInterval(callback: () => void, interval: number): SimpleInterval;
|
|
89
|
+
/**
|
|
90
|
+
* Simple event listener tracking (PM2 style)
|
|
91
|
+
*/
|
|
92
|
+
protected addEventListener(emitter: EventEmitter, event: string, listener: (...args: any[]) => void): void;
|
|
93
|
+
protected ensureNotDisposed(): void;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=simple-resource-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-resource-manager.d.ts","sourceRoot":"","sources":["../../../src/daemon/simple-resource-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAgB,WAAW,EAAiB,MAAM,QAAQ,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IACpD,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC;IAIjD,OAAO,IAAI,IAAI;IAQf,UAAU,IAAI,OAAO;CAGtB;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,gBAAgB;IACrD,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC;IAIlD,OAAO,IAAI,IAAI;IAQf,UAAU,IAAI,OAAO;CAGtB;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,SAAS,CAIT;IACR,OAAO,CAAC,QAAQ,CAAS;IAEzB;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa;IAgB9D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc;IAWnE;;OAEG;IACH,gBAAgB,CACd,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GACjC,IAAI;IASP;;OAEG;IACH,OAAO,IAAI,IAAI;IA2Bf;;OAEG;IACH,gBAAgB,IAAI;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB;CAOF;AAED;;;GAGG;AACH,8BAAsB,oBAAqB,YAAW,gBAAgB;IACpE,SAAS,CAAC,SAAS,wBAA+B;IAClD,SAAS,CAAC,QAAQ,UAAS;IAE3B,OAAO,IAAI,IAAI;IAWf;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAI7B;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa;IAIxE;;OAEG;IACH,SAAS,CAAC,WAAW,CACnB,QAAQ,EAAE,MAAM,IAAI,EACpB,QAAQ,EAAE,MAAM,GACf,cAAc;IAIjB;;OAEG;IACH,SAAS,CAAC,gBAAgB,CACxB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GACjC,IAAI;IAIP,SAAS,CAAC,iBAAiB,IAAI,IAAI;CAKpC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Resource Manager - PM2 Style
|
|
3
|
+
*
|
|
4
|
+
* Lightweight resource management inspired by PM2's approach (~150 lines).
|
|
5
|
+
* Replaces the over-engineered ResourceManager with simple timeout/interval tracking.
|
|
6
|
+
*/
|
|
7
|
+
import { setTimeout, clearTimeout, setInterval, clearInterval } from 'timers';
|
|
8
|
+
/**
|
|
9
|
+
* Simple timeout wrapper for cleanup tracking
|
|
10
|
+
*/
|
|
11
|
+
export class SimpleTimeout {
|
|
12
|
+
handle;
|
|
13
|
+
disposed = false;
|
|
14
|
+
constructor(handle) {
|
|
15
|
+
this.handle = handle;
|
|
16
|
+
}
|
|
17
|
+
dispose() {
|
|
18
|
+
if (this.disposed || !this.handle)
|
|
19
|
+
return;
|
|
20
|
+
clearTimeout(this.handle);
|
|
21
|
+
this.handle = null;
|
|
22
|
+
this.disposed = true;
|
|
23
|
+
}
|
|
24
|
+
isDisposed() {
|
|
25
|
+
return this.disposed;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Simple interval wrapper for cleanup tracking
|
|
30
|
+
*/
|
|
31
|
+
export class SimpleInterval {
|
|
32
|
+
handle;
|
|
33
|
+
disposed = false;
|
|
34
|
+
constructor(handle) {
|
|
35
|
+
this.handle = handle;
|
|
36
|
+
}
|
|
37
|
+
dispose() {
|
|
38
|
+
if (this.disposed || !this.handle)
|
|
39
|
+
return;
|
|
40
|
+
clearInterval(this.handle);
|
|
41
|
+
this.handle = null;
|
|
42
|
+
this.disposed = true;
|
|
43
|
+
}
|
|
44
|
+
isDisposed() {
|
|
45
|
+
return this.disposed;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Simple resource cleanup manager
|
|
50
|
+
* PM2-style lightweight implementation
|
|
51
|
+
*/
|
|
52
|
+
export class SimpleResourceManager {
|
|
53
|
+
timeouts = new Set();
|
|
54
|
+
intervals = new Set();
|
|
55
|
+
listeners = [];
|
|
56
|
+
disposed = false;
|
|
57
|
+
/**
|
|
58
|
+
* Create and track a timeout (PM2 style)
|
|
59
|
+
*/
|
|
60
|
+
setTimeout(callback, delay) {
|
|
61
|
+
if (this.disposed) {
|
|
62
|
+
throw new Error('ResourceManager disposed');
|
|
63
|
+
}
|
|
64
|
+
const handle = setTimeout(() => {
|
|
65
|
+
// Auto-cleanup when timeout fires (PM2 pattern)
|
|
66
|
+
this.timeouts.delete(timeout);
|
|
67
|
+
callback();
|
|
68
|
+
}, delay);
|
|
69
|
+
const timeout = new SimpleTimeout(handle);
|
|
70
|
+
this.timeouts.add(timeout);
|
|
71
|
+
return timeout;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create and track an interval (PM2 style)
|
|
75
|
+
*/
|
|
76
|
+
setInterval(callback, interval) {
|
|
77
|
+
if (this.disposed) {
|
|
78
|
+
throw new Error('ResourceManager disposed');
|
|
79
|
+
}
|
|
80
|
+
const handle = setInterval(callback, interval);
|
|
81
|
+
const intervalObj = new SimpleInterval(handle);
|
|
82
|
+
this.intervals.add(intervalObj);
|
|
83
|
+
return intervalObj;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Track event listener for cleanup (PM2 style)
|
|
87
|
+
*/
|
|
88
|
+
addEventListener(emitter, event, listener) {
|
|
89
|
+
if (this.disposed) {
|
|
90
|
+
throw new Error('ResourceManager disposed');
|
|
91
|
+
}
|
|
92
|
+
emitter.addListener(event, listener);
|
|
93
|
+
this.listeners.push({ emitter, event, listener });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Clean up all resources (PM2 graceful shutdown style)
|
|
97
|
+
*/
|
|
98
|
+
dispose() {
|
|
99
|
+
if (this.disposed)
|
|
100
|
+
return;
|
|
101
|
+
this.disposed = true;
|
|
102
|
+
// Clear all timeouts
|
|
103
|
+
for (const timeout of this.timeouts) {
|
|
104
|
+
timeout.dispose();
|
|
105
|
+
}
|
|
106
|
+
this.timeouts.clear();
|
|
107
|
+
// Clear all intervals
|
|
108
|
+
for (const interval of this.intervals) {
|
|
109
|
+
interval.dispose();
|
|
110
|
+
}
|
|
111
|
+
this.intervals.clear();
|
|
112
|
+
// Remove all event listeners
|
|
113
|
+
for (const { emitter, event, listener } of this.listeners) {
|
|
114
|
+
try {
|
|
115
|
+
emitter.removeListener(event, listener);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Ignore cleanup errors (PM2 style)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
this.listeners.length = 0;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get current resource count (basic monitoring)
|
|
125
|
+
*/
|
|
126
|
+
getResourceCount() {
|
|
127
|
+
return {
|
|
128
|
+
timeouts: this.timeouts.size,
|
|
129
|
+
intervals: this.intervals.size,
|
|
130
|
+
listeners: this.listeners.length,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Base class with simple resource management
|
|
136
|
+
* Replaces the over-engineered DisposableBase
|
|
137
|
+
*/
|
|
138
|
+
export class SimpleDisposableBase {
|
|
139
|
+
resources = new SimpleResourceManager();
|
|
140
|
+
disposed = false;
|
|
141
|
+
dispose() {
|
|
142
|
+
if (this.disposed)
|
|
143
|
+
return;
|
|
144
|
+
this.disposed = true;
|
|
145
|
+
// Call custom cleanup first
|
|
146
|
+
this.disposeCore();
|
|
147
|
+
// Then clean up all resources
|
|
148
|
+
this.resources.dispose();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Override for custom cleanup logic
|
|
152
|
+
*/
|
|
153
|
+
disposeCore() {
|
|
154
|
+
// Default: no-op
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Simple timeout creation (PM2 style)
|
|
158
|
+
*/
|
|
159
|
+
setTimeout(callback, delay) {
|
|
160
|
+
return this.resources.setTimeout(callback, delay);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Simple interval creation (PM2 style)
|
|
164
|
+
*/
|
|
165
|
+
setInterval(callback, interval) {
|
|
166
|
+
return this.resources.setInterval(callback, interval);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Simple event listener tracking (PM2 style)
|
|
170
|
+
*/
|
|
171
|
+
addEventListener(emitter, event, listener) {
|
|
172
|
+
this.resources.addEventListener(emitter, event, listener);
|
|
173
|
+
}
|
|
174
|
+
ensureNotDisposed() {
|
|
175
|
+
if (this.disposed) {
|
|
176
|
+
throw new Error(`${this.constructor.name} disposed`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=simple-resource-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-resource-manager.js","sourceRoot":"","sources":["../../../src/daemon/simple-resource-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unix Domain Socket Client Implementation
|
|
3
|
+
*
|
|
4
|
+
* Concrete implementation of IPC client using Unix Domain Sockets.
|
|
5
|
+
* Supports Unix-like systems (Linux, macOS).
|
|
6
|
+
*/
|
|
7
|
+
import { IPCClientBase } from './ipc-client-base.js';
|
|
8
|
+
import type { IPCMessage, IPCClientConfig } from '../shared/ipc.js';
|
|
9
|
+
/**
|
|
10
|
+
* Unix Domain Socket Client
|
|
11
|
+
*/
|
|
12
|
+
export declare class UnixSocketClient extends IPCClientBase {
|
|
13
|
+
private socket;
|
|
14
|
+
private readonly socketPath;
|
|
15
|
+
private readonly protocol;
|
|
16
|
+
private connectionTimeout;
|
|
17
|
+
private eventListeners;
|
|
18
|
+
constructor(config?: IPCClientConfig);
|
|
19
|
+
/**
|
|
20
|
+
* Connect to the Unix socket server
|
|
21
|
+
*/
|
|
22
|
+
protected connectToServer(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Disconnect from the Unix socket server
|
|
25
|
+
*/
|
|
26
|
+
protected disconnectFromServer(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Write message to the socket
|
|
29
|
+
*/
|
|
30
|
+
protected writeMessage(message: IPCMessage): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Get the socket path
|
|
33
|
+
*/
|
|
34
|
+
getSocketPath(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Check if socket file exists
|
|
37
|
+
*/
|
|
38
|
+
socketExists(): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Check if client is currently connected
|
|
41
|
+
*/
|
|
42
|
+
isSocketConnected(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Set up socket event handlers
|
|
45
|
+
*/
|
|
46
|
+
private setupSocketHandlers;
|
|
47
|
+
/**
|
|
48
|
+
* Clean up event listeners
|
|
49
|
+
*/
|
|
50
|
+
private cleanupEventListeners;
|
|
51
|
+
/**
|
|
52
|
+
* Override dispose to clean up client-specific resources
|
|
53
|
+
*/
|
|
54
|
+
protected disposeCore(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Get client-specific resource stats
|
|
57
|
+
*/
|
|
58
|
+
getClientStats(): {
|
|
59
|
+
socketPath: string;
|
|
60
|
+
isSocketConnected: boolean;
|
|
61
|
+
hasConnectionTimeout: boolean;
|
|
62
|
+
trackedEventListeners: number;
|
|
63
|
+
} & ReturnType<typeof this.getResourceStats>;
|
|
64
|
+
/**
|
|
65
|
+
* Expand tilde in file paths
|
|
66
|
+
*/
|
|
67
|
+
private expandPath;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=unix-socket-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unix-socket-client.d.ts","sourceRoot":"","sources":["../../../src/daemon/unix-socket-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGpE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,cAAc,CAGP;gBAEH,MAAM,GAAE,eAA8B;IAoBlD;;OAEG;cACa,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAsJhD;;OAEG;cACa,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CrD;;OAEG;cACa,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhE;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAStC;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAQ5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuD3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAa7B;;OAEG;cACa,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5C;;OAEG;IACH,cAAc,IAAI;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,oBAAoB,EAAE,OAAO,CAAC;QAC9B,qBAAqB,EAAE,MAAM,CAAC;KAC/B,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAU5C;;OAEG;IACH,OAAO,CAAC,UAAU;CAWnB"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unix Domain Socket Client Implementation
|
|
3
|
+
*
|
|
4
|
+
* Concrete implementation of IPC client using Unix Domain Sockets.
|
|
5
|
+
* Supports Unix-like systems (Linux, macOS).
|
|
6
|
+
*/
|
|
7
|
+
import * as net from 'net';
|
|
8
|
+
import * as fs from 'fs/promises';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as os from 'os';
|
|
11
|
+
import { setTimeout, clearTimeout } from 'timers';
|
|
12
|
+
import { IPCClientBase } from './ipc-client-base.js';
|
|
13
|
+
import { MessageProtocol } from './message-protocol.js';
|
|
14
|
+
/**
|
|
15
|
+
* Unix Domain Socket Client
|
|
16
|
+
*/
|
|
17
|
+
export class UnixSocketClient extends IPCClientBase {
|
|
18
|
+
socket = null;
|
|
19
|
+
socketPath;
|
|
20
|
+
protocol;
|
|
21
|
+
connectionTimeout = null;
|
|
22
|
+
eventListeners = new Set();
|
|
23
|
+
constructor(config = { path: '' }) {
|
|
24
|
+
super(config);
|
|
25
|
+
// Determine socket path - priority: env var > config.socketPath > config.path > default
|
|
26
|
+
this.socketPath =
|
|
27
|
+
process.env.PROCMAN_SOCKET_PATH ||
|
|
28
|
+
config.socketPath ||
|
|
29
|
+
config.path ||
|
|
30
|
+
this.expandPath('~/.masuidrive-procman/procman.sock');
|
|
31
|
+
// Validate the expanded path
|
|
32
|
+
if (this.socketPath.includes('~')) {
|
|
33
|
+
throw new Error(`Failed to expand socket path: ${this.socketPath}. HOME environment variable may not be set.`);
|
|
34
|
+
}
|
|
35
|
+
this.protocol = new MessageProtocol();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Connect to the Unix socket server
|
|
39
|
+
*/
|
|
40
|
+
async connectToServer() {
|
|
41
|
+
const connectStartTime = Date.now();
|
|
42
|
+
console.error('[DEBUG-UNIX-CLIENT] Starting Unix socket client connection...');
|
|
43
|
+
console.error('[DEBUG-UNIX-CLIENT] Connection parameters:', JSON.stringify({
|
|
44
|
+
socketPath: this.socketPath,
|
|
45
|
+
timeout: this.config.timeout,
|
|
46
|
+
processId: process.pid,
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
}, null, 2));
|
|
49
|
+
// Check if socket file exists
|
|
50
|
+
console.error('[DEBUG-UNIX-CLIENT] Checking if socket file exists...');
|
|
51
|
+
const socketFileExists = await this.socketExists();
|
|
52
|
+
console.error('[DEBUG-UNIX-CLIENT] Socket file existence check:', JSON.stringify({
|
|
53
|
+
socketPath: this.socketPath,
|
|
54
|
+
exists: socketFileExists,
|
|
55
|
+
checkDurationMs: Date.now() - connectStartTime,
|
|
56
|
+
}, null, 2));
|
|
57
|
+
if (!socketFileExists) {
|
|
58
|
+
console.error('[DEBUG-UNIX-CLIENT] ❌ Socket file does not exist');
|
|
59
|
+
throw new Error(`Socket file does not exist: ${this.socketPath}`);
|
|
60
|
+
}
|
|
61
|
+
// Create socket
|
|
62
|
+
console.error('[DEBUG-UNIX-CLIENT] Creating new Socket instance...');
|
|
63
|
+
this.socket = new net.Socket();
|
|
64
|
+
console.error('[DEBUG-UNIX-CLIENT] ✓ Socket instance created');
|
|
65
|
+
// Set up socket event handlers
|
|
66
|
+
console.error('[DEBUG-UNIX-CLIENT] Setting up socket event handlers...');
|
|
67
|
+
this.setupSocketHandlers();
|
|
68
|
+
console.error('[DEBUG-UNIX-CLIENT] ✓ Socket event handlers configured');
|
|
69
|
+
// Connect to server
|
|
70
|
+
console.error('[DEBUG-UNIX-CLIENT] Starting connection attempt...');
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
console.error('[DEBUG-UNIX-CLIENT] Setting up connection timeout:', this.config.timeout, 'ms');
|
|
73
|
+
this.connectionTimeout = this.setTimeout(() => {
|
|
74
|
+
const timeoutDuration = Date.now() - connectStartTime;
|
|
75
|
+
console.error('[DEBUG-UNIX-CLIENT] ❌ Connection timeout reached');
|
|
76
|
+
console.error('[DEBUG-UNIX-CLIENT] Timeout details:', JSON.stringify({
|
|
77
|
+
timeoutMs: this.config.timeout,
|
|
78
|
+
actualDurationMs: timeoutDuration,
|
|
79
|
+
socketPath: this.socketPath,
|
|
80
|
+
}, null, 2));
|
|
81
|
+
this.socket?.destroy();
|
|
82
|
+
reject(new Error(`Connection timeout after ${this.config.timeout}ms`));
|
|
83
|
+
}, this.config.timeout);
|
|
84
|
+
const errorHandler = (error) => {
|
|
85
|
+
const errorDuration = Date.now() - connectStartTime;
|
|
86
|
+
console.error('[DEBUG-UNIX-CLIENT] ❌ Connection error occurred');
|
|
87
|
+
console.error('[DEBUG-UNIX-CLIENT] Error details:', JSON.stringify({
|
|
88
|
+
errorDurationMs: errorDuration,
|
|
89
|
+
socketPath: this.socketPath,
|
|
90
|
+
errorMessage: error.message,
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
errorCode: error?.code,
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
94
|
+
errorErrno: error?.errno,
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
96
|
+
errorSyscall: error?.syscall,
|
|
97
|
+
}, null, 2));
|
|
98
|
+
if (this.connectionTimeout) {
|
|
99
|
+
this.connectionTimeout.dispose();
|
|
100
|
+
this.connectionTimeout = null;
|
|
101
|
+
}
|
|
102
|
+
reject(error);
|
|
103
|
+
};
|
|
104
|
+
const connectHandler = () => {
|
|
105
|
+
const connectDuration = Date.now() - connectStartTime;
|
|
106
|
+
console.error('[DEBUG-UNIX-CLIENT] ✓ Socket connection established successfully');
|
|
107
|
+
console.error('[DEBUG-UNIX-CLIENT] Connection success stats:', JSON.stringify({
|
|
108
|
+
connectDurationMs: connectDuration,
|
|
109
|
+
socketPath: this.socketPath,
|
|
110
|
+
socketConnected: true,
|
|
111
|
+
}, null, 2));
|
|
112
|
+
if (this.connectionTimeout) {
|
|
113
|
+
this.connectionTimeout.dispose();
|
|
114
|
+
this.connectionTimeout = null;
|
|
115
|
+
}
|
|
116
|
+
// Remove the temporary error handler
|
|
117
|
+
this.socket?.removeListener('error', errorHandler);
|
|
118
|
+
resolve();
|
|
119
|
+
};
|
|
120
|
+
console.error('[DEBUG-UNIX-CLIENT] Registering connection event handlers...');
|
|
121
|
+
this.socket.once('connect', connectHandler);
|
|
122
|
+
this.socket.once('error', errorHandler);
|
|
123
|
+
console.error('[DEBUG-UNIX-CLIENT] Calling socket.connect() with path:', this.socketPath);
|
|
124
|
+
this.socket.connect(this.socketPath);
|
|
125
|
+
console.error('[DEBUG-UNIX-CLIENT] socket.connect() call completed, waiting for events...');
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Disconnect from the Unix socket server
|
|
130
|
+
*/
|
|
131
|
+
async disconnectFromServer() {
|
|
132
|
+
if (!this.socket) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
return new Promise((resolve) => {
|
|
136
|
+
if (!this.socket) {
|
|
137
|
+
resolve();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Clean up connection timeout if still active
|
|
141
|
+
if (this.connectionTimeout) {
|
|
142
|
+
this.connectionTimeout.dispose();
|
|
143
|
+
this.connectionTimeout = null;
|
|
144
|
+
}
|
|
145
|
+
// Remove tracked event listeners
|
|
146
|
+
this.cleanupEventListeners();
|
|
147
|
+
// Set a timeout for graceful close
|
|
148
|
+
const timeout = setTimeout(() => {
|
|
149
|
+
if (this.socket && !this.socket.destroyed) {
|
|
150
|
+
this.socket.destroy();
|
|
151
|
+
}
|
|
152
|
+
this.socket = null;
|
|
153
|
+
resolve();
|
|
154
|
+
}, 1000); // 1 second timeout
|
|
155
|
+
this.socket.once('close', () => {
|
|
156
|
+
clearTimeout(timeout);
|
|
157
|
+
this.socket = null;
|
|
158
|
+
resolve();
|
|
159
|
+
});
|
|
160
|
+
// Try graceful close first
|
|
161
|
+
if (!this.socket.destroyed) {
|
|
162
|
+
this.socket.end();
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Write message to the socket
|
|
168
|
+
*/
|
|
169
|
+
async writeMessage(message) {
|
|
170
|
+
if (!this.socket || this.socket.destroyed) {
|
|
171
|
+
throw new Error('Socket is not connected');
|
|
172
|
+
}
|
|
173
|
+
const buffer = this.protocol.encode(message);
|
|
174
|
+
return new Promise((resolve, reject) => {
|
|
175
|
+
this.socket.write(buffer, (error) => {
|
|
176
|
+
if (error) {
|
|
177
|
+
reject(error);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
resolve();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get the socket path
|
|
187
|
+
*/
|
|
188
|
+
getSocketPath() {
|
|
189
|
+
return this.socketPath;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check if socket file exists
|
|
193
|
+
*/
|
|
194
|
+
async socketExists() {
|
|
195
|
+
try {
|
|
196
|
+
await fs.access(this.socketPath);
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Check if client is currently connected
|
|
205
|
+
*/
|
|
206
|
+
isSocketConnected() {
|
|
207
|
+
return !!(this.socket &&
|
|
208
|
+
!this.socket.destroyed &&
|
|
209
|
+
this.socket.readyState === 'open');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Set up socket event handlers
|
|
213
|
+
*/
|
|
214
|
+
setupSocketHandlers() {
|
|
215
|
+
if (!this.socket) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const dataHandler = (data) => {
|
|
219
|
+
try {
|
|
220
|
+
this.handleData(data);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
this.emit('error', error instanceof Error ? error : new Error(String(error)));
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const errorHandler = (error) => {
|
|
227
|
+
this.handleConnectionError(error);
|
|
228
|
+
};
|
|
229
|
+
const closeHandler = (hadError) => {
|
|
230
|
+
// Only treat as error if it was an unexpected close
|
|
231
|
+
if (hadError && this.isConnected()) {
|
|
232
|
+
this.handleConnectionError(new Error('Socket connection closed unexpectedly'));
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// Normal close, just update state
|
|
236
|
+
this.setConnectionStatus('disconnected');
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
const endHandler = () => {
|
|
240
|
+
// Normal end, just update state
|
|
241
|
+
this.setConnectionStatus('disconnected');
|
|
242
|
+
};
|
|
243
|
+
const connectHandler = () => {
|
|
244
|
+
this.emit('socketConnected');
|
|
245
|
+
};
|
|
246
|
+
// Track event listeners for cleanup
|
|
247
|
+
this.eventListeners.add({ event: 'data', listener: dataHandler });
|
|
248
|
+
this.eventListeners.add({ event: 'error', listener: errorHandler });
|
|
249
|
+
this.eventListeners.add({ event: 'close', listener: closeHandler });
|
|
250
|
+
this.eventListeners.add({ event: 'end', listener: endHandler });
|
|
251
|
+
this.eventListeners.add({ event: 'connect', listener: connectHandler });
|
|
252
|
+
this.socket.on('data', dataHandler);
|
|
253
|
+
this.socket.on('error', errorHandler);
|
|
254
|
+
this.socket.on('close', closeHandler);
|
|
255
|
+
this.socket.on('end', endHandler);
|
|
256
|
+
this.socket.on('connect', connectHandler);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Clean up event listeners
|
|
260
|
+
*/
|
|
261
|
+
cleanupEventListeners() {
|
|
262
|
+
if (!this.socket) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
// Remove all tracked event listeners
|
|
266
|
+
for (const { event, listener } of this.eventListeners) {
|
|
267
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
268
|
+
this.socket.removeListener(event, listener);
|
|
269
|
+
}
|
|
270
|
+
this.eventListeners.clear();
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Override dispose to clean up client-specific resources
|
|
274
|
+
*/
|
|
275
|
+
async disposeCore() {
|
|
276
|
+
// Clean up connection timeout
|
|
277
|
+
if (this.connectionTimeout) {
|
|
278
|
+
await this.connectionTimeout.dispose();
|
|
279
|
+
this.connectionTimeout = null;
|
|
280
|
+
}
|
|
281
|
+
// Clean up event listeners
|
|
282
|
+
this.cleanupEventListeners();
|
|
283
|
+
// Call parent dispose
|
|
284
|
+
await super.disposeCore();
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get client-specific resource stats
|
|
288
|
+
*/
|
|
289
|
+
getClientStats() {
|
|
290
|
+
return {
|
|
291
|
+
...this.getResourceStats(),
|
|
292
|
+
socketPath: this.socketPath,
|
|
293
|
+
isSocketConnected: this.isSocketConnected(),
|
|
294
|
+
hasConnectionTimeout: !!this.connectionTimeout,
|
|
295
|
+
trackedEventListeners: this.eventListeners.size,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Expand tilde in file paths
|
|
300
|
+
*/
|
|
301
|
+
expandPath(filePath) {
|
|
302
|
+
if (filePath.startsWith('~/')) {
|
|
303
|
+
// Enhanced HOME detection: process.env.HOME || os.homedir()
|
|
304
|
+
const homeDir = process.env.HOME || os.homedir();
|
|
305
|
+
if (!homeDir) {
|
|
306
|
+
throw new Error('Unable to resolve home directory for socket path');
|
|
307
|
+
}
|
|
308
|
+
return path.join(homeDir, filePath.slice(2));
|
|
309
|
+
}
|
|
310
|
+
return filePath;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=unix-socket-client.js.map
|