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":"downloadFolderResolver.js","sourceRoot":"","sources":["../../../src/downloader/downloadFolderResolver.ts"],"names":[],"mappings":"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","sourcesContent":["import SimpleDateFormatter from \"../utils/dateAndTime/simpleDateFormatter.js\";\r\nimport type GetTransferResponse from \"../utils/api/dtos/getTransferResponse.js\";\r\n\r\nconst DefaultMaxPlaceholderLength = 60;\r\n\r\nexport default class DownloadFolderResolver {\r\n static #pathFriendlyDate(date: string): string {\r\n return date\r\n .replace(/:+/g, `-`)\r\n .replace(/-+/g, `-`);\r\n }\r\n\r\n static #sanitizePathElement(value: string | null | undefined): string {\r\n if (!value)\r\n return ``;\r\n\r\n return value\r\n .replaceAll(`..\\\\`, ``)\r\n .replaceAll(`../`, ``)\r\n .replaceAll(`..`, ``)\r\n .replaceAll(`:`, ``)\r\n .replaceAll(`<`, ``)\r\n .replaceAll(`>`, ``)\r\n .replaceAll(`\\\\`, ``)\r\n .replaceAll(`/`, ``)\r\n .replace(/(\\n|\\r\\n){1,}/g, ` `);\r\n }\r\n\r\n static #getDomain(fromEmail: string | null | undefined) {\r\n if (fromEmail) {\r\n const idx = fromEmail.indexOf(`@`);\r\n if (idx > -1)\r\n return fromEmail.substring(idx + 1);\r\n }\r\n return `[missing_domain]`;\r\n }\r\n\r\n static #escapeRegExp(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\/-]/g, `\\\\$&`);\r\n }\r\n\r\n static #placeholderRegexForSubstring = (token: string) => {\r\n // eslint-disable-next-line no-param-reassign\r\n token = this.#escapeRegExp(token);\r\n return new RegExp(`<${token}(:(.*?))?>`, `g`);\r\n };\r\n\r\n static #replacePlaceholderWithMaxLength(input: string, rx: RegExp, replaceValue: string): string {\r\n return input.replace(rx, (_0: any, _1: any, maxLength: string | undefined): string => {\r\n let substringLength = DefaultMaxPlaceholderLength;\r\n if (!!maxLength && maxLength.length > 0) {\r\n try {\r\n substringLength = parseInt(maxLength, 10);\r\n if (Number.isNaN(substringLength))\r\n substringLength = DefaultMaxPlaceholderLength;\r\n }\r\n catch {\r\n substringLength = DefaultMaxPlaceholderLength;\r\n }\r\n }\r\n\r\n const sanitized = DownloadFolderResolver.#sanitizePathElement(replaceValue);\r\n\r\n if (substringLength < 0)\r\n return sanitized.substring(sanitized.length + substringLength);\r\n\r\n return sanitized.substring(0, substringLength);\r\n });\r\n }\r\n\r\n static prepareDownloadFolder(template: string, transfer: GetTransferResponse) {\r\n let result = template;\r\n if (transfer.from) {\r\n const domain = DownloadFolderResolver.#getDomain(transfer.from);\r\n result = result\r\n .replaceAll(`<domain>`, DownloadFolderResolver.#sanitizePathElement(domain))\r\n .replaceAll(`<emailfrom>`, DownloadFolderResolver.#sanitizePathElement(transfer.from));\r\n }\r\n result = result.replaceAll(`<id>`, transfer.id);\r\n\r\n // datesent\r\n result = result.replace(/<datesent(:(.*?))?>/g, (_0: any, _1: any, dateFormatString: string | undefined): string => {\r\n const dateFormatted = SimpleDateFormatter.formatDateAndTimeLocal(transfer.sentdate, dateFormatString);\r\n return DownloadFolderResolver.#sanitizePathElement(DownloadFolderResolver.#pathFriendlyDate(dateFormatted));\r\n });\r\n\r\n if (transfer.message) {\r\n result = DownloadFolderResolver.#replacePlaceholderWithMaxLength(\r\n result,\r\n DownloadFolderResolver.#placeholderRegexForSubstring(`description`),\r\n transfer.message,\r\n );\r\n }\r\n\r\n if (transfer.subject) {\r\n result = DownloadFolderResolver.#replacePlaceholderWithMaxLength(\r\n result,\r\n DownloadFolderResolver.#placeholderRegexForSubstring(`subject`),\r\n transfer.subject,\r\n );\r\n }\r\n\r\n if (transfer.to && transfer.to.length) {\r\n result = DownloadFolderResolver.#replacePlaceholderWithMaxLength(\r\n result,\r\n DownloadFolderResolver.#placeholderRegexForSubstring(`emailto`),\r\n transfer.to.join(`,`),\r\n );\r\n }\r\n\r\n if (transfer.customfields && transfer.customfields.length) {\r\n for (const cf of transfer.customfields) {\r\n if (cf.label && cf.value) {\r\n result = DownloadFolderResolver.#replacePlaceholderWithMaxLength(\r\n result,\r\n DownloadFolderResolver.#placeholderRegexForSubstring(cf.label),\r\n cf.value,\r\n );\r\n }\r\n }\r\n }\r\n // remaining custom fields which have not bee replaced from transfer - remove them\r\n /*\r\n if (company && company.customfields && company.customfields.length) {\r\n for (const cf of company.customfields)\r\n result = result.replace(new RegExp(`<${cf.label}>`, `ig`), ``);\r\n }\r\n */\r\n\r\n // replace remaining < and > (they are used as placeholder boundaries) and other chars which are not allowed in Windows folder paths\r\n result = result.replace(/<([^:>]+)(?::([^>]*))?>/g, (_match, name) => {\r\n // Remove backslashes from the captured name\r\n const clean = String(name).replace(/\\\\/g, ``);\r\n return `[missing_${clean}]`;\r\n });\r\n\r\n if (process.platform === `win32`)\r\n result = DownloadFolderResolver.#trimFolders(result);\r\n\r\n return result;\r\n }\r\n\r\n static #trimFolders(template: string) {\r\n const folders = template.replaceAll(`/`, `\\\\`).split(`\\\\`);\r\n\r\n for (let i = 0; i < folders.length; i++)\r\n folders[i] = folders[i]!.trim();\r\n\r\n return folders.join(`\\\\`);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"downloadFolderResolver.js","sourceRoot":"","sources":["../../../src/downloader/downloadFolderResolver.ts"],"names":[],"mappings":"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","sourcesContent":["import SimpleDateFormatter from \"../utils/dateAndTime/simpleDateFormatter.js\";\nimport type GetTransferResponse from \"../utils/api/dtos/getTransferResponse.js\";\n\nconst DefaultMaxPlaceholderLength = 60;\n\nexport default class DownloadFolderResolver {\n static #pathFriendlyDate(date: string): string {\n return date\n .replace(/:+/g, `-`)\n .replace(/-+/g, `-`);\n }\n\n static #sanitizePathElement(value: string | null | undefined): string {\n if (!value)\n return ``;\n\n return value\n .replaceAll(`..\\\\`, ``)\n .replaceAll(`../`, ``)\n .replaceAll(`..`, ``)\n .replaceAll(`:`, ``)\n .replaceAll(`<`, ``)\n .replaceAll(`>`, ``)\n .replaceAll(`\\\\`, ``)\n .replaceAll(`/`, ``)\n .replace(/(\\n|\\r\\n){1,}/g, ` `);\n }\n\n static #getDomain(fromEmail: string | null | undefined) {\n if (fromEmail) {\n const idx = fromEmail.indexOf(`@`);\n if (idx > -1)\n return fromEmail.substring(idx + 1);\n }\n return `[missing_domain]`;\n }\n\n static #escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\/-]/g, `\\\\$&`);\n }\n\n static #placeholderRegexForSubstring = (token: string) => {\n // eslint-disable-next-line no-param-reassign\n token = this.#escapeRegExp(token);\n return new RegExp(`<${token}(:(.*?))?>`, `g`);\n };\n\n static #replacePlaceholderWithMaxLength(input: string, rx: RegExp, replaceValue: string): string {\n return input.replace(rx, (_0: any, _1: any, maxLength: string | undefined): string => {\n let substringLength = DefaultMaxPlaceholderLength;\n if (!!maxLength && maxLength.length > 0) {\n try {\n substringLength = parseInt(maxLength, 10);\n if (Number.isNaN(substringLength))\n substringLength = DefaultMaxPlaceholderLength;\n }\n catch {\n substringLength = DefaultMaxPlaceholderLength;\n }\n }\n\n const sanitized = DownloadFolderResolver.#sanitizePathElement(replaceValue);\n\n if (substringLength < 0)\n return sanitized.substring(sanitized.length + substringLength);\n\n return sanitized.substring(0, substringLength);\n });\n }\n\n static prepareDownloadFolder(template: string, transfer: GetTransferResponse) {\n let result = template;\n if (transfer.from) {\n const domain = DownloadFolderResolver.#getDomain(transfer.from);\n result = result\n .replaceAll(`<domain>`, DownloadFolderResolver.#sanitizePathElement(domain))\n .replaceAll(`<emailfrom>`, DownloadFolderResolver.#sanitizePathElement(transfer.from));\n }\n result = result.replaceAll(`<id>`, transfer.id);\n\n // datesent\n result = result.replace(/<datesent(:(.*?))?>/g, (_0: any, _1: any, dateFormatString: string | undefined): string => {\n const dateFormatted = SimpleDateFormatter.formatDateAndTimeLocal(transfer.sentdate, dateFormatString);\n return DownloadFolderResolver.#sanitizePathElement(DownloadFolderResolver.#pathFriendlyDate(dateFormatted));\n });\n\n if (transfer.message) {\n result = DownloadFolderResolver.#replacePlaceholderWithMaxLength(\n result,\n DownloadFolderResolver.#placeholderRegexForSubstring(`description`),\n transfer.message,\n );\n }\n\n if (transfer.subject) {\n result = DownloadFolderResolver.#replacePlaceholderWithMaxLength(\n result,\n DownloadFolderResolver.#placeholderRegexForSubstring(`subject`),\n transfer.subject,\n );\n }\n\n if (transfer.to && transfer.to.length) {\n result = DownloadFolderResolver.#replacePlaceholderWithMaxLength(\n result,\n DownloadFolderResolver.#placeholderRegexForSubstring(`emailto`),\n transfer.to.join(`,`),\n );\n }\n\n if (transfer.customfields && transfer.customfields.length) {\n for (const cf of transfer.customfields) {\n if (cf.label && cf.value) {\n result = DownloadFolderResolver.#replacePlaceholderWithMaxLength(\n result,\n DownloadFolderResolver.#placeholderRegexForSubstring(cf.label),\n cf.value,\n );\n }\n }\n }\n // remaining custom fields which have not bee replaced from transfer - remove them\n /*\n if (company && company.customfields && company.customfields.length) {\n for (const cf of company.customfields)\n result = result.replace(new RegExp(`<${cf.label}>`, `ig`), ``);\n }\n */\n\n // replace remaining < and > (they are used as placeholder boundaries) and other chars which are not allowed in Windows folder paths\n result = result.replace(/<([^:>]+)(?::([^>]*))?>/g, (_match, name) => {\n // Remove backslashes from the captured name\n const clean = String(name).replace(/\\\\/g, ``);\n return `[missing_${clean}]`;\n });\n\n if (process.platform === `win32`)\n result = DownloadFolderResolver.#trimFolders(result);\n\n return result;\n }\n\n static #trimFolders(template: string) {\n const folders = template.replaceAll(`/`, `\\\\`).split(`\\\\`);\n\n for (let i = 0; i < folders.length; i++)\n folders[i] = folders[i]!.trim();\n\n return folders.join(`\\\\`);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadLogger.js","sourceRoot":"","sources":["../../../src/downloader/downloadLogger.ts"],"names":[],"mappings":"AACA,OAAO,oBAAoB,MAAM,2CAA2C,CAAC;AAE7E,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,OAAO,CAAS;IAChB,WAAW,CAAkB;IAC7B,WAAW,CAAqB;IAChC,WAAW,CAAqB;IAEhC,YAAY,MAAc,EAAE,UAA2B;QACnD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,eAAe,CAAC,EAAU;QACtB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,eAAe,CAAC,EAAU;QACtB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,gBAAgB,CAAC,cAAwC;QACrD,MAAM,UAAU,GAA4B;YACxC,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,WAAW;YAC/D,GAAG,cAAc;SACpB,CAAC;QAEF,IAAI,IAAI,CAAC,WAAW;YAChB,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAE/E,IAAI,IAAI,CAAC,WAAW;YAChB,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAE/E,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,aAAa,CAAC,OAAe,EAAE,IAAU;QACrC,IAAI,IAAI;YACJ,OAAO,GAAG,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,IAAU,EAAE,cAAwC;QAC1E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,IAAU,EAAE,cAAwC;QAC1E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,IAAU,EAAE,cAAwC;QACzE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,IAAU,EAAE,cAAwC;QAC5E,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,QAAQ,CAAC,KAAY,EAAE,OAAgB,EAAE,IAAU,EAAE,cAAwC;QACzF,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IAC3F,CAAC;CACJ","sourcesContent":["import type Logger from \"../client/loggers/logger.js\";\
|
|
1
|
+
{"version":3,"file":"downloadLogger.js","sourceRoot":"","sources":["../../../src/downloader/downloadLogger.ts"],"names":[],"mappings":"AACA,OAAO,oBAAoB,MAAM,2CAA2C,CAAC;AAE7E,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,OAAO,CAAS;IAChB,WAAW,CAAkB;IAC7B,WAAW,CAAqB;IAChC,WAAW,CAAqB;IAEhC,YAAY,MAAc,EAAE,UAA2B;QACnD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,eAAe,CAAC,EAAU;QACtB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,eAAe,CAAC,EAAU;QACtB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,gBAAgB,CAAC,cAAwC;QACrD,MAAM,UAAU,GAA4B;YACxC,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,WAAW;YAC/D,GAAG,cAAc;SACpB,CAAC;QAEF,IAAI,IAAI,CAAC,WAAW;YAChB,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAE/E,IAAI,IAAI,CAAC,WAAW;YAChB,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAE/E,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,aAAa,CAAC,OAAe,EAAE,IAAU;QACrC,IAAI,IAAI;YACJ,OAAO,GAAG,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,IAAU,EAAE,cAAwC;QAC1E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,IAAU,EAAE,cAAwC;QAC1E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,IAAU,EAAE,cAAwC;QACzE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,IAAU,EAAE,cAAwC;QAC5E,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,QAAQ,CAAC,KAAY,EAAE,OAAgB,EAAE,IAAU,EAAE,cAAwC;QACzF,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;IAC3F,CAAC;CACJ","sourcesContent":["import type Logger from \"../client/loggers/logger.js\";\nimport logEventPropertyName from \"../utils/logging/logEventPropertyNames.js\";\n\nexport default class DownloadLogger implements Logger {\n #logger: Logger;\n #trackingId: string | number;\n #transferId: string | undefined;\n #downloadId: string | undefined;\n\n constructor(logger: Logger, trackingId: string | number) {\n this.#logger = logger;\n this.#trackingId = trackingId;\n }\n\n applyTransferId(id: string) {\n this.#transferId = id;\n }\n\n applyDownloadId(id: string) {\n this.#downloadId = id;\n }\n\n #buildCustomData(additionalArgs?: Record<string, unknown>) {\n const customData: Record<string, unknown> = {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n ...additionalArgs,\n };\n\n if (this.#transferId)\n customData[logEventPropertyName.TransferIdPropertyName] = this.#transferId;\n\n if (this.#downloadId)\n customData[logEventPropertyName.DownloadIdPropertyName] = this.#downloadId;\n\n return customData;\n }\n\n #buildMessage(message: string, json?: any) {\n if (json)\n return `${message}\\n${JSON.stringify(json, null, 2)}`;\n return message;\n }\n\n logTrace(message: string, json?: any, additionalArgs?: Record<string, unknown>) {\n this.#logger.logTrace(this.#buildMessage(message, json), this.#buildCustomData(additionalArgs));\n }\n\n logDebug(message: string, json?: any, additionalArgs?: Record<string, unknown>) {\n this.#logger.logDebug(this.#buildMessage(message, json), this.#buildCustomData(additionalArgs));\n }\n\n logInfo(message: string, json?: any, additionalArgs?: Record<string, unknown>) {\n this.#logger.logInfo(this.#buildMessage(message, json), this.#buildCustomData(additionalArgs));\n }\n\n logWarning(message: string, json?: any, additionalArgs?: Record<string, unknown>) {\n this.#logger.logWarning(this.#buildMessage(message, json), this.#buildCustomData(additionalArgs));\n }\n\n logError(error: Error, message?: string, json?: any, additionalArgs?: Record<string, unknown>) {\n const messageToBeLogged = !message ? undefined : this.#buildMessage(message, json);\n this.#logger.logError(error, messageToBeLogged, this.#buildCustomData(additionalArgs));\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadOptions.js","sourceRoot":"","sources":["../../../src/downloader/downloadOptions.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe;IACjB;;;OAGG;IACH,UAAU,GAAkB,IAAI,CAAC;IACjC;;;;;;;;;;;;OAYG;IACH,sBAAsB,GAAkB,IAAI,CAAC;IAC7C;;;;OAIG;IACH,cAAc,GAAkB,IAAI,CAAC;IACrC;;;OAGG;IACH,0BAA0B,GAAG,KAAK,CAAC;IACnC;;;;OAIG;IACH,aAAa,GAAG,CAAC,CAAC;IAClB;;;;;OAKG;IACH,cAAc,GAAG,CAAC,CAAC;IACnB;;;OAGG;IACH,gBAAgB,GAAG,EAAE,CAAC;IACtB;;;OAGG;IACH,SAAS,GAAkB,IAAI,CAAC;IAChC;;;OAGG;IACH,YAAY,GAAkB,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/C;;;OAGG;IACH,cAAc,GAAG,IAAI,CAAC;IACtB;;;OAGG;IACH,YAAY,GAAG,KAAK,CAAC;IACrB;;;OAGG;IACH,4BAA4B,GAAG,KAAK,CAAC;IACrC;;;;;OAKG;IACH,sBAAsB,GAAG,CAAC,CAAC;IAC3B;;;;OAIG;IACH,yCAAyC,GAAG,EAAE,CAAC;IAC/C;;;;;OAKG;IACH,oCAAoC,GAAG,IAAI,CAAC;IAC5C;;;OAGG;IACH,kBAAkB,GAAG,GAAG,CAAC;IACzB;;;OAGG;IACH,yBAAyB,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,8BAA8B,GAAG,IAAI,CAAC;IACtC;;;;;OAKG;IACH,uCAAuC,GAAG,KAAK,CAAC;IAChD;;;;;;OAMG;IACH,0BAA0B,GAAkB,IAAI,CAAC;IACjD;;;OAGG;IACH,8BAA8B,GAAG,IAAI,CAAC;IACtC;;;OAGG;IACH,oCAAoC,GAAG,IAAI,CAAC;IAC5C;;OAEG;IACH,UAAU,CAA8B;IACxC;;;OAGG;IACH,gBAAgB,GAAG,KAAK,CAAC;CAC5B;AAED,eAAe,eAAe,CAAC","sourcesContent":["class DownloadOptions {\
|
|
1
|
+
{"version":3,"file":"downloadOptions.js","sourceRoot":"","sources":["../../../src/downloader/downloadOptions.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe;IACjB;;;OAGG;IACH,UAAU,GAAkB,IAAI,CAAC;IACjC;;;;;;;;;;;;OAYG;IACH,sBAAsB,GAAkB,IAAI,CAAC;IAC7C;;;;OAIG;IACH,cAAc,GAAkB,IAAI,CAAC;IACrC;;;OAGG;IACH,0BAA0B,GAAG,KAAK,CAAC;IACnC;;;;OAIG;IACH,aAAa,GAAG,CAAC,CAAC;IAClB;;;;;OAKG;IACH,cAAc,GAAG,CAAC,CAAC;IACnB;;;OAGG;IACH,gBAAgB,GAAG,EAAE,CAAC;IACtB;;;OAGG;IACH,SAAS,GAAkB,IAAI,CAAC;IAChC;;;OAGG;IACH,YAAY,GAAkB,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/C;;;OAGG;IACH,cAAc,GAAG,IAAI,CAAC;IACtB;;;OAGG;IACH,YAAY,GAAG,KAAK,CAAC;IACrB;;;OAGG;IACH,4BAA4B,GAAG,KAAK,CAAC;IACrC;;;;;OAKG;IACH,sBAAsB,GAAG,CAAC,CAAC;IAC3B;;;;OAIG;IACH,yCAAyC,GAAG,EAAE,CAAC;IAC/C;;;;;OAKG;IACH,oCAAoC,GAAG,IAAI,CAAC;IAC5C;;;OAGG;IACH,kBAAkB,GAAG,GAAG,CAAC;IACzB;;;OAGG;IACH,yBAAyB,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,8BAA8B,GAAG,IAAI,CAAC;IACtC;;;;;OAKG;IACH,uCAAuC,GAAG,KAAK,CAAC;IAChD;;;;;;OAMG;IACH,0BAA0B,GAAkB,IAAI,CAAC;IACjD;;;OAGG;IACH,8BAA8B,GAAG,IAAI,CAAC;IACtC;;;OAGG;IACH,oCAAoC,GAAG,IAAI,CAAC;IAC5C;;OAEG;IACH,UAAU,CAA8B;IACxC;;;OAGG;IACH,gBAAgB,GAAG,KAAK,CAAC;CAC5B;AAED,eAAe,eAAe,CAAC","sourcesContent":["class DownloadOptions {\n /**\n * logintoken of the current user - used to fetch transfer (optionally also pwd-protected), company setup, register download\n * @default null\n */\n logintoken: string | null = null;\n /**\n * Path template where files should be downloaded. Provide this OR {@link downloadFolder}. Supports placeholders:\n * <id> - transferId\n * <subject>\n * <description>\n * <domain> - domain based on \"from\" email (e.g. user@example.com --> example.com)\n * <emailfrom>\n * <datesent> - will be formatted as \"YYYY-MM-DD-hh-mm\"\n * <datesent:format> - will be formatted according to \"format\"; supported placeholders in \"format\": YYYY, MM, DD, hh, mm\n * <emailto> - all recipients emails comma-separated\n * <{custom_field_label}> - specified custom field named by label will replaced with that custom field's value\n * @default null\n */\n downloadFolderTemplate: string | null = null;\n /**\n * The path where files should be downloaded. No placeholders. Provide this OR {@link downloadFolderTemplate}.\n * When {@link downloadFolderTemplate} is specified this value will be overwritten with the resolved (final) path.\n * @default null\n */\n downloadFolder: string | null = null;\n /**\n * HTTP request timeout for web api (not Fileserver) in milliseconds.\n * @default 60000\n */\n apiRequestTotalTimeoutInMs = 60000;\n /**\n * How many times to attempt HTTP requests towards web API (not Fileserver) e.g. when getting a transfer from the API.\n * @see https://github.com/sindresorhus/got#documentation\n * @default 3\n */\n apiRetryLimit = 3;\n /**\n * Maximum number (N) of chunks that can be downloaded in parallel. As soon as any single chunk is complete then next available chunk is started (to keep parallel chunks always at N).\n * - If there is one huge file with X chunks (X>N) - first N chunks will be picked up.\n * - If there are 2 files, each with 3 chunks and N=4 - both files will be started (all 3 chunks of first file and only 1st chunk of the 2nd file).\n * @default 8\n */\n parallelChunks = 8;\n /**\n * How many times to try write downloaded bytes of a chunk and optionally verify its MD5. Set to -1 to keep trying forever.\n * @default 20\n */\n maxWriteAttempts = 20;\n /**\n * The user-agent header that will be used for all fileserver GetFile requests.\n * @default null\n */\n userAgent: string | null = null;\n /**\n * Maximum size (S) of a chunk in bytes. When set to a number - downloader will split files into chunks of this size (size of last chunk) <= S. Set to null to download every file in one HTTPS request.\n * @default 50 * 1024 * 1024 (50MB) - this matches the default pre-calculated rangehashes on Fileservers.\n */\n maxChunkSize: number | null = 50 * 1024 * 1024;\n /**\n * When set to **true** downloader will verify MD5 after every chunk. This doesn't work for end to end encrypted transfers.\n * @efault true\n */\n checkChunksMd5 = true;\n /**\n * When set to **true** downloader will verify MD5 for every completed file (entire file). To use this feature provided the MD5 value in DownloadFileInfo passed to the downloader. This doesn't work for end to end encrypted transfers.\n * @note NOT SUPPORTED (YET)\n */\n checkFileMd5 = false;\n /**\n * How long should it take for HTTP library to throw error when no download data is pumped to response (milliseconds).\n * @default 30000\n */\n fileserverDownloadIdleTimeMs = 30000;\n /**\n * How many times to attempt a single HTTP download request against Fileserver's GetFile. Set this options to 0 to keep trying forever.\n * When set to 0 (retring forever) the downloader will report \"network problem\" after 10 failed attempts (via event and a status field).\n * When connectivity is back it will be reported with an event as well.\n * @default 0\n */\n fileserverAttemptLimit = 0;\n /**\n * Downloader will assume there is a \"network problem\" after this many consecutive network errors without any successful progress.\n * Set to -1 to disable this feature.\n * @default 10;\n */\n fileserverOfflineAfterConsecutiveAttempts = 10;\n /**\n * Once downloader sees a \"network problem\" it will retry every pending chunk with this interval (in milliseconds).\n * This interval will be also used to calculate exponential backoff between first network error and getting into \"network problem\" state\n * and also is the maximum interval of the exponential backoff.\n * @default 5000;\n */\n fileserverOfflineCheckIntervalMillis = 5000;\n /**\n * Number of milliseconds between progress events emitted by the downloader (throttling - they won't be emitted more often that this amount of time).\n * @default 100\n */\n progressTickMillis = 100;\n /**\n * If set to **true** ==> the downloader will delete those files which were being downloaded, but failed.\n * @default true\n */\n deleteFailedFilesFromDisk = true;\n /**\n * When set to **true** ==> after user requests download abort - the downloader will delete all files which it tried to download, no matter their size and status.\n * @default true\n */\n deleteAbortedDownloadsFromDisk = true;\n /**\n * When set to **true** ==> after download completes or is aborted - the downloader will delete the main download folder if it is empty (no files have been downloaded and there are no other files left over).\n * Default is false as usually the download folder is set to be the OS-special (e.g. on windows --> c:\\users\\jane\\Downloads). We don't want to try removing that.\n * Set this to **true** only if specifying custom download folders.\n * @default false\n */\n deleteEmptyDownloadFoldersAfterDownload = false;\n /**\n * When this path is specified (not null) then downloader will track download progress of each file within this folder.\n * Every download gets own subfolder (transferID_downloadID) with dumped options of the download (options.json) and files.json\n * which tracks all pending files. It will not contain completed files or those that have not started yet. Tracking is performed with\n * chunk-precision (not byte-precision). Worst case the download tracker may lose N chunks (N being the number of {@link parallelChunks}).\n * @default null\n */\n downloadTrackingBaseFolder: string | null = null;\n /**\n * Minimum time interval (in milliseconds) between consecutive dumps of downloader state to disk.\n * @default 5000\n */\n downloadTrackingIntervalMillis = 5000;\n /**\n * Time window length (in milliseconds) over which the downloader calculates momentary download speed.\n * @default 2000\n */\n momentaryDownloadSpeedTimespanMillis = 2000;\n /**\n * A value that will be appended to all log events.\n */\n trackingId: number | string | undefined;\n /**\n * Skips download registration if set to true\n * @default false\n */\n skipRegistration = false;\n}\n\nexport default DownloadOptions;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadFileChunkProgress.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadFileChunkProgress.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAC1C,EAAE,CAAS;IACX,WAAW,CAAS;IACpB,KAAK,CAAgB;IACrB,GAAG,CAAgB;IACnB,IAAI,CAAS;IACb,UAAU,CAAS;IACnB,OAAO,CAAS;IAChB,SAAS,CAAU;IACnB,MAAM,CAAU;IAEhB,YAAY,EAAU,EAAE,WAAmB,EAAE,KAAoB,EAAE,GAAkB,EAAE,IAAY,EAAE,UAAkB,EAAE,OAAe,EAAE,SAAkB,EAAE,MAAe;QACzK,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,KAA4B;QACpD,OAAO,IAAI,yBAAyB,CAChC,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,QAAQ,CACjB,CAAC;IACN,CAAC;CACJ","sourcesContent":["import type DownloadFileChunkInfo from \"../dtos/downloadFileChunkInfo.js\";\
|
|
1
|
+
{"version":3,"file":"downloadFileChunkProgress.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadFileChunkProgress.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAC1C,EAAE,CAAS;IACX,WAAW,CAAS;IACpB,KAAK,CAAgB;IACrB,GAAG,CAAgB;IACnB,IAAI,CAAS;IACb,UAAU,CAAS;IACnB,OAAO,CAAS;IAChB,SAAS,CAAU;IACnB,MAAM,CAAU;IAEhB,YAAY,EAAU,EAAE,WAAmB,EAAE,KAAoB,EAAE,GAAkB,EAAE,IAAY,EAAE,UAAkB,EAAE,OAAe,EAAE,SAAkB,EAAE,MAAe;QACzK,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,KAA4B;QACpD,OAAO,IAAI,yBAAyB,CAChC,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,QAAQ,CACjB,CAAC;IACN,CAAC;CACJ","sourcesContent":["import type DownloadFileChunkInfo from \"../dtos/downloadFileChunkInfo.js\";\n\nexport default class DownloadFileChunkProgress {\n id: string;\n chunkNumber: number;\n start: number | null;\n end: number | null;\n size: number;\n downloaded: number;\n percent: number;\n completed: boolean;\n failed: boolean;\n\n constructor(id: string, chunkNumber: number, start: number | null, end: number | null, size: number, downloaded: number, percent: number, completed: boolean, failed: boolean) {\n this.id = id;\n this.chunkNumber = chunkNumber;\n this.start = start;\n this.end = end;\n this.size = size;\n this.downloaded = downloaded;\n this.percent = percent;\n this.completed = completed;\n this.failed = failed;\n }\n\n public static FromChunkInfo(chunk: DownloadFileChunkInfo): DownloadFileChunkProgress {\n return new DownloadFileChunkProgress(\n chunk.id,\n chunk.chunkNumber,\n chunk.start,\n chunk.end,\n chunk.chunkSize,\n chunk.downloadedBytes,\n chunk.percent,\n chunk.isCompleted,\n chunk.isFailed,\n );\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadFileProgress.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadFileProgress.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACrC,EAAE,CAAS;IACX,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,YAAY,CAAS;IACrB,qBAAqB,CAAgB;IACrC,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,IAAI,CAAS;IACb,SAAS,CAAU;IACnB,MAAM,CAAU;IAChB,QAAQ,GAAyB,EAAE,CAAC;IACpC,MAAM,CAAS;IACf,WAAW,CAAgB;IAE3B,YACI,UAAkB,EAClB,IAAY,EACZ,GAAW,EACX,YAAoB,EACpB,qBAAoC,EACpC,IAAY,EACZ,UAAkB,EAClB,OAAe,EACf,SAAkB,EAClB,MAAe,EACf,QAAqC,EACrC,cAAsB,EACtB,mBAAkC;QAElC,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC;QACvC,IAAI,QAAQ;YACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAEM,MAAM,CAAC,oBAAoB,CAAC,IAAsB;QACrD,OAAO,IAAI,oBAAoB,CAC3B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,CAAC,MAAM,EAClB,IAAI,CAAC,yBAAyB,CACjC,CAAC;IACN,CAAC;CACJ","sourcesContent":["import type DownloadError from \"../dtos/downloadError.js\";\
|
|
1
|
+
{"version":3,"file":"downloadFileProgress.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadFileProgress.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACrC,EAAE,CAAS;IACX,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,YAAY,CAAS;IACrB,qBAAqB,CAAgB;IACrC,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,IAAI,CAAS;IACb,SAAS,CAAU;IACnB,MAAM,CAAU;IAChB,QAAQ,GAAyB,EAAE,CAAC;IACpC,MAAM,CAAS;IACf,WAAW,CAAgB;IAE3B,YACI,UAAkB,EAClB,IAAY,EACZ,GAAW,EACX,YAAoB,EACpB,qBAAoC,EACpC,IAAY,EACZ,UAAkB,EAClB,OAAe,EACf,SAAkB,EAClB,MAAe,EACf,QAAqC,EACrC,cAAsB,EACtB,mBAAkC;QAElC,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC;QACvC,IAAI,QAAQ;YACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAEM,MAAM,CAAC,oBAAoB,CAAC,IAAsB;QACrD,OAAO,IAAI,oBAAoB,CAC3B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,CAAC,MAAM,EAClB,IAAI,CAAC,yBAAyB,CACjC,CAAC;IACN,CAAC;CACJ","sourcesContent":["import type DownloadError from \"../dtos/downloadError.js\";\nimport type DownloadFileInfo from \"../dtos/downloadFileInfo.js\";\n\nexport default class DownloadFileProgress {\n id: string;\n name: string;\n url: string;\n downloadPath: string;\n temporaryDownloadPath: string | null;\n percent: number;\n downloaded: number;\n size: number;\n completed: boolean;\n failed: boolean;\n failures: Array<DownloadError> = [];\n chunks: number;\n lastOkChunk: number | null;\n\n constructor(\n externalId: string,\n name: string,\n url: string,\n downloadPath: string,\n temporaryDownloadPath: string | null,\n size: number,\n downloaded: number,\n percent: number,\n completed: boolean,\n failed: boolean,\n failures: Array<DownloadError> | null,\n numberOfChunks: number,\n lastSuccessfulChunk: number | null,\n ) {\n this.id = externalId;\n this.name = name;\n this.url = url;\n this.downloadPath = downloadPath;\n this.temporaryDownloadPath = temporaryDownloadPath;\n this.size = size;\n this.downloaded = downloaded;\n this.percent = percent;\n this.completed = completed;\n this.failed = failed;\n this.chunks = numberOfChunks;\n this.lastOkChunk = lastSuccessfulChunk;\n if (failures)\n this.failures = failures.slice();\n }\n\n public static FromFileDownloadInfo(file: DownloadFileInfo): DownloadFileProgress {\n return new DownloadFileProgress(\n file.externalId,\n file.name,\n file.url,\n file.downloadPath,\n file.temporaryDownloadPath,\n file.sizeInBytes,\n file.downloadedBytes,\n file.percent,\n file.isCompleted,\n file.isFailed,\n file.failures,\n file.chunks.length,\n file.lastSuccessfulChunkNumber,\n );\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadFilePromise.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadFilePromise.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACpC,OAAO,CAAS;IAChB,QAAQ,CAAkB;IAC1B,QAAQ,GAAgE,SAAS,CAAC;IAElF,YAAY,MAAc;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE;YAC1C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC5B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CACJ","sourcesContent":["export default class DownloadFilePromise {\
|
|
1
|
+
{"version":3,"file":"downloadFilePromise.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadFilePromise.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACpC,OAAO,CAAS;IAChB,QAAQ,CAAkB;IAC1B,QAAQ,GAAgE,SAAS,CAAC;IAElF,YAAY,MAAc;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE;YAC1C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC5B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CACJ","sourcesContent":["export default class DownloadFilePromise {\n #fileId: string;\n #promise: Promise<string>;\n #resolve: ((value: string | PromiseLike<string>) => void) | undefined = undefined;\n\n constructor(fileId: string) {\n this.#fileId = fileId;\n this.#promise = new Promise<string>(resolve => {\n this.#resolve = resolve;\n });\n }\n\n complete(): void {\n this.#resolve!(this.#fileId);\n }\n\n get awaiter(): Promise<string> {\n return this.#promise;\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadState.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadState.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport TransferDownloadEvent from \"../dtos/downloadEvent.js\";\r\nimport DownloadError from \"../dtos/downloadError.js\";\r\nimport DownloadFileProgress from \"./downloadFileProgress.js\";\r\nimport DownloadFileChunkProgress from \"./downloadFileChunkProgress.js\";\r\n\r\nimport type DownloadFileInfo from \"../dtos/downloadFileInfo.js\";\r\nimport type DownloadFileChunkInfo from \"../dtos/downloadFileChunkInfo.js\";\r\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\r\nimport type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\r\nimport type DownloadCompletedEventArgs from \"../eventArgs/downloadCompletedEventArgs.js\";\r\nimport type DownloadPauseEventArgs from \"../eventArgs/downloadPauseEventArgs.js\";\r\nimport type FileDownloadEventArgs from \"../eventArgs/fileDownloadEventArgs.js\";\r\nimport type FileDownloadFailedEventArgs from \"../eventArgs/fileDownloadFailedEventArgs.js\";\r\nimport type ChunkDownloadEventArgs from \"../eventArgs/chunkDownloadEventArgs.js\";\r\nimport type ChunkDownloadFailedEventArgs from \"../eventArgs/chunkDownloadFailedEventArgs.js\";\r\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\r\nimport type DownloaderRestoredState from \"../dtos/downloaderRestoredState.js\";\r\nimport type DownloadOptions from \"../downloadOptions.js\";\r\nimport type DownloadMetadataDeterminedEventArgs from \"../eventArgs/downloadMetadataDeterminedEventArgs.js\";\r\n\r\nexport default class DownloadState {\r\n readonly #transferId: string;\r\n readonly #downloadId: string;\r\n readonly #options: DownloadOptions;\r\n readonly #eventsEngine: EventsEngine;\r\n\r\n readonly #files: Array<DownloadFileInfo>;\r\n readonly #failedFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\r\n readonly #pendingFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\r\n\r\n #totalSize = 0;\r\n #networkStatus = true;\r\n #consecutiveNetworkErrors = 0;\r\n #status: TransferStatus = TransferStatus.Initialized;\r\n #firstStartedUnixEpochMillis: number | null = null;\r\n #startedUnixEpochMillis: number | null = null;\r\n #elapsedActiveMillis = 0;\r\n #lastProgressTickUnixEpochMillis: number | null = null;\r\n #lastSpeedCalc: number | null = null;\r\n #percent = 0;\r\n\r\n /**\r\n * How many bytes downloaded - counting only completed files.\r\n */\r\n #downloadedBytes_bank = 0;\r\n /**\r\n * How many bytes downloaded total (bank + pendingFiles).\r\n */\r\n #downloadedBytes = 0;\r\n\r\n #bytesPerSecondAverage = 0;\r\n #bytesPerSecondCurrent = 0;\r\n #currentSpeedMeasurementDownloadedBytes: Array<{ time: number, bytes: number }> = [];\r\n #estimatedRemainingTimeSeconds: number | null = null;\r\n #pauseImmediately = false;\r\n #pausedTriggers: Array<(pauseTriggered: boolean) => void> = [];\r\n #resumeResolve?: (status: TransferStatus) => void;\r\n\r\n constructor(downloadId: string, transferId: string, files: Array<DownloadFileInfo>, options: DownloadOptions, eventsEngine: EventsEngine, oldState?: DownloaderRestoredState) {\r\n this.#downloadId = downloadId;\r\n this.#transferId = transferId;\r\n this.#eventsEngine = eventsEngine;\r\n this.#files = files;\r\n this.#options = options;\r\n\r\n if (oldState) {\r\n this.#elapsedActiveMillis = oldState.activeTime;\r\n this.#downloadedBytes = oldState.downloadedBytes;\r\n this.#downloadedBytes_bank = oldState.downloadedBytesBank;\r\n this.#totalSize = oldState.totalSize;\r\n this.#percent = oldState.percent;\r\n }\r\n else {\r\n for (const file of this.#files)\r\n this.#totalSize += file.sizeInBytes;\r\n }\r\n }\r\n\r\n get isRunning(): boolean {\r\n return this.#status === TransferStatus.Running;\r\n }\r\n\r\n get status(): TransferStatus {\r\n return this.#status;\r\n }\r\n\r\n get hasFailedFiles(): boolean {\r\n return this.#failedFiles.size > 0;\r\n }\r\n\r\n get allFilesCompletedOrFailed(): boolean {\r\n return this.#files.every(x => x.isCompleted || x.isFailed);\r\n }\r\n\r\n get averageBytesPerSecond(): number {\r\n return this.#bytesPerSecondAverage;\r\n }\r\n\r\n get isThereNetworkProblem(): boolean {\r\n return this.#networkStatus === false;\r\n }\r\n\r\n get pauseImmediately(): boolean {\r\n return this.#pauseImmediately;\r\n }\r\n\r\n get currentState(): DownloadEventArgs {\r\n return this.#buildDownloadEventArgs();\r\n }\r\n\r\n get #nowUnixEpochMillis() {\r\n return new Date().getTime();\r\n }\r\n\r\n get #activeTimeMillis() {\r\n return this.#elapsedActiveMillis + this.#activeTimeMillisSinceLastStart;\r\n }\r\n\r\n get #activeTimeMillisSinceLastStart() {\r\n if (this.#startedUnixEpochMillis === null)\r\n return 0;\r\n\r\n return (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\r\n }\r\n\r\n get #totalTime() {\r\n if (this.#firstStartedUnixEpochMillis === null)\r\n return 0;\r\n\r\n return this.#nowUnixEpochMillis - this.#firstStartedUnixEpochMillis;\r\n }\r\n\r\n get #remainingBytes() {\r\n return this.#totalSize - this.#downloadedBytes;\r\n }\r\n\r\n get #isItTimeForGlobalProgressEvent(): boolean {\r\n return this.#lastProgressTickUnixEpochMillis === null || (this.#nowUnixEpochMillis - this.#lastProgressTickUnixEpochMillis) > this.#options.progressTickMillis;\r\n }\r\n\r\n start(): boolean {\r\n if (this.#status === TransferStatus.Initialized) { // can start only once!\r\n this.#status = TransferStatus.Running;\r\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\r\n this.#firstStartedUnixEpochMillis = this.#startedUnixEpochMillis;\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs(true);\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadStarted, args);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\r\n if (options.pausedTrigger)\r\n this.#pausedTriggers.push(options.pausedTrigger);\r\n\r\n if (this.#status === TransferStatus.Running) {\r\n this.#status = TransferStatus.Pausing;\r\n this.#pauseImmediately = options.interruptPendingChunks;\r\n\r\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\r\n }\r\n else if (this.#status === TransferStatus.Pausing && options.interruptPendingChunks && !this.#pauseImmediately) {\r\n this.#pauseImmediately = true;\r\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\r\n }\r\n else if (this.#status !== TransferStatus.Pausing && options.pausedTrigger) {\r\n this.#pausedTriggers = this.#pausedTriggers.filter(x => x !== options.pausedTrigger);\r\n options.pausedTrigger(false);\r\n }\r\n }\r\n\r\n paused(): Promise<TransferStatus | null> {\r\n if (this.#status === TransferStatus.Pausing) {\r\n this.#status = TransferStatus.Paused;\r\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\r\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\r\n this.#startedUnixEpochMillis = null;\r\n this.#lastSpeedCalc = null;\r\n this.#currentSpeedMeasurementDownloadedBytes = [];\r\n this.#estimatedRemainingTimeSeconds = null;\r\n this.#pauseImmediately = false;\r\n this.#eventsEngine.emit(TransferDownloadEvent.Paused, pauseArgs);\r\n\r\n const pausedTriggers = this.#pausedTriggers;\r\n this.#pausedTriggers = [];\r\n pausedTriggers.forEach(pausedTrigger => pausedTrigger(true));\r\n\r\n return new Promise(resolve => {\r\n this.#resumeResolve = resolve;\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n resume(): boolean {\r\n if (this.#status === TransferStatus.Pausing) {\r\n this.#status = TransferStatus.Running;\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\r\n return true;\r\n }\r\n if (this.#status === TransferStatus.Paused) {\r\n this.#status = TransferStatus.Running;\r\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\r\n if (this.#resumeResolve) {\r\n this.#resumeResolve(TransferStatus.Running);\r\n this.#resumeResolve = undefined;\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n requestAbort(): boolean {\r\n if (this.#status === TransferStatus.Running || this.#status === TransferStatus.Pausing || this.#status === TransferStatus.Paused) {\r\n this.#status = TransferStatus.Aborting;\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Aborting, args);\r\n if (this.#resumeResolve) {\r\n this.#resumeResolve(TransferStatus.Aborting);\r\n this.#resumeResolve = undefined;\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n aborted(): boolean {\r\n if (this.#status === TransferStatus.Aborting) {\r\n this.#status = TransferStatus.Aborted;\r\n if (this.#startedUnixEpochMillis !== null)\r\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Aborted, args);\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n fileStarting(file: DownloadFileInfo) {\r\n file.starting();\r\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarting, args);\r\n }\r\n\r\n fileCreating(file: DownloadFileInfo) {\r\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreating, args);\r\n }\r\n\r\n ensureFileStarted(file: DownloadFileInfo): void {\r\n if (!file.isStarted)\r\n this.#fileStarted(file);\r\n }\r\n\r\n fileCreated(file: DownloadFileInfo) {\r\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreated, args);\r\n }\r\n\r\n fileFailedById(fileId: string, reason: DownloadError) {\r\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\r\n this.fileFailed(actualFile, reason);\r\n }\r\n\r\n fileFailed(file: DownloadFileInfo, reason: DownloadError): void {\r\n if (file.isFailed === false) {\r\n file.fail(reason);\r\n const args: FileDownloadFailedEventArgs = {\r\n ...this.#buildFileDownloadEventArgs(file),\r\n reason,\r\n };\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadFailed, args);\r\n }\r\n\r\n this.#failedFiles.add(file);\r\n this.#pendingFiles.delete(file);\r\n }\r\n\r\n fileCompleted(fileId: string, finalDownloadPath: string): void {\r\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\r\n actualFile.complete(finalDownloadPath);\r\n const updatedArgs = this.#buildFileDownloadEventArgs(actualFile);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleted, updatedArgs);\r\n }\r\n\r\n fileCompleting(file: DownloadFileInfo): void {\r\n const removed = this.#pendingFiles.delete(file);\r\n if (removed || file.sizeInBytes === 0) {\r\n this.#downloadedBytes_bank += file.sizeInBytes;\r\n const fileArgs = this.#buildFileDownloadEventArgs(file!);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleting, fileArgs);\r\n }\r\n }\r\n\r\n chunkDownloadStarted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\r\n file.chunkStarted(chunk);\r\n const args: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadStarted, args);\r\n }\r\n\r\n chunkDownloadProgressed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, progress: ChunkProgressEvent): void {\r\n if (!file.isStarted)\r\n this.#fileStarted(file);\r\n\r\n this.networkOk();\r\n\r\n chunk.setProgress(progress.transferredBytesTotal);\r\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\r\n\r\n if (this.#isItTimeForFileProgressEvent(file))\r\n this.#fileProgressed(file);\r\n\r\n if (this.#isItTimeForGlobalProgressEvent)\r\n this.#progressed();\r\n }\r\n\r\n chunkDownloadCompleted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\r\n chunk.complete();\r\n file.chunkCompleted(chunk);\r\n file.updateProgress();\r\n\r\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\r\n\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadCompleted, chunkArgs);\r\n\r\n this.#tryCompleteFile(file);\r\n }\r\n\r\n chunkDownloadFailed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, reason: DownloadError): void {\r\n chunk.fail(reason);\r\n file.chunkFailed(chunk);\r\n\r\n const args: ChunkDownloadFailedEventArgs = {\r\n ...this.#buildChunkDownloadEventArgs(file, chunk),\r\n reason,\r\n };\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadFailed, args);\r\n\r\n // we've tried multiple times - but chunk still cannot be downloaded - fail this file\r\n this.fileFailed(file, reason);\r\n }\r\n\r\n completed(error?: Error): void {\r\n if (this.#status === TransferStatus.Completed || this.#status === TransferStatus.Failed)\r\n throw new DownloadError(`Download ${this.#downloadId} completion cannot be triggered in state ${TransferStatus[this.#status]}`);\r\n\r\n const failedFiles = this.#mapFailedFiles();\r\n\r\n if (!!error || failedFiles.length)\r\n this.#status = TransferStatus.Failed;\r\n else\r\n this.#status = TransferStatus.Completed;\r\n\r\n this.#progressed();\r\n\r\n const args: DownloadCompletedEventArgs = {\r\n ...this.#buildDownloadEventArgs(true),\r\n failedFiles,\r\n downloadError: error,\r\n };\r\n\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadCompleted, args);\r\n }\r\n\r\n registeringTransferDownload(): void {\r\n if (this.#status !== TransferStatus.Completed) {\r\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadRegistrationTriggered, args);\r\n }\r\n }\r\n\r\n registeringFileDownload(): void {\r\n if (this.#status !== TransferStatus.Completed) {\r\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadRegistrationTriggered, args);\r\n }\r\n }\r\n\r\n getCurrentState(withFiles: boolean): DownloadEventArgs {\r\n return this.#buildDownloadEventArgs(withFiles);\r\n }\r\n\r\n networkFailure() {\r\n this.#consecutiveNetworkErrors += 1;\r\n if (this.#options.fileserverOfflineAfterConsecutiveAttempts > -1\r\n && this.#consecutiveNetworkErrors > this.#options.fileserverOfflineAfterConsecutiveAttempts\r\n && this.#networkStatus === true) {\r\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\r\n this.#startedUnixEpochMillis = null;\r\n this.#lastSpeedCalc = null;\r\n this.#currentSpeedMeasurementDownloadedBytes = [];\r\n this.#estimatedRemainingTimeSeconds = null;\r\n this.#networkStatus = false;\r\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkFailure);\r\n }\r\n }\r\n\r\n networkOk() {\r\n this.#consecutiveNetworkErrors = 0;\r\n if (this.#networkStatus === false) {\r\n this.#networkStatus = true;\r\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\r\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkOk);\r\n }\r\n }\r\n\r\n possibleSupersizedFile(file: DownloadFileInfo) {\r\n // sometimes when FS returns too many bytes the file size could get bigger on disk than it was initially created with\r\n // truncate the file in this case\r\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\r\n this.#eventsEngine.emit(TransferDownloadEvent.PossibleSupersizedFile, fileArgs);\r\n }\r\n\r\n #progressed(): void {\r\n this.#updateProgress();\r\n\r\n const globalArgs: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadProgressed, globalArgs);\r\n }\r\n\r\n #fileProgressed(file: DownloadFileInfo): void {\r\n file.updateProgress();\r\n\r\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\r\n }\r\n\r\n #fileStarted(file: DownloadFileInfo): void {\r\n file.start();\r\n\r\n this.#pendingFiles.add(file);\r\n\r\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarted, args);\r\n }\r\n\r\n #tryCompleteFile(file: DownloadFileInfo): void {\r\n if (file.chunks.every(chunk => chunk.isCompleted))\r\n this.fileCompleting(file);\r\n }\r\n\r\n #isItTimeForFileProgressEvent(file: DownloadFileInfo): boolean {\r\n return file.lastProgressTick === null || (this.#nowUnixEpochMillis - file.lastProgressTick) > this.#options.progressTickMillis;\r\n }\r\n\r\n #buildFileDownloadEventArgs(file: DownloadFileInfo): FileDownloadEventArgs {\r\n return {\r\n transferId: this.#transferId,\r\n file: this.#mapFileProgress(file),\r\n activeTime: this.#activeTimeMillis,\r\n };\r\n }\r\n\r\n #buildChunkDownloadEventArgs(file: DownloadFileInfo, chunk: DownloadFileChunkInfo) {\r\n return {\r\n ...this.#buildFileDownloadEventArgs(file),\r\n chunk: this.#mapChunkProgress(chunk),\r\n };\r\n }\r\n\r\n #buildDownloadEventArgs(withFiles = false): DownloadEventArgs {\r\n return {\r\n status: this.#status,\r\n downloadId: this.#downloadId,\r\n transferId: this.#transferId,\r\n activeTimeMillis: this.#activeTimeMillis,\r\n totalTimeMillis: this.#totalTime,\r\n progressPercent: this.#percent,\r\n bytesPerSecondAverage: this.#bytesPerSecondAverage,\r\n bytesPerSecondCurrent: this.#bytesPerSecondCurrent,\r\n estimatedRemainingTimeSeconds: this.#estimatedRemainingTimeSeconds,\r\n totalSize: this.#totalSize,\r\n downloadedBytes: this.#downloadedBytes,\r\n files: withFiles ? this.#mapFilesProgress() : null,\r\n downloadBaseFolder: this.#options.downloadFolder!,\r\n };\r\n }\r\n\r\n notifyMetadataDetermined(fileServerUrl: string, region?: string) {\r\n const eventArgs: DownloadMetadataDeterminedEventArgs = { ...this.#buildDownloadEventArgs(), region, fileServerUrl };\r\n this.#eventsEngine.emit(TransferDownloadEvent.TransferMetadataDetermined, eventArgs);\r\n }\r\n\r\n #buildPauseDownloadEventArgs(): DownloadPauseEventArgs {\r\n return { ...this.#buildDownloadEventArgs(), interruptPendingChunks: this.#pauseImmediately };\r\n }\r\n\r\n #updateProgress(): void {\r\n const now = this.#nowUnixEpochMillis;\r\n this.#lastProgressTickUnixEpochMillis = now;\r\n\r\n this.#downloadedBytes = this.#downloadedBytes_bank;\r\n for (const file of this.#pendingFiles)\r\n this.#downloadedBytes += file.downloadedBytes;\r\n\r\n this.#currentSpeedMeasurementDownloadedBytes.push({ time: now, bytes: this.#downloadedBytes });\r\n\r\n if (this.#totalSize === 0)\r\n this.#percent = 100;\r\n else\r\n this.#percent = Math.min(100, (100 * this.#downloadedBytes) / this.#totalSize);\r\n\r\n // all-time bytes/sec\r\n const activeTime = this.#activeTimeMillis;\r\n if (activeTime > 0)\r\n this.#bytesPerSecondAverage = this.#downloadedBytes / (activeTime / 1000);\r\n\r\n const shouldWeCalculateSpeed = (this.#lastSpeedCalc === null && this.#activeTimeMillisSinceLastStart > 1500)\r\n || (this.#lastSpeedCalc !== null && (now - this.#lastSpeedCalc) > 200);\r\n\r\n if (shouldWeCalculateSpeed) {\r\n this.#lastSpeedCalc = now;\r\n\r\n // momentary bytes/sec\r\n const prev = this.#currentSpeedMeasurementDownloadedBytes[0]!;\r\n const timeDiff = now - prev.time;\r\n this.#bytesPerSecondCurrent = Math.max(0, this.#downloadedBytes - prev.bytes) / (timeDiff / 1000);\r\n if (timeDiff > this.#options.momentaryDownloadSpeedTimespanMillis)\r\n this.#currentSpeedMeasurementDownloadedBytes.shift();\r\n\r\n // remaining time (seconds) - based on momentary speed and remaining bytes to download - and smoothing factor\r\n if (this.#remainingBytes === 0)\r\n this.#estimatedRemainingTimeSeconds = 0;\r\n else if (this.#bytesPerSecondCurrent > 0) {\r\n const newRemaining = this.#remainingBytes / this.#bytesPerSecondCurrent;\r\n if (this.#estimatedRemainingTimeSeconds)\r\n this.#estimatedRemainingTimeSeconds = (0.7 * newRemaining) + (0.3 * this.#estimatedRemainingTimeSeconds);\r\n else\r\n this.#estimatedRemainingTimeSeconds = newRemaining;\r\n }\r\n }\r\n }\r\n\r\n #mapFilesProgress(): Array<DownloadFileProgress> {\r\n return this.#files.map(x => this.#mapFileProgress(x));\r\n }\r\n\r\n #mapFailedFiles(): Array<DownloadFileProgress> {\r\n const result: Array<DownloadFileProgress> = [];\r\n for (const x of this.#failedFiles)\r\n result.push(this.#mapFileProgress(x));\r\n return result;\r\n }\r\n\r\n #mapFileProgress(file: DownloadFileInfo): DownloadFileProgress {\r\n return DownloadFileProgress.FromFileDownloadInfo(file);\r\n }\r\n\r\n #mapChunkProgress(chunk: DownloadFileChunkInfo): DownloadFileChunkProgress {\r\n return DownloadFileChunkProgress.FromChunkInfo(chunk);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"downloadState.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadState.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferDownloadEvent from \"../dtos/downloadEvent.js\";\nimport DownloadError from \"../dtos/downloadError.js\";\nimport DownloadFileProgress from \"./downloadFileProgress.js\";\nimport DownloadFileChunkProgress from \"./downloadFileChunkProgress.js\";\n\nimport type DownloadFileInfo from \"../dtos/downloadFileInfo.js\";\nimport type DownloadFileChunkInfo from \"../dtos/downloadFileChunkInfo.js\";\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\nimport type DownloadCompletedEventArgs from \"../eventArgs/downloadCompletedEventArgs.js\";\nimport type DownloadPauseEventArgs from \"../eventArgs/downloadPauseEventArgs.js\";\nimport type FileDownloadEventArgs from \"../eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"../eventArgs/fileDownloadFailedEventArgs.js\";\nimport type ChunkDownloadEventArgs from \"../eventArgs/chunkDownloadEventArgs.js\";\nimport type ChunkDownloadFailedEventArgs from \"../eventArgs/chunkDownloadFailedEventArgs.js\";\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\nimport type DownloaderRestoredState from \"../dtos/downloaderRestoredState.js\";\nimport type DownloadOptions from \"../downloadOptions.js\";\nimport type DownloadMetadataDeterminedEventArgs from \"../eventArgs/downloadMetadataDeterminedEventArgs.js\";\n\nexport default class DownloadState {\n readonly #transferId: string;\n readonly #downloadId: string;\n readonly #options: DownloadOptions;\n readonly #eventsEngine: EventsEngine;\n\n readonly #files: Array<DownloadFileInfo>;\n readonly #failedFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\n readonly #pendingFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\n\n #totalSize = 0;\n #networkStatus = true;\n #consecutiveNetworkErrors = 0;\n #status: TransferStatus = TransferStatus.Initialized;\n #firstStartedUnixEpochMillis: number | null = null;\n #startedUnixEpochMillis: number | null = null;\n #elapsedActiveMillis = 0;\n #lastProgressTickUnixEpochMillis: number | null = null;\n #lastSpeedCalc: number | null = null;\n #percent = 0;\n\n /**\n * How many bytes downloaded - counting only completed files.\n */\n #downloadedBytes_bank = 0;\n /**\n * How many bytes downloaded total (bank + pendingFiles).\n */\n #downloadedBytes = 0;\n\n #bytesPerSecondAverage = 0;\n #bytesPerSecondCurrent = 0;\n #currentSpeedMeasurementDownloadedBytes: Array<{ time: number, bytes: number }> = [];\n #estimatedRemainingTimeSeconds: number | null = null;\n #pauseImmediately = false;\n #pausedTriggers: Array<(pauseTriggered: boolean) => void> = [];\n #resumeResolve?: (status: TransferStatus) => void;\n\n constructor(downloadId: string, transferId: string, files: Array<DownloadFileInfo>, options: DownloadOptions, eventsEngine: EventsEngine, oldState?: DownloaderRestoredState) {\n this.#downloadId = downloadId;\n this.#transferId = transferId;\n this.#eventsEngine = eventsEngine;\n this.#files = files;\n this.#options = options;\n\n if (oldState) {\n this.#elapsedActiveMillis = oldState.activeTime;\n this.#downloadedBytes = oldState.downloadedBytes;\n this.#downloadedBytes_bank = oldState.downloadedBytesBank;\n this.#totalSize = oldState.totalSize;\n this.#percent = oldState.percent;\n }\n else {\n for (const file of this.#files)\n this.#totalSize += file.sizeInBytes;\n }\n }\n\n get isRunning(): boolean {\n return this.#status === TransferStatus.Running;\n }\n\n get status(): TransferStatus {\n return this.#status;\n }\n\n get hasFailedFiles(): boolean {\n return this.#failedFiles.size > 0;\n }\n\n get allFilesCompletedOrFailed(): boolean {\n return this.#files.every(x => x.isCompleted || x.isFailed);\n }\n\n get averageBytesPerSecond(): number {\n return this.#bytesPerSecondAverage;\n }\n\n get isThereNetworkProblem(): boolean {\n return this.#networkStatus === false;\n }\n\n get pauseImmediately(): boolean {\n return this.#pauseImmediately;\n }\n\n get currentState(): DownloadEventArgs {\n return this.#buildDownloadEventArgs();\n }\n\n get #nowUnixEpochMillis() {\n return new Date().getTime();\n }\n\n get #activeTimeMillis() {\n return this.#elapsedActiveMillis + this.#activeTimeMillisSinceLastStart;\n }\n\n get #activeTimeMillisSinceLastStart() {\n if (this.#startedUnixEpochMillis === null)\n return 0;\n\n return (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n }\n\n get #totalTime() {\n if (this.#firstStartedUnixEpochMillis === null)\n return 0;\n\n return this.#nowUnixEpochMillis - this.#firstStartedUnixEpochMillis;\n }\n\n get #remainingBytes() {\n return this.#totalSize - this.#downloadedBytes;\n }\n\n get #isItTimeForGlobalProgressEvent(): boolean {\n return this.#lastProgressTickUnixEpochMillis === null || (this.#nowUnixEpochMillis - this.#lastProgressTickUnixEpochMillis) > this.#options.progressTickMillis;\n }\n\n start(): boolean {\n if (this.#status === TransferStatus.Initialized) { // can start only once!\n this.#status = TransferStatus.Running;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n this.#firstStartedUnixEpochMillis = this.#startedUnixEpochMillis;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs(true);\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadStarted, args);\n return true;\n }\n return false;\n }\n\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\n if (options.pausedTrigger)\n this.#pausedTriggers.push(options.pausedTrigger);\n\n if (this.#status === TransferStatus.Running) {\n this.#status = TransferStatus.Pausing;\n this.#pauseImmediately = options.interruptPendingChunks;\n\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\n }\n else if (this.#status === TransferStatus.Pausing && options.interruptPendingChunks && !this.#pauseImmediately) {\n this.#pauseImmediately = true;\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\n }\n else if (this.#status !== TransferStatus.Pausing && options.pausedTrigger) {\n this.#pausedTriggers = this.#pausedTriggers.filter(x => x !== options.pausedTrigger);\n options.pausedTrigger(false);\n }\n }\n\n paused(): Promise<TransferStatus | null> {\n if (this.#status === TransferStatus.Pausing) {\n this.#status = TransferStatus.Paused;\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#startedUnixEpochMillis = null;\n this.#lastSpeedCalc = null;\n this.#currentSpeedMeasurementDownloadedBytes = [];\n this.#estimatedRemainingTimeSeconds = null;\n this.#pauseImmediately = false;\n this.#eventsEngine.emit(TransferDownloadEvent.Paused, pauseArgs);\n\n const pausedTriggers = this.#pausedTriggers;\n this.#pausedTriggers = [];\n pausedTriggers.forEach(pausedTrigger => pausedTrigger(true));\n\n return new Promise(resolve => {\n this.#resumeResolve = resolve;\n });\n }\n return Promise.resolve(null);\n }\n\n resume(): boolean {\n if (this.#status === TransferStatus.Pausing) {\n this.#status = TransferStatus.Running;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\n return true;\n }\n if (this.#status === TransferStatus.Paused) {\n this.#status = TransferStatus.Running;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\n if (this.#resumeResolve) {\n this.#resumeResolve(TransferStatus.Running);\n this.#resumeResolve = undefined;\n }\n return true;\n }\n return false;\n }\n\n requestAbort(): boolean {\n if (this.#status === TransferStatus.Running || this.#status === TransferStatus.Pausing || this.#status === TransferStatus.Paused) {\n this.#status = TransferStatus.Aborting;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Aborting, args);\n if (this.#resumeResolve) {\n this.#resumeResolve(TransferStatus.Aborting);\n this.#resumeResolve = undefined;\n }\n return true;\n }\n return false;\n }\n\n aborted(): boolean {\n if (this.#status === TransferStatus.Aborting) {\n this.#status = TransferStatus.Aborted;\n if (this.#startedUnixEpochMillis !== null)\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Aborted, args);\n\n return true;\n }\n return false;\n }\n\n fileStarting(file: DownloadFileInfo) {\n file.starting();\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarting, args);\n }\n\n fileCreating(file: DownloadFileInfo) {\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreating, args);\n }\n\n ensureFileStarted(file: DownloadFileInfo): void {\n if (!file.isStarted)\n this.#fileStarted(file);\n }\n\n fileCreated(file: DownloadFileInfo) {\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreated, args);\n }\n\n fileFailedById(fileId: string, reason: DownloadError) {\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\n this.fileFailed(actualFile, reason);\n }\n\n fileFailed(file: DownloadFileInfo, reason: DownloadError): void {\n if (file.isFailed === false) {\n file.fail(reason);\n const args: FileDownloadFailedEventArgs = {\n ...this.#buildFileDownloadEventArgs(file),\n reason,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadFailed, args);\n }\n\n this.#failedFiles.add(file);\n this.#pendingFiles.delete(file);\n }\n\n fileCompleted(fileId: string, finalDownloadPath: string): void {\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\n actualFile.complete(finalDownloadPath);\n const updatedArgs = this.#buildFileDownloadEventArgs(actualFile);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleted, updatedArgs);\n }\n\n fileCompleting(file: DownloadFileInfo): void {\n const removed = this.#pendingFiles.delete(file);\n if (removed || file.sizeInBytes === 0) {\n this.#downloadedBytes_bank += file.sizeInBytes;\n const fileArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleting, fileArgs);\n }\n }\n\n chunkDownloadStarted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\n file.chunkStarted(chunk);\n const args: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadStarted, args);\n }\n\n chunkDownloadProgressed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, progress: ChunkProgressEvent): void {\n if (!file.isStarted)\n this.#fileStarted(file);\n\n this.networkOk();\n\n chunk.setProgress(progress.transferredBytesTotal);\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\n\n if (this.#isItTimeForFileProgressEvent(file))\n this.#fileProgressed(file);\n\n if (this.#isItTimeForGlobalProgressEvent)\n this.#progressed();\n }\n\n chunkDownloadCompleted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\n chunk.complete();\n file.chunkCompleted(chunk);\n file.updateProgress();\n\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadCompleted, chunkArgs);\n\n this.#tryCompleteFile(file);\n }\n\n chunkDownloadFailed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, reason: DownloadError): void {\n chunk.fail(reason);\n file.chunkFailed(chunk);\n\n const args: ChunkDownloadFailedEventArgs = {\n ...this.#buildChunkDownloadEventArgs(file, chunk),\n reason,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadFailed, args);\n\n // we've tried multiple times - but chunk still cannot be downloaded - fail this file\n this.fileFailed(file, reason);\n }\n\n completed(error?: Error): void {\n if (this.#status === TransferStatus.Completed || this.#status === TransferStatus.Failed)\n throw new DownloadError(`Download ${this.#downloadId} completion cannot be triggered in state ${TransferStatus[this.#status]}`);\n\n const failedFiles = this.#mapFailedFiles();\n\n if (!!error || failedFiles.length)\n this.#status = TransferStatus.Failed;\n else\n this.#status = TransferStatus.Completed;\n\n this.#progressed();\n\n const args: DownloadCompletedEventArgs = {\n ...this.#buildDownloadEventArgs(true),\n failedFiles,\n downloadError: error,\n };\n\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadCompleted, args);\n }\n\n registeringTransferDownload(): void {\n if (this.#status !== TransferStatus.Completed) {\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadRegistrationTriggered, args);\n }\n }\n\n registeringFileDownload(): void {\n if (this.#status !== TransferStatus.Completed) {\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadRegistrationTriggered, args);\n }\n }\n\n getCurrentState(withFiles: boolean): DownloadEventArgs {\n return this.#buildDownloadEventArgs(withFiles);\n }\n\n networkFailure() {\n this.#consecutiveNetworkErrors += 1;\n if (this.#options.fileserverOfflineAfterConsecutiveAttempts > -1\n && this.#consecutiveNetworkErrors > this.#options.fileserverOfflineAfterConsecutiveAttempts\n && this.#networkStatus === true) {\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n this.#startedUnixEpochMillis = null;\n this.#lastSpeedCalc = null;\n this.#currentSpeedMeasurementDownloadedBytes = [];\n this.#estimatedRemainingTimeSeconds = null;\n this.#networkStatus = false;\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkFailure);\n }\n }\n\n networkOk() {\n this.#consecutiveNetworkErrors = 0;\n if (this.#networkStatus === false) {\n this.#networkStatus = true;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkOk);\n }\n }\n\n possibleSupersizedFile(file: DownloadFileInfo) {\n // sometimes when FS returns too many bytes the file size could get bigger on disk than it was initially created with\n // truncate the file in this case\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.PossibleSupersizedFile, fileArgs);\n }\n\n #progressed(): void {\n this.#updateProgress();\n\n const globalArgs: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadProgressed, globalArgs);\n }\n\n #fileProgressed(file: DownloadFileInfo): void {\n file.updateProgress();\n\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\n }\n\n #fileStarted(file: DownloadFileInfo): void {\n file.start();\n\n this.#pendingFiles.add(file);\n\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarted, args);\n }\n\n #tryCompleteFile(file: DownloadFileInfo): void {\n if (file.chunks.every(chunk => chunk.isCompleted))\n this.fileCompleting(file);\n }\n\n #isItTimeForFileProgressEvent(file: DownloadFileInfo): boolean {\n return file.lastProgressTick === null || (this.#nowUnixEpochMillis - file.lastProgressTick) > this.#options.progressTickMillis;\n }\n\n #buildFileDownloadEventArgs(file: DownloadFileInfo): FileDownloadEventArgs {\n return {\n transferId: this.#transferId,\n file: this.#mapFileProgress(file),\n activeTime: this.#activeTimeMillis,\n };\n }\n\n #buildChunkDownloadEventArgs(file: DownloadFileInfo, chunk: DownloadFileChunkInfo) {\n return {\n ...this.#buildFileDownloadEventArgs(file),\n chunk: this.#mapChunkProgress(chunk),\n };\n }\n\n #buildDownloadEventArgs(withFiles = false): DownloadEventArgs {\n return {\n status: this.#status,\n downloadId: this.#downloadId,\n transferId: this.#transferId,\n activeTimeMillis: this.#activeTimeMillis,\n totalTimeMillis: this.#totalTime,\n progressPercent: this.#percent,\n bytesPerSecondAverage: this.#bytesPerSecondAverage,\n bytesPerSecondCurrent: this.#bytesPerSecondCurrent,\n estimatedRemainingTimeSeconds: this.#estimatedRemainingTimeSeconds,\n totalSize: this.#totalSize,\n downloadedBytes: this.#downloadedBytes,\n files: withFiles ? this.#mapFilesProgress() : null,\n downloadBaseFolder: this.#options.downloadFolder!,\n };\n }\n\n notifyMetadataDetermined(fileServerUrl: string, region?: string) {\n const eventArgs: DownloadMetadataDeterminedEventArgs = { ...this.#buildDownloadEventArgs(), region, fileServerUrl };\n this.#eventsEngine.emit(TransferDownloadEvent.TransferMetadataDetermined, eventArgs);\n }\n\n #buildPauseDownloadEventArgs(): DownloadPauseEventArgs {\n return { ...this.#buildDownloadEventArgs(), interruptPendingChunks: this.#pauseImmediately };\n }\n\n #updateProgress(): void {\n const now = this.#nowUnixEpochMillis;\n this.#lastProgressTickUnixEpochMillis = now;\n\n this.#downloadedBytes = this.#downloadedBytes_bank;\n for (const file of this.#pendingFiles)\n this.#downloadedBytes += file.downloadedBytes;\n\n this.#currentSpeedMeasurementDownloadedBytes.push({ time: now, bytes: this.#downloadedBytes });\n\n if (this.#totalSize === 0)\n this.#percent = 100;\n else\n this.#percent = Math.min(100, (100 * this.#downloadedBytes) / this.#totalSize);\n\n // all-time bytes/sec\n const activeTime = this.#activeTimeMillis;\n if (activeTime > 0)\n this.#bytesPerSecondAverage = this.#downloadedBytes / (activeTime / 1000);\n\n const shouldWeCalculateSpeed = (this.#lastSpeedCalc === null && this.#activeTimeMillisSinceLastStart > 1500)\n || (this.#lastSpeedCalc !== null && (now - this.#lastSpeedCalc) > 200);\n\n if (shouldWeCalculateSpeed) {\n this.#lastSpeedCalc = now;\n\n // momentary bytes/sec\n const prev = this.#currentSpeedMeasurementDownloadedBytes[0]!;\n const timeDiff = now - prev.time;\n this.#bytesPerSecondCurrent = Math.max(0, this.#downloadedBytes - prev.bytes) / (timeDiff / 1000);\n if (timeDiff > this.#options.momentaryDownloadSpeedTimespanMillis)\n this.#currentSpeedMeasurementDownloadedBytes.shift();\n\n // remaining time (seconds) - based on momentary speed and remaining bytes to download - and smoothing factor\n if (this.#remainingBytes === 0)\n this.#estimatedRemainingTimeSeconds = 0;\n else if (this.#bytesPerSecondCurrent > 0) {\n const newRemaining = this.#remainingBytes / this.#bytesPerSecondCurrent;\n if (this.#estimatedRemainingTimeSeconds)\n this.#estimatedRemainingTimeSeconds = (0.7 * newRemaining) + (0.3 * this.#estimatedRemainingTimeSeconds);\n else\n this.#estimatedRemainingTimeSeconds = newRemaining;\n }\n }\n }\n\n #mapFilesProgress(): Array<DownloadFileProgress> {\n return this.#files.map(x => this.#mapFileProgress(x));\n }\n\n #mapFailedFiles(): Array<DownloadFileProgress> {\n const result: Array<DownloadFileProgress> = [];\n for (const x of this.#failedFiles)\n result.push(this.#mapFileProgress(x));\n return result;\n }\n\n #mapFileProgress(file: DownloadFileInfo): DownloadFileProgress {\n return DownloadFileProgress.FromFileDownloadInfo(file);\n }\n\n #mapChunkProgress(chunk: DownloadFileChunkInfo): DownloadFileChunkProgress {\n return DownloadFileChunkProgress.FromChunkInfo(chunk);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadTracker.js","sourceRoot":"","sources":["../../../src/downloader/downloadTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mutex } from \"async-mutex\";\r\n\r\nimport DownloadError from \"./dtos/downloadError.js\";\r\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\r\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\r\nimport DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\r\nimport DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\r\nimport TransferStatus from \"../utils/types/transferStatus.js\";\r\n\r\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\r\nimport type FileSystemService from \"../utils/fileSystem/fileSystemService.js\";\r\nimport type DownloadOptions from \"./downloadOptions.js\";\r\nimport type DownloaderRestoredState from \"./dtos/downloaderRestoredState.js\";\r\nimport type DownloadTrackerFileInfo from \"./dtos/downloadTrackerFileInfo.js\";\r\nimport type DownloadTrackerProgressInfo from \"./dtos/downloadTrackerProgressInfo.js\";\r\nimport type ChunkDownloadEventArgs from \"./eventArgs/chunkDownloadEventArgs.js\";\r\nimport type DownloadPauseEventArgs from \"./eventArgs/downloadPauseEventArgs.js\";\r\nimport type FileDownloadEventArgs from \"./eventArgs/fileDownloadEventArgs.js\";\r\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\r\nimport type DownloadTrackingFailedEventArgs from \"./eventArgs/downloadTrackingFailedEventArgs.js\";\r\nimport type DownloadCompletedEventArgs from \"./eventArgs/downloadCompletedEventArgs.js\";\r\nimport type DownloadTrackerFileProgressInfo from \"./dtos/downloadTrackerFileProgressInfo.js\";\r\nimport type DownloadTrackingMetadata from \"./dtos/downloadTrackingMetadata.js\";\r\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\r\n\r\nexport default class DownloadTracker {\r\n readonly #downloadId: string;\r\n readonly #fileSystem: FileSystemService;\r\n readonly #trackingPath: string;\r\n readonly #eventsEngine: EventsEngine;\r\n readonly #options: DownloadOptions;\r\n readonly #metadata: DownloadTrackingMetadata;\r\n readonly #filesMutex: Mutex;\r\n\r\n #progressIntervalTimer: ReturnType<typeof setInterval> | null = null;\r\n #allFiles: Record<string, DownloadTrackerFileInfo> = {};\r\n #progress: DownloadTrackerProgressInfo = { activeTime: 0, trackedFiles: {} };\r\n #running = false;\r\n #restored = false;\r\n #filesChanged = false;\r\n #progressChanged = false;\r\n #canTrack = false;\r\n\r\n constructor(downloadId: string, options: DownloadOptions, fileSystem: FileSystemService, eventsEngine: EventsEngine, e2eeData?: DownloadCommandE2eeData, region?: string) {\r\n if (!options.downloadTrackingBaseFolder)\r\n throw new DownloadError(`Download tracker cannot be created - tracking folder is not specified`);\r\n\r\n this.#downloadId = downloadId;\r\n this.#options = options;\r\n this.#metadata = this.createMetadata(region, e2eeData);\r\n this.#fileSystem = fileSystem;\r\n this.#eventsEngine = eventsEngine;\r\n this.#trackingPath = DownloadTracker.getTrackingPath(downloadId, options.downloadTrackingBaseFolder, fileSystem);\r\n this.#filesMutex = new Mutex();\r\n }\r\n\r\n private createMetadata(region: string | undefined, e2eeData?: DownloadCommandE2eeData): DownloadTrackingMetadata {\r\n if (!e2eeData)\r\n return { region };\r\n\r\n return {\r\n region,\r\n e2eeData:\r\n {\r\n ivAsHex: e2eeData.iv.toString(`hex`),\r\n keyAsHex: e2eeData.key.toString(`hex`),\r\n },\r\n };\r\n }\r\n\r\n private static getTrackingPath(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService) {\r\n return fileSystem.pathJoin(downloadTrackingBaseFolder, downloadId);\r\n }\r\n\r\n get #filesPath(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `files.json`);\r\n }\r\n\r\n get #filesPathTemp(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `files.tmp`);\r\n }\r\n\r\n get #optionsFilePath(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `options.json`);\r\n }\r\n\r\n private static getMetadataFilePath(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService): string {\r\n const trackingPath = DownloadTracker.getTrackingPath(downloadId, downloadTrackingBaseFolder, fileSystem);\r\n return fileSystem.pathJoin(trackingPath, `metadata.json`);\r\n }\r\n\r\n get #metadataFilePath(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `metadata.json`);\r\n }\r\n\r\n get #progressPath(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `progress.json`);\r\n }\r\n\r\n get #progressPathTemp(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `progress.tmp`);\r\n }\r\n\r\n #addEventListeners() {\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileCreated, this.#onFileCreated);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadStarting, this.#onFileStarting);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.ChunkDownloadCompleted, this.#onChunkCompleted);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Paused, this.#onPaused);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Aborted, this.#onAborted);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.DownloadCompleted, this.#onCompleted);\r\n }\r\n\r\n #removeEventListeners() {\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileCreated, this.#onFileCreated);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadStarting, this.#onFileStarting);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.ChunkDownloadCompleted, this.#onChunkCompleted);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Paused, this.#onPaused);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Aborted, this.#onAborted);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.DownloadCompleted, this.#onCompleted);\r\n }\r\n\r\n #onFileCreated = async (args: FileDownloadEventArgs) => {\r\n const file = this.#allFiles[args.file.id]!;\r\n if (file.tdp !== args.file.temporaryDownloadPath) {\r\n file.tdp = args.file.temporaryDownloadPath;\r\n this.#filesChanged = true;\r\n }\r\n };\r\n\r\n #onFileStarting = async (args: FileDownloadEventArgs) => {\r\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\r\n if (pendingFile.wr === false) {\r\n pendingFile.wr = true;\r\n this.#progress.activeTime = args.activeTime;\r\n this.#progressChanged = true;\r\n }\r\n };\r\n\r\n #onFileCompleted = async (args: FileDownloadEventArgs) => {\r\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\r\n pendingFile.c = args.file.completed;\r\n pendingFile.er = args.file.failed;\r\n pendingFile.ok = args.file.lastOkChunk;\r\n pendingFile.ec = null;\r\n this.#progress.activeTime = args.activeTime;\r\n this.#progressChanged = true;\r\n\r\n const file = this.#allFiles[args.file.id]!;\r\n if (file.dp !== args.file.downloadPath) {\r\n file.dp = args.file.downloadPath;\r\n this.#filesChanged = true;\r\n }\r\n };\r\n\r\n #onFileFailed = async (args: FileDownloadFailedEventArgs) => {\r\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\r\n pendingFile.c = args.file.completed;\r\n pendingFile.er = args.file.failed;\r\n pendingFile.ok = args.file.lastOkChunk;\r\n pendingFile.ec = this.#toTrackedFailureCode(args.reason);\r\n this.#progress.activeTime = args.activeTime;\r\n this.#progressChanged = true;\r\n };\r\n\r\n #onChunkCompleted = async (args: ChunkDownloadEventArgs) => {\r\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\r\n pendingFile.c = args.file.completed;\r\n pendingFile.er = args.file.failed;\r\n pendingFile.ok = args.file.lastOkChunk;\r\n pendingFile.ec = null;\r\n this.#progress.activeTime = args.activeTime;\r\n this.#progressChanged = true;\r\n };\r\n\r\n #onPaused = async (args: DownloadPauseEventArgs) => {\r\n this.#progress.activeTime = args.activeTimeMillis;\r\n this.#progressChanged = true;\r\n };\r\n\r\n #onAborted = async () => {\r\n await this.#cleanUp(true);\r\n };\r\n\r\n #onCompleted = async (args: DownloadCompletedEventArgs) => {\r\n const removeTracking = args.status === TransferStatus.Completed;\r\n\r\n if (!removeTracking)\r\n await this.#dumpAllProgress();\r\n\r\n await this.#cleanUp(removeTracking);\r\n };\r\n\r\n #toTrackedFailureCode(error: DownloadError): DownloadErrorCode | null {\r\n if (error.errorCode !== null)\r\n return error.errorCode;\r\n\r\n if (DownloadTracker.#extractErrorCode(error) === `ENOSPC`)\r\n return DownloadErrorCode.DiskFull;\r\n\r\n return null;\r\n }\r\n\r\n static #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 async #cleanUp(removeTracking: boolean) {\r\n this.#running = false;\r\n this.#progressChanged = false;\r\n this.#filesChanged = false;\r\n if (this.#progressIntervalTimer !== null) {\r\n clearInterval(this.#progressIntervalTimer);\r\n this.#progressIntervalTimer = null;\r\n }\r\n this.#removeEventListeners();\r\n this.#allFiles = {};\r\n this.#progress = { activeTime: 0, trackedFiles: {} };\r\n\r\n if (removeTracking)\r\n await DownloadTracker.removeDownloadTrackingFolder(this.#downloadId, this.#options.downloadTrackingBaseFolder!, this.#fileSystem);\r\n }\r\n\r\n async #dumpOptions() {\r\n await this.#fileSystem.writeFile(this.#optionsFilePath, JSON.stringify(this.#options));\r\n }\r\n\r\n async #dumpMetadata() {\r\n await this.#fileSystem.writeFile(this.#metadataFilePath, JSON.stringify(this.#metadata));\r\n }\r\n\r\n async #dumpDownloaderFiles() {\r\n // write to disk - then rename: rename will be much faster than write (potentially few/few dozens MB) - minimizing risk of getting corrupt progress file on disk\r\n await this.#fileSystem.writeFile(this.#filesPathTemp, JSON.stringify(this.#allFiles));\r\n await this.#fileSystem.renameFile(this.#filesPathTemp, this.#filesPath);\r\n }\r\n\r\n async #dumpDownloaderProgress() {\r\n // write to disk - then rename: rename will be much faster than write (potentially few/few dozens MB) - minimizing risk of getting corrupt progress file on disk\r\n await this.#fileSystem.writeFile(this.#progressPathTemp, JSON.stringify(this.#progress));\r\n await this.#fileSystem.renameFile(this.#progressPathTemp, this.#progressPath);\r\n }\r\n\r\n #throwIfRunning() {\r\n if (this.#running)\r\n throw new DownloadError(`This download tracker is already running. Please create a new one.`);\r\n }\r\n\r\n private static async throwIfPathDoesntExist(path: string, reason: string, errorCode: DownloadErrorCode, fileSystem: FileSystemService) {\r\n if ((await fileSystem.pathExists(path)) === false)\r\n throw new DownloadError(reason, undefined, errorCode);\r\n }\r\n\r\n async #dumpAllProgress(): Promise<void> {\r\n await this.#filesMutex.runExclusive(async () => {\r\n try {\r\n if (this.#progressChanged) {\r\n this.#progressChanged = false;\r\n await this.#dumpDownloaderProgress();\r\n }\r\n if (this.#filesChanged) {\r\n this.#filesChanged = false;\r\n await this.#dumpDownloaderFiles();\r\n }\r\n }\r\n catch (err) {\r\n // When this event is emitted it means for the the caller that restoring interrupted download won't be able to recover\r\n // all downloaded data - but only some part of it. In general it is safe to continue after this event,\r\n // just keep in mind tracking data is not up-to-date.\r\n // Also note: in many cases tracking data will not be used at all (only when download was interrupted - by app restart, pc reboot etc.).\r\n const args: DownloadTrackingFailedEventArgs = {\r\n reason: `Could not update tracking data - recovering this transfer may re-download more data than needed ${this.#downloadId} @ ${this.#trackingPath}`,\r\n error: err as Error,\r\n errorCode: DownloadErrorCode.TrackingDataOutdated,\r\n downloadId: this.#downloadId,\r\n };\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadTrackingFailed, args);\r\n }\r\n });\r\n }\r\n\r\n #setupProgressTimer() {\r\n this.#progressIntervalTimer = setInterval(async () => {\r\n await this.#dumpAllProgress();\r\n }, this.#options.downloadTrackingIntervalMillis);\r\n }\r\n\r\n async #shouldPendingFileBeRestarted(file: DownloadFileInfo) {\r\n return file.wasEverWritten\r\n && (!file.temporaryDownloadPath || (await this.#fileSystem.pathExists(file.temporaryDownloadPath!)) === false);\r\n }\r\n\r\n async #restoreSingleFile(restoredFileId: string, restoredFile: DownloadTrackerFileInfo) {\r\n const fileTrack = this.#progress.trackedFiles[restoredFileId]!;\r\n const file = new DownloadFileInfo(restoredFileId, restoredFile.u, restoredFile.n, restoredFile.s, restoredFile.dp, restoredFile.cc, restoredFile.tdp);\r\n let fileWasReset = false;\r\n\r\n file.wasEverWritten = fileTrack.wr;\r\n file.isCompleted = fileTrack.c;\r\n file.isFailed = fileTrack.er;\r\n file.lastSuccessfulChunkNumber = fileTrack.ok;\r\n\r\n if (this.#shouldRetryFailedFile(fileTrack)) {\r\n fileTrack.er = false;\r\n fileTrack.ec = null;\r\n file.isFailed = false;\r\n fileWasReset = true;\r\n }\r\n\r\n if (file.isCompleted || file.isFailed)\r\n // let's save some cpu time on restoring chunk collection for file which will never be picked up\r\n file.downloadedBytes_bank = file.sizeInBytes;\r\n else {\r\n const shouldFileBeReset = await this.#shouldPendingFileBeRestarted(file);\r\n\r\n if (shouldFileBeReset) {\r\n // it maye happen that disk state is de-synced from the progress tracking file (the file.temporaryDownloadPath is gone)\r\n // in this case we want to simply re-start the file\r\n fileTrack.wr = false;\r\n fileTrack.ok = null;\r\n fileWasReset = true;\r\n\r\n file.wasEverWritten = false;\r\n file.lastSuccessfulChunkNumber = null;\r\n }\r\n\r\n for (let chunkIndex = 0; chunkIndex < file.chunkCount; chunkIndex++) {\r\n const chunk = this.#restoreSingleChunkInfo(file, chunkIndex, fileTrack);\r\n file.chunks.push(chunk);\r\n if (chunk.isCompleted)\r\n file.downloadedBytes_bank += chunk.chunkSize;\r\n }\r\n }\r\n\r\n // this method will update file.downloadedBytes properly based on file.downloadedBytes_bank\r\n // (and theoretically also based on file.#pendingChunks - but when restoring state #pendingChunks is always empty)\r\n file.updateProgress();\r\n\r\n return { file, fileWasReset };\r\n }\r\n\r\n #restoreSingleChunkInfo(file: DownloadFileInfo, chunkIndex: number, fileTrack: DownloadTrackerFileProgressInfo) {\r\n const chunk = new DownloadFileChunkInfo(file, chunkIndex, this.#options.maxChunkSize ?? null);\r\n chunk.isCompleted = fileTrack.ok !== null && chunkIndex <= fileTrack.ok;\r\n if (chunk.isCompleted)\r\n chunk.setProgress(chunk.chunkSize);\r\n return chunk;\r\n }\r\n\r\n #shouldRetryFailedFile(fileTrack: DownloadTrackerFileProgressInfo): boolean {\r\n return fileTrack.er === true && fileTrack.c === false;\r\n }\r\n\r\n async start(allFiles: Array<DownloadFileInfo>) {\r\n this.#throwIfRunning();\r\n\r\n this.#running = true;\r\n\r\n if (this.#restored === false) {\r\n for (const file of allFiles) {\r\n this.#progress.trackedFiles[file.externalId] = {\r\n c: file.isCompleted,\r\n er: file.isFailed,\r\n ok: file.lastSuccessfulChunkNumber,\r\n wr: file.wasEverWritten,\r\n ec: null,\r\n };\r\n this.#allFiles[file.externalId] = {\r\n u: file.url,\r\n s: file.sizeInBytes,\r\n n: file.name,\r\n dp: file.downloadPath,\r\n tdp: file.temporaryDownloadPath,\r\n cc: file.chunkCount,\r\n };\r\n }\r\n await this.#filesMutex.runExclusive(async () => {\r\n try {\r\n await this.#fileSystem.createFolder(this.#trackingPath);\r\n await this.#dumpOptions();\r\n await this.#dumpMetadata();\r\n await this.#dumpDownloaderFiles();\r\n await this.#dumpDownloaderProgress();\r\n this.#canTrack = true;\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not create tracking folder - recovering this transfer will not be possible ${this.#downloadId} @ ${this.#trackingPath}`, { cause: err as Error }, DownloadErrorCode.TrackingNotAvailable);\r\n }\r\n });\r\n }\r\n else\r\n this.#canTrack = true;\r\n\r\n if (this.#canTrack) {\r\n this.#addEventListeners();\r\n this.#setupProgressTimer();\r\n }\r\n }\r\n\r\n async restoreDownloadOptions() {\r\n await DownloadTracker.throwIfPathDoesntExist(this.#optionsFilePath, `Options file \"${this.#optionsFilePath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\r\n try {\r\n const optionsFile = await this.#fileSystem.readFileAsString(this.#optionsFilePath);\r\n const options: DownloadOptions = JSON.parse(optionsFile);\r\n return options;\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not read download options information ${this.#downloadId} @ ${this.#optionsFilePath}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\r\n }\r\n }\r\n\r\n static async restoreDownloadMetadata(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService): Promise<DownloadTrackingMetadata> {\r\n const metadataFilePath = this.getMetadataFilePath(downloadId, downloadTrackingBaseFolder, fileSystem);\r\n\r\n await this.throwIfPathDoesntExist(metadataFilePath, `Metadata file \"${metadataFilePath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, fileSystem);\r\n\r\n try {\r\n const metadataFile = await fileSystem.readFileAsString(metadataFilePath);\r\n return JSON.parse(metadataFile);\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not read download metadata information ${downloadId} @ ${metadataFilePath}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\r\n }\r\n }\r\n\r\n async restoreDownloaderState(): Promise<{ state: DownloaderRestoredState, files: Array<DownloadFileInfo> }> {\r\n await DownloadTracker.throwIfPathDoesntExist(this.#filesPath, `Filesinfo file \"${this.#filesPath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\r\n await DownloadTracker.throwIfPathDoesntExist(this.#progressPath, `Tracking file \"${this.#progressPath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\r\n\r\n try {\r\n this.#allFiles = JSON.parse(await this.#fileSystem.readFileAsString(this.#filesPath));\r\n this.#progress = JSON.parse(await this.#fileSystem.readFileAsString(this.#progressPath));\r\n this.#restored = true;\r\n\r\n let totalSize = 0;\r\n let downloadedBytes = 0;\r\n let downloadedBytesBank = 0;\r\n let repeatProgressDump = false;\r\n const files: Array<DownloadFileInfo> = [];\r\n\r\n for (const [restoredFileId, restoredFile] of Object.entries(this.#allFiles)) {\r\n const { file, fileWasReset } = await this.#restoreSingleFile(restoredFileId, restoredFile);\r\n\r\n if (fileWasReset)\r\n repeatProgressDump = true;\r\n\r\n downloadedBytes += file.downloadedBytes;\r\n\r\n if (file.isCompleted)\r\n downloadedBytesBank += file.sizeInBytes;\r\n\r\n files.push(file);\r\n totalSize += file.sizeInBytes;\r\n }\r\n\r\n if (repeatProgressDump) {\r\n // some tracking info might have been updated (corrected) in above loop\r\n // persisting this makes sure we have most correct state in the progress tracking file\r\n // (e.g. some unconfirmed pending files might be deleted by end users etc.)\r\n await this.#dumpDownloaderProgress();\r\n }\r\n\r\n return {\r\n files,\r\n state: {\r\n activeTime: this.#progress.activeTime,\r\n downloadedBytes,\r\n downloadedBytesBank,\r\n totalSize,\r\n percent: totalSize === 0 ? 100 : ((100 * downloadedBytes) / totalSize),\r\n },\r\n };\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not read download tracking information ${this.#downloadId}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\r\n }\r\n }\r\n\r\n static async removeDownloadTrackingFolder(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService) {\r\n const filesMutex = new Mutex();\r\n const trackingPath = DownloadTracker.getTrackingPath(downloadId, downloadTrackingBaseFolder, fileSystem);\r\n\r\n await filesMutex.runExclusive(async () => {\r\n try {\r\n await fileSystem.deleteFolder(trackingPath);\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not remove tracking folder - ${downloadId} @ ${trackingPath}`, { cause: err as Error }, DownloadErrorCode.TrackingCleanupFailed);\r\n }\r\n });\r\n }\r\n\r\n async saveState(): Promise<void> {\r\n await this.#dumpAllProgress();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"downloadTracker.js","sourceRoot":"","sources":["../../../src/downloader/downloadTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mutex } from \"async-mutex\";\n\nimport DownloadError from \"./dtos/downloadError.js\";\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\nimport DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\nimport TransferStatus from \"../utils/types/transferStatus.js\";\n\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\nimport type FileSystemService from \"../utils/fileSystem/fileSystemService.js\";\nimport type DownloadOptions from \"./downloadOptions.js\";\nimport type DownloaderRestoredState from \"./dtos/downloaderRestoredState.js\";\nimport type DownloadTrackerFileInfo from \"./dtos/downloadTrackerFileInfo.js\";\nimport type DownloadTrackerProgressInfo from \"./dtos/downloadTrackerProgressInfo.js\";\nimport type ChunkDownloadEventArgs from \"./eventArgs/chunkDownloadEventArgs.js\";\nimport type DownloadPauseEventArgs from \"./eventArgs/downloadPauseEventArgs.js\";\nimport type FileDownloadEventArgs from \"./eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\nimport type DownloadTrackingFailedEventArgs from \"./eventArgs/downloadTrackingFailedEventArgs.js\";\nimport type DownloadCompletedEventArgs from \"./eventArgs/downloadCompletedEventArgs.js\";\nimport type DownloadTrackerFileProgressInfo from \"./dtos/downloadTrackerFileProgressInfo.js\";\nimport type DownloadTrackingMetadata from \"./dtos/downloadTrackingMetadata.js\";\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\n\nexport default class DownloadTracker {\n readonly #downloadId: string;\n readonly #fileSystem: FileSystemService;\n readonly #trackingPath: string;\n readonly #eventsEngine: EventsEngine;\n readonly #options: DownloadOptions;\n readonly #metadata: DownloadTrackingMetadata;\n readonly #filesMutex: Mutex;\n\n #progressIntervalTimer: ReturnType<typeof setInterval> | null = null;\n #allFiles: Record<string, DownloadTrackerFileInfo> = {};\n #progress: DownloadTrackerProgressInfo = { activeTime: 0, trackedFiles: {} };\n #running = false;\n #restored = false;\n #filesChanged = false;\n #progressChanged = false;\n #canTrack = false;\n\n constructor(downloadId: string, options: DownloadOptions, fileSystem: FileSystemService, eventsEngine: EventsEngine, e2eeData?: DownloadCommandE2eeData, region?: string) {\n if (!options.downloadTrackingBaseFolder)\n throw new DownloadError(`Download tracker cannot be created - tracking folder is not specified`);\n\n this.#downloadId = downloadId;\n this.#options = options;\n this.#metadata = this.createMetadata(region, e2eeData);\n this.#fileSystem = fileSystem;\n this.#eventsEngine = eventsEngine;\n this.#trackingPath = DownloadTracker.getTrackingPath(downloadId, options.downloadTrackingBaseFolder, fileSystem);\n this.#filesMutex = new Mutex();\n }\n\n private createMetadata(region: string | undefined, e2eeData?: DownloadCommandE2eeData): DownloadTrackingMetadata {\n if (!e2eeData)\n return { region };\n\n return {\n region,\n e2eeData:\n {\n ivAsHex: e2eeData.iv.toString(`hex`),\n keyAsHex: e2eeData.key.toString(`hex`),\n },\n };\n }\n\n private static getTrackingPath(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService) {\n return fileSystem.pathJoin(downloadTrackingBaseFolder, downloadId);\n }\n\n get #filesPath(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `files.json`);\n }\n\n get #filesPathTemp(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `files.tmp`);\n }\n\n get #optionsFilePath(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `options.json`);\n }\n\n private static getMetadataFilePath(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService): string {\n const trackingPath = DownloadTracker.getTrackingPath(downloadId, downloadTrackingBaseFolder, fileSystem);\n return fileSystem.pathJoin(trackingPath, `metadata.json`);\n }\n\n get #metadataFilePath(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `metadata.json`);\n }\n\n get #progressPath(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `progress.json`);\n }\n\n get #progressPathTemp(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `progress.tmp`);\n }\n\n #addEventListeners() {\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileCreated, this.#onFileCreated);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadStarting, this.#onFileStarting);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.ChunkDownloadCompleted, this.#onChunkCompleted);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Paused, this.#onPaused);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Aborted, this.#onAborted);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.DownloadCompleted, this.#onCompleted);\n }\n\n #removeEventListeners() {\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileCreated, this.#onFileCreated);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadStarting, this.#onFileStarting);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.ChunkDownloadCompleted, this.#onChunkCompleted);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Paused, this.#onPaused);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Aborted, this.#onAborted);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.DownloadCompleted, this.#onCompleted);\n }\n\n #onFileCreated = async (args: FileDownloadEventArgs) => {\n const file = this.#allFiles[args.file.id]!;\n if (file.tdp !== args.file.temporaryDownloadPath) {\n file.tdp = args.file.temporaryDownloadPath;\n this.#filesChanged = true;\n }\n };\n\n #onFileStarting = async (args: FileDownloadEventArgs) => {\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\n if (pendingFile.wr === false) {\n pendingFile.wr = true;\n this.#progress.activeTime = args.activeTime;\n this.#progressChanged = true;\n }\n };\n\n #onFileCompleted = async (args: FileDownloadEventArgs) => {\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\n pendingFile.c = args.file.completed;\n pendingFile.er = args.file.failed;\n pendingFile.ok = args.file.lastOkChunk;\n pendingFile.ec = null;\n this.#progress.activeTime = args.activeTime;\n this.#progressChanged = true;\n\n const file = this.#allFiles[args.file.id]!;\n if (file.dp !== args.file.downloadPath) {\n file.dp = args.file.downloadPath;\n this.#filesChanged = true;\n }\n };\n\n #onFileFailed = async (args: FileDownloadFailedEventArgs) => {\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\n pendingFile.c = args.file.completed;\n pendingFile.er = args.file.failed;\n pendingFile.ok = args.file.lastOkChunk;\n pendingFile.ec = this.#toTrackedFailureCode(args.reason);\n this.#progress.activeTime = args.activeTime;\n this.#progressChanged = true;\n };\n\n #onChunkCompleted = async (args: ChunkDownloadEventArgs) => {\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\n pendingFile.c = args.file.completed;\n pendingFile.er = args.file.failed;\n pendingFile.ok = args.file.lastOkChunk;\n pendingFile.ec = null;\n this.#progress.activeTime = args.activeTime;\n this.#progressChanged = true;\n };\n\n #onPaused = async (args: DownloadPauseEventArgs) => {\n this.#progress.activeTime = args.activeTimeMillis;\n this.#progressChanged = true;\n };\n\n #onAborted = async () => {\n await this.#cleanUp(true);\n };\n\n #onCompleted = async (args: DownloadCompletedEventArgs) => {\n const removeTracking = args.status === TransferStatus.Completed;\n\n if (!removeTracking)\n await this.#dumpAllProgress();\n\n await this.#cleanUp(removeTracking);\n };\n\n #toTrackedFailureCode(error: DownloadError): DownloadErrorCode | null {\n if (error.errorCode !== null)\n return error.errorCode;\n\n if (DownloadTracker.#extractErrorCode(error) === `ENOSPC`)\n return DownloadErrorCode.DiskFull;\n\n return null;\n }\n\n static #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 async #cleanUp(removeTracking: boolean) {\n this.#running = false;\n this.#progressChanged = false;\n this.#filesChanged = false;\n if (this.#progressIntervalTimer !== null) {\n clearInterval(this.#progressIntervalTimer);\n this.#progressIntervalTimer = null;\n }\n this.#removeEventListeners();\n this.#allFiles = {};\n this.#progress = { activeTime: 0, trackedFiles: {} };\n\n if (removeTracking)\n await DownloadTracker.removeDownloadTrackingFolder(this.#downloadId, this.#options.downloadTrackingBaseFolder!, this.#fileSystem);\n }\n\n async #dumpOptions() {\n await this.#fileSystem.writeFile(this.#optionsFilePath, JSON.stringify(this.#options));\n }\n\n async #dumpMetadata() {\n await this.#fileSystem.writeFile(this.#metadataFilePath, JSON.stringify(this.#metadata));\n }\n\n async #dumpDownloaderFiles() {\n // write to disk - then rename: rename will be much faster than write (potentially few/few dozens MB) - minimizing risk of getting corrupt progress file on disk\n await this.#fileSystem.writeFile(this.#filesPathTemp, JSON.stringify(this.#allFiles));\n await this.#fileSystem.renameFile(this.#filesPathTemp, this.#filesPath);\n }\n\n async #dumpDownloaderProgress() {\n // write to disk - then rename: rename will be much faster than write (potentially few/few dozens MB) - minimizing risk of getting corrupt progress file on disk\n await this.#fileSystem.writeFile(this.#progressPathTemp, JSON.stringify(this.#progress));\n await this.#fileSystem.renameFile(this.#progressPathTemp, this.#progressPath);\n }\n\n #throwIfRunning() {\n if (this.#running)\n throw new DownloadError(`This download tracker is already running. Please create a new one.`);\n }\n\n private static async throwIfPathDoesntExist(path: string, reason: string, errorCode: DownloadErrorCode, fileSystem: FileSystemService) {\n if ((await fileSystem.pathExists(path)) === false)\n throw new DownloadError(reason, undefined, errorCode);\n }\n\n async #dumpAllProgress(): Promise<void> {\n await this.#filesMutex.runExclusive(async () => {\n try {\n if (this.#progressChanged) {\n this.#progressChanged = false;\n await this.#dumpDownloaderProgress();\n }\n if (this.#filesChanged) {\n this.#filesChanged = false;\n await this.#dumpDownloaderFiles();\n }\n }\n catch (err) {\n // When this event is emitted it means for the the caller that restoring interrupted download won't be able to recover\n // all downloaded data - but only some part of it. In general it is safe to continue after this event,\n // just keep in mind tracking data is not up-to-date.\n // Also note: in many cases tracking data will not be used at all (only when download was interrupted - by app restart, pc reboot etc.).\n const args: DownloadTrackingFailedEventArgs = {\n reason: `Could not update tracking data - recovering this transfer may re-download more data than needed ${this.#downloadId} @ ${this.#trackingPath}`,\n error: err as Error,\n errorCode: DownloadErrorCode.TrackingDataOutdated,\n downloadId: this.#downloadId,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadTrackingFailed, args);\n }\n });\n }\n\n #setupProgressTimer() {\n this.#progressIntervalTimer = setInterval(async () => {\n await this.#dumpAllProgress();\n }, this.#options.downloadTrackingIntervalMillis);\n }\n\n async #shouldPendingFileBeRestarted(file: DownloadFileInfo) {\n return file.wasEverWritten\n && (!file.temporaryDownloadPath || (await this.#fileSystem.pathExists(file.temporaryDownloadPath!)) === false);\n }\n\n async #restoreSingleFile(restoredFileId: string, restoredFile: DownloadTrackerFileInfo) {\n const fileTrack = this.#progress.trackedFiles[restoredFileId]!;\n const file = new DownloadFileInfo(restoredFileId, restoredFile.u, restoredFile.n, restoredFile.s, restoredFile.dp, restoredFile.cc, restoredFile.tdp);\n let fileWasReset = false;\n\n file.wasEverWritten = fileTrack.wr;\n file.isCompleted = fileTrack.c;\n file.isFailed = fileTrack.er;\n file.lastSuccessfulChunkNumber = fileTrack.ok;\n\n if (this.#shouldRetryFailedFile(fileTrack)) {\n fileTrack.er = false;\n fileTrack.ec = null;\n file.isFailed = false;\n fileWasReset = true;\n }\n\n if (file.isCompleted || file.isFailed)\n // let's save some cpu time on restoring chunk collection for file which will never be picked up\n file.downloadedBytes_bank = file.sizeInBytes;\n else {\n const shouldFileBeReset = await this.#shouldPendingFileBeRestarted(file);\n\n if (shouldFileBeReset) {\n // it maye happen that disk state is de-synced from the progress tracking file (the file.temporaryDownloadPath is gone)\n // in this case we want to simply re-start the file\n fileTrack.wr = false;\n fileTrack.ok = null;\n fileWasReset = true;\n\n file.wasEverWritten = false;\n file.lastSuccessfulChunkNumber = null;\n }\n\n for (let chunkIndex = 0; chunkIndex < file.chunkCount; chunkIndex++) {\n const chunk = this.#restoreSingleChunkInfo(file, chunkIndex, fileTrack);\n file.chunks.push(chunk);\n if (chunk.isCompleted)\n file.downloadedBytes_bank += chunk.chunkSize;\n }\n }\n\n // this method will update file.downloadedBytes properly based on file.downloadedBytes_bank\n // (and theoretically also based on file.#pendingChunks - but when restoring state #pendingChunks is always empty)\n file.updateProgress();\n\n return { file, fileWasReset };\n }\n\n #restoreSingleChunkInfo(file: DownloadFileInfo, chunkIndex: number, fileTrack: DownloadTrackerFileProgressInfo) {\n const chunk = new DownloadFileChunkInfo(file, chunkIndex, this.#options.maxChunkSize ?? null);\n chunk.isCompleted = fileTrack.ok !== null && chunkIndex <= fileTrack.ok;\n if (chunk.isCompleted)\n chunk.setProgress(chunk.chunkSize);\n return chunk;\n }\n\n #shouldRetryFailedFile(fileTrack: DownloadTrackerFileProgressInfo): boolean {\n return fileTrack.er === true && fileTrack.c === false;\n }\n\n async start(allFiles: Array<DownloadFileInfo>) {\n this.#throwIfRunning();\n\n this.#running = true;\n\n if (this.#restored === false) {\n for (const file of allFiles) {\n this.#progress.trackedFiles[file.externalId] = {\n c: file.isCompleted,\n er: file.isFailed,\n ok: file.lastSuccessfulChunkNumber,\n wr: file.wasEverWritten,\n ec: null,\n };\n this.#allFiles[file.externalId] = {\n u: file.url,\n s: file.sizeInBytes,\n n: file.name,\n dp: file.downloadPath,\n tdp: file.temporaryDownloadPath,\n cc: file.chunkCount,\n };\n }\n await this.#filesMutex.runExclusive(async () => {\n try {\n await this.#fileSystem.createFolder(this.#trackingPath);\n await this.#dumpOptions();\n await this.#dumpMetadata();\n await this.#dumpDownloaderFiles();\n await this.#dumpDownloaderProgress();\n this.#canTrack = true;\n }\n catch (err) {\n throw new DownloadError(`Could not create tracking folder - recovering this transfer will not be possible ${this.#downloadId} @ ${this.#trackingPath}`, { cause: err as Error }, DownloadErrorCode.TrackingNotAvailable);\n }\n });\n }\n else\n this.#canTrack = true;\n\n if (this.#canTrack) {\n this.#addEventListeners();\n this.#setupProgressTimer();\n }\n }\n\n async restoreDownloadOptions() {\n await DownloadTracker.throwIfPathDoesntExist(this.#optionsFilePath, `Options file \"${this.#optionsFilePath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\n try {\n const optionsFile = await this.#fileSystem.readFileAsString(this.#optionsFilePath);\n const options: DownloadOptions = JSON.parse(optionsFile);\n return options;\n }\n catch (err) {\n throw new DownloadError(`Could not read download options information ${this.#downloadId} @ ${this.#optionsFilePath}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\n }\n }\n\n static async restoreDownloadMetadata(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService): Promise<DownloadTrackingMetadata> {\n const metadataFilePath = this.getMetadataFilePath(downloadId, downloadTrackingBaseFolder, fileSystem);\n\n await this.throwIfPathDoesntExist(metadataFilePath, `Metadata file \"${metadataFilePath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, fileSystem);\n\n try {\n const metadataFile = await fileSystem.readFileAsString(metadataFilePath);\n return JSON.parse(metadataFile);\n }\n catch (err) {\n throw new DownloadError(`Could not read download metadata information ${downloadId} @ ${metadataFilePath}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\n }\n }\n\n async restoreDownloaderState(): Promise<{ state: DownloaderRestoredState, files: Array<DownloadFileInfo> }> {\n await DownloadTracker.throwIfPathDoesntExist(this.#filesPath, `Filesinfo file \"${this.#filesPath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\n await DownloadTracker.throwIfPathDoesntExist(this.#progressPath, `Tracking file \"${this.#progressPath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\n\n try {\n this.#allFiles = JSON.parse(await this.#fileSystem.readFileAsString(this.#filesPath));\n this.#progress = JSON.parse(await this.#fileSystem.readFileAsString(this.#progressPath));\n this.#restored = true;\n\n let totalSize = 0;\n let downloadedBytes = 0;\n let downloadedBytesBank = 0;\n let repeatProgressDump = false;\n const files: Array<DownloadFileInfo> = [];\n\n for (const [restoredFileId, restoredFile] of Object.entries(this.#allFiles)) {\n const { file, fileWasReset } = await this.#restoreSingleFile(restoredFileId, restoredFile);\n\n if (fileWasReset)\n repeatProgressDump = true;\n\n downloadedBytes += file.downloadedBytes;\n\n if (file.isCompleted)\n downloadedBytesBank += file.sizeInBytes;\n\n files.push(file);\n totalSize += file.sizeInBytes;\n }\n\n if (repeatProgressDump) {\n // some tracking info might have been updated (corrected) in above loop\n // persisting this makes sure we have most correct state in the progress tracking file\n // (e.g. some unconfirmed pending files might be deleted by end users etc.)\n await this.#dumpDownloaderProgress();\n }\n\n return {\n files,\n state: {\n activeTime: this.#progress.activeTime,\n downloadedBytes,\n downloadedBytesBank,\n totalSize,\n percent: totalSize === 0 ? 100 : ((100 * downloadedBytes) / totalSize),\n },\n };\n }\n catch (err) {\n throw new DownloadError(`Could not read download tracking information ${this.#downloadId}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\n }\n }\n\n static async removeDownloadTrackingFolder(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService) {\n const filesMutex = new Mutex();\n const trackingPath = DownloadTracker.getTrackingPath(downloadId, downloadTrackingBaseFolder, fileSystem);\n\n await filesMutex.runExclusive(async () => {\n try {\n await fileSystem.deleteFolder(trackingPath);\n }\n catch (err) {\n throw new DownloadError(`Could not remove tracking folder - ${downloadId} @ ${trackingPath}`, { cause: err as Error }, DownloadErrorCode.TrackingCleanupFailed);\n }\n });\n }\n\n async saveState(): Promise<void> {\n await this.#dumpAllProgress();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadCommand.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadCommand.ts"],"names":[],"mappings":"","sourcesContent":["import type GetCompanyResponse from \"../../utils/api/dtos/getCompanyResponse.js\";\
|
|
1
|
+
{"version":3,"file":"downloadCommand.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadCommand.ts"],"names":[],"mappings":"","sourcesContent":["import type GetCompanyResponse from \"../../utils/api/dtos/getCompanyResponse.js\";\n\ninterface DownloadCommand {\n transfer?: string | undefined,\n trackId?: string | undefined,\n password?: string | undefined,\n e2eeDataOrTextKey?: DownloadCommandE2eeData | string,\n company?: GetCompanyResponse | undefined,\n checkLogintoken?: boolean | undefined,\n}\n\nexport default DownloadCommand;\n\nexport type DownloadCommandE2eeData = {\n iv: Buffer,\n key: Buffer,\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadError.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadError.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,KAAK;IACnC,SAAS,CAA2B;IAE7C,YAAY,OAAgB,EAAE,OAAsB,EAAE,IAAwB;QAC1E,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC;IAClC,CAAC;IAED,MAAM;QACF,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;SACtC,CAAC;IACN,CAAC;IAEO,WAAW,CAAC,UAAmB;QACnC,IAAI,CAAC,UAAU;YACX,OAAO,SAAS,CAAC;QAErB,IAAI,OAAQ,UAAkB,CAAC,MAAM,KAAK,UAAU;YAChD,OAAQ,UAAkB,CAAC,MAAM,EAAE,CAAC;QAExC,IAAI,UAAU,YAAY,KAAK,EAAE,CAAC;YAC9B,OAAO;gBACH,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;aAC5C,CAAC;QACN,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ","sourcesContent":["import type DownloadErrorCode from \"./downloadErrorCode.js\";\
|
|
1
|
+
{"version":3,"file":"downloadError.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadError.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,KAAK;IACnC,SAAS,CAA2B;IAE7C,YAAY,OAAgB,EAAE,OAAsB,EAAE,IAAwB;QAC1E,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC;IAClC,CAAC;IAED,MAAM;QACF,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;SACtC,CAAC;IACN,CAAC;IAEO,WAAW,CAAC,UAAmB;QACnC,IAAI,CAAC,UAAU;YACX,OAAO,SAAS,CAAC;QAErB,IAAI,OAAQ,UAAkB,CAAC,MAAM,KAAK,UAAU;YAChD,OAAQ,UAAkB,CAAC,MAAM,EAAE,CAAC;QAExC,IAAI,UAAU,YAAY,KAAK,EAAE,CAAC;YAC9B,OAAO;gBACH,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;aAC5C,CAAC;QACN,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ","sourcesContent":["import type DownloadErrorCode from \"./downloadErrorCode.js\";\n\nexport default class DownloadError extends Error {\n readonly errorCode: DownloadErrorCode | null;\n\n constructor(message?: string, options?: ErrorOptions, code?: DownloadErrorCode) {\n super(message, options);\n this.name = `DownloadError`;\n this.errorCode = code || null;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n errorCode: this.errorCode,\n cause: this.causeToJSON(this.cause),\n };\n }\n\n private causeToJSON(innerError: unknown): unknown {\n if (!innerError)\n return undefined;\n\n if (typeof (innerError as any).toJSON === `function`)\n return (innerError as any).toJSON();\n\n if (innerError instanceof Error) {\n return {\n name: innerError.name,\n message: innerError.message,\n stack: innerError.stack,\n cause: this.causeToJSON(innerError.cause),\n };\n }\n\n return innerError;\n }\n}"]}
|