@vlian/framework 1.0.3 → 1.0.4

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 (63) hide show
  1. package/dist/core/event/AppEventBus.cjs +446 -0
  2. package/dist/core/event/AppEventBus.cjs.map +1 -0
  3. package/dist/core/event/AppEventBus.d.ts +179 -0
  4. package/dist/core/event/AppEventBus.d.ts.map +1 -0
  5. package/dist/core/event/AppEventBus.js +438 -0
  6. package/dist/core/event/AppEventBus.js.map +1 -0
  7. package/dist/core/event/frameworkEvents.cjs +143 -0
  8. package/dist/core/event/frameworkEvents.cjs.map +1 -0
  9. package/dist/core/event/frameworkEvents.d.ts +70 -0
  10. package/dist/core/event/frameworkEvents.d.ts.map +1 -0
  11. package/dist/core/event/frameworkEvents.js +135 -0
  12. package/dist/core/event/frameworkEvents.js.map +1 -0
  13. package/dist/core/event/hooks.cjs +71 -0
  14. package/dist/core/event/hooks.cjs.map +1 -0
  15. package/dist/core/event/hooks.d.ts +58 -0
  16. package/dist/core/event/hooks.d.ts.map +1 -0
  17. package/dist/core/event/hooks.js +95 -0
  18. package/dist/core/event/hooks.js.map +1 -0
  19. package/dist/core/event/index.cjs +43 -0
  20. package/dist/core/event/index.cjs.map +1 -0
  21. package/dist/core/event/index.d.ts +11 -0
  22. package/dist/core/event/index.d.ts.map +1 -0
  23. package/dist/core/event/index.js +10 -0
  24. package/dist/core/event/index.js.map +1 -0
  25. package/dist/core/event/types.cjs +64 -0
  26. package/dist/core/event/types.cjs.map +1 -0
  27. package/dist/core/event/types.d.ts +270 -0
  28. package/dist/core/event/types.d.ts.map +1 -0
  29. package/dist/core/event/types.js +56 -0
  30. package/dist/core/event/types.js.map +1 -0
  31. package/dist/core/event/useEventBus.cjs +27 -0
  32. package/dist/core/event/useEventBus.cjs.map +1 -0
  33. package/dist/core/event/useEventBus.d.ts +29 -0
  34. package/dist/core/event/useEventBus.d.ts.map +1 -0
  35. package/dist/core/event/useEventBus.js +39 -0
  36. package/dist/core/event/useEventBus.js.map +1 -0
  37. package/dist/core/index.cjs +1 -0
  38. package/dist/core/index.cjs.map +1 -1
  39. package/dist/core/index.d.ts +1 -0
  40. package/dist/core/index.d.ts.map +1 -1
  41. package/dist/core/index.js +2 -0
  42. package/dist/core/index.js.map +1 -1
  43. package/dist/core/startup/AppInstance.cjs +8 -0
  44. package/dist/core/startup/AppInstance.cjs.map +1 -1
  45. package/dist/core/startup/AppInstance.d.ts +4 -0
  46. package/dist/core/startup/AppInstance.d.ts.map +1 -1
  47. package/dist/core/startup/AppInstance.js +8 -0
  48. package/dist/core/startup/AppInstance.js.map +1 -1
  49. package/dist/core/startup/initializeServices.cjs +21 -4
  50. package/dist/core/startup/initializeServices.cjs.map +1 -1
  51. package/dist/core/startup/initializeServices.d.ts +5 -0
  52. package/dist/core/startup/initializeServices.d.ts.map +1 -1
  53. package/dist/core/startup/initializeServices.js +21 -4
  54. package/dist/core/startup/initializeServices.js.map +1 -1
  55. package/dist/core/startup/startApp.cjs +59 -1
  56. package/dist/core/startup/startApp.cjs.map +1 -1
  57. package/dist/core/startup/startApp.d.ts.map +1 -1
  58. package/dist/core/startup/startApp.js +59 -1
  59. package/dist/core/startup/startApp.js.map +1 -1
  60. package/dist/core/types.d.ts +31 -0
  61. package/dist/core/types.d.ts.map +1 -1
  62. package/dist/core/types.js.map +1 -1
  63. package/package.json +2 -3
@@ -0,0 +1,446 @@
1
+ /**
2
+ * 应用级事件总线
3
+ * 提供高性能、类型安全、可观测的事件通信能力
4
+ */ "use strict";
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "AppEventBus", {
9
+ enumerable: true,
10
+ get: function() {
11
+ return AppEventBus;
12
+ }
13
+ });
14
+ const _utils = require("../../utils");
15
+ function _define_property(obj, key, value) {
16
+ if (key in obj) {
17
+ Object.defineProperty(obj, key, {
18
+ value: value,
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true
22
+ });
23
+ } else {
24
+ obj[key] = value;
25
+ }
26
+ return obj;
27
+ }
28
+ let AppEventBus = class AppEventBus {
29
+ /**
30
+ * 订阅事件
31
+ *
32
+ * @param event - 事件名称
33
+ * @param listener - 事件监听器
34
+ * @param options - 监听器选项
35
+ * @returns 取消订阅函数
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * const unsubscribe = eventBus.on('user:login', (data, metadata) => {
40
+ * console.log('用户登录:', data);
41
+ * });
42
+ *
43
+ * // 取消订阅
44
+ * unsubscribe();
45
+ * ```
46
+ */ on(event, listener, options = {}) {
47
+ const fullEventName = this.getFullEventName(event);
48
+ const listenerId = Symbol(`listener_${++this.listenerIdCounter}`);
49
+ const listenerWithOptions = {
50
+ listener: listener,
51
+ options: {
52
+ priority: options.priority ?? 100,
53
+ once: options.once ?? false,
54
+ namespace: options.namespace ?? this.config.namespacePrefix,
55
+ async: options.async ?? true
56
+ },
57
+ id: listenerId
58
+ };
59
+ if (!this.listeners.has(fullEventName)) {
60
+ this.listeners.set(fullEventName, new Set());
61
+ }
62
+ const listeners = this.listeners.get(fullEventName);
63
+ listeners.add(listenerWithOptions);
64
+ // 按优先级排序(数字越小优先级越高)
65
+ const sortedListeners = Array.from(listeners).sort((a, b)=>a.options.priority - b.options.priority);
66
+ this.listeners.set(fullEventName, new Set(sortedListeners));
67
+ // 返回取消订阅函数
68
+ return ()=>{
69
+ const currentListeners = this.listeners.get(fullEventName);
70
+ if (currentListeners) {
71
+ currentListeners.delete(listenerWithOptions);
72
+ if (currentListeners.size === 0) {
73
+ this.listeners.delete(fullEventName);
74
+ }
75
+ }
76
+ };
77
+ }
78
+ /**
79
+ * 取消订阅事件
80
+ *
81
+ * @param event - 事件名称
82
+ * @param listener - 事件监听器(可选,不提供则取消该事件的所有监听器)
83
+ */ off(event, listener) {
84
+ const fullEventName = this.getFullEventName(event);
85
+ const listeners = this.listeners.get(fullEventName);
86
+ if (!listeners) {
87
+ return;
88
+ }
89
+ if (listener) {
90
+ // 移除指定的监听器
91
+ for (const item of listeners){
92
+ if (item.listener === listener) {
93
+ listeners.delete(item);
94
+ break;
95
+ }
96
+ }
97
+ } else {
98
+ // 移除所有监听器
99
+ listeners.clear();
100
+ }
101
+ if (listeners.size === 0) {
102
+ this.listeners.delete(fullEventName);
103
+ }
104
+ }
105
+ /**
106
+ * 一次性订阅事件
107
+ *
108
+ * @param event - 事件名称
109
+ * @param listener - 事件监听器
110
+ * @param options - 监听器选项
111
+ */ once(event, listener, options) {
112
+ return this.on(event, listener, {
113
+ ...options,
114
+ once: true
115
+ });
116
+ }
117
+ /**
118
+ * 发布事件
119
+ *
120
+ * @param event - 事件名称
121
+ * @param data - 事件数据
122
+ * @param metadata - 事件元数据(可选)
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * await eventBus.emit('user:login', {
127
+ * userId: '123',
128
+ * username: 'john',
129
+ * });
130
+ * ```
131
+ */ async emit(event, data, metadata) {
132
+ const fullEventName = this.getFullEventName(event);
133
+ const startTime = this.config.enablePerformanceMonitoring ? performance.now() : 0;
134
+ // 事件验证
135
+ if (this.config.enableValidation && !this.config.validator(fullEventName, data)) {
136
+ _utils.logger.warn(`事件 ${fullEventName} 验证失败,已忽略`);
137
+ return;
138
+ }
139
+ // 安全检查
140
+ if (this.config.enableSecurityMode && metadata?.source) {
141
+ if (!this.config.allowedSources.includes(metadata.source)) {
142
+ _utils.logger.warn(`事件 ${fullEventName} 的来源 ${metadata.source} 不在白名单中,已忽略`);
143
+ return;
144
+ }
145
+ }
146
+ // 构建事件元数据
147
+ const eventMetadata = {
148
+ source: metadata?.source,
149
+ timestamp: metadata?.timestamp ?? Date.now(),
150
+ eventId: metadata?.eventId ?? `event_${++this.eventCounter}`,
151
+ priority: metadata?.priority ?? 0,
152
+ instanceId: metadata?.instanceId ?? this.config.instanceId,
153
+ namespace: metadata?.namespace ?? this.config.namespacePrefix,
154
+ ...metadata
155
+ };
156
+ // 创建事件包装器
157
+ const eventWrapper = {
158
+ data: data,
159
+ metadata: eventMetadata
160
+ };
161
+ // 执行中间件(中间件可以阻止事件传播)
162
+ if (this.middlewares.length > 0) {
163
+ let middlewareIndex = 0;
164
+ let nextCalled = false;
165
+ const executeMiddleware = async ()=>{
166
+ if (middlewareIndex < this.middlewares.length) {
167
+ nextCalled = false;
168
+ const currentIndex = middlewareIndex;
169
+ const middleware = this.middlewares[middlewareIndex++];
170
+ const next = async ()=>{
171
+ nextCalled = true;
172
+ if (currentIndex < this.middlewares.length - 1) {
173
+ await executeMiddleware();
174
+ }
175
+ };
176
+ await Promise.resolve(middleware(fullEventName, data, eventMetadata, next));
177
+ // 如果中间件没有调用 next(),阻止事件传播
178
+ if (!nextCalled) {
179
+ return;
180
+ }
181
+ }
182
+ };
183
+ await executeMiddleware();
184
+ // 如果最后一个中间件没有调用 next(),阻止事件传播
185
+ if (!nextCalled && this.middlewares.length > 0) {
186
+ return;
187
+ }
188
+ }
189
+ // 获取监听器
190
+ const listeners = this.listeners.get(fullEventName);
191
+ // 记录事件历史(无论是否有监听器)
192
+ if (this.config.enableTracking) {
193
+ const executionTime = this.config.enablePerformanceMonitoring ? performance.now() - startTime : undefined;
194
+ this.recordEventHistory(fullEventName, data, eventMetadata, executionTime);
195
+ }
196
+ if (!listeners || listeners.size === 0) {
197
+ // 更新统计(即使没有监听器也记录)
198
+ this.updateStats(fullEventName, 0);
199
+ return;
200
+ }
201
+ // 执行监听器
202
+ const executionPromises = [];
203
+ const listenersToRemove = [];
204
+ for (const listenerWithOptions of listeners){
205
+ const executeListener = async ()=>{
206
+ try {
207
+ if (listenerWithOptions.options.async) {
208
+ await Promise.resolve(listenerWithOptions.listener(eventWrapper.data, eventWrapper.metadata));
209
+ } else {
210
+ listenerWithOptions.listener(eventWrapper.data, eventWrapper.metadata);
211
+ }
212
+ // 如果是一次性监听器,标记为待移除
213
+ if (listenerWithOptions.options.once) {
214
+ listenersToRemove.push(listenerWithOptions);
215
+ }
216
+ } catch (error) {
217
+ _utils.logger.error(`事件 ${fullEventName} 的监听器执行失败:`, error);
218
+ }
219
+ };
220
+ executionPromises.push(executeListener());
221
+ }
222
+ // 等待所有监听器执行完成
223
+ await Promise.allSettled(executionPromises);
224
+ // 移除一次性监听器
225
+ for (const listenerToRemove of listenersToRemove){
226
+ listeners.delete(listenerToRemove);
227
+ }
228
+ if (listeners.size === 0) {
229
+ this.listeners.delete(fullEventName);
230
+ }
231
+ // 更新统计信息
232
+ const executionTime = this.config.enablePerformanceMonitoring ? performance.now() - startTime : 0;
233
+ this.updateStats(fullEventName, executionTime, listeners.size);
234
+ }
235
+ /**
236
+ * 同步发布事件(不等待异步监听器完成)
237
+ *
238
+ * @param event - 事件名称
239
+ * @param data - 事件数据
240
+ * @param metadata - 事件元数据(可选)
241
+ */ emitSync(event, data, metadata) {
242
+ // 同步执行 emit,但不等待 Promise 完成
243
+ this.emit(event, data, metadata).catch((error)=>{
244
+ _utils.logger.error(`同步发布事件 ${event} 失败:`, error);
245
+ });
246
+ }
247
+ /**
248
+ * 注册事件中间件
249
+ *
250
+ * @param middleware - 中间件函数
251
+ * @returns 取消注册函数
252
+ *
253
+ * @example
254
+ * ```typescript
255
+ * const unsubscribe = eventBus.use((event, data, metadata, next) => {
256
+ * console.log('事件触发:', event);
257
+ * return next();
258
+ * });
259
+ * ```
260
+ */ use(middleware) {
261
+ this.middlewares.push(middleware);
262
+ return ()=>{
263
+ const index = this.middlewares.indexOf(middleware);
264
+ if (index > -1) {
265
+ this.middlewares.splice(index, 1);
266
+ }
267
+ };
268
+ }
269
+ /**
270
+ * 清空所有事件监听器
271
+ */ clear() {
272
+ this.listeners.clear();
273
+ }
274
+ /**
275
+ * 清空事件历史记录
276
+ */ clearHistory() {
277
+ this.eventHistory = [];
278
+ }
279
+ /**
280
+ * 获取事件监听器数量
281
+ *
282
+ * @param event - 事件名称(可选,不提供则返回所有事件的监听器总数)
283
+ */ listenerCount(event) {
284
+ if (event) {
285
+ const fullEventName = this.getFullEventName(event);
286
+ return this.listeners.get(fullEventName)?.size || 0;
287
+ }
288
+ let count = 0;
289
+ for (const listeners of this.listeners.values()){
290
+ count += listeners.size;
291
+ }
292
+ return count;
293
+ }
294
+ /**
295
+ * 获取所有事件名称
296
+ */ eventNames() {
297
+ return Array.from(this.listeners.keys());
298
+ }
299
+ /**
300
+ * 获取事件历史记录
301
+ *
302
+ * @param event - 事件名称(可选,如果提供则只返回该事件的历史)
303
+ * @param limit - 限制返回的记录数
304
+ */ getEventHistory(event, limit) {
305
+ if (!this.config.enableTracking) {
306
+ return [];
307
+ }
308
+ let history = this.eventHistory;
309
+ if (event) {
310
+ const fullEventName = this.getFullEventName(event);
311
+ history = history.filter((h)=>h.event === fullEventName);
312
+ }
313
+ if (limit) {
314
+ history = history.slice(-limit);
315
+ }
316
+ return [
317
+ ...history
318
+ ];
319
+ }
320
+ /**
321
+ * 获取事件统计信息
322
+ *
323
+ * @param event - 事件名称(可选,不提供则返回所有事件的统计)
324
+ */ getStats(event) {
325
+ if (event) {
326
+ const fullEventName = this.getFullEventName(event);
327
+ return this.stats.get(fullEventName) || {
328
+ event: fullEventName,
329
+ count: 0,
330
+ avgExecutionTime: 0,
331
+ listenerCount: 0,
332
+ lastTriggered: 0
333
+ };
334
+ }
335
+ return new Map(this.stats);
336
+ }
337
+ /**
338
+ * 获取配置
339
+ */ getConfig() {
340
+ return {
341
+ ...this.config
342
+ };
343
+ }
344
+ /**
345
+ * 更新配置
346
+ */ updateConfig(config) {
347
+ this.config = {
348
+ ...this.config,
349
+ ...config
350
+ };
351
+ }
352
+ /**
353
+ * 销毁事件总线(清理所有资源)
354
+ */ destroy() {
355
+ this.clear();
356
+ this.clearHistory();
357
+ this.middlewares = [];
358
+ this.stats.clear();
359
+ }
360
+ /**
361
+ * 获取完整事件名称(包含命名空间前缀)
362
+ */ getFullEventName(event) {
363
+ if (this.config.namespacePrefix) {
364
+ return `${this.config.namespacePrefix}${event}`;
365
+ }
366
+ return event;
367
+ }
368
+ /**
369
+ * 记录事件历史
370
+ */ recordEventHistory(event, data, metadata, executionTime) {
371
+ this.eventHistory.push({
372
+ event,
373
+ data,
374
+ metadata,
375
+ executionTime
376
+ });
377
+ // 限制历史记录大小
378
+ if (this.eventHistory.length > this.config.maxHistorySize) {
379
+ this.eventHistory.shift();
380
+ }
381
+ }
382
+ /**
383
+ * 更新统计信息
384
+ */ updateStats(event, executionTime, listenerCount = 0) {
385
+ if (!this.config.enablePerformanceMonitoring) {
386
+ return;
387
+ }
388
+ const existingStats = this.stats.get(event);
389
+ if (existingStats) {
390
+ const totalTime = existingStats.avgExecutionTime * existingStats.count + executionTime;
391
+ const newCount = existingStats.count + 1;
392
+ this.stats.set(event, {
393
+ ...existingStats,
394
+ count: newCount,
395
+ avgExecutionTime: totalTime / newCount,
396
+ listenerCount,
397
+ lastTriggered: Date.now()
398
+ });
399
+ } else {
400
+ this.stats.set(event, {
401
+ event,
402
+ count: 1,
403
+ avgExecutionTime: executionTime,
404
+ listenerCount,
405
+ lastTriggered: Date.now()
406
+ });
407
+ }
408
+ }
409
+ constructor(config = {}){
410
+ /**
411
+ * 事件监听器映射表
412
+ * 使用 Map + Set 结构提高性能
413
+ */ _define_property(this, "listeners", new Map());
414
+ /**
415
+ * 事件历史记录
416
+ */ _define_property(this, "eventHistory", []);
417
+ /**
418
+ * 事件中间件列表
419
+ */ _define_property(this, "middlewares", []);
420
+ /**
421
+ * 事件统计信息
422
+ */ _define_property(this, "stats", new Map());
423
+ /**
424
+ * 配置
425
+ */ _define_property(this, "config", void 0);
426
+ /**
427
+ * 事件计数器(用于生成唯一事件ID)
428
+ */ _define_property(this, "eventCounter", 0);
429
+ /**
430
+ * 监听器ID计数器
431
+ */ _define_property(this, "listenerIdCounter", 0);
432
+ this.config = {
433
+ enableTracking: config.enableTracking ?? process.env.NODE_ENV === 'development',
434
+ maxHistorySize: config.maxHistorySize ?? 100,
435
+ enableValidation: config.enableValidation ?? false,
436
+ validator: config.validator ?? (()=>true),
437
+ enablePerformanceMonitoring: config.enablePerformanceMonitoring ?? process.env.NODE_ENV === 'development',
438
+ namespacePrefix: config.namespacePrefix ?? '',
439
+ instanceId: config.instanceId,
440
+ enableSecurityMode: config.enableSecurityMode ?? false,
441
+ allowedSources: config.allowedSources ?? []
442
+ };
443
+ }
444
+ };
445
+
446
+ //# sourceMappingURL=AppEventBus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/event/AppEventBus.ts"],"sourcesContent":["/**\n * 应用级事件总线\n * 提供高性能、类型安全、可观测的事件通信能力\n */\n\nimport { logger } from '../../utils';\nimport type {\n EventListener,\n EventMetadata,\n EventWrapper,\n EventMiddleware,\n EventListenerOptions,\n AppEventBusConfig,\n EventStats,\n} from './types';\n\n/**\n * 带选项的监听器\n */\ninterface ListenerWithOptions {\n listener: EventListener;\n options: Required<EventListenerOptions>;\n id: symbol;\n}\n\n/**\n * 事件历史记录\n */\ninterface EventHistoryRecord {\n event: string;\n data: unknown;\n metadata: EventMetadata;\n executionTime?: number;\n}\n\n/**\n * 应用事件总线\n */\nexport class AppEventBus {\n /**\n * 事件监听器映射表\n * 使用 Map + Set 结构提高性能\n */\n private listeners: Map<string, Set<ListenerWithOptions>> = new Map();\n \n /**\n * 事件历史记录\n */\n private eventHistory: EventHistoryRecord[] = [];\n \n /**\n * 事件中间件列表\n */\n private middlewares: EventMiddleware[] = [];\n \n /**\n * 事件统计信息\n */\n private stats: Map<string, EventStats> = new Map();\n \n /**\n * 配置\n */\n private config: Required<AppEventBusConfig>;\n \n /**\n * 事件计数器(用于生成唯一事件ID)\n */\n private eventCounter: number = 0;\n \n /**\n * 监听器ID计数器\n */\n private listenerIdCounter: number = 0;\n\n constructor(config: AppEventBusConfig = {}) {\n this.config = {\n enableTracking: config.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: config.maxHistorySize ?? 100,\n enableValidation: config.enableValidation ?? false,\n validator: config.validator ?? (() => true),\n enablePerformanceMonitoring: config.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: config.namespacePrefix ?? '',\n instanceId: config.instanceId,\n enableSecurityMode: config.enableSecurityMode ?? false,\n allowedSources: config.allowedSources ?? [],\n } as Required<AppEventBusConfig>;\n }\n\n /**\n * 订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n * @returns 取消订阅函数\n * \n * @example\n * ```typescript\n * const unsubscribe = eventBus.on('user:login', (data, metadata) => {\n * console.log('用户登录:', data);\n * });\n * \n * // 取消订阅\n * unsubscribe();\n * ```\n */\n on<T = unknown>(\n event: string,\n listener: EventListener<T>,\n options: EventListenerOptions = {}\n ): () => void {\n const fullEventName = this.getFullEventName(event);\n const listenerId = Symbol(`listener_${++this.listenerIdCounter}`);\n \n const listenerWithOptions: ListenerWithOptions = {\n listener: listener as EventListener,\n options: {\n priority: options.priority ?? 100,\n once: options.once ?? false,\n namespace: options.namespace ?? this.config.namespacePrefix,\n async: options.async ?? true,\n },\n id: listenerId,\n };\n\n if (!this.listeners.has(fullEventName)) {\n this.listeners.set(fullEventName, new Set());\n }\n\n const listeners = this.listeners.get(fullEventName)!;\n listeners.add(listenerWithOptions);\n\n // 按优先级排序(数字越小优先级越高)\n const sortedListeners = Array.from(listeners).sort(\n (a, b) => a.options.priority - b.options.priority\n );\n this.listeners.set(fullEventName, new Set(sortedListeners));\n\n // 返回取消订阅函数\n return () => {\n const currentListeners = this.listeners.get(fullEventName);\n if (currentListeners) {\n currentListeners.delete(listenerWithOptions);\n if (currentListeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n }\n };\n }\n\n /**\n * 取消订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器(可选,不提供则取消该事件的所有监听器)\n */\n off<T = unknown>(event: string, listener?: EventListener<T>): void {\n const fullEventName = this.getFullEventName(event);\n const listeners = this.listeners.get(fullEventName);\n \n if (!listeners) {\n return;\n }\n\n if (listener) {\n // 移除指定的监听器\n for (const item of listeners) {\n if (item.listener === listener) {\n listeners.delete(item);\n break;\n }\n }\n } else {\n // 移除所有监听器\n listeners.clear();\n }\n\n if (listeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n }\n\n /**\n * 一次性订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n */\n once<T = unknown>(\n event: string,\n listener: EventListener<T>,\n options?: Omit<EventListenerOptions, 'once'>\n ): () => void {\n return this.on(event, listener, { ...options, once: true });\n }\n\n /**\n * 发布事件\n * \n * @param event - 事件名称\n * @param data - 事件数据\n * @param metadata - 事件元数据(可选)\n * \n * @example\n * ```typescript\n * await eventBus.emit('user:login', {\n * userId: '123',\n * username: 'john',\n * });\n * ```\n */\n async emit<T = unknown>(\n event: string,\n data?: T,\n metadata?: Partial<EventMetadata>\n ): Promise<void> {\n const fullEventName = this.getFullEventName(event);\n const startTime = this.config.enablePerformanceMonitoring ? performance.now() : 0;\n\n // 事件验证\n if (this.config.enableValidation && !this.config.validator(fullEventName, data)) {\n logger.warn(`事件 ${fullEventName} 验证失败,已忽略`);\n return;\n }\n\n // 安全检查\n if (this.config.enableSecurityMode && metadata?.source) {\n if (!this.config.allowedSources.includes(metadata.source)) {\n logger.warn(`事件 ${fullEventName} 的来源 ${metadata.source} 不在白名单中,已忽略`);\n return;\n }\n }\n\n // 构建事件元数据\n const eventMetadata: EventMetadata = {\n source: metadata?.source,\n timestamp: metadata?.timestamp ?? Date.now(),\n eventId: metadata?.eventId ?? `event_${++this.eventCounter}`,\n priority: metadata?.priority ?? 0,\n instanceId: metadata?.instanceId ?? this.config.instanceId,\n namespace: metadata?.namespace ?? this.config.namespacePrefix,\n ...metadata,\n };\n\n // 创建事件包装器\n const eventWrapper: EventWrapper<T> = {\n data: data as T,\n metadata: eventMetadata,\n };\n\n // 执行中间件(中间件可以阻止事件传播)\n if (this.middlewares.length > 0) {\n let middlewareIndex = 0;\n let nextCalled = false;\n \n const executeMiddleware = async (): Promise<void> => {\n if (middlewareIndex < this.middlewares.length) {\n nextCalled = false;\n const currentIndex = middlewareIndex;\n const middleware = this.middlewares[middlewareIndex++];\n \n const next = async () => {\n nextCalled = true;\n if (currentIndex < this.middlewares.length - 1) {\n await executeMiddleware();\n }\n };\n \n await Promise.resolve(middleware(fullEventName, data, eventMetadata, next));\n \n // 如果中间件没有调用 next(),阻止事件传播\n if (!nextCalled) {\n return;\n }\n }\n };\n \n await executeMiddleware();\n \n // 如果最后一个中间件没有调用 next(),阻止事件传播\n if (!nextCalled && this.middlewares.length > 0) {\n return;\n }\n }\n\n // 获取监听器\n const listeners = this.listeners.get(fullEventName);\n \n // 记录事件历史(无论是否有监听器)\n if (this.config.enableTracking) {\n const executionTime = this.config.enablePerformanceMonitoring\n ? performance.now() - startTime\n : undefined;\n this.recordEventHistory(fullEventName, data, eventMetadata, executionTime);\n }\n \n if (!listeners || listeners.size === 0) {\n // 更新统计(即使没有监听器也记录)\n this.updateStats(fullEventName, 0);\n return;\n }\n\n // 执行监听器\n const executionPromises: Promise<void>[] = [];\n const listenersToRemove: ListenerWithOptions[] = [];\n\n for (const listenerWithOptions of listeners) {\n const executeListener = async () => {\n try {\n if (listenerWithOptions.options.async) {\n await Promise.resolve(\n listenerWithOptions.listener(eventWrapper.data, eventWrapper.metadata)\n );\n } else {\n listenerWithOptions.listener(eventWrapper.data, eventWrapper.metadata);\n }\n\n // 如果是一次性监听器,标记为待移除\n if (listenerWithOptions.options.once) {\n listenersToRemove.push(listenerWithOptions);\n }\n } catch (error) {\n logger.error(`事件 ${fullEventName} 的监听器执行失败:`, error);\n }\n };\n\n executionPromises.push(executeListener());\n }\n\n // 等待所有监听器执行完成\n await Promise.allSettled(executionPromises);\n\n // 移除一次性监听器\n for (const listenerToRemove of listenersToRemove) {\n listeners.delete(listenerToRemove);\n }\n\n if (listeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n\n // 更新统计信息\n const executionTime = this.config.enablePerformanceMonitoring\n ? performance.now() - startTime\n : 0;\n this.updateStats(fullEventName, executionTime, listeners.size);\n }\n\n /**\n * 同步发布事件(不等待异步监听器完成)\n * \n * @param event - 事件名称\n * @param data - 事件数据\n * @param metadata - 事件元数据(可选)\n */\n emitSync<T = unknown>(\n event: string,\n data?: T,\n metadata?: Partial<EventMetadata>\n ): void {\n // 同步执行 emit,但不等待 Promise 完成\n this.emit(event, data, metadata).catch((error) => {\n logger.error(`同步发布事件 ${event} 失败:`, error);\n });\n }\n\n /**\n * 注册事件中间件\n * \n * @param middleware - 中间件函数\n * @returns 取消注册函数\n * \n * @example\n * ```typescript\n * const unsubscribe = eventBus.use((event, data, metadata, next) => {\n * console.log('事件触发:', event);\n * return next();\n * });\n * ```\n */\n use(middleware: EventMiddleware): () => void {\n this.middlewares.push(middleware);\n \n return () => {\n const index = this.middlewares.indexOf(middleware);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n }\n };\n }\n\n /**\n * 清空所有事件监听器\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * 清空事件历史记录\n */\n clearHistory(): void {\n this.eventHistory = [];\n }\n\n /**\n * 获取事件监听器数量\n * \n * @param event - 事件名称(可选,不提供则返回所有事件的监听器总数)\n */\n listenerCount(event?: string): number {\n if (event) {\n const fullEventName = this.getFullEventName(event);\n return this.listeners.get(fullEventName)?.size || 0;\n }\n\n let count = 0;\n for (const listeners of this.listeners.values()) {\n count += listeners.size;\n }\n return count;\n }\n\n /**\n * 获取所有事件名称\n */\n eventNames(): string[] {\n return Array.from(this.listeners.keys());\n }\n\n /**\n * 获取事件历史记录\n * \n * @param event - 事件名称(可选,如果提供则只返回该事件的历史)\n * @param limit - 限制返回的记录数\n */\n getEventHistory(event?: string, limit?: number): EventHistoryRecord[] {\n if (!this.config.enableTracking) {\n return [];\n }\n\n let history = this.eventHistory;\n if (event) {\n const fullEventName = this.getFullEventName(event);\n history = history.filter((h) => h.event === fullEventName);\n }\n\n if (limit) {\n history = history.slice(-limit);\n }\n\n return [...history];\n }\n\n /**\n * 获取事件统计信息\n * \n * @param event - 事件名称(可选,不提供则返回所有事件的统计)\n */\n getStats(event?: string): EventStats | Map<string, EventStats> {\n if (event) {\n const fullEventName = this.getFullEventName(event);\n return this.stats.get(fullEventName) || {\n event: fullEventName,\n count: 0,\n avgExecutionTime: 0,\n listenerCount: 0,\n lastTriggered: 0,\n };\n }\n\n return new Map(this.stats);\n }\n\n /**\n * 获取配置\n */\n getConfig(): AppEventBusConfig {\n return { ...this.config };\n }\n\n /**\n * 更新配置\n */\n updateConfig(config: Partial<AppEventBusConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n };\n }\n\n /**\n * 销毁事件总线(清理所有资源)\n */\n destroy(): void {\n this.clear();\n this.clearHistory();\n this.middlewares = [];\n this.stats.clear();\n }\n\n /**\n * 获取完整事件名称(包含命名空间前缀)\n */\n private getFullEventName(event: string): string {\n if (this.config.namespacePrefix) {\n return `${this.config.namespacePrefix}${event}`;\n }\n return event;\n }\n\n /**\n * 记录事件历史\n */\n private recordEventHistory(\n event: string,\n data: unknown,\n metadata: EventMetadata,\n executionTime?: number\n ): void {\n this.eventHistory.push({\n event,\n data,\n metadata,\n executionTime,\n });\n\n // 限制历史记录大小\n if (this.eventHistory.length > this.config.maxHistorySize) {\n this.eventHistory.shift();\n }\n }\n\n /**\n * 更新统计信息\n */\n private updateStats(\n event: string,\n executionTime: number,\n listenerCount: number = 0\n ): void {\n if (!this.config.enablePerformanceMonitoring) {\n return;\n }\n\n const existingStats = this.stats.get(event);\n if (existingStats) {\n const totalTime = existingStats.avgExecutionTime * existingStats.count + executionTime;\n const newCount = existingStats.count + 1;\n \n this.stats.set(event, {\n ...existingStats,\n count: newCount,\n avgExecutionTime: totalTime / newCount,\n listenerCount,\n lastTriggered: Date.now(),\n });\n } else {\n this.stats.set(event, {\n event,\n count: 1,\n avgExecutionTime: executionTime,\n listenerCount,\n lastTriggered: Date.now(),\n });\n }\n }\n}\n"],"names":["AppEventBus","on","event","listener","options","fullEventName","getFullEventName","listenerId","Symbol","listenerIdCounter","listenerWithOptions","priority","once","namespace","config","namespacePrefix","async","id","listeners","has","set","Set","get","add","sortedListeners","Array","from","sort","a","b","currentListeners","delete","size","off","item","clear","emit","data","metadata","startTime","enablePerformanceMonitoring","performance","now","enableValidation","validator","logger","warn","enableSecurityMode","source","allowedSources","includes","eventMetadata","timestamp","Date","eventId","eventCounter","instanceId","eventWrapper","middlewares","length","middlewareIndex","nextCalled","executeMiddleware","currentIndex","middleware","next","Promise","resolve","enableTracking","executionTime","undefined","recordEventHistory","updateStats","executionPromises","listenersToRemove","executeListener","push","error","allSettled","listenerToRemove","emitSync","catch","use","index","indexOf","splice","clearHistory","eventHistory","listenerCount","count","values","eventNames","keys","getEventHistory","limit","history","filter","h","slice","getStats","stats","avgExecutionTime","lastTriggered","Map","getConfig","updateConfig","destroy","maxHistorySize","shift","existingStats","totalTime","newCount","process","env","NODE_ENV"],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * 应用级事件总线
3
+ * 提供高性能、类型安全、可观测的事件通信能力
4
+ */
5
+ import type { EventListener, EventMetadata, EventMiddleware, EventListenerOptions, AppEventBusConfig, EventStats } from './types';
6
+ /**
7
+ * 事件历史记录
8
+ */
9
+ interface EventHistoryRecord {
10
+ event: string;
11
+ data: unknown;
12
+ metadata: EventMetadata;
13
+ executionTime?: number;
14
+ }
15
+ /**
16
+ * 应用事件总线
17
+ */
18
+ export declare class AppEventBus {
19
+ /**
20
+ * 事件监听器映射表
21
+ * 使用 Map + Set 结构提高性能
22
+ */
23
+ private listeners;
24
+ /**
25
+ * 事件历史记录
26
+ */
27
+ private eventHistory;
28
+ /**
29
+ * 事件中间件列表
30
+ */
31
+ private middlewares;
32
+ /**
33
+ * 事件统计信息
34
+ */
35
+ private stats;
36
+ /**
37
+ * 配置
38
+ */
39
+ private config;
40
+ /**
41
+ * 事件计数器(用于生成唯一事件ID)
42
+ */
43
+ private eventCounter;
44
+ /**
45
+ * 监听器ID计数器
46
+ */
47
+ private listenerIdCounter;
48
+ constructor(config?: AppEventBusConfig);
49
+ /**
50
+ * 订阅事件
51
+ *
52
+ * @param event - 事件名称
53
+ * @param listener - 事件监听器
54
+ * @param options - 监听器选项
55
+ * @returns 取消订阅函数
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const unsubscribe = eventBus.on('user:login', (data, metadata) => {
60
+ * console.log('用户登录:', data);
61
+ * });
62
+ *
63
+ * // 取消订阅
64
+ * unsubscribe();
65
+ * ```
66
+ */
67
+ on<T = unknown>(event: string, listener: EventListener<T>, options?: EventListenerOptions): () => void;
68
+ /**
69
+ * 取消订阅事件
70
+ *
71
+ * @param event - 事件名称
72
+ * @param listener - 事件监听器(可选,不提供则取消该事件的所有监听器)
73
+ */
74
+ off<T = unknown>(event: string, listener?: EventListener<T>): void;
75
+ /**
76
+ * 一次性订阅事件
77
+ *
78
+ * @param event - 事件名称
79
+ * @param listener - 事件监听器
80
+ * @param options - 监听器选项
81
+ */
82
+ once<T = unknown>(event: string, listener: EventListener<T>, options?: Omit<EventListenerOptions, 'once'>): () => void;
83
+ /**
84
+ * 发布事件
85
+ *
86
+ * @param event - 事件名称
87
+ * @param data - 事件数据
88
+ * @param metadata - 事件元数据(可选)
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * await eventBus.emit('user:login', {
93
+ * userId: '123',
94
+ * username: 'john',
95
+ * });
96
+ * ```
97
+ */
98
+ emit<T = unknown>(event: string, data?: T, metadata?: Partial<EventMetadata>): Promise<void>;
99
+ /**
100
+ * 同步发布事件(不等待异步监听器完成)
101
+ *
102
+ * @param event - 事件名称
103
+ * @param data - 事件数据
104
+ * @param metadata - 事件元数据(可选)
105
+ */
106
+ emitSync<T = unknown>(event: string, data?: T, metadata?: Partial<EventMetadata>): void;
107
+ /**
108
+ * 注册事件中间件
109
+ *
110
+ * @param middleware - 中间件函数
111
+ * @returns 取消注册函数
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * const unsubscribe = eventBus.use((event, data, metadata, next) => {
116
+ * console.log('事件触发:', event);
117
+ * return next();
118
+ * });
119
+ * ```
120
+ */
121
+ use(middleware: EventMiddleware): () => void;
122
+ /**
123
+ * 清空所有事件监听器
124
+ */
125
+ clear(): void;
126
+ /**
127
+ * 清空事件历史记录
128
+ */
129
+ clearHistory(): void;
130
+ /**
131
+ * 获取事件监听器数量
132
+ *
133
+ * @param event - 事件名称(可选,不提供则返回所有事件的监听器总数)
134
+ */
135
+ listenerCount(event?: string): number;
136
+ /**
137
+ * 获取所有事件名称
138
+ */
139
+ eventNames(): string[];
140
+ /**
141
+ * 获取事件历史记录
142
+ *
143
+ * @param event - 事件名称(可选,如果提供则只返回该事件的历史)
144
+ * @param limit - 限制返回的记录数
145
+ */
146
+ getEventHistory(event?: string, limit?: number): EventHistoryRecord[];
147
+ /**
148
+ * 获取事件统计信息
149
+ *
150
+ * @param event - 事件名称(可选,不提供则返回所有事件的统计)
151
+ */
152
+ getStats(event?: string): EventStats | Map<string, EventStats>;
153
+ /**
154
+ * 获取配置
155
+ */
156
+ getConfig(): AppEventBusConfig;
157
+ /**
158
+ * 更新配置
159
+ */
160
+ updateConfig(config: Partial<AppEventBusConfig>): void;
161
+ /**
162
+ * 销毁事件总线(清理所有资源)
163
+ */
164
+ destroy(): void;
165
+ /**
166
+ * 获取完整事件名称(包含命名空间前缀)
167
+ */
168
+ private getFullEventName;
169
+ /**
170
+ * 记录事件历史
171
+ */
172
+ private recordEventHistory;
173
+ /**
174
+ * 更新统计信息
175
+ */
176
+ private updateStats;
177
+ }
178
+ export {};
179
+ //# sourceMappingURL=AppEventBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppEventBus.d.ts","sourceRoot":"","sources":["../../../src/core/event/AppEventBus.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAEb,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,EACX,MAAM,SAAS,CAAC;AAWjB;;GAEG;AACH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB;;;OAGG;IACH,OAAO,CAAC,SAAS,CAAoD;IAErE;;OAEG;IACH,OAAO,CAAC,YAAY,CAA4B;IAEhD;;OAEG;IACH,OAAO,CAAC,WAAW,CAAyB;IAE5C;;OAEG;IACH,OAAO,CAAC,KAAK,CAAsC;IAEnD;;OAEG;IACH,OAAO,CAAC,MAAM,CAA8B;IAE5C;;OAEG;IACH,OAAO,CAAC,YAAY,CAAa;IAEjC;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAAa;gBAE1B,MAAM,GAAE,iBAAsB;IAc1C;;;;;;;;;;;;;;;;;OAiBG;IACH,EAAE,CAAC,CAAC,GAAG,OAAO,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,OAAO,GAAE,oBAAyB,GACjC,MAAM,IAAI;IAwCb;;;;;OAKG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IA0BlE;;;;;;OAMG;IACH,IAAI,CAAC,CAAC,GAAG,OAAO,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,GAC3C,MAAM,IAAI;IAIb;;;;;;;;;;;;;;OAcG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,CAAC,EACR,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAqIhB;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,GAAG,OAAO,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,CAAC,EACR,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAChC,IAAI;IAOP;;;;;;;;;;;;;OAaG;IACH,GAAG,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM,IAAI;IAW5C;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;;;OAIG;IACH,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAarC;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;;;;OAKG;IACH,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAkBrE;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAe9D;;OAEG;IACH,SAAS,IAAI,iBAAiB;IAI9B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAOtD;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,WAAW;CA+BpB"}