@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,595 @@
1
+ import type { Document } from '../bson';
2
+ import { type AutoEncrypter } from '../client-side-encryption/auto_encrypter';
3
+ import { type CommandOptions, Connection } from '../cmap/connection';
4
+ import {
5
+ ConnectionPool,
6
+ type ConnectionPoolEvents,
7
+ type ConnectionPoolOptions
8
+ } from '../cmap/connection_pool';
9
+ import { PoolClearedError } from '../cmap/errors';
10
+ import {
11
+ APM_EVENTS,
12
+ CLOSED,
13
+ CMAP_EVENTS,
14
+ CONNECT,
15
+ DESCRIPTION_RECEIVED,
16
+ ENDED,
17
+ HEARTBEAT_EVENTS,
18
+ SERVER_HEARTBEAT_FAILED,
19
+ SERVER_HEARTBEAT_STARTED,
20
+ SERVER_HEARTBEAT_SUCCEEDED
21
+ } from '../constants';
22
+ import {
23
+ type AnyError,
24
+ isNodeShuttingDownError,
25
+ isStateChangeError,
26
+ MONGODB_ERROR_CODES,
27
+ MongoError,
28
+ MongoErrorLabel,
29
+ MongoNetworkError,
30
+ MongoNetworkTimeoutError,
31
+ MongoParseError,
32
+ MongoRuntimeError,
33
+ MongoServerClosedError,
34
+ type MongoServerError,
35
+ needsRetryableWriteLabel
36
+ } from '../error';
37
+ import type { ServerApi } from '../mongo_client';
38
+ import { type Abortable, TypedEventEmitter } from '../mongo_types';
39
+ import { AggregateOperation } from '../operations/aggregate';
40
+ import type { GetMoreOptions } from '../operations/get_more';
41
+ import { type AbstractOperation } from '../operations/operation';
42
+ import type { ClientSession } from '../sessions';
43
+ import { type TimeoutContext } from '../timeout';
44
+ import { isTransactionCommand } from '../transactions';
45
+ import {
46
+ abortable,
47
+ type EventEmitterWithState,
48
+ makeStateMachine,
49
+ maxWireVersion,
50
+ noop,
51
+ squashError,
52
+ supportsRetryableWrites
53
+ } from '../utils';
54
+ import { throwIfWriteConcernError } from '../write_concern';
55
+ import {
56
+ type ClusterTime,
57
+ STATE_CLOSED,
58
+ STATE_CLOSING,
59
+ STATE_CONNECTED,
60
+ STATE_CONNECTING,
61
+ TopologyType
62
+ } from './common';
63
+ import type {
64
+ ServerHeartbeatFailedEvent,
65
+ ServerHeartbeatStartedEvent,
66
+ ServerHeartbeatSucceededEvent
67
+ } from './events';
68
+ import { Monitor, type MonitorOptions } from './monitor';
69
+ import { compareTopologyVersion, ServerDescription } from './server_description';
70
+ import { MIN_SECONDARY_WRITE_WIRE_VERSION } from './server_selection';
71
+ import type { Topology } from './topology';
72
+
73
+ const stateTransition = makeStateMachine({
74
+ [STATE_CLOSED]: [STATE_CLOSED, STATE_CONNECTING],
75
+ [STATE_CONNECTING]: [STATE_CONNECTING, STATE_CLOSING, STATE_CONNECTED, STATE_CLOSED],
76
+ [STATE_CONNECTED]: [STATE_CONNECTED, STATE_CLOSING, STATE_CLOSED],
77
+ [STATE_CLOSING]: [STATE_CLOSING, STATE_CLOSED]
78
+ });
79
+
80
+ /** @internal */
81
+ export type ServerOptions = Omit<ConnectionPoolOptions, 'id' | 'generation' | 'hostAddress'> &
82
+ MonitorOptions;
83
+
84
+ /** @internal */
85
+ export interface ServerPrivate {
86
+ /** The server description for this server */
87
+ description: ServerDescription;
88
+ /** A copy of the options used to construct this instance */
89
+ options: ServerOptions;
90
+ /** The current state of the Server */
91
+ state: string;
92
+ /** MongoDB server API version */
93
+ serverApi?: ServerApi;
94
+ /** A count of the operations currently running against the server. */
95
+ operationCount: number;
96
+ }
97
+
98
+ /** @public */
99
+ export type ServerEvents = {
100
+ serverHeartbeatStarted(event: ServerHeartbeatStartedEvent): void;
101
+ serverHeartbeatSucceeded(event: ServerHeartbeatSucceededEvent): void;
102
+ serverHeartbeatFailed(event: ServerHeartbeatFailedEvent): void;
103
+ /** Top level MongoClient doesn't emit this so it is marked: @internal */
104
+ connect(server: Server): void;
105
+ descriptionReceived(description: ServerDescription): void;
106
+ closed(): void;
107
+ ended(): void;
108
+ } & ConnectionPoolEvents &
109
+ EventEmitterWithState;
110
+
111
+ /** @internal */
112
+ export type ServerCommandOptions = Omit<CommandOptions, 'timeoutContext' | 'socketTimeoutMS'> & {
113
+ timeoutContext: TimeoutContext;
114
+ returnFieldSelector?: Document | null;
115
+ } & Abortable;
116
+
117
+ /** @internal */
118
+ export class Server extends TypedEventEmitter<ServerEvents> {
119
+ /** @internal */
120
+ s: ServerPrivate;
121
+ /** @internal */
122
+ topology: Topology;
123
+ /** @internal */
124
+ pool: ConnectionPool;
125
+ serverApi?: ServerApi;
126
+ hello?: Document;
127
+ monitor: Monitor | null;
128
+
129
+ /** @event */
130
+ static readonly SERVER_HEARTBEAT_STARTED = SERVER_HEARTBEAT_STARTED;
131
+ /** @event */
132
+ static readonly SERVER_HEARTBEAT_SUCCEEDED = SERVER_HEARTBEAT_SUCCEEDED;
133
+ /** @event */
134
+ static readonly SERVER_HEARTBEAT_FAILED = SERVER_HEARTBEAT_FAILED;
135
+ /** @event */
136
+ static readonly CONNECT = CONNECT;
137
+ /** @event */
138
+ static readonly DESCRIPTION_RECEIVED = DESCRIPTION_RECEIVED;
139
+ /** @event */
140
+ static readonly CLOSED = CLOSED;
141
+ /** @event */
142
+ static readonly ENDED = ENDED;
143
+
144
+ /**
145
+ * Create a server
146
+ */
147
+ constructor(topology: Topology, description: ServerDescription, options: ServerOptions) {
148
+ super();
149
+ this.on('error', noop);
150
+
151
+ this.serverApi = options.serverApi;
152
+
153
+ const poolOptions = { hostAddress: description.hostAddress, ...options };
154
+
155
+ this.topology = topology;
156
+ this.pool = new ConnectionPool(this, poolOptions);
157
+
158
+ this.s = {
159
+ description,
160
+ options,
161
+ state: STATE_CLOSED,
162
+ operationCount: 0
163
+ };
164
+
165
+ for (const event of [...CMAP_EVENTS, ...APM_EVENTS]) {
166
+ this.pool.on(event, (e: any) => this.emit(event, e));
167
+ }
168
+
169
+ this.pool.on(Connection.CLUSTER_TIME_RECEIVED, (clusterTime: ClusterTime) => {
170
+ this.clusterTime = clusterTime;
171
+ });
172
+
173
+ if (this.loadBalanced) {
174
+ this.monitor = null;
175
+ // monitoring is disabled in load balancing mode
176
+ return;
177
+ }
178
+
179
+ // create the monitor
180
+ this.monitor = new Monitor(this, this.s.options);
181
+
182
+ for (const event of HEARTBEAT_EVENTS) {
183
+ this.monitor.on(event, (e: any) => this.emit(event, e));
184
+ }
185
+
186
+ this.monitor.on('resetServer', (error: MongoServerError) => markServerUnknown(this, error));
187
+ this.monitor.on(Server.SERVER_HEARTBEAT_SUCCEEDED, (event: ServerHeartbeatSucceededEvent) => {
188
+ this.emit(
189
+ Server.DESCRIPTION_RECEIVED,
190
+ new ServerDescription(this.description.hostAddress, event.reply, {
191
+ roundTripTime: this.monitor?.roundTripTime,
192
+ minRoundTripTime: this.monitor?.minRoundTripTime
193
+ })
194
+ );
195
+
196
+ if (this.s.state === STATE_CONNECTING) {
197
+ stateTransition(this, STATE_CONNECTED);
198
+ this.emit(Server.CONNECT, this);
199
+ }
200
+ });
201
+ }
202
+
203
+ get clusterTime(): ClusterTime | undefined {
204
+ return this.topology.clusterTime;
205
+ }
206
+
207
+ set clusterTime(clusterTime: ClusterTime | undefined) {
208
+ this.topology.clusterTime = clusterTime;
209
+ }
210
+
211
+ get description(): ServerDescription {
212
+ return this.s.description;
213
+ }
214
+
215
+ get name(): string {
216
+ return this.s.description.address;
217
+ }
218
+
219
+ get autoEncrypter(): AutoEncrypter | undefined {
220
+ if (this.s.options && this.s.options.autoEncrypter) {
221
+ return this.s.options.autoEncrypter;
222
+ }
223
+ return;
224
+ }
225
+
226
+ get loadBalanced(): boolean {
227
+ return this.topology.description.type === TopologyType.LoadBalanced;
228
+ }
229
+
230
+ /**
231
+ * Initiate server connect
232
+ */
233
+ connect(): void {
234
+ if (this.s.state !== STATE_CLOSED) {
235
+ return;
236
+ }
237
+
238
+ stateTransition(this, STATE_CONNECTING);
239
+
240
+ // If in load balancer mode we automatically set the server to
241
+ // a load balancer. It never transitions out of this state and
242
+ // has no monitor.
243
+ if (!this.loadBalanced) {
244
+ this.monitor?.connect();
245
+ } else {
246
+ stateTransition(this, STATE_CONNECTED);
247
+ this.emit(Server.CONNECT, this);
248
+ }
249
+ }
250
+
251
+ closeCheckedOutConnections() {
252
+ return this.pool.closeCheckedOutConnections();
253
+ }
254
+
255
+ /** Destroy the server connection */
256
+ close(): void {
257
+ if (this.s.state === STATE_CLOSED) {
258
+ return;
259
+ }
260
+
261
+ stateTransition(this, STATE_CLOSING);
262
+
263
+ if (!this.loadBalanced) {
264
+ this.monitor?.close();
265
+ }
266
+
267
+ this.pool.close();
268
+ stateTransition(this, STATE_CLOSED);
269
+ this.emit('closed');
270
+ }
271
+
272
+ /**
273
+ * Immediately schedule monitoring of this server. If there already an attempt being made
274
+ * this will be a no-op.
275
+ */
276
+ requestCheck(): void {
277
+ if (!this.loadBalanced) {
278
+ this.monitor?.requestCheck();
279
+ }
280
+ }
281
+
282
+ public async command<TResult>(
283
+ operation: AbstractOperation<TResult>,
284
+ timeoutContext: TimeoutContext
285
+ ): Promise<InstanceType<typeof operation.SERVER_COMMAND_RESPONSE_TYPE>> {
286
+ if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) {
287
+ throw new MongoServerClosedError();
288
+ }
289
+ const session = operation.session;
290
+
291
+ let conn = session?.pinnedConnection;
292
+
293
+ this.incrementOperationCount();
294
+ if (conn == null) {
295
+ try {
296
+ conn = await this.pool.checkOut({ timeoutContext, signal: operation.options.signal });
297
+ } catch (checkoutError) {
298
+ this.decrementOperationCount();
299
+ if (!(checkoutError instanceof PoolClearedError)) this.handleError(checkoutError);
300
+ throw checkoutError;
301
+ }
302
+ }
303
+
304
+ let reauthPromise: Promise<void> | null = null;
305
+ const cleanup = () => {
306
+ this.decrementOperationCount();
307
+ if (session?.pinnedConnection !== conn) {
308
+ if (reauthPromise != null) {
309
+ // The reauth promise only exists if it hasn't thrown.
310
+ const checkBackIn = () => {
311
+ this.pool.checkIn(conn);
312
+ };
313
+ void reauthPromise.then(checkBackIn, checkBackIn);
314
+ } else {
315
+ this.pool.checkIn(conn);
316
+ }
317
+ }
318
+ };
319
+
320
+ let cmd;
321
+ try {
322
+ cmd = operation.buildCommand(conn, session);
323
+ } catch (e) {
324
+ cleanup();
325
+ throw e;
326
+ }
327
+
328
+ const options = operation.buildOptions(timeoutContext);
329
+ const ns = operation.ns;
330
+
331
+ if (this.loadBalanced && isPinnableCommand(cmd, session) && !session?.pinnedConnection) {
332
+ session?.pin(conn);
333
+ }
334
+
335
+ options.directConnection = this.topology.s.options.directConnection;
336
+
337
+ const omitReadPreference =
338
+ operation instanceof AggregateOperation &&
339
+ operation.hasWriteStage &&
340
+ maxWireVersion(conn) < MIN_SECONDARY_WRITE_WIRE_VERSION;
341
+ if (omitReadPreference) {
342
+ delete options.readPreference;
343
+ }
344
+
345
+ if (this.description.iscryptd) {
346
+ options.omitMaxTimeMS = true;
347
+ }
348
+
349
+ try {
350
+ try {
351
+ const res = await conn.command(ns, cmd, options, operation.SERVER_COMMAND_RESPONSE_TYPE);
352
+ throwIfWriteConcernError(res);
353
+ return res;
354
+ } catch (commandError) {
355
+ throw this.decorateCommandError(conn, cmd, options, commandError);
356
+ }
357
+ } catch (operationError) {
358
+ if (
359
+ operationError instanceof MongoError &&
360
+ operationError.code?.valueOf() === MONGODB_ERROR_CODES.Reauthenticate
361
+ ) {
362
+ reauthPromise = this.pool.reauthenticate(conn);
363
+ reauthPromise.then(undefined, error => {
364
+ reauthPromise = null;
365
+ squashError(error);
366
+ });
367
+
368
+ await abortable(reauthPromise, options);
369
+ reauthPromise = null; // only reachable if reauth succeeds
370
+
371
+ try {
372
+ const res = await conn.command(ns, cmd, options, operation.SERVER_COMMAND_RESPONSE_TYPE);
373
+ throwIfWriteConcernError(res);
374
+ return res;
375
+ } catch (commandError) {
376
+ throw this.decorateCommandError(conn, cmd, options, commandError);
377
+ }
378
+ } else {
379
+ throw operationError;
380
+ }
381
+ } finally {
382
+ cleanup();
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Handle SDAM error
388
+ * @internal
389
+ */
390
+ handleError(error: AnyError, connection?: Connection) {
391
+ if (!(error instanceof MongoError)) {
392
+ return;
393
+ }
394
+
395
+ if (isStaleError(this, error)) {
396
+ return;
397
+ }
398
+
399
+ const isNetworkNonTimeoutError =
400
+ error instanceof MongoNetworkError && !(error instanceof MongoNetworkTimeoutError);
401
+ const isNetworkTimeoutBeforeHandshakeError =
402
+ error instanceof MongoNetworkError && error.beforeHandshake;
403
+ const isAuthOrEstablishmentHandshakeError = error.hasErrorLabel(MongoErrorLabel.HandshakeError);
404
+ const isSystemOverloadError = error.hasErrorLabel(MongoErrorLabel.SystemOverloadedError);
405
+
406
+ // Perhaps questionable and divergent from the spec, but considering MongoParseErrors like state change errors was legacy behavior.
407
+ if (isStateChangeError(error) || error instanceof MongoParseError) {
408
+ const shouldClearPool = isNodeShuttingDownError(error);
409
+
410
+ // from the SDAM spec: The driver MUST synchronize clearing the pool with updating the topology.
411
+ // In load balanced mode: there is no monitoring, so there is no topology to update. We simply clear the pool.
412
+ // For other topologies: the `ResetPool` label instructs the topology to clear the server's pool in `updateServer()`.
413
+ if (!this.loadBalanced) {
414
+ if (shouldClearPool) {
415
+ error.addErrorLabel(MongoErrorLabel.ResetPool);
416
+ }
417
+ markServerUnknown(this, error);
418
+ queueMicrotask(() => this.requestCheck());
419
+ return;
420
+ }
421
+
422
+ if (connection && shouldClearPool) {
423
+ this.pool.clear({ serviceId: connection.serviceId });
424
+ }
425
+ } else if (
426
+ isNetworkNonTimeoutError ||
427
+ isNetworkTimeoutBeforeHandshakeError ||
428
+ isAuthOrEstablishmentHandshakeError
429
+ ) {
430
+ // Do NOT clear the pool if we encounter a system overloaded error.
431
+ if (isSystemOverloadError) {
432
+ return;
433
+ }
434
+ // from the SDAM spec: The driver MUST synchronize clearing the pool with updating the topology.
435
+ // In load balanced mode: there is no monitoring, so there is no topology to update. We simply clear the pool.
436
+ // For other topologies: the `ResetPool` label instructs the topology to clear the server's pool in `updateServer()`.
437
+ if (!this.loadBalanced) {
438
+ error.addErrorLabel(MongoErrorLabel.ResetPool);
439
+ markServerUnknown(this, error);
440
+ } else if (connection) {
441
+ this.pool.clear({ serviceId: connection.serviceId });
442
+ }
443
+ }
444
+ }
445
+
446
+ /**
447
+ * Ensure that error is properly decorated and internal state is updated before throwing
448
+ * @internal
449
+ */
450
+ private decorateCommandError(
451
+ connection: Connection,
452
+ cmd: Document,
453
+ options: CommandOptions | GetMoreOptions | undefined,
454
+ error: unknown
455
+ ): Error {
456
+ if (typeof error !== 'object' || error == null || !('name' in error)) {
457
+ throw new MongoRuntimeError('An unexpected error type: ' + typeof error);
458
+ }
459
+
460
+ if (error.name === 'AbortError' && 'cause' in error && error.cause instanceof MongoError) {
461
+ error = error.cause;
462
+ }
463
+
464
+ if (!(error instanceof MongoError)) {
465
+ // Node.js or some other error we have not special handling for
466
+ return error as Error;
467
+ }
468
+
469
+ if (connectionIsStale(this.pool, connection)) {
470
+ return error;
471
+ }
472
+
473
+ const session = options?.session;
474
+ if (error instanceof MongoNetworkError) {
475
+ if (session && !session.hasEnded && session.serverSession) {
476
+ session.serverSession.isDirty = true;
477
+ }
478
+
479
+ // inActiveTransaction check handles commit and abort.
480
+ if (
481
+ inActiveTransaction(session, cmd) &&
482
+ !error.hasErrorLabel(MongoErrorLabel.TransientTransactionError)
483
+ ) {
484
+ error.addErrorLabel(MongoErrorLabel.TransientTransactionError);
485
+ }
486
+
487
+ if (
488
+ (isRetryableWritesEnabled(this.topology) || isTransactionCommand(cmd)) &&
489
+ supportsRetryableWrites(this) &&
490
+ !inActiveTransaction(session, cmd)
491
+ ) {
492
+ error.addErrorLabel(MongoErrorLabel.RetryableWriteError);
493
+ }
494
+ } else {
495
+ if (
496
+ (isRetryableWritesEnabled(this.topology) || isTransactionCommand(cmd)) &&
497
+ needsRetryableWriteLabel(error, maxWireVersion(this), this.description.type) &&
498
+ !inActiveTransaction(session, cmd)
499
+ ) {
500
+ error.addErrorLabel(MongoErrorLabel.RetryableWriteError);
501
+ }
502
+ }
503
+
504
+ if (
505
+ session &&
506
+ session.isPinned &&
507
+ error.hasErrorLabel(MongoErrorLabel.TransientTransactionError)
508
+ ) {
509
+ session.unpin({ force: true });
510
+ }
511
+
512
+ this.handleError(error, connection);
513
+
514
+ return error;
515
+ }
516
+
517
+ /**
518
+ * Decrement the operation count, returning the new count.
519
+ */
520
+ private decrementOperationCount(): number {
521
+ return (this.s.operationCount -= 1);
522
+ }
523
+
524
+ /**
525
+ * Increment the operation count, returning the new count.
526
+ */
527
+ private incrementOperationCount(): number {
528
+ return (this.s.operationCount += 1);
529
+ }
530
+ }
531
+
532
+ function markServerUnknown(server: Server, error?: MongoError) {
533
+ // Load balancer servers can never be marked unknown.
534
+ if (server.loadBalanced) {
535
+ return;
536
+ }
537
+
538
+ if (error instanceof MongoNetworkError && !(error instanceof MongoNetworkTimeoutError)) {
539
+ server.monitor?.reset();
540
+ }
541
+
542
+ server.emit(
543
+ Server.DESCRIPTION_RECEIVED,
544
+ new ServerDescription(server.description.hostAddress, undefined, { error })
545
+ );
546
+ }
547
+
548
+ function isPinnableCommand(cmd: Document, session?: ClientSession): boolean {
549
+ if (session) {
550
+ return (
551
+ session.inTransaction() ||
552
+ (session.transaction.isCommitted && 'commitTransaction' in cmd) ||
553
+ 'aggregate' in cmd ||
554
+ 'find' in cmd ||
555
+ 'getMore' in cmd ||
556
+ 'listCollections' in cmd ||
557
+ 'listIndexes' in cmd ||
558
+ 'bulkWrite' in cmd
559
+ );
560
+ }
561
+
562
+ return false;
563
+ }
564
+
565
+ function connectionIsStale(pool: ConnectionPool, connection: Connection) {
566
+ if (connection.serviceId) {
567
+ return (
568
+ connection.generation !== pool.serviceGenerations.get(connection.serviceId.toHexString())
569
+ );
570
+ }
571
+
572
+ return connection.generation !== pool.generation;
573
+ }
574
+
575
+ function inActiveTransaction(session: ClientSession | undefined, cmd: Document) {
576
+ return session && session.inTransaction() && !isTransactionCommand(cmd);
577
+ }
578
+
579
+ /** this checks the retryWrites option passed down from the client options, it
580
+ * does not check if the server supports retryable writes */
581
+ function isRetryableWritesEnabled(topology: Topology) {
582
+ return topology.s.options.retryWrites !== false;
583
+ }
584
+
585
+ function isStaleError(server: Server, error: MongoError): boolean {
586
+ const currentGeneration = server.pool.generation;
587
+ const generation = error.connectionGeneration;
588
+
589
+ if (generation && generation < currentGeneration) {
590
+ return true;
591
+ }
592
+
593
+ const currentTopologyVersion = server.description.topologyVersion;
594
+ return compareTopologyVersion(currentTopologyVersion, error.topologyVersion) >= 0;
595
+ }