filemail-sdk 9.3.4 → 9.4.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.
- package/LICENSE +10 -10
- package/dist/src/autoDownloader/autoDownloader.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderDestroyer.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderError.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderEvent.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderOptions.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderStateSerializer.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadProgressedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadStartedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadStartingFailedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadUnhealthyEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/checkingForNewTransfersStartedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/newTransfersCheckCompletedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.js.map +1 -1
- package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfer.js.map +1 -1
- package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfersRetriever.js.map +1 -1
- package/dist/src/autoDownloader/node/nodeAutoDownloaderStateSerializer.js.map +1 -1
- package/dist/src/autoDownloader/node/nodeTransferDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderRecoverableState.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderState.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateRecoverableTransfer.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateRunningTransfer.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateSnapshot.js.map +1 -1
- package/dist/src/autoDownloader/transferDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderNewTransferHandler.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderRecoverableTransferHandler.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderTransferHandlerBase.js.map +1 -1
- package/dist/src/client/downloader/downloaderCore.d.ts.map +1 -1
- package/dist/src/client/downloader/downloaderCore.js +6 -0
- package/dist/src/client/downloader/downloaderCore.js.map +1 -1
- package/dist/src/client/downloader/node/nodeTransferDownloader.js.map +1 -1
- package/dist/src/client/downloader/transferDownloader.js.map +1 -1
- package/dist/src/client/environmentVariables.js.map +1 -1
- package/dist/src/client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js.map +1 -1
- package/dist/src/client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js.map +1 -1
- package/dist/src/client/healthMonitor/events/transferHealthMonitorEvent.js.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/nodeOnlineChecker.js.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.js.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.js.map +1 -1
- package/dist/src/client/healthMonitor/transferDownloaderHealthMonitor.js.map +1 -1
- package/dist/src/client/healthMonitor/transferHealthMonitorBase.js.map +1 -1
- package/dist/src/client/healthMonitor/transferUploaderHealthMonitor.js.map +1 -1
- package/dist/src/client/loggers/dummyLogger.js.map +1 -1
- package/dist/src/client/loggers/logger.js.map +1 -1
- package/dist/src/client/loggers/utils/logHealthyStatus.js.map +1 -1
- package/dist/src/client/node/nodeFileDetailsProvider.js.map +1 -1
- package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
- package/dist/src/client/uploader/transferUploader.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderConfig.js.map +1 -1
- package/dist/src/client/uploader/utils/uploaderUtils.js.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
- package/dist/src/downloader/api/fileServerDownloadClient.js.map +1 -1
- package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js.map +1 -1
- package/dist/src/downloader/chunkDownloader.d.ts.map +1 -1
- package/dist/src/downloader/chunkDownloader.js +22 -3
- package/dist/src/downloader/chunkDownloader.js.map +1 -1
- package/dist/src/downloader/downloadFolderResolver.js.map +1 -1
- package/dist/src/downloader/downloadLogger.js.map +1 -1
- package/dist/src/downloader/downloadOptions.js.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadFileChunkProgress.js.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadFileProgress.js.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadFilePromise.js.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadState.d.ts +1 -0
- package/dist/src/downloader/downloadStatus/downloadState.d.ts.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadState.js +4 -0
- package/dist/src/downloader/downloadStatus/downloadState.js.map +1 -1
- package/dist/src/downloader/downloadTracker.d.ts.map +1 -1
- package/dist/src/downloader/downloadTracker.js +31 -0
- package/dist/src/downloader/downloadTracker.js.map +1 -1
- package/dist/src/downloader/dtos/downloadCommand.js.map +1 -1
- package/dist/src/downloader/dtos/downloadError.js.map +1 -1
- package/dist/src/downloader/dtos/downloadErrorCode.js.map +1 -1
- package/dist/src/downloader/dtos/downloadEvent.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFileChunkInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFileInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFilesCommand.js.map +1 -1
- package/dist/src/downloader/dtos/downloadInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadRegistrationMode.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerFileInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerFileProgressInfo.d.ts +5 -0
- package/dist/src/downloader/dtos/downloadTrackerFileProgressInfo.d.ts.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerFileProgressInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerProgressInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackingMetadata.js.map +1 -1
- package/dist/src/downloader/dtos/downloaderRestoredState.js.map +1 -1
- package/dist/src/downloader/eventArgs/chunkDownloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/chunkDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadCompletedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadMetadataDeterminedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadPauseEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadTrackingFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/fileDownloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/fileDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/filesDownloader.d.ts.map +1 -1
- package/dist/src/downloader/filesDownloader.js +97 -6
- package/dist/src/downloader/filesDownloader.js.map +1 -1
- package/dist/src/downloader/filesPreparer.js.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.node.js.map +1 -1
- package/dist/src/index.web.js.map +1 -1
- package/dist/src/uploader/api/dtos/handshakeRequest.js.map +1 -1
- package/dist/src/uploader/api/dtos/handshakeResponse.js.map +1 -1
- package/dist/src/uploader/api/dtos/pingResponse.js.map +1 -1
- package/dist/src/uploader/api/dtos/sendChunkRequest.js.map +1 -1
- package/dist/src/uploader/api/fileServerUdpClient.js.map +1 -1
- package/dist/src/uploader/api/fileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.js +8 -8
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/web/utils/axiosIdleTimeoutManager.js.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadFailedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileUploadEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileUploadFailedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferMetadataDeterminedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadProgressedEventArgs.js.map +1 -1
- package/dist/src/uploader/export/transferUploadExportData.js.map +1 -1
- package/dist/src/uploader/export/transferUploadExportState.js.map +1 -1
- package/dist/src/uploader/export/transferUploadMetadata.js.map +1 -1
- package/dist/src/uploader/optimizer/optimizationValues.js.map +1 -1
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map +1 -1
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js.map +1 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js.map +1 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizer.js.map +1 -1
- package/dist/src/uploader/optimizer/uploadOptimizer.js.map +1 -1
- package/dist/src/uploader/options/transferUploadAppendInfo.js.map +1 -1
- package/dist/src/uploader/options/transferUploadConfig.js.map +1 -1
- package/dist/src/uploader/options/transferUploadInfo.js.map +1 -1
- package/dist/src/uploader/options/transferUploadInfoBase.js.map +1 -1
- package/dist/src/uploader/pauseController.js.map +1 -1
- package/dist/src/uploader/state/continuousChunksCalculator.js.map +1 -1
- package/dist/src/uploader/state/readonlyTransferUploadStateFile.js.map +1 -1
- package/dist/src/uploader/state/readonlyTransferUploadStateFiles.js.map +1 -1
- package/dist/src/uploader/state/transferUploadProgressCalculator.js.map +1 -1
- package/dist/src/uploader/state/transferUploadState.js.map +1 -1
- package/dist/src/uploader/state/transferUploadStateFile.js.map +1 -1
- package/dist/src/uploader/state/transferUploadStateFiles.js.map +1 -1
- package/dist/src/uploader/transferUpload.js.map +1 -1
- package/dist/src/uploader/transferUploadError.js.map +1 -1
- package/dist/src/uploader/transferUploadEvent.js.map +1 -1
- package/dist/src/utils/api/apiClient.js.map +1 -1
- package/dist/src/utils/api/apiClientBase.js.map +1 -1
- package/dist/src/utils/api/apiError.js.map +1 -1
- package/dist/src/utils/api/apiFilemail449Error.js.map +1 -1
- package/dist/src/utils/api/apiFilemailError.js.map +1 -1
- package/dist/src/utils/api/dtos/baseResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/cancelTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/finalizeTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/finalizeTransferResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getCompanyResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getCompressedFileMetadataResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getInboxTransfersRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/getInboxTransfersResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getRangehashResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/getTransferResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/loginRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/loginResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/registerFileDownloadRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferDownloadRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/resetTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/sendFileChunkRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/transferCustomFieldDto.js.map +1 -1
- package/dist/src/utils/api/dtos/transferFileDto.js.map +1 -1
- package/dist/src/utils/api/fileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/node/gotWorkarounds.js.map +1 -1
- package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
- package/dist/src/utils/api/node/nodeClientBase.js.map +1 -1
- package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/node/nodeFileserverClientBase.js.map +1 -1
- package/dist/src/utils/api/urlUtil.js.map +1 -1
- package/dist/src/utils/api/web/webApiClient.js.map +1 -1
- package/dist/src/utils/api/web/webClientBase.js.map +1 -1
- package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/web/webFileserverClientBase.js.map +1 -1
- package/dist/src/utils/concurrencyController/concurrencyController.js.map +1 -1
- package/dist/src/utils/concurrencyController/concurrencyReleaser.js.map +1 -1
- package/dist/src/utils/concurrencyController/transferConcurrencyController.js.map +1 -1
- package/dist/src/utils/crypto/cryptographyProvider.js.map +1 -1
- package/dist/src/utils/crypto/node/nodeCryptographyProvider.js.map +1 -1
- package/dist/src/utils/crypto/web/webCryptographyProvider.js.map +1 -1
- package/dist/src/utils/dateAndTime/simpleDateFormatter.js.map +1 -1
- package/dist/src/utils/events/chunkProgressEvent.js.map +1 -1
- package/dist/src/utils/events/eventsEngine.js.map +1 -1
- package/dist/src/utils/events/node/nodeEventsEngine.js.map +1 -1
- package/dist/src/utils/events/web/webEventsEngine.js.map +1 -1
- package/dist/src/utils/fileSystem/chunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/chunkStreamProviderFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/fileDetails.js.map +1 -1
- package/dist/src/utils/fileSystem/fileSystemService.d.ts +2 -2
- package/dist/src/utils/fileSystem/fileSystemService.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/fileSystemService.js.map +1 -1
- package/dist/src/utils/fileSystem/fsError.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeFileDetails.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeFileSystemService.d.ts +2 -1
- package/dist/src/utils/fileSystem/node/nodeFileSystemService.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeFileSystemService.js +15 -4
- package/dist/src/utils/fileSystem/node/nodeFileSystemService.js.map +1 -1
- package/dist/src/utils/fileSystem/parsedPath.js.map +1 -1
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamEncrypter.js.map +1 -1
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/web/webFileDetails.js.map +1 -1
- package/dist/src/utils/jsonParsing.js.map +1 -1
- package/dist/src/utils/logging/logEventPropertyNames.js.map +1 -1
- package/dist/src/utils/mergeAbortAndPauseSignals.js.map +1 -1
- package/dist/src/utils/networking/throttlingOptions.js.map +1 -1
- package/dist/src/utils/promiseAll.js.map +1 -1
- package/dist/src/utils/types/transferStatus.js.map +1 -1
- package/dist/src/utils/uint8ArrayUtils.js.map +1 -1
- package/package.json +79 -79
- package/readme.md +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploaderHealthMonitor.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferUploaderHealthMonitor.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,uCAAuC,CAAC;AAExE,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,yBAA4D;IACzG,2CAA2C,CAAC,SAAkB;QACpE,MAAM,aAAa,GAAI,SAAiD,CAAC,aAAa,CAAC;QAEvF,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEtF,OAAO,aAAa,CAAC;IACzB,CAAC;IAES,2BAA2B;QACjC,OAAO,mBAAmB,CAAC,0BAA0B,CAAC;IAC1D,CAAC;IAES,8BAA8B;QACpC,OAAO,mBAAmB,CAAC,kBAAkB,CAAC;IAClD,CAAC;IAES,6BAA6B,CAAC,+BAAmE;QACvG,OAAO,+BAA+B,EAAE,uBAAuB,IAAI,CAAC,CAAC;IACzE,CAAC;IAES,mBAAmB;QACzB,OAAO;YACH,0BAA0B,EAAE,IAAI,CAAC,mCAAmC,EAAE,uBAAuB;YAC7F,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,4BAA4B;YACpG,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,4BAA4B;YACpG,oBAAoB,EAAE,IAAI,CAAC,mCAAmC,EAAE,oBAAoB;YACpF,gBAAgB,EAAE,IAAI,CAAC,mCAAmC,EAAE,gBAAgB;SAC/E,CAAC;IACN,CAAC;CACJ","sourcesContent":["import { TransferMetadataDeterminedEventArgs } from \"../../index.node.js\";\
|
|
1
|
+
{"version":3,"file":"transferUploaderHealthMonitor.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferUploaderHealthMonitor.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,uCAAuC,CAAC;AAExE,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,yBAA4D;IACzG,2CAA2C,CAAC,SAAkB;QACpE,MAAM,aAAa,GAAI,SAAiD,CAAC,aAAa,CAAC;QAEvF,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEtF,OAAO,aAAa,CAAC;IACzB,CAAC;IAES,2BAA2B;QACjC,OAAO,mBAAmB,CAAC,0BAA0B,CAAC;IAC1D,CAAC;IAES,8BAA8B;QACpC,OAAO,mBAAmB,CAAC,kBAAkB,CAAC;IAClD,CAAC;IAES,6BAA6B,CAAC,+BAAmE;QACvG,OAAO,+BAA+B,EAAE,uBAAuB,IAAI,CAAC,CAAC;IACzE,CAAC;IAES,mBAAmB;QACzB,OAAO;YACH,0BAA0B,EAAE,IAAI,CAAC,mCAAmC,EAAE,uBAAuB;YAC7F,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,4BAA4B;YACpG,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,4BAA4B;YACpG,oBAAoB,EAAE,IAAI,CAAC,mCAAmC,EAAE,oBAAoB;YACpF,gBAAgB,EAAE,IAAI,CAAC,mCAAmC,EAAE,gBAAgB;SAC/E,CAAC;IACN,CAAC;CACJ","sourcesContent":["import { TransferMetadataDeterminedEventArgs } from \"../../index.node.js\";\nimport TransferUploadProgressedEventArgs from \"../../uploader/eventArgs/transferUploadProgressedEventArgs.js\";\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport TransferHealthMonitorBase from \"./transferHealthMonitorBase.js\";\n\nexport default class TransferUploaderHealthMonitor extends TransferHealthMonitorBase<TransferUploadProgressedEventArgs> {\n protected getFileServerUrlFromFileServerKnowEventArgs(eventArgs: unknown): string {\n const fileServerUrl = (eventArgs as TransferMetadataDeterminedEventArgs).fileServerUrl;\n\n if (!fileServerUrl)\n throw new Error(`Event args are not of TransferMetadataDeterminedEventArgs type`);\n\n return fileServerUrl;\n }\n\n protected getFileServerKnownEventName(): string {\n return TransferUploadEvent.TransferMetadataDetermined;\n }\n\n protected getTransferProgressedEventName(): string {\n return TransferUploadEvent.TransferProgressed;\n }\n\n protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: TransferUploadProgressedEventArgs): number {\n return currentHistoryLastProgressEvent?.uploadedBytesTotalCount ?? 0;\n }\n\n protected getHealthyEventArgs(): HealthMonitorHealthyEventArgs {\n return {\n transferredBytesTotalCount: this.lastProgressEventFromPreviousPeriod?.uploadedBytesTotalCount,\n averageSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.averageSpeedInBytesPerSecond,\n currentSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.currentSpeedInBytesPerSecond,\n progressInPercentage: this.lastProgressEventFromPreviousPeriod?.progressInPercentage,\n remainingSeconds: this.lastProgressEventFromPreviousPeriod?.remainingSeconds,\n };\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dummyLogger.js","sourceRoot":"","sources":["../../../../src/client/loggers/dummyLogger.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAItD,MAAM,WAAW;IAEb,QAAQ,CAAC,QAAgB,EAAE,GAAG,eAAsB,IAAU,CAAC;IAC/D,QAAQ,CAAC,QAAgB,IAAU,CAAC;IACpC,OAAO,CAAC,QAAgB,IAAU,CAAC;IACnC,UAAU,CAAC,QAAgB,IAAU,CAAC;IACtC,QAAQ,CAAC,MAAa,IAAU,CAAC;CACpC;AAED,eAAe,WAAW,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\
|
|
1
|
+
{"version":3,"file":"dummyLogger.js","sourceRoot":"","sources":["../../../../src/client/loggers/dummyLogger.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAItD,MAAM,WAAW;IAEb,QAAQ,CAAC,QAAgB,EAAE,GAAG,eAAsB,IAAU,CAAC;IAC/D,QAAQ,CAAC,QAAgB,IAAU,CAAC;IACpC,OAAO,CAAC,QAAgB,IAAU,CAAC;IACnC,UAAU,CAAC,QAAgB,IAAU,CAAC;IACtC,QAAQ,CAAC,MAAa,IAAU,CAAC;CACpC;AAED,eAAe,WAAW,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport type Logger from \"./logger.js\";\n\nclass DummyLogger implements Logger {\n logDebug(message: string): void;\n logDebug(_message: string, ..._additionalData: any[]): void { }\n logTrace(_message: string): void { }\n logInfo(_message: string): void { }\n logWarning(_message: string): void { }\n logError(_error: Error): void { }\n}\n\nexport default DummyLogger;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../src/client/loggers/logger.ts"],"names":[],"mappings":"","sourcesContent":["interface Logger {\
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../src/client/loggers/logger.ts"],"names":[],"mappings":"","sourcesContent":["interface Logger {\n logTrace(message: string): void;\n logTrace(message: string, additionalData?: Record<string, unknown>): void;\n\n logDebug(message: string): void;\n logDebug(message: string, additionalData?: Record<string, unknown>): void;\n\n logInfo(message: string): void;\n logInfo(message: string, additionalData?: Record<string, unknown>): void;\n\n logWarning(message: string): void;\n logWarning(message: string, additionalData?: Record<string, unknown>): void;\n\n logError(error: Error): void;\n logError(error: Error, message?: string): void;\n logError(error: Error, message?: string, additionalData?: Record<string, unknown>): void;\n}\n\nexport default Logger;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logHealthyStatus.js","sourceRoot":"","sources":["../../../../../src/client/loggers/utils/logHealthyStatus.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,MAAc,EAAE,SAAkB,EAAE,KAAsE,EAAE,mBAA4C,EAAE;IAC/L,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAElE,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAkB,EAAE,KAAsE;IACrH,IAAI,SAAS;QACT,OAAO,KAAK,CAAC;IAEjB,MAAM,cAAc,GAAG,KAAwC,CAAC;IAEhE,OAAO;QACH,GAAG,cAAc;QACjB,MAAM,EAAE;YACJ,GAAG,cAAc,CAAC,MAAM;YACxB,QAAQ,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrE,GAAG,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3D,UAAU,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;SAC5E;KACJ,CAAC;AACN,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAiD;IAClF,OAAO;QACH,GAAG,KAAK;QACR,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3C,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;YACtB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;SAC/B;KACJ,CAAC;AACN,CAAC","sourcesContent":["import HealthMonitorHealthyEventArgs from \"../../healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js\";\
|
|
1
|
+
{"version":3,"file":"logHealthyStatus.js","sourceRoot":"","sources":["../../../../../src/client/loggers/utils/logHealthyStatus.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,MAAc,EAAE,SAAkB,EAAE,KAAsE,EAAE,mBAA4C,EAAE;IAC/L,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAElE,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAkB,EAAE,KAAsE;IACrH,IAAI,SAAS;QACT,OAAO,KAAK,CAAC;IAEjB,MAAM,cAAc,GAAG,KAAwC,CAAC;IAEhE,OAAO;QACH,GAAG,cAAc;QACjB,MAAM,EAAE;YACJ,GAAG,cAAc,CAAC,MAAM;YACxB,QAAQ,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrE,GAAG,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3D,UAAU,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;SAC5E;KACJ,CAAC;AACN,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAiD;IAClF,OAAO;QACH,GAAG,KAAK;QACR,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3C,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;YACtB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;SAC/B;KACJ,CAAC;AACN,CAAC","sourcesContent":["import HealthMonitorHealthyEventArgs from \"../../healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport HealthMonitorUnhealthyEventArgs, { HealthMonitorUnhealthyEventArgsReasonValue } from \"../../healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\nimport Logger from \"../logger.js\";\n\nexport default function logHealthyStatus(logger: Logger, isHealthy: boolean, event: HealthMonitorHealthyEventArgs | HealthMonitorUnhealthyEventArgs, logEntryMetadata: Record<string, unknown> = {}) {\n const serializableEvent = makeEventSerializable(isHealthy, event);\n\n logger.logInfo(`Transfer health status`, { isHealthy, event: serializableEvent, ...logEntryMetadata });\n}\n\nfunction makeEventSerializable(isHealthy: boolean, event: HealthMonitorHealthyEventArgs | HealthMonitorUnhealthyEventArgs): HealthMonitorHealthyEventArgs | HealthMonitorUnhealthyEventArgs {\n if (isHealthy)\n return event;\n\n const unhealthyEvent = event as HealthMonitorUnhealthyEventArgs;\n\n return {\n ...unhealthyEvent,\n reason: {\n ...unhealthyEvent.reason,\n internet: makeReasonValueSerializable(unhealthyEvent.reason.internet),\n api: makeReasonValueSerializable(unhealthyEvent.reason.api),\n fileServer: makeReasonValueSerializable(unhealthyEvent.reason.fileServer),\n },\n };\n}\n\nfunction makeReasonValueSerializable(value: HealthMonitorUnhealthyEventArgsReasonValue): HealthMonitorUnhealthyEventArgsReasonValue {\n return {\n ...value,\n error: value.error === undefined ? undefined : {\n name: value.error.name,\n message: value.error.message,\n },\n };\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeFileDetailsProvider.js","sourceRoot":"","sources":["../../../../src/client/node/nodeFileDetailsProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import fsPath from 'path';\
|
|
1
|
+
{"version":3,"file":"nodeFileDetailsProvider.js","sourceRoot":"","sources":["../../../../src/client/node/nodeFileDetailsProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import fsPath from 'path';\nimport fs from 'fs/promises';\n\nimport { v4 as guid } from 'uuid';\n\nimport NodeFileDetails from '../../utils/fileSystem/node/nodeFileDetails.js';\nimport { promiseAll, promiseAllDeprecated } from '../../utils/promiseAll.js';\n\nclass NodeFileDetailsProvider {\n #paths: string[];\n #fileDetails: NodeFileDetails[];\n\n constructor(paths: string[]) {\n this.#fileDetails = [];\n\n this.#paths = paths;\n }\n\n async create(): Promise<NodeFileDetails[]> {\n const tasks: Promise<void>[] = [];\n\n for (const path of this.#paths)\n tasks.push(this.addPathToFileDetailsArray(path, ``));\n\n await promiseAll(tasks);\n\n return this.#fileDetails;\n }\n\n private async addPathToFileDetailsArray(path: string, destinationDirectoryPath: string) {\n if (await this.isDirectory(path))\n await this.addDirectory(path, destinationDirectoryPath);\n else\n await this.addFile(path, destinationDirectoryPath);\n }\n\n private async isDirectory(path: string): Promise<boolean> {\n try {\n const stats = await fs.stat(path);\n return stats.isDirectory();\n }\n catch {\n throw new Error(`Given path doesn't exist or application can't read it: ${path}`);\n }\n }\n\n private async addDirectory(directory: string, destinationDirectoryPath: string) {\n const directoryName = fsPath.basename(fsPath.resolve(directory));\n const destinationDirectoryPathForSubitems = fsPath.posix.join(destinationDirectoryPath, directoryName);\n\n const tasks: Promise<void>[] = [];\n\n const subItems = await fs.readdir(directory);\n\n for (const subItem of subItems) {\n const subItemPath = fsPath.join(directory, subItem);\n tasks.push(this.addPathToFileDetailsArray(subItemPath, destinationDirectoryPathForSubitems));\n }\n\n await promiseAll(tasks);\n }\n\n private async addFile(file: string, destinationFilePath: string) {\n const nodeFileDetails = await NodeFileDetails.create(guid(), file, destinationFilePath);\n this.#fileDetails.push(nodeFileDetails);\n }\n\n // TODO: This method can be removed after transfer compatibility mode is removed from Desktop\n static async recreate(files: { externalId: string | number, path: string, destinationFilePath: string }[]): Promise<NodeFileDetails[]> {\n const promises: Promise<NodeFileDetails>[] = [];\n\n files.forEach(file => {\n const promise = NodeFileDetails.create(file.externalId, file.path, file.destinationFilePath);\n promises.push(promise);\n });\n\n return await promiseAllDeprecated(promises);\n }\n}\n\nexport default NodeFileDetailsProvider;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeTransferUploader.js","sourceRoot":"","sources":["../../../../../src/client/uploader/node/nodeTransferUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,aAAa,MAAM,0CAA0C,CAAC;AACrE,OAAO,gBAAgB,MAAM,gDAAgD,CAAC;AAC9E,OAAO,2BAA2B,MAAM,wDAAwD,CAAC;AACjG,OAAO,iDAAiD,MAAM,mGAAmG,CAAC;AAClK,OAAO,uBAAuB,MAAM,wDAAwD,CAAC;AAC7F,OAAO,uCAAuC,MAAM,mFAAmF,CAAC;AACxI,OAAO,wBAAwB,MAAM,wDAAwD,CAAC;AAC9F,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,6BAA6B,MAAM,sDAAsD,CAAC;AACjG,OAAO,iBAAiB,MAAM,wDAAwD,CAAC;AAUvF,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,oBAAqC;IAGnF,YAAY,wBAAuJ,EAAE,MAA8B,EAAE,SAA+B,EAAE,MAAc;QAChP,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAE/C,MAAM,YAAY,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC5C,MAAM,0BAA0B,GAAG,IAAI,iDAAiD,EAAE,CAAC;QAC3F,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,yBAAyB,EAAE,YAAY,EAAE,IAAI,uCAAuC,EAAE,CAAC,CAAC;QACzK,MAAM,uBAAuB,GAAG,IAAI,2BAA2B,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACvK,MAAM,YAAY,GAAG,IAAI,wBAAwB,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,6BAA6B,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAEnH,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAE9J,IAAI,MAAM,CAAC,UAAU;YACjB,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/C,IAAI,WAA0C,CAAC;QAC/C,IAAI,QAAyC,CAAC;QAE9C,IAAI,cAAc,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAC3C,eAAe,CAAC,wBAAwB,CAAC,CAAC;YAE1C,WAAW,GAAG,wBAAwB,CAAC,KAAK,CAAC;YAE7C,QAAQ,GAAG,IAAI,cAAc,CAAC,0BAA0B,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,wBAAwB,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACjL,CAAC;aACI,CAAC;YACF,WAAW,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;YAElD,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,wBAAwB,EAAE,YAAY,EAAE,0BAA0B,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACtL,CAAC;QAED,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IACvF,CAAC;CACJ","sourcesContent":["import { v4 as guid } from 'uuid';\
|
|
1
|
+
{"version":3,"file":"nodeTransferUploader.js","sourceRoot":"","sources":["../../../../../src/client/uploader/node/nodeTransferUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,aAAa,MAAM,0CAA0C,CAAC;AACrE,OAAO,gBAAgB,MAAM,gDAAgD,CAAC;AAC9E,OAAO,2BAA2B,MAAM,wDAAwD,CAAC;AACjG,OAAO,iDAAiD,MAAM,mGAAmG,CAAC;AAClK,OAAO,uBAAuB,MAAM,wDAAwD,CAAC;AAC7F,OAAO,uCAAuC,MAAM,mFAAmF,CAAC;AACxI,OAAO,wBAAwB,MAAM,wDAAwD,CAAC;AAC9F,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,6BAA6B,MAAM,sDAAsD,CAAC;AACjG,OAAO,iBAAiB,MAAM,wDAAwD,CAAC;AAUvF,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,oBAAqC;IAGnF,YAAY,wBAAuJ,EAAE,MAA8B,EAAE,SAA+B,EAAE,MAAc;QAChP,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAE/C,MAAM,YAAY,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC5C,MAAM,0BAA0B,GAAG,IAAI,iDAAiD,EAAE,CAAC;QAC3F,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,yBAAyB,EAAE,YAAY,EAAE,IAAI,uCAAuC,EAAE,CAAC,CAAC;QACzK,MAAM,uBAAuB,GAAG,IAAI,2BAA2B,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACvK,MAAM,YAAY,GAAG,IAAI,wBAAwB,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,6BAA6B,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAEnH,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAE9J,IAAI,MAAM,CAAC,UAAU;YACjB,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/C,IAAI,WAA0C,CAAC;QAC/C,IAAI,QAAyC,CAAC;QAE9C,IAAI,cAAc,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAC3C,eAAe,CAAC,wBAAwB,CAAC,CAAC;YAE1C,WAAW,GAAG,wBAAwB,CAAC,KAAK,CAAC;YAE7C,QAAQ,GAAG,IAAI,cAAc,CAAC,0BAA0B,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,wBAAwB,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACjL,CAAC;aACI,CAAC;YACF,WAAW,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;YAElD,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,wBAAwB,EAAE,YAAY,EAAE,0BAA0B,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACtL,CAAC;QAED,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IACvF,CAAC;CACJ","sourcesContent":["import { v4 as guid } from 'uuid';\n\nimport TransferUpload from \"../../../uploader/transferUpload.js\";\nimport NodeApiClient from \"../../../utils/api/node/nodeApiClient.js\";\nimport NodeEventsEngine from \"../../../utils/events/node/nodeEventsEngine.js\";\nimport NodeFileServerClientFactory from \"../../../utils/api/node/nodeFileServerClientFactory.js\";\nimport NodeFileDetailsUploaderChunkStreamProviderFactory from \"../../../uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.js\";\nimport TransferUploadOptimizer from \"../../../uploader/optimizer/transferUploadOptimizer.js\";\nimport UdpConcurrencyBasedOptimizationStrategy from \"../../../uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js\";\nimport NodeCryptographyProvider from \"../../../utils/crypto/node/nodeCryptographyProvider.js\";\nimport TransferUploaderBase from \"../transferUploaderBase.js\";\nimport { buildUploadConfig, isTransferInfo, fixTransferInfo } from \"../utils/uploaderUtils.js\";\nimport TransferUploaderHealthMonitor from '../../healthMonitor/transferUploaderHealthMonitor.js';\nimport NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';\n\nimport type NodeFileDetails from \"../../../utils/fileSystem/node/nodeFileDetails.js\";\nimport type Logger from \"../../loggers/logger.js\";\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferUploadInfo from \"../../../uploader/options/transferUploadInfo.js\";\nimport type { TransferUploadExportData } from \"../../../uploader/export/transferUploadExportData.js\";\nimport type { TransferUploadAppendInfo } from \"../../../uploader/options/transferUploadAppendInfo.js\";\nimport type TransferUploaderConfig from \"../transferUploaderConfig.js\";\n\nexport default class NodeTransferUploader extends TransferUploaderBase<NodeFileDetails> {\n constructor(transferInfo: TransferUploadInfo<NodeFileDetails> | TransferUploadAppendInfo<NodeFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger)\n constructor(exportData: TransferUploadExportData<NodeFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger)\n constructor(transferInfoOrExportData: (TransferUploadInfo<NodeFileDetails> | TransferUploadAppendInfo<NodeFileDetails>) | TransferUploadExportData<NodeFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger) {\n const trackingId = config.trackingId || guid();\n\n const eventsEngine = new NodeEventsEngine();\n const chunkStreamProviderFactory = new NodeFileDetailsUploaderChunkStreamProviderFactory();\n const optimizer = new TransferUploadOptimizer(config.tcpChunkSizeInBytes, config.tcpChunksUploadInParallel, eventsEngine, new UdpConcurrencyBasedOptimizationStrategy());\n const fileServerClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, config.uploadIdleTimeoutInMs, config.chunkUploadRetryLimit);\n const cryptography = new NodeCryptographyProvider();\n const uploadConfig = buildUploadConfig(config);\n const healthMonitor = new TransferUploaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), eventsEngine);\n\n const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, config.apiRequestTotalTimeoutInMs, config.apiRetryLimit);\n\n if (config.logintoken)\n apiClient.setLoginToken(config.logintoken);\n\n let fileDetails: NodeFileDetails[] | undefined;\n let transfer: TransferUpload<NodeFileDetails>;\n\n if (isTransferInfo(transferInfoOrExportData)) {\n fixTransferInfo(transferInfoOrExportData);\n\n fileDetails = transferInfoOrExportData.files;\n\n transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfoOrExportData, uploadConfig, optimizer, cryptography);\n }\n else {\n fileDetails = transferInfoOrExportData.info.files;\n\n transfer = TransferUpload.recreate(transferInfoOrExportData, uploadConfig, chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, optimizer, cryptography);\n }\n\n super(transfer, fileDetails, config, envValues, logger, healthMonitor, trackingId);\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploader.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploader.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferUpload from \"../../uploader/transferUpload.js\";\
|
|
1
|
+
{"version":3,"file":"transferUploader.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploader.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferUpload from \"../../uploader/transferUpload.js\";\nimport type FileDetails from \"../../utils/fileSystem/fileDetails.js\";\n\ninterface TransferUploader<T extends FileDetails> {\n readonly transfer: TransferUpload<T>;\n\n start(): Promise<void>;\n stop(): void;\n pause(): void;\n cancel(): void;\n}\n\nexport default TransferUploader;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploaderBase.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderBase.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\r\nimport sleep from \"abortable-sleep\";\r\nimport throttle from \"lodash.throttle\";\r\n\r\nimport TransferUpload from \"../../uploader/transferUpload.js\";\r\nimport PauseController from \"../../uploader/pauseController.js\";\r\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\r\nimport FsError from \"../../utils/fileSystem/fsError.js\";\r\nimport TransferUploadError from \"../../uploader/transferUploadError.js\";\r\nimport logEventPropertyName from \"../../utils/logging/logEventPropertyNames.js\";\r\nimport ApiFilemailError from \"../../utils/api/apiFilemailError.js\";\r\nimport logHealthyStatus from \"../loggers/utils/logHealthyStatus.js\";\r\n\r\nimport type NodeFileDetails from \"../../utils/fileSystem/node/nodeFileDetails.js\";\r\nimport type Logger from \"../loggers/logger.js\";\r\nimport type EnvironmentVariables from \"../environmentVariables.js\";\r\nimport type TransferUploader from \"./transferUploader.js\";\r\nimport type ReadonlyTransferUploadStateFile from \"../../uploader/state/readonlyTransferUploadStateFile.js\";\r\nimport type TransferUploaderConfig from \"./transferUploaderConfig.js\";\r\nimport type WebFileDetails from \"../../utils/fileSystem/web/webFileDetails.js\";\r\nimport TransferHealthMonitorEvent from \"../healthMonitor/events/transferHealthMonitorEvent.js\";\r\nimport type TransferUploaderHealthMonitor from \"../healthMonitor/transferUploaderHealthMonitor.js\";\r\n\r\nconst TransferFailedSleepInMs = 500;\r\n\r\nexport default abstract class TransferUploaderBase<T extends NodeFileDetails | WebFileDetails> implements TransferUploader<T> {\r\n #logger: Logger;\r\n #trackingId: number | string;\r\n\r\n #fileDetails: T[];\r\n\r\n #config: TransferUploaderConfig;\r\n #envValues: EnvironmentVariables;\r\n\r\n #pauseController?: PauseController;\r\n #abortController?: AbortController;\r\n\r\n #transfer: TransferUpload<T>;\r\n #healthMonitor: TransferUploaderHealthMonitor;\r\n\r\n #isShuttingDown = false;\r\n\r\n #failedReason?: string;\r\n\r\n #isUdp?: boolean;\r\n\r\n #isHealthy = true;\r\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\r\n\r\n constructor(transfer: TransferUpload<T>, fileDetails: T[], config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger, healthMonitor: TransferUploaderHealthMonitor, trackingId: number | string) {\r\n this.#logger = logger;\r\n this.#trackingId = trackingId;\r\n\r\n this.#config = config;\r\n this.#envValues = envValues;\r\n\r\n this.#fileDetails = fileDetails;\r\n this.#transfer = transfer;\r\n this.#healthMonitor = healthMonitor;\r\n\r\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\r\n\r\n this.addHealthMonitorEventListeners();\r\n this.addTransferEventListeners();\r\n }\r\n\r\n get transfer(): TransferUpload<T> {\r\n return this.#transfer;\r\n }\r\n\r\n get healthMonitor(): TransferUploaderHealthMonitor {\r\n return this.#healthMonitor;\r\n }\r\n\r\n get failedReason(): string | undefined {\r\n return this.#failedReason;\r\n }\r\n\r\n public pause() {\r\n this.logInfo(`Pause called`);\r\n\r\n if (!this.#pauseController)\r\n throw new TransferUploadError(`Can't pause not started transfer`);\r\n\r\n this.#isShuttingDown = true;\r\n\r\n this.#pauseController.pause();\r\n }\r\n\r\n public stop() {\r\n this.logInfo(`Stop called`);\r\n\r\n if (!this.#abortController)\r\n throw new TransferUploadError(`Can't stop not started transfer`);\r\n\r\n this.#isShuttingDown = true;\r\n\r\n this.#abortController.abort();\r\n }\r\n\r\n public async cancel(abortSignal?: AbortSignal) {\r\n this.logInfo(`Cancel called`);\r\n\r\n await this.#transfer.cancel(abortSignal);\r\n }\r\n\r\n async start(): Promise<void> {\r\n if (this.#transfer.status !== TransferStatus.Failed && this.#transfer.status !== TransferStatus.Aborted && this.#transfer.status !== TransferStatus.Initialized && this.#transfer.status !== TransferStatus.Paused)\r\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transfer.status]} state and cannot be run`);\r\n\r\n this.logInfo(`Starting upload. Already uploaded bytes: ${this.transfer.uploadedBytesCount}/${this.#transfer.totalSizeInBytes}B, completed files: ${this.transfer.completedFilesCount}.`);\r\n\r\n const logMessageEntries = this.#transfer.files.map(f => `'Sending ${f.fileName}' with id = ${f.externalId}. It will be put into '${f.fileDestinationPathInTransfer}' folder.`);\r\n this.logInfo(`Transfer file details:\\n${logMessageEntries.join(`\\n`)}`);\r\n\r\n this.#failedReason = undefined;\r\n this.#isShuttingDown = false;\r\n\r\n this.#pauseController = new PauseController();\r\n this.#abortController = new AbortController();\r\n\r\n this.#healthMonitor.start();\r\n\r\n do {\r\n /* eslint-disable no-await-in-loop */\r\n try {\r\n await this.#transfer.run(this.#pauseController.signal, this.#abortController.signal);\r\n }\r\n catch (error) {\r\n this.logError(error as TransferUploadError, `Transfer upload run method exception`);\r\n\r\n this.setFailedReasonFromError(error as TransferUploadError);\r\n this.#isShuttingDown = true;\r\n\r\n break;\r\n }\r\n finally {\r\n // @ts-ignore Typescript's brainfart\r\n if (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown) {\r\n this.logWarning(`Retrying transfer in ${TransferFailedSleepInMs}ms.`);\r\n\r\n await sleep(TransferFailedSleepInMs);\r\n }\r\n }\r\n }\r\n while (this.#transfer.progressInPercentage < 100 && !this.#isShuttingDown);\r\n\r\n this.#healthMonitor.stop();\r\n this.#logHealthyStatusThrottled.cancel();\r\n\r\n this.logInfo(`Upload finished in status ${TransferStatus[this.#transfer.status]} having ${this.#transfer.progressInPercentage}% completed`);\r\n }\r\n\r\n private setFailedReasonFromError(error: TransferUploadError) {\r\n const apiFilemailError = this.tryGetApiFilemailError(error);\r\n\r\n if (apiFilemailError) {\r\n this.#failedReason = apiFilemailError.reason;\r\n return;\r\n }\r\n\r\n if (error.message.startsWith(`Unhandled error occured`) && error.cause) {\r\n this.#failedReason = error.cause.message;\r\n return;\r\n }\r\n\r\n this.#failedReason = error.message;\r\n }\r\n\r\n private tryGetApiFilemailError(error: Error): ApiFilemailError | null {\r\n if (error instanceof ApiFilemailError)\r\n return error;\r\n\r\n if (error.cause)\r\n return this.tryGetApiFilemailError(error.cause);\r\n\r\n return null;\r\n }\r\n\r\n private addHealthMonitorEventListeners() {\r\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\r\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, this.getLogEntryMetadata());\r\n\r\n if (!this.#isHealthy)\r\n logHealthyStatus(this.#logger, true, eventArgs, this.getLogEntryMetadata());\r\n\r\n this.#isHealthy = true;\r\n });\r\n\r\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {\r\n if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)\r\n return;\r\n\r\n this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, this.getLogEntryMetadata());\r\n\r\n if (this.#isHealthy)\r\n logHealthyStatus(this.#logger, false, eventArgs, this.getLogEntryMetadata());\r\n\r\n this.#isHealthy = false;\r\n });\r\n }\r\n\r\n private addTransferEventListeners() {\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => {\r\n this.#isUdp = eventArgs.isUdpMode;\r\n });\r\n\r\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadFailed, eventArgs => {\r\n const isTimeoutError = eventArgs.error.message.includes(`Timeout`);\r\n const errorMessage = `File ${eventArgs.fileStatus.externalId} chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} upload failed: ${eventArgs.reason}`;\r\n\r\n if (this.#isUdp && isTimeoutError)\r\n this.logDebug(errorMessage);\r\n else\r\n this.logError(eventArgs.error, errorMessage);\r\n\r\n const isFileAccessError = eventArgs.error.cause instanceof FsError;\r\n const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);\r\n\r\n if (isFileAccessError && !this.#isShuttingDown) {\r\n this.#failedReason = `Can't read ${fullFilePathOrName} anymore`;\r\n\r\n this.logWarning(`${this.#failedReason}. Aborting...`);\r\n this.stop();\r\n }\r\n\r\n if (!this.#config.infiniteRetries && !this.#isShuttingDown) {\r\n this.#failedReason = `Uploading ${fullFilePathOrName} failed after ${this.#config.chunkUploadRetryLimit} retries`;\r\n\r\n this.logWarning(`${this.#failedReason}. Aborting...`);\r\n this.stop();\r\n }\r\n });\r\n\r\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadFailed, eventArgs => {\r\n const isTimeoutError = eventArgs.reason?.includes(`Timeout`);\r\n const errorMessage = `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload failed: ${eventArgs.reason}`;\r\n\r\n if (this.#isUdp && isTimeoutError)\r\n this.logWarning(errorMessage);\r\n else\r\n this.logError(new Error(errorMessage));\r\n });\r\n\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferRun, () => this.logInfo(`Transfer run.`));\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferAbortRequested, () => this.logInfo(`Transfer abort requested`));\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferAborted, async () => this.logInfo(`Transfer aborted.`));\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferCancelRequested, () => this.logInfo(`Transfer cancel requested.`));\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferCanceled, () => this.logInfo(`Transfer canceled.`));\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferFailed, () => this.logError(new Error(`Transfer failed.`)));\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => this.logInfo(`Transfer upload mode chosen. Is UDP: ${eventArgs.isUdpMode}; Latency: ${eventArgs.latency ?? `<unkown>`}; Error: ${eventArgs.error ?? `<none>`}`));\r\n\r\n this.#transfer.addEventListener(TransferUploadEvent.TransferCompleted, eventArgs => this.logInfo(`Transfer completed successfully. ID: ${eventArgs.transferId}, URL: ${eventArgs.transferDownloadUrl}`));\r\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadProgressed, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} progressed: ${eventArgs.transferredBytesSinceLastEvent} bytes sinc last event. Total progress: ${this.#transfer?.progressInPercentage}%.`));\r\n\r\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadStarted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload started.`));\r\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload completed.`));\r\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadStarted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload started`));\r\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));\r\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));\r\n }\r\n\r\n private logTrace(message: string) {\r\n const logEntryMetadata = this.getLogEntryMetadata();\r\n this.#logger.logTrace(message, logEntryMetadata);\r\n }\r\n\r\n private logDebug(message: string) {\r\n const logEntryMetadata = this.getLogEntryMetadata();\r\n this.#logger.logDebug(message, logEntryMetadata);\r\n }\r\n\r\n private logInfo(message: string) {\r\n const logEntryMetadata = this.getLogEntryMetadata();\r\n this.#logger.logInfo(message, logEntryMetadata);\r\n }\r\n\r\n private logWarning(message: string) {\r\n const logEntryMetadata = this.getLogEntryMetadata();\r\n this.#logger.logWarning(message, logEntryMetadata);\r\n }\r\n\r\n private logError(error: Error, message?: string) {\r\n const logEntryMetadata = this.getLogEntryMetadata();\r\n this.#logger.logError(error, message, logEntryMetadata);\r\n }\r\n\r\n private getLogEntryMetadata() {\r\n return {\r\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\r\n [logEventPropertyName.TransferIdPropertyName]: this.#transfer.transferId,\r\n };\r\n }\r\n\r\n private getFullFilePathOrFileName(fileStatus: ReadonlyTransferUploadStateFile): string {\r\n const fileDetails = this.#fileDetails.find(f => f.externalId === fileStatus.externalId);\r\n\r\n if (!fileDetails)\r\n return fileStatus.fileName;\r\n\r\n if (this.isNodeFileDetails(fileDetails))\r\n return fileDetails.fileFullPath;\r\n\r\n return fileDetails.file.name;\r\n }\r\n\r\n private isNodeFileDetails(fileDetails: NodeFileDetails | WebFileDetails): fileDetails is NodeFileDetails {\r\n return typeof (fileDetails as NodeFileDetails).fileFullPath === `string`;\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"transferUploaderBase.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderBase.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport sleep from \"abortable-sleep\";\nimport throttle from \"lodash.throttle\";\n\nimport TransferUpload from \"../../uploader/transferUpload.js\";\nimport PauseController from \"../../uploader/pauseController.js\";\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\nimport FsError from \"../../utils/fileSystem/fsError.js\";\nimport TransferUploadError from \"../../uploader/transferUploadError.js\";\nimport logEventPropertyName from \"../../utils/logging/logEventPropertyNames.js\";\nimport ApiFilemailError from \"../../utils/api/apiFilemailError.js\";\nimport logHealthyStatus from \"../loggers/utils/logHealthyStatus.js\";\n\nimport type NodeFileDetails from \"../../utils/fileSystem/node/nodeFileDetails.js\";\nimport type Logger from \"../loggers/logger.js\";\nimport type EnvironmentVariables from \"../environmentVariables.js\";\nimport type TransferUploader from \"./transferUploader.js\";\nimport type ReadonlyTransferUploadStateFile from \"../../uploader/state/readonlyTransferUploadStateFile.js\";\nimport type TransferUploaderConfig from \"./transferUploaderConfig.js\";\nimport type WebFileDetails from \"../../utils/fileSystem/web/webFileDetails.js\";\nimport TransferHealthMonitorEvent from \"../healthMonitor/events/transferHealthMonitorEvent.js\";\nimport type TransferUploaderHealthMonitor from \"../healthMonitor/transferUploaderHealthMonitor.js\";\n\nconst TransferFailedSleepInMs = 500;\n\nexport default abstract class TransferUploaderBase<T extends NodeFileDetails | WebFileDetails> implements TransferUploader<T> {\n #logger: Logger;\n #trackingId: number | string;\n\n #fileDetails: T[];\n\n #config: TransferUploaderConfig;\n #envValues: EnvironmentVariables;\n\n #pauseController?: PauseController;\n #abortController?: AbortController;\n\n #transfer: TransferUpload<T>;\n #healthMonitor: TransferUploaderHealthMonitor;\n\n #isShuttingDown = false;\n\n #failedReason?: string;\n\n #isUdp?: boolean;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(transfer: TransferUpload<T>, fileDetails: T[], config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger, healthMonitor: TransferUploaderHealthMonitor, trackingId: number | string) {\n this.#logger = logger;\n this.#trackingId = trackingId;\n\n this.#config = config;\n this.#envValues = envValues;\n\n this.#fileDetails = fileDetails;\n this.#transfer = transfer;\n this.#healthMonitor = healthMonitor;\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n get transfer(): TransferUpload<T> {\n return this.#transfer;\n }\n\n get healthMonitor(): TransferUploaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n get failedReason(): string | undefined {\n return this.#failedReason;\n }\n\n public pause() {\n this.logInfo(`Pause called`);\n\n if (!this.#pauseController)\n throw new TransferUploadError(`Can't pause not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#pauseController.pause();\n }\n\n public stop() {\n this.logInfo(`Stop called`);\n\n if (!this.#abortController)\n throw new TransferUploadError(`Can't stop not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#abortController.abort();\n }\n\n public async cancel(abortSignal?: AbortSignal) {\n this.logInfo(`Cancel called`);\n\n await this.#transfer.cancel(abortSignal);\n }\n\n async start(): Promise<void> {\n if (this.#transfer.status !== TransferStatus.Failed && this.#transfer.status !== TransferStatus.Aborted && this.#transfer.status !== TransferStatus.Initialized && this.#transfer.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transfer.status]} state and cannot be run`);\n\n this.logInfo(`Starting upload. Already uploaded bytes: ${this.transfer.uploadedBytesCount}/${this.#transfer.totalSizeInBytes}B, completed files: ${this.transfer.completedFilesCount}.`);\n\n const logMessageEntries = this.#transfer.files.map(f => `'Sending ${f.fileName}' with id = ${f.externalId}. It will be put into '${f.fileDestinationPathInTransfer}' folder.`);\n this.logInfo(`Transfer file details:\\n${logMessageEntries.join(`\\n`)}`);\n\n this.#failedReason = undefined;\n this.#isShuttingDown = false;\n\n this.#pauseController = new PauseController();\n this.#abortController = new AbortController();\n\n this.#healthMonitor.start();\n\n do {\n /* eslint-disable no-await-in-loop */\n try {\n await this.#transfer.run(this.#pauseController.signal, this.#abortController.signal);\n }\n catch (error) {\n this.logError(error as TransferUploadError, `Transfer upload run method exception`);\n\n this.setFailedReasonFromError(error as TransferUploadError);\n this.#isShuttingDown = true;\n\n break;\n }\n finally {\n // @ts-ignore Typescript's brainfart\n if (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown) {\n this.logWarning(`Retrying transfer in ${TransferFailedSleepInMs}ms.`);\n\n await sleep(TransferFailedSleepInMs);\n }\n }\n }\n while (this.#transfer.progressInPercentage < 100 && !this.#isShuttingDown);\n\n this.#healthMonitor.stop();\n this.#logHealthyStatusThrottled.cancel();\n\n this.logInfo(`Upload finished in status ${TransferStatus[this.#transfer.status]} having ${this.#transfer.progressInPercentage}% completed`);\n }\n\n private setFailedReasonFromError(error: TransferUploadError) {\n const apiFilemailError = this.tryGetApiFilemailError(error);\n\n if (apiFilemailError) {\n this.#failedReason = apiFilemailError.reason;\n return;\n }\n\n if (error.message.startsWith(`Unhandled error occured`) && error.cause) {\n this.#failedReason = error.cause.message;\n return;\n }\n\n this.#failedReason = error.message;\n }\n\n private tryGetApiFilemailError(error: Error): ApiFilemailError | null {\n if (error instanceof ApiFilemailError)\n return error;\n\n if (error.cause)\n return this.tryGetApiFilemailError(error.cause);\n\n return null;\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, this.getLogEntryMetadata());\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, this.getLogEntryMetadata());\n\n this.#isHealthy = true;\n });\n\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {\n if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)\n return;\n\n this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, this.getLogEntryMetadata());\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, this.getLogEntryMetadata());\n\n this.#isHealthy = false;\n });\n }\n\n private addTransferEventListeners() {\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => {\n this.#isUdp = eventArgs.isUdpMode;\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadFailed, eventArgs => {\n const isTimeoutError = eventArgs.error.message.includes(`Timeout`);\n const errorMessage = `File ${eventArgs.fileStatus.externalId} chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} upload failed: ${eventArgs.reason}`;\n\n if (this.#isUdp && isTimeoutError)\n this.logDebug(errorMessage);\n else\n this.logError(eventArgs.error, errorMessage);\n\n const isFileAccessError = eventArgs.error.cause instanceof FsError;\n const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);\n\n if (isFileAccessError && !this.#isShuttingDown) {\n this.#failedReason = `Can't read ${fullFilePathOrName} anymore`;\n\n this.logWarning(`${this.#failedReason}. Aborting...`);\n this.stop();\n }\n\n if (!this.#config.infiniteRetries && !this.#isShuttingDown) {\n this.#failedReason = `Uploading ${fullFilePathOrName} failed after ${this.#config.chunkUploadRetryLimit} retries`;\n\n this.logWarning(`${this.#failedReason}. Aborting...`);\n this.stop();\n }\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadFailed, eventArgs => {\n const isTimeoutError = eventArgs.reason?.includes(`Timeout`);\n const errorMessage = `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload failed: ${eventArgs.reason}`;\n\n if (this.#isUdp && isTimeoutError)\n this.logWarning(errorMessage);\n else\n this.logError(new Error(errorMessage));\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferRun, () => this.logInfo(`Transfer run.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAbortRequested, () => this.logInfo(`Transfer abort requested`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAborted, async () => this.logInfo(`Transfer aborted.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCancelRequested, () => this.logInfo(`Transfer cancel requested.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCanceled, () => this.logInfo(`Transfer canceled.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferFailed, () => this.logError(new Error(`Transfer failed.`)));\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => this.logInfo(`Transfer upload mode chosen. Is UDP: ${eventArgs.isUdpMode}; Latency: ${eventArgs.latency ?? `<unkown>`}; Error: ${eventArgs.error ?? `<none>`}`));\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferCompleted, eventArgs => this.logInfo(`Transfer completed successfully. ID: ${eventArgs.transferId}, URL: ${eventArgs.transferDownloadUrl}`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadProgressed, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} progressed: ${eventArgs.transferredBytesSinceLastEvent} bytes sinc last event. Total progress: ${this.#transfer?.progressInPercentage}%.`));\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadStarted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload started.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload completed.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadStarted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload started`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));\n }\n\n private logTrace(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logTrace(message, logEntryMetadata);\n }\n\n private logDebug(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logDebug(message, logEntryMetadata);\n }\n\n private logInfo(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logInfo(message, logEntryMetadata);\n }\n\n private logWarning(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logWarning(message, logEntryMetadata);\n }\n\n private logError(error: Error, message?: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logError(error, message, logEntryMetadata);\n }\n\n private getLogEntryMetadata() {\n return {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n [logEventPropertyName.TransferIdPropertyName]: this.#transfer.transferId,\n };\n }\n\n private getFullFilePathOrFileName(fileStatus: ReadonlyTransferUploadStateFile): string {\n const fileDetails = this.#fileDetails.find(f => f.externalId === fileStatus.externalId);\n\n if (!fileDetails)\n return fileStatus.fileName;\n\n if (this.isNodeFileDetails(fileDetails))\n return fileDetails.fileFullPath;\n\n return fileDetails.file.name;\n }\n\n private isNodeFileDetails(fileDetails: NodeFileDetails | WebFileDetails): fileDetails is NodeFileDetails {\n return typeof (fileDetails as NodeFileDetails).fileFullPath === `string`;\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploaderConfig.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderConfig.ts"],"names":[],"mappings":"","sourcesContent":["/* eslint-disable semi */\
|
|
1
|
+
{"version":3,"file":"transferUploaderConfig.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderConfig.ts"],"names":[],"mappings":"","sourcesContent":["/* eslint-disable semi */\nexport default interface TransferUploaderConfig {\n infiniteRetries: boolean,\n logintoken?: string,\n chunkUploadRetryLimit: number,\n uploadIdleTimeoutInMs: number,\n tcpChunksUploadInParallel: number,\n tcpChunkSizeInBytes: number,\n apiRetryLimit: number,\n apiRequestTotalTimeoutInMs: number,\n trackingId?: number | string,\n progressEventThrottlingInMs: number,\n currentRatesTimespanInMs: number,\n forceUdp?: boolean,\n turnOffUdp?: boolean,\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploaderUtils.js","sourceRoot":"","sources":["../../../../../src/client/uploader/utils/uploaderUtils.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAAC,MAA8B;IAC5D,OAAO;QACH,2BAA2B,EAAE,MAAM,CAAC,2BAA2B;QAC/D,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;QACzD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC;AACN,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,eAAe,CAAI,YAAiE;IAChG,IAAI,4BAA4B,CAAC,YAAY,CAAC;QAC1C,YAAY,CAAC,qBAAqB,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAI,IAAyD;IACrG,OAAQ,IAAoC,CAAC,WAAW,KAAK,SAAS,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc,CAAwB,wBAA6G;IAC/J,MAAM,oBAAoB,GAAG,wBAA+E,CAAC;IAC7G,OAAO,oBAAoB,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACjG,CAAC","sourcesContent":["import type { TransferUploadExportData } from \"../../../uploader/export/transferUploadExportData.js\";\
|
|
1
|
+
{"version":3,"file":"uploaderUtils.js","sourceRoot":"","sources":["../../../../../src/client/uploader/utils/uploaderUtils.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAAC,MAA8B;IAC5D,OAAO;QACH,2BAA2B,EAAE,MAAM,CAAC,2BAA2B;QAC/D,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;QACzD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC;AACN,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,eAAe,CAAI,YAAiE;IAChG,IAAI,4BAA4B,CAAC,YAAY,CAAC;QAC1C,YAAY,CAAC,qBAAqB,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAI,IAAyD;IACrG,OAAQ,IAAoC,CAAC,WAAW,KAAK,SAAS,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc,CAAwB,wBAA6G;IAC/J,MAAM,oBAAoB,GAAG,wBAA+E,CAAC;IAC7G,OAAO,oBAAoB,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACjG,CAAC","sourcesContent":["import type { TransferUploadExportData } from \"../../../uploader/export/transferUploadExportData.js\";\nimport type { TransferUploadAppendInfo } from \"../../../uploader/options/transferUploadAppendInfo.js\";\nimport type TransferUploadConfig from \"../../../uploader/options/transferUploadConfig.js\";\nimport type TransferUploadInfo from \"../../../uploader/options/transferUploadInfo.js\";\nimport type FileDetails from \"../../../utils/fileSystem/fileDetails.js\";\nimport type TransferUploaderConfig from \"../transferUploaderConfig.js\";\n\nexport function buildUploadConfig(config: TransferUploaderConfig): TransferUploadConfig {\n return {\n progressEventThrottlingInMs: config.progressEventThrottlingInMs,\n currentRatesTimespanInMs: config.currentRatesTimespanInMs,\n forceUdp: config.forceUdp,\n turnOffUdp: config.turnOffUdp,\n };\n}\n\n/* eslint-disable no-param-reassign */\nexport function fixTransferInfo<T>(transferInfo: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): void {\n if (isTransferUploaderAppendInfo(transferInfo))\n transferInfo.transferFileServerUrl = new URL(`savefile.ashx`, transferInfo.transferFileServerUrl).href;\n}\n\nexport function isTransferUploaderAppendInfo<T>(info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): info is TransferUploadAppendInfo<T> {\n return (info as TransferUploadAppendInfo<T>).transferKey !== undefined;\n}\n\nexport function isTransferInfo<T extends FileDetails>(transferInfoOrExportData: (TransferUploadInfo<T> | TransferUploadAppendInfo<T>) | TransferUploadExportData<T>): transferInfoOrExportData is TransferUploadInfo<T> | TransferUploadAppendInfo<T> {\n const possiblyTransferInfo = transferInfoOrExportData as TransferUploadInfo<T> | TransferUploadAppendInfo<T>;\n return possiblyTransferInfo.files !== undefined && Array.isArray(possiblyTransferInfo.files);\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webTransferUploader.js","sourceRoot":"","sources":["../../../../../src/client/uploader/web/webTransferUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,uBAAuB,MAAM,wDAAwD,CAAC;AAC7F,OAAO,uCAAuC,MAAM,mFAAmF,CAAC;AACxI,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAC9D,OAAO,eAAe,MAAM,8CAA8C,CAAC;AAC3E,OAAO,gDAAgD,MAAM,kGAAkG,CAAC;AAChK,OAAO,uBAAuB,MAAM,sDAAsD,CAAC;AAC3F,OAAO,0BAA0B,MAAM,sDAAsD,CAAC;AAC9F,OAAO,YAAY,MAAM,wCAAwC,CAAC;AAClE,OAAO,gBAAgB,MAAM,uDAAuD,CAAC;AACrF,OAAO,6BAA6B,MAAM,sDAAsD,CAAC;AASjG,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,oBAAoC;IACjF,YAAY,YAA2F,EAAE,MAA8B,EAAE,SAA+B,EAAE,MAAc;QACpL,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAE/C,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,MAAM,0BAA0B,GAAG,IAAI,gDAAgD,EAAE,CAAC;QAC1F,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,yBAAyB,EAAE,YAAY,EAAE,IAAI,uCAAuC,EAAE,CAAC,CAAC;QACzK,MAAM,uBAAuB,GAAG,IAAI,0BAA0B,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACtK,MAAM,YAAY,GAAG,IAAI,uBAAuB,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,6BAA6B,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAElH,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAE7J,IAAI,MAAM,CAAC,UAAU;YACjB,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/C,eAAe,CAAC,YAAY,CAAC,CAAC;QAE9B,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,0BAA0B,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAEvK,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAC9F,CAAC;CACJ","sourcesContent":["import { v4 as guid } from 'uuid';\
|
|
1
|
+
{"version":3,"file":"webTransferUploader.js","sourceRoot":"","sources":["../../../../../src/client/uploader/web/webTransferUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,uBAAuB,MAAM,wDAAwD,CAAC;AAC7F,OAAO,uCAAuC,MAAM,mFAAmF,CAAC;AACxI,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAC9D,OAAO,eAAe,MAAM,8CAA8C,CAAC;AAC3E,OAAO,gDAAgD,MAAM,kGAAkG,CAAC;AAChK,OAAO,uBAAuB,MAAM,sDAAsD,CAAC;AAC3F,OAAO,0BAA0B,MAAM,sDAAsD,CAAC;AAC9F,OAAO,YAAY,MAAM,wCAAwC,CAAC;AAClE,OAAO,gBAAgB,MAAM,uDAAuD,CAAC;AACrF,OAAO,6BAA6B,MAAM,sDAAsD,CAAC;AASjG,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,oBAAoC;IACjF,YAAY,YAA2F,EAAE,MAA8B,EAAE,SAA+B,EAAE,MAAc;QACpL,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAE/C,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,MAAM,0BAA0B,GAAG,IAAI,gDAAgD,EAAE,CAAC;QAC1F,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,yBAAyB,EAAE,YAAY,EAAE,IAAI,uCAAuC,EAAE,CAAC,CAAC;QACzK,MAAM,uBAAuB,GAAG,IAAI,0BAA0B,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACtK,MAAM,YAAY,GAAG,IAAI,uBAAuB,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,6BAA6B,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAElH,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAE7J,IAAI,MAAM,CAAC,UAAU;YACjB,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/C,eAAe,CAAC,YAAY,CAAC,CAAC;QAE9B,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,0BAA0B,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAEvK,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAC9F,CAAC;CACJ","sourcesContent":["import { v4 as guid } from 'uuid';\n\nimport TransferUpload from \"../../../uploader/transferUpload.js\";\nimport TransferUploadOptimizer from \"../../../uploader/optimizer/transferUploadOptimizer.js\";\nimport UdpConcurrencyBasedOptimizationStrategy from \"../../../uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js\";\nimport { buildUploadConfig, fixTransferInfo } from '../utils/uploaderUtils.js';\nimport TransferUploaderBase from \"../transferUploaderBase.js\";\nimport WebEventsEngine from '../../../utils/events/web/webEventsEngine.js';\nimport WebFileDetailsUploaderChunkStreamProviderFactory from '../../../uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.js';\nimport WebCryptographyProvider from '../../../utils/crypto/web/webCryptographyProvider.js';\nimport WebFileServerClientFactory from '../../../utils/api/web/webFileServerClientFactory.js';\nimport WebApiClient from '../../../utils/api/web/webApiClient.js';\nimport WebOnlineChecker from '../../healthMonitor/onlineChecker/webOnlineChecker.js';\nimport TransferUploaderHealthMonitor from '../../healthMonitor/transferUploaderHealthMonitor.js';\n\nimport type Logger from \"../../loggers/logger.js\";\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferUploadInfo from \"../../../uploader/options/transferUploadInfo.js\";\nimport type { TransferUploadAppendInfo } from \"../../../uploader/options/transferUploadAppendInfo.js\";\nimport type TransferUploaderConfig from \"../transferUploaderConfig.js\";\nimport type WebFileDetails from \"../../../utils/fileSystem/web/webFileDetails.js\";\n\nexport default class WebTransferUploader extends TransferUploaderBase<WebFileDetails> {\n constructor(transferInfo: TransferUploadInfo<WebFileDetails> | TransferUploadAppendInfo<WebFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger) {\n const trackingId = config.trackingId || guid();\n\n const eventsEngine = new WebEventsEngine();\n const chunkStreamProviderFactory = new WebFileDetailsUploaderChunkStreamProviderFactory();\n const optimizer = new TransferUploadOptimizer(config.tcpChunkSizeInBytes, config.tcpChunksUploadInParallel, eventsEngine, new UdpConcurrencyBasedOptimizationStrategy());\n const fileServerClientFactory = new WebFileServerClientFactory(envValues.source, envValues.sourceDetails, config.uploadIdleTimeoutInMs, config.chunkUploadRetryLimit);\n const cryptography = new WebCryptographyProvider();\n const uploadConfig = buildUploadConfig(config);\n const healthMonitor = new TransferUploaderHealthMonitor(new WebOnlineChecker(envValues.apiBaseUrl), eventsEngine);\n\n const apiClient = new WebApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, config.apiRequestTotalTimeoutInMs, config.apiRetryLimit);\n\n if (config.logintoken)\n apiClient.setLoginToken(config.logintoken);\n\n fixTransferInfo(transferInfo);\n\n const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfo, uploadConfig, optimizer, cryptography);\n\n super(transfer, transferInfo.files, config, envValues, logger, healthMonitor, trackingId);\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileServerDownloadClient.js","sourceRoot":"","sources":["../../../../src/downloader/api/fileServerDownloadClient.ts"],"names":[],"mappings":"","sourcesContent":["import type GetCompressedFileMetadataResponse from \"../../utils/api/dtos/getCompressedFileMetadataResponse.js\";\
|
|
1
|
+
{"version":3,"file":"fileServerDownloadClient.js","sourceRoot":"","sources":["../../../../src/downloader/api/fileServerDownloadClient.ts"],"names":[],"mappings":"","sourcesContent":["import type GetCompressedFileMetadataResponse from \"../../utils/api/dtos/getCompressedFileMetadataResponse.js\";\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\nimport type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../../utils/fileSystem/chunkStreamProvider.js\";\n\n// This should be used as a transient object - a new instance for every chunk\ninterface FileServerDownloadClient {\n download(chunkStreamProvider: ChunkStreamProvider, encryptionData?: ChunkStreamProviderEncryptionData): Promise<void>\n release(): void\n getMd5Checksum(): Promise<string>\n addEventListener(eventName: `progress`, handler: (event: ChunkProgressEvent) => void): void\n removeEventListener(eventName: `progress`, handler: (event: ChunkProgressEvent) => void): void\n getCompressedFileMetadata(): Promise<GetCompressedFileMetadataResponse>\n}\n\nexport default FileServerDownloadClient;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeFileServerDownloadClient.js","sourceRoot":"","sources":["../../../../../src/downloader/api/node/nodeFileServerDownloadClient.ts"],"names":[],"mappings":"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","sourcesContent":["import got, { Got, Headers as GotHeaders, Options as GotOptions, Request as GotRequest } from \"got\";\r\nimport { pipeline } from \"stream/promises\";\r\n\r\nimport type DownloadOptions from \"../../downloadOptions.js\";\r\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\r\nimport { type BaseResponse, isBaseResponse } from \"../../../utils/api/dtos/baseResponse.js\";\r\nimport type GetRangehashResponse from \"../../../utils/api/dtos/getRangehashResponse.js\";\r\nimport type GetCompressedFileMetadataResponse from \"../../../utils/api/dtos/getCompressedFileMetadataResponse.js\";\r\nimport type FileServerDownloadClient from \"../fileServerDownloadClient.js\";\r\nimport NodeFileServerClientBase from \"../../../utils/api/node/nodeFileserverClientBase.js\";\r\nimport UrlUtil from \"../../../utils/api/urlUtil.js\";\r\nimport { retryEconnresetWorkaround } from \"../../../utils/api/node/gotWorkarounds.js\";\r\n\r\nexport default class NodeFileServerDownloadClient extends NodeFileServerClientBase implements FileServerDownloadClient {\r\n #downloadUrl: string;\r\n #start: number | null;\r\n #end: number | null;\r\n #options: DownloadOptions;\r\n #fileName: string;\r\n #transferId: string;\r\n #fileserverClient: Got;\r\n #downloadStream: GotRequest | null = null;\r\n #downloadIdleTimeoutInMs: number;\r\n\r\n constructor(downloadUrl: string, start: number | null, end: number | null, transferId: string, fileName: string, options: DownloadOptions, downloadIdleTimeoutInMs: number) {\r\n super();\r\n\r\n this.#downloadUrl = downloadUrl;\r\n this.#start = start;\r\n this.#end = end;\r\n this.#options = options;\r\n this.#transferId = transferId;\r\n this.#fileName = fileName;\r\n this.#fileserverClient = this.#createBaseGotInstance();\r\n this.#downloadIdleTimeoutInMs = downloadIdleTimeoutInMs;\r\n }\r\n\r\n async download(chunkStreamProvider: ChunkStreamProvider): Promise<void> {\r\n this.#throwIfRunning();\r\n\r\n const downloadRequest = this.#createGotChunkDownloadOptions();\r\n this.#downloadStream = got.stream(this.#downloadUrl, { ...downloadRequest });\r\n const { fileStream, decipherStream } = await chunkStreamProvider.getChunkWriteStream();\r\n\r\n const progressHandler = this.getDataTransferProgressHandler();\r\n this.#downloadStream.on(`downloadProgress`, progressHandler);\r\n\r\n if (decipherStream) {\r\n return await pipeline(\r\n this.#downloadStream,\r\n decipherStream as unknown as NodeJS.ReadWriteStream,\r\n fileStream,\r\n );\r\n }\r\n\r\n return pipeline(\r\n this.#downloadStream,\r\n fileStream,\r\n );\r\n }\r\n\r\n release(): void {\r\n this.#downloadStream?.destroy();\r\n this.#downloadStream = null;\r\n }\r\n\r\n async getMd5Checksum(): Promise<string> {\r\n if (this.#start === null || this.#end === null)\r\n throw new Error(`MD5 checksum cannot be calculated if the start or end is not known --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\r\n\r\n const rangeHashOptions = this.#crateGotRangeHashOptions();\r\n const md5response = await this.#fileserverClient(`GetRangehash.ashx`, rangeHashOptions).json<GetRangehashResponse>();\r\n\r\n this.#throwIfResponseNotOk(md5response);\r\n\r\n if (!md5response.hash)\r\n throw new Error(`Range hash is empty --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\r\n\r\n return md5response.hash;\r\n }\r\n\r\n async getCompressedFileMetadata(): Promise<GetCompressedFileMetadataResponse> {\r\n this.#throwIfRunning();\r\n\r\n const metadataResponse = await got.head(this.#downloadUrl);\r\n\r\n if (metadataResponse.statusCode !== 200)\r\n throw new Error(`HTTP ${metadataResponse.statusCode}`);\r\n\r\n const disposition = metadataResponse.headers[`content-disposition`];\r\n let fileName = ``;\r\n if (disposition && disposition.indexOf(`attachment;`) === 0) {\r\n const filenameRegex = /filename\\*?=['\"]?(?:UTF-\\d['\"]*)?([^;\\r\\n\"']*)['\"]?;?/;\r\n const matches = filenameRegex.exec(disposition);\r\n if (matches && matches.length > 1 && matches[1])\r\n fileName = matches[1];\r\n }\r\n return {\r\n fileSize: parseInt(metadataResponse.headers[`content-length`]!, 10),\r\n fileName,\r\n };\r\n }\r\n\r\n #throwIfRunning() {\r\n if (this.#downloadStream)\r\n throw new Error(`Attempted to run a chunk download while it is already running`);\r\n }\r\n\r\n #throwIfResponseNotOk(response: BaseResponse<unknown>) {\r\n if (!isBaseResponse(response))\r\n throw new Error(`FS response is not a valid base response object --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\r\n\r\n if (response.responsestatus !== `OK`)\r\n throw new Error(`${response.responsestatus}: ${response.errormessage}`);\r\n }\r\n\r\n #crateGotRangeHashOptions() {\r\n return {\r\n searchParams: {\r\n transferid: this.#transferId,\r\n thefilename: this.#fileName,\r\n position: this.#start!,\r\n length: 1 + this.#end! - this.#start!,\r\n },\r\n retry: {\r\n limit: 5,\r\n backoffLimit: 10000,\r\n },\r\n };\r\n }\r\n\r\n #createGotChunkDownloadOptions(): GotOptions {\r\n const query = UrlUtil.getQueryStringFromUrl(this.#downloadUrl);\r\n const headers: GotHeaders = {};\r\n\r\n if (this.#options.userAgent)\r\n headers[`User-Agent`] = this.#options.userAgent;\r\n\r\n if (this.#start !== null && this.#end !== null)\r\n headers.Range = `bytes=${this.#start}-${this.#end}`;\r\n\r\n return new GotOptions({\r\n headers,\r\n searchParams: {\r\n ...query, // need to unfold original query - when using url with query included got will replace the query with provided searchParams option\r\n skipreg: true, // make sure to implement download registrations - figure out a good way for file-by-file scenarios (current desktop v2 is a bit verbose...)\r\n skipcheck: true,\r\n },\r\n timeout: {\r\n socket: this.#downloadIdleTimeoutInMs > 0 ? this.#downloadIdleTimeoutInMs : undefined,\r\n },\r\n });\r\n }\r\n\r\n #createBaseGotInstance(): Got {\r\n const headers: GotHeaders = {};\r\n\r\n if (this.#options.userAgent)\r\n headers[`User-Agent`] = this.#options.userAgent;\r\n\r\n return got.extend({\r\n prefixUrl: UrlUtil.getHostFromUrl(this.#downloadUrl),\r\n headers,\r\n retry: {\r\n ...retryEconnresetWorkaround,\r\n },\r\n });\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"nodeFileServerDownloadClient.js","sourceRoot":"","sources":["../../../../../src/downloader/api/node/nodeFileServerDownloadClient.ts"],"names":[],"mappings":"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","sourcesContent":["import got, { Got, Headers as GotHeaders, Options as GotOptions, Request as GotRequest } from \"got\";\nimport { pipeline } from \"stream/promises\";\n\nimport type DownloadOptions from \"../../downloadOptions.js\";\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\nimport { type BaseResponse, isBaseResponse } from \"../../../utils/api/dtos/baseResponse.js\";\nimport type GetRangehashResponse from \"../../../utils/api/dtos/getRangehashResponse.js\";\nimport type GetCompressedFileMetadataResponse from \"../../../utils/api/dtos/getCompressedFileMetadataResponse.js\";\nimport type FileServerDownloadClient from \"../fileServerDownloadClient.js\";\nimport NodeFileServerClientBase from \"../../../utils/api/node/nodeFileserverClientBase.js\";\nimport UrlUtil from \"../../../utils/api/urlUtil.js\";\nimport { retryEconnresetWorkaround } from \"../../../utils/api/node/gotWorkarounds.js\";\n\nexport default class NodeFileServerDownloadClient extends NodeFileServerClientBase implements FileServerDownloadClient {\n #downloadUrl: string;\n #start: number | null;\n #end: number | null;\n #options: DownloadOptions;\n #fileName: string;\n #transferId: string;\n #fileserverClient: Got;\n #downloadStream: GotRequest | null = null;\n #downloadIdleTimeoutInMs: number;\n\n constructor(downloadUrl: string, start: number | null, end: number | null, transferId: string, fileName: string, options: DownloadOptions, downloadIdleTimeoutInMs: number) {\n super();\n\n this.#downloadUrl = downloadUrl;\n this.#start = start;\n this.#end = end;\n this.#options = options;\n this.#transferId = transferId;\n this.#fileName = fileName;\n this.#fileserverClient = this.#createBaseGotInstance();\n this.#downloadIdleTimeoutInMs = downloadIdleTimeoutInMs;\n }\n\n async download(chunkStreamProvider: ChunkStreamProvider): Promise<void> {\n this.#throwIfRunning();\n\n const downloadRequest = this.#createGotChunkDownloadOptions();\n this.#downloadStream = got.stream(this.#downloadUrl, { ...downloadRequest });\n const { fileStream, decipherStream } = await chunkStreamProvider.getChunkWriteStream();\n\n const progressHandler = this.getDataTransferProgressHandler();\n this.#downloadStream.on(`downloadProgress`, progressHandler);\n\n if (decipherStream) {\n return await pipeline(\n this.#downloadStream,\n decipherStream as unknown as NodeJS.ReadWriteStream,\n fileStream,\n );\n }\n\n return pipeline(\n this.#downloadStream,\n fileStream,\n );\n }\n\n release(): void {\n this.#downloadStream?.destroy();\n this.#downloadStream = null;\n }\n\n async getMd5Checksum(): Promise<string> {\n if (this.#start === null || this.#end === null)\n throw new Error(`MD5 checksum cannot be calculated if the start or end is not known --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n const rangeHashOptions = this.#crateGotRangeHashOptions();\n const md5response = await this.#fileserverClient(`GetRangehash.ashx`, rangeHashOptions).json<GetRangehashResponse>();\n\n this.#throwIfResponseNotOk(md5response);\n\n if (!md5response.hash)\n throw new Error(`Range hash is empty --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n return md5response.hash;\n }\n\n async getCompressedFileMetadata(): Promise<GetCompressedFileMetadataResponse> {\n this.#throwIfRunning();\n\n const metadataResponse = await got.head(this.#downloadUrl);\n\n if (metadataResponse.statusCode !== 200)\n throw new Error(`HTTP ${metadataResponse.statusCode}`);\n\n const disposition = metadataResponse.headers[`content-disposition`];\n let fileName = ``;\n if (disposition && disposition.indexOf(`attachment;`) === 0) {\n const filenameRegex = /filename\\*?=['\"]?(?:UTF-\\d['\"]*)?([^;\\r\\n\"']*)['\"]?;?/;\n const matches = filenameRegex.exec(disposition);\n if (matches && matches.length > 1 && matches[1])\n fileName = matches[1];\n }\n return {\n fileSize: parseInt(metadataResponse.headers[`content-length`]!, 10),\n fileName,\n };\n }\n\n #throwIfRunning() {\n if (this.#downloadStream)\n throw new Error(`Attempted to run a chunk download while it is already running`);\n }\n\n #throwIfResponseNotOk(response: BaseResponse<unknown>) {\n if (!isBaseResponse(response))\n throw new Error(`FS response is not a valid base response object --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n if (response.responsestatus !== `OK`)\n throw new Error(`${response.responsestatus}: ${response.errormessage}`);\n }\n\n #crateGotRangeHashOptions() {\n return {\n searchParams: {\n transferid: this.#transferId,\n thefilename: this.#fileName,\n position: this.#start!,\n length: 1 + this.#end! - this.#start!,\n },\n retry: {\n limit: 5,\n backoffLimit: 10000,\n },\n };\n }\n\n #createGotChunkDownloadOptions(): GotOptions {\n const query = UrlUtil.getQueryStringFromUrl(this.#downloadUrl);\n const headers: GotHeaders = {};\n\n if (this.#options.userAgent)\n headers[`User-Agent`] = this.#options.userAgent;\n\n if (this.#start !== null && this.#end !== null)\n headers.Range = `bytes=${this.#start}-${this.#end}`;\n\n return new GotOptions({\n headers,\n searchParams: {\n ...query, // need to unfold original query - when using url with query included got will replace the query with provided searchParams option\n skipreg: true, // make sure to implement download registrations - figure out a good way for file-by-file scenarios (current desktop v2 is a bit verbose...)\n skipcheck: true,\n },\n timeout: {\n socket: this.#downloadIdleTimeoutInMs > 0 ? this.#downloadIdleTimeoutInMs : undefined,\n },\n });\n }\n\n #createBaseGotInstance(): Got {\n const headers: GotHeaders = {};\n\n if (this.#options.userAgent)\n headers[`User-Agent`] = this.#options.userAgent;\n\n return got.extend({\n prefixUrl: UrlUtil.getHostFromUrl(this.#downloadUrl),\n headers,\n retry: {\n ...retryEconnresetWorkaround,\n },\n });\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkDownloader.d.ts","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,qBAAqB,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,gBAAgB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,0BAA0B,MAAM,mDAAmD,CAAC;AAChG,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAIhE,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAEpG,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAgB5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,qBAAqB,EAC5B,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,eAAe,EACxB,uBAAuB,EAAE,uBAAuB,EAChD,0BAA0B,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAC9D,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,cAAc,EACtB,cAAc,CAAC,EAAE,iCAAiC;IAehD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"chunkDownloader.d.ts","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,qBAAqB,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,gBAAgB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,0BAA0B,MAAM,mDAAmD,CAAC;AAChG,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAIhE,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAEpG,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAgB5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,qBAAqB,EAC5B,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,eAAe,EACxB,uBAAuB,EAAE,uBAAuB,EAChD,0BAA0B,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAC9D,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,cAAc,EACtB,cAAc,CAAC,EAAE,iCAAiC;IAehD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAwPlC"}
|
|
@@ -125,10 +125,11 @@ export default class ChunkDownloader {
|
|
|
125
125
|
this.#downloadState.chunkDownloadCompleted(this.#file, this.#chunk);
|
|
126
126
|
else {
|
|
127
127
|
let downloadError = null;
|
|
128
|
+
const failureCode = this.#toFailureCode(unhandledError ?? lastError);
|
|
128
129
|
if (unhandledError)
|
|
129
|
-
downloadError = new DownloadError(`Unhandled chunk download error for file ${this.#file.url} chunk ${this.#chunk.chunkNumber}`, { cause: unhandledError });
|
|
130
|
+
downloadError = new DownloadError(`Unhandled chunk download error for file ${this.#file.url} chunk ${this.#chunk.chunkNumber}`, { cause: unhandledError }, failureCode);
|
|
130
131
|
else if (lastError)
|
|
131
|
-
downloadError = new DownloadError(`Chunk download failed for file ${this.#file.url} chunk ${this.#chunk.chunkNumber} attempt ${attempts}.`, { cause: lastError });
|
|
132
|
+
downloadError = new DownloadError(`Chunk download failed for file ${this.#file.url} chunk ${this.#chunk.chunkNumber} attempt ${attempts}.`, { cause: lastError }, failureCode);
|
|
132
133
|
if (downloadError !== null) {
|
|
133
134
|
this.#downloadState.chunkDownloadFailed(this.#file, this.#chunk, downloadError);
|
|
134
135
|
}
|
|
@@ -162,7 +163,7 @@ export default class ChunkDownloader {
|
|
|
162
163
|
return false;
|
|
163
164
|
if (apiReturnedNotOkResponseStatus)
|
|
164
165
|
return false;
|
|
165
|
-
if (error
|
|
166
|
+
if (this.#isDiskFullError(error))
|
|
166
167
|
return false;
|
|
167
168
|
if (error && error instanceof RequestError)
|
|
168
169
|
return this.#options.fileserverAttemptLimit <= 0 || networkErrors < this.#options.fileserverAttemptLimit;
|
|
@@ -211,5 +212,23 @@ export default class ChunkDownloader {
|
|
|
211
212
|
chunk: DownloadFileChunkProgress.FromChunkInfo(this.#chunk),
|
|
212
213
|
};
|
|
213
214
|
}
|
|
215
|
+
#toFailureCode(error) {
|
|
216
|
+
if (this.#isDiskFullError(error))
|
|
217
|
+
return DownloadErrorCode.DiskFull;
|
|
218
|
+
return undefined;
|
|
219
|
+
}
|
|
220
|
+
#isDiskFullError(error) {
|
|
221
|
+
if (!error)
|
|
222
|
+
return false;
|
|
223
|
+
let current = error;
|
|
224
|
+
for (let depth = 0; depth < 8 && current; depth++) {
|
|
225
|
+
if (current.code === `ENOSPC`)
|
|
226
|
+
return true;
|
|
227
|
+
if (typeof current.message === `string` && current.message.includes(`ENOSPC`))
|
|
228
|
+
return true;
|
|
229
|
+
current = current.cause;
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
214
233
|
}
|
|
215
234
|
//# sourceMappingURL=chunkDownloader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkDownloader.js","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\r\nimport { RequestError } from \"got\";\r\nimport sleep from \"abortable-sleep\";\r\n\r\nimport TransferStatus from \"../utils/types/transferStatus.js\";\r\nimport DownloadError from \"./dtos/downloadError.js\";\r\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\r\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\r\nimport DownloadFileChunkProgress from \"./downloadStatus/downloadFileChunkProgress.js\";\r\nimport { isBaseResponse } from \"../utils/api/dtos/baseResponse.js\";\r\n\r\nimport type DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\r\nimport type DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\r\nimport type DownloadOptions from \"./downloadOptions.js\";\r\nimport type DownloadState from \"./downloadStatus/downloadState.js\";\r\nimport type FileServerClientFactory from \"../utils/api/fileServerClientFactory.js\";\r\nimport type ChunkStreamProviderFactory from \"../utils/fileSystem/chunkStreamProviderFactory.js\";\r\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\r\nimport type FileServerDownloadClient from \"./api/fileServerDownloadClient.js\";\r\nimport type ChunkProgressEvent from \"../utils/events/chunkProgressEvent.js\";\r\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\r\nimport type DownloadLogger from \"./downloadLogger.js\";\r\nimport type { ChunkStreamProviderEncryptionData } from \"../utils/fileSystem/chunkStreamProvider.js\";\r\n\r\nexport default class ChunkDownloader {\r\n #logger: DownloadLogger;\r\n #transferId: string;\r\n #chunk: DownloadFileChunkInfo;\r\n #file: DownloadFileInfo;\r\n #downloadState: DownloadState;\r\n #options: DownloadOptions;\r\n #fileServerClientFactory: FileServerClientFactory;\r\n #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\r\n #eventsEngine: EventsEngine;\r\n #chunkDownloadClient: FileServerDownloadClient;\r\n #encryptionData?: ChunkStreamProviderEncryptionData;\r\n #bytesTransferred = 0;\r\n #running = false;\r\n\r\n constructor(\r\n transferId: string,\r\n file: DownloadFileInfo,\r\n chunk: DownloadFileChunkInfo,\r\n downloadState: DownloadState,\r\n options: DownloadOptions,\r\n fileServerClientFactory: FileServerClientFactory,\r\n chunkStreamProviderFactory: ChunkStreamProviderFactory<string>,\r\n eventsEngine: EventsEngine,\r\n logger: DownloadLogger,\r\n encryptionData?: ChunkStreamProviderEncryptionData,\r\n ) {\r\n this.#transferId = transferId;\r\n this.#options = options;\r\n this.#file = file;\r\n this.#chunk = chunk;\r\n this.#downloadState = downloadState;\r\n this.#fileServerClientFactory = fileServerClientFactory;\r\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\r\n this.#eventsEngine = eventsEngine;\r\n this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerTcpDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);\r\n this.#logger = logger;\r\n this.#encryptionData = encryptionData;\r\n }\r\n\r\n async download(): Promise<void> {\r\n this.#throwIfRunning();\r\n this.#throwIfMissingDownloadPath();\r\n\r\n this.#running = true;\r\n\r\n let writtenCorrectly = false;\r\n let attempts = 0;\r\n let writeErrors = 0;\r\n let networkErrors = 0;\r\n let apiReturnedNotOkResponseStatus: boolean = false;\r\n let lastError: Error | null = null;\r\n let unhandledError: Error | null = null;\r\n\r\n try {\r\n this.#downloadState.chunkDownloadStarted(this.#file, this.#chunk);\r\n\r\n this.#addEventListeners();\r\n\r\n const fileserverMd5Promise: Promise<string> | null = this.#options.checkChunksMd5\r\n ? this.#chunkDownloadClient.getMd5Checksum()\r\n : null;\r\n\r\n while (writtenCorrectly === false && this.#canRetry(lastError as Error, writeErrors, networkErrors, apiReturnedNotOkResponseStatus)) {\r\n attempts += 1;\r\n\r\n this.#bytesTransferred = 0;\r\n\r\n const chunkWriter = this.#chunkStreamProviderFactory.provide(this.#file.temporaryDownloadPath!, this.#chunk.start ?? 0, this.#chunk.chunkSize, this.#encryptionData);\r\n\r\n try {\r\n await this.#chunkDownloadClient.download(chunkWriter, this.#encryptionData);\r\n\r\n if (this.#bytesTransferred !== this.#chunk.chunkSize) {\r\n if (this.#bytesTransferred > this.#chunk.chunkSize)\r\n this.#downloadState.possibleSupersizedFile(this.#file);\r\n\r\n throw new DownloadError(`Download request returned incorrect amount of data. Expected=${this.#chunk.chunkSize} Received=${this.#bytesTransferred}`, undefined, DownloadErrorCode.FileserverResponseWrongSize);\r\n }\r\n\r\n networkErrors = 0;\r\n this.#downloadState.networkOk();\r\n\r\n if (this.#downloadState.status !== TransferStatus.Aborting) {\r\n if (fileserverMd5Promise !== null) {\r\n const remoteMd5 = await fileserverMd5Promise;\r\n const localMd5 = await chunkWriter.getMd5Checksum(`hex`);\r\n if (remoteMd5.toLowerCase() === localMd5.toLowerCase())\r\n writtenCorrectly = true;\r\n else {\r\n writeErrors += 1;\r\n lastError = new DownloadError(`MD5 checksum incorrect: fileserver=${remoteMd5} local=${localMd5}`);\r\n }\r\n }\r\n else\r\n writtenCorrectly = true;\r\n }\r\n }\r\n catch (error) {\r\n // note: getting an exception here may be caused by abort or stop operations\r\n // both operations immediately interrupt HTTP download request by calling chunkDownloadClient.release()\r\n if (this.#downloadState.pauseImmediately || this.#downloadState.status === TransferStatus.Aborting)\r\n lastError = null;\r\n else {\r\n lastError = error as Error;\r\n\r\n if (lastError instanceof RequestError) {\r\n if (this.#isApiNotOkResponseStatusResponse(lastError))\r\n apiReturnedNotOkResponseStatus = true;\r\n else {\r\n networkErrors += 1;\r\n this.#downloadState.networkFailure();\r\n }\r\n }\r\n else\r\n writeErrors += 1;\r\n\r\n this.#logger.logError(lastError, `[CHUNK_DOWNLOADER_ERROR] Error in retry loop when downloading chunk attempt=${attempts} writeerrors=${writeErrors} networkerrors=${networkErrors}`, this.#errorInfoDump());\r\n }\r\n }\r\n finally {\r\n await chunkWriter?.release();\r\n this.#chunkDownloadClient?.release();\r\n\r\n let sleepTime = 0;\r\n if (this.#downloadState.isThereNetworkProblem)\r\n sleepTime = this.#options.fileserverOfflineCheckIntervalMillis;\r\n else if (networkErrors > 0) {\r\n const pow = Math.min(networkErrors, this.#options.fileserverOfflineAfterConsecutiveAttempts);\r\n sleepTime = this.#options.fileserverOfflineCheckIntervalMillis * (2 ** (pow - this.#options.fileserverOfflineAfterConsecutiveAttempts));\r\n }\r\n\r\n if (sleepTime > 0)\r\n await sleep(sleepTime);\r\n }\r\n }\r\n }\r\n catch (error) {\r\n unhandledError = error as Error;\r\n this.#logger.logError(unhandledError, `[CHUNK_DOWNLOADER_ERROR] Unhandled error when downloading chunk`, this.#errorInfoDump());\r\n }\r\n finally {\r\n this.#removeEventListeners();\r\n }\r\n\r\n if (writtenCorrectly)\r\n this.#downloadState.chunkDownloadCompleted(this.#file, this.#chunk);\r\n else {\r\n let downloadError: DownloadError | null = null;\r\n\r\n if (unhandledError)\r\n downloadError = new DownloadError(`Unhandled chunk download error for file ${this.#file.url} chunk ${this.#chunk.chunkNumber}`, { cause: unhandledError as Error });\r\n else if (lastError)\r\n downloadError = new DownloadError(`Chunk download failed for file ${this.#file.url} chunk ${this.#chunk.chunkNumber} attempt ${attempts}.`, { cause: lastError as Error });\r\n\r\n if (downloadError !== null) {\r\n this.#downloadState.chunkDownloadFailed(\r\n this.#file,\r\n this.#chunk,\r\n downloadError,\r\n );\r\n }\r\n }\r\n\r\n this.#running = false;\r\n }\r\n\r\n #throwIfRunning() {\r\n if (this.#running)\r\n throw new DownloadError(`This instance of chunk downloader is already in use. Please create a new one.`);\r\n }\r\n\r\n #throwIfMissingDownloadPath() {\r\n if (!this.#file.temporaryDownloadPath)\r\n throw new DownloadError(`Download file ${this.#file.externalId}/${this.#file.name}/${this.#file.downloadPath} is missing the required \"temporaryDownloadPath\"`);\r\n }\r\n\r\n #addEventListeners() {\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Aborting, this.#onAbortRequested);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Pausing, this.#onPauseRequested);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#chunkDownloadClient.addEventListener(`progress`, this.#onProgress);\r\n }\r\n\r\n #removeEventListeners() {\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Aborting, this.#onAbortRequested);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Pausing, this.#onPauseRequested);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#chunkDownloadClient.removeEventListener(`progress`, this.#onProgress);\r\n }\r\n\r\n #canRetry(error: Error | null, writeErrors: number, networkErrors: number, apiReturnedNotOkResponseStatus: boolean) {\r\n if (this.#downloadState.status === TransferStatus.Aborting || this.#downloadState.status === TransferStatus.Pausing)\r\n return false;\r\n\r\n if (this.#file.isFailed)\r\n return false;\r\n\r\n if (apiReturnedNotOkResponseStatus)\r\n return false;\r\n\r\n if (error?.message.includes(`ENOSPC`))\r\n return false;\r\n\r\n if (error && error instanceof RequestError)\r\n return this.#options.fileserverAttemptLimit <= 0 || networkErrors < this.#options.fileserverAttemptLimit!;\r\n\r\n return this.#options.maxWriteAttempts! < 0 || writeErrors < this.#options.maxWriteAttempts!;\r\n }\r\n\r\n #isApiNotOkResponseStatusResponse(error: RequestError): boolean {\r\n try {\r\n if (typeof error.response?.body !== `string`)\r\n return false;\r\n\r\n const response = JSON.parse(error.response?.body);\r\n\r\n if (!isBaseResponse(response))\r\n return false;\r\n\r\n return response.responsestatus !== `OK`;\r\n }\r\n catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * This method aborts pending download - it can be achieved only by destroying the download client\r\n * (which in turn destroys the underlying download HTTP request). This operation\r\n * will throw an expected exception inside download method (in main while loop). See {@link download} method.\r\n */\r\n #interruptDownload = () => {\r\n this.#chunkDownloadClient?.release();\r\n };\r\n\r\n #onAbortRequested = () => {\r\n this.#interruptDownload();\r\n };\r\n\r\n #onPauseRequested = () => {\r\n if (this.#downloadState.pauseImmediately)\r\n this.#interruptDownload();\r\n };\r\n\r\n #onFileFailed = (args: FileDownloadFailedEventArgs) => {\r\n if (this.#file.externalId === args.file.id)\r\n this.#chunkDownloadClient?.release();\r\n };\r\n\r\n #onProgress = (args: ChunkProgressEvent) => {\r\n this.#bytesTransferred = args.transferredBytesTotal;\r\n this.#downloadState.chunkDownloadProgressed(this.#file, this.#chunk, args);\r\n };\r\n\r\n #errorInfoDump() {\r\n return {\r\n fileid: this.#file.externalId,\r\n filename: this.#file.name,\r\n chunk: DownloadFileChunkProgress.FromChunkInfo(this.#chunk),\r\n };\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"chunkDownloader.js","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,MAAM,iBAAiB,CAAC;AAEpC,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,iBAAiB,MAAM,6BAA6B,CAAC;AAC5D,OAAO,yBAAyB,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAenE,MAAM,CAAC,OAAO,OAAO,eAAe;IAChC,OAAO,CAAiB;IACxB,WAAW,CAAS;IACpB,MAAM,CAAwB;IAC9B,KAAK,CAAmB;IACxB,cAAc,CAAgB;IAC9B,QAAQ,CAAkB;IAC1B,wBAAwB,CAA0B;IAClD,2BAA2B,CAAqC;IAChE,aAAa,CAAe;IAC5B,oBAAoB,CAA2B;IAC/C,eAAe,CAAqC;IACpD,iBAAiB,GAAG,CAAC,CAAC;IACtB,QAAQ,GAAG,KAAK,CAAC;IAEjB,YACI,UAAkB,EAClB,IAAsB,EACtB,KAA4B,EAC5B,aAA4B,EAC5B,OAAwB,EACxB,uBAAgD,EAChD,0BAA8D,EAC9D,YAA0B,EAC1B,MAAsB,EACtB,cAAkD;QAElD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,wBAAwB,GAAG,uBAAuB,CAAC;QACxD,IAAI,CAAC,2BAA2B,GAAG,0BAA0B,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,CAAC,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClM,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAEnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,8BAA8B,GAAY,KAAK,CAAC;QACpD,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,IAAI,cAAc,GAAiB,IAAI,CAAC;QAExC,IAAI,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAElE,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,MAAM,oBAAoB,GAA2B,IAAI,CAAC,QAAQ,CAAC,cAAc;gBAC7E,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE;gBAC5C,CAAC,CAAC,IAAI,CAAC;YAEX,OAAO,gBAAgB,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,SAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,8BAA8B,CAAC,EAAE,CAAC;gBAClI,QAAQ,IAAI,CAAC,CAAC;gBAEd,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAErK,IAAI,CAAC;oBACD,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;oBAE5E,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;wBACnD,IAAI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;4BAC9C,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAE3D,MAAM,IAAI,aAAa,CAAC,gEAAgE,IAAI,CAAC,MAAM,CAAC,SAAS,aAAa,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;oBAClN,CAAC;oBAED,aAAa,GAAG,CAAC,CAAC;oBAClB,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;oBAEhC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,QAAQ,EAAE,CAAC;wBACzD,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;4BAChC,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC;4BAC7C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;4BACzD,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE;gCAClD,gBAAgB,GAAG,IAAI,CAAC;iCACvB,CAAC;gCACF,WAAW,IAAI,CAAC,CAAC;gCACjB,SAAS,GAAG,IAAI,aAAa,CAAC,sCAAsC,SAAS,UAAU,QAAQ,EAAE,CAAC,CAAC;4BACvG,CAAC;wBACL,CAAC;;4BAEG,gBAAgB,GAAG,IAAI,CAAC;oBAChC,CAAC;gBACL,CAAC;gBACD,OAAO,KAAK,EAAE,CAAC;oBACX,4EAA4E;oBAC5E,uGAAuG;oBACvG,IAAI,IAAI,CAAC,cAAc,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,QAAQ;wBAC9F,SAAS,GAAG,IAAI,CAAC;yBAChB,CAAC;wBACF,SAAS,GAAG,KAAc,CAAC;wBAE3B,IAAI,SAAS,YAAY,YAAY,EAAE,CAAC;4BACpC,IAAI,IAAI,CAAC,iCAAiC,CAAC,SAAS,CAAC;gCACjD,8BAA8B,GAAG,IAAI,CAAC;iCACrC,CAAC;gCACF,aAAa,IAAI,CAAC,CAAC;gCACnB,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;4BACzC,CAAC;wBACL,CAAC;;4BAEG,WAAW,IAAI,CAAC,CAAC;wBAErB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,+EAA+E,QAAQ,gBAAgB,WAAW,kBAAkB,aAAa,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;oBACjN,CAAC;gBACL,CAAC;wBACO,CAAC;oBACL,MAAM,WAAW,EAAE,OAAO,EAAE,CAAC;oBAC7B,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;oBAErC,IAAI,SAAS,GAAG,CAAC,CAAC;oBAClB,IAAI,IAAI,CAAC,cAAc,CAAC,qBAAqB;wBACzC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC;yBAC9D,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;wBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;wBAC7F,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,oCAAoC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC,CAAC;oBAC5I,CAAC;oBAED,IAAI,SAAS,GAAG,CAAC;wBACb,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,cAAc,GAAG,KAAc,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,iEAAiE,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACpI,CAAC;gBACO,CAAC;YACL,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,gBAAgB;YAChB,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aACnE,CAAC;YACF,IAAI,aAAa,GAAyB,IAAI,CAAC;YAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,IAAI,SAAS,CAAC,CAAC;YAErE,IAAI,cAAc;gBACd,aAAa,GAAG,IAAI,aAAa,CAAC,2CAA2C,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,cAAuB,EAAE,EAAE,WAAW,CAAC,CAAC;iBAChL,IAAI,SAAS;gBACd,aAAa,GAAG,IAAI,aAAa,CAAC,kCAAkC,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,WAAW,YAAY,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,SAAkB,EAAE,EAAE,WAAW,CAAC,CAAC;YAE5L,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,CAAC,mBAAmB,CACnC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,aAAa,CAChB,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,eAAe;QACX,IAAI,IAAI,CAAC,QAAQ;YACb,MAAM,IAAI,aAAa,CAAC,+EAA+E,CAAC,CAAC;IACjH,CAAC;IAED,2BAA2B;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB;YACjC,MAAM,IAAI,aAAa,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,kDAAkD,CAAC,CAAC;IACxK,CAAC;IAED,kBAAkB;QACd,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5F,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3F,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAClG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,CAAC;IAED,qBAAqB;QACjB,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/F,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9F,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACrG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAChF,CAAC;IAED,SAAS,CAAC,KAAmB,EAAE,WAAmB,EAAE,aAAqB,EAAE,8BAAuC;QAC9G,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,OAAO;YAC/G,OAAO,KAAK,CAAC;QAEjB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;YACnB,OAAO,KAAK,CAAC;QAEjB,IAAI,8BAA8B;YAC9B,OAAO,KAAK,CAAC;QAEjB,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAC5B,OAAO,KAAK,CAAC;QAEjB,IAAI,KAAK,IAAI,KAAK,YAAY,YAAY;YACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,sBAAsB,IAAI,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,sBAAuB,CAAC;QAE9G,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAiB,GAAG,CAAC,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAiB,CAAC;IAChG,CAAC;IAED,iCAAiC,CAAC,KAAmB;QACjD,IAAI,CAAC;YACD,IAAI,OAAO,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ;gBACxC,OAAO,KAAK,CAAC;YAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAElD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;gBACzB,OAAO,KAAK,CAAC;YAEjB,OAAO,QAAQ,CAAC,cAAc,KAAK,IAAI,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC;YACH,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,kBAAkB,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC,CAAC;IAEF,iBAAiB,GAAG,GAAG,EAAE;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,iBAAiB,GAAG,GAAG,EAAE;QACrB,IAAI,IAAI,CAAC,cAAc,CAAC,gBAAgB;YACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,aAAa,GAAG,CAAC,IAAiC,EAAE,EAAE;QAClD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE;YACtC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC,CAAC;IAEF,WAAW,GAAG,CAAC,IAAwB,EAAE,EAAE;QACvC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC;IAEF,cAAc;QACV,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YAC7B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACzB,KAAK,EAAE,yBAAyB,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;SAC9D,CAAC;IACN,CAAC;IAED,cAAc,CAAC,KAAmB;QAC9B,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAC5B,OAAO,iBAAiB,CAAC,QAAQ,CAAC;QAEtC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,gBAAgB,CAAC,KAAc;QAC3B,IAAI,CAAC,KAAK;YACN,OAAO,KAAK,CAAC;QAEjB,IAAI,OAAO,GAAG,KAAyE,CAAC;QACxF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;gBACzB,OAAO,IAAI,CAAC;YAEhB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACzE,OAAO,IAAI,CAAC;YAEhB,OAAO,GAAG,OAAO,CAAC,KAAyE,CAAC;QAChG,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { RequestError } from \"got\";\nimport sleep from \"abortable-sleep\";\n\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport DownloadError from \"./dtos/downloadError.js\";\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\nimport DownloadFileChunkProgress from \"./downloadStatus/downloadFileChunkProgress.js\";\nimport { isBaseResponse } from \"../utils/api/dtos/baseResponse.js\";\n\nimport type DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport type DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\nimport type DownloadOptions from \"./downloadOptions.js\";\nimport type DownloadState from \"./downloadStatus/downloadState.js\";\nimport type FileServerClientFactory from \"../utils/api/fileServerClientFactory.js\";\nimport type ChunkStreamProviderFactory from \"../utils/fileSystem/chunkStreamProviderFactory.js\";\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\nimport type FileServerDownloadClient from \"./api/fileServerDownloadClient.js\";\nimport type ChunkProgressEvent from \"../utils/events/chunkProgressEvent.js\";\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\nimport type DownloadLogger from \"./downloadLogger.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../utils/fileSystem/chunkStreamProvider.js\";\n\nexport default class ChunkDownloader {\n #logger: DownloadLogger;\n #transferId: string;\n #chunk: DownloadFileChunkInfo;\n #file: DownloadFileInfo;\n #downloadState: DownloadState;\n #options: DownloadOptions;\n #fileServerClientFactory: FileServerClientFactory;\n #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\n #eventsEngine: EventsEngine;\n #chunkDownloadClient: FileServerDownloadClient;\n #encryptionData?: ChunkStreamProviderEncryptionData;\n #bytesTransferred = 0;\n #running = false;\n\n constructor(\n transferId: string,\n file: DownloadFileInfo,\n chunk: DownloadFileChunkInfo,\n downloadState: DownloadState,\n options: DownloadOptions,\n fileServerClientFactory: FileServerClientFactory,\n chunkStreamProviderFactory: ChunkStreamProviderFactory<string>,\n eventsEngine: EventsEngine,\n logger: DownloadLogger,\n encryptionData?: ChunkStreamProviderEncryptionData,\n ) {\n this.#transferId = transferId;\n this.#options = options;\n this.#file = file;\n this.#chunk = chunk;\n this.#downloadState = downloadState;\n this.#fileServerClientFactory = fileServerClientFactory;\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#eventsEngine = eventsEngine;\n this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerTcpDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);\n this.#logger = logger;\n this.#encryptionData = encryptionData;\n }\n\n async download(): Promise<void> {\n this.#throwIfRunning();\n this.#throwIfMissingDownloadPath();\n\n this.#running = true;\n\n let writtenCorrectly = false;\n let attempts = 0;\n let writeErrors = 0;\n let networkErrors = 0;\n let apiReturnedNotOkResponseStatus: boolean = false;\n let lastError: Error | null = null;\n let unhandledError: Error | null = null;\n\n try {\n this.#downloadState.chunkDownloadStarted(this.#file, this.#chunk);\n\n this.#addEventListeners();\n\n const fileserverMd5Promise: Promise<string> | null = this.#options.checkChunksMd5\n ? this.#chunkDownloadClient.getMd5Checksum()\n : null;\n\n while (writtenCorrectly === false && this.#canRetry(lastError as Error, writeErrors, networkErrors, apiReturnedNotOkResponseStatus)) {\n attempts += 1;\n\n this.#bytesTransferred = 0;\n\n const chunkWriter = this.#chunkStreamProviderFactory.provide(this.#file.temporaryDownloadPath!, this.#chunk.start ?? 0, this.#chunk.chunkSize, this.#encryptionData);\n\n try {\n await this.#chunkDownloadClient.download(chunkWriter, this.#encryptionData);\n\n if (this.#bytesTransferred !== this.#chunk.chunkSize) {\n if (this.#bytesTransferred > this.#chunk.chunkSize)\n this.#downloadState.possibleSupersizedFile(this.#file);\n\n throw new DownloadError(`Download request returned incorrect amount of data. Expected=${this.#chunk.chunkSize} Received=${this.#bytesTransferred}`, undefined, DownloadErrorCode.FileserverResponseWrongSize);\n }\n\n networkErrors = 0;\n this.#downloadState.networkOk();\n\n if (this.#downloadState.status !== TransferStatus.Aborting) {\n if (fileserverMd5Promise !== null) {\n const remoteMd5 = await fileserverMd5Promise;\n const localMd5 = await chunkWriter.getMd5Checksum(`hex`);\n if (remoteMd5.toLowerCase() === localMd5.toLowerCase())\n writtenCorrectly = true;\n else {\n writeErrors += 1;\n lastError = new DownloadError(`MD5 checksum incorrect: fileserver=${remoteMd5} local=${localMd5}`);\n }\n }\n else\n writtenCorrectly = true;\n }\n }\n catch (error) {\n // note: getting an exception here may be caused by abort or stop operations\n // both operations immediately interrupt HTTP download request by calling chunkDownloadClient.release()\n if (this.#downloadState.pauseImmediately || this.#downloadState.status === TransferStatus.Aborting)\n lastError = null;\n else {\n lastError = error as Error;\n\n if (lastError instanceof RequestError) {\n if (this.#isApiNotOkResponseStatusResponse(lastError))\n apiReturnedNotOkResponseStatus = true;\n else {\n networkErrors += 1;\n this.#downloadState.networkFailure();\n }\n }\n else\n writeErrors += 1;\n\n this.#logger.logError(lastError, `[CHUNK_DOWNLOADER_ERROR] Error in retry loop when downloading chunk attempt=${attempts} writeerrors=${writeErrors} networkerrors=${networkErrors}`, this.#errorInfoDump());\n }\n }\n finally {\n await chunkWriter?.release();\n this.#chunkDownloadClient?.release();\n\n let sleepTime = 0;\n if (this.#downloadState.isThereNetworkProblem)\n sleepTime = this.#options.fileserverOfflineCheckIntervalMillis;\n else if (networkErrors > 0) {\n const pow = Math.min(networkErrors, this.#options.fileserverOfflineAfterConsecutiveAttempts);\n sleepTime = this.#options.fileserverOfflineCheckIntervalMillis * (2 ** (pow - this.#options.fileserverOfflineAfterConsecutiveAttempts));\n }\n\n if (sleepTime > 0)\n await sleep(sleepTime);\n }\n }\n }\n catch (error) {\n unhandledError = error as Error;\n this.#logger.logError(unhandledError, `[CHUNK_DOWNLOADER_ERROR] Unhandled error when downloading chunk`, this.#errorInfoDump());\n }\n finally {\n this.#removeEventListeners();\n }\n\n if (writtenCorrectly)\n this.#downloadState.chunkDownloadCompleted(this.#file, this.#chunk);\n else {\n let downloadError: DownloadError | null = null;\n const failureCode = this.#toFailureCode(unhandledError ?? lastError);\n\n if (unhandledError)\n downloadError = new DownloadError(`Unhandled chunk download error for file ${this.#file.url} chunk ${this.#chunk.chunkNumber}`, { cause: unhandledError as Error }, failureCode);\n else if (lastError)\n downloadError = new DownloadError(`Chunk download failed for file ${this.#file.url} chunk ${this.#chunk.chunkNumber} attempt ${attempts}.`, { cause: lastError as Error }, failureCode);\n\n if (downloadError !== null) {\n this.#downloadState.chunkDownloadFailed(\n this.#file,\n this.#chunk,\n downloadError,\n );\n }\n }\n\n this.#running = false;\n }\n\n #throwIfRunning() {\n if (this.#running)\n throw new DownloadError(`This instance of chunk downloader is already in use. Please create a new one.`);\n }\n\n #throwIfMissingDownloadPath() {\n if (!this.#file.temporaryDownloadPath)\n throw new DownloadError(`Download file ${this.#file.externalId}/${this.#file.name}/${this.#file.downloadPath} is missing the required \"temporaryDownloadPath\"`);\n }\n\n #addEventListeners() {\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Aborting, this.#onAbortRequested);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Pausing, this.#onPauseRequested);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#chunkDownloadClient.addEventListener(`progress`, this.#onProgress);\n }\n\n #removeEventListeners() {\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Aborting, this.#onAbortRequested);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Pausing, this.#onPauseRequested);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#chunkDownloadClient.removeEventListener(`progress`, this.#onProgress);\n }\n\n #canRetry(error: Error | null, writeErrors: number, networkErrors: number, apiReturnedNotOkResponseStatus: boolean) {\n if (this.#downloadState.status === TransferStatus.Aborting || this.#downloadState.status === TransferStatus.Pausing)\n return false;\n\n if (this.#file.isFailed)\n return false;\n\n if (apiReturnedNotOkResponseStatus)\n return false;\n\n if (this.#isDiskFullError(error))\n return false;\n\n if (error && error instanceof RequestError)\n return this.#options.fileserverAttemptLimit <= 0 || networkErrors < this.#options.fileserverAttemptLimit!;\n\n return this.#options.maxWriteAttempts! < 0 || writeErrors < this.#options.maxWriteAttempts!;\n }\n\n #isApiNotOkResponseStatusResponse(error: RequestError): boolean {\n try {\n if (typeof error.response?.body !== `string`)\n return false;\n\n const response = JSON.parse(error.response?.body);\n\n if (!isBaseResponse(response))\n return false;\n\n return response.responsestatus !== `OK`;\n }\n catch {\n return false;\n }\n }\n\n /**\n * This method aborts pending download - it can be achieved only by destroying the download client\n * (which in turn destroys the underlying download HTTP request). This operation\n * will throw an expected exception inside download method (in main while loop). See {@link download} method.\n */\n #interruptDownload = () => {\n this.#chunkDownloadClient?.release();\n };\n\n #onAbortRequested = () => {\n this.#interruptDownload();\n };\n\n #onPauseRequested = () => {\n if (this.#downloadState.pauseImmediately)\n this.#interruptDownload();\n };\n\n #onFileFailed = (args: FileDownloadFailedEventArgs) => {\n if (this.#file.externalId === args.file.id)\n this.#chunkDownloadClient?.release();\n };\n\n #onProgress = (args: ChunkProgressEvent) => {\n this.#bytesTransferred = args.transferredBytesTotal;\n this.#downloadState.chunkDownloadProgressed(this.#file, this.#chunk, args);\n };\n\n #errorInfoDump() {\n return {\n fileid: this.#file.externalId,\n filename: this.#file.name,\n chunk: DownloadFileChunkProgress.FromChunkInfo(this.#chunk),\n };\n }\n\n #toFailureCode(error: Error | null): DownloadErrorCode | undefined {\n if (this.#isDiskFullError(error))\n return DownloadErrorCode.DiskFull;\n\n return undefined;\n }\n\n #isDiskFullError(error: unknown): boolean {\n if (!error)\n return false;\n\n let current = error as { message?: string, code?: string, cause?: unknown } | undefined;\n for (let depth = 0; depth < 8 && current; depth++) {\n if (current.code === `ENOSPC`)\n return true;\n\n if (typeof current.message === `string` && current.message.includes(`ENOSPC`))\n return true;\n\n current = current.cause as { message?: string, code?: string, cause?: unknown } | undefined;\n }\n\n return false;\n }\n}\n"]}
|