gaoluyang
2026-06-29 27cd042df9aca0383a49f3514bc21958dd890912
src/api/im/rtc/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
import { requestClient } from '#/api/request';
export namespace ImRtcApi {
  /** åˆ›å»ºæ–°é€šè¯è¯·æ±‚ VO */
  export interface RtcCallCreateReqVO {
    conversationType: number;
    mediaType: number;
    groupId?: number;
    inviteeIds: number[]; // è¢«é‚€è¯·çš„用户编号集合;私聊必传 1 ä¸ªå¯¹ç«¯ï¼Œç¾¤èŠå¿…传至少 1 äºº
  }
  /** é€šè¯ä¸­è¿½åŠ é‚€è¯·è¯·æ±‚ VO;仅群通话可用 */
  export interface RtcCallInviteReqVO {
    room: string;
    inviteeIds: number[];
  }
  /** é€šè¯ä¼šè¯ VO;create / join / accept / refreshToken å…±ç”¨ */
  export interface RtcCallRespVO {
    room: string; // ä¸šåŠ¡é€šè¯ç¼–å·ï¼ˆåŒæ—¶ä½œä¸º LiveKit æˆ¿é—´åï¼‰
    livekitUrl: string;
    token?: string; // ENDED çŠ¶æ€æ—¶ä¸º null(无需 connect LiveKit)
    conversationType: number;
    mediaType: number;
    status: number;
    endReason?: number; // ç»“束原因;仅 status=ENDED æ—¶æœ‰å€¼
    inviterId: number;
    groupId?: number;
    inviteeIds?: number[];
    joinedUserIds?: number[];
  }
  /** ç¾¤æ´»è·ƒé€šè¯æŸ¥è¯¢å“åº”;不含 token */
  export interface RtcGroupCallRespVO {
    room: string;
    groupId: number;
    mediaType: number;
    inviterId: number;
    joinedUserIds?: number[];
    inviteeIds?: number[];
  }
}
/** åˆ›å»ºæ–°é€šè¯ï¼›ç§èŠæˆ–群聊根据 conversationType åŒºåˆ† */
export function createCall(data: ImRtcApi.RtcCallCreateReqVO) {
  return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/create', data);
}
/** é€šè¯ä¸­è¿½åŠ é‚€è¯·ï¼›ä»…ç¾¤é€šè¯å¯ç”¨ */
export function inviteCall(data: ImRtcApi.RtcCallInviteReqVO) {
  return requestClient.post<boolean>('/im/rtc/invite', data);
}
/** åŠ å…¥å·²æœ‰ç¾¤é€šè¯ï¼›ç”¨äºŽèƒ¶å›Šæ¡ã€ŒåŠ å…¥ã€æŒ‰é’® */
export function joinCall(room: string) {
  return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/join', undefined, {
    params: { room },
  });
}
/** æŽ¥å¬é€šè¯ */
export function acceptCall(room: string) {
  return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/accept', undefined, {
    params: { room },
  });
}
/** æ‹’绝通话 */
export function rejectCall(room: string) {
  return requestClient.post<boolean>('/im/rtc/reject', undefined, {
    params: { room },
  });
}
/** å–消邀请;主叫接通前调用 */
export function cancelCall(room: string) {
  return requestClient.post<boolean>('/im/rtc/cancel', undefined, {
    params: { room },
  });
}
/** ç¦»å¼€é€šè¯ï¼›æŽ¥é€šåŽè°ƒç”¨ */
export function leaveCall(room: string) {
  return requestClient.post<boolean>('/im/rtc/leave', undefined, {
    params: { room },
  });
}
/** æŒ¯é“ƒè¶…时检查;RUNNING ç«¯ timer å…œåº•,触发后端立即扫描该 room çš„è¶…æ—¶ INVITING(接口静默) */
export function noAnswerCallCheck(room: string) {
  return requestClient.post<boolean>(
    '/im/rtc/no-answer-call-check',
    undefined,
    { params: { room } },
  );
}
/** æŸ¥è¯¢å½“前进行中的通话;目前仅群聊场景(胶囊条),返回 null è¡¨ç¤ºæ— æ´»è·ƒé€šè¯ */
export function getActiveCall(groupId: number) {
  return requestClient.get<ImRtcApi.RtcGroupCallRespVO | null>(
    '/im/rtc/get-active-call',
    { params: { groupId } },
  );
}