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,60 @@
|
|
|
1
|
+
'use strict';var electron=require('electron');// Use a dedicated channel for IPC transport
|
|
2
|
+
const IPC_CHANNEL = 'message-bus-ipc';
|
|
3
|
+
class IpcTransport {
|
|
4
|
+
name = 'ipc';
|
|
5
|
+
logger;
|
|
6
|
+
windows = new Map();
|
|
7
|
+
onMessage;
|
|
8
|
+
constructor(logger) {
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
this.setupIpcListener();
|
|
11
|
+
}
|
|
12
|
+
setupIpcListener() {
|
|
13
|
+
electron.ipcMain.on(IPC_CHANNEL, (event, payload) => {
|
|
14
|
+
const windowId = this.findWindowId(event.sender.id);
|
|
15
|
+
if (windowId && this.onMessage) {
|
|
16
|
+
this.onMessage(payload, windowId);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
findWindowId(webContentsId) {
|
|
21
|
+
for (const [id, win] of this.windows.entries()) {
|
|
22
|
+
if (win.webContents.id === webContentsId)
|
|
23
|
+
return id;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
init(onMessage) {
|
|
28
|
+
this.onMessage = onMessage;
|
|
29
|
+
}
|
|
30
|
+
registerWindow(windowId, window) {
|
|
31
|
+
this.windows.set(windowId, window);
|
|
32
|
+
}
|
|
33
|
+
unregisterWindow(windowId) {
|
|
34
|
+
this.windows.delete(windowId);
|
|
35
|
+
}
|
|
36
|
+
send(windowId, message) {
|
|
37
|
+
const window = this.windows.get(windowId);
|
|
38
|
+
if (window && !window.isDestroyed()) {
|
|
39
|
+
window.webContents.send(IPC_CHANNEL, message);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
broadcast(message, windowIds) {
|
|
43
|
+
let count = 0;
|
|
44
|
+
const targets = windowIds || Array.from(this.windows.keys());
|
|
45
|
+
for (const id of targets) {
|
|
46
|
+
try {
|
|
47
|
+
this.send(id, message);
|
|
48
|
+
count++;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
this.logger.error(`Failed to send IPC message to ${id}`, e);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return count;
|
|
55
|
+
}
|
|
56
|
+
dispose() {
|
|
57
|
+
this.windows.clear();
|
|
58
|
+
electron.ipcMain.removeAllListeners(IPC_CHANNEL);
|
|
59
|
+
}
|
|
60
|
+
}exports.IpcTransport=IpcTransport;//# sourceMappingURL=IpcTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpcTransport.js","sources":["../../../../src/core/message-bus/transport/IpcTransport.ts"],"sourcesContent":["import { BrowserWindow, ipcMain } from 'electron';\nimport { ITransport } from './ITransport';\nimport { ILogger } from '@/infrastructure/logger';\n\n// Use a dedicated channel for IPC transport\nconst IPC_CHANNEL = 'message-bus-ipc';\n\nexport class IpcTransport implements ITransport {\n public readonly name = 'ipc';\n private logger: ILogger;\n private windows: Map<string, BrowserWindow> = new Map();\n private onMessage?: (message: any, windowId: string) => void;\n\n constructor(logger: ILogger) {\n this.logger = logger;\n this.setupIpcListener();\n }\n\n private setupIpcListener() {\n ipcMain.on(IPC_CHANNEL, (event, payload) => {\n const windowId = this.findWindowId(event.sender.id);\n if (windowId && this.onMessage) {\n this.onMessage(payload, windowId);\n }\n });\n }\n\n private findWindowId(webContentsId: number): string | undefined {\n for (const [id, win] of this.windows.entries()) {\n if (win.webContents.id === webContentsId) return id;\n }\n return undefined;\n }\n\n init(onMessage: (message: any, windowId: string) => void): void {\n this.onMessage = onMessage;\n }\n\n registerWindow(windowId: string, window: BrowserWindow): void {\n this.windows.set(windowId, window);\n }\n\n unregisterWindow(windowId: string): void {\n this.windows.delete(windowId);\n }\n\n send(windowId: string, message: any): void {\n const window = this.windows.get(windowId);\n if (window && !window.isDestroyed()) {\n window.webContents.send(IPC_CHANNEL, message);\n }\n }\n\n broadcast(message: any, windowIds?: string[]): number {\n let count = 0;\n const targets = windowIds || Array.from(this.windows.keys());\n for (const id of targets) {\n try {\n this.send(id, message);\n count++;\n } catch (e) {\n this.logger.error(`Failed to send IPC message to ${id}`, e);\n }\n }\n return count;\n }\n\n dispose(): void {\n this.windows.clear();\n ipcMain.removeAllListeners(IPC_CHANNEL);\n }\n}\n"],"names":["ipcMain"],"mappings":"8CAIA;AACA,MAAM,WAAW,GAAG,iBAAiB;MAExB,YAAY,CAAA;IACP,IAAI,GAAG,KAAK;AACpB,IAAA,MAAM;AACN,IAAA,OAAO,GAA+B,IAAI,GAAG,EAAE;AAC/C,IAAA,SAAS;AAEjB,IAAA,WAAA,CAAY,MAAe,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEQ,gBAAgB,GAAA;QACtBA,gBAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;AACzC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AACnD,YAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AAC9B,gBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,YAAY,CAAC,aAAqB,EAAA;AACxC,QAAA,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;AAC9C,YAAA,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,aAAa;AAAE,gBAAA,OAAO,EAAE;QACrD;AACA,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,IAAI,CAAC,SAAmD,EAAA;AACtD,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;IAEA,cAAc,CAAC,QAAgB,EAAE,MAAqB,EAAA;QACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;IACpC;AAEA,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC/B;IAEA,IAAI,CAAC,QAAgB,EAAE,OAAY,EAAA;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;YACnC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;QAC/C;IACF;IAEA,SAAS,CAAC,OAAY,EAAE,SAAoB,EAAA;QAC1C,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5D,QAAA,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE;AACxB,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;AACtB,gBAAA,KAAK,EAAE;YACT;YAAE,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,EAAE,CAAA,CAAE,EAAE,CAAC,CAAC;YAC7D;QACF;AACA,QAAA,OAAO,KAAK;IACd;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,QAAAA,gBAAO,CAAC,kBAAkB,CAAC,WAAW,CAAC;IACzC;AACD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import {ipcMain}from'electron';// Use a dedicated channel for IPC transport
|
|
2
|
+
const IPC_CHANNEL = 'message-bus-ipc';
|
|
3
|
+
class IpcTransport {
|
|
4
|
+
name = 'ipc';
|
|
5
|
+
logger;
|
|
6
|
+
windows = new Map();
|
|
7
|
+
onMessage;
|
|
8
|
+
constructor(logger) {
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
this.setupIpcListener();
|
|
11
|
+
}
|
|
12
|
+
setupIpcListener() {
|
|
13
|
+
ipcMain.on(IPC_CHANNEL, (event, payload) => {
|
|
14
|
+
const windowId = this.findWindowId(event.sender.id);
|
|
15
|
+
if (windowId && this.onMessage) {
|
|
16
|
+
this.onMessage(payload, windowId);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
findWindowId(webContentsId) {
|
|
21
|
+
for (const [id, win] of this.windows.entries()) {
|
|
22
|
+
if (win.webContents.id === webContentsId)
|
|
23
|
+
return id;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
init(onMessage) {
|
|
28
|
+
this.onMessage = onMessage;
|
|
29
|
+
}
|
|
30
|
+
registerWindow(windowId, window) {
|
|
31
|
+
this.windows.set(windowId, window);
|
|
32
|
+
}
|
|
33
|
+
unregisterWindow(windowId) {
|
|
34
|
+
this.windows.delete(windowId);
|
|
35
|
+
}
|
|
36
|
+
send(windowId, message) {
|
|
37
|
+
const window = this.windows.get(windowId);
|
|
38
|
+
if (window && !window.isDestroyed()) {
|
|
39
|
+
window.webContents.send(IPC_CHANNEL, message);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
broadcast(message, windowIds) {
|
|
43
|
+
let count = 0;
|
|
44
|
+
const targets = windowIds || Array.from(this.windows.keys());
|
|
45
|
+
for (const id of targets) {
|
|
46
|
+
try {
|
|
47
|
+
this.send(id, message);
|
|
48
|
+
count++;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
this.logger.error(`Failed to send IPC message to ${id}`, e);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return count;
|
|
55
|
+
}
|
|
56
|
+
dispose() {
|
|
57
|
+
this.windows.clear();
|
|
58
|
+
ipcMain.removeAllListeners(IPC_CHANNEL);
|
|
59
|
+
}
|
|
60
|
+
}export{IpcTransport};//# sourceMappingURL=IpcTransport.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpcTransport.mjs","sources":["../../../../src/core/message-bus/transport/IpcTransport.ts"],"sourcesContent":["import { BrowserWindow, ipcMain } from 'electron';\nimport { ITransport } from './ITransport';\nimport { ILogger } from '@/infrastructure/logger';\n\n// Use a dedicated channel for IPC transport\nconst IPC_CHANNEL = 'message-bus-ipc';\n\nexport class IpcTransport implements ITransport {\n public readonly name = 'ipc';\n private logger: ILogger;\n private windows: Map<string, BrowserWindow> = new Map();\n private onMessage?: (message: any, windowId: string) => void;\n\n constructor(logger: ILogger) {\n this.logger = logger;\n this.setupIpcListener();\n }\n\n private setupIpcListener() {\n ipcMain.on(IPC_CHANNEL, (event, payload) => {\n const windowId = this.findWindowId(event.sender.id);\n if (windowId && this.onMessage) {\n this.onMessage(payload, windowId);\n }\n });\n }\n\n private findWindowId(webContentsId: number): string | undefined {\n for (const [id, win] of this.windows.entries()) {\n if (win.webContents.id === webContentsId) return id;\n }\n return undefined;\n }\n\n init(onMessage: (message: any, windowId: string) => void): void {\n this.onMessage = onMessage;\n }\n\n registerWindow(windowId: string, window: BrowserWindow): void {\n this.windows.set(windowId, window);\n }\n\n unregisterWindow(windowId: string): void {\n this.windows.delete(windowId);\n }\n\n send(windowId: string, message: any): void {\n const window = this.windows.get(windowId);\n if (window && !window.isDestroyed()) {\n window.webContents.send(IPC_CHANNEL, message);\n }\n }\n\n broadcast(message: any, windowIds?: string[]): number {\n let count = 0;\n const targets = windowIds || Array.from(this.windows.keys());\n for (const id of targets) {\n try {\n this.send(id, message);\n count++;\n } catch (e) {\n this.logger.error(`Failed to send IPC message to ${id}`, e);\n }\n }\n return count;\n }\n\n dispose(): void {\n this.windows.clear();\n ipcMain.removeAllListeners(IPC_CHANNEL);\n }\n}\n"],"names":[],"mappings":"+BAIA;AACA,MAAM,WAAW,GAAG,iBAAiB;MAExB,YAAY,CAAA;IACP,IAAI,GAAG,KAAK;AACpB,IAAA,MAAM;AACN,IAAA,OAAO,GAA+B,IAAI,GAAG,EAAE;AAC/C,IAAA,SAAS;AAEjB,IAAA,WAAA,CAAY,MAAe,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEQ,gBAAgB,GAAA;QACtB,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;AACzC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AACnD,YAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AAC9B,gBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,YAAY,CAAC,aAAqB,EAAA;AACxC,QAAA,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;AAC9C,YAAA,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,aAAa;AAAE,gBAAA,OAAO,EAAE;QACrD;AACA,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,IAAI,CAAC,SAAmD,EAAA;AACtD,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;IAEA,cAAc,CAAC,QAAgB,EAAE,MAAqB,EAAA;QACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;IACpC;AAEA,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC/B;IAEA,IAAI,CAAC,QAAgB,EAAE,OAAY,EAAA;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;YACnC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;QAC/C;IACF;IAEA,SAAS,CAAC,OAAY,EAAE,SAAoB,EAAA;QAC1C,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5D,QAAA,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE;AACxB,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;AACtB,gBAAA,KAAK,EAAE;YACT;YAAE,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,EAAE,CAAA,CAAE,EAAE,CAAC,CAAC;YAC7D;QACF;AACA,QAAA,OAAO,KAAK;IACd;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,QAAA,OAAO,CAAC,kBAAkB,CAAC,WAAW,CAAC;IACzC;AACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BrowserWindow } from 'electron';
|
|
2
|
+
import { ITransport } from './ITransport';
|
|
3
|
+
import { ILogger } from '@/infrastructure/logger';
|
|
4
|
+
export declare class MessagePortTransport implements ITransport {
|
|
5
|
+
readonly name = "messageport";
|
|
6
|
+
private portManager;
|
|
7
|
+
private onMessage?;
|
|
8
|
+
constructor(logger: ILogger);
|
|
9
|
+
init(onMessage: (message: any, windowId: string) => void): void;
|
|
10
|
+
registerWindow(windowId: string, window: BrowserWindow): void;
|
|
11
|
+
unregisterWindow(windowId: string): void;
|
|
12
|
+
send(windowId: string, message: any): void;
|
|
13
|
+
broadcast(message: any, windowIds?: string[]): number;
|
|
14
|
+
dispose(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';var PortManager=require('../core/PortManager.js');class MessagePortTransport {
|
|
2
|
+
name = 'messageport';
|
|
3
|
+
portManager;
|
|
4
|
+
onMessage;
|
|
5
|
+
constructor(logger) {
|
|
6
|
+
this.portManager = new PortManager.PortManager(logger);
|
|
7
|
+
}
|
|
8
|
+
init(onMessage) {
|
|
9
|
+
this.onMessage = onMessage;
|
|
10
|
+
}
|
|
11
|
+
registerWindow(windowId, window) {
|
|
12
|
+
this.portManager.register(windowId, window, (msg, _port) => {
|
|
13
|
+
if (this.onMessage) {
|
|
14
|
+
this.onMessage(msg, windowId);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
unregisterWindow(windowId) {
|
|
19
|
+
this.portManager.unregister(windowId);
|
|
20
|
+
}
|
|
21
|
+
send(windowId, message) {
|
|
22
|
+
const port = this.portManager.get(windowId);
|
|
23
|
+
if (port) {
|
|
24
|
+
const serialized = typeof message === 'string' ? message : JSON.stringify(message);
|
|
25
|
+
port.postMessage(serialized);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
broadcast(message, windowIds) {
|
|
29
|
+
const serialized = typeof message === 'string' ? message : JSON.stringify(message);
|
|
30
|
+
return this.portManager.broadcast(serialized, windowIds);
|
|
31
|
+
}
|
|
32
|
+
dispose() {
|
|
33
|
+
// PortManager cleanup if needed
|
|
34
|
+
}
|
|
35
|
+
}exports.MessagePortTransport=MessagePortTransport;//# sourceMappingURL=MessagePortTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagePortTransport.js","sources":["../../../../src/core/message-bus/transport/MessagePortTransport.ts"],"sourcesContent":["import { BrowserWindow } from 'electron';\nimport { ITransport } from './ITransport';\nimport { PortManager } from '../core/PortManager';\nimport { ILogger } from '@/infrastructure/logger';\n\nexport class MessagePortTransport implements ITransport {\n public readonly name = 'messageport';\n private portManager: PortManager;\n private onMessage?: (message: any, windowId: string) => void;\n\n constructor(logger: ILogger) {\n this.portManager = new PortManager(logger);\n }\n\n init(onMessage: (message: any, windowId: string) => void): void {\n this.onMessage = onMessage;\n }\n\n registerWindow(windowId: string, window: BrowserWindow): void {\n this.portManager.register(windowId, window, (msg, _port) => {\n if (this.onMessage) {\n this.onMessage(msg, windowId);\n }\n });\n }\n\n unregisterWindow(windowId: string): void {\n this.portManager.unregister(windowId);\n }\n\n send(windowId: string, message: any): void {\n const port = this.portManager.get(windowId);\n if (port) {\n const serialized = typeof message === 'string' ? message : JSON.stringify(message);\n port.postMessage(serialized);\n }\n }\n\n broadcast(message: any, windowIds?: string[]): number {\n const serialized = typeof message === 'string' ? message : JSON.stringify(message);\n return this.portManager.broadcast(serialized, windowIds);\n }\n\n dispose(): void {\n // PortManager cleanup if needed\n }\n}\n"],"names":["PortManager"],"mappings":"qEAKa,oBAAoB,CAAA;IACf,IAAI,GAAG,aAAa;AAC5B,IAAA,WAAW;AACX,IAAA,SAAS;AAEjB,IAAA,WAAA,CAAY,MAAe,EAAA;QACzB,IAAI,CAAC,WAAW,GAAG,IAAIA,uBAAW,CAAC,MAAM,CAAC;IAC5C;AAEA,IAAA,IAAI,CAAC,SAAmD,EAAA;AACtD,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;IAEA,cAAc,CAAC,QAAgB,EAAE,MAAqB,EAAA;AACpD,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,KAAI;AACzD,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC;YAC/B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvC;IAEA,IAAI,CAAC,QAAgB,EAAE,OAAY,EAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3C,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AAClF,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC9B;IACF;IAEA,SAAS,CAAC,OAAY,EAAE,SAAoB,EAAA;AAC1C,QAAA,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAClF,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC;IAC1D;IAEA,OAAO,GAAA;;IAEP;AACD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {PortManager}from'../core/PortManager.mjs';class MessagePortTransport {
|
|
2
|
+
name = 'messageport';
|
|
3
|
+
portManager;
|
|
4
|
+
onMessage;
|
|
5
|
+
constructor(logger) {
|
|
6
|
+
this.portManager = new PortManager(logger);
|
|
7
|
+
}
|
|
8
|
+
init(onMessage) {
|
|
9
|
+
this.onMessage = onMessage;
|
|
10
|
+
}
|
|
11
|
+
registerWindow(windowId, window) {
|
|
12
|
+
this.portManager.register(windowId, window, (msg, _port) => {
|
|
13
|
+
if (this.onMessage) {
|
|
14
|
+
this.onMessage(msg, windowId);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
unregisterWindow(windowId) {
|
|
19
|
+
this.portManager.unregister(windowId);
|
|
20
|
+
}
|
|
21
|
+
send(windowId, message) {
|
|
22
|
+
const port = this.portManager.get(windowId);
|
|
23
|
+
if (port) {
|
|
24
|
+
const serialized = typeof message === 'string' ? message : JSON.stringify(message);
|
|
25
|
+
port.postMessage(serialized);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
broadcast(message, windowIds) {
|
|
29
|
+
const serialized = typeof message === 'string' ? message : JSON.stringify(message);
|
|
30
|
+
return this.portManager.broadcast(serialized, windowIds);
|
|
31
|
+
}
|
|
32
|
+
dispose() {
|
|
33
|
+
// PortManager cleanup if needed
|
|
34
|
+
}
|
|
35
|
+
}export{MessagePortTransport};//# sourceMappingURL=MessagePortTransport.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagePortTransport.mjs","sources":["../../../../src/core/message-bus/transport/MessagePortTransport.ts"],"sourcesContent":["import { BrowserWindow } from 'electron';\nimport { ITransport } from './ITransport';\nimport { PortManager } from '../core/PortManager';\nimport { ILogger } from '@/infrastructure/logger';\n\nexport class MessagePortTransport implements ITransport {\n public readonly name = 'messageport';\n private portManager: PortManager;\n private onMessage?: (message: any, windowId: string) => void;\n\n constructor(logger: ILogger) {\n this.portManager = new PortManager(logger);\n }\n\n init(onMessage: (message: any, windowId: string) => void): void {\n this.onMessage = onMessage;\n }\n\n registerWindow(windowId: string, window: BrowserWindow): void {\n this.portManager.register(windowId, window, (msg, _port) => {\n if (this.onMessage) {\n this.onMessage(msg, windowId);\n }\n });\n }\n\n unregisterWindow(windowId: string): void {\n this.portManager.unregister(windowId);\n }\n\n send(windowId: string, message: any): void {\n const port = this.portManager.get(windowId);\n if (port) {\n const serialized = typeof message === 'string' ? message : JSON.stringify(message);\n port.postMessage(serialized);\n }\n }\n\n broadcast(message: any, windowIds?: string[]): number {\n const serialized = typeof message === 'string' ? message : JSON.stringify(message);\n return this.portManager.broadcast(serialized, windowIds);\n }\n\n dispose(): void {\n // PortManager cleanup if needed\n }\n}\n"],"names":[],"mappings":"wDAKa,oBAAoB,CAAA;IACf,IAAI,GAAG,aAAa;AAC5B,IAAA,WAAW;AACX,IAAA,SAAS;AAEjB,IAAA,WAAA,CAAY,MAAe,EAAA;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC;IAC5C;AAEA,IAAA,IAAI,CAAC,SAAmD,EAAA;AACtD,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;IAEA,cAAc,CAAC,QAAgB,EAAE,MAAqB,EAAA;AACpD,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,KAAI;AACzD,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC;YAC/B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvC;IAEA,IAAI,CAAC,QAAgB,EAAE,OAAY,EAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3C,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AAClF,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC9B;IACF;IAEA,SAAS,CAAC,OAAY,EAAE,SAAoB,EAAA;AAC1C,QAAA,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAClF,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC;IAC1D;IAEA,OAAO,GAAA;;IAEP;AACD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { IIpcTransport } from '@/core/ipc/transport/ipc.type';
|
|
2
|
+
import type IpcRouter from '@/core/ipc/IpcRouter';
|
|
3
|
+
import { WindowManagerConfig } from './window-manager.type';
|
|
4
|
+
export interface IpcSetupOptions {
|
|
5
|
+
config: WindowManagerConfig;
|
|
6
|
+
ipcRouter: IpcRouter;
|
|
7
|
+
currentIpcChannel?: string | null;
|
|
8
|
+
currentIpcSyncChannel?: string | null;
|
|
9
|
+
options?: {
|
|
10
|
+
channel?: string;
|
|
11
|
+
syncChannel?: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Optional IpcTransport instance, if not provided, a new instance will be created.
|
|
15
|
+
* 可选的 IpcTransport 实例,如果未提供,将创建一个新实例。
|
|
16
|
+
*/
|
|
17
|
+
ipcTransport?: IIpcTransport;
|
|
18
|
+
}
|
|
19
|
+
export interface IpcSetupResult {
|
|
20
|
+
channel: string;
|
|
21
|
+
syncChannel: string;
|
|
22
|
+
/**
|
|
23
|
+
* The IpcTransport instance used.
|
|
24
|
+
* 使用的 IpcTransport 实例。
|
|
25
|
+
*/
|
|
26
|
+
ipcTransport: IIpcTransport;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Responsible for IPC registration logic of WindowManager
|
|
30
|
+
* 负责 WindowManager 的 IPC 注册逻辑
|
|
31
|
+
*/
|
|
32
|
+
export declare class IpcSetup {
|
|
33
|
+
/**
|
|
34
|
+
* Default IPC setup implementation
|
|
35
|
+
* 默认 IPC 设置实现
|
|
36
|
+
* @param windowManager - WindowManager instance
|
|
37
|
+
* @param options - IPC options
|
|
38
|
+
*/
|
|
39
|
+
static defaultSetup(windowManager: any, options?: {
|
|
40
|
+
channel?: string;
|
|
41
|
+
syncChannel?: string;
|
|
42
|
+
}): IpcSetupResult;
|
|
43
|
+
/**
|
|
44
|
+
* Setup IPC communication
|
|
45
|
+
* 设置 IPC 通信
|
|
46
|
+
* @param params - Parameter object (参数对象)
|
|
47
|
+
* @returns Registered channel names (注册的频道名称)
|
|
48
|
+
*/
|
|
49
|
+
static setup(params: IpcSetupOptions): IpcSetupResult;
|
|
50
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use strict';var index=require('../ipc/transport/index.js'),constants=require('./constants.js');/**
|
|
2
|
+
* Responsible for IPC registration logic of WindowManager
|
|
3
|
+
* 负责 WindowManager 的 IPC 注册逻辑
|
|
4
|
+
*/
|
|
5
|
+
class IpcSetup {
|
|
6
|
+
/**
|
|
7
|
+
* Default IPC setup implementation
|
|
8
|
+
* 默认 IPC 设置实现
|
|
9
|
+
* @param windowManager - WindowManager instance
|
|
10
|
+
* @param options - IPC options
|
|
11
|
+
*/
|
|
12
|
+
static defaultSetup(windowManager, options) {
|
|
13
|
+
return IpcSetup.setup({
|
|
14
|
+
config: windowManager.config,
|
|
15
|
+
ipcRouter: windowManager.ipcRouter,
|
|
16
|
+
currentIpcChannel: windowManager.currentIpcChannel,
|
|
17
|
+
currentIpcSyncChannel: windowManager.currentIpcSyncChannel,
|
|
18
|
+
options,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Setup IPC communication
|
|
23
|
+
* 设置 IPC 通信
|
|
24
|
+
* @param params - Parameter object (参数对象)
|
|
25
|
+
* @returns Registered channel names (注册的频道名称)
|
|
26
|
+
*/
|
|
27
|
+
static setup(params) {
|
|
28
|
+
const { config, ipcRouter, currentIpcChannel, currentIpcSyncChannel, options } = params;
|
|
29
|
+
// Use provided instance or create new one
|
|
30
|
+
// 使用提供的实例或创建新实例
|
|
31
|
+
const ipcTransport = params.ipcTransport || new index();
|
|
32
|
+
const channel = options?.channel || config.ipc?.channel || constants.IPC_CHANNELS.RENDERER_TO_MAIN;
|
|
33
|
+
const syncChannel = options?.syncChannel || config.ipc?.syncChannel || constants.IPC_CHANNELS.RENDERER_TO_MAIN_SYNC;
|
|
34
|
+
// Clean up old listeners (if exist)
|
|
35
|
+
// 清理旧的监听器 (如果存在)
|
|
36
|
+
if (currentIpcChannel) {
|
|
37
|
+
ipcTransport.removeHandler(currentIpcChannel);
|
|
38
|
+
}
|
|
39
|
+
if (currentIpcSyncChannel) {
|
|
40
|
+
ipcTransport.removeListener(currentIpcSyncChannel);
|
|
41
|
+
}
|
|
42
|
+
ipcTransport.handle(channel, async (event, data) => {
|
|
43
|
+
try {
|
|
44
|
+
const senderId = event.sender?.id;
|
|
45
|
+
const result = await ipcRouter.handle(data, senderId);
|
|
46
|
+
return {
|
|
47
|
+
code: 0,
|
|
48
|
+
message: 'success',
|
|
49
|
+
data: result,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return {
|
|
54
|
+
code: error.code || 500,
|
|
55
|
+
message: error instanceof Error ? error.message : String(error),
|
|
56
|
+
data: null,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated
|
|
62
|
+
* Sync IPC is not recommended as it blocks the renderer process.
|
|
63
|
+
* Use async 'invoke' instead.
|
|
64
|
+
* 同步 IPC 不推荐使用,因为它会阻塞渲染进程。
|
|
65
|
+
* 请改用异步 'invoke'。
|
|
66
|
+
*/
|
|
67
|
+
if (syncChannel) {
|
|
68
|
+
ipcTransport.on(syncChannel, (event, data) => {
|
|
69
|
+
try {
|
|
70
|
+
const result = ipcRouter.handle(data); // Call IPC handler / 调用IPC处理函数
|
|
71
|
+
// Wrap result in standard response
|
|
72
|
+
// 将结果包装在标准响应中
|
|
73
|
+
event.returnValue = {
|
|
74
|
+
code: 0,
|
|
75
|
+
message: 'success',
|
|
76
|
+
data: result,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// Wrap error in standard response
|
|
81
|
+
// 将错误包装在标准响应中
|
|
82
|
+
event.returnValue = {
|
|
83
|
+
code: error.code || 500,
|
|
84
|
+
message: error instanceof Error ? error.message : String(error),
|
|
85
|
+
data: null,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
channel,
|
|
92
|
+
syncChannel,
|
|
93
|
+
ipcTransport,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}exports.IpcSetup=IpcSetup;//# sourceMappingURL=IpcSetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpcSetup.js","sources":["../../../src/core/window/IpcSetup.ts"],"sourcesContent":["import { IpcMainInvokeEvent, IpcMainEvent } from 'electron';\nimport IpcTransportClass from '@/core/ipc/transport';\nimport { IIpcTransport } from '@/core/ipc/transport/ipc.type';\nimport type IpcRouter from '@/core/ipc/IpcRouter';\nimport { IpcRequest } from '@/core/ipc/ipc-router.type';\nimport { WindowManagerConfig } from './window-manager.type';\nimport { IPC_CHANNELS } from './constants';\n\nexport interface IpcSetupOptions {\n config: WindowManagerConfig;\n ipcRouter: IpcRouter;\n currentIpcChannel?: string | null;\n currentIpcSyncChannel?: string | null;\n options?: { channel?: string; syncChannel?: string };\n /**\n * Optional IpcTransport instance, if not provided, a new instance will be created.\n * 可选的 IpcTransport 实例,如果未提供,将创建一个新实例。\n */\n ipcTransport?: IIpcTransport;\n}\n\nexport interface IpcSetupResult {\n channel: string;\n syncChannel: string;\n /**\n * The IpcTransport instance used.\n * 使用的 IpcTransport 实例。\n */\n ipcTransport: IIpcTransport;\n}\n\n/**\n * Responsible for IPC registration logic of WindowManager\n * 负责 WindowManager 的 IPC 注册逻辑\n */\nexport class IpcSetup {\n /**\n * Default IPC setup implementation\n * 默认 IPC 设置实现\n * @param windowManager - WindowManager instance\n * @param options - IPC options\n */\n static defaultSetup(\n windowManager: any,\n options?: { channel?: string; syncChannel?: string }\n ): IpcSetupResult {\n return IpcSetup.setup({\n config: windowManager.config,\n ipcRouter: windowManager.ipcRouter,\n currentIpcChannel: windowManager.currentIpcChannel,\n currentIpcSyncChannel: windowManager.currentIpcSyncChannel,\n options,\n });\n }\n\n /**\n * Setup IPC communication\n * 设置 IPC 通信\n * @param params - Parameter object (参数对象)\n * @returns Registered channel names (注册的频道名称)\n */\n static setup(params: IpcSetupOptions): IpcSetupResult {\n const { config, ipcRouter, currentIpcChannel, currentIpcSyncChannel, options } = params;\n\n // Use provided instance or create new one\n // 使用提供的实例或创建新实例\n const ipcTransport = params.ipcTransport || new IpcTransportClass();\n\n const channel = options?.channel || config.ipc?.channel || IPC_CHANNELS.RENDERER_TO_MAIN;\n const syncChannel =\n options?.syncChannel || config.ipc?.syncChannel || IPC_CHANNELS.RENDERER_TO_MAIN_SYNC;\n\n // Clean up old listeners (if exist)\n // 清理旧的监听器 (如果存在)\n if (currentIpcChannel) {\n ipcTransport.removeHandler(currentIpcChannel);\n }\n if (currentIpcSyncChannel) {\n ipcTransport.removeListener(currentIpcSyncChannel);\n }\n\n ipcTransport.handle(channel, async (event: IpcMainInvokeEvent, data) => {\n try {\n const senderId = event.sender?.id;\n const result = await ipcRouter.handle(data as IpcRequest, senderId);\n return {\n code: 0,\n message: 'success',\n data: result,\n };\n } catch (error) {\n return {\n code: (error as any).code || 500,\n message: error instanceof Error ? error.message : String(error),\n data: null,\n };\n }\n });\n\n /**\n * @deprecated\n * Sync IPC is not recommended as it blocks the renderer process.\n * Use async 'invoke' instead.\n * 同步 IPC 不推荐使用,因为它会阻塞渲染进程。\n * 请改用异步 'invoke'。\n */\n if (syncChannel) {\n ipcTransport.on(syncChannel, (event: IpcMainEvent, data) => {\n try {\n const result = ipcRouter.handle(data as IpcRequest); // Call IPC handler / 调用IPC处理函数\n // Wrap result in standard response\n // 将结果包装在标准响应中\n event.returnValue = {\n code: 0,\n message: 'success',\n data: result,\n };\n } catch (error) {\n // Wrap error in standard response\n // 将错误包装在标准响应中\n event.returnValue = {\n code: (error as any).code || 500,\n message: error instanceof Error ? error.message : String(error),\n data: null,\n };\n }\n });\n }\n\n return {\n channel,\n syncChannel,\n ipcTransport,\n };\n }\n}\n"],"names":["IpcTransportClass","IPC_CHANNELS"],"mappings":"gGA+BA;;;AAGG;MACU,QAAQ,CAAA;AACnB;;;;;AAKG;AACH,IAAA,OAAO,YAAY,CACjB,aAAkB,EAClB,OAAoD,EAAA;QAEpD,OAAO,QAAQ,CAAC,KAAK,CAAC;YACpB,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,iBAAiB,EAAE,aAAa,CAAC,iBAAiB;YAClD,qBAAqB,EAAE,aAAa,CAAC,qBAAqB;YAC1D,OAAO;AACR,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;IACH,OAAO,KAAK,CAAC,MAAuB,EAAA;AAClC,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,OAAO,EAAE,GAAG,MAAM;;;QAIvF,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAIA,KAAiB,EAAE;AAEnE,QAAA,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,OAAO,IAAIC,sBAAY,CAAC,gBAAgB;AACxF,QAAA,MAAM,WAAW,GACf,OAAO,EAAE,WAAW,IAAI,MAAM,CAAC,GAAG,EAAE,WAAW,IAAIA,sBAAY,CAAC,qBAAqB;;;QAIvF,IAAI,iBAAiB,EAAE;AACrB,YAAA,YAAY,CAAC,aAAa,CAAC,iBAAiB,CAAC;QAC/C;QACA,IAAI,qBAAqB,EAAE;AACzB,YAAA,YAAY,CAAC,cAAc,CAAC,qBAAqB,CAAC;QACpD;QAEA,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,KAAyB,EAAE,IAAI,KAAI;AACrE,YAAA,IAAI;AACF,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE;gBACjC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAkB,EAAE,QAAQ,CAAC;gBACnE,OAAO;AACL,oBAAA,IAAI,EAAE,CAAC;AACP,oBAAA,OAAO,EAAE,SAAS;AAClB,oBAAA,IAAI,EAAE,MAAM;iBACb;YACH;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO;AACL,oBAAA,IAAI,EAAG,KAAa,CAAC,IAAI,IAAI,GAAG;AAChC,oBAAA,OAAO,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC/D,oBAAA,IAAI,EAAE,IAAI;iBACX;YACH;AACF,QAAA,CAAC,CAAC;AAEF;;;;;;AAMG;QACH,IAAI,WAAW,EAAE;YACf,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAmB,EAAE,IAAI,KAAI;AACzD,gBAAA,IAAI;oBACF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAkB,CAAC,CAAC;;;oBAGpD,KAAK,CAAC,WAAW,GAAG;AAClB,wBAAA,IAAI,EAAE,CAAC;AACP,wBAAA,OAAO,EAAE,SAAS;AAClB,wBAAA,IAAI,EAAE,MAAM;qBACb;gBACH;gBAAE,OAAO,KAAK,EAAE;;;oBAGd,KAAK,CAAC,WAAW,GAAG;AAClB,wBAAA,IAAI,EAAG,KAAa,CAAC,IAAI,IAAI,GAAG;AAChC,wBAAA,OAAO,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC/D,wBAAA,IAAI,EAAE,IAAI;qBACX;gBACH;AACF,YAAA,CAAC,CAAC;QACJ;QAEA,OAAO;YACL,OAAO;YACP,WAAW;YACX,YAAY;SACb;IACH;AACD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import IpcTransport from'../ipc/transport/index.mjs';import {IPC_CHANNELS}from'./constants.mjs';/**
|
|
2
|
+
* Responsible for IPC registration logic of WindowManager
|
|
3
|
+
* 负责 WindowManager 的 IPC 注册逻辑
|
|
4
|
+
*/
|
|
5
|
+
class IpcSetup {
|
|
6
|
+
/**
|
|
7
|
+
* Default IPC setup implementation
|
|
8
|
+
* 默认 IPC 设置实现
|
|
9
|
+
* @param windowManager - WindowManager instance
|
|
10
|
+
* @param options - IPC options
|
|
11
|
+
*/
|
|
12
|
+
static defaultSetup(windowManager, options) {
|
|
13
|
+
return IpcSetup.setup({
|
|
14
|
+
config: windowManager.config,
|
|
15
|
+
ipcRouter: windowManager.ipcRouter,
|
|
16
|
+
currentIpcChannel: windowManager.currentIpcChannel,
|
|
17
|
+
currentIpcSyncChannel: windowManager.currentIpcSyncChannel,
|
|
18
|
+
options,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Setup IPC communication
|
|
23
|
+
* 设置 IPC 通信
|
|
24
|
+
* @param params - Parameter object (参数对象)
|
|
25
|
+
* @returns Registered channel names (注册的频道名称)
|
|
26
|
+
*/
|
|
27
|
+
static setup(params) {
|
|
28
|
+
const { config, ipcRouter, currentIpcChannel, currentIpcSyncChannel, options } = params;
|
|
29
|
+
// Use provided instance or create new one
|
|
30
|
+
// 使用提供的实例或创建新实例
|
|
31
|
+
const ipcTransport = params.ipcTransport || new IpcTransport();
|
|
32
|
+
const channel = options?.channel || config.ipc?.channel || IPC_CHANNELS.RENDERER_TO_MAIN;
|
|
33
|
+
const syncChannel = options?.syncChannel || config.ipc?.syncChannel || IPC_CHANNELS.RENDERER_TO_MAIN_SYNC;
|
|
34
|
+
// Clean up old listeners (if exist)
|
|
35
|
+
// 清理旧的监听器 (如果存在)
|
|
36
|
+
if (currentIpcChannel) {
|
|
37
|
+
ipcTransport.removeHandler(currentIpcChannel);
|
|
38
|
+
}
|
|
39
|
+
if (currentIpcSyncChannel) {
|
|
40
|
+
ipcTransport.removeListener(currentIpcSyncChannel);
|
|
41
|
+
}
|
|
42
|
+
ipcTransport.handle(channel, async (event, data) => {
|
|
43
|
+
try {
|
|
44
|
+
const senderId = event.sender?.id;
|
|
45
|
+
const result = await ipcRouter.handle(data, senderId);
|
|
46
|
+
return {
|
|
47
|
+
code: 0,
|
|
48
|
+
message: 'success',
|
|
49
|
+
data: result,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return {
|
|
54
|
+
code: error.code || 500,
|
|
55
|
+
message: error instanceof Error ? error.message : String(error),
|
|
56
|
+
data: null,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated
|
|
62
|
+
* Sync IPC is not recommended as it blocks the renderer process.
|
|
63
|
+
* Use async 'invoke' instead.
|
|
64
|
+
* 同步 IPC 不推荐使用,因为它会阻塞渲染进程。
|
|
65
|
+
* 请改用异步 'invoke'。
|
|
66
|
+
*/
|
|
67
|
+
if (syncChannel) {
|
|
68
|
+
ipcTransport.on(syncChannel, (event, data) => {
|
|
69
|
+
try {
|
|
70
|
+
const result = ipcRouter.handle(data); // Call IPC handler / 调用IPC处理函数
|
|
71
|
+
// Wrap result in standard response
|
|
72
|
+
// 将结果包装在标准响应中
|
|
73
|
+
event.returnValue = {
|
|
74
|
+
code: 0,
|
|
75
|
+
message: 'success',
|
|
76
|
+
data: result,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// Wrap error in standard response
|
|
81
|
+
// 将错误包装在标准响应中
|
|
82
|
+
event.returnValue = {
|
|
83
|
+
code: error.code || 500,
|
|
84
|
+
message: error instanceof Error ? error.message : String(error),
|
|
85
|
+
data: null,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
channel,
|
|
92
|
+
syncChannel,
|
|
93
|
+
ipcTransport,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}export{IpcSetup};//# sourceMappingURL=IpcSetup.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpcSetup.mjs","sources":["../../../src/core/window/IpcSetup.ts"],"sourcesContent":["import { IpcMainInvokeEvent, IpcMainEvent } from 'electron';\nimport IpcTransportClass from '@/core/ipc/transport';\nimport { IIpcTransport } from '@/core/ipc/transport/ipc.type';\nimport type IpcRouter from '@/core/ipc/IpcRouter';\nimport { IpcRequest } from '@/core/ipc/ipc-router.type';\nimport { WindowManagerConfig } from './window-manager.type';\nimport { IPC_CHANNELS } from './constants';\n\nexport interface IpcSetupOptions {\n config: WindowManagerConfig;\n ipcRouter: IpcRouter;\n currentIpcChannel?: string | null;\n currentIpcSyncChannel?: string | null;\n options?: { channel?: string; syncChannel?: string };\n /**\n * Optional IpcTransport instance, if not provided, a new instance will be created.\n * 可选的 IpcTransport 实例,如果未提供,将创建一个新实例。\n */\n ipcTransport?: IIpcTransport;\n}\n\nexport interface IpcSetupResult {\n channel: string;\n syncChannel: string;\n /**\n * The IpcTransport instance used.\n * 使用的 IpcTransport 实例。\n */\n ipcTransport: IIpcTransport;\n}\n\n/**\n * Responsible for IPC registration logic of WindowManager\n * 负责 WindowManager 的 IPC 注册逻辑\n */\nexport class IpcSetup {\n /**\n * Default IPC setup implementation\n * 默认 IPC 设置实现\n * @param windowManager - WindowManager instance\n * @param options - IPC options\n */\n static defaultSetup(\n windowManager: any,\n options?: { channel?: string; syncChannel?: string }\n ): IpcSetupResult {\n return IpcSetup.setup({\n config: windowManager.config,\n ipcRouter: windowManager.ipcRouter,\n currentIpcChannel: windowManager.currentIpcChannel,\n currentIpcSyncChannel: windowManager.currentIpcSyncChannel,\n options,\n });\n }\n\n /**\n * Setup IPC communication\n * 设置 IPC 通信\n * @param params - Parameter object (参数对象)\n * @returns Registered channel names (注册的频道名称)\n */\n static setup(params: IpcSetupOptions): IpcSetupResult {\n const { config, ipcRouter, currentIpcChannel, currentIpcSyncChannel, options } = params;\n\n // Use provided instance or create new one\n // 使用提供的实例或创建新实例\n const ipcTransport = params.ipcTransport || new IpcTransportClass();\n\n const channel = options?.channel || config.ipc?.channel || IPC_CHANNELS.RENDERER_TO_MAIN;\n const syncChannel =\n options?.syncChannel || config.ipc?.syncChannel || IPC_CHANNELS.RENDERER_TO_MAIN_SYNC;\n\n // Clean up old listeners (if exist)\n // 清理旧的监听器 (如果存在)\n if (currentIpcChannel) {\n ipcTransport.removeHandler(currentIpcChannel);\n }\n if (currentIpcSyncChannel) {\n ipcTransport.removeListener(currentIpcSyncChannel);\n }\n\n ipcTransport.handle(channel, async (event: IpcMainInvokeEvent, data) => {\n try {\n const senderId = event.sender?.id;\n const result = await ipcRouter.handle(data as IpcRequest, senderId);\n return {\n code: 0,\n message: 'success',\n data: result,\n };\n } catch (error) {\n return {\n code: (error as any).code || 500,\n message: error instanceof Error ? error.message : String(error),\n data: null,\n };\n }\n });\n\n /**\n * @deprecated\n * Sync IPC is not recommended as it blocks the renderer process.\n * Use async 'invoke' instead.\n * 同步 IPC 不推荐使用,因为它会阻塞渲染进程。\n * 请改用异步 'invoke'。\n */\n if (syncChannel) {\n ipcTransport.on(syncChannel, (event: IpcMainEvent, data) => {\n try {\n const result = ipcRouter.handle(data as IpcRequest); // Call IPC handler / 调用IPC处理函数\n // Wrap result in standard response\n // 将结果包装在标准响应中\n event.returnValue = {\n code: 0,\n message: 'success',\n data: result,\n };\n } catch (error) {\n // Wrap error in standard response\n // 将错误包装在标准响应中\n event.returnValue = {\n code: (error as any).code || 500,\n message: error instanceof Error ? error.message : String(error),\n data: null,\n };\n }\n });\n }\n\n return {\n channel,\n syncChannel,\n ipcTransport,\n };\n }\n}\n"],"names":["IpcTransportClass"],"mappings":"gGA+BA;;;AAGG;MACU,QAAQ,CAAA;AACnB;;;;;AAKG;AACH,IAAA,OAAO,YAAY,CACjB,aAAkB,EAClB,OAAoD,EAAA;QAEpD,OAAO,QAAQ,CAAC,KAAK,CAAC;YACpB,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,iBAAiB,EAAE,aAAa,CAAC,iBAAiB;YAClD,qBAAqB,EAAE,aAAa,CAAC,qBAAqB;YAC1D,OAAO;AACR,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;IACH,OAAO,KAAK,CAAC,MAAuB,EAAA;AAClC,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,OAAO,EAAE,GAAG,MAAM;;;QAIvF,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAIA,YAAiB,EAAE;AAEnE,QAAA,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,YAAY,CAAC,gBAAgB;AACxF,QAAA,MAAM,WAAW,GACf,OAAO,EAAE,WAAW,IAAI,MAAM,CAAC,GAAG,EAAE,WAAW,IAAI,YAAY,CAAC,qBAAqB;;;QAIvF,IAAI,iBAAiB,EAAE;AACrB,YAAA,YAAY,CAAC,aAAa,CAAC,iBAAiB,CAAC;QAC/C;QACA,IAAI,qBAAqB,EAAE;AACzB,YAAA,YAAY,CAAC,cAAc,CAAC,qBAAqB,CAAC;QACpD;QAEA,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,KAAyB,EAAE,IAAI,KAAI;AACrE,YAAA,IAAI;AACF,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE;gBACjC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAkB,EAAE,QAAQ,CAAC;gBACnE,OAAO;AACL,oBAAA,IAAI,EAAE,CAAC;AACP,oBAAA,OAAO,EAAE,SAAS;AAClB,oBAAA,IAAI,EAAE,MAAM;iBACb;YACH;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO;AACL,oBAAA,IAAI,EAAG,KAAa,CAAC,IAAI,IAAI,GAAG;AAChC,oBAAA,OAAO,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC/D,oBAAA,IAAI,EAAE,IAAI;iBACX;YACH;AACF,QAAA,CAAC,CAAC;AAEF;;;;;;AAMG;QACH,IAAI,WAAW,EAAE;YACf,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAmB,EAAE,IAAI,KAAI;AACzD,gBAAA,IAAI;oBACF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAkB,CAAC,CAAC;;;oBAGpD,KAAK,CAAC,WAAW,GAAG;AAClB,wBAAA,IAAI,EAAE,CAAC;AACP,wBAAA,OAAO,EAAE,SAAS;AAClB,wBAAA,IAAI,EAAE,MAAM;qBACb;gBACH;gBAAE,OAAO,KAAK,EAAE;;;oBAGd,KAAK,CAAC,WAAW,GAAG;AAClB,wBAAA,IAAI,EAAG,KAAa,CAAC,IAAI,IAAI,GAAG;AAChC,wBAAA,OAAO,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC/D,wBAAA,IAAI,EAAE,IAAI;qBACX;gBACH;AACF,YAAA,CAAC,CAAC;QACJ;QAEA,OAAO;YACL,OAAO;YACP,WAAW;YACX,YAAY;SACb;IACH;AACD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ILogger } from '@/infrastructure/logger';
|
|
2
|
+
import type { WindowManagerApi, WindowCreationOptions } from './window-manager.type';
|
|
3
|
+
/**
|
|
4
|
+
* WindowCreator - Universal window creation helper class
|
|
5
|
+
* WindowCreator - 通用窗口创建辅助类
|
|
6
|
+
*
|
|
7
|
+
* Handles window creation, restoration, display, and exception recovery.
|
|
8
|
+
* 用于处理窗口创建、恢复、显示以及异常恢复逻辑。
|
|
9
|
+
*/
|
|
10
|
+
export default class WindowCreator<T = WindowCreationOptions> {
|
|
11
|
+
private api;
|
|
12
|
+
private data;
|
|
13
|
+
private winId;
|
|
14
|
+
private creator;
|
|
15
|
+
private extraOptions?;
|
|
16
|
+
private logger;
|
|
17
|
+
/**
|
|
18
|
+
* Constructor
|
|
19
|
+
* 构造函数
|
|
20
|
+
*
|
|
21
|
+
* @param api - WindowManager API interface (WindowManager API 接口)
|
|
22
|
+
* @param data - Data object passed to the window, including winId (传递给窗口的数据对象,包含 winId)
|
|
23
|
+
* @param creator - Window creation function (窗口创建函数)
|
|
24
|
+
* @param extraOptions - Optional function to generate extra configuration (可选的额外配置生成函数)
|
|
25
|
+
* @param logger - Optional logger instance (可选的日志实例)
|
|
26
|
+
*/
|
|
27
|
+
constructor(api: WindowManagerApi, data: {
|
|
28
|
+
data: T & {
|
|
29
|
+
winId?: string;
|
|
30
|
+
};
|
|
31
|
+
contentLoader?: (window: any, options: any) => Promise<void> | void;
|
|
32
|
+
}, creator: (options: WindowCreationOptions) => string | Promise<string>, extraOptions?: (data: T) => object, logger?: ILogger);
|
|
33
|
+
/**
|
|
34
|
+
* Internal method: Create window
|
|
35
|
+
* 内部方法:创建窗口
|
|
36
|
+
*
|
|
37
|
+
* Checks if window exists. If it exists but is destroyed, cleans up and recreates.
|
|
38
|
+
* 检查窗口是否存在。如果存在但已销毁,则清理并重新创建。
|
|
39
|
+
*
|
|
40
|
+
* @returns Object containing window ID and isNew flag (包含窗口 ID 和是否为新创建标志的对象)
|
|
41
|
+
*/
|
|
42
|
+
private createWindow;
|
|
43
|
+
/**
|
|
44
|
+
* Internal method: Show window
|
|
45
|
+
* 内部方法:显示窗口
|
|
46
|
+
*
|
|
47
|
+
* @param winId - Window ID (窗口 ID)
|
|
48
|
+
* @param isNew - Is newly created (是否为新创建)
|
|
49
|
+
*/
|
|
50
|
+
private showWindow;
|
|
51
|
+
/**
|
|
52
|
+
* Internal method: Load content
|
|
53
|
+
* 内部方法:加载内容
|
|
54
|
+
*/
|
|
55
|
+
private loadContent;
|
|
56
|
+
/**
|
|
57
|
+
* Create and show window
|
|
58
|
+
* 创建并显示窗口
|
|
59
|
+
*
|
|
60
|
+
* If window exists, restores and focuses it. If not, creates it.
|
|
61
|
+
* 如果窗口已存在则恢复并聚焦,如果不存在则创建。
|
|
62
|
+
*
|
|
63
|
+
* @returns Window ID (窗口 ID)
|
|
64
|
+
*/
|
|
65
|
+
createAndShow(): Promise<string>;
|
|
66
|
+
}
|