/** * 轻量事件总线:用于 BLE Core 与业务模块之间的事件解耦。 */ export function createEventBus() { const listeners = {} /** 订阅事件,返回取消订阅函数。 */ function on(eventName, handler) { if (!listeners[eventName]) { listeners[eventName] = new Set() } listeners[eventName].add(handler) // 返回取消订阅函数,方便调用方在页面卸载时回收监听。 return () => { off(eventName, handler) } } /** 单次订阅:触发一次后自动取消。 */ function once(eventName, handler) { const unsubscribe = on(eventName, (payload) => { unsubscribe() handler(payload) }) return unsubscribe } /** 取消指定事件的某个监听。 */ function off(eventName, handler) { if (!listeners[eventName]) { return } listeners[eventName].delete(handler) } /** 广播事件,所有监听器同步执行(内部已 try-catch 隔离)。 */ function emit(eventName, payload) { if (!listeners[eventName]) { return } listeners[eventName].forEach((handler) => { try { handler(payload) } catch (error) { console.error('[BLE event handler error]', eventName, error) } }) } /** 清空所有事件监听。 */ function clear() { Object.keys(listeners).forEach((eventName) => { listeners[eventName].clear() }) } return { on, once, off, emit, clear } }