ly-utils-lib 2.6.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -90,6 +90,9 @@ import { captureToPDF, createPDF } from 'ly-utils-lib/pdf'
90
90
 
91
91
  // 只导入 WebSocket 模块
92
92
  import { createWebSocket, quickConnect } from 'ly-utils-lib/websocket'
93
+
94
+ // 只导入 Event 模块
95
+ import { createEventBus, waitForEvent } from 'ly-utils-lib/event'
93
96
  ```
94
97
 
95
98
  ## 模块文档
@@ -675,6 +678,133 @@ map.destroy()
675
678
  | `lonLatToXY(lon, lat)` | 经纬度转投影 | `lonLatToXY(116.39, 39.90)` |
676
679
  | `xyToLonLat(x, y)` | 投影转经纬度 | `xyToLonLat(x, y)` |
677
680
 
681
+ ### 🎯 Event Module - 事件管理
682
+
683
+ 基于 [mitt](https://github.com/developit/mitt) 封装的轻量级事件发布订阅系统,提供类型安全的事件管理。
684
+
685
+ ```typescript
686
+ import {
687
+ createEventBus,
688
+ getGlobalEventBus,
689
+ waitForEvent,
690
+ batchSubscribe,
691
+ createNamespacedEventBus,
692
+ } from 'ly-utils-lib/event'
693
+
694
+ // 定义事件类型
695
+ interface AppEvents {
696
+ 'user:login': { id: number; name: string }
697
+ 'user:logout': never
698
+ 'data:loaded': { data: any[] }
699
+ 'error': Error
700
+ }
701
+
702
+ // 方式 1: 创建类型化的事件总线
703
+ const bus = createEventBus<AppEvents>({ debug: true })
704
+
705
+ // 订阅事件
706
+ const unsubscribe = bus.on('user:login', (user) => {
707
+ console.log('User logged in:', user.name)
708
+ })
709
+
710
+ // 订阅一次性事件
711
+ bus.once('data:loaded', (data) => {
712
+ console.log('Data loaded:', data.data)
713
+ })
714
+
715
+ // 发布事件
716
+ bus.emit('user:login', { id: 1, name: 'Alice' })
717
+ bus.emit('user:logout')
718
+ bus.emit('error', new Error('Something went wrong'))
719
+
720
+ // 取消订阅
721
+ unsubscribe()
722
+
723
+ // 方式 2: 批量订阅
724
+ batchSubscribe(bus, {
725
+ 'user:login': (user) => console.log('Login:', user),
726
+ 'user:logout': () => console.log('Logout'),
727
+ 'error': (error) => console.error('Error:', error),
728
+ })
729
+
730
+ // 方式 3: 等待事件触发
731
+ const userData = await waitForEvent<{ id: number; name: string }>(
732
+ bus,
733
+ 'user:login',
734
+ 5000
735
+ )
736
+ console.log('User logged in:', userData.name)
737
+
738
+ // 方式 4: 使用命名空间
739
+ const userBus = createNamespacedEventBus('user')
740
+ const appBus = createNamespacedEventBus('app')
741
+
742
+ userBus.emit('login') // 实际事件名: user:login
743
+ appBus.emit('ready') // 实际事件名: app:ready
744
+
745
+ // 方式 5: 使用全局事件总线
746
+ const globalBus = getGlobalEventBus({ debug: true })
747
+ globalBus.emit('app:ready')
748
+ ```
749
+
750
+ **API 列表:**
751
+
752
+ #### 创建事件总线
753
+
754
+ | 类/函数 | 说明 | 示例 |
755
+ | --------------------------------------------- | --------------------- | -------------------------------------- |
756
+ | `createEventBus<E>(options)` | 创建事件总线 | `createEventBus({debug: true})` |
757
+ | `getGlobalEventBus<E>(options?)` | 获取全局事件总线 | `getGlobalEventBus()` |
758
+ | `createNamespacedEventBus<E>(namespace)` | 创建命名空间总线 | `createNamespacedEventBus('user')` |
759
+
760
+ #### 订阅事件
761
+
762
+ | 类/函数 | 说明 | 示例 |
763
+ | --------------------------------------------- | --------------------- | -------------------------------------- |
764
+ | `bus.on(event, handler)` | 订阅事件 | `bus.on('click', handler)` |
765
+ | `bus.once(event, handler)` | 订阅一次事件 | `bus.once('init', handler)` |
766
+ | `batchSubscribe(bus, events)` | 批量订阅 | `batchSubscribe(bus, {...})` |
767
+ | `waitForEvent(bus, event, timeout)` | 等待事件触发 | `waitForEvent(bus, 'ready', 5000)` |
768
+
769
+ #### 发布事件
770
+
771
+ | 类/函数 | 说明 | 示例 |
772
+ | --------------------------------------------- | --------------------- | -------------------------------------- |
773
+ | `bus.emit(event, data?)` | 发布事件 | `bus.emit('click', {x, y})` |
774
+
775
+ #### 取消订阅
776
+
777
+ | 类/函数 | 说明 | 示例 |
778
+ | --------------------------------------------- | --------------------- | -------------------------------------- |
779
+ | `bus.off(event, handler?)` | 取消订阅 | `bus.off('click', handler)` |
780
+ | `bus.clear()` | 清空所有监听器 | `bus.clear()` |
781
+
782
+ #### 查询方法
783
+
784
+ | 类/函数 | 说明 | 示例 |
785
+ | --------------------------------------------- | --------------------- | -------------------------------------- |
786
+ | `bus.getListenerCount(event?)` | 获取监听器数量 | `bus.getListenerCount()` |
787
+ | `bus.getEventNames()` | 获取所有事件名 | `bus.getEventNames()` |
788
+ | `bus.getListeners(event)` | 获取监听器列表 | `bus.getListeners('click')` |
789
+
790
+ #### 配置选项
791
+
792
+ | 选项 | 说明 | 默认值 |
793
+ | --------------------------------------------- | --------------------- | -------------------------------------- |
794
+ | `debug` | 调试日志 | true |
795
+ | `prefix` | 事件名前缀 | '' |
796
+
797
+ #### 高级功能
798
+
799
+ - ✅ 类型安全的事件定义
800
+ - ✅ 支持命名空间
801
+ - ✅ 支持全局单例
802
+ - ✅ 批量订阅/取消
803
+ - ✅ 等待事件触发(Promise)
804
+ - ✅ 一次性事件
805
+ - ✅ 监听器管理
806
+ - ✅ 调试日志
807
+
678
808
  ### 🔌 WebSocket Module - WebSocket 工具
679
809
 
680
810
  提供简化的 WebSocket 连接、消息发送、心跳检测和重连机制。
package/dist/event.cjs ADDED
@@ -0,0 +1,234 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var mitt = require('mitt');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var mitt__default = /*#__PURE__*/_interopDefault(mitt);
10
+
11
+ // src/modules/event/index.ts
12
+ var EventBus = class {
13
+ constructor(options = {}) {
14
+ this.listeners = /* @__PURE__ */ new Map();
15
+ this.options = {
16
+ debug: options.debug ?? false,
17
+ prefix: options.prefix ?? ""
18
+ };
19
+ this.emitter = mitt__default.default();
20
+ this.log("EventBus created");
21
+ }
22
+ on(event, handler) {
23
+ const events = Array.isArray(event) ? event : [event];
24
+ const unsubscribers = [];
25
+ events.forEach((eventName) => {
26
+ const fullName = this.getFullName(eventName);
27
+ const wrappedHandler = (data) => {
28
+ this.log(`Event triggered: ${fullName}`, data);
29
+ return handler(data);
30
+ };
31
+ this.emitter.on(fullName, wrappedHandler);
32
+ const meta = {
33
+ event: fullName,
34
+ handler: wrappedHandler,
35
+ once: false,
36
+ timestamp: Date.now()
37
+ };
38
+ this.addListener(fullName, meta);
39
+ unsubscribers.push(() => {
40
+ this.emitter.off(fullName, wrappedHandler);
41
+ this.removeListener(fullName, wrappedHandler);
42
+ this.log(`Unsubscribed from: ${fullName}`);
43
+ });
44
+ });
45
+ return () => {
46
+ unsubscribers.forEach((unsub) => unsub());
47
+ };
48
+ }
49
+ once(event, handler) {
50
+ const events = Array.isArray(event) ? event : [event];
51
+ const unsubscribers = [];
52
+ events.forEach((eventName) => {
53
+ const fullName = this.getFullName(eventName);
54
+ const wrappedHandler = (data) => {
55
+ this.log(`One-time event triggered: ${fullName}`, data);
56
+ this.emitter.off(fullName, wrappedHandler);
57
+ this.removeListener(fullName, wrappedHandler);
58
+ return handler(data);
59
+ };
60
+ this.emitter.on(fullName, wrappedHandler);
61
+ const meta = {
62
+ event: fullName,
63
+ handler: wrappedHandler,
64
+ once: true,
65
+ timestamp: Date.now()
66
+ };
67
+ this.addListener(fullName, meta);
68
+ unsubscribers.push(() => {
69
+ this.emitter.off(fullName, wrappedHandler);
70
+ this.removeListener(fullName, wrappedHandler);
71
+ });
72
+ });
73
+ return () => {
74
+ unsubscribers.forEach((unsub) => unsub());
75
+ };
76
+ }
77
+ off(event, handler) {
78
+ const events = Array.isArray(event) ? event : [event];
79
+ events.forEach((eventName) => {
80
+ const fullName = this.getFullName(eventName);
81
+ const listeners = this.listeners.get(fullName) || [];
82
+ if (handler) {
83
+ const index = listeners.findIndex((meta) => meta.handler === handler);
84
+ if (index !== -1) {
85
+ this.emitter.off(fullName, listeners[index].handler);
86
+ listeners.splice(index, 1);
87
+ this.log(`Removed handler from: ${fullName}`);
88
+ }
89
+ } else {
90
+ listeners.forEach((meta) => {
91
+ this.emitter.off(fullName, meta.handler);
92
+ });
93
+ this.listeners.delete(fullName);
94
+ this.log(`Cleared all listeners for: ${fullName}`);
95
+ }
96
+ });
97
+ }
98
+ emit(event, data) {
99
+ const fullName = this.getFullName(event);
100
+ this.log(`Emitting event: ${fullName}`, data);
101
+ this.emitter.emit(fullName, data);
102
+ }
103
+ /**
104
+ * 清空所有事件监听器
105
+ */
106
+ clear() {
107
+ this.emitter.all.clear();
108
+ this.listeners.clear();
109
+ this.log("All event listeners cleared");
110
+ }
111
+ /**
112
+ * 获取所有事件
113
+ */
114
+ get all() {
115
+ return this.emitter.all;
116
+ }
117
+ /**
118
+ * 获取事件监听器数量
119
+ */
120
+ getListenerCount(event) {
121
+ if (event) {
122
+ const fullName = this.getFullName(event);
123
+ return this.listeners.get(fullName)?.length || 0;
124
+ }
125
+ return Array.from(this.listeners.values()).reduce((total, list) => total + list.length, 0);
126
+ }
127
+ /**
128
+ * 获取所有事件名称
129
+ */
130
+ getEventNames() {
131
+ return Array.from(this.listeners.keys());
132
+ }
133
+ /**
134
+ * 获取事件监听器列表
135
+ */
136
+ getListeners(event) {
137
+ const fullName = this.getFullName(event);
138
+ return this.listeners.get(fullName) || [];
139
+ }
140
+ /**
141
+ * 添加监听器记录
142
+ */
143
+ addListener(event, meta) {
144
+ if (!this.listeners.has(event)) {
145
+ this.listeners.set(event, []);
146
+ }
147
+ this.listeners.get(event).push(meta);
148
+ }
149
+ /**
150
+ * 移除监听器记录
151
+ */
152
+ removeListener(event, handler) {
153
+ const listeners = this.listeners.get(event);
154
+ if (listeners) {
155
+ const index = listeners.findIndex((meta) => meta.handler === handler);
156
+ if (index !== -1) {
157
+ listeners.splice(index, 1);
158
+ }
159
+ if (listeners.length === 0) {
160
+ this.listeners.delete(event);
161
+ }
162
+ }
163
+ }
164
+ /**
165
+ * 获取完整的事件名称(带前缀)
166
+ */
167
+ getFullName(event) {
168
+ return this.options.prefix ? `${this.options.prefix}:${event}` : event;
169
+ }
170
+ /**
171
+ * 日志输出
172
+ */
173
+ log(...args) {
174
+ if (this.options.debug) {
175
+ console.log("[EventBus]", ...args);
176
+ }
177
+ }
178
+ };
179
+ function createEventBus(options) {
180
+ return new EventBus(options);
181
+ }
182
+ var globalEventBus = null;
183
+ function getGlobalEventBus(options) {
184
+ if (!globalEventBus) {
185
+ globalEventBus = createEventBus(options);
186
+ }
187
+ return globalEventBus;
188
+ }
189
+ function waitForEvent(bus, event, timeout = 5e3) {
190
+ return new Promise((resolve, reject) => {
191
+ const timer = setTimeout(() => {
192
+ unsubscribe();
193
+ reject(new Error(`Timeout waiting for event: ${event}`));
194
+ }, timeout);
195
+ const unsubscribe = bus.on(event, (data) => {
196
+ clearTimeout(timer);
197
+ unsubscribe();
198
+ resolve(data);
199
+ });
200
+ });
201
+ }
202
+ function batchSubscribe(bus, events) {
203
+ const unsubscribers = [];
204
+ Object.entries(events).forEach(([event, handler]) => {
205
+ unsubscribers.push(bus.on(event, handler));
206
+ });
207
+ return () => {
208
+ unsubscribers.forEach((unsub) => unsub());
209
+ };
210
+ }
211
+ function createNamespacedEventBus(namespace, options) {
212
+ return createEventBus({
213
+ ...options,
214
+ prefix: namespace
215
+ });
216
+ }
217
+ var event_default = {
218
+ EventBus,
219
+ createEventBus,
220
+ getGlobalEventBus,
221
+ waitForEvent,
222
+ batchSubscribe,
223
+ createNamespacedEventBus
224
+ };
225
+
226
+ exports.EventBus = EventBus;
227
+ exports.batchSubscribe = batchSubscribe;
228
+ exports.createEventBus = createEventBus;
229
+ exports.createNamespacedEventBus = createNamespacedEventBus;
230
+ exports.default = event_default;
231
+ exports.getGlobalEventBus = getGlobalEventBus;
232
+ exports.waitForEvent = waitForEvent;
233
+ //# sourceMappingURL=event.cjs.map
234
+ //# sourceMappingURL=event.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/event/index.ts"],"names":["mitt"],"mappings":"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","file":"event.cjs","sourcesContent":["/**\n * Event Module - 事件管理工具\n *\n * 基于 mitt 封装的事件发布订阅系统,提供类型安全的事件管理\n */\n\nimport mitt, { Emitter, EventType, Handler } from 'mitt'\n\n// ==================== 类型定义 ====================\n\n/**\n * 事件类型映射\n * 使用字符串索引签名,可以注册任意事件\n */\nexport type EventHandler<T = any> = (data: T) => void | Promise<void>\n\n/**\n * 事件总线配置选项\n */\nexport interface EventBusOptions {\n /** 是否记录日志 */\n debug?: boolean\n /** 事件名称前缀 */\n prefix?: string\n}\n\n/**\n * 事件监听器元数据\n */\nexport interface ListenerMeta {\n /** 事件名称 */\n event: string\n /** 处理函数 */\n handler: EventHandler\n /** 是否只监听一次 */\n once: boolean\n /** 监听时间 */\n timestamp: number\n}\n\n/**\n * 事件总线实例接口\n */\nexport interface IEventBus<E extends Record<EventType, unknown>> {\n /**\n * 订阅事件\n * @param event - 事件名称\n * @param handler - 事件处理函数\n * @returns 取消订阅的函数\n */\n on<K extends keyof E>(event: K, handler: EventHandler<E[K]>): () => void\n on(event: string | string[], handler: EventHandler): () => void\n\n /**\n * 订阅事件(只执行一次)\n * @param event - 事件名称\n * @param handler - 事件处理函数\n * @returns 取消订阅的函数\n */\n once<K extends keyof E>(event: K, handler: EventHandler<E[K]>): () => void\n once(event: string | string[], handler: EventHandler): () => void\n\n /**\n * 取消订阅\n * @param event - 事件名称\n * @param handler - 事件处理函数\n */\n off<K extends keyof E>(event: K, handler?: EventHandler<E[K]>): void\n off(event: string | string[], handler?: EventHandler): void\n\n /**\n * 发布事件\n * @param event - 事件名称\n * @param data - 事件数据\n */\n emit<K extends keyof E>(event: K, data?: E[K]): void\n emit(event: string, data?: unknown): void\n\n /**\n * 清空所有事件监听器\n */\n clear(): void\n\n /**\n * 获取所有事件名称\n */\n all: Emitter<E>['all']\n}\n\n// ==================== EventBus 类 ====================\n\n/**\n * 事件总线类\n * @template E - 事件类型映射\n * @example\n * ```ts\n * // 定义事件类型\n * interface Events {\n * user: { id: number; name: string }\n * message: string\n * error: Error\n * }\n *\n * const bus = createEventBus<Events>()\n *\n * // 订阅事件\n * bus.on('user', (user) => console.log(user.name))\n *\n * // 发布事件\n * bus.emit('user', { id: 1, name: 'Alice' })\n * ```\n */\nexport class EventBus<E extends Record<EventType, unknown> = Record<string, any>>\n implements IEventBus<E>\n{\n private emitter: Emitter<E>\n private options: Required<Omit<EventBusOptions, 'prefix'>> & Pick<EventBusOptions, 'prefix'>\n private listeners: Map<string, ListenerMeta[]> = new Map()\n\n constructor(options: EventBusOptions = {}) {\n this.options = {\n debug: options.debug ?? false,\n prefix: options.prefix ?? '',\n }\n\n this.emitter = mitt<E>()\n this.log('EventBus created')\n }\n\n /**\n * 订阅事件\n */\n on<K extends keyof E>(\n event: K,\n handler: EventHandler<E[K]>\n ): () => void\n on(event: string | string[], handler: EventHandler): () => void\n on(event: any, handler: any): () => void {\n const events = Array.isArray(event) ? event : [event]\n const unsubscribers: (() => void)[] = []\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n\n const wrappedHandler: Handler = (data: any) => {\n this.log(`Event triggered: ${fullName}`, data)\n return handler(data)\n }\n\n this.emitter.on(fullName, wrappedHandler)\n\n // 记录监听器\n const meta: ListenerMeta = {\n event: fullName,\n handler: wrappedHandler,\n once: false,\n timestamp: Date.now(),\n }\n this.addListener(fullName, meta)\n\n // 返回取消订阅函数\n unsubscribers.push(() => {\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n this.log(`Unsubscribed from: ${fullName}`)\n })\n })\n\n // 返回一个取消所有订阅的函数\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n }\n\n /**\n * 订阅事件(只执行一次)\n */\n once<K extends keyof E>(\n event: K,\n handler: EventHandler<E[K]>\n ): () => void\n once(event: string | string[], handler: EventHandler): () => void\n once(event: any, handler: any): () => void {\n const events = Array.isArray(event) ? event : [event]\n const unsubscribers: (() => void)[] = []\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n\n const wrappedHandler: Handler = (data: any) => {\n this.log(`One-time event triggered: ${fullName}`, data)\n\n // 执行后立即取消订阅\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n\n return handler(data)\n }\n\n this.emitter.on(fullName, wrappedHandler)\n\n // 记录监听器\n const meta: ListenerMeta = {\n event: fullName,\n handler: wrappedHandler,\n once: true,\n timestamp: Date.now(),\n }\n this.addListener(fullName, meta)\n\n unsubscribers.push(() => {\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n })\n })\n\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n }\n\n /**\n * 取消订阅\n */\n off<K extends keyof E>(event: K, handler?: EventHandler<E[K]>): void\n off(event: string | string[], handler?: EventHandler): void\n off(event: any, handler?: any): void {\n const events = Array.isArray(event) ? event : [event]\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n const listeners = this.listeners.get(fullName) || []\n\n if (handler) {\n // 移除特定处理函数\n const index = listeners.findIndex((meta) => meta.handler === handler)\n if (index !== -1) {\n this.emitter.off(fullName, listeners[index].handler)\n listeners.splice(index, 1)\n this.log(`Removed handler from: ${fullName}`)\n }\n } else {\n // 移除所有处理函数\n listeners.forEach((meta) => {\n this.emitter.off(fullName, meta.handler)\n })\n this.listeners.delete(fullName)\n this.log(`Cleared all listeners for: ${fullName}`)\n }\n })\n }\n\n /**\n * 发布事件\n */\n emit<K extends keyof E>(event: K, data?: E[K]): void\n emit(event: string, data?: unknown): void\n emit(event: any, data?: any): void {\n const fullName = this.getFullName(event)\n this.log(`Emitting event: ${fullName}`, data)\n this.emitter.emit(fullName, data)\n }\n\n /**\n * 清空所有事件监听器\n */\n clear(): void {\n this.emitter.all.clear()\n this.listeners.clear()\n this.log('All event listeners cleared')\n }\n\n /**\n * 获取所有事件\n */\n get all(): any {\n return this.emitter.all\n }\n\n /**\n * 获取事件监听器数量\n */\n getListenerCount(event?: string): number {\n if (event) {\n const fullName = this.getFullName(event)\n return this.listeners.get(fullName)?.length || 0\n }\n return Array.from(this.listeners.values()).reduce((total, list) => total + list.length, 0)\n }\n\n /**\n * 获取所有事件名称\n */\n getEventNames(): string[] {\n return Array.from(this.listeners.keys())\n }\n\n /**\n * 获取事件监听器列表\n */\n getListeners(event: string): ListenerMeta[] {\n const fullName = this.getFullName(event)\n return this.listeners.get(fullName) || []\n }\n\n /**\n * 添加监听器记录\n */\n private addListener(event: string, meta: ListenerMeta): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, [])\n }\n this.listeners.get(event)!.push(meta)\n }\n\n /**\n * 移除监听器记录\n */\n private removeListener(event: string, handler: Handler): void {\n const listeners = this.listeners.get(event)\n if (listeners) {\n const index = listeners.findIndex((meta) => meta.handler === handler)\n if (index !== -1) {\n listeners.splice(index, 1)\n }\n if (listeners.length === 0) {\n this.listeners.delete(event)\n }\n }\n }\n\n /**\n * 获取完整的事件名称(带前缀)\n */\n private getFullName(event: string): string {\n return this.options.prefix ? `${this.options.prefix}:${event}` : event\n }\n\n /**\n * 日志输出\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[EventBus]', ...args)\n }\n }\n}\n\n// ==================== 工厂函数 ====================\n\n/**\n * 创建事件总线实例\n * @param options - 配置选项\n * @returns 事件总线实例\n * @example\n * ```ts\n * // 创建事件总线\n * const bus = createEventBus({\n * debug: true,\n * prefix: 'app'\n * })\n *\n * // 订阅事件\n * const unsubscribe = bus.on('user:login', (user) => {\n * console.log('User logged in:', user)\n * })\n *\n * // 发布事件\n * bus.emit('user:login', { id: 1, name: 'Alice' })\n *\n * // 取消订阅\n * unsubscribe()\n * ```\n */\nexport function createEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n options?: EventBusOptions\n): IEventBus<E> {\n return new EventBus<E>(options)\n}\n\n/**\n * 创建全局事件总线(单例)\n * @param options - 配置选项\n * @returns 全局事件总线实例\n * @example\n * ```ts\n * // 获取全局事件总线\n * const globalBus = getGlobalEventBus({ debug: true })\n *\n * // 在任何地方使用\n * globalBus.emit('app:ready')\n * ```\n */\nlet globalEventBus: IEventBus<any> | null = null\n\nexport function getGlobalEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n options?: EventBusOptions\n): IEventBus<E> {\n if (!globalEventBus) {\n globalEventBus = createEventBus<E>(options)\n }\n return globalEventBus as IEventBus<E>\n}\n\n// ==================== 工具函数 ====================\n\n/**\n * 等待事件触发\n * @param bus - 事件总线\n * @param event - 事件名称\n * @param timeout - 超时时间(毫秒),默认 5000\n * @returns Promise,在事件触发时 resolve\n * @example\n * ```ts\n * const bus = createEventBus()\n *\n * // 等待事件\n * const data = await waitForEvent(bus, 'data:ready')\n * console.log('Data ready:', data)\n * ```\n */\nexport function waitForEvent<T = any>(\n bus: IEventBus<Record<string, any>>,\n event: string,\n timeout: number = 5000\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n unsubscribe()\n reject(new Error(`Timeout waiting for event: ${event}`))\n }, timeout)\n\n const unsubscribe = bus.on(event, (data: T) => {\n clearTimeout(timer)\n unsubscribe()\n resolve(data)\n })\n })\n}\n\n/**\n * 批量订阅事件\n * @param bus - 事件总线\n * @param events - 事件映射\n * @returns 取消所有订阅的函数\n * @example\n * ```ts\n * const bus = createEventBus()\n *\n * const unsubscribe = batchSubscribe(bus, {\n * 'user:login': (user) => console.log('Login:', user),\n * 'user:logout': () => console.log('Logout'),\n * 'error': (error) => console.error('Error:', error)\n * })\n * ```\n */\nexport function batchSubscribe(\n bus: IEventBus<Record<string, any>>,\n events: Record<string, EventHandler<any>>\n): () => void {\n const unsubscribers: (() => void)[] = []\n\n Object.entries(events).forEach(([event, handler]) => {\n unsubscribers.push(bus.on(event, handler))\n })\n\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n}\n\n/**\n * 创建命名空间事件总线\n * @param namespace - 命名空间\n * @param options - 配置选项\n * @returns 事件总线实例\n * @example\n * ```ts\n * const userBus = createNamespacedEventBus('user')\n * const appBus = createNamespacedEventBus('app')\n *\n * userBus.emit('login') // 实际事件名: user:login\n * appBus.emit('ready') // 实际事件名: app:ready\n * ```\n */\nexport function createNamespacedEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n namespace: string,\n options?: Omit<EventBusOptions, 'prefix'>\n): IEventBus<E> {\n return createEventBus<E>({\n ...options,\n prefix: namespace,\n }) as IEventBus<E>\n}\n\n// ==================== 导出 ====================\n\nexport default {\n EventBus,\n createEventBus,\n getGlobalEventBus,\n waitForEvent,\n batchSubscribe,\n createNamespacedEventBus,\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import 'mitt';
2
+ export { E as EventBus, a as EventBusOptions, b as EventHandler, I as IEventBus, L as ListenerMeta, c as batchSubscribe, d as createEventBus, e as createNamespacedEventBus, _ as default, g as getGlobalEventBus, w as waitForEvent } from './index-g6UFPtxf.cjs';
@@ -0,0 +1,2 @@
1
+ import 'mitt';
2
+ export { E as EventBus, a as EventBusOptions, b as EventHandler, I as IEventBus, L as ListenerMeta, c as batchSubscribe, d as createEventBus, e as createNamespacedEventBus, _ as default, g as getGlobalEventBus, w as waitForEvent } from './index-g6UFPtxf.js';
package/dist/event.js ADDED
@@ -0,0 +1,220 @@
1
+ import mitt from 'mitt';
2
+
3
+ // src/modules/event/index.ts
4
+ var EventBus = class {
5
+ constructor(options = {}) {
6
+ this.listeners = /* @__PURE__ */ new Map();
7
+ this.options = {
8
+ debug: options.debug ?? false,
9
+ prefix: options.prefix ?? ""
10
+ };
11
+ this.emitter = mitt();
12
+ this.log("EventBus created");
13
+ }
14
+ on(event, handler) {
15
+ const events = Array.isArray(event) ? event : [event];
16
+ const unsubscribers = [];
17
+ events.forEach((eventName) => {
18
+ const fullName = this.getFullName(eventName);
19
+ const wrappedHandler = (data) => {
20
+ this.log(`Event triggered: ${fullName}`, data);
21
+ return handler(data);
22
+ };
23
+ this.emitter.on(fullName, wrappedHandler);
24
+ const meta = {
25
+ event: fullName,
26
+ handler: wrappedHandler,
27
+ once: false,
28
+ timestamp: Date.now()
29
+ };
30
+ this.addListener(fullName, meta);
31
+ unsubscribers.push(() => {
32
+ this.emitter.off(fullName, wrappedHandler);
33
+ this.removeListener(fullName, wrappedHandler);
34
+ this.log(`Unsubscribed from: ${fullName}`);
35
+ });
36
+ });
37
+ return () => {
38
+ unsubscribers.forEach((unsub) => unsub());
39
+ };
40
+ }
41
+ once(event, handler) {
42
+ const events = Array.isArray(event) ? event : [event];
43
+ const unsubscribers = [];
44
+ events.forEach((eventName) => {
45
+ const fullName = this.getFullName(eventName);
46
+ const wrappedHandler = (data) => {
47
+ this.log(`One-time event triggered: ${fullName}`, data);
48
+ this.emitter.off(fullName, wrappedHandler);
49
+ this.removeListener(fullName, wrappedHandler);
50
+ return handler(data);
51
+ };
52
+ this.emitter.on(fullName, wrappedHandler);
53
+ const meta = {
54
+ event: fullName,
55
+ handler: wrappedHandler,
56
+ once: true,
57
+ timestamp: Date.now()
58
+ };
59
+ this.addListener(fullName, meta);
60
+ unsubscribers.push(() => {
61
+ this.emitter.off(fullName, wrappedHandler);
62
+ this.removeListener(fullName, wrappedHandler);
63
+ });
64
+ });
65
+ return () => {
66
+ unsubscribers.forEach((unsub) => unsub());
67
+ };
68
+ }
69
+ off(event, handler) {
70
+ const events = Array.isArray(event) ? event : [event];
71
+ events.forEach((eventName) => {
72
+ const fullName = this.getFullName(eventName);
73
+ const listeners = this.listeners.get(fullName) || [];
74
+ if (handler) {
75
+ const index = listeners.findIndex((meta) => meta.handler === handler);
76
+ if (index !== -1) {
77
+ this.emitter.off(fullName, listeners[index].handler);
78
+ listeners.splice(index, 1);
79
+ this.log(`Removed handler from: ${fullName}`);
80
+ }
81
+ } else {
82
+ listeners.forEach((meta) => {
83
+ this.emitter.off(fullName, meta.handler);
84
+ });
85
+ this.listeners.delete(fullName);
86
+ this.log(`Cleared all listeners for: ${fullName}`);
87
+ }
88
+ });
89
+ }
90
+ emit(event, data) {
91
+ const fullName = this.getFullName(event);
92
+ this.log(`Emitting event: ${fullName}`, data);
93
+ this.emitter.emit(fullName, data);
94
+ }
95
+ /**
96
+ * 清空所有事件监听器
97
+ */
98
+ clear() {
99
+ this.emitter.all.clear();
100
+ this.listeners.clear();
101
+ this.log("All event listeners cleared");
102
+ }
103
+ /**
104
+ * 获取所有事件
105
+ */
106
+ get all() {
107
+ return this.emitter.all;
108
+ }
109
+ /**
110
+ * 获取事件监听器数量
111
+ */
112
+ getListenerCount(event) {
113
+ if (event) {
114
+ const fullName = this.getFullName(event);
115
+ return this.listeners.get(fullName)?.length || 0;
116
+ }
117
+ return Array.from(this.listeners.values()).reduce((total, list) => total + list.length, 0);
118
+ }
119
+ /**
120
+ * 获取所有事件名称
121
+ */
122
+ getEventNames() {
123
+ return Array.from(this.listeners.keys());
124
+ }
125
+ /**
126
+ * 获取事件监听器列表
127
+ */
128
+ getListeners(event) {
129
+ const fullName = this.getFullName(event);
130
+ return this.listeners.get(fullName) || [];
131
+ }
132
+ /**
133
+ * 添加监听器记录
134
+ */
135
+ addListener(event, meta) {
136
+ if (!this.listeners.has(event)) {
137
+ this.listeners.set(event, []);
138
+ }
139
+ this.listeners.get(event).push(meta);
140
+ }
141
+ /**
142
+ * 移除监听器记录
143
+ */
144
+ removeListener(event, handler) {
145
+ const listeners = this.listeners.get(event);
146
+ if (listeners) {
147
+ const index = listeners.findIndex((meta) => meta.handler === handler);
148
+ if (index !== -1) {
149
+ listeners.splice(index, 1);
150
+ }
151
+ if (listeners.length === 0) {
152
+ this.listeners.delete(event);
153
+ }
154
+ }
155
+ }
156
+ /**
157
+ * 获取完整的事件名称(带前缀)
158
+ */
159
+ getFullName(event) {
160
+ return this.options.prefix ? `${this.options.prefix}:${event}` : event;
161
+ }
162
+ /**
163
+ * 日志输出
164
+ */
165
+ log(...args) {
166
+ if (this.options.debug) {
167
+ console.log("[EventBus]", ...args);
168
+ }
169
+ }
170
+ };
171
+ function createEventBus(options) {
172
+ return new EventBus(options);
173
+ }
174
+ var globalEventBus = null;
175
+ function getGlobalEventBus(options) {
176
+ if (!globalEventBus) {
177
+ globalEventBus = createEventBus(options);
178
+ }
179
+ return globalEventBus;
180
+ }
181
+ function waitForEvent(bus, event, timeout = 5e3) {
182
+ return new Promise((resolve, reject) => {
183
+ const timer = setTimeout(() => {
184
+ unsubscribe();
185
+ reject(new Error(`Timeout waiting for event: ${event}`));
186
+ }, timeout);
187
+ const unsubscribe = bus.on(event, (data) => {
188
+ clearTimeout(timer);
189
+ unsubscribe();
190
+ resolve(data);
191
+ });
192
+ });
193
+ }
194
+ function batchSubscribe(bus, events) {
195
+ const unsubscribers = [];
196
+ Object.entries(events).forEach(([event, handler]) => {
197
+ unsubscribers.push(bus.on(event, handler));
198
+ });
199
+ return () => {
200
+ unsubscribers.forEach((unsub) => unsub());
201
+ };
202
+ }
203
+ function createNamespacedEventBus(namespace, options) {
204
+ return createEventBus({
205
+ ...options,
206
+ prefix: namespace
207
+ });
208
+ }
209
+ var event_default = {
210
+ EventBus,
211
+ createEventBus,
212
+ getGlobalEventBus,
213
+ waitForEvent,
214
+ batchSubscribe,
215
+ createNamespacedEventBus
216
+ };
217
+
218
+ export { EventBus, batchSubscribe, createEventBus, createNamespacedEventBus, event_default as default, getGlobalEventBus, waitForEvent };
219
+ //# sourceMappingURL=event.js.map
220
+ //# sourceMappingURL=event.js.map