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.
- package/LICENSE +21 -0
- package/README.md +302 -0
- package/README.zh-CN.md +308 -0
- package/dist/core/error/WindowError.d.ts +56 -0
- package/dist/core/error/WindowError.js +71 -0
- package/dist/core/error/WindowError.js.map +1 -0
- package/dist/core/error/WindowError.mjs +71 -0
- package/dist/core/error/WindowError.mjs.map +1 -0
- package/dist/core/ipc/IpcHandler.d.ts +48 -0
- package/dist/core/ipc/IpcHandler.js +59 -0
- package/dist/core/ipc/IpcHandler.js.map +1 -0
- package/dist/core/ipc/IpcHandler.mjs +59 -0
- package/dist/core/ipc/IpcHandler.mjs.map +1 -0
- package/dist/core/ipc/IpcRouter.d.ts +70 -0
- package/dist/core/ipc/IpcRouter.js +143 -0
- package/dist/core/ipc/IpcRouter.js.map +1 -0
- package/dist/core/ipc/IpcRouter.mjs +143 -0
- package/dist/core/ipc/IpcRouter.mjs.map +1 -0
- package/dist/core/ipc/index.d.ts +3 -0
- package/dist/core/ipc/index.js +1 -0
- package/dist/core/ipc/index.js.map +1 -0
- package/dist/core/ipc/index.mjs +1 -0
- package/dist/core/ipc/index.mjs.map +1 -0
- package/dist/core/ipc/ipc-router.type.d.ts +73 -0
- package/dist/core/ipc/transport/index.d.ts +65 -0
- package/dist/core/ipc/transport/index.js +229 -0
- package/dist/core/ipc/transport/index.js.map +1 -0
- package/dist/core/ipc/transport/index.mjs +229 -0
- package/dist/core/ipc/transport/index.mjs.map +1 -0
- package/dist/core/ipc/transport/ipc.type.d.ts +36 -0
- package/dist/core/lifecycle/LifecycleManager.d.ts +66 -0
- package/dist/core/lifecycle/LifecycleManager.js +140 -0
- package/dist/core/lifecycle/LifecycleManager.js.map +1 -0
- package/dist/core/lifecycle/LifecycleManager.mjs +140 -0
- package/dist/core/lifecycle/LifecycleManager.mjs.map +1 -0
- package/dist/core/message-bus/MessageBus.d.ts +282 -0
- package/dist/core/message-bus/MessageBus.js +677 -0
- package/dist/core/message-bus/MessageBus.js.map +1 -0
- package/dist/core/message-bus/MessageBus.mjs +677 -0
- package/dist/core/message-bus/MessageBus.mjs.map +1 -0
- package/dist/core/message-bus/MessageBusClient.d.ts +100 -0
- package/dist/core/message-bus/MessageBusClient.js +280 -0
- package/dist/core/message-bus/MessageBusClient.js.map +1 -0
- package/dist/core/message-bus/MessageBusClient.mjs +280 -0
- package/dist/core/message-bus/MessageBusClient.mjs.map +1 -0
- package/dist/core/message-bus/core/DataStoreManager.d.ts +51 -0
- package/dist/core/message-bus/core/DataStoreManager.js +94 -0
- package/dist/core/message-bus/core/DataStoreManager.js.map +1 -0
- package/dist/core/message-bus/core/DataStoreManager.mjs +94 -0
- package/dist/core/message-bus/core/DataStoreManager.mjs.map +1 -0
- package/dist/core/message-bus/core/ManagedPort.d.ts +26 -0
- package/dist/core/message-bus/core/ManagedPort.js +55 -0
- package/dist/core/message-bus/core/ManagedPort.js.map +1 -0
- package/dist/core/message-bus/core/ManagedPort.mjs +55 -0
- package/dist/core/message-bus/core/ManagedPort.mjs.map +1 -0
- package/dist/core/message-bus/core/PortManager.d.ts +47 -0
- package/dist/core/message-bus/core/PortManager.js +114 -0
- package/dist/core/message-bus/core/PortManager.js.map +1 -0
- package/dist/core/message-bus/core/PortManager.mjs +114 -0
- package/dist/core/message-bus/core/PortManager.mjs.map +1 -0
- package/dist/core/message-bus/core/SubscriptionManager.d.ts +36 -0
- package/dist/core/message-bus/core/SubscriptionManager.js +78 -0
- package/dist/core/message-bus/core/SubscriptionManager.js.map +1 -0
- package/dist/core/message-bus/core/SubscriptionManager.mjs +78 -0
- package/dist/core/message-bus/core/SubscriptionManager.mjs.map +1 -0
- package/dist/core/message-bus/core/TransactionManager.d.ts +54 -0
- package/dist/core/message-bus/core/TransactionManager.js +95 -0
- package/dist/core/message-bus/core/TransactionManager.js.map +1 -0
- package/dist/core/message-bus/core/TransactionManager.mjs +95 -0
- package/dist/core/message-bus/core/TransactionManager.mjs.map +1 -0
- package/dist/core/message-bus/core/index.d.ts +5 -0
- package/dist/core/message-bus/index.d.ts +4 -0
- package/dist/core/message-bus/index.js +1 -0
- package/dist/core/message-bus/index.js.map +1 -0
- package/dist/core/message-bus/index.mjs +1 -0
- package/dist/core/message-bus/index.mjs.map +1 -0
- package/dist/core/message-bus/message-bus.type.d.ts +143 -0
- package/dist/core/message-bus/message-bus.type.js +26 -0
- package/dist/core/message-bus/message-bus.type.js.map +1 -0
- package/dist/core/message-bus/message-bus.type.mjs +26 -0
- package/dist/core/message-bus/message-bus.type.mjs.map +1 -0
- package/dist/core/message-bus/preload.d.ts +16 -0
- package/dist/core/message-bus/preload.js +27 -0
- package/dist/core/message-bus/preload.js.map +1 -0
- package/dist/core/message-bus/preload.mjs +27 -0
- package/dist/core/message-bus/preload.mjs.map +1 -0
- package/dist/core/message-bus/transport/ITransport.d.ts +40 -0
- package/dist/core/message-bus/transport/IpcTransport.d.ts +18 -0
- package/dist/core/message-bus/transport/IpcTransport.js +60 -0
- package/dist/core/message-bus/transport/IpcTransport.js.map +1 -0
- package/dist/core/message-bus/transport/IpcTransport.mjs +60 -0
- package/dist/core/message-bus/transport/IpcTransport.mjs.map +1 -0
- package/dist/core/message-bus/transport/MessagePortTransport.d.ts +15 -0
- package/dist/core/message-bus/transport/MessagePortTransport.js +35 -0
- package/dist/core/message-bus/transport/MessagePortTransport.js.map +1 -0
- package/dist/core/message-bus/transport/MessagePortTransport.mjs +35 -0
- package/dist/core/message-bus/transport/MessagePortTransport.mjs.map +1 -0
- package/dist/core/message-bus/transport/index.d.ts +3 -0
- package/dist/core/window/IpcSetup.d.ts +50 -0
- package/dist/core/window/IpcSetup.js +96 -0
- package/dist/core/window/IpcSetup.js.map +1 -0
- package/dist/core/window/IpcSetup.mjs +96 -0
- package/dist/core/window/IpcSetup.mjs.map +1 -0
- package/dist/core/window/WindowCreator.d.ts +66 -0
- package/dist/core/window/WindowCreator.js +168 -0
- package/dist/core/window/WindowCreator.js.map +1 -0
- package/dist/core/window/WindowCreator.mjs +168 -0
- package/dist/core/window/WindowCreator.mjs.map +1 -0
- package/dist/core/window/WindowManager.d.ts +214 -0
- package/dist/core/window/WindowManager.js +583 -0
- package/dist/core/window/WindowManager.js.map +1 -0
- package/dist/core/window/WindowManager.mjs +583 -0
- package/dist/core/window/WindowManager.mjs.map +1 -0
- package/dist/core/window/WindowStore.d.ts +136 -0
- package/dist/core/window/WindowStore.js +436 -0
- package/dist/core/window/WindowStore.js.map +1 -0
- package/dist/core/window/WindowStore.mjs +436 -0
- package/dist/core/window/WindowStore.mjs.map +1 -0
- package/dist/core/window/constants.d.ts +17 -0
- package/dist/core/window/constants.js +15 -0
- package/dist/core/window/constants.js.map +1 -0
- package/dist/core/window/constants.mjs +15 -0
- package/dist/core/window/constants.mjs.map +1 -0
- package/dist/core/window/core/MetricsManager.d.ts +14 -0
- package/dist/core/window/core/MetricsManager.js +27 -0
- package/dist/core/window/core/MetricsManager.js.map +1 -0
- package/dist/core/window/core/MetricsManager.mjs +27 -0
- package/dist/core/window/core/MetricsManager.mjs.map +1 -0
- package/dist/core/window/core/PluginExecutor.d.ts +22 -0
- package/dist/core/window/core/PluginExecutor.js +110 -0
- package/dist/core/window/core/PluginExecutor.js.map +1 -0
- package/dist/core/window/core/PluginExecutor.mjs +110 -0
- package/dist/core/window/core/PluginExecutor.mjs.map +1 -0
- package/dist/core/window/core/WindowContextManager.d.ts +26 -0
- package/dist/core/window/core/WindowContextManager.js +59 -0
- package/dist/core/window/core/WindowContextManager.js.map +1 -0
- package/dist/core/window/core/WindowContextManager.mjs +59 -0
- package/dist/core/window/core/WindowContextManager.mjs.map +1 -0
- package/dist/core/window/core/WindowLifecycle.d.ts +15 -0
- package/dist/core/window/core/WindowLifecycle.js +150 -0
- package/dist/core/window/core/WindowLifecycle.js.map +1 -0
- package/dist/core/window/core/WindowLifecycle.mjs +150 -0
- package/dist/core/window/core/WindowLifecycle.mjs.map +1 -0
- package/dist/core/window/core/WindowOperator.d.ts +90 -0
- package/dist/core/window/core/WindowOperator.js +154 -0
- package/dist/core/window/core/WindowOperator.js.map +1 -0
- package/dist/core/window/core/WindowOperator.mjs +154 -0
- package/dist/core/window/core/WindowOperator.mjs.map +1 -0
- package/dist/core/window/core/WindowRegistry.d.ts +168 -0
- package/dist/core/window/core/WindowRegistry.js +331 -0
- package/dist/core/window/core/WindowRegistry.js.map +1 -0
- package/dist/core/window/core/WindowRegistry.mjs +331 -0
- package/dist/core/window/core/WindowRegistry.mjs.map +1 -0
- package/dist/core/window/core/WindowStateManager.d.ts +40 -0
- package/dist/core/window/core/WindowStateManager.js +110 -0
- package/dist/core/window/core/WindowStateManager.js.map +1 -0
- package/dist/core/window/core/WindowStateManager.mjs +110 -0
- package/dist/core/window/core/WindowStateManager.mjs.map +1 -0
- package/dist/core/window/index.d.ts +7 -0
- package/dist/core/window/index.js +1 -0
- package/dist/core/window/index.js.map +1 -0
- package/dist/core/window/index.mjs +1 -0
- package/dist/core/window/index.mjs.map +1 -0
- package/dist/core/window/window-manager.schema.d.ts +50 -0
- package/dist/core/window/window-manager.schema.js +87 -0
- package/dist/core/window/window-manager.schema.js.map +1 -0
- package/dist/core/window/window-manager.schema.mjs +87 -0
- package/dist/core/window/window-manager.schema.mjs.map +1 -0
- package/dist/core/window/window-manager.type.d.ts +365 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +33 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.umd.js +1 -0
- package/dist/infrastructure/config/ConfigManager.d.ts +133 -0
- package/dist/infrastructure/config/ConfigManager.js +218 -0
- package/dist/infrastructure/config/ConfigManager.js.map +1 -0
- package/dist/infrastructure/config/ConfigManager.mjs +218 -0
- package/dist/infrastructure/config/ConfigManager.mjs.map +1 -0
- package/dist/infrastructure/config/index.d.ts +1 -0
- package/dist/infrastructure/debug/EnhancedDebugHelper.d.ts +106 -0
- package/dist/infrastructure/debug/EnhancedDebugHelper.js +218 -0
- package/dist/infrastructure/debug/EnhancedDebugHelper.js.map +1 -0
- package/dist/infrastructure/debug/EnhancedDebugHelper.mjs +218 -0
- package/dist/infrastructure/debug/EnhancedDebugHelper.mjs.map +1 -0
- package/dist/infrastructure/debug/PerformanceMonitor.d.ts +45 -0
- package/dist/infrastructure/debug/PerformanceMonitor.js +67 -0
- package/dist/infrastructure/debug/PerformanceMonitor.js.map +1 -0
- package/dist/infrastructure/debug/PerformanceMonitor.mjs +67 -0
- package/dist/infrastructure/debug/PerformanceMonitor.mjs.map +1 -0
- package/dist/infrastructure/debug/index.d.ts +22 -0
- package/dist/infrastructure/debug/index.js +47 -0
- package/dist/infrastructure/debug/index.js.map +1 -0
- package/dist/infrastructure/debug/index.mjs +47 -0
- package/dist/infrastructure/debug/index.mjs.map +1 -0
- package/dist/infrastructure/errors/ErrorCodes.d.ts +74 -0
- package/dist/infrastructure/errors/ErrorCodes.js +78 -0
- package/dist/infrastructure/errors/ErrorCodes.js.map +1 -0
- package/dist/infrastructure/errors/ErrorCodes.mjs +78 -0
- package/dist/infrastructure/errors/ErrorCodes.mjs.map +1 -0
- package/dist/infrastructure/errors/StandardError.d.ts +61 -0
- package/dist/infrastructure/errors/StandardError.js +84 -0
- package/dist/infrastructure/errors/StandardError.js.map +1 -0
- package/dist/infrastructure/errors/StandardError.mjs +84 -0
- package/dist/infrastructure/errors/StandardError.mjs.map +1 -0
- package/dist/infrastructure/errors/index.d.ts +13 -0
- package/dist/infrastructure/errors/index.js +24 -0
- package/dist/infrastructure/errors/index.js.map +1 -0
- package/dist/infrastructure/errors/index.mjs +24 -0
- package/dist/infrastructure/errors/index.mjs.map +1 -0
- package/dist/infrastructure/logger/ElectronLogger.d.ts +39 -0
- package/dist/infrastructure/logger/ElectronLogger.js +65 -0
- package/dist/infrastructure/logger/ElectronLogger.js.map +1 -0
- package/dist/infrastructure/logger/ElectronLogger.mjs +65 -0
- package/dist/infrastructure/logger/ElectronLogger.mjs.map +1 -0
- package/dist/infrastructure/logger/index.d.ts +2 -0
- package/dist/infrastructure/logger/logger.type.d.ts +8 -0
- package/dist/internal/types/BrandedTypes.d.ts +64 -0
- package/dist/internal/types/BrandedTypes.js +54 -0
- package/dist/internal/types/BrandedTypes.js.map +1 -0
- package/dist/internal/types/BrandedTypes.mjs +54 -0
- package/dist/internal/types/BrandedTypes.mjs.map +1 -0
- package/dist/internal/types/PerformanceOptions.d.ts +87 -0
- package/dist/internal/types/branded.d.ts +42 -0
- package/dist/internal/utils/MessageDispatcher.d.ts +67 -0
- package/dist/internal/utils/MessageDispatcher.js +96 -0
- package/dist/internal/utils/MessageDispatcher.js.map +1 -0
- package/dist/internal/utils/MessageDispatcher.mjs +96 -0
- package/dist/internal/utils/MessageDispatcher.mjs.map +1 -0
- package/dist/internal/utils/RateLimiter.d.ts +41 -0
- package/dist/internal/utils/RateLimiter.js +83 -0
- package/dist/internal/utils/RateLimiter.js.map +1 -0
- package/dist/internal/utils/RateLimiter.mjs +83 -0
- package/dist/internal/utils/RateLimiter.mjs.map +1 -0
- package/dist/internal/utils/StateKeeper.d.ts +125 -0
- package/dist/internal/utils/StateKeeper.js +334 -0
- package/dist/internal/utils/StateKeeper.js.map +1 -0
- package/dist/internal/utils/StateKeeper.mjs +334 -0
- package/dist/internal/utils/StateKeeper.mjs.map +1 -0
- package/dist/internal/utils/branded-helpers.d.ts +33 -0
- package/dist/internal/utils/index.d.ts +5 -0
- package/dist/preload/index.d.ts +45 -0
- package/dist/preload/index.js +91 -0
- package/dist/preload/index.js.map +1 -0
- package/dist/preload/index.mjs +91 -0
- package/dist/preload/index.mjs.map +1 -0
- package/dist/preload/preload.type.d.ts +15 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +1 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +143 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { BrowserWindow } from 'electron';
|
|
2
|
+
import { ILogger } from '@/infrastructure/logger';
|
|
3
|
+
/**
|
|
4
|
+
* WindowRegistry - Manages the mapping and storage of window instances
|
|
5
|
+
* 窗口注册表 - 管理窗口实例的映射和存储
|
|
6
|
+
*/
|
|
7
|
+
export declare class WindowRegistry {
|
|
8
|
+
private logger;
|
|
9
|
+
/**
|
|
10
|
+
* Map of window ID to BrowserWindow instance
|
|
11
|
+
* 窗口 ID 到 BrowserWindow 实例的映射
|
|
12
|
+
*/
|
|
13
|
+
private windows;
|
|
14
|
+
/**
|
|
15
|
+
* Map of window name to window ID
|
|
16
|
+
* 窗口名称到窗口 ID 的映射
|
|
17
|
+
*/
|
|
18
|
+
private windowNames;
|
|
19
|
+
/**
|
|
20
|
+
* Map of window ID to window name (Reverse index)
|
|
21
|
+
* 窗口 ID 到窗口名称的映射(反向索引)
|
|
22
|
+
*/
|
|
23
|
+
private windowIds;
|
|
24
|
+
/**
|
|
25
|
+
* Map of BrowserWindow instance to window ID
|
|
26
|
+
* BrowserWindow 实例到窗口 ID 的映射
|
|
27
|
+
*/
|
|
28
|
+
private windowInstanceIds;
|
|
29
|
+
/**
|
|
30
|
+
* The main window instance reference
|
|
31
|
+
* 主窗口实例引用
|
|
32
|
+
*/
|
|
33
|
+
private _mainWindow;
|
|
34
|
+
/**
|
|
35
|
+
* Map of group name to set of window IDs
|
|
36
|
+
* 组名到窗口 ID 集合的映射
|
|
37
|
+
*/
|
|
38
|
+
private groups;
|
|
39
|
+
/**
|
|
40
|
+
* Map of window ID to set of group names (Reverse index for cleanup)
|
|
41
|
+
* 窗口 ID 到组名集合的映射(用于清理的反向索引)
|
|
42
|
+
*/
|
|
43
|
+
private windowGroups;
|
|
44
|
+
private cleanupTimer;
|
|
45
|
+
constructor(logger: ILogger);
|
|
46
|
+
/**
|
|
47
|
+
* Registers a window
|
|
48
|
+
* 注册窗口
|
|
49
|
+
*/
|
|
50
|
+
register(id: string, name: string, window: BrowserWindow): void;
|
|
51
|
+
/**
|
|
52
|
+
* Unregisters a window
|
|
53
|
+
* 注销窗口
|
|
54
|
+
*/
|
|
55
|
+
unregister(id: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Adds a window to a group
|
|
58
|
+
* 将窗口添加到组
|
|
59
|
+
*/
|
|
60
|
+
addToGroup(id: string, group: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Removes a window from a group
|
|
63
|
+
* 将窗口从组中移除
|
|
64
|
+
*/
|
|
65
|
+
removeFromGroup(id: string, group: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Get all window IDs in a group
|
|
68
|
+
* 获取组内所有窗口 ID
|
|
69
|
+
*/
|
|
70
|
+
getGroupIds(group: string): string[];
|
|
71
|
+
/**
|
|
72
|
+
* Get all groups a window belongs to
|
|
73
|
+
* 获取窗口所属的所有组
|
|
74
|
+
*/
|
|
75
|
+
getWindowGroups(id: string): string[];
|
|
76
|
+
/**
|
|
77
|
+
* Clears all registered windows
|
|
78
|
+
* 清除所有注册的窗口
|
|
79
|
+
*/
|
|
80
|
+
clear(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Get window by ID
|
|
83
|
+
* 根据 ID 获取窗口
|
|
84
|
+
*/
|
|
85
|
+
getById(id: string): BrowserWindow | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* Get window ID by Name
|
|
88
|
+
* 根据名称获取窗口 ID
|
|
89
|
+
*/
|
|
90
|
+
getIdByName(name: string): string | undefined;
|
|
91
|
+
/**
|
|
92
|
+
* Get window by Name
|
|
93
|
+
* 根据名称获取窗口
|
|
94
|
+
*/
|
|
95
|
+
getByName(name: string): BrowserWindow | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* Get name by ID
|
|
98
|
+
* 根据 ID 获取名称
|
|
99
|
+
*/
|
|
100
|
+
getNameById(id: string): string | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* Get ID by Window instance
|
|
103
|
+
* 根据窗口实例获取 ID
|
|
104
|
+
*/
|
|
105
|
+
getIdByWindow(window: BrowserWindow): string | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Check if window exists by ID
|
|
108
|
+
* 检查指定 ID 的窗口是否存在
|
|
109
|
+
*/
|
|
110
|
+
hasId(id: string): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Check if window exists by Name
|
|
113
|
+
* 检查指定名称的窗口是否存在
|
|
114
|
+
*/
|
|
115
|
+
hasName(name: string): boolean;
|
|
116
|
+
/**
|
|
117
|
+
* Get all window IDs
|
|
118
|
+
* 获取所有窗口 ID
|
|
119
|
+
*/
|
|
120
|
+
getAllIds(): string[];
|
|
121
|
+
/**
|
|
122
|
+
* Get all windows
|
|
123
|
+
* 获取所有窗口
|
|
124
|
+
*/
|
|
125
|
+
getAllWindows(): BrowserWindow[];
|
|
126
|
+
/**
|
|
127
|
+
* Get window name map
|
|
128
|
+
* 获取窗口名称映射
|
|
129
|
+
*/
|
|
130
|
+
getNameMap(): Map<string, string>;
|
|
131
|
+
/**
|
|
132
|
+
* Get total count
|
|
133
|
+
* 获取总数
|
|
134
|
+
*/
|
|
135
|
+
getCount(): number;
|
|
136
|
+
/**
|
|
137
|
+
* Set main window
|
|
138
|
+
* 设置主窗口
|
|
139
|
+
*/
|
|
140
|
+
setMainWindow(window: BrowserWindow | null): void;
|
|
141
|
+
/**
|
|
142
|
+
* Get main window
|
|
143
|
+
* 获取主窗口
|
|
144
|
+
*/
|
|
145
|
+
getMainWindow(): BrowserWindow | null;
|
|
146
|
+
/**
|
|
147
|
+
* Update window name
|
|
148
|
+
* 更新窗口名称
|
|
149
|
+
*/
|
|
150
|
+
updateWindowName(id: string, newName: string): void;
|
|
151
|
+
/**
|
|
152
|
+
* Start periodic cleanup protection
|
|
153
|
+
* 开启定期清理防护
|
|
154
|
+
*/
|
|
155
|
+
startCleanupProtection(intervalMs?: number): void;
|
|
156
|
+
/**
|
|
157
|
+
* Stop periodic cleanup protection
|
|
158
|
+
* 停止定期清理防护
|
|
159
|
+
*/
|
|
160
|
+
stopCleanupProtection(): void;
|
|
161
|
+
/**
|
|
162
|
+
* Cleanup destroyed windows from internal maps
|
|
163
|
+
* 从内部映射中清理已销毁的窗口
|
|
164
|
+
*/
|
|
165
|
+
private cleanupDestroyedWindows;
|
|
166
|
+
private processCleanupChunk;
|
|
167
|
+
private performCleanup;
|
|
168
|
+
}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
'use strict';/**
|
|
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
|
+
}exports.WindowRegistry=WindowRegistry;//# sourceMappingURL=WindowRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowRegistry.js","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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"}
|