roomControl.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { unref } from 'vue';
  2. import { useRtcStore } from '/@/store/modules/rtc';
  3. import consola from 'consola';
  4. import type { ConsolaLogObject } from 'consola';
  5. import { handleActions, handleSync, handleReceivePaint, handleJoin } from './controls';
  6. import type { SocketParams } from '/@/store/modules/rtc';
  7. import Dialog from '/@/components/basic/dialog';
  8. import { roomId, useRoom } from '/@/hooks/useRoom';
  9. import { useI18n } from '/@/hooks/useI18n';
  10. import dayjs from 'dayjs';
  11. import { handleTimeOutError, handleEarlyError, handleError } from '../chatRoom/controls/actions';
  12. // 所有socket业务事件集中点
  13. export function initSocketEvent(socket: SocketIOClient.Socket): void {
  14. if (socket) {
  15. socket.on('connect', () => {
  16. const rtcStore = useRtcStore();
  17. const params: SocketParams = {
  18. userId: rtcStore.userId,
  19. roomId: rtcStore.roomId,
  20. role: rtcStore.role || 'leader',
  21. avatar: rtcStore.avatar || '',
  22. nickname: rtcStore.nickname,
  23. isClient: false,
  24. };
  25. const { room } = useRoom();
  26. const useEndTime = unref(room)?.useEndTime || '';
  27. const useStartTime = unref(room)?.useStartTime;
  28. const limit = unref(room)?.maxMan || 10;
  29. const now = dayjs();
  30. const roomEnd = dayjs(useEndTime);
  31. const ttl = roomEnd.diff(now, 'second');
  32. if (useStartTime) {
  33. const unstartTTl = dayjs(useStartTime).diff(now, 'second');
  34. if (unstartTTl > 0) {
  35. console.log('提前!!', dayjs(useStartTime));
  36. handleEarlyError();
  37. return;
  38. }
  39. debugger;
  40. }
  41. if (unref(room)) {
  42. if (rtcStore.role === 'leader') {
  43. console.log('unref(room)', unref(room));
  44. if (useEndTime) {
  45. params.roomConfig = {
  46. masterId: rtcStore.userId,
  47. limit: limit,
  48. ttl: ttl,
  49. };
  50. } else {
  51. params.roomConfig = {
  52. masterId: rtcStore.userId,
  53. limit: limit,
  54. };
  55. }
  56. }
  57. if (ttl > 0) {
  58. socket.emit('join', params);
  59. } else {
  60. //超时房间
  61. handleTimeOutError();
  62. }
  63. } else {
  64. //临时房间放行
  65. if (roomId.indexOf('temp_') > -1) {
  66. if (rtcStore.role === 'leader') {
  67. params.roomConfig = {
  68. masterId: rtcStore.userId,
  69. limit: limit,
  70. };
  71. }
  72. socket.emit('join', params);
  73. return;
  74. }
  75. handleTimeOutError();
  76. }
  77. });
  78. socket.on('action', (data: any) => {
  79. const actionLog: ConsolaLogObject = {
  80. message: data,
  81. tag: `action-${data.type || ''}`,
  82. level: 3,
  83. };
  84. consola.info(actionLog);
  85. handleActions(data);
  86. });
  87. // 自已进入逻辑
  88. socket.on('join', handleJoin);
  89. // 同屏帶看
  90. socket.on('sync', handleSync);
  91. // 畫筆
  92. socket.on('paint', handleReceivePaint);
  93. socket.on('onAny', (event: any) => {
  94. console.error('onAny:-->', event);
  95. });
  96. socket.on('manager-error', ({ type, code }) => {
  97. const { t } = useI18n();
  98. switch (type) {
  99. case 'repeat-login':
  100. Dialog.toast({ content: t('action.errorRepeatLogin') });
  101. break;
  102. case 'room-maxing':
  103. Dialog.toast({ content: t('action.errorRoomMaxing') });
  104. break;
  105. case 'invalid-master':
  106. Dialog.toast({ content: t('action.errorInvalidMaster') });
  107. break;
  108. case 'invalid-match-role':
  109. Dialog.toast({ content: t('base.errorRoom') });
  110. break;
  111. case 'invalid-room-params':
  112. Dialog.toast({ content: t('base.errorRoom') });
  113. break;
  114. case 'ttl-out':
  115. handleError();
  116. break;
  117. default:
  118. Dialog.toast({ content: `错误代码:${code},类型:${type}` });
  119. break;
  120. }
  121. });
  122. socket.on('error', (error: any) => {
  123. const actionLog: ConsolaLogObject = {
  124. message: error,
  125. tag: 'socket',
  126. level: 0,
  127. };
  128. consola.error(actionLog);
  129. });
  130. } else {
  131. throw new Error('socket没有初始化!');
  132. }
  133. }