diff --git a/lib/server.js b/lib/server.js index 11e6557..3e049df 100644 --- a/lib/server.js +++ b/lib/server.js @@ -237,7 +237,7 @@ function MongolianServer(mongolian, url) { connected = true callback(null, connection) }) - connection.on("message", function(message) { + connection.on('message', function(message) { var reply = new mongo.MongoReply reply.parseHeader(message, bsonSerializer) if (reply.messageLength != message.length) { @@ -249,11 +249,18 @@ function MongolianServer(mongolian, url) { delete self._callbacks[reply.responseTo] self._callbackCount-- reply.parseBody(message, bsonSerializer, null, function() { - cb(null,reply) + try { + cb(null,reply) + } catch(err) { + connection.emit('callbackError', err) + } }) } } }) + connection.on('callbackError', function(error) { + mongolian.log.error(self+": CallbackError: "+error.stack) + }) connection.start() }) @@ -282,18 +289,37 @@ MongolianServer.prototype.toString = function() { /** * Closes the current connection, passing the optional error object to any pending request callbacks. */ -MongolianServer.prototype.close = function(error) { - error = error || new Error("Connection closed") - if (this._connection.value) { - var callbacks = this._callbacks - this._callbacks = {} - this._callbackCount = 0 - this._connection.value.close() - this._connection.reset() - delete this._type - for (var requestId in callbacks) { - callbacks[requestId](error) - } - this.mongolian._replicaSet.emit('lost', this) +MongolianServer.prototype.close = function(error, callback) { + var self = this + + // function: error all callbacks + var _error_callbacks = function() { + error = error || new Error("Connection closed") + var callbacks = self._callbacks + self._callbacks = {} + self._callbackCount = 0 + for (var requestId in callbacks) { + callbacks[requestId](error) + } } + + // error some callbacks immediately + _error_callbacks() + + // close the connection when it becomes available + self._connection(function(err, connection) { + delete self._type + self.mongolian._replicaSet.emit('lost', self) + + // error any new callbacks + _error_callbacks() + + if (connection) { + connection.close() + } + + if (callback) { + callback(err) + } + }) }