Browse Source

feat(core): 增加重连与结构性调整

gemercheung 3 years ago
parent
commit
a51b0c60f9

+ 1 - 2
src/controller/basicController.js

@@ -1,7 +1,6 @@
 import { pubClient } from "../connection/redis.js";
 import { ROLES, CODEMEG, EVENT, FROMTYPE } from "../enum/index.js";
-// import { roomController } from "./dump/roomController.jser.js";
-import { syncActionController } from "./syncActionController.js";
+
 import { logger } from "../core/logger.js";
 import { getSig } from "../core/getSig.js";
 

+ 9 - 6
src/controller/connectController.js

@@ -1,22 +1,25 @@
 import { BasicController } from "./basicController.js";
-
 import { RoomController } from "./room/index.js";
-import { syncActionController } from "./syncActionController.js";
+import { SyncDeviceController } from "./syncDeviceController.js";
 import { FROMTYPE } from "../enum/index.js";
 
 export class ConnectController extends BasicController {
   constructor(...args) {
     super(...args);
     this.roomController = new RoomController(this.io, this.socket, this.redisCli);
+    this.syncDeviceController = new SyncDeviceController(this.io, this.socket, this.redisCli,this.roomController);
   }
   async run() {
     await this.roomController.run();
-    await syncActionController(this.socket);
+    await this.syncDeviceController.run();
+
     this.socket.on("disconnect", (reason) => {
-      if (reason === "transport close") {
+      const res = String(reason).split(" ");
+      console.log('disconnect-reason',res)
+      if (res.includes("close") || res.includes("disconnect")) {
         if ([FROMTYPE.MiniAPP].includes(Number(this.roomController.user.from))) {
-          this.roomController.logger.info("主动断开连接");
-          this.roomController.roomAssistant.disconnect();
+          this.roomController.logger.info("断开连接");
+          // this.roomController.roomAssistant.disconnect();
         }
       }
     });

+ 0 - 20
src/controller/dump/roomAssistantController.js

@@ -1,20 +0,0 @@
-
-// 房间助手
-import { pubClient } from "../connection/redis.js";
-
-export class RoomAssistantController{
-    constructor(socket){
-        this.socket = socket;
-        this.roomId = null
-    }
-
-    async prepearRoom(roomSessionId,roomId){
-        console.log('prepearRoom',roomSessionId,roomId);
-        const uRoomId = await pubClient.get(roomSessionId)
-        const mergeRoomId = uRoomId || roomId
-        this.roomId = mergeRoomId
-        await pubClient.set(roomSessionId,mergeRoomId)
-        return Promise.resolve(this.roomId)
-    }
-
-}

+ 4 - 4
src/controller/syncActionController.js

@@ -1,7 +1,7 @@
-import { logger } from "../core/logger.js";
-import { pubClient } from "../connection/redis.js";
-import { ROLES, CODEMEG, EVENT } from "../enum/index.js";
-import { getAllRoomUsers, updateRoomUser } from "../service/userService.js";
+import { logger } from "../../core/logger.js.js.js";
+import { pubClient } from "../../connection/redis.js.js.js";
+import { ROLES, CODEMEG, EVENT } from "../../enum/index.js.js.js";
+import { getAllRoomUsers, updateRoomUser } from "../../service/userService.js.js.js";
 
 const joinSyncClient = async (syncId, userId, from, socket) => {
   logger.debug("syncId", { syncId, userId, from });

+ 9 - 1
src/controller/room/assistant.js

@@ -12,14 +12,22 @@ export class RoomAssistant {
   }
 
   async prepearRoom(roomSessionId, roomId) {
-    console.log("prepearRoom", roomSessionId, roomId);
     const uRoomId = await this.redis.get(roomSessionId);
     const mergeRoomId = uRoomId || roomId;
     this.roomId = mergeRoomId;
+    console.log("prepearRoom", roomSessionId, this.roomId);
     await this.redis.set(roomSessionId, mergeRoomId);
     return Promise.resolve(this.roomId);
   }
 
+  async destoryRoom(roomSessionId, roomConfigId) {
+    console.log("destoryRoom", roomSessionId, roomConfigId);
+    await this.redis.del(roomSessionId);
+    await this.redis.del(roomConfigId);
+    this.disconnect();
+    return Promise.resolve(true);
+  }
+
   /**
    *
    */

+ 72 - 4
src/controller/room/index.js

@@ -1,7 +1,7 @@
 import { ROLES, CODEMEG, EVENT, FROMTYPE } from "../../enum/index.js";
 import { updateUser, removeRoomAllUsers, getAllRoomUsers, updateRoomUser } from "../../service/userService.js";
 // import { watchRoomService } from "../../service/watchRoomService.js";
-import { setRoomConfig, getRoomConfig } from "../../service/roomConfigService.js";
+import { setRoomConfig, getRoomConfig, updateRoomConfigByKey } from "../../service/roomConfigService.js";
 
 import { RoomAssistant } from "./assistant.js";
 import { BasicController } from "../basicController.js";
@@ -13,6 +13,7 @@ export class RoomController extends BasicController {
     this.roomId = null;
     this.sessionId = null;
     this.userId = null;
+    this.roomConfigId = null;
     this.debugger = true;
     this.user = {
       sig: null,
@@ -34,6 +35,7 @@ export class RoomController extends BasicController {
     try {
       await this.init();
       this.initBaseAction();
+      this.roomMasterAutoRejoin();
     } catch (error) {
       this.logger.error("roomController::run::error", error);
     }
@@ -50,6 +52,7 @@ export class RoomController extends BasicController {
       const { userId, roomId } = this.user;
       await this.initParams(userId, roomId, oneSceneNum);
       const userObj = { ...this.user, isConnected: true };
+      // console.log('userObj',userObj)
       updateUser(this.userId, userObj);
 
       // 只有来源于小程序用户信息才记录到redis
@@ -76,6 +79,9 @@ export class RoomController extends BasicController {
     this.sessionId = `${oneSceneNum}-${userId}`;
     const uRoomId = await this.roomAssistant.prepearRoom(this.sessionId, roomId);
     this.roomId = `room-${uRoomId}_${oneSceneNum}_web`;
+    this.user.roomId = uRoomId;
+    this.roomConfigId = `config-${this.roomId}`;
+    return Promise.resolve(true)
   }
 
   initBaseAction() {
@@ -104,11 +110,47 @@ export class RoomController extends BasicController {
       }
     });
 
-    this.socket.on(EVENT.startCall, () => {
+    this.socket.on(EVENT.startCall, async () => {
       this.roomAssistant.startCall(this.roomId, this.userId, this.user);
+      if (this.isHoster(this.user.role)) {
+        // 以startCall做为真正的进入房间
+        await updateRoomConfigByKey(this.roomId, "isStart", true);
+      }
     });
     this.socket.on(EVENT.stopCall, () => {
       this.roomAssistant.stopCall(this.roomId, this.userId, this.user);
+      if (this.isHoster(this.user.role)) {
+        // 以stopCall断开做为真正的退出房间
+        this.roomAssistant.destoryRoom(this.sessionId, this.roomConfigId);
+      }
+    });
+
+    this.socket.on(EVENT.changeRoomEnableTalk, async (data) => {
+      // this._roomsConfig[roomId].enableTalk = data;
+      try {
+        await setRoomConfig(this.roomId, data);
+        const roomConfig = await getRoomConfig(this.roomId);
+        this.socket.broadcast.to(this.roomId).emit(EVENT.changeRoomEnableTalk, roomConfig);
+      } catch (error) {
+        this.logger.error("event:changeRoomEnableTalk", error);
+      }
+    });
+
+    this.socket.on(EVENT.changeOnlineStatus, async (data) => {
+      try {
+        this.user.onlineStatus = data.status;
+        const AllRoomUsers = await getAllRoomUsers(this.roomId);
+        await updateRoomUser(this.roomId, this.userId, this.user);
+        let actionName = this.user.onlineStatus ? "inRoom" : "leaveRoom";
+        this.logger.info("changeOnlineStatus", JSON.stringify(this.user));
+        this.socket.broadcast.to(this.roomId).emit(EVENT.roomPersonChange, {
+          roomsPerson: AllRoomUsers,
+          actionName,
+          user: this.user,
+        });
+      } catch (error) {
+        this.logger.error("event:changeOnlineStatus", error);
+      }
     });
 
     if (this.debugger) {
@@ -120,7 +162,33 @@ export class RoomController extends BasicController {
     }
   }
 
-  roomMasterAutoRejoin() {
-    // const
+  async roomMasterAutoRejoin() {
+    try {
+      const sessionExist = await this.redisCli.exists(this.sessionId);
+      const roomConfig = await getRoomConfig(this.roomId);
+      if (sessionExist > 0 && roomConfig.isStart && roomConfig.isStart === "true") {
+
+        const AllRoomUsers = await getAllRoomUsers(this.roomId);
+        // 房主
+        if (this.isHoster(this.user.role)) {
+          console.log("自动接连", this.roomId);
+          this.socket.join(this.roomId);
+  
+          this.socket.emit("autoReJoin", {
+            user: this.user,
+            roomsPerson: AllRoomUsers,
+            roomId:this.user.roomId
+          });
+        }
+        setTimeout(() => {
+          this.socket.emit("someOneInRoom", {
+            user: this.user,
+            roomsPerson: AllRoomUsers,
+          });
+        });
+      }
+    } catch (error) {
+      this.logger.error("room::roomMasterAutoRejoin", error);
+    }
   }
 }

+ 55 - 0
src/controller/syncDeviceController.js

@@ -0,0 +1,55 @@
+import { BasicController } from "./basicController.js";
+// import { RoomAssistant } from "./assistant.js";
+import { getAllRoomUsers, updateRoomUser } from "../service/userService.js";
+import { FROMTYPE, EVENT } from "../enum/index.js";
+
+export class SyncDeviceController extends BasicController {
+  constructor(...args) {
+    super(...args);
+    this.room = args[3];
+  }
+  async run() {
+    if (this.room.user) {
+      const syncId = this.room.syncId;
+      const userId = this.room.userId;
+      const from = this.room.user.from;
+      this.joinSyncClient(syncId, userId, from);
+      this.initAction();
+    } else {
+      this.logger.error("roomController:init: 初始化失败!");
+    }
+  }
+  async joinSyncClient(syncId, userId, from) {
+    this.logger.info("syncId", { syncId, userId, from });
+    try {
+      await this.redisCli.hSet(syncId, from, userId);
+      this.socket.join(syncId);
+    } catch (error) {
+      this.logger.error("joinSyncClient", error);
+    }
+  }
+  initAction() {
+    this.socket.on(EVENT.clientSyncAction, (data) => {
+      this.socket.broadcast.to(this.room.syncId).emit(EVENT.clientSyncAction, data);
+    });
+    this.socket.on(EVENT.changeVoiceStatus, async (data) => {
+      try {
+        this.socket.broadcast.to(this.room.syncId).emit(EVENT.changeVoiceStatus, data);
+        const updateUser = {
+          ...this.room.user,
+          voiceStatus: data.status,
+        };
+        const isUpdate = await updateRoomUser(this.room.roomId, this.room.userId, updateUser);
+        const AllRoomUsers = await getAllRoomUsers(this.room.roomId);
+        this.logger.info("changeVoiceStatus", { roomId: this.room.roomId, data, AllRoomUsers: AllRoomUsers.length });
+
+        this.socket.broadcast.to(this.room.roomId).emit(EVENT.changeVoiceStatus, {
+          user: this.room.user,
+          roomsPerson: AllRoomUsers,
+        });
+      } catch (error) {
+        this.logger.error("event::changeVoiceStatus", error);
+      }
+    });
+  }
+}

+ 12 - 1
src/service/roomConfigService.js

@@ -4,9 +4,20 @@ const setRoomConfig = (roomId, config) => {
   const roomConfigKey = `config-${roomId}`;
   return pubClient.hSet(roomConfigKey, config);
 };
+const removeRoomConfig = (roomId, config) => {
+  const roomConfigKey = `config-${roomId}`;
+  return pubClient.del(roomConfigKey);
+};
 const getRoomConfig = (roomId, config) => {
   const roomConfigKey = `config-${roomId}`;
   return pubClient.hGetAll(roomConfigKey);
 };
+const updateRoomConfigByKey = async (roomId, keyName, value) => {
+  const roomConfigKey = `config-${roomId}`;
+  const res = await pubClient.hGetAll(roomConfigKey);
+  const newKey = { [keyName]: value };
+  const updateObj = Object.assign({}, res, newKey);
+  return pubClient.hSet(roomConfigKey, updateObj);
+};
 
-export { setRoomConfig, getRoomConfig };
+export { setRoomConfig, getRoomConfig, removeRoomConfig, updateRoomConfigByKey };