rtc.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import { defineStore } from 'pinia';
  2. import consola from 'consola'
  3. import { genTestUserSig } from '/@/utils/generateTestUserSig'
  4. import type { RemoteStream } from "trtc-js-sdk";
  5. import sortBy from 'lodash-es/sortBy'
  6. interface RtcState {
  7. socket: Nullable<SocketIOClient.Socket>,
  8. socketId: string,
  9. showDaoGou: boolean,
  10. sdkAppId: string,
  11. userId: string,
  12. roomId: string,
  13. role: 'leader' | 'customer'
  14. secretKey: string
  15. userSig: string
  16. audioDeviceId: string,
  17. videoDeviceId: string,
  18. cameraList: MediaDeviceInfo[],
  19. microphoneList: MediaDeviceInfo[],
  20. logs: any[],
  21. isJoined: boolean,
  22. isPublished: boolean,
  23. isShared: boolean,
  24. remoteStreams: RemoteStream[],
  25. // invitedRemoteStreams: any[],
  26. avatar: Nullable<string>,
  27. nickname: Nullable<string>,
  28. mode: string,
  29. chatList: ChatContentType[],
  30. memberList: UserInfoType[],
  31. audioMuted: boolean
  32. }
  33. interface DeviceListParams {
  34. cameraItems: MediaDeviceInfo[],
  35. microphoneItems: MediaDeviceInfo[],
  36. }
  37. export interface ChatContentType {
  38. role: RoleType,
  39. mode: string,
  40. Nickname: Nullable<string>,
  41. UserId: string,
  42. text: string,
  43. }
  44. export interface UserInfoType {
  45. Avatar: string
  46. Id: string
  47. InTime: string
  48. IsClient: boolean
  49. IsMuted: boolean
  50. IsWords: boolean
  51. JoinTime: string
  52. Nickname: string
  53. Role: RoleType
  54. RoomId: string
  55. UserId: string
  56. text?: string
  57. order: number
  58. }
  59. export type RoleType = 'leader' | 'customer'
  60. export interface SocketParams {
  61. userId: string
  62. roomId: string
  63. role: RoleType
  64. avatar: string
  65. nickname: string
  66. mode: string
  67. }
  68. export const useRtcStore = defineStore({
  69. id: 'rtc',
  70. state: (): RtcState => ({
  71. socket: null,
  72. socketId: '',
  73. showDaoGou: false,
  74. sdkAppId: "1400685498",
  75. nickname: '',
  76. userId: '',
  77. roomId: '',
  78. role: 'customer',
  79. secretKey: '7500f8938c46c5d3c64621ae7826905eec9723bf218fbcf121242e056a4ee14f',
  80. userSig: 'eJwtzcsOgjAQBdB-6RaDU2jLI3EhsrHRBdGNK2Po0IyvNAWJxvjvEmA5597c*bLj7hD26FnOohDYYrzJ4LOjhkZ*tejPd7wY9EJwnsV8brXmdnGODMu5AEggExBNSUcPHFQpnkopIJkU34784ApECjBvkB1e8MLJfWyLOAis06Wut4b0tVdL77RVTb35dGXby6o6rVfs9wdhLDRy',
  81. audioDeviceId: '',
  82. videoDeviceId: '',
  83. cameraList: [],
  84. microphoneList: [],
  85. logs: [],
  86. isJoined: false,
  87. isPublished: false,
  88. isShared: false,
  89. remoteStreams: [],
  90. // invitedRemoteStreams: [],
  91. avatar: null,
  92. mode: '',
  93. chatList: [],
  94. memberList: [],
  95. audioMuted: true
  96. }),
  97. persist: {
  98. storage: localStorage,
  99. paths: ['memberList'],
  100. },
  101. getters: {
  102. checkUserInMemberList() {
  103. return (userId: string) => this.memberList.find(item => item.UserId === userId)
  104. },
  105. isLeader(): boolean {
  106. return this.role === 'leader'
  107. },
  108. isMe() {
  109. return (userId: string) => this.userId === userId
  110. },
  111. genUserSig() {
  112. const { userSig } = genTestUserSig({
  113. sdkAppId: parseInt(this.sdkAppId, 10),
  114. userId: this.userId,
  115. secretKey: this.secretKey,
  116. });
  117. return userSig
  118. },
  119. isUserInRemoteStream() {
  120. return (userId: string) => {
  121. return this.remoteStreams.some(item => item.getUserId() === userId)
  122. }
  123. }
  124. },
  125. actions: {
  126. setSocketParams(params: SocketParams): void {
  127. this.avatar = params.avatar
  128. this.roomId = params.roomId
  129. this.userId = params.userId
  130. this.nickname = params.nickname
  131. this.role = params.role
  132. if (!['leader', 'customer'].includes(params.role)) {
  133. consola.info({
  134. message: '角色参数有误',
  135. level: 0,
  136. tag: 'role'
  137. })
  138. this.role = 'customer'
  139. }
  140. },
  141. setAvatar(payload: string) {
  142. this.avatar = payload
  143. localStorage.setItem('leaderAvatar', payload || '')
  144. },
  145. setSocket(payload: SocketIOClient.Socket) {
  146. this.socket = payload
  147. },
  148. setShowDaoGou(payload: boolean) {
  149. this.showDaoGou = payload
  150. },
  151. setUserId(payload: string) {
  152. this.userId = payload
  153. },
  154. setRoomId(payload: string) {
  155. this.roomId = payload
  156. },
  157. setRole(payload: RoleType) {
  158. this.role = payload
  159. },
  160. setDeviceList(payload: DeviceListParams) {
  161. this.cameraList = payload.cameraItems
  162. this.microphoneList = payload.microphoneItems
  163. },
  164. setVideoDeviceId(payload: string) {
  165. this.videoDeviceId = payload
  166. },
  167. setAudioDeviceId(payload: string) {
  168. this.audioDeviceId = payload
  169. },
  170. setIsJoined(payload: boolean) {
  171. this.isJoined = payload
  172. },
  173. setIsPublished(payload: boolean) {
  174. this.isPublished = payload
  175. },
  176. addToChatList(content: ChatContentType) {
  177. this.chatList.push(content)
  178. },
  179. setMemberList(members: UserInfoType[]) {
  180. const memberList = members.reduce((prev: UserInfoType[], current: UserInfoType, index) => {
  181. if (prev.findIndex((ele: UserInfoType) => ele.UserId === current.UserId) === -1) {
  182. // console.log(current);
  183. current.order = index > 1 ? index : 2
  184. if (current.Role === 'leader') {
  185. current.order = 0
  186. }
  187. if (current.UserId === this.userId) {
  188. current.order = 1
  189. }
  190. prev.push(current);
  191. }
  192. return prev;
  193. }, []);
  194. const sortList = sortBy(memberList, ['order', 'UserId'], ['asc', 'asc'])
  195. console.log('sortList', sortList)
  196. this.memberList = sortList
  197. },
  198. updateMemberDatabyId(UserId: string, data: Partial<UserInfoType>) {
  199. const updateIndex = this.memberList.findIndex(member => member.UserId === UserId)
  200. if (updateIndex > -1) {
  201. this.memberList[updateIndex] = Object.assign({}, this.memberList[updateIndex], data)
  202. }
  203. },
  204. mute() {
  205. this.audioMuted = true
  206. },
  207. unmute() {
  208. this.audioMuted = false
  209. },
  210. pushRemoteStreams(stream: RemoteStream) {
  211. this.remoteStreams.push(stream)
  212. },
  213. removeRemoteStreams(id: string) {
  214. const existStreamIndex = this.remoteStreams.findIndex(stream => stream.getId() === id)
  215. if (existStreamIndex > -1) {
  216. this.remoteStreams.splice(existStreamIndex, 1)
  217. }
  218. }
  219. }
  220. })