filemail-sdk 10.4.0 → 10.6.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.d.ts.map +1 -1
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactory.js +1 -0
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.d.ts +1 -0
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.d.ts.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 +2 -1
- package/dist/src/client/downloader/downloaderCore.d.ts.map +1 -1
- package/dist/src/client/downloader/downloaderCore.js +19 -9
- package/dist/src/client/downloader/downloaderCore.js.map +1 -1
- package/dist/src/client/downloader/node/nodeTransferDownloader.d.ts.map +1 -1
- package/dist/src/client/downloader/node/nodeTransferDownloader.js +4 -2
- 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.d.ts.map +1 -1
- package/dist/src/client/uploader/node/nodeTransferUploader.js +10 -4
- 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 +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.d.ts +2 -2
- package/dist/src/client/uploader/web/webTransferUploader.d.ts.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.js +7 -2
- package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploaderConfig.d.ts +7 -0
- package/dist/src/client/uploader/web/webTransferUploaderConfig.d.ts.map +1 -0
- package/dist/src/client/uploader/web/webTransferUploaderConfig.js +2 -0
- package/dist/src/client/uploader/web/webTransferUploaderConfig.js.map +1 -0
- package/dist/src/downloader/api/fileServerDownloadClient.d.ts +2 -2
- package/dist/src/downloader/api/fileServerDownloadClient.d.ts.map +1 -1
- package/dist/src/downloader/api/fileServerDownloadClient.js.map +1 -1
- package/dist/src/downloader/api/fileServerDownloadStatusClient.d.ts +6 -0
- package/dist/src/downloader/api/fileServerDownloadStatusClient.d.ts.map +1 -0
- package/dist/src/downloader/api/fileServerDownloadStatusClient.js +2 -0
- package/dist/src/downloader/api/fileServerDownloadStatusClient.js.map +1 -0
- package/dist/src/downloader/api/node/nodeFileServerDownloadClient.d.ts.map +1 -1
- package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js +8 -6
- package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js.map +1 -1
- package/dist/src/downloader/api/node/nodeFileServerDownloadStatusClient.d.ts +10 -0
- package/dist/src/downloader/api/node/nodeFileServerDownloadStatusClient.d.ts.map +1 -0
- package/dist/src/downloader/api/node/nodeFileServerDownloadStatusClient.js +39 -0
- package/dist/src/downloader/api/node/nodeFileServerDownloadStatusClient.js.map +1 -0
- package/dist/src/downloader/chunkDownloader.d.ts +3 -2
- package/dist/src/downloader/chunkDownloader.d.ts.map +1 -1
- package/dist/src/downloader/chunkDownloader.js +6 -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.d.ts +5 -0
- package/dist/src/downloader/downloadOptions.d.ts.map +1 -1
- package/dist/src/downloader/downloadOptions.js +5 -0
- 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.js.map +1 -1
- package/dist/src/downloader/downloadTracker.d.ts +2 -1
- package/dist/src/downloader/downloadTracker.d.ts.map +1 -1
- package/dist/src/downloader/downloadTracker.js +5 -4
- 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.d.ts +2 -1
- package/dist/src/downloader/dtos/downloadRegistrationMode.d.ts.map +1 -1
- package/dist/src/downloader/dtos/downloadRegistrationMode.js +1 -0
- 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.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerProgressInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackingMetadata.d.ts +2 -0
- package/dist/src/downloader/dtos/downloadTrackingMetadata.d.ts.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 +2 -1
- package/dist/src/downloader/filesDownloader.d.ts.map +1 -1
- package/dist/src/downloader/filesDownloader.js +30 -2
- package/dist/src/downloader/filesDownloader.js.map +1 -1
- package/dist/src/downloader/filesPreparer.js.map +1 -1
- package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.d.ts +6 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.d.ts.map +1 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.js +2 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.js.map +1 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.d.ts +7 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.d.ts.map +1 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.js +2 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.js.map +1 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.d.ts +10 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.d.ts.map +1 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.js +36 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.js.map +1 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.d.ts +10 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.d.ts.map +1 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.js +14 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.node.d.ts +5 -0
- package/dist/src/index.node.d.ts.map +1 -1
- package/dist/src/index.node.js +5 -0
- package/dist/src/index.node.js.map +1 -1
- package/dist/src/index.web.d.ts +5 -0
- package/dist/src/index.web.d.ts.map +1 -1
- package/dist/src/index.web.js +4 -0
- package/dist/src/index.web.js.map +1 -1
- package/dist/src/uploader/api/fileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js +1 -2
- 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.d.ts.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.js +1 -2
- package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.d.ts +9 -0
- package/dist/src/uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.d.ts.map +1 -0
- package/dist/src/uploader/chunkStreamProviderFactory/{nodeFileDetailsUploaderChunkStreamProviderFactory.js → node/nodeFileDetailsUploaderChunkStreamProviderFactory.js} +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -0
- package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.d.ts +2 -2
- package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.d.ts.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/web/webFileDetailsUploaderChunkStreamProviderFactory.d.ts +9 -0
- package/dist/src/uploader/chunkStreamProviderFactory/web/webFileDetailsUploaderChunkStreamProviderFactory.d.ts.map +1 -0
- package/dist/src/uploader/chunkStreamProviderFactory/{webFileDetailsUploaderChunkStreamProviderFactory.js → web/webFileDetailsUploaderChunkStreamProviderFactory.js} +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/web/webFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -0
- package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.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/filesBatchAckFailedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.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/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/fileChunksPlan.d.ts +8 -0
- package/dist/src/uploader/fileChunksPlan.d.ts.map +1 -0
- package/dist/src/uploader/fileChunksPlan.js +2 -0
- package/dist/src/uploader/fileChunksPlan.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.d.ts +10 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js +12 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.d.ts +7 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.js +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.d.ts +6 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.js +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.d.ts +6 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.js +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.d.ts +7 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.js +14 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.d.ts +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.js +27 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.d.ts +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.js +5 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.d.ts +14 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.js +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.d.ts +17 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.js +113 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.d.ts +7 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.js +17 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.d.ts +9 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.js +62 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.d.ts +9 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.js +41 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.d.ts +6 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.js +9 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.js.map +1 -0
- package/dist/src/uploader/md5Provider/precomputedMD5Provider.d.ts +27 -0
- package/dist/src/uploader/md5Provider/precomputedMD5Provider.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/precomputedMD5Provider.js +189 -0
- package/dist/src/uploader/md5Provider/precomputedMD5Provider.js.map +1 -0
- package/dist/src/uploader/md5Provider/uploaderMD5Provider.d.ts +28 -0
- package/dist/src/uploader/md5Provider/uploaderMD5Provider.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/uploaderMD5Provider.js +2 -0
- package/dist/src/uploader/md5Provider/uploaderMD5Provider.js.map +1 -0
- 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/pendingFileAck.js.map +1 -1
- package/dist/src/uploader/registeredTransferFile.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/transferFailureAbortReason.js.map +1 -1
- package/dist/src/uploader/transferFilesRegistrar.js.map +1 -1
- package/dist/src/uploader/transferUpload.d.ts +4 -2
- package/dist/src/uploader/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +27 -9
- package/dist/src/uploader/transferUpload.js.map +1 -1
- package/dist/src/uploader/transferUploadAcker.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/ackTransferFilesRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.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.d.ts +1 -0
- package/dist/src/utils/api/dtos/getTransferResponse.d.ts.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/registerTransferFilesRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/resetTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/sendFileChunkRequest.d.ts +1 -0
- package/dist/src/utils/api/dtos/sendFileChunkRequest.d.ts.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.d.ts +2 -0
- package/dist/src/utils/api/fileServerClientFactory.d.ts.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.d.ts +2 -0
- package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts.map +1 -1
- package/dist/src/utils/api/node/nodeFileServerClientFactory.js +4 -0
- 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.d.ts +2 -0
- package/dist/src/utils/api/web/webFileServerClientFactory.d.ts.map +1 -1
- package/dist/src/utils/api/web/webFileServerClientFactory.js +3 -0
- 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/chunkStreamEncryptionData.d.ts +6 -0
- package/dist/src/utils/fileSystem/chunkStreamEncryptionData.d.ts.map +1 -0
- package/dist/src/utils/fileSystem/chunkStreamEncryptionData.js +2 -0
- package/dist/src/utils/fileSystem/chunkStreamEncryptionData.js.map +1 -0
- package/dist/src/utils/fileSystem/chunkStreamProvider.d.ts +0 -5
- package/dist/src/utils/fileSystem/chunkStreamProvider.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/chunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/chunkStreamProviderFactory.d.ts +2 -2
- package/dist/src/utils/fileSystem/chunkStreamProviderFactory.d.ts.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.js.map +1 -1
- package/dist/src/utils/fileSystem/fsError.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.d.ts +2 -3
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js +9 -28
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.d.ts +2 -2
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.js +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.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.d.ts +2 -3
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js +0 -19
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.d.ts +2 -2
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.js +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 +80 -79
- package/readme.md +27 -27
- package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.d.ts +0 -9
- package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.d.ts.map +0 -1
- package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.js.map +0 -1
- package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.d.ts +0 -9
- package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.d.ts.map +0 -1
- package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.js.map +0 -1
|
@@ -23,13 +23,15 @@ export default class FilesDownloader {
|
|
|
23
23
|
#apiClient;
|
|
24
24
|
#fileserverClientFactory;
|
|
25
25
|
#chunkStreamProviderFactory;
|
|
26
|
+
#chunkMD5ProviderFactory;
|
|
26
27
|
#downloadRegistrationMode;
|
|
28
|
+
#downloadStatusClient;
|
|
27
29
|
#eventsEngine;
|
|
28
30
|
#cryptography;
|
|
29
31
|
#ongoingChunkDownloads;
|
|
30
32
|
#ongoingFileDownloads;
|
|
31
33
|
#encryptionData;
|
|
32
|
-
constructor(logger, transferId, trackId, downloadId, region, files, oldState, fileSystem, concurrencyController, eventsEngine, cryptography, options, apiClient, fileserverClientFactory, chunkStreamProviderFactory, downloadRegistrationMode, e2eeData) {
|
|
34
|
+
constructor(logger, transferId, trackId, downloadId, region, files, oldState, fileSystem, concurrencyController, eventsEngine, cryptography, options, apiClient, fileserverClientFactory, chunkStreamProviderFactory, chunkMD5ProviderFactory, downloadRegistrationMode, e2eeData) {
|
|
33
35
|
if (!transferId)
|
|
34
36
|
throw new DownloadError(`No transfer specified`);
|
|
35
37
|
if (!files)
|
|
@@ -57,7 +59,11 @@ export default class FilesDownloader {
|
|
|
57
59
|
this.#apiClient = apiClient;
|
|
58
60
|
this.#fileserverClientFactory = fileserverClientFactory;
|
|
59
61
|
this.#chunkStreamProviderFactory = chunkStreamProviderFactory;
|
|
62
|
+
this.#chunkMD5ProviderFactory = chunkMD5ProviderFactory;
|
|
60
63
|
this.#downloadRegistrationMode = downloadRegistrationMode;
|
|
64
|
+
this.#downloadStatusClient = downloadRegistrationMode === DownloadRegistrationMode.ServerSide
|
|
65
|
+
? fileserverClientFactory.createFileServerDownloadStatusClient()
|
|
66
|
+
: null;
|
|
61
67
|
this.#ongoingChunkDownloads = {};
|
|
62
68
|
this.#ongoingFileDownloads = {};
|
|
63
69
|
if (e2eeData)
|
|
@@ -250,6 +256,26 @@ export default class FilesDownloader {
|
|
|
250
256
|
filesize,
|
|
251
257
|
});
|
|
252
258
|
}
|
|
259
|
+
#registerFileDownloadFailure(fileId) {
|
|
260
|
+
const file = this.#files.find(x => x.externalId === fileId);
|
|
261
|
+
if (!this.#downloadStatusClient || !file || !file.wasEverWritten)
|
|
262
|
+
return;
|
|
263
|
+
// Every chunk arrived, so the fileserver has already seen the whole download - only the local finalization failed.
|
|
264
|
+
if (file.chunks.length > 0 && file.chunks.every(chunk => chunk.isCompleted))
|
|
265
|
+
return;
|
|
266
|
+
this.#downloadStatusClient.registerFileDownloadFailure(file.url)
|
|
267
|
+
.catch(error => this.#logger.logWarning(`[DOWNLOAD_STATUS] Could not register file download failure for ${file.name}`, { error }));
|
|
268
|
+
}
|
|
269
|
+
#registerUnfinishedFileDownloadsCancellation() {
|
|
270
|
+
if (!this.#downloadStatusClient)
|
|
271
|
+
return;
|
|
272
|
+
for (const file of this.#files) {
|
|
273
|
+
if (!file.wasEverWritten || file.isCompleted || file.isFailed)
|
|
274
|
+
continue;
|
|
275
|
+
this.#downloadStatusClient.registerFileDownloadCancellation(file.url)
|
|
276
|
+
.catch(error => this.#logger.logWarning(`[DOWNLOAD_STATUS] Could not register file download cancellation for ${file.name}`, { error }));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
253
279
|
#addEventListeners() {
|
|
254
280
|
this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);
|
|
255
281
|
this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);
|
|
@@ -283,6 +309,7 @@ export default class FilesDownloader {
|
|
|
283
309
|
};
|
|
284
310
|
#onFileFailed = async (args) => {
|
|
285
311
|
this.#ongoingFileDownloads[args.file.id]?.complete();
|
|
312
|
+
this.#registerFileDownloadFailure(args.file.id);
|
|
286
313
|
const shouldKeepTemporaryFile = this.#shouldKeepTemporaryFileOnFailure();
|
|
287
314
|
if (this.#options.deleteFailedFilesFromDisk) {
|
|
288
315
|
if (args.file.temporaryDownloadPath && !shouldKeepTemporaryFile) {
|
|
@@ -368,7 +395,7 @@ export default class FilesDownloader {
|
|
|
368
395
|
releaseSemaphore();
|
|
369
396
|
return false;
|
|
370
397
|
}
|
|
371
|
-
const chunkDownloader = new ChunkDownloader(this.#transferId, file, chunk, this.#downloadState, this.#options, this.#fileserverClientFactory, this.#chunkStreamProviderFactory, this.#eventsEngine, this.#logger, this.#encryptionData);
|
|
398
|
+
const chunkDownloader = new ChunkDownloader(this.#transferId, file, chunk, this.#downloadState, this.#options, this.#fileserverClientFactory, this.#chunkStreamProviderFactory, this.#chunkMD5ProviderFactory, this.#eventsEngine, this.#logger, this.#encryptionData);
|
|
372
399
|
const chunkPromise = chunkDownloader.download();
|
|
373
400
|
this.#ongoingChunkDownloads[chunk.id] = chunkPromise;
|
|
374
401
|
chunkPromise.finally(() => {
|
|
@@ -387,6 +414,7 @@ export default class FilesDownloader {
|
|
|
387
414
|
let shouldDownloaderContinue = true;
|
|
388
415
|
if (this.#downloadState.status === TransferStatus.Aborting) {
|
|
389
416
|
shouldDownloaderContinue = false;
|
|
417
|
+
this.#registerUnfinishedFileDownloadsCancellation();
|
|
390
418
|
if (this.#options.deleteAbortedDownloadsFromDisk)
|
|
391
419
|
await this.#deleteAllTemporaryAndCompletedFiles();
|
|
392
420
|
this.#downloadState.aborted();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesDownloader.js","sourceRoot":"","sources":["../../../src/downloader/filesDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import DownloadState from \"./downloadStatus/downloadState.js\";\nimport DownloadFilePromise from \"./downloadStatus/downloadFilePromise.js\";\nimport DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\nimport DownloadFileProgress from \"./downloadStatus/downloadFileProgress.js\";\nimport DownloadError from \"./dtos/downloadError.js\";\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\nimport ChunkDownloader from \"./chunkDownloader.js\";\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\nimport DownloadRegistrationMode from \"./dtos/downloadRegistrationMode.js\";\nimport { promiseAllSettled } from \"../utils/promiseAll.js\";\n\nimport type FileSystemService from \"../utils/fileSystem/fileSystemService.js\";\nimport type DownloadOptions from \"./downloadOptions.js\";\nimport type ConcurrencyController from \"../utils/concurrencyController/concurrencyController.js\";\nimport type DownloaderRestoredState from \"./dtos/downloaderRestoredState.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 DownloadEventArgs from \"./eventArgs/downloadEventArgs.js\";\nimport type ApiClient from \"../utils/api/apiClient.js\";\nimport type FileDownloadEventArgs from \"./eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\nimport type DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport type DownloadLogger from \"./downloadLogger.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../utils/fileSystem/chunkStreamProvider.js\";\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\nimport type CryptographyProvider from \"../utils/crypto/cryptographyProvider.js\";\n\nexport default class FilesDownloader {\n readonly #logger: DownloadLogger;\n readonly #transferId: string;\n readonly #trackId: string | undefined;\n readonly #downloadId: string;\n readonly #region?: string;\n readonly #files: Array<DownloadFileInfo>;\n readonly #downloadState: DownloadState;\n readonly #options: DownloadOptions;\n readonly #concurrencyController: ConcurrencyController;\n readonly #fileSystem: FileSystemService;\n readonly #apiClient: ApiClient;\n readonly #fileserverClientFactory: FileServerClientFactory;\n readonly #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\n readonly #downloadRegistrationMode: DownloadRegistrationMode;\n readonly #eventsEngine: EventsEngine;\n readonly #cryptography: CryptographyProvider;\n readonly #ongoingChunkDownloads: Record<string, Promise<void>>;\n readonly #ongoingFileDownloads: Record<string, DownloadFilePromise>;\n readonly #encryptionData?: ChunkStreamProviderEncryptionData;\n\n constructor(\n logger: DownloadLogger,\n transferId: string,\n trackId: string | undefined,\n downloadId: string,\n region: string | undefined,\n files: DownloadFileInfo | Array<DownloadFileInfo>,\n oldState: DownloaderRestoredState | undefined,\n fileSystem: FileSystemService,\n concurrencyController: ConcurrencyController,\n eventsEngine: EventsEngine,\n cryptography: CryptographyProvider,\n options: DownloadOptions,\n apiClient: ApiClient,\n fileserverClientFactory: FileServerClientFactory,\n chunkStreamProviderFactory: ChunkStreamProviderFactory<string>,\n downloadRegistrationMode: DownloadRegistrationMode,\n e2eeData?: DownloadCommandE2eeData,\n ) {\n if (!transferId)\n throw new DownloadError(`No transfer specified`);\n\n if (!files)\n throw new DownloadError(`No files added to downloader`);\n\n if (Array.isArray(files) && files.length === 0)\n throw new DownloadError(`No files added to downloader`);\n\n if (!options.downloadFolder)\n throw new DownloadError(`No downloadFolder specified`);\n\n if (e2eeData && e2eeData.iv.length !== 16)\n throw new DownloadError(`IV must be 16 bytes long`);\n\n if (e2eeData && e2eeData.key.length !== 32)\n throw new DownloadError(`Encryption key must be 32 bytes long`);\n\n this.#logger = logger;\n this.#downloadId = downloadId;\n this.#transferId = transferId;\n this.#trackId = trackId;\n this.#region = region;\n this.#fileSystem = fileSystem;\n this.#files = Array.isArray(files) ? files : [files];\n this.#options = options;\n this.#eventsEngine = eventsEngine;\n this.#cryptography = cryptography;\n this.#downloadState = new DownloadState(this.#downloadId, this.#transferId, this.#files, this.#options, eventsEngine, oldState);\n this.#concurrencyController = concurrencyController;\n this.#apiClient = apiClient;\n this.#fileserverClientFactory = fileserverClientFactory;\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#downloadRegistrationMode = downloadRegistrationMode;\n this.#ongoingChunkDownloads = {};\n this.#ongoingFileDownloads = {};\n\n if (e2eeData)\n this.#encryptionData = this.createEncryptionData(e2eeData);\n }\n\n private createEncryptionData(e2eeData: DownloadCommandE2eeData): ChunkStreamProviderEncryptionData {\n return {\n iv: e2eeData.iv,\n key: e2eeData.key,\n };\n }\n\n async start(): Promise<DownloadEventArgs> {\n try {\n await this.#throwIfNotEnoughDiskSpaceBeforeStart();\n\n this.#addEventListeners();\n\n let isDownloaderRunning = true;\n\n while (isDownloaderRunning) {\n this.#downloadState.start();\n\n const fileServerUrl = new URL(this.#files[0].url).origin;\n this.#downloadState.notifyMetadataDetermined(fileServerUrl, this.#region);\n\n // MAIN FILE LOOP\n for (const file of this.#files) {\n if (file.isCompleted || file.isFailed)\n continue;\n\n if (this.#downloadState.isRunning === false)\n break;\n\n // figure out if we are downloading a new file or resuming a file that was interrupted\n if (file.wasEverWritten) {\n // this a resumed file (recreated from progress.json) - it must already exist under its temporary path\n if (!file.temporaryDownloadPath) {\n this.#downloadState.fileFailed(file, new DownloadError(`File ${file.downloadPath} was supposed to be resumed but its temporary path is not known.`, undefined, DownloadErrorCode.ResumedFilePathNotSpecified));\n continue;\n }\n\n if ((await this.#fileSystem.pathExists(file.temporaryDownloadPath!)) === false) {\n this.#downloadState.fileFailed(file, new DownloadError(`File ${file.downloadPath} was supposed to be resumed at ${file.temporaryDownloadPath}, but it does not exist on disk anymore.`, undefined, DownloadErrorCode.ResumedFileNotFound));\n continue;\n }\n }\n else {\n // in some edge cases the temporary file may exist and its name be persisted in the tracker file\n // but the wasEverWritten flag was not yet set - just abandon such temporary file (it will be 'empty' - null bytes only)\n if (file.temporaryDownloadPath) {\n this.#logDeletingFile(file, file.temporaryDownloadPath, `start`);\n this.#fileSystem.deleteFile(file.temporaryDownloadPath);\n }\n\n // this is a new file - create it\n await this.#createDownloadFile(file);\n }\n\n this.#ongoingFileDownloads[file.externalId] = new DownloadFilePromise(file.externalId);\n this.#ongoingFileDownloads[file.externalId]!.awaiter.then(id => {\n delete this.#ongoingFileDownloads[id];\n });\n\n this.#downloadState.fileStarting(file);\n\n // note: this call does not really wait for all chunks to be downloaded, but until all chunks of a file have been **scheduled**\n await this.#downloadAllChunksForFile(file);\n\n // so when we are here, the file is not complete\n // to track completeness of a file we look at events emitted by this.#downloadState\n }\n\n // when we got here it's either pause request, stop request (which is just like pause but without waiting for pending chunks), abort request (cancel the download entirely) or everything is complete;\n\n // wait for any remaining pending chunks\n await promiseAllSettled(Object.values(this.#ongoingChunkDownloads));\n\n // Wait for any remaining pending files\n // Note: we cannot rely just on chunk downloads being completed, because downloading chunks\n // doesn't mean that a file is complete; last phase of file completion is renaming the file\n // from a temporary name (unconfirmed_somefile.txt_qweasd1234.fmdownload) to its real name, which may need adjustments if a file with same name already exists.\n // When file already exists - a unique filename will be generated automatically e.g.: file.txt --> file (1).txt\n await promiseAllSettled(Object.values(this.#ongoingFileDownloads).map(x => x.awaiter));\n\n if (this.#downloadState.status === TransferStatus.Pausing) {\n // set status to paused and await until resume/abort\n await this.#downloadState.paused();\n }\n\n isDownloaderRunning = await this.#prepareDownloaderForAnotherIteration();\n }\n\n await this.#cleanupEmptyDownloadFolderIfConfigured();\n }\n catch (error) {\n this.#logger.logError(error as Error, `Unhandled downloader error occured.`);\n this.#downloadState.completed(error as Error);\n }\n finally {\n this.#removeEventListeners();\n }\n\n return this.#downloadState.getCurrentState(true);\n }\n\n async #throwIfNotEnoughDiskSpaceBeforeStart() {\n await this.#fileSystem.createFolder(this.#options.downloadFolder!);\n\n const requiredBytes = this.#getRemainingBytesToDownload();\n\n if (requiredBytes <= 0n)\n return;\n\n try {\n const availableBytes = await this.#fileSystem.getAvailableDiskSpace(this.#options.downloadFolder!);\n\n if (availableBytes < requiredBytes)\n throw new DownloadError(`ENOSPC: Not enough disk space. Required=${requiredBytes}B, available=${availableBytes}B`, undefined, DownloadErrorCode.DiskFull);\n }\n catch (error) {\n if (this.#shouldSkipFreeDiskSpaceCheck(error)) {\n this.#logger.logWarning(`Skipping free disk space check because filesystem does not support statfs`, { error });\n return;\n }\n\n throw this.#toDownloadError(error, `Checking free disk space before download failed for ${this.#options.downloadFolder!}`);\n }\n }\n\n #getRemainingBytesToDownload(): bigint {\n let requiredBytes = 0n;\n\n for (const file of this.#files) {\n if (file.isCompleted || file.isFailed)\n continue;\n\n const remaining = file.sizeInBytes - file.downloadedBytes;\n requiredBytes += BigInt(remaining);\n }\n\n return requiredBytes;\n }\n\n #shouldSkipFreeDiskSpaceCheck(error: unknown): boolean {\n const code = this.#extractErrorCode(error);\n if (code === `ENOSYS` || code === `ENOTSUP` || code === `EOPNOTSUPP`)\n return true;\n\n const message = this.#extractErrorMessage(error)?.toLowerCase() ?? ``;\n if (code === `ENOENT` && message.includes(`statfs`))\n return true;\n\n return false;\n }\n\n #extractErrorCode(error: unknown): string | undefined {\n let current = error as { code?: string, cause?: unknown } | undefined;\n\n for (let depth = 0; depth < 8 && current; depth++) {\n if (typeof current.code === `string`)\n return current.code;\n\n current = current.cause as { code?: string, cause?: unknown } | undefined;\n }\n\n return undefined;\n }\n\n #extractErrorMessage(error: unknown): string | undefined {\n let current = error as { message?: string, cause?: unknown } | undefined;\n\n for (let depth = 0; depth < 8 && current; depth++) {\n if (typeof current.message === `string`)\n return current.message;\n\n current = current.cause as { message?: string, cause?: unknown } | undefined;\n }\n\n return undefined;\n }\n\n #logDeletingFile(file: DownloadFileInfo | DownloadFileProgress, path: string, method: string) {\n let fileDataToLog = file;\n if (file instanceof DownloadFileInfo)\n fileDataToLog = DownloadFileProgress.FromFileDownloadInfo(file);\n\n this.#logger.logInfo(`[DELETE_TEMPFILE] Deleting temp file path=${path} method=${method}\\n\\n${JSON.stringify(fileDataToLog, null, 4)}\\n`);\n }\n\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\n Object.values(this.#ongoingFileDownloads).forEach(filePromise => filePromise.complete());\n this.#downloadState.requestPause(options);\n }\n\n resume(): boolean {\n return this.#downloadState.resume();\n }\n\n requestAbort(): boolean {\n Object.values(this.#ongoingFileDownloads).forEach(filePromise => filePromise.complete());\n return this.#downloadState.requestAbort();\n }\n\n getCurrentState(withFiles: boolean): DownloadEventArgs {\n return this.#downloadState.getCurrentState(withFiles);\n }\n\n get status(): TransferStatus {\n return this.#downloadState.status;\n }\n\n async #deleteAllTemporaryAndCompletedFiles() {\n for (const file of this.#files) {\n if (file.temporaryDownloadPath) {\n this.#logDeletingFile(file, file.temporaryDownloadPath, `deleteAllTemporaryAndCompletedFiles`);\n await this.#fileSystem.deleteFile(file.temporaryDownloadPath);\n }\n\n if (file.isCompleted)\n await this.#fileSystem.deleteFile(file.downloadPath);\n }\n }\n\n async #registerTransferDownload() {\n this.#downloadState.registeringTransferDownload();\n await this.#apiClient.registerTransferDownload({\n transferid: this.#transferId,\n track: this.#trackId,\n bps: this.#downloadState.averageBytesPerSecond,\n browser: this.#options.userAgent,\n });\n }\n\n async #registerFileDownload(filename: string, filesize: number) {\n this.#downloadState.registeringFileDownload();\n await this.#apiClient.registerFileDownload({\n transferid: this.#transferId,\n track: this.#trackId,\n bps: this.#downloadState.averageBytesPerSecond,\n browser: this.#options.userAgent,\n filename,\n filesize,\n });\n }\n\n #addEventListeners() {\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.PossibleSupersizedFile, this.#onFileSupersized);\n }\n\n #removeEventListeners() {\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.PossibleSupersizedFile, this.#onFileSupersized);\n }\n\n #onFileCompleted = async (args: FileDownloadEventArgs) => {\n if (this.#downloadRegistrationMode === DownloadRegistrationMode.EverySingleFile && !this.#options.skipRegistration)\n await this.#registerFileDownload(args.file.name, args.file.size);\n\n this.#ongoingFileDownloads[args.file.id]?.complete();\n };\n\n #onFileCompleting = async (args: FileDownloadEventArgs) => {\n // note the args.file.downloadPath may not be final - if a file with this name eixsts the following method will generate new name e.g. \"file.txt\" --> \"file (1).txt\"\n try {\n const finalDownloadPath = await this.#doTheFinalFileRenameAfterFilesIsDownloaded(args.file);\n this.#downloadState.fileCompleted(args.file.id, finalDownloadPath);\n }\n catch (error) {\n this.#downloadState.fileFailedById(args.file.id, error as DownloadError);\n }\n };\n\n #onFileSupersized = async (fileArgs: FileDownloadEventArgs) => {\n if (fileArgs.file.temporaryDownloadPath && await this.#fileSystem.getFileSize(fileArgs.file.temporaryDownloadPath) > fileArgs.file.size)\n await this.#fileSystem.truncateFile(fileArgs.file.temporaryDownloadPath, fileArgs.file.size);\n };\n\n #onFileFailed = async (args: FileDownloadFailedEventArgs) => {\n this.#ongoingFileDownloads[args.file.id]?.complete();\n\n const shouldKeepTemporaryFile = this.#shouldKeepTemporaryFileOnFailure();\n\n if (this.#options.deleteFailedFilesFromDisk) {\n if (args.file.temporaryDownloadPath && !shouldKeepTemporaryFile) {\n this.#logDeletingFile(args.file, args.file.temporaryDownloadPath, `onFileFailed`);\n await this.#fileSystem.deleteFile(args.file.temporaryDownloadPath);\n }\n }\n };\n\n #shouldKeepTemporaryFileOnFailure(): boolean {\n // Resuming failed files requires tracking state + preserved temporary files.\n // If tracking is disabled there is no benefit in leaving temp files behind.\n return this.#options.downloadTrackingBaseFolder !== null;\n }\n\n async #createDownloadFile(file: DownloadFileInfo) {\n this.#downloadState.fileCreating(file);\n\n try {\n await this.#autoGenerateUniqueDownloadFile(file);\n this.#downloadState.fileCreated(file);\n }\n catch (error) {\n throw this.#toDownloadError(error, `Creating download file failed for ${file.downloadPath}`);\n }\n }\n\n async #autoGenerateUniqueDownloadFile(file: DownloadFileInfo) {\n let counter = 0;\n const fileLeafName = this.#fileSystem.parseFilePath(file.name).base;\n do {\n const newFileName = `unconfirmed_${fileLeafName}_${this.#cryptography.generateRandomString(10)}.fmdownload`;\n const newPath = this.#fileSystem.replaceFilenameInPath(file.downloadPath, newFileName);\n if (await this.#fileSystem.createFile(newPath, false)) {\n // eslint-disable-next-line no-param-reassign\n file.temporaryDownloadPath = newPath;\n return;\n }\n\n counter += 1;\n } while (counter < 10000);\n\n throw new DownloadError(`Downloader could not generate unique download path for ${file.downloadPath}. It tried until counter=${counter}`, undefined, DownloadErrorCode.TooManyFileRenameAttempts);\n }\n\n #toDownloadError(error: unknown, message: string): DownloadError {\n if (error instanceof DownloadError)\n return error;\n\n const wrappedError = error instanceof Error\n ? error\n : new Error(`${error}`);\n\n const code = this.#fileSystem.fileErrorToDownloadErrorCode(wrappedError);\n return new DownloadError(message, { cause: wrappedError }, code);\n }\n\n async #downloadAllChunksForFile(file: DownloadFileInfo) {\n if (file.chunks.length) {\n // MAIN CHUNK LOOP\n for (const chunk of file.chunks) {\n if (chunk.isCompleted || chunk.isFailed)\n continue;\n\n const downloadScheduled = await this.#downloadSingleChunk(file, chunk);\n if (downloadScheduled === false) {\n // downloader is not running or file is in failed state - stop the chunk loop\n break;\n }\n }\n\n // Restored files can have all chunks already completed (e.g. rename failed in a previous run).\n // In such case there is nothing to schedule, so we need to trigger finalization explicitly.\n if (!file.isFailed && file.chunks.every(chunk => chunk.isCompleted)) {\n this.#downloadState.ensureFileStarted(file);\n file.updateProgress();\n this.#downloadState.fileCompleting(file);\n }\n }\n else {\n // zerobyte file\n file.updateProgress();\n this.#downloadState.fileCompleting(file);\n }\n }\n\n async #downloadSingleChunk(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): Promise<boolean> {\n const releaseSemaphore = await this.#concurrencyController.acquire();\n\n if (this.#downloadState.isRunning === false) {\n // downloader is not running - stop trying more chunks\n releaseSemaphore();\n return false;\n }\n\n if (file.isFailed) {\n // do not try to download more chunks if the file has failed\n releaseSemaphore();\n return false;\n }\n\n const chunkDownloader = new ChunkDownloader(this.#transferId, file, chunk, this.#downloadState, this.#options, this.#fileserverClientFactory, this.#chunkStreamProviderFactory, this.#eventsEngine, this.#logger, this.#encryptionData);\n const chunkPromise: Promise<void> = chunkDownloader.download();\n this.#ongoingChunkDownloads[chunk.id] = chunkPromise;\n\n chunkPromise.finally(() => {\n releaseSemaphore();\n delete this.#ongoingChunkDownloads[chunk.id];\n });\n\n return true;\n }\n\n /**\n * Prepares downloader for next loop iteration. Handles two main scenarios:\n * 1. Aborting - cleans up the disk state, calls downloadState to trigger Aborted event and returns a false flag (to break the loop).\n * 2. Completed - registers download to web api, calls downloadState to trigger Completed event and returns a false flag (to break the loop).\n * 3. For all other cases returns true - to continue the loop.\n */\n async #prepareDownloaderForAnotherIteration(): Promise<boolean> {\n let shouldDownloaderContinue = true;\n if (this.#downloadState.status === TransferStatus.Aborting) {\n shouldDownloaderContinue = false;\n if (this.#options.deleteAbortedDownloadsFromDisk)\n await this.#deleteAllTemporaryAndCompletedFiles();\n\n this.#downloadState.aborted();\n }\n else if (this.#downloadState.allFilesCompletedOrFailed) {\n shouldDownloaderContinue = false;\n if (this.#downloadRegistrationMode === DownloadRegistrationMode.Transfer && !this.#options.skipRegistration)\n await this.#registerTransferDownload();\n\n this.#downloadState.completed();\n }\n return shouldDownloaderContinue;\n }\n\n async #cleanupEmptyDownloadFolderIfConfigured() {\n try {\n if (this.#options.deleteEmptyDownloadFoldersAfterDownload && await this.#fileSystem.folderIsEmpty(this.#options.downloadFolder!))\n await this.#fileSystem.deleteFolder(this.#options.downloadFolder!);\n }\n catch (error) {\n this.#logger.logWarning(`cleanupEmptyDownloadFolderIfConfigured failed`, { error });\n }\n }\n\n async #doTheFinalFileRenameAfterFilesIsDownloaded(file: DownloadFileProgress) {\n let created = false;\n let createCounter = 0;\n const original = this.#fileSystem.parseFilePath(file.downloadPath);\n let newPathFormatted = file.downloadPath;\n do {\n // we do not want to re-reserve disk space when creating the target file (final name) - so file size is omitted\n created = await this.#fileSystem.createFile(newPathFormatted, false);\n if (!created) {\n createCounter += 1;\n const newPath = {\n dir: original.dir,\n name: `${original.name} (${createCounter})`,\n ext: original.ext,\n };\n newPathFormatted = this.#fileSystem.formatFilePath(newPath);\n }\n } while (created === false && createCounter < 10000);\n\n if (!created)\n throw new DownloadError(`Downloader could not rename temp file ${file.temporaryDownloadPath} to ${file.downloadPath}. It tried until counter=${createCounter}`, undefined, DownloadErrorCode.TooManyFileRenameAttempts);\n\n let renamed = false;\n let renameCounter = 0;\n let lastError: Error | undefined;\n while (!renamed && renameCounter < 5) {\n renameCounter += 1;\n try {\n await this.#fileSystem.renameFile(file.temporaryDownloadPath!, newPathFormatted);\n renamed = true;\n this.#logger.logInfo(`Downloader renamed ${file.temporaryDownloadPath} to ${newPathFormatted} at attempt ${renameCounter}`);\n }\n catch (error) {\n lastError = error as Error;\n this.#logger.logError(lastError, `Downloader could not rename ${file.temporaryDownloadPath} to ${newPathFormatted} attempt ${renameCounter}`);\n }\n }\n if (!renamed)\n await this.#cleanupFailedRenameTarget(newPathFormatted);\n\n if (!renamed)\n throw new DownloadError(`Downloader could not rename ${file.temporaryDownloadPath} to ${newPathFormatted} after ${renameCounter} attempts.`, { cause: lastError }, DownloadErrorCode.RenameFromTemporaryFilenameToFinalFailure);\n else\n return newPathFormatted;\n }\n\n async #cleanupFailedRenameTarget(pathToDelete: string) {\n try {\n await this.#fileSystem.deleteFile(pathToDelete);\n }\n catch (error) {\n this.#logger.logWarning(`Could not cleanup failed rename target ${pathToDelete}`, { error });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"filesDownloader.js","sourceRoot":"","sources":["../../../src/downloader/filesDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import DownloadState from \"./downloadStatus/downloadState.js\";\r\nimport DownloadFilePromise from \"./downloadStatus/downloadFilePromise.js\";\r\nimport DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\r\nimport DownloadFileProgress from \"./downloadStatus/downloadFileProgress.js\";\r\nimport DownloadError from \"./dtos/downloadError.js\";\r\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\r\nimport ChunkDownloader from \"./chunkDownloader.js\";\r\nimport TransferStatus from \"../utils/types/transferStatus.js\";\r\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\r\nimport DownloadRegistrationMode from \"./dtos/downloadRegistrationMode.js\";\r\nimport { promiseAllSettled } from \"../utils/promiseAll.js\";\r\n\r\nimport type FileSystemService from \"../utils/fileSystem/fileSystemService.js\";\r\nimport type DownloadOptions from \"./downloadOptions.js\";\r\nimport type ConcurrencyController from \"../utils/concurrencyController/concurrencyController.js\";\r\nimport type DownloaderRestoredState from \"./dtos/downloaderRestoredState.js\";\r\nimport type FileServerClientFactory from \"../utils/api/fileServerClientFactory.js\";\r\nimport type FileServerDownloadStatusClient from \"./api/fileServerDownloadStatusClient.js\";\r\nimport type ChunkStreamProviderFactory from \"../utils/fileSystem/chunkStreamProviderFactory.js\";\r\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\r\nimport type DownloadEventArgs from \"./eventArgs/downloadEventArgs.js\";\r\nimport type ApiClient from \"../utils/api/apiClient.js\";\r\nimport type FileDownloadEventArgs from \"./eventArgs/fileDownloadEventArgs.js\";\r\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\r\nimport type DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\r\nimport type DownloadLogger from \"./downloadLogger.js\";\r\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\r\nimport type CryptographyProvider from \"../utils/crypto/cryptographyProvider.js\";\r\nimport ChunkMD5ProviderFactory from \"./md5Provider/downloaderChunkMD5ProviderFactory.js\";\r\nimport ChunkStreamEncryptionData from \"../utils/fileSystem/chunkStreamEncryptionData.js\";\r\n\r\nexport default class FilesDownloader {\r\n readonly #logger: DownloadLogger;\r\n readonly #transferId: string;\r\n readonly #trackId: string | undefined;\r\n readonly #downloadId: string;\r\n readonly #region?: string;\r\n readonly #files: Array<DownloadFileInfo>;\r\n readonly #downloadState: DownloadState;\r\n readonly #options: DownloadOptions;\r\n readonly #concurrencyController: ConcurrencyController;\r\n readonly #fileSystem: FileSystemService;\r\n readonly #apiClient: ApiClient;\r\n readonly #fileserverClientFactory: FileServerClientFactory;\r\n readonly #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\r\n readonly #chunkMD5ProviderFactory: ChunkMD5ProviderFactory<string>;\r\n readonly #downloadRegistrationMode: DownloadRegistrationMode;\r\n readonly #downloadStatusClient: FileServerDownloadStatusClient | null;\r\n readonly #eventsEngine: EventsEngine;\r\n readonly #cryptography: CryptographyProvider;\r\n readonly #ongoingChunkDownloads: Record<string, Promise<void>>;\r\n readonly #ongoingFileDownloads: Record<string, DownloadFilePromise>;\r\n readonly #encryptionData?: ChunkStreamEncryptionData;\r\n\r\n constructor(\r\n logger: DownloadLogger,\r\n transferId: string,\r\n trackId: string | undefined,\r\n downloadId: string,\r\n region: string | undefined,\r\n files: DownloadFileInfo | Array<DownloadFileInfo>,\r\n oldState: DownloaderRestoredState | undefined,\r\n fileSystem: FileSystemService,\r\n concurrencyController: ConcurrencyController,\r\n eventsEngine: EventsEngine,\r\n cryptography: CryptographyProvider,\r\n options: DownloadOptions,\r\n apiClient: ApiClient,\r\n fileserverClientFactory: FileServerClientFactory,\r\n chunkStreamProviderFactory: ChunkStreamProviderFactory<string>,\r\n chunkMD5ProviderFactory: ChunkMD5ProviderFactory<string>,\r\n downloadRegistrationMode: DownloadRegistrationMode,\r\n e2eeData?: DownloadCommandE2eeData,\r\n ) {\r\n if (!transferId)\r\n throw new DownloadError(`No transfer specified`);\r\n\r\n if (!files)\r\n throw new DownloadError(`No files added to downloader`);\r\n\r\n if (Array.isArray(files) && files.length === 0)\r\n throw new DownloadError(`No files added to downloader`);\r\n\r\n if (!options.downloadFolder)\r\n throw new DownloadError(`No downloadFolder specified`);\r\n\r\n if (e2eeData && e2eeData.iv.length !== 16)\r\n throw new DownloadError(`IV must be 16 bytes long`);\r\n\r\n if (e2eeData && e2eeData.key.length !== 32)\r\n throw new DownloadError(`Encryption key must be 32 bytes long`);\r\n\r\n this.#logger = logger;\r\n this.#downloadId = downloadId;\r\n this.#transferId = transferId;\r\n this.#trackId = trackId;\r\n this.#region = region;\r\n this.#fileSystem = fileSystem;\r\n this.#files = Array.isArray(files) ? files : [files];\r\n this.#options = options;\r\n this.#eventsEngine = eventsEngine;\r\n this.#cryptography = cryptography;\r\n this.#downloadState = new DownloadState(this.#downloadId, this.#transferId, this.#files, this.#options, eventsEngine, oldState);\r\n this.#concurrencyController = concurrencyController;\r\n this.#apiClient = apiClient;\r\n this.#fileserverClientFactory = fileserverClientFactory;\r\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\r\n this.#chunkMD5ProviderFactory = chunkMD5ProviderFactory;\r\n this.#downloadRegistrationMode = downloadRegistrationMode;\r\n this.#downloadStatusClient = downloadRegistrationMode === DownloadRegistrationMode.ServerSide\r\n ? fileserverClientFactory.createFileServerDownloadStatusClient()\r\n : null;\r\n this.#ongoingChunkDownloads = {};\r\n this.#ongoingFileDownloads = {};\r\n\r\n if (e2eeData)\r\n this.#encryptionData = this.createEncryptionData(e2eeData);\r\n }\r\n\r\n private createEncryptionData(e2eeData: DownloadCommandE2eeData): ChunkStreamEncryptionData {\r\n return {\r\n iv: e2eeData.iv,\r\n key: e2eeData.key,\r\n };\r\n }\r\n\r\n async start(): Promise<DownloadEventArgs> {\r\n try {\r\n await this.#throwIfNotEnoughDiskSpaceBeforeStart();\r\n\r\n this.#addEventListeners();\r\n\r\n let isDownloaderRunning = true;\r\n\r\n while (isDownloaderRunning) {\r\n this.#downloadState.start();\r\n\r\n const fileServerUrl = new URL(this.#files[0].url).origin;\r\n this.#downloadState.notifyMetadataDetermined(fileServerUrl, this.#region);\r\n\r\n // MAIN FILE LOOP\r\n for (const file of this.#files) {\r\n if (file.isCompleted || file.isFailed)\r\n continue;\r\n\r\n if (this.#downloadState.isRunning === false)\r\n break;\r\n\r\n // figure out if we are downloading a new file or resuming a file that was interrupted\r\n if (file.wasEverWritten) {\r\n // this a resumed file (recreated from progress.json) - it must already exist under its temporary path\r\n if (!file.temporaryDownloadPath) {\r\n this.#downloadState.fileFailed(file, new DownloadError(`File ${file.downloadPath} was supposed to be resumed but its temporary path is not known.`, undefined, DownloadErrorCode.ResumedFilePathNotSpecified));\r\n continue;\r\n }\r\n\r\n if ((await this.#fileSystem.pathExists(file.temporaryDownloadPath!)) === false) {\r\n this.#downloadState.fileFailed(file, new DownloadError(`File ${file.downloadPath} was supposed to be resumed at ${file.temporaryDownloadPath}, but it does not exist on disk anymore.`, undefined, DownloadErrorCode.ResumedFileNotFound));\r\n continue;\r\n }\r\n }\r\n else {\r\n // in some edge cases the temporary file may exist and its name be persisted in the tracker file\r\n // but the wasEverWritten flag was not yet set - just abandon such temporary file (it will be 'empty' - null bytes only)\r\n if (file.temporaryDownloadPath) {\r\n this.#logDeletingFile(file, file.temporaryDownloadPath, `start`);\r\n this.#fileSystem.deleteFile(file.temporaryDownloadPath);\r\n }\r\n\r\n // this is a new file - create it\r\n await this.#createDownloadFile(file);\r\n }\r\n\r\n this.#ongoingFileDownloads[file.externalId] = new DownloadFilePromise(file.externalId);\r\n this.#ongoingFileDownloads[file.externalId]!.awaiter.then(id => {\r\n delete this.#ongoingFileDownloads[id];\r\n });\r\n\r\n this.#downloadState.fileStarting(file);\r\n\r\n // note: this call does not really wait for all chunks to be downloaded, but until all chunks of a file have been **scheduled**\r\n await this.#downloadAllChunksForFile(file);\r\n\r\n // so when we are here, the file is not complete\r\n // to track completeness of a file we look at events emitted by this.#downloadState\r\n }\r\n\r\n // when we got here it's either pause request, stop request (which is just like pause but without waiting for pending chunks), abort request (cancel the download entirely) or everything is complete;\r\n\r\n // wait for any remaining pending chunks\r\n await promiseAllSettled(Object.values(this.#ongoingChunkDownloads));\r\n\r\n // Wait for any remaining pending files\r\n // Note: we cannot rely just on chunk downloads being completed, because downloading chunks\r\n // doesn't mean that a file is complete; last phase of file completion is renaming the file\r\n // from a temporary name (unconfirmed_somefile.txt_qweasd1234.fmdownload) to its real name, which may need adjustments if a file with same name already exists.\r\n // When file already exists - a unique filename will be generated automatically e.g.: file.txt --> file (1).txt\r\n await promiseAllSettled(Object.values(this.#ongoingFileDownloads).map(x => x.awaiter));\r\n\r\n if (this.#downloadState.status === TransferStatus.Pausing) {\r\n // set status to paused and await until resume/abort\r\n await this.#downloadState.paused();\r\n }\r\n\r\n isDownloaderRunning = await this.#prepareDownloaderForAnotherIteration();\r\n }\r\n\r\n await this.#cleanupEmptyDownloadFolderIfConfigured();\r\n }\r\n catch (error) {\r\n this.#logger.logError(error as Error, `Unhandled downloader error occured.`);\r\n this.#downloadState.completed(error as Error);\r\n }\r\n finally {\r\n this.#removeEventListeners();\r\n }\r\n\r\n return this.#downloadState.getCurrentState(true);\r\n }\r\n\r\n async #throwIfNotEnoughDiskSpaceBeforeStart() {\r\n await this.#fileSystem.createFolder(this.#options.downloadFolder!);\r\n\r\n const requiredBytes = this.#getRemainingBytesToDownload();\r\n\r\n if (requiredBytes <= 0n)\r\n return;\r\n\r\n try {\r\n const availableBytes = await this.#fileSystem.getAvailableDiskSpace(this.#options.downloadFolder!);\r\n\r\n if (availableBytes < requiredBytes)\r\n throw new DownloadError(`ENOSPC: Not enough disk space. Required=${requiredBytes}B, available=${availableBytes}B`, undefined, DownloadErrorCode.DiskFull);\r\n }\r\n catch (error) {\r\n if (this.#shouldSkipFreeDiskSpaceCheck(error)) {\r\n this.#logger.logWarning(`Skipping free disk space check because filesystem does not support statfs`, { error });\r\n return;\r\n }\r\n\r\n throw this.#toDownloadError(error, `Checking free disk space before download failed for ${this.#options.downloadFolder!}`);\r\n }\r\n }\r\n\r\n #getRemainingBytesToDownload(): bigint {\r\n let requiredBytes = 0n;\r\n\r\n for (const file of this.#files) {\r\n if (file.isCompleted || file.isFailed)\r\n continue;\r\n\r\n const remaining = file.sizeInBytes - file.downloadedBytes;\r\n requiredBytes += BigInt(remaining);\r\n }\r\n\r\n return requiredBytes;\r\n }\r\n\r\n #shouldSkipFreeDiskSpaceCheck(error: unknown): boolean {\r\n const code = this.#extractErrorCode(error);\r\n if (code === `ENOSYS` || code === `ENOTSUP` || code === `EOPNOTSUPP`)\r\n return true;\r\n\r\n const message = this.#extractErrorMessage(error)?.toLowerCase() ?? ``;\r\n if (code === `ENOENT` && message.includes(`statfs`))\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n #extractErrorCode(error: unknown): string | undefined {\r\n let current = error as { code?: string, cause?: unknown } | undefined;\r\n\r\n for (let depth = 0; depth < 8 && current; depth++) {\r\n if (typeof current.code === `string`)\r\n return current.code;\r\n\r\n current = current.cause as { code?: string, cause?: unknown } | undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n #extractErrorMessage(error: unknown): string | undefined {\r\n let current = error as { message?: string, cause?: unknown } | undefined;\r\n\r\n for (let depth = 0; depth < 8 && current; depth++) {\r\n if (typeof current.message === `string`)\r\n return current.message;\r\n\r\n current = current.cause as { message?: string, cause?: unknown } | undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n #logDeletingFile(file: DownloadFileInfo | DownloadFileProgress, path: string, method: string) {\r\n let fileDataToLog = file;\r\n if (file instanceof DownloadFileInfo)\r\n fileDataToLog = DownloadFileProgress.FromFileDownloadInfo(file);\r\n\r\n this.#logger.logInfo(`[DELETE_TEMPFILE] Deleting temp file path=${path} method=${method}\\n\\n${JSON.stringify(fileDataToLog, null, 4)}\\n`);\r\n }\r\n\r\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\r\n Object.values(this.#ongoingFileDownloads).forEach(filePromise => filePromise.complete());\r\n this.#downloadState.requestPause(options);\r\n }\r\n\r\n resume(): boolean {\r\n return this.#downloadState.resume();\r\n }\r\n\r\n requestAbort(): boolean {\r\n Object.values(this.#ongoingFileDownloads).forEach(filePromise => filePromise.complete());\r\n return this.#downloadState.requestAbort();\r\n }\r\n\r\n getCurrentState(withFiles: boolean): DownloadEventArgs {\r\n return this.#downloadState.getCurrentState(withFiles);\r\n }\r\n\r\n get status(): TransferStatus {\r\n return this.#downloadState.status;\r\n }\r\n\r\n async #deleteAllTemporaryAndCompletedFiles() {\r\n for (const file of this.#files) {\r\n if (file.temporaryDownloadPath) {\r\n this.#logDeletingFile(file, file.temporaryDownloadPath, `deleteAllTemporaryAndCompletedFiles`);\r\n await this.#fileSystem.deleteFile(file.temporaryDownloadPath);\r\n }\r\n\r\n if (file.isCompleted)\r\n await this.#fileSystem.deleteFile(file.downloadPath);\r\n }\r\n }\r\n\r\n async #registerTransferDownload() {\r\n this.#downloadState.registeringTransferDownload();\r\n await this.#apiClient.registerTransferDownload({\r\n transferid: this.#transferId,\r\n track: this.#trackId,\r\n bps: this.#downloadState.averageBytesPerSecond,\r\n browser: this.#options.userAgent,\r\n });\r\n }\r\n\r\n async #registerFileDownload(filename: string, filesize: number) {\r\n this.#downloadState.registeringFileDownload();\r\n await this.#apiClient.registerFileDownload({\r\n transferid: this.#transferId,\r\n track: this.#trackId,\r\n bps: this.#downloadState.averageBytesPerSecond,\r\n browser: this.#options.userAgent,\r\n filename,\r\n filesize,\r\n });\r\n }\r\n\r\n #registerFileDownloadFailure(fileId: string) {\r\n const file = this.#files.find(x => x.externalId === fileId);\r\n\r\n if (!this.#downloadStatusClient || !file || !file.wasEverWritten)\r\n return;\r\n\r\n // Every chunk arrived, so the fileserver has already seen the whole download - only the local finalization failed.\r\n if (file.chunks.length > 0 && file.chunks.every(chunk => chunk.isCompleted))\r\n return;\r\n\r\n this.#downloadStatusClient.registerFileDownloadFailure(file.url)\r\n .catch(error => this.#logger.logWarning(`[DOWNLOAD_STATUS] Could not register file download failure for ${file.name}`, { error }));\r\n }\r\n\r\n #registerUnfinishedFileDownloadsCancellation() {\r\n if (!this.#downloadStatusClient)\r\n return;\r\n\r\n for (const file of this.#files) {\r\n if (!file.wasEverWritten || file.isCompleted || file.isFailed)\r\n continue;\r\n\r\n this.#downloadStatusClient.registerFileDownloadCancellation(file.url)\r\n .catch(error => this.#logger.logWarning(`[DOWNLOAD_STATUS] Could not register file download cancellation for ${file.name}`, { error }));\r\n }\r\n }\r\n\r\n #addEventListeners() {\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.PossibleSupersizedFile, this.#onFileSupersized);\r\n }\r\n\r\n #removeEventListeners() {\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.PossibleSupersizedFile, this.#onFileSupersized);\r\n }\r\n\r\n #onFileCompleted = async (args: FileDownloadEventArgs) => {\r\n if (this.#downloadRegistrationMode === DownloadRegistrationMode.EverySingleFile && !this.#options.skipRegistration)\r\n await this.#registerFileDownload(args.file.name, args.file.size);\r\n\r\n this.#ongoingFileDownloads[args.file.id]?.complete();\r\n };\r\n\r\n #onFileCompleting = async (args: FileDownloadEventArgs) => {\r\n // note the args.file.downloadPath may not be final - if a file with this name eixsts the following method will generate new name e.g. \"file.txt\" --> \"file (1).txt\"\r\n try {\r\n const finalDownloadPath = await this.#doTheFinalFileRenameAfterFilesIsDownloaded(args.file);\r\n this.#downloadState.fileCompleted(args.file.id, finalDownloadPath);\r\n }\r\n catch (error) {\r\n this.#downloadState.fileFailedById(args.file.id, error as DownloadError);\r\n }\r\n };\r\n\r\n #onFileSupersized = async (fileArgs: FileDownloadEventArgs) => {\r\n if (fileArgs.file.temporaryDownloadPath && await this.#fileSystem.getFileSize(fileArgs.file.temporaryDownloadPath) > fileArgs.file.size)\r\n await this.#fileSystem.truncateFile(fileArgs.file.temporaryDownloadPath, fileArgs.file.size);\r\n };\r\n\r\n #onFileFailed = async (args: FileDownloadFailedEventArgs) => {\r\n this.#ongoingFileDownloads[args.file.id]?.complete();\r\n this.#registerFileDownloadFailure(args.file.id);\r\n\r\n const shouldKeepTemporaryFile = this.#shouldKeepTemporaryFileOnFailure();\r\n\r\n if (this.#options.deleteFailedFilesFromDisk) {\r\n if (args.file.temporaryDownloadPath && !shouldKeepTemporaryFile) {\r\n this.#logDeletingFile(args.file, args.file.temporaryDownloadPath, `onFileFailed`);\r\n await this.#fileSystem.deleteFile(args.file.temporaryDownloadPath);\r\n }\r\n }\r\n };\r\n\r\n #shouldKeepTemporaryFileOnFailure(): boolean {\r\n // Resuming failed files requires tracking state + preserved temporary files.\r\n // If tracking is disabled there is no benefit in leaving temp files behind.\r\n return this.#options.downloadTrackingBaseFolder !== null;\r\n }\r\n\r\n async #createDownloadFile(file: DownloadFileInfo) {\r\n this.#downloadState.fileCreating(file);\r\n\r\n try {\r\n await this.#autoGenerateUniqueDownloadFile(file);\r\n this.#downloadState.fileCreated(file);\r\n }\r\n catch (error) {\r\n throw this.#toDownloadError(error, `Creating download file failed for ${file.downloadPath}`);\r\n }\r\n }\r\n\r\n async #autoGenerateUniqueDownloadFile(file: DownloadFileInfo) {\r\n let counter = 0;\r\n const fileLeafName = this.#fileSystem.parseFilePath(file.name).base;\r\n do {\r\n const newFileName = `unconfirmed_${fileLeafName}_${this.#cryptography.generateRandomString(10)}.fmdownload`;\r\n const newPath = this.#fileSystem.replaceFilenameInPath(file.downloadPath, newFileName);\r\n if (await this.#fileSystem.createFile(newPath, false)) {\r\n // eslint-disable-next-line no-param-reassign\r\n file.temporaryDownloadPath = newPath;\r\n return;\r\n }\r\n\r\n counter += 1;\r\n } while (counter < 10000);\r\n\r\n throw new DownloadError(`Downloader could not generate unique download path for ${file.downloadPath}. It tried until counter=${counter}`, undefined, DownloadErrorCode.TooManyFileRenameAttempts);\r\n }\r\n\r\n #toDownloadError(error: unknown, message: string): DownloadError {\r\n if (error instanceof DownloadError)\r\n return error;\r\n\r\n const wrappedError = error instanceof Error\r\n ? error\r\n : new Error(`${error}`);\r\n\r\n const code = this.#fileSystem.fileErrorToDownloadErrorCode(wrappedError);\r\n return new DownloadError(message, { cause: wrappedError }, code);\r\n }\r\n\r\n async #downloadAllChunksForFile(file: DownloadFileInfo) {\r\n if (file.chunks.length) {\r\n // MAIN CHUNK LOOP\r\n for (const chunk of file.chunks) {\r\n if (chunk.isCompleted || chunk.isFailed)\r\n continue;\r\n\r\n const downloadScheduled = await this.#downloadSingleChunk(file, chunk);\r\n if (downloadScheduled === false) {\r\n // downloader is not running or file is in failed state - stop the chunk loop\r\n break;\r\n }\r\n }\r\n\r\n // Restored files can have all chunks already completed (e.g. rename failed in a previous run).\r\n // In such case there is nothing to schedule, so we need to trigger finalization explicitly.\r\n if (!file.isFailed && file.chunks.every(chunk => chunk.isCompleted)) {\r\n this.#downloadState.ensureFileStarted(file);\r\n file.updateProgress();\r\n this.#downloadState.fileCompleting(file);\r\n }\r\n }\r\n else {\r\n // zerobyte file\r\n file.updateProgress();\r\n this.#downloadState.fileCompleting(file);\r\n }\r\n }\r\n\r\n async #downloadSingleChunk(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): Promise<boolean> {\r\n const releaseSemaphore = await this.#concurrencyController.acquire();\r\n\r\n if (this.#downloadState.isRunning === false) {\r\n // downloader is not running - stop trying more chunks\r\n releaseSemaphore();\r\n return false;\r\n }\r\n\r\n if (file.isFailed) {\r\n // do not try to download more chunks if the file has failed\r\n releaseSemaphore();\r\n return false;\r\n }\r\n\r\n const chunkDownloader = new ChunkDownloader(this.#transferId, file, chunk, this.#downloadState, this.#options, this.#fileserverClientFactory, this.#chunkStreamProviderFactory, this.#chunkMD5ProviderFactory, this.#eventsEngine, this.#logger, this.#encryptionData);\r\n const chunkPromise: Promise<void> = chunkDownloader.download();\r\n this.#ongoingChunkDownloads[chunk.id] = chunkPromise;\r\n\r\n chunkPromise.finally(() => {\r\n releaseSemaphore();\r\n delete this.#ongoingChunkDownloads[chunk.id];\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Prepares downloader for next loop iteration. Handles two main scenarios:\r\n * 1. Aborting - cleans up the disk state, calls downloadState to trigger Aborted event and returns a false flag (to break the loop).\r\n * 2. Completed - registers download to web api, calls downloadState to trigger Completed event and returns a false flag (to break the loop).\r\n * 3. For all other cases returns true - to continue the loop.\r\n */\r\n async #prepareDownloaderForAnotherIteration(): Promise<boolean> {\r\n let shouldDownloaderContinue = true;\r\n if (this.#downloadState.status === TransferStatus.Aborting) {\r\n shouldDownloaderContinue = false;\r\n this.#registerUnfinishedFileDownloadsCancellation();\r\n if (this.#options.deleteAbortedDownloadsFromDisk)\r\n await this.#deleteAllTemporaryAndCompletedFiles();\r\n\r\n this.#downloadState.aborted();\r\n }\r\n else if (this.#downloadState.allFilesCompletedOrFailed) {\r\n shouldDownloaderContinue = false;\r\n if (this.#downloadRegistrationMode === DownloadRegistrationMode.Transfer && !this.#options.skipRegistration)\r\n await this.#registerTransferDownload();\r\n\r\n this.#downloadState.completed();\r\n }\r\n return shouldDownloaderContinue;\r\n }\r\n\r\n async #cleanupEmptyDownloadFolderIfConfigured() {\r\n try {\r\n if (this.#options.deleteEmptyDownloadFoldersAfterDownload && await this.#fileSystem.folderIsEmpty(this.#options.downloadFolder!))\r\n await this.#fileSystem.deleteFolder(this.#options.downloadFolder!);\r\n }\r\n catch (error) {\r\n this.#logger.logWarning(`cleanupEmptyDownloadFolderIfConfigured failed`, { error });\r\n }\r\n }\r\n\r\n async #doTheFinalFileRenameAfterFilesIsDownloaded(file: DownloadFileProgress) {\r\n let created = false;\r\n let createCounter = 0;\r\n const original = this.#fileSystem.parseFilePath(file.downloadPath);\r\n let newPathFormatted = file.downloadPath;\r\n do {\r\n // we do not want to re-reserve disk space when creating the target file (final name) - so file size is omitted\r\n created = await this.#fileSystem.createFile(newPathFormatted, false);\r\n if (!created) {\r\n createCounter += 1;\r\n const newPath = {\r\n dir: original.dir,\r\n name: `${original.name} (${createCounter})`,\r\n ext: original.ext,\r\n };\r\n newPathFormatted = this.#fileSystem.formatFilePath(newPath);\r\n }\r\n } while (created === false && createCounter < 10000);\r\n\r\n if (!created)\r\n throw new DownloadError(`Downloader could not rename temp file ${file.temporaryDownloadPath} to ${file.downloadPath}. It tried until counter=${createCounter}`, undefined, DownloadErrorCode.TooManyFileRenameAttempts);\r\n\r\n let renamed = false;\r\n let renameCounter = 0;\r\n let lastError: Error | undefined;\r\n while (!renamed && renameCounter < 5) {\r\n renameCounter += 1;\r\n try {\r\n await this.#fileSystem.renameFile(file.temporaryDownloadPath!, newPathFormatted);\r\n renamed = true;\r\n this.#logger.logInfo(`Downloader renamed ${file.temporaryDownloadPath} to ${newPathFormatted} at attempt ${renameCounter}`);\r\n }\r\n catch (error) {\r\n lastError = error as Error;\r\n this.#logger.logError(lastError, `Downloader could not rename ${file.temporaryDownloadPath} to ${newPathFormatted} attempt ${renameCounter}`);\r\n }\r\n }\r\n if (!renamed)\r\n await this.#cleanupFailedRenameTarget(newPathFormatted);\r\n\r\n if (!renamed)\r\n throw new DownloadError(`Downloader could not rename ${file.temporaryDownloadPath} to ${newPathFormatted} after ${renameCounter} attempts.`, { cause: lastError }, DownloadErrorCode.RenameFromTemporaryFilenameToFinalFailure);\r\n else\r\n return newPathFormatted;\r\n }\r\n\r\n async #cleanupFailedRenameTarget(pathToDelete: string) {\r\n try {\r\n await this.#fileSystem.deleteFile(pathToDelete);\r\n }\r\n catch (error) {\r\n this.#logger.logWarning(`Could not cleanup failed rename target ${pathToDelete}`, { error });\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesPreparer.js","sourceRoot":"","sources":["../../../src/downloader/filesPreparer.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AAGpE,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,mBAAmB,CAAS;IAC5B,aAAa,CAAgB;IAC7B,WAAW,CAAa;IAExB,YAAY,kBAA0B,EAAE,YAA2B,EAAE,UAAsB;QACvF,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,KAA8B;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,UAAU;gBAChB,MAAM,IAAI,aAAa,CAAC,qCAAqC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7E,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;oBAC3B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;oBAEpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAc,CAAC,CAAC;YAC5E,CAAC;;gBAEG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YAExB,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAwB,IAAI,CAAC,UAAU,CAAC,CAAC;YAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;IAED,wBAAwB,CAAC,IAAsB;QAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,6CAA6C;YAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;CACJ","sourcesContent":["import type FileSystem from \"../utils/fileSystem/fileSystemService.js\";\nimport DownloadError from \"./dtos/downloadError.js\";\nimport DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport type DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\n\nexport default class FilesPreparer {\n #downloadBaseFolder: string;\n #maxChunkSize: number | null;\n #fileSystem: FileSystem;\n\n constructor(downloadBaseFolder: string, maxChunkSize: number | null, fileSystem: FileSystem) {\n this.#downloadBaseFolder = downloadBaseFolder;\n this.#maxChunkSize = maxChunkSize;\n this.#fileSystem = fileSystem;\n }\n\n prepareFiles(files: Array<DownloadFileInfo>) {\n for (const file of files) {\n if (!file.externalId)\n throw new DownloadError(`All files require an external ID: ${file.url}`);\n\n this.#computeFileDownloadPath(file);\n\n if (file.sizeInBytes > 0) {\n if (this.#maxChunkSize === null)\n file.chunkCount = 1;\n else\n file.chunkCount = Math.ceil(file.sizeInBytes / this.#maxChunkSize!);\n }\n else\n file.chunkCount = 0;\n\n file.chunks = new Array<DownloadFileChunkInfo>(file.chunkCount);\n for (let k = 0; k < file.chunkCount; k++)\n file.chunks[k] = new DownloadFileChunkInfo(file, k, this.#maxChunkSize || null);\n }\n }\n\n #computeFileDownloadPath(file: DownloadFileInfo): void {\n if (!file.hasDownloadPath) {\n // eslint-disable-next-line no-param-reassign\n file.downloadPath = this.#fileSystem.pathJoin(this.#downloadBaseFolder!, file.name);\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"filesPreparer.js","sourceRoot":"","sources":["../../../src/downloader/filesPreparer.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AAGpE,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,mBAAmB,CAAS;IAC5B,aAAa,CAAgB;IAC7B,WAAW,CAAa;IAExB,YAAY,kBAA0B,EAAE,YAA2B,EAAE,UAAsB;QACvF,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,KAA8B;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,UAAU;gBAChB,MAAM,IAAI,aAAa,CAAC,qCAAqC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7E,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;oBAC3B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;oBAEpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAc,CAAC,CAAC;YAC5E,CAAC;;gBAEG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YAExB,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAwB,IAAI,CAAC,UAAU,CAAC,CAAC;YAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;IAED,wBAAwB,CAAC,IAAsB;QAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,6CAA6C;YAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;CACJ","sourcesContent":["import type FileSystem from \"../utils/fileSystem/fileSystemService.js\";\r\nimport DownloadError from \"./dtos/downloadError.js\";\r\nimport DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\r\nimport type DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\r\n\r\nexport default class FilesPreparer {\r\n #downloadBaseFolder: string;\r\n #maxChunkSize: number | null;\r\n #fileSystem: FileSystem;\r\n\r\n constructor(downloadBaseFolder: string, maxChunkSize: number | null, fileSystem: FileSystem) {\r\n this.#downloadBaseFolder = downloadBaseFolder;\r\n this.#maxChunkSize = maxChunkSize;\r\n this.#fileSystem = fileSystem;\r\n }\r\n\r\n prepareFiles(files: Array<DownloadFileInfo>) {\r\n for (const file of files) {\r\n if (!file.externalId)\r\n throw new DownloadError(`All files require an external ID: ${file.url}`);\r\n\r\n this.#computeFileDownloadPath(file);\r\n\r\n if (file.sizeInBytes > 0) {\r\n if (this.#maxChunkSize === null)\r\n file.chunkCount = 1;\r\n else\r\n file.chunkCount = Math.ceil(file.sizeInBytes / this.#maxChunkSize!);\r\n }\r\n else\r\n file.chunkCount = 0;\r\n\r\n file.chunks = new Array<DownloadFileChunkInfo>(file.chunkCount);\r\n for (let k = 0; k < file.chunkCount; k++)\r\n file.chunks[k] = new DownloadFileChunkInfo(file, k, this.#maxChunkSize || null);\r\n }\r\n }\r\n\r\n #computeFileDownloadPath(file: DownloadFileInfo): void {\r\n if (!file.hasDownloadPath) {\r\n // eslint-disable-next-line no-param-reassign\r\n file.downloadPath = this.#fileSystem.pathJoin(this.#downloadBaseFolder!, file.name);\r\n }\r\n }\r\n}"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PauseSignal } from "../../uploader/pauseController.js";
|
|
2
|
+
interface DownloaderChunkMD5Provider {
|
|
3
|
+
getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string>;
|
|
4
|
+
}
|
|
5
|
+
export default DownloaderChunkMD5Provider;
|
|
6
|
+
//# sourceMappingURL=downloaderChunkMD5Provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloaderChunkMD5Provider.d.ts","sourceRoot":"","sources":["../../../../src/downloader/md5Provider/downloaderChunkMD5Provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAErE,UAAU,0BAA0B;IAChC,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnH;AAED,eAAe,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloaderChunkMD5Provider.js","sourceRoot":"","sources":["../../../../src/downloader/md5Provider/downloaderChunkMD5Provider.ts"],"names":[],"mappings":"","sourcesContent":["import type { PauseSignal } from \"../../uploader/pauseController.js\";\r\n\r\ninterface DownloaderChunkMD5Provider {\r\n getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string>;\r\n}\r\n\r\nexport default DownloaderChunkMD5Provider;"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import ChunkStreamEncryptionData from "../../utils/fileSystem/chunkStreamEncryptionData.js";
|
|
2
|
+
import DownloaderChunkMD5Provider from "./downloaderChunkMD5Provider.js";
|
|
3
|
+
interface DownloaderChunkMD5ProviderFactory<T extends string | File> {
|
|
4
|
+
create(file: T, start: number, size: number, encryptionData?: ChunkStreamEncryptionData): DownloaderChunkMD5Provider;
|
|
5
|
+
}
|
|
6
|
+
export default DownloaderChunkMD5ProviderFactory;
|
|
7
|
+
//# sourceMappingURL=downloaderChunkMD5ProviderFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloaderChunkMD5ProviderFactory.d.ts","sourceRoot":"","sources":["../../../../src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,MAAM,qDAAqD,CAAC;AAC5F,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AAEzE,UAAU,iCAAiC,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI;IAC/D,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,yBAAyB,GAAG,0BAA0B,CAAA;CACvH;AAED,eAAe,iCAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloaderChunkMD5ProviderFactory.js","sourceRoot":"","sources":["../../../../src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.ts"],"names":[],"mappings":"","sourcesContent":["import ChunkStreamEncryptionData from \"../../utils/fileSystem/chunkStreamEncryptionData.js\";\r\nimport DownloaderChunkMD5Provider from \"./downloaderChunkMD5Provider.js\";\r\n\r\ninterface DownloaderChunkMD5ProviderFactory<T extends string | File> {\r\n create(file: T, start: number, size: number, encryptionData?: ChunkStreamEncryptionData): DownloaderChunkMD5Provider\r\n}\r\n\r\nexport default DownloaderChunkMD5ProviderFactory;"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PauseSignal } from "../../../uploader/pauseController.js";
|
|
2
|
+
import type MD5Provider from "../downloaderChunkMD5Provider.js";
|
|
3
|
+
import type ChunkStreamProvider from "../../../utils/fileSystem/chunkStreamProvider.js";
|
|
4
|
+
export default class NodeOnDemandChunkMD5Provider implements MD5Provider {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(chunkStreamProvider: ChunkStreamProvider);
|
|
7
|
+
getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string>;
|
|
8
|
+
private createAbortError;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=nodeOnDemandMD5Provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeOnDemandMD5Provider.d.ts","sourceRoot":"","sources":["../../../../../src/downloader/md5Provider/node/nodeOnDemandMD5Provider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,mBAAmB,MAAM,kDAAkD,CAAC;AAExF,MAAM,CAAC,OAAO,OAAO,4BAA6B,YAAW,WAAW;;gBAGxD,mBAAmB,EAAE,mBAAmB;IAO9C,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBrH,OAAO,CAAC,gBAAgB;CAM3B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
import { pipeline } from "stream/promises";
|
|
3
|
+
import FsError from "../../../utils/fileSystem/fsError.js";
|
|
4
|
+
export default class NodeOnDemandChunkMD5Provider {
|
|
5
|
+
#chunkStreamProvider;
|
|
6
|
+
constructor(chunkStreamProvider) {
|
|
7
|
+
if (!chunkStreamProvider)
|
|
8
|
+
throw new Error(`Chunk stream provider is undefined`);
|
|
9
|
+
this.#chunkStreamProvider = chunkStreamProvider;
|
|
10
|
+
}
|
|
11
|
+
async getMd5Checksum(format, pauseSignal, abortSignal) {
|
|
12
|
+
try {
|
|
13
|
+
const fileStream = await this.#chunkStreamProvider.getChunkReadStream(pauseSignal, abortSignal);
|
|
14
|
+
const hash = crypto.createHash(`md5`);
|
|
15
|
+
await pipeline(fileStream, hash);
|
|
16
|
+
return hash.digest(format);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (abortSignal?.aborted)
|
|
20
|
+
throw this.createAbortError(abortSignal);
|
|
21
|
+
if (error instanceof FsError)
|
|
22
|
+
throw error;
|
|
23
|
+
throw new FsError(`ComputingFileMd5ChecksumException`, { cause: error });
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
if (!this.#chunkStreamProvider.isReleased)
|
|
27
|
+
await this.#chunkStreamProvider.release();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
createAbortError(abortSignal) {
|
|
31
|
+
if (abortSignal.reason instanceof Error)
|
|
32
|
+
return abortSignal.reason;
|
|
33
|
+
return new Error(`Aborted`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=nodeOnDemandMD5Provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeOnDemandMD5Provider.js","sourceRoot":"","sources":["../../../../../src/downloader/md5Provider/node/nodeOnDemandMD5Provider.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,OAAO,OAAO,MAAM,sCAAsC,CAAC;AAM3D,MAAM,CAAC,OAAO,OAAO,4BAA4B;IAC7C,oBAAoB,CAAsB;IAE1C,YAAY,mBAAwC;QAChD,IAAI,CAAC,mBAAmB;YACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAE1D,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAwB,EAAE,WAAyB,EAAE,WAAyB;QAC/F,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAEhG,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAEtC,MAAM,QAAQ,CAAC,UAA4B,EAAE,IAAI,CAAC,CAAC;YAEnD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,IAAI,WAAW,EAAE,OAAO;gBACpB,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAE7C,IAAI,KAAK,YAAY,OAAO;gBACxB,MAAM,KAAK,CAAC;YAEhB,MAAM,IAAI,OAAO,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAC;QACtF,CAAC;gBACO,CAAC;YACL,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU;gBACrC,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,WAAwB;QAC7C,IAAI,WAAW,CAAC,MAAM,YAAY,KAAK;YACnC,OAAO,WAAW,CAAC,MAAM,CAAC;QAE9B,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;CACJ","sourcesContent":["import crypto from \"crypto\";\r\nimport { pipeline } from \"stream/promises\";\r\nimport type { ReadableStream } from \"stream/web\";\r\n\r\nimport FsError from \"../../../utils/fileSystem/fsError.js\";\r\n\r\nimport type { PauseSignal } from \"../../../uploader/pauseController.js\";\r\nimport type MD5Provider from \"../downloaderChunkMD5Provider.js\";\r\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\r\n\r\nexport default class NodeOnDemandChunkMD5Provider implements MD5Provider {\r\n #chunkStreamProvider: ChunkStreamProvider;\r\n\r\n constructor(chunkStreamProvider: ChunkStreamProvider) {\r\n if (!chunkStreamProvider)\r\n throw new Error(`Chunk stream provider is undefined`);\r\n\r\n this.#chunkStreamProvider = chunkStreamProvider;\r\n }\r\n\r\n async getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string> {\r\n try {\r\n const fileStream = await this.#chunkStreamProvider.getChunkReadStream(pauseSignal, abortSignal);\r\n\r\n const hash = crypto.createHash(`md5`);\r\n\r\n await pipeline(fileStream as ReadableStream, hash);\r\n\r\n return hash.digest(format);\r\n }\r\n catch (error) {\r\n if (abortSignal?.aborted)\r\n throw this.createAbortError(abortSignal);\r\n\r\n if (error instanceof FsError)\r\n throw error;\r\n\r\n throw new FsError(`ComputingFileMd5ChecksumException`, { cause: error as Error });\r\n }\r\n finally {\r\n if (!this.#chunkStreamProvider.isReleased)\r\n await this.#chunkStreamProvider.release();\r\n }\r\n }\r\n\r\n private createAbortError(abortSignal: AbortSignal) {\r\n if (abortSignal.reason instanceof Error)\r\n return abortSignal.reason;\r\n\r\n return new Error(`Aborted`);\r\n }\r\n}"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type ChunkMD5ProviderFactory from "../downloaderChunkMD5ProviderFactory.js";
|
|
2
|
+
import ChunkMD5Provider from "../downloaderChunkMD5Provider.js";
|
|
3
|
+
import ChunkStreamProviderFactory from "../../../utils/fileSystem/chunkStreamProviderFactory.js";
|
|
4
|
+
import ChunkStreamEncryptionData from "../../../utils/fileSystem/chunkStreamEncryptionData.js";
|
|
5
|
+
export default class NodeOnDemandMD5ProviderFactory implements ChunkMD5ProviderFactory<string> {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(chunkStreamProviderFactory: ChunkStreamProviderFactory<string>);
|
|
8
|
+
create(file: string, start: number, size: number, encryptionData: ChunkStreamEncryptionData | undefined): ChunkMD5Provider;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=nodeOnDemandMD5ProviderFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeOnDemandMD5ProviderFactory.d.ts","sourceRoot":"","sources":["../../../../../src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAEhE,OAAO,0BAA0B,MAAM,yDAAyD,CAAC;AACjG,OAAO,yBAAyB,MAAM,wDAAwD,CAAC;AAE/F,MAAM,CAAC,OAAO,OAAO,8BAA+B,YAAW,uBAAuB,CAAC,MAAM,CAAC;;gBAG9E,0BAA0B,EAAE,0BAA0B,CAAC,MAAM,CAAC;IAO1E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,yBAAyB,GAAG,SAAS,GAAG,gBAAgB;CAK7H"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import NodeOnDemandChunkMD5Provider from "./nodeOnDemandMD5Provider.js";
|
|
2
|
+
export default class NodeOnDemandMD5ProviderFactory {
|
|
3
|
+
#chunkStreamProviderFactory;
|
|
4
|
+
constructor(chunkStreamProviderFactory) {
|
|
5
|
+
if (!chunkStreamProviderFactory)
|
|
6
|
+
throw new Error(`ChunkStreamProviderFactory is undefined`);
|
|
7
|
+
this.#chunkStreamProviderFactory = chunkStreamProviderFactory;
|
|
8
|
+
}
|
|
9
|
+
create(file, start, size, encryptionData) {
|
|
10
|
+
const chunkStreamProvider = this.#chunkStreamProviderFactory.create(file, start, size, encryptionData);
|
|
11
|
+
return new NodeOnDemandChunkMD5Provider(chunkStreamProvider);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=nodeOnDemandMD5ProviderFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeOnDemandMD5ProviderFactory.js","sourceRoot":"","sources":["../../../../../src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.ts"],"names":[],"mappings":"AAEA,OAAO,4BAA4B,MAAM,8BAA8B,CAAC;AAIxE,MAAM,CAAC,OAAO,OAAO,8BAA8B;IAC/C,2BAA2B,CAAqC;IAEhE,YAAY,0BAA8D;QACtE,IAAI,CAAC,0BAA0B;YAC3B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAE/D,IAAI,CAAC,2BAA2B,GAAG,0BAA0B,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY,EAAE,cAAqD;QACnG,MAAM,mBAAmB,GAAG,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAEvG,OAAO,IAAI,4BAA4B,CAAC,mBAAmB,CAAC,CAAC;IACjE,CAAC;CACJ","sourcesContent":["import type ChunkMD5ProviderFactory from \"../downloaderChunkMD5ProviderFactory.js\";\r\nimport ChunkMD5Provider from \"../downloaderChunkMD5Provider.js\";\r\nimport NodeOnDemandChunkMD5Provider from \"./nodeOnDemandMD5Provider.js\";\r\nimport ChunkStreamProviderFactory from \"../../../utils/fileSystem/chunkStreamProviderFactory.js\";\r\nimport ChunkStreamEncryptionData from \"../../../utils/fileSystem/chunkStreamEncryptionData.js\";\r\n\r\nexport default class NodeOnDemandMD5ProviderFactory implements ChunkMD5ProviderFactory<string> {\r\n #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\r\n\r\n constructor(chunkStreamProviderFactory: ChunkStreamProviderFactory<string>) {\r\n if (!chunkStreamProviderFactory)\r\n throw new Error(`ChunkStreamProviderFactory is undefined`);\r\n\r\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\r\n }\r\n\r\n create(file: string, start: number, size: number, encryptionData: ChunkStreamEncryptionData | undefined): ChunkMD5Provider {\r\n const chunkStreamProvider = this.#chunkStreamProviderFactory.create(file, start, size, encryptionData);\r\n\r\n return new NodeOnDemandChunkMD5Provider(chunkStreamProvider);\r\n }\r\n}"]}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -21,11 +21,18 @@ export { default as ApiFilemailError } from "./utils/api/apiFilemailError.js";
|
|
|
21
21
|
export { default as ApiFilemail449Error } from "./utils/api/apiFilemail449Error.js";
|
|
22
22
|
export { default as FileServerClient } from "./uploader/api/fileServerUploadClient.js";
|
|
23
23
|
export { default as FileServerClientFactory } from "./utils/api/fileServerClientFactory.js";
|
|
24
|
+
export { default as FileServerDownloadStatusClient } from "./downloader/api/fileServerDownloadStatusClient.js";
|
|
24
25
|
export { default as EventsEngine } from "./utils/events/eventsEngine.js";
|
|
25
26
|
export { EventsEngineEventHandler } from "./utils/events/eventsEngine.js";
|
|
26
27
|
export { default as ChunkStreamProvider } from "./utils/fileSystem/chunkStreamProvider.js";
|
|
28
|
+
export { default as ChunkStreamProviderFactory } from "./utils/fileSystem/chunkStreamProviderFactory.js";
|
|
29
|
+
export { default as ChunkStreamEncryptionData } from "./utils/fileSystem/chunkStreamEncryptionData.js";
|
|
27
30
|
export { default as FileDetails } from "./utils/fileSystem/fileDetails.js";
|
|
28
31
|
export { default as FsError } from "./utils/fileSystem/fsError.js";
|
|
32
|
+
export { default as DownloaderChunkMD5Provider } from "./downloader/md5Provider/downloaderChunkMD5Provider.js";
|
|
33
|
+
export { default as DownloaderChunkMD5ProviderFactory } from "./downloader/md5Provider/downloaderChunkMD5ProviderFactory.js";
|
|
34
|
+
export { default as UploaderMD5Provider, UploaderMD5ProviderFileToBeMD5Hashed } from "./uploader/md5Provider/uploaderMD5Provider.js";
|
|
35
|
+
export { default as UploaderChunkStreamProviderFactory } from "./uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js";
|
|
29
36
|
export { default as ConcurrencyController } from "./utils/concurrencyController/concurrencyController.js";
|
|
30
37
|
export { default as ConcurrencyReleaser } from "./utils/concurrencyController/concurrencyReleaser.js";
|
|
31
38
|
export { default as TransferConcurrencyController } from "./utils/concurrencyController/transferConcurrencyController.js";
|
|
@@ -79,4 +86,8 @@ export { default as WebOnlineChecker } from "./client/healthMonitor/onlineChecke
|
|
|
79
86
|
export { default as DownloadError } from "./downloader/dtos/downloadError.js";
|
|
80
87
|
export { default as DownloadErrorCode } from "./downloader/dtos/downloadErrorCode.js";
|
|
81
88
|
export { default as TransferDownloadEvent } from "./downloader/dtos/downloadEvent.js";
|
|
89
|
+
export type { default as MD5ComputationStrategy } from "./uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.js";
|
|
90
|
+
export type { default as MD5ComputationStrategyFactory } from "./uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.js";
|
|
91
|
+
export type { default as MD5ComputationSession } from "./uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.js";
|
|
92
|
+
export { default as DefaultMD5ComputationStrategyFactory } from "./uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js";
|
|
82
93
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACjG,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AACnG,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,oCAAoC,EAAE,4BAA4B,EAAE,uCAAuC,EAAE,MAAM,+CAA+C,CAAC;AACvM,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AACvG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,qDAAqD,CAAC;AACjH,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AACzG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAE/F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAErF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -22,4 +22,5 @@ export { default as WebOnlineChecker } from "./client/healthMonitor/onlineChecke
|
|
|
22
22
|
export { default as DownloadError } from "./downloader/dtos/downloadError.js";
|
|
23
23
|
export { default as DownloadErrorCode } from "./downloader/dtos/downloadErrorCode.js";
|
|
24
24
|
export { default as TransferDownloadEvent } from "./downloader/dtos/downloadEvent.js";
|
|
25
|
+
export { default as DefaultMD5ComputationStrategyFactory } from "./uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js";
|
|
25
26
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AASpF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAInE,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,gEAAgE,CAAC;AAyB1H,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAE9F,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAKnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAMzE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AAC3G,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,yDAAyD,CAAC;AACnH,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,2DAA2D,CAAC;AACvH,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,6DAA6D,CAAC;AAGpH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAuB,MAAM,uDAAuD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,2DAA2D,CAAC;AACzG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0DAA0D,CAAC;AAEvG,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAC","sourcesContent":["export { default as CancelTransferRequest } from \"./utils/api/dtos/cancelTransferRequest.js\";\nexport { BaseResponse } from \"./utils/api/dtos/baseResponse.js\";\nexport { default as FinalizeTransferRequest } from \"./utils/api/dtos/finalizeTransferRequest.js\";\nexport { default as FinalizeTransferResponse } from \"./utils/api/dtos/finalizeTransferResponse.js\";\nexport { default as ResetTransferRequest } from \"./utils/api/dtos/resetTransferRequest.js\";\nexport { InitializeTransferRequest, InitializeTransferRequestCustomField, InitializeTransferRequestRaw, InitializeTransferRequestCustomFieldRaw } from \"./utils/api/dtos/initializeTransferRequest.js\";\nexport { default as InitializeTransferResponse } from \"./utils/api/dtos/initializeTransferResponse.js\";\nexport { default as LoginRequest } from \"./utils/api/dtos/loginRequest.js\";\nexport { default as LoginResponse } from \"./utils/api/dtos/loginResponse.js\";\nexport { default as SendFileChunkRequest } from \"./utils/api/dtos/sendFileChunkRequest.js\";\nexport { default as GetTransferRequest } from \"./utils/api/dtos/getTransferRequest.js\";\nexport { default as GetTransferResponse } from \"./utils/api/dtos/getTransferResponse.js\";\nexport { default as TransferFileDto } from \"./utils/api/dtos/transferFileDto.js\";\nexport { default as RegisterTransferDownloadRequest } from \"./utils/api/dtos/registerTransferDownloadRequest.js\";\nexport { default as RegisterFileDownloadRequest } from \"./utils/api/dtos/registerFileDownloadRequest.js\";\nexport { default as TransferCustomFieldDto } from \"./utils/api/dtos/transferCustomFieldDto.js\";\n\nexport { default as ChunkProgressEvent } from \"./utils/events/chunkProgressEvent.js\";\n\nexport { default as ApiClient } from \"./utils/api/apiClient.js\";\nexport { default as ApiError } from \"./utils/api/apiError.js\";\nexport { default as ApiFilemailError } from \"./utils/api/apiFilemailError.js\";\nexport { default as ApiFilemail449Error } from \"./utils/api/apiFilemail449Error.js\";\nexport { default as FileServerClient } from \"./uploader/api/fileServerUploadClient.js\";\nexport { default as FileServerClientFactory } from \"./utils/api/fileServerClientFactory.js\";\n\nexport { default as EventsEngine } from \"./utils/events/eventsEngine.js\";\nexport { EventsEngineEventHandler } from \"./utils/events/eventsEngine.js\";\n\nexport { default as ChunkStreamProvider } from \"./utils/fileSystem/chunkStreamProvider.js\";\nexport { default as FileDetails } from \"./utils/fileSystem/fileDetails.js\";\nexport { default as FsError } from \"./utils/fileSystem/fsError.js\";\n\nexport { default as ConcurrencyController } from \"./utils/concurrencyController/concurrencyController.js\";\nexport { default as ConcurrencyReleaser } from \"./utils/concurrencyController/concurrencyReleaser.js\";\nexport { default as TransferConcurrencyController } from \"./utils/concurrencyController/transferConcurrencyController.js\";\n\nexport { TransferUploadExportData, TransferUploadExportDataAppendInfo, TransferUploadExportDataMetadata } from \"./uploader/export/transferUploadExportData.js\";\nexport { default as TransferUploadMetadata } from \"./uploader/export/transferUploadMetadata.js\";\nexport { default as TransferUploadExportState } from \"./uploader/export/transferUploadExportState.js\";\nexport { default as RegisteredTransferFile } from \"./uploader/registeredTransferFile.js\";\n\nexport { ContinuousChunksCalculatorState, ContinuousChunk } from \"./uploader/state/continuousChunksCalculator.js\";\n\nexport { default as FileChunkUploadFailedEventArgs } from \"./uploader/eventArgs/fileChunkUploadFailedEventArgs.js\";\nexport { default as FileChunkUploadCompletedPartiallyEventArgs } from \"./uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js\";\nexport { default as FileChunkUploadEventArgs } from \"./uploader/eventArgs/fileChunkUploadEventArgs.js\";\nexport { default as FileChunkUploadCompletedEventArgs } from \"./uploader/eventArgs/fileChunkUploadCompletedEventArgs.js\";\nexport { default as FileChunkUploadProgressedEventArgs } from \"./uploader/eventArgs/fileChunkUploadProgressedEventArgs.js\";\nexport { default as TransferUploadProgressedEventArgs } from \"./uploader/eventArgs/transferUploadProgressedEventArgs.js\";\nexport { default as FileUploadEventArgs } from \"./uploader/eventArgs/fileUploadEventArgs.js\";\nexport { default as FileUploadFailedEventArgs } from \"./uploader/eventArgs/fileUploadFailedEventArgs.js\";\nexport { default as FilesRegistrationBatchFailedEventArgs } from \"./uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js\";\nexport { default as FileAckFailedEventArgs } from \"./uploader/eventArgs/fileAckFailedEventArgs.js\";\nexport { default as FilesBatchAckFailedEventArgs } from \"./uploader/eventArgs/filesBatchAckFailedEventArgs.js\";\nexport { default as TransferUploadCompletedEventArgs } from \"./uploader/eventArgs/transferUploadCompletedEventArgs.js\";\nexport { default as TransferMetadataDeterminedEventArgs } from \"./uploader/eventArgs/transferMetadataDeterminedEventArgs.js\";\n\nexport { default as ReadonlyTransferUploadStateFile } from \"./uploader/state/readonlyTransferUploadStateFile.js\";\nexport { default as ReadonlyTransferUploadStateFiles } from \"./uploader/state/readonlyTransferUploadStateFiles.js\";\nexport { default as TransferStatusFile } from \"./uploader/state/transferUploadStateFile.js\";\nexport { default as TransferStatusFiles } from \"./uploader/state/transferUploadStateFiles.js\";\n\nexport { default as PauseController } from \"./uploader/pauseController.js\";\nexport { PauseSignal } from \"./uploader/pauseController.js\";\nexport { default as Transfer } from \"./uploader/transferUpload.js\";\nexport { default as TransferUploadError } from \"./uploader/transferUploadError.js\";\nexport { default as TransferUploadEvent } from \"./uploader/transferUploadEvent.js\";\nexport { default as TransferUploadConfig } from \"./uploader/options/transferUploadConfig.js\";\nexport { default as TransferUploadInfo, TransferUploadInfoCustomField } from \"./uploader/options/transferUploadInfo.js\";\nexport { TransferUploadAppendInfo, TransferUploadAppendInfoE2eeData } from \"./uploader/options/transferUploadAppendInfo.js\";\nexport { default as TransferUploadInfoBase } from \"./uploader/options/transferUploadInfoBase.js\";\nexport { default as TransferState } from \"./uploader/state/transferUploadState.js\";\nexport { default as TransferStatus } from \"./utils/types/transferStatus.js\";\n\nexport { default as DummyLogger } from \"./client/loggers/dummyLogger.js\";\nexport { default as Logger } from \"./client/loggers/logger.js\";\nexport { default as TransferUploader } from \"./client/uploader/transferUploader.js\";\nexport { default as EnvironmentVariables } from \"./client/environmentVariables.js\";\nexport { default as TransferUploaderConfig } from \"./client/uploader/transferUploaderConfig.js\";\n\nexport { default as TransferHealthMonitorBase } from \"./client/healthMonitor/transferHealthMonitorBase.js\";\nexport { default as TransferUploaderHealthMonitor } from \"./client/healthMonitor/transferUploaderHealthMonitor.js\";\nexport { default as TransferDownloaderHealthMonitor } from \"./client/healthMonitor/transferDownloaderHealthMonitor.js\";\nexport { default as TransferHealthMonitorEvent } from \"./client/healthMonitor/events/transferHealthMonitorEvent.js\";\nexport { default as HealthMonitorHealthyEventArgs } from \"./client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js\";\nexport { default as HealthMonitorUnhealthyEventArgs, HealthMonitorUnhealthyEventArgsReason, HealthMonitorUnhealthyEventArgsReasonValue } from \"./client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\nexport { default as OnlineChecker, OnlineCheckerResult } from \"./client/healthMonitor/onlineChecker/onlineChecker.js\";\nexport { default as NodeOnlineChecker } from \"./client/healthMonitor/onlineChecker/nodeOnlineChecker.js\";\nexport { default as WebOnlineChecker } from \"./client/healthMonitor/onlineChecker/webOnlineChecker.js\";\n\nexport { default as DownloadError } from \"./downloader/dtos/downloadError.js\";\nexport { default as DownloadErrorCode } from \"./downloader/dtos/downloadErrorCode.js\";\nexport { default as TransferDownloadEvent } from \"./downloader/dtos/downloadEvent.js\";"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAYpF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,+BAA+B,CAAC;AASnE,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,gEAAgE,CAAC;AAyB1H,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAE9F,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAKnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAMzE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AAC3G,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,yDAAyD,CAAC;AACnH,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,2DAA2D,CAAC;AACvH,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,6DAA6D,CAAC;AAGpH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAuB,MAAM,uDAAuD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,2DAA2D,CAAC;AACzG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0DAA0D,CAAC;AAEvG,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAKtF,OAAO,EAAE,OAAO,IAAI,oCAAoC,EAAE,MAAM,yFAAyF,CAAC","sourcesContent":["export { default as CancelTransferRequest } from \"./utils/api/dtos/cancelTransferRequest.js\";\r\nexport { BaseResponse } from \"./utils/api/dtos/baseResponse.js\";\r\nexport { default as FinalizeTransferRequest } from \"./utils/api/dtos/finalizeTransferRequest.js\";\r\nexport { default as FinalizeTransferResponse } from \"./utils/api/dtos/finalizeTransferResponse.js\";\r\nexport { default as ResetTransferRequest } from \"./utils/api/dtos/resetTransferRequest.js\";\r\nexport { InitializeTransferRequest, InitializeTransferRequestCustomField, InitializeTransferRequestRaw, InitializeTransferRequestCustomFieldRaw } from \"./utils/api/dtos/initializeTransferRequest.js\";\r\nexport { default as InitializeTransferResponse } from \"./utils/api/dtos/initializeTransferResponse.js\";\r\nexport { default as LoginRequest } from \"./utils/api/dtos/loginRequest.js\";\r\nexport { default as LoginResponse } from \"./utils/api/dtos/loginResponse.js\";\r\nexport { default as SendFileChunkRequest } from \"./utils/api/dtos/sendFileChunkRequest.js\";\r\nexport { default as GetTransferRequest } from \"./utils/api/dtos/getTransferRequest.js\";\r\nexport { default as GetTransferResponse } from \"./utils/api/dtos/getTransferResponse.js\";\r\nexport { default as TransferFileDto } from \"./utils/api/dtos/transferFileDto.js\";\r\nexport { default as RegisterTransferDownloadRequest } from \"./utils/api/dtos/registerTransferDownloadRequest.js\";\r\nexport { default as RegisterFileDownloadRequest } from \"./utils/api/dtos/registerFileDownloadRequest.js\";\r\nexport { default as TransferCustomFieldDto } from \"./utils/api/dtos/transferCustomFieldDto.js\";\r\n\r\nexport { default as ChunkProgressEvent } from \"./utils/events/chunkProgressEvent.js\";\r\n\r\nexport { default as ApiClient } from \"./utils/api/apiClient.js\";\r\nexport { default as ApiError } from \"./utils/api/apiError.js\";\r\nexport { default as ApiFilemailError } from \"./utils/api/apiFilemailError.js\";\r\nexport { default as ApiFilemail449Error } from \"./utils/api/apiFilemail449Error.js\";\r\nexport { default as FileServerClient } from \"./uploader/api/fileServerUploadClient.js\";\r\nexport { default as FileServerClientFactory } from \"./utils/api/fileServerClientFactory.js\";\r\nexport { default as FileServerDownloadStatusClient } from \"./downloader/api/fileServerDownloadStatusClient.js\";\r\n\r\nexport { default as EventsEngine } from \"./utils/events/eventsEngine.js\";\r\nexport { EventsEngineEventHandler } from \"./utils/events/eventsEngine.js\";\r\n\r\nexport { default as ChunkStreamProvider } from \"./utils/fileSystem/chunkStreamProvider.js\";\r\nexport { default as ChunkStreamProviderFactory } from \"./utils/fileSystem/chunkStreamProviderFactory.js\";\r\nexport { default as ChunkStreamEncryptionData } from \"./utils/fileSystem/chunkStreamEncryptionData.js\";\r\nexport { default as FileDetails } from \"./utils/fileSystem/fileDetails.js\";\r\nexport { default as FsError } from \"./utils/fileSystem/fsError.js\";\r\n\r\nexport { default as DownloaderChunkMD5Provider } from \"./downloader/md5Provider/downloaderChunkMD5Provider.js\";\r\nexport { default as DownloaderChunkMD5ProviderFactory } from \"./downloader/md5Provider/downloaderChunkMD5ProviderFactory.js\";\r\nexport { default as UploaderMD5Provider, UploaderMD5ProviderFileToBeMD5Hashed } from \"./uploader/md5Provider/uploaderMD5Provider.js\";\r\nexport { default as UploaderChunkStreamProviderFactory } from \"./uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js\";\r\n\r\nexport { default as ConcurrencyController } from \"./utils/concurrencyController/concurrencyController.js\";\r\nexport { default as ConcurrencyReleaser } from \"./utils/concurrencyController/concurrencyReleaser.js\";\r\nexport { default as TransferConcurrencyController } from \"./utils/concurrencyController/transferConcurrencyController.js\";\r\n\r\nexport { TransferUploadExportData, TransferUploadExportDataAppendInfo, TransferUploadExportDataMetadata } from \"./uploader/export/transferUploadExportData.js\";\r\nexport { default as TransferUploadMetadata } from \"./uploader/export/transferUploadMetadata.js\";\r\nexport { default as TransferUploadExportState } from \"./uploader/export/transferUploadExportState.js\";\r\nexport { default as RegisteredTransferFile } from \"./uploader/registeredTransferFile.js\";\r\n\r\nexport { ContinuousChunksCalculatorState, ContinuousChunk } from \"./uploader/state/continuousChunksCalculator.js\";\r\n\r\nexport { default as FileChunkUploadFailedEventArgs } from \"./uploader/eventArgs/fileChunkUploadFailedEventArgs.js\";\r\nexport { default as FileChunkUploadCompletedPartiallyEventArgs } from \"./uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js\";\r\nexport { default as FileChunkUploadEventArgs } from \"./uploader/eventArgs/fileChunkUploadEventArgs.js\";\r\nexport { default as FileChunkUploadCompletedEventArgs } from \"./uploader/eventArgs/fileChunkUploadCompletedEventArgs.js\";\r\nexport { default as FileChunkUploadProgressedEventArgs } from \"./uploader/eventArgs/fileChunkUploadProgressedEventArgs.js\";\r\nexport { default as TransferUploadProgressedEventArgs } from \"./uploader/eventArgs/transferUploadProgressedEventArgs.js\";\r\nexport { default as FileUploadEventArgs } from \"./uploader/eventArgs/fileUploadEventArgs.js\";\r\nexport { default as FileUploadFailedEventArgs } from \"./uploader/eventArgs/fileUploadFailedEventArgs.js\";\r\nexport { default as FilesRegistrationBatchFailedEventArgs } from \"./uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js\";\r\nexport { default as FileAckFailedEventArgs } from \"./uploader/eventArgs/fileAckFailedEventArgs.js\";\r\nexport { default as FilesBatchAckFailedEventArgs } from \"./uploader/eventArgs/filesBatchAckFailedEventArgs.js\";\r\nexport { default as TransferUploadCompletedEventArgs } from \"./uploader/eventArgs/transferUploadCompletedEventArgs.js\";\r\nexport { default as TransferMetadataDeterminedEventArgs } from \"./uploader/eventArgs/transferMetadataDeterminedEventArgs.js\";\r\n\r\nexport { default as ReadonlyTransferUploadStateFile } from \"./uploader/state/readonlyTransferUploadStateFile.js\";\r\nexport { default as ReadonlyTransferUploadStateFiles } from \"./uploader/state/readonlyTransferUploadStateFiles.js\";\r\nexport { default as TransferStatusFile } from \"./uploader/state/transferUploadStateFile.js\";\r\nexport { default as TransferStatusFiles } from \"./uploader/state/transferUploadStateFiles.js\";\r\n\r\nexport { default as PauseController } from \"./uploader/pauseController.js\";\r\nexport { PauseSignal } from \"./uploader/pauseController.js\";\r\nexport { default as Transfer } from \"./uploader/transferUpload.js\";\r\nexport { default as TransferUploadError } from \"./uploader/transferUploadError.js\";\r\nexport { default as TransferUploadEvent } from \"./uploader/transferUploadEvent.js\";\r\nexport { default as TransferUploadConfig } from \"./uploader/options/transferUploadConfig.js\";\r\nexport { default as TransferUploadInfo, TransferUploadInfoCustomField } from \"./uploader/options/transferUploadInfo.js\";\r\nexport { TransferUploadAppendInfo, TransferUploadAppendInfoE2eeData } from \"./uploader/options/transferUploadAppendInfo.js\";\r\nexport { default as TransferUploadInfoBase } from \"./uploader/options/transferUploadInfoBase.js\";\r\nexport { default as TransferState } from \"./uploader/state/transferUploadState.js\";\r\nexport { default as TransferStatus } from \"./utils/types/transferStatus.js\";\r\n\r\nexport { default as DummyLogger } from \"./client/loggers/dummyLogger.js\";\r\nexport { default as Logger } from \"./client/loggers/logger.js\";\r\nexport { default as TransferUploader } from \"./client/uploader/transferUploader.js\";\r\nexport { default as EnvironmentVariables } from \"./client/environmentVariables.js\";\r\nexport { default as TransferUploaderConfig } from \"./client/uploader/transferUploaderConfig.js\";\r\n\r\nexport { default as TransferHealthMonitorBase } from \"./client/healthMonitor/transferHealthMonitorBase.js\";\r\nexport { default as TransferUploaderHealthMonitor } from \"./client/healthMonitor/transferUploaderHealthMonitor.js\";\r\nexport { default as TransferDownloaderHealthMonitor } from \"./client/healthMonitor/transferDownloaderHealthMonitor.js\";\r\nexport { default as TransferHealthMonitorEvent } from \"./client/healthMonitor/events/transferHealthMonitorEvent.js\";\r\nexport { default as HealthMonitorHealthyEventArgs } from \"./client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js\";\r\nexport { default as HealthMonitorUnhealthyEventArgs, HealthMonitorUnhealthyEventArgsReason, HealthMonitorUnhealthyEventArgsReasonValue } from \"./client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\r\nexport { default as OnlineChecker, OnlineCheckerResult } from \"./client/healthMonitor/onlineChecker/onlineChecker.js\";\r\nexport { default as NodeOnlineChecker } from \"./client/healthMonitor/onlineChecker/nodeOnlineChecker.js\";\r\nexport { default as WebOnlineChecker } from \"./client/healthMonitor/onlineChecker/webOnlineChecker.js\";\r\n\r\nexport { default as DownloadError } from \"./downloader/dtos/downloadError.js\";\r\nexport { default as DownloadErrorCode } from \"./downloader/dtos/downloadErrorCode.js\";\r\nexport { default as TransferDownloadEvent } from \"./downloader/dtos/downloadEvent.js\";\r\n\r\nexport type { default as MD5ComputationStrategy } from \"./uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.js\";\r\nexport type { default as MD5ComputationStrategyFactory } from \"./uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.js\";\r\nexport type { default as MD5ComputationSession } from \"./uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.js\";\r\nexport { default as DefaultMD5ComputationStrategyFactory } from \"./uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js\";"]}
|