electron-infra-kit 0.0.2

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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +302 -0
  3. package/README.zh-CN.md +308 -0
  4. package/dist/core/error/WindowError.d.ts +56 -0
  5. package/dist/core/error/WindowError.js +71 -0
  6. package/dist/core/error/WindowError.js.map +1 -0
  7. package/dist/core/error/WindowError.mjs +71 -0
  8. package/dist/core/error/WindowError.mjs.map +1 -0
  9. package/dist/core/ipc/IpcHandler.d.ts +48 -0
  10. package/dist/core/ipc/IpcHandler.js +59 -0
  11. package/dist/core/ipc/IpcHandler.js.map +1 -0
  12. package/dist/core/ipc/IpcHandler.mjs +59 -0
  13. package/dist/core/ipc/IpcHandler.mjs.map +1 -0
  14. package/dist/core/ipc/IpcRouter.d.ts +70 -0
  15. package/dist/core/ipc/IpcRouter.js +143 -0
  16. package/dist/core/ipc/IpcRouter.js.map +1 -0
  17. package/dist/core/ipc/IpcRouter.mjs +143 -0
  18. package/dist/core/ipc/IpcRouter.mjs.map +1 -0
  19. package/dist/core/ipc/index.d.ts +3 -0
  20. package/dist/core/ipc/index.js +1 -0
  21. package/dist/core/ipc/index.js.map +1 -0
  22. package/dist/core/ipc/index.mjs +1 -0
  23. package/dist/core/ipc/index.mjs.map +1 -0
  24. package/dist/core/ipc/ipc-router.type.d.ts +73 -0
  25. package/dist/core/ipc/transport/index.d.ts +65 -0
  26. package/dist/core/ipc/transport/index.js +229 -0
  27. package/dist/core/ipc/transport/index.js.map +1 -0
  28. package/dist/core/ipc/transport/index.mjs +229 -0
  29. package/dist/core/ipc/transport/index.mjs.map +1 -0
  30. package/dist/core/ipc/transport/ipc.type.d.ts +36 -0
  31. package/dist/core/lifecycle/LifecycleManager.d.ts +66 -0
  32. package/dist/core/lifecycle/LifecycleManager.js +140 -0
  33. package/dist/core/lifecycle/LifecycleManager.js.map +1 -0
  34. package/dist/core/lifecycle/LifecycleManager.mjs +140 -0
  35. package/dist/core/lifecycle/LifecycleManager.mjs.map +1 -0
  36. package/dist/core/message-bus/MessageBus.d.ts +282 -0
  37. package/dist/core/message-bus/MessageBus.js +677 -0
  38. package/dist/core/message-bus/MessageBus.js.map +1 -0
  39. package/dist/core/message-bus/MessageBus.mjs +677 -0
  40. package/dist/core/message-bus/MessageBus.mjs.map +1 -0
  41. package/dist/core/message-bus/MessageBusClient.d.ts +100 -0
  42. package/dist/core/message-bus/MessageBusClient.js +280 -0
  43. package/dist/core/message-bus/MessageBusClient.js.map +1 -0
  44. package/dist/core/message-bus/MessageBusClient.mjs +280 -0
  45. package/dist/core/message-bus/MessageBusClient.mjs.map +1 -0
  46. package/dist/core/message-bus/core/DataStoreManager.d.ts +51 -0
  47. package/dist/core/message-bus/core/DataStoreManager.js +94 -0
  48. package/dist/core/message-bus/core/DataStoreManager.js.map +1 -0
  49. package/dist/core/message-bus/core/DataStoreManager.mjs +94 -0
  50. package/dist/core/message-bus/core/DataStoreManager.mjs.map +1 -0
  51. package/dist/core/message-bus/core/ManagedPort.d.ts +26 -0
  52. package/dist/core/message-bus/core/ManagedPort.js +55 -0
  53. package/dist/core/message-bus/core/ManagedPort.js.map +1 -0
  54. package/dist/core/message-bus/core/ManagedPort.mjs +55 -0
  55. package/dist/core/message-bus/core/ManagedPort.mjs.map +1 -0
  56. package/dist/core/message-bus/core/PortManager.d.ts +47 -0
  57. package/dist/core/message-bus/core/PortManager.js +114 -0
  58. package/dist/core/message-bus/core/PortManager.js.map +1 -0
  59. package/dist/core/message-bus/core/PortManager.mjs +114 -0
  60. package/dist/core/message-bus/core/PortManager.mjs.map +1 -0
  61. package/dist/core/message-bus/core/SubscriptionManager.d.ts +36 -0
  62. package/dist/core/message-bus/core/SubscriptionManager.js +78 -0
  63. package/dist/core/message-bus/core/SubscriptionManager.js.map +1 -0
  64. package/dist/core/message-bus/core/SubscriptionManager.mjs +78 -0
  65. package/dist/core/message-bus/core/SubscriptionManager.mjs.map +1 -0
  66. package/dist/core/message-bus/core/TransactionManager.d.ts +54 -0
  67. package/dist/core/message-bus/core/TransactionManager.js +95 -0
  68. package/dist/core/message-bus/core/TransactionManager.js.map +1 -0
  69. package/dist/core/message-bus/core/TransactionManager.mjs +95 -0
  70. package/dist/core/message-bus/core/TransactionManager.mjs.map +1 -0
  71. package/dist/core/message-bus/core/index.d.ts +5 -0
  72. package/dist/core/message-bus/index.d.ts +4 -0
  73. package/dist/core/message-bus/index.js +1 -0
  74. package/dist/core/message-bus/index.js.map +1 -0
  75. package/dist/core/message-bus/index.mjs +1 -0
  76. package/dist/core/message-bus/index.mjs.map +1 -0
  77. package/dist/core/message-bus/message-bus.type.d.ts +143 -0
  78. package/dist/core/message-bus/message-bus.type.js +26 -0
  79. package/dist/core/message-bus/message-bus.type.js.map +1 -0
  80. package/dist/core/message-bus/message-bus.type.mjs +26 -0
  81. package/dist/core/message-bus/message-bus.type.mjs.map +1 -0
  82. package/dist/core/message-bus/preload.d.ts +16 -0
  83. package/dist/core/message-bus/preload.js +27 -0
  84. package/dist/core/message-bus/preload.js.map +1 -0
  85. package/dist/core/message-bus/preload.mjs +27 -0
  86. package/dist/core/message-bus/preload.mjs.map +1 -0
  87. package/dist/core/message-bus/transport/ITransport.d.ts +40 -0
  88. package/dist/core/message-bus/transport/IpcTransport.d.ts +18 -0
  89. package/dist/core/message-bus/transport/IpcTransport.js +60 -0
  90. package/dist/core/message-bus/transport/IpcTransport.js.map +1 -0
  91. package/dist/core/message-bus/transport/IpcTransport.mjs +60 -0
  92. package/dist/core/message-bus/transport/IpcTransport.mjs.map +1 -0
  93. package/dist/core/message-bus/transport/MessagePortTransport.d.ts +15 -0
  94. package/dist/core/message-bus/transport/MessagePortTransport.js +35 -0
  95. package/dist/core/message-bus/transport/MessagePortTransport.js.map +1 -0
  96. package/dist/core/message-bus/transport/MessagePortTransport.mjs +35 -0
  97. package/dist/core/message-bus/transport/MessagePortTransport.mjs.map +1 -0
  98. package/dist/core/message-bus/transport/index.d.ts +3 -0
  99. package/dist/core/window/IpcSetup.d.ts +50 -0
  100. package/dist/core/window/IpcSetup.js +96 -0
  101. package/dist/core/window/IpcSetup.js.map +1 -0
  102. package/dist/core/window/IpcSetup.mjs +96 -0
  103. package/dist/core/window/IpcSetup.mjs.map +1 -0
  104. package/dist/core/window/WindowCreator.d.ts +66 -0
  105. package/dist/core/window/WindowCreator.js +168 -0
  106. package/dist/core/window/WindowCreator.js.map +1 -0
  107. package/dist/core/window/WindowCreator.mjs +168 -0
  108. package/dist/core/window/WindowCreator.mjs.map +1 -0
  109. package/dist/core/window/WindowManager.d.ts +214 -0
  110. package/dist/core/window/WindowManager.js +583 -0
  111. package/dist/core/window/WindowManager.js.map +1 -0
  112. package/dist/core/window/WindowManager.mjs +583 -0
  113. package/dist/core/window/WindowManager.mjs.map +1 -0
  114. package/dist/core/window/WindowStore.d.ts +136 -0
  115. package/dist/core/window/WindowStore.js +436 -0
  116. package/dist/core/window/WindowStore.js.map +1 -0
  117. package/dist/core/window/WindowStore.mjs +436 -0
  118. package/dist/core/window/WindowStore.mjs.map +1 -0
  119. package/dist/core/window/constants.d.ts +17 -0
  120. package/dist/core/window/constants.js +15 -0
  121. package/dist/core/window/constants.js.map +1 -0
  122. package/dist/core/window/constants.mjs +15 -0
  123. package/dist/core/window/constants.mjs.map +1 -0
  124. package/dist/core/window/core/MetricsManager.d.ts +14 -0
  125. package/dist/core/window/core/MetricsManager.js +27 -0
  126. package/dist/core/window/core/MetricsManager.js.map +1 -0
  127. package/dist/core/window/core/MetricsManager.mjs +27 -0
  128. package/dist/core/window/core/MetricsManager.mjs.map +1 -0
  129. package/dist/core/window/core/PluginExecutor.d.ts +22 -0
  130. package/dist/core/window/core/PluginExecutor.js +110 -0
  131. package/dist/core/window/core/PluginExecutor.js.map +1 -0
  132. package/dist/core/window/core/PluginExecutor.mjs +110 -0
  133. package/dist/core/window/core/PluginExecutor.mjs.map +1 -0
  134. package/dist/core/window/core/WindowContextManager.d.ts +26 -0
  135. package/dist/core/window/core/WindowContextManager.js +59 -0
  136. package/dist/core/window/core/WindowContextManager.js.map +1 -0
  137. package/dist/core/window/core/WindowContextManager.mjs +59 -0
  138. package/dist/core/window/core/WindowContextManager.mjs.map +1 -0
  139. package/dist/core/window/core/WindowLifecycle.d.ts +15 -0
  140. package/dist/core/window/core/WindowLifecycle.js +150 -0
  141. package/dist/core/window/core/WindowLifecycle.js.map +1 -0
  142. package/dist/core/window/core/WindowLifecycle.mjs +150 -0
  143. package/dist/core/window/core/WindowLifecycle.mjs.map +1 -0
  144. package/dist/core/window/core/WindowOperator.d.ts +90 -0
  145. package/dist/core/window/core/WindowOperator.js +154 -0
  146. package/dist/core/window/core/WindowOperator.js.map +1 -0
  147. package/dist/core/window/core/WindowOperator.mjs +154 -0
  148. package/dist/core/window/core/WindowOperator.mjs.map +1 -0
  149. package/dist/core/window/core/WindowRegistry.d.ts +168 -0
  150. package/dist/core/window/core/WindowRegistry.js +331 -0
  151. package/dist/core/window/core/WindowRegistry.js.map +1 -0
  152. package/dist/core/window/core/WindowRegistry.mjs +331 -0
  153. package/dist/core/window/core/WindowRegistry.mjs.map +1 -0
  154. package/dist/core/window/core/WindowStateManager.d.ts +40 -0
  155. package/dist/core/window/core/WindowStateManager.js +110 -0
  156. package/dist/core/window/core/WindowStateManager.js.map +1 -0
  157. package/dist/core/window/core/WindowStateManager.mjs +110 -0
  158. package/dist/core/window/core/WindowStateManager.mjs.map +1 -0
  159. package/dist/core/window/index.d.ts +7 -0
  160. package/dist/core/window/index.js +1 -0
  161. package/dist/core/window/index.js.map +1 -0
  162. package/dist/core/window/index.mjs +1 -0
  163. package/dist/core/window/index.mjs.map +1 -0
  164. package/dist/core/window/window-manager.schema.d.ts +50 -0
  165. package/dist/core/window/window-manager.schema.js +87 -0
  166. package/dist/core/window/window-manager.schema.js.map +1 -0
  167. package/dist/core/window/window-manager.schema.mjs +87 -0
  168. package/dist/core/window/window-manager.schema.mjs.map +1 -0
  169. package/dist/core/window/window-manager.type.d.ts +365 -0
  170. package/dist/index.d.ts +25 -0
  171. package/dist/index.js +33 -0
  172. package/dist/index.js.map +1 -0
  173. package/dist/index.mjs +33 -0
  174. package/dist/index.mjs.map +1 -0
  175. package/dist/index.umd.js +1 -0
  176. package/dist/infrastructure/config/ConfigManager.d.ts +133 -0
  177. package/dist/infrastructure/config/ConfigManager.js +218 -0
  178. package/dist/infrastructure/config/ConfigManager.js.map +1 -0
  179. package/dist/infrastructure/config/ConfigManager.mjs +218 -0
  180. package/dist/infrastructure/config/ConfigManager.mjs.map +1 -0
  181. package/dist/infrastructure/config/index.d.ts +1 -0
  182. package/dist/infrastructure/debug/EnhancedDebugHelper.d.ts +106 -0
  183. package/dist/infrastructure/debug/EnhancedDebugHelper.js +218 -0
  184. package/dist/infrastructure/debug/EnhancedDebugHelper.js.map +1 -0
  185. package/dist/infrastructure/debug/EnhancedDebugHelper.mjs +218 -0
  186. package/dist/infrastructure/debug/EnhancedDebugHelper.mjs.map +1 -0
  187. package/dist/infrastructure/debug/PerformanceMonitor.d.ts +45 -0
  188. package/dist/infrastructure/debug/PerformanceMonitor.js +67 -0
  189. package/dist/infrastructure/debug/PerformanceMonitor.js.map +1 -0
  190. package/dist/infrastructure/debug/PerformanceMonitor.mjs +67 -0
  191. package/dist/infrastructure/debug/PerformanceMonitor.mjs.map +1 -0
  192. package/dist/infrastructure/debug/index.d.ts +22 -0
  193. package/dist/infrastructure/debug/index.js +47 -0
  194. package/dist/infrastructure/debug/index.js.map +1 -0
  195. package/dist/infrastructure/debug/index.mjs +47 -0
  196. package/dist/infrastructure/debug/index.mjs.map +1 -0
  197. package/dist/infrastructure/errors/ErrorCodes.d.ts +74 -0
  198. package/dist/infrastructure/errors/ErrorCodes.js +78 -0
  199. package/dist/infrastructure/errors/ErrorCodes.js.map +1 -0
  200. package/dist/infrastructure/errors/ErrorCodes.mjs +78 -0
  201. package/dist/infrastructure/errors/ErrorCodes.mjs.map +1 -0
  202. package/dist/infrastructure/errors/StandardError.d.ts +61 -0
  203. package/dist/infrastructure/errors/StandardError.js +84 -0
  204. package/dist/infrastructure/errors/StandardError.js.map +1 -0
  205. package/dist/infrastructure/errors/StandardError.mjs +84 -0
  206. package/dist/infrastructure/errors/StandardError.mjs.map +1 -0
  207. package/dist/infrastructure/errors/index.d.ts +13 -0
  208. package/dist/infrastructure/errors/index.js +24 -0
  209. package/dist/infrastructure/errors/index.js.map +1 -0
  210. package/dist/infrastructure/errors/index.mjs +24 -0
  211. package/dist/infrastructure/errors/index.mjs.map +1 -0
  212. package/dist/infrastructure/logger/ElectronLogger.d.ts +39 -0
  213. package/dist/infrastructure/logger/ElectronLogger.js +65 -0
  214. package/dist/infrastructure/logger/ElectronLogger.js.map +1 -0
  215. package/dist/infrastructure/logger/ElectronLogger.mjs +65 -0
  216. package/dist/infrastructure/logger/ElectronLogger.mjs.map +1 -0
  217. package/dist/infrastructure/logger/index.d.ts +2 -0
  218. package/dist/infrastructure/logger/logger.type.d.ts +8 -0
  219. package/dist/internal/types/BrandedTypes.d.ts +64 -0
  220. package/dist/internal/types/BrandedTypes.js +54 -0
  221. package/dist/internal/types/BrandedTypes.js.map +1 -0
  222. package/dist/internal/types/BrandedTypes.mjs +54 -0
  223. package/dist/internal/types/BrandedTypes.mjs.map +1 -0
  224. package/dist/internal/types/PerformanceOptions.d.ts +87 -0
  225. package/dist/internal/types/branded.d.ts +42 -0
  226. package/dist/internal/utils/MessageDispatcher.d.ts +67 -0
  227. package/dist/internal/utils/MessageDispatcher.js +96 -0
  228. package/dist/internal/utils/MessageDispatcher.js.map +1 -0
  229. package/dist/internal/utils/MessageDispatcher.mjs +96 -0
  230. package/dist/internal/utils/MessageDispatcher.mjs.map +1 -0
  231. package/dist/internal/utils/RateLimiter.d.ts +41 -0
  232. package/dist/internal/utils/RateLimiter.js +83 -0
  233. package/dist/internal/utils/RateLimiter.js.map +1 -0
  234. package/dist/internal/utils/RateLimiter.mjs +83 -0
  235. package/dist/internal/utils/RateLimiter.mjs.map +1 -0
  236. package/dist/internal/utils/StateKeeper.d.ts +125 -0
  237. package/dist/internal/utils/StateKeeper.js +334 -0
  238. package/dist/internal/utils/StateKeeper.js.map +1 -0
  239. package/dist/internal/utils/StateKeeper.mjs +334 -0
  240. package/dist/internal/utils/StateKeeper.mjs.map +1 -0
  241. package/dist/internal/utils/branded-helpers.d.ts +33 -0
  242. package/dist/internal/utils/index.d.ts +5 -0
  243. package/dist/preload/index.d.ts +45 -0
  244. package/dist/preload/index.js +91 -0
  245. package/dist/preload/index.js.map +1 -0
  246. package/dist/preload/index.mjs +91 -0
  247. package/dist/preload/index.mjs.map +1 -0
  248. package/dist/preload/preload.type.d.ts +15 -0
  249. package/dist/types.d.ts +7 -0
  250. package/dist/types.js +1 -0
  251. package/dist/types.js.map +1 -0
  252. package/dist/types.mjs +1 -0
  253. package/dist/types.mjs.map +1 -0
  254. package/package.json +143 -0
@@ -0,0 +1,229 @@
1
+ import {ipcMain}from'electron';import {ElectronLogger}from'../../../infrastructure/logger/ElectronLogger.mjs';const emptyFunc = () => { };
2
+ /**
3
+ * @internal This class is an internal implementation detail.
4
+ * Please use `IpcRouter` for application-level IPC communication.
5
+ */
6
+ class IpcTransport {
7
+ // 存储所有频道的回调函数 (用于清理)
8
+ // Map<channel, Map<originalCallback, wrappedCallback>>
9
+ channels = new Map();
10
+ handlers = new Set();
11
+ // 日志实例
12
+ logger;
13
+ constructor(logger) {
14
+ this.logger = logger || new ElectronLogger({ appName: 'IpcTransport' });
15
+ }
16
+ /**
17
+ * Set custom logger
18
+ * 设置自定义日志实例
19
+ * @param logger - Logger instance
20
+ */
21
+ setLogger(logger) {
22
+ this.logger = logger;
23
+ }
24
+ /**
25
+ * 注册监听事件 (ipcMain.on)
26
+ * @param channel - 事件名称
27
+ * @param cb - 回调函数
28
+ */
29
+ on(channel, cb = emptyFunc) {
30
+ // 包装回调函数以添加日志和错误处理
31
+ const wrappedCb = async (event, ...args) => {
32
+ try {
33
+ this.logEvent(channel, 'on', args);
34
+ await cb(event, ...args);
35
+ }
36
+ catch (error) {
37
+ this.logError(channel, 'on', error);
38
+ // 尝试回传错误给发送者
39
+ if (!event.sender.isDestroyed()) {
40
+ event.sender.send(`${channel}:error`, this.serializeError(error));
41
+ }
42
+ }
43
+ };
44
+ // 存储回调引用
45
+ if (!this.channels.has(channel)) {
46
+ this.channels.set(channel, new Map());
47
+ }
48
+ this.channels.get(channel).set(cb, wrappedCb);
49
+ ipcMain.on(channel, wrappedCb);
50
+ }
51
+ /**
52
+ * 注册处理事件 (ipcMain.handle)
53
+ * 注意: 同一个 channel 只能注册一个 handler,重复注册会覆盖之前的 handler
54
+ * @param channel - 事件名称
55
+ * @param cb - 回调函数
56
+ */
57
+ handle(channel, cb = emptyFunc) {
58
+ // 确保先移除旧的 handler,防止 electron 抛出 "second handler" 错误
59
+ if (this.handlers.has(channel)) {
60
+ ipcMain.removeHandler(channel);
61
+ }
62
+ this.handlers.add(channel);
63
+ // 包装回调函数以添加日志和错误处理
64
+ const wrappedCb = async (event, ...args) => {
65
+ try {
66
+ this.logEvent(channel, 'handle', args);
67
+ const result = await cb(event, ...args);
68
+ // Wrap result in standard response
69
+ // 将结果包装在标准响应中
70
+ return {
71
+ code: 0,
72
+ message: 'success',
73
+ data: result,
74
+ };
75
+ }
76
+ catch (error) {
77
+ this.logError(channel, 'handle', error);
78
+ // Enhanced error handling with StandardError support
79
+ // 增强的错误处理,支持 StandardError
80
+ const isDevelopment = process.env.NODE_ENV === 'development';
81
+ // Check if it's a StandardError
82
+ if (error && typeof error === 'object' && 'code' in error && 'category' in error) {
83
+ return {
84
+ code: error.code,
85
+ message: error.message,
86
+ data: null,
87
+ category: error.category,
88
+ details: error.details,
89
+ stack: isDevelopment ? error.stack : undefined,
90
+ };
91
+ }
92
+ // Return standard error response for regular errors
93
+ // 为常规错误返回标准错误响应
94
+ return {
95
+ code: error.code || 500,
96
+ message: error instanceof Error ? error.message : String(error),
97
+ data: null,
98
+ stack: isDevelopment && error instanceof Error ? error.stack : undefined,
99
+ };
100
+ }
101
+ };
102
+ ipcMain.handle(channel, wrappedCb);
103
+ }
104
+ /**
105
+ * 移除指定频道的监听器
106
+ * @param channel - 频道名称
107
+ * @param cb - 可选,指定要移除的回调函数。如果不传,则移除该频道下所有由 IpcTransport 管理的监听器
108
+ */
109
+ removeListener(channel, cb) {
110
+ const channelListeners = this.channels.get(channel);
111
+ if (!channelListeners)
112
+ return;
113
+ if (cb) {
114
+ // 移除特定回调
115
+ const wrappedCb = channelListeners.get(cb);
116
+ if (wrappedCb) {
117
+ ipcMain.removeListener(channel, wrappedCb);
118
+ channelListeners.delete(cb);
119
+ }
120
+ }
121
+ else {
122
+ // 移除该频道下所有由本实例管理的监听器
123
+ for (const wrappedCb of channelListeners.values()) {
124
+ ipcMain.removeListener(channel, wrappedCb);
125
+ }
126
+ channelListeners.clear();
127
+ }
128
+ if (channelListeners.size === 0) {
129
+ this.channels.delete(channel);
130
+ }
131
+ }
132
+ /**
133
+ * 移除所有监听器
134
+ * @param channel - 可选,指定频道名称
135
+ */
136
+ removeAllListeners(channel) {
137
+ if (channel) {
138
+ this.removeListener(channel);
139
+ }
140
+ else {
141
+ for (const ch of this.channels.keys()) {
142
+ this.removeListener(ch);
143
+ }
144
+ this.channels.clear();
145
+ }
146
+ }
147
+ /**
148
+ * 移除处理器
149
+ * @param channel - 频道名称
150
+ */
151
+ removeHandler(channel) {
152
+ if (this.handlers.has(channel)) {
153
+ ipcMain.removeHandler(channel);
154
+ this.handlers.delete(channel);
155
+ }
156
+ }
157
+ /**
158
+ * 移除所有处理器
159
+ */
160
+ removeAllHandlers() {
161
+ for (const channel of this.handlers) {
162
+ ipcMain.removeHandler(channel);
163
+ }
164
+ this.handlers.clear();
165
+ }
166
+ /**
167
+ * 记录错误信息
168
+ * @param err - 错误信息
169
+ */
170
+ error(err) {
171
+ this.logger.error(`[IPC System Error]: ${err}`);
172
+ }
173
+ /**
174
+ * 记录普通日志
175
+ * @param data - 日志信息
176
+ */
177
+ log(data) {
178
+ this.logger.info(`[IPC System Log]: ${data}`);
179
+ }
180
+ // 私有辅助方法:格式化日志
181
+ logEvent(channel, type, args) {
182
+ try {
183
+ // 尝试获取 data.name 作为操作名,这是我们约定的通信格式
184
+ const actionName = args[0]?.name;
185
+ const argStr = actionName ? `[Action: ${actionName}]` : `[Args: ${this.safeStringify(args)}]`;
186
+ this.logger.info(`[${type.toUpperCase()}] ${channel} ${argStr}`);
187
+ }
188
+ catch {
189
+ this.logger.info(`[${type.toUpperCase()}] ${channel} [Args parsing failed]`);
190
+ }
191
+ }
192
+ logError(channel, type, error) {
193
+ const errorMsg = error instanceof Error ? error.message : String(error);
194
+ const errorStack = error instanceof Error ? error.stack : '';
195
+ this.logger.error(`[${type.toUpperCase()} ERROR] ${channel}: ${errorMsg}`, errorStack);
196
+ }
197
+ serializeError(error) {
198
+ if (error instanceof Error) {
199
+ // 获取所有属性,包括不可枚举的
200
+ const serialized = {
201
+ name: error.name,
202
+ message: error.message,
203
+ stack: error.stack,
204
+ };
205
+ // 复制其他自定义属性 (如 code, issues 等)
206
+ for (const key of Object.getOwnPropertyNames(error)) {
207
+ if (!['name', 'message', 'stack'].includes(key)) {
208
+ serialized[key] = error[key];
209
+ }
210
+ }
211
+ return serialized;
212
+ }
213
+ if (typeof error === 'object' && error !== null) {
214
+ return error;
215
+ }
216
+ return {
217
+ message: String(error),
218
+ name: 'UnknownError',
219
+ };
220
+ }
221
+ safeStringify(obj) {
222
+ try {
223
+ return JSON.stringify(obj);
224
+ }
225
+ catch {
226
+ return '[Circular or Non-serializable]';
227
+ }
228
+ }
229
+ }export{IpcTransport as default};//# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/core/ipc/transport/index.ts"],"sourcesContent":["import { ipcMain, IpcMainEvent, IpcMainInvokeEvent } from 'electron';\nimport { Logger, ILogger } from '@/infrastructure/logger';\nimport type {\n EmptyFunc,\n IPCEventHandler,\n IPCHandleHandler,\n IpcResponse,\n IIpcTransport,\n} from './ipc.type';\n\nconst emptyFunc: EmptyFunc = () => {};\n\n/**\n * @internal This class is an internal implementation detail.\n * Please use `IpcRouter` for application-level IPC communication.\n */\nexport default class IpcTransport implements IIpcTransport {\n // 存储所有频道的回调函数 (用于清理)\n // Map<channel, Map<originalCallback, wrappedCallback>>\n private readonly channels: Map<\n string,\n Map<IPCEventHandler, (event: IpcMainEvent, ...args: unknown[]) => Promise<void>>\n > = new Map();\n private readonly handlers: Set<string> = new Set();\n\n // 日志实例\n private logger: ILogger;\n\n constructor(logger?: ILogger) {\n this.logger = logger || new Logger({ appName: 'IpcTransport' });\n }\n\n /**\n * Set custom logger\n * 设置自定义日志实例\n * @param logger - Logger instance\n */\n public setLogger(logger: ILogger): void {\n this.logger = logger;\n }\n\n /**\n * 注册监听事件 (ipcMain.on)\n * @param channel - 事件名称\n * @param cb - 回调函数\n */\n public on(channel: string, cb: IPCEventHandler = emptyFunc): void {\n // 包装回调函数以添加日志和错误处理\n const wrappedCb = async (event: IpcMainEvent, ...args: unknown[]) => {\n try {\n this.logEvent(channel, 'on', args);\n await cb(event, ...args);\n } catch (error) {\n this.logError(channel, 'on', error);\n // 尝试回传错误给发送者\n if (!event.sender.isDestroyed()) {\n event.sender.send(`${channel}:error`, this.serializeError(error));\n }\n }\n };\n\n // 存储回调引用\n if (!this.channels.has(channel)) {\n this.channels.set(channel, new Map());\n }\n this.channels.get(channel)!.set(cb, wrappedCb);\n\n ipcMain.on(channel, wrappedCb);\n }\n\n /**\n * 注册处理事件 (ipcMain.handle)\n * 注意: 同一个 channel 只能注册一个 handler,重复注册会覆盖之前的 handler\n * @param channel - 事件名称\n * @param cb - 回调函数\n */\n public handle(channel: string, cb: IPCHandleHandler = emptyFunc): void {\n // 确保先移除旧的 handler,防止 electron 抛出 \"second handler\" 错误\n if (this.handlers.has(channel)) {\n ipcMain.removeHandler(channel);\n }\n this.handlers.add(channel);\n\n // 包装回调函数以添加日志和错误处理\n const wrappedCb = async (\n event: IpcMainInvokeEvent,\n ...args: unknown[]\n ): Promise<IpcResponse> => {\n try {\n this.logEvent(channel, 'handle', args);\n const result = await cb(event, ...args);\n\n // Wrap result in standard response\n // 将结果包装在标准响应中\n return {\n code: 0,\n message: 'success',\n data: result,\n };\n } catch (error) {\n this.logError(channel, 'handle', error);\n\n // Enhanced error handling with StandardError support\n // 增强的错误处理,支持 StandardError\n const isDevelopment = process.env.NODE_ENV === 'development';\n\n // Check if it's a StandardError\n if (error && typeof error === 'object' && 'code' in error && 'category' in error) {\n return {\n code: (error as any).code,\n message: (error as any).message,\n data: null,\n category: (error as any).category,\n details: (error as any).details,\n stack: isDevelopment ? (error as any).stack : undefined,\n };\n }\n\n // Return standard error response for regular errors\n // 为常规错误返回标准错误响应\n return {\n code: (error as any).code || 500,\n message: error instanceof Error ? error.message : String(error),\n data: null,\n stack: isDevelopment && error instanceof Error ? error.stack : undefined,\n };\n }\n };\n\n ipcMain.handle(channel, wrappedCb);\n }\n\n /**\n * 移除指定频道的监听器\n * @param channel - 频道名称\n * @param cb - 可选,指定要移除的回调函数。如果不传,则移除该频道下所有由 IpcTransport 管理的监听器\n */\n public removeListener(channel: string, cb?: IPCEventHandler): void {\n const channelListeners = this.channels.get(channel);\n if (!channelListeners) return;\n\n if (cb) {\n // 移除特定回调\n const wrappedCb = channelListeners.get(cb);\n if (wrappedCb) {\n ipcMain.removeListener(channel, wrappedCb);\n channelListeners.delete(cb);\n }\n } else {\n // 移除该频道下所有由本实例管理的监听器\n for (const wrappedCb of channelListeners.values()) {\n ipcMain.removeListener(channel, wrappedCb);\n }\n channelListeners.clear();\n }\n\n if (channelListeners.size === 0) {\n this.channels.delete(channel);\n }\n }\n\n /**\n * 移除所有监听器\n * @param channel - 可选,指定频道名称\n */\n public removeAllListeners(channel?: string): void {\n if (channel) {\n this.removeListener(channel);\n } else {\n for (const ch of this.channels.keys()) {\n this.removeListener(ch);\n }\n this.channels.clear();\n }\n }\n\n /**\n * 移除处理器\n * @param channel - 频道名称\n */\n public removeHandler(channel: string): void {\n if (this.handlers.has(channel)) {\n ipcMain.removeHandler(channel);\n this.handlers.delete(channel);\n }\n }\n\n /**\n * 移除所有处理器\n */\n public removeAllHandlers(): void {\n for (const channel of this.handlers) {\n ipcMain.removeHandler(channel);\n }\n this.handlers.clear();\n }\n\n /**\n * 记录错误信息\n * @param err - 错误信息\n */\n public error(err: string): void {\n this.logger.error(`[IPC System Error]: ${err}`);\n }\n\n /**\n * 记录普通日志\n * @param data - 日志信息\n */\n public log(data: string): void {\n this.logger.info(`[IPC System Log]: ${data}`);\n }\n\n // 私有辅助方法:格式化日志\n private logEvent(channel: string, type: 'on' | 'handle', args: unknown[]): void {\n try {\n // 尝试获取 data.name 作为操作名,这是我们约定的通信格式\n const actionName = (args[0] as { name?: string })?.name;\n const argStr = actionName ? `[Action: ${actionName}]` : `[Args: ${this.safeStringify(args)}]`;\n this.logger.info(`[${type.toUpperCase()}] ${channel} ${argStr}`);\n } catch {\n this.logger.info(`[${type.toUpperCase()}] ${channel} [Args parsing failed]`);\n }\n }\n\n private logError(channel: string, type: 'on' | 'handle', error: unknown): void {\n const errorMsg = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : '';\n this.logger.error(`[${type.toUpperCase()} ERROR] ${channel}: ${errorMsg}`, errorStack);\n }\n\n private serializeError(error: unknown): Record<string, unknown> {\n if (error instanceof Error) {\n // 获取所有属性,包括不可枚举的\n const serialized: Record<string, unknown> = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n\n // 复制其他自定义属性 (如 code, issues 等)\n for (const key of Object.getOwnPropertyNames(error)) {\n if (!['name', 'message', 'stack'].includes(key)) {\n serialized[key] = (error as any)[key];\n }\n }\n return serialized;\n }\n\n if (typeof error === 'object' && error !== null) {\n return error as Record<string, unknown>;\n }\n\n return {\n message: String(error),\n name: 'UnknownError',\n };\n }\n\n private safeStringify(obj: unknown): string {\n try {\n return JSON.stringify(obj);\n } catch {\n return '[Circular or Non-serializable]';\n }\n }\n}\n"],"names":["Logger"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { IpcMainEvent, IpcMainInvokeEvent } from 'electron';
2
+ import { ErrorCategory } from '@/infrastructure/errors';
3
+ export type EmptyFunc = () => void;
4
+ export type IPCEventHandler = (event: IpcMainEvent, ...args: unknown[]) => void | Promise<void>;
5
+ export type IPCHandleHandler = (event: IpcMainInvokeEvent, ...args: unknown[]) => unknown | Promise<unknown>;
6
+ /**
7
+ * Standard IPC Response
8
+ * 标准 IPC 响应
9
+ */
10
+ export interface IpcResponse<T = unknown> {
11
+ /** Response code (0 = success, non-zero = error) */
12
+ code: number;
13
+ /** Response message */
14
+ message: string;
15
+ /** Response data */
16
+ data: T | null;
17
+ /** Error category (only present on error) */
18
+ category?: ErrorCategory;
19
+ /** Error details (only present on error) */
20
+ details?: unknown;
21
+ /** Error stack (only in development mode) */
22
+ stack?: string;
23
+ }
24
+ /**
25
+ * Public Interface for IpcTransport
26
+ * IpcTransport 的公共接口
27
+ */
28
+ export interface IIpcTransport {
29
+ setLogger(logger: any): void;
30
+ on(channel: string, cb: IPCEventHandler): void;
31
+ handle(channel: string, cb: IPCHandleHandler): void;
32
+ removeHandler(channel: string): void;
33
+ removeListener(channel: string): void;
34
+ removeAllHandlers(): void;
35
+ removeAllListeners(): void;
36
+ }
@@ -0,0 +1,66 @@
1
+ import WindowManager from '@/core/window/WindowManager';
2
+ import IpcRouter from '@/core/ipc/IpcRouter';
3
+ import { MessageBus } from '@/core/message-bus/MessageBus';
4
+ import { WindowManagerConfig } from '@/core/window/window-manager.type';
5
+ /**
6
+ * Lifecycle Configuration
7
+ * 生命周期配置
8
+ */
9
+ export interface LifecycleConfig extends WindowManagerConfig {
10
+ /**
11
+ * Whether to automatically start on instantiation (default: false)
12
+ * 是否在实例化时自动启动 (默认: false)
13
+ */
14
+ autoStart?: boolean;
15
+ /**
16
+ * Existing IpcRouter instance
17
+ * 现有的 IpcRouter 实例
18
+ */
19
+ ipcRouter?: IpcRouter;
20
+ /**
21
+ * Existing WindowManager instance
22
+ * 现有的 WindowManager 实例
23
+ */
24
+ windowManager?: WindowManager;
25
+ /**
26
+ * Existing MessageBus instance
27
+ * 现有的 MessageBus 实例
28
+ */
29
+ messageBus?: MessageBus;
30
+ }
31
+ /**
32
+ * Lifecycle Manager
33
+ * 生命周期管理器
34
+ *
35
+ * Orchestrates the startup and shutdown of the Electron Toolkit modules.
36
+ * 编排 Electron Toolkit 模块的启动和关闭。
37
+ */
38
+ export declare class LifecycleManager {
39
+ windowManager?: WindowManager;
40
+ ipcRouter?: IpcRouter;
41
+ messageBus?: MessageBus;
42
+ private logger;
43
+ private isStarted;
44
+ private config;
45
+ /**
46
+ * Create LifecycleManager instance
47
+ * 创建 LifecycleManager 实例
48
+ * @param config - Configuration object
49
+ */
50
+ constructor(config?: LifecycleConfig);
51
+ /**
52
+ * Start up all services
53
+ * 启动所有服务
54
+ */
55
+ startup(): Promise<void>;
56
+ /**
57
+ * Shut down all services gracefully
58
+ * 优雅地关闭所有服务
59
+ */
60
+ shutdown(): Promise<void>;
61
+ /**
62
+ * Get initialization status
63
+ * 获取初始化状态
64
+ */
65
+ get started(): boolean;
66
+ }
@@ -0,0 +1,140 @@
1
+ 'use strict';var WindowManager=require('../window/WindowManager.js'),IpcRouter=require('../ipc/IpcRouter.js'),MessageBus=require('../message-bus/MessageBus.js'),index=require('../../infrastructure/debug/index.js'),ElectronLogger=require('../../infrastructure/logger/ElectronLogger.js');/**
2
+ * Lifecycle Manager
3
+ * 生命周期管理器
4
+ *
5
+ * Orchestrates the startup and shutdown of the Electron Toolkit modules.
6
+ * 编排 Electron Toolkit 模块的启动和关闭。
7
+ */
8
+ class LifecycleManager {
9
+ windowManager;
10
+ ipcRouter;
11
+ messageBus;
12
+ logger;
13
+ isStarted = false;
14
+ config;
15
+ /**
16
+ * Create LifecycleManager instance
17
+ * 创建 LifecycleManager 实例
18
+ * @param config - Configuration object
19
+ */
20
+ constructor(config = {}) {
21
+ this.config = config;
22
+ this.logger = config.logger || new ElectronLogger.ElectronLogger({ appName: 'LifecycleManager' });
23
+ if (config.autoStart) {
24
+ this.startup().catch((err) => {
25
+ this.logger.error(`Auto-startup failed: ${err}`);
26
+ });
27
+ }
28
+ }
29
+ /**
30
+ * Start up all services
31
+ * 启动所有服务
32
+ */
33
+ async startup() {
34
+ if (this.isStarted) {
35
+ this.logger.warn('LifecycleManager already started');
36
+ return;
37
+ }
38
+ try {
39
+ this.logger.info('Starting up Electron Toolkit services...');
40
+ // 1. Initialize IpcRouter (Foundation for communication)
41
+ // 1. 初始化 IpcRouter (通信基础)
42
+ this.ipcRouter = this.config.ipcRouter || new IpcRouter({ logger: this.config.logger });
43
+ this.logger.info('IpcRouter initialized');
44
+ // 2. Initialize MessageBus (Cross-window communication)
45
+ // 2. 初始化 MessageBus (跨窗口通信)
46
+ this.messageBus = this.config.messageBus || new MessageBus.MessageBus({ logger: this.config.logger });
47
+ // 3. Initialize WindowManager (Core window management)
48
+ // 3. 初始化 WindowManager (核心窗口管理)
49
+ this.windowManager =
50
+ this.config.windowManager ||
51
+ new WindowManager({
52
+ ...this.config,
53
+ ipcRouter: this.ipcRouter,
54
+ messageBus: this.messageBus,
55
+ });
56
+ // Wait for WindowManager initialization (plugins, etc.)
57
+ await this.windowManager.ready();
58
+ this.logger.info('WindowManager initialized');
59
+ // 4. Connect MessageBus to WindowManager
60
+ // 4. 连接 MessageBus 到 WindowManager
61
+ this.messageBus.autoRegisterWindows(this.windowManager);
62
+ this.logger.info('MessageBus initialized');
63
+ // 4. Setup Debug Mode if enabled
64
+ // 4. 如果启用,设置调试模式
65
+ if (this.config.isDevelopment || process.env.NODE_ENV === 'development') {
66
+ index.DebugHelper.enableDebugMode();
67
+ index.DebugHelper.register('windowManager', this.windowManager);
68
+ index.DebugHelper.register('ipcRouter', this.ipcRouter);
69
+ index.DebugHelper.register('messageBus', this.messageBus);
70
+ index.DebugHelper.register('lifecycleManager', this);
71
+ this.logger.info('Debug mode enabled');
72
+ }
73
+ this.isStarted = true;
74
+ this.logger.info('Startup completed successfully');
75
+ }
76
+ catch (error) {
77
+ this.logger.error(`Startup failed: ${error}`);
78
+ await this.shutdown(); // Cleanup partial initialization
79
+ throw error;
80
+ }
81
+ }
82
+ /**
83
+ * Shut down all services gracefully
84
+ * 优雅地关闭所有服务
85
+ */
86
+ async shutdown() {
87
+ this.logger.info('Shutting down Electron Toolkit services...');
88
+ // Shutdown in reverse order of initialization
89
+ // 按初始化的逆序关闭
90
+ // 1. Dispose MessageBus
91
+ if (this.messageBus) {
92
+ try {
93
+ this.messageBus.dispose();
94
+ this.logger.info('MessageBus disposed');
95
+ }
96
+ catch (e) {
97
+ this.logger.warn(`MessageBus dispose error: ${e}`);
98
+ }
99
+ this.messageBus = undefined;
100
+ }
101
+ // 2. Dispose WindowManager (closes all windows)
102
+ if (this.windowManager) {
103
+ try {
104
+ if (typeof this.windowManager.dispose === 'function') {
105
+ await this.windowManager.dispose();
106
+ this.logger.info('WindowManager disposed');
107
+ }
108
+ else {
109
+ // Fallback if dispose is not implemented
110
+ this.windowManager.stopCleanupProtection();
111
+ // Ideally we should close all windows here, but we rely on WindowManager's dispose
112
+ }
113
+ }
114
+ catch (e) {
115
+ this.logger.warn(`WindowManager dispose error: ${e}`);
116
+ }
117
+ this.windowManager = undefined;
118
+ }
119
+ // 3. Dispose IpcRouter
120
+ if (this.ipcRouter) {
121
+ try {
122
+ this.ipcRouter.dispose();
123
+ this.logger.info('IpcRouter disposed');
124
+ }
125
+ catch (e) {
126
+ this.logger.warn(`IpcRouter dispose error: ${e}`);
127
+ }
128
+ this.ipcRouter = undefined;
129
+ }
130
+ this.isStarted = false;
131
+ this.logger.info('Shutdown completed');
132
+ }
133
+ /**
134
+ * Get initialization status
135
+ * 获取初始化状态
136
+ */
137
+ get started() {
138
+ return this.isStarted;
139
+ }
140
+ }exports.LifecycleManager=LifecycleManager;//# sourceMappingURL=LifecycleManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LifecycleManager.js","sources":["../../../src/core/lifecycle/LifecycleManager.ts"],"sourcesContent":["import { Logger, ILogger } from '@/infrastructure/logger';\nimport WindowManager from '@/core/window/WindowManager';\nimport IpcRouter from '@/core/ipc/IpcRouter';\nimport { MessageBus } from '@/core/message-bus/MessageBus';\nimport { WindowManagerConfig } from '@/core/window/window-manager.type';\nimport { DebugHelper } from '@/infrastructure/debug';\n\n/**\n * Lifecycle Configuration\n * 生命周期配置\n */\nexport interface LifecycleConfig extends WindowManagerConfig {\n /**\n * Whether to automatically start on instantiation (default: false)\n * 是否在实例化时自动启动 (默认: false)\n */\n autoStart?: boolean;\n\n /**\n * Existing IpcRouter instance\n * 现有的 IpcRouter 实例\n */\n ipcRouter?: IpcRouter;\n\n /**\n * Existing WindowManager instance\n * 现有的 WindowManager 实例\n */\n windowManager?: WindowManager;\n\n /**\n * Existing MessageBus instance\n * 现有的 MessageBus 实例\n */\n messageBus?: MessageBus;\n}\n\n/**\n * Lifecycle Manager\n * 生命周期管理器\n *\n * Orchestrates the startup and shutdown of the Electron Toolkit modules.\n * 编排 Electron Toolkit 模块的启动和关闭。\n */\nexport class LifecycleManager {\n public windowManager?: WindowManager;\n public ipcRouter?: IpcRouter;\n public messageBus?: MessageBus;\n private logger: ILogger;\n private isStarted = false;\n private config: LifecycleConfig;\n\n /**\n * Create LifecycleManager instance\n * 创建 LifecycleManager 实例\n * @param config - Configuration object\n */\n constructor(config: LifecycleConfig = {}) {\n this.config = config;\n this.logger = config.logger || new Logger({ appName: 'LifecycleManager' });\n\n if (config.autoStart) {\n this.startup().catch((err) => {\n this.logger.error(`Auto-startup failed: ${err}`);\n });\n }\n }\n\n /**\n * Start up all services\n * 启动所有服务\n */\n async startup(): Promise<void> {\n if (this.isStarted) {\n this.logger.warn('LifecycleManager already started');\n return;\n }\n\n try {\n this.logger.info('Starting up Electron Toolkit services...');\n\n // 1. Initialize IpcRouter (Foundation for communication)\n // 1. 初始化 IpcRouter (通信基础)\n this.ipcRouter = this.config.ipcRouter || new IpcRouter({ logger: this.config.logger });\n this.logger.info('IpcRouter initialized');\n\n // 2. Initialize MessageBus (Cross-window communication)\n // 2. 初始化 MessageBus (跨窗口通信)\n this.messageBus = this.config.messageBus || new MessageBus({ logger: this.config.logger });\n\n // 3. Initialize WindowManager (Core window management)\n // 3. 初始化 WindowManager (核心窗口管理)\n this.windowManager =\n this.config.windowManager ||\n new WindowManager({\n ...this.config,\n ipcRouter: this.ipcRouter,\n messageBus: this.messageBus,\n });\n // Wait for WindowManager initialization (plugins, etc.)\n await this.windowManager.ready();\n this.logger.info('WindowManager initialized');\n\n // 4. Connect MessageBus to WindowManager\n // 4. 连接 MessageBus 到 WindowManager\n this.messageBus.autoRegisterWindows(this.windowManager);\n this.logger.info('MessageBus initialized');\n\n // 4. Setup Debug Mode if enabled\n // 4. 如果启用,设置调试模式\n if (this.config.isDevelopment || process.env.NODE_ENV === 'development') {\n DebugHelper.enableDebugMode();\n DebugHelper.register('windowManager', this.windowManager);\n DebugHelper.register('ipcRouter', this.ipcRouter);\n DebugHelper.register('messageBus', this.messageBus);\n DebugHelper.register('lifecycleManager', this);\n this.logger.info('Debug mode enabled');\n }\n\n this.isStarted = true;\n this.logger.info('Startup completed successfully');\n } catch (error) {\n this.logger.error(`Startup failed: ${error}`);\n await this.shutdown(); // Cleanup partial initialization\n throw error;\n }\n }\n\n /**\n * Shut down all services gracefully\n * 优雅地关闭所有服务\n */\n async shutdown(): Promise<void> {\n this.logger.info('Shutting down Electron Toolkit services...');\n\n // Shutdown in reverse order of initialization\n // 按初始化的逆序关闭\n\n // 1. Dispose MessageBus\n if (this.messageBus) {\n try {\n this.messageBus.dispose();\n this.logger.info('MessageBus disposed');\n } catch (e) {\n this.logger.warn(`MessageBus dispose error: ${e}`);\n }\n this.messageBus = undefined;\n }\n\n // 2. Dispose WindowManager (closes all windows)\n if (this.windowManager) {\n try {\n if (typeof this.windowManager.dispose === 'function') {\n await this.windowManager.dispose();\n this.logger.info('WindowManager disposed');\n } else {\n // Fallback if dispose is not implemented\n this.windowManager.stopCleanupProtection();\n // Ideally we should close all windows here, but we rely on WindowManager's dispose\n }\n } catch (e) {\n this.logger.warn(`WindowManager dispose error: ${e}`);\n }\n this.windowManager = undefined;\n }\n\n // 3. Dispose IpcRouter\n if (this.ipcRouter) {\n try {\n this.ipcRouter.dispose();\n this.logger.info('IpcRouter disposed');\n } catch (e) {\n this.logger.warn(`IpcRouter dispose error: ${e}`);\n }\n this.ipcRouter = undefined;\n }\n\n this.isStarted = false;\n this.logger.info('Shutdown completed');\n }\n\n /**\n * Get initialization status\n * 获取初始化状态\n */\n public get started(): boolean {\n return this.isStarted;\n }\n}\n"],"names":["Logger","MessageBus","DebugHelper"],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import WindowManager from'../window/WindowManager.mjs';import IpcRouter from'../ipc/IpcRouter.mjs';import {MessageBus}from'../message-bus/MessageBus.mjs';import {DebugHelper}from'../../infrastructure/debug/index.mjs';import {ElectronLogger}from'../../infrastructure/logger/ElectronLogger.mjs';/**
2
+ * Lifecycle Manager
3
+ * 生命周期管理器
4
+ *
5
+ * Orchestrates the startup and shutdown of the Electron Toolkit modules.
6
+ * 编排 Electron Toolkit 模块的启动和关闭。
7
+ */
8
+ class LifecycleManager {
9
+ windowManager;
10
+ ipcRouter;
11
+ messageBus;
12
+ logger;
13
+ isStarted = false;
14
+ config;
15
+ /**
16
+ * Create LifecycleManager instance
17
+ * 创建 LifecycleManager 实例
18
+ * @param config - Configuration object
19
+ */
20
+ constructor(config = {}) {
21
+ this.config = config;
22
+ this.logger = config.logger || new ElectronLogger({ appName: 'LifecycleManager' });
23
+ if (config.autoStart) {
24
+ this.startup().catch((err) => {
25
+ this.logger.error(`Auto-startup failed: ${err}`);
26
+ });
27
+ }
28
+ }
29
+ /**
30
+ * Start up all services
31
+ * 启动所有服务
32
+ */
33
+ async startup() {
34
+ if (this.isStarted) {
35
+ this.logger.warn('LifecycleManager already started');
36
+ return;
37
+ }
38
+ try {
39
+ this.logger.info('Starting up Electron Toolkit services...');
40
+ // 1. Initialize IpcRouter (Foundation for communication)
41
+ // 1. 初始化 IpcRouter (通信基础)
42
+ this.ipcRouter = this.config.ipcRouter || new IpcRouter({ logger: this.config.logger });
43
+ this.logger.info('IpcRouter initialized');
44
+ // 2. Initialize MessageBus (Cross-window communication)
45
+ // 2. 初始化 MessageBus (跨窗口通信)
46
+ this.messageBus = this.config.messageBus || new MessageBus({ logger: this.config.logger });
47
+ // 3. Initialize WindowManager (Core window management)
48
+ // 3. 初始化 WindowManager (核心窗口管理)
49
+ this.windowManager =
50
+ this.config.windowManager ||
51
+ new WindowManager({
52
+ ...this.config,
53
+ ipcRouter: this.ipcRouter,
54
+ messageBus: this.messageBus,
55
+ });
56
+ // Wait for WindowManager initialization (plugins, etc.)
57
+ await this.windowManager.ready();
58
+ this.logger.info('WindowManager initialized');
59
+ // 4. Connect MessageBus to WindowManager
60
+ // 4. 连接 MessageBus 到 WindowManager
61
+ this.messageBus.autoRegisterWindows(this.windowManager);
62
+ this.logger.info('MessageBus initialized');
63
+ // 4. Setup Debug Mode if enabled
64
+ // 4. 如果启用,设置调试模式
65
+ if (this.config.isDevelopment || process.env.NODE_ENV === 'development') {
66
+ DebugHelper.enableDebugMode();
67
+ DebugHelper.register('windowManager', this.windowManager);
68
+ DebugHelper.register('ipcRouter', this.ipcRouter);
69
+ DebugHelper.register('messageBus', this.messageBus);
70
+ DebugHelper.register('lifecycleManager', this);
71
+ this.logger.info('Debug mode enabled');
72
+ }
73
+ this.isStarted = true;
74
+ this.logger.info('Startup completed successfully');
75
+ }
76
+ catch (error) {
77
+ this.logger.error(`Startup failed: ${error}`);
78
+ await this.shutdown(); // Cleanup partial initialization
79
+ throw error;
80
+ }
81
+ }
82
+ /**
83
+ * Shut down all services gracefully
84
+ * 优雅地关闭所有服务
85
+ */
86
+ async shutdown() {
87
+ this.logger.info('Shutting down Electron Toolkit services...');
88
+ // Shutdown in reverse order of initialization
89
+ // 按初始化的逆序关闭
90
+ // 1. Dispose MessageBus
91
+ if (this.messageBus) {
92
+ try {
93
+ this.messageBus.dispose();
94
+ this.logger.info('MessageBus disposed');
95
+ }
96
+ catch (e) {
97
+ this.logger.warn(`MessageBus dispose error: ${e}`);
98
+ }
99
+ this.messageBus = undefined;
100
+ }
101
+ // 2. Dispose WindowManager (closes all windows)
102
+ if (this.windowManager) {
103
+ try {
104
+ if (typeof this.windowManager.dispose === 'function') {
105
+ await this.windowManager.dispose();
106
+ this.logger.info('WindowManager disposed');
107
+ }
108
+ else {
109
+ // Fallback if dispose is not implemented
110
+ this.windowManager.stopCleanupProtection();
111
+ // Ideally we should close all windows here, but we rely on WindowManager's dispose
112
+ }
113
+ }
114
+ catch (e) {
115
+ this.logger.warn(`WindowManager dispose error: ${e}`);
116
+ }
117
+ this.windowManager = undefined;
118
+ }
119
+ // 3. Dispose IpcRouter
120
+ if (this.ipcRouter) {
121
+ try {
122
+ this.ipcRouter.dispose();
123
+ this.logger.info('IpcRouter disposed');
124
+ }
125
+ catch (e) {
126
+ this.logger.warn(`IpcRouter dispose error: ${e}`);
127
+ }
128
+ this.ipcRouter = undefined;
129
+ }
130
+ this.isStarted = false;
131
+ this.logger.info('Shutdown completed');
132
+ }
133
+ /**
134
+ * Get initialization status
135
+ * 获取初始化状态
136
+ */
137
+ get started() {
138
+ return this.isStarted;
139
+ }
140
+ }export{LifecycleManager};//# sourceMappingURL=LifecycleManager.mjs.map