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,331 @@
1
+ /**
2
+ * WindowRegistry - Manages the mapping and storage of window instances
3
+ * 窗口注册表 - 管理窗口实例的映射和存储
4
+ */
5
+ class WindowRegistry {
6
+ logger;
7
+ /**
8
+ * Map of window ID to BrowserWindow instance
9
+ * 窗口 ID 到 BrowserWindow 实例的映射
10
+ */
11
+ windows = new Map();
12
+ /**
13
+ * Map of window name to window ID
14
+ * 窗口名称到窗口 ID 的映射
15
+ */
16
+ windowNames = new Map();
17
+ /**
18
+ * Map of window ID to window name (Reverse index)
19
+ * 窗口 ID 到窗口名称的映射(反向索引)
20
+ */
21
+ windowIds = new Map();
22
+ /**
23
+ * Map of BrowserWindow instance to window ID
24
+ * BrowserWindow 实例到窗口 ID 的映射
25
+ */
26
+ windowInstanceIds = new Map();
27
+ /**
28
+ * The main window instance reference
29
+ * 主窗口实例引用
30
+ */
31
+ _mainWindow = null;
32
+ /**
33
+ * Map of group name to set of window IDs
34
+ * 组名到窗口 ID 集合的映射
35
+ */
36
+ groups = new Map();
37
+ /**
38
+ * Map of window ID to set of group names (Reverse index for cleanup)
39
+ * 窗口 ID 到组名集合的映射(用于清理的反向索引)
40
+ */
41
+ windowGroups = new Map();
42
+ cleanupTimer = null;
43
+ constructor(logger) {
44
+ this.logger = logger;
45
+ }
46
+ /**
47
+ * Registers a window
48
+ * 注册窗口
49
+ */
50
+ register(id, name, window) {
51
+ this.windows.set(id, window);
52
+ this.windowNames.set(name, id);
53
+ this.windowIds.set(id, name);
54
+ this.windowInstanceIds.set(window, id);
55
+ if (!this._mainWindow) {
56
+ this._mainWindow = window;
57
+ }
58
+ }
59
+ /**
60
+ * Unregisters a window
61
+ * 注销窗口
62
+ */
63
+ unregister(id) {
64
+ // Clean up groups first
65
+ const associatedGroups = this.windowGroups.get(id);
66
+ if (associatedGroups) {
67
+ associatedGroups.forEach((groupName) => {
68
+ const group = this.groups.get(groupName);
69
+ if (group) {
70
+ group.delete(id);
71
+ if (group.size === 0) {
72
+ this.groups.delete(groupName);
73
+ }
74
+ }
75
+ });
76
+ this.windowGroups.delete(id);
77
+ }
78
+ const name = this.windowIds.get(id);
79
+ if (name)
80
+ this.windowNames.delete(name);
81
+ const window = this.windows.get(id);
82
+ if (window) {
83
+ this.windowInstanceIds.delete(window);
84
+ if (this._mainWindow === window) {
85
+ this._mainWindow = null;
86
+ }
87
+ }
88
+ this.windows.delete(id);
89
+ this.windowIds.delete(id);
90
+ }
91
+ /**
92
+ * Adds a window to a group
93
+ * 将窗口添加到组
94
+ */
95
+ addToGroup(id, group) {
96
+ if (!this.windows.has(id)) {
97
+ this.logger.warn(`Cannot add non-existent window ${id} to group ${group}`);
98
+ return;
99
+ }
100
+ if (!this.groups.has(group)) {
101
+ this.groups.set(group, new Set());
102
+ }
103
+ this.groups.get(group).add(id);
104
+ if (!this.windowGroups.has(id)) {
105
+ this.windowGroups.set(id, new Set());
106
+ }
107
+ this.windowGroups.get(id).add(group);
108
+ }
109
+ /**
110
+ * Removes a window from a group
111
+ * 将窗口从组中移除
112
+ */
113
+ removeFromGroup(id, group) {
114
+ const groupSet = this.groups.get(group);
115
+ if (groupSet) {
116
+ groupSet.delete(id);
117
+ if (groupSet.size === 0) {
118
+ this.groups.delete(group);
119
+ }
120
+ }
121
+ const windowGroupSet = this.windowGroups.get(id);
122
+ if (windowGroupSet) {
123
+ windowGroupSet.delete(group);
124
+ if (windowGroupSet.size === 0) {
125
+ this.windowGroups.delete(id);
126
+ }
127
+ }
128
+ }
129
+ /**
130
+ * Get all window IDs in a group
131
+ * 获取组内所有窗口 ID
132
+ */
133
+ getGroupIds(group) {
134
+ const groupSet = this.groups.get(group);
135
+ return groupSet ? Array.from(groupSet) : [];
136
+ }
137
+ /**
138
+ * Get all groups a window belongs to
139
+ * 获取窗口所属的所有组
140
+ */
141
+ getWindowGroups(id) {
142
+ const groupSet = this.windowGroups.get(id);
143
+ return groupSet ? Array.from(groupSet) : [];
144
+ }
145
+ /**
146
+ * Clears all registered windows
147
+ * 清除所有注册的窗口
148
+ */
149
+ clear() {
150
+ this.windows.clear();
151
+ this.windowNames.clear();
152
+ this.windowIds.clear();
153
+ this.windowInstanceIds.clear();
154
+ this.groups.clear();
155
+ this.windowGroups.clear();
156
+ this._mainWindow = null;
157
+ if (this.cleanupTimer) {
158
+ clearInterval(this.cleanupTimer);
159
+ this.cleanupTimer = null;
160
+ }
161
+ }
162
+ /**
163
+ * Get window by ID
164
+ * 根据 ID 获取窗口
165
+ */
166
+ getById(id) {
167
+ return this.windows.get(id);
168
+ }
169
+ /**
170
+ * Get window ID by Name
171
+ * 根据名称获取窗口 ID
172
+ */
173
+ getIdByName(name) {
174
+ return this.windowNames.get(name);
175
+ }
176
+ /**
177
+ * Get window by Name
178
+ * 根据名称获取窗口
179
+ */
180
+ getByName(name) {
181
+ const id = this.windowNames.get(name);
182
+ return id ? this.windows.get(id) : undefined;
183
+ }
184
+ /**
185
+ * Get name by ID
186
+ * 根据 ID 获取名称
187
+ */
188
+ getNameById(id) {
189
+ return this.windowIds.get(id);
190
+ }
191
+ /**
192
+ * Get ID by Window instance
193
+ * 根据窗口实例获取 ID
194
+ */
195
+ getIdByWindow(window) {
196
+ return this.windowInstanceIds.get(window);
197
+ }
198
+ /**
199
+ * Check if window exists by ID
200
+ * 检查指定 ID 的窗口是否存在
201
+ */
202
+ hasId(id) {
203
+ return this.windows.has(id);
204
+ }
205
+ /**
206
+ * Check if window exists by Name
207
+ * 检查指定名称的窗口是否存在
208
+ */
209
+ hasName(name) {
210
+ return this.windowNames.has(name);
211
+ }
212
+ /**
213
+ * Get all window IDs
214
+ * 获取所有窗口 ID
215
+ */
216
+ getAllIds() {
217
+ return Array.from(this.windows.keys());
218
+ }
219
+ /**
220
+ * Get all windows
221
+ * 获取所有窗口
222
+ */
223
+ getAllWindows() {
224
+ return Array.from(this.windows.values());
225
+ }
226
+ /**
227
+ * Get window name map
228
+ * 获取窗口名称映射
229
+ */
230
+ getNameMap() {
231
+ return this.windowNames;
232
+ }
233
+ /**
234
+ * Get total count
235
+ * 获取总数
236
+ */
237
+ getCount() {
238
+ return this.windows.size;
239
+ }
240
+ /**
241
+ * Set main window
242
+ * 设置主窗口
243
+ */
244
+ setMainWindow(window) {
245
+ this._mainWindow = window;
246
+ }
247
+ /**
248
+ * Get main window
249
+ * 获取主窗口
250
+ */
251
+ getMainWindow() {
252
+ return this._mainWindow;
253
+ }
254
+ /**
255
+ * Update window name
256
+ * 更新窗口名称
257
+ */
258
+ updateWindowName(id, newName) {
259
+ const currentName = this.windowIds.get(id);
260
+ if (currentName) {
261
+ this.windowNames.delete(currentName);
262
+ }
263
+ this.windowNames.set(newName, id);
264
+ this.windowIds.set(id, newName);
265
+ }
266
+ /**
267
+ * Start periodic cleanup protection
268
+ * 开启定期清理防护
269
+ */
270
+ startCleanupProtection(intervalMs = 30000) {
271
+ if (this.cleanupTimer) {
272
+ clearInterval(this.cleanupTimer);
273
+ }
274
+ this.cleanupTimer = setInterval(() => {
275
+ this.cleanupDestroyedWindows();
276
+ }, intervalMs);
277
+ this.cleanupTimer.unref();
278
+ }
279
+ /**
280
+ * Stop periodic cleanup protection
281
+ * 停止定期清理防护
282
+ */
283
+ stopCleanupProtection() {
284
+ if (this.cleanupTimer) {
285
+ clearInterval(this.cleanupTimer);
286
+ this.cleanupTimer = null;
287
+ }
288
+ }
289
+ /**
290
+ * Cleanup destroyed windows from internal maps
291
+ * 从内部映射中清理已销毁的窗口
292
+ */
293
+ cleanupDestroyedWindows() {
294
+ const CHUNK_SIZE = 50; // Process 50 windows per tick
295
+ // If we have a small number of windows, process synchronously
296
+ // 如果窗口数量较少,同步处理
297
+ if (this.windows.size <= CHUNK_SIZE) {
298
+ this.performCleanup(Array.from(this.windows.entries()));
299
+ return;
300
+ }
301
+ // Large number of windows: Process in chunks
302
+ // 窗口数量较多:分块处理
303
+ const entries = Array.from(this.windows.entries());
304
+ this.processCleanupChunk(entries, 0, CHUNK_SIZE);
305
+ }
306
+ processCleanupChunk(entries, startIndex, chunkSize) {
307
+ if (startIndex >= entries.length)
308
+ return;
309
+ const endIndex = Math.min(startIndex + chunkSize, entries.length);
310
+ const chunk = entries.slice(startIndex, endIndex);
311
+ this.performCleanup(chunk);
312
+ // Schedule next chunk
313
+ if (endIndex < entries.length) {
314
+ setImmediate(() => {
315
+ this.processCleanupChunk(entries, endIndex, chunkSize);
316
+ });
317
+ }
318
+ }
319
+ performCleanup(entries) {
320
+ const destroyedIds = [];
321
+ entries.forEach(([id, win]) => {
322
+ if (win.isDestroyed()) {
323
+ destroyedIds.push(id);
324
+ }
325
+ });
326
+ if (destroyedIds.length > 0) {
327
+ this.logger.warn(`Found ${destroyedIds.length} destroyed windows in registry. Cleaning up...`);
328
+ destroyedIds.forEach((id) => this.unregister(id));
329
+ }
330
+ }
331
+ }export{WindowRegistry};//# sourceMappingURL=WindowRegistry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowRegistry.mjs","sources":["../../../../src/core/window/core/WindowRegistry.ts"],"sourcesContent":["import { BrowserWindow } from 'electron';\nimport { ILogger } from '@/infrastructure/logger';\n\n/**\n * WindowRegistry - Manages the mapping and storage of window instances\n * 窗口注册表 - 管理窗口实例的映射和存储\n */\nexport class WindowRegistry {\n /**\n * Map of window ID to BrowserWindow instance\n * 窗口 ID 到 BrowserWindow 实例的映射\n */\n private windows: Map<string, BrowserWindow> = new Map();\n\n /**\n * Map of window name to window ID\n * 窗口名称到窗口 ID 的映射\n */\n private windowNames: Map<string, string> = new Map();\n\n /**\n * Map of window ID to window name (Reverse index)\n * 窗口 ID 到窗口名称的映射(反向索引)\n */\n private windowIds: Map<string, string> = new Map();\n\n /**\n * Map of BrowserWindow instance to window ID\n * BrowserWindow 实例到窗口 ID 的映射\n */\n private windowInstanceIds: Map<BrowserWindow, string> = new Map();\n\n /**\n * The main window instance reference\n * 主窗口实例引用\n */\n private _mainWindow: BrowserWindow | null = null;\n\n /**\n * Map of group name to set of window IDs\n * 组名到窗口 ID 集合的映射\n */\n private groups: Map<string, Set<string>> = new Map();\n\n /**\n * Map of window ID to set of group names (Reverse index for cleanup)\n * 窗口 ID 到组名集合的映射(用于清理的反向索引)\n */\n private windowGroups: Map<string, Set<string>> = new Map();\n\n private cleanupTimer: NodeJS.Timeout | null = null;\n\n constructor(private logger: ILogger) {}\n\n /**\n * Registers a window\n * 注册窗口\n */\n register(id: string, name: string, window: BrowserWindow): void {\n this.windows.set(id, window);\n this.windowNames.set(name, id);\n this.windowIds.set(id, name);\n this.windowInstanceIds.set(window, id);\n\n if (!this._mainWindow) {\n this._mainWindow = window;\n }\n }\n\n /**\n * Unregisters a window\n * 注销窗口\n */\n unregister(id: string): void {\n // Clean up groups first\n const associatedGroups = this.windowGroups.get(id);\n if (associatedGroups) {\n associatedGroups.forEach((groupName) => {\n const group = this.groups.get(groupName);\n if (group) {\n group.delete(id);\n if (group.size === 0) {\n this.groups.delete(groupName);\n }\n }\n });\n this.windowGroups.delete(id);\n }\n\n const name = this.windowIds.get(id);\n if (name) this.windowNames.delete(name);\n\n const window = this.windows.get(id);\n if (window) {\n this.windowInstanceIds.delete(window);\n if (this._mainWindow === window) {\n this._mainWindow = null;\n }\n }\n\n this.windows.delete(id);\n this.windowIds.delete(id);\n }\n\n /**\n * Adds a window to a group\n * 将窗口添加到组\n */\n addToGroup(id: string, group: string): void {\n if (!this.windows.has(id)) {\n this.logger.warn(`Cannot add non-existent window ${id} to group ${group}`);\n return;\n }\n\n if (!this.groups.has(group)) {\n this.groups.set(group, new Set());\n }\n this.groups.get(group)!.add(id);\n\n if (!this.windowGroups.has(id)) {\n this.windowGroups.set(id, new Set());\n }\n this.windowGroups.get(id)!.add(group);\n }\n\n /**\n * Removes a window from a group\n * 将窗口从组中移除\n */\n removeFromGroup(id: string, group: string): void {\n const groupSet = this.groups.get(group);\n if (groupSet) {\n groupSet.delete(id);\n if (groupSet.size === 0) {\n this.groups.delete(group);\n }\n }\n\n const windowGroupSet = this.windowGroups.get(id);\n if (windowGroupSet) {\n windowGroupSet.delete(group);\n if (windowGroupSet.size === 0) {\n this.windowGroups.delete(id);\n }\n }\n }\n\n /**\n * Get all window IDs in a group\n * 获取组内所有窗口 ID\n */\n getGroupIds(group: string): string[] {\n const groupSet = this.groups.get(group);\n return groupSet ? Array.from(groupSet) : [];\n }\n\n /**\n * Get all groups a window belongs to\n * 获取窗口所属的所有组\n */\n getWindowGroups(id: string): string[] {\n const groupSet = this.windowGroups.get(id);\n return groupSet ? Array.from(groupSet) : [];\n }\n\n /**\n * Clears all registered windows\n * 清除所有注册的窗口\n */\n clear(): void {\n this.windows.clear();\n this.windowNames.clear();\n this.windowIds.clear();\n this.windowInstanceIds.clear();\n this.groups.clear();\n this.windowGroups.clear();\n this._mainWindow = null;\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * Get window by ID\n * 根据 ID 获取窗口\n */\n getById(id: string): BrowserWindow | undefined {\n return this.windows.get(id);\n }\n\n /**\n * Get window ID by Name\n * 根据名称获取窗口 ID\n */\n getIdByName(name: string): string | undefined {\n return this.windowNames.get(name);\n }\n\n /**\n * Get window by Name\n * 根据名称获取窗口\n */\n getByName(name: string): BrowserWindow | undefined {\n const id = this.windowNames.get(name);\n return id ? this.windows.get(id) : undefined;\n }\n\n /**\n * Get name by ID\n * 根据 ID 获取名称\n */\n getNameById(id: string): string | undefined {\n return this.windowIds.get(id);\n }\n\n /**\n * Get ID by Window instance\n * 根据窗口实例获取 ID\n */\n getIdByWindow(window: BrowserWindow): string | undefined {\n return this.windowInstanceIds.get(window);\n }\n\n /**\n * Check if window exists by ID\n * 检查指定 ID 的窗口是否存在\n */\n hasId(id: string): boolean {\n return this.windows.has(id);\n }\n\n /**\n * Check if window exists by Name\n * 检查指定名称的窗口是否存在\n */\n hasName(name: string): boolean {\n return this.windowNames.has(name);\n }\n\n /**\n * Get all window IDs\n * 获取所有窗口 ID\n */\n getAllIds(): string[] {\n return Array.from(this.windows.keys());\n }\n\n /**\n * Get all windows\n * 获取所有窗口\n */\n getAllWindows(): BrowserWindow[] {\n return Array.from(this.windows.values());\n }\n\n /**\n * Get window name map\n * 获取窗口名称映射\n */\n getNameMap(): Map<string, string> {\n return this.windowNames;\n }\n\n /**\n * Get total count\n * 获取总数\n */\n getCount(): number {\n return this.windows.size;\n }\n\n /**\n * Set main window\n * 设置主窗口\n */\n setMainWindow(window: BrowserWindow | null) {\n this._mainWindow = window;\n }\n\n /**\n * Get main window\n * 获取主窗口\n */\n getMainWindow(): BrowserWindow | null {\n return this._mainWindow;\n }\n\n /**\n * Update window name\n * 更新窗口名称\n */\n updateWindowName(id: string, newName: string): void {\n const currentName = this.windowIds.get(id);\n if (currentName) {\n this.windowNames.delete(currentName);\n }\n this.windowNames.set(newName, id);\n this.windowIds.set(id, newName);\n }\n\n /**\n * Start periodic cleanup protection\n * 开启定期清理防护\n */\n startCleanupProtection(intervalMs: number = 30000): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n }\n\n this.cleanupTimer = setInterval(() => {\n this.cleanupDestroyedWindows();\n }, intervalMs);\n\n this.cleanupTimer.unref();\n }\n\n /**\n * Stop periodic cleanup protection\n * 停止定期清理防护\n */\n stopCleanupProtection(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * Cleanup destroyed windows from internal maps\n * 从内部映射中清理已销毁的窗口\n */\n private cleanupDestroyedWindows(): void {\n const CHUNK_SIZE = 50; // Process 50 windows per tick\n\n // If we have a small number of windows, process synchronously\n // 如果窗口数量较少,同步处理\n if (this.windows.size <= CHUNK_SIZE) {\n this.performCleanup(Array.from(this.windows.entries()));\n return;\n }\n\n // Large number of windows: Process in chunks\n // 窗口数量较多:分块处理\n const entries = Array.from(this.windows.entries());\n this.processCleanupChunk(entries, 0, CHUNK_SIZE);\n }\n\n private processCleanupChunk(\n entries: [string, BrowserWindow][],\n startIndex: number,\n chunkSize: number\n ): void {\n if (startIndex >= entries.length) return;\n\n const endIndex = Math.min(startIndex + chunkSize, entries.length);\n const chunk = entries.slice(startIndex, endIndex);\n\n this.performCleanup(chunk);\n\n // Schedule next chunk\n if (endIndex < entries.length) {\n setImmediate(() => {\n this.processCleanupChunk(entries, endIndex, chunkSize);\n });\n }\n }\n\n private performCleanup(entries: [string, BrowserWindow][]): void {\n const destroyedIds: string[] = [];\n\n entries.forEach(([id, win]) => {\n if (win.isDestroyed()) {\n destroyedIds.push(id);\n }\n });\n\n if (destroyedIds.length > 0) {\n this.logger.warn(\n `Found ${destroyedIds.length} destroyed windows in registry. Cleaning up...`\n );\n destroyedIds.forEach((id) => this.unregister(id));\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { BrowserWindow } from 'electron';
2
+ import { ILogger } from '@/infrastructure/logger';
3
+ import StateKeeper from '@/internal/utils/StateKeeper';
4
+ /**
5
+ * WindowStateManager - Manages window state persistence
6
+ * 窗口状态管理器 - 管理窗口状态持久化
7
+ */
8
+ export declare class WindowStateManager {
9
+ private logger;
10
+ private stateKeeper;
11
+ private handlers;
12
+ constructor(logger: ILogger, stateKeeper?: StateKeeper);
13
+ /**
14
+ * Register window state persistence listeners
15
+ * 注册窗口状态持久化监听器
16
+ * @param name - Window name (窗口名称)
17
+ * @param window - BrowserWindow instance (BrowserWindow 实例)
18
+ * @param getGroups - Optional callback to get current groups (可选回调获取当前组)
19
+ */
20
+ manage(name: string, window: BrowserWindow, getGroups?: () => string[]): void;
21
+ /**
22
+ * Stop managing window state
23
+ * 停止管理窗口状态
24
+ */
25
+ unmanage(windowId: number): void;
26
+ /**
27
+ * Dispose manager and release resources
28
+ * 释放管理器及资源
29
+ */
30
+ dispose(): void;
31
+ /**
32
+ * Get saved window state
33
+ * 获取保存的窗口状态
34
+ * @param name - Window name (窗口名称)
35
+ * @param defaultWidth - Default width (默认宽度)
36
+ * @param defaultHeight - Default height (默认高度)
37
+ * @returns Saved state or default state (保存的状态或默认状态)
38
+ */
39
+ getState(name: string, defaultWidth?: number, defaultHeight?: number): import("@/internal/utils/StateKeeper").WindowState;
40
+ }
@@ -0,0 +1,110 @@
1
+ 'use strict';var electron=require('electron'),StateKeeper=require('../../../internal/utils/StateKeeper.js');/**
2
+ * WindowStateManager - Manages window state persistence
3
+ * 窗口状态管理器 - 管理窗口状态持久化
4
+ */
5
+ class WindowStateManager {
6
+ logger;
7
+ stateKeeper;
8
+ handlers = new Map();
9
+ constructor(logger, stateKeeper) {
10
+ this.logger = logger;
11
+ this.stateKeeper = stateKeeper || new StateKeeper({ logger: this.logger });
12
+ }
13
+ /**
14
+ * Register window state persistence listeners
15
+ * 注册窗口状态持久化监听器
16
+ * @param name - Window name (窗口名称)
17
+ * @param window - BrowserWindow instance (BrowserWindow 实例)
18
+ * @param getGroups - Optional callback to get current groups (可选回调获取当前组)
19
+ */
20
+ manage(name, window, getGroups) {
21
+ // Prevent duplicate management
22
+ this.unmanage(window.id);
23
+ const saveState = () => {
24
+ if (window.isDestroyed())
25
+ return;
26
+ try {
27
+ const bounds = window.getBounds();
28
+ const isMaximized = window.isMaximized();
29
+ const isFullScreen = window.isFullScreen();
30
+ const display = electron.screen.getDisplayMatching(bounds);
31
+ const groups = getGroups ? getGroups() : undefined;
32
+ this.stateKeeper.saveState(name, {
33
+ x: bounds.x,
34
+ y: bounds.y,
35
+ width: bounds.width,
36
+ height: bounds.height,
37
+ isMaximized,
38
+ isFullScreen,
39
+ displayBounds: display.bounds,
40
+ groups,
41
+ });
42
+ }
43
+ catch (error) {
44
+ this.logger.warn(`Failed to save state for window ${name}: ${error}`);
45
+ }
46
+ };
47
+ // Remove double debounce: StateKeeper already handles debounce/throttle
48
+ // 移除双重防抖:StateKeeper 已经处理了防抖/节流
49
+ window.on('resize', saveState);
50
+ window.on('move', saveState);
51
+ window.on('close', saveState);
52
+ window.on('maximize', saveState);
53
+ window.on('unmaximize', saveState);
54
+ window.on('enter-full-screen', saveState);
55
+ window.on('leave-full-screen', saveState);
56
+ // Register cleanup handler
57
+ const cleaner = () => {
58
+ if (!window.isDestroyed()) {
59
+ window.removeListener('resize', saveState);
60
+ window.removeListener('move', saveState);
61
+ window.removeListener('close', saveState);
62
+ window.removeListener('maximize', saveState);
63
+ window.removeListener('unmaximize', saveState);
64
+ window.removeListener('enter-full-screen', saveState);
65
+ window.removeListener('leave-full-screen', saveState);
66
+ }
67
+ };
68
+ this.handlers.set(window.id, cleaner);
69
+ // Auto cleanup on close
70
+ // 注意:'closed' 事件触发时窗口已被销毁,无法 removeListener,但我们需要从 map 中移除 cleaner
71
+ window.once('closed', () => {
72
+ this.handlers.delete(window.id);
73
+ });
74
+ }
75
+ /**
76
+ * Stop managing window state
77
+ * 停止管理窗口状态
78
+ */
79
+ unmanage(windowId) {
80
+ const cleaner = this.handlers.get(windowId);
81
+ if (cleaner) {
82
+ cleaner();
83
+ this.handlers.delete(windowId);
84
+ }
85
+ }
86
+ /**
87
+ * Dispose manager and release resources
88
+ * 释放管理器及资源
89
+ */
90
+ dispose() {
91
+ // Cleanup all handlers
92
+ this.handlers.forEach((cleaner) => cleaner());
93
+ this.handlers.clear();
94
+ // Dispose state keeper
95
+ if (this.stateKeeper && typeof this.stateKeeper.dispose === 'function') {
96
+ this.stateKeeper.dispose();
97
+ }
98
+ }
99
+ /**
100
+ * Get saved window state
101
+ * 获取保存的窗口状态
102
+ * @param name - Window name (窗口名称)
103
+ * @param defaultWidth - Default width (默认宽度)
104
+ * @param defaultHeight - Default height (默认高度)
105
+ * @returns Saved state or default state (保存的状态或默认状态)
106
+ */
107
+ getState(name, defaultWidth, defaultHeight) {
108
+ return this.stateKeeper.getWindowState(name, defaultWidth, defaultHeight);
109
+ }
110
+ }exports.WindowStateManager=WindowStateManager;//# sourceMappingURL=WindowStateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowStateManager.js","sources":["../../../../src/core/window/core/WindowStateManager.ts"],"sourcesContent":["import { BrowserWindow, screen } from 'electron';\nimport { ILogger } from '@/infrastructure/logger';\nimport StateKeeper from '@/internal/utils/StateKeeper';\n\n/**\n * WindowStateManager - Manages window state persistence\n * 窗口状态管理器 - 管理窗口状态持久化\n */\nexport class WindowStateManager {\n private stateKeeper: StateKeeper;\n\n private handlers = new Map<number, () => void>();\n\n constructor(\n private logger: ILogger,\n stateKeeper?: StateKeeper\n ) {\n this.stateKeeper = stateKeeper || new StateKeeper({ logger: this.logger });\n }\n\n /**\n * Register window state persistence listeners\n * 注册窗口状态持久化监听器\n * @param name - Window name (窗口名称)\n * @param window - BrowserWindow instance (BrowserWindow 实例)\n * @param getGroups - Optional callback to get current groups (可选回调获取当前组)\n */\n manage(name: string, window: BrowserWindow, getGroups?: () => string[]): void {\n // Prevent duplicate management\n this.unmanage(window.id);\n\n const saveState = () => {\n if (window.isDestroyed()) return;\n\n try {\n const bounds = window.getBounds();\n const isMaximized = window.isMaximized();\n const isFullScreen = window.isFullScreen();\n const display = screen.getDisplayMatching(bounds);\n const groups = getGroups ? getGroups() : undefined;\n\n this.stateKeeper.saveState(name, {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n isMaximized,\n isFullScreen,\n displayBounds: display.bounds,\n groups,\n });\n } catch (error) {\n this.logger.warn(`Failed to save state for window ${name}: ${error}`);\n }\n };\n\n // Remove double debounce: StateKeeper already handles debounce/throttle\n // 移除双重防抖:StateKeeper 已经处理了防抖/节流\n window.on('resize', saveState);\n window.on('move', saveState);\n window.on('close', saveState);\n window.on('maximize', saveState);\n window.on('unmaximize', saveState);\n window.on('enter-full-screen', saveState);\n window.on('leave-full-screen', saveState);\n\n // Register cleanup handler\n const cleaner = () => {\n if (!window.isDestroyed()) {\n window.removeListener('resize', saveState);\n window.removeListener('move', saveState);\n window.removeListener('close', saveState);\n window.removeListener('maximize', saveState);\n window.removeListener('unmaximize', saveState);\n window.removeListener('enter-full-screen', saveState);\n window.removeListener('leave-full-screen', saveState);\n }\n };\n this.handlers.set(window.id, cleaner);\n\n // Auto cleanup on close\n // 注意:'closed' 事件触发时窗口已被销毁,无法 removeListener,但我们需要从 map 中移除 cleaner\n window.once('closed', () => {\n this.handlers.delete(window.id);\n });\n }\n\n /**\n * Stop managing window state\n * 停止管理窗口状态\n */\n unmanage(windowId: number): void {\n const cleaner = this.handlers.get(windowId);\n if (cleaner) {\n cleaner();\n this.handlers.delete(windowId);\n }\n }\n\n /**\n * Dispose manager and release resources\n * 释放管理器及资源\n */\n public dispose(): void {\n // Cleanup all handlers\n this.handlers.forEach((cleaner) => cleaner());\n this.handlers.clear();\n\n // Dispose state keeper\n if (this.stateKeeper && typeof this.stateKeeper.dispose === 'function') {\n this.stateKeeper.dispose();\n }\n }\n /**\n * Get saved window state\n * 获取保存的窗口状态\n * @param name - Window name (窗口名称)\n * @param defaultWidth - Default width (默认宽度)\n * @param defaultHeight - Default height (默认高度)\n * @returns Saved state or default state (保存的状态或默认状态)\n */\n getState(name: string, defaultWidth?: number, defaultHeight?: number) {\n return this.stateKeeper.getWindowState(name, defaultWidth, defaultHeight);\n }\n}\n"],"names":["screen"],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import {screen}from'electron';import StateKeeper from'../../../internal/utils/StateKeeper.mjs';/**
2
+ * WindowStateManager - Manages window state persistence
3
+ * 窗口状态管理器 - 管理窗口状态持久化
4
+ */
5
+ class WindowStateManager {
6
+ logger;
7
+ stateKeeper;
8
+ handlers = new Map();
9
+ constructor(logger, stateKeeper) {
10
+ this.logger = logger;
11
+ this.stateKeeper = stateKeeper || new StateKeeper({ logger: this.logger });
12
+ }
13
+ /**
14
+ * Register window state persistence listeners
15
+ * 注册窗口状态持久化监听器
16
+ * @param name - Window name (窗口名称)
17
+ * @param window - BrowserWindow instance (BrowserWindow 实例)
18
+ * @param getGroups - Optional callback to get current groups (可选回调获取当前组)
19
+ */
20
+ manage(name, window, getGroups) {
21
+ // Prevent duplicate management
22
+ this.unmanage(window.id);
23
+ const saveState = () => {
24
+ if (window.isDestroyed())
25
+ return;
26
+ try {
27
+ const bounds = window.getBounds();
28
+ const isMaximized = window.isMaximized();
29
+ const isFullScreen = window.isFullScreen();
30
+ const display = screen.getDisplayMatching(bounds);
31
+ const groups = getGroups ? getGroups() : undefined;
32
+ this.stateKeeper.saveState(name, {
33
+ x: bounds.x,
34
+ y: bounds.y,
35
+ width: bounds.width,
36
+ height: bounds.height,
37
+ isMaximized,
38
+ isFullScreen,
39
+ displayBounds: display.bounds,
40
+ groups,
41
+ });
42
+ }
43
+ catch (error) {
44
+ this.logger.warn(`Failed to save state for window ${name}: ${error}`);
45
+ }
46
+ };
47
+ // Remove double debounce: StateKeeper already handles debounce/throttle
48
+ // 移除双重防抖:StateKeeper 已经处理了防抖/节流
49
+ window.on('resize', saveState);
50
+ window.on('move', saveState);
51
+ window.on('close', saveState);
52
+ window.on('maximize', saveState);
53
+ window.on('unmaximize', saveState);
54
+ window.on('enter-full-screen', saveState);
55
+ window.on('leave-full-screen', saveState);
56
+ // Register cleanup handler
57
+ const cleaner = () => {
58
+ if (!window.isDestroyed()) {
59
+ window.removeListener('resize', saveState);
60
+ window.removeListener('move', saveState);
61
+ window.removeListener('close', saveState);
62
+ window.removeListener('maximize', saveState);
63
+ window.removeListener('unmaximize', saveState);
64
+ window.removeListener('enter-full-screen', saveState);
65
+ window.removeListener('leave-full-screen', saveState);
66
+ }
67
+ };
68
+ this.handlers.set(window.id, cleaner);
69
+ // Auto cleanup on close
70
+ // 注意:'closed' 事件触发时窗口已被销毁,无法 removeListener,但我们需要从 map 中移除 cleaner
71
+ window.once('closed', () => {
72
+ this.handlers.delete(window.id);
73
+ });
74
+ }
75
+ /**
76
+ * Stop managing window state
77
+ * 停止管理窗口状态
78
+ */
79
+ unmanage(windowId) {
80
+ const cleaner = this.handlers.get(windowId);
81
+ if (cleaner) {
82
+ cleaner();
83
+ this.handlers.delete(windowId);
84
+ }
85
+ }
86
+ /**
87
+ * Dispose manager and release resources
88
+ * 释放管理器及资源
89
+ */
90
+ dispose() {
91
+ // Cleanup all handlers
92
+ this.handlers.forEach((cleaner) => cleaner());
93
+ this.handlers.clear();
94
+ // Dispose state keeper
95
+ if (this.stateKeeper && typeof this.stateKeeper.dispose === 'function') {
96
+ this.stateKeeper.dispose();
97
+ }
98
+ }
99
+ /**
100
+ * Get saved window state
101
+ * 获取保存的窗口状态
102
+ * @param name - Window name (窗口名称)
103
+ * @param defaultWidth - Default width (默认宽度)
104
+ * @param defaultHeight - Default height (默认高度)
105
+ * @returns Saved state or default state (保存的状态或默认状态)
106
+ */
107
+ getState(name, defaultWidth, defaultHeight) {
108
+ return this.stateKeeper.getWindowState(name, defaultWidth, defaultHeight);
109
+ }
110
+ }export{WindowStateManager};//# sourceMappingURL=WindowStateManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowStateManager.mjs","sources":["../../../../src/core/window/core/WindowStateManager.ts"],"sourcesContent":["import { BrowserWindow, screen } from 'electron';\nimport { ILogger } from '@/infrastructure/logger';\nimport StateKeeper from '@/internal/utils/StateKeeper';\n\n/**\n * WindowStateManager - Manages window state persistence\n * 窗口状态管理器 - 管理窗口状态持久化\n */\nexport class WindowStateManager {\n private stateKeeper: StateKeeper;\n\n private handlers = new Map<number, () => void>();\n\n constructor(\n private logger: ILogger,\n stateKeeper?: StateKeeper\n ) {\n this.stateKeeper = stateKeeper || new StateKeeper({ logger: this.logger });\n }\n\n /**\n * Register window state persistence listeners\n * 注册窗口状态持久化监听器\n * @param name - Window name (窗口名称)\n * @param window - BrowserWindow instance (BrowserWindow 实例)\n * @param getGroups - Optional callback to get current groups (可选回调获取当前组)\n */\n manage(name: string, window: BrowserWindow, getGroups?: () => string[]): void {\n // Prevent duplicate management\n this.unmanage(window.id);\n\n const saveState = () => {\n if (window.isDestroyed()) return;\n\n try {\n const bounds = window.getBounds();\n const isMaximized = window.isMaximized();\n const isFullScreen = window.isFullScreen();\n const display = screen.getDisplayMatching(bounds);\n const groups = getGroups ? getGroups() : undefined;\n\n this.stateKeeper.saveState(name, {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n isMaximized,\n isFullScreen,\n displayBounds: display.bounds,\n groups,\n });\n } catch (error) {\n this.logger.warn(`Failed to save state for window ${name}: ${error}`);\n }\n };\n\n // Remove double debounce: StateKeeper already handles debounce/throttle\n // 移除双重防抖:StateKeeper 已经处理了防抖/节流\n window.on('resize', saveState);\n window.on('move', saveState);\n window.on('close', saveState);\n window.on('maximize', saveState);\n window.on('unmaximize', saveState);\n window.on('enter-full-screen', saveState);\n window.on('leave-full-screen', saveState);\n\n // Register cleanup handler\n const cleaner = () => {\n if (!window.isDestroyed()) {\n window.removeListener('resize', saveState);\n window.removeListener('move', saveState);\n window.removeListener('close', saveState);\n window.removeListener('maximize', saveState);\n window.removeListener('unmaximize', saveState);\n window.removeListener('enter-full-screen', saveState);\n window.removeListener('leave-full-screen', saveState);\n }\n };\n this.handlers.set(window.id, cleaner);\n\n // Auto cleanup on close\n // 注意:'closed' 事件触发时窗口已被销毁,无法 removeListener,但我们需要从 map 中移除 cleaner\n window.once('closed', () => {\n this.handlers.delete(window.id);\n });\n }\n\n /**\n * Stop managing window state\n * 停止管理窗口状态\n */\n unmanage(windowId: number): void {\n const cleaner = this.handlers.get(windowId);\n if (cleaner) {\n cleaner();\n this.handlers.delete(windowId);\n }\n }\n\n /**\n * Dispose manager and release resources\n * 释放管理器及资源\n */\n public dispose(): void {\n // Cleanup all handlers\n this.handlers.forEach((cleaner) => cleaner());\n this.handlers.clear();\n\n // Dispose state keeper\n if (this.stateKeeper && typeof this.stateKeeper.dispose === 'function') {\n this.stateKeeper.dispose();\n }\n }\n /**\n * Get saved window state\n * 获取保存的窗口状态\n * @param name - Window name (窗口名称)\n * @param defaultWidth - Default width (默认宽度)\n * @param defaultHeight - Default height (默认高度)\n * @returns Saved state or default state (保存的状态或默认状态)\n */\n getState(name: string, defaultWidth?: number, defaultHeight?: number) {\n return this.stateKeeper.getWindowState(name, defaultWidth, defaultHeight);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { default as WindowStore } from './WindowStore';
2
+ export { default as WindowManager } from './WindowManager';
3
+ export { default as WindowCreator } from './WindowCreator';
4
+ export * from './IpcSetup';
5
+ export * from './window-manager.type';
6
+ export * from '../error/WindowError';
7
+ export { validateWindowManagerConfig } from './window-manager.schema';
@@ -0,0 +1 @@
1
+ 'use strict';var WindowStore=require('./WindowStore.js'),WindowManager=require('./WindowManager.js'),WindowCreator=require('./WindowCreator.js'),IpcSetup=require('./IpcSetup.js'),WindowError=require('../error/WindowError.js'),windowManager_schema=require('./window-manager.schema.js');exports.WindowStore=WindowStore;exports.WindowManager=WindowManager;exports.WindowCreator=WindowCreator;exports.IpcSetup=IpcSetup.IpcSetup;exports.WindowError=WindowError.WindowError;Object.defineProperty(exports,"WindowErrorCode",{enumerable:true,get:function(){return WindowError.WindowErrorCode}});exports.validateWindowManagerConfig=windowManager_schema.validateWindowManagerConfig;//# sourceMappingURL=index.js.map