From 4ed5d2af84f9169615a146797ccd6964cd86d8f4 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:25:17 +0000 Subject: [PATCH 01/19] meow --- data/config.json | 12 -------- data/servers.json | 74 ----------------------------------------------- 2 files changed, 86 deletions(-) delete mode 100644 data/config.json delete mode 100644 data/servers.json diff --git a/data/config.json b/data/config.json deleted file mode 100644 index f51dbb0..0000000 --- a/data/config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "websocket": { - "port": 3000 - }, - "scanner": { - "updateCron": "*/1 * * * *", - "timeout": 2000 - }, - "backup": { - "cron": "0 0 * * *" - } -} diff --git a/data/servers.json b/data/servers.json deleted file mode 100644 index a2e84c0..0000000 --- a/data/servers.json +++ /dev/null @@ -1,74 +0,0 @@ -[ - { - "name": "WildPrison", - "ip": "wildprison.net", - "type": "PC", - "id": 0 - }, - { - "name": "Hypixel", - "ip": "mc.hypixel.net", - "type": "PC", - "id": 1 - }, - { - "name": "CubeCraft", - "ip": "play.cubecraft.net", - "type": "PC", - "id": 2 - }, - { - "name": "Mineplex", - "ip": "mineplex.com", - "type": "PC", - "id": 3 - }, - { - "name": "2b2t", - "ip": "2b2t.org", - "type": "PC", - "id": 4 - }, - { - "name": "AkumaMC", - "ip": "akumamc.net", - "type": "PC", - "id": 5 - }, - { - "name": "Wynncraft", - "ip": "play.wynncraft.com", - "type": "PC", - "id": 6 - }, - { - "name": "Minehut", - "ip": "minehut.com", - "type": "PC", - "id": 7 - }, - { - "name": "Grand Theft Minecraft", - "ip": "gtm.network", - "type": "PC", - "id": 8 - }, - { - "name": "HiveMC", - "ip": "geo.hivebedrock.network", - "type": "PE", - "id": 9 - }, - { - "name": "Purple Prison", - "ip": "MCSL.PURPLE.WTF", - "type": "PC", - "id": 10 - }, - { - "name": "MinecraftOnline", - "ip": "minecraftonline.com", - "type": "PC", - "id": 11 - } -] -- 2.45.2 From e603f65fdc4bcc59a5cb6515b648fa81759004da Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:25:17 +0000 Subject: [PATCH 02/19] meow --- .dockerignore | 24 + .gitea/workflows/publish.yaml | 61 ++ .gitignore | 5 +- .vscode/launch.json | 11 + .vscode/tasks.json | 35 + Dockerfile | 9 + data/config.json-example | 15 + data/servers.json-example | 74 ++ docker-compose.yml | 7 + package.json | 9 +- pnpm-lock.yaml | 1336 +++++++++++++++++++++++++-------- src/database/database.ts | 158 ---- src/index.ts | 29 +- src/influx/influx.ts | 34 + src/scanner/scanner.ts | 39 +- src/server/server.ts | 47 +- src/server/serverManager.ts | 14 +- src/websocket/websocket.ts | 82 -- 18 files changed, 1350 insertions(+), 639 deletions(-) create mode 100644 .dockerignore create mode 100644 .gitea/workflows/publish.yaml create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 Dockerfile create mode 100644 data/config.json-example create mode 100644 data/servers.json-example create mode 100644 docker-compose.yml delete mode 100644 src/database/database.ts create mode 100644 src/influx/influx.ts delete mode 100644 src/websocket/websocket.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..809ba83 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,24 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/charts +**/docker-compose* +**/compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml new file mode 100644 index 0000000..38b9ff5 --- /dev/null +++ b/.gitea/workflows/publish.yaml @@ -0,0 +1,61 @@ +name: Publish Docker Image + +on: + push: + branches: + - "master" + +jobs: + docker: + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Restore Docker Cache + uses: actions/cache@v3 + id: docker-cache + with: + path: /usr/bin/docker + key: ${{ runner.os }}-docker + + - name: Install Docker (if not cached) + if: steps.docker-cache.outputs.cache-hit != 'true' + run: | + wget -q -O /tmp/docker.tgz https://download.docker.com/linux/static/stable/x86_64/docker-20.10.23.tgz \ + && tar --extract --file /tmp/docker.tgz --directory /usr/bin --strip-components 1 --no-same-owner docker/docker \ + && rm -rf /tmp/* && + echo "Done" + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Repo + uses: docker/login-action@v3 + with: + username: ${{ secrets.REPO_USERNAME }} + password: ${{ secrets.REPO_TOKEN }} + + - name: Restore Docker Build Cache + uses: actions/cache@v3 + id: build-cache + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx + + - name: Build and Push (Latest) + uses: docker/build-push-action@v + with: + push: true + context: . + tags: fascinated/mc-tracker-backend:influx + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache + + - name: Save Docker Build Cache + if: steps.build-cache.outputs.cache-hit != 'true' + run: | + mkdir -p /tmp/.buildx-cache + cp -r /tmp/.buildx-cache/. /tmp/.buildx-cache-new + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/.gitignore b/.gitignore index 13cb7d3..fcdc9ed 100644 --- a/.gitignore +++ b/.gitignore @@ -227,4 +227,7 @@ fabric.properties data/db.sqlite data/db.sqlite-shm data/db.sqlite-wal -data/database-backups \ No newline at end of file +data/database-backups + +data/config.json +data/servers.json \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2e71105 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "configurations": [ + { + "name": "Docker Node.js Launch", + "type": "docker", + "request": "launch", + "preLaunchTask": "docker-run: debug", + "platform": "node" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..ef433b1 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,35 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "docker-build", + "label": "docker-build", + "platform": "node", + "dockerBuild": { + "dockerfile": "${workspaceFolder}/Dockerfile", + "context": "${workspaceFolder}", + "pull": true + } + }, + { + "type": "docker-run", + "label": "docker-run: release", + "dependsOn": ["docker-build"], + "platform": "node" + }, + { + "type": "docker-run", + "label": "docker-run: debug", + "dependsOn": ["docker-build"], + "dockerRun": { + "env": { + "DEBUG": "*", + "NODE_ENV": "development" + } + }, + "node": { + "enableDebugging": true + } + } + ] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ff0bbd2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM node:lts-alpine +ENV NODE_ENV=production +WORKDIR /usr/src/app +COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] +RUN npm install --production --silent && mv node_modules ../ +COPY . . +RUN chown -R node /usr/src/app +USER node +CMD ["node", "index.js"] diff --git a/data/config.json-example b/data/config.json-example new file mode 100644 index 0000000..731d684 --- /dev/null +++ b/data/config.json-example @@ -0,0 +1,15 @@ +{ + "influx": { + "url": "http://localhost:8086", + "token": "my-token", + "org": "my-org", + "bucket": "my-bucket" + }, + "scanner": { + "updateCron": "*/1 * * * *", + "timeout": 2000 + }, + "backup": { + "cron": "0 0 * * *" + } +} diff --git a/data/servers.json-example b/data/servers.json-example new file mode 100644 index 0000000..a2e84c0 --- /dev/null +++ b/data/servers.json-example @@ -0,0 +1,74 @@ +[ + { + "name": "WildPrison", + "ip": "wildprison.net", + "type": "PC", + "id": 0 + }, + { + "name": "Hypixel", + "ip": "mc.hypixel.net", + "type": "PC", + "id": 1 + }, + { + "name": "CubeCraft", + "ip": "play.cubecraft.net", + "type": "PC", + "id": 2 + }, + { + "name": "Mineplex", + "ip": "mineplex.com", + "type": "PC", + "id": 3 + }, + { + "name": "2b2t", + "ip": "2b2t.org", + "type": "PC", + "id": 4 + }, + { + "name": "AkumaMC", + "ip": "akumamc.net", + "type": "PC", + "id": 5 + }, + { + "name": "Wynncraft", + "ip": "play.wynncraft.com", + "type": "PC", + "id": 6 + }, + { + "name": "Minehut", + "ip": "minehut.com", + "type": "PC", + "id": 7 + }, + { + "name": "Grand Theft Minecraft", + "ip": "gtm.network", + "type": "PC", + "id": 8 + }, + { + "name": "HiveMC", + "ip": "geo.hivebedrock.network", + "type": "PE", + "id": 9 + }, + { + "name": "Purple Prison", + "ip": "MCSL.PURPLE.WTF", + "type": "PC", + "id": 10 + }, + { + "name": "MinecraftOnline", + "ip": "minecraftonline.com", + "type": "PC", + "id": 11 + } +] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f112a4d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,7 @@ +version: "3.4" + +services: + backend: + image: fascinated/mc-tracker-backend:influx + environment: + NODE_ENV: production diff --git a/package.json b/package.json index 3d95480..c836f7f 100644 --- a/package.json +++ b/package.json @@ -4,22 +4,23 @@ "description": "", "main": "index.js", "scripts": { - "dev": "nodemon --exec ts-node src/index.ts" + "dev": "nodemon --exec ts-node src/index.ts", + "build": "tsup src/index.ts --format cjs,esm --dts", + "start": "node dist/index.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { - "@types/better-sqlite3": "^7.6.8", + "@influxdata/influxdb-client": "^1.33.2", "@types/mcping-js": "^1.5.4", "@types/node-cron": "^3.0.11", - "better-sqlite3": "^9.2.2", "dns": "^0.2.2", "mcpe-ping-fixed": "^0.0.3", "mcping-js": "^1.5.0", "node-cron": "^3.0.3", - "socket.io": "^4.7.2", "ts-node": "^10.9.2", + "tsup": "^8.0.1", "typescript": "^5.3.3", "winston": "^3.11.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c126ebf..d972bd4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,18 +5,15 @@ settings: excludeLinksFromLockfile: false dependencies: - '@types/better-sqlite3': - specifier: ^7.6.8 - version: 7.6.8 + '@influxdata/influxdb-client': + specifier: ^1.33.2 + version: 1.33.2 '@types/mcping-js': specifier: ^1.5.4 version: 1.5.4 '@types/node-cron': specifier: ^3.0.11 version: 3.0.11 - better-sqlite3: - specifier: ^9.2.2 - version: 9.2.2 dns: specifier: ^0.2.2 version: 0.2.2 @@ -29,12 +26,12 @@ dependencies: node-cron: specifier: ^3.0.3 version: 3.0.3 - socket.io: - specifier: ^4.7.2 - version: 4.7.2 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.10.6)(typescript@5.3.3) + tsup: + specifier: ^8.0.1 + version: 8.0.1(ts-node@10.9.2)(typescript@5.3.3) typescript: specifier: ^5.3.3 version: 5.3.3 @@ -69,11 +66,248 @@ packages: kuler: 2.0.0 dev: false + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@influxdata/influxdb-client@1.33.2: + resolution: {integrity: sha512-RT5SxH+grHAazo/YK3UTuWK/frPWRM0N7vkrCUyqVprDgQzlLP+bSK4ak2Jv3QVF/pazTnsxWjvtKZdwskV5Xw==} + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.9 + dev: false + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} dev: false + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: false + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: false @@ -85,10 +319,138 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 dev: false + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-android-arm-eabi@4.9.2: + resolution: {integrity: sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-android-arm64@4.9.2: + resolution: {integrity: sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-arm64@4.9.2: + resolution: {integrity: sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-x64@4.9.2: + resolution: {integrity: sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.2: + resolution: {integrity: sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.2: + resolution: {integrity: sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.2: + resolution: {integrity: sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.2: + resolution: {integrity: sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.2: + resolution: {integrity: sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.2: + resolution: {integrity: sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.2: + resolution: {integrity: sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.2: + resolution: {integrity: sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.2: + resolution: {integrity: sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: false @@ -105,22 +467,6 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: false - /@types/better-sqlite3@7.6.8: - resolution: {integrity: sha512-ASndM4rdGrzk7iXXqyNC4fbwt4UEjpK0i3j4q4FyeQrLAthfB6s7EF135ZJE0qQxtKIMFwmyT6x0switET7uIw==} - dependencies: - '@types/node': 20.10.6 - dev: false - - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: false - - /@types/cors@2.8.17: - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} - dependencies: - '@types/node': 20.10.6 - dev: false - /@types/mcping-js@1.5.4: resolution: {integrity: sha512-yfjoWeDNmJIELV8fdd9EBYydGulnFbBKGjF0qwakOfhsyYD88O3c6bfbFcO++0rgMcvDOjM2oyiYuu78xSkwdw==} dev: false @@ -146,14 +492,6 @@ packages: negotiator: 0.4.7 dev: false - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: false - /acorn-walk@8.3.1: resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} engines: {node: '>=0.4.0'} @@ -169,10 +507,49 @@ packages: resolution: {integrity: sha512-SuI3vWhCFeSmkmmJ3efyuOkrhGyp/AuHthh3F5DinGYh2kR9t/0xUlm3/Vn2qMScfgg+cKho5fW7TUEYUhYeiA==} dev: false + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: false + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + /arraybuffer.slice@0.0.6: resolution: {integrity: sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==} dev: false @@ -198,25 +575,20 @@ packages: resolution: {integrity: sha512-6P7/Ls5F6++DsKu7iacris7qq/AZSWaX+gT4dtSyUxM82ePxWxaP7Slo82ZO3ZTx6GSKxQHAQlmFvM8e+Dd8ZA==} dev: false + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + /base64-arraybuffer@0.1.2: resolution: {integrity: sha512-ewBKKVVPIl78B26mYQHYlaxR7NydMiD/GxwLNIwTAfLIE4xhN2Gxcy30//azq5UrejXjzGpWjcBu3NUJxzMMzg==} engines: {node: '>= 0.6.0'} dev: false - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - /base64id@0.1.0: resolution: {integrity: sha512-DSjtfjhAsHl9J4OJj7e4+toV2zqxJrGwVd3CLlsCp8QmicvOn7irG0Mb8brOc/nur3SdO8lIbNlY1s1ZDJdUKQ==} engines: {node: '>= 0.4.0'} dev: false - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: false - /basic-auth@1.0.0: resolution: {integrity: sha512-qzxS7/bW/LSiKZzdZw3isPjiVmzXbJLM3ImZZ62WMR3oJQAyqy094Nnb0TA2ZZm65xB7nu0acfTQ99z7wwCDCw==} dev: false @@ -227,12 +599,9 @@ packages: callsite: 1.0.0 dev: false - /better-sqlite3@9.2.2: - resolution: {integrity: sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} dev: false /binaryheap@0.0.3: @@ -240,20 +609,6 @@ packages: engines: {node: '>= 0.6.0'} dev: false - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - /blob@0.0.2: resolution: {integrity: sha512-BoCcDt8zBGShn6DawAGQw37s9SSs+fEjiZWDzyB+841PbOogcR2X7LGlM4sR3Zsiq/zoyl8MFWDfN6oDSlveBQ==} dev: false @@ -279,15 +634,21 @@ packages: hoek: 0.7.6 dev: false - /buffer-crc32@0.2.3: - resolution: {integrity: sha512-HLvoSqq1z8fJEcT1lUlJZ4OJaXJZ1wsWm0+fBxkz9Bdf/WphA4Da7FtGUguNNyEXL4WB0hNMTaWmdFRFPy8YOQ==} + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 dev: false - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + fill-range: 7.0.1 + dev: false + + /buffer-crc32@0.2.3: + resolution: {integrity: sha512-HLvoSqq1z8fJEcT1lUlJZ4OJaXJZ1wsWm0+fBxkz9Bdf/WphA4Da7FtGUguNNyEXL4WB0hNMTaWmdFRFPy8YOQ==} dev: false /buffercursor@0.0.12: @@ -302,6 +663,16 @@ packages: engines: {node: '>=0.8'} dev: false + /bundle-require@4.0.2(esbuild@0.19.11): + resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + dependencies: + esbuild: 0.19.11 + load-tsconfig: 0.2.5 + dev: false + /bytebuffer@4.1.0: resolution: {integrity: sha512-iUP8IfllRZiCGYACmcE7IxEfW+L1OKUEcHhXsrosqf51HnwR55THbePWeY3xAFxMlhhUa2I6x3cp5zG2vHI2YQ==} engines: {node: '>=0.8'} @@ -314,12 +685,28 @@ packages: resolution: {integrity: sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==} dev: false + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: false + /callsite@1.0.0: resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} dev: false - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 dev: false /color-convert@1.9.3: @@ -328,6 +715,13 @@ packages: color-name: 1.1.3 dev: false + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: false @@ -374,6 +768,11 @@ packages: engines: {node: '>= 0.4.x'} dev: false + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + /component-bind@1.0.0: resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} dev: false @@ -410,27 +809,23 @@ packages: resolution: {integrity: sha512-+mHmWbhevLwkiBf7QcbZXHr0v4ZQQ/OgHk3fsQHrsMMiGzuvAmU/YMUR+ZfrO/BLAGIWFfx2Z7Oyso0tZR/wiA==} dev: false - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: false - /core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: false - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - dev: false - /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: false + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + /cryptiles@0.1.3: resolution: {integrity: sha512-YI0PphzKlfxoNvaUPpkf8x+TUssMJimL1pPIEgj+8WSx0PQtfesYms/dua8Rn+KZWqoCL4AxcxHZJS9nd/oLPw==} engines: {node: 0.8.x} @@ -496,18 +891,6 @@ packages: ms: 2.1.2 dev: false - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: false - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: false - /defaultable@0.7.2: resolution: {integrity: sha512-UEaHGfefWfbnANtSlCtuAelo7HZhCbdLAQAttRDVJpQplbA1G21t/J70VGznRA4z9py2k70tTW+3ogGs5VgrcQ==} engines: {'0': node} @@ -528,16 +911,18 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: false + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + /dns@0.2.2: resolution: {integrity: sha512-dhCgBk0QglzySl2BVlIkRuk7aTqxlCe+5KhHEX5ULuco7RcB6d1zDnP5iGSs2rLdJaTc+82MxegtJtjFuueWiQ==} engines: {node: '>= 0.10.0 < 0.11.0'} @@ -555,18 +940,24 @@ packages: - utf-8-validate dev: false + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + /ee-first@1.0.3: resolution: {integrity: sha512-1q/3kz+ZwmrrWpJcCCrBZ3JnBzB1BMA5EVW9nxnIP1LxDZ16Cqs9VdolqLWlExet1vU+bar3WSkAa4/YrA9bIw==} dev: false - /enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} dev: false /engine.io-client@1.3.1: @@ -599,11 +990,6 @@ packages: utf8: 2.0.0 dev: false - /engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} - engines: {node: '>=10.0.0'} - dev: false - /engine.io@1.3.1: resolution: {integrity: sha512-fjnHWC9SLPoygMp6pqwoxmNkDDdYme4eCRTBTZLmEtGZETCpUEgSwoQjSgyj7IyIjqninKRF+2VeEV2kOniUFQ==} dependencies: @@ -617,26 +1003,6 @@ packages: - utf-8-validate dev: false - /engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} - engines: {node: '>=10.2.0'} - dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.17 - '@types/node': 20.10.6 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.4.2 - cors: 2.8.5 - debug: 4.3.4 - engine.io-parser: 5.2.1 - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /errorhandler@1.1.1: resolution: {integrity: sha512-nqVAii3wDkiowAVKDmcuwKOQ/5vsg9GfCcJxSMHgy8yiZUA3mMDpBcHnCVolDYgQ7wsC2yZQVOavR5fGHhFMkg==} engines: {node: '>= 0.8'} @@ -645,13 +1011,54 @@ packages: escape-html: 1.0.1 dev: false + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + dev: false + /escape-html@1.0.1: resolution: {integrity: sha512-z6kAnok8fqVTra7Yu77dZF2Y6ETJlxH58wN38wNyuNQLm8xXdKnfNrlSmfXsTePWP03rRVUKHubtUwanwUi7+g==} dev: false - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 dev: false /express@4.6.1: @@ -694,12 +1101,32 @@ packages: engines: {node: '> 0.1.90'} dev: false + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + dev: false + /fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} dev: false - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 dev: false /finalhandler@0.0.2: @@ -732,6 +1159,14 @@ packages: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} dev: false + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + /forever-agent@0.2.0: resolution: {integrity: sha512-IasWSRIlfPnBZY1K9jEUK3PwsScR4mrcK+aNBJzGoPnW+S9b6f8I8ScyH4cehEOFNqnjGpP2gCaA22gqSV1xQA==} dev: false @@ -749,12 +1184,48 @@ packages: resolution: {integrity: sha512-ZGGi8GROK//ijm2gB33sUuN9TjN1tC/dvG4Bt4j6IWrVGpMmudUBCxx+Ir7qePsdREfkpQC4FL8W0jeSOsgv1w==} dev: false - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} dev: false - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: false + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 dev: false /has-binary-data@0.1.1: @@ -794,13 +1265,19 @@ packages: deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). dev: false + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + /iconv-lite@0.4.4: resolution: {integrity: sha512-BnjNp13aZpK4WBGbmjaNHN2MCp3P850n8zd/JLinQJ8Lsnq2Br4o2467C2waMsY5kr7Z41SL1gEqh8Vbfzg15A==} engines: {node: '>=0.8.0'} dev: false - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} dev: false /indexof@0.0.1: @@ -811,10 +1288,6 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false - /ipaddr.js@0.1.2: resolution: {integrity: sha512-MGrEjHz4Hk5UVpJXZQ2tHB+bp6xgdRKCAEWdrgFsoAmXCgKAPtj8LqMxgvlWEAj9aN+PpTcvE051uZU3K3kLSQ==} engines: {node: '>= 0.2.5'} @@ -829,6 +1302,35 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -838,6 +1340,24 @@ packages: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: false + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: false + /json-stringify-safe@3.0.0: resolution: {integrity: sha512-VSSuxEAawKLYlCabQOR7YDijQ69zPqQBOriUuCgNhlAqtU7RPr41gPpaSs6WkEu+ZOtUequpXWbI51CS+Z/gMQ==} dev: false @@ -851,6 +1371,24 @@ packages: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} dev: false + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: false + /logform@2.6.0: resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} engines: {node: '>= 12.0.0'} @@ -868,11 +1406,9 @@ packages: engines: {node: '>=0.6'} dev: false - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} dev: false /make-error@1.3.6: @@ -899,13 +1435,25 @@ packages: resolution: {integrity: sha512-dYBT4Ep+t/qnPeJcnMymmhTdd4g8/hn48ciaDqLAkfRf8abzLPS6Rb6EBdz5CZCL8tzZuI5ps9MhGQGxk+EuKg==} dev: false + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + /methods@1.1.0: resolution: {integrity: sha512-Th88HxNePtsAmz0WjEhVVyRGv9AQFLv4z6zOj4Dt15PjsKLWB8JXSmxzP+Q27139+AXao0AlCWvonFuJhu4GuA==} dev: false - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 dev: false /mime-types@1.0.2: @@ -913,28 +1461,29 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - /mime@1.2.11: resolution: {integrity: sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==} dev: false - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 dev: false /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: false - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} dev: false /mkdirp@0.5.6: @@ -966,12 +1515,16 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false - /nan@0.3.2: - resolution: {integrity: sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==} + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 dev: false - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + /nan@0.3.2: + resolution: {integrity: sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==} dev: false /native-dns-cache@0.0.2: @@ -1003,18 +1556,6 @@ packages: resolution: {integrity: sha512-ujxWwyRfZ6udAgHGECQC3JDO9e6UAsuItfUMcqA0Xf2OLNQTveFVFx+fHGIJ5p0MJaJrZyGQqPwzuN0NxJzEKA==} dev: false - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: false - - /node-abi@3.52.0: - resolution: {integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: false - /node-cron@3.0.3: resolution: {integrity: sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==} engines: {node: '>=6.0.0'} @@ -1033,6 +1574,18 @@ packages: hasBin: true dev: false + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + /oauth-sign@0.2.0: resolution: {integrity: sha512-4DtiD64CwPJ5vZ636j/KtM7DxWbX1KlkqwbqbEAxI3BCpBrQdrKOv8vC/36U6gfm1CVapy6QmcVxPnXPPQApTA==} dev: false @@ -1046,18 +1599,19 @@ packages: resolution: {integrity: sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==} dev: false - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: false - /one-time@1.0.0: resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} dependencies: fn.name: 1.1.0 dev: false + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + /optimist@0.3.7: resolution: {integrity: sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==} dependencies: @@ -1091,10 +1645,38 @@ packages: resolution: {integrity: sha512-7y9IL/9x2suvr1uIvoAc3yv3f28hZ55g2OM+ybEtnZqV6Ykeg36sy1PCsTN9rQUZYzb9lTKLzzmJM11jaXSloA==} dev: false + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: false + /path-to-regexp@0.1.3: resolution: {integrity: sha512-sd4vSOW+DCM6A5aRICI1CWaC7nufnzVpZfuh5T0VXshxxzFWuaFcvqKovAFLNGReOc+uZRptpcpPmn7CDvzLuA==} dev: false + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: false + /pkginfo@0.3.1: resolution: {integrity: sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==} engines: {node: '>= 0.4.0'} @@ -1108,23 +1690,21 @@ packages: mkdirp: 0.5.6 dev: false - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true + /postcss-load-config@4.0.2(ts-node@10.9.2): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.52.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 + lilconfig: 3.0.0 + ts-node: 10.9.2(@types/node@20.10.6)(typescript@5.3.3) + yaml: 2.3.4 dev: false /proxy-addr@1.0.1: @@ -1134,11 +1714,9 @@ packages: ipaddr.js: 0.1.2 dev: false - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} dev: false /qs@0.5.6: @@ -1149,6 +1727,10 @@ packages: resolution: {integrity: sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==} dev: false + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + /range-parser@1.0.0: resolution: {integrity: sha512-wOH5LIH2ZHo0P7/bwkR+aNbJ+kv3CHVX4B8qs9GqbtY29fi1bGPV5xczrutN20G+Z4XhRqRMTW3q0S4iyJJPfw==} dev: false @@ -1161,16 +1743,6 @@ packages: iconv-lite: 0.4.4 dev: false - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1180,6 +1752,13 @@ packages: util-deprecate: 1.0.2 dev: false + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + /request@2.16.6: resolution: {integrity: sha512-TfD4kMo40kwuOpO7GYfAZpb2wYdw7yvTIglPNgPPSmp2Fz6MKNvPLla40FQ/ypdhy6B2jRNz3VlCjPD6mnzsmA==} engines: {'0': node >= 0.8.0} @@ -1198,6 +1777,43 @@ packages: tunnel-agent: 0.2.0 dev: false + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rollup@4.9.2: + resolution: {integrity: sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.2 + '@rollup/rollup-android-arm64': 4.9.2 + '@rollup/rollup-darwin-arm64': 4.9.2 + '@rollup/rollup-darwin-x64': 4.9.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.2 + '@rollup/rollup-linux-arm64-gnu': 4.9.2 + '@rollup/rollup-linux-arm64-musl': 4.9.2 + '@rollup/rollup-linux-riscv64-gnu': 4.9.2 + '@rollup/rollup-linux-x64-gnu': 4.9.2 + '@rollup/rollup-linux-x64-musl': 4.9.2 + '@rollup/rollup-win32-arm64-msvc': 4.9.2 + '@rollup/rollup-win32-ia32-msvc': 4.9.2 + '@rollup/rollup-win32-x64-msvc': 4.9.2 + fsevents: 2.3.3 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false @@ -1207,14 +1823,6 @@ packages: engines: {node: '>=10'} dev: false - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - /send@0.6.0: resolution: {integrity: sha512-A3EwHmDwcPcmLxIRNjr2YbXiYWq6M9JyUq4303pLKVFs4m5oeME0a9Cpcu9N22fED5XVepldjPYGo9eJifb7Yg==} engines: {node: '>= 0.8.0'} @@ -1242,16 +1850,25 @@ packages: - supports-color dev: false - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 dev: false - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} dev: false /simple-swizzle@0.2.2: @@ -1260,6 +1877,11 @@ packages: is-arrayish: 0.3.2 dev: false + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + /sntp@0.1.4: resolution: {integrity: sha512-v90tkW8VIdXwY35BJAWIpZWd/h+WC7TufizgUO2jtOY21isIo8IP85f1zJ8mKF8o77Vxo5k+GJmUZ4H6phVt1g==} engines: {node: 0.8.x} @@ -1277,15 +1899,6 @@ packages: - supports-color dev: false - /socket.io-adapter@2.5.2: - resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} - dependencies: - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - /socket.io-client@1.0.6: resolution: {integrity: sha512-itdtz6fQBTFIDBP4+hJox0OlT+SbCVdENjPgjMup3ehu7OsiG6t0FYBXCx+k/upt9lbeyp9BmUNNi5EfnGa5Vw==} dependencies: @@ -1327,16 +1940,6 @@ packages: - supports-color dev: false - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - /socket.io@1.0.6: resolution: {integrity: sha512-1x7TkMh8aKfLoXuXe5rXnDnv3xfcOFrDM6hR9z15dpZ83tTxt2NUxnpuGL2zMIAJQ4DitKiadEBvBVju5cxcHw==} dependencies: @@ -1352,62 +1955,91 @@ packages: - utf-8-validate dev: false - /socket.io@4.7.2: - resolution: {integrity: sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==} - engines: {node: '>=10.2.0'} + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.5 - debug: 4.3.4 - engine.io: 6.5.4 - socket.io-adapter: 2.5.2 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + whatwg-url: 7.1.0 dev: false /stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} dev: false + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: false - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: false - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 + ansi-regex: 5.0.1 dev: false - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 dev: false /text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} dev: false + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + /tinycolor@0.0.1: resolution: {integrity: sha512-+CorETse1kl98xg0WAzii8DTT4ABF4R3nquhrkIbVGcw1T8JYs5Gfx9xEfGINPUZGDj9C4BmOtuKeaTtuuRolg==} engines: {node: '>=0.4.0'} @@ -1417,6 +2049,13 @@ packages: resolution: {integrity: sha512-JQk/QMS4oHyU2VufVeyjN25dcnZnr1PV1pa1oKSj7l5tVO9WrU62og3fYzB3mrgJZZgBxdrrA/v6iZzMDuyFYw==} dev: false + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + /tomahawk-plugin-kv-memory-store@0.0.3: resolution: {integrity: sha512-opt82r6s+775jmrREiWruMVTQaGQYgPd6/zYTDRwwHhDGSqpFaZZgCSnI/BAIs8nC88puTK4PyodkSRpUDp/2Q==} dev: false @@ -1440,11 +2079,26 @@ packages: - utf-8-validate dev: false + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: false + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: false + /triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} dev: false + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + /ts-node@10.9.2(@types/node@20.10.6)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -1476,14 +2130,47 @@ packages: yn: 3.1.1 dev: false - /tunnel-agent@0.2.0: - resolution: {integrity: sha512-PXy4q1PH88BK0pcGOEMXFAslyBuRWz1wxLfPXTlYFd41eyUgjOALaVGbWJN1ymjbnBzjWunVSKmrrMMh8oLaZA==} + /tsup@8.0.1(ts-node@10.9.2)(typescript@5.3.3): + resolution: {integrity: sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 4.0.2(esbuild@0.19.11) + cac: 6.7.14 + chokidar: 3.5.3 + debug: 4.3.4 + esbuild: 0.19.11 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2(ts-node@10.9.2) + resolve-from: 5.0.0 + rollup: 4.9.2 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + - ts-node dev: false - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 + /tunnel-agent@0.2.0: + resolution: {integrity: sha512-PXy4q1PH88BK0pcGOEMXFAslyBuRWz1wxLfPXTlYFd41eyUgjOALaVGbWJN1ymjbnBzjWunVSKmrrMMh8oLaZA==} dev: false /type-is@1.3.2: @@ -1530,11 +2217,6 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: false - /verror@1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} @@ -1544,6 +2226,26 @@ packages: extsprintf: 1.4.1 dev: false + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: false + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + /winston-transport@4.6.0: resolution: {integrity: sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==} engines: {node: '>= 12.0.0'} @@ -1588,8 +2290,22 @@ packages: engines: {node: '>=0.4.0'} dev: false - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 dev: false /ws@0.4.31: @@ -1612,21 +2328,9 @@ packages: tinycolor: 0.0.1 dev: false - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} dev: false /yn@3.1.1: diff --git a/src/database/database.ts b/src/database/database.ts deleted file mode 100644 index b332af5..0000000 --- a/src/database/database.ts +++ /dev/null @@ -1,158 +0,0 @@ -import SQLiteDatabase from "better-sqlite3"; -import cron from "node-cron"; -import Server from "../server/server"; -import { logger } from "../utils/logger"; -import { getFormattedDate } from "../utils/timeUtils"; - -import Config from "../../data/config.json"; -import { Ping } from "../types/ping"; -import { createDirectory } from "../utils/fsUtils"; - -const DATA_DIR = "data"; -const BACKUP_DIR = `${DATA_DIR}/database-backups`; - -const PINGS_TABLE = "pings"; -const RECORD_TABLE = "record"; - -/** - * SQL Queries - */ -const CREATE_PINGS_TABLE = ` - CREATE TABLE IF NOT EXISTS pings ( - id INTEGER NOT NULL, - timestamp BIGINT NOT NULL, - ip TINYTEXT NOT NULL, - playerCount MEDIUMINT NOT NULL - ); -`; -const CREATE_RECORD_TABLE = ` - CREATE TABLE IF NOT EXISTS record ( - id INTEGER PRIMARY KEY, - timestamp BIGINT NOT NULL, - ip TINYTEXT NOT NULL, - playerCount MEDIUMINT NOT NULL - ); -`; - -const CREATE_PINGS_INDEX = `CREATE INDEX IF NOT EXISTS ip_index ON pings (id, ip, playerCount)`; -const CREATE_TIMESTAMP_INDEX = `CREATE INDEX IF NOT EXISTS timestamp_index on PINGS (id, timestamp)`; - -const INSERT_PING = ` - INSERT INTO ${PINGS_TABLE} (id, timestamp, ip, playerCount) - VALUES (?, ?, ?, ?) -`; -const INSERT_RECORD = ` - INSERT INTO ${RECORD_TABLE} (id, timestamp, ip, playerCount) - VALUES (?, ?, ?, ?) - ON CONFLICT(id) DO UPDATE SET - timestamp = excluded.timestamp, - playerCount = excluded.playerCount, - ip = excluded.ip -`; - -const SELECT_PINGS = ` - SELECT * FROM ${PINGS_TABLE} WHERE id = ? AND timestamp >= ? AND timestamp <= ? -`; -const SELECT_RECORD = ` - SELECT playerCount, timestamp FROM ${RECORD_TABLE} WHERE {} = ? -`; -const SELECT_RECORD_BY_ID = SELECT_RECORD.replace("{}", "id"); -const SELECT_RECORD_BY_IP = SELECT_RECORD.replace("{}", "ip"); - -export default class Database { - private db: SQLiteDatabase.Database; - - constructor() { - this.db = new SQLiteDatabase(`${DATA_DIR}/db.sqlite`); - this.db.pragma("journal_mode = WAL"); // Enable WAL mode for better performance - - logger.info("Ensuring tables exist"); - this.db.exec(CREATE_PINGS_TABLE); // Ensure the pings table exists - this.db.exec(CREATE_RECORD_TABLE); // Ensure the record table exists - - logger.info("Ensuring indexes exist"); - this.db.exec(CREATE_PINGS_INDEX); // Ensure the pings index exists - this.db.exec(CREATE_TIMESTAMP_INDEX); // Ensure the timestamp index exists - - cron.schedule(Config.backup.cron, () => { - this.createBackup(); - }); - } - - /** - * Gets the pings for a server. - * - * @param id the server ID - * @param startTime the start time - * @param endTime the end time - * @returns the pings for the server - */ - public getPings(id: number, startTime: number, endTime: number): Ping[] | [] { - return this.db.prepare(SELECT_PINGS).all(id, startTime, endTime) as - | Ping[] - | []; - } - - /** - * Gets the record player count for a server. - * - * @param value the server ID or IP - * @returns the record for the server - */ - public getRecord(value: any): Ping | undefined { - if (typeof value === "number") { - return this.db.prepare(SELECT_RECORD_BY_ID).get(value) as - | Ping - | undefined; - } - return this.db.prepare(SELECT_RECORD_BY_IP).get(value) as Ping | undefined; - } - - /** - * Creates a full backup of the database. - */ - public async createBackup() { - logger.info("Creating database backup"); - createDirectory(BACKUP_DIR); - await this.db.backup(`${BACKUP_DIR}/${getFormattedDate()}.sqlite`); - logger.info("Finished creating database backup"); - } - - /** - * Inserts a ping into the database. - * - * @param timestamp the timestamp of the ping - * @param ip the IP address of the server - * @param playerCount the number of players online - */ - public insertPing(server: Server, response: Ping) { - const { timestamp, playerCount } = response; - const id = server.getID(); - const ip = server.getIP(); - - const statement = this.db.prepare(INSERT_PING); - statement.run(id, timestamp, ip, playerCount); // Insert the ping into the database - } - - /** - * Inserts a record into the database. - * - * @param server the server to insert - * @param response the response to insert - * @returns true if the a new record was set, false otherwise - */ - public insertRecord(server: Server, response: Ping): boolean { - const { timestamp, playerCount } = response; - const id = server.getID(); - const ip = server.getIP(); - - const oldRecord = this.getRecord(id); - if (oldRecord && oldRecord.playerCount >= playerCount) { - return false; // Don't update the record if the player count is lower - } - - const statement = this.db.prepare(INSERT_RECORD); - statement.run(id, timestamp, ip, playerCount); // Insert the record into the database - return true; - } -} diff --git a/src/index.ts b/src/index.ts index bbc0d31..d41efae 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,14 +1,6 @@ -import Database from "./database/database"; +import Influx from "./influx/influx"; import Scanner from "./scanner/scanner"; import ServerManager from "./server/serverManager"; -import WebsocketServer from "./websocket/websocket"; - -import Config from "../data/config.json"; - -/** - * The database instance. - */ -export const database = new Database(); /** * The server manager instance. @@ -16,9 +8,9 @@ export const database = new Database(); export const serverManager = new ServerManager(); /** - * The websocket server instance. + * The influx database instance. */ -export const websocketServer = new WebsocketServer(Config.websocket.port); +export const influx = new Influx(); (async () => { await serverManager.init(); @@ -26,18 +18,3 @@ export const websocketServer = new WebsocketServer(Config.websocket.port); // The scanner is responsible for scanning all servers new Scanner(); })(); - -// The websocket server is responsible for -// sending data to the client in real time - -// serverManager.getServers().forEach((server) => { -// const record = database.getRecord(server.getID()); -// if (!record) { -// return; -// } -// console.log( -// `Record for "${server.getName()}": ${record.playerCount} (${formatTimestamp( -// record.timestamp -// )})` -// ); -// }); diff --git a/src/influx/influx.ts b/src/influx/influx.ts new file mode 100644 index 0000000..5f52f13 --- /dev/null +++ b/src/influx/influx.ts @@ -0,0 +1,34 @@ +import { InfluxDB, Point, WriteApi } from "@influxdata/influxdb-client"; + +import Config from "../../data/config.json"; +import { logger } from "../utils/logger"; + +export default class Influx { + private influx: InfluxDB; + private writeApi: WriteApi; + + constructor() { + logger.info("Loading influx database"); + + this.influx = new InfluxDB({ + url: Config.influx.url, + token: Config.influx.token, + }); + logger.info("InfluxDB initialized"); + + this.writeApi = this.influx.getWriteApi( + Config.influx.org, + Config.influx.bucket, + "ms" + ); + } + + /** + * Write a point to the database. + * + * @param point the point to write + */ + public async writePoint(point: Point): Promise { + this.writeApi.writePoint(point); + } +} diff --git a/src/scanner/scanner.ts b/src/scanner/scanner.ts index 9464f93..be58901 100644 --- a/src/scanner/scanner.ts +++ b/src/scanner/scanner.ts @@ -1,7 +1,6 @@ import cron from "node-cron"; -import { database, serverManager, websocketServer } from ".."; -import Server, { ServerStatus } from "../server/server"; +import { serverManager } from ".."; import Config from "../../data/config.json"; import { logger } from "../utils/logger"; @@ -22,43 +21,9 @@ export default class Scanner { // ping all servers in parallel await Promise.all( - serverManager.getServers().map((server) => this.scanServer(server)) + serverManager.getServers().map((server) => server.pingServer()) ); logger.info("Finished scanning servers"); } - - /** - * Scans a server and inserts the ping into the database. - * - * @param server the server to scan - * @returns a promise that resolves when the server has been scanned - */ - async scanServer(server: Server): Promise { - //logger.info(`Scanning server ${server.getIP()} - ${server.getType()}`); - let response; - let online = false; - - try { - response = await server.pingServer(); - if (response == undefined) { - return; // Server is offline - } - online = true; - } catch (err) { - logger.info(`Failed to ping ${server.getIP()}`, err); - websocketServer.sendServerError(server, ServerStatus.OFFLINE); - return; - } - - if (!online || !response) { - return; // Server is offline - } - - database.insertPing(server, response); - const isNewRecord = database.insertRecord(server, response); - - // todo: send all server pings at once - websocketServer.sendNewPing(server, response, isNewRecord); - } } diff --git a/src/server/server.ts b/src/server/server.ts index b4ff802..ca06e22 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -2,8 +2,11 @@ import javaPing from "mcping-js"; import { ResolvedServer, resolveDns } from "../utils/dnsResolver"; const bedrockPing = require("mcpe-ping-fixed"); // Doesn't have typescript definitions +import { Point } from "@influxdata/influxdb-client"; +import { influx } from ".."; import Config from "../../data/config.json"; import { Ping } from "../types/ping"; +import { logger } from "../utils/logger"; /** * The type of server. @@ -79,23 +82,43 @@ export default class Server { /** * Pings a server and gets the response. * - * @param server the server to ping - * @param insertPing whether to insert the ping into the database * @returns the ping response or undefined if the server is offline */ - public pingServer(): Promise { - switch (this.getType()) { - case "PC": { - return this.pingPCServer(); + public async pingServer(): Promise { + try { + let response; + + switch (this.getType()) { + case "PC": { + response = await this.pingPCServer(); + break; + } + case "PE": { + response = await this.pingPEServer(); + break; + } } - case "PE": { - return this.pingPEServer(); + + if (!response) { + return Promise.resolve(undefined); } - default: { - throw new Error( - `Unknown server type ${this.getType()} for ${this.getName()}` + + try { + influx.writePoint( + new Point("playerCount") + .tag("id", this.getID().toString()) + .tag("ip", this.getIP().toLowerCase()) + .intField("playerCount", response.playerCount) + .timestamp(response.timestamp) ); + } catch (err) { + logger.warn(`Failed to write ping to influxdb`, err); } + + return Promise.resolve(response); + } catch (err) { + logger.warn(`Failed to ping ${this.getIP()}`, err); + return Promise.resolve(undefined); } } @@ -133,7 +156,7 @@ export default class Server { const serverPing = new javaPing.MinecraftServer(ip, port); return new Promise((resolve, reject) => { - serverPing.ping(Config.scanner.timeout, 700, (err, res) => { + serverPing.ping(Config.scanner.timeout, 765, (err, res) => { if (err || res == undefined) { return reject(err); } diff --git a/src/server/serverManager.ts b/src/server/serverManager.ts index bc186b1..76ab0c8 100644 --- a/src/server/serverManager.ts +++ b/src/server/serverManager.ts @@ -1,6 +1,7 @@ import Server, { ServerType } from "./server"; import Servers from "../../data/servers.json"; +import { logger } from "../utils/logger"; export default class ServerManager { private servers: Server[] = []; @@ -11,6 +12,7 @@ export default class ServerManager { * Loads the servers from the config file. */ async init() { + logger.info("Loading servers"); for (const configServer of Servers) { const server = new Server({ id: configServer.id, @@ -18,11 +20,17 @@ export default class ServerManager { name: configServer.name, type: configServer.type as ServerType, }); - try { - await server.pingServer(); - } catch (err) {} this.servers.push(server); } + // do an inital ping of all servers to load data from them + await Promise.all( + this.servers.map((server) => { + try { + server.pingServer(); + } catch (err) {} + }) + ); + logger.info(`Loaded ${this.servers.length} servers`); } /** diff --git a/src/websocket/websocket.ts b/src/websocket/websocket.ts deleted file mode 100644 index be3b7f2..0000000 --- a/src/websocket/websocket.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Socket, Server as SocketServer } from "socket.io"; -import { serverManager } from ".."; -import Server, { ServerStatus } from "../server/server"; -import { Ping } from "../types/ping"; -import { logger } from "../utils/logger"; - -export default class WebsocketServer { - private server: SocketServer; - - constructor(port: number) { - logger.info(`Starting websocket server on port ${port}`); - this.server = new SocketServer(port); - - this.server.on("connection", (socket) => { - logger.debug("ws: Client connected"); - this.sendServerList(socket); - }); - } - - /** - * Sends the server list to the given socket. - * - * @param socket the socket to send the server list to - */ - public sendServerList(socket: Socket): void { - logger.debug(`ws: Sending server list to ${socket.id}`); - - const servers = []; - for (const server of serverManager.getServers()) { - servers.push({ - id: server.getID(), - name: server.getName(), - ip: server.getIP(), - port: server.getPort(), - favicon: server.getFavicon(), - }); - } - socket.emit("serverList", servers); - } - - /** - * Sends the latest ping data for the given server to all clients. - * - * @param server the server to send the ping for - * @param pingResponse the ping data to send - * @param isNewRecord whether a new record has been set - */ - public sendNewPing( - server: Server, - pingResponse: Ping, - isNewRecord: boolean - ): void { - logger.debug(`ws: Sending new ping for ${server.getName()}`); - this.server.emit("newPing", { - server: server.getID(), - timestamp: pingResponse.timestamp, - playerCount: pingResponse.playerCount, - }); - if (isNewRecord) { - logger.debug(`ws: Sending new record for ${server.getName()}`); - this.server.emit("newRecord", { - server: server.getID(), - timestamp: pingResponse.timestamp, - playerCount: pingResponse.playerCount, - }); - } - } - - /** - * Sends the server status for the given server to all clients. - * - * @param server the server to send the status for - * @param status the status to send - */ - public sendServerError(server: Server, status: ServerStatus): void { - logger.debug(`ws: Sending server status for ${server.getName()}`); - this.server.emit("serverStatus", { - server: server.getID(), - status: status, - }); - } -} -- 2.45.2 From 4f3a9ea9ddc059513d3e20929356862e707442d6 Mon Sep 17 00:00:00 2001 From: Lee Date: Wed, 3 Jan 2024 07:27:10 +0000 Subject: [PATCH 03/19] Update .gitea/workflows/publish.yaml --- .gitea/workflows/publish.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml index 38b9ff5..8456c4d 100644 --- a/.gitea/workflows/publish.yaml +++ b/.gitea/workflows/publish.yaml @@ -44,7 +44,7 @@ jobs: key: ${{ runner.os }}-buildx - name: Build and Push (Latest) - uses: docker/build-push-action@v + uses: docker/build-push-action@v5 with: push: true context: . -- 2.45.2 From d2a2bdacd5ebfa3879bc7d423e9e6b30ee912b15 Mon Sep 17 00:00:00 2001 From: Lee Date: Wed, 3 Jan 2024 07:27:35 +0000 Subject: [PATCH 04/19] Update .gitea/workflows/publish.yaml --- .gitea/workflows/publish.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml index 8456c4d..979cb77 100644 --- a/.gitea/workflows/publish.yaml +++ b/.gitea/workflows/publish.yaml @@ -4,6 +4,7 @@ on: push: branches: - "master" + - "influx-only" jobs: docker: -- 2.45.2 From 9453ef59d3a796ce72d0a54c3ead98c7e2626a8d Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:30:29 +0000 Subject: [PATCH 05/19] for reel --- Dockerfile | 14 ++++++++++---- docker-compose.yml | 2 -- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index ff0bbd2..f07ef8f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,15 @@ -FROM node:lts-alpine +FROM fascinated/docker-images:node-pnpm-latest AS base + ENV NODE_ENV=production WORKDIR /usr/src/app -COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] -RUN npm install --production --silent && mv node_modules ../ + +COPY ["package.json", "pnpm-lock.json", "./"] + +RUN pnpm install --production --silent && mv node_modules ../ + COPY . . + RUN chown -R node /usr/src/app USER node -CMD ["node", "index.js"] + +CMD pnpm run start diff --git a/docker-compose.yml b/docker-compose.yml index f112a4d..ac158f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,5 +3,3 @@ version: "3.4" services: backend: image: fascinated/mc-tracker-backend:influx - environment: - NODE_ENV: production -- 2.45.2 From 00deb93193dcdb81d0d7f25224c9e8a239d93007 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:32:49 +0000 Subject: [PATCH 06/19] im tired okay --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f07ef8f..678ee5f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM fascinated/docker-images:node-pnpm-latest AS base ENV NODE_ENV=production WORKDIR /usr/src/app -COPY ["package.json", "pnpm-lock.json", "./"] +COPY ["package.json", "pnpm-lock.yaml", "./"] RUN pnpm install --production --silent && mv node_modules ../ -- 2.45.2 From 663f997ee78375bd8dee9f57ccdbea9ac1190d0d Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:33:41 +0000 Subject: [PATCH 07/19] root --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 678ee5f..a51d7b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ RUN pnpm install --production --silent && mv node_modules ../ COPY . . -RUN chown -R node /usr/src/app -USER node +#RUN chown -R node /usr/src/app +#USER node CMD pnpm run start -- 2.45.2 From fb6dbc3b5d7d982ce604a21c08f0ab6e9595870e Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:36:10 +0000 Subject: [PATCH 08/19] helps when you build frfr --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index a51d7b0..b75fb59 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,4 +12,6 @@ COPY . . #RUN chown -R node /usr/src/app #USER node +RUN pnpm run build + CMD pnpm run start -- 2.45.2 From 2ff05f9255f579bf7c7a859df4069c6c2c062fb7 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:37:37 +0000 Subject: [PATCH 09/19] e --- Dockerfile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index b75fb59..7d71f59 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,13 +4,9 @@ ENV NODE_ENV=production WORKDIR /usr/src/app COPY ["package.json", "pnpm-lock.yaml", "./"] - -RUN pnpm install --production --silent && mv node_modules ../ - COPY . . -#RUN chown -R node /usr/src/app -#USER node +RUN pnpm install --production --silent RUN pnpm run build -- 2.45.2 From dba6aa8bef49221143da3a25d8587ea46b0f049c Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:39:03 +0000 Subject: [PATCH 10/19] 7 --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7d71f59..3ef37bb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,4 @@ COPY . . RUN pnpm install --production --silent -RUN pnpm run build - -CMD pnpm run start +CMD pnpm run build && pnpm run start -- 2.45.2 From d4bba5426e495f2579681d4a3705bc3273cc4788 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:40:43 +0000 Subject: [PATCH 11/19] fix deps --- package.json | 4 +--- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index c836f7f..63ca066 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,7 @@ "ts-node": "^10.9.2", "tsup": "^8.0.1", "typescript": "^5.3.3", - "winston": "^3.11.0" - }, - "devDependencies": { + "winston": "^3.11.0", "@types/node": "^20.10.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d972bd4..ff83ffc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ dependencies: '@types/mcping-js': specifier: ^1.5.4 version: 1.5.4 + '@types/node': + specifier: ^20.10.6 + version: 20.10.6 '@types/node-cron': specifier: ^3.0.11 version: 3.0.11 @@ -39,11 +42,6 @@ dependencies: specifier: ^3.11.0 version: 3.11.0 -devDependencies: - '@types/node': - specifier: ^20.10.6 - version: 20.10.6 - packages: /@colors/colors@1.6.0: @@ -479,6 +477,7 @@ packages: resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} dependencies: undici-types: 5.26.5 + dev: false /@types/triple-beam@1.3.5: resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} @@ -2189,6 +2188,7 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false /utf8@2.0.0: resolution: {integrity: sha512-jWXHr+bQ8RsWazLzVY3V7XACPTbBHYSg/VoDVok+DBQk5ULm0AuBCNb9tGmjq2H+znnkBFwjhzzCbn9G3xlYcA==} -- 2.45.2 From 8f344d246f4b68eee9d425217b7da939c8f3340e Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:42:39 +0000 Subject: [PATCH 12/19] dont ping servers on startup --- src/server/serverManager.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/server/serverManager.ts b/src/server/serverManager.ts index 76ab0c8..a909fd0 100644 --- a/src/server/serverManager.ts +++ b/src/server/serverManager.ts @@ -22,14 +22,6 @@ export default class ServerManager { }); this.servers.push(server); } - // do an inital ping of all servers to load data from them - await Promise.all( - this.servers.map((server) => { - try { - server.pingServer(); - } catch (err) {} - }) - ); logger.info(`Loaded ${this.servers.length} servers`); } -- 2.45.2 From 29e3696be3667b3c34a7b8c7f26ba7c05caf2659 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:47:41 +0000 Subject: [PATCH 13/19] dont create .d.ts files for prod (rlly slow to make them) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 63ca066..8a8e0c0 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "dev": "nodemon --exec ts-node src/index.ts", - "build": "tsup src/index.ts --format cjs,esm --dts", + "build": "tsup src/index.ts --format cjs,esm", "start": "node dist/index.js" }, "keywords": [], -- 2.45.2 From 8383445898161f4bc69bd7d19e6bf0b3f813d127 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:50:03 +0000 Subject: [PATCH 14/19] dont need u either --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8a8e0c0..b6b674a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "dev": "nodemon --exec ts-node src/index.ts", - "build": "tsup src/index.ts --format cjs,esm", + "build": "tsup src/index.ts --format cjs", "start": "node dist/index.js" }, "keywords": [], -- 2.45.2 From 9c6966f180e09d0b43d6d5046c173e691038279d Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 07:52:43 +0000 Subject: [PATCH 15/19] remove old log --- src/scanner/scanner.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/scanner/scanner.ts b/src/scanner/scanner.ts index be58901..59948b0 100644 --- a/src/scanner/scanner.ts +++ b/src/scanner/scanner.ts @@ -6,8 +6,6 @@ import { logger } from "../utils/logger"; export default class Scanner { constructor() { - logger.info("Loading scanner database"); - cron.schedule(Config.scanner.updateCron, () => { this.scanServers(); }); -- 2.45.2 From 56a75560e8ae495868ad8ecf11568bd55af3e553 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 08:00:05 +0000 Subject: [PATCH 16/19] update compose file --- docker-compose.yml | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ac158f4..ea5ce90 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,22 @@ -version: "3.4" +version: "3" services: - backend: + tracker: + restart: always image: fascinated/mc-tracker-backend:influx + volumes: + - ./data:/usr/src/app/data + + influxdb: + image: influxdb:latest + container_name: influxdb + networks: + - default + security_opt: + - no-new-privileges:true + restart: always + ports: + - "8086:8086" + volumes: + - ./influx/config:/etc/influxdb2 + - ./influx/db:/var/lib/influxdb2 -- 2.45.2 From 8826a2530aeaed8565580e85a82bdf06ba374a57 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 08:27:33 +0000 Subject: [PATCH 17/19] use name to identify servers not ip --- .gitignore | 3 +- data/{servers.json-example => servers.json} | 38 +++++++-------------- src/server/server.ts | 22 ++---------- src/server/serverManager.ts | 1 - src/types/ping.ts | 1 - 5 files changed, 16 insertions(+), 49 deletions(-) rename data/{servers.json-example => servers.json} (65%) diff --git a/.gitignore b/.gitignore index fcdc9ed..1083e85 100644 --- a/.gitignore +++ b/.gitignore @@ -229,5 +229,4 @@ data/db.sqlite-shm data/db.sqlite-wal data/database-backups -data/config.json -data/servers.json \ No newline at end of file +data/config.json \ No newline at end of file diff --git a/data/servers.json-example b/data/servers.json similarity index 65% rename from data/servers.json-example rename to data/servers.json index a2e84c0..83edd2f 100644 --- a/data/servers.json-example +++ b/data/servers.json @@ -2,73 +2,61 @@ { "name": "WildPrison", "ip": "wildprison.net", - "type": "PC", - "id": 0 + "type": "PC" }, { "name": "Hypixel", "ip": "mc.hypixel.net", - "type": "PC", - "id": 1 + "type": "PC" }, { - "name": "CubeCraft", + "name": "Cubecraft", "ip": "play.cubecraft.net", - "type": "PC", - "id": 2 + "type": "PC" }, { "name": "Mineplex", "ip": "mineplex.com", - "type": "PC", - "id": 3 + "type": "PC" }, { "name": "2b2t", "ip": "2b2t.org", - "type": "PC", - "id": 4 + "type": "PC" }, { "name": "AkumaMC", "ip": "akumamc.net", - "type": "PC", - "id": 5 + "type": "PC" }, { "name": "Wynncraft", "ip": "play.wynncraft.com", - "type": "PC", - "id": 6 + "type": "PC" }, { "name": "Minehut", "ip": "minehut.com", - "type": "PC", - "id": 7 + "type": "PC" }, { "name": "Grand Theft Minecraft", "ip": "gtm.network", - "type": "PC", - "id": 8 + "type": "PC" }, { "name": "HiveMC", "ip": "geo.hivebedrock.network", - "type": "PE", - "id": 9 + "type": "PE" }, { "name": "Purple Prison", "ip": "MCSL.PURPLE.WTF", - "type": "PC", - "id": 10 + "type": "PC" }, { "name": "MinecraftOnline", "ip": "minecraftonline.com", - "type": "PC", - "id": 11 + "type": "PC" } ] diff --git a/src/server/server.ts b/src/server/server.ts index ca06e22..914b0af 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -20,7 +20,6 @@ export enum ServerStatus { } type ServerOptions = { - id: number; name: string; ip: string; port?: number; @@ -33,11 +32,6 @@ type DnsInfo = { }; export default class Server { - /** - * The ID of the server. - */ - private id: number; - /** * The name of the server. */ @@ -71,8 +65,7 @@ export default class Server { hasResolved: false, }; - constructor({ id, name, ip, port, type }: ServerOptions) { - this.id = id; + constructor({ name, ip, port, type }: ServerOptions) { this.name = name; this.ip = ip; this.port = port; @@ -106,7 +99,7 @@ export default class Server { try { influx.writePoint( new Point("playerCount") - .tag("id", this.getID().toString()) + .tag("name", this.getName()) .tag("ip", this.getIP().toLowerCase()) .intField("playerCount", response.playerCount) .timestamp(response.timestamp) @@ -163,7 +156,6 @@ export default class Server { this.favicon = res.favicon; // Set the favicon resolve({ - id: this.getID(), timestamp: Date.now(), ip: ip, playerCount: res.players.online, @@ -189,7 +181,6 @@ export default class Server { } resolve({ - id: this.getID(), timestamp: Date.now(), ip: this.getIP(), playerCount: res.currentPlayers, @@ -199,15 +190,6 @@ export default class Server { }); } - /** - * Returns the ID of the server. - * - * @returns the ID - */ - public getID(): number { - return this.id; - } - /** * Returns the name of the server. * diff --git a/src/server/serverManager.ts b/src/server/serverManager.ts index a909fd0..af16b9b 100644 --- a/src/server/serverManager.ts +++ b/src/server/serverManager.ts @@ -15,7 +15,6 @@ export default class ServerManager { logger.info("Loading servers"); for (const configServer of Servers) { const server = new Server({ - id: configServer.id, ip: configServer.ip, name: configServer.name, type: configServer.type as ServerType, diff --git a/src/types/ping.ts b/src/types/ping.ts index ab23af3..521de18 100644 --- a/src/types/ping.ts +++ b/src/types/ping.ts @@ -1,5 +1,4 @@ export type Ping = { - id: number; timestamp: number; ip: string; playerCount: number; -- 2.45.2 From 4095d70722c87c0b71ccf7950e382f5051a24311 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 08:31:21 +0000 Subject: [PATCH 18/19] update wild --- data/servers.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/servers.json b/data/servers.json index 83edd2f..98b82a6 100644 --- a/data/servers.json +++ b/data/servers.json @@ -1,7 +1,7 @@ [ { - "name": "WildPrison", - "ip": "wildprison.net", + "name": "WildNetwork", + "ip": "wildnetwork.net", "type": "PC" }, { -- 2.45.2 From b0f3d8532fba7b6a0fc2fdffa71003da81c10cc1 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Jan 2024 08:32:04 +0000 Subject: [PATCH 19/19] dont include ip in the influx data --- src/server/server.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/server.ts b/src/server/server.ts index 914b0af..eb5c38d 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -100,7 +100,6 @@ export default class Server { influx.writePoint( new Point("playerCount") .tag("name", this.getName()) - .tag("ip", this.getIP().toLowerCase()) .intField("playerCount", response.playerCount) .timestamp(response.timestamp) ); -- 2.45.2