connectController.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { BasicController } from "./basicController.js";
  2. import { RoomController } from "./room/index.js";
  3. import { SyncDeviceController } from "./syncDeviceController.js";
  4. import { FROMTYPE } from "../enum/index.js";
  5. import { updateRoomUser, isUserInRoom, removeRoomUser } from "../service/userService.js";
  6. import { publishExitRoom } from "../service/publishService.js";
  7. export class ConnectController extends BasicController {
  8. constructor(...args) {
  9. super(...args);
  10. this.roomController = new RoomController(this.io, this.socket, this.redisCli);
  11. this.syncDeviceController = new SyncDeviceController(this.io, this.socket, this.redisCli, this.roomController);
  12. }
  13. async run() {
  14. await this.roomController.run();
  15. await this.syncDeviceController.run();
  16. this.redisSubClient.subscribe("dismissRoom", (message) => {
  17. // chat:room:dismiss:c-fCTZyvc:E71464
  18. this.logger.info("subscribe-订阅", JSON.stringify(message));
  19. const disMissId = message.split("chat:room:dismiss:")[1];
  20. if (disMissId) {
  21. const disMissRoomId = `room:${disMissId}`;
  22. const userId = this.roomController.userId;
  23. const roomId = this.roomController.roomId;
  24. const user = this.roomController.user;
  25. const sessionId = this.roomController.sessionId;
  26. const roomConfigId = this.roomController.roomConfigId;
  27. if (disMissRoomId === roomId) {
  28. this.logger.info("subscribe-订阅-配对", disMissRoomId, userId, roomId, user);
  29. this.roomController.roomAssistant.notifyRoomDismiss(roomId);
  30. this.roomController.roomAssistant.stopCall(roomId, userId, user, true);
  31. this.roomController.roomAssistant.destoryRoom(sessionId, roomConfigId);
  32. }
  33. }
  34. });
  35. this.socket.on("reconnect", () => {
  36. this.logger.warn("重新连接");
  37. this.run();
  38. });
  39. this.socket.on("error", (err) => {
  40. this.logger.error(`连接错误,原因: ${err.message}`);
  41. this.redisSubClient.unsubscribe("dismissRoom");
  42. });
  43. this.socket.on("disconnect", async (reason) => {
  44. const res = String(reason).split(" ");
  45. console.log("disconnect-reason", res);
  46. this.redisSubClient.unsubscribe("dismissRoom");
  47. // if (res.includes("close") || res.includes("disconnect")) {
  48. if ([FROMTYPE.MiniAPP].includes(Number(this.roomController.user.from))) {
  49. const userId = this.roomController.userId;
  50. const from = this.roomController.user.from;
  51. const roomId = this.roomController.roomId;
  52. const role = this.roomController.user.role;
  53. const user = this.roomController.user;
  54. this.roomController.logger.info("断开连接", {
  55. userId,
  56. from,
  57. roomId,
  58. });
  59. publishExitRoom(userId, user.roomId);
  60. // if (this.roomController.isHoster(role)) {
  61. this.roomController.roomAssistant.hasCall = false;
  62. setTimeout(async () => {
  63. // 有可客户端主动断开时
  64. if (Number(user.onlineStatus) === 1) {
  65. // const res = await this.roomController.roomAssistant.checkRoomMaximum(roomId);
  66. const isInRoom = await isUserInRoom(roomId, user.userId);
  67. const illegalMaster = this.roomController.roomAssistant.illegalMaster;
  68. if (!this.roomController.roomAssistant.roomMax && isInRoom && this.roomController) {
  69. // console.log("测试-->illegalMaster", illegalMaster);
  70. if (illegalMaster) {
  71. console.log("断开存在非法房主");
  72. await removeRoomUser(roomId, userId);
  73. this.roomController.roomAssistant.illegalMaster = false;
  74. } else {
  75. isInRoom.onlineStatus = 0;
  76. this.roomController.user = isInRoom;
  77. console.log("已在线,被断开后", isInRoom);
  78. await updateRoomUser(roomId, userId, isInRoom);
  79. await this.roomController.roomAssistant.notifyUsersChange(roomId, user, false);
  80. }
  81. }
  82. }
  83. }, 1000);
  84. // await updateRoomUser(this.roomController.user);
  85. // }
  86. // this.roomController.roomAssistant.setRoomAvailableBySeconds(this.roomController.sessionId, 3 * 60);
  87. // this.roomController.roomAssistant.disconnect();
  88. // this.roomController.roomAssistant.unWatchRoomExpired();
  89. // }
  90. }
  91. });
  92. // benmark
  93. this.socket.on("client-benmark-server", (data) => {
  94. const roomId = this.roomController.roomId;
  95. this.socket.broadcast.to(roomId).emit("server-benmark-client", data);
  96. });
  97. let serverIntervalRoomBroadcast = false;
  98. let serverIntervalRoomBroadcastTimer = null;
  99. this.socket.on("server-interval-room-broadcast", ({ time }) => {
  100. const roomId = this.roomController.roomId;
  101. if (!serverIntervalRoomBroadcast) {
  102. serverIntervalRoomBroadcast = true;
  103. const data = {
  104. message: "定时benmark-播报",
  105. timestamp: new Date(),
  106. };
  107. serverIntervalRoomBroadcastTimer = setInterval(() => {
  108. this.socket.broadcast.to(roomId).emit("client-interval-room-broadcast", data);
  109. }, time | 1000);
  110. }
  111. });
  112. this.socket.on("server-interval-room-broadcast-cancel", () => {
  113. if (serverIntervalRoomBroadcastTimer) {
  114. clearInterval(serverIntervalRoomBroadcastTimer);
  115. serverIntervalRoomBroadcast = false;
  116. }
  117. });
  118. }
  119. }