filemail-sdk 10.4.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/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/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/transferUploaderBase.js +1 -1
- package/dist/src/client/uploader/transferUploaderBase.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/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/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/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/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/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/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/transferUpload.d.ts +4 -2
- package/dist/src/uploader/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +27 -9
- package/dist/src/uploader/transferUpload.js.map +1 -1
- package/dist/src/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/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/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/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/package.json +5 -4
- 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
|
@@ -13,9 +13,10 @@ import type DownloadLogger from "../../downloader/downloadLogger.js";
|
|
|
13
13
|
import type DownloadEventArgs from "../../downloader/eventArgs/downloadEventArgs.js";
|
|
14
14
|
import type CryptographyProvider from "../../utils/crypto/cryptographyProvider.js";
|
|
15
15
|
import type TransferDownloaderHealthMonitor from "../healthMonitor/transferDownloaderHealthMonitor.js";
|
|
16
|
+
import ChunkMD5ProviderFactory from "../../downloader/md5Provider/downloaderChunkMD5ProviderFactory.js";
|
|
16
17
|
export default class DownloaderCore {
|
|
17
18
|
#private;
|
|
18
|
-
constructor(options: DownloadOptions, logger: DownloadLogger, apiClient: ApiClient,
|
|
19
|
+
constructor(options: DownloadOptions, logger: DownloadLogger, apiClient: ApiClient, chunkStreamProviderFactory: ChunkStreamProviderFactory<string>, chunkMD5ProviderFactory: ChunkMD5ProviderFactory<string>, fileserverClientFactory: FileServerClientFactory, fileSystem: FileSystemService, eventsEngine: EventsEngine, cryptography: CryptographyProvider, healthMonitor: TransferDownloaderHealthMonitor);
|
|
19
20
|
get status(): TransferStatus | null;
|
|
20
21
|
get state(): DownloadEventArgs | null;
|
|
21
22
|
get downloadId(): string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloaderCore.d.ts","sourceRoot":"","sources":["../../../../src/client/downloader/downloaderCore.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,eAAe,MAAM,qCAAqC,CAAC;AACvE,OAAO,KAAK,SAAS,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,iBAAiB,MAAM,6CAA6C,CAAC;AACjF,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAEjE,OAAO,KAAK,YAAY,MAAM,uCAAuC,CAAC;AAGtE,OAAO,KAAK,eAAe,MAAM,0CAA0C,CAAC;AAC5E,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAC;AAEtF,OAAO,KAAK,0BAA0B,MAAM,sDAAsD,CAAC;AACnG,OAAO,KAAK,uBAAuB,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,iBAAiB,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,cAAc,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,iBAAiB,MAAM,iDAAiD,CAAC;AAGrF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAC;AACnF,OAAO,KAAK,+BAA+B,MAAM,qDAAqD,CAAC;
|
|
1
|
+
{"version":3,"file":"downloaderCore.d.ts","sourceRoot":"","sources":["../../../../src/client/downloader/downloaderCore.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,eAAe,MAAM,qCAAqC,CAAC;AACvE,OAAO,KAAK,SAAS,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,iBAAiB,MAAM,6CAA6C,CAAC;AACjF,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAEjE,OAAO,KAAK,YAAY,MAAM,uCAAuC,CAAC;AAGtE,OAAO,KAAK,eAAe,MAAM,0CAA0C,CAAC;AAC5E,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAC;AAEtF,OAAO,KAAK,0BAA0B,MAAM,sDAAsD,CAAC;AACnG,OAAO,KAAK,uBAAuB,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,iBAAiB,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,cAAc,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,iBAAiB,MAAM,iDAAiD,CAAC;AAGrF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAC;AACnF,OAAO,KAAK,+BAA+B,MAAM,qDAAqD,CAAC;AACvG,OAAO,uBAAuB,MAAM,mEAAmE,CAAC;AAExG,MAAM,CAAC,OAAO,OAAO,cAAc;;gBAmBnB,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,0BAA0B,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,MAAM,CAAC,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,+BAA+B;IAa7Y,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAKlC;IAED,IAAI,KAAK,IAAI,iBAAiB,GAAG,IAAI,CAKpC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAEK,KAAK,CAAC,OAAO,EAAE;QAAE,sBAAsB,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB3E,MAAM,IAAI,OAAO;IAQjB,KAAK,IAAI,OAAO;IAQhB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAI/C,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAYvE,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAYjE,qBAAqB,CAAC,OAAO,EAAE,oBAAoB;IAcnD,uBAAuB;IA6BvB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqC3E,OAAO,CAAC,yCAAyC;IAU3C,eAAe,CAAC,UAAU,GAAE,MAAM,GAAG,IAAW;CAsNzD"}
|
|
@@ -14,7 +14,8 @@ import TransferStatus from '../../utils/types/transferStatus.js';
|
|
|
14
14
|
export default class DownloaderCore {
|
|
15
15
|
#apiClient;
|
|
16
16
|
#options;
|
|
17
|
-
#
|
|
17
|
+
#chunkStreamProviderFactory;
|
|
18
|
+
#chunkMD5ProviderFactory;
|
|
18
19
|
#fileserverClientFactory;
|
|
19
20
|
#fileSystem;
|
|
20
21
|
#eventsEngine;
|
|
@@ -27,11 +28,12 @@ export default class DownloaderCore {
|
|
|
27
28
|
#filesDownloader = null;
|
|
28
29
|
#downloadTracker = null;
|
|
29
30
|
#downloadRegistrationMode = DownloadRegistrationMode.Transfer;
|
|
30
|
-
constructor(options, logger, apiClient,
|
|
31
|
+
constructor(options, logger, apiClient, chunkStreamProviderFactory, chunkMD5ProviderFactory, fileserverClientFactory, fileSystem, eventsEngine, cryptography, healthMonitor) {
|
|
31
32
|
this.#options = options;
|
|
32
33
|
this.#logger = logger;
|
|
33
34
|
this.#apiClient = apiClient;
|
|
34
|
-
this.#
|
|
35
|
+
this.#chunkStreamProviderFactory = chunkStreamProviderFactory;
|
|
36
|
+
this.#chunkMD5ProviderFactory = chunkMD5ProviderFactory;
|
|
35
37
|
this.#fileserverClientFactory = fileserverClientFactory;
|
|
36
38
|
this.#fileSystem = fileSystem;
|
|
37
39
|
this.#eventsEngine = eventsEngine;
|
|
@@ -222,7 +224,7 @@ export default class DownloaderCore {
|
|
|
222
224
|
throw new DownloadError(`This downloader has no transfer ID specified`);
|
|
223
225
|
if (!this.#downloadId)
|
|
224
226
|
throw new DownloadError(`This downloader has no download ID initialized`);
|
|
225
|
-
this.#filesDownloader = new FilesDownloader(this.#logger, this.#transferId, this.#trackId, this.#downloadId, region, downloadFiles, restoredState, this.#fileSystem, new TransferConcurrencyController(this.#options.parallelChunks), this.#eventsEngine, this.#cryptography, this.#options, this.#apiClient, this.#fileserverClientFactory, this.#
|
|
227
|
+
this.#filesDownloader = new FilesDownloader(this.#logger, this.#transferId, this.#trackId, this.#downloadId, region, downloadFiles, restoredState, this.#fileSystem, new TransferConcurrencyController(this.#options.parallelChunks), this.#eventsEngine, this.#cryptography, this.#options, this.#apiClient, this.#fileserverClientFactory, this.#chunkStreamProviderFactory, this.#chunkMD5ProviderFactory, this.#downloadRegistrationMode, e2eeData);
|
|
226
228
|
if (this.#options.downloadTrackingBaseFolder) {
|
|
227
229
|
if (!this.#downloadTracker)
|
|
228
230
|
this.#downloadTracker = new DownloadTracker(this.#downloadId, this.#options, this.#fileSystem, this.#eventsEngine, e2eeData, region);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloaderCore.js","sourceRoot":"","sources":["../../../../src/client/downloader/downloaderCore.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,6BAA6B,CAAC;AACnD,OAAO,iBAAiB,MAAM,4CAA4C,CAAC;AAC3E,OAAO,qBAAqB,MAAM,wCAAwC,CAAC;AAC3E,OAAO,eAAe,MAAM,qCAAqC,CAAC;AAClE,OAAO,gBAAgB,MAAM,2CAA2C,CAAC;AACzE,OAAO,6BAA6B,MAAM,oEAAoE,CAAC;AAC/G,OAAO,aAAa,MAAM,wCAAwC,CAAC;AACnE,OAAO,OAAO,MAAM,4BAA4B,CAAC;AACjD,OAAO,eAAe,MAAM,qCAAqC,CAAC;AAClE,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,sBAAsB,MAAM,4CAA4C,CAAC;AAChF,OAAO,wBAAwB,MAAM,mDAAmD,CAAC;AAKzF,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAmBjE,MAAM,CAAC,OAAO,OAAO,cAAc;IACtB,UAAU,CAAY;IACtB,QAAQ,CAAkB;IAC1B,qBAAqB,CAAqC;IAC1D,wBAAwB,CAA0B;IAClD,WAAW,CAAoB;IAC/B,aAAa,CAAe;IAC5B,OAAO,CAAiB;IACxB,aAAa,CAAuB;IACpC,cAAc,CAAkC;IAEzD,WAAW,CAAU;IACrB,WAAW,CAAU;IACrB,QAAQ,CAAU;IAClB,gBAAgB,GAA2B,IAAI,CAAC;IAChD,gBAAgB,GAA2B,IAAI,CAAC;IAChD,yBAAyB,GAA6B,wBAAwB,CAAC,QAAQ,CAAC;IAExF,YAAY,OAAwB,EAAE,MAAsB,EAAE,SAAoB,EAAE,oBAAwD,EAAE,uBAAgD,EAAE,UAA6B,EAAE,YAA0B,EAAE,YAAkC,EAAE,aAA8C;QACzU,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAClD,IAAI,CAAC,wBAAwB,GAAG,uBAAuB,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACxC,CAAC;IAED,IAAI,MAAM;QACN,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;YAC9B,OAAO,IAAI,CAAC;QAEhB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,IAAI,KAAK;QACL,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;YAC9B,OAAO,IAAI,CAAC;QAEhB,OAAO,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAA4C;QACpD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;YAChD,MAAM,YAAY,GAAG,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;YAC5D,IAAI,CAAC,gBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM;YACN,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAE/B,IAAI,MAAM;YACN,MAAM,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,CAAC;QAE7C,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM;QACF,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAiB,CAAC,MAAM,EAAE,CAAC;QAC/C,IAAI,MAAM;YACN,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAiB,CAAC,YAAY,EAAE,CAAC;QACtD,IAAI,OAAO;YACP,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,mBAAmB,CAAC,OAA0B;QAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,OAAwB;QACjD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,yBAAyB,GAAG,wBAAwB,CAAC,QAAQ,CAAC;QAEnE,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAwB;QAC3C,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/D,IAAI,CAAC,yBAAyB,GAAG,wBAAwB,CAAC,QAAQ,CAAC;QAEnE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAA6B;QACrD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,yBAAyB,GAAG,OAAO,QAAQ,CAAC,aAAa,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,aAAa;YAC1H,CAAC,CAAC,wBAAwB,CAAC,QAAQ;YACnC,CAAC,CAAC,wBAAwB,CAAC,eAAe,CAAC;QAE/C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,uBAAuB;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACtB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,0BAA0B;YACzC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,KAAK,cAAc,CAAC,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,KAAK,cAAc,CAAC,OAAO;YACnH,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAExE,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,uBAAuB,CAAC,IAAI,CAAC,WAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,0BAA0B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACtJ,MAAM,uBAAuB,GAAG,IAAI,CAAC,yCAAyC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC1G,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;QAE7E,4FAA4F;QAC5F,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,eAAe,CAAC,cAAc,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,0BAA0B,GAAG,eAAe,CAAC,0BAA0B,CAAC;QACtF,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,eAAe,CAAC,cAAc,CAAC;QAE9D,iHAAiH;QACjH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;QAE7E,iCAAiC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9H,WAAW,CAAC,IAAI,CAAC,CAAC,EAAgB,EAAE,EAAE;YAClC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,4BAA4B,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,UAAkB;QAC/C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,0BAA0B;YACzC,MAAM,IAAI,aAAa,CAAC,qDAAqD,UAAU,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;QAElJ,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE/C,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,uBAAuB,CAAC,IAAI,CAAC,WAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,0BAA0B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEtJ,MAAM,uBAAuB,GAAG,IAAI,CAAC,yCAAyC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE1G,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,WAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,uBAAuB,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACtK,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;QAE7E,sIAAsI;QACtI,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,eAAe,CAAC,cAAc,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,0BAA0B,GAAG,eAAe,CAAC,0BAA0B,CAAC;QACtF,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,eAAe,CAAC,cAAc,CAAC;QAE9D,iHAAiH;QACjH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;QAE7E,iCAAiC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9H,WAAW,CAAC,IAAI,CAAC,CAAC,EAAgB,EAAE,EAAE;YAClC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,4BAA4B,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACvB,CAAC;IAEO,yCAAyC,CAAC,gBAAmD;QACjG,IAAI,CAAC,gBAAgB;YACjB,OAAO,SAAS,CAAC;QAErB,OAAO;YACH,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;YAChD,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC;SACrD,CAAC;IACN,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAA4B,IAAI;QAClD,MAAM,iBAAiB,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC;QAEzD,IAAI,CAAC,iBAAiB;YAClB,MAAM,IAAI,aAAa,CAAC,iCAAiC,CAAC,CAAC;QAE/D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,0BAA0B;YACzC,MAAM,IAAI,aAAa,CAAC,8DAA8D,iBAAiB,EAAE,CAAC,CAAC;QAE/G,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAEhD,MAAM,eAAe,CAAC,4BAA4B,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,0BAA0B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtI,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAA6B,EAAE,iBAAoD;QACrG,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,8BAA8B,CAAC,QAAQ,CAAC,iBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvJ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,yBAAyB,EAAE,CAAC;QAE5D,yEAAyE;QACzE,gEAAgE;QAChE,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC;QAErC,MAAM,OAAO,GAAoB;YAC7B,WAAW,EAAE,QAAQ,CAAC,iBAAkB;YACxC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,iBAAkB,CAAC,CAAC,iBAAkB;YACrF,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,UAAU,EAAE,IAAI;SACnB,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAA6B,EAAE,KAA6B,EAAE,iBAAoD;QAC9H,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE9C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,QAAQ,CAAC,sBAAsB;YACpC,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,sBAAsB,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAuB,EAAE,QAAQ,CAAC,CAAC;QAEjI,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAE7E,MAAM,aAAa,GAAG,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChH,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAErC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,QAA6B,EAAE,iBAAoD;QACzG,IAAI,CAAC,QAAQ,CAAC,IAAI;YACd,OAAO,SAAS,CAAC;QAErB,IAAI,CAAC,iBAAiB;YAClB,MAAM,IAAI,aAAa,CAAC,4DAA4D,CAAC,CAAC;QAE1F,IAAI,OAAO,iBAAiB,KAAK,QAAQ;YACrC,OAAO,iBAAiB,CAAC;QAE7B,IAAI,CAAC,QAAQ,CAAC,YAAY;YACtB,MAAM,IAAI,aAAa,CAAC,mDAAmD,CAAC,CAAC;QAEjF,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAEnE,MAAM,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAExE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,aAAsC,EAAE,QAAkC,EAAE,MAAe,EAAE,aAAuC;QAC3I,IAAI,CAAC,IAAI,CAAC,WAAW;YACjB,MAAM,IAAI,aAAa,CAAC,8CAA8C,CAAC,CAAC;QAE5E,IAAI,CAAC,IAAI,CAAC,WAAW;YACjB,MAAM,IAAI,aAAa,CAAC,gDAAgD,CAAC,CAAC;QAE9E,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,CACvC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,WAAY,EACjB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAY,EACjB,MAAM,EACN,aAAa,EACb,aAAa,EACb,IAAI,CAAC,WAAW,EAChB,IAAI,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAe,CAAC,EAChE,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,wBAAwB,EAC7B,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,yBAAyB,EAC9B,QAAQ,CACX,CAAC;QAEF,IAAI,IAAI,CAAC,QAAQ,CAAC,0BAA0B,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,WAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE1I,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAElE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAEjD,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;YACpB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,WAAY,EAAE,UAAU,EAAE,IAAI,CAAC,WAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;IACtG,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAwB,EAAE,UAAkB;QACpE,IAAI,iBAAiB,GAA+B,IAAI,CAAC;QAEzD,IAAI,OAAO,CAAC,QAAQ;YAChB,iBAAiB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QAEtI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,gEAAgE;YAChE,IAAI,CAAC,IAAI,CAAC,QAAQ;gBACd,MAAM,IAAI,aAAa,CAAC,0FAA0F,CAAC,CAAC;YAExH,iBAAiB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,QAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QACpI,CAAC;QAED,IAAI,CAAC,iBAAiB;YAClB,MAAM,IAAI,aAAa,CAAC,0DAA0D,OAAO,CAAC,QAAQ,UAAU,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEnI,IAAI,iBAAiB,CAAC,SAAS,KAAK,IAAI;YACpC,MAAM,IAAI,aAAa,CAAC,gCAAgC,iBAAiB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAElI,IAAI,iBAAiB,CAAC,cAAc,KAAK,IAAI;YACzC,MAAM,IAAI,aAAa,CAAC,4CAA4C,iBAAiB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAEhJ,IAAI,UAAU,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;YACtF,MAAM,IAAI,aAAa,CAAC,8CAA8C,iBAAiB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAElJ,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,cAAc,CAChB,UAA+B,EAC/B,OAA4B,EAC5B,QAA6B,EAC7B,UAA+B,EAC/B,eAAyB;QAEzB,IAAI,CAAC;YACD,2DAA2D;YAC3D,oJAAoJ;YACpJ,gEAAgE;YAChE,MAAM,OAAO,GAAuB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;YAC9J,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,kCAAkC,UAAU,IAAI,KAAK,UAAU,OAAO,IAAI,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE,IAAI,CAAC,CAAC;YAC5J,MAAM,aAAa,CAAC;QACxB,CAAC;IACL,CAAC;IAED,4BAA4B,CAAC,KAAc;QACvC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC5B,QAAQ,KAAK,CAAC,UAAU,EAAE,CAAC;gBACvB,KAAK,GAAG,CAAC,CAAC,OAAO,iBAAiB,CAAC,uBAAuB,CAAC;gBAC3D,KAAK,GAAG,CAAC,CAAC,OAAO,iBAAiB,CAAC,gBAAgB,CAAC;gBACpD,KAAK,GAAG,CAAC,CAAC,OAAO,iBAAiB,CAAC,oBAAoB,CAAC;gBACxD,OAAO,CAAC,CAAC,MAAM;YACnB,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,eAAe;QACX,IAAI,IAAI,CAAC,gBAAgB;YACrB,MAAM,IAAI,aAAa,CAAC,yEAAyE,CAAC,CAAC;IAC3G,CAAC;IAED,kBAAkB;QACd,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACtB,MAAM,IAAI,aAAa,CAAC,kFAAkF,CAAC,CAAC;IACpH,CAAC;IAED,mBAAmB;QACf,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC;IAED,gCAAgC,CAAC,KAA6B;QAC1D,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,gBAAgB,CACzC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,CAChB,CAAC,CAAC;IACP,CAAC;IAED,gBAAgB;QACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB;YACtE,MAAM,IAAI,aAAa,CAAC,sDAAsD,CAAC,CAAC;QAEpF,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAa,IAAI,CAAC;YACvE,MAAM,IAAI,aAAa,CAAC,+FAA+F,CAAC,CAAC;IACjI,CAAC;CACJ","sourcesContent":["import ApiError from \"../../utils/api/apiError.js\";\nimport DownloadErrorCode from \"../../downloader/dtos/downloadErrorCode.js\";\nimport TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\nimport FilesDownloader from \"../../downloader/filesDownloader.js\";\nimport DownloadFileInfo from \"../../downloader/dtos/downloadFileInfo.js\";\nimport TransferConcurrencyController from \"../../utils/concurrencyController/transferConcurrencyController.js\";\nimport DownloadError from '../../downloader/dtos/downloadError.js';\nimport UrlUtil from \"../../utils/api/urlUtil.js\";\nimport DownloadTracker from \"../../downloader/downloadTracker.js\";\nimport FilesPreparer from \"../../downloader/filesPreparer.js\";\nimport DownloadFolderResolver from \"../../downloader/downloadFolderResolver.js\";\nimport DownloadRegistrationMode from \"../../downloader/dtos/downloadRegistrationMode.js\";\n\nimport type DownloadOptions from \"../../downloader/downloadOptions.js\";\nimport type ApiClient from \"../../utils/api/apiClient.js\";\nimport type ThrottlingOptions from '../../utils/networking/throttlingOptions.js';\nimport TransferStatus from '../../utils/types/transferStatus.js';\nimport type GetTransferResponse from \"../../utils/api/dtos/getTransferResponse.js\";\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\nimport type TransferFileDto from \"../../utils/api/dtos/transferFileDto.js\";\nimport type GetTransferRequest from \"../../utils/api/dtos/getTransferRequest.js\";\nimport type DownloadCommand from \"../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../downloader/dtos/downloadFilesCommand.js\";\nimport type DownloaderRestoredState from \"../../downloader/dtos/downloaderRestoredState.js\";\nimport type ChunkStreamProviderFactory from \"../../utils/fileSystem/chunkStreamProviderFactory.js\";\nimport type FileServerClientFactory from \"../../utils/api/fileServerClientFactory.js\";\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport type FileSystemService from \"../../utils/fileSystem/fileSystemService.js\";\nimport type DownloadLogger from \"../../downloader/downloadLogger.js\";\nimport type DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\nimport type { DownloadCommandE2eeData } from \"../../downloader/dtos/downloadCommand.js\";\nimport type { DownloadTrackingMetadataE2eeData } from \"../../downloader/dtos/downloadTrackingMetadata.js\";\nimport type CryptographyProvider from \"../../utils/crypto/cryptographyProvider.js\";\nimport type TransferDownloaderHealthMonitor from \"../healthMonitor/transferDownloaderHealthMonitor.js\";\n\nexport default class DownloaderCore {\n readonly #apiClient: ApiClient;\n readonly #options: DownloadOptions;\n readonly #chunkProviderFactory: ChunkStreamProviderFactory<string>;\n readonly #fileserverClientFactory: FileServerClientFactory;\n readonly #fileSystem: FileSystemService;\n readonly #eventsEngine: EventsEngine;\n readonly #logger: DownloadLogger;\n readonly #cryptography: CryptographyProvider;\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\n\n #downloadId?: string;\n #transferId?: string;\n #trackId?: string;\n #filesDownloader: FilesDownloader | null = null;\n #downloadTracker: DownloadTracker | null = null;\n #downloadRegistrationMode: DownloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n constructor(options: DownloadOptions, logger: DownloadLogger, apiClient: ApiClient, chunkProviderFactory: ChunkStreamProviderFactory<string>, fileserverClientFactory: FileServerClientFactory, fileSystem: FileSystemService, eventsEngine: EventsEngine, cryptography: CryptographyProvider, healthMonitor: TransferDownloaderHealthMonitor) {\n this.#options = options;\n this.#logger = logger;\n this.#apiClient = apiClient;\n this.#chunkProviderFactory = chunkProviderFactory;\n this.#fileserverClientFactory = fileserverClientFactory;\n this.#fileSystem = fileSystem;\n this.#eventsEngine = eventsEngine;\n this.#cryptography = cryptography;\n this.#healthMonitor = healthMonitor;\n }\n\n get status(): TransferStatus | null {\n if (this.#filesDownloader === null)\n return null;\n\n return this.#filesDownloader.status;\n }\n\n get state(): DownloadEventArgs | null {\n if (this.#filesDownloader === null)\n return null;\n\n return this.#filesDownloader.getCurrentState(true);\n }\n\n get downloadId(): string | undefined {\n return this.#downloadId;\n }\n\n async pause(options: { interruptPendingChunks: boolean }): Promise<boolean> {\n this.#throwIfNotRunning();\n\n const paused = await new Promise<boolean>(resolve => {\n const pauseOptions = { ...options, pausedTrigger: resolve };\n this.#filesDownloader!.requestPause(pauseOptions);\n });\n\n if (paused)\n this.#healthMonitor.stop();\n\n if (paused)\n await this.#downloadTracker?.saveState();\n\n return paused;\n }\n\n resume(): boolean {\n this.#throwIfNotRunning();\n const result = this.#filesDownloader!.resume();\n if (result)\n this.#healthMonitor.start();\n return result;\n }\n\n abort(): boolean {\n this.#throwIfNotRunning();\n const aborted = this.#filesDownloader!.requestAbort();\n if (aborted)\n this.#healthMonitor.stop();\n return aborted;\n }\n\n configureThrottling(options: ThrottlingOptions): void {\n this.#eventsEngine.emit(TransferDownloadEvent.ConfigureThrottling, options);\n }\n\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, 0);\n\n this.#downloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n return this.#downloadZipped(transfer, command.e2eeDataOrTextKey);\n }\n\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, -1);\n\n this.#downloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n return this.#download(transfer, transfer.files, command.e2eeDataOrTextKey);\n }\n\n async downloadSpecificFiles(command: DownloadFilesCommand) {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, 0);\n\n this.#downloadRegistrationMode = typeof transfer.numberoffiles === `number` && command.files.length === transfer.numberoffiles\n ? DownloadRegistrationMode.Transfer\n : DownloadRegistrationMode.EverySingleFile;\n\n return this.#download(transfer, command.files, command.e2eeDataOrTextKey);\n }\n\n async restartFailedDownloader() {\n if (!this.#downloadTracker)\n throw new Error(`Download tracker hasn't been initialized`);\n if (!this.#options.downloadTrackingBaseFolder)\n throw new Error(`Download tracking base folder hasn't been populated`);\n if (this.#filesDownloader?.status !== TransferStatus.Failed && this.#filesDownloader?.status !== TransferStatus.Aborted)\n throw new Error(`Downloader has to be in Failed or Aborted stated`);\n\n const downloadMetadata = await DownloadTracker.restoreDownloadMetadata(this.#downloadId!, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n const downloadCommandE2eeData = this.createDownloadCommandE2eeDataFromMetadata(downloadMetadata.e2eeData);\n const restoredOptions = await this.#downloadTracker.restoreDownloadOptions();\n\n // keep restart behavior deterministic by reusing the exact options used in the original run\n this.#options.downloadFolder = restoredOptions.downloadFolder;\n this.#options.downloadTrackingBaseFolder = restoredOptions.downloadTrackingBaseFolder;\n this.#options.maxChunkSize = restoredOptions.maxChunkSize;\n this.#options.checkChunksMd5 = restoredOptions.checkChunksMd5;\n\n // find out from disk the entire list of files, which were in progress and how many chunks have completed already\n const downloaderState = await this.#downloadTracker.restoreDownloaderState();\n\n // restart from where we left off\n const runningInfo = this.#run(downloaderState.files, downloadCommandE2eeData, downloadMetadata.region, downloaderState.state);\n runningInfo.then((di: DownloadInfo) => {\n this.#eventsEngine.emit(TransferDownloadEvent.RecoveredInterruptedDownload, di.initialState);\n });\n return runningInfo;\n }\n\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\n this.#logger.applyDownloadId(downloadId);\n this.#logger.logInfo(`Download recovery requested for ${downloadId}`);\n\n this.#throwIfRunning();\n\n if (!this.#options.downloadTrackingBaseFolder)\n throw new DownloadError(`The download tracking folder is not specified for ${downloadId}`, undefined, DownloadErrorCode.TrackingNotAvailable);\n\n this.#downloadId = downloadId;\n this.#transferId = downloadId.split(`_`)[0]!;\n this.#logger.applyTransferId(this.#transferId);\n\n const downloadMetadata = await DownloadTracker.restoreDownloadMetadata(this.#downloadId!, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n\n const downloadCommandE2eeData = this.createDownloadCommandE2eeDataFromMetadata(downloadMetadata.e2eeData);\n\n this.#downloadTracker = new DownloadTracker(this.#downloadId!, this.#options, this.#fileSystem, this.#eventsEngine, downloadCommandE2eeData, downloadMetadata.region);\n const restoredOptions = await this.#downloadTracker.restoreDownloadOptions();\n\n // just make sure we are running the same config as when the download was last dumped to disk - otherwise things could get out of sync\n this.#options.downloadFolder = restoredOptions.downloadFolder;\n this.#options.downloadTrackingBaseFolder = restoredOptions.downloadTrackingBaseFolder;\n this.#options.maxChunkSize = restoredOptions.maxChunkSize;\n this.#options.checkChunksMd5 = restoredOptions.checkChunksMd5;\n\n // find out from disk the entire list of files, which were in progress and how many chunks have completed already\n const downloaderState = await this.#downloadTracker.restoreDownloaderState();\n\n // restart from where we left off\n const runningInfo = this.#run(downloaderState.files, downloadCommandE2eeData, downloadMetadata.region, downloaderState.state);\n runningInfo.then((di: DownloadInfo) => {\n this.#eventsEngine.emit(TransferDownloadEvent.RecoveredInterruptedDownload, di.initialState);\n });\n return runningInfo;\n }\n\n private createDownloadCommandE2eeDataFromMetadata(metadataE2eeData?: DownloadTrackingMetadataE2eeData): DownloadCommandE2eeData | undefined {\n if (!metadataE2eeData)\n return undefined;\n\n return {\n iv: Buffer.from(metadataE2eeData.ivAsHex, `hex`),\n key: Buffer.from(metadataE2eeData.keyAsHex, `hex`),\n };\n }\n\n async cleanupDownload(downloadId: string | null = null) {\n const cleanupDownloadId = downloadId ?? this.#downloadId;\n\n if (!cleanupDownloadId)\n throw new DownloadError(`Cannot cleanup unknown download`);\n\n if (!this.#options.downloadTrackingBaseFolder)\n throw new DownloadError(`The download tracking folder is not specified for download ${cleanupDownloadId}`);\n\n this.#logger.applyDownloadId(cleanupDownloadId);\n\n await DownloadTracker.removeDownloadTrackingFolder(cleanupDownloadId, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n }\n\n async #downloadZipped(transfer: GetTransferResponse, e2eeDataOrTextKey?: DownloadCommandE2eeData | string): Promise<DownloadInfo> {\n const fsClient = this.#fileserverClientFactory.createFileServerDownloadClient(transfer.compressedfileurl!, null, null, transfer.id, ``, this.#options);\n const metaData = await fsClient.getCompressedFileMetadata();\n\n // for now fileservers are not able to validate md5 for chunks of the zip\n // note: this should be rather handled in files downloader logic\n this.#options.checkChunksMd5 = false;\n\n const zipFile: TransferFileDto = {\n downloadurl: transfer.compressedfileurl!,\n fileid: UrlUtil.getQueryStringFromUrl(transfer.compressedfileurl!).compressedfilekey!,\n filename: metaData.fileName,\n filesize: metaData.fileSize,\n compressed: true,\n };\n\n return this.#download(transfer, [zipFile], e2eeDataOrTextKey);\n }\n\n async #download(transfer: GetTransferResponse, files: Array<TransferFileDto>, e2eeDataOrTextKey?: DownloadCommandE2eeData | string): Promise<DownloadInfo> {\n this.#transferId = transfer.id;\n this.#downloadId = this.#generateDownloadId();\n\n this.#logger.applyDownloadId(this.#downloadId);\n this.#logger.applyTransferId(this.#transferId);\n\n if (this.#options.downloadFolderTemplate)\n this.#options.downloadFolder = DownloadFolderResolver.prepareDownloadFolder(this.#options.downloadFolderTemplate!, transfer);\n\n const e2eeData = await this.#getE2eeDataOrThrow(transfer, e2eeDataOrTextKey);\n\n const downloadFiles = this.#mapTransferFilesDtosToFileInfos(files);\n const preparer = new FilesPreparer(this.#options.downloadFolder!, this.#options.maxChunkSize, this.#fileSystem);\n preparer.prepareFiles(downloadFiles);\n\n return this.#run(downloadFiles, e2eeData, transfer.region);\n }\n\n async #getE2eeDataOrThrow(transfer: GetTransferResponse, e2eeDataOrTextKey?: string | DownloadCommandE2eeData): Promise<DownloadCommandE2eeData | undefined> {\n if (!transfer.e2ee)\n return undefined;\n\n if (!e2eeDataOrTextKey)\n throw new DownloadError(`No E2EE data or text key available to decrypt the transfer`);\n\n if (typeof e2eeDataOrTextKey === `object`)\n return e2eeDataOrTextKey;\n\n if (!transfer.e2ee_keyhash)\n throw new DownloadError(`No E2EE db data available to decrypt the transfer`);\n\n const e2eeDbDataBuffer = Buffer.from(transfer.e2ee_keyhash, `hex`);\n\n const iv = e2eeDbDataBuffer.subarray(0, 16);\n const salt = e2eeDbDataBuffer.subarray(16, 32);\n const key = await this.#cryptography.deriveKey(e2eeDataOrTextKey, salt);\n\n return { iv, key: Buffer.from(key) };\n }\n\n async #run(downloadFiles: Array<DownloadFileInfo>, e2eeData?: DownloadCommandE2eeData, region?: string, restoredState?: DownloaderRestoredState): Promise<DownloadInfo> {\n if (!this.#transferId)\n throw new DownloadError(`This downloader has no transfer ID specified`);\n\n if (!this.#downloadId)\n throw new DownloadError(`This downloader has no download ID initialized`);\n\n this.#filesDownloader = new FilesDownloader(\n this.#logger,\n this.#transferId!,\n this.#trackId,\n this.#downloadId!,\n region,\n downloadFiles,\n restoredState,\n this.#fileSystem,\n new TransferConcurrencyController(this.#options.parallelChunks!),\n this.#eventsEngine,\n this.#cryptography,\n this.#options,\n this.#apiClient,\n this.#fileserverClientFactory,\n this.#chunkProviderFactory,\n this.#downloadRegistrationMode,\n e2eeData,\n );\n\n if (this.#options.downloadTrackingBaseFolder) {\n if (!this.#downloadTracker)\n this.#downloadTracker = new DownloadTracker(this.#downloadId!, this.#options, this.#fileSystem, this.#eventsEngine, e2eeData, region);\n\n await this.#downloadTracker.start(downloadFiles);\n }\n\n const initialState = this.#filesDownloader.getCurrentState(false);\n\n this.#healthMonitor.start();\n\n const completion = this.#filesDownloader.start();\n\n completion.finally(() => {\n this.#healthMonitor.stop();\n });\n\n return { downloadId: this.#downloadId!, transferId: this.#transferId!, completion, initialState };\n }\n\n async #getEffectiveTransfer(command: DownloadCommand, fileslimit: number) {\n let effectiveTransfer: GetTransferResponse | null = null;\n\n if (command.transfer)\n effectiveTransfer = await this.#fetchTransfer(command.transfer, undefined, command.password, fileslimit, command.checkLogintoken);\n\n if (!effectiveTransfer) {\n // still don't know the transfer - must use track ID to fetch it\n if (!this.#trackId)\n throw new DownloadError(`Could not resolve transfer to be downloaded - missing transfer info and missing track id`);\n\n effectiveTransfer = await this.#fetchTransfer(undefined, this.#trackId!, command.password, fileslimit, command.checkLogintoken);\n }\n\n if (!effectiveTransfer)\n throw new DownloadError(`Could not resolve transfer to be downloaded - transfer=${command.transfer} track=${command.trackId}`);\n\n if (effectiveTransfer.isexpired === true)\n throw new DownloadError(`Transfer is expired transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.TransferExpired);\n\n if (effectiveTransfer.blockdownloads === true)\n throw new DownloadError(`Transfer has downloads disabled transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.DownloadsDisabled);\n\n if (fileslimit !== 0 && (!effectiveTransfer.files || effectiveTransfer.files.length === 0))\n throw new DownloadError(`Transfer has no files to download transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.NoFilesToDownload);\n\n return effectiveTransfer;\n }\n\n async #fetchTransfer(\n transferid?: string | undefined,\n trackid?: string | undefined,\n password?: string | undefined,\n fileslimit?: number | undefined,\n checkLogintoken?: boolean,\n ): Promise<GetTransferResponse> {\n try {\n // specifying which file properties we want to get from API\n // reason: api adds lots of other unnecessary properties - downloader doesn't need them and if a transfer has lots of files (some can be up to 100k)\n // it makes the response much smaller (up to 80% size reduction)\n const request: GetTransferRequest = { fileslimit, transferid, trackid, password, fprops: [`fileid`, `filesize`, `filename`, `downloadurl`], checkLogintoken };\n return await this.#apiClient.getTransfer(request);\n }\n catch (error) {\n const code = this.#apiErrorToDownloadErrorCode(error);\n const downloadError = new DownloadError(`Could not fetch transfer by id=${transferid ?? `---`} track=${trackid ?? `---`}`, { cause: error as Error }, code);\n throw downloadError;\n }\n }\n\n #apiErrorToDownloadErrorCode(error: unknown) {\n if (error instanceof ApiError) {\n switch (error.httpStatus) {\n case 401: return DownloadErrorCode.InvalidTransferPassword;\n case 404: return DownloadErrorCode.TransferNotFound;\n case 409: return DownloadErrorCode.TransferInvalidState;\n default: break;\n }\n }\n return undefined;\n }\n\n #throwIfRunning() {\n if (this.#filesDownloader)\n throw new DownloadError(`This instance of downloader is already in use. Please create a new one.`);\n }\n\n #throwIfNotRunning() {\n if (!this.#filesDownloader)\n throw new DownloadError(`This instance of downloader is not running yet. Please start the download first.`);\n }\n\n #generateDownloadId(): string {\n return `${this.#transferId}_${this.#cryptography.generateRandomString(10)}`;\n }\n\n #mapTransferFilesDtosToFileInfos(files: Array<TransferFileDto>) {\n return files.map(file => new DownloadFileInfo(\n file.fileid,\n file.downloadurl,\n file.filename,\n file.filesize,\n ));\n }\n\n #validateOptions() {\n if (!this.#options.downloadFolder && !this.#options.downloadFolderTemplate)\n throw new DownloadError(`downloadFolder OR downloadFolderTemplate is required`);\n\n if (this.#options.maxChunkSize !== null && this.#options.maxChunkSize! <= 0)\n throw new DownloadError(`maxChunkSize must be greater than 0. Provide \"null\" if you want to download without chunking.`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"downloaderCore.js","sourceRoot":"","sources":["../../../../src/client/downloader/downloaderCore.ts"],"names":[],"mappings":"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","sourcesContent":["import ApiError from \"../../utils/api/apiError.js\";\nimport DownloadErrorCode from \"../../downloader/dtos/downloadErrorCode.js\";\nimport TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\nimport FilesDownloader from \"../../downloader/filesDownloader.js\";\nimport DownloadFileInfo from \"../../downloader/dtos/downloadFileInfo.js\";\nimport TransferConcurrencyController from \"../../utils/concurrencyController/transferConcurrencyController.js\";\nimport DownloadError from '../../downloader/dtos/downloadError.js';\nimport UrlUtil from \"../../utils/api/urlUtil.js\";\nimport DownloadTracker from \"../../downloader/downloadTracker.js\";\nimport FilesPreparer from \"../../downloader/filesPreparer.js\";\nimport DownloadFolderResolver from \"../../downloader/downloadFolderResolver.js\";\nimport DownloadRegistrationMode from \"../../downloader/dtos/downloadRegistrationMode.js\";\n\nimport type DownloadOptions from \"../../downloader/downloadOptions.js\";\nimport type ApiClient from \"../../utils/api/apiClient.js\";\nimport type ThrottlingOptions from '../../utils/networking/throttlingOptions.js';\nimport TransferStatus from '../../utils/types/transferStatus.js';\nimport type GetTransferResponse from \"../../utils/api/dtos/getTransferResponse.js\";\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\nimport type TransferFileDto from \"../../utils/api/dtos/transferFileDto.js\";\nimport type GetTransferRequest from \"../../utils/api/dtos/getTransferRequest.js\";\nimport type DownloadCommand from \"../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../downloader/dtos/downloadFilesCommand.js\";\nimport type DownloaderRestoredState from \"../../downloader/dtos/downloaderRestoredState.js\";\nimport type ChunkStreamProviderFactory from \"../../utils/fileSystem/chunkStreamProviderFactory.js\";\nimport type FileServerClientFactory from \"../../utils/api/fileServerClientFactory.js\";\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport type FileSystemService from \"../../utils/fileSystem/fileSystemService.js\";\nimport type DownloadLogger from \"../../downloader/downloadLogger.js\";\nimport type DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\nimport type { DownloadCommandE2eeData } from \"../../downloader/dtos/downloadCommand.js\";\nimport type { DownloadTrackingMetadataE2eeData } from \"../../downloader/dtos/downloadTrackingMetadata.js\";\nimport type CryptographyProvider from \"../../utils/crypto/cryptographyProvider.js\";\nimport type TransferDownloaderHealthMonitor from \"../healthMonitor/transferDownloaderHealthMonitor.js\";\nimport ChunkMD5ProviderFactory from \"../../downloader/md5Provider/downloaderChunkMD5ProviderFactory.js\";\n\nexport default class DownloaderCore {\n readonly #apiClient: ApiClient;\n readonly #options: DownloadOptions;\n readonly #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\n readonly #chunkMD5ProviderFactory: ChunkMD5ProviderFactory<string>;\n readonly #fileserverClientFactory: FileServerClientFactory;\n readonly #fileSystem: FileSystemService;\n readonly #eventsEngine: EventsEngine;\n readonly #logger: DownloadLogger;\n readonly #cryptography: CryptographyProvider;\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\n\n #downloadId?: string;\n #transferId?: string;\n #trackId?: string;\n #filesDownloader: FilesDownloader | null = null;\n #downloadTracker: DownloadTracker | null = null;\n #downloadRegistrationMode: DownloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n constructor(options: DownloadOptions, logger: DownloadLogger, apiClient: ApiClient, chunkStreamProviderFactory: ChunkStreamProviderFactory<string>, chunkMD5ProviderFactory: ChunkMD5ProviderFactory<string>, fileserverClientFactory: FileServerClientFactory, fileSystem: FileSystemService, eventsEngine: EventsEngine, cryptography: CryptographyProvider, healthMonitor: TransferDownloaderHealthMonitor) {\n this.#options = options;\n this.#logger = logger;\n this.#apiClient = apiClient;\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#chunkMD5ProviderFactory = chunkMD5ProviderFactory;\n this.#fileserverClientFactory = fileserverClientFactory;\n this.#fileSystem = fileSystem;\n this.#eventsEngine = eventsEngine;\n this.#cryptography = cryptography;\n this.#healthMonitor = healthMonitor;\n }\n\n get status(): TransferStatus | null {\n if (this.#filesDownloader === null)\n return null;\n\n return this.#filesDownloader.status;\n }\n\n get state(): DownloadEventArgs | null {\n if (this.#filesDownloader === null)\n return null;\n\n return this.#filesDownloader.getCurrentState(true);\n }\n\n get downloadId(): string | undefined {\n return this.#downloadId;\n }\n\n async pause(options: { interruptPendingChunks: boolean }): Promise<boolean> {\n this.#throwIfNotRunning();\n\n const paused = await new Promise<boolean>(resolve => {\n const pauseOptions = { ...options, pausedTrigger: resolve };\n this.#filesDownloader!.requestPause(pauseOptions);\n });\n\n if (paused)\n this.#healthMonitor.stop();\n\n if (paused)\n await this.#downloadTracker?.saveState();\n\n return paused;\n }\n\n resume(): boolean {\n this.#throwIfNotRunning();\n const result = this.#filesDownloader!.resume();\n if (result)\n this.#healthMonitor.start();\n return result;\n }\n\n abort(): boolean {\n this.#throwIfNotRunning();\n const aborted = this.#filesDownloader!.requestAbort();\n if (aborted)\n this.#healthMonitor.stop();\n return aborted;\n }\n\n configureThrottling(options: ThrottlingOptions): void {\n this.#eventsEngine.emit(TransferDownloadEvent.ConfigureThrottling, options);\n }\n\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, 0);\n\n this.#downloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n return this.#downloadZipped(transfer, command.e2eeDataOrTextKey);\n }\n\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, -1);\n\n this.#downloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n return this.#download(transfer, transfer.files, command.e2eeDataOrTextKey);\n }\n\n async downloadSpecificFiles(command: DownloadFilesCommand) {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, 0);\n\n this.#downloadRegistrationMode = typeof transfer.numberoffiles === `number` && command.files.length === transfer.numberoffiles\n ? DownloadRegistrationMode.Transfer\n : DownloadRegistrationMode.EverySingleFile;\n\n return this.#download(transfer, command.files, command.e2eeDataOrTextKey);\n }\n\n async restartFailedDownloader() {\n if (!this.#downloadTracker)\n throw new Error(`Download tracker hasn't been initialized`);\n if (!this.#options.downloadTrackingBaseFolder)\n throw new Error(`Download tracking base folder hasn't been populated`);\n if (this.#filesDownloader?.status !== TransferStatus.Failed && this.#filesDownloader?.status !== TransferStatus.Aborted)\n throw new Error(`Downloader has to be in Failed or Aborted stated`);\n\n const downloadMetadata = await DownloadTracker.restoreDownloadMetadata(this.#downloadId!, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n const downloadCommandE2eeData = this.createDownloadCommandE2eeDataFromMetadata(downloadMetadata.e2eeData);\n const restoredOptions = await this.#downloadTracker.restoreDownloadOptions();\n\n // keep restart behavior deterministic by reusing the exact options used in the original run\n this.#options.downloadFolder = restoredOptions.downloadFolder;\n this.#options.downloadTrackingBaseFolder = restoredOptions.downloadTrackingBaseFolder;\n this.#options.maxChunkSize = restoredOptions.maxChunkSize;\n this.#options.checkChunksMd5 = restoredOptions.checkChunksMd5;\n\n // find out from disk the entire list of files, which were in progress and how many chunks have completed already\n const downloaderState = await this.#downloadTracker.restoreDownloaderState();\n\n // restart from where we left off\n const runningInfo = this.#run(downloaderState.files, downloadCommandE2eeData, downloadMetadata.region, downloaderState.state);\n runningInfo.then((di: DownloadInfo) => {\n this.#eventsEngine.emit(TransferDownloadEvent.RecoveredInterruptedDownload, di.initialState);\n });\n return runningInfo;\n }\n\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\n this.#logger.applyDownloadId(downloadId);\n this.#logger.logInfo(`Download recovery requested for ${downloadId}`);\n\n this.#throwIfRunning();\n\n if (!this.#options.downloadTrackingBaseFolder)\n throw new DownloadError(`The download tracking folder is not specified for ${downloadId}`, undefined, DownloadErrorCode.TrackingNotAvailable);\n\n this.#downloadId = downloadId;\n this.#transferId = downloadId.split(`_`)[0]!;\n this.#logger.applyTransferId(this.#transferId);\n\n const downloadMetadata = await DownloadTracker.restoreDownloadMetadata(this.#downloadId!, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n\n const downloadCommandE2eeData = this.createDownloadCommandE2eeDataFromMetadata(downloadMetadata.e2eeData);\n\n this.#downloadTracker = new DownloadTracker(this.#downloadId!, this.#options, this.#fileSystem, this.#eventsEngine, downloadCommandE2eeData, downloadMetadata.region);\n const restoredOptions = await this.#downloadTracker.restoreDownloadOptions();\n\n // just make sure we are running the same config as when the download was last dumped to disk - otherwise things could get out of sync\n this.#options.downloadFolder = restoredOptions.downloadFolder;\n this.#options.downloadTrackingBaseFolder = restoredOptions.downloadTrackingBaseFolder;\n this.#options.maxChunkSize = restoredOptions.maxChunkSize;\n this.#options.checkChunksMd5 = restoredOptions.checkChunksMd5;\n\n // find out from disk the entire list of files, which were in progress and how many chunks have completed already\n const downloaderState = await this.#downloadTracker.restoreDownloaderState();\n\n // restart from where we left off\n const runningInfo = this.#run(downloaderState.files, downloadCommandE2eeData, downloadMetadata.region, downloaderState.state);\n runningInfo.then((di: DownloadInfo) => {\n this.#eventsEngine.emit(TransferDownloadEvent.RecoveredInterruptedDownload, di.initialState);\n });\n return runningInfo;\n }\n\n private createDownloadCommandE2eeDataFromMetadata(metadataE2eeData?: DownloadTrackingMetadataE2eeData): DownloadCommandE2eeData | undefined {\n if (!metadataE2eeData)\n return undefined;\n\n return {\n iv: Buffer.from(metadataE2eeData.ivAsHex, `hex`),\n key: Buffer.from(metadataE2eeData.keyAsHex, `hex`),\n };\n }\n\n async cleanupDownload(downloadId: string | null = null) {\n const cleanupDownloadId = downloadId ?? this.#downloadId;\n\n if (!cleanupDownloadId)\n throw new DownloadError(`Cannot cleanup unknown download`);\n\n if (!this.#options.downloadTrackingBaseFolder)\n throw new DownloadError(`The download tracking folder is not specified for download ${cleanupDownloadId}`);\n\n this.#logger.applyDownloadId(cleanupDownloadId);\n\n await DownloadTracker.removeDownloadTrackingFolder(cleanupDownloadId, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n }\n\n async #downloadZipped(transfer: GetTransferResponse, e2eeDataOrTextKey?: DownloadCommandE2eeData | string): Promise<DownloadInfo> {\n const fsClient = this.#fileserverClientFactory.createFileServerDownloadClient(transfer.compressedfileurl!, null, null, transfer.id, ``, this.#options);\n const metaData = await fsClient.getCompressedFileMetadata();\n\n // for now fileservers are not able to validate md5 for chunks of the zip\n // note: this should be rather handled in files downloader logic\n this.#options.checkChunksMd5 = false;\n\n const zipFile: TransferFileDto = {\n downloadurl: transfer.compressedfileurl!,\n fileid: UrlUtil.getQueryStringFromUrl(transfer.compressedfileurl!).compressedfilekey!,\n filename: metaData.fileName,\n filesize: metaData.fileSize,\n compressed: true,\n };\n\n return this.#download(transfer, [zipFile], e2eeDataOrTextKey);\n }\n\n async #download(transfer: GetTransferResponse, files: Array<TransferFileDto>, e2eeDataOrTextKey?: DownloadCommandE2eeData | string): Promise<DownloadInfo> {\n this.#transferId = transfer.id;\n this.#downloadId = this.#generateDownloadId();\n\n this.#logger.applyDownloadId(this.#downloadId);\n this.#logger.applyTransferId(this.#transferId);\n\n if (this.#options.downloadFolderTemplate)\n this.#options.downloadFolder = DownloadFolderResolver.prepareDownloadFolder(this.#options.downloadFolderTemplate!, transfer);\n\n const e2eeData = await this.#getE2eeDataOrThrow(transfer, e2eeDataOrTextKey);\n\n const downloadFiles = this.#mapTransferFilesDtosToFileInfos(files);\n const preparer = new FilesPreparer(this.#options.downloadFolder!, this.#options.maxChunkSize, this.#fileSystem);\n preparer.prepareFiles(downloadFiles);\n\n return this.#run(downloadFiles, e2eeData, transfer.region);\n }\n\n async #getE2eeDataOrThrow(transfer: GetTransferResponse, e2eeDataOrTextKey?: string | DownloadCommandE2eeData): Promise<DownloadCommandE2eeData | undefined> {\n if (!transfer.e2ee)\n return undefined;\n\n if (!e2eeDataOrTextKey)\n throw new DownloadError(`No E2EE data or text key available to decrypt the transfer`);\n\n if (typeof e2eeDataOrTextKey === `object`)\n return e2eeDataOrTextKey;\n\n if (!transfer.e2ee_keyhash)\n throw new DownloadError(`No E2EE db data available to decrypt the transfer`);\n\n const e2eeDbDataBuffer = Buffer.from(transfer.e2ee_keyhash, `hex`);\n\n const iv = e2eeDbDataBuffer.subarray(0, 16);\n const salt = e2eeDbDataBuffer.subarray(16, 32);\n const key = await this.#cryptography.deriveKey(e2eeDataOrTextKey, salt);\n\n return { iv, key: Buffer.from(key) };\n }\n\n async #run(downloadFiles: Array<DownloadFileInfo>, e2eeData?: DownloadCommandE2eeData, region?: string, restoredState?: DownloaderRestoredState): Promise<DownloadInfo> {\n if (!this.#transferId)\n throw new DownloadError(`This downloader has no transfer ID specified`);\n\n if (!this.#downloadId)\n throw new DownloadError(`This downloader has no download ID initialized`);\n\n this.#filesDownloader = new FilesDownloader(\n this.#logger,\n this.#transferId!,\n this.#trackId,\n this.#downloadId!,\n region,\n downloadFiles,\n restoredState,\n this.#fileSystem,\n new TransferConcurrencyController(this.#options.parallelChunks!),\n this.#eventsEngine,\n this.#cryptography,\n this.#options,\n this.#apiClient,\n this.#fileserverClientFactory,\n this.#chunkStreamProviderFactory,\n this.#chunkMD5ProviderFactory,\n this.#downloadRegistrationMode,\n e2eeData,\n );\n\n if (this.#options.downloadTrackingBaseFolder) {\n if (!this.#downloadTracker)\n this.#downloadTracker = new DownloadTracker(this.#downloadId!, this.#options, this.#fileSystem, this.#eventsEngine, e2eeData, region);\n\n await this.#downloadTracker.start(downloadFiles);\n }\n\n const initialState = this.#filesDownloader.getCurrentState(false);\n\n this.#healthMonitor.start();\n\n const completion = this.#filesDownloader.start();\n\n completion.finally(() => {\n this.#healthMonitor.stop();\n });\n\n return { downloadId: this.#downloadId!, transferId: this.#transferId!, completion, initialState };\n }\n\n async #getEffectiveTransfer(command: DownloadCommand, fileslimit: number) {\n let effectiveTransfer: GetTransferResponse | null = null;\n\n if (command.transfer)\n effectiveTransfer = await this.#fetchTransfer(command.transfer, undefined, command.password, fileslimit, command.checkLogintoken);\n\n if (!effectiveTransfer) {\n // still don't know the transfer - must use track ID to fetch it\n if (!this.#trackId)\n throw new DownloadError(`Could not resolve transfer to be downloaded - missing transfer info and missing track id`);\n\n effectiveTransfer = await this.#fetchTransfer(undefined, this.#trackId!, command.password, fileslimit, command.checkLogintoken);\n }\n\n if (!effectiveTransfer)\n throw new DownloadError(`Could not resolve transfer to be downloaded - transfer=${command.transfer} track=${command.trackId}`);\n\n if (effectiveTransfer.isexpired === true)\n throw new DownloadError(`Transfer is expired transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.TransferExpired);\n\n if (effectiveTransfer.blockdownloads === true)\n throw new DownloadError(`Transfer has downloads disabled transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.DownloadsDisabled);\n\n if (fileslimit !== 0 && (!effectiveTransfer.files || effectiveTransfer.files.length === 0))\n throw new DownloadError(`Transfer has no files to download transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.NoFilesToDownload);\n\n return effectiveTransfer;\n }\n\n async #fetchTransfer(\n transferid?: string | undefined,\n trackid?: string | undefined,\n password?: string | undefined,\n fileslimit?: number | undefined,\n checkLogintoken?: boolean,\n ): Promise<GetTransferResponse> {\n try {\n // specifying which file properties we want to get from API\n // reason: api adds lots of other unnecessary properties - downloader doesn't need them and if a transfer has lots of files (some can be up to 100k)\n // it makes the response much smaller (up to 80% size reduction)\n const request: GetTransferRequest = { fileslimit, transferid, trackid, password, fprops: [`fileid`, `filesize`, `filename`, `downloadurl`], checkLogintoken };\n return await this.#apiClient.getTransfer(request);\n }\n catch (error) {\n const code = this.#apiErrorToDownloadErrorCode(error);\n const downloadError = new DownloadError(`Could not fetch transfer by id=${transferid ?? `---`} track=${trackid ?? `---`}`, { cause: error as Error }, code);\n throw downloadError;\n }\n }\n\n #apiErrorToDownloadErrorCode(error: unknown) {\n if (error instanceof ApiError) {\n switch (error.httpStatus) {\n case 401: return DownloadErrorCode.InvalidTransferPassword;\n case 404: return DownloadErrorCode.TransferNotFound;\n case 409: return DownloadErrorCode.TransferInvalidState;\n default: break;\n }\n }\n return undefined;\n }\n\n #throwIfRunning() {\n if (this.#filesDownloader)\n throw new DownloadError(`This instance of downloader is already in use. Please create a new one.`);\n }\n\n #throwIfNotRunning() {\n if (!this.#filesDownloader)\n throw new DownloadError(`This instance of downloader is not running yet. Please start the download first.`);\n }\n\n #generateDownloadId(): string {\n return `${this.#transferId}_${this.#cryptography.generateRandomString(10)}`;\n }\n\n #mapTransferFilesDtosToFileInfos(files: Array<TransferFileDto>) {\n return files.map(file => new DownloadFileInfo(\n file.fileid,\n file.downloadurl,\n file.filename,\n file.filesize,\n ));\n }\n\n #validateOptions() {\n if (!this.#options.downloadFolder && !this.#options.downloadFolderTemplate)\n throw new DownloadError(`downloadFolder OR downloadFolderTemplate is required`);\n\n if (this.#options.maxChunkSize !== null && this.#options.maxChunkSize! <= 0)\n throw new DownloadError(`maxChunkSize must be greater than 0. Provide \"null\" if you want to download without chunking.`);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeTransferDownloader.d.ts","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,MAAM,wCAAwC,CAAC;AAErE,OAAO,qBAAqB,MAAM,2CAA2C,CAAC;AAQ9E,OAAO,+BAA+B,MAAM,wDAAwD,CAAC;
|
|
1
|
+
{"version":3,"file":"nodeTransferDownloader.d.ts","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import logHealthyStatus from '../../loggers/utils/logHealthyStatus.js';
|
|
|
15
15
|
import NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';
|
|
16
16
|
import TransferHealthMonitorEvent from '../../healthMonitor/events/transferHealthMonitorEvent.js';
|
|
17
17
|
import logEventPropertyName from '../../../utils/logging/logEventPropertyNames.js';
|
|
18
|
+
import NodeOnDemandMD5ProviderFactory from '../../../downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.js';
|
|
18
19
|
export default class NodeTransferDownloader {
|
|
19
20
|
#eventsEngine;
|
|
20
21
|
#downloader;
|
|
@@ -28,7 +29,8 @@ export default class NodeTransferDownloader {
|
|
|
28
29
|
const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, optionsResolved.apiRequestTotalTimeoutInMs, optionsResolved.apiRetryLimit);
|
|
29
30
|
if (optionsResolved.logintoken)
|
|
30
31
|
apiClient.setLoginToken(optionsResolved.logintoken);
|
|
31
|
-
const
|
|
32
|
+
const chunkStreamProviderFactory = new NodeChunkStreamProviderFactory();
|
|
33
|
+
const chunkMD5ProviderFactory = new NodeOnDemandMD5ProviderFactory(chunkStreamProviderFactory);
|
|
32
34
|
const fileserverClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, optionsResolved.fileserverDownloadIdleTimeMs, optionsResolved.fileserverAttemptLimit);
|
|
33
35
|
const fileSystem = new NodeFileSystemService();
|
|
34
36
|
const cryptography = new NodeCryptographyProvider();
|
|
@@ -36,7 +38,7 @@ export default class NodeTransferDownloader {
|
|
|
36
38
|
this.#eventsEngine = new NodeEventsEngine();
|
|
37
39
|
this.#healthMonitor = new TransferDownloaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), this.#eventsEngine);
|
|
38
40
|
this.#trackingId = optionsResolved.trackingId;
|
|
39
|
-
this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient,
|
|
41
|
+
this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient, chunkStreamProviderFactory, chunkMD5ProviderFactory, fileserverClientFactory, fileSystem, this.#eventsEngine, cryptography, this.#healthMonitor);
|
|
40
42
|
this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);
|
|
41
43
|
this.addHealthMonitorEventListeners();
|
|
42
44
|
this.addTransferEventListeners();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeTransferDownloader.js","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as guid } from 'uuid';\nimport throttle from \"lodash.throttle\";\n\nimport DownloadOptions from \"../../../downloader/downloadOptions.js\";\nimport DownloaderCore from \"../downloaderCore.js\";\nimport TransferDownloadEvent from \"../../../downloader/dtos/downloadEvent.js\";\nimport NodeFileServerClientFactory from \"../../../utils/api/node/nodeFileServerClientFactory.js\";\nimport NodeChunkStreamProviderFactory from \"../../../utils/fileSystem/node/nodeChunkStreamProviderFactory.js\";\nimport NodeFileSystemService from \"../../../utils/fileSystem/node/nodeFileSystemService.js\";\nimport NodeApiClient from \"../../../utils/api/node/nodeApiClient.js\";\nimport NodeEventsEngine from '../../../utils/events/node/nodeEventsEngine.js';\nimport DownloadLogger from \"../../../downloader/downloadLogger.js\";\nimport NodeCryptographyProvider from '../../../utils/crypto/node/nodeCryptographyProvider.js';\nimport TransferDownloaderHealthMonitor from '../../healthMonitor/transferDownloaderHealthMonitor.js';\nimport logHealthyStatus from '../../loggers/utils/logHealthyStatus.js';\nimport NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';\nimport TransferHealthMonitorEvent from '../../healthMonitor/events/transferHealthMonitorEvent.js';\nimport logEventPropertyName from '../../../utils/logging/logEventPropertyNames.js';\n\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferDownloader from \"../transferDownloader.js\";\nimport type DownloadEventArgs from '../../../downloader/eventArgs/downloadEventArgs.js';\nimport type FileDownloadEventArgs from '../../../downloader/eventArgs/fileDownloadEventArgs.js';\nimport type FileDownloadFailedEventArgs from '../../../downloader/eventArgs/fileDownloadFailedEventArgs.js';\nimport type TransferStatus from '../../../utils/types/transferStatus.js';\nimport type ChunkDownloadEventArgs from '../../../downloader/eventArgs/chunkDownloadEventArgs.js';\nimport type ChunkDownloadFailedEventArgs from '../../../downloader/eventArgs/chunkDownloadFailedEventArgs.js';\nimport type DownloadCompletedEventArgs from '../../../downloader/eventArgs/downloadCompletedEventArgs.js';\nimport type DownloadPauseEventArgs from \"../../../downloader/eventArgs/downloadPauseEventArgs.js\";\nimport type Logger from \"../../loggers/logger.js\";\nimport type DownloadInfo from \"../../../downloader/dtos/downloadInfo.js\";\nimport type DownloadCommand from \"../../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../../downloader/dtos/downloadFilesCommand.js\";\nimport type DownloadTrackingFailedEventArgs from \"../../../downloader/eventArgs/downloadTrackingFailedEventArgs.js\";\nimport type DownloadMetadataDeterminedEventArgs from '../../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js';\n\nexport default class NodeTransferDownloader implements TransferDownloader {\n readonly #eventsEngine: NodeEventsEngine;\n readonly #downloader: DownloaderCore;\n readonly #logger: DownloadLogger;\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\n readonly #trackingId: string | number;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(options: DownloadOptions, envValues: EnvironmentVariables, logger: Logger) {\n const optionsResolved = this.#buildOptions(options);\n\n const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, optionsResolved.apiRequestTotalTimeoutInMs, optionsResolved.apiRetryLimit);\n if (optionsResolved.logintoken)\n apiClient.setLoginToken(optionsResolved.logintoken);\n\n const chunkProvider = new NodeChunkStreamProviderFactory();\n const fileserverClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, optionsResolved.fileserverDownloadIdleTimeMs!, optionsResolved.fileserverAttemptLimit!);\n const fileSystem = new NodeFileSystemService();\n const cryptography = new NodeCryptographyProvider();\n\n this.#logger = new DownloadLogger(logger, optionsResolved.trackingId!);\n this.#eventsEngine = new NodeEventsEngine();\n this.#healthMonitor = new TransferDownloaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), this.#eventsEngine);\n this.#trackingId = optionsResolved.trackingId!;\n\n this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient, chunkProvider, fileserverClientFactory, fileSystem, this.#eventsEngine, cryptography, this.#healthMonitor);\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\n\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, logEntryMetadata);\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, logEntryMetadata);\n\n this.#isHealthy = true;\n });\n\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {\n if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)\n return;\n\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\n\n this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, logEntryMetadata);\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, logEntryMetadata);\n\n this.#isHealthy = false;\n });\n }\n\n private getHealthStatusLogEntryMetadata(): Record<string, unknown> {\n const metadata: Record<string, unknown> = {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n };\n\n const state = this.#downloader.state;\n\n if (state?.transferId)\n metadata[logEventPropertyName.TransferIdPropertyName] = state.transferId;\n\n if (state?.downloadId)\n metadata[logEventPropertyName.DownloadIdPropertyName] = state.downloadId;\n\n return metadata;\n }\n\n private addTransferEventListeners() {\n this.addEventListener(TransferDownloadEvent.DownloadStarted, args => {\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download started`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.Aborting, args => this.#logger.logInfo(`Download aborting ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Aborted, args => this.#logger.logInfo(`Download aborted ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Pausing, args => this.#logger.logInfo(`Download pausing ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.Paused, args => this.#logger.logInfo(`Download paused ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.RecoveredInterruptedDownload, args => this.#logger.logInfo(`Download recovered ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.DownloadCompleted, args => {\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download completed`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.FileDownloadStarted, args => this.#logger.logDebug(`File download started`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadCompleted, args => this.#logger.logDebug(`File download completed`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadFailed, args => {\n const { reason, ...errorInfoWithoutException } = args;\n this.#logger.logError(reason, `File download failed`, errorInfoWithoutException);\n });\n this.addEventListener(TransferDownloadEvent.DownloadTrackingFailed, args => {\n const { error, ...errorInfoWithoutException } = args;\n if (error)\n this.#logger.logError(error, `Progress tracking failed`, errorInfoWithoutException);\n else\n this.#logger.logWarning(`Progress tracking failed`, errorInfoWithoutException);\n });\n }\n\n #buildOptions(options: DownloadOptions) {\n const opts = { ...new DownloadOptions(), ...options };\n if (!opts.trackingId)\n opts.trackingId = guid();\n return opts;\n }\n\n get status(): TransferStatus | null {\n return this.#downloader.status;\n }\n\n get state(): DownloadEventArgs | null {\n return this.#downloader.state;\n }\n\n get downloadId(): string | undefined {\n return this.#downloader.downloadId;\n }\n\n get healthMonitor(): TransferDownloaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n async pause(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: false });\n }\n\n async stop(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: true });\n }\n\n resume(): boolean {\n return this.#downloader.resume();\n }\n\n abort(): boolean {\n return this.#downloader.abort();\n }\n\n addEventListener(eventName:\n TransferDownloadEvent.Aborting |\n TransferDownloadEvent.Aborted |\n TransferDownloadEvent.Resumed |\n TransferDownloadEvent.RecoveredInterruptedDownload |\n TransferDownloadEvent.DownloadStarted |\n TransferDownloadEvent.DownloadProgressed, handler: (args: DownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.DownloadCompleted, handler: (args: DownloadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.Pausing | TransferDownloadEvent.Paused, handler: (args: DownloadPauseEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.NetworkFailure | TransferDownloadEvent.NetworkOk, handler: () => void): void\n addEventListener(eventName: TransferDownloadEvent.TransferMetadataDetermined, handler: (args: DownloadMetadataDeterminedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.ChunkDownloadStarted |\n TransferDownloadEvent.ChunkDownloadProgressed |\n TransferDownloadEvent.ChunkDownloadCompleted, handler: (args: ChunkDownloadEventArgs) => void): void;\n\n addEventListener(eventName: TransferDownloadEvent.ChunkDownloadFailed, handler: (args: ChunkDownloadFailedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.PossibleSupersizedFile |\n TransferDownloadEvent.FileDownloadStarted |\n TransferDownloadEvent.FileDownloadProgressed |\n TransferDownloadEvent.FileDownloadCompleting |\n TransferDownloadEvent.FileDownloadCompleted, handler: (args: FileDownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.FileDownloadFailed, handler: (args: FileDownloadFailedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.DownloadTrackingFailed, handler: (args: DownloadTrackingFailedEventArgs) => void): void\n\n addEventListener(eventName: string, handler: (args?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n private cancelHealthyStatusThrottledMethod(promise: Promise<DownloadInfo>) {\n promise.then(downloadInfo => downloadInfo.completion.finally(() => this.#logHealthyStatusThrottled.cancel()));\n }\n\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFilesZipped(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadSpecificFiles(command: DownloadFilesCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadSpecificFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async restartFailedDownloader(): Promise<DownloadInfo> {\n const promise = this.#downloader.restartFailedDownloader();\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\n const promise = this.#downloader.recoverInterruptedDownload(downloadId);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async cleanupDownload(downloadId: string | null = null) {\n await this.#downloader.cleanupDownload(downloadId);\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"nodeTransferDownloader.js","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as guid } from 'uuid';\nimport throttle from \"lodash.throttle\";\n\nimport DownloadOptions from \"../../../downloader/downloadOptions.js\";\nimport DownloaderCore from \"../downloaderCore.js\";\nimport TransferDownloadEvent from \"../../../downloader/dtos/downloadEvent.js\";\nimport NodeFileServerClientFactory from \"../../../utils/api/node/nodeFileServerClientFactory.js\";\nimport NodeChunkStreamProviderFactory from \"../../../utils/fileSystem/node/nodeChunkStreamProviderFactory.js\";\nimport NodeFileSystemService from \"../../../utils/fileSystem/node/nodeFileSystemService.js\";\nimport NodeApiClient from \"../../../utils/api/node/nodeApiClient.js\";\nimport NodeEventsEngine from '../../../utils/events/node/nodeEventsEngine.js';\nimport DownloadLogger from \"../../../downloader/downloadLogger.js\";\nimport NodeCryptographyProvider from '../../../utils/crypto/node/nodeCryptographyProvider.js';\nimport TransferDownloaderHealthMonitor from '../../healthMonitor/transferDownloaderHealthMonitor.js';\nimport logHealthyStatus from '../../loggers/utils/logHealthyStatus.js';\nimport NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';\nimport TransferHealthMonitorEvent from '../../healthMonitor/events/transferHealthMonitorEvent.js';\nimport logEventPropertyName from '../../../utils/logging/logEventPropertyNames.js';\nimport NodeOnDemandMD5ProviderFactory from '../../../downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.js';\n\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferDownloader from \"../transferDownloader.js\";\nimport type DownloadEventArgs from '../../../downloader/eventArgs/downloadEventArgs.js';\nimport type FileDownloadEventArgs from '../../../downloader/eventArgs/fileDownloadEventArgs.js';\nimport type FileDownloadFailedEventArgs from '../../../downloader/eventArgs/fileDownloadFailedEventArgs.js';\nimport type TransferStatus from '../../../utils/types/transferStatus.js';\nimport type ChunkDownloadEventArgs from '../../../downloader/eventArgs/chunkDownloadEventArgs.js';\nimport type ChunkDownloadFailedEventArgs from '../../../downloader/eventArgs/chunkDownloadFailedEventArgs.js';\nimport type DownloadCompletedEventArgs from '../../../downloader/eventArgs/downloadCompletedEventArgs.js';\nimport type DownloadPauseEventArgs from \"../../../downloader/eventArgs/downloadPauseEventArgs.js\";\nimport type Logger from \"../../loggers/logger.js\";\nimport type DownloadInfo from \"../../../downloader/dtos/downloadInfo.js\";\nimport type DownloadCommand from \"../../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../../downloader/dtos/downloadFilesCommand.js\";\nimport type DownloadTrackingFailedEventArgs from \"../../../downloader/eventArgs/downloadTrackingFailedEventArgs.js\";\nimport type DownloadMetadataDeterminedEventArgs from '../../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js';\n\nexport default class NodeTransferDownloader implements TransferDownloader {\n readonly #eventsEngine: NodeEventsEngine;\n readonly #downloader: DownloaderCore;\n readonly #logger: DownloadLogger;\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\n readonly #trackingId: string | number;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(options: DownloadOptions, envValues: EnvironmentVariables, logger: Logger) {\n const optionsResolved = this.#buildOptions(options);\n\n const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, optionsResolved.apiRequestTotalTimeoutInMs, optionsResolved.apiRetryLimit);\n if (optionsResolved.logintoken)\n apiClient.setLoginToken(optionsResolved.logintoken);\n\n const chunkStreamProviderFactory = new NodeChunkStreamProviderFactory();\n const chunkMD5ProviderFactory = new NodeOnDemandMD5ProviderFactory(chunkStreamProviderFactory);\n const fileserverClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, optionsResolved.fileserverDownloadIdleTimeMs!, optionsResolved.fileserverAttemptLimit!);\n const fileSystem = new NodeFileSystemService();\n const cryptography = new NodeCryptographyProvider();\n\n this.#logger = new DownloadLogger(logger, optionsResolved.trackingId!);\n this.#eventsEngine = new NodeEventsEngine();\n this.#healthMonitor = new TransferDownloaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), this.#eventsEngine);\n this.#trackingId = optionsResolved.trackingId!;\n\n this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient, chunkStreamProviderFactory, chunkMD5ProviderFactory, fileserverClientFactory, fileSystem, this.#eventsEngine, cryptography, this.#healthMonitor);\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\n\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, logEntryMetadata);\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, logEntryMetadata);\n\n this.#isHealthy = true;\n });\n\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {\n if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)\n return;\n\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\n\n this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, logEntryMetadata);\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, logEntryMetadata);\n\n this.#isHealthy = false;\n });\n }\n\n private getHealthStatusLogEntryMetadata(): Record<string, unknown> {\n const metadata: Record<string, unknown> = {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n };\n\n const state = this.#downloader.state;\n\n if (state?.transferId)\n metadata[logEventPropertyName.TransferIdPropertyName] = state.transferId;\n\n if (state?.downloadId)\n metadata[logEventPropertyName.DownloadIdPropertyName] = state.downloadId;\n\n return metadata;\n }\n\n private addTransferEventListeners() {\n this.addEventListener(TransferDownloadEvent.DownloadStarted, args => {\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download started`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.Aborting, args => this.#logger.logInfo(`Download aborting ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Aborted, args => this.#logger.logInfo(`Download aborted ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Pausing, args => this.#logger.logInfo(`Download pausing ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.Paused, args => this.#logger.logInfo(`Download paused ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.RecoveredInterruptedDownload, args => this.#logger.logInfo(`Download recovered ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.DownloadCompleted, args => {\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download completed`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.FileDownloadStarted, args => this.#logger.logDebug(`File download started`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadCompleted, args => this.#logger.logDebug(`File download completed`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadFailed, args => {\n const { reason, ...errorInfoWithoutException } = args;\n this.#logger.logError(reason, `File download failed`, errorInfoWithoutException);\n });\n this.addEventListener(TransferDownloadEvent.DownloadTrackingFailed, args => {\n const { error, ...errorInfoWithoutException } = args;\n if (error)\n this.#logger.logError(error, `Progress tracking failed`, errorInfoWithoutException);\n else\n this.#logger.logWarning(`Progress tracking failed`, errorInfoWithoutException);\n });\n }\n\n #buildOptions(options: DownloadOptions) {\n const opts = { ...new DownloadOptions(), ...options };\n if (!opts.trackingId)\n opts.trackingId = guid();\n return opts;\n }\n\n get status(): TransferStatus | null {\n return this.#downloader.status;\n }\n\n get state(): DownloadEventArgs | null {\n return this.#downloader.state;\n }\n\n get downloadId(): string | undefined {\n return this.#downloader.downloadId;\n }\n\n get healthMonitor(): TransferDownloaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n async pause(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: false });\n }\n\n async stop(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: true });\n }\n\n resume(): boolean {\n return this.#downloader.resume();\n }\n\n abort(): boolean {\n return this.#downloader.abort();\n }\n\n addEventListener(eventName:\n TransferDownloadEvent.Aborting |\n TransferDownloadEvent.Aborted |\n TransferDownloadEvent.Resumed |\n TransferDownloadEvent.RecoveredInterruptedDownload |\n TransferDownloadEvent.DownloadStarted |\n TransferDownloadEvent.DownloadProgressed, handler: (args: DownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.DownloadCompleted, handler: (args: DownloadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.Pausing | TransferDownloadEvent.Paused, handler: (args: DownloadPauseEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.NetworkFailure | TransferDownloadEvent.NetworkOk, handler: () => void): void\n addEventListener(eventName: TransferDownloadEvent.TransferMetadataDetermined, handler: (args: DownloadMetadataDeterminedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.ChunkDownloadStarted |\n TransferDownloadEvent.ChunkDownloadProgressed |\n TransferDownloadEvent.ChunkDownloadCompleted, handler: (args: ChunkDownloadEventArgs) => void): void;\n\n addEventListener(eventName: TransferDownloadEvent.ChunkDownloadFailed, handler: (args: ChunkDownloadFailedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.PossibleSupersizedFile |\n TransferDownloadEvent.FileDownloadStarted |\n TransferDownloadEvent.FileDownloadProgressed |\n TransferDownloadEvent.FileDownloadCompleting |\n TransferDownloadEvent.FileDownloadCompleted, handler: (args: FileDownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.FileDownloadFailed, handler: (args: FileDownloadFailedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.DownloadTrackingFailed, handler: (args: DownloadTrackingFailedEventArgs) => void): void\n\n addEventListener(eventName: string, handler: (args?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n private cancelHealthyStatusThrottledMethod(promise: Promise<DownloadInfo>) {\n promise.then(downloadInfo => downloadInfo.completion.finally(() => this.#logHealthyStatusThrottled.cancel()));\n }\n\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFilesZipped(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadSpecificFiles(command: DownloadFilesCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadSpecificFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async restartFailedDownloader(): Promise<DownloadInfo> {\n const promise = this.#downloader.restartFailedDownloader();\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\n const promise = this.#downloader.recoverInterruptedDownload(downloadId);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async cleanupDownload(downloadId: string | null = null) {\n await this.#downloader.cleanupDownload(downloadId);\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeTransferUploader.d.ts","sourceRoot":"","sources":["../../../../../src/client/uploader/node/nodeTransferUploader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nodeTransferUploader.d.ts","sourceRoot":"","sources":["../../../../../src/client/uploader/node/nodeTransferUploader.ts"],"names":[],"mappings":"AASA,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAS9D,OAAO,KAAK,eAAe,MAAM,mDAAmD,CAAC;AACrF,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAClD,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,kBAAkB,MAAM,iDAAiD,CAAC;AACtF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AACrG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACtG,OAAO,KAAK,sBAAsB,MAAM,8BAA8B,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,oBAAoB,CAAC,eAAe,CAAC;gBACvE,YAAY,EAAE,kBAAkB,CAAC,eAAe,CAAC,GAAG,wBAAwB,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;gBAC9K,UAAU,EAAE,wBAAwB,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;CAyCrJ"}
|
|
@@ -4,23 +4,29 @@ import TransferUploadAcker from "../../../uploader/transferUploadAcker.js";
|
|
|
4
4
|
import NodeApiClient from "../../../utils/api/node/nodeApiClient.js";
|
|
5
5
|
import NodeEventsEngine from "../../../utils/events/node/nodeEventsEngine.js";
|
|
6
6
|
import NodeFileServerClientFactory from "../../../utils/api/node/nodeFileServerClientFactory.js";
|
|
7
|
-
import NodeFileDetailsUploaderChunkStreamProviderFactory from "../../../uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.js";
|
|
8
7
|
import TransferConcurrencyController from "../../../utils/concurrencyController/transferConcurrencyController.js";
|
|
9
8
|
import NodeCryptographyProvider from "../../../utils/crypto/node/nodeCryptographyProvider.js";
|
|
10
9
|
import TransferUploaderBase from "../transferUploaderBase.js";
|
|
11
10
|
import { buildUploadConfig, isTransferInfo, fixTransferInfo } from "../utils/uploaderUtils.js";
|
|
12
11
|
import TransferUploaderHealthMonitor from '../../healthMonitor/transferUploaderHealthMonitor.js';
|
|
13
12
|
import NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';
|
|
13
|
+
import NodeFileDetailsUploaderChunkStreamProviderFactory from '../../../uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.js';
|
|
14
|
+
import NodeAsyncMD5ComputationStrategy from '../../../uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.js';
|
|
15
|
+
import DefaultMD5ComputationStrategyFactory from '../../../uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js';
|
|
16
|
+
import PrecomputedMD5Provider from '../../../uploader/md5Provider/precomputedMD5Provider.js';
|
|
14
17
|
export default class NodeTransferUploader extends TransferUploaderBase {
|
|
15
18
|
constructor(transferInfoOrExportData, config, envValues, logger) {
|
|
16
19
|
const trackingId = config.trackingId || guid();
|
|
17
20
|
const eventsEngine = new NodeEventsEngine();
|
|
18
21
|
const chunkStreamProviderFactory = new NodeFileDetailsUploaderChunkStreamProviderFactory();
|
|
19
|
-
const
|
|
22
|
+
const uploadConcurrencyController = new TransferConcurrencyController(config.chunksUploadInParallel);
|
|
20
23
|
const fileServerClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, config.uploadIdleTimeoutInMs, config.chunkUploadRetryLimit);
|
|
21
24
|
const cryptography = new NodeCryptographyProvider();
|
|
22
25
|
const uploadConfig = buildUploadConfig(config);
|
|
23
26
|
const healthMonitor = new TransferUploaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), eventsEngine);
|
|
27
|
+
const md5ComputationStrategyFactory = new DefaultMD5ComputationStrategyFactory(new NodeAsyncMD5ComputationStrategy());
|
|
28
|
+
const md5ConcurrencyController = new TransferConcurrencyController(config.chunksUploadInParallel);
|
|
29
|
+
const md5Provider = new PrecomputedMD5Provider(md5ComputationStrategyFactory, `base64`, chunkStreamProviderFactory, md5ConcurrencyController);
|
|
24
30
|
const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, config.apiRequestTotalTimeoutInMs, config.apiRetryLimit);
|
|
25
31
|
if (config.logintoken)
|
|
26
32
|
apiClient.setLoginToken(config.logintoken);
|
|
@@ -30,11 +36,11 @@ export default class NodeTransferUploader extends TransferUploaderBase {
|
|
|
30
36
|
if (isTransferInfo(transferInfoOrExportData)) {
|
|
31
37
|
fixTransferInfo(transferInfoOrExportData);
|
|
32
38
|
fileDetails = transferInfoOrExportData.files;
|
|
33
|
-
transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfoOrExportData, uploadConfig,
|
|
39
|
+
transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfoOrExportData, uploadConfig, uploadConcurrencyController, cryptography, acker, md5Provider);
|
|
34
40
|
}
|
|
35
41
|
else {
|
|
36
42
|
fileDetails = transferInfoOrExportData.info.files;
|
|
37
|
-
transfer = TransferUpload.recreate(transferInfoOrExportData, uploadConfig, chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine,
|
|
43
|
+
transfer = TransferUpload.recreate(transferInfoOrExportData, uploadConfig, chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, uploadConcurrencyController, cryptography, acker, md5Provider);
|
|
38
44
|
}
|
|
39
45
|
super(transfer, fileDetails, config, envValues, logger, healthMonitor, trackingId);
|
|
40
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeTransferUploader.js","sourceRoot":"","sources":["../../../../../src/client/uploader/node/nodeTransferUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,mBAAmB,MAAM,0CAA0C,CAAC;AAC3E,OAAO,aAAa,MAAM,0CAA0C,CAAC;AACrE,OAAO,gBAAgB,MAAM,gDAAgD,CAAC;AAC9E,OAAO,2BAA2B,MAAM,wDAAwD,CAAC;AACjG,OAAO,
|
|
1
|
+
{"version":3,"file":"nodeTransferUploader.js","sourceRoot":"","sources":["../../../../../src/client/uploader/node/nodeTransferUploader.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as guid } from 'uuid';\n\nimport TransferUpload from \"../../../uploader/transferUpload.js\";\nimport TransferUploadAcker from \"../../../uploader/transferUploadAcker.js\";\nimport NodeApiClient from \"../../../utils/api/node/nodeApiClient.js\";\nimport NodeEventsEngine from \"../../../utils/events/node/nodeEventsEngine.js\";\nimport NodeFileServerClientFactory from \"../../../utils/api/node/nodeFileServerClientFactory.js\";\nimport TransferConcurrencyController from \"../../../utils/concurrencyController/transferConcurrencyController.js\";\nimport NodeCryptographyProvider from \"../../../utils/crypto/node/nodeCryptographyProvider.js\";\nimport TransferUploaderBase from \"../transferUploaderBase.js\";\nimport { buildUploadConfig, isTransferInfo, fixTransferInfo } from \"../utils/uploaderUtils.js\";\nimport TransferUploaderHealthMonitor from '../../healthMonitor/transferUploaderHealthMonitor.js';\nimport NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';\nimport NodeFileDetailsUploaderChunkStreamProviderFactory from '../../../uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.js';\nimport NodeAsyncMD5ComputationStrategy from '../../../uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.js';\nimport DefaultMD5ComputationStrategyFactory from '../../../uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js';\nimport PrecomputedMD5Provider from '../../../uploader/md5Provider/precomputedMD5Provider.js';\n\nimport type NodeFileDetails from \"../../../utils/fileSystem/node/nodeFileDetails.js\";\nimport type Logger from \"../../loggers/logger.js\";\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferUploadInfo from \"../../../uploader/options/transferUploadInfo.js\";\nimport type { TransferUploadExportData } from \"../../../uploader/export/transferUploadExportData.js\";\nimport type { TransferUploadAppendInfo } from \"../../../uploader/options/transferUploadAppendInfo.js\";\nimport type TransferUploaderConfig from \"../transferUploaderConfig.js\";\n\nexport default class NodeTransferUploader extends TransferUploaderBase<NodeFileDetails> {\n constructor(transferInfo: TransferUploadInfo<NodeFileDetails> | TransferUploadAppendInfo<NodeFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger)\n constructor(exportData: TransferUploadExportData<NodeFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger)\n constructor(transferInfoOrExportData: (TransferUploadInfo<NodeFileDetails> | TransferUploadAppendInfo<NodeFileDetails>) | TransferUploadExportData<NodeFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger) {\n const trackingId = config.trackingId || guid();\n\n const eventsEngine = new NodeEventsEngine();\n const chunkStreamProviderFactory = new NodeFileDetailsUploaderChunkStreamProviderFactory();\n const uploadConcurrencyController = new TransferConcurrencyController(config.chunksUploadInParallel);\n const fileServerClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, config.uploadIdleTimeoutInMs, config.chunkUploadRetryLimit);\n const cryptography = new NodeCryptographyProvider();\n const uploadConfig = buildUploadConfig(config);\n const healthMonitor = new TransferUploaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), eventsEngine);\n\n const md5ComputationStrategyFactory = new DefaultMD5ComputationStrategyFactory(new NodeAsyncMD5ComputationStrategy());\n const md5ConcurrencyController = new TransferConcurrencyController(config.chunksUploadInParallel);\n const md5Provider = new PrecomputedMD5Provider<NodeFileDetails>(md5ComputationStrategyFactory, `base64`, chunkStreamProviderFactory, md5ConcurrencyController);\n\n const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, config.apiRequestTotalTimeoutInMs, config.apiRetryLimit);\n\n if (config.logintoken)\n apiClient.setLoginToken(config.logintoken);\n\n const acker = new TransferUploadAcker(apiClient, eventsEngine, config.fileAckIntervalInMs);\n\n let fileDetails: NodeFileDetails[] | undefined;\n let transfer: TransferUpload<NodeFileDetails>;\n\n if (isTransferInfo(transferInfoOrExportData)) {\n fixTransferInfo(transferInfoOrExportData);\n\n fileDetails = transferInfoOrExportData.files;\n\n transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfoOrExportData, uploadConfig, uploadConcurrencyController, cryptography, acker, md5Provider);\n }\n else {\n fileDetails = transferInfoOrExportData.info.files;\n\n transfer = TransferUpload.recreate(transferInfoOrExportData, uploadConfig, chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, uploadConcurrencyController, cryptography, acker, md5Provider);\n }\n\n super(transfer, fileDetails, config, envValues, logger, healthMonitor, trackingId);\n }\n}"]}
|
|
@@ -144,7 +144,7 @@ export default class TransferUploaderBase {
|
|
|
144
144
|
this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadFailed, eventArgs => {
|
|
145
145
|
const errorMessage = `File ${eventArgs.fileStatus.externalId} having uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} upload failed: ${eventArgs.reason}`;
|
|
146
146
|
this.logError(eventArgs.error, errorMessage);
|
|
147
|
-
const isFileAccessError = eventArgs.error.cause instanceof FsError;
|
|
147
|
+
const isFileAccessError = eventArgs.error instanceof FsError || eventArgs.error.cause instanceof FsError;
|
|
148
148
|
const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);
|
|
149
149
|
if (isFileAccessError && !this.#isShuttingDown) {
|
|
150
150
|
this.#failedReason = `Can't read ${fullFilePathOrName} anymore`;
|