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.
- package/HISTORY.md +574 -429
- package/Makefile +2 -5
- package/README.md +108 -15
- package/conf.json +17 -13
- package/index.js +13 -2
- package/lib/admin.js +113 -47
- package/lib/aggregation_cursor.js +56 -28
- package/lib/apm.js +608 -0
- package/lib/bulk/common.js +7 -7
- package/lib/bulk/ordered.js +56 -17
- package/lib/bulk/unordered.js +52 -14
- package/lib/collection.js +671 -212
- package/lib/command_cursor.js +60 -32
- package/lib/cursor.js +313 -115
- package/lib/db.js +264 -105
- package/lib/gridfs/chunk.js +26 -29
- package/lib/gridfs/grid_store.js +150 -64
- package/lib/gridfs-stream/download.js +310 -0
- package/lib/gridfs-stream/index.js +335 -0
- package/lib/gridfs-stream/upload.js +450 -0
- package/lib/metadata.js +64 -0
- package/lib/mongo_client.js +69 -39
- package/lib/mongos.js +65 -20
- package/lib/replset.js +69 -34
- package/lib/server.js +35 -1
- package/lib/topology_base.js +22 -10
- package/lib/url_parser.js +111 -13
- package/lib/utils.js +9 -8
- package/mongolabs.js +427 -0
- package/package.json +8 -6
- package/t.js +68 -51
- package/test.js +12 -0
- package/test_boot/boot.sh +3 -0
- package/test_boot/ca.pem +49 -0
- package/test_boot/client.pem +48 -0
- package/test_boot/client_password.pem +51 -0
- package/test_boot/connect.js +29 -0
- package/test_boot/data/WiredTiger +2 -0
- package/test_boot/data/WiredTiger.lock +1 -0
- package/test_boot/data/WiredTiger.turtle +6 -0
- package/test_boot/data/WiredTiger.wt +0 -0
- package/test_boot/data/WiredTigerLAS.wt +0 -0
- package/test_boot/data/_mdb_catalog.wt +0 -0
- package/test_boot/data/collection-0-757073248613337118.wt +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-44-37Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-45-15Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-46-31Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-47-25Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-49-07Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-50-41Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-50-53Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-52-31Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-54-53Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-55-09Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-55-38Z-00000 +0 -0
- package/test_boot/data/index-1-757073248613337118.wt +0 -0
- package/test_boot/data/mongod.lock +0 -0
- package/test_boot/data/sizeStorer.wt +0 -0
- package/test_boot/data/storage.bson +0 -0
- package/test_boot/server_password.pem +51 -0
- package/.travis.yml +0 -10
- package/t1.js +0 -59
- package/wercker.yml +0 -19
package/lib/mongo_client.js
CHANGED
|
@@ -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 ||
|
|
211
|
-
, socketTimeoutMS: providedSocketOptions.socketTimeoutMS ||
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
301
|
-
|
|
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
|
-
|
|
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
|
|
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() {
|
|
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
|