UNPKG

yirtc-sdk-web

Version:

基于WebRTC的实时音视频SDK

106 lines (105 loc) 2.83 kB
/** * 事件发射器类 */ export class EventEmitter { constructor() { this.events = new Map(); } /** * 注册事件监听器 * @param event 事件名称 * @param listener 监听器函数 * @returns this */ on(event, listener) { if (!this.events.has(event)) { this.events.set(event, []); } const listeners = this.events.get(event); if (listeners) { listeners.push(listener); } return this; } /** * 注册一次性事件监听器 * @param event 事件名称 * @param listener 监听器函数 * @returns this */ once(event, listener) { const onceWrapper = (...args) => { listener(...args); this.off(event, onceWrapper); }; return this.on(event, onceWrapper); } /** * 移除事件监听器 * @param event 事件名称 * @param listener 监听器函数 * @returns this */ off(event, listener) { if (this.events.has(event)) { const listeners = this.events.get(event); if (listeners) { const index = listeners.indexOf(listener); if (index !== -1) { listeners.splice(index, 1); } } } return this; } /** * 触发事件 * @param event 事件名称 * @param args 事件参数 * @returns boolean */ emit(event, ...args) { if (this.events.has(event)) { const listeners = this.events.get(event); if (listeners) { // 创建副本以防止在迭代过程中修改数组 [...listeners].forEach(listener => { try { listener(...args); } catch (error) { console.error(`事件监听器执行错误: ${event}`, error); } }); return true; } } return false; } /** * 移除所有事件监听器 * @param event 可选,指定事件名称 * @returns this */ removeAllListeners(event) { if (event) { this.events.delete(event); } else { this.events.clear(); } return this; } /** * 获取事件监听器数量 * @param event 事件名称 * @returns number */ listenerCount(event) { if (this.events.has(event)) { const listeners = this.events.get(event); return listeners ? listeners.length : 0; } return 0; } }