gemercheung 3 年之前
父节点
当前提交
1e2b52d46f
共有 7 个文件被更改,包括 470 次插入17249 次删除
  1. 0 17069
      package-lock.json
  2. 9 6
      package.json
  3. 148 143
      src/get-router/get-router.service.ts
  4. 7 6
      src/move/move.service.ts
  5. 19 12
      src/scene/scene.service.ts
  6. 11 9
      src/scene/stream/stream.service.ts
  7. 276 4
      yarn.lock

文件差异内容过多而无法显示
+ 0 - 17069
package-lock.json


+ 9 - 6
package.json

@@ -7,12 +7,12 @@
   "license": "UNLICENSED",
   "scripts": {
     "prebuild": "rimraf dist",
-    "build": "nest build",
+    "build": "cross-env NODE_ENV=production nest build",
     "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"libs/**/*.ts\"",
-    "start": "nest start",
-    "start:dev": "nest start --watch",
-    "start:debug": "nest start --debug 0.0.0.0:9229 --watch",
-    "start:prod": "node dist/main",
+    "start": "cross-env NODE_ENV=development nest start",
+    "start:dev": "cross-env NODE_ENV=development nest start --watch",
+    "start:debug": "cross-env NODE_ENV=development nest start --debug 0.0.0.0:9229 --watch",
+    "start:prod": "cross-env NODE_ENV=production node dist/main",
     "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
     "test": "jest",
     "test:watch": "jest --watch",
@@ -37,6 +37,7 @@
     "bull": "^4.8.3",
     "js-yaml": "^4.1.0",
     "multistream": "^4.1.0",
+    "nest-winston": "^1.6.2",
     "nestjs-redis": "git+https://github.com/GyanendroKh/nestjs-redis.git#nest8-fix",
     "node-datachannel": "^0.3.2",
     "redis": "^4",
@@ -44,7 +45,8 @@
     "rimraf": "^3.0.2",
     "rx-queue": "^1.0.5",
     "rxjs": "^7.2.0",
-    "stream-buffers": "^3.0.2"
+    "stream-buffers": "^3.0.2",
+    "winston": "^3.7.2"
   },
   "devDependencies": {
     "@nestjs/cli": "^8.0.0",
@@ -58,6 +60,7 @@
     "@types/supertest": "^2.0.11",
     "@typescript-eslint/eslint-plugin": "^5.0.0",
     "@typescript-eslint/parser": "^5.0.0",
+    "cross-env": "^7.0.3",
     "eslint": "^8.0.1",
     "eslint-config-prettier": "^8.3.0",
     "eslint-plugin-prettier": "^4.0.0",

+ 148 - 143
src/get-router/get-router.service.ts

@@ -5,7 +5,7 @@ import { CacheService } from 'src/cache/cache.service';
 
 @Injectable()
 export class GetRouterService implements OnModuleInit {
-  constructor(private cacheService: CacheService) {}
+  constructor(private cacheService: CacheService) { }
   private breakPointInfo: any;
   private logger: Logger = new Logger('GetRouterService');
 
@@ -24,160 +24,165 @@ export class GetRouterService implements OnModuleInit {
   }
 
   searchRoad(appId, startPointId, clicking_point) {
-    console.log('进入2 - searchRoad');
-    //表示终点
-    let endPoint;
-    //const keys = this.cacheService.keys(`breakpoints:app_id:${appId}*`);
-    let minDis = null;
-    //for (let i = 0; i < keys.length; ++i) {
-    for (const key in this.breakPointInfo) {
-      //const breakPointRes = await this.cacheService.get(keys[i]);
-      //const breakPoint = JSON.parse(breakPointRes);
-      if (Number(key) == startPointId) {
-        continue;
-      }
-      //const position = breakPoint.position;
-      const breakPoint = this.breakPointInfo[key];
-      if (minDis == null) {
-        minDis = this.getDistance(clicking_point, breakPoint.position);
-        endPoint = breakPoint;
-        endPoint.breakPointId = Number(key);
-      } else if (
-        minDis > this.getDistance(clicking_point, breakPoint.position)
-      ) {
-        endPoint = breakPoint;
-        minDis = this.getDistance(clicking_point, breakPoint.position);
-        endPoint.breakPointId = Number(key);
+    try {
+      console.log('进入2 - searchRoad');
+      //表示终点
+      let endPoint;
+      //const keys = this.cacheService.keys(`breakpoints:app_id:${appId}*`);
+      let minDis = null;
+      //for (let i = 0; i < keys.length; ++i) {
+      for (const key in this.breakPointInfo) {
+        //const breakPointRes = await this.cacheService.get(keys[i]);
+        //const breakPoint = JSON.parse(breakPointRes);
+        if (Number(key) == startPointId) {
+          continue;
+        }
+        //const position = breakPoint.position;
+        const breakPoint = this.breakPointInfo[key];
+        if (minDis == null) {
+          minDis = this.getDistance(clicking_point, breakPoint.position);
+          endPoint = breakPoint;
+          endPoint.breakPointId = Number(key);
+        } else if (
+          minDis > this.getDistance(clicking_point, breakPoint.position)
+        ) {
+          endPoint = breakPoint;
+          minDis = this.getDistance(clicking_point, breakPoint.position);
+          endPoint.breakPointId = Number(key);
+        }
       }
-    }
-
-    if (minDis > 100) {
-      return null;
-    }
-
-    // const startPointRes = await this.cacheService.get(
-    //   'breakpoints:app_id:' + appId + ':break_point_id:' + startPointId,
-    // );
-    // const startPoint = JSON.parse(startPointRes);
-    const startPoint = this.breakPointInfo[startPointId];
-    if (startPoint.contact.indexOf(endPoint.breakPointId) > -1) {
-      // debugger;
-      return [startPointId, endPoint.breakPointId];
-    }
-    // const endPointRes = await this.cacheService.get(
-    //   'breakpoints:app_id:' + appId + ':break_point_id:' + endPointId,
-    // );
-    // const endPoint = JSON.parse(endPointRes);
-
-    const openList = [], //开启列表
-      closeList = []; //关闭列表
-    let result = []; //结果数组
-    let result_index: number; //结果数组在开启列表中的序号
 
-    //openList.push({x:startPoint.x,y:startPoint.y,G:0});//把当前点加入到开启列表中,并且G是0
-    openList.push({
-      breakPointId: startPointId,
-      G: 0,
-      position: startPoint.position,
-      contact: startPoint.contact,
-    }); //把当前点加入到开启列表中,并且G是0
-
-    do {
-      const currentPoint = openList.pop();
-      // const currentPointId = currentPointInfo.breakPointId;
-      // const currentPoint = {
-      //   breakPointId: currentPointInfo.breakPointId,
-      //   position: this.breakPointInfo[currentPointId].position,
-      //   contact:this.breakPointInfo[currentPointId].contact,
-      //   G: currentPointInfo.G,
-      // };
-      closeList.push(currentPoint);
-      if (closeList.length > 10000) {
-        console.log('错误过渡路径:', closeList.length);
+      if (minDis > 100) {
         return null;
       }
-      //读redis里的数据
-      // const breakPointRes = await this.cacheService.get(
-      //   'breakpoints:app_id:' +
-      //     appId +
-      //     ':break_point_id:' +
-      //     currentPointInfo.breakPointId,
+
+      // const startPointRes = await this.cacheService.get(
+      //   'breakpoints:app_id:' + appId + ':break_point_id:' + startPointId,
       // );
-      let surroundPoint = [];
-      //const _breakPoint = JSON.parse(breakPointRes);
-      const _breakPoint = this.breakPointInfo[currentPoint.breakPointId];
-      surroundPoint = _breakPoint.contact;
-      for (let i = 0; i < surroundPoint.length; ++i) {
-        const neighPointId = surroundPoint[i];
-        // const itemRes = await this.cacheService.get(
-        //   'breakpoints:app_id:' + appId + ':break_point_id:' + neighPointId,
-        // );
-        // const item = JSON.parse(itemRes);
-        const item = this.breakPointInfo[neighPointId];
-        if (this.existList(item, closeList) != -1) {
-          continue;
-        }
-        item.breakPointId = neighPointId;
-        //g 到父节点的位置
-        const g =
-          currentPoint.G +
-          this.getDistance(currentPoint.position, item.position);
-        if (this.existList(item, openList) == -1) {
-          //如果不在开启列表中
-          item['H'] = this.getDistance(endPoint.position, item.position);
-          item['G'] = g;
-          item['F'] = item.H + item.G;
-          item['parent'] = currentPoint;
-          openList.push(item);
-        } else {
-          //存在在开启列表中,比较目前的g值和之前的g的大小
-          const index = this.existList(item, openList);
-          //如果当前点的g更小
-          if (g < openList[index].G) {
-            openList[index].parent = currentPoint;
-            openList[index].G = g;
-            openList[index].F = g + openList[index].H;
-          }
-        }
-      }
-      //如果开启列表空了,没有通路,结果为空
-      if (openList.length == 0) {
-        break;
+      // const startPoint = JSON.parse(startPointRes);
+      const startPoint = this.breakPointInfo[startPointId];
+      if (startPoint.contact.indexOf(endPoint.breakPointId) > -1) {
+        // debugger;
+        return [startPointId, endPoint.breakPointId];
       }
+      // const endPointRes = await this.cacheService.get(
+      //   'breakpoints:app_id:' + appId + ':break_point_id:' + endPointId,
+      // );
+      // const endPoint = JSON.parse(endPointRes);
 
-      openList.sort(this.sortF); //这一步是为了循环回去的时候,找出 F 值最小的, 将它从 "开启列表" 中移掉
-    } while ((result_index = this.existList(endPoint, openList)) == -1);
+      const openList = [], //开启列表
+        closeList = []; //关闭列表
+      let result = []; //结果数组
+      let result_index: number; //结果数组在开启列表中的序号
+
+      //openList.push({x:startPoint.x,y:startPoint.y,G:0});//把当前点加入到开启列表中,并且G是0
+      openList.push({
+        breakPointId: startPointId,
+        G: 0,
+        position: startPoint.position,
+        contact: startPoint.contact,
+      }); //把当前点加入到开启列表中,并且G是0
 
-    //判断结果列表是否为空
-    let currentObj;
-    if (result_index == -1) {
-      result = [];
-    } else {
-      currentObj = openList[result_index];
       do {
-        //把路劲节点添加到result当中
-        result.unshift(currentObj.breakPointId);
-        currentObj = currentObj.parent;
-        if (!currentObj) {
+        const currentPoint = openList.pop();
+        // const currentPointId = currentPointInfo.breakPointId;
+        // const currentPoint = {
+        //   breakPointId: currentPointInfo.breakPointId,
+        //   position: this.breakPointInfo[currentPointId].position,
+        //   contact:this.breakPointInfo[currentPointId].contact,
+        //   G: currentPointInfo.G,
+        // };
+        closeList.push(currentPoint);
+        if (closeList.length > 10000) {
+          console.log('错误过渡路径:', closeList.length);
+          return null;
+        }
+        //读redis里的数据
+        // const breakPointRes = await this.cacheService.get(
+        //   'breakpoints:app_id:' +
+        //     appId +
+        //     ':break_point_id:' +
+        //     currentPointInfo.breakPointId,
+        // );
+        let surroundPoint = [];
+        //const _breakPoint = JSON.parse(breakPointRes);
+        const _breakPoint = this.breakPointInfo[currentPoint.breakPointId];
+        surroundPoint = _breakPoint.contact;
+        for (let i = 0; i < surroundPoint.length; ++i) {
+          const neighPointId = surroundPoint[i];
+          // const itemRes = await this.cacheService.get(
+          //   'breakpoints:app_id:' + appId + ':break_point_id:' + neighPointId,
+          // );
+          // const item = JSON.parse(itemRes);
+          const item = this.breakPointInfo[neighPointId];
+          if (this.existList(item, closeList) != -1) {
+            continue;
+          }
+          item.breakPointId = neighPointId;
+          //g 到父节点的位置
+          const g =
+            currentPoint.G +
+            this.getDistance(currentPoint.position, item.position);
+          if (this.existList(item, openList) == -1) {
+            //如果不在开启列表中
+            item['H'] = this.getDistance(endPoint.position, item.position);
+            item['G'] = g;
+            item['F'] = item.H + item.G;
+            item['parent'] = currentPoint;
+            openList.push(item);
+          } else {
+            //存在在开启列表中,比较目前的g值和之前的g的大小
+            const index = this.existList(item, openList);
+            //如果当前点的g更小
+            if (g < openList[index].G) {
+              openList[index].parent = currentPoint;
+              openList[index].G = g;
+              openList[index].F = g + openList[index].H;
+            }
+          }
+        }
+        //如果开启列表空了,没有通路,结果为空
+        if (openList.length == 0) {
           break;
         }
-      } while (
-        //currentObj.position.x != startPoint.position.x ||
-        //currentObj.position.y != startPoint.position.y
-        result.length < 50 &&
-        currentObj.contact.indexOf(startPointId) < 0
-      );
-    }
-    if (result.length > 30) {
-      console.log('错误过渡路径:' + result);
+
+        openList.sort(this.sortF); //这一步是为了循环回去的时候,找出 F 值最小的, 将它从 "开启列表" 中移掉
+      } while ((result_index = this.existList(endPoint, openList)) == -1);
+
+      //判断结果列表是否为空
+      let currentObj;
+      if (result_index == -1) {
+        result = [];
+      } else {
+        currentObj = openList[result_index];
+        do {
+          //把路劲节点添加到result当中
+          result.unshift(currentObj.breakPointId);
+          currentObj = currentObj.parent;
+          if (!currentObj) {
+            break;
+          }
+        } while (
+          //currentObj.position.x != startPoint.position.x ||
+          //currentObj.position.y != startPoint.position.y
+          result.length < 50 &&
+          currentObj.contact.indexOf(startPointId) < 0
+        );
+      }
+      if (result.length > 30) {
+        console.log('错误过渡路径:' + result);
+        // debugger;
+        return null;
+      }
+      result.unshift(currentObj.breakPointId);
+      result.unshift(startPointId);
+      console.log('path-end' + result);
       // debugger;
-      return null;
+      return result;
+    } catch (error) {
+      console.error('searchRoad', error);
+      return [];
     }
-    result.unshift(currentObj.breakPointId);
-    result.unshift(startPointId);
-    console.log('path-end' + result);
-    // debugger;
-    return result;
   }
 
   //用F值对数组排序
@@ -211,7 +216,7 @@ export class GetRouterService implements OnModuleInit {
   getDistance(position1, position2) {
     return Math.sqrt(
       (position1.x - position2.x) * (position1.x - position2.x) +
-        (position1.y - position2.y) * (position1.y - position2.y),
+      (position1.y - position2.y) * (position1.y - position2.y),
     );
   }
 }

+ 7 - 6
src/move/move.service.ts

@@ -35,7 +35,7 @@ export class MoveService implements OnModuleInit {
   constructor(
     private cacheService: CacheService,
     private rotateService: RotateService,
-  ) {}
+  ) { }
   private logger: Logger = new Logger('MoveService');
   private Actions = {
     Clicking: 1,
@@ -247,8 +247,8 @@ export class MoveService implements OnModuleInit {
       if (checkReplys.length > 0) {
         console.log(
           'move-1' +
-            checkReplys[checkReplys.length - 1].newUserStates[0].playerState
-              .camera.angle.yaw,
+          checkReplys[checkReplys.length - 1].newUserStates[0].playerState
+            .camera.angle.yaw,
         );
       }
       //过渡传到缓存里
@@ -574,8 +574,9 @@ export class MoveService implements OnModuleInit {
       const closestDis = 20; //小于这个距离就跳到邻居呼吸点
       const distance = step * dir_action.speed_level;
       let angle = null;
-      debugger;
-      const playerPosition = {};
+      // debugger;
+      //TODO 临时增加断言
+      const playerPosition: Point = { x: 0, y: 0, z: 0 };
       playerPosition.x =
         user.player.position.x + distance * Math.atan(dir_action.move_angle);
       playerPosition.y =
@@ -708,7 +709,7 @@ export class MoveService implements OnModuleInit {
   getDistance(position1, position2) {
     return Math.sqrt(
       (position1.x - position2.x) * (position1.x - position2.x) +
-        (position1.y - position2.y) * (position1.y - position2.y),
+      (position1.y - position2.y) * (position1.y - position2.y),
     );
   }
 }

+ 19 - 12
src/scene/scene.service.ts

@@ -3,7 +3,7 @@ import { ClientGrpc, Client } from '@nestjs/microservices';
 import { grpcClientOptions } from './grpc-scene.options';
 import { Logger } from '@nestjs/common';
 import { DataChannel } from 'node-datachannel';
-import { BehaviorSubject, EMPTY, ignoreElements, take } from 'rxjs';
+import { BehaviorSubject } from 'rxjs';
 // import * as streamBuffers from 'stream-buffers';
 import { ActionType } from './actionType';
 import { CacheService } from 'src/cache/cache.service';
@@ -615,12 +615,16 @@ export class SceneService implements OnModuleInit, OnModuleDestroy {
           serverTime: this.mockserverTime,
           DIR: stream.DIR,
         };
-        console.log(
-          '[media-move]',
-          this.moveframeCnt,
-          stream.clipPath,
-          stream.mType,
-          stream.DIR,
+        this.logger.log(
+          '[media-rotate]: ' +
+            ', moveframeCnt: ' +
+            this.rotateframeCnt +
+            ', clipPath: ' +
+            stream.clipPath +
+            ', mType: ' +
+            stream.mType +
+            ', DIR: ' +
+            stream.DIR,
           // stream.metaData,
         );
 
@@ -878,11 +882,14 @@ export class SceneService implements OnModuleInit, OnModuleDestroy {
           this.rotateframeCnt += 1;
 
           stream.frame = this.rotateframeCnt;
-          console.log(
-            '[media-rotate]',
-            stream.frame,
-            this.rotateframeCnt,
-            stream.clipPath,
+          this.logger.log(
+            '[media-rotate]: ' +
+              ', frame: ' +
+              stream.frame +
+              ', rotateframeCnt: ' +
+              this.rotateframeCnt +
+              ', clipPath: ' +
+              stream.clipPath,
             // stream.metaData,
           );
           // this.logger.log(

+ 11 - 9
src/scene/stream/stream.service.ts

@@ -19,7 +19,7 @@ export class StreamService {
     clipPath: '',
     metaData: '',
   });
-  constructor(private cacheService: CacheService) {}
+  constructor(private cacheService: CacheService) { }
 
   setChannel(channel: DataChannel) {
     this.channel = channel;
@@ -94,16 +94,18 @@ export class StreamService {
   pushFrameToSteam(stream: StreamFrameType): Promise<StreamPushResponse> {
     return new Promise((resolve, reject) => {
       try {
-        // console.log('process.env', process.env.node_env);
-        //TODO 开发替换path
         // let start, stop;
         const start = performance.now();
-
-        // const src = stream.clipPath.replace('/mnt/metaverse/scene', '');
-        // const srcTmp = join(__dirname, `../ws/${src}`);
-        // const clipPath = srcTmp;
-
-        const clipPath = stream.clipPath;
+        //TODO process.env 开发路径
+        let clipPath: string;
+        if (process.env.node_env === 'development') {
+          const src = stream.clipPath.replace('/mnt/metaverse/scene', '');
+          const srcTmp = join(__dirname, `../ws/${src}`);
+          clipPath = srcTmp;
+        } else {
+          clipPath = stream.clipPath;
+        }
+        // const clipPath = stream.clipPath;
         const metaData = stream.metaData || '{}';
         const frame = stream.frame;
         const serverTime = stream.serverTime || 754871824;

+ 276 - 4
yarn.lock

@@ -320,6 +320,11 @@
   resolved "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
   integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
 
+"@colors/colors@1.5.0":
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
+  integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
+
 "@cspotcode/source-map-consumer@0.8.0":
   version "0.8.0"
   resolved "https://registry.npmmirror.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz"
@@ -332,6 +337,15 @@
   dependencies:
     "@cspotcode/source-map-consumer" "0.8.0"
 
+"@dabh/diagnostics@^2.0.2":
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a"
+  integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==
+  dependencies:
+    colorspace "1.1.x"
+    enabled "2.0.x"
+    kuler "^2.0.0"
+
 "@eslint/eslintrc@^1.2.2":
   version "1.2.2"
   resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.2.2.tgz"
@@ -1611,6 +1625,11 @@ asap@^2.0.0:
   resolved "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz"
   integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
 
+async@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.npmmirror.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
+  integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==
+
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz"
@@ -1946,6 +1965,17 @@ cjs-module-lexer@^1.0.0:
   resolved "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz"
   integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
 
+cli-color@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/cli-color/-/cli-color-2.0.2.tgz#e295addbae470800def0254183c648531cdf4e3f"
+  integrity sha512-g4JYjrTW9MGtCziFNjkqp3IMpGhnJyeB0lOtRPjQkYhXzKYr6tYnXKyEVnMzITxhpbahsEW9KsxOYIDKwcsIBw==
+  dependencies:
+    d "^1.0.1"
+    es5-ext "^0.10.59"
+    es6-iterator "^2.0.3"
+    memoizee "^0.4.15"
+    timers-ext "^0.1.7"
+
 cli-cursor@^3.1.0:
   version "3.1.0"
   resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz"
@@ -2006,7 +2036,7 @@ collect-v8-coverage@^1.0.0:
   resolved "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz"
   integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
 
-color-convert@^1.9.0:
+color-convert@^1.9.0, color-convert@^1.9.3:
   version "1.9.3"
   resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz"
   integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@@ -2025,16 +2055,40 @@ color-name@1.1.3:
   resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz"
   integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
 
-color-name@~1.1.4:
+color-name@^1.0.0, color-name@~1.1.4:
   version "1.1.4"
   resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
 
+color-string@^1.6.0:
+  version "1.9.1"
+  resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
+  integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
+  dependencies:
+    color-name "^1.0.0"
+    simple-swizzle "^0.2.2"
+
+color@^3.1.3:
+  version "3.2.1"
+  resolved "https://registry.npmmirror.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164"
+  integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==
+  dependencies:
+    color-convert "^1.9.3"
+    color-string "^1.6.0"
+
 colors@1.4.0:
   version "1.4.0"
   resolved "https://registry.npmmirror.com/colors/-/colors-1.4.0.tgz"
   integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
 
+colorspace@1.1.x:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243"
+  integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==
+  dependencies:
+    color "^3.1.3"
+    text-hex "1.0.x"
+
 combined-stream@^1.0.8:
   version "1.0.8"
   resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz"
@@ -2152,7 +2206,14 @@ cron-parser@^4.2.1:
   dependencies:
     luxon "^1.28.0"
 
-cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-env@^7.0.3:
+  version "7.0.3"
+  resolved "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
+  integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
+  dependencies:
+    cross-spawn "^7.0.1"
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
   version "7.0.3"
   resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz"
   integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -2178,6 +2239,14 @@ cssstyle@^2.3.0:
   dependencies:
     cssom "~0.3.6"
 
+d@1, d@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+  dependencies:
+    es5-ext "^0.10.50"
+    type "^1.0.1"
+
 data-urls@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmmirror.com/data-urls/-/data-urls-2.0.0.tgz"
@@ -2367,6 +2436,11 @@ emoji-regex@^8.0.0:
   resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz"
   integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
 
+enabled@2.0.x:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
+  integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
+
 encodeurl@~1.0.2:
   version "1.0.2"
   resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz"
@@ -2422,6 +2496,42 @@ es-module-lexer@^0.9.0:
   resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz"
   integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
 
+es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.59, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
+  version "0.10.61"
+  resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269"
+  integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==
+  dependencies:
+    es6-iterator "^2.0.3"
+    es6-symbol "^3.1.3"
+    next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+  integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+  dependencies:
+    d "^1.0.1"
+    ext "^1.1.2"
+
+es6-weak-map@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
+  integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
+  dependencies:
+    d "1"
+    es5-ext "^0.10.46"
+    es6-iterator "^2.0.3"
+    es6-symbol "^3.1.1"
+
 escalade@^3.1.1:
   version "3.1.1"
   resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz"
@@ -2598,6 +2708,14 @@ etag@~1.8.1:
   resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz"
   integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
 
+event-emitter@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
 events@^3.2.0:
   version "3.3.0"
   resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz"
@@ -2689,6 +2807,13 @@ express@4.17.3:
     utils-merge "1.0.1"
     vary "~1.1.2"
 
+ext@^1.1.2:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
+  integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
+  dependencies:
+    type "^2.5.0"
+
 external-editor@^3.0.3:
   version "3.1.0"
   resolved "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz"
@@ -2753,6 +2878,11 @@ fb-watchman@^2.0.0:
   dependencies:
     bser "2.1.1"
 
+fecha@^4.2.0:
+  version "4.2.3"
+  resolved "https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
+  integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
+
 figures@^3.0.0:
   version "3.2.0"
   resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz"
@@ -2808,6 +2938,11 @@ flatted@^3.1.0:
   resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.5.tgz"
   integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
 
+fn.name@1.x.x:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc"
+  integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==
+
 follow-redirects@^1.10.0:
   version "1.15.0"
   resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4"
@@ -3266,6 +3401,11 @@ is-arrayish@^0.2.1:
   resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz"
   integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
 
+is-arrayish@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+  integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
 is-binary-path@~2.1.0:
   version "2.1.0"
   resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz"
@@ -3324,6 +3464,11 @@ is-potential-custom-element-name@^1.0.1:
   resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz"
   integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
 
+is-promise@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
+  integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+
 is-stream@^2.0.0:
   version "2.0.1"
   resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz"
@@ -3933,6 +4078,11 @@ kleur@^3.0.3:
   resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz"
   integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
 
+kuler@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
+  integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
+
 leven@^3.1.0:
   version "3.1.0"
   resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz"
@@ -4014,6 +4164,17 @@ log-symbols@^4.1.0:
     chalk "^4.1.0"
     is-unicode-supported "^0.1.0"
 
+logform@^2.3.2, logform@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.npmmirror.com/logform/-/logform-2.4.0.tgz#131651715a17d50f09c2a2c1a524ff1a4164bcfe"
+  integrity sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==
+  dependencies:
+    "@colors/colors" "1.5.0"
+    fecha "^4.2.0"
+    ms "^2.1.1"
+    safe-stable-stringify "^2.3.1"
+    triple-beam "^1.3.0"
+
 long@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmmirror.com/long/-/long-4.0.0.tgz"
@@ -4026,6 +4187,13 @@ lru-cache@^6.0.0:
   dependencies:
     yallist "^4.0.0"
 
+lru-queue@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
+  integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==
+  dependencies:
+    es5-ext "~0.10.2"
+
 luxon@^1.28.0:
   version "1.28.0"
   resolved "https://registry.npmmirror.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf"
@@ -4074,6 +4242,20 @@ memfs@^3.4.1:
   dependencies:
     fs-monkey "1.0.3"
 
+memoizee@^0.4.15:
+  version "0.4.15"
+  resolved "https://registry.npmmirror.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72"
+  integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==
+  dependencies:
+    d "^1.0.1"
+    es5-ext "^0.10.53"
+    es6-weak-map "^2.0.3"
+    event-emitter "^0.3.5"
+    is-promise "^2.2.2"
+    lru-queue "^0.1.0"
+    next-tick "^1.1.0"
+    timers-ext "^0.1.7"
+
 merge-descriptors@1.0.1:
   version "1.0.1"
   resolved "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz"
@@ -4168,7 +4350,7 @@ ms@2.1.2:
   resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
-ms@2.1.3:
+ms@2.1.3, ms@^2.1.1:
   version "2.1.3"
   resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
   integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -4241,6 +4423,14 @@ neo-async@^2.6.2:
   resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz"
   integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
 
+nest-winston@^1.6.2:
+  version "1.6.2"
+  resolved "https://registry.npmmirror.com/nest-winston/-/nest-winston-1.6.2.tgz#e4f24096b7e5cd9c8649b3d15203e576114d07e0"
+  integrity sha512-pM3o4zttpkKdnpNXyvMKKBD2u7OWROmVglyWZpH7O7QOLAegbMPvyqWgPNfvw2kkla+T/H4HFgGqcZGqiTzI5Q==
+  dependencies:
+    cli-color "^2.0.1"
+    fast-safe-stringify "^2.1.1"
+
 "nestjs-redis@git+https://github.com/GyanendroKh/nestjs-redis.git#nest8-fix":
   version "1.3.3"
   resolved "git+https://github.com/GyanendroKh/nestjs-redis.git#0b1f99ac8ec0c7f2ae64f8cd30b32b7ad324cfaf"
@@ -4254,6 +4444,11 @@ neo-async@^2.6.2:
     rxjs "^6"
     uuid "^8"
 
+next-tick@1, next-tick@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+  integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
 node-abi@^3.3.0:
   version "3.15.0"
   resolved "https://registry.npmmirror.com/node-abi/-/node-abi-3.15.0.tgz#cd9ac8c58328129b49998cc6fa16aa5506152716"
@@ -4370,6 +4565,13 @@ once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0:
   dependencies:
     wrappy "1"
 
+one-time@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45"
+  integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==
+  dependencies:
+    fn.name "1.x.x"
+
 onetime@^5.1.0, onetime@^5.1.2:
   version "5.1.2"
   resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz"
@@ -4940,6 +5142,11 @@ safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
+safe-stable-stringify@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73"
+  integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==
+
 "safer-buffer@>= 2.1.2 < 3":
   version "2.1.2"
   resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz"
@@ -5068,6 +5275,13 @@ simple-get@^4.0.0:
     once "^1.3.1"
     simple-concat "^1.0.0"
 
+simple-swizzle@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+  integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
+  dependencies:
+    is-arrayish "^0.3.1"
+
 sisteransi@^1.0.5:
   version "1.0.5"
   resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz"
@@ -5137,6 +5351,11 @@ sprintf-js@~1.0.2:
   resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz"
   integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
 
+stack-trace@0.0.x:
+  version "0.0.10"
+  resolved "https://registry.npmmirror.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+  integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==
+
 stack-utils@^2.0.3:
   version "2.0.5"
   resolved "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.5.tgz"
@@ -5386,6 +5605,11 @@ test-exclude@^6.0.0:
     glob "^7.1.4"
     minimatch "^3.0.4"
 
+text-hex@1.0.x:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
+  integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
+
 text-table@^0.2.0:
   version "0.2.0"
   resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz"
@@ -5401,6 +5625,14 @@ through@^2.3.6:
   resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz"
   integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
 
+timers-ext@^0.1.7:
+  version "0.1.7"
+  resolved "https://registry.npmmirror.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
+  integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
+  dependencies:
+    es5-ext "~0.10.46"
+    next-tick "1"
+
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz"
@@ -5456,6 +5688,11 @@ tree-kill@1.2.2:
   resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz"
   integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
 
+triple-beam@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
+  integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
+
 ts-jest@^27.0.3:
   version "27.1.4"
   resolved "https://registry.npmmirror.com/ts-jest/-/ts-jest-27.1.4.tgz"
@@ -5589,6 +5826,16 @@ type-is@^1.6.4, type-is@~1.6.18:
     media-typer "0.3.0"
     mime-types "~2.1.24"
 
+type@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+  integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.5.0:
+  version "2.6.0"
+  resolved "https://registry.npmmirror.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f"
+  integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
+
 typedarray-to-buffer@^3.1.5:
   version "3.1.5"
   resolved "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz"
@@ -5813,6 +6060,31 @@ windows-release@^4.0.0:
   dependencies:
     execa "^4.0.2"
 
+winston-transport@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa"
+  integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==
+  dependencies:
+    logform "^2.3.2"
+    readable-stream "^3.6.0"
+    triple-beam "^1.3.0"
+
+winston@^3.7.2:
+  version "3.7.2"
+  resolved "https://registry.npmmirror.com/winston/-/winston-3.7.2.tgz#95b4eeddbec902b3db1424932ac634f887c400b1"
+  integrity sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==
+  dependencies:
+    "@dabh/diagnostics" "^2.0.2"
+    async "^3.2.3"
+    is-stream "^2.0.0"
+    logform "^2.4.0"
+    one-time "^1.0.0"
+    readable-stream "^3.4.0"
+    safe-stable-stringify "^2.3.1"
+    stack-trace "0.0.x"
+    triple-beam "^1.3.0"
+    winston-transport "^4.5.0"
+
 word-wrap@^1.2.3, word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz"