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,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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"}
|