diff --git a/package-lock.json b/package-lock.json index 02082daca4..ece83eb02d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35706,7 +35706,7 @@ "async": "^3.2.2", "body-parser": "^1.19.0", "express": "4.17.1", - "mongodb": "^3.6.0" + "mongodb": "^4.11.0" }, "devDependencies": { "acorn": "^7.1.1", @@ -35745,6 +35745,40 @@ "node": ">= 0.8" } }, + "services/chat/node_modules/bson": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "services/chat/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "services/chat/node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -35785,6 +35819,14 @@ "ms": "2.0.0" } }, + "services/chat/node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, "services/chat/node_modules/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -35856,6 +35898,24 @@ "node": ">=4" } }, + "services/chat/node_modules/mongodb": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.11.0.tgz", + "integrity": "sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg==", + "dependencies": { + "bson": "^4.7.0", + "denque": "^2.1.0", + "mongodb-connection-string-url": "^2.5.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", + "saslprep": "^1.0.3" + } + }, "services/chat/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -46021,7 +46081,7 @@ "chai-as-promised": "^7.1.1", "express": "4.17.1", "mocha": "^8.4.0", - "mongodb": "^3.6.0", + "mongodb": "^4.11.0", "request": "^2.88.2", "sandboxed-module": "^2.0.4", "sinon": "^9.2.4", @@ -46050,6 +46110,23 @@ "type-is": "~1.6.17" } }, + "bson": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -46081,6 +46158,11 @@ "ms": "2.0.0" } }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -46140,6 +46222,19 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, + "mongodb": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.11.0.tgz", + "integrity": "sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg==", + "requires": { + "@aws-sdk/credential-providers": "^3.186.0", + "bson": "^4.7.0", + "denque": "^2.1.0", + "mongodb-connection-string-url": "^2.5.4", + "saslprep": "^1.0.3", + "socks": "^2.7.1" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", diff --git a/services/chat/app.js b/services/chat/app.js index d0f1a6dba4..80e58a7a8f 100644 --- a/services/chat/app.js +++ b/services/chat/app.js @@ -1,15 +1,15 @@ const logger = require('@overleaf/logger') const settings = require('@overleaf/settings') -const mongodb = require('./app/js/mongodb') +const { mongoClient } = require('./app/js/mongodb') const Server = require('./app/js/server') if (!module.parent) { // Called directly const port = settings.internal.chat.port const host = settings.internal.chat.host - mongodb - .waitForDb() + mongoClient + .connect() .then(() => { Server.server.listen(port, host, function (err) { if (err) { diff --git a/services/chat/app/js/mongodb.js b/services/chat/app/js/mongodb.js index 1f68518df0..7ba98f40c2 100644 --- a/services/chat/app/js/mongodb.js +++ b/services/chat/app/js/mongodb.js @@ -1,29 +1,16 @@ const Settings = require('@overleaf/settings') const { MongoClient, ObjectId } = require('mongodb') -const clientPromise = MongoClient.connect( - Settings.mongo.url, - Settings.mongo.options -) +const client = new MongoClient(Settings.mongo.url) +const db = client.db() -let setupDbPromise -async function waitForDb() { - if (!setupDbPromise) { - setupDbPromise = setupDb() - } - await setupDbPromise -} - -const db = {} -async function setupDb() { - const internalDb = (await clientPromise).db() - - db.messages = internalDb.collection('messages') - db.rooms = internalDb.collection('rooms') +const collections = { + messages: db.collection('messages'), + rooms: db.collection('rooms'), } module.exports = { - db, + db: collections, + mongoClient: client, ObjectId, - waitForDb, } diff --git a/services/chat/config/settings.defaults.js b/services/chat/config/settings.defaults.js index 553e9ea7fa..43371e5aab 100644 --- a/services/chat/config/settings.defaults.js +++ b/services/chat/config/settings.defaults.js @@ -17,10 +17,6 @@ module.exports = { }, mongo: { - options: { - useUnifiedTopology: - (process.env.MONGO_USE_UNIFIED_TOPOLOGY || 'true') === 'true', - }, url: process.env.MONGO_CONNECTION_STRING || `mongodb://${process.env.MONGO_HOST || 'localhost'}/sharelatex`, diff --git a/services/chat/package.json b/services/chat/package.json index 75bab237fa..5131c328b1 100644 --- a/services/chat/package.json +++ b/services/chat/package.json @@ -22,7 +22,7 @@ "async": "^3.2.2", "body-parser": "^1.19.0", "express": "4.17.1", - "mongodb": "^3.6.0" + "mongodb": "^4.11.0" }, "devDependencies": { "acorn": "^7.1.1", diff --git a/services/chat/test/acceptance/js/helpers/ChatApp.js b/services/chat/test/acceptance/js/helpers/ChatApp.js index dde9648533..163dc0db02 100644 --- a/services/chat/test/acceptance/js/helpers/ChatApp.js +++ b/services/chat/test/acceptance/js/helpers/ChatApp.js @@ -1,18 +1,14 @@ -const { db, waitForDb } = require('../../../../app/js/mongodb') +const { db } = require('../../../../app/js/mongodb') const app = require('../../../../app') let serverPromise = null function startServer(resolve, reject) { - waitForDb() - .then(() => { - app.listen(3010, 'localhost', error => { - if (error) { - return reject(error) - } - resolve() - }) - }) - .catch(reject) + app.listen(3010, 'localhost', error => { + if (error) { + return reject(error) + } + resolve() + }) } async function ensureRunning() {