gemercheung 3 years ago
parent
commit
3ef61f9ea1

+ 1 - 0
.env

@@ -11,3 +11,4 @@ REDIS_PASSWORD=s1mpl3
 WATCH_USER=4dage
 WATCH_USER=4dage
 WATCH_PASSWORD=4dage168.
 WATCH_PASSWORD=4dage168.
 USER_LIMIT=30
 USER_LIMIT=30
+LOGGER_PATH=''

+ 4 - 0
index.js

@@ -1,4 +1,7 @@
+process.env.silent = true
 import "dotenv-flow/config.js";
 import "dotenv-flow/config.js";
+
+
 import { CoreCluster } from "./src/core/cluster.js";
 import { CoreCluster } from "./src/core/cluster.js";
 
 
 // import fastify from "fastify";
 // import fastify from "fastify";
@@ -8,4 +11,5 @@ import { CoreCluster } from "./src/core/cluster.js";
 
 
 // server.register(fastifyIO);
 // server.register(fastifyIO);
 
 
+
 const ClusterServer = new CoreCluster(process.env.SOCKET_PORT);
 const ClusterServer = new CoreCluster(process.env.SOCKET_PORT);

File diff suppressed because it is too large
+ 2684 - 8
package-lock.json


+ 6 - 2
package.json

@@ -4,7 +4,7 @@
   "description": "",
   "description": "",
   "main": "index.js",
   "main": "index.js",
   "scripts": {
   "scripts": {
-    "dev": "cross-env NODE_ENV=development node index.js",
+    "dev": "cross-env NODE_ENV=development silent=true node index.js",
     "hot-serve": "cross-env NODE_ENV=development npx nodemon index.js",
     "hot-serve": "cross-env NODE_ENV=development npx nodemon index.js",
     "production": "cross-env NODE_ENV=production node index.js"
     "production": "cross-env NODE_ENV=production node index.js"
   },
   },
@@ -12,6 +12,7 @@
   "author": "",
   "author": "",
   "license": "ISC",
   "license": "ISC",
   "dependencies": {
   "dependencies": {
+    "@elastic/elasticsearch": "^8.1.0",
     "@socket.io/admin-ui": "^0.2.0",
     "@socket.io/admin-ui": "^0.2.0",
     "@socket.io/cluster-adapter": "^0.1.0",
     "@socket.io/cluster-adapter": "^0.1.0",
     "@socket.io/redis-adapter": "^7.1.0",
     "@socket.io/redis-adapter": "^7.1.0",
@@ -20,6 +21,7 @@
     "bcryptjs": "^2.4.3",
     "bcryptjs": "^2.4.3",
     "dotenv-flow": "^3.2.0",
     "dotenv-flow": "^3.2.0",
     "eiows": "^3.7.3",
     "eiows": "^3.7.3",
+    "elastic-apm-node": "^3.31.0",
     "engine.io": "^6.1.2",
     "engine.io": "^6.1.2",
     "fastify": "^3.25.3",
     "fastify": "^3.25.3",
     "fastify-socket.io": "^3.0.0",
     "fastify-socket.io": "^3.0.0",
@@ -27,9 +29,11 @@
     "redis": "^4.0.2",
     "redis": "^4.0.2",
     "socket.io": "^4.4.1",
     "socket.io": "^4.4.1",
     "socket.io-msgpack-parser": "^3.0.1",
     "socket.io-msgpack-parser": "^3.0.1",
+    "socket.io-prometheus-v3": "^1.0.3",
     "tls-sig-api-v2": "^1.0.2",
     "tls-sig-api-v2": "^1.0.2",
     "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.4.0",
     "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.4.0",
-    "winston": "^3.4.0"
+    "winston": "^3.4.0",
+    "winston-elasticsearch": "^0.16.1"
   },
   },
   "optionalDependencies": {
   "optionalDependencies": {
     "bufferutil": "^4.0.6",
     "bufferutil": "^4.0.6",

+ 22 - 0
src/controller/roomAssistantController.js

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

+ 8 - 5
src/controller/roomController.js

@@ -7,15 +7,22 @@ import { watchRoomService } from "../service/watchRoomService.js";
 import { setRoomConfig, getRoomConfig } from "../service/roomConfigService.js";
 import { setRoomConfig, getRoomConfig } from "../service/roomConfigService.js";
 import { getSig } from "../core/getSig.js";
 import { getSig } from "../core/getSig.js";
 import { isHoster, buildRoom, startCallAction, stopCallAction, joinRoomAction, leaveRoomAction, shotGunLeaveAction, disconnectAction } from "./roomActionController.js";
 import { isHoster, buildRoom, startCallAction, stopCallAction, joinRoomAction, leaveRoomAction, shotGunLeaveAction, disconnectAction } from "./roomActionController.js";
+import { RoomAssistantController } from './roomAssistantController.js'
 
 
 export async function roomController(socket) {
 export async function roomController(socket) {
   let user = socket.handshake.query;
   let user = socket.handshake.query;
+  // const roomAssistant = new RoomAssistantController(socket)
   const { roomId, userId, sceneNum, isClient, role, userLimitNum, sceneNumber, roomType, from, enableTalk } = user;
   const { roomId, userId, sceneNum, isClient, role, userLimitNum, sceneNumber, roomType, from, enableTalk } = user;
   if (user) {
   if (user) {
     const oneSceneNum = sceneNumber || sceneNum;
     const oneSceneNum = sceneNumber || sceneNum;
+    const syncId = `sync-${oneSceneNum}-${userId}`;
+    const roomSessionId  = `${oneSceneNum}-${userId}`;
+    console.log('roomSessionId', roomSessionId);
     const userUniqueId = `user-${userId}`;
     const userUniqueId = `user-${userId}`;
+    const uRoomId = await roomAssistant.prepearRoom(roomSessionId,roomId);
     const roomUniqueId = `room-${roomId}_${oneSceneNum}_web`;
     const roomUniqueId = `room-${roomId}_${oneSceneNum}_web`;
-    const syncId = `sync-${userId}-${roomId}`;
+    console.log('roomUniqueId',uRoomId)
+
     // const userLimitNum = userLimitNum || process.env.US
     // const userLimitNum = userLimitNum || process.env.US
     if ("roomId" in user && "userId" in user) {
     if ("roomId" in user && "userId" in user) {
       user.sig = getSig(userId);
       user.sig = getSig(userId);
@@ -24,12 +31,8 @@ export async function roomController(socket) {
       updateUser(userUniqueId, userObj);
       updateUser(userUniqueId, userObj);
       // await pubClient.hSet(userUniqueId, user);
       // await pubClient.hSet(userUniqueId, user);
       // await pubClient.expire(userUniqueId, 60 * 60 * 24);
       // await pubClient.expire(userUniqueId, 60 * 60 * 24);
-      // 房主自动创建房间
-
       if (isHoster(role)) {
       if (isHoster(role)) {
         if ([FROMTYPE.MiniAPP].includes(Number(from))) {
         if ([FROMTYPE.MiniAPP].includes(Number(from))) {
-          // logger.debug("房主自动创建房间 :", { roomId: roomUniqueId, userId: userUniqueId, user });
-          // buildRoom(roomUniqueId, userUniqueId, user);
           await setRoomConfig(roomUniqueId, {
           await setRoomConfig(roomUniqueId, {
             userLimitNum,
             userLimitNum,
             enableTalk: enableTalk === "true" ? true : false,
             enableTalk: enableTalk === "true" ? true : false,

+ 2 - 1
src/controller/syncActionController.js

@@ -17,7 +17,8 @@ export async function syncActionController(socket) {
   let user = socket.handshake.query;
   let user = socket.handshake.query;
   const { roomId, userId, sceneNum, sceneNumber, isClient, role, userLimitNum, roomType, from } = user;
   const { roomId, userId, sceneNum, sceneNumber, isClient, role, userLimitNum, roomType, from } = user;
   const oneSceneNum = sceneNumber || sceneNum;
   const oneSceneNum = sceneNumber || sceneNum;
-  const syncId = `sync-${userId}-${roomId}`;
+  // const syncId = `sync-${userId}-${roomId}`;
+  const syncId = `sync-${oneSceneNum}-${userId}`;
   const roomUniqueId = `room-${roomId}_${oneSceneNum}_web`;
   const roomUniqueId = `room-${roomId}_${oneSceneNum}_web`;
   const userUniqueId = `user-${userId}`;
   const userUniqueId = `user-${userId}`;
   if (user) {
   if (user) {

+ 12 - 0
src/core/io.js

@@ -6,7 +6,13 @@ import { createAdapter } from "@socket.io/redis-adapter";
 import { pubClient, subClient } from "../connection/redis.js";
 import { pubClient, subClient } from "../connection/redis.js";
 import { logger } from "./logger.js";
 import { logger } from "./logger.js";
 import customParser from "socket.io-msgpack-parser";
 import customParser from "socket.io-msgpack-parser";
+// import { PrometheusSocketIo }  from 'socket.io-prometheus-v3';
+
 console.log("process.env.SOCKET_PATH", process.env.SOCKET_PATH);
 console.log("process.env.SOCKET_PATH", process.env.SOCKET_PATH);
+
+// console.log('PrometheusSocketIo',PrometheusSocketIo)
+
+
 const httpServer = http.createServer();
 const httpServer = http.createServer();
 const io = new Server(httpServer, {
 const io = new Server(httpServer, {
   cors: {
   cors: {
@@ -27,6 +33,12 @@ instrument(io, {
   namespaceName: "/watch",
   namespaceName: "/watch",
 });
 });
 
 
+// const prometheus = PrometheusSocketIo.init({ 
+//   io, // io.Server
+//   collectDefaultMetrics: false // Collect some Node.js-specific metrics.
+// })
+// console.log('prometheus',prometheus)
+
 Promise.all([pubClient.connect(), subClient.connect()])
 Promise.all([pubClient.connect(), subClient.connect()])
   .then(() => {
   .then(() => {
     io.adapter(createAdapter(pubClient, subClient));
     io.adapter(createAdapter(pubClient, subClient));

+ 39 - 0
src/core/logger.js

@@ -1,4 +1,9 @@
 import { transports, createLogger, format } from "winston";
 import { transports, createLogger, format } from "winston";
+import { ElasticsearchTransport } from 'winston-elasticsearch';
+import APM from 'elastic-apm-node'
+import { Client } from '@elastic/elasticsearch'
+
+
 import cluster from "cluster";
 import cluster from "cluster";
 import path from "path";
 import path from "path";
 import { join, dirname } from "path";
 import { join, dirname } from "path";
@@ -17,6 +22,39 @@ const formatMeta = (meta) => {
 
 
 const customFormat = format.printf(({ timestamp, level, message, label = "", ...meta }) => `[${timestamp}] ${level} ${label} ${message} ${formatMeta(meta)}`);
 const customFormat = format.printf(({ timestamp, level, message, label = "", ...meta }) => `[${timestamp}] ${level} ${label} ${message} ${formatMeta(meta)}`);
 
 
+const apm = APM.start({
+  serverUrl: 'http://localhost:8200',
+  // Set the service environment
+  environment: 'production'
+  // NDNpS0lZQUJPcU1OdjVQSHhKeGY6N3ZuVWNIVWpTc0dRZ2pIa0tBckxOQQ==
+})
+
+// const client = new Client({
+//   node: 'http://localhost:9200',
+//   apiKey: 'SDNncElZQUJPcU1OdjVQSFRaY0I6MGpLUWg2TldSS0tTSjdRS0FfZGZGdw=='
+// })
+
+
+const esTransportOpts = {
+  level: 'info',
+  indexPrefix: 'logging-api',
+  indexSuffixPattern: 'YYYY-MM-DD',
+  clientOpts : {
+      node: 'http://localhost:9200',
+      maxRetries: 5,
+      requestTimeout: 10000,
+      sniffOnStart: false,
+      // apiKey: 'SDNncElZQUJPcU1OdjVQSFRaY0I6MGpLUWg2TldSS0tTSjdRS0FfZGZGdw=='
+      auth: {
+          username: 'elastic',
+          password: 'changeme'
+      }
+  },
+  source: 'socket-api'
+}
+const esTransport = new ElasticsearchTransport(esTransportOpts);
+
+
 const logger = createLogger({
 const logger = createLogger({
   level: "debug",
   level: "debug",
 
 
@@ -35,6 +73,7 @@ const logger = createLogger({
     new transports.File({
     new transports.File({
       filename: join(__dirname, "../../logs/combined.log"),
       filename: join(__dirname, "../../logs/combined.log"),
     }),
     }),
+    esTransport
   ],
   ],
 });
 });
 export { logger };
 export { logger };