mongodb 2.1.0-alpha → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/HISTORY.md +574 -429
  2. package/Makefile +2 -5
  3. package/README.md +108 -15
  4. package/conf.json +17 -13
  5. package/index.js +13 -2
  6. package/lib/admin.js +113 -47
  7. package/lib/aggregation_cursor.js +56 -28
  8. package/lib/apm.js +608 -0
  9. package/lib/bulk/common.js +7 -7
  10. package/lib/bulk/ordered.js +56 -17
  11. package/lib/bulk/unordered.js +52 -14
  12. package/lib/collection.js +671 -212
  13. package/lib/command_cursor.js +60 -32
  14. package/lib/cursor.js +313 -115
  15. package/lib/db.js +264 -105
  16. package/lib/gridfs/chunk.js +26 -29
  17. package/lib/gridfs/grid_store.js +150 -64
  18. package/lib/gridfs-stream/download.js +310 -0
  19. package/lib/gridfs-stream/index.js +335 -0
  20. package/lib/gridfs-stream/upload.js +450 -0
  21. package/lib/metadata.js +64 -0
  22. package/lib/mongo_client.js +69 -39
  23. package/lib/mongos.js +65 -20
  24. package/lib/replset.js +69 -34
  25. package/lib/server.js +35 -1
  26. package/lib/topology_base.js +22 -10
  27. package/lib/url_parser.js +111 -13
  28. package/lib/utils.js +9 -8
  29. package/mongolabs.js +427 -0
  30. package/package.json +8 -6
  31. package/t.js +68 -51
  32. package/test.js +12 -0
  33. package/test_boot/boot.sh +3 -0
  34. package/test_boot/ca.pem +49 -0
  35. package/test_boot/client.pem +48 -0
  36. package/test_boot/client_password.pem +51 -0
  37. package/test_boot/connect.js +29 -0
  38. package/test_boot/data/WiredTiger +2 -0
  39. package/test_boot/data/WiredTiger.lock +1 -0
  40. package/test_boot/data/WiredTiger.turtle +6 -0
  41. package/test_boot/data/WiredTiger.wt +0 -0
  42. package/test_boot/data/WiredTigerLAS.wt +0 -0
  43. package/test_boot/data/_mdb_catalog.wt +0 -0
  44. package/test_boot/data/collection-0-757073248613337118.wt +0 -0
  45. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-44-37Z-00000 +0 -0
  46. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-45-15Z-00000 +0 -0
  47. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-46-31Z-00000 +0 -0
  48. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-47-25Z-00000 +0 -0
  49. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-49-07Z-00000 +0 -0
  50. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-50-41Z-00000 +0 -0
  51. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-50-53Z-00000 +0 -0
  52. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-52-31Z-00000 +0 -0
  53. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-54-53Z-00000 +0 -0
  54. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-55-09Z-00000 +0 -0
  55. package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-55-38Z-00000 +0 -0
  56. package/test_boot/data/index-1-757073248613337118.wt +0 -0
  57. package/test_boot/data/mongod.lock +0 -0
  58. package/test_boot/data/sizeStorer.wt +0 -0
  59. package/test_boot/data/storage.bson +0 -0
  60. package/test_boot/server_password.pem +51 -0
  61. package/.travis.yml +0 -10
  62. package/t1.js +0 -59
  63. package/wercker.yml +0 -19
@@ -4,12 +4,13 @@ var parse = require('./url_parser')
4
4
  , Server = require('./server')
5
5
  , Mongos = require('./mongos')
6
6
  , ReplSet = require('./replset')
7
+ , Define = require('./metadata')
7
8
  , ReadPreference = require('./read_preference')
8
9
  , Db = require('./db');
9
10
 
10
11
  /**
11
12
  * @fileOverview The **MongoClient** class is a class that allows for making Connections to MongoDB.
12
- *
13
+ *
13
14
  * @example
14
15
  * var MongoClient = require('mongodb').MongoClient,
15
16
  * test = require('assert');
@@ -51,12 +52,14 @@ function MongoClient() {
51
52
  * @param {object} [options.replSet=null] A hash of options to set on the replSet object, see **ReplSet** constructor**
52
53
  * @param {object} [options.mongos=null] A hash of options to set on the mongos object, see **Mongos** constructor**
53
54
  * @param {object} [options.promiseLibrary=null] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible
54
- * @param {MongoClient~connectCallback} callback The command result callback
55
+ * @param {MongoClient~connectCallback} [callback] The command result callback
55
56
  * @return {Promise} returns Promise if no callback passed
56
- */
57
+ */
57
58
  this.connect = MongoClient.connect;
58
59
  }
59
60
 
61
+ var define = MongoClient.define = new Define('MongoClient', MongoClient, false);
62
+
60
63
  /**
61
64
  * Connect to MongoDB using a url as documented at
62
65
  *
@@ -74,9 +77,9 @@ function MongoClient() {
74
77
  * @param {object} [options.replSet=null] A hash of options to set on the replSet object, see **ReplSet** constructor**
75
78
  * @param {object} [options.mongos=null] A hash of options to set on the mongos object, see **Mongos** constructor**
76
79
  * @param {object} [options.promiseLibrary=null] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible
77
- * @param {MongoClient~connectCallback} callback The command result callback
80
+ * @param {MongoClient~connectCallback} [callback] The command result callback
78
81
  * @return {Promise} returns Promise if no callback passed
79
- */
82
+ */
80
83
  MongoClient.connect = function(url, options, callback) {
81
84
  var args = Array.prototype.slice.call(arguments, 1);
82
85
  callback = typeof args[args.length - 1] == 'function' ? args.pop() : null;
@@ -106,15 +109,16 @@ MongoClient.connect = function(url, options, callback) {
106
109
  connect(url, options, callback);
107
110
  }
108
111
 
112
+ define.staticMethod('connect', {callback: true, promise:true});
113
+
109
114
  var connect = function(url, options, callback) {
110
- // Set default empty server options
111
115
  var serverOptions = options.server || {};
112
116
  var mongosOptions = options.mongos || {};
113
117
  var replSetServersOptions = options.replSet || options.replSetServers || {};
114
118
  var dbOptions = options.db || {};
115
119
 
116
120
  // If callback is null throw an exception
117
- if(callback == null)
121
+ if(callback == null)
118
122
  throw new Error("no callback function provided");
119
123
 
120
124
  // Parse the string
@@ -135,17 +139,19 @@ var connect = function(url, options, callback) {
135
139
 
136
140
  // Merge in any replicaset server options
137
141
  if(replSetServersOptions) {
138
- for(var name in replSetServersOptions) object.rs_options[name] = replSetServersOptions[name];
142
+ for(var name in replSetServersOptions) object.rs_options[name] = replSetServersOptions[name];
139
143
  }
140
144
 
141
- if(replSetServersOptions.ssl
145
+ if(replSetServersOptions.ssl
142
146
  || replSetServersOptions.sslValidate
147
+ || replSetServersOptions.checkServerIdentity
143
148
  || replSetServersOptions.sslCA
144
149
  || replSetServersOptions.sslCert
145
150
  || replSetServersOptions.sslKey
146
151
  || replSetServersOptions.sslPass) {
147
152
  object.server_options.ssl = replSetServersOptions.ssl;
148
153
  object.server_options.sslValidate = replSetServersOptions.sslValidate;
154
+ object.server_options.checkServerIdentity = replSetServersOptions.checkServerIdentity;
149
155
  object.server_options.sslCA = replSetServersOptions.sslCA;
150
156
  object.server_options.sslCert = replSetServersOptions.sslCert;
151
157
  object.server_options.sslKey = replSetServersOptions.sslKey;
@@ -154,7 +160,7 @@ var connect = function(url, options, callback) {
154
160
 
155
161
  // Merge in any replicaset server options
156
162
  if(mongosOptions) {
157
- for(var name in mongosOptions) object.mongos_options[name] = mongosOptions[name];
163
+ for(var name in mongosOptions) object.mongos_options[name] = mongosOptions[name];
158
164
  }
159
165
 
160
166
  if(typeof object.server_options.poolSize == 'number') {
@@ -162,14 +168,16 @@ var connect = function(url, options, callback) {
162
168
  if(!object.rs_options.poolSize) object.rs_options.poolSize = object.server_options.poolSize;
163
169
  }
164
170
 
165
- if(mongosOptions.ssl
171
+ if(mongosOptions.ssl
166
172
  || mongosOptions.sslValidate
173
+ || mongosOptions.checkServerIdentity
167
174
  || mongosOptions.sslCA
168
175
  || mongosOptions.sslCert
169
176
  || mongosOptions.sslKey
170
177
  || mongosOptions.sslPass) {
171
178
  object.server_options.ssl = mongosOptions.ssl;
172
179
  object.server_options.sslValidate = mongosOptions.sslValidate;
180
+ object.server_options.checkServerIdentity = mongosOptions.checkServerIdentity;
173
181
  object.server_options.sslCA = mongosOptions.sslCA;
174
182
  object.server_options.sslCert = mongosOptions.sslCert;
175
183
  object.server_options.sslKey = mongosOptions.sslKey;
@@ -207,8 +215,8 @@ var connect = function(url, options, callback) {
207
215
  var _server_options = {
208
216
  poolSize:1
209
217
  , socketOptions: {
210
- connectTimeoutMS: providedSocketOptions.connectTimeoutMS || 30000
211
- , socketTimeoutMS: providedSocketOptions.socketTimeoutMS || 30000
218
+ connectTimeoutMS: providedSocketOptions.connectTimeoutMS || (1000 * 120)
219
+ , socketTimeoutMS: providedSocketOptions.socketTimeoutMS || (1000 * 120)
212
220
  }
213
221
  , auto_reconnect:false};
214
222
 
@@ -216,6 +224,7 @@ var connect = function(url, options, callback) {
216
224
  if(object.server_options.ssl) {
217
225
  _server_options.ssl = object.server_options.ssl;
218
226
  _server_options.sslValidate = object.server_options.sslValidate;
227
+ _server_options.checkServerIdentity = object.server_options.checkServerIdentity;
219
228
  _server_options.sslCA = object.server_options.sslCA;
220
229
  _server_options.sslCert = object.server_options.sslCert;
221
230
  _server_options.sslKey = object.server_options.sslKey;
@@ -223,6 +232,7 @@ var connect = function(url, options, callback) {
223
232
  } else if(object.rs_options.ssl) {
224
233
  _server_options.ssl = object.rs_options.ssl;
225
234
  _server_options.sslValidate = object.rs_options.sslValidate;
235
+ _server_options.checkServerIdentity = object.rs_options.checkServerIdentity;
226
236
  _server_options.sslCA = object.rs_options.sslCA;
227
237
  _server_options.sslCert = object.rs_options.sslCert;
228
238
  _server_options.sslKey = object.rs_options.sslKey;
@@ -232,27 +242,28 @@ var connect = function(url, options, callback) {
232
242
  // Error
233
243
  var error = null;
234
244
  // Set up the Server object
235
- var _server = object.servers[i].domain_socket
245
+ var _server = object.servers[i].domain_socket
236
246
  ? new Server(object.servers[i].domain_socket, _server_options)
237
247
  : new Server(object.servers[i].host, object.servers[i].port, _server_options);
238
-
239
- var setName;
240
248
 
241
- var connectFunction = function(__server) {
249
+ var connectFunction = function(__server) {
242
250
  // Attempt connect
243
- new Db(object.dbName, __server, {w:1, native_parser:false}).open(function(err, db) {
251
+ new Db(object.dbName, __server, {w:1, native_parser:false, promiseLibrary:options.promiseLibrary}).open(function(err, db) {
244
252
  // Update number of servers
245
- totalNumberOfServers = totalNumberOfServers - 1;
253
+ totalNumberOfServers = totalNumberOfServers - 1;
254
+
246
255
  // If no error do the correct checks
247
256
  if(!err) {
248
257
  // Close the connection
249
258
  db.close();
259
+ // Get the last ismaster document
250
260
  var isMasterDoc = db.serverConfig.isMasterDoc;
261
+
251
262
  // Check what type of server we have
252
263
  if(isMasterDoc.setName) {
253
264
  totalNumberOfMongodServers++;
254
- setName = isMasterDoc.setName;
255
265
  }
266
+
256
267
  if(isMasterDoc.msg && isMasterDoc.msg == "isdbgrid") totalNumberOfMongosServers++;
257
268
  } else {
258
269
  error = err;
@@ -273,39 +284,58 @@ var connect = function(url, options, callback) {
273
284
  callback(new Error("cannot combine a list of replicaset seeds and mongos seeds"));
274
285
  } catch (err) {
275
286
  throw err
276
- }
287
+ }
277
288
  })
278
289
  }
279
-
280
- if(totalNumberOfMongodServers == 0
281
- && totalNumberOfMongosServers == 0
282
- && object.servers.length == 1) {
290
+
291
+ if(totalNumberOfMongodServers == 0
292
+ && totalNumberOfMongosServers == 0
293
+ && object.servers.length == 1
294
+ && (!object.rs_options.replicaSet || !object.rs_options.rs_name)) {
295
+
283
296
  var obj = object.servers[0];
284
- serverConfig = obj.domain_socket ?
297
+ serverConfig = obj.domain_socket ?
285
298
  new Server(obj.domain_socket, object.server_options)
286
- : new Server(obj.host, obj.port, object.server_options);
287
- } else if(totalNumberOfMongodServers > 0 || totalNumberOfMongosServers > 0) {
299
+ : new Server(obj.host, obj.port, object.server_options);
300
+
301
+ } else if(totalNumberOfMongodServers > 0
302
+ || totalNumberOfMongosServers > 0
303
+ || object.rs_options.replicaSet || object.rs_options.rs_name) {
304
+
288
305
  var finalServers = object.servers
289
306
  .filter(function(serverObj) {
290
307
  return errorServers[serverObj.host + ":" + serverObj.port] == null;
291
308
  })
292
309
  .map(function(serverObj) {
293
- return new Server(serverObj.host, serverObj.port, object.server_options);
310
+ return serverObj.domain_socket ?
311
+ new Server(serverObj.domain_socket, 27017, object.server_options)
312
+ : new Server(serverObj.host, serverObj.port, object.server_options);
294
313
  });
314
+
295
315
  // Clean out any error servers
296
316
  errorServers = {};
317
+
297
318
  // Set up the final configuration
298
319
  if(totalNumberOfMongodServers > 0) {
299
320
  try {
300
- if (totalNumberOfMongodServers == 1) {
301
- object.rs_options.replicaSet = object.rs_options.replicaSet || setName;
321
+
322
+ // If no replicaset name was provided, we wish to perform a
323
+ // direct connection
324
+ if(totalNumberOfMongodServers == 1
325
+ && (!object.rs_options.replicaSet && !object.rs_options.rs_name)) {
326
+ serverConfig = finalServers[0];
327
+ } else if(totalNumberOfMongodServers == 1) {
328
+ object.rs_options.replicaSet = object.rs_options.replicaSet || object.rs_options.rs_name;
329
+ serverConfig = new ReplSet(finalServers, object.rs_options);
330
+ } else {
331
+ serverConfig = new ReplSet(finalServers, object.rs_options);
302
332
  }
303
- serverConfig = new ReplSet(finalServers, object.rs_options);
333
+
304
334
  } catch(err) {
305
335
  return callback(err, null);
306
336
  }
307
337
  } else {
308
- serverConfig = new Mongos(finalServers, object.mongos_options);
338
+ serverConfig = new Mongos(finalServers, object.mongos_options);
309
339
  }
310
340
  }
311
341
 
@@ -325,12 +355,12 @@ var connect = function(url, options, callback) {
325
355
  // Set up all options etc and connect to the database
326
356
  _finishConnecting(serverConfig, object, options, callback)
327
357
  }
328
- });
358
+ });
329
359
  }
330
360
 
331
361
  // Wrap the context of the call
332
- connectFunction(_server);
333
- }
362
+ connectFunction(_server);
363
+ }
334
364
  }
335
365
 
336
366
  var _setNativeParser = function(db_options) {
@@ -374,7 +404,7 @@ var _finishConnecting = function(serverConfig, object, options, callback) {
374
404
  // Set up the db options
375
405
  var db = new Db(object.dbName, serverConfig, object.db_options);
376
406
  // Open the db
377
- db.open(function(err, db){
407
+ db.open(function(err, db){
378
408
 
379
409
  if(err) {
380
410
  return process.nextTick(function() {
@@ -408,7 +438,7 @@ var _finishConnecting = function(serverConfig, object, options, callback) {
408
438
  if(success){
409
439
  process.nextTick(function() {
410
440
  try {
411
- callback(null, db);
441
+ callback(null, db);
412
442
  } catch (err) {
413
443
  if(db) db.close();
414
444
  throw err
@@ -429,7 +459,7 @@ var _finishConnecting = function(serverConfig, object, options, callback) {
429
459
  } else {
430
460
  process.nextTick(function() {
431
461
  try {
432
- callback(err, db);
462
+ callback(err, db);
433
463
  } catch (err) {
434
464
  if(db) db.close();
435
465
  throw err
package/lib/mongos.js CHANGED
@@ -5,8 +5,12 @@ var EventEmitter = require('events').EventEmitter
5
5
  , f = require('util').format
6
6
  , ServerCapabilities = require('./topology_base').ServerCapabilities
7
7
  , MongoCR = require('mongodb-core').MongoCR
8
+ , MongoError = require('mongodb-core').MongoError
8
9
  , CMongos = require('mongodb-core').Mongos
9
10
  , Cursor = require('./cursor')
11
+ , AggregationCursor = require('./aggregation_cursor')
12
+ , CommandCursor = require('./command_cursor')
13
+ , Define = require('./metadata')
10
14
  , Server = require('./server')
11
15
  , Store = require('./topology_base').Store
12
16
  , shallowClone = require('./utils').shallowClone;
@@ -14,7 +18,7 @@ var EventEmitter = require('events').EventEmitter
14
18
  /**
15
19
  * @fileOverview The **Mongos** class is a class that represents a Mongos Proxy topology and is
16
20
  * used to construct connections.
17
- *
21
+ *
18
22
  * **Mongos Should not be used, use MongoClient.connect**
19
23
  * @example
20
24
  * var Db = require('mongodb').Db,
@@ -39,17 +43,18 @@ var EventEmitter = require('events').EventEmitter
39
43
  * @param {booelan} [options.ha=true] Turn on high availability monitoring.
40
44
  * @param {number} [options.haInterval=5000] Time between each replicaset status check.
41
45
  * @param {number} [options.poolSize=5] Number of connections in the connection pool for each server instance, set to 5 as default for legacy reasons.
42
- * @param {boolean} [options.ssl=false] Use ssl connection (needs to have a mongod server with ssl support)
46
+ * @param {boolean} [options.ssl=false] Use ssl connection (needs to have a mongod server with ssl support)
47
+ * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function.
43
48
  * @param {object} [options.sslValidate=true] Validate mongod server certificate against ca (needs to have a mongod server with ssl support, 2.4 or higher)
44
49
  * @param {array} [options.sslCA=null] Array of valid certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher)
45
50
  * @param {(Buffer|string)} [options.sslCert=null] String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher)
46
51
  * @param {(Buffer|string)} [options.sslKey=null] String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher)
47
52
  * @param {(Buffer|string)} [options.sslPass=null] String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher)
48
- * @param {object} [options.socketOptions=null] Socket options
49
- * @param {boolean} [options.socketOptions.noDelay=true] TCP Socket NoDelay option.
50
- * @param {number} [options.socketOptions.keepAlive=0] TCP KeepAlive on the socket with a X ms delay before start.
51
- * @param {number} [options.socketOptions.connectTimeoutMS=0] TCP Connection timeout setting
52
- * @param {number} [options.socketOptions.socketTimeoutMS=0] TCP Socket timeout setting
53
+ * @param {object} [options.socketOptions=null] Socket options
54
+ * @param {boolean} [options.socketOptions.noDelay=true] TCP Socket NoDelay option.
55
+ * @param {number} [options.socketOptions.keepAlive=0] TCP KeepAlive on the socket with a X ms delay before start.
56
+ * @param {number} [options.socketOptions.connectTimeoutMS=0] TCP Connection timeout setting
57
+ * @param {number} [options.socketOptions.socketTimeoutMS=0] TCP Socket timeout setting
53
58
  * @fires Mongos#connect
54
59
  * @fires Mongos#ha
55
60
  * @fires Mongos#joined
@@ -70,7 +75,7 @@ var Mongos = function(servers, options) {
70
75
  // Ensure all the instances are Server
71
76
  for(var i = 0; i < servers.length; i++) {
72
77
  if(!(servers[i] instanceof Server)) {
73
- throw new MongoError("all seed list instances must be of the Server type");
78
+ throw MongoError.create({message: "all seed list instances must be of the Server type", driver:true});
74
79
  }
75
80
  }
76
81
 
@@ -98,7 +103,7 @@ var Mongos = function(servers, options) {
98
103
  var finalOptions = shallowClone(options);
99
104
 
100
105
  // Default values
101
- finalOptions.size = typeof options.poolSize == 'number' ? options.poolSize : 5;
106
+ finalOptions.size = typeof options.poolSize == 'number' ? options.poolSize : 5;
102
107
  finalOptions.reconnect = typeof options.auto_reconnect == 'boolean' ? options.auto_reconnect : true;
103
108
  finalOptions.emitError = typeof options.emitError == 'boolean' ? options.emitError : true;
104
109
  finalOptions.cursorFactory = Cursor;
@@ -106,6 +111,14 @@ var Mongos = function(servers, options) {
106
111
  // Add the store
107
112
  finalOptions.disconnectHandler = store;
108
113
 
114
+ // Ensure we change the sslCA option to ca if available
115
+ if(options.sslCA) finalOptions.ca = options.sslCA;
116
+ if(typeof options.sslValidate == 'boolean') finalOptions.rejectUnauthorized = options.sslValidate;
117
+ if(options.sslKey) finalOptions.key = options.sslKey;
118
+ if(options.sslCert) finalOptions.cert = options.sslCert;
119
+ if(options.sslPass) finalOptions.passphrase = options.sslPass;
120
+ if(options.checkServerIdentity) finalOptions.checkServerIdentity = options.checkServerIdentity;
121
+
109
122
  // Socket options passed down
110
123
  if(options.socketOptions) {
111
124
  if(options.socketOptions.connectTimeoutMS) {
@@ -114,7 +127,7 @@ var Mongos = function(servers, options) {
114
127
  }
115
128
  if(options.socketOptions.socketTimeoutMS)
116
129
  finalOptions.socketTimeout = options.socketOptions.socketTimeoutMS;
117
- }
130
+ }
118
131
 
119
132
  // Are we running in debug mode
120
133
  var debug = typeof options.debug == 'boolean' ? options.debug : false;
@@ -185,13 +198,15 @@ var Mongos = function(servers, options) {
185
198
 
186
199
  // Last ismaster
187
200
  Object.defineProperty(this, 'numberOfConnectedServers', {
188
- enumerable:true, get: function() { return self.s.mongos.connectedServers().length; }
201
+ enumerable:true, get: function() {
202
+ return self.s.mongos.s.mongosState.connectedServers().length;
203
+ }
189
204
  });
190
205
 
191
206
  // BSON property
192
- Object.defineProperty(this, 'bson', {
193
- enumerable: true, get: function() {
194
- return self.s.mongos.bson;
207
+ Object.defineProperty(this, 'bson', {
208
+ enumerable: true, get: function() {
209
+ return self.s.mongos.bson;
195
210
  }
196
211
  });
197
212
 
@@ -205,6 +220,8 @@ var Mongos = function(servers, options) {
205
220
  */
206
221
  inherits(Mongos, EventEmitter);
207
222
 
223
+ var define = Mongos.define = new Define('Mongos', Mongos, false);
224
+
208
225
  // Connect
209
226
  Mongos.prototype.connect = function(db, _options, callback) {
210
227
  var self = this;
@@ -230,7 +247,7 @@ Mongos.prototype.connect = function(db, _options, callback) {
230
247
  // Try to callback
231
248
  try {
232
249
  callback(err);
233
- } catch(err) {
250
+ } catch(err) {
234
251
  process.nextTick(function() { throw err; })
235
252
  }
236
253
  }
@@ -276,14 +293,14 @@ Mongos.prototype.connect = function(db, _options, callback) {
276
293
  self.s.mongos.on('fullsetup', relay('fullsetup'));
277
294
 
278
295
  // Emit open event
279
- self.emit('open', null, self);
296
+ self.emit('open', null, self);
280
297
 
281
298
  // Return correctly
282
299
  try {
283
300
  callback(null, self);
284
- } catch(err) {
301
+ } catch(err) {
285
302
  process.nextTick(function() { throw err; })
286
- }
303
+ }
287
304
  }
288
305
 
289
306
  // Set up listeners
@@ -302,18 +319,25 @@ Mongos.prototype.parserType = function() {
302
319
  return this.s.mongos.parserType();
303
320
  }
304
321
 
322
+ define.classMethod('parserType', {callback: false, promise:false, returns: [String]});
323
+
305
324
  // Server capabilities
306
325
  Mongos.prototype.capabilities = function() {
307
326
  if(this.s.sCapabilities) return this.s.sCapabilities;
327
+ if(this.s.mongos.lastIsMaster() == null) return null;
308
328
  this.s.sCapabilities = new ServerCapabilities(this.s.mongos.lastIsMaster());
309
329
  return this.s.sCapabilities;
310
330
  }
311
331
 
332
+ define.classMethod('capabilities', {callback: false, promise:false, returns: [ServerCapabilities]});
333
+
312
334
  // Command
313
335
  Mongos.prototype.command = function(ns, cmd, options, callback) {
314
336
  this.s.mongos.command(ns, cmd, options, callback);
315
337
  }
316
338
 
339
+ define.classMethod('command', {callback: true, promise:false});
340
+
317
341
  // Insert
318
342
  Mongos.prototype.insert = function(ns, ops, options, callback) {
319
343
  this.s.mongos.insert(ns, ops, options, function(e, m) {
@@ -321,30 +345,45 @@ Mongos.prototype.insert = function(ns, ops, options, callback) {
321
345
  });
322
346
  }
323
347
 
348
+ define.classMethod('insert', {callback: true, promise:false});
349
+
324
350
  // Update
325
351
  Mongos.prototype.update = function(ns, ops, options, callback) {
326
352
  this.s.mongos.update(ns, ops, options, callback);
327
353
  }
328
354
 
355
+ define.classMethod('update', {callback: true, promise:false});
356
+
329
357
  // Remove
330
358
  Mongos.prototype.remove = function(ns, ops, options, callback) {
331
359
  this.s.mongos.remove(ns, ops, options, callback);
332
360
  }
333
361
 
362
+ define.classMethod('remove', {callback: true, promise:false});
363
+
364
+ // Destroyed
365
+ Mongos.prototype.isDestroyed = function() {
366
+ return this.s.mongos.isDestroyed();
367
+ }
368
+
334
369
  // IsConnected
335
370
  Mongos.prototype.isConnected = function() {
336
371
  return this.s.mongos.isConnected();
337
372
  }
338
373
 
374
+ define.classMethod('isConnected', {callback: false, promise:false, returns: [Boolean]});
375
+
339
376
  // Insert
340
377
  Mongos.prototype.cursor = function(ns, cmd, options) {
341
378
  options.disconnectHandler = this.s.store;
342
379
  return this.s.mongos.cursor(ns, cmd, options);
343
380
  }
344
381
 
382
+ define.classMethod('cursor', {callback: false, promise:false, returns: [Cursor, AggregationCursor, CommandCursor]});
383
+
345
384
  Mongos.prototype.setBSONParserType = function(type) {
346
385
  return this.s.mongos.setBSONParserType(type);
347
- }
386
+ }
348
387
 
349
388
  Mongos.prototype.lastIsMaster = function() {
350
389
  return this.s.mongos.lastIsMaster();
@@ -359,11 +398,15 @@ Mongos.prototype.close = function(forceClosed) {
359
398
  }
360
399
  }
361
400
 
401
+ define.classMethod('close', {callback: false, promise:false});
402
+
362
403
  Mongos.prototype.auth = function() {
363
404
  var args = Array.prototype.slice.call(arguments, 0);
364
405
  this.s.mongos.auth.apply(this.s.mongos, args);
365
406
  }
366
407
 
408
+ define.classMethod('auth', {callback: true, promise:false});
409
+
367
410
  /**
368
411
  * All raw connections
369
412
  * @method
@@ -371,7 +414,9 @@ Mongos.prototype.auth = function() {
371
414
  */
372
415
  Mongos.prototype.connections = function() {
373
416
  return this.s.mongos.connections();
374
- }
417
+ }
418
+
419
+ define.classMethod('connections', {callback: false, promise:false, returns:[Array]});
375
420
 
376
421
  /**
377
422
  * A mongos connect event, used to verify that the connection is up and running