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,71 @@
1
+ 'use strict';/**
2
+ * Window Error Codes
3
+ * 窗口错误代码
4
+ */
5
+ exports.WindowErrorCode=void 0;
6
+ (function (WindowErrorCode) {
7
+ // Configuration Errors (1000-1999)
8
+ WindowErrorCode[WindowErrorCode["CONFIG_INVALID"] = 1001] = "CONFIG_INVALID";
9
+ WindowErrorCode[WindowErrorCode["CONFIG_MISSING"] = 1002] = "CONFIG_MISSING";
10
+ // Window Management Errors (2000-2999)
11
+ WindowErrorCode[WindowErrorCode["WINDOW_NOT_FOUND"] = 2001] = "WINDOW_NOT_FOUND";
12
+ WindowErrorCode[WindowErrorCode["WINDOW_CREATION_FAILED"] = 2002] = "WINDOW_CREATION_FAILED";
13
+ WindowErrorCode[WindowErrorCode["WINDOW_ALREADY_EXISTS"] = 2003] = "WINDOW_ALREADY_EXISTS";
14
+ WindowErrorCode[WindowErrorCode["WINDOW_LIMIT_REACHED"] = 2004] = "WINDOW_LIMIT_REACHED";
15
+ WindowErrorCode[WindowErrorCode["WINDOW_DESTROYED"] = 2005] = "WINDOW_DESTROYED";
16
+ // IPC/Communication Errors (3000-3999)
17
+ WindowErrorCode[WindowErrorCode["IPC_CONNECTION_FAILED"] = 3001] = "IPC_CONNECTION_FAILED";
18
+ WindowErrorCode[WindowErrorCode["IPC_TIMEOUT"] = 3002] = "IPC_TIMEOUT";
19
+ WindowErrorCode[WindowErrorCode["IPC_HANDLER_ERROR"] = 3003] = "IPC_HANDLER_ERROR";
20
+ // System/Internal Errors (5000-5999)
21
+ WindowErrorCode[WindowErrorCode["INTERNAL_ERROR"] = 5001] = "INTERNAL_ERROR";
22
+ WindowErrorCode[WindowErrorCode["DEPENDENCY_MISSING"] = 5002] = "DEPENDENCY_MISSING";
23
+ })(exports.WindowErrorCode || (exports.WindowErrorCode = {}));
24
+ /**
25
+ * Window Error Class
26
+ * 窗口错误类
27
+ *
28
+ * Structured error handling for the WindowManager
29
+ * 为 WindowManager 提供结构化的错误处理
30
+ */
31
+ class WindowError extends Error {
32
+ code;
33
+ originalError;
34
+ details;
35
+ suggestion;
36
+ constructor(options) {
37
+ super(options.message);
38
+ this.name = 'WindowError';
39
+ this.code = options.code;
40
+ this.originalError = options.originalError;
41
+ this.details = options.details;
42
+ this.suggestion = options.suggestion;
43
+ // Fix prototype chain for custom errors
44
+ Object.setPrototypeOf(this, WindowError.prototype);
45
+ }
46
+ /**
47
+ * Get error category based on code
48
+ * 根据错误代码获取错误类别
49
+ */
50
+ getErrorCategory() {
51
+ if (this.code >= 1000 && this.code < 2000)
52
+ return 'configuration';
53
+ if (this.code >= 2000 && this.code < 3000)
54
+ return 'window';
55
+ if (this.code >= 3000 && this.code < 4000)
56
+ return 'ipc';
57
+ if (this.code >= 5000 && this.code < 6000)
58
+ return 'system';
59
+ return 'unknown';
60
+ }
61
+ toJSON() {
62
+ return {
63
+ name: this.name,
64
+ message: this.message,
65
+ code: this.code,
66
+ category: this.getErrorCategory(),
67
+ details: this.details,
68
+ suggestion: this.suggestion,
69
+ };
70
+ }
71
+ }exports.WindowError=WindowError;//# sourceMappingURL=WindowError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowError.js","sources":["../../../src/core/error/WindowError.ts"],"sourcesContent":["/**\n * Window Error Codes\n * 窗口错误代码\n */\nexport enum WindowErrorCode {\n // Configuration Errors (1000-1999)\n CONFIG_INVALID = 1001,\n CONFIG_MISSING = 1002,\n\n // Window Management Errors (2000-2999)\n WINDOW_NOT_FOUND = 2001,\n WINDOW_CREATION_FAILED = 2002,\n WINDOW_ALREADY_EXISTS = 2003,\n WINDOW_LIMIT_REACHED = 2004,\n WINDOW_DESTROYED = 2005,\n\n // IPC/Communication Errors (3000-3999)\n IPC_CONNECTION_FAILED = 3001,\n IPC_TIMEOUT = 3002,\n IPC_HANDLER_ERROR = 3003,\n\n // System/Internal Errors (5000-5999)\n INTERNAL_ERROR = 5001,\n DEPENDENCY_MISSING = 5002,\n}\n\n/**\n * Window Error Options\n * 窗口错误选项\n */\nexport interface WindowErrorOptions {\n code: WindowErrorCode;\n message: string;\n originalError?: Error | unknown;\n details?: Record<string, any>;\n suggestion?: string;\n}\n\n/**\n * Window Error Class\n * 窗口错误类\n *\n * Structured error handling for the WindowManager\n * 为 WindowManager 提供结构化的错误处理\n */\nexport class WindowError extends Error {\n public readonly code: WindowErrorCode;\n public readonly originalError?: Error | unknown;\n public readonly details?: Record<string, any>;\n public readonly suggestion?: string;\n\n constructor(options: WindowErrorOptions) {\n super(options.message);\n this.name = 'WindowError';\n this.code = options.code;\n this.originalError = options.originalError;\n this.details = options.details;\n this.suggestion = options.suggestion;\n\n // Fix prototype chain for custom errors\n Object.setPrototypeOf(this, WindowError.prototype);\n }\n\n /**\n * Get error category based on code\n * 根据错误代码获取错误类别\n */\n public getErrorCategory(): 'configuration' | 'window' | 'ipc' | 'system' | 'unknown' {\n if (this.code >= 1000 && this.code < 2000) return 'configuration';\n if (this.code >= 2000 && this.code < 3000) return 'window';\n if (this.code >= 3000 && this.code < 4000) return 'ipc';\n if (this.code >= 5000 && this.code < 6000) return 'system';\n return 'unknown';\n }\n\n public toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n category: this.getErrorCategory(),\n details: this.details,\n suggestion: this.suggestion,\n };\n }\n}\n"],"names":["WindowErrorCode"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Window Error Codes
3
+ * 窗口错误代码
4
+ */
5
+ var WindowErrorCode;
6
+ (function (WindowErrorCode) {
7
+ // Configuration Errors (1000-1999)
8
+ WindowErrorCode[WindowErrorCode["CONFIG_INVALID"] = 1001] = "CONFIG_INVALID";
9
+ WindowErrorCode[WindowErrorCode["CONFIG_MISSING"] = 1002] = "CONFIG_MISSING";
10
+ // Window Management Errors (2000-2999)
11
+ WindowErrorCode[WindowErrorCode["WINDOW_NOT_FOUND"] = 2001] = "WINDOW_NOT_FOUND";
12
+ WindowErrorCode[WindowErrorCode["WINDOW_CREATION_FAILED"] = 2002] = "WINDOW_CREATION_FAILED";
13
+ WindowErrorCode[WindowErrorCode["WINDOW_ALREADY_EXISTS"] = 2003] = "WINDOW_ALREADY_EXISTS";
14
+ WindowErrorCode[WindowErrorCode["WINDOW_LIMIT_REACHED"] = 2004] = "WINDOW_LIMIT_REACHED";
15
+ WindowErrorCode[WindowErrorCode["WINDOW_DESTROYED"] = 2005] = "WINDOW_DESTROYED";
16
+ // IPC/Communication Errors (3000-3999)
17
+ WindowErrorCode[WindowErrorCode["IPC_CONNECTION_FAILED"] = 3001] = "IPC_CONNECTION_FAILED";
18
+ WindowErrorCode[WindowErrorCode["IPC_TIMEOUT"] = 3002] = "IPC_TIMEOUT";
19
+ WindowErrorCode[WindowErrorCode["IPC_HANDLER_ERROR"] = 3003] = "IPC_HANDLER_ERROR";
20
+ // System/Internal Errors (5000-5999)
21
+ WindowErrorCode[WindowErrorCode["INTERNAL_ERROR"] = 5001] = "INTERNAL_ERROR";
22
+ WindowErrorCode[WindowErrorCode["DEPENDENCY_MISSING"] = 5002] = "DEPENDENCY_MISSING";
23
+ })(WindowErrorCode || (WindowErrorCode = {}));
24
+ /**
25
+ * Window Error Class
26
+ * 窗口错误类
27
+ *
28
+ * Structured error handling for the WindowManager
29
+ * 为 WindowManager 提供结构化的错误处理
30
+ */
31
+ class WindowError extends Error {
32
+ code;
33
+ originalError;
34
+ details;
35
+ suggestion;
36
+ constructor(options) {
37
+ super(options.message);
38
+ this.name = 'WindowError';
39
+ this.code = options.code;
40
+ this.originalError = options.originalError;
41
+ this.details = options.details;
42
+ this.suggestion = options.suggestion;
43
+ // Fix prototype chain for custom errors
44
+ Object.setPrototypeOf(this, WindowError.prototype);
45
+ }
46
+ /**
47
+ * Get error category based on code
48
+ * 根据错误代码获取错误类别
49
+ */
50
+ getErrorCategory() {
51
+ if (this.code >= 1000 && this.code < 2000)
52
+ return 'configuration';
53
+ if (this.code >= 2000 && this.code < 3000)
54
+ return 'window';
55
+ if (this.code >= 3000 && this.code < 4000)
56
+ return 'ipc';
57
+ if (this.code >= 5000 && this.code < 6000)
58
+ return 'system';
59
+ return 'unknown';
60
+ }
61
+ toJSON() {
62
+ return {
63
+ name: this.name,
64
+ message: this.message,
65
+ code: this.code,
66
+ category: this.getErrorCategory(),
67
+ details: this.details,
68
+ suggestion: this.suggestion,
69
+ };
70
+ }
71
+ }export{WindowError,WindowErrorCode};//# sourceMappingURL=WindowError.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowError.mjs","sources":["../../../src/core/error/WindowError.ts"],"sourcesContent":["/**\n * Window Error Codes\n * 窗口错误代码\n */\nexport enum WindowErrorCode {\n // Configuration Errors (1000-1999)\n CONFIG_INVALID = 1001,\n CONFIG_MISSING = 1002,\n\n // Window Management Errors (2000-2999)\n WINDOW_NOT_FOUND = 2001,\n WINDOW_CREATION_FAILED = 2002,\n WINDOW_ALREADY_EXISTS = 2003,\n WINDOW_LIMIT_REACHED = 2004,\n WINDOW_DESTROYED = 2005,\n\n // IPC/Communication Errors (3000-3999)\n IPC_CONNECTION_FAILED = 3001,\n IPC_TIMEOUT = 3002,\n IPC_HANDLER_ERROR = 3003,\n\n // System/Internal Errors (5000-5999)\n INTERNAL_ERROR = 5001,\n DEPENDENCY_MISSING = 5002,\n}\n\n/**\n * Window Error Options\n * 窗口错误选项\n */\nexport interface WindowErrorOptions {\n code: WindowErrorCode;\n message: string;\n originalError?: Error | unknown;\n details?: Record<string, any>;\n suggestion?: string;\n}\n\n/**\n * Window Error Class\n * 窗口错误类\n *\n * Structured error handling for the WindowManager\n * 为 WindowManager 提供结构化的错误处理\n */\nexport class WindowError extends Error {\n public readonly code: WindowErrorCode;\n public readonly originalError?: Error | unknown;\n public readonly details?: Record<string, any>;\n public readonly suggestion?: string;\n\n constructor(options: WindowErrorOptions) {\n super(options.message);\n this.name = 'WindowError';\n this.code = options.code;\n this.originalError = options.originalError;\n this.details = options.details;\n this.suggestion = options.suggestion;\n\n // Fix prototype chain for custom errors\n Object.setPrototypeOf(this, WindowError.prototype);\n }\n\n /**\n * Get error category based on code\n * 根据错误代码获取错误类别\n */\n public getErrorCategory(): 'configuration' | 'window' | 'ipc' | 'system' | 'unknown' {\n if (this.code >= 1000 && this.code < 2000) return 'configuration';\n if (this.code >= 2000 && this.code < 3000) return 'window';\n if (this.code >= 3000 && this.code < 4000) return 'ipc';\n if (this.code >= 5000 && this.code < 6000) return 'system';\n return 'unknown';\n }\n\n public toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n category: this.getErrorCategory(),\n details: this.details,\n suggestion: this.suggestion,\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { IpcHandlerCallback } from './ipc-router.type';
2
+ import { ZodType } from 'zod';
3
+ /**
4
+ * IPC Handler Class
5
+ * IPC 处理器类
6
+ *
7
+ * Wraps IPC message handling logic with type support
8
+ * 封装带类型支持的 IPC 消息处理逻辑
9
+ *
10
+ * @template Context - Context/API type (上下文/API 类型)
11
+ * @template T - Input data type (输入数据类型)
12
+ * @template R - Return value type (返回值类型)
13
+ */
14
+ export default class IpcHandler<Context = Record<string, any>, T = any, R = any> {
15
+ private _name;
16
+ private _event;
17
+ private _callback;
18
+ private _schema?;
19
+ /**
20
+ * Create IPC Handler instance
21
+ * 创建 IPC 处理器实例
22
+ * @param name - Handler name (处理器名称)
23
+ * @param event - Event to listen for (要监听的事件)
24
+ * @param callback - Callback function triggered on event (事件触发时的回调函数)
25
+ * @param schema - Optional Zod schema for input validation (可选的输入校验 Zod Schema)
26
+ */
27
+ constructor(name: string, event: string, callback: IpcHandlerCallback<Context, T, R>, schema?: ZodType<T>);
28
+ /**
29
+ * Get handler name
30
+ * 获取处理器名称
31
+ */
32
+ get name(): string;
33
+ /**
34
+ * Get event name
35
+ * 获取事件名称
36
+ */
37
+ get event(): string;
38
+ /**
39
+ * Get callback function
40
+ * 获取回调函数
41
+ */
42
+ get callback(): IpcHandlerCallback<Context, T, R>;
43
+ /**
44
+ * Get validation schema
45
+ * 获取校验 Schema
46
+ */
47
+ get schema(): ZodType<T> | undefined;
48
+ }
@@ -0,0 +1,59 @@
1
+ 'use strict';/**
2
+ * IPC Handler Class
3
+ * IPC 处理器类
4
+ *
5
+ * Wraps IPC message handling logic with type support
6
+ * 封装带类型支持的 IPC 消息处理逻辑
7
+ *
8
+ * @template Context - Context/API type (上下文/API 类型)
9
+ * @template T - Input data type (输入数据类型)
10
+ * @template R - Return value type (返回值类型)
11
+ */
12
+ class IpcHandler {
13
+ _name;
14
+ _event;
15
+ _callback;
16
+ _schema;
17
+ /**
18
+ * Create IPC Handler instance
19
+ * 创建 IPC 处理器实例
20
+ * @param name - Handler name (处理器名称)
21
+ * @param event - Event to listen for (要监听的事件)
22
+ * @param callback - Callback function triggered on event (事件触发时的回调函数)
23
+ * @param schema - Optional Zod schema for input validation (可选的输入校验 Zod Schema)
24
+ */
25
+ constructor(name, event, callback, schema) {
26
+ this._name = name;
27
+ this._event = event;
28
+ this._callback = callback;
29
+ this._schema = schema;
30
+ }
31
+ /**
32
+ * Get handler name
33
+ * 获取处理器名称
34
+ */
35
+ get name() {
36
+ return this._name;
37
+ }
38
+ /**
39
+ * Get event name
40
+ * 获取事件名称
41
+ */
42
+ get event() {
43
+ return this._event;
44
+ }
45
+ /**
46
+ * Get callback function
47
+ * 获取回调函数
48
+ */
49
+ get callback() {
50
+ return this._callback;
51
+ }
52
+ /**
53
+ * Get validation schema
54
+ * 获取校验 Schema
55
+ */
56
+ get schema() {
57
+ return this._schema;
58
+ }
59
+ }module.exports=IpcHandler;//# sourceMappingURL=IpcHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpcHandler.js","sources":["../../../src/core/ipc/IpcHandler.ts"],"sourcesContent":["import { IpcHandlerCallback } from './ipc-router.type';\nimport { ZodType } from 'zod';\n\n/**\n * IPC Handler Class\n * IPC 处理器类\n *\n * Wraps IPC message handling logic with type support\n * 封装带类型支持的 IPC 消息处理逻辑\n *\n * @template Context - Context/API type (上下文/API 类型)\n * @template T - Input data type (输入数据类型)\n * @template R - Return value type (返回值类型)\n */\nexport default class IpcHandler<Context = Record<string, any>, T = any, R = any> {\n private _name: string;\n private _event: string;\n private _callback: IpcHandlerCallback<Context, T, R>;\n private _schema?: ZodType<T>;\n\n /**\n * Create IPC Handler instance\n * 创建 IPC 处理器实例\n * @param name - Handler name (处理器名称)\n * @param event - Event to listen for (要监听的事件)\n * @param callback - Callback function triggered on event (事件触发时的回调函数)\n * @param schema - Optional Zod schema for input validation (可选的输入校验 Zod Schema)\n */\n constructor(\n name: string,\n event: string,\n callback: IpcHandlerCallback<Context, T, R>,\n schema?: ZodType<T>\n ) {\n this._name = name;\n this._event = event;\n this._callback = callback;\n this._schema = schema;\n }\n\n /**\n * Get handler name\n * 获取处理器名称\n */\n get name(): string {\n return this._name;\n }\n\n /**\n * Get event name\n * 获取事件名称\n */\n get event(): string {\n return this._event;\n }\n\n /**\n * Get callback function\n * 获取回调函数\n */\n get callback(): IpcHandlerCallback<Context, T, R> {\n return this._callback;\n }\n\n /**\n * Get validation schema\n * 获取校验 Schema\n */\n get schema(): ZodType<T> | undefined {\n return this._schema;\n }\n}\n"],"names":[],"mappings":"aAGA;;;;;;;;;;AAUG;AACW,MAAO,UAAU,CAAA;AACrB,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,OAAO;AAEf;;;;;;;AAOG;AACH,IAAA,WAAA,CACE,IAAY,EACZ,KAAa,EACb,QAA2C,EAC3C,MAAmB,EAAA;AAEnB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;IACvB;AAEA;;;AAGG;AACH,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA;;;AAGG;AACH,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;;AAGG;AACH,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA;;;AAGG;AACH,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO;IACrB;AACD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * IPC Handler Class
3
+ * IPC 处理器类
4
+ *
5
+ * Wraps IPC message handling logic with type support
6
+ * 封装带类型支持的 IPC 消息处理逻辑
7
+ *
8
+ * @template Context - Context/API type (上下文/API 类型)
9
+ * @template T - Input data type (输入数据类型)
10
+ * @template R - Return value type (返回值类型)
11
+ */
12
+ class IpcHandler {
13
+ _name;
14
+ _event;
15
+ _callback;
16
+ _schema;
17
+ /**
18
+ * Create IPC Handler instance
19
+ * 创建 IPC 处理器实例
20
+ * @param name - Handler name (处理器名称)
21
+ * @param event - Event to listen for (要监听的事件)
22
+ * @param callback - Callback function triggered on event (事件触发时的回调函数)
23
+ * @param schema - Optional Zod schema for input validation (可选的输入校验 Zod Schema)
24
+ */
25
+ constructor(name, event, callback, schema) {
26
+ this._name = name;
27
+ this._event = event;
28
+ this._callback = callback;
29
+ this._schema = schema;
30
+ }
31
+ /**
32
+ * Get handler name
33
+ * 获取处理器名称
34
+ */
35
+ get name() {
36
+ return this._name;
37
+ }
38
+ /**
39
+ * Get event name
40
+ * 获取事件名称
41
+ */
42
+ get event() {
43
+ return this._event;
44
+ }
45
+ /**
46
+ * Get callback function
47
+ * 获取回调函数
48
+ */
49
+ get callback() {
50
+ return this._callback;
51
+ }
52
+ /**
53
+ * Get validation schema
54
+ * 获取校验 Schema
55
+ */
56
+ get schema() {
57
+ return this._schema;
58
+ }
59
+ }export{IpcHandler as default};//# sourceMappingURL=IpcHandler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpcHandler.mjs","sources":["../../../src/core/ipc/IpcHandler.ts"],"sourcesContent":["import { IpcHandlerCallback } from './ipc-router.type';\nimport { ZodType } from 'zod';\n\n/**\n * IPC Handler Class\n * IPC 处理器类\n *\n * Wraps IPC message handling logic with type support\n * 封装带类型支持的 IPC 消息处理逻辑\n *\n * @template Context - Context/API type (上下文/API 类型)\n * @template T - Input data type (输入数据类型)\n * @template R - Return value type (返回值类型)\n */\nexport default class IpcHandler<Context = Record<string, any>, T = any, R = any> {\n private _name: string;\n private _event: string;\n private _callback: IpcHandlerCallback<Context, T, R>;\n private _schema?: ZodType<T>;\n\n /**\n * Create IPC Handler instance\n * 创建 IPC 处理器实例\n * @param name - Handler name (处理器名称)\n * @param event - Event to listen for (要监听的事件)\n * @param callback - Callback function triggered on event (事件触发时的回调函数)\n * @param schema - Optional Zod schema for input validation (可选的输入校验 Zod Schema)\n */\n constructor(\n name: string,\n event: string,\n callback: IpcHandlerCallback<Context, T, R>,\n schema?: ZodType<T>\n ) {\n this._name = name;\n this._event = event;\n this._callback = callback;\n this._schema = schema;\n }\n\n /**\n * Get handler name\n * 获取处理器名称\n */\n get name(): string {\n return this._name;\n }\n\n /**\n * Get event name\n * 获取事件名称\n */\n get event(): string {\n return this._event;\n }\n\n /**\n * Get callback function\n * 获取回调函数\n */\n get callback(): IpcHandlerCallback<Context, T, R> {\n return this._callback;\n }\n\n /**\n * Get validation schema\n * 获取校验 Schema\n */\n get schema(): ZodType<T> | undefined {\n return this._schema;\n }\n}\n"],"names":[],"mappings":"AAGA;;;;;;;;;;AAUG;AACW,MAAO,UAAU,CAAA;AACrB,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,OAAO;AAEf;;;;;;;AAOG;AACH,IAAA,WAAA,CACE,IAAY,EACZ,KAAa,EACb,QAA2C,EAC3C,MAAmB,EAAA;AAEnB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;IACvB;AAEA;;;AAGG;AACH,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA;;;AAGG;AACH,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;;AAGG;AACH,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA;;;AAGG;AACH,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO;IACrB;AACD"}
@@ -0,0 +1,70 @@
1
+ import IpcHandler from './IpcHandler';
2
+ import { IpcRequest, IpcSchema, IpcDefinition } from './ipc-router.type';
3
+ import { ILogger } from '@/infrastructure/logger';
4
+ import { RateLimitConfig } from '@/internal/utils/RateLimiter';
5
+ export default class IpcRouter<Api extends Record<string, any> = Record<string, any>, Schema extends IpcSchema = Record<string, IpcDefinition>> {
6
+ private _api;
7
+ private dispatcher;
8
+ private rateLimiter;
9
+ constructor(options?: {
10
+ logger?: ILogger;
11
+ defaultRateLimit?: RateLimitConfig;
12
+ });
13
+ /**
14
+ * Add a single IPC handler
15
+ * 添加单个IPC处理器
16
+ * @param handler - IPC handler instance (IPC处理器实例)
17
+ */
18
+ addHandler<K extends keyof Schema>(handler: IpcHandler<Api, Schema[K]['payload'], Schema[K]['response']> & {
19
+ name: K;
20
+ }): void;
21
+ /**
22
+ * Add multiple IPC handlers
23
+ * 添加多个IPC处理器
24
+ * @param handlers - Array of IPC handler instances (IPC处理器实例数组)
25
+ */
26
+ addHandlers(handlers: (IpcHandler<Api, any, any> & {
27
+ name: keyof Schema;
28
+ })[]): void;
29
+ /**
30
+ * Set rate limit for a specific handler
31
+ * 为特定处理器设置限流
32
+ * @param handlerName - Handler name (处理器名称)
33
+ * @param config - Rate limit configuration (限流配置)
34
+ */
35
+ setRateLimit(handlerName: keyof Schema, config: RateLimitConfig): void;
36
+ /**
37
+ * Remove IPC handler by name
38
+ * 移除指定名称的IPC处理器
39
+ * @param name - Handler name (处理器名称)
40
+ */
41
+ removeHandler(name: string): void;
42
+ /**
43
+ * Trigger callback of specified IPC handler
44
+ * 触发指定名称的IPC处理器回调
45
+ * @param data - Object containing handler name and data (包含处理器名称和数据的对象)
46
+ * @param senderId - Optional sender ID (e.g. window ID) for rate limiting (可选的发送者 ID,用于限流)
47
+ * @returns Return value of the callback function (回调函数的返回值)
48
+ */
49
+ handle<K extends keyof Schema>(data: IpcRequest<Schema[K]['payload']> & {
50
+ name: K;
51
+ }, senderId?: number | string): Promise<Schema[K]['response']>;
52
+ /**
53
+ * Inject API (Dependencies)
54
+ * 注入 API (依赖)
55
+ * @param name - API Name (API 名称)
56
+ * @param api - API Instance (API 实例)
57
+ */
58
+ addApi(name: keyof Api, api: any): void;
59
+ /**
60
+ * Inject multiple APIs (Batch)
61
+ * 批量注入 API
62
+ * @param apis - Object containing API instances (包含 API 实例的对象)
63
+ */
64
+ addApis(apis: Partial<Api>): void;
65
+ /**
66
+ * Dispose IpcRouter
67
+ * 释放 IpcRouter
68
+ */
69
+ dispose(): void;
70
+ }
@@ -0,0 +1,143 @@
1
+ 'use strict';var zod=require('zod'),MessageDispatcher=require('../../internal/utils/MessageDispatcher.js'),index=require('../../infrastructure/errors/index.js'),RateLimiter=require('../../internal/utils/RateLimiter.js'),PerformanceMonitor=require('../../infrastructure/debug/PerformanceMonitor.js');// Define the schema for IpcRequest
2
+ // 定义 IpcRequest 的 Schema
3
+ const IpcRequestSchema = zod.z.object({
4
+ name: zod.z.string({ message: 'Handler name is required' }),
5
+ payload: zod.z.unknown().optional(),
6
+ });
7
+ class IpcRouter {
8
+ _api = {};
9
+ dispatcher;
10
+ rateLimiter;
11
+ constructor(options = {}) {
12
+ this.dispatcher = new MessageDispatcher.MessageDispatcher('IpcRouter', options.logger);
13
+ this.rateLimiter = new RateLimiter.RateLimiter({
14
+ logger: options.logger,
15
+ defaultLimit: options.defaultRateLimit,
16
+ });
17
+ }
18
+ /**
19
+ * Add a single IPC handler
20
+ * 添加单个IPC处理器
21
+ * @param handler - IPC handler instance (IPC处理器实例)
22
+ */
23
+ addHandler(handler) {
24
+ this.dispatcher.register(handler.name, handler.callback, handler.schema);
25
+ }
26
+ /**
27
+ * Add multiple IPC handlers
28
+ * 添加多个IPC处理器
29
+ * @param handlers - Array of IPC handler instances (IPC处理器实例数组)
30
+ */
31
+ addHandlers(handlers) {
32
+ handlers.forEach((handler) => this.addHandler(handler));
33
+ }
34
+ /**
35
+ * Set rate limit for a specific handler
36
+ * 为特定处理器设置限流
37
+ * @param handlerName - Handler name (处理器名称)
38
+ * @param config - Rate limit configuration (限流配置)
39
+ */
40
+ setRateLimit(handlerName, config) {
41
+ this.rateLimiter.setLimit(handlerName, config);
42
+ }
43
+ /**
44
+ * Remove IPC handler by name
45
+ * 移除指定名称的IPC处理器
46
+ * @param name - Handler name (处理器名称)
47
+ */
48
+ removeHandler(name) {
49
+ this.dispatcher.unregister(name);
50
+ }
51
+ /**
52
+ * Trigger callback of specified IPC handler
53
+ * 触发指定名称的IPC处理器回调
54
+ * @param data - Object containing handler name and data (包含处理器名称和数据的对象)
55
+ * @param senderId - Optional sender ID (e.g. window ID) for rate limiting (可选的发送者 ID,用于限流)
56
+ * @returns Return value of the callback function (回调函数的返回值)
57
+ */
58
+ handle(data, senderId) {
59
+ const perf = PerformanceMonitor.PerformanceMonitor.getInstance();
60
+ const measureId = `ipc-${String(data.name)}-${Date.now()}`;
61
+ const handleAsync = async () => {
62
+ try {
63
+ perf.startMeasure(measureId, 'IPC Call', { handler: String(data.name), senderId });
64
+ // 0. Rate Limiting Check
65
+ // 0. 限流检查
66
+ if (senderId !== undefined) {
67
+ const rateLimitKey = `${senderId}:${String(data.name)}`;
68
+ const allowed = this.rateLimiter.check(rateLimitKey, String(data.name));
69
+ if (!allowed) {
70
+ throw new index.IpcHandlerError(String(data.name), new Error(`Rate limit exceeded for handler "${String(data.name)}"`));
71
+ }
72
+ }
73
+ // Runtime validation using Zod (Envelope validation)
74
+ // 使用 Zod 进行运行时校验 (信封校验)
75
+ const validationResult = IpcRequestSchema.safeParse(data);
76
+ if (!validationResult.success) {
77
+ console.warn('[IpcRouter] Invalid IPC request data:', validationResult.error.format());
78
+ throw new index.IpcHandlerError('validation', new Error(`Invalid IPC request: ${validationResult.error.message}`));
79
+ }
80
+ // Payload validation if schema exists
81
+ // 如果存在 Schema,则进行 Payload 校验
82
+ const schema = this.dispatcher.getMetadata(data.name);
83
+ if (schema) {
84
+ const payloadResult = schema.safeParse(data.payload);
85
+ if (!payloadResult.success) {
86
+ console.warn(`[IpcRouter] Invalid payload for handler "${String(data.name)}":`, payloadResult.error.message);
87
+ throw new index.IpcHandlerError(String(data.name), new Error(`Invalid payload: ${payloadResult.error.message}`));
88
+ }
89
+ }
90
+ // 1. Dependency Injection (inject this._api)
91
+ // 1. 依赖注入 (注入 this._api)
92
+ const context = { ...this._api };
93
+ // 2. Dispatch
94
+ // 2. 分发
95
+ const result = await Promise.resolve(this.dispatcher.dispatch(data.name, context, data.payload));
96
+ perf.endMeasure(measureId, { status: 'success' });
97
+ return result;
98
+ }
99
+ catch (error) {
100
+ perf.endMeasure(measureId, {
101
+ status: 'error',
102
+ error: error instanceof Error ? error.message : String(error),
103
+ });
104
+ // Error handling
105
+ // 错误处理
106
+ if (error instanceof index.IpcHandlerError) {
107
+ throw error;
108
+ }
109
+ throw new index.IpcHandlerError(String(data.name), error);
110
+ }
111
+ };
112
+ return handleAsync();
113
+ }
114
+ /**
115
+ * Inject API (Dependencies)
116
+ * 注入 API (依赖)
117
+ * @param name - API Name (API 名称)
118
+ * @param api - API Instance (API 实例)
119
+ */
120
+ addApi(name, api) {
121
+ this._api[name] = api;
122
+ }
123
+ /**
124
+ * Inject multiple APIs (Batch)
125
+ * 批量注入 API
126
+ * @param apis - Object containing API instances (包含 API 实例的对象)
127
+ */
128
+ addApis(apis) {
129
+ Object.entries(apis).forEach(([name, api]) => {
130
+ this.addApi(name, api);
131
+ });
132
+ }
133
+ /**
134
+ * Dispose IpcRouter
135
+ * 释放 IpcRouter
136
+ */
137
+ dispose() {
138
+ this.rateLimiter.stopCleanup();
139
+ this.rateLimiter.clear();
140
+ this.dispatcher.clear();
141
+ this._api = {};
142
+ }
143
+ }module.exports=IpcRouter;//# sourceMappingURL=IpcRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpcRouter.js","sources":["../../../src/core/ipc/IpcRouter.ts"],"sourcesContent":["import IpcHandler from './IpcHandler';\nimport { IpcRequest, IpcSchema, IpcDefinition } from './ipc-router.type';\nimport { z } from 'zod';\nimport { MessageDispatcher } from '@/internal/utils/MessageDispatcher';\nimport { ILogger } from '@/infrastructure/logger';\nimport { IpcHandlerError } from '@/infrastructure/errors';\nimport { RateLimiter, RateLimitConfig } from '@/internal/utils/RateLimiter';\nimport { PerformanceMonitor } from '@/infrastructure/debug';\n\n// Define the schema for IpcRequest\n// 定义 IpcRequest 的 Schema\nconst IpcRequestSchema = z.object({\n name: z.string({ message: 'Handler name is required' }),\n payload: z.unknown().optional(),\n});\n\nexport default class IpcRouter<\n Api extends Record<string, any> = Record<string, any>,\n Schema extends IpcSchema = Record<string, IpcDefinition>,\n> {\n private _api: Api = {} as Api;\n private dispatcher: MessageDispatcher<Api>;\n private rateLimiter: RateLimiter;\n\n constructor(options: { logger?: ILogger; defaultRateLimit?: RateLimitConfig } = {}) {\n this.dispatcher = new MessageDispatcher('IpcRouter', options.logger);\n this.rateLimiter = new RateLimiter({\n logger: options.logger,\n defaultLimit: options.defaultRateLimit,\n });\n }\n\n /**\n * Add a single IPC handler\n * 添加单个IPC处理器\n * @param handler - IPC handler instance (IPC处理器实例)\n */\n addHandler<K extends keyof Schema>(\n handler: IpcHandler<Api, Schema[K]['payload'], Schema[K]['response']> & {\n name: K;\n }\n ): void {\n this.dispatcher.register(handler.name as string, handler.callback, handler.schema);\n }\n\n /**\n * Add multiple IPC handlers\n * 添加多个IPC处理器\n * @param handlers - Array of IPC handler instances (IPC处理器实例数组)\n */\n addHandlers(handlers: (IpcHandler<Api, any, any> & { name: keyof Schema })[]): void {\n handlers.forEach((handler) => this.addHandler(handler as any));\n }\n\n /**\n * Set rate limit for a specific handler\n * 为特定处理器设置限流\n * @param handlerName - Handler name (处理器名称)\n * @param config - Rate limit configuration (限流配置)\n */\n setRateLimit(handlerName: keyof Schema, config: RateLimitConfig): void {\n this.rateLimiter.setLimit(handlerName as string, config);\n }\n\n /**\n * Remove IPC handler by name\n * 移除指定名称的IPC处理器\n * @param name - Handler name (处理器名称)\n */\n removeHandler(name: string): void {\n this.dispatcher.unregister(name);\n }\n\n /**\n * Trigger callback of specified IPC handler\n * 触发指定名称的IPC处理器回调\n * @param data - Object containing handler name and data (包含处理器名称和数据的对象)\n * @param senderId - Optional sender ID (e.g. window ID) for rate limiting (可选的发送者 ID,用于限流)\n * @returns Return value of the callback function (回调函数的返回值)\n */\n handle<K extends keyof Schema>(\n data: IpcRequest<Schema[K]['payload']> & { name: K },\n senderId?: number | string\n ): Promise<Schema[K]['response']> {\n const perf = PerformanceMonitor.getInstance();\n const measureId = `ipc-${String(data.name)}-${Date.now()}`;\n\n const handleAsync = async (): Promise<Schema[K]['response']> => {\n try {\n perf.startMeasure(measureId, 'IPC Call', { handler: String(data.name), senderId });\n\n // 0. Rate Limiting Check\n // 0. 限流检查\n if (senderId !== undefined) {\n const rateLimitKey = `${senderId}:${String(data.name)}`;\n const allowed = this.rateLimiter.check(rateLimitKey, String(data.name));\n if (!allowed) {\n throw new IpcHandlerError(\n String(data.name),\n new Error(`Rate limit exceeded for handler \"${String(data.name)}\"`)\n );\n }\n }\n\n // Runtime validation using Zod (Envelope validation)\n // 使用 Zod 进行运行时校验 (信封校验)\n const validationResult = IpcRequestSchema.safeParse(data);\n\n if (!validationResult.success) {\n console.warn('[IpcRouter] Invalid IPC request data:', validationResult.error.format());\n throw new IpcHandlerError(\n 'validation',\n new Error(`Invalid IPC request: ${validationResult.error.message}`)\n );\n }\n\n // Payload validation if schema exists\n // 如果存在 Schema,则进行 Payload 校验\n const schema = this.dispatcher.getMetadata(data.name as string) as\n | z.ZodType<any>\n | undefined;\n if (schema) {\n const payloadResult = schema.safeParse(data.payload);\n if (!payloadResult.success) {\n console.warn(\n `[IpcRouter] Invalid payload for handler \"${String(data.name)}\":`,\n payloadResult.error.message\n );\n throw new IpcHandlerError(\n String(data.name),\n new Error(`Invalid payload: ${payloadResult.error.message}`)\n );\n }\n }\n\n // 1. Dependency Injection (inject this._api)\n // 1. 依赖注入 (注入 this._api)\n const context = { ...this._api };\n\n // 2. Dispatch\n // 2. 分发\n const result = await Promise.resolve(\n this.dispatcher.dispatch(data.name as string, context, data.payload)\n );\n\n perf.endMeasure(measureId, { status: 'success' });\n return result as Schema[K]['response'];\n } catch (error: any) {\n perf.endMeasure(measureId, {\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Error handling\n // 错误处理\n if (error instanceof IpcHandlerError) {\n throw error;\n }\n throw new IpcHandlerError(String(data.name), error);\n }\n };\n\n return handleAsync();\n }\n\n /**\n * Inject API (Dependencies)\n * 注入 API (依赖)\n * @param name - API Name (API 名称)\n * @param api - API Instance (API 实例)\n */\n addApi(name: keyof Api, api: any): void {\n this._api[name] = api;\n }\n\n /**\n * Inject multiple APIs (Batch)\n * 批量注入 API\n * @param apis - Object containing API instances (包含 API 实例的对象)\n */\n addApis(apis: Partial<Api>): void {\n Object.entries(apis).forEach(([name, api]) => {\n this.addApi(name as keyof Api, api);\n });\n }\n\n /**\n * Dispose IpcRouter\n * 释放 IpcRouter\n */\n dispose(): void {\n this.rateLimiter.stopCleanup();\n this.rateLimiter.clear();\n this.dispatcher.clear();\n this._api = {} as Api;\n }\n}\n"],"names":["z","MessageDispatcher","RateLimiter","PerformanceMonitor","IpcHandlerError"],"mappings":"2SASA;AACA;AACA,MAAM,gBAAgB,GAAGA,KAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAEA,KAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;AACvD,IAAA,OAAO,EAAEA,KAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;AAChC,CAAA,CAAC;AAEY,MAAO,SAAS,CAAA;IAIpB,IAAI,GAAQ,EAAS;AACrB,IAAA,UAAU;AACV,IAAA,WAAW;AAEnB,IAAA,WAAA,CAAY,UAAoE,EAAE,EAAA;AAChF,QAAA,IAAI,CAAC,UAAU,GAAG,IAAIC,mCAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC;AACpE,QAAA,IAAI,CAAC,WAAW,GAAG,IAAIC,uBAAW,CAAC;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAC,gBAAgB;AACvC,SAAA,CAAC;IACJ;AAEA;;;;AAIG;AACH,IAAA,UAAU,CACR,OAEC,EAAA;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAc,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;IACpF;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,QAAgE,EAAA;AAC1E,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,CAAC,OAAc,CAAC,CAAC;IAChE;AAEA;;;;;AAKG;IACH,YAAY,CAAC,WAAyB,EAAE,MAAuB,EAAA;QAC7D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAqB,EAAE,MAAM,CAAC;IAC1D;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,IAAY,EAAA;AACxB,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;IAClC;AAEA;;;;;;AAMG;IACH,MAAM,CACJ,IAAoD,EACpD,QAA0B,EAAA;AAE1B,QAAA,MAAM,IAAI,GAAGC,qCAAkB,CAAC,WAAW,EAAE;AAC7C,QAAA,MAAM,SAAS,GAAG,CAAA,IAAA,EAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;AAE1D,QAAA,MAAM,WAAW,GAAG,YAA2C;AAC7D,YAAA,IAAI;gBACF,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;;;AAIlF,gBAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1B,oBAAA,MAAM,YAAY,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;AACvD,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvE,IAAI,CAAC,OAAO,EAAE;wBACZ,MAAM,IAAIC,qBAAe,CACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EACjB,IAAI,KAAK,CAAC,CAAA,iCAAA,EAAoC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CACpE;oBACH;gBACF;;;gBAIA,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;AAEzD,gBAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;AAC7B,oBAAA,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;AACtF,oBAAA,MAAM,IAAIA,qBAAe,CACvB,YAAY,EACZ,IAAI,KAAK,CAAC,CAAA,qBAAA,EAAwB,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC,CACpE;gBACH;;;AAIA,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAc,CAEjD;gBACb,IAAI,MAAM,EAAE;oBACV,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AACpD,oBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;AAC1B,wBAAA,OAAO,CAAC,IAAI,CACV,4CAA4C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI,EACjE,aAAa,CAAC,KAAK,CAAC,OAAO,CAC5B;wBACD,MAAM,IAAIA,qBAAe,CACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EACjB,IAAI,KAAK,CAAC,CAAA,iBAAA,EAAoB,aAAa,CAAC,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC,CAC7D;oBACH;gBACF;;;gBAIA,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;;;gBAIhC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAClC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAc,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CACrE;gBAED,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACjD,gBAAA,OAAO,MAA+B;YACxC;YAAE,OAAO,KAAU,EAAE;AACnB,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;AACzB,oBAAA,MAAM,EAAE,OAAO;AACf,oBAAA,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9D,iBAAA,CAAC;;;AAIF,gBAAA,IAAI,KAAK,YAAYA,qBAAe,EAAE;AACpC,oBAAA,MAAM,KAAK;gBACb;AACA,gBAAA,MAAM,IAAIA,qBAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;YACrD;AACF,QAAA,CAAC;QAED,OAAO,WAAW,EAAE;IACtB;AAEA;;;;;AAKG;IACH,MAAM,CAAC,IAAe,EAAE,GAAQ,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;IACvB;AAEA;;;;AAIG;AACH,IAAA,OAAO,CAAC,IAAkB,EAAA;AACxB,QAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,KAAI;AAC3C,YAAA,IAAI,CAAC,MAAM,CAAC,IAAiB,EAAE,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,GAAG,EAAS;IACvB;AACD"}