@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,423 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Management Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for resource leak prevention, tracking, and cleanup.
|
|
5
|
+
* Implements the Disposable pattern for proper resource management.
|
|
6
|
+
*/
|
|
7
|
+
import { setTimeout, clearTimeout, setInterval, clearInterval } from 'timers';
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
/**
|
|
10
|
+
* Timer resource wrapper for timeout tracking
|
|
11
|
+
*/
|
|
12
|
+
export class TrackedTimeout {
|
|
13
|
+
id;
|
|
14
|
+
type = 'timeout';
|
|
15
|
+
createdAt;
|
|
16
|
+
metadata;
|
|
17
|
+
timeoutHandle;
|
|
18
|
+
disposed = false;
|
|
19
|
+
manager;
|
|
20
|
+
constructor(id, timeoutHandle, metadata, manager) {
|
|
21
|
+
this.id = id;
|
|
22
|
+
this.timeoutHandle = timeoutHandle;
|
|
23
|
+
this.createdAt = Date.now();
|
|
24
|
+
this.metadata = metadata;
|
|
25
|
+
this.manager = manager;
|
|
26
|
+
}
|
|
27
|
+
async dispose() {
|
|
28
|
+
if (this.disposed || !this.timeoutHandle) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
clearTimeout(this.timeoutHandle);
|
|
32
|
+
this.timeoutHandle = null;
|
|
33
|
+
this.disposed = true;
|
|
34
|
+
// Auto-remove from manager
|
|
35
|
+
if (this.manager) {
|
|
36
|
+
this.manager.untrackResource(this.id);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
isDisposed() {
|
|
40
|
+
return this.disposed;
|
|
41
|
+
}
|
|
42
|
+
getHandle() {
|
|
43
|
+
return this.timeoutHandle;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Interval resource wrapper for interval tracking
|
|
48
|
+
*/
|
|
49
|
+
export class TrackedInterval {
|
|
50
|
+
id;
|
|
51
|
+
type = 'interval';
|
|
52
|
+
createdAt;
|
|
53
|
+
metadata;
|
|
54
|
+
intervalHandle;
|
|
55
|
+
disposed = false;
|
|
56
|
+
manager;
|
|
57
|
+
constructor(id, intervalHandle, metadata, manager) {
|
|
58
|
+
this.id = id;
|
|
59
|
+
this.intervalHandle = intervalHandle;
|
|
60
|
+
this.createdAt = Date.now();
|
|
61
|
+
this.metadata = metadata;
|
|
62
|
+
this.manager = manager;
|
|
63
|
+
}
|
|
64
|
+
async dispose() {
|
|
65
|
+
if (this.disposed || !this.intervalHandle) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
clearInterval(this.intervalHandle);
|
|
69
|
+
this.intervalHandle = null;
|
|
70
|
+
this.disposed = true;
|
|
71
|
+
// Auto-remove from manager
|
|
72
|
+
if (this.manager) {
|
|
73
|
+
this.manager.untrackResource(this.id);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
isDisposed() {
|
|
77
|
+
return this.disposed;
|
|
78
|
+
}
|
|
79
|
+
getHandle() {
|
|
80
|
+
return this.intervalHandle;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Event listener resource wrapper
|
|
85
|
+
*/
|
|
86
|
+
export class TrackedEventListener {
|
|
87
|
+
emitter;
|
|
88
|
+
event;
|
|
89
|
+
listener;
|
|
90
|
+
id;
|
|
91
|
+
type = 'eventListener';
|
|
92
|
+
createdAt;
|
|
93
|
+
metadata;
|
|
94
|
+
disposed = false;
|
|
95
|
+
manager;
|
|
96
|
+
constructor(id, emitter, event, listener, metadata, manager) {
|
|
97
|
+
this.emitter = emitter;
|
|
98
|
+
this.event = event;
|
|
99
|
+
this.listener = listener;
|
|
100
|
+
this.id = id;
|
|
101
|
+
this.createdAt = Date.now();
|
|
102
|
+
this.metadata = { event, ...metadata };
|
|
103
|
+
this.manager = manager;
|
|
104
|
+
}
|
|
105
|
+
async dispose() {
|
|
106
|
+
if (this.disposed) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
this.emitter.removeListener(this.event, this.listener);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Ignore errors during cleanup
|
|
114
|
+
}
|
|
115
|
+
this.disposed = true;
|
|
116
|
+
// Auto-remove from manager
|
|
117
|
+
if (this.manager) {
|
|
118
|
+
this.manager.untrackResource(this.id);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
isDisposed() {
|
|
122
|
+
return this.disposed;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Resource manager for tracking and cleaning up resources
|
|
127
|
+
*/
|
|
128
|
+
export class ResourceManager extends EventEmitter {
|
|
129
|
+
resources = new Map();
|
|
130
|
+
disposed = false;
|
|
131
|
+
resourceCounter = 0;
|
|
132
|
+
/**
|
|
133
|
+
* Track a timeout and return a tracked wrapper
|
|
134
|
+
*/
|
|
135
|
+
trackTimeout(callback, delay, metadata) {
|
|
136
|
+
this.ensureNotDisposed();
|
|
137
|
+
const id = this.generateResourceId('timeout');
|
|
138
|
+
const timeoutHandle = setTimeout(() => {
|
|
139
|
+
// Auto-remove from tracking when timeout fires
|
|
140
|
+
this.untrackResource(id);
|
|
141
|
+
callback();
|
|
142
|
+
}, delay);
|
|
143
|
+
const trackedTimeout = new TrackedTimeout(id, timeoutHandle, metadata, this);
|
|
144
|
+
this.resources.set(id, trackedTimeout);
|
|
145
|
+
this.emit('resourceTracked', trackedTimeout);
|
|
146
|
+
return trackedTimeout;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Track an interval and return a tracked wrapper
|
|
150
|
+
*/
|
|
151
|
+
trackInterval(callback, interval, metadata) {
|
|
152
|
+
this.ensureNotDisposed();
|
|
153
|
+
const id = this.generateResourceId('interval');
|
|
154
|
+
const intervalHandle = setInterval(callback, interval);
|
|
155
|
+
const trackedInterval = new TrackedInterval(id, intervalHandle, metadata, this);
|
|
156
|
+
this.resources.set(id, trackedInterval);
|
|
157
|
+
this.emit('resourceTracked', trackedInterval);
|
|
158
|
+
return trackedInterval;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Track an event listener and return a tracked wrapper
|
|
162
|
+
*/
|
|
163
|
+
trackEventListener(emitter, event, listener, metadata) {
|
|
164
|
+
this.ensureNotDisposed();
|
|
165
|
+
const id = this.generateResourceId('eventListener');
|
|
166
|
+
emitter.addListener(event, listener);
|
|
167
|
+
const trackedListener = new TrackedEventListener(id, emitter, event, listener, metadata, this);
|
|
168
|
+
this.resources.set(id, trackedListener);
|
|
169
|
+
this.emit('resourceTracked', trackedListener);
|
|
170
|
+
return trackedListener;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Track a custom resource
|
|
174
|
+
*/
|
|
175
|
+
trackResource(resource) {
|
|
176
|
+
this.ensureNotDisposed();
|
|
177
|
+
if (this.resources.has(resource.id)) {
|
|
178
|
+
throw new Error(`Resource with ID '${resource.id}' is already tracked`);
|
|
179
|
+
}
|
|
180
|
+
this.resources.set(resource.id, resource);
|
|
181
|
+
this.emit('resourceTracked', resource);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Untrack a resource by ID without disposing it
|
|
185
|
+
*/
|
|
186
|
+
untrackResource(id) {
|
|
187
|
+
const resource = this.resources.get(id);
|
|
188
|
+
if (resource) {
|
|
189
|
+
this.resources.delete(id);
|
|
190
|
+
this.emit('resourceUntracked', resource);
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Dispose a specific resource by ID
|
|
197
|
+
*/
|
|
198
|
+
async disposeResource(id) {
|
|
199
|
+
const resource = this.resources.get(id);
|
|
200
|
+
if (!resource) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
await resource.dispose();
|
|
205
|
+
this.resources.delete(id);
|
|
206
|
+
this.emit('resourceDisposed', resource);
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
this.emit('resourceDisposeError', resource, error);
|
|
211
|
+
// Still remove it from tracking even if disposal failed
|
|
212
|
+
this.resources.delete(id);
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get all tracked resources
|
|
218
|
+
*/
|
|
219
|
+
getTrackedResources() {
|
|
220
|
+
return Array.from(this.resources.values());
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get tracked resources by type
|
|
224
|
+
*/
|
|
225
|
+
getResourcesByType(type) {
|
|
226
|
+
return Array.from(this.resources.values()).filter((r) => r.type === type);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get resource count by type
|
|
230
|
+
*/
|
|
231
|
+
getResourceCount(type) {
|
|
232
|
+
if (type) {
|
|
233
|
+
return this.getResourcesByType(type).length;
|
|
234
|
+
}
|
|
235
|
+
return this.resources.size;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get resources older than specified age in milliseconds
|
|
239
|
+
*/
|
|
240
|
+
getStaleResources(maxAge) {
|
|
241
|
+
const cutoff = Date.now() - maxAge;
|
|
242
|
+
return Array.from(this.resources.values()).filter((resource) => resource.createdAt < cutoff);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Clean up stale resources
|
|
246
|
+
*/
|
|
247
|
+
async cleanupStaleResources(maxAge) {
|
|
248
|
+
const staleResources = this.getStaleResources(maxAge);
|
|
249
|
+
let cleaned = 0;
|
|
250
|
+
for (const resource of staleResources) {
|
|
251
|
+
try {
|
|
252
|
+
await this.disposeResource(resource.id);
|
|
253
|
+
cleaned++;
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
this.emit('resourceDisposeError', resource, error);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return cleaned;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Dispose all tracked resources
|
|
263
|
+
*/
|
|
264
|
+
async dispose() {
|
|
265
|
+
if (this.disposed) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
this.disposed = true;
|
|
269
|
+
const disposePromises = Array.from(this.resources.values()).map(async (resource) => {
|
|
270
|
+
try {
|
|
271
|
+
await resource.dispose();
|
|
272
|
+
this.emit('resourceDisposed', resource);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
this.emit('resourceDisposeError', resource, error);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
await Promise.all(disposePromises);
|
|
279
|
+
this.resources.clear();
|
|
280
|
+
this.emit('disposed');
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Check if the resource manager is disposed
|
|
284
|
+
*/
|
|
285
|
+
isDisposed() {
|
|
286
|
+
return this.disposed;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Generate a unique resource ID
|
|
290
|
+
*/
|
|
291
|
+
generateResourceId(type) {
|
|
292
|
+
return `${type}_${++this.resourceCounter}_${Date.now()}`;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Ensure the manager is not disposed
|
|
296
|
+
*/
|
|
297
|
+
ensureNotDisposed() {
|
|
298
|
+
if (this.disposed) {
|
|
299
|
+
throw new Error('ResourceManager has been disposed');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Abstract base class implementing the Disposable pattern
|
|
305
|
+
*/
|
|
306
|
+
export class DisposableBase {
|
|
307
|
+
disposed = false;
|
|
308
|
+
resourceManager;
|
|
309
|
+
constructor() {
|
|
310
|
+
this.resourceManager = new ResourceManager();
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Dispose the object and all its resources
|
|
314
|
+
*/
|
|
315
|
+
async dispose() {
|
|
316
|
+
if (this.disposed) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
this.disposed = true;
|
|
320
|
+
try {
|
|
321
|
+
// Call the derived class cleanup method
|
|
322
|
+
await this.disposeCore();
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
// Always dispose the resource manager
|
|
326
|
+
await this.resourceManager.dispose();
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Check if the object is disposed
|
|
331
|
+
*/
|
|
332
|
+
isDisposed() {
|
|
333
|
+
return this.disposed;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Ensure the object is not disposed
|
|
337
|
+
*/
|
|
338
|
+
ensureNotDisposed() {
|
|
339
|
+
if (this.disposed) {
|
|
340
|
+
throw new Error(`${this.constructor.name} has been disposed`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Helper method to safely track timeouts
|
|
345
|
+
*/
|
|
346
|
+
safeSetTimeout(callback, delay, metadata) {
|
|
347
|
+
this.ensureNotDisposed();
|
|
348
|
+
return this.resourceManager.trackTimeout(callback, delay, metadata);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Helper method to safely track intervals
|
|
352
|
+
*/
|
|
353
|
+
safeSetInterval(callback, interval, metadata) {
|
|
354
|
+
this.ensureNotDisposed();
|
|
355
|
+
return this.resourceManager.trackInterval(callback, interval, metadata);
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Helper method to safely track event listeners
|
|
359
|
+
*/
|
|
360
|
+
safeAddEventListener(emitter, event, listener, metadata) {
|
|
361
|
+
this.ensureNotDisposed();
|
|
362
|
+
return this.resourceManager.trackEventListener(emitter, event, listener, metadata);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Utility class for preventing race conditions during disposal
|
|
367
|
+
*/
|
|
368
|
+
export class DisposalGuard {
|
|
369
|
+
disposing = false;
|
|
370
|
+
disposed = false;
|
|
371
|
+
/**
|
|
372
|
+
* Execute an operation with disposal protection
|
|
373
|
+
*/
|
|
374
|
+
async executeWithGuard(operation) {
|
|
375
|
+
if (this.disposed) {
|
|
376
|
+
throw new Error('Object has been disposed');
|
|
377
|
+
}
|
|
378
|
+
if (this.disposing) {
|
|
379
|
+
throw new Error('Object is being disposed');
|
|
380
|
+
}
|
|
381
|
+
return operation();
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Execute disposal with race condition protection
|
|
385
|
+
*/
|
|
386
|
+
async executeDisposal(disposalFunc) {
|
|
387
|
+
if (this.disposed) {
|
|
388
|
+
return false; // Already disposed
|
|
389
|
+
}
|
|
390
|
+
if (this.disposing) {
|
|
391
|
+
return false; // Already disposing
|
|
392
|
+
}
|
|
393
|
+
this.disposing = true;
|
|
394
|
+
try {
|
|
395
|
+
await disposalFunc();
|
|
396
|
+
this.disposed = true;
|
|
397
|
+
return true;
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
this.disposing = false; // Reset on error
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
isDisposed() {
|
|
405
|
+
return this.disposed;
|
|
406
|
+
}
|
|
407
|
+
isDisposing() {
|
|
408
|
+
return this.disposing;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Create a new resource manager instance
|
|
413
|
+
*/
|
|
414
|
+
export function createResourceManager() {
|
|
415
|
+
return new ResourceManager();
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Create a new disposal guard instance
|
|
419
|
+
*/
|
|
420
|
+
export function createDisposalGuard() {
|
|
421
|
+
return new DisposalGuard();
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=resource-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../../../src/daemon/resource-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signal Handler - シグナルハンドリングの専門クラス
|
|
3
|
+
*
|
|
4
|
+
* プロセスシグナルの処理を管理し、グレースフルシャットダウンを実装する。
|
|
5
|
+
* Single Responsibility Principle に従ってシグナル処理のみに特化。
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
/**
|
|
9
|
+
* Events emitted by SignalHandler
|
|
10
|
+
*/
|
|
11
|
+
export interface SignalHandlerEvents {
|
|
12
|
+
gracefulShutdown: (signal: string) => void;
|
|
13
|
+
forceShutdown: (signal: string) => void;
|
|
14
|
+
uncaughtException: (error: Error) => void;
|
|
15
|
+
unhandledRejection: (reason: unknown) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Signal handler class
|
|
19
|
+
*
|
|
20
|
+
* Manages process signals and implements graceful shutdown with timeouts.
|
|
21
|
+
* Provides proper cleanup and error handling for daemon processes.
|
|
22
|
+
*/
|
|
23
|
+
export declare class SignalHandler extends EventEmitter {
|
|
24
|
+
private isShuttingDown;
|
|
25
|
+
private shutdownTimeout?;
|
|
26
|
+
private forceTimeout?;
|
|
27
|
+
private registeredHandlers;
|
|
28
|
+
/**
|
|
29
|
+
* Set up all signal handlers
|
|
30
|
+
*/
|
|
31
|
+
setupHandlers(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Clean up all signal handlers
|
|
34
|
+
*/
|
|
35
|
+
cleanupHandlers(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Check if currently shutting down
|
|
38
|
+
*/
|
|
39
|
+
isShutdownInProgress(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Force immediate shutdown
|
|
42
|
+
*/
|
|
43
|
+
forceShutdown(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Set up graceful shutdown signal handlers
|
|
46
|
+
*/
|
|
47
|
+
private setupGracefulShutdownHandlers;
|
|
48
|
+
/**
|
|
49
|
+
* Set up error handlers
|
|
50
|
+
*/
|
|
51
|
+
private setupErrorHandlers;
|
|
52
|
+
/**
|
|
53
|
+
* Override EventEmitter methods for type safety
|
|
54
|
+
*/
|
|
55
|
+
emit<K extends keyof SignalHandlerEvents>(event: K, ...args: any[]): boolean;
|
|
56
|
+
on<K extends keyof SignalHandlerEvents>(event: K, listener: (...args: any[]) => void): this;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=signal-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-handler.d.ts","sourceRoot":"","sources":["../../../src/daemon/signal-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAUD;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAgC;IACxD,OAAO,CAAC,YAAY,CAAC,CAAgC;IACrD,OAAO,CAAC,kBAAkB,CAAoD;IAE9E;;OAEG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACH,eAAe,IAAI,IAAI;IAiBvB;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAmCrC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8C1B;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO;IAI5E,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EACpC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GACjC,IAAI;CAGR"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signal Handler - シグナルハンドリングの専門クラス
|
|
3
|
+
*
|
|
4
|
+
* プロセスシグナルの処理を管理し、グレースフルシャットダウンを実装する。
|
|
5
|
+
* Single Responsibility Principle に従ってシグナル処理のみに特化。
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
/**
|
|
9
|
+
* Shutdown timing constants
|
|
10
|
+
*/
|
|
11
|
+
const SHUTDOWN_CONSTANTS = {
|
|
12
|
+
GRACEFUL_TIMEOUT_MS: 30000,
|
|
13
|
+
FORCE_TIMEOUT_MS: 5000,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Signal handler class
|
|
17
|
+
*
|
|
18
|
+
* Manages process signals and implements graceful shutdown with timeouts.
|
|
19
|
+
* Provides proper cleanup and error handling for daemon processes.
|
|
20
|
+
*/
|
|
21
|
+
export class SignalHandler extends EventEmitter {
|
|
22
|
+
isShuttingDown = false;
|
|
23
|
+
shutdownTimeout;
|
|
24
|
+
forceTimeout;
|
|
25
|
+
registeredHandlers = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* Set up all signal handlers
|
|
28
|
+
*/
|
|
29
|
+
setupHandlers() {
|
|
30
|
+
this.setupGracefulShutdownHandlers();
|
|
31
|
+
this.setupErrorHandlers();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Clean up all signal handlers
|
|
35
|
+
*/
|
|
36
|
+
cleanupHandlers() {
|
|
37
|
+
for (const [signal, handler] of this.registeredHandlers) {
|
|
38
|
+
process.removeListener(signal, handler);
|
|
39
|
+
}
|
|
40
|
+
this.registeredHandlers.clear();
|
|
41
|
+
// Clear any pending timeouts
|
|
42
|
+
if (this.shutdownTimeout) {
|
|
43
|
+
clearTimeout(this.shutdownTimeout);
|
|
44
|
+
this.shutdownTimeout = undefined;
|
|
45
|
+
}
|
|
46
|
+
if (this.forceTimeout) {
|
|
47
|
+
clearTimeout(this.forceTimeout);
|
|
48
|
+
this.forceTimeout = undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if currently shutting down
|
|
53
|
+
*/
|
|
54
|
+
isShutdownInProgress() {
|
|
55
|
+
return this.isShuttingDown;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Force immediate shutdown
|
|
59
|
+
*/
|
|
60
|
+
forceShutdown() {
|
|
61
|
+
this.cleanupHandlers();
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Set up graceful shutdown signal handlers
|
|
66
|
+
*/
|
|
67
|
+
setupGracefulShutdownHandlers() {
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
69
|
+
const gracefulShutdown = (signal) => {
|
|
70
|
+
if (this.isShuttingDown) {
|
|
71
|
+
console.log(`Received ${signal} during shutdown, ignoring...`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.isShuttingDown = true;
|
|
75
|
+
console.log(`Received ${signal}, initiating graceful shutdown...`);
|
|
76
|
+
// Set up force shutdown timeout
|
|
77
|
+
this.forceTimeout = setTimeout(() => {
|
|
78
|
+
console.log('Graceful shutdown timeout exceeded, forcing exit...');
|
|
79
|
+
this.emit('forceShutdown', signal);
|
|
80
|
+
this.forceShutdown();
|
|
81
|
+
}, SHUTDOWN_CONSTANTS.GRACEFUL_TIMEOUT_MS);
|
|
82
|
+
// Emit graceful shutdown event
|
|
83
|
+
this.emit('gracefulShutdown', signal);
|
|
84
|
+
};
|
|
85
|
+
// Handle SIGTERM (typical daemon termination)
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
87
|
+
const sigtermHandler = () => gracefulShutdown('SIGTERM');
|
|
88
|
+
process.on('SIGTERM', sigtermHandler);
|
|
89
|
+
this.registeredHandlers.set('SIGTERM', sigtermHandler);
|
|
90
|
+
// Handle SIGINT (Ctrl+C in development)
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
92
|
+
const sigintHandler = () => gracefulShutdown('SIGINT');
|
|
93
|
+
process.on('SIGINT', sigintHandler);
|
|
94
|
+
this.registeredHandlers.set('SIGINT', sigintHandler);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Set up error handlers
|
|
98
|
+
*/
|
|
99
|
+
setupErrorHandlers() {
|
|
100
|
+
// Handle uncaught exceptions
|
|
101
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
102
|
+
const uncaughtExceptionHandler = (error) => {
|
|
103
|
+
console.error('Uncaught exception:', error);
|
|
104
|
+
this.emit('uncaughtException', error);
|
|
105
|
+
if (!this.isShuttingDown) {
|
|
106
|
+
this.isShuttingDown = true;
|
|
107
|
+
// Try graceful shutdown with shorter timeout
|
|
108
|
+
this.shutdownTimeout = setTimeout(() => {
|
|
109
|
+
console.error('Graceful shutdown after exception failed, forcing exit...');
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}, SHUTDOWN_CONSTANTS.FORCE_TIMEOUT_MS);
|
|
112
|
+
this.emit('gracefulShutdown', 'uncaughtException');
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
process.on('uncaughtException', uncaughtExceptionHandler);
|
|
116
|
+
this.registeredHandlers.set('uncaughtException', uncaughtExceptionHandler);
|
|
117
|
+
// Handle unhandled promise rejections
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
119
|
+
const unhandledRejectionHandler = (reason) => {
|
|
120
|
+
console.error('Unhandled promise rejection:', reason);
|
|
121
|
+
this.emit('unhandledRejection', reason);
|
|
122
|
+
// Convert to Error if needed
|
|
123
|
+
const error = reason instanceof Error
|
|
124
|
+
? reason
|
|
125
|
+
: new Error(`Unhandled rejection: ${String(reason)}`);
|
|
126
|
+
// Treat as uncaught exception
|
|
127
|
+
uncaughtExceptionHandler(error);
|
|
128
|
+
};
|
|
129
|
+
process.on('unhandledRejection', unhandledRejectionHandler);
|
|
130
|
+
this.registeredHandlers.set('unhandledRejection', unhandledRejectionHandler);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Override EventEmitter methods for type safety
|
|
134
|
+
*/
|
|
135
|
+
emit(event, ...args) {
|
|
136
|
+
return super.emit(event, ...args);
|
|
137
|
+
}
|
|
138
|
+
on(event, listener) {
|
|
139
|
+
return super.on(event, listener);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=signal-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-handler.js","sourceRoot":"","sources":["../../../src/daemon/signal-handler.ts"],"names":[],"mappings":"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"}
|