diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18 diff --git a/client/package.json b/client/package.json index 1657881..717201f 100644 --- a/client/package.json +++ b/client/package.json @@ -45,7 +45,6 @@ "identity-obj-proxy": "3.0.0", "material-ui-confirm": "2.0.4", "mini-css-extract-plugin": "0.8.0", - "node-sass": "^4.14.1", "optimize-css-assets-webpack-plugin": "5.0.3", "pnp-webpack-plugin": "1.5.0", "postcss-flexbugs-fixes": "4.1.0", @@ -55,17 +54,17 @@ "postcss-safe-parser": "4.0.1", "prop-types": "15.7.2", "qs": "^6.9.6", - "react": "^16.14.0", + "react": "^17.0.2", "react-app-polyfill": "^1.0.6", "react-cube-svg": "^0.1.3", "react-dev-utils": "^11.0.4", - "react-dom": "^16.14.0", + "react-dom": "^17.0.2", "react-ga": "2.7.0", "react-hot-loader": "^4.13.0", "react-markdown": "^4.3.1", "react-redux": "^7.2.2", "react-router-dom": "^5.2.0", - "react-test-renderer": "16.13.1", + "react-test-renderer": "^17.0.2", "react-twitch-embed": "^2.1.0", "react-virtualized": "^9.22.3", "redux": "^4.0.5", @@ -74,15 +73,16 @@ "reselect": "^4.0.0", "resolve": "1.12.2", "resolve-url-loader": "^3.1.2", + "sass": "^1.69.7", "sass-loader": "8.0.0", - "socket.io-client": "^3.1.3", + "socket.io-client": "^4.8.1", "stackmat-signal-processor": "^0.1.0", "style-loader": "1.0.0", "terser-webpack-plugin": "^4.2.3", "ts-pnp": "1.1.5", "uifx": "^2.0.7", "url-loader": "2.3.0", - "uuid": "7.0.3", + "uuid": "^8.3.2", "webpack": "4.41.2", "webpack-dev-server": "^3.11.2", "webpack-manifest-plugin": "2.2.0", @@ -178,5 +178,9 @@ "jest-environment-jsdom-fourteen": "^1.0.1", "jest-resolve": "^26.6.2", "jest-watch-typeahead": "^0.6.1" + }, + "engines": { + "node": ">=18 <19", + "npm": ">=9" } } diff --git a/package.json b/package.json index ee4bd1c..bf8621f 100644 --- a/package.json +++ b/package.json @@ -8,5 +8,8 @@ "pre-commit": "cd client/ && npm run lint && cd ../server/ && npm run lint && cd ../client/ && CI=true npm run test" } }, - "dependencies": {} + "engines": { + "node": ">=18 <19", + "npm": ">=9" + } } diff --git a/server/database.js b/server/database.js index b88c969..15afdfb 100644 --- a/server/database.js +++ b/server/database.js @@ -5,10 +5,7 @@ const logger = require('./logger'); module.exports.connect = async () => { logger.debug('[MONGODB] Attempting to connect to database.', { url: config.mongodb }); - await mongoose.connect(config.mongodb, { - useNewUrlParser: true, - useUnifiedTopology: true, - }).then(() => { + await mongoose.connect(config.mongodb).then(() => { logger.debug('[MONGODB] Connected to database.', { url: config.mongodb }); }).catch((err) => { logger.error('[MONGODB] Error when connecting to database', err); diff --git a/server/middlewares/session.js b/server/middlewares/session.js index 598f3f5..47e79b5 100644 --- a/server/middlewares/session.js +++ b/server/middlewares/session.js @@ -1,6 +1,6 @@ const config = require('getconfig'); const session = require('express-session'); -const MongoStore = require('connect-mongo')(session); +const MongoStore = require('connect-mongo'); module.exports = (mongoose) => session({ secret: config.auth.secret, @@ -12,7 +12,7 @@ module.exports = (mongoose) => session({ secure: process.env.NODE_ENV === 'prod', sameSite: 'strict', }, - store: new MongoStore({ - mongooseConnection: mongoose.connection, + store: MongoStore.create({ + client: mongoose.connection.getClient(), }), }); diff --git a/server/models/room.js b/server/models/room.js index 7105bdc..90a63ad 100644 --- a/server/models/room.js +++ b/server/models/room.js @@ -2,7 +2,7 @@ const mongoose = require('mongoose'); const moment = require('moment'); const { Scrambow } = require('scrambow'); const bcrypt = require('bcrypt'); -const uuidv4 = require('uuid/v4'); +const uuidv4 = require('uuid').v4; const { Events } = require('../../client/src/lib/events'); // const lengths = { diff --git a/server/package.json b/server/package.json index 9202b1f..9e33beb 100644 --- a/server/package.json +++ b/server/package.json @@ -3,36 +3,37 @@ "version": "0.1.0", "private": true, "dependencies": { - "bcrypt": "5.0.0", - "body-parser": "1.19.0", - "connect-mongo": "^3.2.0", - "cookie": "^0.4.0", - "cookie-parser": "^1.4.4", + "@socket.io/redis-adapter": "^8.3.0", + "bcrypt": "^6.0.0", + "body-parser": "^1.20.3", + "connect-mongo": "^4.6.0", + "cookie": "^0.7.2", + "cookie-parser": "^1.4.7", "cookie-session": "^1.3.3", "cors": "^2.8.5", "express": "4.17.1", - "express-session": "^1.17.0", + "express-session": "^1.18.2", "express-socket.io-session": "^1.3.5", "getconfig": "^4.5.0", "lodash": "^4.17.21", - "moment": "2.24.0", - "mongoose": "^5.8.3", + "moment": "^2.30.1", + "mongoose": "^6.13.8", "morgan": "^1.9.1", - "node-fetch": "^2.6.1", - "passport": "^0.4.1", + "node-fetch": "^2.7.0", + "passport": "^0.5.3", "passport-custom": "^1.1.1", "passport-local": "^1.0.0", "passport-oauth2": "^1.5.0", "passport-wca": "^1.0.3", + "redis": "^4.7.0", "rest-api-errors": "^1.2.1", "scrambow": "^1.8.1", - "semver": "6.3.0", - "socket.io": "^3.1.2", + "semver": "^7.7.2", + "socket.io": "^4.8.1", "socket.io-logger": "0.0.2", - "socket.io-redis": "^6.0.1", - "uuid": "^3.3.3", - "winston": "3.2.1", - "winston-daily-rotate-file": "4.4.2" + "uuid": "^8.3.2", + "winston": "^3.17.0", + "winston-daily-rotate-file": "^5.0.0" }, "scripts": { "start:server": "nodemon index.js", @@ -50,7 +51,7 @@ "jest-resolve": "^26.6.2", "jest-watch-typeahead": "^0.6.1", "kill-port": "1.6.0", - "nodemon": "2.0.3" + "nodemon": "^3.1.10" }, "husky": { "hooks": { diff --git a/server/socket/index.js b/server/socket/index.js index 9f2e2b2..560cb99 100644 --- a/server/socket/index.js +++ b/server/socket/index.js @@ -1,7 +1,8 @@ const http = require('http'); const config = require('getconfig'); const socketIO = require('socket.io'); -const redis = require('socket.io-redis'); +const { createAdapter } = require('@socket.io/redis-adapter'); +const { createClient } = require('redis'); const expressSocketSession = require('express-socket.io-session'); const session = require('../middlewares/session'); const { connect } = require('../database'); @@ -48,10 +49,14 @@ const init = async () => { const mongoose = await connect(); - io.adapter(redis({ - host: 'localhost', - port: 6379, - })); + const pubClient = createClient({ url: 'redis://localhost:6379' }); + const subClient = pubClient.duplicate(); + + pubClient.on('error', logSocketError('redis pub client')); + subClient.on('error', logSocketError('redis sub client')); + + await Promise.all([pubClient.connect(), subClient.connect()]); + io.adapter(createAdapter(pubClient, subClient)); const middlewares = [ expressSocketSession(session(mongoose), { diff --git a/server/socket/lib/ChatMessage.js b/server/socket/lib/ChatMessage.js index f0798f4..024588d 100644 --- a/server/socket/lib/ChatMessage.js +++ b/server/socket/lib/ChatMessage.js @@ -1,4 +1,4 @@ -const uuid = require('uuid/v4'); +const uuid = require('uuid').v4; class ChatMessage { constructor(message, userId) {