瀏覽代碼

update save

gemercheung 4 年之前
父節點
當前提交
69ef28b168

+ 1 - 0
.env

@@ -6,3 +6,4 @@ REDIS_USER=redis
 REDIS_PASSWORD=s1mpl3
 WATCH_USER=4dage
 WATCH_PASSWORD=4dage168.
+USER_LIMIT=30

+ 1 - 0
.env.development

@@ -5,3 +5,4 @@ REDIS_PORT=6379
 REDIS_PASSWORD=redis9394
 WATCH_USER=4dage
 WATCH_PASSWORD=4dage168.
+USER_LIMIT=30

+ 1 - 0
.env.production

@@ -6,3 +6,4 @@ REDIS_USER=redis
 REDIS_PASSWORD=s1mpl3
 WATCH_USER=4dage
 WATCH_PASSWORD=4dage168.
+USER_LIMIT=30

+ 179 - 1
package-lock.json

@@ -25,7 +25,8 @@
         "winston": "^3.4.0"
       },
       "devDependencies": {
-        "cross-env": "^7.0.3"
+        "cross-env": "^7.0.3",
+        "socket.io-client": "^4.4.1"
       },
       "optionalDependencies": {
         "bufferutil": "^4.0.6",
@@ -148,6 +149,12 @@
         "node": ">=10.0.0"
       }
     },
+    "node_modules/@socket.io/component-emitter": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz",
+      "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==",
+      "dev": true
+    },
     "node_modules/@socket.io/redis-adapter": {
       "version": "7.1.0",
       "resolved": "https://registry.npmjs.org/@socket.io/redis-adapter/-/redis-adapter-7.1.0.tgz",
@@ -294,6 +301,12 @@
         "queue-microtask": "^1.1.2"
       }
     },
+    "node_modules/backo2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+      "dev": true
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -579,6 +592,23 @@
         "node": ">=10.0.0"
       }
     },
+    "node_modules/engine.io-client": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz",
+      "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==",
+      "dev": true,
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.0.0",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.0.0",
+        "has-cors": "1.1.0",
+        "parseqs": "0.0.6",
+        "parseuri": "0.0.6",
+        "ws": "~8.2.3",
+        "xmlhttprequest-ssl": "~2.0.0",
+        "yeast": "0.1.2"
+      }
+    },
     "node_modules/engine.io-parser": {
       "version": "5.0.3",
       "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz",
@@ -787,6 +817,12 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/has-cors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+      "dev": true
+    },
     "node_modules/has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
@@ -1108,6 +1144,18 @@
         "fn.name": "1.x.x"
       }
     },
+    "node_modules/parseqs": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
+      "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==",
+      "dev": true
+    },
+    "node_modules/parseuri": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
+      "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==",
+      "dev": true
+    },
     "node_modules/path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -1414,6 +1462,36 @@
       "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
       "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ=="
     },
+    "node_modules/socket.io-client": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz",
+      "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==",
+      "dev": true,
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.0.0",
+        "backo2": "~1.0.2",
+        "debug": "~4.3.2",
+        "engine.io-client": "~6.1.1",
+        "parseuri": "0.0.6",
+        "socket.io-parser": "~4.1.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/socket.io-client/node_modules/socket.io-parser": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.1.tgz",
+      "integrity": "sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA==",
+      "dev": true,
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.0.0",
+        "debug": "~4.3.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
     "node_modules/socket.io-parser": {
       "version": "4.0.4",
       "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
@@ -1657,10 +1735,25 @@
         }
       }
     },
+    "node_modules/xmlhttprequest-ssl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
+      "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "node_modules/yeast": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+      "dev": true
     }
   },
   "dependencies": {
@@ -1757,6 +1850,12 @@
         "socket.io-adapter": "~2.3.0"
       }
     },
+    "@socket.io/component-emitter": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz",
+      "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==",
+      "dev": true
+    },
     "@socket.io/redis-adapter": {
       "version": "7.1.0",
       "resolved": "https://registry.npmjs.org/@socket.io/redis-adapter/-/redis-adapter-7.1.0.tgz",
@@ -1881,6 +1980,12 @@
         "queue-microtask": "^1.1.2"
       }
     },
+    "backo2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+      "dev": true
+    },
     "balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2097,6 +2202,23 @@
         "ws": "~8.2.3"
       }
     },
+    "engine.io-client": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz",
+      "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==",
+      "dev": true,
+      "requires": {
+        "@socket.io/component-emitter": "~3.0.0",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.0.0",
+        "has-cors": "1.1.0",
+        "parseqs": "0.0.6",
+        "parseuri": "0.0.6",
+        "ws": "~8.2.3",
+        "xmlhttprequest-ssl": "~2.0.0",
+        "yeast": "0.1.2"
+      }
+    },
     "engine.io-parser": {
       "version": "5.0.3",
       "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz",
@@ -2272,6 +2394,12 @@
         "path-is-absolute": "^1.0.0"
       }
     },
+    "has-cors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+      "dev": true
+    },
     "has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
@@ -2517,6 +2645,18 @@
         "fn.name": "1.x.x"
       }
     },
+    "parseqs": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
+      "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==",
+      "dev": true
+    },
+    "parseuri": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
+      "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==",
+      "dev": true
+    },
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -2736,6 +2876,32 @@
       "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
       "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ=="
     },
+    "socket.io-client": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz",
+      "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==",
+      "dev": true,
+      "requires": {
+        "@socket.io/component-emitter": "~3.0.0",
+        "backo2": "~1.0.2",
+        "debug": "~4.3.2",
+        "engine.io-client": "~6.1.1",
+        "parseuri": "0.0.6",
+        "socket.io-parser": "~4.1.1"
+      },
+      "dependencies": {
+        "socket.io-parser": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.1.tgz",
+          "integrity": "sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA==",
+          "dev": true,
+          "requires": {
+            "@socket.io/component-emitter": "~3.0.0",
+            "debug": "~4.3.1"
+          }
+        }
+      }
+    },
     "socket.io-parser": {
       "version": "4.0.4",
       "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
@@ -2928,10 +3094,22 @@
       "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
       "requires": {}
     },
+    "xmlhttprequest-ssl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
+      "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
+      "dev": true
+    },
     "yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "yeast": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+      "dev": true
     }
   }
 }

+ 2 - 1
package.json

@@ -32,6 +32,7 @@
     "utf-8-validate": "^5.0.8"
   },
   "devDependencies": {
-    "cross-env": "^7.0.3"
+    "cross-env": "^7.0.3",
+    "socket.io-client": "^4.4.1"
   }
 }

+ 31 - 5
src/controller/roomController.js

@@ -1,7 +1,8 @@
 import { pubClient } from "../connection/redis.js";
-import { ROLES, CODEMEG, EVENT } from "../enum/index.js";
+import { ROLES, CODEMEG, EVENT, FROMTYPE } from "../enum/index.js";
 import { io } from "../core/io.js";
 import { logger } from "../core/logger.js";
+// import { removeRoomAllUsers } from "../service/userService.js";
 
 /**
  * 检查是否是房主
@@ -97,9 +98,21 @@ const leaveRoomAction = async (roomId, userId, user, socket) => {
     // roomsPerson: sortRoomUser(roomsPerson),
     // roomsConfig: this._roomsConfig[roomId],
   });
-  leaveRoom(roomId, userId);
 };
 
+/**
+ * 房主关闭房间
+ * @param {*} clientRoom
+ * @param {*} userUniqueId
+ * @param {*} roomUniqueId
+ * @param {*} socket
+ */
+const closeRoomAction = async (roomId, userId, user, socket) => {
+  logger.info("房主关闭房间", userId);
+  socket.leave(roomId);
+  removeRoomAllUsers(roomId);
+  socket.broadcast.emit(EVENT.roomClose, { code: 3002, msg: CODEMEG[3002] });
+};
 export async function roomController(socket) {
   let user = socket.handshake.query;
   const { roomId, userId, sceneNum, isClient, role, userLimitNum, roomType, from } = user;
@@ -108,26 +121,31 @@ export async function roomController(socket) {
     // const clientRoom = `${userId}${roomId}`;
     const userUniqueId = `user-${userId}`;
     const roomUniqueId = `room-${webRoomId}`;
+    // const userLimitNum = userLimitNum || process.env.US
     if ("roomId" in user && "userId" in user) {
       user.isLogin = true;
       await pubClient.hSet(userUniqueId, user);
       await pubClient.expire(userUniqueId, 60 * 60 * 24);
       // 房主自动创建房间
 
-      if (isHoster(role) && Number(from) === 0) {
+      if (isHoster(role) && Number(from) === FROMTYPE.MiniAPP) {
         logger.debug("房主自动创建房间 :", { roomId: roomUniqueId, userId: userUniqueId, user });
         buildRoom(roomUniqueId, userUniqueId, user);
         socket.join(roomUniqueId);
       }
+    } else {
+      logger.info("user-query-不存在 :", socket.handshake.query);
+      // socket.disconnect();
     }
     // watchRoomStatus(roomUniqueId, socket);
 
     socket.on(EVENT.startCall, startCallAction.bind(null, roomUniqueId, userUniqueId, user, socket));
     socket.on(EVENT.stopCall, stopCallAction.bind(null, roomUniqueId, userUniqueId, user, socket));
 
-    socket.on("disconnect", () => {
+    socket.on("disconnect", (reason) => {
       // leaveRoom({ clientRoom, userUniqueId, roomUniqueId, socket });
       // watchRoomWithMaster(roomUniqueId, socket);
+      console.log("reason", reason);
     });
     socket.on("reconnect", () => {
       console.log("reconnect");
@@ -135,14 +153,22 @@ export async function roomController(socket) {
   }
 }
 
-const startCallAction = (roomId, userId, user, socket) => {
+const startCallAction = async (roomId, userId, user, socket) => {
   if (!isHoster(user.role)) {
     joinRoomAction(roomId, userId, user, socket);
+  } else {
+    const hasRoom = await pubClient.hVals(roomId);
+    if (hasRoom.length === 0) {
+      logger.debug("房主主动创建房间 :", { roomId, userId });
+      buildRoom(roomId, userId, user);
+    }
   }
 };
 
 const stopCallAction = (roomId, userId, user, socket) => {
   if (!isHoster(user.role)) {
     leaveRoomAction(roomId, userId, user, socket);
+  } else {
+    closeRoomAction(roomId, userId, user, socket);
   }
 };

+ 0 - 0
src/controller/userController.js


+ 6 - 0
src/enum/fromType.js

@@ -0,0 +1,6 @@
+const FROMTYPE = {
+  H5: 0,
+  MiniAPP: 1,
+};
+
+export { FROMTYPE };

+ 1 - 0
src/enum/index.js

@@ -2,3 +2,4 @@ export { CODEMEG } from "./codeMsg.js";
 export { EVENT } from "./event.js";
 export { KEYS } from "./keys.js";
 export { ROLES } from "./role.js";
+export { FROMTYPE } from "./fromType.js";

+ 25 - 0
src/service/userService.js

@@ -0,0 +1,25 @@
+import { pubClient } from "../connection/redis.js";
+
+const addUser = async (userId, user) => {
+  const user = pubClient.hVals(userId);
+  if (user.length === 0) {
+    await pubClient.hSet(userId, JSON.stringify(user));
+  }
+};
+
+const updateUser = async (userId, user) => {
+  const user = pubClient.hVals(userId);
+  if (user.length > 0) {
+    await pubClient.hSet(userId, JSON.stringify(user));
+  }
+};
+
+const removeRoomAllUsers = async (roomId) => {
+  await pubClient.del(roomId);
+};
+
+const removeRoomUser = async (roomId, useId) => {
+  await pubClient.hDel(roomId, useId);
+};
+
+export { addUser, updateUser, removeRoomAllUsers, removeRoomUser };

+ 8 - 0
src/service/watchRoomService.js

@@ -0,0 +1,8 @@
+
+const passiveLeave(){
+
+
+    // setTimeout
+}
+
+export async function watchRoomService(roomId, socket) {}

+ 51 - 0
test/muti-client.js

@@ -0,0 +1,51 @@
+import { io } from "socket.io-client";
+const URL = process.env.URL || "http://127.0.0.1:3000";
+const MAX_CLIENTS = 10000;
+const POLLING_PERCENTAGE = 0.05;
+const CLIENT_CREATION_INTERVAL_IN_MS = 10;
+const EMIT_INTERVAL_IN_MS = 1000;
+
+let clientCount = 0;
+let lastReport = new Date().getTime();
+let packetsSinceLastReport = 0;
+
+const createClient = () => {
+  // for demonstration purposes, some clients stay stuck in HTTP long-polling
+  const transports = Math.random() < POLLING_PERCENTAGE ? ["websocket"] : ["websocket", "websocket"];
+
+  const socket = io(URL, {
+    path: "/test",
+    transports,
+  });
+
+  setInterval(() => {
+    socket.emit("client to server event");
+  }, EMIT_INTERVAL_IN_MS);
+
+  socket.on("server to client event", () => {
+    packetsSinceLastReport++;
+  });
+
+  socket.on("disconnect", (reason) => {
+    console.log(`disconnect due to ${reason}`);
+  });
+
+  if (++clientCount < MAX_CLIENTS) {
+    setTimeout(createClient, CLIENT_CREATION_INTERVAL_IN_MS);
+  }
+};
+
+createClient();
+
+const printReport = () => {
+  const now = new Date().getTime();
+  const durationSinceLastReport = (now - lastReport) / 1000;
+  const packetsPerSeconds = (packetsSinceLastReport / durationSinceLastReport).toFixed(2);
+
+  console.log(`client count: ${clientCount} ; average packets received per second: ${packetsPerSeconds}`);
+
+  packetsSinceLastReport = 0;
+  lastReport = now;
+};
+
+setInterval(printReport, 5000);