electron-infra-kit 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +302 -0
  3. package/README.zh-CN.md +308 -0
  4. package/dist/core/error/WindowError.d.ts +56 -0
  5. package/dist/core/error/WindowError.js +71 -0
  6. package/dist/core/error/WindowError.js.map +1 -0
  7. package/dist/core/error/WindowError.mjs +71 -0
  8. package/dist/core/error/WindowError.mjs.map +1 -0
  9. package/dist/core/ipc/IpcHandler.d.ts +48 -0
  10. package/dist/core/ipc/IpcHandler.js +59 -0
  11. package/dist/core/ipc/IpcHandler.js.map +1 -0
  12. package/dist/core/ipc/IpcHandler.mjs +59 -0
  13. package/dist/core/ipc/IpcHandler.mjs.map +1 -0
  14. package/dist/core/ipc/IpcRouter.d.ts +70 -0
  15. package/dist/core/ipc/IpcRouter.js +143 -0
  16. package/dist/core/ipc/IpcRouter.js.map +1 -0
  17. package/dist/core/ipc/IpcRouter.mjs +143 -0
  18. package/dist/core/ipc/IpcRouter.mjs.map +1 -0
  19. package/dist/core/ipc/index.d.ts +3 -0
  20. package/dist/core/ipc/index.js +1 -0
  21. package/dist/core/ipc/index.js.map +1 -0
  22. package/dist/core/ipc/index.mjs +1 -0
  23. package/dist/core/ipc/index.mjs.map +1 -0
  24. package/dist/core/ipc/ipc-router.type.d.ts +73 -0
  25. package/dist/core/ipc/transport/index.d.ts +65 -0
  26. package/dist/core/ipc/transport/index.js +229 -0
  27. package/dist/core/ipc/transport/index.js.map +1 -0
  28. package/dist/core/ipc/transport/index.mjs +229 -0
  29. package/dist/core/ipc/transport/index.mjs.map +1 -0
  30. package/dist/core/ipc/transport/ipc.type.d.ts +36 -0
  31. package/dist/core/lifecycle/LifecycleManager.d.ts +66 -0
  32. package/dist/core/lifecycle/LifecycleManager.js +140 -0
  33. package/dist/core/lifecycle/LifecycleManager.js.map +1 -0
  34. package/dist/core/lifecycle/LifecycleManager.mjs +140 -0
  35. package/dist/core/lifecycle/LifecycleManager.mjs.map +1 -0
  36. package/dist/core/message-bus/MessageBus.d.ts +282 -0
  37. package/dist/core/message-bus/MessageBus.js +677 -0
  38. package/dist/core/message-bus/MessageBus.js.map +1 -0
  39. package/dist/core/message-bus/MessageBus.mjs +677 -0
  40. package/dist/core/message-bus/MessageBus.mjs.map +1 -0
  41. package/dist/core/message-bus/MessageBusClient.d.ts +100 -0
  42. package/dist/core/message-bus/MessageBusClient.js +280 -0
  43. package/dist/core/message-bus/MessageBusClient.js.map +1 -0
  44. package/dist/core/message-bus/MessageBusClient.mjs +280 -0
  45. package/dist/core/message-bus/MessageBusClient.mjs.map +1 -0
  46. package/dist/core/message-bus/core/DataStoreManager.d.ts +51 -0
  47. package/dist/core/message-bus/core/DataStoreManager.js +94 -0
  48. package/dist/core/message-bus/core/DataStoreManager.js.map +1 -0
  49. package/dist/core/message-bus/core/DataStoreManager.mjs +94 -0
  50. package/dist/core/message-bus/core/DataStoreManager.mjs.map +1 -0
  51. package/dist/core/message-bus/core/ManagedPort.d.ts +26 -0
  52. package/dist/core/message-bus/core/ManagedPort.js +55 -0
  53. package/dist/core/message-bus/core/ManagedPort.js.map +1 -0
  54. package/dist/core/message-bus/core/ManagedPort.mjs +55 -0
  55. package/dist/core/message-bus/core/ManagedPort.mjs.map +1 -0
  56. package/dist/core/message-bus/core/PortManager.d.ts +47 -0
  57. package/dist/core/message-bus/core/PortManager.js +114 -0
  58. package/dist/core/message-bus/core/PortManager.js.map +1 -0
  59. package/dist/core/message-bus/core/PortManager.mjs +114 -0
  60. package/dist/core/message-bus/core/PortManager.mjs.map +1 -0
  61. package/dist/core/message-bus/core/SubscriptionManager.d.ts +36 -0
  62. package/dist/core/message-bus/core/SubscriptionManager.js +78 -0
  63. package/dist/core/message-bus/core/SubscriptionManager.js.map +1 -0
  64. package/dist/core/message-bus/core/SubscriptionManager.mjs +78 -0
  65. package/dist/core/message-bus/core/SubscriptionManager.mjs.map +1 -0
  66. package/dist/core/message-bus/core/TransactionManager.d.ts +54 -0
  67. package/dist/core/message-bus/core/TransactionManager.js +95 -0
  68. package/dist/core/message-bus/core/TransactionManager.js.map +1 -0
  69. package/dist/core/message-bus/core/TransactionManager.mjs +95 -0
  70. package/dist/core/message-bus/core/TransactionManager.mjs.map +1 -0
  71. package/dist/core/message-bus/core/index.d.ts +5 -0
  72. package/dist/core/message-bus/index.d.ts +4 -0
  73. package/dist/core/message-bus/index.js +1 -0
  74. package/dist/core/message-bus/index.js.map +1 -0
  75. package/dist/core/message-bus/index.mjs +1 -0
  76. package/dist/core/message-bus/index.mjs.map +1 -0
  77. package/dist/core/message-bus/message-bus.type.d.ts +143 -0
  78. package/dist/core/message-bus/message-bus.type.js +26 -0
  79. package/dist/core/message-bus/message-bus.type.js.map +1 -0
  80. package/dist/core/message-bus/message-bus.type.mjs +26 -0
  81. package/dist/core/message-bus/message-bus.type.mjs.map +1 -0
  82. package/dist/core/message-bus/preload.d.ts +16 -0
  83. package/dist/core/message-bus/preload.js +27 -0
  84. package/dist/core/message-bus/preload.js.map +1 -0
  85. package/dist/core/message-bus/preload.mjs +27 -0
  86. package/dist/core/message-bus/preload.mjs.map +1 -0
  87. package/dist/core/message-bus/transport/ITransport.d.ts +40 -0
  88. package/dist/core/message-bus/transport/IpcTransport.d.ts +18 -0
  89. package/dist/core/message-bus/transport/IpcTransport.js +60 -0
  90. package/dist/core/message-bus/transport/IpcTransport.js.map +1 -0
  91. package/dist/core/message-bus/transport/IpcTransport.mjs +60 -0
  92. package/dist/core/message-bus/transport/IpcTransport.mjs.map +1 -0
  93. package/dist/core/message-bus/transport/MessagePortTransport.d.ts +15 -0
  94. package/dist/core/message-bus/transport/MessagePortTransport.js +35 -0
  95. package/dist/core/message-bus/transport/MessagePortTransport.js.map +1 -0
  96. package/dist/core/message-bus/transport/MessagePortTransport.mjs +35 -0
  97. package/dist/core/message-bus/transport/MessagePortTransport.mjs.map +1 -0
  98. package/dist/core/message-bus/transport/index.d.ts +3 -0
  99. package/dist/core/window/IpcSetup.d.ts +50 -0
  100. package/dist/core/window/IpcSetup.js +96 -0
  101. package/dist/core/window/IpcSetup.js.map +1 -0
  102. package/dist/core/window/IpcSetup.mjs +96 -0
  103. package/dist/core/window/IpcSetup.mjs.map +1 -0
  104. package/dist/core/window/WindowCreator.d.ts +66 -0
  105. package/dist/core/window/WindowCreator.js +168 -0
  106. package/dist/core/window/WindowCreator.js.map +1 -0
  107. package/dist/core/window/WindowCreator.mjs +168 -0
  108. package/dist/core/window/WindowCreator.mjs.map +1 -0
  109. package/dist/core/window/WindowManager.d.ts +214 -0
  110. package/dist/core/window/WindowManager.js +583 -0
  111. package/dist/core/window/WindowManager.js.map +1 -0
  112. package/dist/core/window/WindowManager.mjs +583 -0
  113. package/dist/core/window/WindowManager.mjs.map +1 -0
  114. package/dist/core/window/WindowStore.d.ts +136 -0
  115. package/dist/core/window/WindowStore.js +436 -0
  116. package/dist/core/window/WindowStore.js.map +1 -0
  117. package/dist/core/window/WindowStore.mjs +436 -0
  118. package/dist/core/window/WindowStore.mjs.map +1 -0
  119. package/dist/core/window/constants.d.ts +17 -0
  120. package/dist/core/window/constants.js +15 -0
  121. package/dist/core/window/constants.js.map +1 -0
  122. package/dist/core/window/constants.mjs +15 -0
  123. package/dist/core/window/constants.mjs.map +1 -0
  124. package/dist/core/window/core/MetricsManager.d.ts +14 -0
  125. package/dist/core/window/core/MetricsManager.js +27 -0
  126. package/dist/core/window/core/MetricsManager.js.map +1 -0
  127. package/dist/core/window/core/MetricsManager.mjs +27 -0
  128. package/dist/core/window/core/MetricsManager.mjs.map +1 -0
  129. package/dist/core/window/core/PluginExecutor.d.ts +22 -0
  130. package/dist/core/window/core/PluginExecutor.js +110 -0
  131. package/dist/core/window/core/PluginExecutor.js.map +1 -0
  132. package/dist/core/window/core/PluginExecutor.mjs +110 -0
  133. package/dist/core/window/core/PluginExecutor.mjs.map +1 -0
  134. package/dist/core/window/core/WindowContextManager.d.ts +26 -0
  135. package/dist/core/window/core/WindowContextManager.js +59 -0
  136. package/dist/core/window/core/WindowContextManager.js.map +1 -0
  137. package/dist/core/window/core/WindowContextManager.mjs +59 -0
  138. package/dist/core/window/core/WindowContextManager.mjs.map +1 -0
  139. package/dist/core/window/core/WindowLifecycle.d.ts +15 -0
  140. package/dist/core/window/core/WindowLifecycle.js +150 -0
  141. package/dist/core/window/core/WindowLifecycle.js.map +1 -0
  142. package/dist/core/window/core/WindowLifecycle.mjs +150 -0
  143. package/dist/core/window/core/WindowLifecycle.mjs.map +1 -0
  144. package/dist/core/window/core/WindowOperator.d.ts +90 -0
  145. package/dist/core/window/core/WindowOperator.js +154 -0
  146. package/dist/core/window/core/WindowOperator.js.map +1 -0
  147. package/dist/core/window/core/WindowOperator.mjs +154 -0
  148. package/dist/core/window/core/WindowOperator.mjs.map +1 -0
  149. package/dist/core/window/core/WindowRegistry.d.ts +168 -0
  150. package/dist/core/window/core/WindowRegistry.js +331 -0
  151. package/dist/core/window/core/WindowRegistry.js.map +1 -0
  152. package/dist/core/window/core/WindowRegistry.mjs +331 -0
  153. package/dist/core/window/core/WindowRegistry.mjs.map +1 -0
  154. package/dist/core/window/core/WindowStateManager.d.ts +40 -0
  155. package/dist/core/window/core/WindowStateManager.js +110 -0
  156. package/dist/core/window/core/WindowStateManager.js.map +1 -0
  157. package/dist/core/window/core/WindowStateManager.mjs +110 -0
  158. package/dist/core/window/core/WindowStateManager.mjs.map +1 -0
  159. package/dist/core/window/index.d.ts +7 -0
  160. package/dist/core/window/index.js +1 -0
  161. package/dist/core/window/index.js.map +1 -0
  162. package/dist/core/window/index.mjs +1 -0
  163. package/dist/core/window/index.mjs.map +1 -0
  164. package/dist/core/window/window-manager.schema.d.ts +50 -0
  165. package/dist/core/window/window-manager.schema.js +87 -0
  166. package/dist/core/window/window-manager.schema.js.map +1 -0
  167. package/dist/core/window/window-manager.schema.mjs +87 -0
  168. package/dist/core/window/window-manager.schema.mjs.map +1 -0
  169. package/dist/core/window/window-manager.type.d.ts +365 -0
  170. package/dist/index.d.ts +25 -0
  171. package/dist/index.js +33 -0
  172. package/dist/index.js.map +1 -0
  173. package/dist/index.mjs +33 -0
  174. package/dist/index.mjs.map +1 -0
  175. package/dist/index.umd.js +1 -0
  176. package/dist/infrastructure/config/ConfigManager.d.ts +133 -0
  177. package/dist/infrastructure/config/ConfigManager.js +218 -0
  178. package/dist/infrastructure/config/ConfigManager.js.map +1 -0
  179. package/dist/infrastructure/config/ConfigManager.mjs +218 -0
  180. package/dist/infrastructure/config/ConfigManager.mjs.map +1 -0
  181. package/dist/infrastructure/config/index.d.ts +1 -0
  182. package/dist/infrastructure/debug/EnhancedDebugHelper.d.ts +106 -0
  183. package/dist/infrastructure/debug/EnhancedDebugHelper.js +218 -0
  184. package/dist/infrastructure/debug/EnhancedDebugHelper.js.map +1 -0
  185. package/dist/infrastructure/debug/EnhancedDebugHelper.mjs +218 -0
  186. package/dist/infrastructure/debug/EnhancedDebugHelper.mjs.map +1 -0
  187. package/dist/infrastructure/debug/PerformanceMonitor.d.ts +45 -0
  188. package/dist/infrastructure/debug/PerformanceMonitor.js +67 -0
  189. package/dist/infrastructure/debug/PerformanceMonitor.js.map +1 -0
  190. package/dist/infrastructure/debug/PerformanceMonitor.mjs +67 -0
  191. package/dist/infrastructure/debug/PerformanceMonitor.mjs.map +1 -0
  192. package/dist/infrastructure/debug/index.d.ts +22 -0
  193. package/dist/infrastructure/debug/index.js +47 -0
  194. package/dist/infrastructure/debug/index.js.map +1 -0
  195. package/dist/infrastructure/debug/index.mjs +47 -0
  196. package/dist/infrastructure/debug/index.mjs.map +1 -0
  197. package/dist/infrastructure/errors/ErrorCodes.d.ts +74 -0
  198. package/dist/infrastructure/errors/ErrorCodes.js +78 -0
  199. package/dist/infrastructure/errors/ErrorCodes.js.map +1 -0
  200. package/dist/infrastructure/errors/ErrorCodes.mjs +78 -0
  201. package/dist/infrastructure/errors/ErrorCodes.mjs.map +1 -0
  202. package/dist/infrastructure/errors/StandardError.d.ts +61 -0
  203. package/dist/infrastructure/errors/StandardError.js +84 -0
  204. package/dist/infrastructure/errors/StandardError.js.map +1 -0
  205. package/dist/infrastructure/errors/StandardError.mjs +84 -0
  206. package/dist/infrastructure/errors/StandardError.mjs.map +1 -0
  207. package/dist/infrastructure/errors/index.d.ts +13 -0
  208. package/dist/infrastructure/errors/index.js +24 -0
  209. package/dist/infrastructure/errors/index.js.map +1 -0
  210. package/dist/infrastructure/errors/index.mjs +24 -0
  211. package/dist/infrastructure/errors/index.mjs.map +1 -0
  212. package/dist/infrastructure/logger/ElectronLogger.d.ts +39 -0
  213. package/dist/infrastructure/logger/ElectronLogger.js +65 -0
  214. package/dist/infrastructure/logger/ElectronLogger.js.map +1 -0
  215. package/dist/infrastructure/logger/ElectronLogger.mjs +65 -0
  216. package/dist/infrastructure/logger/ElectronLogger.mjs.map +1 -0
  217. package/dist/infrastructure/logger/index.d.ts +2 -0
  218. package/dist/infrastructure/logger/logger.type.d.ts +8 -0
  219. package/dist/internal/types/BrandedTypes.d.ts +64 -0
  220. package/dist/internal/types/BrandedTypes.js +54 -0
  221. package/dist/internal/types/BrandedTypes.js.map +1 -0
  222. package/dist/internal/types/BrandedTypes.mjs +54 -0
  223. package/dist/internal/types/BrandedTypes.mjs.map +1 -0
  224. package/dist/internal/types/PerformanceOptions.d.ts +87 -0
  225. package/dist/internal/types/branded.d.ts +42 -0
  226. package/dist/internal/utils/MessageDispatcher.d.ts +67 -0
  227. package/dist/internal/utils/MessageDispatcher.js +96 -0
  228. package/dist/internal/utils/MessageDispatcher.js.map +1 -0
  229. package/dist/internal/utils/MessageDispatcher.mjs +96 -0
  230. package/dist/internal/utils/MessageDispatcher.mjs.map +1 -0
  231. package/dist/internal/utils/RateLimiter.d.ts +41 -0
  232. package/dist/internal/utils/RateLimiter.js +83 -0
  233. package/dist/internal/utils/RateLimiter.js.map +1 -0
  234. package/dist/internal/utils/RateLimiter.mjs +83 -0
  235. package/dist/internal/utils/RateLimiter.mjs.map +1 -0
  236. package/dist/internal/utils/StateKeeper.d.ts +125 -0
  237. package/dist/internal/utils/StateKeeper.js +334 -0
  238. package/dist/internal/utils/StateKeeper.js.map +1 -0
  239. package/dist/internal/utils/StateKeeper.mjs +334 -0
  240. package/dist/internal/utils/StateKeeper.mjs.map +1 -0
  241. package/dist/internal/utils/branded-helpers.d.ts +33 -0
  242. package/dist/internal/utils/index.d.ts +5 -0
  243. package/dist/preload/index.d.ts +45 -0
  244. package/dist/preload/index.js +91 -0
  245. package/dist/preload/index.js.map +1 -0
  246. package/dist/preload/index.mjs +91 -0
  247. package/dist/preload/index.mjs.map +1 -0
  248. package/dist/preload/preload.type.d.ts +15 -0
  249. package/dist/types.d.ts +7 -0
  250. package/dist/types.js +1 -0
  251. package/dist/types.js.map +1 -0
  252. package/dist/types.mjs +1 -0
  253. package/dist/types.mjs.map +1 -0
  254. package/package.json +143 -0
@@ -0,0 +1,280 @@
1
+ import {v4}from'uuid';import {MessageProtocolType}from'./message-bus.type.mjs';import {ElectronLogger}from'../../infrastructure/logger/ElectronLogger.mjs';/**
2
+ * MessageBusClient - Simplified client for renderer process
3
+ * MessageBusClient - 渲染进程的简化客户端
4
+ *
5
+ * Provides a high-level API for interacting with MessageBus from renderer
6
+ * 为渲染进程提供与 MessageBus 交互的高级 API
7
+ */
8
+ class MessageBusClient {
9
+ port = null;
10
+ ready = false;
11
+ pendingOperations = [];
12
+ subscriptions = new Map();
13
+ messageListeners = new Map();
14
+ pendingRequests = new Map();
15
+ logger;
16
+ constructor(options = {}) {
17
+ this.logger = options.logger || new ElectronLogger({ appName: 'MessageBusClient' });
18
+ this.initialize();
19
+ }
20
+ /**
21
+ * Subscribe to a key's changes
22
+ * 订阅某个 key 的变化
23
+ * @param key - Data key (数据键)
24
+ * @param callback - Callback function (回调函数)
25
+ * @returns Unsubscribe function (取消订阅函数)
26
+ */
27
+ subscribe(key, callback) {
28
+ if (!this.subscriptions.has(key)) {
29
+ this.subscriptions.set(key, new Set());
30
+ // Notify main process to subscribe to this key
31
+ this.ensureReady(() => {
32
+ this.port.postMessage(JSON.stringify({
33
+ type: MessageProtocolType.SUBSCRIBE,
34
+ keys: [key],
35
+ }));
36
+ });
37
+ }
38
+ this.subscriptions.get(key).add(callback);
39
+ // Return unsubscribe function
40
+ // 返回取消订阅函数
41
+ return () => {
42
+ this.subscriptions.get(key)?.delete(callback);
43
+ if (this.subscriptions.get(key)?.size === 0) {
44
+ this.subscriptions.delete(key);
45
+ // Notify main process to unsubscribe from this key
46
+ this.ensureReady(() => {
47
+ this.port.postMessage(JSON.stringify({
48
+ type: MessageProtocolType.UNSUBSCRIBE,
49
+ keys: [key],
50
+ }));
51
+ });
52
+ }
53
+ };
54
+ }
55
+ /**
56
+ * Watch for data changes (Alias for subscribe)
57
+ * 监听数据变化(subscribe 的别名)
58
+ * @param key - Data key (数据键)
59
+ * @param callback - Callback function (回调函数)
60
+ * @returns Unsubscribe function (取消订阅函数)
61
+ */
62
+ watch(key, callback) {
63
+ return this.subscribe(key, callback);
64
+ }
65
+ /**
66
+ * Listen for P2P messages on a channel
67
+ * 监听频道上的 P2P 消息
68
+ * @param channel - Channel name (频道名称)
69
+ * @param callback - Callback function (回调函数)
70
+ * @returns Unsubscribe function (取消订阅函数)
71
+ */
72
+ onMessage(channel, callback) {
73
+ if (!this.messageListeners.has(channel)) {
74
+ this.messageListeners.set(channel, new Set());
75
+ }
76
+ this.messageListeners.get(channel).add(callback);
77
+ return () => {
78
+ this.messageListeners.get(channel)?.delete(callback);
79
+ if (this.messageListeners.get(channel)?.size === 0) {
80
+ this.messageListeners.delete(channel);
81
+ }
82
+ };
83
+ }
84
+ /**
85
+ * Send message to a specific window
86
+ * 发送消息到指定窗口
87
+ * @param targetWindowId - Target window ID (目标窗口 ID)
88
+ * @param channel - Channel name (频道名称)
89
+ * @param data - Message data (消息数据)
90
+ */
91
+ sendToWindow(targetWindowId, channel, data) {
92
+ this.ensureReady(() => {
93
+ this.port.postMessage(JSON.stringify({
94
+ type: MessageProtocolType.SEND_TO_WINDOW,
95
+ targetWindowId,
96
+ channel,
97
+ data,
98
+ }));
99
+ });
100
+ }
101
+ /**
102
+ * Send message to a group of windows
103
+ * 发送消息到一组窗口
104
+ * @param group - Group name (组名)
105
+ * @param channel - Channel name (频道名称)
106
+ * @param data - Message data (消息数据)
107
+ */
108
+ sendToGroup(group, channel, data) {
109
+ this.ensureReady(() => {
110
+ this.port.postMessage(JSON.stringify({
111
+ type: MessageProtocolType.SEND_TO_GROUP,
112
+ group,
113
+ channel,
114
+ data,
115
+ }));
116
+ });
117
+ }
118
+ /**
119
+ * Set a value
120
+ * 设置值
121
+ * @param key - Data key (数据键)
122
+ * @param value - Data value (数据值)
123
+ */
124
+ set(key, value) {
125
+ this.ensureReady(() => {
126
+ this.port.postMessage(JSON.stringify({
127
+ type: MessageProtocolType.SET,
128
+ key,
129
+ value,
130
+ }));
131
+ });
132
+ }
133
+ /**
134
+ * Get a value (async)
135
+ * 获取值(异步)
136
+ * @param key - Data key (数据键)
137
+ * @returns Promise with the value (包含值的 Promise)
138
+ */
139
+ async get(key) {
140
+ return new Promise((resolve) => {
141
+ this.ensureReady(() => {
142
+ const requestId = v4();
143
+ // Register request
144
+ const timeout = setTimeout(() => {
145
+ if (this.pendingRequests.has(requestId)) {
146
+ this.pendingRequests.delete(requestId);
147
+ this.logger.warn(`Get request for key "${key}" timed out`);
148
+ resolve(undefined);
149
+ }
150
+ }, 5000);
151
+ this.pendingRequests.set(requestId, { resolve, timeout });
152
+ // Send get request
153
+ // 发送获取请求
154
+ this.port.postMessage(JSON.stringify({
155
+ type: MessageProtocolType.GET,
156
+ key,
157
+ requestId,
158
+ }));
159
+ });
160
+ });
161
+ }
162
+ /**
163
+ * Delete a value
164
+ * 删除值
165
+ * @param key - Data key (数据键)
166
+ */
167
+ delete(key) {
168
+ this.ensureReady(() => {
169
+ this.port.postMessage(JSON.stringify({
170
+ type: MessageProtocolType.DELETE,
171
+ key,
172
+ }));
173
+ });
174
+ }
175
+ /**
176
+ * Initialize the message port connection
177
+ * 初始化消息端口连接
178
+ */
179
+ initialize() {
180
+ window.addEventListener('message', (event) => {
181
+ if (event.data?.type === MessageProtocolType.CONNECT) {
182
+ this.port = event.ports[0];
183
+ this.port.onmessage = this.handleMessage.bind(this);
184
+ this.port.start();
185
+ this.ready = true;
186
+ this.logger.debug('MessageBusClient connected');
187
+ // Execute pending operations
188
+ // 执行待处理的操作
189
+ this.pendingOperations.forEach((op) => op());
190
+ this.pendingOperations = [];
191
+ }
192
+ });
193
+ }
194
+ /**
195
+ * Handle incoming messages
196
+ * 处理传入的消息
197
+ */
198
+ handleMessage(e) {
199
+ try {
200
+ const msg = JSON.parse(e.data);
201
+ // Handle get responses
202
+ // 处理获取响应
203
+ if (msg.type === MessageProtocolType.GET_RESPONSE && msg.requestId) {
204
+ const request = this.pendingRequests.get(msg.requestId);
205
+ if (request) {
206
+ clearTimeout(request.timeout);
207
+ this.pendingRequests.delete(msg.requestId);
208
+ request.resolve(msg.value);
209
+ }
210
+ return;
211
+ }
212
+ // Handle P2P messages
213
+ // 处理 P2P 消息
214
+ if (msg.type === 'message' && msg.channel) {
215
+ const listeners = this.messageListeners.get(msg.channel);
216
+ if (listeners) {
217
+ listeners.forEach((cb) => {
218
+ try {
219
+ cb(msg.value);
220
+ }
221
+ catch (error) {
222
+ this.logger.error(`Error in message listener for channel "${msg.channel}": ${error}`);
223
+ }
224
+ });
225
+ }
226
+ return;
227
+ }
228
+ // Notify all subscribers for this key
229
+ // 通知该键的所有订阅者
230
+ if (msg.key &&
231
+ (msg.type === MessageProtocolType.SET || msg.type === MessageProtocolType.DELETE)) {
232
+ const callbacks = this.subscriptions.get(msg.key);
233
+ if (callbacks) {
234
+ callbacks.forEach((cb) => {
235
+ try {
236
+ cb(msg.value);
237
+ }
238
+ catch (error) {
239
+ this.logger.error(`Error in subscription callback for key "${msg.key}": ${error}`);
240
+ }
241
+ });
242
+ }
243
+ }
244
+ }
245
+ catch (error) {
246
+ this.logger.error(`Failed to handle message: ${error}`);
247
+ }
248
+ }
249
+ /**
250
+ * Ensure the port is ready before executing operation
251
+ * 确保端口就绪后再执行操作
252
+ */
253
+ ensureReady(fn) {
254
+ if (this.ready) {
255
+ fn();
256
+ }
257
+ else {
258
+ this.pendingOperations.push(fn);
259
+ }
260
+ }
261
+ /**
262
+ * Dispose the client
263
+ * 释放客户端
264
+ */
265
+ dispose() {
266
+ if (this.port) {
267
+ this.port.close();
268
+ this.port = null;
269
+ }
270
+ this.subscriptions.clear();
271
+ this.pendingOperations = [];
272
+ // Clear pending requests
273
+ this.pendingRequests.forEach((req) => {
274
+ clearTimeout(req.timeout);
275
+ req.resolve(undefined);
276
+ });
277
+ this.pendingRequests.clear();
278
+ this.ready = false;
279
+ }
280
+ }export{MessageBusClient};//# sourceMappingURL=MessageBusClient.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBusClient.mjs","sources":["../../../src/core/message-bus/MessageBusClient.ts"],"sourcesContent":["import { ILogger, Logger } from '@/infrastructure/logger';\nimport { v4 as uuidv4 } from 'uuid';\nimport { MessageProtocolType } from './message-bus.type';\n\n/**\n * MessageBusClient - Simplified client for renderer process\n * MessageBusClient - 渲染进程的简化客户端\n *\n * Provides a high-level API for interacting with MessageBus from renderer\n * 为渲染进程提供与 MessageBus 交互的高级 API\n */\nexport class MessageBusClient {\n private port: MessagePort | null = null;\n private ready = false;\n private pendingOperations: (() => void)[] = [];\n private subscriptions = new Map<string, Set<(value: any) => void>>();\n private messageListeners = new Map<string, Set<(data: any) => void>>();\n private pendingRequests = new Map<string, { resolve: (value: any) => void; timeout: any }>();\n private logger: ILogger;\n\n constructor(options: { logger?: ILogger } = {}) {\n this.logger = options.logger || new Logger({ appName: 'MessageBusClient' });\n this.initialize();\n }\n\n /**\n * Subscribe to a key's changes\n * 订阅某个 key 的变化\n * @param key - Data key (数据键)\n * @param callback - Callback function (回调函数)\n * @returns Unsubscribe function (取消订阅函数)\n */\n subscribe<T = any>(key: string, callback: (value: T) => void): () => void {\n if (!this.subscriptions.has(key)) {\n this.subscriptions.set(key, new Set());\n // Notify main process to subscribe to this key\n this.ensureReady(() => {\n this.port!.postMessage(\n JSON.stringify({\n type: MessageProtocolType.SUBSCRIBE,\n keys: [key],\n })\n );\n });\n }\n\n this.subscriptions.get(key)!.add(callback);\n\n // Return unsubscribe function\n // 返回取消订阅函数\n return () => {\n this.subscriptions.get(key)?.delete(callback);\n if (this.subscriptions.get(key)?.size === 0) {\n this.subscriptions.delete(key);\n // Notify main process to unsubscribe from this key\n this.ensureReady(() => {\n this.port!.postMessage(\n JSON.stringify({\n type: MessageProtocolType.UNSUBSCRIBE,\n keys: [key],\n })\n );\n });\n }\n };\n }\n\n /**\n * Watch for data changes (Alias for subscribe)\n * 监听数据变化(subscribe 的别名)\n * @param key - Data key (数据键)\n * @param callback - Callback function (回调函数)\n * @returns Unsubscribe function (取消订阅函数)\n */\n watch<T = any>(key: string, callback: (value: T) => void): () => void {\n return this.subscribe<T>(key, callback);\n }\n\n /**\n * Listen for P2P messages on a channel\n * 监听频道上的 P2P 消息\n * @param channel - Channel name (频道名称)\n * @param callback - Callback function (回调函数)\n * @returns Unsubscribe function (取消订阅函数)\n */\n onMessage<T = any>(channel: string, callback: (data: T) => void): () => void {\n if (!this.messageListeners.has(channel)) {\n this.messageListeners.set(channel, new Set());\n }\n\n this.messageListeners.get(channel)!.add(callback);\n\n return () => {\n this.messageListeners.get(channel)?.delete(callback);\n if (this.messageListeners.get(channel)?.size === 0) {\n this.messageListeners.delete(channel);\n }\n };\n }\n\n /**\n * Send message to a specific window\n * 发送消息到指定窗口\n * @param targetWindowId - Target window ID (目标窗口 ID)\n * @param channel - Channel name (频道名称)\n * @param data - Message data (消息数据)\n */\n sendToWindow(targetWindowId: string, channel: string, data: any): void {\n this.ensureReady(() => {\n this.port!.postMessage(\n JSON.stringify({\n type: MessageProtocolType.SEND_TO_WINDOW,\n targetWindowId,\n channel,\n data,\n })\n );\n });\n }\n\n /**\n * Send message to a group of windows\n * 发送消息到一组窗口\n * @param group - Group name (组名)\n * @param channel - Channel name (频道名称)\n * @param data - Message data (消息数据)\n */\n sendToGroup(group: string, channel: string, data: any): void {\n this.ensureReady(() => {\n this.port!.postMessage(\n JSON.stringify({\n type: MessageProtocolType.SEND_TO_GROUP,\n group,\n channel,\n data,\n })\n );\n });\n }\n\n /**\n * Set a value\n * 设置值\n * @param key - Data key (数据键)\n * @param value - Data value (数据值)\n */\n set(key: string, value: any): void {\n this.ensureReady(() => {\n this.port!.postMessage(\n JSON.stringify({\n type: MessageProtocolType.SET,\n key,\n value,\n })\n );\n });\n }\n\n /**\n * Get a value (async)\n * 获取值(异步)\n * @param key - Data key (数据键)\n * @returns Promise with the value (包含值的 Promise)\n */\n async get<T = any>(key: string): Promise<T | undefined> {\n return new Promise((resolve) => {\n this.ensureReady(() => {\n const requestId = uuidv4();\n\n // Register request\n const timeout = setTimeout(() => {\n if (this.pendingRequests.has(requestId)) {\n this.pendingRequests.delete(requestId);\n this.logger.warn(`Get request for key \"${key}\" timed out`);\n resolve(undefined);\n }\n }, 5000);\n\n this.pendingRequests.set(requestId, { resolve, timeout });\n\n // Send get request\n // 发送获取请求\n this.port!.postMessage(\n JSON.stringify({\n type: MessageProtocolType.GET,\n key,\n requestId,\n })\n );\n });\n });\n }\n\n /**\n * Delete a value\n * 删除值\n * @param key - Data key (数据键)\n */\n delete(key: string): void {\n this.ensureReady(() => {\n this.port!.postMessage(\n JSON.stringify({\n type: MessageProtocolType.DELETE,\n key,\n })\n );\n });\n }\n\n /**\n * Initialize the message port connection\n * 初始化消息端口连接\n */\n private initialize(): void {\n window.addEventListener('message', (event) => {\n if (event.data?.type === MessageProtocolType.CONNECT) {\n this.port = event.ports[0];\n this.port.onmessage = this.handleMessage.bind(this);\n this.port.start();\n this.ready = true;\n\n this.logger.debug('MessageBusClient connected');\n\n // Execute pending operations\n // 执行待处理的操作\n this.pendingOperations.forEach((op) => op());\n this.pendingOperations = [];\n }\n });\n }\n\n /**\n * Handle incoming messages\n * 处理传入的消息\n */\n private handleMessage(e: MessageEvent): void {\n try {\n const msg = JSON.parse(e.data);\n\n // Handle get responses\n // 处理获取响应\n if (msg.type === MessageProtocolType.GET_RESPONSE && msg.requestId) {\n const request = this.pendingRequests.get(msg.requestId);\n if (request) {\n clearTimeout(request.timeout);\n this.pendingRequests.delete(msg.requestId);\n request.resolve(msg.value);\n }\n return;\n }\n\n // Handle P2P messages\n // 处理 P2P 消息\n if (msg.type === 'message' && msg.channel) {\n const listeners = this.messageListeners.get(msg.channel);\n if (listeners) {\n listeners.forEach((cb) => {\n try {\n cb(msg.value);\n } catch (error) {\n this.logger.error(`Error in message listener for channel \"${msg.channel}\": ${error}`);\n }\n });\n }\n return;\n }\n\n // Notify all subscribers for this key\n // 通知该键的所有订阅者\n if (\n msg.key &&\n (msg.type === MessageProtocolType.SET || msg.type === MessageProtocolType.DELETE)\n ) {\n const callbacks = this.subscriptions.get(msg.key);\n if (callbacks) {\n callbacks.forEach((cb) => {\n try {\n cb(msg.value);\n } catch (error) {\n this.logger.error(`Error in subscription callback for key \"${msg.key}\": ${error}`);\n }\n });\n }\n }\n } catch (error) {\n this.logger.error(`Failed to handle message: ${error}`);\n }\n }\n\n /**\n * Ensure the port is ready before executing operation\n * 确保端口就绪后再执行操作\n */\n private ensureReady(fn: () => void): void {\n if (this.ready) {\n fn();\n } else {\n this.pendingOperations.push(fn);\n }\n }\n\n /**\n * Dispose the client\n * 释放客户端\n */\n dispose(): void {\n if (this.port) {\n this.port.close();\n this.port = null;\n }\n this.subscriptions.clear();\n this.pendingOperations = [];\n\n // Clear pending requests\n this.pendingRequests.forEach((req) => {\n clearTimeout(req.timeout);\n req.resolve(undefined);\n });\n this.pendingRequests.clear();\n\n this.ready = false;\n }\n}\n"],"names":["Logger","uuidv4"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { DataStoreItem, FieldPermission } from '../message-bus.type';
2
+ /**
3
+ * DataStoreManager - Manages the shared data state and permissions
4
+ * DataStoreManager - 管理共享数据状态和权限
5
+ */
6
+ export declare class DataStoreManager {
7
+ private dataStore;
8
+ /**
9
+ * Get data value
10
+ * 获取数据值
11
+ */
12
+ get(key: string): any;
13
+ /**
14
+ * Get item (including permission)
15
+ * 获取项(包含权限)
16
+ */
17
+ getItem(key: string): DataStoreItem | undefined;
18
+ /**
19
+ * Get all data as object
20
+ * 获取所有数据对象
21
+ */
22
+ getAll(): Record<string, any>;
23
+ /**
24
+ * Set data value
25
+ * 设置数据值
26
+ */
27
+ set(key: string, value: any): void;
28
+ /**
29
+ * Delete data
30
+ * 删除数据
31
+ */
32
+ delete(key: string): void;
33
+ /**
34
+ * Check permission
35
+ * 检查权限
36
+ */
37
+ checkPermission(key: string, windowId: string | undefined, operation: 'modify' | 'delete'): {
38
+ success: boolean;
39
+ error?: string;
40
+ };
41
+ /**
42
+ * Set field permission
43
+ * 设置字段权限
44
+ */
45
+ setPermission(key: string, permission: FieldPermission): void;
46
+ /**
47
+ * Clear all data
48
+ * 清除所有数据
49
+ */
50
+ clear(): void;
51
+ }
@@ -0,0 +1,94 @@
1
+ 'use strict';/**
2
+ * DataStoreManager - Manages the shared data state and permissions
3
+ * DataStoreManager - 管理共享数据状态和权限
4
+ */
5
+ class DataStoreManager {
6
+ dataStore = new Map();
7
+ /**
8
+ * Get data value
9
+ * 获取数据值
10
+ */
11
+ get(key) {
12
+ return this.dataStore.get(key)?.value;
13
+ }
14
+ /**
15
+ * Get item (including permission)
16
+ * 获取项(包含权限)
17
+ */
18
+ getItem(key) {
19
+ return this.dataStore.get(key);
20
+ }
21
+ /**
22
+ * Get all data as object
23
+ * 获取所有数据对象
24
+ */
25
+ getAll() {
26
+ const result = {};
27
+ this.dataStore.forEach((item, k) => {
28
+ result[k] = item.value;
29
+ });
30
+ return result;
31
+ }
32
+ /**
33
+ * Set data value
34
+ * 设置数据值
35
+ */
36
+ set(key, value) {
37
+ const item = this.dataStore.get(key);
38
+ this.dataStore.set(key, {
39
+ value,
40
+ permission: item?.permission,
41
+ });
42
+ }
43
+ /**
44
+ * Delete data
45
+ * 删除数据
46
+ */
47
+ delete(key) {
48
+ this.dataStore.delete(key);
49
+ }
50
+ /**
51
+ * Check permission
52
+ * 检查权限
53
+ */
54
+ checkPermission(key, windowId, operation) {
55
+ const item = this.dataStore.get(key);
56
+ if (item?.permission) {
57
+ // Normalize permission to object if it's a string
58
+ // 如果权限是字符串,则将其标准化为对象
59
+ const permission = typeof item.permission === 'string' ? { mode: item.permission } : item.permission;
60
+ if (permission.readonly) {
61
+ return { success: false, error: `Field "${key}" is readonly` };
62
+ }
63
+ if (permission.allowedWindows && windowId) {
64
+ if (!permission.allowedWindows.includes(windowId)) {
65
+ return {
66
+ success: false,
67
+ error: `Window "${windowId}" is not allowed to ${operation} "${key}"`,
68
+ };
69
+ }
70
+ }
71
+ }
72
+ return { success: true };
73
+ }
74
+ /**
75
+ * Set field permission
76
+ * 设置字段权限
77
+ */
78
+ setPermission(key, permission) {
79
+ const item = this.dataStore.get(key);
80
+ if (item) {
81
+ item.permission = permission;
82
+ }
83
+ else {
84
+ this.dataStore.set(key, { value: undefined, permission });
85
+ }
86
+ }
87
+ /**
88
+ * Clear all data
89
+ * 清除所有数据
90
+ */
91
+ clear() {
92
+ this.dataStore.clear();
93
+ }
94
+ }exports.DataStoreManager=DataStoreManager;//# sourceMappingURL=DataStoreManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataStoreManager.js","sources":["../../../../src/core/message-bus/core/DataStoreManager.ts"],"sourcesContent":["import { DataStoreItem, FieldPermission } from '../message-bus.type';\n\n/**\n * DataStoreManager - Manages the shared data state and permissions\n * DataStoreManager - 管理共享数据状态和权限\n */\nexport class DataStoreManager {\n private dataStore: Map<string, DataStoreItem> = new Map();\n\n /**\n * Get data value\n * 获取数据值\n */\n get(key: string): any {\n return this.dataStore.get(key)?.value;\n }\n\n /**\n * Get item (including permission)\n * 获取项(包含权限)\n */\n getItem(key: string): DataStoreItem | undefined {\n return this.dataStore.get(key);\n }\n\n /**\n * Get all data as object\n * 获取所有数据对象\n */\n getAll(): Record<string, any> {\n const result: Record<string, any> = {};\n this.dataStore.forEach((item, k) => {\n result[k] = item.value;\n });\n return result;\n }\n\n /**\n * Set data value\n * 设置数据值\n */\n set(key: string, value: any): void {\n const item = this.dataStore.get(key);\n this.dataStore.set(key, {\n value,\n permission: item?.permission,\n });\n }\n\n /**\n * Delete data\n * 删除数据\n */\n delete(key: string): void {\n this.dataStore.delete(key);\n }\n\n /**\n * Check permission\n * 检查权限\n */\n checkPermission(\n key: string,\n windowId: string | undefined,\n operation: 'modify' | 'delete'\n ): { success: boolean; error?: string } {\n const item = this.dataStore.get(key);\n\n if (item?.permission) {\n // Normalize permission to object if it's a string\n // 如果权限是字符串,则将其标准化为对象\n const permission =\n typeof item.permission === 'string' ? { mode: item.permission } : item.permission;\n\n if (permission.readonly) {\n return { success: false, error: `Field \"${key}\" is readonly` };\n }\n\n if (permission.allowedWindows && windowId) {\n if (!permission.allowedWindows.includes(windowId)) {\n return {\n success: false,\n error: `Window \"${windowId}\" is not allowed to ${operation} \"${key}\"`,\n };\n }\n }\n }\n\n return { success: true };\n }\n\n /**\n * Set field permission\n * 设置字段权限\n */\n setPermission(key: string, permission: FieldPermission): void {\n const item = this.dataStore.get(key);\n if (item) {\n item.permission = permission;\n } else {\n this.dataStore.set(key, { value: undefined, permission });\n }\n }\n\n /**\n * Clear all data\n * 清除所有数据\n */\n clear(): void {\n this.dataStore.clear();\n }\n}\n"],"names":[],"mappings":"aAEA;;;AAGG;MACU,gBAAgB,CAAA;AACnB,IAAA,SAAS,GAA+B,IAAI,GAAG,EAAE;AAEzD;;;AAGG;AACH,IAAA,GAAG,CAAC,GAAW,EAAA;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK;IACvC;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,GAAW,EAAA;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC;AAEA;;;AAGG;IACH,MAAM,GAAA;QACJ,MAAM,MAAM,GAAwB,EAAE;QACtC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AACjC,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;AACxB,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,MAAM;IACf;AAEA;;;AAGG;IACH,GAAG,CAAC,GAAW,EAAE,KAAU,EAAA;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACpC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE;YACtB,KAAK;YACL,UAAU,EAAE,IAAI,EAAE,UAAU;AAC7B,SAAA,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;IAC5B;AAEA;;;AAGG;AACH,IAAA,eAAe,CACb,GAAW,EACX,QAA4B,EAC5B,SAA8B,EAAA;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAEpC,QAAA,IAAI,IAAI,EAAE,UAAU,EAAE;;;YAGpB,MAAM,UAAU,GACd,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,UAAU;AAEnF,YAAA,IAAI,UAAU,CAAC,QAAQ,EAAE;gBACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA,OAAA,EAAU,GAAG,CAAA,aAAA,CAAe,EAAE;YAChE;AAEA,YAAA,IAAI,UAAU,CAAC,cAAc,IAAI,QAAQ,EAAE;gBACzC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBACjD,OAAO;AACL,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,CAAA,QAAA,EAAW,QAAQ,uBAAuB,SAAS,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG;qBACtE;gBACH;YACF;QACF;AAEA,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1B;AAEA;;;AAGG;IACH,aAAa,CAAC,GAAW,EAAE,UAA2B,EAAA;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;QACpC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,UAAU,GAAG,UAAU;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;QAC3D;IACF;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;AACD"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * DataStoreManager - Manages the shared data state and permissions
3
+ * DataStoreManager - 管理共享数据状态和权限
4
+ */
5
+ class DataStoreManager {
6
+ dataStore = new Map();
7
+ /**
8
+ * Get data value
9
+ * 获取数据值
10
+ */
11
+ get(key) {
12
+ return this.dataStore.get(key)?.value;
13
+ }
14
+ /**
15
+ * Get item (including permission)
16
+ * 获取项(包含权限)
17
+ */
18
+ getItem(key) {
19
+ return this.dataStore.get(key);
20
+ }
21
+ /**
22
+ * Get all data as object
23
+ * 获取所有数据对象
24
+ */
25
+ getAll() {
26
+ const result = {};
27
+ this.dataStore.forEach((item, k) => {
28
+ result[k] = item.value;
29
+ });
30
+ return result;
31
+ }
32
+ /**
33
+ * Set data value
34
+ * 设置数据值
35
+ */
36
+ set(key, value) {
37
+ const item = this.dataStore.get(key);
38
+ this.dataStore.set(key, {
39
+ value,
40
+ permission: item?.permission,
41
+ });
42
+ }
43
+ /**
44
+ * Delete data
45
+ * 删除数据
46
+ */
47
+ delete(key) {
48
+ this.dataStore.delete(key);
49
+ }
50
+ /**
51
+ * Check permission
52
+ * 检查权限
53
+ */
54
+ checkPermission(key, windowId, operation) {
55
+ const item = this.dataStore.get(key);
56
+ if (item?.permission) {
57
+ // Normalize permission to object if it's a string
58
+ // 如果权限是字符串,则将其标准化为对象
59
+ const permission = typeof item.permission === 'string' ? { mode: item.permission } : item.permission;
60
+ if (permission.readonly) {
61
+ return { success: false, error: `Field "${key}" is readonly` };
62
+ }
63
+ if (permission.allowedWindows && windowId) {
64
+ if (!permission.allowedWindows.includes(windowId)) {
65
+ return {
66
+ success: false,
67
+ error: `Window "${windowId}" is not allowed to ${operation} "${key}"`,
68
+ };
69
+ }
70
+ }
71
+ }
72
+ return { success: true };
73
+ }
74
+ /**
75
+ * Set field permission
76
+ * 设置字段权限
77
+ */
78
+ setPermission(key, permission) {
79
+ const item = this.dataStore.get(key);
80
+ if (item) {
81
+ item.permission = permission;
82
+ }
83
+ else {
84
+ this.dataStore.set(key, { value: undefined, permission });
85
+ }
86
+ }
87
+ /**
88
+ * Clear all data
89
+ * 清除所有数据
90
+ */
91
+ clear() {
92
+ this.dataStore.clear();
93
+ }
94
+ }export{DataStoreManager};//# sourceMappingURL=DataStoreManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataStoreManager.mjs","sources":["../../../../src/core/message-bus/core/DataStoreManager.ts"],"sourcesContent":["import { DataStoreItem, FieldPermission } from '../message-bus.type';\n\n/**\n * DataStoreManager - Manages the shared data state and permissions\n * DataStoreManager - 管理共享数据状态和权限\n */\nexport class DataStoreManager {\n private dataStore: Map<string, DataStoreItem> = new Map();\n\n /**\n * Get data value\n * 获取数据值\n */\n get(key: string): any {\n return this.dataStore.get(key)?.value;\n }\n\n /**\n * Get item (including permission)\n * 获取项(包含权限)\n */\n getItem(key: string): DataStoreItem | undefined {\n return this.dataStore.get(key);\n }\n\n /**\n * Get all data as object\n * 获取所有数据对象\n */\n getAll(): Record<string, any> {\n const result: Record<string, any> = {};\n this.dataStore.forEach((item, k) => {\n result[k] = item.value;\n });\n return result;\n }\n\n /**\n * Set data value\n * 设置数据值\n */\n set(key: string, value: any): void {\n const item = this.dataStore.get(key);\n this.dataStore.set(key, {\n value,\n permission: item?.permission,\n });\n }\n\n /**\n * Delete data\n * 删除数据\n */\n delete(key: string): void {\n this.dataStore.delete(key);\n }\n\n /**\n * Check permission\n * 检查权限\n */\n checkPermission(\n key: string,\n windowId: string | undefined,\n operation: 'modify' | 'delete'\n ): { success: boolean; error?: string } {\n const item = this.dataStore.get(key);\n\n if (item?.permission) {\n // Normalize permission to object if it's a string\n // 如果权限是字符串,则将其标准化为对象\n const permission =\n typeof item.permission === 'string' ? { mode: item.permission } : item.permission;\n\n if (permission.readonly) {\n return { success: false, error: `Field \"${key}\" is readonly` };\n }\n\n if (permission.allowedWindows && windowId) {\n if (!permission.allowedWindows.includes(windowId)) {\n return {\n success: false,\n error: `Window \"${windowId}\" is not allowed to ${operation} \"${key}\"`,\n };\n }\n }\n }\n\n return { success: true };\n }\n\n /**\n * Set field permission\n * 设置字段权限\n */\n setPermission(key: string, permission: FieldPermission): void {\n const item = this.dataStore.get(key);\n if (item) {\n item.permission = permission;\n } else {\n this.dataStore.set(key, { value: undefined, permission });\n }\n }\n\n /**\n * Clear all data\n * 清除所有数据\n */\n clear(): void {\n this.dataStore.clear();\n }\n}\n"],"names":[],"mappings":"AAEA;;;AAGG;MACU,gBAAgB,CAAA;AACnB,IAAA,SAAS,GAA+B,IAAI,GAAG,EAAE;AAEzD;;;AAGG;AACH,IAAA,GAAG,CAAC,GAAW,EAAA;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK;IACvC;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,GAAW,EAAA;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC;AAEA;;;AAGG;IACH,MAAM,GAAA;QACJ,MAAM,MAAM,GAAwB,EAAE;QACtC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AACjC,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;AACxB,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,MAAM;IACf;AAEA;;;AAGG;IACH,GAAG,CAAC,GAAW,EAAE,KAAU,EAAA;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACpC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE;YACtB,KAAK;YACL,UAAU,EAAE,IAAI,EAAE,UAAU;AAC7B,SAAA,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;IAC5B;AAEA;;;AAGG;AACH,IAAA,eAAe,CACb,GAAW,EACX,QAA4B,EAC5B,SAA8B,EAAA;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAEpC,QAAA,IAAI,IAAI,EAAE,UAAU,EAAE;;;YAGpB,MAAM,UAAU,GACd,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,UAAU;AAEnF,YAAA,IAAI,UAAU,CAAC,QAAQ,EAAE;gBACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA,OAAA,EAAU,GAAG,CAAA,aAAA,CAAe,EAAE;YAChE;AAEA,YAAA,IAAI,UAAU,CAAC,cAAc,IAAI,QAAQ,EAAE;gBACzC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBACjD,OAAO;AACL,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,KAAK,EAAE,CAAA,QAAA,EAAW,QAAQ,uBAAuB,SAAS,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG;qBACtE;gBACH;YACF;QACF;AAEA,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1B;AAEA;;;AAGG;IACH,aAAa,CAAC,GAAW,EAAE,UAA2B,EAAA;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;QACpC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,UAAU,GAAG,UAAU;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;QAC3D;IACF;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;AACD"}
@@ -0,0 +1,26 @@
1
+ import { MessagePortMain } from 'electron';
2
+ /**
3
+ * ManagedPort - Wrapper for MessagePortMain to track closed state
4
+ * ManagedPort - MessagePortMain 的包装器,用于追踪关闭状态
5
+ */
6
+ export declare class ManagedPort {
7
+ private port;
8
+ private _isClosed;
9
+ constructor(port: MessagePortMain);
10
+ get isClosed(): boolean;
11
+ /**
12
+ * Safe postMessage
13
+ * 安全发送消息
14
+ */
15
+ postMessage(message: any): boolean;
16
+ /**
17
+ * Safe close
18
+ * 安全关闭
19
+ */
20
+ close(): void;
21
+ /**
22
+ * Get underlying port (use with caution)
23
+ * 获取底层端口(谨慎使用)
24
+ */
25
+ get rawPort(): MessagePortMain;
26
+ }
@@ -0,0 +1,55 @@
1
+ 'use strict';/**
2
+ * ManagedPort - Wrapper for MessagePortMain to track closed state
3
+ * ManagedPort - MessagePortMain 的包装器,用于追踪关闭状态
4
+ */
5
+ class ManagedPort {
6
+ port;
7
+ _isClosed = false;
8
+ constructor(port) {
9
+ this.port = port;
10
+ }
11
+ get isClosed() {
12
+ return this._isClosed;
13
+ }
14
+ /**
15
+ * Safe postMessage
16
+ * 安全发送消息
17
+ */
18
+ postMessage(message) {
19
+ if (this._isClosed) {
20
+ return false;
21
+ }
22
+ try {
23
+ this.port.postMessage(message);
24
+ return true;
25
+ }
26
+ catch (error) {
27
+ // If error occurs, assume port is closed/invalid
28
+ // 如果发生错误,假设端口已关闭/无效
29
+ this._isClosed = true;
30
+ throw error;
31
+ }
32
+ }
33
+ /**
34
+ * Safe close
35
+ * 安全关闭
36
+ */
37
+ close() {
38
+ if (this._isClosed)
39
+ return;
40
+ this._isClosed = true;
41
+ try {
42
+ this.port.close();
43
+ }
44
+ catch (error) {
45
+ // Ignore close errors
46
+ }
47
+ }
48
+ /**
49
+ * Get underlying port (use with caution)
50
+ * 获取底层端口(谨慎使用)
51
+ */
52
+ get rawPort() {
53
+ return this.port;
54
+ }
55
+ }exports.ManagedPort=ManagedPort;//# sourceMappingURL=ManagedPort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManagedPort.js","sources":["../../../../src/core/message-bus/core/ManagedPort.ts"],"sourcesContent":["import { MessagePortMain } from 'electron';\n\n/**\n * ManagedPort - Wrapper for MessagePortMain to track closed state\n * ManagedPort - MessagePortMain 的包装器,用于追踪关闭状态\n */\nexport class ManagedPort {\n private port: MessagePortMain;\n private _isClosed: boolean = false;\n\n constructor(port: MessagePortMain) {\n this.port = port;\n }\n\n get isClosed() {\n return this._isClosed;\n }\n\n /**\n * Safe postMessage\n * 安全发送消息\n */\n postMessage(message: any): boolean {\n if (this._isClosed) {\n return false;\n }\n try {\n this.port.postMessage(message);\n return true;\n } catch (error) {\n // If error occurs, assume port is closed/invalid\n // 如果发生错误,假设端口已关闭/无效\n this._isClosed = true;\n throw error;\n }\n }\n\n /**\n * Safe close\n * 安全关闭\n */\n close(): void {\n if (this._isClosed) return;\n this._isClosed = true;\n try {\n this.port.close();\n } catch (error) {\n // Ignore close errors\n }\n }\n\n /**\n * Get underlying port (use with caution)\n * 获取底层端口(谨慎使用)\n */\n get rawPort(): MessagePortMain {\n return this.port;\n }\n}\n"],"names":[],"mappings":"aAEA;;;AAGG;MACU,WAAW,CAAA;AACd,IAAA,IAAI;IACJ,SAAS,GAAY,KAAK;AAElC,IAAA,WAAA,CAAY,IAAqB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;IAClB;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA;;;AAGG;AACH,IAAA,WAAW,CAAC,OAAY,EAAA;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAC9B,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;;;AAGd,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,MAAM,KAAK;QACb;IACF;AAEA;;;AAGG;IACH,KAAK,GAAA;QACH,IAAI,IAAI,CAAC,SAAS;YAAE;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;QACnB;QAAE,OAAO,KAAK,EAAE;;QAEhB;IACF;AAEA;;;AAGG;AACH,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,IAAI;IAClB;AACD"}