roomController.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { pubClient } from "../connection/redis.js";
  2. import { ROLES, CODEMEG, EVENT, FROMTYPE } from "../enum/index.js";
  3. import { io } from "../core/io.js";
  4. import { logger } from "../core/logger.js";
  5. import { updateUser, removeRoomAllUsers, getAllRoomUsers, updateRoomUser } from "../service/userService.js";
  6. import { watchRoomService } from "../service/watchRoomService.js";
  7. import { setRoomConfig, getRoomConfig } from "../service/roomConfigService.js";
  8. import { getSig } from "../core/getSig.js";
  9. import { isHoster, buildRoom, startCallAction, stopCallAction, joinRoomAction, leaveRoomAction, shotGunLeaveAction, disconnectAction } from "./roomActionController.js";
  10. import { RoomAssistantController } from './roomAssistantController.js'
  11. export async function roomController(socket) {
  12. try {
  13. let user = socket.handshake.query;
  14. const roomAssistant = new RoomAssistantController(socket)
  15. const { roomId, userId, sceneNum, isClient, role, userLimitNum, sceneNumber, roomType, from, enableTalk } = user;
  16. if (user) {
  17. const oneSceneNum = sceneNumber || sceneNum;
  18. const syncId = `sync-${oneSceneNum}-${userId}`;
  19. const roomSessionId = `${oneSceneNum}-${userId}`;
  20. console.log('roomSessionId', roomSessionId);
  21. const userUniqueId = `user-${userId}`;
  22. const uRoomId = await roomAssistant.prepearRoom(roomSessionId,roomId);
  23. const roomUniqueId = `room-${uRoomId}_${oneSceneNum}_web`;
  24. console.log('roomUniqueId',roomUniqueId)
  25. // const userLimitNum = userLimitNum || process.env.US
  26. if ("roomId" in user && "userId" in user) {
  27. user.sig = getSig(userId);
  28. const userObj = { ...user, isConnected: true, roomType: roomType || "" };
  29. updateUser(userUniqueId, userObj);
  30. // await pubClient.hSet(userUniqueId, user);
  31. // await pubClient.expire(userUniqueId, 60 * 60 * 24);
  32. if (isHoster(role)) {
  33. if ([FROMTYPE.MiniAPP].includes(Number(from))) {
  34. await setRoomConfig(roomUniqueId, {
  35. userLimitNum,
  36. enableTalk: enableTalk === "true" ? true : false,
  37. });
  38. }
  39. }
  40. socket.join(roomUniqueId);
  41. } else {
  42. logger.info("user-query-不存在 :", socket.handshake.query);
  43. socket.disconnect();
  44. }
  45. socket.on(EVENT.action, (data) => {
  46. console.log("room-action", roomUniqueId, socket.rooms.has(roomUniqueId), JSON.stringify(data));
  47. if (socket.rooms.has(roomUniqueId)) {
  48. socket.broadcast.to(roomUniqueId).emit(EVENT.action, data);
  49. } else {
  50. logger.error("action 事件不在房间内", user);
  51. }
  52. });
  53. // 通知 baseView 减少大量通知
  54. socket.on(EVENT.webSyncAction, (data) => {
  55. // socket.broadcast.to(roomUniqueId).emit(EVENT.webSyncAction, data);
  56. if ([FROMTYPE.base].includes(Number(from))) {
  57. socket.broadcast.to(roomUniqueId).emit(EVENT.webSyncAction, data);
  58. }
  59. });
  60. socket.onAny((event, data) => {
  61. if (event !== "webSyncAction") {
  62. console.log(`onAny:get ${event}, data:${JSON.stringify(data)}`);
  63. }
  64. });
  65. socket.on(EVENT.changeRoomEnableTalk, async (data) => {
  66. // this._roomsConfig[roomId].enableTalk = data;
  67. await setRoomConfig(roomUniqueId, data);
  68. const roomConfig = await getRoomConfig(roomUniqueId);
  69. socket.broadcast.to(roomUniqueId).emit(EVENT.changeRoomEnableTalk, roomConfig);
  70. });
  71. socket.on(EVENT.changeOnlineStatus, async (data) => {
  72. user.onlineStatus = data.status;
  73. const AllRoomUsers = await getAllRoomUsers(roomUniqueId);
  74. await updateRoomUser(roomUniqueId, userUniqueId, user);
  75. let actionName = user.onlineStatus ? "inRoom" : "leaveRoom";
  76. logger.info("changeOnlineStatus", user);
  77. socket.broadcast.to(roomUniqueId).emit(EVENT.roomPersonChange, {
  78. roomsPerson: AllRoomUsers,
  79. actionName,
  80. user,
  81. });
  82. });
  83. socket.on(EVENT.startCall, () => {
  84. startCallAction(roomUniqueId, userUniqueId, user, socket);
  85. });
  86. socket.on(EVENT.stopCall, () => {
  87. stopCallAction(roomUniqueId, userUniqueId, user, socket);
  88. });
  89. socket.on("disconnect", async (reason) => {
  90. // leaveRoom({ clientRoom, userUniqueId, roomUniqueId, socket });
  91. // watchRoomWithMaster(roomUniqueId, socket);
  92. console.log("reason", reason);
  93. if (reason === "transport close") {
  94. // 主动离开
  95. shotGunLeaveAction(
  96. {
  97. syncId,
  98. roomId: roomUniqueId,
  99. userId: userUniqueId,
  100. },
  101. socket,
  102. user,
  103. );
  104. } else {
  105. // 被动离开
  106. // disconnectAction(
  107. // {
  108. // syncId,
  109. // roomId: roomUniqueId,
  110. // userId: userUniqueId,
  111. // },
  112. // socket,
  113. // user,
  114. // );
  115. }
  116. });
  117. socket.on("reconnect", () => {
  118. console.log("reconnect");
  119. });
  120. }
  121. } catch (error) {
  122. console.log('roomController::error',error)
  123. }
  124. }