@depup/mongodb 7.1.0-depup.0

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 (396) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +33 -0
  3. package/etc/prepare.js +12 -0
  4. package/lib/admin.js +136 -0
  5. package/lib/admin.js.map +1 -0
  6. package/lib/bson.js +85 -0
  7. package/lib/bson.js.map +1 -0
  8. package/lib/bulk/common.js +835 -0
  9. package/lib/bulk/common.js.map +1 -0
  10. package/lib/bulk/ordered.js +67 -0
  11. package/lib/bulk/ordered.js.map +1 -0
  12. package/lib/bulk/unordered.js +92 -0
  13. package/lib/bulk/unordered.js.map +1 -0
  14. package/lib/change_stream.js +513 -0
  15. package/lib/change_stream.js.map +1 -0
  16. package/lib/client-side-encryption/auto_encrypter.js +272 -0
  17. package/lib/client-side-encryption/auto_encrypter.js.map +1 -0
  18. package/lib/client-side-encryption/client_encryption.js +609 -0
  19. package/lib/client-side-encryption/client_encryption.js.map +1 -0
  20. package/lib/client-side-encryption/errors.js +138 -0
  21. package/lib/client-side-encryption/errors.js.map +1 -0
  22. package/lib/client-side-encryption/mongocryptd_manager.js +85 -0
  23. package/lib/client-side-encryption/mongocryptd_manager.js.map +1 -0
  24. package/lib/client-side-encryption/providers/aws.js +23 -0
  25. package/lib/client-side-encryption/providers/aws.js.map +1 -0
  26. package/lib/client-side-encryption/providers/azure.js +132 -0
  27. package/lib/client-side-encryption/providers/azure.js.map +1 -0
  28. package/lib/client-side-encryption/providers/gcp.js +16 -0
  29. package/lib/client-side-encryption/providers/gcp.js.map +1 -0
  30. package/lib/client-side-encryption/providers/index.js +43 -0
  31. package/lib/client-side-encryption/providers/index.js.map +1 -0
  32. package/lib/client-side-encryption/state_machine.js +427 -0
  33. package/lib/client-side-encryption/state_machine.js.map +1 -0
  34. package/lib/cmap/auth/auth_provider.js +51 -0
  35. package/lib/cmap/auth/auth_provider.js.map +1 -0
  36. package/lib/cmap/auth/aws4.js +161 -0
  37. package/lib/cmap/auth/aws4.js.map +1 -0
  38. package/lib/cmap/auth/aws_temporary_credentials.js +103 -0
  39. package/lib/cmap/auth/aws_temporary_credentials.js.map +1 -0
  40. package/lib/cmap/auth/gssapi.js +155 -0
  41. package/lib/cmap/auth/gssapi.js.map +1 -0
  42. package/lib/cmap/auth/mongo_credentials.js +169 -0
  43. package/lib/cmap/auth/mongo_credentials.js.map +1 -0
  44. package/lib/cmap/auth/mongodb_aws.js +128 -0
  45. package/lib/cmap/auth/mongodb_aws.js.map +1 -0
  46. package/lib/cmap/auth/mongodb_oidc/automated_callback_workflow.js +84 -0
  47. package/lib/cmap/auth/mongodb_oidc/automated_callback_workflow.js.map +1 -0
  48. package/lib/cmap/auth/mongodb_oidc/azure_machine_workflow.js +62 -0
  49. package/lib/cmap/auth/mongodb_oidc/azure_machine_workflow.js.map +1 -0
  50. package/lib/cmap/auth/mongodb_oidc/callback_workflow.js +141 -0
  51. package/lib/cmap/auth/mongodb_oidc/callback_workflow.js.map +1 -0
  52. package/lib/cmap/auth/mongodb_oidc/command_builders.js +44 -0
  53. package/lib/cmap/auth/mongodb_oidc/command_builders.js.map +1 -0
  54. package/lib/cmap/auth/mongodb_oidc/gcp_machine_workflow.js +39 -0
  55. package/lib/cmap/auth/mongodb_oidc/gcp_machine_workflow.js.map +1 -0
  56. package/lib/cmap/auth/mongodb_oidc/human_callback_workflow.js +122 -0
  57. package/lib/cmap/auth/mongodb_oidc/human_callback_workflow.js.map +1 -0
  58. package/lib/cmap/auth/mongodb_oidc/k8s_machine_workflow.js +32 -0
  59. package/lib/cmap/auth/mongodb_oidc/k8s_machine_workflow.js.map +1 -0
  60. package/lib/cmap/auth/mongodb_oidc/token_cache.js +52 -0
  61. package/lib/cmap/auth/mongodb_oidc/token_cache.js.map +1 -0
  62. package/lib/cmap/auth/mongodb_oidc/token_machine_workflow.js +23 -0
  63. package/lib/cmap/auth/mongodb_oidc/token_machine_workflow.js.map +1 -0
  64. package/lib/cmap/auth/mongodb_oidc.js +73 -0
  65. package/lib/cmap/auth/mongodb_oidc.js.map +1 -0
  66. package/lib/cmap/auth/plain.js +26 -0
  67. package/lib/cmap/auth/plain.js.map +1 -0
  68. package/lib/cmap/auth/providers.js +22 -0
  69. package/lib/cmap/auth/providers.js.map +1 -0
  70. package/lib/cmap/auth/scram.js +254 -0
  71. package/lib/cmap/auth/scram.js.map +1 -0
  72. package/lib/cmap/auth/x509.js +36 -0
  73. package/lib/cmap/auth/x509.js.map +1 -0
  74. package/lib/cmap/command_monitoring_events.js +223 -0
  75. package/lib/cmap/command_monitoring_events.js.map +1 -0
  76. package/lib/cmap/commands.js +535 -0
  77. package/lib/cmap/commands.js.map +1 -0
  78. package/lib/cmap/connect.js +381 -0
  79. package/lib/cmap/connect.js.map +1 -0
  80. package/lib/cmap/connection.js +571 -0
  81. package/lib/cmap/connection.js.map +1 -0
  82. package/lib/cmap/connection_pool.js +558 -0
  83. package/lib/cmap/connection_pool.js.map +1 -0
  84. package/lib/cmap/connection_pool_events.js +190 -0
  85. package/lib/cmap/connection_pool_events.js.map +1 -0
  86. package/lib/cmap/errors.js +108 -0
  87. package/lib/cmap/errors.js.map +1 -0
  88. package/lib/cmap/handshake/client_metadata.js +242 -0
  89. package/lib/cmap/handshake/client_metadata.js.map +1 -0
  90. package/lib/cmap/metrics.js +62 -0
  91. package/lib/cmap/metrics.js.map +1 -0
  92. package/lib/cmap/stream_description.js +70 -0
  93. package/lib/cmap/stream_description.js.map +1 -0
  94. package/lib/cmap/wire_protocol/compression.js +178 -0
  95. package/lib/cmap/wire_protocol/compression.js.map +1 -0
  96. package/lib/cmap/wire_protocol/constants.js +21 -0
  97. package/lib/cmap/wire_protocol/constants.js.map +1 -0
  98. package/lib/cmap/wire_protocol/on_data.js +111 -0
  99. package/lib/cmap/wire_protocol/on_data.js.map +1 -0
  100. package/lib/cmap/wire_protocol/on_demand/document.js +222 -0
  101. package/lib/cmap/wire_protocol/on_demand/document.js.map +1 -0
  102. package/lib/cmap/wire_protocol/responses.js +315 -0
  103. package/lib/cmap/wire_protocol/responses.js.map +1 -0
  104. package/lib/cmap/wire_protocol/shared.js +35 -0
  105. package/lib/cmap/wire_protocol/shared.js.map +1 -0
  106. package/lib/collection.js +751 -0
  107. package/lib/collection.js.map +1 -0
  108. package/lib/connection_string.js +1090 -0
  109. package/lib/connection_string.js.map +1 -0
  110. package/lib/constants.js +170 -0
  111. package/lib/constants.js.map +1 -0
  112. package/lib/cursor/abstract_cursor.js +924 -0
  113. package/lib/cursor/abstract_cursor.js.map +1 -0
  114. package/lib/cursor/aggregation_cursor.js +164 -0
  115. package/lib/cursor/aggregation_cursor.js.map +1 -0
  116. package/lib/cursor/change_stream_cursor.js +104 -0
  117. package/lib/cursor/change_stream_cursor.js.map +1 -0
  118. package/lib/cursor/client_bulk_write_cursor.js +52 -0
  119. package/lib/cursor/client_bulk_write_cursor.js.map +1 -0
  120. package/lib/cursor/explainable_cursor.js +36 -0
  121. package/lib/cursor/explainable_cursor.js.map +1 -0
  122. package/lib/cursor/find_cursor.js +399 -0
  123. package/lib/cursor/find_cursor.js.map +1 -0
  124. package/lib/cursor/list_collections_cursor.js +34 -0
  125. package/lib/cursor/list_collections_cursor.js.map +1 -0
  126. package/lib/cursor/list_indexes_cursor.js +32 -0
  127. package/lib/cursor/list_indexes_cursor.js.map +1 -0
  128. package/lib/cursor/list_search_indexes_cursor.js +14 -0
  129. package/lib/cursor/list_search_indexes_cursor.js.map +1 -0
  130. package/lib/cursor/run_command_cursor.js +94 -0
  131. package/lib/cursor/run_command_cursor.js.map +1 -0
  132. package/lib/db.js +419 -0
  133. package/lib/db.js.map +1 -0
  134. package/lib/deps.js +112 -0
  135. package/lib/deps.js.map +1 -0
  136. package/lib/encrypter.js +106 -0
  137. package/lib/encrypter.js.map +1 -0
  138. package/lib/error.js +1380 -0
  139. package/lib/error.js.map +1 -0
  140. package/lib/explain.js +59 -0
  141. package/lib/explain.js.map +1 -0
  142. package/lib/gridfs/download.js +305 -0
  143. package/lib/gridfs/download.js.map +1 -0
  144. package/lib/gridfs/index.js +164 -0
  145. package/lib/gridfs/index.js.map +1 -0
  146. package/lib/gridfs/upload.js +358 -0
  147. package/lib/gridfs/upload.js.map +1 -0
  148. package/lib/index.js +193 -0
  149. package/lib/index.js.map +1 -0
  150. package/lib/mongo_client.js +557 -0
  151. package/lib/mongo_client.js.map +1 -0
  152. package/lib/mongo_client_auth_providers.js +80 -0
  153. package/lib/mongo_client_auth_providers.js.map +1 -0
  154. package/lib/mongo_logger.js +655 -0
  155. package/lib/mongo_logger.js.map +1 -0
  156. package/lib/mongo_types.js +56 -0
  157. package/lib/mongo_types.js.map +1 -0
  158. package/lib/operations/aggregate.js +90 -0
  159. package/lib/operations/aggregate.js.map +1 -0
  160. package/lib/operations/client_bulk_write/client_bulk_write.js +51 -0
  161. package/lib/operations/client_bulk_write/client_bulk_write.js.map +1 -0
  162. package/lib/operations/client_bulk_write/command_builder.js +340 -0
  163. package/lib/operations/client_bulk_write/command_builder.js.map +1 -0
  164. package/lib/operations/client_bulk_write/common.js +3 -0
  165. package/lib/operations/client_bulk_write/common.js.map +1 -0
  166. package/lib/operations/client_bulk_write/executor.js +120 -0
  167. package/lib/operations/client_bulk_write/executor.js.map +1 -0
  168. package/lib/operations/client_bulk_write/results_merger.js +204 -0
  169. package/lib/operations/client_bulk_write/results_merger.js.map +1 -0
  170. package/lib/operations/command.js +83 -0
  171. package/lib/operations/command.js.map +1 -0
  172. package/lib/operations/count.js +45 -0
  173. package/lib/operations/count.js.map +1 -0
  174. package/lib/operations/create_collection.js +109 -0
  175. package/lib/operations/create_collection.js.map +1 -0
  176. package/lib/operations/delete.js +125 -0
  177. package/lib/operations/delete.js.map +1 -0
  178. package/lib/operations/distinct.js +61 -0
  179. package/lib/operations/distinct.js.map +1 -0
  180. package/lib/operations/drop.js +93 -0
  181. package/lib/operations/drop.js.map +1 -0
  182. package/lib/operations/end_sessions.js +34 -0
  183. package/lib/operations/end_sessions.js.map +1 -0
  184. package/lib/operations/estimated_document_count.js +41 -0
  185. package/lib/operations/estimated_document_count.js.map +1 -0
  186. package/lib/operations/execute_operation.js +239 -0
  187. package/lib/operations/execute_operation.js.map +1 -0
  188. package/lib/operations/find.js +148 -0
  189. package/lib/operations/find.js.map +1 -0
  190. package/lib/operations/find_and_modify.js +158 -0
  191. package/lib/operations/find_and_modify.js.map +1 -0
  192. package/lib/operations/get_more.js +62 -0
  193. package/lib/operations/get_more.js.map +1 -0
  194. package/lib/operations/indexes.js +186 -0
  195. package/lib/operations/indexes.js.map +1 -0
  196. package/lib/operations/insert.js +70 -0
  197. package/lib/operations/insert.js.map +1 -0
  198. package/lib/operations/kill_cursors.js +43 -0
  199. package/lib/operations/kill_cursors.js.map +1 -0
  200. package/lib/operations/list_collections.js +53 -0
  201. package/lib/operations/list_collections.js.map +1 -0
  202. package/lib/operations/list_databases.js +40 -0
  203. package/lib/operations/list_databases.js.map +1 -0
  204. package/lib/operations/operation.js +102 -0
  205. package/lib/operations/operation.js.map +1 -0
  206. package/lib/operations/profiling_level.js +43 -0
  207. package/lib/operations/profiling_level.js.map +1 -0
  208. package/lib/operations/remove_user.js +27 -0
  209. package/lib/operations/remove_user.js.map +1 -0
  210. package/lib/operations/rename.js +38 -0
  211. package/lib/operations/rename.js.map +1 -0
  212. package/lib/operations/run_command.js +47 -0
  213. package/lib/operations/run_command.js.map +1 -0
  214. package/lib/operations/search_indexes/create.js +33 -0
  215. package/lib/operations/search_indexes/create.js.map +1 -0
  216. package/lib/operations/search_indexes/drop.js +43 -0
  217. package/lib/operations/search_indexes/drop.js.map +1 -0
  218. package/lib/operations/search_indexes/update.js +35 -0
  219. package/lib/operations/search_indexes/update.js.map +1 -0
  220. package/lib/operations/set_profiling_level.js +53 -0
  221. package/lib/operations/set_profiling_level.js.map +1 -0
  222. package/lib/operations/stats.js +27 -0
  223. package/lib/operations/stats.js.map +1 -0
  224. package/lib/operations/update.js +188 -0
  225. package/lib/operations/update.js.map +1 -0
  226. package/lib/operations/validate_collection.js +37 -0
  227. package/lib/operations/validate_collection.js.map +1 -0
  228. package/lib/read_concern.js +73 -0
  229. package/lib/read_concern.js.map +1 -0
  230. package/lib/read_preference.js +191 -0
  231. package/lib/read_preference.js.map +1 -0
  232. package/lib/sdam/common.js +49 -0
  233. package/lib/sdam/common.js.map +1 -0
  234. package/lib/sdam/events.js +146 -0
  235. package/lib/sdam/events.js.map +1 -0
  236. package/lib/sdam/monitor.js +544 -0
  237. package/lib/sdam/monitor.js.map +1 -0
  238. package/lib/sdam/server.js +404 -0
  239. package/lib/sdam/server.js.map +1 -0
  240. package/lib/sdam/server_description.js +204 -0
  241. package/lib/sdam/server_description.js.map +1 -0
  242. package/lib/sdam/server_selection.js +294 -0
  243. package/lib/sdam/server_selection.js.map +1 -0
  244. package/lib/sdam/server_selection_events.js +85 -0
  245. package/lib/sdam/server_selection_events.js.map +1 -0
  246. package/lib/sdam/srv_polling.js +108 -0
  247. package/lib/sdam/srv_polling.js.map +1 -0
  248. package/lib/sdam/topology.js +652 -0
  249. package/lib/sdam/topology.js.map +1 -0
  250. package/lib/sdam/topology_description.js +383 -0
  251. package/lib/sdam/topology_description.js.map +1 -0
  252. package/lib/sessions.js +892 -0
  253. package/lib/sessions.js.map +1 -0
  254. package/lib/sort.js +103 -0
  255. package/lib/sort.js.map +1 -0
  256. package/lib/timeout.js +296 -0
  257. package/lib/timeout.js.map +1 -0
  258. package/lib/transactions.js +135 -0
  259. package/lib/transactions.js.map +1 -0
  260. package/lib/utils.js +1163 -0
  261. package/lib/utils.js.map +1 -0
  262. package/lib/write_concern.js +100 -0
  263. package/lib/write_concern.js.map +1 -0
  264. package/mongodb.d.ts +9018 -0
  265. package/package.json +197 -0
  266. package/src/admin.ts +173 -0
  267. package/src/bson.ts +149 -0
  268. package/src/bulk/common.ts +1251 -0
  269. package/src/bulk/ordered.ts +83 -0
  270. package/src/bulk/unordered.ts +115 -0
  271. package/src/change_stream.ts +1160 -0
  272. package/src/client-side-encryption/auto_encrypter.ts +469 -0
  273. package/src/client-side-encryption/client_encryption.ts +1150 -0
  274. package/src/client-side-encryption/errors.ts +144 -0
  275. package/src/client-side-encryption/mongocryptd_manager.ts +100 -0
  276. package/src/client-side-encryption/providers/aws.ts +33 -0
  277. package/src/client-side-encryption/providers/azure.ts +181 -0
  278. package/src/client-side-encryption/providers/gcp.ts +16 -0
  279. package/src/client-side-encryption/providers/index.ts +207 -0
  280. package/src/client-side-encryption/state_machine.ts +651 -0
  281. package/src/cmap/auth/auth_provider.ts +77 -0
  282. package/src/cmap/auth/aws4.ts +207 -0
  283. package/src/cmap/auth/aws_temporary_credentials.ts +129 -0
  284. package/src/cmap/auth/gssapi.ts +203 -0
  285. package/src/cmap/auth/mongo_credentials.ts +292 -0
  286. package/src/cmap/auth/mongodb_aws.ts +179 -0
  287. package/src/cmap/auth/mongodb_oidc/automated_callback_workflow.ts +88 -0
  288. package/src/cmap/auth/mongodb_oidc/azure_machine_workflow.ts +73 -0
  289. package/src/cmap/auth/mongodb_oidc/callback_workflow.ts +188 -0
  290. package/src/cmap/auth/mongodb_oidc/command_builders.ts +53 -0
  291. package/src/cmap/auth/mongodb_oidc/gcp_machine_workflow.ts +46 -0
  292. package/src/cmap/auth/mongodb_oidc/human_callback_workflow.ts +141 -0
  293. package/src/cmap/auth/mongodb_oidc/k8s_machine_workflow.ts +31 -0
  294. package/src/cmap/auth/mongodb_oidc/token_cache.ts +62 -0
  295. package/src/cmap/auth/mongodb_oidc/token_machine_workflow.ts +22 -0
  296. package/src/cmap/auth/mongodb_oidc.ts +185 -0
  297. package/src/cmap/auth/plain.ts +25 -0
  298. package/src/cmap/auth/providers.ts +22 -0
  299. package/src/cmap/auth/scram.ts +344 -0
  300. package/src/cmap/auth/x509.ts +43 -0
  301. package/src/cmap/command_monitoring_events.ts +316 -0
  302. package/src/cmap/commands.ts +788 -0
  303. package/src/cmap/connect.ts +518 -0
  304. package/src/cmap/connection.ts +931 -0
  305. package/src/cmap/connection_pool.ts +831 -0
  306. package/src/cmap/connection_pool_events.ts +300 -0
  307. package/src/cmap/errors.ts +119 -0
  308. package/src/cmap/handshake/client_metadata.ts +353 -0
  309. package/src/cmap/metrics.ts +58 -0
  310. package/src/cmap/stream_description.ts +96 -0
  311. package/src/cmap/wire_protocol/compression.ts +211 -0
  312. package/src/cmap/wire_protocol/constants.ts +17 -0
  313. package/src/cmap/wire_protocol/on_data.ts +139 -0
  314. package/src/cmap/wire_protocol/on_demand/document.ts +358 -0
  315. package/src/cmap/wire_protocol/responses.ts +393 -0
  316. package/src/cmap/wire_protocol/shared.ts +48 -0
  317. package/src/collection.ts +1314 -0
  318. package/src/connection_string.ts +1297 -0
  319. package/src/constants.ts +176 -0
  320. package/src/cursor/abstract_cursor.ts +1247 -0
  321. package/src/cursor/aggregation_cursor.ts +245 -0
  322. package/src/cursor/change_stream_cursor.ts +171 -0
  323. package/src/cursor/client_bulk_write_cursor.ts +83 -0
  324. package/src/cursor/explainable_cursor.ts +51 -0
  325. package/src/cursor/find_cursor.ts +497 -0
  326. package/src/cursor/list_collections_cursor.ts +50 -0
  327. package/src/cursor/list_indexes_cursor.ts +37 -0
  328. package/src/cursor/list_search_indexes_cursor.ts +20 -0
  329. package/src/cursor/run_command_cursor.ts +178 -0
  330. package/src/db.ts +621 -0
  331. package/src/deps.ts +227 -0
  332. package/src/encrypter.ts +127 -0
  333. package/src/error.ts +1567 -0
  334. package/src/explain.ts +124 -0
  335. package/src/gridfs/download.ts +483 -0
  336. package/src/gridfs/index.ts +264 -0
  337. package/src/gridfs/upload.ts +537 -0
  338. package/src/index.ts +633 -0
  339. package/src/mongo_client.ts +1155 -0
  340. package/src/mongo_client_auth_providers.ts +87 -0
  341. package/src/mongo_logger.ts +1081 -0
  342. package/src/mongo_types.ts +678 -0
  343. package/src/operations/aggregate.ts +153 -0
  344. package/src/operations/client_bulk_write/client_bulk_write.ts +72 -0
  345. package/src/operations/client_bulk_write/command_builder.ts +487 -0
  346. package/src/operations/client_bulk_write/common.ts +276 -0
  347. package/src/operations/client_bulk_write/executor.ts +149 -0
  348. package/src/operations/client_bulk_write/results_merger.ts +260 -0
  349. package/src/operations/command.ts +171 -0
  350. package/src/operations/count.ts +74 -0
  351. package/src/operations/create_collection.ts +218 -0
  352. package/src/operations/delete.ts +183 -0
  353. package/src/operations/distinct.ts +92 -0
  354. package/src/operations/drop.ts +130 -0
  355. package/src/operations/end_sessions.ts +44 -0
  356. package/src/operations/estimated_document_count.ts +61 -0
  357. package/src/operations/execute_operation.ts +319 -0
  358. package/src/operations/find.ts +254 -0
  359. package/src/operations/find_and_modify.ts +319 -0
  360. package/src/operations/get_more.ts +108 -0
  361. package/src/operations/indexes.ts +418 -0
  362. package/src/operations/insert.ts +108 -0
  363. package/src/operations/kill_cursors.ts +64 -0
  364. package/src/operations/list_collections.ts +108 -0
  365. package/src/operations/list_databases.ts +68 -0
  366. package/src/operations/operation.ts +181 -0
  367. package/src/operations/profiling_level.ts +46 -0
  368. package/src/operations/remove_user.ts +36 -0
  369. package/src/operations/rename.ts +60 -0
  370. package/src/operations/run_command.ts +79 -0
  371. package/src/operations/search_indexes/create.ts +56 -0
  372. package/src/operations/search_indexes/drop.ts +58 -0
  373. package/src/operations/search_indexes/update.ts +45 -0
  374. package/src/operations/set_profiling_level.ts +74 -0
  375. package/src/operations/stats.ts +37 -0
  376. package/src/operations/update.ts +318 -0
  377. package/src/operations/validate_collection.ts +50 -0
  378. package/src/read_concern.ts +88 -0
  379. package/src/read_preference.ts +256 -0
  380. package/src/sdam/common.ts +74 -0
  381. package/src/sdam/events.ts +219 -0
  382. package/src/sdam/monitor.ts +771 -0
  383. package/src/sdam/server.ts +595 -0
  384. package/src/sdam/server_description.ts +297 -0
  385. package/src/sdam/server_selection.ts +415 -0
  386. package/src/sdam/server_selection_events.ts +142 -0
  387. package/src/sdam/srv_polling.ts +146 -0
  388. package/src/sdam/topology.ts +1100 -0
  389. package/src/sdam/topology_description.ts +548 -0
  390. package/src/sessions.ts +1244 -0
  391. package/src/sort.ts +141 -0
  392. package/src/timeout.ts +405 -0
  393. package/src/transactions.ts +181 -0
  394. package/src/utils.ts +1434 -0
  395. package/src/write_concern.ts +183 -0
  396. package/tsconfig.json +46 -0
@@ -0,0 +1,518 @@
1
+ import type { Socket, SocketConnectOpts } from 'net';
2
+ import * as net from 'net';
3
+ import type { ConnectionOptions as TLSConnectionOpts, TLSSocket } from 'tls';
4
+ import * as tls from 'tls';
5
+
6
+ import type { Document } from '../bson';
7
+ import { LEGACY_HELLO_COMMAND } from '../constants';
8
+ import { getSocks, type SocksLib } from '../deps';
9
+ import {
10
+ MongoCompatibilityError,
11
+ MongoError,
12
+ MongoErrorLabel,
13
+ MongoInvalidArgumentError,
14
+ MongoNetworkError,
15
+ MongoNetworkTimeoutError,
16
+ MongoRuntimeError,
17
+ needsRetryableWriteLabel
18
+ } from '../error';
19
+ import { HostAddress, ns, promiseWithResolvers } from '../utils';
20
+ import { AuthContext } from './auth/auth_provider';
21
+ import { AuthMechanism } from './auth/providers';
22
+ import {
23
+ type CommandOptions,
24
+ Connection,
25
+ type ConnectionOptions,
26
+ CryptoConnection
27
+ } from './connection';
28
+ import {
29
+ MAX_SUPPORTED_SERVER_VERSION,
30
+ MAX_SUPPORTED_WIRE_VERSION,
31
+ MIN_SUPPORTED_SERVER_VERSION,
32
+ MIN_SUPPORTED_WIRE_VERSION
33
+ } from './wire_protocol/constants';
34
+
35
+ /** @public */
36
+ export type Stream = Socket | TLSSocket;
37
+
38
+ function applyBackpressureLabels(error: MongoError) {
39
+ error.addErrorLabel(MongoErrorLabel.SystemOverloadedError);
40
+ error.addErrorLabel(MongoErrorLabel.RetryableError);
41
+ }
42
+
43
+ export async function connect(options: ConnectionOptions): Promise<Connection> {
44
+ let connection: Connection | null = null;
45
+ try {
46
+ const socket = await makeSocket(options);
47
+ connection = makeConnection(options, socket);
48
+ await performInitialHandshake(connection, options);
49
+ return connection;
50
+ } catch (error) {
51
+ connection?.destroy();
52
+ throw error;
53
+ }
54
+ }
55
+
56
+ export function makeConnection(options: ConnectionOptions, socket: Stream): Connection {
57
+ let ConnectionType = options.connectionType ?? Connection;
58
+ if (options.autoEncrypter) {
59
+ ConnectionType = CryptoConnection;
60
+ }
61
+
62
+ return new ConnectionType(socket, options);
63
+ }
64
+
65
+ function checkSupportedServer(hello: Document, options: ConnectionOptions) {
66
+ const maxWireVersion = Number(hello.maxWireVersion);
67
+ const minWireVersion = Number(hello.minWireVersion);
68
+ const serverVersionHighEnough =
69
+ !Number.isNaN(maxWireVersion) && maxWireVersion >= MIN_SUPPORTED_WIRE_VERSION;
70
+ const serverVersionLowEnough =
71
+ !Number.isNaN(minWireVersion) && minWireVersion <= MAX_SUPPORTED_WIRE_VERSION;
72
+
73
+ if (serverVersionHighEnough) {
74
+ if (serverVersionLowEnough) {
75
+ return null;
76
+ }
77
+
78
+ const message = `Server at ${options.hostAddress} reports minimum wire version ${JSON.stringify(
79
+ hello.minWireVersion
80
+ )}, but this version of the Node.js Driver requires at most ${MAX_SUPPORTED_WIRE_VERSION} (MongoDB ${MAX_SUPPORTED_SERVER_VERSION})`;
81
+ return new MongoCompatibilityError(message);
82
+ }
83
+
84
+ const message = `Server at ${options.hostAddress} reports maximum wire version ${
85
+ JSON.stringify(hello.maxWireVersion) ?? 0
86
+ }, but this version of the Node.js Driver requires at least ${MIN_SUPPORTED_WIRE_VERSION} (MongoDB ${MIN_SUPPORTED_SERVER_VERSION})`;
87
+ return new MongoCompatibilityError(message);
88
+ }
89
+
90
+ export async function performInitialHandshake(
91
+ conn: Connection,
92
+ options: ConnectionOptions
93
+ ): Promise<void> {
94
+ const credentials = options.credentials;
95
+
96
+ if (credentials) {
97
+ if (
98
+ !(credentials.mechanism === AuthMechanism.MONGODB_DEFAULT) &&
99
+ !options.authProviders.getOrCreateProvider(
100
+ credentials.mechanism,
101
+ credentials.mechanismProperties
102
+ )
103
+ ) {
104
+ throw new MongoInvalidArgumentError(`AuthMechanism '${credentials.mechanism}' not supported`);
105
+ }
106
+ }
107
+
108
+ const authContext = new AuthContext(conn, credentials, options);
109
+ conn.authContext = authContext;
110
+
111
+ // If we encounter an error preparing the handshake document, do NOT apply backpressure labels. Errors
112
+ // encountered building the handshake document are all client-side, and do not indicate an overloaded server.
113
+ const handshakeDoc = await prepareHandshakeDocument(authContext);
114
+
115
+ // @ts-expect-error: TODO(NODE-5141): The options need to be filtered properly, Connection options differ from Command options
116
+ const handshakeOptions: CommandOptions = { ...options, raw: false };
117
+ if (typeof options.connectTimeoutMS === 'number') {
118
+ // The handshake technically is a monitoring check, so its socket timeout should be connectTimeoutMS
119
+ handshakeOptions.socketTimeoutMS = options.connectTimeoutMS;
120
+ }
121
+
122
+ const start = new Date().getTime();
123
+
124
+ const response = await executeHandshake(handshakeDoc, handshakeOptions);
125
+
126
+ if (!('isWritablePrimary' in response)) {
127
+ // Provide hello-style response document.
128
+ response.isWritablePrimary = response[LEGACY_HELLO_COMMAND];
129
+ }
130
+
131
+ if (response.helloOk) {
132
+ conn.helloOk = true;
133
+ }
134
+
135
+ const supportedServerErr = checkSupportedServer(response, options);
136
+ if (supportedServerErr) {
137
+ throw supportedServerErr;
138
+ }
139
+
140
+ if (options.loadBalanced) {
141
+ if (!response.serviceId) {
142
+ throw new MongoCompatibilityError(
143
+ 'Driver attempted to initialize in load balancing mode, ' +
144
+ 'but the server does not support this mode.'
145
+ );
146
+ }
147
+ }
148
+
149
+ // NOTE: This is metadata attached to the connection while porting away from
150
+ // handshake being done in the `Server` class. Likely, it should be
151
+ // relocated, or at very least restructured.
152
+ conn.hello = response;
153
+ conn.lastHelloMS = new Date().getTime() - start;
154
+
155
+ if (!response.arbiterOnly && credentials) {
156
+ // store the response on auth context
157
+ authContext.response = response;
158
+
159
+ const resolvedCredentials = credentials.resolveAuthMechanism(response);
160
+ const provider = options.authProviders.getOrCreateProvider(
161
+ resolvedCredentials.mechanism,
162
+ resolvedCredentials.mechanismProperties
163
+ );
164
+ if (!provider) {
165
+ throw new MongoInvalidArgumentError(
166
+ `No AuthProvider for ${resolvedCredentials.mechanism} defined.`
167
+ );
168
+ }
169
+
170
+ try {
171
+ await provider.auth(authContext);
172
+ } catch (error) {
173
+ // NOTE: If we encounter an error authenticating a connection, do NOT apply backpressure labels.
174
+
175
+ if (error instanceof MongoError) {
176
+ error.addErrorLabel(MongoErrorLabel.HandshakeError);
177
+ if (needsRetryableWriteLabel(error, response.maxWireVersion, conn.description.type)) {
178
+ error.addErrorLabel(MongoErrorLabel.RetryableWriteError);
179
+ }
180
+ }
181
+
182
+ throw error;
183
+ }
184
+ }
185
+
186
+ // Connection establishment is socket creation (tcp handshake, tls handshake, MongoDB handshake (saslStart, saslContinue))
187
+ // Once connection is established, command logging can log events (if enabled)
188
+ conn.established = true;
189
+
190
+ async function executeHandshake(handshakeDoc: Document, handshakeOptions: CommandOptions) {
191
+ try {
192
+ const handshakeResponse = await conn.command(
193
+ ns('admin.$cmd'),
194
+ handshakeDoc,
195
+ handshakeOptions
196
+ );
197
+ return handshakeResponse;
198
+ } catch (error) {
199
+ if (error instanceof MongoError) {
200
+ error.addErrorLabel(MongoErrorLabel.HandshakeError);
201
+ }
202
+ // If we encounter a network error executing the initial handshake, apply backpressure labels.
203
+ if (error instanceof MongoNetworkError) {
204
+ applyBackpressureLabels(error);
205
+ }
206
+
207
+ throw error;
208
+ }
209
+ }
210
+ }
211
+
212
+ /**
213
+ * HandshakeDocument used during authentication.
214
+ * @internal
215
+ */
216
+ export interface HandshakeDocument extends Document {
217
+ /**
218
+ * @deprecated Use hello instead
219
+ */
220
+ ismaster?: boolean;
221
+ hello?: boolean;
222
+ helloOk?: boolean;
223
+ client: Document;
224
+ compression: string[];
225
+ saslSupportedMechs?: string;
226
+ loadBalanced?: boolean;
227
+ }
228
+
229
+ /**
230
+ * @internal
231
+ *
232
+ * This function is only exposed for testing purposes.
233
+ */
234
+ export async function prepareHandshakeDocument(
235
+ authContext: AuthContext
236
+ ): Promise<HandshakeDocument> {
237
+ const options = authContext.options;
238
+ const compressors = options.compressors ? options.compressors : [];
239
+ const { serverApi } = authContext.connection;
240
+ const clientMetadata: Document = await options.metadata;
241
+
242
+ const handshakeDoc: HandshakeDocument = {
243
+ [serverApi?.version || options.loadBalanced === true ? 'hello' : LEGACY_HELLO_COMMAND]: 1,
244
+ helloOk: true,
245
+ client: clientMetadata,
246
+ compression: compressors
247
+ };
248
+
249
+ if (options.loadBalanced === true) {
250
+ handshakeDoc.loadBalanced = true;
251
+ }
252
+
253
+ const credentials = authContext.credentials;
254
+ if (credentials) {
255
+ if (credentials.mechanism === AuthMechanism.MONGODB_DEFAULT && credentials.username) {
256
+ handshakeDoc.saslSupportedMechs = `${credentials.source}.${credentials.username}`;
257
+
258
+ const provider = authContext.options.authProviders.getOrCreateProvider(
259
+ AuthMechanism.MONGODB_SCRAM_SHA256,
260
+ credentials.mechanismProperties
261
+ );
262
+ if (!provider) {
263
+ // This auth mechanism is always present.
264
+ throw new MongoInvalidArgumentError(
265
+ `No AuthProvider for ${AuthMechanism.MONGODB_SCRAM_SHA256} defined.`
266
+ );
267
+ }
268
+ return await provider.prepare(handshakeDoc, authContext);
269
+ }
270
+ const provider = authContext.options.authProviders.getOrCreateProvider(
271
+ credentials.mechanism,
272
+ credentials.mechanismProperties
273
+ );
274
+ if (!provider) {
275
+ throw new MongoInvalidArgumentError(`No AuthProvider for ${credentials.mechanism} defined.`);
276
+ }
277
+ return await provider.prepare(handshakeDoc, authContext);
278
+ }
279
+ return handshakeDoc;
280
+ }
281
+
282
+ /** @public */
283
+ export const LEGAL_TLS_SOCKET_OPTIONS = [
284
+ 'allowPartialTrustChain',
285
+ 'ALPNProtocols',
286
+ 'ca',
287
+ 'cert',
288
+ 'checkServerIdentity',
289
+ 'ciphers',
290
+ 'crl',
291
+ 'ecdhCurve',
292
+ 'key',
293
+ 'minDHSize',
294
+ 'passphrase',
295
+ 'pfx',
296
+ 'rejectUnauthorized',
297
+ 'secureContext',
298
+ 'secureProtocol',
299
+ 'servername',
300
+ 'session'
301
+ ] as const;
302
+
303
+ /** @public */
304
+ export const LEGAL_TCP_SOCKET_OPTIONS = [
305
+ 'autoSelectFamily',
306
+ 'autoSelectFamilyAttemptTimeout',
307
+ 'keepAliveInitialDelay',
308
+ 'family',
309
+ 'hints',
310
+ 'localAddress',
311
+ 'localPort',
312
+ 'lookup'
313
+ ] as const;
314
+
315
+ function parseConnectOptions(options: ConnectionOptions): SocketConnectOpts {
316
+ const hostAddress = options.hostAddress;
317
+ if (!hostAddress) throw new MongoInvalidArgumentError('Option "hostAddress" is required');
318
+
319
+ const result: Partial<net.TcpNetConnectOpts & net.IpcNetConnectOpts> = {};
320
+ for (const name of LEGAL_TCP_SOCKET_OPTIONS) {
321
+ if (options[name] != null) {
322
+ (result as Document)[name] = options[name];
323
+ }
324
+ }
325
+ result.keepAliveInitialDelay ??= 120000;
326
+ result.keepAlive = true;
327
+ result.noDelay = options.noDelay ?? true;
328
+
329
+ if (typeof hostAddress.socketPath === 'string') {
330
+ result.path = hostAddress.socketPath;
331
+ return result as net.IpcNetConnectOpts;
332
+ } else if (typeof hostAddress.host === 'string') {
333
+ result.host = hostAddress.host;
334
+ result.port = hostAddress.port;
335
+ return result as net.TcpNetConnectOpts;
336
+ } else {
337
+ // This should never happen since we set up HostAddresses
338
+ // But if we don't throw here the socket could hang until timeout
339
+ // TODO(NODE-3483)
340
+ throw new MongoRuntimeError(`Unexpected HostAddress ${JSON.stringify(hostAddress)}`);
341
+ }
342
+ }
343
+
344
+ type MakeConnectionOptions = ConnectionOptions & { existingSocket?: Stream };
345
+
346
+ function parseSslOptions(options: MakeConnectionOptions): TLSConnectionOpts {
347
+ const result: TLSConnectionOpts = parseConnectOptions(options);
348
+ // Merge in valid SSL options
349
+ for (const name of LEGAL_TLS_SOCKET_OPTIONS) {
350
+ if (options[name] != null) {
351
+ (result as Document)[name] = options[name];
352
+ }
353
+ }
354
+
355
+ if (options.existingSocket) {
356
+ result.socket = options.existingSocket;
357
+ }
358
+
359
+ // Set default sni servername to be the same as host
360
+ if (result.servername == null && result.host && !net.isIP(result.host)) {
361
+ result.servername = result.host;
362
+ }
363
+
364
+ return result;
365
+ }
366
+
367
+ export async function makeSocket(options: MakeConnectionOptions): Promise<Stream> {
368
+ const useTLS = options.tls ?? false;
369
+ const connectTimeoutMS = options.connectTimeoutMS ?? 30000;
370
+ const existingSocket = options.existingSocket;
371
+
372
+ let socket: Stream;
373
+
374
+ if (options.proxyHost != null) {
375
+ // Currently, only Socks5 is supported.
376
+ return await makeSocks5Connection({
377
+ ...options,
378
+ connectTimeoutMS // Should always be present for Socks5
379
+ });
380
+ }
381
+
382
+ if (useTLS) {
383
+ const tlsSocket = tls.connect(parseSslOptions(options));
384
+ if (typeof tlsSocket.disableRenegotiation === 'function') {
385
+ tlsSocket.disableRenegotiation();
386
+ }
387
+ socket = tlsSocket;
388
+ } else if (existingSocket) {
389
+ // In the TLS case, parseSslOptions() sets options.socket to existingSocket,
390
+ // so we only need to handle the non-TLS case here (where existingSocket
391
+ // gives us all we need out of the box).
392
+ socket = existingSocket;
393
+ } else {
394
+ socket = net.createConnection(parseConnectOptions(options));
395
+ }
396
+
397
+ socket.setTimeout(connectTimeoutMS);
398
+
399
+ let cancellationHandler: ((err: Error) => void) | null = null;
400
+
401
+ const { promise: connectedSocket, resolve, reject } = promiseWithResolvers<Stream>();
402
+ if (existingSocket) {
403
+ resolve(socket);
404
+ } else {
405
+ const start = performance.now();
406
+ const connectEvent = useTLS ? 'secureConnect' : 'connect';
407
+ socket
408
+ .once(connectEvent, () => resolve(socket))
409
+ .once('error', cause =>
410
+ reject(new MongoNetworkError(MongoError.buildErrorMessage(cause), { cause }))
411
+ )
412
+ .once('timeout', () => {
413
+ reject(
414
+ new MongoNetworkTimeoutError(
415
+ `Socket '${connectEvent}' timed out after ${(performance.now() - start) | 0}ms (connectTimeoutMS: ${connectTimeoutMS})`
416
+ )
417
+ );
418
+ })
419
+ .once('close', () =>
420
+ reject(
421
+ new MongoNetworkError(
422
+ `Socket closed after ${(performance.now() - start) | 0} during connection establishment`
423
+ )
424
+ )
425
+ );
426
+
427
+ if (options.cancellationToken != null) {
428
+ cancellationHandler = () =>
429
+ reject(
430
+ new MongoNetworkError(
431
+ `Socket connection establishment was cancelled after ${(performance.now() - start) | 0}`
432
+ )
433
+ );
434
+ options.cancellationToken.once('cancel', cancellationHandler);
435
+ }
436
+ }
437
+
438
+ try {
439
+ socket = await connectedSocket;
440
+ return socket;
441
+ } catch (error) {
442
+ // If we encounter an error while establishing a socket, apply the backpressure labels to it. We cannot
443
+ // differentiate between DNS, TLS errors and network errors without refactoring our connection establishment to
444
+ // handle all three steps separately.
445
+ applyBackpressureLabels(error);
446
+ socket.destroy();
447
+ throw error;
448
+ } finally {
449
+ socket.setTimeout(0);
450
+ if (cancellationHandler != null) {
451
+ options.cancellationToken?.removeListener('cancel', cancellationHandler);
452
+ }
453
+ }
454
+ }
455
+
456
+ let socks: SocksLib | null = null;
457
+ function loadSocks() {
458
+ if (socks == null) {
459
+ const socksImport = getSocks();
460
+ if ('kModuleError' in socksImport) {
461
+ throw socksImport.kModuleError;
462
+ }
463
+ socks = socksImport;
464
+ }
465
+ return socks;
466
+ }
467
+
468
+ async function makeSocks5Connection(options: MakeConnectionOptions): Promise<Stream> {
469
+ const hostAddress = HostAddress.fromHostPort(
470
+ options.proxyHost ?? '', // proxyHost is guaranteed to set here
471
+ options.proxyPort ?? 1080
472
+ );
473
+
474
+ // First, connect to the proxy server itself:
475
+ const rawSocket = await makeSocket({
476
+ ...options,
477
+ hostAddress,
478
+ tls: false,
479
+ proxyHost: undefined
480
+ });
481
+
482
+ const destination = parseConnectOptions(options) as net.TcpNetConnectOpts;
483
+ if (typeof destination.host !== 'string' || typeof destination.port !== 'number') {
484
+ throw new MongoInvalidArgumentError('Can only make Socks5 connections to TCP hosts');
485
+ }
486
+
487
+ socks ??= loadSocks();
488
+
489
+ let existingSocket: Stream;
490
+
491
+ try {
492
+ // Then, establish the Socks5 proxy connection:
493
+ const connection = await socks.SocksClient.createConnection({
494
+ existing_socket: rawSocket,
495
+ timeout: options.connectTimeoutMS,
496
+ command: 'connect',
497
+ destination: {
498
+ host: destination.host,
499
+ port: destination.port
500
+ },
501
+ proxy: {
502
+ // host and port are ignored because we pass existing_socket
503
+ host: 'iLoveJavaScript',
504
+ port: 0,
505
+ type: 5,
506
+ userId: options.proxyUsername || undefined,
507
+ password: options.proxyPassword || undefined
508
+ }
509
+ });
510
+ existingSocket = connection.socket;
511
+ } catch (cause) {
512
+ throw new MongoNetworkError(MongoError.buildErrorMessage(cause), { cause });
513
+ }
514
+
515
+ // Finally, now treat the resulting duplex stream as the
516
+ // socket over which we send and receive wire protocol messages:
517
+ return await makeSocket({ ...options, existingSocket, proxyHost: undefined });
518
+ }