From f6a8ceb0aa84a50a7aed14cd4d4d847a1b8e3f72 Mon Sep 17 00:00:00 2001 From: Matt Broadstone Date: Mon, 24 Feb 2020 11:55:17 -0500 Subject: [PATCH] refactor: use `maybePromise` for all `MongoClient` fake operations --- lib/core/utils.js | 5 +++- lib/mongo_client.js | 58 ++++++++++++++++++++++++++++++++------- lib/operations/close.js | 50 --------------------------------- lib/operations/connect.js | 27 +----------------- 4 files changed, 53 insertions(+), 87 deletions(-) delete mode 100644 lib/operations/close.js diff --git a/lib/core/utils.js b/lib/core/utils.js index d9f487db01e..ab778bf8db2 100644 --- a/lib/core/utils.js +++ b/lib/core/utils.js @@ -255,6 +255,8 @@ function makeClientMetadata(options) { return metadata; } +const noop = () => {}; + module.exports = { uuidV4, calculateDurationInMs, @@ -270,5 +272,6 @@ module.exports = { tagsStrictEqual, errorStrictEqual, makeStateMachine, - makeClientMetadata + makeClientMetadata, + noop }; diff --git a/lib/mongo_client.js b/lib/mongo_client.js index 090682f163d..4a0d88c914d 100644 --- a/lib/mongo_client.js +++ b/lib/mongo_client.js @@ -3,17 +3,16 @@ const ChangeStream = require('./change_stream'); const Db = require('./db'); const EventEmitter = require('events').EventEmitter; -const executeOperation = require('./operations/execute_operation'); const inherits = require('util').inherits; const MongoError = require('./core').MongoError; const deprecate = require('util').deprecate; const WriteConcern = require('./write_concern'); const MongoDBNamespace = require('./utils').MongoDBNamespace; const ReadPreference = require('./core/topologies/read_preference'); - -// Operations -const ConnectOperation = require('./operations/connect'); -const CloseOperation = require('./operations/close'); +const maybePromise = require('./utils').maybePromise; +const NativeTopology = require('./topologies/native_topology'); +const connect = require('./operations/connect').connect; +const validOptions = require('./operations/connect').validOptions; /** * @fileOverview The **MongoClient** class is a class that allows for making Connections to MongoDB. @@ -214,9 +213,16 @@ MongoClient.prototype.connect = function(callback) { throw new TypeError('`connect` only accepts a callback'); } - const operation = new ConnectOperation(this); + const client = this; + return maybePromise(callback, cb => { + const err = validOptions(client.s.options); + if (err) return cb(err); - return executeOperation(this, operation, callback); + connect(client, client.s.url, client.s.options, err => { + if (err) return cb(err); + cb(null, client); + }); + }); }; MongoClient.prototype.logout = deprecate(function(options, callback) { @@ -232,9 +238,41 @@ MongoClient.prototype.logout = deprecate(function(options, callback) { * @return {Promise} returns Promise if no callback passed */ MongoClient.prototype.close = function(force, callback) { - if (typeof force === 'function') (callback = force), (force = false); - const operation = new CloseOperation(this, force); - return executeOperation(this, operation, callback); + if (typeof force === 'function') { + callback = force; + force = false; + } + + const client = this; + return maybePromise(callback, cb => { + const completeClose = err => { + client.emit('close', client); + + if (!(client.topology instanceof NativeTopology)) { + for (const item of client.s.dbCache) { + item[1].emit('close', client); + } + } + + client.removeAllListeners('close'); + cb(err); + }; + + if (client.topology == null) { + completeClose(); + return; + } + + client.topology.close(force, err => { + const autoEncrypter = client.topology.s.options.autoEncrypter; + if (!autoEncrypter) { + completeClose(err); + return; + } + + autoEncrypter.teardown(force, err2 => completeClose(err || err2)); + }); + }); }; /** diff --git a/lib/operations/close.js b/lib/operations/close.js deleted file mode 100644 index 1c59d111347..00000000000 --- a/lib/operations/close.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -const Aspect = require('./operation').Aspect; -const defineAspects = require('./operation').defineAspects; -const OperationBase = require('./operation').OperationBase; -const NativeTopology = require('../topologies/native_topology'); - -class CloseOperation extends OperationBase { - constructor(client, force) { - super(); - this.client = client; - this.force = force; - } - - execute(callback) { - const client = this.client; - const force = this.force; - const completeClose = err => { - client.emit('close', client); - - if (!(client.topology instanceof NativeTopology)) { - for (const item of client.s.dbCache) { - item[1].emit('close', client); - } - } - - client.removeAllListeners('close'); - callback(err, null); - }; - - if (client.topology == null) { - completeClose(); - return; - } - - client.topology.close(force, err => { - const autoEncrypter = client.topology.s.options.autoEncrypter; - if (!autoEncrypter) { - completeClose(err); - return; - } - - autoEncrypter.teardown(force, err2 => completeClose(err || err2)); - }); - } -} - -defineAspects(CloseOperation, [Aspect.SKIP_SESSION]); - -module.exports = CloseOperation; diff --git a/lib/operations/connect.js b/lib/operations/connect.js index 0ba93b5580f..bcdd3eb5b50 100644 --- a/lib/operations/connect.js +++ b/lib/operations/connect.js @@ -1,8 +1,5 @@ 'use strict'; -const OperationBase = require('./operation').OperationBase; -const defineAspects = require('./operation').defineAspects; -const Aspect = require('./operation').Aspect; const deprecate = require('util').deprecate; const Logger = require('../core').Logger; const MongoCredentials = require('../core').MongoCredentials; @@ -191,28 +188,6 @@ const LEGACY_OPTIONS_MAP = validOptionNames.reduce((obj, name) => { return obj; }, {}); -class ConnectOperation extends OperationBase { - constructor(mongoClient) { - super(); - - this.mongoClient = mongoClient; - } - - execute(callback) { - const mongoClient = this.mongoClient; - const err = validOptions(mongoClient.s.options); - - // Did we have a validation error - if (err) return callback(err); - // Fallback to callback based connect - connect(mongoClient, mongoClient.s.url, mongoClient.s.options, err => { - if (err) return callback(err); - callback(null, mongoClient); - }); - } -} -defineAspects(ConnectOperation, [Aspect.SKIP_SESSION]); - function addListeners(mongoClient, topology) { topology.on('authenticated', createListener(mongoClient, 'authenticated')); topology.on('error', createListener(mongoClient, 'error')); @@ -820,4 +795,4 @@ function translateOptions(options, translationOptions) { }); } -module.exports = ConnectOperation; +module.exports = { validOptions, connect };