Skip to content

Commit

Permalink
fix(utils): fixes executeOperation to clean up sessions
Browse files Browse the repository at this point in the history
Makes sure that, if an error is thrown before the async part
of executeOperation, the implicit session is cleaned up

Fixes NODE-1335
  • Loading branch information
daprahamian committed Feb 27, 2018
1 parent ac0dec7 commit 04e6ef6
Showing 1 changed file with 32 additions and 25 deletions.
57 changes: 32 additions & 25 deletions lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -390,23 +390,37 @@ const executeOperation = (topology, operation, args, options) => {
}
}

// Execute using callback
if (typeof callback === 'function') {
callback = args.pop();
args.push((err, result) => {
const makeExecuteCallback = (resolve, reject) =>
function executeCallback(err, result) {
if (session && !options.returnsCursor) {
session.endSession(() => {
delete opOptions.session;
if (err) return callback(err, null);
return resultMutator ? callback(null, resultMutator(result)) : callback(null, result);
if (err) return reject(err);
if (resultMutator) return resolve(resultMutator(result));
resolve(result);
});
} else {
if (err) return callback(err, null);
return resultMutator ? callback(null, resultMutator(result)) : callback(null, result);
if (err) return reject(err);
if (resultMutator) return resolve(resultMutator(result));
resolve(result);
}
});
};

return operation.apply(null, args);
// Execute using callback
if (typeof callback === 'function') {
callback = args.pop();
const handler = makeExecuteCallback(
result => callback(null, result),
err => callback(err, null)
);
args.push(handler);

try {
return operation.apply(null, args);
} catch (e) {
handler(e);
throw e;
}
}

// Return a Promise
Expand All @@ -415,22 +429,15 @@ const executeOperation = (topology, operation, args, options) => {
}

return new Promise(function(resolve, reject) {
args[args.length - 1] = (err, r) => {
if (session && !options.returnsCursor) {
session.endSession(() => {
delete opOptions.session;
if (err) return reject(err);
if (resultMutator) return resolve(resultMutator(r));
resolve(r);
});
} else {
if (err) return reject(err);
if (resultMutator) return resolve(resultMutator(r));
resolve(r);
}
};
const handler = makeExecuteCallback(resolve, reject);
args[args.length - 1] = handler;

operation.apply(null, args);
try {
return operation.apply(null, args);
} catch (e) {
handler(e);
throw e;
}
});
};

Expand Down

0 comments on commit 04e6ef6

Please sign in to comment.