Przeglądaj źródła

init controller

gemercheung 3 lat temu
rodzic
commit
3773cb45b7

+ 2 - 0
.env

@@ -3,3 +3,5 @@ REDIS_HOST=localhost
 REDIS_PORT=6379
 REDIS_USER=root
 REDIS_PASSWORD=s1mpl3
+WATCH_USER=4dage
+WATCH_PASSWORD=4dage168.

+ 3 - 0
readme.md

@@ -0,0 +1,3 @@
+https://localhost:8080/shop.html?m=1tHXcEL6s&sid=1046450&room_id=581296677&user_id=13&origin=fashilong&role=leader&brandId=1046450#socket={"socketHost":"wss://shop.4dkankan.com","path":"/fsl-node-test","options":{"role":"leader","userId":13,"avatar":"https://4dkk.4dage.com/shop/huafa/20210908/145820603cfb32.png","nickname":"jinx%26amp%3Baa%F0%9F%98%81%F0%9F%99%83%F0%9F%98%8B","voiceStatus":2,"enableTalk":true,"roomId":581296677,"sceneNumber":"1tHXcEL6s","onlineStatus":true,"userLimitNum":50}}
+
+docker run -d --restart always --name socket-admin-ui -p 9101:80 192.168.0.163:8077/4dage/socket-ui:1.0 nginx -g 'daemon off;'

+ 32 - 2
src/controller/basicController.js

@@ -1,4 +1,34 @@
+import { pubClient } from "../connection/redis.js";
+import { EVENT } from "../enum/event.js";
+import { roomController } from "./roomController.js";
+
+const clientSyncAction = (socket) => {
+  socket.on(EVENT.clientSyncAction, (data) => {
+    socket.broadcast.to(clientRoom).emit(EVENT.clientSyncAction, data);
+  });
+};
+const webSyncAction = (socket) => {
+  socket.on(EVENT.webSyncAction, (data) => {
+    socket.broadcast.to(webRoomId).emit(EVENT.webSyncAction, data);
+  });
+};
+const action = (socket) => {
+  socket.on(EVENT.action, (data) => {
+    socket.broadcast.to(roomId).emit(EVENT.action, data);
+  });
+};
 export async function basicController(socket) {
-  let user = socket.handshake.query;
-  console.log("user", user);
+  //   socket.use(([event, ...args], next) => {
+  //     if (isUnauthorized(event)) {
+  //       return next(new Error("unauthorized event"));
+  //     }
+  //     next();
+  //   });
+
+  clientSyncAction(socket);
+  webSyncAction(socket);
+  roomController(socket);
+
+  //   console.log("pubClient", pubClient);
+  //   await pubClient.HSET(user.userId, "value", user);
 }

+ 3 - 0
src/controller/errorController.js

@@ -0,0 +1,3 @@
+export async function errorController(socket) {
+  console.log("socket", socket);
+}

+ 4 - 0
src/controller/index.js

@@ -1,14 +1,18 @@
 import { io } from "../core/io.js";
 
 import { basicController } from "./basicController.js";
+import { errorController } from "./errorController.js";
 
 class mainController {
   constructor(io) {
     this.io = io;
     this.basicController = basicController.bind(this);
+    this.errorController = errorController.bind(this);
   }
   run() {
     this.io.on("connection", this.basicController);
+    this.io.on("connect_error", this.errorController);
+    this.io.on("error", this.errorController);
   }
 }
 

+ 129 - 0
src/controller/roomController.js

@@ -0,0 +1,129 @@
+import { pubClient } from "../connection/redis.js";
+import { ROLES, CODEMEG, EVENT } from "../enum/index.js";
+import { io } from "../core/io.js";
+
+/**
+ *  加入房间
+ * @param {*} clientRoom
+ * @param {*} socket
+ */
+const joinRoom = ({ clientRoom, userUniqueId, roomUniqueId, user }, socket) => {
+  console.log("加入房间:", userUniqueId);
+  socket.join(clientRoom);
+  socket.broadcast.emit(EVENT.roomIn, {
+    user,
+    // roomsPerson: sortRoomUser(roomsPerson),
+    // roomsConfig: this._roomsConfig[roomId],
+  });
+};
+
+/**
+ * 离开房间
+ * @param {*} clientRoom
+ * @param {*} userUniqueId
+ * @param {*} roomUniqueId
+ * @param {*} socket
+ */
+const leaveRoom = async ({
+  clientRoom,
+  userUniqueId,
+  roomUniqueId,
+  socket,
+}) => {
+  try {
+    socket.leave(clientRoom);
+    const existUser = await pubClient.hGetAll(userUniqueId);
+    if (existUser) {
+      if (String(existUser.role).toLowerCase() === ROLES.LEADER) {
+        await pubClient.del(userUniqueId);
+        await pubClient.del(roomUniqueId);
+        io.emit(EVENT.roomClose, { code: 3002, msg: CODEMEG[3002] });
+      } else {
+        await pubClient.del(userUniqueId);
+        await pubClient.hDel(roomUniqueId, userUniqueId);
+      }
+
+      console.log("disconnect user" + userUniqueId);
+    }
+  } catch (error) {
+    console.log("error", error);
+  }
+};
+
+/**
+ * 检查房主存不存在
+ * @param {*} roomUniqueId
+ * @param {*} socket
+ */
+const watchRoomStatus = async (roomUniqueId, socket) => {
+  const watch = await pubClient.watch(roomUniqueId);
+  if (watch === "OK") {
+    checkRoomStatus(roomUniqueId, socket);
+  }
+};
+
+const checkRoomStatus = async (roomUniqueId, socket) => {
+  const values = await pubClient.hVals(roomUniqueId);
+  if (values) {
+    console.log("room watch", roomUniqueId, values);
+    const existMaster = values.find(
+      (item) => String(JSON.parse(item).role).toLowerCase() === ROLES.LEADER
+    );
+    if (!existMaster) {
+      console.log("不存在房主");
+      setTimeout(async () => {
+        socket.emit(EVENT.roomClose, { code: 3001, msg: CODEMEG[3001] });
+        await pubClient.del(roomUniqueId);
+        await pubClient.del(`type-${roomUniqueId}`);
+      }, 1000);
+    } else {
+      const hosts = JSON.parse(existMaster);
+      console.log("存在房主", hosts.roomType);
+      if (hosts.roomType === "1v1" && values.length > 2) {
+        console.log("1v1-房间人数已满", values.length);
+        setTimeout(() => {
+          socket.emit("roomInFail", {
+            type: "full",
+            msg: "房间人数已满",
+          });
+        }, 1000);
+      }
+    }
+  }
+};
+
+export async function roomController(socket) {
+  let user = socket.handshake.query;
+  const { roomId, userId, sceneNum, isClient, role, userLimitNum, roomType } =
+    user;
+  if (user) {
+    const webRoomId = `${roomId}_${sceneNum}_web`;
+    const clientRoom = `${userId}${roomId}`;
+    const userUniqueId = `user-${userId}`;
+    const roomUniqueId = `room-${webRoomId}`;
+    if ("roomId" in user && "userId" in user) {
+      await pubClient.hSet(userUniqueId, user);
+      await pubClient.hSet(
+        roomUniqueId,
+        userUniqueId,
+        JSON.stringify({
+          role: role,
+          roomType,
+          userLimitNum: userLimitNum || "",
+        })
+      );
+      joinRoom({ clientRoom, userUniqueId, roomUniqueId, user }, socket);
+    }
+    watchRoomStatus(roomUniqueId, socket);
+
+    socket.on("disconnect", () => {
+      leaveRoom({ clientRoom, userUniqueId, roomUniqueId, socket });
+      // watchRoomWithMaster(roomUniqueId, socket);
+    });
+    socket.on("reconnect", () => {
+      console.log("reconnect");
+      // leaveRoom({ clientRoom, userUniqueId, roomUniqueId, socket });
+      // watchRoomWithMaster(roomUniqueId, socket);
+    });
+  }
+}

+ 8 - 8
src/core/io.js

@@ -1,6 +1,7 @@
 import http from "http";
+import bcrypt from "bcrypt";
 import { Server } from "socket.io";
-import { instrument } from "@socket.io/admin-ui";
+import { instrument, RedisStore } from "@socket.io/admin-ui";
 import { createAdapter } from "@socket.io/redis-adapter";
 import { pubClient, subClient } from "../connection/redis.js";
 
@@ -9,18 +10,17 @@ const io = new Server(httpServer, {
   cors: {
     origin: "*",
   },
-  path: "/vr-node",
+  path: "/test",
   pingInterval: 10000,
   pingTimeout: 5000,
 });
 
 instrument(io, {
-  //   auth: {
-  //     type: "basic",
-  //     username: "admin",
-  //     password: "$2b$10$heqvAkYMez.Va6Et2uXInOnkCT6/uQj1brkrbyG3LpopDklcq7ZOS", // "changeit" encrypted with bcrypt
-  //   },
-  auth: false,
+  auth: {
+    type: "basic",
+    username: process.env.WATCH_USER,
+    password: bcrypt.hashSync(process.env.WATCH_PASSWORD, 10),
+  },
   namespaceName: "/watch",
 });
 

+ 6 - 0
src/enum/codeMsg.js

@@ -0,0 +1,6 @@
+const CODEMEG = {
+  3001: "房间已被解散",
+  3002: "房主主动解散",
+};
+
+export { CODEMEG };

+ 18 - 0
src/enum/event.js

@@ -0,0 +1,18 @@
+const EVENT = {
+  someOneInRoom: "someOneInRoom", // 有人进入房间
+  someOneLeaveRoom: "someOneLeaveRoom", // 有人离开房间
+  startCall: "startCall", // 开始通话
+  stopCall: "stopCall", // 结束通话
+  webSyncAction: "webSyncAction", // 通知h5的事件
+  clientSyncAction: "clientSyncAction", // 通知非H5的事件
+  action: "action", // 通知所有连接设备的事件
+  roomClose: "roomClose", // 房间已结束/房主已离开
+  roomInFail: "roomInFail", // 房间人数已满
+  roomIn: "roomIn", // 通知设备成功进入房间
+  changeVoiceStatus: "changeVoiceStatus", // 通知某设备语音状态
+  changeOnlineStatus: "changeOnlineStatus", // 通知某设备的在线状态
+  roomPersonChange: "roomPersonChange", // 房间人数变化事件
+  changeRoomEnableTalk: "changeRoomEnableTalk", // 改变房间是否可通话的配置
+};
+
+export { EVENT };

+ 4 - 0
src/enum/index.js

@@ -0,0 +1,4 @@
+export { CODEMEG } from "./codeMsg.js";
+export { EVENT } from "./event.js";
+export { KEYS } from "./keys.js";
+export { ROLES } from "./role.js";

+ 20 - 0
src/enum/keys.js

@@ -0,0 +1,20 @@
+const KEYS = {
+  shop: {
+    appid: "1400431163",
+    key: "8de69820eb514e29ea3c6643f546478cbfe1b609ad3a904e64d13a7f38b5328d",
+  },
+  vrhouse: {
+    appid: "1400433526",
+    key: "6de58833e126d2bf6682997ead07950bc0bda694b267883a6b35a4ba342da0c4",
+  },
+  fashilong: {
+    appid: "1400450635",
+    key: "f0bb5717fe83688fe1d26826be7cae482269812ef2f0ecf25746dee618487140",
+  },
+  zhuisu: {
+    appid: "1400458585",
+    key: "fe3db36896e1fbc93a3dea6dd3deb193f546bf165e2e5b3335546f71d020391d",
+  },
+};
+
+export { KEYS };

+ 6 - 0
src/enum/role.js

@@ -0,0 +1,6 @@
+const ROLES = {
+  LEADER: "leader", // 房主
+  AGENT: "agent", // 房客
+};
+
+export { ROLES };