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,150 @@
1
+ import {app}from'electron';import WindowCreator from'../WindowCreator.mjs';import {PerformanceMonitor}from'../../../infrastructure/debug/PerformanceMonitor.mjs';const IS_DEV = !app.isPackaged;
2
+ class WindowLifecycle {
3
+ wm;
4
+ pluginExecutor;
5
+ metrics;
6
+ logger;
7
+ constructor(wm, pluginExecutor, metrics, logger) {
8
+ this.wm = wm;
9
+ this.pluginExecutor = pluginExecutor;
10
+ this.metrics = metrics;
11
+ this.logger = logger;
12
+ }
13
+ async create(config = {}) {
14
+ const startTime = Date.now();
15
+ const perf = PerformanceMonitor.getInstance();
16
+ const measureId = `create-window-${Date.now()}`;
17
+ perf.startMeasure(measureId, 'Window Creation', { name: config.name });
18
+ // Run onWillCreate hooks via PluginExecutor
19
+ const hookResult = this.pluginExecutor.onWillCreate(config);
20
+ if (hookResult === false)
21
+ return '';
22
+ config = hookResult;
23
+ // Initialize config from creation parameters
24
+ if (config.defaultConfig) {
25
+ this.wm.config.defaultConfig = config.defaultConfig;
26
+ }
27
+ // Use module-level constant IS_DEV to lock environment state
28
+ this.wm.config.isDevelopment = config.isDevelopment ?? IS_DEV;
29
+ this.logger.info(`Current Environment / 当前环境: ${JSON.stringify({
30
+ appIsPackaged: app.isPackaged,
31
+ cachedIsDev: IS_DEV,
32
+ finalConfigIsDev: this.wm.config.isDevelopment,
33
+ }, null, 2)}`);
34
+ // Prepare API for WindowCreator
35
+ const api = {
36
+ window: {
37
+ hasById: (id) => this.wm.windowStore.hasById(id),
38
+ isDestroyed: (id) => this.wm.windowStore.isDestroyed(id),
39
+ deleteByName: (name) => {
40
+ const id = this.wm.windowStore.getWindowByNameId(name);
41
+ if (id) {
42
+ this.removeWindow(id); // Call this.removeWindow to trigger hooks
43
+ return true;
44
+ }
45
+ return false;
46
+ },
47
+ deleteById: (id) => {
48
+ if (this.wm.windowStore.hasById(id)) {
49
+ this.removeWindow(id); // Call this.removeWindow to trigger hooks
50
+ return true;
51
+ }
52
+ return false;
53
+ },
54
+ getTargetWindow: (id) => this.wm.windowStore.getTargetWindow(id),
55
+ removeWindow: (id) => this.removeWindow(id), // Call this.removeWindow to trigger hooks
56
+ show: (window, id) => this.wm.windowStore.show(window, id),
57
+ },
58
+ };
59
+ // Resolve window ID if name is provided
60
+ const resolvedWindowId = config.windowId ||
61
+ (config.name ? this.wm.windowStore.getWindowByNameId(config.name) : undefined);
62
+ if (config.windowId) {
63
+ this.wm.validateWindowId(config.windowId, 'create');
64
+ }
65
+ // Handle state persistence restoration
66
+ let finalConfig = { ...config };
67
+ const shouldPersist = config.enablePersistence ?? this.wm.windowStore.persistenceEnabled;
68
+ if (shouldPersist && config.name) {
69
+ const savedState = this.wm.windowStore.getWindowState(config.name, config.width, config.height);
70
+ if (savedState) {
71
+ finalConfig = {
72
+ ...finalConfig,
73
+ x: savedState.x,
74
+ y: savedState.y,
75
+ width: savedState.width,
76
+ height: savedState.height,
77
+ fullscreen: savedState.isFullScreen || config.fullscreen,
78
+ };
79
+ }
80
+ }
81
+ const operator = new WindowCreator(api, {
82
+ data: { ...finalConfig, winId: resolvedWindowId },
83
+ contentLoader: this.wm.config.contentLoader,
84
+ }, async (options) => {
85
+ // Call public/accessible method on wm
86
+ const newWindow = this.wm.createBrowserWindow(options);
87
+ // Restore maximized state
88
+ if (shouldPersist && config.name) {
89
+ const savedState = this.wm.windowStore.getWindowState(config.name);
90
+ if (savedState?.isMaximized && !newWindow.isFullScreen()) {
91
+ newWindow.maximize();
92
+ }
93
+ }
94
+ const windowId = this.wm.windowStore.createWindow(newWindow, options);
95
+ this.wm.configureWindowBehavior(newWindow, windowId);
96
+ // Restore groups if any
97
+ if (options.name) {
98
+ const savedState = this.wm.windowStore.getWindowState(options.name);
99
+ if (savedState && savedState.groups && Array.isArray(savedState.groups)) {
100
+ savedState.groups.forEach((group) => {
101
+ this.wm.windowStore.joinGroup(windowId, group);
102
+ });
103
+ }
104
+ // Register state management (auto-save)
105
+ // Access private method? No, registerStateManagement is private.
106
+ // I should move registerStateManagement to WindowLifecycle or make it public.
107
+ // I'll make it public or move it.
108
+ // Moving it here is better.
109
+ this.registerStateManagement(options.name, newWindow);
110
+ }
111
+ // Run onDidCreate hooks
112
+ const details = { window: newWindow, id: windowId, name: options.data.name || '' };
113
+ await this.pluginExecutor.onDidCreate(details);
114
+ this.wm.emit('window-created', details);
115
+ return windowId;
116
+ }, undefined, this.logger);
117
+ const windowId = await operator.createAndShow();
118
+ // Record metrics
119
+ const duration = Date.now() - startTime;
120
+ this.metrics.recordCreation(duration);
121
+ if (duration > 2000) {
122
+ this.logger.warn(`Slow window creation detected: ${windowId} took ${duration}ms`);
123
+ }
124
+ perf.endMeasure(measureId, { windowId });
125
+ return windowId;
126
+ }
127
+ async removeWindow(windowId) {
128
+ const perf = PerformanceMonitor.getInstance();
129
+ const measureId = `destroy-window-${windowId}`;
130
+ perf.startMeasure(measureId, 'Window Destruction', { windowId });
131
+ this.wm.validateWindowId(windowId, 'removeWindow');
132
+ // 1. onWillDestroy Hooks
133
+ await this.pluginExecutor.onWillDestroy(windowId);
134
+ // 2. Notify MessageBus cleanup
135
+ this.wm.emit('window-will-be-destroyed', windowId);
136
+ // 3. Actual removal
137
+ this.wm.windowStore.removeWindow(windowId);
138
+ // Track destroyed count
139
+ this.metrics.recordDestruction();
140
+ // 4. onDidDestroy Hooks
141
+ await this.pluginExecutor.onDidDestroy(windowId);
142
+ this.wm.emit('window-destroyed', windowId);
143
+ perf.endMeasure(measureId, { windowId });
144
+ }
145
+ registerStateManagement(name, window) {
146
+ if (this.wm.windowStore.persistenceEnabled) {
147
+ this.wm.windowStore.manageState(name, window, () => this.wm.windowStore.getWindowGroups(window.id.toString()));
148
+ }
149
+ }
150
+ }export{WindowLifecycle};//# sourceMappingURL=WindowLifecycle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowLifecycle.mjs","sources":["../../../../src/core/window/core/WindowLifecycle.ts"],"sourcesContent":["import { BrowserWindow, app } from 'electron';\nimport { PerformanceMonitor } from '@/infrastructure/debug';\nimport WindowCreator from '../WindowCreator';\nimport type WindowManager from '../WindowManager';\nimport { WindowManagerApi, WindowCreationOptions } from '../window-manager.type';\nimport { PluginExecutor } from './PluginExecutor';\nimport { MetricsManager } from './MetricsManager';\nimport { ILogger } from '@/infrastructure/logger';\n\nconst IS_DEV = !app.isPackaged;\n\nexport class WindowLifecycle {\n constructor(\n private wm: WindowManager,\n private pluginExecutor: PluginExecutor,\n private metrics: MetricsManager,\n private logger: ILogger\n ) {}\n\n public async create(config: WindowCreationOptions = {}): Promise<string> {\n const startTime = Date.now();\n const perf = PerformanceMonitor.getInstance();\n const measureId = `create-window-${Date.now()}`;\n perf.startMeasure(measureId, 'Window Creation', { name: config.name });\n\n // Run onWillCreate hooks via PluginExecutor\n const hookResult = this.pluginExecutor.onWillCreate(config);\n if (hookResult === false) return '';\n config = hookResult;\n\n // Initialize config from creation parameters\n if (config.defaultConfig) {\n this.wm.config.defaultConfig = config.defaultConfig;\n }\n\n // Use module-level constant IS_DEV to lock environment state\n this.wm.config.isDevelopment = config.isDevelopment ?? IS_DEV;\n\n this.logger.info(\n `Current Environment / 当前环境: ${JSON.stringify(\n {\n appIsPackaged: app.isPackaged,\n cachedIsDev: IS_DEV,\n finalConfigIsDev: this.wm.config.isDevelopment,\n },\n null,\n 2\n )}`\n );\n\n // Prepare API for WindowCreator\n const api: WindowManagerApi = {\n window: {\n hasById: (id: string) => this.wm.windowStore.hasById(id),\n isDestroyed: (id: string) => this.wm.windowStore.isDestroyed(id),\n deleteByName: (name: string) => {\n const id = this.wm.windowStore.getWindowByNameId(name);\n if (id) {\n this.removeWindow(id); // Call this.removeWindow to trigger hooks\n return true;\n }\n return false;\n },\n deleteById: (id: string) => {\n if (this.wm.windowStore.hasById(id)) {\n this.removeWindow(id); // Call this.removeWindow to trigger hooks\n return true;\n }\n return false;\n },\n getTargetWindow: (id: string) => this.wm.windowStore.getTargetWindow(id),\n removeWindow: (id: string) => this.removeWindow(id), // Call this.removeWindow to trigger hooks\n show: (window: BrowserWindow, id: string) => this.wm.windowStore.show(window, id),\n },\n };\n\n // Resolve window ID if name is provided\n const resolvedWindowId =\n config.windowId ||\n (config.name ? this.wm.windowStore.getWindowByNameId(config.name) : undefined);\n\n if (config.windowId) {\n this.wm.validateWindowId(config.windowId, 'create');\n }\n\n // Handle state persistence restoration\n let finalConfig = { ...config };\n const shouldPersist = config.enablePersistence ?? this.wm.windowStore.persistenceEnabled;\n\n if (shouldPersist && config.name) {\n const savedState = this.wm.windowStore.getWindowState(\n config.name,\n config.width,\n config.height\n );\n if (savedState) {\n finalConfig = {\n ...finalConfig,\n x: savedState.x,\n y: savedState.y,\n width: savedState.width,\n height: savedState.height,\n fullscreen: savedState.isFullScreen || config.fullscreen,\n };\n }\n }\n\n const operator = new WindowCreator(\n api,\n {\n data: { ...finalConfig, winId: resolvedWindowId },\n contentLoader: this.wm.config.contentLoader,\n },\n async (options) => {\n // Call public/accessible method on wm\n const newWindow = this.wm.createBrowserWindow(options);\n\n // Restore maximized state\n if (shouldPersist && config.name) {\n const savedState = this.wm.windowStore.getWindowState(config.name);\n if (savedState?.isMaximized && !newWindow.isFullScreen()) {\n newWindow.maximize();\n }\n }\n\n const windowId = this.wm.windowStore.createWindow(newWindow, options);\n this.wm.configureWindowBehavior(newWindow, windowId);\n\n // Restore groups if any\n if (options.name) {\n const savedState = this.wm.windowStore.getWindowState(options.name);\n if (savedState && savedState.groups && Array.isArray(savedState.groups)) {\n savedState.groups.forEach((group: string) => {\n this.wm.windowStore.joinGroup(windowId, group);\n });\n }\n\n // Register state management (auto-save)\n // Access private method? No, registerStateManagement is private.\n // I should move registerStateManagement to WindowLifecycle or make it public.\n // I'll make it public or move it.\n // Moving it here is better.\n this.registerStateManagement(options.name, newWindow);\n }\n\n // Run onDidCreate hooks\n const details = { window: newWindow, id: windowId, name: options.data.name || '' };\n await this.pluginExecutor.onDidCreate(details);\n\n this.wm.emit('window-created', details);\n\n return windowId;\n },\n undefined,\n this.logger\n );\n\n const windowId = await operator.createAndShow();\n\n // Record metrics\n const duration = Date.now() - startTime;\n this.metrics.recordCreation(duration);\n\n if (duration > 2000) {\n this.logger.warn(`Slow window creation detected: ${windowId} took ${duration}ms`);\n }\n\n perf.endMeasure(measureId, { windowId });\n\n return windowId;\n }\n\n public async removeWindow(windowId: string): Promise<void> {\n const perf = PerformanceMonitor.getInstance();\n const measureId = `destroy-window-${windowId}`;\n perf.startMeasure(measureId, 'Window Destruction', { windowId });\n\n this.wm.validateWindowId(windowId, 'removeWindow');\n\n // 1. onWillDestroy Hooks\n await this.pluginExecutor.onWillDestroy(windowId);\n\n // 2. Notify MessageBus cleanup\n this.wm.emit('window-will-be-destroyed', windowId);\n\n // 3. Actual removal\n this.wm.windowStore.removeWindow(windowId);\n\n // Track destroyed count\n this.metrics.recordDestruction();\n\n // 4. onDidDestroy Hooks\n await this.pluginExecutor.onDidDestroy(windowId);\n\n this.wm.emit('window-destroyed', windowId);\n\n perf.endMeasure(measureId, { windowId });\n }\n\n private registerStateManagement(name: string, window: BrowserWindow): void {\n if (this.wm.windowStore.persistenceEnabled) {\n this.wm.windowStore.manageState(name, window, () =>\n this.wm.windowStore.getWindowGroups(window.id.toString())\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { BrowserWindow } from 'electron';
2
+ import { ILogger } from '@/infrastructure/logger';
3
+ /**
4
+ * WindowOperator - Encapsulates window operations
5
+ * 窗口操作员 - 封装窗口操作
6
+ */
7
+ export declare class WindowOperator {
8
+ private logger;
9
+ constructor(logger: ILogger);
10
+ /**
11
+ * Check if window is safe to operate on
12
+ * 检查窗口是否可以安全操作
13
+ */
14
+ isSafe(window?: BrowserWindow | null): window is BrowserWindow;
15
+ /**
16
+ * Show window
17
+ * 显示窗口
18
+ */
19
+ show(window: BrowserWindow): void;
20
+ /**
21
+ * Hide window
22
+ * 隐藏窗口
23
+ */
24
+ hide(window: BrowserWindow): void;
25
+ /**
26
+ * Minimize window
27
+ * 最小化窗口
28
+ */
29
+ minimize(window: BrowserWindow): void;
30
+ /**
31
+ * Restore window
32
+ * 恢复窗口
33
+ */
34
+ restore(window: BrowserWindow): void;
35
+ /**
36
+ * Maximize window
37
+ * 最大化窗口
38
+ */
39
+ maximize(window: BrowserWindow): void;
40
+ /**
41
+ * Unmaximize window
42
+ * 取消最大化窗口
43
+ */
44
+ unmaximize(window: BrowserWindow): void;
45
+ /**
46
+ * Toggle full screen
47
+ * 切换全屏
48
+ */
49
+ toggleFullScreen(window: BrowserWindow): void;
50
+ /**
51
+ * Focus window
52
+ * 聚焦窗口
53
+ */
54
+ focus(window: BrowserWindow): void;
55
+ /**
56
+ * Close window
57
+ * 关闭窗口
58
+ */
59
+ close(window: BrowserWindow): void;
60
+ /**
61
+ * Destroy window (Force close)
62
+ * 销毁窗口(强制关闭)
63
+ */
64
+ destroy(window?: BrowserWindow | null): void;
65
+ /**
66
+ * Open DevTools
67
+ * 打开开发者工具
68
+ */
69
+ openDevTools(window: BrowserWindow): void;
70
+ /**
71
+ * Close DevTools
72
+ * 关闭开发者工具
73
+ */
74
+ closeDevTools(window: BrowserWindow): void;
75
+ /**
76
+ * Check if DevTools is opened
77
+ * 检查开发者工具是否已打开
78
+ */
79
+ isDevToolsOpened(window: BrowserWindow): boolean;
80
+ /**
81
+ * Send message to window
82
+ * 发送消息给窗口
83
+ */
84
+ send(window: BrowserWindow, channel: string, data: unknown): void;
85
+ /**
86
+ * Set skip taskbar
87
+ * 设置是否在任务栏隐藏
88
+ */
89
+ setSkipTaskbar(window: BrowserWindow, skip: boolean): void;
90
+ }
@@ -0,0 +1,154 @@
1
+ 'use strict';/**
2
+ * WindowOperator - Encapsulates window operations
3
+ * 窗口操作员 - 封装窗口操作
4
+ */
5
+ class WindowOperator {
6
+ logger;
7
+ constructor(logger) {
8
+ this.logger = logger;
9
+ }
10
+ /**
11
+ * Check if window is safe to operate on
12
+ * 检查窗口是否可以安全操作
13
+ */
14
+ isSafe(window) {
15
+ return !!window && !window.isDestroyed();
16
+ }
17
+ /**
18
+ * Show window
19
+ * 显示窗口
20
+ */
21
+ show(window) {
22
+ if (!this.isSafe(window))
23
+ return;
24
+ window.show();
25
+ window.setSkipTaskbar(false);
26
+ }
27
+ /**
28
+ * Hide window
29
+ * 隐藏窗口
30
+ */
31
+ hide(window) {
32
+ if (!this.isSafe(window))
33
+ return;
34
+ window.hide();
35
+ window.setSkipTaskbar(true);
36
+ }
37
+ /**
38
+ * Minimize window
39
+ * 最小化窗口
40
+ */
41
+ minimize(window) {
42
+ if (!this.isSafe(window))
43
+ return;
44
+ window.minimize();
45
+ }
46
+ /**
47
+ * Restore window
48
+ * 恢复窗口
49
+ */
50
+ restore(window) {
51
+ if (!this.isSafe(window))
52
+ return;
53
+ window.restore();
54
+ }
55
+ /**
56
+ * Maximize window
57
+ * 最大化窗口
58
+ */
59
+ maximize(window) {
60
+ if (!this.isSafe(window))
61
+ return;
62
+ window.maximize();
63
+ }
64
+ /**
65
+ * Unmaximize window
66
+ * 取消最大化窗口
67
+ */
68
+ unmaximize(window) {
69
+ if (!this.isSafe(window))
70
+ return;
71
+ window.unmaximize();
72
+ }
73
+ /**
74
+ * Toggle full screen
75
+ * 切换全屏
76
+ */
77
+ toggleFullScreen(window) {
78
+ if (!this.isSafe(window))
79
+ return;
80
+ window.setFullScreen(!window.isFullScreen());
81
+ }
82
+ /**
83
+ * Focus window
84
+ * 聚焦窗口
85
+ */
86
+ focus(window) {
87
+ if (!this.isSafe(window))
88
+ return;
89
+ window.focus();
90
+ }
91
+ /**
92
+ * Close window
93
+ * 关闭窗口
94
+ */
95
+ close(window) {
96
+ if (!this.isSafe(window))
97
+ return;
98
+ window.close();
99
+ }
100
+ /**
101
+ * Destroy window (Force close)
102
+ * 销毁窗口(强制关闭)
103
+ */
104
+ destroy(window) {
105
+ if (!this.isSafe(window))
106
+ return;
107
+ window.destroy();
108
+ }
109
+ /**
110
+ * Open DevTools
111
+ * 打开开发者工具
112
+ */
113
+ openDevTools(window) {
114
+ if (!this.isSafe(window))
115
+ return;
116
+ window.webContents.openDevTools();
117
+ }
118
+ /**
119
+ * Close DevTools
120
+ * 关闭开发者工具
121
+ */
122
+ closeDevTools(window) {
123
+ if (!this.isSafe(window))
124
+ return;
125
+ window.webContents.closeDevTools();
126
+ }
127
+ /**
128
+ * Check if DevTools is opened
129
+ * 检查开发者工具是否已打开
130
+ */
131
+ isDevToolsOpened(window) {
132
+ if (!this.isSafe(window))
133
+ return false;
134
+ return window.webContents.isDevToolsOpened();
135
+ }
136
+ /**
137
+ * Send message to window
138
+ * 发送消息给窗口
139
+ */
140
+ send(window, channel, data) {
141
+ if (!this.isSafe(window))
142
+ return;
143
+ window.webContents.send(channel, data);
144
+ }
145
+ /**
146
+ * Set skip taskbar
147
+ * 设置是否在任务栏隐藏
148
+ */
149
+ setSkipTaskbar(window, skip) {
150
+ if (!this.isSafe(window))
151
+ return;
152
+ window.setSkipTaskbar(skip);
153
+ }
154
+ }exports.WindowOperator=WindowOperator;//# sourceMappingURL=WindowOperator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowOperator.js","sources":["../../../../src/core/window/core/WindowOperator.ts"],"sourcesContent":["import { BrowserWindow } from 'electron';\nimport { ILogger } from '@/infrastructure/logger';\n\n/**\n * WindowOperator - Encapsulates window operations\n * 窗口操作员 - 封装窗口操作\n */\nexport class WindowOperator {\n constructor(private logger: ILogger) {}\n\n /**\n * Check if window is safe to operate on\n * 检查窗口是否可以安全操作\n */\n isSafe(window?: BrowserWindow | null): window is BrowserWindow {\n return !!window && !window.isDestroyed();\n }\n\n /**\n * Show window\n * 显示窗口\n */\n show(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.show();\n window.setSkipTaskbar(false);\n }\n\n /**\n * Hide window\n * 隐藏窗口\n */\n hide(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.hide();\n window.setSkipTaskbar(true);\n }\n\n /**\n * Minimize window\n * 最小化窗口\n */\n minimize(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.minimize();\n }\n\n /**\n * Restore window\n * 恢复窗口\n */\n restore(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.restore();\n }\n\n /**\n * Maximize window\n * 最大化窗口\n */\n maximize(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.maximize();\n }\n\n /**\n * Unmaximize window\n * 取消最大化窗口\n */\n unmaximize(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.unmaximize();\n }\n\n /**\n * Toggle full screen\n * 切换全屏\n */\n toggleFullScreen(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.setFullScreen(!window.isFullScreen());\n }\n\n /**\n * Focus window\n * 聚焦窗口\n */\n focus(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.focus();\n }\n\n /**\n * Close window\n * 关闭窗口\n */\n close(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.close();\n }\n\n /**\n * Destroy window (Force close)\n * 销毁窗口(强制关闭)\n */\n destroy(window?: BrowserWindow | null): void {\n if (!this.isSafe(window)) return;\n window.destroy();\n }\n\n /**\n * Open DevTools\n * 打开开发者工具\n */\n openDevTools(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.webContents.openDevTools();\n }\n\n /**\n * Close DevTools\n * 关闭开发者工具\n */\n closeDevTools(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.webContents.closeDevTools();\n }\n\n /**\n * Check if DevTools is opened\n * 检查开发者工具是否已打开\n */\n isDevToolsOpened(window: BrowserWindow): boolean {\n if (!this.isSafe(window)) return false;\n return window.webContents.isDevToolsOpened();\n }\n\n /**\n * Send message to window\n * 发送消息给窗口\n */\n send(window: BrowserWindow, channel: string, data: unknown): void {\n if (!this.isSafe(window)) return;\n window.webContents.send(channel, data);\n }\n\n /**\n * Set skip taskbar\n * 设置是否在任务栏隐藏\n */\n setSkipTaskbar(window: BrowserWindow, skip: boolean): void {\n if (!this.isSafe(window)) return;\n window.setSkipTaskbar(skip);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * WindowOperator - Encapsulates window operations
3
+ * 窗口操作员 - 封装窗口操作
4
+ */
5
+ class WindowOperator {
6
+ logger;
7
+ constructor(logger) {
8
+ this.logger = logger;
9
+ }
10
+ /**
11
+ * Check if window is safe to operate on
12
+ * 检查窗口是否可以安全操作
13
+ */
14
+ isSafe(window) {
15
+ return !!window && !window.isDestroyed();
16
+ }
17
+ /**
18
+ * Show window
19
+ * 显示窗口
20
+ */
21
+ show(window) {
22
+ if (!this.isSafe(window))
23
+ return;
24
+ window.show();
25
+ window.setSkipTaskbar(false);
26
+ }
27
+ /**
28
+ * Hide window
29
+ * 隐藏窗口
30
+ */
31
+ hide(window) {
32
+ if (!this.isSafe(window))
33
+ return;
34
+ window.hide();
35
+ window.setSkipTaskbar(true);
36
+ }
37
+ /**
38
+ * Minimize window
39
+ * 最小化窗口
40
+ */
41
+ minimize(window) {
42
+ if (!this.isSafe(window))
43
+ return;
44
+ window.minimize();
45
+ }
46
+ /**
47
+ * Restore window
48
+ * 恢复窗口
49
+ */
50
+ restore(window) {
51
+ if (!this.isSafe(window))
52
+ return;
53
+ window.restore();
54
+ }
55
+ /**
56
+ * Maximize window
57
+ * 最大化窗口
58
+ */
59
+ maximize(window) {
60
+ if (!this.isSafe(window))
61
+ return;
62
+ window.maximize();
63
+ }
64
+ /**
65
+ * Unmaximize window
66
+ * 取消最大化窗口
67
+ */
68
+ unmaximize(window) {
69
+ if (!this.isSafe(window))
70
+ return;
71
+ window.unmaximize();
72
+ }
73
+ /**
74
+ * Toggle full screen
75
+ * 切换全屏
76
+ */
77
+ toggleFullScreen(window) {
78
+ if (!this.isSafe(window))
79
+ return;
80
+ window.setFullScreen(!window.isFullScreen());
81
+ }
82
+ /**
83
+ * Focus window
84
+ * 聚焦窗口
85
+ */
86
+ focus(window) {
87
+ if (!this.isSafe(window))
88
+ return;
89
+ window.focus();
90
+ }
91
+ /**
92
+ * Close window
93
+ * 关闭窗口
94
+ */
95
+ close(window) {
96
+ if (!this.isSafe(window))
97
+ return;
98
+ window.close();
99
+ }
100
+ /**
101
+ * Destroy window (Force close)
102
+ * 销毁窗口(强制关闭)
103
+ */
104
+ destroy(window) {
105
+ if (!this.isSafe(window))
106
+ return;
107
+ window.destroy();
108
+ }
109
+ /**
110
+ * Open DevTools
111
+ * 打开开发者工具
112
+ */
113
+ openDevTools(window) {
114
+ if (!this.isSafe(window))
115
+ return;
116
+ window.webContents.openDevTools();
117
+ }
118
+ /**
119
+ * Close DevTools
120
+ * 关闭开发者工具
121
+ */
122
+ closeDevTools(window) {
123
+ if (!this.isSafe(window))
124
+ return;
125
+ window.webContents.closeDevTools();
126
+ }
127
+ /**
128
+ * Check if DevTools is opened
129
+ * 检查开发者工具是否已打开
130
+ */
131
+ isDevToolsOpened(window) {
132
+ if (!this.isSafe(window))
133
+ return false;
134
+ return window.webContents.isDevToolsOpened();
135
+ }
136
+ /**
137
+ * Send message to window
138
+ * 发送消息给窗口
139
+ */
140
+ send(window, channel, data) {
141
+ if (!this.isSafe(window))
142
+ return;
143
+ window.webContents.send(channel, data);
144
+ }
145
+ /**
146
+ * Set skip taskbar
147
+ * 设置是否在任务栏隐藏
148
+ */
149
+ setSkipTaskbar(window, skip) {
150
+ if (!this.isSafe(window))
151
+ return;
152
+ window.setSkipTaskbar(skip);
153
+ }
154
+ }export{WindowOperator};//# sourceMappingURL=WindowOperator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowOperator.mjs","sources":["../../../../src/core/window/core/WindowOperator.ts"],"sourcesContent":["import { BrowserWindow } from 'electron';\nimport { ILogger } from '@/infrastructure/logger';\n\n/**\n * WindowOperator - Encapsulates window operations\n * 窗口操作员 - 封装窗口操作\n */\nexport class WindowOperator {\n constructor(private logger: ILogger) {}\n\n /**\n * Check if window is safe to operate on\n * 检查窗口是否可以安全操作\n */\n isSafe(window?: BrowserWindow | null): window is BrowserWindow {\n return !!window && !window.isDestroyed();\n }\n\n /**\n * Show window\n * 显示窗口\n */\n show(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.show();\n window.setSkipTaskbar(false);\n }\n\n /**\n * Hide window\n * 隐藏窗口\n */\n hide(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.hide();\n window.setSkipTaskbar(true);\n }\n\n /**\n * Minimize window\n * 最小化窗口\n */\n minimize(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.minimize();\n }\n\n /**\n * Restore window\n * 恢复窗口\n */\n restore(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.restore();\n }\n\n /**\n * Maximize window\n * 最大化窗口\n */\n maximize(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.maximize();\n }\n\n /**\n * Unmaximize window\n * 取消最大化窗口\n */\n unmaximize(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.unmaximize();\n }\n\n /**\n * Toggle full screen\n * 切换全屏\n */\n toggleFullScreen(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.setFullScreen(!window.isFullScreen());\n }\n\n /**\n * Focus window\n * 聚焦窗口\n */\n focus(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.focus();\n }\n\n /**\n * Close window\n * 关闭窗口\n */\n close(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.close();\n }\n\n /**\n * Destroy window (Force close)\n * 销毁窗口(强制关闭)\n */\n destroy(window?: BrowserWindow | null): void {\n if (!this.isSafe(window)) return;\n window.destroy();\n }\n\n /**\n * Open DevTools\n * 打开开发者工具\n */\n openDevTools(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.webContents.openDevTools();\n }\n\n /**\n * Close DevTools\n * 关闭开发者工具\n */\n closeDevTools(window: BrowserWindow): void {\n if (!this.isSafe(window)) return;\n window.webContents.closeDevTools();\n }\n\n /**\n * Check if DevTools is opened\n * 检查开发者工具是否已打开\n */\n isDevToolsOpened(window: BrowserWindow): boolean {\n if (!this.isSafe(window)) return false;\n return window.webContents.isDevToolsOpened();\n }\n\n /**\n * Send message to window\n * 发送消息给窗口\n */\n send(window: BrowserWindow, channel: string, data: unknown): void {\n if (!this.isSafe(window)) return;\n window.webContents.send(channel, data);\n }\n\n /**\n * Set skip taskbar\n * 设置是否在任务栏隐藏\n */\n setSkipTaskbar(window: BrowserWindow, skip: boolean): void {\n if (!this.isSafe(window)) return;\n window.setSkipTaskbar(skip);\n }\n}\n"],"names":[],"mappings":"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"}