/** * 轻量事件总线:用于 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, }; }