oxygen-cli 1.40.2-beta.1 → 1.40.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1750 -1742
- package/LICENSE +672 -672
- package/README.md +37 -37
- package/build/core/OxygenCore.js +1 -1
- package/build/core/OxygenEvents.js +1 -1
- package/build/core/OxygenModule.js +1 -1
- package/build/core/OxygenService.js +1 -1
- package/build/core/OxygenSubModule.js +1 -1
- package/build/core/WebDriverModule.js +1 -1
- package/build/core/utils.js +1 -1
- package/build/errors/HookError.js +1 -1
- package/build/errors/ModuleError.js +1 -1
- package/build/errors/ModuleUnavailableError.js +1 -1
- package/build/errors/OxygenError.js +1 -1
- package/build/errors/ScriptNotFound.js +1 -1
- package/build/errors/helper.js +1 -2
- package/build/index.js +1 -1
- package/build/lib/cli-util.js +1 -5
- package/build/lib/cli.js +1 -1
- package/build/lib/debugger.js +1 -1
- package/build/lib/img-merge.js +1 -1
- package/build/lib/launcher.js +1 -1
- package/build/lib/logger.js +43 -43
- package/build/lib/moduleRequire.js +1 -1
- package/build/lib/parallel-launcher.js +1 -1
- package/build/lib/param-manager.js +1 -1
- package/build/lib/param-reader-csv.js +1 -1
- package/build/lib/param-reader-excel.js +1 -1
- package/build/lib/param-reader-json.js +1 -1
- package/build/lib/text-to-image.js +1 -1
- package/build/lib/util.js +1 -1
- package/build/model/case-result.js +1 -1
- package/build/model/failure.js +1 -1
- package/build/model/status.js +1 -1
- package/build/model/step-result.js +1 -1
- package/build/model/suite-result.js +1 -1
- package/build/model/test-result.js +1 -1
- package/build/model/testcase.js +1 -1
- package/build/model/testsuite.js +1 -1
- package/build/ox_modules/index.js +1 -9
- package/build/ox_modules/module-assert.js +37 -37
- package/build/ox_modules/module-date.js +24 -24
- package/build/ox_modules/module-db.js +52 -52
- package/build/ox_modules/module-email.js +59 -59
- package/build/ox_modules/module-eyes.js +34 -34
- package/build/ox_modules/module-http/ntlm-util.js +10 -10
- package/build/ox_modules/module-http/ntlm.js +15 -15
- package/build/ox_modules/module-http.js +132 -132
- package/build/ox_modules/module-log.js +27 -27
- package/build/ox_modules/module-mailinator.js +87 -87
- package/build/ox_modules/module-mob/commands/alertAccept.js +17 -17
- package/build/ox_modules/module-mob/commands/alertDismiss.js +17 -17
- package/build/ox_modules/module-mob/commands/assertAlert.js +20 -20
- package/build/ox_modules/module-mob/commands/assertText.js +21 -21
- package/build/ox_modules/module-mob/commands/assertTitle.js +19 -19
- package/build/ox_modules/module-mob/commands/assertValue.js +18 -18
- package/build/ox_modules/module-mob/commands/back.js +16 -16
- package/build/ox_modules/module-mob/commands/clear.js +19 -19
- package/build/ox_modules/module-mob/commands/click.js +17 -17
- package/build/ox_modules/module-mob/commands/clickHidden.js +17 -17
- package/build/ox_modules/module-mob/commands/clickLong.js +18 -18
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +18 -18
- package/build/ox_modules/module-mob/commands/closeApp.js +16 -16
- package/build/ox_modules/module-mob/commands/debug.js +16 -16
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +19 -19
- package/build/ox_modules/module-mob/commands/enableNetwork.js +27 -27
- package/build/ox_modules/module-mob/commands/execute.js +21 -21
- package/build/ox_modules/module-mob/commands/findElement.js +20 -20
- package/build/ox_modules/module-mob/commands/findElements.js +23 -23
- package/build/ox_modules/module-mob/commands/getAlertText.js +17 -17
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +15 -15
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +15 -15
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +16 -16
- package/build/ox_modules/module-mob/commands/getLocation.js +20 -20
- package/build/ox_modules/module-mob/commands/getSource.js +16 -16
- package/build/ox_modules/module-mob/commands/getText.js +18 -18
- package/build/ox_modules/module-mob/commands/getTitle.js +13 -13
- package/build/ox_modules/module-mob/commands/getUrl.js +17 -17
- package/build/ox_modules/module-mob/commands/getValue.js +18 -18
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +17 -17
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +21 -21
- package/build/ox_modules/module-mob/commands/index.js +1 -1
- package/build/ox_modules/module-mob/commands/installApp.js +16 -16
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +16 -16
- package/build/ox_modules/module-mob/commands/isCheckable.js +18 -18
- package/build/ox_modules/module-mob/commands/isChecked.js +18 -18
- package/build/ox_modules/module-mob/commands/isClickable.js +18 -18
- package/build/ox_modules/module-mob/commands/isExist.js +19 -19
- package/build/ox_modules/module-mob/commands/isSelected.js +23 -23
- package/build/ox_modules/module-mob/commands/isVisible.js +19 -19
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +16 -16
- package/build/ox_modules/module-mob/commands/launchApp.js +15 -15
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +18 -18
- package/build/ox_modules/module-mob/commands/open.js +17 -17
- package/build/ox_modules/module-mob/commands/pause.js +16 -16
- package/build/ox_modules/module-mob/commands/removeApp.js +16 -16
- package/build/ox_modules/module-mob/commands/resetApp.js +15 -15
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +22 -22
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +27 -27
- package/build/ox_modules/module-mob/commands/select.js +24 -24
- package/build/ox_modules/module-mob/commands/selectFrame.js +23 -23
- package/build/ox_modules/module-mob/commands/selectWindow.js +28 -28
- package/build/ox_modules/module-mob/commands/sendKeys.js +29 -29
- package/build/ox_modules/module-mob/commands/setContext.js +16 -16
- package/build/ox_modules/module-mob/commands/setNativeContext.js +15 -15
- package/build/ox_modules/module-mob/commands/setTimeout.js +21 -21
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +16 -16
- package/build/ox_modules/module-mob/commands/shake.js +16 -16
- package/build/ox_modules/module-mob/commands/smsClickLink.js +19 -19
- package/build/ox_modules/module-mob/commands/smsGetText.js +20 -20
- package/build/ox_modules/module-mob/commands/swipe.js +20 -20
- package/build/ox_modules/module-mob/commands/swipeElement.js +20 -20
- package/build/ox_modules/module-mob/commands/swipeScreen.js +20 -20
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +17 -17
- package/build/ox_modules/module-mob/commands/tap.js +17 -17
- package/build/ox_modules/module-mob/commands/type.js +20 -20
- package/build/ox_modules/module-mob/commands/unlockPattern.js +22 -22
- package/build/ox_modules/module-mob/commands/waitForExist.js +18 -18
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +17 -17
- package/build/ox_modules/module-mob/commands/waitForVisible.js +17 -17
- package/build/ox_modules/module-mob.js +74 -74
- package/build/ox_modules/module-pdf.js +35 -35
- package/build/ox_modules/module-proxy.js +77 -77
- package/build/ox_modules/module-serial.js +55 -55
- package/build/ox_modules/module-shell.js +52 -33
- package/build/ox_modules/module-soap.js +72 -72
- package/build/ox_modules/module-twilio.js +41 -41
- package/build/ox_modules/module-utils.js +91 -91
- package/build/ox_modules/module-web/commands/alertAccept.js +17 -17
- package/build/ox_modules/module-web/commands/alertDismiss.js +17 -17
- package/build/ox_modules/module-web/commands/assertAlert.js +20 -20
- package/build/ox_modules/module-web/commands/assertExist.js +17 -17
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +21 -21
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +21 -21
- package/build/ox_modules/module-web/commands/assertText.js +21 -21
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +18 -18
- package/build/ox_modules/module-web/commands/assertTextPresent.js +18 -18
- package/build/ox_modules/module-web/commands/assertTitle.js +19 -19
- package/build/ox_modules/module-web/commands/assertValue.js +20 -20
- package/build/ox_modules/module-web/commands/back.js +16 -16
- package/build/ox_modules/module-web/commands/clear.js +18 -18
- package/build/ox_modules/module-web/commands/click.js +25 -25
- package/build/ox_modules/module-web/commands/clickHidden.js +23 -23
- package/build/ox_modules/module-web/commands/closeWindow.js +15 -15
- package/build/ox_modules/module-web/commands/debug.js +15 -15
- package/build/ox_modules/module-web/commands/deleteCookies.js +12 -12
- package/build/ox_modules/module-web/commands/deselect.js +22 -22
- package/build/ox_modules/module-web/commands/doubleClick.js +17 -17
- package/build/ox_modules/module-web/commands/dragAndDrop.js +20 -20
- package/build/ox_modules/module-web/commands/execute.js +24 -24
- package/build/ox_modules/module-web/commands/fileBrowse.js +18 -18
- package/build/ox_modules/module-web/commands/findElement.js +19 -19
- package/build/ox_modules/module-web/commands/findElements.js +22 -22
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +14 -14
- package/build/ox_modules/module-web/commands/getAlertText.js +16 -16
- package/build/ox_modules/module-web/commands/getAttribute.js +19 -19
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +17 -17
- package/build/ox_modules/module-web/commands/getCookies.js +13 -13
- package/build/ox_modules/module-web/commands/getCssValue.js +19 -19
- package/build/ox_modules/module-web/commands/getElementCount.js +17 -17
- package/build/ox_modules/module-web/commands/getHTML.js +17 -17
- package/build/ox_modules/module-web/commands/getSource.js +16 -16
- package/build/ox_modules/module-web/commands/getText.js +18 -18
- package/build/ox_modules/module-web/commands/getTitle.js +12 -12
- package/build/ox_modules/module-web/commands/getUrl.js +16 -16
- package/build/ox_modules/module-web/commands/getValue.js +18 -18
- package/build/ox_modules/module-web/commands/getWindowHandles.js +16 -16
- package/build/ox_modules/module-web/commands/getWindowSize.js +16 -16
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +16 -16
- package/build/ox_modules/module-web/commands/index.js +1 -1
- package/build/ox_modules/module-web/commands/isAlertPresent.js +16 -16
- package/build/ox_modules/module-web/commands/isChecked.js +18 -18
- package/build/ox_modules/module-web/commands/isExist.js +19 -19
- package/build/ox_modules/module-web/commands/isInteractable.js +22 -22
- package/build/ox_modules/module-web/commands/isSelected.js +23 -23
- package/build/ox_modules/module-web/commands/isVisible.js +19 -19
- package/build/ox_modules/module-web/commands/makeVisible.js +25 -25
- package/build/ox_modules/module-web/commands/maximizeWindow.js +14 -14
- package/build/ox_modules/module-web/commands/minimizeWindow.js +14 -14
- package/build/ox_modules/module-web/commands/mock.js +20 -20
- package/build/ox_modules/module-web/commands/mockClearAll.js +12 -12
- package/build/ox_modules/module-web/commands/mockRestoreAll.js +12 -12
- package/build/ox_modules/module-web/commands/newWindow.js +16 -16
- package/build/ox_modules/module-web/commands/open.js +16 -16
- package/build/ox_modules/module-web/commands/pause.js +15 -15
- package/build/ox_modules/module-web/commands/point.js +21 -21
- package/build/ox_modules/module-web/commands/pointJS.js +15 -15
- package/build/ox_modules/module-web/commands/refresh.js +15 -15
- package/build/ox_modules/module-web/commands/rightClick.js +17 -17
- package/build/ox_modules/module-web/commands/rightClickActions.js +19 -19
- package/build/ox_modules/module-web/commands/scrollToElement.js +21 -21
- package/build/ox_modules/module-web/commands/select.js +23 -23
- package/build/ox_modules/module-web/commands/selectFrame.js +24 -24
- package/build/ox_modules/module-web/commands/selectWindow.js +27 -27
- package/build/ox_modules/module-web/commands/sendKeys.js +22 -22
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +20 -20
- package/build/ox_modules/module-web/commands/setTimeout.js +21 -21
- package/build/ox_modules/module-web/commands/setWindowSize.js +17 -17
- package/build/ox_modules/module-web/commands/takeScreenshot.js +17 -17
- package/build/ox_modules/module-web/commands/type.js +20 -20
- package/build/ox_modules/module-web/commands/verifyAlert.js +20 -20
- package/build/ox_modules/module-web/commands/verifyExist.js +17 -17
- package/build/ox_modules/module-web/commands/verifySelectedLabel.js +21 -21
- package/build/ox_modules/module-web/commands/verifySelectedValue.js +21 -21
- package/build/ox_modules/module-web/commands/verifyText.js +21 -21
- package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +18 -18
- package/build/ox_modules/module-web/commands/verifyTextPresent.js +18 -18
- package/build/ox_modules/module-web/commands/verifyTitle.js +19 -19
- package/build/ox_modules/module-web/commands/verifyValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForAngular.js +19 -19
- package/build/ox_modules/module-web/commands/waitForExist.js +17 -17
- package/build/ox_modules/module-web/commands/waitForInteractable.js +17 -17
- package/build/ox_modules/module-web/commands/waitForNotExist.js +17 -17
- package/build/ox_modules/module-web/commands/waitForNotText.js +20 -20
- package/build/ox_modules/module-web/commands/waitForNotValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForText.js +20 -20
- package/build/ox_modules/module-web/commands/waitForValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForVisible.js +17 -17
- package/build/ox_modules/module-web/commands/waitForWindow.js +22 -22
- package/build/ox_modules/module-web.js +94 -94
- package/build/ox_modules/module-win/commands/assertText.js +17 -17
- package/build/ox_modules/module-win/commands/assertTitle.js +15 -15
- package/build/ox_modules/module-win/commands/assertValue.js +14 -14
- package/build/ox_modules/module-win/commands/back.js +11 -11
- package/build/ox_modules/module-win/commands/clear.js +13 -13
- package/build/ox_modules/module-win/commands/click.js +13 -13
- package/build/ox_modules/module-win/commands/clickLong.js +14 -14
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +14 -14
- package/build/ox_modules/module-win/commands/findElement.js +15 -15
- package/build/ox_modules/module-win/commands/findElements.js +15 -15
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +12 -12
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +15 -15
- package/build/ox_modules/module-win/commands/getLocation.js +14 -14
- package/build/ox_modules/module-win/commands/getSource.js +12 -12
- package/build/ox_modules/module-win/commands/getText.js +14 -14
- package/build/ox_modules/module-win/commands/getValue.js +14 -14
- package/build/ox_modules/module-win/commands/getWindowHandles.js +15 -15
- package/build/ox_modules/module-win/commands/index.js +1 -1
- package/build/ox_modules/module-win/commands/isCheckable.js +14 -14
- package/build/ox_modules/module-win/commands/isChecked.js +14 -14
- package/build/ox_modules/module-win/commands/isClickable.js +14 -14
- package/build/ox_modules/module-win/commands/isExist.js +15 -15
- package/build/ox_modules/module-win/commands/isSelected.js +14 -14
- package/build/ox_modules/module-win/commands/isVisible.js +15 -15
- package/build/ox_modules/module-win/commands/open.js +13 -13
- package/build/ox_modules/module-win/commands/pause.js +12 -12
- package/build/ox_modules/module-win/commands/rightClick.js +13 -13
- package/build/ox_modules/module-win/commands/selectWindow.js +23 -23
- package/build/ox_modules/module-win/commands/sendKeys.js +22 -22
- package/build/ox_modules/module-win/commands/setTimeout.js +17 -17
- package/build/ox_modules/module-win/commands/takeScreenshot.js +16 -16
- package/build/ox_modules/module-win/commands/tap.js +13 -13
- package/build/ox_modules/module-win/commands/type.js +16 -16
- package/build/ox_modules/module-win/commands/waitForExist.js +14 -14
- package/build/ox_modules/module-win/commands/waitForInteractable.js +16 -16
- package/build/ox_modules/module-win/commands/waitForVisible.js +13 -13
- package/build/ox_modules/module-win.js +47 -47
- package/build/ox_modules/utils.js +8 -8
- package/build/ox_reporters/excel/template.json +48 -48
- package/build/ox_reporters/html/index.ejs +163 -163
- package/build/ox_reporters/html/summary.ejs +77 -77
- package/build/ox_reporters/html/tests-details.ejs +134 -134
- package/build/ox_reporters/html/tests-devices-browsers.ejs +83 -83
- package/build/ox_reporters/reporter-excel.js +1 -1
- package/build/ox_reporters/reporter-html.js +1 -1
- package/build/ox_reporters/reporter-json.js +1 -1
- package/build/ox_reporters/reporter-junit.js +1 -1
- package/build/ox_reporters/reporter-pdf.js +1 -1
- package/build/ox_reporters/reporter-rp.js +73 -42
- package/build/ox_reporters/reporter-xml.js +1 -1
- package/build/ox_services/service-devtools/submodule-network.js +1 -1
- package/build/ox_services/service-devtools.js +1 -1
- package/build/reporter/FileReporterBase.js +1 -1
- package/build/reporter/ReportAggregator.js +5 -13
- package/build/reporter/ReporterBase.js +1 -1
- package/build/reporter/WebSocketReporter.js +1 -1
- package/build/runners/WorkerProcess.js +1 -1
- package/build/runners/cucumber/CucumberEventListener.js +1 -1
- package/build/runners/cucumber/CucumberReporter.js +1 -1
- package/build/runners/cucumber/CucumberWorker.js +1 -1
- package/build/runners/cucumber/index.js +1 -1
- package/build/runners/cucumber/worker.js +1 -1
- package/build/runners/index.js +1 -1
- package/build/runners/oxygen/OxygenWorker.js +1 -1
- package/build/runners/oxygen/index.js +1 -1
- package/build/runners/oxygen/worker.js +1 -1
- package/config/default.json +6 -6
- package/package.json +137 -139
- package/types/index.d.ts +70 -70
- package/types/module-eyes.d.ts +39 -39
- package/types/module-http.d.ts +163 -163
- package/types/module-log.d.ts +34 -34
- package/types/module-mob.d.ts +966 -966
- package/types/module-pdf.d.ts +40 -40
- package/types/module-proxy.d.ts +100 -100
- package/types/module-shell.d.ts +24 -24
- package/types/module-utils.d.ts +99 -99
- package/types/module-web.d.ts +1053 -1053
- package/types/module-win.d.ts +352 -352
- package/types/oxygen.d.ts +53 -53
- package/build/ox_modules/module-mongo.js +0 -302
- package/log.txt +0 -1614
- package/reports/2025-06-08_231627/report.html +0 -440
- package/reports/2025-06-09_223615/report.html +0 -440
- package/transpiled/mongodb/etc/prepare.js +0 -18
- package/transpiled/mongodb/lib/admin.js +0 -182
- package/transpiled/mongodb/lib/beta.js +0 -26
- package/transpiled/mongodb/lib/bson.js +0 -220
- package/transpiled/mongodb/lib/bulk/common.js +0 -1041
- package/transpiled/mongodb/lib/bulk/ordered.js +0 -76
- package/transpiled/mongodb/lib/bulk/unordered.js +0 -102
- package/transpiled/mongodb/lib/change_stream.js +0 -517
- package/transpiled/mongodb/lib/client-side-encryption/auto_encrypter.js +0 -329
- package/transpiled/mongodb/lib/client-side-encryption/client_encryption.js +0 -779
- package/transpiled/mongodb/lib/client-side-encryption/crypto_callbacks.js +0 -95
- package/transpiled/mongodb/lib/client-side-encryption/errors.js +0 -171
- package/transpiled/mongodb/lib/client-side-encryption/mongocryptd_manager.js +0 -98
- package/transpiled/mongodb/lib/client-side-encryption/providers/aws.js +0 -34
- package/transpiled/mongodb/lib/client-side-encryption/providers/azure.js +0 -186
- package/transpiled/mongodb/lib/client-side-encryption/providers/gcp.js +0 -29
- package/transpiled/mongodb/lib/client-side-encryption/providers/index.js +0 -58
- package/transpiled/mongodb/lib/client-side-encryption/state_machine.js +0 -505
- package/transpiled/mongodb/lib/cmap/auth/auth_provider.js +0 -63
- package/transpiled/mongodb/lib/cmap/auth/aws_temporary_credentials.js +0 -167
- package/transpiled/mongodb/lib/cmap/auth/gssapi.js +0 -207
- package/transpiled/mongodb/lib/cmap/auth/mongo_credentials.js +0 -193
- package/transpiled/mongodb/lib/cmap/auth/mongodb_aws.js +0 -181
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/automated_callback_workflow.js +0 -101
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/azure_machine_workflow.js +0 -81
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/callback_workflow.js +0 -174
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/command_builders.js +0 -59
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/gcp_machine_workflow.js +0 -58
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/human_callback_workflow.js +0 -138
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/k8s_machine_workflow.js +0 -42
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/token_cache.js +0 -71
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/token_machine_workflow.js +0 -34
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc.js +0 -111
- package/transpiled/mongodb/lib/cmap/auth/plain.js +0 -43
- package/transpiled/mongodb/lib/cmap/auth/providers.js +0 -22
- package/transpiled/mongodb/lib/cmap/auth/scram.js +0 -318
- package/transpiled/mongodb/lib/cmap/auth/x509.js +0 -61
- package/transpiled/mongodb/lib/cmap/command_monitoring_events.js +0 -266
- package/transpiled/mongodb/lib/cmap/commands.js +0 -605
- package/transpiled/mongodb/lib/cmap/connect.js +0 -418
- package/transpiled/mongodb/lib/cmap/connection.js +0 -673
- package/transpiled/mongodb/lib/cmap/connection_pool.js +0 -688
- package/transpiled/mongodb/lib/cmap/connection_pool_events.js +0 -254
- package/transpiled/mongodb/lib/cmap/errors.js +0 -128
- package/transpiled/mongodb/lib/cmap/handshake/client_metadata.js +0 -278
- package/transpiled/mongodb/lib/cmap/metrics.js +0 -67
- package/transpiled/mongodb/lib/cmap/stream_description.js +0 -74
- package/transpiled/mongodb/lib/cmap/wire_protocol/compression.js +0 -196
- package/transpiled/mongodb/lib/cmap/wire_protocol/constants.js +0 -19
- package/transpiled/mongodb/lib/cmap/wire_protocol/on_data.js +0 -144
- package/transpiled/mongodb/lib/cmap/wire_protocol/on_demand/document.js +0 -278
- package/transpiled/mongodb/lib/cmap/wire_protocol/responses.js +0 -376
- package/transpiled/mongodb/lib/cmap/wire_protocol/shared.js +0 -49
- package/transpiled/mongodb/lib/collection.js +0 -852
- package/transpiled/mongodb/lib/connection_string.js +0 -1452
- package/transpiled/mongodb/lib/constants.js +0 -162
- package/transpiled/mongodb/lib/cursor/abstract_cursor.js +0 -1082
- package/transpiled/mongodb/lib/cursor/aggregation_cursor.js +0 -227
- package/transpiled/mongodb/lib/cursor/change_stream_cursor.js +0 -136
- package/transpiled/mongodb/lib/cursor/client_bulk_write_cursor.js +0 -69
- package/transpiled/mongodb/lib/cursor/find_cursor.js +0 -476
- package/transpiled/mongodb/lib/cursor/list_collections_cursor.js +0 -48
- package/transpiled/mongodb/lib/cursor/list_indexes_cursor.js +0 -46
- package/transpiled/mongodb/lib/cursor/list_search_indexes_cursor.js +0 -30
- package/transpiled/mongodb/lib/cursor/run_command_cursor.js +0 -125
- package/transpiled/mongodb/lib/db.js +0 -467
- package/transpiled/mongodb/lib/deps.js +0 -174
- package/transpiled/mongodb/lib/encrypter.js +0 -129
- package/transpiled/mongodb/lib/error.js +0 -1550
- package/transpiled/mongodb/lib/explain.js +0 -122
- package/transpiled/mongodb/lib/gridfs/download.js +0 -369
- package/transpiled/mongodb/lib/gridfs/index.js +0 -240
- package/transpiled/mongodb/lib/gridfs/upload.js +0 -446
- package/transpiled/mongodb/lib/index.js +0 -975
- package/transpiled/mongodb/lib/mongo_client.js +0 -626
- package/transpiled/mongodb/lib/mongo_client_auth_providers.js +0 -98
- package/transpiled/mongodb/lib/mongo_logger.js +0 -812
- package/transpiled/mongodb/lib/mongo_types.js +0 -71
- package/transpiled/mongodb/lib/operations/aggregate.js +0 -129
- package/transpiled/mongodb/lib/operations/bulk_write.js +0 -48
- package/transpiled/mongodb/lib/operations/client_bulk_write/client_bulk_write.js +0 -96
- package/transpiled/mongodb/lib/operations/client_bulk_write/command_builder.js +0 -409
- package/transpiled/mongodb/lib/operations/client_bulk_write/common.js +0 -5
- package/transpiled/mongodb/lib/operations/client_bulk_write/executor.js +0 -144
- package/transpiled/mongodb/lib/operations/client_bulk_write/results_merger.js +0 -228
- package/transpiled/mongodb/lib/operations/collections.js +0 -49
- package/transpiled/mongodb/lib/operations/command.js +0 -102
- package/transpiled/mongodb/lib/operations/count.js +0 -60
- package/transpiled/mongodb/lib/operations/create_collection.js +0 -109
- package/transpiled/mongodb/lib/operations/delete.js +0 -134
- package/transpiled/mongodb/lib/operations/distinct.js +0 -77
- package/transpiled/mongodb/lib/operations/drop.js +0 -102
- package/transpiled/mongodb/lib/operations/estimated_document_count.js +0 -47
- package/transpiled/mongodb/lib/operations/execute_operation.js +0 -251
- package/transpiled/mongodb/lib/operations/find.js +0 -197
- package/transpiled/mongodb/lib/operations/find_and_modify.js +0 -191
- package/transpiled/mongodb/lib/operations/get_more.js +0 -84
- package/transpiled/mongodb/lib/operations/indexes.js +0 -197
- package/transpiled/mongodb/lib/operations/insert.js +0 -138
- package/transpiled/mongodb/lib/operations/is_capped.js +0 -44
- package/transpiled/mongodb/lib/operations/kill_cursors.js +0 -58
- package/transpiled/mongodb/lib/operations/list_collections.js +0 -66
- package/transpiled/mongodb/lib/operations/list_databases.js +0 -56
- package/transpiled/mongodb/lib/operations/operation.js +0 -88
- package/transpiled/mongodb/lib/operations/options_operation.js +0 -44
- package/transpiled/mongodb/lib/operations/profiling_level.js +0 -42
- package/transpiled/mongodb/lib/operations/remove_user.js +0 -35
- package/transpiled/mongodb/lib/operations/rename.js +0 -48
- package/transpiled/mongodb/lib/operations/run_command.js +0 -64
- package/transpiled/mongodb/lib/operations/search_indexes/create.js +0 -41
- package/transpiled/mongodb/lib/operations/search_indexes/drop.js +0 -51
- package/transpiled/mongodb/lib/operations/search_indexes/update.js +0 -40
- package/transpiled/mongodb/lib/operations/set_profiling_level.js +0 -70
- package/transpiled/mongodb/lib/operations/stats.js +0 -39
- package/transpiled/mongodb/lib/operations/update.js +0 -218
- package/transpiled/mongodb/lib/operations/validate_collection.js +0 -49
- package/transpiled/mongodb/lib/read_concern.js +0 -92
- package/transpiled/mongodb/lib/read_preference.js +0 -215
- package/transpiled/mongodb/lib/resource_management.js +0 -74
- package/transpiled/mongodb/lib/sdam/common.js +0 -53
- package/transpiled/mongodb/lib/sdam/events.js +0 -177
- package/transpiled/mongodb/lib/sdam/monitor.js +0 -656
- package/transpiled/mongodb/lib/sdam/server.js +0 -463
- package/transpiled/mongodb/lib/sdam/server_description.js +0 -196
- package/transpiled/mongodb/lib/sdam/server_selection.js +0 -283
- package/transpiled/mongodb/lib/sdam/server_selection_events.js +0 -112
- package/transpiled/mongodb/lib/sdam/srv_polling.js +0 -139
- package/transpiled/mongodb/lib/sdam/topology.js +0 -833
- package/transpiled/mongodb/lib/sdam/topology_description.js +0 -447
- package/transpiled/mongodb/lib/sessions.js +0 -988
- package/transpiled/mongodb/lib/sort.js +0 -123
- package/transpiled/mongodb/lib/timeout.js +0 -349
- package/transpiled/mongodb/lib/transactions.js +0 -149
- package/transpiled/mongodb/lib/utils.js +0 -1502
- package/transpiled/mongodb/lib/write_concern.js +0 -115
|
@@ -1,1082 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.CursorTimeoutContext = exports.AbstractCursor = exports.CursorTimeoutMode = exports.CURSOR_FLAGS = void 0;
|
|
7
|
-
|
|
8
|
-
const stream_1 = require("stream");
|
|
9
|
-
|
|
10
|
-
const bson_1 = require("../bson");
|
|
11
|
-
|
|
12
|
-
const error_1 = require("../error");
|
|
13
|
-
|
|
14
|
-
const mongo_types_1 = require("../mongo_types");
|
|
15
|
-
|
|
16
|
-
const execute_operation_1 = require("../operations/execute_operation");
|
|
17
|
-
|
|
18
|
-
const get_more_1 = require("../operations/get_more");
|
|
19
|
-
|
|
20
|
-
const kill_cursors_1 = require("../operations/kill_cursors");
|
|
21
|
-
|
|
22
|
-
const read_concern_1 = require("../read_concern");
|
|
23
|
-
|
|
24
|
-
const read_preference_1 = require("../read_preference");
|
|
25
|
-
|
|
26
|
-
const resource_management_1 = require("../resource_management");
|
|
27
|
-
|
|
28
|
-
const sessions_1 = require("../sessions");
|
|
29
|
-
|
|
30
|
-
const timeout_1 = require("../timeout");
|
|
31
|
-
|
|
32
|
-
const utils_1 = require("../utils");
|
|
33
|
-
/** @public */
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
exports.CURSOR_FLAGS = ['tailable', 'oplogReplay', 'noCursorTimeout', 'awaitData', 'exhaust', 'partial'];
|
|
37
|
-
|
|
38
|
-
function removeActiveCursor() {
|
|
39
|
-
this.client.s.activeCursors.delete(this);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* @public
|
|
43
|
-
* @experimental
|
|
44
|
-
* Specifies how `timeoutMS` is applied to the cursor. Can be either `'cursorLifeTime'` or `'iteration'`
|
|
45
|
-
* When set to `'iteration'`, the deadline specified by `timeoutMS` applies to each call of
|
|
46
|
-
* `cursor.next()`.
|
|
47
|
-
* When set to `'cursorLifetime'`, the deadline applies to the life of the entire cursor.
|
|
48
|
-
*
|
|
49
|
-
* Depending on the type of cursor being used, this option has different default values.
|
|
50
|
-
* For non-tailable cursors, this value defaults to `'cursorLifetime'`
|
|
51
|
-
* For tailable cursors, this value defaults to `'iteration'` since tailable cursors, by
|
|
52
|
-
* definition can have an arbitrarily long lifetime.
|
|
53
|
-
*
|
|
54
|
-
* @example
|
|
55
|
-
* ```ts
|
|
56
|
-
* const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
|
|
57
|
-
* for await (const doc of cursor) {
|
|
58
|
-
* // process doc
|
|
59
|
-
* // This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
|
|
60
|
-
* // will continue to iterate successfully otherwise, regardless of the number of batches.
|
|
61
|
-
* }
|
|
62
|
-
* ```
|
|
63
|
-
*
|
|
64
|
-
* @example
|
|
65
|
-
* ```ts
|
|
66
|
-
* const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
|
|
67
|
-
* const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms.
|
|
68
|
-
* ```
|
|
69
|
-
*/
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
exports.CursorTimeoutMode = Object.freeze({
|
|
73
|
-
ITERATION: 'iteration',
|
|
74
|
-
LIFETIME: 'cursorLifetime'
|
|
75
|
-
});
|
|
76
|
-
/** @public */
|
|
77
|
-
|
|
78
|
-
class AbstractCursor extends mongo_types_1.TypedEventEmitter {
|
|
79
|
-
/** @internal */
|
|
80
|
-
constructor(client, namespace, options = {}) {
|
|
81
|
-
super();
|
|
82
|
-
/** @internal */
|
|
83
|
-
|
|
84
|
-
this.documents = null;
|
|
85
|
-
/** @internal */
|
|
86
|
-
|
|
87
|
-
this.hasEmittedClose = false;
|
|
88
|
-
this.on('error', utils_1.noop);
|
|
89
|
-
|
|
90
|
-
if (!client.s.isMongoClient) {
|
|
91
|
-
throw new error_1.MongoRuntimeError('Cursor must be constructed with MongoClient');
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
this.cursorClient = client;
|
|
95
|
-
this.cursorNamespace = namespace;
|
|
96
|
-
this.cursorId = null;
|
|
97
|
-
this.initialized = false;
|
|
98
|
-
this.isClosed = false;
|
|
99
|
-
this.isKilled = false;
|
|
100
|
-
this.cursorOptions = {
|
|
101
|
-
readPreference: options.readPreference && options.readPreference instanceof read_preference_1.ReadPreference ? options.readPreference : read_preference_1.ReadPreference.primary,
|
|
102
|
-
...(0, bson_1.pluckBSONSerializeOptions)(options),
|
|
103
|
-
timeoutMS: options?.timeoutContext?.csotEnabled() ? options.timeoutContext.timeoutMS : options.timeoutMS,
|
|
104
|
-
tailable: options.tailable,
|
|
105
|
-
awaitData: options.awaitData
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
if (this.cursorOptions.timeoutMS != null) {
|
|
109
|
-
if (options.timeoutMode == null) {
|
|
110
|
-
if (options.tailable) {
|
|
111
|
-
if (options.awaitData) {
|
|
112
|
-
if (options.maxAwaitTimeMS != null && options.maxAwaitTimeMS >= this.cursorOptions.timeoutMS) throw new error_1.MongoInvalidArgumentError('Cannot specify maxAwaitTimeMS >= timeoutMS for a tailable awaitData cursor');
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
this.cursorOptions.timeoutMode = exports.CursorTimeoutMode.ITERATION;
|
|
116
|
-
} else {
|
|
117
|
-
this.cursorOptions.timeoutMode = exports.CursorTimeoutMode.LIFETIME;
|
|
118
|
-
}
|
|
119
|
-
} else {
|
|
120
|
-
if (options.tailable && options.timeoutMode === exports.CursorTimeoutMode.LIFETIME) {
|
|
121
|
-
throw new error_1.MongoInvalidArgumentError("Cannot set tailable cursor's timeoutMode to LIFETIME");
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
this.cursorOptions.timeoutMode = options.timeoutMode;
|
|
125
|
-
}
|
|
126
|
-
} else {
|
|
127
|
-
if (options.timeoutMode != null) throw new error_1.MongoInvalidArgumentError('Cannot set timeoutMode without setting timeoutMS');
|
|
128
|
-
} // Set for initial command
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
this.cursorOptions.omitMaxTimeMS = this.cursorOptions.timeoutMS != null && (this.cursorOptions.timeoutMode === exports.CursorTimeoutMode.ITERATION && !this.cursorOptions.tailable || this.cursorOptions.tailable && !this.cursorOptions.awaitData);
|
|
132
|
-
const readConcern = read_concern_1.ReadConcern.fromOptions(options);
|
|
133
|
-
|
|
134
|
-
if (readConcern) {
|
|
135
|
-
this.cursorOptions.readConcern = readConcern;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if (typeof options.batchSize === 'number') {
|
|
139
|
-
this.cursorOptions.batchSize = options.batchSize;
|
|
140
|
-
} // we check for undefined specifically here to allow falsy values
|
|
141
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
if (options.comment !== undefined) {
|
|
145
|
-
this.cursorOptions.comment = options.comment;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (typeof options.maxTimeMS === 'number') {
|
|
149
|
-
this.cursorOptions.maxTimeMS = options.maxTimeMS;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (typeof options.maxAwaitTimeMS === 'number') {
|
|
153
|
-
this.cursorOptions.maxAwaitTimeMS = options.maxAwaitTimeMS;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (options.session instanceof sessions_1.ClientSession) {
|
|
157
|
-
this.cursorSession = options.session;
|
|
158
|
-
} else {
|
|
159
|
-
this.cursorSession = this.cursorClient.startSession({
|
|
160
|
-
owner: this,
|
|
161
|
-
explicit: false
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
this.deserializationOptions = { ...this.cursorOptions,
|
|
166
|
-
validation: {
|
|
167
|
-
utf8: options?.enableUtf8Validation === false ? false : true
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
this.timeoutContext = options.timeoutContext;
|
|
171
|
-
this.signal = options.signal;
|
|
172
|
-
this.abortListener = (0, utils_1.addAbortListener)(this.signal, () => void this.close().then(undefined, utils_1.squashError));
|
|
173
|
-
this.trackCursor();
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* The cursor has no id until it receives a response from the initial cursor creating command.
|
|
177
|
-
*
|
|
178
|
-
* It is non-zero for as long as the database has an open cursor.
|
|
179
|
-
*
|
|
180
|
-
* The initiating command may receive a zero id if the entire result is in the `firstBatch`.
|
|
181
|
-
*/
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
get id() {
|
|
185
|
-
return this.cursorId ?? undefined;
|
|
186
|
-
}
|
|
187
|
-
/** @internal */
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
get isDead() {
|
|
191
|
-
return (this.cursorId?.isZero() ?? false) || this.isClosed || this.isKilled;
|
|
192
|
-
}
|
|
193
|
-
/** @internal */
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
get client() {
|
|
197
|
-
return this.cursorClient;
|
|
198
|
-
}
|
|
199
|
-
/** @internal */
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
get server() {
|
|
203
|
-
return this.selectedServer;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
get namespace() {
|
|
207
|
-
return this.cursorNamespace;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
get readPreference() {
|
|
211
|
-
return this.cursorOptions.readPreference;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
get readConcern() {
|
|
215
|
-
return this.cursorOptions.readConcern;
|
|
216
|
-
}
|
|
217
|
-
/** @internal */
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
get session() {
|
|
221
|
-
return this.cursorSession;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
set session(clientSession) {
|
|
225
|
-
this.cursorSession = clientSession;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* The cursor is closed and all remaining locally buffered documents have been iterated.
|
|
229
|
-
*/
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
get closed() {
|
|
233
|
-
return this.isClosed && (this.documents?.length ?? 0) === 0;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* A `killCursors` command was attempted on this cursor.
|
|
237
|
-
* This is performed if the cursor id is non zero.
|
|
238
|
-
*/
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
get killed() {
|
|
242
|
-
return this.isKilled;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
get loadBalanced() {
|
|
246
|
-
return !!this.cursorClient.topology?.loadBalanced;
|
|
247
|
-
}
|
|
248
|
-
/** @internal */
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
async asyncDispose() {
|
|
252
|
-
await this.close();
|
|
253
|
-
}
|
|
254
|
-
/** Adds cursor to client's tracking so it will be closed by MongoClient.close() */
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
trackCursor() {
|
|
258
|
-
this.cursorClient.s.activeCursors.add(this);
|
|
259
|
-
|
|
260
|
-
if (!this.listeners('close').includes(removeActiveCursor)) {
|
|
261
|
-
this.once('close', removeActiveCursor);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
/** Returns current buffered documents length */
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
bufferedCount() {
|
|
268
|
-
return this.documents?.length ?? 0;
|
|
269
|
-
}
|
|
270
|
-
/** Returns current buffered documents */
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
readBufferedDocuments(number) {
|
|
274
|
-
const bufferedDocs = [];
|
|
275
|
-
const documentsToRead = Math.min(number ?? this.documents?.length ?? 0, this.documents?.length ?? 0);
|
|
276
|
-
|
|
277
|
-
for (let count = 0; count < documentsToRead; count++) {
|
|
278
|
-
const document = this.documents?.shift(this.deserializationOptions);
|
|
279
|
-
|
|
280
|
-
if (document != null) {
|
|
281
|
-
bufferedDocs.push(document);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
return bufferedDocs;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
async *[Symbol.asyncIterator]() {
|
|
289
|
-
this.signal?.throwIfAborted();
|
|
290
|
-
|
|
291
|
-
if (this.closed) {
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
try {
|
|
296
|
-
while (true) {
|
|
297
|
-
if (this.isKilled) {
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
if (this.closed) {
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
if (this.cursorId != null && this.isDead && (this.documents?.length ?? 0) === 0) {
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
const document = await this.next(); // eslint-disable-next-line no-restricted-syntax
|
|
310
|
-
|
|
311
|
-
if (document === null) {
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
yield document;
|
|
316
|
-
this.signal?.throwIfAborted();
|
|
317
|
-
}
|
|
318
|
-
} finally {
|
|
319
|
-
// Only close the cursor if it has not already been closed. This finally clause handles
|
|
320
|
-
// the case when a user would break out of a for await of loop early.
|
|
321
|
-
if (!this.isClosed) {
|
|
322
|
-
try {
|
|
323
|
-
await this.close();
|
|
324
|
-
} catch (error) {
|
|
325
|
-
(0, utils_1.squashError)(error);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
stream(options) {
|
|
332
|
-
const readable = new ReadableCursorStream(this);
|
|
333
|
-
const abortListener = (0, utils_1.addAbortListener)(this.signal, function () {
|
|
334
|
-
readable.destroy(this.reason);
|
|
335
|
-
});
|
|
336
|
-
readable.once('end', () => {
|
|
337
|
-
abortListener?.[utils_1.kDispose]();
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
if (options?.transform) {
|
|
341
|
-
const transform = options.transform;
|
|
342
|
-
const transformedStream = readable.pipe(new stream_1.Transform({
|
|
343
|
-
objectMode: true,
|
|
344
|
-
highWaterMark: 1,
|
|
345
|
-
|
|
346
|
-
transform(chunk, _, callback) {
|
|
347
|
-
try {
|
|
348
|
-
const transformed = transform(chunk);
|
|
349
|
-
callback(undefined, transformed);
|
|
350
|
-
} catch (err) {
|
|
351
|
-
callback(err);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
})); // Bubble errors to transformed stream, because otherwise no way
|
|
356
|
-
// to handle this error.
|
|
357
|
-
|
|
358
|
-
readable.on('error', err => transformedStream.emit('error', err));
|
|
359
|
-
return transformedStream;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
return readable;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
async hasNext() {
|
|
366
|
-
this.signal?.throwIfAborted();
|
|
367
|
-
|
|
368
|
-
if (this.cursorId === bson_1.Long.ZERO) {
|
|
369
|
-
return false;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
if (this.cursorOptions.timeoutMode === exports.CursorTimeoutMode.ITERATION && this.cursorId != null) {
|
|
373
|
-
this.timeoutContext?.refresh();
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
try {
|
|
377
|
-
do {
|
|
378
|
-
if ((this.documents?.length ?? 0) !== 0) {
|
|
379
|
-
return true;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
await this.fetchBatch();
|
|
383
|
-
} while (!this.isDead || (this.documents?.length ?? 0) !== 0);
|
|
384
|
-
} finally {
|
|
385
|
-
if (this.cursorOptions.timeoutMode === exports.CursorTimeoutMode.ITERATION) {
|
|
386
|
-
this.timeoutContext?.clear();
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
return false;
|
|
391
|
-
}
|
|
392
|
-
/** Get the next available document from the cursor, returns null if no more documents are available. */
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
async next() {
|
|
396
|
-
this.signal?.throwIfAborted();
|
|
397
|
-
|
|
398
|
-
if (this.cursorId === bson_1.Long.ZERO) {
|
|
399
|
-
throw new error_1.MongoCursorExhaustedError();
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
if (this.cursorOptions.timeoutMode === exports.CursorTimeoutMode.ITERATION && this.cursorId != null) {
|
|
403
|
-
this.timeoutContext?.refresh();
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
try {
|
|
407
|
-
do {
|
|
408
|
-
const doc = this.documents?.shift(this.deserializationOptions);
|
|
409
|
-
|
|
410
|
-
if (doc != null) {
|
|
411
|
-
if (this.transform != null) return await this.transformDocument(doc);
|
|
412
|
-
return doc;
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
await this.fetchBatch();
|
|
416
|
-
} while (!this.isDead || (this.documents?.length ?? 0) !== 0);
|
|
417
|
-
} finally {
|
|
418
|
-
if (this.cursorOptions.timeoutMode === exports.CursorTimeoutMode.ITERATION) {
|
|
419
|
-
this.timeoutContext?.clear();
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
return null;
|
|
424
|
-
}
|
|
425
|
-
/**
|
|
426
|
-
* Try to get the next available document from the cursor or `null` if an empty batch is returned
|
|
427
|
-
*/
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
async tryNext() {
|
|
431
|
-
this.signal?.throwIfAborted();
|
|
432
|
-
|
|
433
|
-
if (this.cursorId === bson_1.Long.ZERO) {
|
|
434
|
-
throw new error_1.MongoCursorExhaustedError();
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
if (this.cursorOptions.timeoutMode === exports.CursorTimeoutMode.ITERATION && this.cursorId != null) {
|
|
438
|
-
this.timeoutContext?.refresh();
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
try {
|
|
442
|
-
let doc = this.documents?.shift(this.deserializationOptions);
|
|
443
|
-
|
|
444
|
-
if (doc != null) {
|
|
445
|
-
if (this.transform != null) return await this.transformDocument(doc);
|
|
446
|
-
return doc;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
await this.fetchBatch();
|
|
450
|
-
doc = this.documents?.shift(this.deserializationOptions);
|
|
451
|
-
|
|
452
|
-
if (doc != null) {
|
|
453
|
-
if (this.transform != null) return await this.transformDocument(doc);
|
|
454
|
-
return doc;
|
|
455
|
-
}
|
|
456
|
-
} finally {
|
|
457
|
-
if (this.cursorOptions.timeoutMode === exports.CursorTimeoutMode.ITERATION) {
|
|
458
|
-
this.timeoutContext?.clear();
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
return null;
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
|
-
* Iterates over all the documents for this cursor using the iterator, callback pattern.
|
|
466
|
-
*
|
|
467
|
-
* If the iterator returns `false`, iteration will stop.
|
|
468
|
-
*
|
|
469
|
-
* @param iterator - The iteration callback.
|
|
470
|
-
* @deprecated - Will be removed in a future release. Use for await...of instead.
|
|
471
|
-
*/
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
async forEach(iterator) {
|
|
475
|
-
this.signal?.throwIfAborted();
|
|
476
|
-
|
|
477
|
-
if (typeof iterator !== 'function') {
|
|
478
|
-
throw new error_1.MongoInvalidArgumentError('Argument "iterator" must be a function');
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
for await (const document of this) {
|
|
482
|
-
const result = iterator(document);
|
|
483
|
-
|
|
484
|
-
if (result === false) {
|
|
485
|
-
break;
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
/**
|
|
490
|
-
* Frees any client-side resources used by the cursor.
|
|
491
|
-
*/
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
async close(options) {
|
|
495
|
-
await this.cleanup(options?.timeoutMS);
|
|
496
|
-
}
|
|
497
|
-
/**
|
|
498
|
-
* Returns an array of documents. The caller is responsible for making sure that there
|
|
499
|
-
* is enough memory to store the results. Note that the array only contains partial
|
|
500
|
-
* results when this cursor had been previously accessed. In that case,
|
|
501
|
-
* cursor.rewind() can be used to reset the cursor.
|
|
502
|
-
*/
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
async toArray() {
|
|
506
|
-
this.signal?.throwIfAborted();
|
|
507
|
-
const array = []; // at the end of the loop (since readBufferedDocuments is called) the buffer will be empty
|
|
508
|
-
// then, the 'await of' syntax will run a getMore call
|
|
509
|
-
|
|
510
|
-
for await (const document of this) {
|
|
511
|
-
array.push(document);
|
|
512
|
-
const docs = this.readBufferedDocuments();
|
|
513
|
-
|
|
514
|
-
if (this.transform != null) {
|
|
515
|
-
for (const doc of docs) {
|
|
516
|
-
array.push(await this.transformDocument(doc));
|
|
517
|
-
}
|
|
518
|
-
} else {
|
|
519
|
-
array.push(...docs);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
return array;
|
|
524
|
-
}
|
|
525
|
-
/**
|
|
526
|
-
* Add a cursor flag to the cursor
|
|
527
|
-
*
|
|
528
|
-
* @param flag - The flag to set, must be one of following ['tailable', 'oplogReplay', 'noCursorTimeout', 'awaitData', 'partial' -.
|
|
529
|
-
* @param value - The flag boolean value.
|
|
530
|
-
*/
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
addCursorFlag(flag, value) {
|
|
534
|
-
this.throwIfInitialized();
|
|
535
|
-
|
|
536
|
-
if (!exports.CURSOR_FLAGS.includes(flag)) {
|
|
537
|
-
throw new error_1.MongoInvalidArgumentError(`Flag ${flag} is not one of ${exports.CURSOR_FLAGS}`);
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
if (typeof value !== 'boolean') {
|
|
541
|
-
throw new error_1.MongoInvalidArgumentError(`Flag ${flag} must be a boolean value`);
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
this.cursorOptions[flag] = value;
|
|
545
|
-
return this;
|
|
546
|
-
}
|
|
547
|
-
/**
|
|
548
|
-
* Map all documents using the provided function
|
|
549
|
-
* If there is a transform set on the cursor, that will be called first and the result passed to
|
|
550
|
-
* this function's transform.
|
|
551
|
-
*
|
|
552
|
-
* @remarks
|
|
553
|
-
*
|
|
554
|
-
* **Note** Cursors use `null` internally to indicate that there are no more documents in the cursor. Providing a mapping
|
|
555
|
-
* function that maps values to `null` will result in the cursor closing itself before it has finished iterating
|
|
556
|
-
* all documents. This will **not** result in a memory leak, just surprising behavior. For example:
|
|
557
|
-
*
|
|
558
|
-
* ```typescript
|
|
559
|
-
* const cursor = collection.find({});
|
|
560
|
-
* cursor.map(() => null);
|
|
561
|
-
*
|
|
562
|
-
* const documents = await cursor.toArray();
|
|
563
|
-
* // documents is always [], regardless of how many documents are in the collection.
|
|
564
|
-
* ```
|
|
565
|
-
*
|
|
566
|
-
* Other falsey values are allowed:
|
|
567
|
-
*
|
|
568
|
-
* ```typescript
|
|
569
|
-
* const cursor = collection.find({});
|
|
570
|
-
* cursor.map(() => '');
|
|
571
|
-
*
|
|
572
|
-
* const documents = await cursor.toArray();
|
|
573
|
-
* // documents is now an array of empty strings
|
|
574
|
-
* ```
|
|
575
|
-
*
|
|
576
|
-
* **Note for Typescript Users:** adding a transform changes the return type of the iteration of this cursor,
|
|
577
|
-
* it **does not** return a new instance of a cursor. This means when calling map,
|
|
578
|
-
* you should always assign the result to a new variable in order to get a correctly typed cursor variable.
|
|
579
|
-
* Take note of the following example:
|
|
580
|
-
*
|
|
581
|
-
* @example
|
|
582
|
-
* ```typescript
|
|
583
|
-
* const cursor: FindCursor<Document> = coll.find();
|
|
584
|
-
* const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
|
|
585
|
-
* const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
|
|
586
|
-
* ```
|
|
587
|
-
* @param transform - The mapping transformation method.
|
|
588
|
-
*/
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
map(transform) {
|
|
592
|
-
this.throwIfInitialized();
|
|
593
|
-
const oldTransform = this.transform;
|
|
594
|
-
|
|
595
|
-
if (oldTransform) {
|
|
596
|
-
this.transform = doc => {
|
|
597
|
-
return transform(oldTransform(doc));
|
|
598
|
-
};
|
|
599
|
-
} else {
|
|
600
|
-
this.transform = transform;
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
return this;
|
|
604
|
-
}
|
|
605
|
-
/**
|
|
606
|
-
* Set the ReadPreference for the cursor.
|
|
607
|
-
*
|
|
608
|
-
* @param readPreference - The new read preference for the cursor.
|
|
609
|
-
*/
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
withReadPreference(readPreference) {
|
|
613
|
-
this.throwIfInitialized();
|
|
614
|
-
|
|
615
|
-
if (readPreference instanceof read_preference_1.ReadPreference) {
|
|
616
|
-
this.cursorOptions.readPreference = readPreference;
|
|
617
|
-
} else if (typeof readPreference === 'string') {
|
|
618
|
-
this.cursorOptions.readPreference = read_preference_1.ReadPreference.fromString(readPreference);
|
|
619
|
-
} else {
|
|
620
|
-
throw new error_1.MongoInvalidArgumentError(`Invalid read preference: ${readPreference}`);
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
return this;
|
|
624
|
-
}
|
|
625
|
-
/**
|
|
626
|
-
* Set the ReadPreference for the cursor.
|
|
627
|
-
*
|
|
628
|
-
* @param readPreference - The new read preference for the cursor.
|
|
629
|
-
*/
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
withReadConcern(readConcern) {
|
|
633
|
-
this.throwIfInitialized();
|
|
634
|
-
const resolvedReadConcern = read_concern_1.ReadConcern.fromOptions({
|
|
635
|
-
readConcern
|
|
636
|
-
});
|
|
637
|
-
|
|
638
|
-
if (resolvedReadConcern) {
|
|
639
|
-
this.cursorOptions.readConcern = resolvedReadConcern;
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
return this;
|
|
643
|
-
}
|
|
644
|
-
/**
|
|
645
|
-
* Set a maxTimeMS on the cursor query, allowing for hard timeout limits on queries (Only supported on MongoDB 2.6 or higher)
|
|
646
|
-
*
|
|
647
|
-
* @param value - Number of milliseconds to wait before aborting the query.
|
|
648
|
-
*/
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
maxTimeMS(value) {
|
|
652
|
-
this.throwIfInitialized();
|
|
653
|
-
|
|
654
|
-
if (typeof value !== 'number') {
|
|
655
|
-
throw new error_1.MongoInvalidArgumentError('Argument for maxTimeMS must be a number');
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
this.cursorOptions.maxTimeMS = value;
|
|
659
|
-
return this;
|
|
660
|
-
}
|
|
661
|
-
/**
|
|
662
|
-
* Set the batch size for the cursor.
|
|
663
|
-
*
|
|
664
|
-
* @param value - The number of documents to return per batch. See {@link https://www.mongodb.com/docs/manual/reference/command/find/|find command documentation}.
|
|
665
|
-
*/
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
batchSize(value) {
|
|
669
|
-
this.throwIfInitialized();
|
|
670
|
-
|
|
671
|
-
if (this.cursorOptions.tailable) {
|
|
672
|
-
throw new error_1.MongoTailableCursorError('Tailable cursor does not support batchSize');
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
if (typeof value !== 'number') {
|
|
676
|
-
throw new error_1.MongoInvalidArgumentError('Operation "batchSize" requires an integer');
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
this.cursorOptions.batchSize = value;
|
|
680
|
-
return this;
|
|
681
|
-
}
|
|
682
|
-
/**
|
|
683
|
-
* Rewind this cursor to its uninitialized state. Any options that are present on the cursor will
|
|
684
|
-
* remain in effect. Iterating this cursor will cause new queries to be sent to the server, even
|
|
685
|
-
* if the resultant data has already been retrieved by this cursor.
|
|
686
|
-
*/
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
rewind() {
|
|
690
|
-
if (this.timeoutContext && this.timeoutContext.owner !== this) {
|
|
691
|
-
throw new error_1.MongoAPIError(`Cannot rewind cursor that does not own its timeout context.`);
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
if (!this.initialized) {
|
|
695
|
-
return;
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
this.cursorId = null;
|
|
699
|
-
this.documents?.clear();
|
|
700
|
-
this.timeoutContext?.clear();
|
|
701
|
-
this.timeoutContext = undefined;
|
|
702
|
-
this.isClosed = false;
|
|
703
|
-
this.isKilled = false;
|
|
704
|
-
this.initialized = false;
|
|
705
|
-
this.hasEmittedClose = false;
|
|
706
|
-
this.trackCursor(); // We only want to end this session if we created it, and it hasn't ended yet
|
|
707
|
-
|
|
708
|
-
if (this.cursorSession.explicit === false) {
|
|
709
|
-
if (!this.cursorSession.hasEnded) {
|
|
710
|
-
this.cursorSession.endSession().then(undefined, utils_1.squashError);
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
this.cursorSession = this.cursorClient.startSession({
|
|
714
|
-
owner: this,
|
|
715
|
-
explicit: false
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
/** @internal */
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
async getMore(batchSize) {
|
|
723
|
-
if (this.cursorId == null) {
|
|
724
|
-
throw new error_1.MongoRuntimeError('Unexpected null cursor id. A cursor creating command should have set this');
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
if (this.selectedServer == null) {
|
|
728
|
-
throw new error_1.MongoRuntimeError('Unexpected null selectedServer. A cursor creating command should have set this');
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
const getMoreOptions = { ...this.cursorOptions,
|
|
732
|
-
session: this.cursorSession,
|
|
733
|
-
batchSize
|
|
734
|
-
};
|
|
735
|
-
const getMoreOperation = new get_more_1.GetMoreOperation(this.cursorNamespace, this.cursorId, this.selectedServer, getMoreOptions);
|
|
736
|
-
return await (0, execute_operation_1.executeOperation)(this.cursorClient, getMoreOperation, this.timeoutContext);
|
|
737
|
-
}
|
|
738
|
-
/**
|
|
739
|
-
* @internal
|
|
740
|
-
*
|
|
741
|
-
* This function is exposed for the unified test runner's createChangeStream
|
|
742
|
-
* operation. We cannot refactor to use the abstract _initialize method without
|
|
743
|
-
* a significant refactor.
|
|
744
|
-
*/
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
async cursorInit() {
|
|
748
|
-
if (this.cursorOptions.timeoutMS != null) {
|
|
749
|
-
this.timeoutContext ??= new CursorTimeoutContext(timeout_1.TimeoutContext.create({
|
|
750
|
-
serverSelectionTimeoutMS: this.client.s.options.serverSelectionTimeoutMS,
|
|
751
|
-
timeoutMS: this.cursorOptions.timeoutMS
|
|
752
|
-
}), this);
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
try {
|
|
756
|
-
const state = await this._initialize(this.cursorSession); // Set omitMaxTimeMS to the value needed for subsequent getMore calls
|
|
757
|
-
|
|
758
|
-
this.cursorOptions.omitMaxTimeMS = this.cursorOptions.timeoutMS != null;
|
|
759
|
-
const response = state.response;
|
|
760
|
-
this.selectedServer = state.server;
|
|
761
|
-
this.cursorId = response.id;
|
|
762
|
-
this.cursorNamespace = response.ns ?? this.namespace;
|
|
763
|
-
this.documents = response;
|
|
764
|
-
this.initialized = true; // the cursor is now initialized, even if it is dead
|
|
765
|
-
} catch (error) {
|
|
766
|
-
// the cursor is now initialized, even if an error occurred
|
|
767
|
-
this.initialized = true;
|
|
768
|
-
await this.cleanup(undefined, error);
|
|
769
|
-
throw error;
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
if (this.isDead) {
|
|
773
|
-
await this.cleanup();
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
return;
|
|
777
|
-
}
|
|
778
|
-
/** @internal Attempt to obtain more documents */
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
async fetchBatch() {
|
|
782
|
-
if (this.isClosed) {
|
|
783
|
-
return;
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
if (this.isDead) {
|
|
787
|
-
// if the cursor is dead, we clean it up
|
|
788
|
-
// cleanupCursor should never throw, but if it does it indicates a bug in the driver
|
|
789
|
-
// and we should surface the error
|
|
790
|
-
await this.cleanup();
|
|
791
|
-
return;
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
if (this.cursorId == null) {
|
|
795
|
-
await this.cursorInit(); // If the cursor died or returned documents, return
|
|
796
|
-
|
|
797
|
-
if ((this.documents?.length ?? 0) !== 0 || this.isDead) return; // Otherwise, run a getMore
|
|
798
|
-
} // otherwise need to call getMore
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
const batchSize = this.cursorOptions.batchSize || 1000;
|
|
802
|
-
|
|
803
|
-
try {
|
|
804
|
-
const response = await this.getMore(batchSize);
|
|
805
|
-
this.cursorId = response.id;
|
|
806
|
-
this.documents = response;
|
|
807
|
-
} catch (error) {
|
|
808
|
-
try {
|
|
809
|
-
await this.cleanup(undefined, error);
|
|
810
|
-
} catch (cleanupError) {
|
|
811
|
-
// `cleanupCursor` should never throw, squash and throw the original error
|
|
812
|
-
(0, utils_1.squashError)(cleanupError);
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
throw error;
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
if (this.isDead) {
|
|
819
|
-
// If we successfully received a response from a cursor BUT the cursor indicates that it is exhausted,
|
|
820
|
-
// we intentionally clean up the cursor to release its session back into the pool before the cursor
|
|
821
|
-
// is iterated. This prevents a cursor that is exhausted on the server from holding
|
|
822
|
-
// onto a session indefinitely until the AbstractCursor is iterated.
|
|
823
|
-
//
|
|
824
|
-
// cleanupCursorAsync should never throw, but if it does it indicates a bug in the driver
|
|
825
|
-
// and we should surface the error
|
|
826
|
-
await this.cleanup();
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
/** @internal */
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
async cleanup(timeoutMS, error) {
|
|
833
|
-
this.abortListener?.[utils_1.kDispose]();
|
|
834
|
-
this.isClosed = true;
|
|
835
|
-
|
|
836
|
-
const timeoutContextForKillCursors = () => {
|
|
837
|
-
if (timeoutMS != null) {
|
|
838
|
-
this.timeoutContext?.clear();
|
|
839
|
-
return new CursorTimeoutContext(timeout_1.TimeoutContext.create({
|
|
840
|
-
serverSelectionTimeoutMS: this.client.s.options.serverSelectionTimeoutMS,
|
|
841
|
-
timeoutMS
|
|
842
|
-
}), this);
|
|
843
|
-
} else {
|
|
844
|
-
return this.timeoutContext?.refreshed();
|
|
845
|
-
}
|
|
846
|
-
};
|
|
847
|
-
|
|
848
|
-
try {
|
|
849
|
-
if (!this.isKilled && this.cursorId && !this.cursorId.isZero() && this.cursorNamespace && this.selectedServer && !this.cursorSession.hasEnded) {
|
|
850
|
-
this.isKilled = true;
|
|
851
|
-
const cursorId = this.cursorId;
|
|
852
|
-
this.cursorId = bson_1.Long.ZERO;
|
|
853
|
-
await (0, execute_operation_1.executeOperation)(this.cursorClient, new kill_cursors_1.KillCursorsOperation(cursorId, this.cursorNamespace, this.selectedServer, {
|
|
854
|
-
session: this.cursorSession
|
|
855
|
-
}), timeoutContextForKillCursors());
|
|
856
|
-
}
|
|
857
|
-
} catch (error) {
|
|
858
|
-
(0, utils_1.squashError)(error);
|
|
859
|
-
} finally {
|
|
860
|
-
try {
|
|
861
|
-
if (this.cursorSession?.owner === this) {
|
|
862
|
-
await this.cursorSession.endSession({
|
|
863
|
-
error
|
|
864
|
-
});
|
|
865
|
-
}
|
|
866
|
-
|
|
867
|
-
if (!this.cursorSession?.inTransaction()) {
|
|
868
|
-
(0, sessions_1.maybeClearPinnedConnection)(this.cursorSession, {
|
|
869
|
-
error
|
|
870
|
-
});
|
|
871
|
-
}
|
|
872
|
-
} finally {
|
|
873
|
-
this.emitClose();
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
/** @internal */
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
emitClose() {
|
|
881
|
-
try {
|
|
882
|
-
if (!this.hasEmittedClose && ((this.documents?.length ?? 0) === 0 || this.isClosed)) {
|
|
883
|
-
// @ts-expect-error: CursorEvents is generic so Parameters<CursorEvents["close"]> may not be assignable to `[]`. Not sure how to require extenders do not add parameters.
|
|
884
|
-
this.emit('close');
|
|
885
|
-
}
|
|
886
|
-
} finally {
|
|
887
|
-
this.hasEmittedClose = true;
|
|
888
|
-
}
|
|
889
|
-
}
|
|
890
|
-
/** @internal */
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
async transformDocument(document) {
|
|
894
|
-
if (this.transform == null) return document;
|
|
895
|
-
|
|
896
|
-
try {
|
|
897
|
-
const transformedDocument = this.transform(document); // eslint-disable-next-line no-restricted-syntax
|
|
898
|
-
|
|
899
|
-
if (transformedDocument === null) {
|
|
900
|
-
const TRANSFORM_TO_NULL_ERROR = 'Cursor returned a `null` document, but the cursor is not exhausted. Mapping documents to `null` is not supported in the cursor transform.';
|
|
901
|
-
throw new error_1.MongoAPIError(TRANSFORM_TO_NULL_ERROR);
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
return transformedDocument;
|
|
905
|
-
} catch (transformError) {
|
|
906
|
-
try {
|
|
907
|
-
await this.close();
|
|
908
|
-
} catch (closeError) {
|
|
909
|
-
(0, utils_1.squashError)(closeError);
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
throw transformError;
|
|
913
|
-
}
|
|
914
|
-
}
|
|
915
|
-
/** @internal */
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
throwIfInitialized() {
|
|
919
|
-
if (this.initialized) throw new error_1.MongoCursorInUseError();
|
|
920
|
-
}
|
|
921
|
-
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
exports.AbstractCursor = AbstractCursor;
|
|
925
|
-
/** @event */
|
|
926
|
-
|
|
927
|
-
AbstractCursor.CLOSE = 'close';
|
|
928
|
-
|
|
929
|
-
class ReadableCursorStream extends stream_1.Readable {
|
|
930
|
-
constructor(cursor) {
|
|
931
|
-
super({
|
|
932
|
-
objectMode: true,
|
|
933
|
-
autoDestroy: false,
|
|
934
|
-
highWaterMark: 1
|
|
935
|
-
});
|
|
936
|
-
this._readInProgress = false;
|
|
937
|
-
this._cursor = cursor;
|
|
938
|
-
} // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
_read(size) {
|
|
942
|
-
if (!this._readInProgress) {
|
|
943
|
-
this._readInProgress = true;
|
|
944
|
-
|
|
945
|
-
this._readNext();
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
_destroy(error, callback) {
|
|
950
|
-
this._cursor.close().then(() => callback(error), closeError => callback(closeError));
|
|
951
|
-
}
|
|
952
|
-
|
|
953
|
-
_readNext() {
|
|
954
|
-
if (this._cursor.id === bson_1.Long.ZERO) {
|
|
955
|
-
this.push(null);
|
|
956
|
-
return;
|
|
957
|
-
}
|
|
958
|
-
|
|
959
|
-
this._cursor.next().then( // result from next()
|
|
960
|
-
result => {
|
|
961
|
-
if (result == null) {
|
|
962
|
-
this.push(null);
|
|
963
|
-
} else if (this.destroyed) {
|
|
964
|
-
this._cursor.close().then(undefined, utils_1.squashError);
|
|
965
|
-
} else {
|
|
966
|
-
if (this.push(result)) {
|
|
967
|
-
return this._readNext();
|
|
968
|
-
}
|
|
969
|
-
|
|
970
|
-
this._readInProgress = false;
|
|
971
|
-
}
|
|
972
|
-
}, // error from next()
|
|
973
|
-
err => {
|
|
974
|
-
// NOTE: This is questionable, but we have a test backing the behavior. It seems the
|
|
975
|
-
// desired behavior is that a stream ends cleanly when a user explicitly closes
|
|
976
|
-
// a client during iteration. Alternatively, we could do the "right" thing and
|
|
977
|
-
// propagate the error message by removing this special case.
|
|
978
|
-
if (err.message.match(/server is closed/)) {
|
|
979
|
-
this._cursor.close().then(undefined, utils_1.squashError);
|
|
980
|
-
|
|
981
|
-
return this.push(null);
|
|
982
|
-
} // NOTE: This is also perhaps questionable. The rationale here is that these errors tend
|
|
983
|
-
// to be "operation was interrupted", where a cursor has been closed but there is an
|
|
984
|
-
// active getMore in-flight. This used to check if the cursor was killed but once
|
|
985
|
-
// that changed to happen in cleanup legitimate errors would not destroy the
|
|
986
|
-
// stream. There are change streams test specifically test these cases.
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
if (err.message.match(/operation was interrupted/)) {
|
|
990
|
-
return this.push(null);
|
|
991
|
-
} // NOTE: The two above checks on the message of the error will cause a null to be pushed
|
|
992
|
-
// to the stream, thus closing the stream before the destroy call happens. This means
|
|
993
|
-
// that either of those error messages on a change stream will not get a proper
|
|
994
|
-
// 'error' event to be emitted (the error passed to destroy). Change stream resumability
|
|
995
|
-
// relies on that error event to be emitted to create its new cursor and thus was not
|
|
996
|
-
// working on 4.4 servers because the error emitted on failover was "interrupted at
|
|
997
|
-
// shutdown" while on 5.0+ it is "The server is in quiesce mode and will shut down".
|
|
998
|
-
// See NODE-4475.
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
return this.destroy(err);
|
|
1002
|
-
}) // if either of the above handlers throw
|
|
1003
|
-
.catch(error => {
|
|
1004
|
-
this._readInProgress = false;
|
|
1005
|
-
this.destroy(error);
|
|
1006
|
-
});
|
|
1007
|
-
}
|
|
1008
|
-
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
(0, resource_management_1.configureResourceManagement)(AbstractCursor.prototype);
|
|
1012
|
-
/**
|
|
1013
|
-
* @internal
|
|
1014
|
-
* The cursor timeout context is a wrapper around a timeout context
|
|
1015
|
-
* that keeps track of the "owner" of the cursor. For timeout contexts
|
|
1016
|
-
* instantiated inside a cursor, the owner will be the cursor.
|
|
1017
|
-
*
|
|
1018
|
-
* All timeout behavior is exactly the same as the wrapped timeout context's.
|
|
1019
|
-
*/
|
|
1020
|
-
|
|
1021
|
-
class CursorTimeoutContext extends timeout_1.TimeoutContext {
|
|
1022
|
-
constructor(timeoutContext, owner) {
|
|
1023
|
-
super();
|
|
1024
|
-
this.timeoutContext = timeoutContext;
|
|
1025
|
-
this.owner = owner;
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
get serverSelectionTimeout() {
|
|
1029
|
-
return this.timeoutContext.serverSelectionTimeout;
|
|
1030
|
-
}
|
|
1031
|
-
|
|
1032
|
-
get connectionCheckoutTimeout() {
|
|
1033
|
-
return this.timeoutContext.connectionCheckoutTimeout;
|
|
1034
|
-
}
|
|
1035
|
-
|
|
1036
|
-
get clearServerSelectionTimeout() {
|
|
1037
|
-
return this.timeoutContext.clearServerSelectionTimeout;
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
get timeoutForSocketWrite() {
|
|
1041
|
-
return this.timeoutContext.timeoutForSocketWrite;
|
|
1042
|
-
}
|
|
1043
|
-
|
|
1044
|
-
get timeoutForSocketRead() {
|
|
1045
|
-
return this.timeoutContext.timeoutForSocketRead;
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
csotEnabled() {
|
|
1049
|
-
return this.timeoutContext.csotEnabled();
|
|
1050
|
-
}
|
|
1051
|
-
|
|
1052
|
-
refresh() {
|
|
1053
|
-
if (typeof this.owner !== 'symbol') return this.timeoutContext.refresh();
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
clear() {
|
|
1057
|
-
if (typeof this.owner !== 'symbol') return this.timeoutContext.clear();
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
get maxTimeMS() {
|
|
1061
|
-
return this.timeoutContext.maxTimeMS;
|
|
1062
|
-
}
|
|
1063
|
-
|
|
1064
|
-
get timeoutMS() {
|
|
1065
|
-
return this.timeoutContext.csotEnabled() ? this.timeoutContext.timeoutMS : null;
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
refreshed() {
|
|
1069
|
-
return new CursorTimeoutContext(this.timeoutContext.refreshed(), this.owner);
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
addMaxTimeMSToCommand(command, options) {
|
|
1073
|
-
this.timeoutContext.addMaxTimeMSToCommand(command, options);
|
|
1074
|
-
}
|
|
1075
|
-
|
|
1076
|
-
getSocketTimeoutMS() {
|
|
1077
|
-
return this.timeoutContext.getSocketTimeoutMS();
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
exports.CursorTimeoutContext = CursorTimeoutContext;
|