mongodb 4.0.0 → 4.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/README.md +62 -30
- package/lib/bson.js +1 -0
- package/lib/bson.js.map +1 -1
- package/lib/bulk/common.js +53 -30
- package/lib/bulk/common.js.map +1 -1
- package/lib/bulk/ordered.js +3 -2
- package/lib/bulk/ordered.js.map +1 -1
- package/lib/bulk/unordered.js +3 -2
- package/lib/bulk/unordered.js.map +1 -1
- package/lib/change_stream.js +23 -13
- package/lib/change_stream.js.map +1 -1
- package/lib/cmap/auth/auth_provider.js +2 -1
- package/lib/cmap/auth/auth_provider.js.map +1 -1
- package/lib/cmap/auth/gssapi.js +5 -4
- package/lib/cmap/auth/gssapi.js.map +1 -1
- package/lib/cmap/auth/mongo_credentials.js +9 -5
- package/lib/cmap/auth/mongo_credentials.js.map +1 -1
- package/lib/cmap/auth/mongocr.js +2 -2
- package/lib/cmap/auth/mongocr.js.map +1 -1
- package/lib/cmap/auth/mongodb_aws.js +32 -32
- package/lib/cmap/auth/mongodb_aws.js.map +1 -1
- package/lib/cmap/auth/plain.js +1 -1
- package/lib/cmap/auth/plain.js.map +1 -1
- package/lib/cmap/auth/scram.js +15 -12
- package/lib/cmap/auth/scram.js.map +1 -1
- package/lib/cmap/auth/x509.js +2 -2
- package/lib/cmap/auth/x509.js.map +1 -1
- package/lib/cmap/command_monitoring_events.js +26 -10
- package/lib/cmap/command_monitoring_events.js.map +1 -1
- package/lib/cmap/commands.js +9 -5
- package/lib/cmap/commands.js.map +1 -1
- package/lib/cmap/connect.js +23 -9
- package/lib/cmap/connect.js.map +1 -1
- package/lib/cmap/connection.js +43 -46
- package/lib/cmap/connection.js.map +1 -1
- package/lib/cmap/connection_pool.js +113 -15
- package/lib/cmap/connection_pool.js.map +1 -1
- package/lib/cmap/connection_pool_events.js +3 -1
- package/lib/cmap/connection_pool_events.js.map +1 -1
- package/lib/cmap/errors.js +3 -3
- package/lib/cmap/errors.js.map +1 -1
- package/lib/cmap/message_stream.js +1 -1
- package/lib/cmap/message_stream.js.map +1 -1
- package/lib/cmap/metrics.js +62 -0
- package/lib/cmap/metrics.js.map +1 -0
- package/lib/cmap/stream_description.js +3 -1
- package/lib/cmap/stream_description.js.map +1 -1
- package/lib/cmap/wire_protocol/compression.js +22 -9
- package/lib/cmap/wire_protocol/compression.js.map +1 -1
- package/lib/cmap/wire_protocol/shared.js +1 -1
- package/lib/cmap/wire_protocol/shared.js.map +1 -1
- package/lib/collection.js +23 -18
- package/lib/collection.js.map +1 -1
- package/lib/connection_string.js +76 -30
- package/lib/connection_string.js.map +1 -1
- package/lib/cursor/abstract_cursor.js +75 -68
- package/lib/cursor/abstract_cursor.js.map +1 -1
- package/lib/cursor/aggregation_cursor.js +47 -9
- package/lib/cursor/aggregation_cursor.js.map +1 -1
- package/lib/cursor/find_cursor.js +53 -13
- package/lib/cursor/find_cursor.js.map +1 -1
- package/lib/db.js +21 -14
- package/lib/db.js.map +1 -1
- package/lib/deps.js +16 -5
- package/lib/deps.js.map +1 -1
- package/lib/encrypter.js +5 -8
- package/lib/encrypter.js.map +1 -1
- package/lib/error.js +230 -34
- package/lib/error.js.map +1 -1
- package/lib/explain.js +2 -2
- package/lib/explain.js.map +1 -1
- package/lib/gridfs/download.js +22 -47
- package/lib/gridfs/download.js.map +1 -1
- package/lib/gridfs/index.js +4 -3
- package/lib/gridfs/index.js.map +1 -1
- package/lib/gridfs/upload.js +13 -21
- package/lib/gridfs/upload.js.map +1 -1
- package/lib/index.js +27 -2
- package/lib/index.js.map +1 -1
- package/lib/logger.js +3 -2
- package/lib/logger.js.map +1 -1
- package/lib/mongo_client.js +5 -8
- package/lib/mongo_client.js.map +1 -1
- package/lib/mongo_types.js.map +1 -1
- package/lib/operations/add_user.js +2 -3
- package/lib/operations/add_user.js.map +1 -1
- package/lib/operations/aggregate.js +12 -9
- package/lib/operations/aggregate.js.map +1 -1
- package/lib/operations/command.js +5 -7
- package/lib/operations/command.js.map +1 -1
- package/lib/operations/common_functions.js +1 -1
- package/lib/operations/common_functions.js.map +1 -1
- package/lib/operations/connect.js +3 -2
- package/lib/operations/connect.js.map +1 -1
- package/lib/operations/count.js +1 -1
- package/lib/operations/count.js.map +1 -1
- package/lib/operations/count_documents.js +1 -1
- package/lib/operations/count_documents.js.map +1 -1
- package/lib/operations/delete.js +5 -5
- package/lib/operations/delete.js.map +1 -1
- package/lib/operations/distinct.js +2 -2
- package/lib/operations/distinct.js.map +1 -1
- package/lib/operations/estimated_document_count.js +5 -1
- package/lib/operations/estimated_document_count.js.map +1 -1
- package/lib/operations/eval.js.map +1 -1
- package/lib/operations/execute_operation.js +31 -17
- package/lib/operations/execute_operation.js.map +1 -1
- package/lib/operations/find.js +13 -9
- package/lib/operations/find.js.map +1 -1
- package/lib/operations/find_and_modify.js +9 -9
- package/lib/operations/find_and_modify.js.map +1 -1
- package/lib/operations/indexes.js +8 -3
- package/lib/operations/indexes.js.map +1 -1
- package/lib/operations/insert.js +5 -3
- package/lib/operations/insert.js.map +1 -1
- package/lib/operations/is_capped.js +2 -1
- package/lib/operations/is_capped.js.map +1 -1
- package/lib/operations/list_collections.js +6 -3
- package/lib/operations/list_collections.js.map +1 -1
- package/lib/operations/map_reduce.js +1 -1
- package/lib/operations/map_reduce.js.map +1 -1
- package/lib/operations/operation.js +3 -1
- package/lib/operations/operation.js.map +1 -1
- package/lib/operations/options_operation.js +2 -1
- package/lib/operations/options_operation.js.map +1 -1
- package/lib/operations/profiling_level.js +4 -2
- package/lib/operations/profiling_level.js.map +1 -1
- package/lib/operations/set_profiling_level.js +4 -2
- package/lib/operations/set_profiling_level.js.map +1 -1
- package/lib/operations/update.js +12 -12
- package/lib/operations/update.js.map +1 -1
- package/lib/operations/validate_collection.js +6 -5
- package/lib/operations/validate_collection.js.map +1 -1
- package/lib/promise_provider.js +1 -1
- package/lib/promise_provider.js.map +1 -1
- package/lib/read_preference.js +8 -8
- package/lib/read_preference.js.map +1 -1
- package/lib/sdam/common.js +12 -10
- package/lib/sdam/common.js.map +1 -1
- package/lib/sdam/server.js +90 -25
- package/lib/sdam/server.js.map +1 -1
- package/lib/sdam/server_description.js +9 -4
- package/lib/sdam/server_description.js.map +1 -1
- package/lib/sdam/server_selection.js +10 -4
- package/lib/sdam/server_selection.js.map +1 -1
- package/lib/sdam/srv_polling.js +1 -1
- package/lib/sdam/srv_polling.js.map +1 -1
- package/lib/sdam/topology.js +42 -21
- package/lib/sdam/topology.js.map +1 -1
- package/lib/sdam/topology_description.js +7 -3
- package/lib/sdam/topology_description.js.map +1 -1
- package/lib/sessions.js +132 -31
- package/lib/sessions.js.map +1 -1
- package/lib/sort.js +3 -3
- package/lib/sort.js.map +1 -1
- package/lib/transactions.js +15 -7
- package/lib/transactions.js.map +1 -1
- package/lib/utils.js +60 -20
- package/lib/utils.js.map +1 -1
- package/mongodb.d.ts +523 -138
- package/mongodb.ts34.d.ts +480 -141
- package/package.json +44 -48
- package/src/bson.ts +1 -0
- package/src/bulk/common.ts +83 -43
- package/src/bulk/ordered.ts +4 -3
- package/src/bulk/unordered.ts +4 -3
- package/src/change_stream.ts +46 -29
- package/src/cmap/auth/auth_provider.ts +3 -2
- package/src/cmap/auth/gssapi.ts +15 -5
- package/src/cmap/auth/mongo_credentials.ts +22 -8
- package/src/cmap/auth/mongocr.ts +3 -3
- package/src/cmap/auth/mongodb_aws.ts +52 -39
- package/src/cmap/auth/plain.ts +2 -2
- package/src/cmap/auth/scram.ts +23 -13
- package/src/cmap/auth/x509.ts +3 -3
- package/src/cmap/command_monitoring_events.ts +36 -14
- package/src/cmap/commands.ts +12 -6
- package/src/cmap/connect.ts +42 -12
- package/src/cmap/connection.ts +54 -62
- package/src/cmap/connection_pool.ts +141 -20
- package/src/cmap/connection_pool_events.ts +8 -1
- package/src/cmap/errors.ts +3 -4
- package/src/cmap/message_stream.ts +2 -4
- package/src/cmap/metrics.ts +58 -0
- package/src/cmap/stream_description.ts +6 -1
- package/src/cmap/wire_protocol/compression.ts +26 -13
- package/src/cmap/wire_protocol/shared.ts +4 -2
- package/src/collection.ts +75 -70
- package/src/connection_string.ts +97 -34
- package/src/cursor/abstract_cursor.ts +141 -104
- package/src/cursor/aggregation_cursor.ts +34 -20
- package/src/cursor/find_cursor.ts +41 -21
- package/src/db.ts +19 -18
- package/src/deps.ts +110 -22
- package/src/encrypter.ts +6 -12
- package/src/error.ts +264 -48
- package/src/explain.ts +3 -3
- package/src/gridfs/download.ts +48 -53
- package/src/gridfs/index.ts +5 -4
- package/src/gridfs/upload.ts +32 -33
- package/src/index.ts +42 -4
- package/src/logger.ts +6 -3
- package/src/mongo_client.ts +20 -23
- package/src/mongo_types.ts +19 -20
- package/src/operations/add_user.ts +4 -5
- package/src/operations/aggregate.ts +18 -17
- package/src/operations/command.ts +7 -10
- package/src/operations/common_functions.ts +2 -3
- package/src/operations/connect.ts +4 -3
- package/src/operations/count.ts +2 -2
- package/src/operations/count_documents.ts +2 -2
- package/src/operations/delete.ts +8 -6
- package/src/operations/distinct.ts +5 -3
- package/src/operations/estimated_document_count.ts +5 -1
- package/src/operations/eval.ts +1 -1
- package/src/operations/execute_operation.ts +41 -20
- package/src/operations/find.ts +25 -16
- package/src/operations/find_and_modify.ts +12 -10
- package/src/operations/indexes.ts +39 -8
- package/src/operations/insert.ts +7 -4
- package/src/operations/is_capped.ts +3 -2
- package/src/operations/list_collections.ts +9 -6
- package/src/operations/map_reduce.ts +4 -2
- package/src/operations/operation.ts +7 -2
- package/src/operations/options_operation.ts +3 -2
- package/src/operations/profiling_level.ts +5 -3
- package/src/operations/set_profiling_level.ts +9 -3
- package/src/operations/update.ts +17 -13
- package/src/operations/validate_collection.ts +7 -6
- package/src/promise_provider.ts +2 -2
- package/src/read_preference.ts +11 -9
- package/src/sdam/common.ts +11 -9
- package/src/sdam/server.ts +168 -69
- package/src/sdam/server_description.ts +16 -4
- package/src/sdam/server_selection.ts +15 -7
- package/src/sdam/srv_polling.ts +2 -2
- package/src/sdam/topology.ts +67 -36
- package/src/sdam/topology_description.ts +11 -4
- package/src/sessions.ts +194 -37
- package/src/sort.ts +6 -4
- package/src/transactions.ts +18 -9
- package/src/utils.ts +73 -20
- package/HISTORY.md +0 -2993
- package/lib/operations/find_one.js +0 -34
- package/lib/operations/find_one.js.map +0 -1
- package/src/operations/find_one.ts +0 -43
package/src/connection_string.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { AuthMechanism } from './cmap/auth/defaultAuthProviders';
|
|
|
6
6
|
import { ReadPreference, ReadPreferenceMode } from './read_preference';
|
|
7
7
|
import { ReadConcern, ReadConcernLevel } from './read_concern';
|
|
8
8
|
import { W, WriteConcern } from './write_concern';
|
|
9
|
-
import { MongoParseError } from './error';
|
|
9
|
+
import { MongoAPIError, MongoInvalidArgumentError, MongoParseError } from './error';
|
|
10
10
|
import {
|
|
11
11
|
AnyOptions,
|
|
12
12
|
Callback,
|
|
@@ -32,6 +32,14 @@ import type { TagSet } from './sdam/server_description';
|
|
|
32
32
|
import { Logger, LoggerLevel } from './logger';
|
|
33
33
|
import { PromiseProvider } from './promise_provider';
|
|
34
34
|
import { Encrypter } from './encrypter';
|
|
35
|
+
import { Compressor, CompressorName } from './cmap/wire_protocol/compression';
|
|
36
|
+
|
|
37
|
+
const VALID_TXT_RECORDS = ['authSource', 'replicaSet', 'loadBalanced'];
|
|
38
|
+
|
|
39
|
+
const LB_SINGLE_HOST_ERROR = 'loadBalanced option only supported with a single host in the URI';
|
|
40
|
+
const LB_REPLICA_SET_ERROR = 'loadBalanced option not supported with a replicaSet option';
|
|
41
|
+
const LB_DIRECT_CONNECTION_ERROR =
|
|
42
|
+
'loadBalanced option not supported when directConnection is provided';
|
|
35
43
|
|
|
36
44
|
/**
|
|
37
45
|
* Determines whether a provided address matches the provided parent domain in order
|
|
@@ -57,11 +65,12 @@ function matchesParentDomain(srvAddress: string, parentDomain: string): boolean
|
|
|
57
65
|
*/
|
|
58
66
|
export function resolveSRVRecord(options: MongoOptions, callback: Callback<HostAddress[]>): void {
|
|
59
67
|
if (typeof options.srvHost !== 'string') {
|
|
60
|
-
return callback(new
|
|
68
|
+
return callback(new MongoAPIError('Option "srvHost" must not be empty'));
|
|
61
69
|
}
|
|
62
70
|
|
|
63
71
|
if (options.srvHost.split('.').length < 3) {
|
|
64
|
-
|
|
72
|
+
// TODO(NODE-3484): Replace with MongoConnectionStringError
|
|
73
|
+
return callback(new MongoAPIError('URI must include hostname, domain name, and tld'));
|
|
65
74
|
}
|
|
66
75
|
|
|
67
76
|
// Resolve the SRV record and use the result as the list of hosts to connect to.
|
|
@@ -70,14 +79,12 @@ export function resolveSRVRecord(options: MongoOptions, callback: Callback<HostA
|
|
|
70
79
|
if (err) return callback(err);
|
|
71
80
|
|
|
72
81
|
if (addresses.length === 0) {
|
|
73
|
-
return callback(new
|
|
82
|
+
return callback(new MongoAPIError('No addresses found at host'));
|
|
74
83
|
}
|
|
75
84
|
|
|
76
85
|
for (const { name } of addresses) {
|
|
77
86
|
if (!matchesParentDomain(name, lookupAddress)) {
|
|
78
|
-
return callback(
|
|
79
|
-
new MongoParseError('Server record does not share hostname with parent URI')
|
|
80
|
-
);
|
|
87
|
+
return callback(new MongoAPIError('Server record does not share hostname with parent URI'));
|
|
81
88
|
}
|
|
82
89
|
}
|
|
83
90
|
|
|
@@ -85,6 +92,11 @@ export function resolveSRVRecord(options: MongoOptions, callback: Callback<HostA
|
|
|
85
92
|
HostAddress.fromString(`${r.name}:${r.port ?? 27017}`)
|
|
86
93
|
);
|
|
87
94
|
|
|
95
|
+
const lbError = validateLoadBalancedOptions(hostAddresses, options);
|
|
96
|
+
if (lbError) {
|
|
97
|
+
return callback(lbError);
|
|
98
|
+
}
|
|
99
|
+
|
|
88
100
|
// Resolve TXT record and add options from there if they exist.
|
|
89
101
|
dns.resolveTxt(lookupAddress, (err, record) => {
|
|
90
102
|
if (err) {
|
|
@@ -98,14 +110,15 @@ export function resolveSRVRecord(options: MongoOptions, callback: Callback<HostA
|
|
|
98
110
|
|
|
99
111
|
const txtRecordOptions = new URLSearchParams(record[0].join(''));
|
|
100
112
|
const txtRecordOptionKeys = [...txtRecordOptions.keys()];
|
|
101
|
-
if (txtRecordOptionKeys.some(key => key
|
|
113
|
+
if (txtRecordOptionKeys.some(key => !VALID_TXT_RECORDS.includes(key))) {
|
|
102
114
|
return callback(
|
|
103
|
-
new MongoParseError(
|
|
115
|
+
new MongoParseError(`Text record may only set any of: ${VALID_TXT_RECORDS.join(', ')}`)
|
|
104
116
|
);
|
|
105
117
|
}
|
|
106
118
|
|
|
107
119
|
const source = txtRecordOptions.get('authSource') ?? undefined;
|
|
108
120
|
const replicaSet = txtRecordOptions.get('replicaSet') ?? undefined;
|
|
121
|
+
const loadBalanced = txtRecordOptions.get('loadBalanced') ?? undefined;
|
|
109
122
|
|
|
110
123
|
if (source === '' || replicaSet === '') {
|
|
111
124
|
return callback(new MongoParseError('Cannot have empty URI params in DNS TXT Record'));
|
|
@@ -118,6 +131,15 @@ export function resolveSRVRecord(options: MongoOptions, callback: Callback<HostA
|
|
|
118
131
|
if (!options.userSpecifiedReplicaSet && replicaSet) {
|
|
119
132
|
options.replicaSet = replicaSet;
|
|
120
133
|
}
|
|
134
|
+
|
|
135
|
+
if (loadBalanced === 'true') {
|
|
136
|
+
options.loadBalanced = true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const lbError = validateLoadBalancedOptions(hostAddresses, options);
|
|
140
|
+
if (lbError) {
|
|
141
|
+
return callback(lbError);
|
|
142
|
+
}
|
|
121
143
|
}
|
|
122
144
|
|
|
123
145
|
callback(undefined, hostAddresses);
|
|
@@ -154,7 +176,7 @@ function getBoolean(name: string, value: unknown): boolean {
|
|
|
154
176
|
const valueString = String(value).toLowerCase();
|
|
155
177
|
if (TRUTHS.has(valueString)) return true;
|
|
156
178
|
if (FALSEHOODS.has(valueString)) return false;
|
|
157
|
-
throw new MongoParseError(`
|
|
179
|
+
throw new MongoParseError(`Expected ${name} to be stringified boolean value, got: ${value}`);
|
|
158
180
|
}
|
|
159
181
|
|
|
160
182
|
function getInt(name: string, value: unknown): number {
|
|
@@ -177,7 +199,7 @@ function toRecord(value: string): Record<string, any> {
|
|
|
177
199
|
const keyValuePairs = value.split(',');
|
|
178
200
|
for (const keyValue of keyValuePairs) {
|
|
179
201
|
const [key, value] = keyValue.split(':');
|
|
180
|
-
if (
|
|
202
|
+
if (value == null) {
|
|
181
203
|
throw new MongoParseError('Cannot have undefined values in key value pairs');
|
|
182
204
|
}
|
|
183
205
|
try {
|
|
@@ -219,7 +241,7 @@ export function parseOptions(
|
|
|
219
241
|
mongoClient: MongoClient | MongoClientOptions | undefined = undefined,
|
|
220
242
|
options: MongoClientOptions = {}
|
|
221
243
|
): MongoOptions {
|
|
222
|
-
if (
|
|
244
|
+
if (mongoClient != null && !(mongoClient instanceof MongoClient)) {
|
|
223
245
|
options = mongoClient;
|
|
224
246
|
mongoClient = undefined;
|
|
225
247
|
}
|
|
@@ -264,7 +286,7 @@ export function parseOptions(
|
|
|
264
286
|
const values = [...url.searchParams.getAll(key)];
|
|
265
287
|
|
|
266
288
|
if (values.includes('')) {
|
|
267
|
-
throw new
|
|
289
|
+
throw new MongoAPIError('URI cannot contain options with no value');
|
|
268
290
|
}
|
|
269
291
|
|
|
270
292
|
if (key.toLowerCase() === 'serverapi') {
|
|
@@ -284,9 +306,13 @@ export function parseOptions(
|
|
|
284
306
|
}
|
|
285
307
|
|
|
286
308
|
const objectOptions = new CaseInsensitiveMap(
|
|
287
|
-
Object.entries(options).filter(([, v]) =>
|
|
309
|
+
Object.entries(options).filter(([, v]) => v != null)
|
|
288
310
|
);
|
|
289
311
|
|
|
312
|
+
if (objectOptions.has('loadBalanced')) {
|
|
313
|
+
throw new MongoParseError('loadBalanced is only a valid option in the URI');
|
|
314
|
+
}
|
|
315
|
+
|
|
290
316
|
const allOptions = new CaseInsensitiveMap();
|
|
291
317
|
|
|
292
318
|
const allKeys = new Set<string>([
|
|
@@ -309,6 +335,19 @@ export function parseOptions(
|
|
|
309
335
|
allOptions.set(key, values);
|
|
310
336
|
}
|
|
311
337
|
|
|
338
|
+
if (allOptions.has('tlsCertificateKeyFile') && !allOptions.has('tlsCertificateFile')) {
|
|
339
|
+
allOptions.set('tlsCertificateFile', allOptions.get('tlsCertificateKeyFile'));
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (allOptions.has('tls') || allOptions.has('ssl')) {
|
|
343
|
+
const tlsAndSslOpts = (allOptions.get('tls') || [])
|
|
344
|
+
.concat(allOptions.get('ssl') || [])
|
|
345
|
+
.map(getBoolean.bind(null, 'tls/ssl'));
|
|
346
|
+
if (new Set(tlsAndSslOpts).size !== 1) {
|
|
347
|
+
throw new MongoParseError('All values of tls/ssl must be the same.');
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
312
351
|
const unsupportedOptions = setDifference(
|
|
313
352
|
allKeys,
|
|
314
353
|
Array.from(Object.keys(OPTIONS)).map(s => s.toLowerCase())
|
|
@@ -358,24 +397,17 @@ export function parseOptions(
|
|
|
358
397
|
mongoOptions.dbName = 'test';
|
|
359
398
|
}
|
|
360
399
|
|
|
361
|
-
if (allOptions.has('tls')) {
|
|
362
|
-
if (new Set(allOptions.get('tls')?.map(getBoolean)).size !== 1) {
|
|
363
|
-
throw new MongoParseError('All values of tls must be the same.');
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
if (allOptions.has('ssl')) {
|
|
368
|
-
if (new Set(allOptions.get('ssl')?.map(getBoolean)).size !== 1) {
|
|
369
|
-
throw new MongoParseError('All values of ssl must be the same.');
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
400
|
checkTLSOptions(mongoOptions);
|
|
374
401
|
|
|
375
402
|
if (options.promiseLibrary) PromiseProvider.set(options.promiseLibrary);
|
|
376
403
|
|
|
377
404
|
if (mongoOptions.directConnection && typeof mongoOptions.srvHost === 'string') {
|
|
378
|
-
throw new
|
|
405
|
+
throw new MongoAPIError('SRV URI does not support directConnection');
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const lbError = validateLoadBalancedOptions(hosts, mongoOptions);
|
|
409
|
+
if (lbError) {
|
|
410
|
+
throw lbError;
|
|
379
411
|
}
|
|
380
412
|
|
|
381
413
|
// Potential SRV Overrides
|
|
@@ -393,6 +425,23 @@ export function parseOptions(
|
|
|
393
425
|
return mongoOptions;
|
|
394
426
|
}
|
|
395
427
|
|
|
428
|
+
function validateLoadBalancedOptions(
|
|
429
|
+
hosts: HostAddress[] | string[],
|
|
430
|
+
mongoOptions: MongoOptions
|
|
431
|
+
): MongoParseError | undefined {
|
|
432
|
+
if (mongoOptions.loadBalanced) {
|
|
433
|
+
if (hosts.length > 1) {
|
|
434
|
+
return new MongoParseError(LB_SINGLE_HOST_ERROR);
|
|
435
|
+
}
|
|
436
|
+
if (mongoOptions.replicaSet) {
|
|
437
|
+
return new MongoParseError(LB_REPLICA_SET_ERROR);
|
|
438
|
+
}
|
|
439
|
+
if (mongoOptions.directConnection) {
|
|
440
|
+
return new MongoParseError(LB_DIRECT_CONNECTION_ERROR);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
396
445
|
function setOption(
|
|
397
446
|
mongoOptions: any,
|
|
398
447
|
key: string,
|
|
@@ -418,7 +467,7 @@ function setOption(
|
|
|
418
467
|
mongoOptions[name] = getUint(name, values[0]);
|
|
419
468
|
break;
|
|
420
469
|
case 'string':
|
|
421
|
-
if (values[0]
|
|
470
|
+
if (values[0] == null) {
|
|
422
471
|
break;
|
|
423
472
|
}
|
|
424
473
|
mongoOptions[name] = String(values[0]);
|
|
@@ -564,12 +613,22 @@ export const OPTIONS = {
|
|
|
564
613
|
target: 'compressors',
|
|
565
614
|
transform({ values }) {
|
|
566
615
|
const compressionList = new Set();
|
|
567
|
-
for (const compVal of values as string[]) {
|
|
568
|
-
|
|
569
|
-
|
|
616
|
+
for (const compVal of values as (CompressorName[] | string)[]) {
|
|
617
|
+
const compValArray = typeof compVal === 'string' ? compVal.split(',') : compVal;
|
|
618
|
+
if (!Array.isArray(compValArray)) {
|
|
619
|
+
throw new MongoInvalidArgumentError(
|
|
620
|
+
'compressors must be an array or a comma-delimited list of strings'
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
for (const c of compValArray) {
|
|
624
|
+
if (Object.keys(Compressor).includes(String(c))) {
|
|
570
625
|
compressionList.add(String(c));
|
|
571
626
|
} else {
|
|
572
|
-
throw new
|
|
627
|
+
throw new MongoInvalidArgumentError(
|
|
628
|
+
`${c} is not a valid compression mechanism. Must be one of: ${Object.keys(
|
|
629
|
+
Compressor
|
|
630
|
+
)}.`
|
|
631
|
+
);
|
|
573
632
|
}
|
|
574
633
|
}
|
|
575
634
|
}
|
|
@@ -670,6 +729,10 @@ export const OPTIONS = {
|
|
|
670
729
|
default: 120000,
|
|
671
730
|
type: 'uint'
|
|
672
731
|
},
|
|
732
|
+
loadBalanced: {
|
|
733
|
+
default: false,
|
|
734
|
+
type: 'boolean'
|
|
735
|
+
},
|
|
673
736
|
localThresholdMS: {
|
|
674
737
|
default: 15,
|
|
675
738
|
type: 'uint'
|
|
@@ -724,7 +787,7 @@ export const OPTIONS = {
|
|
|
724
787
|
type: 'uint'
|
|
725
788
|
},
|
|
726
789
|
monitorCommands: {
|
|
727
|
-
default:
|
|
790
|
+
default: false,
|
|
728
791
|
type: 'boolean'
|
|
729
792
|
},
|
|
730
793
|
name: {
|
|
@@ -1051,6 +1114,6 @@ export const OPTIONS = {
|
|
|
1051
1114
|
|
|
1052
1115
|
export const DEFAULT_OPTIONS = new CaseInsensitiveMap(
|
|
1053
1116
|
Object.entries(OPTIONS)
|
|
1054
|
-
.filter(([, descriptor]) =>
|
|
1117
|
+
.filter(([, descriptor]) => descriptor.default != null)
|
|
1055
1118
|
.map(([k, d]) => [k, d.default])
|
|
1056
1119
|
);
|