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.
Files changed (246) hide show
  1. package/README.md +62 -30
  2. package/lib/bson.js +1 -0
  3. package/lib/bson.js.map +1 -1
  4. package/lib/bulk/common.js +53 -30
  5. package/lib/bulk/common.js.map +1 -1
  6. package/lib/bulk/ordered.js +3 -2
  7. package/lib/bulk/ordered.js.map +1 -1
  8. package/lib/bulk/unordered.js +3 -2
  9. package/lib/bulk/unordered.js.map +1 -1
  10. package/lib/change_stream.js +23 -13
  11. package/lib/change_stream.js.map +1 -1
  12. package/lib/cmap/auth/auth_provider.js +2 -1
  13. package/lib/cmap/auth/auth_provider.js.map +1 -1
  14. package/lib/cmap/auth/gssapi.js +5 -4
  15. package/lib/cmap/auth/gssapi.js.map +1 -1
  16. package/lib/cmap/auth/mongo_credentials.js +9 -5
  17. package/lib/cmap/auth/mongo_credentials.js.map +1 -1
  18. package/lib/cmap/auth/mongocr.js +2 -2
  19. package/lib/cmap/auth/mongocr.js.map +1 -1
  20. package/lib/cmap/auth/mongodb_aws.js +32 -32
  21. package/lib/cmap/auth/mongodb_aws.js.map +1 -1
  22. package/lib/cmap/auth/plain.js +1 -1
  23. package/lib/cmap/auth/plain.js.map +1 -1
  24. package/lib/cmap/auth/scram.js +15 -12
  25. package/lib/cmap/auth/scram.js.map +1 -1
  26. package/lib/cmap/auth/x509.js +2 -2
  27. package/lib/cmap/auth/x509.js.map +1 -1
  28. package/lib/cmap/command_monitoring_events.js +26 -10
  29. package/lib/cmap/command_monitoring_events.js.map +1 -1
  30. package/lib/cmap/commands.js +9 -5
  31. package/lib/cmap/commands.js.map +1 -1
  32. package/lib/cmap/connect.js +23 -9
  33. package/lib/cmap/connect.js.map +1 -1
  34. package/lib/cmap/connection.js +43 -46
  35. package/lib/cmap/connection.js.map +1 -1
  36. package/lib/cmap/connection_pool.js +113 -15
  37. package/lib/cmap/connection_pool.js.map +1 -1
  38. package/lib/cmap/connection_pool_events.js +3 -1
  39. package/lib/cmap/connection_pool_events.js.map +1 -1
  40. package/lib/cmap/errors.js +3 -3
  41. package/lib/cmap/errors.js.map +1 -1
  42. package/lib/cmap/message_stream.js +1 -1
  43. package/lib/cmap/message_stream.js.map +1 -1
  44. package/lib/cmap/metrics.js +62 -0
  45. package/lib/cmap/metrics.js.map +1 -0
  46. package/lib/cmap/stream_description.js +3 -1
  47. package/lib/cmap/stream_description.js.map +1 -1
  48. package/lib/cmap/wire_protocol/compression.js +22 -9
  49. package/lib/cmap/wire_protocol/compression.js.map +1 -1
  50. package/lib/cmap/wire_protocol/shared.js +1 -1
  51. package/lib/cmap/wire_protocol/shared.js.map +1 -1
  52. package/lib/collection.js +23 -18
  53. package/lib/collection.js.map +1 -1
  54. package/lib/connection_string.js +76 -30
  55. package/lib/connection_string.js.map +1 -1
  56. package/lib/cursor/abstract_cursor.js +75 -68
  57. package/lib/cursor/abstract_cursor.js.map +1 -1
  58. package/lib/cursor/aggregation_cursor.js +47 -9
  59. package/lib/cursor/aggregation_cursor.js.map +1 -1
  60. package/lib/cursor/find_cursor.js +53 -13
  61. package/lib/cursor/find_cursor.js.map +1 -1
  62. package/lib/db.js +21 -14
  63. package/lib/db.js.map +1 -1
  64. package/lib/deps.js +16 -5
  65. package/lib/deps.js.map +1 -1
  66. package/lib/encrypter.js +5 -8
  67. package/lib/encrypter.js.map +1 -1
  68. package/lib/error.js +230 -34
  69. package/lib/error.js.map +1 -1
  70. package/lib/explain.js +2 -2
  71. package/lib/explain.js.map +1 -1
  72. package/lib/gridfs/download.js +22 -47
  73. package/lib/gridfs/download.js.map +1 -1
  74. package/lib/gridfs/index.js +4 -3
  75. package/lib/gridfs/index.js.map +1 -1
  76. package/lib/gridfs/upload.js +13 -21
  77. package/lib/gridfs/upload.js.map +1 -1
  78. package/lib/index.js +27 -2
  79. package/lib/index.js.map +1 -1
  80. package/lib/logger.js +3 -2
  81. package/lib/logger.js.map +1 -1
  82. package/lib/mongo_client.js +5 -8
  83. package/lib/mongo_client.js.map +1 -1
  84. package/lib/mongo_types.js.map +1 -1
  85. package/lib/operations/add_user.js +2 -3
  86. package/lib/operations/add_user.js.map +1 -1
  87. package/lib/operations/aggregate.js +12 -9
  88. package/lib/operations/aggregate.js.map +1 -1
  89. package/lib/operations/command.js +5 -7
  90. package/lib/operations/command.js.map +1 -1
  91. package/lib/operations/common_functions.js +1 -1
  92. package/lib/operations/common_functions.js.map +1 -1
  93. package/lib/operations/connect.js +3 -2
  94. package/lib/operations/connect.js.map +1 -1
  95. package/lib/operations/count.js +1 -1
  96. package/lib/operations/count.js.map +1 -1
  97. package/lib/operations/count_documents.js +1 -1
  98. package/lib/operations/count_documents.js.map +1 -1
  99. package/lib/operations/delete.js +5 -5
  100. package/lib/operations/delete.js.map +1 -1
  101. package/lib/operations/distinct.js +2 -2
  102. package/lib/operations/distinct.js.map +1 -1
  103. package/lib/operations/estimated_document_count.js +5 -1
  104. package/lib/operations/estimated_document_count.js.map +1 -1
  105. package/lib/operations/eval.js.map +1 -1
  106. package/lib/operations/execute_operation.js +31 -17
  107. package/lib/operations/execute_operation.js.map +1 -1
  108. package/lib/operations/find.js +13 -9
  109. package/lib/operations/find.js.map +1 -1
  110. package/lib/operations/find_and_modify.js +9 -9
  111. package/lib/operations/find_and_modify.js.map +1 -1
  112. package/lib/operations/indexes.js +8 -3
  113. package/lib/operations/indexes.js.map +1 -1
  114. package/lib/operations/insert.js +5 -3
  115. package/lib/operations/insert.js.map +1 -1
  116. package/lib/operations/is_capped.js +2 -1
  117. package/lib/operations/is_capped.js.map +1 -1
  118. package/lib/operations/list_collections.js +6 -3
  119. package/lib/operations/list_collections.js.map +1 -1
  120. package/lib/operations/map_reduce.js +1 -1
  121. package/lib/operations/map_reduce.js.map +1 -1
  122. package/lib/operations/operation.js +3 -1
  123. package/lib/operations/operation.js.map +1 -1
  124. package/lib/operations/options_operation.js +2 -1
  125. package/lib/operations/options_operation.js.map +1 -1
  126. package/lib/operations/profiling_level.js +4 -2
  127. package/lib/operations/profiling_level.js.map +1 -1
  128. package/lib/operations/set_profiling_level.js +4 -2
  129. package/lib/operations/set_profiling_level.js.map +1 -1
  130. package/lib/operations/update.js +12 -12
  131. package/lib/operations/update.js.map +1 -1
  132. package/lib/operations/validate_collection.js +6 -5
  133. package/lib/operations/validate_collection.js.map +1 -1
  134. package/lib/promise_provider.js +1 -1
  135. package/lib/promise_provider.js.map +1 -1
  136. package/lib/read_preference.js +8 -8
  137. package/lib/read_preference.js.map +1 -1
  138. package/lib/sdam/common.js +12 -10
  139. package/lib/sdam/common.js.map +1 -1
  140. package/lib/sdam/server.js +90 -25
  141. package/lib/sdam/server.js.map +1 -1
  142. package/lib/sdam/server_description.js +9 -4
  143. package/lib/sdam/server_description.js.map +1 -1
  144. package/lib/sdam/server_selection.js +10 -4
  145. package/lib/sdam/server_selection.js.map +1 -1
  146. package/lib/sdam/srv_polling.js +1 -1
  147. package/lib/sdam/srv_polling.js.map +1 -1
  148. package/lib/sdam/topology.js +42 -21
  149. package/lib/sdam/topology.js.map +1 -1
  150. package/lib/sdam/topology_description.js +7 -3
  151. package/lib/sdam/topology_description.js.map +1 -1
  152. package/lib/sessions.js +132 -31
  153. package/lib/sessions.js.map +1 -1
  154. package/lib/sort.js +3 -3
  155. package/lib/sort.js.map +1 -1
  156. package/lib/transactions.js +15 -7
  157. package/lib/transactions.js.map +1 -1
  158. package/lib/utils.js +60 -20
  159. package/lib/utils.js.map +1 -1
  160. package/mongodb.d.ts +523 -138
  161. package/mongodb.ts34.d.ts +480 -141
  162. package/package.json +44 -48
  163. package/src/bson.ts +1 -0
  164. package/src/bulk/common.ts +83 -43
  165. package/src/bulk/ordered.ts +4 -3
  166. package/src/bulk/unordered.ts +4 -3
  167. package/src/change_stream.ts +46 -29
  168. package/src/cmap/auth/auth_provider.ts +3 -2
  169. package/src/cmap/auth/gssapi.ts +15 -5
  170. package/src/cmap/auth/mongo_credentials.ts +22 -8
  171. package/src/cmap/auth/mongocr.ts +3 -3
  172. package/src/cmap/auth/mongodb_aws.ts +52 -39
  173. package/src/cmap/auth/plain.ts +2 -2
  174. package/src/cmap/auth/scram.ts +23 -13
  175. package/src/cmap/auth/x509.ts +3 -3
  176. package/src/cmap/command_monitoring_events.ts +36 -14
  177. package/src/cmap/commands.ts +12 -6
  178. package/src/cmap/connect.ts +42 -12
  179. package/src/cmap/connection.ts +54 -62
  180. package/src/cmap/connection_pool.ts +141 -20
  181. package/src/cmap/connection_pool_events.ts +8 -1
  182. package/src/cmap/errors.ts +3 -4
  183. package/src/cmap/message_stream.ts +2 -4
  184. package/src/cmap/metrics.ts +58 -0
  185. package/src/cmap/stream_description.ts +6 -1
  186. package/src/cmap/wire_protocol/compression.ts +26 -13
  187. package/src/cmap/wire_protocol/shared.ts +4 -2
  188. package/src/collection.ts +75 -70
  189. package/src/connection_string.ts +97 -34
  190. package/src/cursor/abstract_cursor.ts +141 -104
  191. package/src/cursor/aggregation_cursor.ts +34 -20
  192. package/src/cursor/find_cursor.ts +41 -21
  193. package/src/db.ts +19 -18
  194. package/src/deps.ts +110 -22
  195. package/src/encrypter.ts +6 -12
  196. package/src/error.ts +264 -48
  197. package/src/explain.ts +3 -3
  198. package/src/gridfs/download.ts +48 -53
  199. package/src/gridfs/index.ts +5 -4
  200. package/src/gridfs/upload.ts +32 -33
  201. package/src/index.ts +42 -4
  202. package/src/logger.ts +6 -3
  203. package/src/mongo_client.ts +20 -23
  204. package/src/mongo_types.ts +19 -20
  205. package/src/operations/add_user.ts +4 -5
  206. package/src/operations/aggregate.ts +18 -17
  207. package/src/operations/command.ts +7 -10
  208. package/src/operations/common_functions.ts +2 -3
  209. package/src/operations/connect.ts +4 -3
  210. package/src/operations/count.ts +2 -2
  211. package/src/operations/count_documents.ts +2 -2
  212. package/src/operations/delete.ts +8 -6
  213. package/src/operations/distinct.ts +5 -3
  214. package/src/operations/estimated_document_count.ts +5 -1
  215. package/src/operations/eval.ts +1 -1
  216. package/src/operations/execute_operation.ts +41 -20
  217. package/src/operations/find.ts +25 -16
  218. package/src/operations/find_and_modify.ts +12 -10
  219. package/src/operations/indexes.ts +39 -8
  220. package/src/operations/insert.ts +7 -4
  221. package/src/operations/is_capped.ts +3 -2
  222. package/src/operations/list_collections.ts +9 -6
  223. package/src/operations/map_reduce.ts +4 -2
  224. package/src/operations/operation.ts +7 -2
  225. package/src/operations/options_operation.ts +3 -2
  226. package/src/operations/profiling_level.ts +5 -3
  227. package/src/operations/set_profiling_level.ts +9 -3
  228. package/src/operations/update.ts +17 -13
  229. package/src/operations/validate_collection.ts +7 -6
  230. package/src/promise_provider.ts +2 -2
  231. package/src/read_preference.ts +11 -9
  232. package/src/sdam/common.ts +11 -9
  233. package/src/sdam/server.ts +168 -69
  234. package/src/sdam/server_description.ts +16 -4
  235. package/src/sdam/server_selection.ts +15 -7
  236. package/src/sdam/srv_polling.ts +2 -2
  237. package/src/sdam/topology.ts +67 -36
  238. package/src/sdam/topology_description.ts +11 -4
  239. package/src/sessions.ts +194 -37
  240. package/src/sort.ts +6 -4
  241. package/src/transactions.ts +18 -9
  242. package/src/utils.ts +73 -20
  243. package/HISTORY.md +0 -2993
  244. package/lib/operations/find_one.js +0 -34
  245. package/lib/operations/find_one.js.map +0 -1
  246. package/src/operations/find_one.ts +0 -43
@@ -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 MongoParseError('Cannot resolve empty srv string'));
68
+ return callback(new MongoAPIError('Option "srvHost" must not be empty'));
61
69
  }
62
70
 
63
71
  if (options.srvHost.split('.').length < 3) {
64
- return callback(new MongoParseError('URI does not have hostname, domain name and tld'));
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 MongoParseError('No addresses found at host'));
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 !== 'authSource' && key !== 'replicaSet')) {
113
+ if (txtRecordOptionKeys.some(key => !VALID_TXT_RECORDS.includes(key))) {
102
114
  return callback(
103
- new MongoParseError('Text record must only set `authSource` or `replicaSet`')
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(`For ${name} Expected stringified boolean value, got: ${value}`);
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 (typeof value === 'undefined') {
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 (typeof mongoClient !== 'undefined' && !(mongoClient instanceof MongoClient)) {
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 MongoParseError('URI cannot contain options with no value');
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]) => (v ?? null) !== null)
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 MongoParseError('directConnection not supported with SRV URI');
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] === undefined) {
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
- for (const c of compVal.split(',')) {
569
- if (['none', 'snappy', 'zlib'].includes(String(c))) {
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 MongoParseError(`${c} is not a valid compression mechanism`);
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: true,
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]) => typeof descriptor.default !== 'undefined')
1117
+ .filter(([, descriptor]) => descriptor.default != null)
1055
1118
  .map(([k, d]) => [k, d.default])
1056
1119
  );