/** * @module CoHostState * @module_description * 连线主播管理模块 * 核心功能:实现主播间的连线功能,支持主播邀请、连线申请、连线状态管理等主播间互动功能。 * 技术特点:支持多主播音视频同步、画中画显示、音视频质量优化等高级技术,确保连线体验的流畅性。 * 业务价值:为直播平台提供主播间协作的核心能力,支持PK、合作直播等高级业务场景。 * 应用场景:主播连线、合作直播、跨平台连线、主播互动等高级直播场景。 */ import { ref } from "vue"; import { LiveUserInfoParam, RequestHostConnectionOptions, CancelHostConnectionOptions, AcceptHostConnectionOptions, RejectHostConnectionOptions, ExitHostConnectionOptions, ILiveListener } from "@/uni_modules/tuikit-atomic-x"; import { getRTCRoomEngineManager } from "./rtcRoomEngine"; import { callUTSFunction, safeJsonParse } from "../utils/utsUtils"; /** * 已连接的连线主播列表 * @type {Ref} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { connected } = useCoHostState('your_live_id'); * * // 监听已连接的连线主播列表变化 * watch(connected, (newConnected) => { * if (newConnected && newConnected.length > 0) { * console.log('已连接的主播列表:', newConnected); * } * }); * * // 获取当前已连接的连线主播数量 * const coHosts = connected.value; * console.log('已连接的主播数:', coHosts.length); */ const connected = ref([]); /** * 被邀请连线的主播列表 * @type {Ref} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { invitees } = useCoHostState('your_live_id'); * * // 监听被邀请的主播列表变化 * watch(invitees, (newInvitees) => { * if (newInvitees && newInvitees.length > 0) { * console.log('被邀请的主播列表:', newInvitees); * } * }); * * // 获取当前被邀请的主播列表 * const invitedHosts = invitees.value; * console.log('被邀请的主播数:', invitedHosts.length); */ const invitees = ref([]); /** * 当前申请连线的主播信息 * @type {Ref} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { applicant } = useCoHostState('your_live_id'); * * // 监听申请连线的主播信息变化 * watch(applicant, (newApplicant) => { * if (newApplicant) { * console.log('申请主播:', newApplicant.userID); * } * }); * * // 获取当前申请连线的主播信息 * const currentApplicant = applicant.value; * if (currentApplicant) { * console.log('当前申请连线的主播:', currentApplicant.nickname); * } */ const applicant = ref(); /** * 可邀请连线的候选主播列表 * @type {Ref} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { candidates } = useCoHostState('your_live_id'); * * // 监听候选主播列表变化 * watch(candidates, (newCandidates) => { * if (newCandidates && newCandidates.length > 0) { * console.log('候选主播列表:', newCandidates); * } * }); * * // 获取当前候选主播列表 * const candidateHosts = candidates.value; * console.log('候选主播数:', candidateHosts.length); */ const candidates = ref([]); /** * 当前连线状态 * @type {Ref} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { coHostStatus } = useCoHostState('your_live_id'); * * // 监听连线状态变化 * watch(coHostStatus, (newStatus) => { * console.log('连线状态:', newStatus); * }); * * // 获取当前连线状态 * const status = coHostStatus.value; * console.log('当前连线状态:', status); */ const coHostStatus = ref('') /** * 请求连线 * @param {RequestHostConnectionOptions} params - 请求连线参数 * @returns {void} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { requestHostConnection } = useCoHostState("your_live_id"); * requestHostConnection({}); */ function requestHostConnection(params: RequestHostConnectionOptions): void { callUTSFunction("requestHostConnection", params); } /** * 取消连线请求 * @param {CancelHostConnectionOptions} params - 取消连线请求参数 * @returns {void} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { cancelHostConnection } = useCoHostState(“your_live_id”); * cancelHostConnection({ toHostLiveID : "target_live_id" }); */ function cancelHostConnection(params: CancelHostConnectionOptions): void { callUTSFunction("cancelHostConnection", params); } /** * 接受连线请求 * @param {AcceptHostConnectionOptions} params - 接受连线请求参数 * @returns {void} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { acceptHostConnection } = useCoHostState(“your_live_id”); * acceptHostConnection({ fromHostLiveID: "from_live_id" }); */ function acceptHostConnection(params: AcceptHostConnectionOptions): void { callUTSFunction("acceptHostConnection", params); } /** * 拒绝连线请求 * @param {RejectHostConnectionOptions} params - 拒绝连线请求参数 * @returns {void} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { rejectHostConnection } = useCoHostState(“your_live_id”); * rejectHostConnection({ fromHostLiveID: "from_live_id" }); */ function rejectHostConnection(params: RejectHostConnectionOptions): void { callUTSFunction("rejectHostConnection", params); } /** * 退出连线 * @param {ExitHostConnectionOptions} params - 退出连线参数 * @returns {void} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { exitHostConnection } = useCoHostState(“your_live_id”); * exitHostConnection({}); */ function exitHostConnection(params: ExitHostConnectionOptions): void { callUTSFunction("exitHostConnection", params); } /** * 添加连线主播事件监听 * @param {string} liveID - 直播间ID * @param {string} eventName - 事件名称,可选值: 'onCoHostRequestReceived'(收到连线请求)
'onCoHostRequestCancelled'(连线请求被取消)
'onCoHostRequestAccepted'(连线请求被接受)
'onCoHostRequestRejected'(连线请求被拒绝)
'onCoHostRequestTimeout'(连线请求超时)
'onCoHostUserJoined'(连线用户加入)
'onCoHostUserLeft'(连线用户离开) * @param {ILiveListener} listener - 事件回调函数 * @returns {void} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { addCoHostListener } = useCoHostState("your_live_id"); * addCoHostListener('your_live_id', 'onCoHostRequestReceived', { * callback: (params) => { * console.log('result:', params); * } * }); */ function addCoHostListener(liveID: string, eventName: string, listener: ILiveListener): void { getRTCRoomEngineManager().addCoHostListener(liveID, eventName, listener); } /** * 移除连线主播事件监听 * @param {string} liveID - 直播间ID * @param {string} eventName - 事件名称,可选值: 'onCoHostRequestReceived'(收到连线请求)
'onCoHostRequestCancelled'(连线请求被取消)
'onCoHostRequestAccepted'(连线请求被接受)
'onCoHostRequestRejected'(连线请求被拒绝)
'onCoHostRequestTimeout'(连线请求超时)
'onCoHostUserJoined'(连线用户加入)
'onCoHostUserLeft'(连线用户离开) * @param {ILiveListener} listener - 事件回调函数 * @returns {void} * @memberof module:CoHostState * @example * import { useCoHostState } from '@/uni_modules/tuikit-atomic-x/state/CoHostState'; * const { removeCoHostListener } = useCoHostState("your_live_id"); * removeCoHostListener('your_live_id', 'onCoHostRequestReceived', hostListener); */ function removeCoHostListener(liveID: string, eventName: string, listener: ILiveListener): void { getRTCRoomEngineManager().removeCoHostListener(liveID, eventName, listener); } const onCoHostStoreChanged = (eventName: string, res: string): void => { try { if (eventName === "connected") { const data = safeJsonParse(res, []); connected.value = data; } else if (eventName === "invitees") { const data = safeJsonParse(res, []); invitees.value = data; } else if (eventName === "applicant") { const data = safeJsonParse(res, null); applicant.value = data; } else if (eventName === "candidates") { const data = safeJsonParse(res, []); candidates.value = data; } else if (eventName === "coHostStatus") { coHostStatus.value = JSON.parse(res); } } catch (error) { console.error("onCoHostStoreChanged error:", error); } }; function bindEvent(liveID: string): void { getRTCRoomEngineManager().on("coHostStoreChanged", onCoHostStoreChanged, liveID); } export function useCoHostState(liveID: string) { bindEvent(liveID); return { coHostStatus, // 当前连线状态 connected, // 已连接的连线主播列表 invitees, // 被邀请连线的主播列表 applicant, // 当前申请连线的主播信息 // candidates, // 可邀请连线的候选主播列表: TODO:待支持 requestHostConnection, // 请求连线 cancelHostConnection, // 取消连线请求 acceptHostConnection, // 接受连线请求 rejectHostConnection, // 拒绝连线请求 exitHostConnection, // 退出连线 addCoHostListener, // 添加连线事件监听 removeCoHostListener, // 移除连线事件监听 }; } export default useCoHostState;