@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,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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAS9E;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAuC;IAC7C,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,MAAqC;QAC/C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAE1C,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,CAAwC;IAC9C,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,MAAsC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAE1C,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IACxB,QAAQ,GAAuB,IAAI,GAAG,EAAE,CAAC;IACzC,SAAS,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC3C,SAAS,GAIZ,EAAE,CAAC;IACA,QAAQ,GAAG,KAAK,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,QAAoB,EAAE,KAAa;QAC5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,gDAAgD;YAChD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,QAAQ,EAAE,CAAC;QACb,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAoB,EAAE,QAAgB;QAChD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,gBAAgB,CACd,OAAqB,EACrB,KAAa,EACb,QAAkC;QAElC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,qBAAqB;QACrB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,sBAAsB;QACtB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAEvB,6BAA6B;QAC7B,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACH,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,gBAAgB;QAKd,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;YAC9B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;SACjC,CAAC;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAgB,oBAAoB;IAC9B,SAAS,GAAG,IAAI,qBAAqB,EAAE,CAAC;IACxC,QAAQ,GAAG,KAAK,CAAC;IAE3B,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,4BAA4B;QAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,8BAA8B;QAC9B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACO,WAAW;QACnB,iBAAiB;IACnB,CAAC;IAED;;OAEG;IACO,UAAU,CAAC,QAAoB,EAAE,KAAa;QACtD,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACO,WAAW,CACnB,QAAoB,EACpB,QAAgB;QAEhB,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACO,gBAAgB,CACxB,OAAqB,EACrB,KAAa,EACb,QAAkC;QAElC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAES,iBAAiB;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF"}
@@ -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