check-mongodb.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const { ObjectId } = require('mongodb-legacy')
  2. const {
  3. connectionPromise,
  4. db,
  5. } = require('../../../app/src/infrastructure/mongodb')
  6. const { getMongoClient } = require('../../../app/src/infrastructure/Mongoose')
  7. const MIN_MONGO_VERSION = [5, 0]
  8. async function main() {
  9. try {
  10. await connectionPromise
  11. } catch (err) {
  12. console.error('Cannot connect to mongodb')
  13. throw err
  14. }
  15. await checkMongoVersion()
  16. try {
  17. await testTransactions()
  18. } catch (err) {
  19. console.error("Mongo instance doesn't support transactions")
  20. throw err
  21. }
  22. }
  23. async function testTransactions() {
  24. const mongoClient = await getMongoClient()
  25. const session = mongoClient.startSession()
  26. try {
  27. await session.withTransaction(async () => {
  28. await db.users.findOne({ _id: new ObjectId() }, { session })
  29. })
  30. } finally {
  31. await session.endSession()
  32. }
  33. }
  34. async function checkMongoVersion() {
  35. const mongoClient = await getMongoClient()
  36. const buildInfo = await mongoClient.db().admin().buildInfo()
  37. const [major, minor] = buildInfo.versionArray
  38. const [minMajor, minMinor] = MIN_MONGO_VERSION
  39. if (major < minMajor || (major === minMajor && minor < minMinor)) {
  40. const version = buildInfo.version
  41. const minVersion = MIN_MONGO_VERSION.join('.')
  42. console.error(
  43. `The MongoDB server has version ${version}, but Overleaf requires at least version ${minVersion}. Aborting.`
  44. )
  45. process.exit(1)
  46. }
  47. }
  48. main()
  49. .then(() => {
  50. console.error('Mongodb is up.')
  51. process.exit(0)
  52. })
  53. .catch(err => {
  54. console.error(err)
  55. process.exit(1)
  56. })