From 5f082b9619653d6dc41e6a4d4232c9027525b849 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 22 Aug 2024 14:48:00 -0700 Subject: [PATCH] Basic connection to elasticache server. --- package-lock.json | 143 ++++++++++++++++++++++++++++++- package.json | 3 + server.js | 208 ++++++++++++++++++++++++---------------------- 3 files changed, 249 insertions(+), 105 deletions(-) diff --git a/package-lock.json b/package-lock.json index 968cc0ac0..039e28eea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@aws-sdk/client-ses": "^3.629.0", "@aws-sdk/credential-provider-node": "^3.629.0", "@opensearch-project/opensearch": "^2.11.0", + "@socket.io/redis-adapter": "^8.3.0", "aws4": "^1.13.1", "axios": "^1.7.4", "better-queue": "^3.8.12", @@ -44,9 +45,11 @@ "nodemailer": "^6.9.14", "phone": "^3.1.49", "recursive-diff": "^1.0.9", + "redis": "^4.7.0", "rimraf": "^6.0.1", "soap": "^1.1.1", "socket.io": "^4.7.5", + "socket.io-adapter": "^2.5.5", "ssh2-sftp-client": "^10.0.3", "twilio": "^4.23.0", "uuid": "^10.0.0", @@ -1753,6 +1756,59 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "optional": true }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", + "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", + "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", + "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", + "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, "node_modules/@smithy/abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", @@ -2312,6 +2368,22 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, + "node_modules/@socket.io/redis-adapter": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@socket.io/redis-adapter/-/redis-adapter-8.3.0.tgz", + "integrity": "sha512-ly0cra+48hDmChxmIpnESKrc94LjRL80TEmZVscuQ/WWkRP81nNj8W8cCGMqbI4L6NCuAaPRSzZF1a9GlAxxnA==", + "dependencies": { + "debug": "~4.3.1", + "notepack.io": "~3.0.1", + "uid2": "1.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "socket.io-adapter": "^2.5.4" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3043,6 +3115,14 @@ "node": ">=9" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -4381,6 +4461,14 @@ "node": ">=14" } }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5554,6 +5642,11 @@ "node": ">=6" } }, + "node_modules/notepack.io": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/notepack.io/-/notepack.io-3.0.1.tgz", + "integrity": "sha512-TKC/8zH5pXIAMVQio2TvVDTtPRX+DJPHDqjRbxogtFiByHyzKmy96RA0JtCQJ+WouyyL4A10xomQzgbUT+1jCg==" + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -6042,6 +6135,19 @@ "resolved": "https://registry.npmjs.org/recursive-diff/-/recursive-diff-1.0.9.tgz", "integrity": "sha512-5mqpskzvXDo5Vy29Vj8tH30a0+XBmY11aqWGoN/uB94UHRwndX2EuPvH+WtbqOYkrwAF718/lDo6U4CB1qSSqQ==" }, + "node_modules/redis": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", + "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.6.0", + "@redis/graph": "1.1.1", + "@redis/json": "1.0.7", + "@redis/search": "1.2.0", + "@redis/time-series": "1.1.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", @@ -6409,11 +6515,32 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dependencies": { - "ws": "~8.11.0" + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "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/socket.io-parser": { @@ -7160,6 +7287,14 @@ "node": ">= 0.8" } }, + "node_modules/uid2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-1.0.0.tgz", + "integrity": "sha512-+I6aJUv63YAcY9n4mQreLUt0d4lvwkkopDNmpomkAUz0fAkEMV9pRWxN0EjhW1YfRhcuyHg2v3mwddCDW1+LFQ==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/undici-types": { "version": "6.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.18.2.tgz", diff --git a/package.json b/package.json index 25980e09b..05e69420a 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@aws-sdk/client-ses": "^3.629.0", "@aws-sdk/credential-provider-node": "^3.629.0", "@opensearch-project/opensearch": "^2.11.0", + "@socket.io/redis-adapter": "^8.3.0", "aws4": "^1.13.1", "axios": "^1.7.4", "better-queue": "^3.8.12", @@ -54,9 +55,11 @@ "nodemailer": "^6.9.14", "phone": "^3.1.49", "recursive-diff": "^1.0.9", + "redis": "^4.7.0", "rimraf": "^6.0.1", "soap": "^1.1.1", "socket.io": "^4.7.5", + "socket.io-adapter": "^2.5.5", "ssh2-sftp-client": "^10.0.3", "twilio": "^4.23.0", "uuid": "^10.0.0", diff --git a/server.js b/server.js index 8a7072146..a1b8697bd 100644 --- a/server.js +++ b/server.js @@ -1,110 +1,116 @@ -// Import core modules -const express = require("express"); -const cors = require("cors"); -const bodyParser = require("body-parser"); -const path = require("path"); -const compression = require("compression"); -const cookieParser = require("cookie-parser"); -const http = require("http"); -const { Server } = require("socket.io"); - -// Load environment variables -require("dotenv").config({ - path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) -}); - -// Import custom utilities and handlers -const logger = require("./server/utils/logger"); - -// Express app and server setup -const app = express(); -const port = process.env.PORT || 5000; -const server = http.createServer(app); -const io = new Server(server, { - path: "/ws", - cors: { - origin: [ - "https://test.imex.online", - "https://www.test.imex.online", - "http://localhost:3000", - "https://imex.online", - "https://www.imex.online", - "https://romeonline.io", //Added in all RO and PM routes to simplyify setup. - "https://www.romeonline.io", - "https://beta.test.romeonline.io", - "https://www.beta.test.romeonline.io", - "https://beta.romeonline.io", - "https://www.beta.romeonline.io", - "https://beta.test.imex.online", - "https://www.beta.test.imex.online", - "https://beta.imex.online", - "https://www.beta.imex.online", - "https://www.test.promanager.web-est.com", - "https://test.promanager.web-est.com", - "https://www.promanager.web-est.com", - "https://www.promanager.web-est.com" - ], - methods: ["GET", "POST"], - credentials: true, - exposedHeaders: ["set-cookie"] - } -}); -exports.io = io; - -require("./server/web-sockets/web-socket"); - -// Middleware -app.use(compression()); -app.use(cookieParser()); -app.use(bodyParser.json({ limit: "50mb" })); -app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); -app.use(cors({ credentials: true, exposedHeaders: ["set-cookie"] })); - -// Helper middleware -app.use((req, res, next) => { - req.logger = logger; - next(); -}); - -// Route groupings -app.use("/", require("./server/routes/miscellaneousRoutes")); -app.use("/notifications", require("./server/routes/notificationsRoutes")); -app.use("/render", require("./server/routes/renderRoutes")); -app.use("/mixdata", require("./server/routes/mixDataRoutes")); -app.use("/accounting", require("./server/routes/accountingRoutes")); -app.use("/qbo", require("./server/routes/qboRoutes")); -app.use("/media", require("./server/routes/mediaRoutes")); -app.use("/sms", require("./server/routes/smsRoutes")); -app.use("/job", require("./server/routes/jobRoutes")); -app.use("/scheduling", require("./server/routes/schedulingRoutes")); -app.use("/utils", require("./server/routes/utilRoutes")); -app.use("/data", require("./server/routes/dataRoutes")); -app.use("/adm", require("./server/routes/adminRoutes")); -app.use("/tech", require("./server/routes/techRoutes")); -app.use("/intellipay", require("./server/routes/intellipayRoutes")); -app.use("/cdk", require("./server/routes/cdkRoutes")); -app.use("/csi", require("./server/routes/csiRoutes")); -app.use("/payroll", require("./server/routes/payrollRoutes")); - -// Default route for forbidden access -app.get("/", (req, res) => { - res.status(200).send("Access Forbidden."); -}); - const main = async () => { - await server.listen(port); -}; + // Import core modules + const express = require("express"); + const cors = require("cors"); + const bodyParser = require("body-parser"); + const path = require("path"); + const compression = require("compression"); + const cookieParser = require("cookie-parser"); + const http = require("http"); + const { Server } = require("socket.io"); + const { createClient } = require("redis"); + const { createAdapter } = require("@socket.io/redis-adapter"); + // Load environment variables + require("dotenv").config({ + path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) + }); -// Start server -main() - .then(() => { + // Import custom utilities and handlers + const logger = require("./server/utils/logger"); + + // Express app and server setup + const app = express(); + const port = process.env.PORT || 5000; + const server = http.createServer(app); + const pubClient = createClient({ url: "redis://localhost:6379" }); + const subClient = pubClient.duplicate(); + + await Promise.all([pubClient.connect(), subClient.connect()]); + + const io = new Server(server, { + path: "/ws", + adapter: createAdapter(pubClient, subClient), + cors: { + origin: [ + "https://test.imex.online", + "https://www.test.imex.online", + "http://localhost:3000", + "https://imex.online", + "https://www.imex.online", + "https://romeonline.io", + "https://www.romeonline.io", + "https://beta.test.romeonline.io", + "https://www.beta.test.romeonline.io", + "https://beta.romeonline.io", + "https://www.beta.romeonline.io", + "https://beta.test.imex.online", + "https://www.beta.test.imex.online", + "https://beta.imex.online", + "https://www.beta.imex.online", + "https://www.test.promanager.web-est.com", + "https://test.promanager.web-est.com", + "https://www.promanager.web-est.com", + "https://www.promanager.web-est.com" + ], + methods: ["GET", "POST"], + credentials: true, + exposedHeaders: ["set-cookie"] + } + }); + exports.io = io; + + require("./server/web-sockets/web-socket"); + + // Middleware + app.use(compression()); + app.use(cookieParser()); + app.use(bodyParser.json({ limit: "50mb" })); + app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); + app.use(cors({ credentials: true, exposedHeaders: ["set-cookie"] })); + + // Helper middleware + app.use((req, res, next) => { + req.logger = logger; + next(); + }); + + // Route groupings + app.use("/", require("./server/routes/miscellaneousRoutes")); + app.use("/notifications", require("./server/routes/notificationsRoutes")); + app.use("/render", require("./server/routes/renderRoutes")); + app.use("/mixdata", require("./server/routes/mixDataRoutes")); + app.use("/accounting", require("./server/routes/accountingRoutes")); + app.use("/qbo", require("./server/routes/qboRoutes")); + app.use("/media", require("./server/routes/mediaRoutes")); + app.use("/sms", require("./server/routes/smsRoutes")); + app.use("/job", require("./server/routes/jobRoutes")); + app.use("/scheduling", require("./server/routes/schedulingRoutes")); + app.use("/utils", require("./server/routes/utilRoutes")); + app.use("/data", require("./server/routes/dataRoutes")); + app.use("/adm", require("./server/routes/adminRoutes")); + app.use("/tech", require("./server/routes/techRoutes")); + app.use("/intellipay", require("./server/routes/intellipayRoutes")); + app.use("/cdk", require("./server/routes/cdkRoutes")); + app.use("/csi", require("./server/routes/csiRoutes")); + app.use("/payroll", require("./server/routes/payrollRoutes")); + + // Default route for forbidden access + app.get("/", (req, res) => { + res.status(200).send("Access Forbidden."); + }); + + try { + await server.listen(port); logger.log(`[${process.env.NODE_ENV || "DEVELOPMENT"}] Server started on port ${port}`, "INFO", "api"); - }) - .catch((error) => { + } catch (error) { logger.log( `[${process.env.NODE_ENV || "DEVELOPMENT"}] Server failed to start on port ${port}`, "ERROR", "api", error ); - }); + } +}; + +// Start server +main();