@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.
Files changed (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/dist/src/cli/commands/clear-log.d.ts +10 -0
  4. package/dist/src/cli/commands/clear-log.d.ts.map +1 -0
  5. package/dist/src/cli/commands/clear-log.js +77 -0
  6. package/dist/src/cli/commands/clear-log.js.map +1 -0
  7. package/dist/src/cli/commands/exit.d.ts +10 -0
  8. package/dist/src/cli/commands/exit.d.ts.map +1 -0
  9. package/dist/src/cli/commands/exit.js +65 -0
  10. package/dist/src/cli/commands/exit.js.map +1 -0
  11. package/dist/src/cli/commands/help.d.ts +10 -0
  12. package/dist/src/cli/commands/help.d.ts.map +1 -0
  13. package/dist/src/cli/commands/help.js +340 -0
  14. package/dist/src/cli/commands/help.js.map +1 -0
  15. package/dist/src/cli/commands/list.d.ts +11 -0
  16. package/dist/src/cli/commands/list.d.ts.map +1 -0
  17. package/dist/src/cli/commands/list.js +130 -0
  18. package/dist/src/cli/commands/list.js.map +1 -0
  19. package/dist/src/cli/commands/load.d.ts +11 -0
  20. package/dist/src/cli/commands/load.d.ts.map +1 -0
  21. package/dist/src/cli/commands/load.js +250 -0
  22. package/dist/src/cli/commands/load.js.map +1 -0
  23. package/dist/src/cli/commands/log.d.ts +18 -0
  24. package/dist/src/cli/commands/log.d.ts.map +1 -0
  25. package/dist/src/cli/commands/log.js +282 -0
  26. package/dist/src/cli/commands/log.js.map +1 -0
  27. package/dist/src/cli/commands/restart.d.ts +11 -0
  28. package/dist/src/cli/commands/restart.d.ts.map +1 -0
  29. package/dist/src/cli/commands/restart.js +99 -0
  30. package/dist/src/cli/commands/restart.js.map +1 -0
  31. package/dist/src/cli/commands/start.d.ts +11 -0
  32. package/dist/src/cli/commands/start.d.ts.map +1 -0
  33. package/dist/src/cli/commands/start.js +105 -0
  34. package/dist/src/cli/commands/start.js.map +1 -0
  35. package/dist/src/cli/commands/stop.d.ts +12 -0
  36. package/dist/src/cli/commands/stop.d.ts.map +1 -0
  37. package/dist/src/cli/commands/stop.js +105 -0
  38. package/dist/src/cli/commands/stop.js.map +1 -0
  39. package/dist/src/cli/index.d.ts +3 -0
  40. package/dist/src/cli/index.d.ts.map +1 -0
  41. package/dist/src/cli/index.js +28 -0
  42. package/dist/src/cli/index.js.map +1 -0
  43. package/dist/src/cli/parser.d.ts +14 -0
  44. package/dist/src/cli/parser.d.ts.map +1 -0
  45. package/dist/src/cli/parser.js +131 -0
  46. package/dist/src/cli/parser.js.map +1 -0
  47. package/dist/src/cli/signal-handler.d.ts +51 -0
  48. package/dist/src/cli/signal-handler.d.ts.map +1 -0
  49. package/dist/src/cli/signal-handler.js +129 -0
  50. package/dist/src/cli/signal-handler.js.map +1 -0
  51. package/dist/src/cli/utils/error-handler.d.ts +39 -0
  52. package/dist/src/cli/utils/error-handler.d.ts.map +1 -0
  53. package/dist/src/cli/utils/error-handler.js +200 -0
  54. package/dist/src/cli/utils/error-handler.js.map +1 -0
  55. package/dist/src/cli/utils/error-utils.d.ts +16 -0
  56. package/dist/src/cli/utils/error-utils.d.ts.map +1 -0
  57. package/dist/src/cli/utils/error-utils.js +48 -0
  58. package/dist/src/cli/utils/error-utils.js.map +1 -0
  59. package/dist/src/cli/utils/ipc-client.d.ts +80 -0
  60. package/dist/src/cli/utils/ipc-client.d.ts.map +1 -0
  61. package/dist/src/cli/utils/ipc-client.js +275 -0
  62. package/dist/src/cli/utils/ipc-client.js.map +1 -0
  63. package/dist/src/config/config-loader.d.ts +74 -0
  64. package/dist/src/config/config-loader.d.ts.map +1 -0
  65. package/dist/src/config/config-loader.js +229 -0
  66. package/dist/src/config/config-loader.js.map +1 -0
  67. package/dist/src/config/config-normalizer.d.ts +135 -0
  68. package/dist/src/config/config-normalizer.d.ts.map +1 -0
  69. package/dist/src/config/config-normalizer.js +309 -0
  70. package/dist/src/config/config-normalizer.js.map +1 -0
  71. package/dist/src/config/config-reporter.d.ts +183 -0
  72. package/dist/src/config/config-reporter.d.ts.map +1 -0
  73. package/dist/src/config/config-reporter.js +311 -0
  74. package/dist/src/config/config-reporter.js.map +1 -0
  75. package/dist/src/config/config-validator.d.ts +163 -0
  76. package/dist/src/config/config-validator.d.ts.map +1 -0
  77. package/dist/src/config/config-validator.js +489 -0
  78. package/dist/src/config/config-validator.js.map +1 -0
  79. package/dist/src/config/config-watcher.d.ts +161 -0
  80. package/dist/src/config/config-watcher.d.ts.map +1 -0
  81. package/dist/src/config/config-watcher.js +245 -0
  82. package/dist/src/config/config-watcher.js.map +1 -0
  83. package/dist/src/config/index.d.ts +36 -0
  84. package/dist/src/config/index.d.ts.map +1 -0
  85. package/dist/src/config/index.js +41 -0
  86. package/dist/src/config/index.js.map +1 -0
  87. package/dist/src/config/secure-config-loader.d.ts +77 -0
  88. package/dist/src/config/secure-config-loader.d.ts.map +1 -0
  89. package/dist/src/config/secure-config-loader.js +326 -0
  90. package/dist/src/config/secure-config-loader.js.map +1 -0
  91. package/dist/src/daemon/base-socket-connection.d.ts +66 -0
  92. package/dist/src/daemon/base-socket-connection.d.ts.map +1 -0
  93. package/dist/src/daemon/base-socket-connection.js +192 -0
  94. package/dist/src/daemon/base-socket-connection.js.map +1 -0
  95. package/dist/src/daemon/component-manager.d.ts +180 -0
  96. package/dist/src/daemon/component-manager.d.ts.map +1 -0
  97. package/dist/src/daemon/component-manager.js +794 -0
  98. package/dist/src/daemon/component-manager.js.map +1 -0
  99. package/dist/src/daemon/crash-recovery.d.ts +71 -0
  100. package/dist/src/daemon/crash-recovery.d.ts.map +1 -0
  101. package/dist/src/daemon/crash-recovery.js +282 -0
  102. package/dist/src/daemon/crash-recovery.js.map +1 -0
  103. package/dist/src/daemon/daemon-main.d.ts +18 -0
  104. package/dist/src/daemon/daemon-main.d.ts.map +1 -0
  105. package/dist/src/daemon/daemon-main.js +160 -0
  106. package/dist/src/daemon/daemon-main.js.map +1 -0
  107. package/dist/src/daemon/daemon-state-manager.d.ts +111 -0
  108. package/dist/src/daemon/daemon-state-manager.d.ts.map +1 -0
  109. package/dist/src/daemon/daemon-state-manager.js +194 -0
  110. package/dist/src/daemon/daemon-state-manager.js.map +1 -0
  111. package/dist/src/daemon/data-directory.d.ts +51 -0
  112. package/dist/src/daemon/data-directory.d.ts.map +1 -0
  113. package/dist/src/daemon/data-directory.js +136 -0
  114. package/dist/src/daemon/data-directory.js.map +1 -0
  115. package/dist/src/daemon/index.d.ts +20 -0
  116. package/dist/src/daemon/index.d.ts.map +1 -0
  117. package/dist/src/daemon/index.js +24 -0
  118. package/dist/src/daemon/index.js.map +1 -0
  119. package/dist/src/daemon/ipc-client-base.d.ts +153 -0
  120. package/dist/src/daemon/ipc-client-base.d.ts.map +1 -0
  121. package/dist/src/daemon/ipc-client-base.js +476 -0
  122. package/dist/src/daemon/ipc-client-base.js.map +1 -0
  123. package/dist/src/daemon/ipc-command-handler.d.ts +107 -0
  124. package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -0
  125. package/dist/src/daemon/ipc-command-handler.js +483 -0
  126. package/dist/src/daemon/ipc-command-handler.js.map +1 -0
  127. package/dist/src/daemon/ipc-factory.d.ts +92 -0
  128. package/dist/src/daemon/ipc-factory.d.ts.map +1 -0
  129. package/dist/src/daemon/ipc-factory.js +210 -0
  130. package/dist/src/daemon/ipc-factory.js.map +1 -0
  131. package/dist/src/daemon/ipc-server-base.d.ts +158 -0
  132. package/dist/src/daemon/ipc-server-base.d.ts.map +1 -0
  133. package/dist/src/daemon/ipc-server-base.js +491 -0
  134. package/dist/src/daemon/ipc-server-base.js.map +1 -0
  135. package/dist/src/daemon/message-protocol.d.ts +132 -0
  136. package/dist/src/daemon/message-protocol.d.ts.map +1 -0
  137. package/dist/src/daemon/message-protocol.js +252 -0
  138. package/dist/src/daemon/message-protocol.js.map +1 -0
  139. package/dist/src/daemon/named-pipe-client.d.ts +61 -0
  140. package/dist/src/daemon/named-pipe-client.d.ts.map +1 -0
  141. package/dist/src/daemon/named-pipe-client.js +221 -0
  142. package/dist/src/daemon/named-pipe-client.js.map +1 -0
  143. package/dist/src/daemon/named-pipe-server.d.ts +40 -0
  144. package/dist/src/daemon/named-pipe-server.d.ts.map +1 -0
  145. package/dist/src/daemon/named-pipe-server.js +102 -0
  146. package/dist/src/daemon/named-pipe-server.js.map +1 -0
  147. package/dist/src/daemon/orphan-detector.d.ts +66 -0
  148. package/dist/src/daemon/orphan-detector.d.ts.map +1 -0
  149. package/dist/src/daemon/orphan-detector.js +208 -0
  150. package/dist/src/daemon/orphan-detector.js.map +1 -0
  151. package/dist/src/daemon/pid-manager.d.ts +49 -0
  152. package/dist/src/daemon/pid-manager.d.ts.map +1 -0
  153. package/dist/src/daemon/pid-manager.js +110 -0
  154. package/dist/src/daemon/pid-manager.js.map +1 -0
  155. package/dist/src/daemon/procman-daemon.d.ts +188 -0
  156. package/dist/src/daemon/procman-daemon.d.ts.map +1 -0
  157. package/dist/src/daemon/procman-daemon.js +802 -0
  158. package/dist/src/daemon/procman-daemon.js.map +1 -0
  159. package/dist/src/daemon/reconnection-system.d.ts +113 -0
  160. package/dist/src/daemon/reconnection-system.d.ts.map +1 -0
  161. package/dist/src/daemon/reconnection-system.js +223 -0
  162. package/dist/src/daemon/reconnection-system.js.map +1 -0
  163. package/dist/src/daemon/resource-manager.d.ts +204 -0
  164. package/dist/src/daemon/resource-manager.d.ts.map +1 -0
  165. package/dist/src/daemon/resource-manager.js +423 -0
  166. package/dist/src/daemon/resource-manager.js.map +1 -0
  167. package/dist/src/daemon/signal-handler.d.ts +58 -0
  168. package/dist/src/daemon/signal-handler.d.ts.map +1 -0
  169. package/dist/src/daemon/signal-handler.js +142 -0
  170. package/dist/src/daemon/signal-handler.js.map +1 -0
  171. package/dist/src/daemon/simple-resource-manager.d.ts +95 -0
  172. package/dist/src/daemon/simple-resource-manager.d.ts.map +1 -0
  173. package/dist/src/daemon/simple-resource-manager.js +180 -0
  174. package/dist/src/daemon/simple-resource-manager.js.map +1 -0
  175. package/dist/src/daemon/unix-socket-client.d.ts +69 -0
  176. package/dist/src/daemon/unix-socket-client.d.ts.map +1 -0
  177. package/dist/src/daemon/unix-socket-client.js +313 -0
  178. package/dist/src/daemon/unix-socket-client.js.map +1 -0
  179. package/dist/src/daemon/unix-socket-server.d.ts +61 -0
  180. package/dist/src/daemon/unix-socket-server.d.ts.map +1 -0
  181. package/dist/src/daemon/unix-socket-server.js +262 -0
  182. package/dist/src/daemon/unix-socket-server.js.map +1 -0
  183. package/dist/src/daemon/zombie-reaper.d.ts +83 -0
  184. package/dist/src/daemon/zombie-reaper.d.ts.map +1 -0
  185. package/dist/src/daemon/zombie-reaper.js +278 -0
  186. package/dist/src/daemon/zombie-reaper.js.map +1 -0
  187. package/dist/src/process-manager/index.d.ts +13 -0
  188. package/dist/src/process-manager/index.d.ts.map +1 -0
  189. package/dist/src/process-manager/index.js +11 -0
  190. package/dist/src/process-manager/index.js.map +1 -0
  191. package/dist/src/process-manager/interfaces/index.d.ts +31 -0
  192. package/dist/src/process-manager/interfaces/index.d.ts.map +1 -0
  193. package/dist/src/process-manager/interfaces/index.js +14 -0
  194. package/dist/src/process-manager/interfaces/index.js.map +1 -0
  195. package/dist/src/process-manager/interfaces/process-group.d.ts +200 -0
  196. package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -0
  197. package/dist/src/process-manager/interfaces/process-group.js +10 -0
  198. package/dist/src/process-manager/interfaces/process-group.js.map +1 -0
  199. package/dist/src/process-manager/interfaces/process-lifecycle.d.ts +97 -0
  200. package/dist/src/process-manager/interfaces/process-lifecycle.d.ts.map +1 -0
  201. package/dist/src/process-manager/interfaces/process-lifecycle.js +10 -0
  202. package/dist/src/process-manager/interfaces/process-lifecycle.js.map +1 -0
  203. package/dist/src/process-manager/interfaces/process-monitor.d.ts +118 -0
  204. package/dist/src/process-manager/interfaces/process-monitor.d.ts.map +1 -0
  205. package/dist/src/process-manager/interfaces/process-monitor.js +10 -0
  206. package/dist/src/process-manager/interfaces/process-monitor.js.map +1 -0
  207. package/dist/src/process-manager/interfaces/process-persistence.d.ts +125 -0
  208. package/dist/src/process-manager/interfaces/process-persistence.d.ts.map +1 -0
  209. package/dist/src/process-manager/interfaces/process-persistence.js +10 -0
  210. package/dist/src/process-manager/interfaces/process-persistence.js.map +1 -0
  211. package/dist/src/process-manager/managed-process-info.d.ts +307 -0
  212. package/dist/src/process-manager/managed-process-info.d.ts.map +1 -0
  213. package/dist/src/process-manager/managed-process-info.js +650 -0
  214. package/dist/src/process-manager/managed-process-info.js.map +1 -0
  215. package/dist/src/process-manager/process-group-manager.d.ts +103 -0
  216. package/dist/src/process-manager/process-group-manager.d.ts.map +1 -0
  217. package/dist/src/process-manager/process-group-manager.js +400 -0
  218. package/dist/src/process-manager/process-group-manager.js.map +1 -0
  219. package/dist/src/process-manager/process-lifecycle-manager.d.ts +68 -0
  220. package/dist/src/process-manager/process-lifecycle-manager.d.ts.map +1 -0
  221. package/dist/src/process-manager/process-lifecycle-manager.js +372 -0
  222. package/dist/src/process-manager/process-lifecycle-manager.js.map +1 -0
  223. package/dist/src/process-manager/process-manager.d.ts +296 -0
  224. package/dist/src/process-manager/process-manager.d.ts.map +1 -0
  225. package/dist/src/process-manager/process-manager.js +659 -0
  226. package/dist/src/process-manager/process-manager.js.map +1 -0
  227. package/dist/src/process-manager/process-monitor.d.ts +95 -0
  228. package/dist/src/process-manager/process-monitor.d.ts.map +1 -0
  229. package/dist/src/process-manager/process-monitor.js +357 -0
  230. package/dist/src/process-manager/process-monitor.js.map +1 -0
  231. package/dist/src/process-manager/process-persistence.d.ts +68 -0
  232. package/dist/src/process-manager/process-persistence.d.ts.map +1 -0
  233. package/dist/src/process-manager/process-persistence.js +364 -0
  234. package/dist/src/process-manager/process-persistence.js.map +1 -0
  235. package/dist/src/process-manager/utils/mutex.d.ts +82 -0
  236. package/dist/src/process-manager/utils/mutex.d.ts.map +1 -0
  237. package/dist/src/process-manager/utils/mutex.js +172 -0
  238. package/dist/src/process-manager/utils/mutex.js.map +1 -0
  239. package/dist/src/services/index.d.ts +8 -0
  240. package/dist/src/services/index.d.ts.map +1 -0
  241. package/dist/src/services/index.js +8 -0
  242. package/dist/src/services/index.js.map +1 -0
  243. package/dist/src/services/log-manager-config.d.ts +65 -0
  244. package/dist/src/services/log-manager-config.d.ts.map +1 -0
  245. package/dist/src/services/log-manager-config.js +145 -0
  246. package/dist/src/services/log-manager-config.js.map +1 -0
  247. package/dist/src/services/log-manager-factory.d.ts +134 -0
  248. package/dist/src/services/log-manager-factory.d.ts.map +1 -0
  249. package/dist/src/services/log-manager-factory.js +203 -0
  250. package/dist/src/services/log-manager-factory.js.map +1 -0
  251. package/dist/src/services/log-manager.d.ts +170 -0
  252. package/dist/src/services/log-manager.d.ts.map +1 -0
  253. package/dist/src/services/log-manager.js +1199 -0
  254. package/dist/src/services/log-manager.js.map +1 -0
  255. package/dist/src/services/log-path-validator.d.ts +121 -0
  256. package/dist/src/services/log-path-validator.d.ts.map +1 -0
  257. package/dist/src/services/log-path-validator.js +302 -0
  258. package/dist/src/services/log-path-validator.js.map +1 -0
  259. package/dist/src/services/process-log-integration.d.ts +62 -0
  260. package/dist/src/services/process-log-integration.d.ts.map +1 -0
  261. package/dist/src/services/process-log-integration.js +157 -0
  262. package/dist/src/services/process-log-integration.js.map +1 -0
  263. package/dist/src/shared/config.d.ts +67 -0
  264. package/dist/src/shared/config.d.ts.map +1 -0
  265. package/dist/src/shared/config.js +92 -0
  266. package/dist/src/shared/config.js.map +1 -0
  267. package/dist/src/shared/constants-streaming.d.ts +39 -0
  268. package/dist/src/shared/constants-streaming.d.ts.map +1 -0
  269. package/dist/src/shared/constants-streaming.js +39 -0
  270. package/dist/src/shared/constants-streaming.js.map +1 -0
  271. package/dist/src/shared/constants.d.ts +60 -0
  272. package/dist/src/shared/constants.d.ts.map +1 -0
  273. package/dist/src/shared/constants.js +71 -0
  274. package/dist/src/shared/constants.js.map +1 -0
  275. package/dist/src/shared/errors.d.ts +70 -0
  276. package/dist/src/shared/errors.d.ts.map +1 -0
  277. package/dist/src/shared/errors.js +101 -0
  278. package/dist/src/shared/errors.js.map +1 -0
  279. package/dist/src/shared/index.d.ts +14 -0
  280. package/dist/src/shared/index.d.ts.map +1 -0
  281. package/dist/src/shared/index.js +22 -0
  282. package/dist/src/shared/index.js.map +1 -0
  283. package/dist/src/shared/ipc.d.ts +402 -0
  284. package/dist/src/shared/ipc.d.ts.map +1 -0
  285. package/dist/src/shared/ipc.js +85 -0
  286. package/dist/src/shared/ipc.js.map +1 -0
  287. package/dist/src/shared/logger.d.ts +38 -0
  288. package/dist/src/shared/logger.d.ts.map +1 -0
  289. package/dist/src/shared/logger.js +139 -0
  290. package/dist/src/shared/logger.js.map +1 -0
  291. package/dist/src/shared/logs.d.ts +53 -0
  292. package/dist/src/shared/logs.d.ts.map +1 -0
  293. package/dist/src/shared/logs.js +26 -0
  294. package/dist/src/shared/logs.js.map +1 -0
  295. package/dist/src/shared/process.d.ts +102 -0
  296. package/dist/src/shared/process.d.ts.map +1 -0
  297. package/dist/src/shared/process.js +55 -0
  298. package/dist/src/shared/process.js.map +1 -0
  299. package/dist/src/shared/types.d.ts +15 -0
  300. package/dist/src/shared/types.d.ts.map +1 -0
  301. package/dist/src/shared/types.js +8 -0
  302. package/dist/src/shared/types.js.map +1 -0
  303. package/dist/src/types/index.d.ts +19 -0
  304. package/dist/src/types/index.d.ts.map +1 -0
  305. package/dist/src/types/index.js +5 -0
  306. package/dist/src/types/index.js.map +1 -0
  307. package/dist/src/utils/event-cleanup.d.ts +30 -0
  308. package/dist/src/utils/event-cleanup.d.ts.map +1 -0
  309. package/dist/src/utils/event-cleanup.js +32 -0
  310. package/dist/src/utils/event-cleanup.js.map +1 -0
  311. package/dist/src/utils/memory/memory-monitor.d.ts +126 -0
  312. package/dist/src/utils/memory/memory-monitor.d.ts.map +1 -0
  313. package/dist/src/utils/memory/memory-monitor.js +246 -0
  314. package/dist/src/utils/memory/memory-monitor.js.map +1 -0
  315. 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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"}