module.exports = function (debugMode = false) { const debug = require('debug')('agm:db'), mongoose = require('mongoose'), env = require('../env'), utils = require('../utils'); // Our custom middleware mongoose.Promise = global.Promise; // Disable Promise depreciated warning const ops = { connectTimeoutMS: 40000, // TCP Connection timeout setting. Best = 2-3X time of longest operation (30 minutes) socketTimeoutMS: 30 * 60 * 1000, // The number of milliseconds to wait before initiating keepAlive on the TCP socket. keepAlive: true, keepAliveInitialDelay: 30000, // Auto creation of indexes set to false for DEBUG and true only for dev for better performace in Production invironment autoIndex: !(env.PRODUCTION), maxPoolSize: env.DB_MAX_POOLSIZE, // Default 100 from MDB 5.0.x family: 4, } let _uri = `@${env.DB_HOSTS}/${env.DB_NAME}`; if (env.DB_HOSTS && !env.DB_HOSTS.includes(',')) { ops.directConnection = true; } if (env.DB_REPLSET) ops.replicaSet = env.DB_REPLSET if (env.DB_USE_TLS) { ops.tls = true; ops.sslValidate = true; ops.tlsCAFile = env.DB_TLS_CA_FILE; ops.tlsCertificateKeyFile = env.DB_TLS_CERT_FILE; } if (env.DB_USE_X509) { ops.authMechanism = 'MONGODB-X509'; _uri = `mongodb://${encodeURIComponent(env.DB_USR)}` + _uri; } else { _uri = `mongodb://${env.DB_USR}:${env.DB_PWD}` + _uri; ops.authSource = env.DB_AUTH_SOURCE || env.DB_NAME ops.authMechanism = 'SCRAM-SHA-1' } mongoose.set('strictQuery', false); mongoose.set('strictPopulate', false); mongoose.set('bufferCommands', false); // Disable buffering globally mongoose.connect(_uri, ops); mongoose.connection.on('disconnected', () => { debug('-> MongoDB lost/closed connection'); }); mongoose.connection.on('reconnect', () => { debug('-> MongoDB reconnected'); }); mongoose.connection.on('connected', () => { debug('-> MongoDB connected'); }); mongoose.connection.on('open', () => { debug('-> MongoDB open'); }); mongoose.connection.on('reconnectFailed', () => { debug('-> MongoDB gave up reconnecting'); }); mongoose.connection.on('error', console.error.bind(console, 'MongoDB connection errors:')); if (debugMode) mongoose.set('debug', true); function postExit() { if (mongoose.connection) { mongoose.connection.close(() => { debug('Mongoose default connection disconnected through app termination'); process.exit(0); }); } else { process.exit(0); } } // If the Node process ends, close the Mongoose connection process.on('SIGINT', function () { // Windows postExit(); }); return mongoose.connection; }