filemail-sdk 10.3.0 → 10.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +10 -10
- package/dist/src/autoDownloader/autoDownloader.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderDestroyer.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderError.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderEvent.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderOptions.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderStateSerializer.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadProgressedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadStartedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadStartingFailedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadUnhealthyEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/checkingForNewTransfersStartedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/newTransfersCheckCompletedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.js.map +1 -1
- package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfer.js.map +1 -1
- package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfersRetriever.js.map +1 -1
- package/dist/src/autoDownloader/node/nodeAutoDownloaderStateSerializer.js.map +1 -1
- package/dist/src/autoDownloader/node/nodeTransferDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderRecoverableState.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderState.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateRecoverableTransfer.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateRunningTransfer.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateSnapshot.js.map +1 -1
- package/dist/src/autoDownloader/transferDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderNewTransferHandler.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderRecoverableTransferHandler.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderTransferHandlerBase.js.map +1 -1
- package/dist/src/client/downloader/downloaderCore.d.ts +2 -1
- package/dist/src/client/downloader/downloaderCore.d.ts.map +1 -1
- package/dist/src/client/downloader/downloaderCore.js +6 -4
- 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/node/nodeFileServerDownloadClient.js.map +1 -1
- 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.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.js.map +1 -1
- package/dist/src/downloader/dtos/downloadCommand.js.map +1 -1
- package/dist/src/downloader/dtos/downloadError.js.map +1 -1
- package/dist/src/downloader/dtos/downloadErrorCode.js.map +1 -1
- package/dist/src/downloader/dtos/downloadEvent.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFileChunkInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFileInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFilesCommand.js.map +1 -1
- package/dist/src/downloader/dtos/downloadInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadRegistrationMode.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerFileInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerFileProgressInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerProgressInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackingMetadata.js.map +1 -1
- package/dist/src/downloader/dtos/downloaderRestoredState.js.map +1 -1
- package/dist/src/downloader/eventArgs/chunkDownloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/chunkDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadCompletedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadMetadataDeterminedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadPauseEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadTrackingFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/fileDownloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/fileDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/filesDownloader.d.ts +2 -1
- package/dist/src/downloader/filesDownloader.d.ts.map +1 -1
- package/dist/src/downloader/filesDownloader.js +4 -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 +10 -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 +4 -0
- package/dist/src/index.node.d.ts.map +1 -1
- package/dist/src/index.node.js +4 -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.d.ts +1 -0
- package/dist/src/uploader/options/transferUploadInfo.d.ts.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 +28 -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.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts +1 -0
- package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts.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.js.map +1 -1
- package/dist/src/utils/api/node/gotWorkarounds.js.map +1 -1
- package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
- package/dist/src/utils/api/node/nodeClientBase.js.map +1 -1
- package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/node/nodeFileserverClientBase.js.map +1 -1
- package/dist/src/utils/api/urlUtil.js.map +1 -1
- package/dist/src/utils/api/web/webApiClient.js.map +1 -1
- package/dist/src/utils/api/web/webClientBase.js.map +1 -1
- package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/web/webFileserverClientBase.js.map +1 -1
- package/dist/src/utils/concurrencyController/concurrencyController.js.map +1 -1
- package/dist/src/utils/concurrencyController/concurrencyReleaser.js.map +1 -1
- package/dist/src/utils/concurrencyController/transferConcurrencyController.js.map +1 -1
- package/dist/src/utils/crypto/cryptographyProvider.js.map +1 -1
- package/dist/src/utils/crypto/node/nodeCryptographyProvider.js.map +1 -1
- package/dist/src/utils/crypto/web/webCryptographyProvider.js.map +1 -1
- package/dist/src/utils/dateAndTime/simpleDateFormatter.js.map +1 -1
- package/dist/src/utils/events/chunkProgressEvent.js.map +1 -1
- package/dist/src/utils/events/eventsEngine.js.map +1 -1
- package/dist/src/utils/events/node/nodeEventsEngine.js.map +1 -1
- package/dist/src/utils/events/web/webEventsEngine.js.map +1 -1
- package/dist/src/utils/fileSystem/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 -78
- package/readme.md +27 -19
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadErrorCode.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadErrorCode.ts"],"names":[],"mappings":"AAAA,IAAK,iBAiBJ;AAjBD,WAAK,iBAAiB;IAClB,iGAAwB,CAAA;IACxB,iEAAQ,CAAA;IACR,+FAAuB,CAAA;IACvB,iFAAgB,CAAA;IAChB,mFAAiB,CAAA;IACjB,+EAAe,CAAA;IACf,mFAAiB,CAAA;IACjB,yFAAoB,CAAA;IACpB,uFAAmB,CAAA;IACnB,uGAA2B,CAAA;IAC3B,0FAAoB,CAAA;IACpB,4FAAqB,CAAA;IACrB,0FAAoB,CAAA;IACpB,oGAAyB,CAAA;IACzB,wGAA2B,CAAA;IAC3B,oIAAyC,CAAA;AAC7C,CAAC,EAjBI,iBAAiB,KAAjB,iBAAiB,QAiBrB;AAED,eAAe,iBAAiB,CAAC","sourcesContent":["enum DownloadErrorCode {\
|
|
1
|
+
{"version":3,"file":"downloadErrorCode.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadErrorCode.ts"],"names":[],"mappings":"AAAA,IAAK,iBAiBJ;AAjBD,WAAK,iBAAiB;IAClB,iGAAwB,CAAA;IACxB,iEAAQ,CAAA;IACR,+FAAuB,CAAA;IACvB,iFAAgB,CAAA;IAChB,mFAAiB,CAAA;IACjB,+EAAe,CAAA;IACf,mFAAiB,CAAA;IACjB,yFAAoB,CAAA;IACpB,uFAAmB,CAAA;IACnB,uGAA2B,CAAA;IAC3B,0FAAoB,CAAA;IACpB,4FAAqB,CAAA;IACrB,0FAAoB,CAAA;IACpB,oGAAyB,CAAA;IACzB,wGAA2B,CAAA;IAC3B,oIAAyC,CAAA;AAC7C,CAAC,EAjBI,iBAAiB,KAAjB,iBAAiB,QAiBrB;AAED,eAAe,iBAAiB,CAAC","sourcesContent":["enum DownloadErrorCode {\n TrackingDataParsingError,\n DiskFull,\n InvalidTransferPassword,\n TransferNotFound,\n DownloadsDisabled,\n TransferExpired,\n NoFilesToDownload,\n TransferInvalidState,\n ResumedFileNotFound,\n ResumedFilePathNotSpecified,\n TrackingNotAvailable,\n TrackingCleanupFailed,\n TrackingDataOutdated,\n TooManyFileRenameAttempts,\n FileserverResponseWrongSize,\n RenameFromTemporaryFilenameToFinalFailure\n}\n\nexport default DownloadErrorCode;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadEvent.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadEvent.ts"],"names":[],"mappings":"AAAA,IAAK,qBA8BJ;AA9BD,WAAK,qBAAqB;IACtB,4DAAmC,CAAA;IACnC,kEAAyC,CAAA;IACzC,gEAAuC,CAAA;IACvC,wFAA+D,CAAA;IAC/D,sDAA6B,CAAA;IAC7B,oDAA2B,CAAA;IAC3B,sEAA6C,CAAA;IAC7C,oEAA2C,CAAA;IAC3C,0EAAiD,CAAA;IACjD,wEAA+C,CAAA;IAC/C,0EAAiD,CAAA;IACjD,kEAAyC,CAAA;IACzC,gGAAuE,CAAA;IACvE,sEAA6C,CAAA;IAC7C,4EAAmD,CAAA;IACnD,0EAAiD,CAAA;IACjD,oEAA2C,CAAA;IAC3C,oEAA2C,CAAA;IAC3C,8CAAqB,CAAA;IACrB,4CAAmB,CAAA;IACnB,4CAAmB,CAAA;IACnB,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;IACjB,0DAAiC,CAAA;IACjC,gDAAuB,CAAA;IACvB,0EAAiD,CAAA;IACjD,sFAA6D,CAAA;IAC7D,0EAAiD,CAAA;IACjD,kFAAyD,CAAA;AAC7D,CAAC,EA9BI,qBAAqB,KAArB,qBAAqB,QA8BzB;AAED,eAAe,qBAAqB,CAAC","sourcesContent":["enum TransferDownloadEvent {\
|
|
1
|
+
{"version":3,"file":"downloadEvent.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadEvent.ts"],"names":[],"mappings":"AAAA,IAAK,qBA8BJ;AA9BD,WAAK,qBAAqB;IACtB,4DAAmC,CAAA;IACnC,kEAAyC,CAAA;IACzC,gEAAuC,CAAA;IACvC,wFAA+D,CAAA;IAC/D,sDAA6B,CAAA;IAC7B,oDAA2B,CAAA;IAC3B,sEAA6C,CAAA;IAC7C,oEAA2C,CAAA;IAC3C,0EAAiD,CAAA;IACjD,wEAA+C,CAAA;IAC/C,0EAAiD,CAAA;IACjD,kEAAyC,CAAA;IACzC,gGAAuE,CAAA;IACvE,sEAA6C,CAAA;IAC7C,4EAAmD,CAAA;IACnD,0EAAiD,CAAA;IACjD,oEAA2C,CAAA;IAC3C,oEAA2C,CAAA;IAC3C,8CAAqB,CAAA;IACrB,4CAAmB,CAAA;IACnB,4CAAmB,CAAA;IACnB,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;IACjB,0DAAiC,CAAA;IACjC,gDAAuB,CAAA;IACvB,0EAAiD,CAAA;IACjD,sFAA6D,CAAA;IAC7D,0EAAiD,CAAA;IACjD,kFAAyD,CAAA;AAC7D,CAAC,EA9BI,qBAAqB,KAArB,qBAAqB,QA8BzB;AAED,eAAe,qBAAqB,CAAC","sourcesContent":["enum TransferDownloadEvent {\n DownloadStarted = `DownloadStarted`,\n DownloadProgressed = `DownloadProgressed`,\n DownloadCompleted = `DownloadCompleted`,\n DownloadRegistrationTriggered = `DownloadRegistrationTriggered`,\n FileCreating = `FileCreating`,\n FileCreated = `FileCreated`,\n FileDownloadStarting = `FileDownloadStarting`,\n FileDownloadStarted = `FileDownloadStarted`,\n FileDownloadCompleting = `FileDownloadCompleting`,\n FileDownloadCompleted = `FileDownloadCompleted`,\n FileDownloadProgressed = `FileDownloadProgressed`,\n FileDownloadFailed = `FileDownloadFailed`,\n FileDownloadRegistrationTriggered = `FileDownloadRegistrationTriggered`,\n ChunkDownloadStarted = `ChunkDownloadStarted`,\n ChunkDownloadProgressed = `ChunkDownloadProgressed`,\n ChunkDownloadCompleted = `ChunkDownloadCompleted`,\n ChunkDownloadFailed = `ChunkDownloadFailed`,\n ConfigureThrottling = `ConfigureThrottling`,\n Aborting = `Aborting`,\n Aborted = `Aborted`,\n Resumed = `Resumed`,\n Pausing = `Pausing`,\n Paused = `Paused`,\n NetworkFailure = `NetworkFailure`,\n NetworkOk = `NetworkOk`,\n PossibleSupersizedFile = `PossibleSupersizedFile`,\n RecoveredInterruptedDownload = `RecoveredInterruptedDownload`,\n DownloadTrackingFailed = `DownloadTrackingFailed`,\n TransferMetadataDetermined = `TransferMetadataDetermined`,\n}\n\nexport default TransferDownloadEvent;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadFileChunkInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFileChunkInfo.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAC7B,EAAE,CAAS;IACX,IAAI,CAAmB;IAEhC;;OAEG;IACM,KAAK,CAAgB;IAC9B;;OAEG;IACM,GAAG,CAAgB;IAC5B;;OAEG;IACM,WAAW,CAAS;IAC7B;;;OAGG;IACM,SAAS,CAAS;IAE3B,WAAW,GAAG,KAAK,CAAC;IACpB,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,GAAyB,IAAI,CAAC;IACrC,eAAe,GAAG,CAAC,CAAC;IACpB,OAAO,GAAG,CAAC,CAAC;IAEZ,YAAY,IAAsB,EAAE,WAAmB,EAAE,YAA2B;QAChF,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QACtC,CAAC;aACI,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,YAAa,CAAC;YACzC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,YAAa,GAAG,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAqB;QACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,eAAuB;QAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;;YAEnB,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IAChE,CAAC;CACJ","sourcesContent":["import type DownloadError from \"./downloadError.js\";\
|
|
1
|
+
{"version":3,"file":"downloadFileChunkInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFileChunkInfo.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAC7B,EAAE,CAAS;IACX,IAAI,CAAmB;IAEhC;;OAEG;IACM,KAAK,CAAgB;IAC9B;;OAEG;IACM,GAAG,CAAgB;IAC5B;;OAEG;IACM,WAAW,CAAS;IAC7B;;;OAGG;IACM,SAAS,CAAS;IAE3B,WAAW,GAAG,KAAK,CAAC;IACpB,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,GAAyB,IAAI,CAAC;IACrC,eAAe,GAAG,CAAC,CAAC;IACpB,OAAO,GAAG,CAAC,CAAC;IAEZ,YAAY,IAAsB,EAAE,WAAmB,EAAE,YAA2B;QAChF,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QACtC,CAAC;aACI,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,YAAa,CAAC;YACzC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,YAAa,GAAG,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAqB;QACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,eAAuB;QAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;;YAEnB,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IAChE,CAAC;CACJ","sourcesContent":["import type DownloadError from \"./downloadError.js\";\nimport type DownloadFileInfo from \"./downloadFileInfo.js\";\n\nexport default class DownloadFileChunkInfo {\n readonly id: string;\n readonly file: DownloadFileInfo;\n\n /**\n * Zero-based index of first byte of this chunk within a file.\n */\n readonly start: number | null;\n /**\n * Zero-based index of last byte of this chunk within a file.\n */\n readonly end: number | null;\n /**\n * Zero-based index of the chunk within a file.\n */\n readonly chunkNumber: number;\n /**\n * The real chunk size in bytes (no matter of downloader chunkSize setting). For unspecified downloader chunkSize\n * this will equal to file size. Otherwise it is calculated as end-start+1\n */\n readonly chunkSize: number;\n\n isCompleted = false;\n isFailed = false;\n failure: DownloadError | null = null;\n downloadedBytes = 0;\n percent = 0;\n\n constructor(file: DownloadFileInfo, chunkNumber: number, maxChunkSize: number | null) {\n this.id = `${file.externalId}_${chunkNumber}`;\n this.file = file;\n this.chunkNumber = chunkNumber;\n if (maxChunkSize === null) {\n this.start = null;\n this.end = null;\n this.chunkSize = file.sizeInBytes;\n }\n else {\n this.start = chunkNumber * maxChunkSize!;\n this.end = Math.min(file.sizeInBytes - 1, this.start + maxChunkSize! - 1);\n this.chunkSize = this.end - this.start + 1;\n }\n }\n\n fail(reason: DownloadError): void {\n this.isCompleted = false;\n this.isFailed = true;\n this.failure = reason;\n }\n\n complete(): void {\n this.isCompleted = true;\n this.isFailed = false;\n }\n\n setProgress(downloadedBytes: number): void {\n this.downloadedBytes = downloadedBytes;\n if (this.chunkSize === 0)\n this.percent = 100;\n else\n this.percent = (100 * downloadedBytes) / this.chunkSize;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadFileInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFileInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import type DownloadError from \"./downloadError.js\";\
|
|
1
|
+
{"version":3,"file":"downloadFileInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFileInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import type DownloadError from \"./downloadError.js\";\nimport type DownloadFileChunkInfo from \"./downloadFileChunkInfo.js\";\n\nexport default class DownloadFileInfo {\n #lastProgressTick: number | null = null;\n #downloadPath: string | null = null;\n #pendingChunks: Set<DownloadFileChunkInfo> = new Set<DownloadFileChunkInfo>();\n #completedChunkNumbers: Array<number> = [];\n\n readonly externalId: string;\n readonly url: string;\n readonly name: string;\n readonly sizeInBytes: number;\n\n wasEverWritten = false;\n isStarted = false;\n isCompleted = false;\n isFailed = false;\n lastSuccessfulChunkNumber: number | null = null;\n temporaryDownloadPath: string | null = null;\n\n /**\n * How many bytes have been downloaded counting only completed chunks.\n */\n downloadedBytes_bank = 0;\n /**\n * How many bytes have been downloaded: including completed chunks and pending chunks.\n * This value may go back and forward in case of a stop/resume flow or when there are retries of failed chunks.\n */\n downloadedBytes = 0;\n\n percent = 0;\n chunkCount = 0;\n chunks = new Array<DownloadFileChunkInfo>();\n failures = new Array<DownloadError>();\n\n /**\n * @param externalId ID of the file - returned in Filemail web API transfer response.\n * @param url Absolute url to the file on Fileserver.\n * @param name File name as it is returned from Filemail web API (relative to transfer folder, / is the path separator - api convention).\n * @param sizeInBytes Size of the file - obtained from Filemail web API transfer response.\n * @param downloadPath Optional: absolute download path where the file should be saved. This param is also used when restoring interrupted download.\n * When this parameter is null it will be set automatically by the downloader based on download folder (configured in the downloader) + {@link name}.\n * @param chunkCount How many chunks this file contains. Note: zero-byte (empty) files have 1 chunk.\n * @param temporaryDownloadPath Temporary download path - where the file is physically download until it is complete (and then renamed to {@link downloadPath}).\n */\n constructor(\n externalId: string,\n url: string,\n name: string,\n sizeInBytes: number,\n downloadPath: string | null = null,\n chunkCount: number | null = null,\n temporaryDownloadPath: string | null = null,\n ) {\n this.externalId = externalId;\n this.url = url;\n this.name = name;\n this.sizeInBytes = sizeInBytes;\n this.#downloadPath = downloadPath;\n this.temporaryDownloadPath = temporaryDownloadPath;\n if (chunkCount !== null)\n this.chunkCount = chunkCount;\n }\n\n start() {\n this.isStarted = true;\n }\n\n starting() {\n this.wasEverWritten = true;\n }\n\n fail(reason: DownloadError) {\n this.isFailed = true;\n this.failures.push(reason);\n }\n\n complete(finalDownloadPath: string) {\n this.downloadPath = finalDownloadPath;\n this.isFailed = false;\n this.isCompleted = true;\n }\n\n chunkStarted(chunk: DownloadFileChunkInfo) {\n this.#pendingChunks.add(chunk);\n }\n\n chunkCompleted(chunk: DownloadFileChunkInfo) {\n const removed = this.#pendingChunks.delete(chunk);\n if (removed) {\n this.downloadedBytes_bank += chunk.chunkSize;\n\n if (this.#completedChunkNumbers.indexOf(chunk.chunkNumber) === -1) {\n this.#completedChunkNumbers.push(chunk.chunkNumber);\n this.#completedChunkNumbers.sort((a, b) => a - b);\n }\n\n let minSuccessfulChunkNumber = this.lastSuccessfulChunkNumber ?? -1;\n while (this.#completedChunkNumbers.length > 0 && this.#completedChunkNumbers[0] === minSuccessfulChunkNumber + 1)\n minSuccessfulChunkNumber = this.#completedChunkNumbers.shift()!;\n\n if (minSuccessfulChunkNumber > -1)\n this.lastSuccessfulChunkNumber = minSuccessfulChunkNumber;\n }\n }\n\n chunkFailed(chunk: DownloadFileChunkInfo) {\n this.#pendingChunks.delete(chunk);\n }\n\n /**\n * Updates file's {@link downloadedBytes} by adding number of downloaded bytes of every pending chunk to {@link downloadedBytes_bank}.\n * Once {@link downloadedBytes} is updated - progress in percent is updated too ({@link percent}).\n */\n updateProgress() {\n this.#lastProgressTick = new Date().getTime();\n\n let downloaded = this.downloadedBytes_bank;\n\n for (const chunk of this.#pendingChunks)\n downloaded += chunk.downloadedBytes;\n\n this.downloadedBytes = downloaded;\n\n if (this.sizeInBytes > 0)\n this.percent = Math.min(100, (100 * this.downloadedBytes) / this.sizeInBytes);\n else\n this.percent = 100;\n }\n\n get lastProgressTick() {\n return this.#lastProgressTick;\n }\n\n get hasDownloadPath(): boolean {\n return !!this.#downloadPath;\n }\n\n get downloadPath(): string {\n if (!this.#downloadPath)\n throw new Error(`Download path not initialized!`);\n\n return this.#downloadPath;\n }\n\n set downloadPath(value: string) {\n this.#downloadPath = value;\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadFilesCommand.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFilesCommand.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferFileDto from \"../../utils/api/dtos/transferFileDto.js\";\
|
|
1
|
+
{"version":3,"file":"downloadFilesCommand.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFilesCommand.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferFileDto from \"../../utils/api/dtos/transferFileDto.js\";\nimport type DownloadCommand from \"./downloadCommand.js\";\n\ninterface DownloadFilesCommand extends DownloadCommand\n{\n files: Array<TransferFileDto>\n}\n\nexport default DownloadFilesCommand;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadInfo.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\
|
|
1
|
+
{"version":3,"file":"downloadInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadInfo.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\n\ninterface DownloadInfo {\n downloadId: string;\n transferId: string;\n initialState: DownloadEventArgs;\n completion: Promise<DownloadEventArgs>;\n}\n\nexport default DownloadInfo;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadRegistrationMode.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadRegistrationMode.ts"],"names":[],"mappings":"AAAA,IAAK,wBAIJ;AAJD,WAAK,wBAAwB;IACzB,iDAAqB,CAAA;IACrB,+DAAmC,CAAA;IACnC,2DAA+B,CAAA;AACnC,CAAC,EAJI,wBAAwB,KAAxB,wBAAwB,QAI5B;AAED,eAAe,wBAAwB,CAAC","sourcesContent":["enum DownloadRegistrationMode {\
|
|
1
|
+
{"version":3,"file":"downloadRegistrationMode.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadRegistrationMode.ts"],"names":[],"mappings":"AAAA,IAAK,wBAIJ;AAJD,WAAK,wBAAwB;IACzB,iDAAqB,CAAA;IACrB,+DAAmC,CAAA;IACnC,2DAA+B,CAAA;AACnC,CAAC,EAJI,wBAAwB,KAAxB,wBAAwB,QAI5B;AAED,eAAe,wBAAwB,CAAC","sourcesContent":["enum DownloadRegistrationMode {\n Transfer = `Transfer`,\n EverySingleFile = `EverySingleFile`,\n MultipleFiles = `MultipleFiles`, // for future use with new endpoint - see FILEMAIL-4034\n}\n\nexport default DownloadRegistrationMode;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadTrackerFileInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadTrackerFileInfo.ts"],"names":[],"mappings":"","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"downloadTrackerFileInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadTrackerFileInfo.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Note: this is a JSON DTO interface - short property names are to minimize state size on disk in case there are downloads with lots of files.\n */\ninterface DownloadTrackerFileInfo {\n /**\n * Download url.\n */\n u: string,\n /**\n * Size in bytes.\n */\n s: number;\n /**\n * File name (as it came from api, so potentially including folders, separator is always a forward slash). E.g. /some/folder/file.txt\n */\n n: string,\n /**\n * Absolute download path - final file download download path. E.g. C:\\downloads\\file.txt\n */\n dp: string,\n /**\n * Temporary download path - physical file download download path until it is complete. Ee.g. C:\\downloads\\unconfiormed_123456.fmdownload\n * Allows avoiding naming conflicts and indicating to end users that file is in progress.\n */\n tdp: string | null,\n /**\n * Number of chunks.\n */\n cc: number,\n}\n\nexport default DownloadTrackerFileInfo;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadTrackerFileProgressInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadTrackerFileProgressInfo.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadErrorCode from \"./downloadErrorCode.js\";\
|
|
1
|
+
{"version":3,"file":"downloadTrackerFileProgressInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadTrackerFileProgressInfo.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadErrorCode from \"./downloadErrorCode.js\";\n\n/**\n * Note: this is a JSON DTO interface - short property names are to minimize state size on disk in case there are downloads with lots of files.\n */\ninterface DownloadTrackerFileProgressInfo {\n /**\n * Number of last successful chunk (only consecutive chunks count).\n */\n ok: number | null,\n /**\n * Is this file in \"failed\" state?\n */\n er: boolean,\n /**\n * Is this file in \"completed\" state?\n */\n c: boolean,\n /**\n * Was this file ever written?\n */\n wr: boolean,\n /**\n * Last failure code for this file.\n */\n ec?: DownloadErrorCode | null\n}\n\nexport default DownloadTrackerFileProgressInfo;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadTrackerProgressInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadTrackerProgressInfo.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadTrackerFileProgressInfo from \"./downloadTrackerFileProgressInfo.js\";\
|
|
1
|
+
{"version":3,"file":"downloadTrackerProgressInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadTrackerProgressInfo.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadTrackerFileProgressInfo from \"./downloadTrackerFileProgressInfo.js\";\n\ninterface DownloadTrackerProgressInfo {\n trackedFiles: Record<string, DownloadTrackerFileProgressInfo>;\n activeTime: number;\n}\n\nexport default DownloadTrackerProgressInfo;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadTrackingMetadata.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadTrackingMetadata.ts"],"names":[],"mappings":"","sourcesContent":["interface DownloadTrackingMetadata {\
|
|
1
|
+
{"version":3,"file":"downloadTrackingMetadata.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadTrackingMetadata.ts"],"names":[],"mappings":"","sourcesContent":["interface DownloadTrackingMetadata {\n region?: string,\n e2eeData?: DownloadTrackingMetadataE2eeData,\n}\n\nexport default DownloadTrackingMetadata;\n\nexport type DownloadTrackingMetadataE2eeData = {\n ivAsHex: string,\n keyAsHex: string,\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloaderRestoredState.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloaderRestoredState.ts"],"names":[],"mappings":"","sourcesContent":["interface DownloaderRestoredState {\
|
|
1
|
+
{"version":3,"file":"downloaderRestoredState.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloaderRestoredState.ts"],"names":[],"mappings":"","sourcesContent":["interface DownloaderRestoredState {\n activeTime: number;\n downloadedBytes: number;\n downloadedBytesBank: number;\n totalSize: number;\n percent: number;\n}\n\nexport default DownloaderRestoredState;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkDownloadEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/chunkDownloadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadFileChunkProgress from \"../downloadStatus/downloadFileChunkProgress.js\";\
|
|
1
|
+
{"version":3,"file":"chunkDownloadEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/chunkDownloadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadFileChunkProgress from \"../downloadStatus/downloadFileChunkProgress.js\";\nimport type DownloadFileProgress from \"../downloadStatus/downloadFileProgress.js\";\n\ninterface ChunkDownloadEventArgs {\n transferId: string;\n file: DownloadFileProgress;\n chunk: DownloadFileChunkProgress;\n activeTime: number;\n}\n\nexport default ChunkDownloadEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkDownloadFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/chunkDownloadFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadError from \"../dtos/downloadError.js\";\
|
|
1
|
+
{"version":3,"file":"chunkDownloadFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/chunkDownloadFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadError from \"../dtos/downloadError.js\";\nimport type ChunkDownloadEventArgs from \"./chunkDownloadEventArgs.js\";\n\ninterface ChunkDownloadFailedEventArgs extends ChunkDownloadEventArgs {\n reason: DownloadError;\n}\n\nexport default ChunkDownloadFailedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadCompletedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadCompletedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadFileProgress from \"../downloadStatus/downloadFileProgress.js\";\
|
|
1
|
+
{"version":3,"file":"downloadCompletedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadCompletedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadFileProgress from \"../downloadStatus/downloadFileProgress.js\";\nimport type DownloadEventArgs from \"./downloadEventArgs.js\";\n\ninterface DownloadCompletedEventArgs extends DownloadEventArgs {\n downloadError: Error | undefined;\n failedFiles: Array<DownloadFileProgress>; // if this array has any items - it means transfer completed but not all files were downloaded (after all possible retries have been performed)\n}\n\nexport default DownloadCompletedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferStatus from \"../../utils/types/transferStatus.js\";\
|
|
1
|
+
{"version":3,"file":"downloadEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferStatus from \"../../utils/types/transferStatus.js\";\nimport type DownloadFileProgress from \"../downloadStatus/downloadFileProgress.js\";\n\ninterface DownloadEventArgs {\n status: TransferStatus;\n downloadId: string;\n transferId: string;\n activeTimeMillis: number;\n totalTimeMillis: number;\n progressPercent: number;\n bytesPerSecondAverage: number;\n bytesPerSecondCurrent: number;\n estimatedRemainingTimeSeconds: number | null;\n totalSize: number;\n downloadedBytes: number;\n files: Array<DownloadFileProgress> | null;\n downloadBaseFolder: string;\n}\n\nexport default DownloadEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadMetadataDeterminedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadMetadataDeterminedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadEventArgs from \"./downloadEventArgs.js\";\
|
|
1
|
+
{"version":3,"file":"downloadMetadataDeterminedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadMetadataDeterminedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadEventArgs from \"./downloadEventArgs.js\";\n\ninterface DownloadMetadataDeterminedEventArgs extends DownloadEventArgs {\n region?: string;\n fileServerUrl: string;\n}\n\nexport default DownloadMetadataDeterminedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadPauseEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadPauseEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadEventArgs from \"./downloadEventArgs.js\";\
|
|
1
|
+
{"version":3,"file":"downloadPauseEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadPauseEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadEventArgs from \"./downloadEventArgs.js\";\n\ninterface DownloadPauseEventArgs extends DownloadEventArgs {\n interruptPendingChunks: boolean;\n}\n\nexport default DownloadPauseEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadTrackingFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadTrackingFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadErrorCode from \"../dtos/downloadErrorCode.js\";\
|
|
1
|
+
{"version":3,"file":"downloadTrackingFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/downloadTrackingFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadErrorCode from \"../dtos/downloadErrorCode.js\";\n\ninterface DownloadTrackingFailedEventArgs {\n downloadId: string;\n reason: string;\n errorCode: DownloadErrorCode;\n error: Error | null;\n}\n\nexport default DownloadTrackingFailedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileDownloadEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/fileDownloadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadFileProgress from \"../downloadStatus/downloadFileProgress.js\";\
|
|
1
|
+
{"version":3,"file":"fileDownloadEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/fileDownloadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadFileProgress from \"../downloadStatus/downloadFileProgress.js\";\n\ninterface FileDownloadEventArgs {\n transferId: string;\n file: DownloadFileProgress;\n activeTime: number;\n}\n\nexport default FileDownloadEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileDownloadFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/fileDownloadFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadError from \"../dtos/downloadError.js\";\
|
|
1
|
+
{"version":3,"file":"fileDownloadFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/downloader/eventArgs/fileDownloadFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadError from \"../dtos/downloadError.js\";\nimport type FileDownloadEventArgs from \"./fileDownloadEventArgs.js\";\n\ninterface FileDownloadFailedEventArgs extends FileDownloadEventArgs {\n reason: DownloadError;\n}\n\nexport default FileDownloadFailedEventArgs;"]}
|
|
@@ -13,9 +13,10 @@ import type ApiClient from "../utils/api/apiClient.js";
|
|
|
13
13
|
import type DownloadLogger from "./downloadLogger.js";
|
|
14
14
|
import type { DownloadCommandE2eeData } from "./dtos/downloadCommand.js";
|
|
15
15
|
import type CryptographyProvider from "../utils/crypto/cryptographyProvider.js";
|
|
16
|
+
import ChunkMD5ProviderFactory from "./md5Provider/downloaderChunkMD5ProviderFactory.js";
|
|
16
17
|
export default class FilesDownloader {
|
|
17
18
|
#private;
|
|
18
|
-
constructor(logger: DownloadLogger, transferId: string, trackId: string | undefined, downloadId: string, region: string | undefined, files: DownloadFileInfo | Array<DownloadFileInfo>, oldState: DownloaderRestoredState | undefined, fileSystem: FileSystemService, concurrencyController: ConcurrencyController, eventsEngine: EventsEngine, cryptography: CryptographyProvider, options: DownloadOptions, apiClient: ApiClient, fileserverClientFactory: FileServerClientFactory, chunkStreamProviderFactory: ChunkStreamProviderFactory<string>, downloadRegistrationMode: DownloadRegistrationMode, e2eeData?: DownloadCommandE2eeData);
|
|
19
|
+
constructor(logger: DownloadLogger, transferId: string, trackId: string | undefined, downloadId: string, region: string | undefined, files: DownloadFileInfo | Array<DownloadFileInfo>, oldState: DownloaderRestoredState | undefined, fileSystem: FileSystemService, concurrencyController: ConcurrencyController, eventsEngine: EventsEngine, cryptography: CryptographyProvider, options: DownloadOptions, apiClient: ApiClient, fileserverClientFactory: FileServerClientFactory, chunkStreamProviderFactory: ChunkStreamProviderFactory<string>, chunkMD5ProviderFactory: ChunkMD5ProviderFactory<string>, downloadRegistrationMode: DownloadRegistrationMode, e2eeData?: DownloadCommandE2eeData);
|
|
19
20
|
private createEncryptionData;
|
|
20
21
|
start(): Promise<DownloadEventArgs>;
|
|
21
22
|
requestPause(options: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesDownloader.d.ts","sourceRoot":"","sources":["../../../src/downloader/filesDownloader.ts"],"names":[],"mappings":"AAEA,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAK1D,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAE9D,OAAO,wBAAwB,MAAM,oCAAoC,CAAC;AAG1E,OAAO,KAAK,iBAAiB,MAAM,0CAA0C,CAAC;AAC9E,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,qBAAqB,MAAM,yDAAyD,CAAC;AACjG,OAAO,KAAK,uBAAuB,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,0BAA0B,MAAM,mDAAmD,CAAC;AAChG,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,iBAAiB,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAC;AAIvD,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"filesDownloader.d.ts","sourceRoot":"","sources":["../../../src/downloader/filesDownloader.ts"],"names":[],"mappings":"AAEA,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAK1D,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAE9D,OAAO,wBAAwB,MAAM,oCAAoC,CAAC;AAG1E,OAAO,KAAK,iBAAiB,MAAM,0CAA0C,CAAC;AAC9E,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,qBAAqB,MAAM,yDAAyD,CAAC;AACjG,OAAO,KAAK,uBAAuB,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,0BAA0B,MAAM,mDAAmD,CAAC;AAChG,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,iBAAiB,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAC;AAIvD,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAC;AAChF,OAAO,uBAAuB,MAAM,oDAAoD,CAAC;AAGzF,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAuB5B,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,EACjD,QAAQ,EAAE,uBAAuB,GAAG,SAAS,EAC7C,UAAU,EAAE,iBAAiB,EAC7B,qBAAqB,EAAE,qBAAqB,EAC5C,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,oBAAoB,EAClC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,SAAS,EACpB,uBAAuB,EAAE,uBAAuB,EAChD,0BAA0B,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAC9D,uBAAuB,EAAE,uBAAuB,CAAC,MAAM,CAAC,EACxD,wBAAwB,EAAE,wBAAwB,EAClD,QAAQ,CAAC,EAAE,uBAAuB;IA4CtC,OAAO,CAAC,oBAAoB;IAOtB,KAAK,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAkLzC,YAAY,CAAC,OAAO,EAAE;QAAE,sBAAsB,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,GAAG,IAAI;IAK3G,MAAM,IAAI,OAAO;IAIjB,YAAY,IAAI,OAAO;IAKvB,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB;IAItD,IAAI,MAAM,IAAI,cAAc,CAE3B;CAuRJ"}
|
|
@@ -23,13 +23,14 @@ export default class FilesDownloader {
|
|
|
23
23
|
#apiClient;
|
|
24
24
|
#fileserverClientFactory;
|
|
25
25
|
#chunkStreamProviderFactory;
|
|
26
|
+
#chunkMD5ProviderFactory;
|
|
26
27
|
#downloadRegistrationMode;
|
|
27
28
|
#eventsEngine;
|
|
28
29
|
#cryptography;
|
|
29
30
|
#ongoingChunkDownloads;
|
|
30
31
|
#ongoingFileDownloads;
|
|
31
32
|
#encryptionData;
|
|
32
|
-
constructor(logger, transferId, trackId, downloadId, region, files, oldState, fileSystem, concurrencyController, eventsEngine, cryptography, options, apiClient, fileserverClientFactory, chunkStreamProviderFactory, downloadRegistrationMode, e2eeData) {
|
|
33
|
+
constructor(logger, transferId, trackId, downloadId, region, files, oldState, fileSystem, concurrencyController, eventsEngine, cryptography, options, apiClient, fileserverClientFactory, chunkStreamProviderFactory, chunkMD5ProviderFactory, downloadRegistrationMode, e2eeData) {
|
|
33
34
|
if (!transferId)
|
|
34
35
|
throw new DownloadError(`No transfer specified`);
|
|
35
36
|
if (!files)
|
|
@@ -57,6 +58,7 @@ export default class FilesDownloader {
|
|
|
57
58
|
this.#apiClient = apiClient;
|
|
58
59
|
this.#fileserverClientFactory = fileserverClientFactory;
|
|
59
60
|
this.#chunkStreamProviderFactory = chunkStreamProviderFactory;
|
|
61
|
+
this.#chunkMD5ProviderFactory = chunkMD5ProviderFactory;
|
|
60
62
|
this.#downloadRegistrationMode = downloadRegistrationMode;
|
|
61
63
|
this.#ongoingChunkDownloads = {};
|
|
62
64
|
this.#ongoingFileDownloads = {};
|
|
@@ -368,7 +370,7 @@ export default class FilesDownloader {
|
|
|
368
370
|
releaseSemaphore();
|
|
369
371
|
return false;
|
|
370
372
|
}
|
|
371
|
-
const chunkDownloader = new ChunkDownloader(this.#transferId, file, chunk, this.#downloadState, this.#options, this.#fileserverClientFactory, this.#chunkStreamProviderFactory, this.#eventsEngine, this.#logger, this.#encryptionData);
|
|
373
|
+
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
374
|
const chunkPromise = chunkDownloader.download();
|
|
373
375
|
this.#ongoingChunkDownloads[chunk.id] = chunkPromise;
|
|
374
376
|
chunkPromise.finally(() => {
|
|
@@ -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\";\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 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 { ChunkStreamProviderEncryptionData } from \"../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\r\nimport type CryptographyProvider from \"../utils/crypto/cryptographyProvider.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 #downloadRegistrationMode: DownloadRegistrationMode;\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?: ChunkStreamProviderEncryptionData;\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 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.#downloadRegistrationMode = downloadRegistrationMode;\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): ChunkStreamProviderEncryptionData {\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 #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\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.#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 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
|
+
{"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 { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\nimport type CryptographyProvider from \"../utils/crypto/cryptographyProvider.js\";\nimport ChunkMD5ProviderFactory from \"./md5Provider/downloaderChunkMD5ProviderFactory.js\";\nimport ChunkStreamEncryptionData from \"../utils/fileSystem/chunkStreamEncryptionData.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 #chunkMD5ProviderFactory: ChunkMD5ProviderFactory<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?: ChunkStreamEncryptionData;\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 chunkMD5ProviderFactory: ChunkMD5ProviderFactory<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.#chunkMD5ProviderFactory = chunkMD5ProviderFactory;\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): ChunkStreamEncryptionData {\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.#chunkMD5ProviderFactory, 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 +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\";\
|
|
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}"]}
|
|
@@ -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\";\n\ninterface DownloaderChunkMD5Provider {\n getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string>;\n}\n\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\";\nimport DownloaderChunkMD5Provider from \"./downloaderChunkMD5Provider.js\";\n\ninterface DownloaderChunkMD5ProviderFactory<T extends string | File> {\n create(file: T, start: number, size: number, encryptionData?: ChunkStreamEncryptionData): DownloaderChunkMD5Provider\n}\n\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
|