import { BasicController } from "./basicController.js"; import { RoomController } from "./room/index.js"; import { SyncDeviceController } from "./syncDeviceController.js"; import { FROMTYPE } from "../enum/index.js"; import { updateRoomUser, isUserInRoom, removeRoomUser } from "../service/userService.js"; import { publishExitRoom } from "../service/publishService.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 this.syncDeviceController.run(); this.redisSubClient.subscribe("dismissRoom", (message) => { // chat:room:dismiss:c-fCTZyvc:E71464 this.logger.info("subscribe-订阅", JSON.stringify(message)); const disMissId = message.split("chat:room:dismiss:")[1]; if (disMissId) { const disMissRoomId = `room:${disMissId}`; const userId = this.roomController.userId; const roomId = this.roomController.roomId; const user = this.roomController.user; const sessionId = this.roomController.sessionId; const roomConfigId = this.roomController.roomConfigId; if (disMissRoomId === roomId) { this.logger.info("subscribe-订阅-配对", disMissRoomId, userId, roomId, user); this.roomController.roomAssistant.notifyRoomDismiss(roomId); this.roomController.roomAssistant.stopCall(roomId, userId, user, true); this.roomController.roomAssistant.destoryRoom(sessionId, roomConfigId); } } }); this.socket.on("reconnect", () => { this.logger.warn("重新连接"); this.run(); }); this.socket.on("error", (err) => { this.logger.error(`连接错误,原因: ${err.message}`); this.redisSubClient.unsubscribe("dismissRoom"); }); this.socket.on("disconnect", async (reason) => { const res = String(reason).split(" "); console.log("disconnect-reason", res); this.redisSubClient.unsubscribe("dismissRoom"); // if (res.includes("close") || res.includes("disconnect")) { if ([FROMTYPE.MiniAPP].includes(Number(this.roomController.user.from))) { const userId = this.roomController.userId; const from = this.roomController.user.from; const roomId = this.roomController.roomId; const role = this.roomController.user.role; const user = this.roomController.user; this.roomController.logger.info("断开连接", { userId, from, roomId, }); publishExitRoom(userId, user.roomId); // if (this.roomController.isHoster(role)) { this.roomController.roomAssistant.hasCall = false; setTimeout(async () => { // 有可客户端主动断开时 if (Number(user.onlineStatus) === 1) { // const res = await this.roomController.roomAssistant.checkRoomMaximum(roomId); const isInRoom = await isUserInRoom(roomId, user.userId); const illegalMaster = this.roomController.roomAssistant.illegalMaster; if (!this.roomController.roomAssistant.roomMax && isInRoom && this.roomController) { // console.log("测试-->illegalMaster", illegalMaster); if (illegalMaster) { console.log("断开存在非法房主"); await removeRoomUser(roomId, userId); this.roomController.roomAssistant.illegalMaster = false; } else { isInRoom.onlineStatus = 0; this.roomController.user = isInRoom; console.log("已在线,被断开后", isInRoom); await updateRoomUser(roomId, userId, isInRoom); await this.roomController.roomAssistant.notifyUsersChange(roomId, user, false); } } } }, 1000); // await updateRoomUser(this.roomController.user); // } // this.roomController.roomAssistant.setRoomAvailableBySeconds(this.roomController.sessionId, 3 * 60); // this.roomController.roomAssistant.disconnect(); // this.roomController.roomAssistant.unWatchRoomExpired(); // } } }); // benmark this.socket.on("client-benmark-server", (data) => { const roomId = this.roomController.roomId; this.socket.broadcast.to(roomId).emit("server-benmark-client", data); }); let serverIntervalRoomBroadcast = false; let serverIntervalRoomBroadcastTimer = null; this.socket.on("server-interval-room-broadcast", ({ time }) => { const roomId = this.roomController.roomId; if (!serverIntervalRoomBroadcast) { serverIntervalRoomBroadcast = true; const data = { message: "定时benmark-播报", timestamp: new Date(), }; serverIntervalRoomBroadcastTimer = setInterval(() => { this.socket.broadcast.to(roomId).emit("client-interval-room-broadcast", data); }, time | 1000); } }); this.socket.on("server-interval-room-broadcast-cancel", () => { if (serverIntervalRoomBroadcastTimer) { clearInterval(serverIntervalRoomBroadcastTimer); serverIntervalRoomBroadcast = false; } }); } }