From 844cfa4b568d9315ec3dc6cfc8a0580fbf2e0053 Mon Sep 17 00:00:00 2001 From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:15:38 -0700 Subject: [PATCH] Dispatch-Chron Jobs in Core-Server verschoben #65 --- apps/core-server/.env.example | 2 + apps/core-server/index.ts | 9 ++++ .../modules/chron.ts | 6 +-- apps/core-server/modules/redis.ts | 13 ++++++ apps/core-server/package.json | 3 ++ apps/dispatch-server/index.ts | 1 - apps/dispatch-server/modules/redis.ts | 6 --- pnpm-lock.yaml | 43 ++++++++++++++----- 8 files changed, 62 insertions(+), 21 deletions(-) rename apps/{dispatch-server => core-server}/modules/chron.ts (98%) create mode 100644 apps/core-server/modules/redis.ts diff --git a/apps/core-server/.env.example b/apps/core-server/.env.example index e53b08af..108fc9ca 100644 --- a/apps/core-server/.env.example +++ b/apps/core-server/.env.example @@ -1,3 +1,5 @@ +REDIS_HOST=localhost +REDIS_PORT=6379 DISCORD_SERVER_PORT=3005 DISCORD_GUILD_ID=1077269395019141140 DISCORD_OAUTH_CLIENT_ID=930384053344034846 diff --git a/apps/core-server/index.ts b/apps/core-server/index.ts index 8c089588..69ce61c0 100644 --- a/apps/core-server/index.ts +++ b/apps/core-server/index.ts @@ -3,10 +3,19 @@ import express from "express"; import { createServer } from "http"; import router from "routes/router"; import cors from "cors"; +import { Server } from "socket.io"; +import { createAdapter } from "@socket.io/redis-adapter"; +import { pubClient, subClient } from "modules/redis"; +import "modules/chron"; const app = express(); const server = createServer(app); +export const io = new Server(server, { + adapter: createAdapter(pubClient, subClient), + cors: {}, +}); + app.use(cors()); app.use(express.json()); app.use(router); diff --git a/apps/dispatch-server/modules/chron.ts b/apps/core-server/modules/chron.ts similarity index 98% rename from apps/dispatch-server/modules/chron.ts rename to apps/core-server/modules/chron.ts index 97f75693..91c88bd8 100644 --- a/apps/dispatch-server/modules/chron.ts +++ b/apps/core-server/modules/chron.ts @@ -58,9 +58,8 @@ const removeClosedMissions = async () => { l.data?.newFMSstatus === "6" ); }); - return ( - status4Log !== -1 && + (status4Log !== -1 || status8Log !== -1) && (status1Log !== -1 || status6Log !== -1) && (status4Log < status1Log || status8Log < status1Log || @@ -124,6 +123,7 @@ const removeClosedMissions = async () => { console.log(`Mission ${mission.id} closed due to inactivity.`); }); }; + const removeConnectedAircrafts = async () => { const connectedAircrafts = await prisma.connectedAircraft.findMany({ where: { @@ -144,7 +144,7 @@ const removeConnectedAircrafts = async () => { } }); }; - +removeClosedMissions(); cron.schedule("*/1 * * * *", async () => { try { await removeClosedMissions(); diff --git a/apps/core-server/modules/redis.ts b/apps/core-server/modules/redis.ts new file mode 100644 index 00000000..448fe34c --- /dev/null +++ b/apps/core-server/modules/redis.ts @@ -0,0 +1,13 @@ +import { createClient, RedisClientType } from "redis"; + +export const pubClient: RedisClientType = createClient({ + url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`, +}); +export const subClient: RedisClientType = pubClient.duplicate(); + +Promise.all([pubClient.connect(), subClient.connect()]).then(() => { + console.log("Redis connected"); +}); + +pubClient.on("error", (err: unknown) => console.log("Redis Client Error", err)); +subClient.on("error", (err: unknown) => console.log("Redis Client Error", err)); diff --git a/apps/core-server/package.json b/apps/core-server/package.json index 8004f5b2..210ed116 100644 --- a/apps/core-server/package.json +++ b/apps/core-server/package.json @@ -20,6 +20,7 @@ "typescript": "latest" }, "dependencies": { + "@socket.io/redis-adapter": "^8.3.0", "axios": "^1.9.0", "cors": "^2.8.5", "cron": "^4.3.1", @@ -30,6 +31,8 @@ "nodemon": "^3.1.10", "prom-client": "^15.1.3", "react": "^19.1.0", + "redis": "^5.1.1", + "socket.io": "^4.8.1", "tsx": "^4.19.4" } } diff --git a/apps/dispatch-server/index.ts b/apps/dispatch-server/index.ts index 9147703c..eeb3fe46 100644 --- a/apps/dispatch-server/index.ts +++ b/apps/dispatch-server/index.ts @@ -13,7 +13,6 @@ import { handleConnectDesktop } from "socket-events/connect-desktop"; import cookieParser from "cookie-parser"; import cors from "cors"; import { authMiddleware } from "modules/expressMiddleware"; -import "modules/chron"; const app = express(); const server = createServer(app); diff --git a/apps/dispatch-server/modules/redis.ts b/apps/dispatch-server/modules/redis.ts index ff7d7415..a35cadb6 100644 --- a/apps/dispatch-server/modules/redis.ts +++ b/apps/dispatch-server/modules/redis.ts @@ -7,12 +7,6 @@ export const subClient: RedisClientType = pubClient.duplicate(); Promise.all([pubClient.connect(), subClient.connect()]).then(() => { console.log("Redis connected"); - pubClient.keys("dispatchers*").then((keys) => { - if (!keys) return; - keys.forEach(async (key) => { - await pubClient.json.del(key); - }); - }); }); pubClient.on("error", (err) => console.log("Redis Client Error", err)); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e911870d..8f79610a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,6 +24,9 @@ importers: apps/core-server: dependencies: + '@socket.io/redis-adapter': + specifier: ^8.3.0 + version: 8.3.0(socket.io-adapter@2.5.5) axios: specifier: ^1.9.0 version: 1.9.0 @@ -54,6 +57,12 @@ importers: react: specifier: ^19.1.0 version: 19.1.0 + redis: + specifier: ^5.1.1 + version: 5.1.1 + socket.io: + specifier: ^4.8.1 + version: 4.8.1 tsx: specifier: ^4.19.4 version: 4.19.4 @@ -102,7 +111,7 @@ importers: version: 0.5.7(@types/dom-mediacapture-transform@0.1.11)(livekit-client@2.14.0(@types/dom-mediacapture-record@1.0.22)) '@next-auth/prisma-adapter': specifier: ^1.0.7 - version: 1.0.7(@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.11(next@15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) + version: 1.0.7(@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.11(next@15.3.4(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) '@radix-ui/react-icons': specifier: ^1.3.2 version: 1.3.2(react@19.1.0) @@ -186,7 +195,7 @@ importers: version: 15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.24.11(next@15.3.4(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) npm: specifier: ^11.4.2 version: 11.4.2 @@ -350,7 +359,7 @@ importers: version: 5.1.1(react-hook-form@7.59.0(react@19.1.0)) '@next-auth/prisma-adapter': specifier: ^1.0.7 - version: 1.0.7(@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.11(next@15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) + version: 1.0.7(@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.11(next@15.3.4(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) '@radix-ui/react-icons': specifier: ^1.3.2 version: 1.3.2(react@19.1.0) @@ -425,7 +434,7 @@ importers: version: 15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.24.11(next@15.3.4(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-remove-imports: specifier: ^1.0.12 version: 1.0.12(webpack@5.99.9) @@ -572,7 +581,7 @@ importers: dependencies: '@typescript-eslint/eslint-plugin': specifier: ^8.36.0 - version: 8.36.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.36.0(@typescript-eslint/parser@8.35.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) devDependencies: '@eslint/js': specifier: ^9.17.0 @@ -6954,10 +6963,10 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.11(next@15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))': + '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.3))(typescript@5.8.3))(next-auth@4.24.11(next@15.3.4(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))': dependencies: '@prisma/client': 6.8.2(prisma@6.8.2(typescript@5.8.3))(typescript@5.8.3) - next-auth: 4.24.11(next@15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next-auth: 4.24.11(next@15.3.4(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@next/env@15.3.4': {} @@ -8743,10 +8752,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.35.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.36.0 '@typescript-eslint/type-utils': 8.36.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/utils': 8.36.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) @@ -8818,6 +8827,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.35.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.0 + debug: 4.4.1(supports-color@5.5.0) + eslint: 9.28.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.35.0 @@ -9962,7 +9983,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.18 - '@types/node': 22.15.29 + '@types/node': 22.15.34 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -11886,7 +11907,7 @@ snapshots: neo-async@2.6.2: {} - next-auth@4.24.11(next@15.3.4(@babel/core@7.27.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next-auth@4.24.11(next@15.3.4(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@babel/runtime': 7.27.6 '@panva/hkdf': 1.2.1