websocket.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. import {
  2. DanmuMsgTypeEnum,
  3. ILiveUser,
  4. WsMessageMsgIsFileEnum,
  5. } from '@/interface';
  6. import { ILiveRoom, LiveRoomTypeEnum } from '@/types/ILiveRoom';
  7. import { IUser } from '@/types/IUser';
  8. /** websocket连接状态 */
  9. export enum WsConnectStatusEnum {
  10. /** 已连接 */
  11. connection = 'connection',
  12. /** 连接中 */
  13. connecting = 'connecting',
  14. /** 已连接 */
  15. connected = 'connected',
  16. /** 断开连接中 */
  17. disconnecting = 'disconnecting',
  18. /** 已断开连接 */
  19. disconnect = 'disconnect',
  20. /** 重新连接 */
  21. reconnect = 'reconnect',
  22. /** 客户端的已连接 */
  23. connect = 'connect',
  24. }
  25. /** websocket消息类型 */
  26. export enum WsMsgTypeEnum {
  27. /** 用户进入聊天 */
  28. join = 'join',
  29. /** 用户进入聊天完成 */
  30. joined = 'joined',
  31. /** 用户进入聊天 */
  32. otherJoin = 'otherJoin',
  33. /** 用户退出聊天 */
  34. leave = 'leave',
  35. /** 用户退出聊天完成 */
  36. leaved = 'leaved',
  37. /** 当前所有在线用户 */
  38. liveUser = 'liveUser',
  39. /** 用户发送消息 */
  40. message = 'message',
  41. /** 房间正在直播 */
  42. roomLiving = 'roomLiving',
  43. /** 房间不在直播 */
  44. roomNoLive = 'roomNoLive',
  45. /** 获取在线用户 */
  46. getLiveUser = 'getLiveUser',
  47. /** 更新加入信息 */
  48. updateJoinInfo = 'updateJoinInfo',
  49. /** 更新直播间预览图 */
  50. updateLiveRoomCoverImg = 'updateLiveRoomCoverImg',
  51. /** 心跳 */
  52. heartbeat = 'heartbeat',
  53. /** 开始直播 */
  54. startLive = 'startLive',
  55. /** 结束直播 */
  56. endLive = 'endLive',
  57. /** 直播pk秘钥 */
  58. livePkKey = 'livePkKey',
  59. /** 主播禁言用户 */
  60. disableSpeaking = 'disableSpeaking',
  61. /** 主播踢掉用户 */
  62. kick = 'kick',
  63. srsOffer = 'srsOffer',
  64. srsAnswer = 'srsAnswer',
  65. srsCandidate = 'srsCandidate',
  66. startRemoteDesk = 'startRemoteDesk',
  67. remoteDeskMoveMsg = 'remoteDeskMoveMsg',
  68. remoteDeskOffer = 'remoteDeskOffer',
  69. remoteDeskAnswer = 'remoteDeskAnswer',
  70. remoteDeskCandidate = 'remoteDeskCandidate',
  71. nativeWebRtcOffer = 'nativeWebRtcOffer',
  72. nativeWebRtcAnswer = 'nativeWebRtcAnswer',
  73. nativeWebRtcCandidate = 'nativeWebRtcCandidate',
  74. msrBlob = 'msrBlob',
  75. }
  76. export interface IWsFormat<T> {
  77. /** 消息id */
  78. request_id: string;
  79. /** 用户socket_id */
  80. socket_id: string;
  81. /** 是否是主播 */
  82. is_anchor: boolean;
  83. /** 用户信息 */
  84. user_info?: IUser;
  85. /** 用户token */
  86. user_token?: string;
  87. data: T;
  88. }
  89. export type WsUpdateJoinInfoType = IWsFormat<{
  90. live_room_id: number;
  91. track?: { audio: number; video: number };
  92. }>;
  93. /** 直播pk秘钥 */
  94. export type WSLivePkKeyType = IWsFormat<{
  95. live_room_id: number;
  96. key: string;
  97. }>;
  98. /** 获取在线用户 */
  99. export type WSGetRoomAllUserType = IWsFormat<{
  100. liveUser: ILiveUser[];
  101. }>;
  102. /** 获取在线用户 */
  103. export type WsGetLiveUserType = IWsFormat<{
  104. live_room_id: number;
  105. }>;
  106. /** 直播间正在直播 */
  107. export type WsRoomLivingType = IWsFormat<{
  108. live_room: ILiveRoom;
  109. anchor_socket_id: string;
  110. socket_list?: string[];
  111. }>;
  112. /** 直播间没在直播 */
  113. export type WsRoomNoLiveType = IWsFormat<{
  114. live_room: ILiveRoom;
  115. }>;
  116. export type WsRemoteDeskMoveMsgType = IWsFormat<{
  117. roomId: string;
  118. sender: string;
  119. receiver: string;
  120. }>;
  121. export interface IDanmu {
  122. msgType: DanmuMsgTypeEnum;
  123. msgIsFile: WsMessageMsgIsFileEnum;
  124. msg: string;
  125. username?: string;
  126. user_agent?: string;
  127. send_msg_time: number;
  128. live_room_id: number;
  129. redbag_send_id?: number;
  130. msg_id?: number;
  131. socket_id: string;
  132. request_id?: string;
  133. userInfo?: IUser;
  134. }
  135. /** ws消息 */
  136. export type WsMessageType = IWsFormat<IDanmu>;
  137. /** 禁言用户 */
  138. export type WsDisableSpeakingType = IWsFormat<{
  139. request_id?: string;
  140. /** 被禁言用户socket_id */
  141. socket_id: string;
  142. /** 被禁言用户id */
  143. user_id: number;
  144. /** 直播间id */
  145. live_room_id: number;
  146. /** 禁言时长(单位:秒) */
  147. duration?: number;
  148. /** 禁言创建消息 */
  149. disable_created_at?: number;
  150. /** 禁言到期消息 */
  151. disable_expired_at?: number;
  152. /** 禁言成功 */
  153. disable_ok?: boolean;
  154. /** 解除禁言成功 */
  155. restore_disable_ok?: boolean;
  156. /** 是否正在禁言 */
  157. is_disable_speaking?: boolean;
  158. /** 是否解除禁言 */
  159. restore?: boolean;
  160. }>;
  161. /** 其他用户加入直播间 */
  162. export type WsOtherJoinType = IWsFormat<{
  163. live_room: ILiveRoom;
  164. live_room_user_info: IUser;
  165. join_user_info?: IUser;
  166. join_socket_id: string;
  167. socket_list: string[];
  168. }>;
  169. /** 开始直播 */
  170. export type WsStartLiveType = IWsFormat<{
  171. name: string;
  172. type: LiveRoomTypeEnum;
  173. /** 单位:毫秒 */
  174. msrDelay: number;
  175. /** 单位:毫秒 */
  176. msrMaxDelay: number;
  177. }>;
  178. /** 更新直播间预览图 */
  179. export type WsUpdateLiveRoomCoverImg = IWsFormat<{
  180. cover_img: string;
  181. }>;
  182. /** 用户加入直播间 */
  183. export type WsJoinType = IWsFormat<{
  184. socket_id: string;
  185. live_room_id: number;
  186. live_room?: ILiveRoom;
  187. anchor_info?: IUser;
  188. user_info?: IUser;
  189. isRemoteDesk?: boolean;
  190. socket_list?: string[];
  191. }>;
  192. /** 用户离开直播间 */
  193. export type WsLeavedType = IWsFormat<{
  194. socket_id: string;
  195. user_info?: IUser;
  196. }>;
  197. /** 心跳检测 */
  198. export type WsHeartbeatType = IWsFormat<{
  199. socket_id: string;
  200. live_room_id: number;
  201. roomLiving?: boolean;
  202. }>;
  203. /** msr直播发送blob */
  204. export type WsMsrBlobType = IWsFormat<{
  205. live_room_id: number;
  206. blob: any;
  207. blob_id: string;
  208. /** 单位:毫秒 */
  209. delay: number;
  210. /** 单位:毫秒 */
  211. max_delay: number;
  212. }>;
  213. export type WsStartRemoteDesk = IWsFormat<{
  214. sender: string;
  215. receiver: string;
  216. roomId: string;
  217. }>;
  218. export type WsOfferType = IWsFormat<{
  219. live_room: ILiveRoom;
  220. sdp: any;
  221. sender: string;
  222. receiver: string;
  223. live_room_id: number;
  224. isRemoteDesk?: boolean;
  225. }>;
  226. export type WsAnswerType = IWsFormat<{
  227. sdp: any;
  228. sender: string;
  229. receiver: string;
  230. live_room_id: number;
  231. }>;
  232. export type WsCandidateType = IWsFormat<{
  233. live_room_id: number;
  234. candidate: RTCIceCandidate;
  235. receiver: string;
  236. sender: string;
  237. }>;