diff --git a/backend/server.ts b/backend/server.ts index 4ffeb54..aa83a3a 100644 --- a/backend/server.ts +++ b/backend/server.ts @@ -1,7 +1,9 @@ +import { createServer } from "node:http"; import os from "node:os"; import createApp from "./app.js"; import { createLogger } from "./src/logger/logger.controller.js"; import { connectProdSql } from "./src/prodSql/prodSqlConnection.controller.js"; +import { setupSocketIORoutes } from "./src/socket.io/serverSetup.js"; const port = Number(process.env.PORT) || 3000; @@ -12,7 +14,11 @@ const start = async () => { const { app, baseUrl } = await createApp(); - app.listen(port, async () => { + const server = createServer(app); + + setupSocketIORoutes(baseUrl, server); + + server.listen(port, async () => { log.info( `Listening on http://${os.hostname()}:${port}${baseUrl}, logging in ${process.env.LOG_LEVEL}`, ); diff --git a/backend/src/socket.io/serverSetup.ts b/backend/src/socket.io/serverSetup.ts new file mode 100644 index 0000000..399e75b --- /dev/null +++ b/backend/src/socket.io/serverSetup.ts @@ -0,0 +1,51 @@ +import type { Server as HttpServer } from "node:http"; +//import { dirname, join } from "node:path"; +//import { fileURLToPath } from "node:url"; +import { instrument } from "@socket.io/admin-ui"; +import { Server } from "socket.io"; + +//const __filename = fileURLToPath(import.meta.url); +//const __dirname = dirname(__filename); + +export const setupSocketIORoutes = (baseUrl: string, server: HttpServer) => { + const io = new Server(server, { + path: `${baseUrl}/api/socket.io`, + cors: { + origin: ["http://localhost:3000", "https://admin.socket.io"], + credentials: true, + }, + }); + + io.on("connection", (s) => { + console.info(s.id); + }); + + // admin stuff for socket io + // app.use( + // express.static( + // join(__dirname, "../../../node_modules/@socket.io/admin-ui/dist"), + // ), + // ); + + // app.get(baseUrl + "/admindashboard", (_, res) => { + // res.sendFile( + // join( + // __dirname, + // "../../../node_modules/@socket.io/admin-ui/dist/index.js", + // ), + // ); + // }); + const admin = io.of("/admin"); + admin.on("connection", () => { + console.info("Connected to admin userspace"); + }); + instrument(io, { + auth: false, + //namespaceName: "/admin", + }); + //setup all the routes + // app.use(`${baseUrl}/api/datamart`, runQuery); + // app.use(`${baseUrl}/api/datamart`, addQuery); + // app.use(`${baseUrl}/api/datamart`, updateQuery); + // just sending a get on datamart will return all the queries that we can call. +}; diff --git a/backend/src/utils/cors.utils.ts b/backend/src/utils/cors.utils.ts index f2d8467..69b3161 100644 --- a/backend/src/utils/cors.utils.ts +++ b/backend/src/utils/cors.utils.ts @@ -9,6 +9,8 @@ export const allowedOrigins = [ "http://localhost:4000", "http://localhost:4001", "http://localhost:5500", + "https://admin.socket.io", + "https://electron-socket-io-playground.vercel.app", `${process.env.URL}`, ]; export const lstCors = () => { diff --git a/package-lock.json b/package-lock.json index f380a92..df9d18b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "license": "ISC", "dependencies": { "@dotenvx/dotenvx": "^1.51.2", + "@scalar/express-api-reference": "^0.8.28", + "@socket.io/admin-ui": "^0.5.1", "axios": "^1.13.2", "better-auth": "^1.4.9", "cors": "^2.8.5", @@ -29,6 +31,7 @@ "pino-pretty": "^13.1.3", "postgres": "^3.4.7", "powershell": "^2.3.3", + "socket.io": "^4.8.3", "zod": "^4.2.1" }, "devDependencies": { @@ -36,7 +39,6 @@ "@changesets/cli": "^2.27.0", "@commitlint/cli": "^18.4.0", "@commitlint/config-conventional": "^18.4.0", - "@scalar/express-api-reference": "^0.8.28", "@swc/core": "^1.15.7", "@swc/jest": "^0.2.39", "@types/cors": "^2.8.19", @@ -4721,7 +4723,6 @@ "version": "0.3.26", "resolved": "https://registry.npmjs.org/@scalar/core/-/core-0.3.26.tgz", "integrity": "sha512-CTwhU0zteyhFvlGbiErUC/nt7o4VMraXC4E52x2Cz+s/rgGrmS00pTYtnjO3NVQXXqjScq8BqMTqBZrHQEJhWw==", - "dev": true, "license": "MIT", "dependencies": { "@scalar/types": "0.5.2" @@ -4734,7 +4735,6 @@ "version": "0.8.28", "resolved": "https://registry.npmjs.org/@scalar/express-api-reference/-/express-api-reference-0.8.28.tgz", "integrity": "sha512-2J9nbykhPuXDLMOwqKEnFhni/8QlPsADAbkfXWpOVZZ+gHjjXjWZXIJ6n6EqTx61OsogyWwG1TH+EnYdGY9I2A==", - "dev": true, "license": "MIT", "dependencies": { "@scalar/core": "0.3.26" @@ -4747,7 +4747,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/@scalar/types/-/types-0.5.2.tgz", "integrity": "sha512-F5wyb/B/Mu56PpNqhgSfuKwiwVnmhNhzTOo+k5b++HvYhjwAnqnw8BzbDzwXhhn172IPw8kSkupA/vphw61IRA==", - "dev": true, "license": "MIT", "dependencies": { "nanoid": "5.1.5", @@ -5407,6 +5406,43 @@ "node": ">=18.0.0" } }, + "node_modules/@socket.io/admin-ui": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@socket.io/admin-ui/-/admin-ui-0.5.1.tgz", + "integrity": "sha512-1dlGL2FGm6T+uL1e6iDvbo2eCINwvW7iVbjIblwh5kPPRM1SP8lmZrbFZf4QNJ/cqQ+JLcx49eXGM9WAB4TK7w==", + "license": "MIT", + "dependencies": { + "@types/bcryptjs": "^2.4.2", + "bcryptjs": "^2.4.3", + "debug": "~4.3.1" + }, + "peerDependencies": { + "socket.io": ">=3.1.0" + } + }, + "node_modules/@socket.io/admin-ui/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -5752,6 +5788,12 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "license": "MIT" + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -5795,7 +5837,6 @@ "version": "2.8.19", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -6918,6 +6959,15 @@ ], "license": "MIT" }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.9.11", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", @@ -6947,6 +6997,12 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "license": "MIT" + }, "node_modules/better-auth": { "version": "1.4.9", "resolved": "https://registry.npmjs.org/better-auth/-/better-auth-1.4.9.tgz", @@ -9069,6 +9125,78 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz", + "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", @@ -12691,7 +12819,6 @@ "version": "5.1.5", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", - "dev": true, "funding": [ { "type": "github", @@ -14565,6 +14692,90 @@ "node": ">=8" } }, + "node_modules/socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", + "license": "MIT", + "dependencies": { + "debug": "~4.4.1", + "ws": "~8.18.3" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/sonic-boom": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", @@ -14961,7 +15172,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "dev": true, "license": "MIT", "engines": { "node": ">=20" @@ -15484,7 +15694,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.0.0.tgz", "integrity": "sha512-GeJop7+u7BYlQ6yQCAY1nBQiRSHR+6OdCEtd8Bwp9a3NK3+fWAVjOaPKJDteB9f6cIJ0wt4IfnScjLG450EpXA==", - "dev": true, "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -16064,6 +16273,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "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 + } + } + }, "node_modules/wsl-utils": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", diff --git a/package.json b/package.json index fa368b9..c83d44c 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "@changesets/cli": "^2.27.0", "@commitlint/cli": "^18.4.0", "@commitlint/config-conventional": "^18.4.0", - "@swc/core": "^1.15.7", "@swc/jest": "^0.2.39", "@types/cors": "^2.8.19", @@ -50,15 +49,10 @@ "@types/swagger-jsdoc": "^6.0.4", "@types/swagger-ui-express": "^4.1.8", "@vercel/ncc": "^0.38.4", - "commitizen": "^4.3.0", - "cz-conventional-changelog": "^3.3.0", - - "npm-check-updates": "^19.1.2", - "openapi-types": "^12.1.3", - + "openapi-types": "^12.1.3", "supertest": "^7.1.4", "ts-jest": "^29.4.6", "ts-node-dev": "^2.0.0", @@ -66,32 +60,32 @@ "typescript": "^5.9.3", "vite-tsconfig-paths": "^6.0.3", "vitest": "^4.0.16" - }, "dependencies": { "@dotenvx/dotenvx": "^1.51.2", - "pino": "^10.1.0", - "pino-pretty": "^13.1.3", - "zod": "^4.2.1", - "pg": "^8.16.3", - "powershell": "^2.3.3", + "@scalar/express-api-reference": "^0.8.28", + "@socket.io/admin-ui": "^0.5.1", "axios": "^1.13.2", "better-auth": "^1.4.9", + "cors": "^2.8.5", + "croner": "^9.1.0", + "drizzle-kit": "^0.31.8", + "drizzle-orm": "^0.45.1", + "drizzle-zod": "^0.8.3", + "express": "^5.2.1", + "husky": "^8.0.3", "morgan": "^1.10.1", "mssql": "^12.2.0", "multer": "^2.0.2", "nodemailer": "^7.0.12", "nodemailer-express-handlebars": "^7.0.0", + "pg": "^8.16.3", + "pino": "^10.1.0", + "pino-pretty": "^13.1.3", "postgres": "^3.4.7", - "drizzle-kit": "^0.31.8", - "drizzle-orm": "^0.45.1", - "cors": "^2.8.5", - "croner": "^9.1.0", - "@scalar/express-api-reference": "^0.8.28", - "drizzle-zod": "^0.8.3", - "express": "^5.2.1", - "husky": "^8.0.3" - + "powershell": "^2.3.3", + "socket.io": "^4.8.3", + "zod": "^4.2.1" }, "config": { "commitizen": {