import { LiveMsg } from '../typings'; import { LiveState } from '../typings/live/LiveState'; import { RobustWebSocketEventDetail } from '../utils/RobustWebSocket'; import { Subscribe } from '../utils/subscribe'; /** * 带看控制器事件映射 * * 定义了 LiveController 可以触发的事件类型 */ export type LiveControllerEventMap = { /** * 带看连接状态变更事件 * * @param state 当前连接状态 * @param prevState 之前的连接状态 */ stateChange: (state: LiveState, prevState: LiveState) => void; /** * 接收到带看消息事件 * * @param message 接收到的消息对象 */ message: (message: LiveMsg) => void; /** * 带看重连中事件 * * 当 WebSocket 连接断开并开始重连时触发 * * @param detail 重连详情,包含重连次数等信息 */ reconnecting: (detail: RobustWebSocketEventDetail) => void; /** * 带看重连成功事件 * * 当 WebSocket 重连成功后触发 * * @param detail 重连详情,包含重连次数等信息 */ reconnected: (detail: RobustWebSocketEventDetail) => void; }; /** * 带看控制器类 * * 负责管理 WebSocket 连接的建立、消息收发、重连等底层通信功能。 * 基于 RobustWebSocket 实现,提供自动重连能力。 * * @example * ```typescript * const controller = new LiveController() * * // 监听状态变化 * controller.on('stateChange', (state, prevState) => { * console.log(`状态从 ${prevState} 变为 ${state}`) * }) * * // 监听消息 * controller.on('message', (message) => { * console.log('收到消息:', message) * }) * * // 打开连接 * controller.open('wss://example.com/live') * * // 发送消息 * controller.sendMessage({ command: 'test', data: {} }) * * // 关闭连接 * await controller.close() * ``` */ export declare class LiveController extends Subscribe { /** * WebSocket 代理器(内部使用) * 基于 RobustWebSocket 实现,提供自动重连能力 */ private _ws; /** * 带看连接状态(内部存储) */ private _state; /** * 设置连接状态 * * 当状态改变时,会自动触发 stateChange 事件 * * @param state 新的连接状态 */ set state(state: LiveState); /** * 获取当前连接状态 * * @returns 当前连接状态 */ get state(): LiveState; /** * 创建带看控制器实例 * * 会自动初始化 WebSocket 事件监听器 */ constructor(); /** * 添加 WebSocket 事件监听(内部方法) * 监听 WebSocket 的各种事件并转换为控制器事件 */ private _addWebSocketEventListeners; /** * 移除 WebSocket 事件监听(内部方法) * 在销毁实例时调用,清理所有事件监听器 */ private _removeWebSocketEventListeners; /** * 处理 WebSocket 关闭事件(内部方法) * * @param event WebSocket 关闭事件对象 */ private _handleCloseEvent; /** * 处理 WebSocket 正在关闭事件(内部方法) * * 当连接正在关闭时触发,可能是由于网络断开等原因 */ private _handleClosingEvent; /** * 处理 WebSocket 连接中事件(内部方法) * * 当开始连接或重连时触发,如果是重连会触发 reconnecting 事件 * * @param ev WebSocket 连接事件对象 */ private _handleConnectingEvent; /** * 处理 WebSocket 错误事件(内部方法) * * @param event 错误事件对象 */ private _handleErrorEvent; /** * 处理 WebSocket 消息事件(内部方法) * * 解析接收到的消息并触发 message 事件 * * @param event WebSocket 消息事件对象 */ private _handleMessageEvent; /** * 处理 WebSocket 连接成功事件(内部方法) * * 当连接建立成功时触发,如果是重连成功会触发 reconnected 事件 * * @param event WebSocket 打开事件对象 */ private _handleOpenEvent; /** * 处理 WebSocket 连接超时事件(内部方法) * * @param event WebSocket 超时事件对象 */ private _handleTimeoutEvent; /** * 释放控制器资源 * * 移除所有事件监听器并关闭 WebSocket 连接。 * 释放后需要重新实例化才能使用。 * * @returns Promise 关闭是否成功 * @example * ```typescript * await controller.dispose() * ``` */ dispose: () => Promise; /** * 打开 WebSocket 连接 * * 开始建立与服务器的 WebSocket 连接。 * * @param url WebSocket 连接地址(ws:// 或 wss://) * @example * ```typescript * controller.open('wss://example.com/live?ticket=xxx') * ``` */ open: (url: string) => void; /** * 关闭 WebSocket 连接 * * 关闭与服务器的 WebSocket 连接。 * * @param code 关闭代码(可选),WebSocket 关闭码 * @param reason 关闭原因(可选),关闭原因字符串 * @returns Promise 关闭是否成功 * @example * ```typescript * // 正常关闭 * await controller.close() * * // 指定关闭码和原因 * await controller.close(1000, '正常关闭') * ``` */ close: (code?: string | number | undefined, reason?: string | undefined) => Promise; /** * 发送消息到服务器 * * 只有在连接状态为 OPEN 时才能发送消息。 * 消息会被自动序列化为 JSON 字符串。 * * @param data 要发送的数据对象,不能为 undefined 或 null * @returns 发送是否成功 * @throws {Error} 如果消息为空或连接未打开,会抛出错误 * @example * ```typescript * // 发送消息 * controller.sendMessage({ * command: 'test', * data: { message: 'hello' } * }) * * // 检查连接状态 * if (controller.state === LiveState.OPEN) { * controller.sendMessage({ command: 'ping' }) * } * ``` */ sendMessage: (data?: any) => void | undefined; /** * 准备关闭带看连接 * * 标记连接为显式关闭,防止自动重连。 * 通常在用户主动退出时调用。 * * @example * ```typescript * controller.readyClose() * await controller.close() * ``` */ readyClose: () => void; }