filemail-sdk 9.4.10 → 10.2.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/autoDownloader/autoDownloader.d.ts.map +1 -1
- package/dist/src/autoDownloader/autoDownloader.js +0 -1
- package/dist/src/autoDownloader/autoDownloader.js.map +1 -1
- package/dist/src/client/downloader/downloaderCore.js +1 -1
- 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 +0 -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 +6 -5
- package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderBase.d.ts +2 -0
- package/dist/src/client/uploader/transferUploaderBase.d.ts.map +1 -1
- package/dist/src/client/uploader/transferUploaderBase.js +45 -31
- package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderConfig.d.ts +3 -4
- package/dist/src/client/uploader/transferUploaderConfig.d.ts.map +1 -1
- package/dist/src/client/uploader/transferUploaderConfig.js.map +1 -1
- package/dist/src/client/uploader/utils/uploaderUtils.d.ts.map +1 -1
- package/dist/src/client/uploader/utils/uploaderUtils.js +1 -2
- package/dist/src/client/uploader/utils/uploaderUtils.js.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.d.ts.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.js +5 -4
- package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
- package/dist/src/downloader/api/node/nodeFileServerDownloadClient.d.ts.map +1 -1
- package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js +6 -2
- package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js.map +1 -1
- package/dist/src/downloader/chunkDownloader.d.ts.map +1 -1
- package/dist/src/downloader/chunkDownloader.js +2 -3
- package/dist/src/downloader/chunkDownloader.js.map +1 -1
- package/dist/src/downloader/downloadTracker.d.ts.map +1 -1
- package/dist/src/downloader/downloadTracker.js +0 -1
- package/dist/src/downloader/downloadTracker.js.map +1 -1
- package/dist/src/downloader/filesDownloader.d.ts.map +1 -1
- package/dist/src/downloader/filesDownloader.js +0 -1
- package/dist/src/downloader/filesDownloader.js.map +1 -1
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js +5 -4
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.js +5 -4
- package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.d.ts +1 -3
- package/dist/src/uploader/chunksIterator/chunksIterator.d.ts.map +1 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.js +4 -4
- package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.d.ts +8 -0
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.d.ts.map +1 -0
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js +2 -0
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js.map +1 -0
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.d.ts +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.d.ts +1 -0
- package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.d.ts +1 -0
- package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileUploadEventArgs.d.ts +1 -0
- package/dist/src/uploader/eventArgs/fileUploadEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/fileUploadEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.d.ts +6 -0
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.d.ts.map +1 -0
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js +2 -0
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js.map +1 -0
- package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.d.ts +6 -0
- package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.d.ts.map +1 -0
- package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js +2 -0
- package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js.map +1 -0
- package/dist/src/uploader/export/transferUploadExportData.d.ts +4 -1
- package/dist/src/uploader/export/transferUploadExportData.d.ts.map +1 -1
- package/dist/src/uploader/export/transferUploadExportData.js.map +1 -1
- package/dist/src/uploader/export/transferUploadExportState.d.ts +4 -1
- package/dist/src/uploader/export/transferUploadExportState.d.ts.map +1 -1
- package/dist/src/uploader/export/transferUploadExportState.js.map +1 -1
- package/dist/src/uploader/export/transferUploadMetadata.d.ts +0 -9
- package/dist/src/uploader/export/transferUploadMetadata.d.ts.map +1 -1
- package/dist/src/uploader/export/transferUploadMetadata.js.map +1 -1
- package/dist/src/uploader/options/transferUploadAppendInfo.d.ts +1 -0
- package/dist/src/uploader/options/transferUploadAppendInfo.d.ts.map +1 -1
- package/dist/src/uploader/options/transferUploadAppendInfo.js.map +1 -1
- package/dist/src/uploader/options/transferUploadConfig.d.ts +1 -2
- package/dist/src/uploader/options/transferUploadConfig.d.ts.map +1 -1
- package/dist/src/uploader/options/transferUploadConfig.js.map +1 -1
- package/dist/src/uploader/pendingFileAck.d.ts +7 -0
- package/dist/src/uploader/pendingFileAck.d.ts.map +1 -0
- package/dist/src/uploader/pendingFileAck.js +2 -0
- package/dist/src/uploader/pendingFileAck.js.map +1 -0
- package/dist/src/uploader/registeredTransferFile.d.ts +6 -0
- package/dist/src/uploader/registeredTransferFile.d.ts.map +1 -0
- package/dist/src/uploader/registeredTransferFile.js +2 -0
- package/dist/src/uploader/registeredTransferFile.js.map +1 -0
- package/dist/src/uploader/state/continuousChunksCalculator.d.ts +1 -0
- package/dist/src/uploader/state/continuousChunksCalculator.d.ts.map +1 -1
- package/dist/src/uploader/state/continuousChunksCalculator.js +8 -2
- package/dist/src/uploader/state/continuousChunksCalculator.js.map +1 -1
- package/dist/src/uploader/state/transferUploadState.d.ts +11 -8
- package/dist/src/uploader/state/transferUploadState.d.ts.map +1 -1
- package/dist/src/uploader/state/transferUploadState.js +57 -28
- package/dist/src/uploader/state/transferUploadState.js.map +1 -1
- package/dist/src/uploader/state/transferUploadStateFile.d.ts +1 -0
- package/dist/src/uploader/state/transferUploadStateFile.d.ts.map +1 -1
- package/dist/src/uploader/state/transferUploadStateFile.js +1 -0
- package/dist/src/uploader/state/transferUploadStateFile.js.map +1 -1
- package/dist/src/uploader/transferFilesRegistrar.d.ts +30 -0
- package/dist/src/uploader/transferFilesRegistrar.d.ts.map +1 -0
- package/dist/src/uploader/transferFilesRegistrar.js +158 -0
- package/dist/src/uploader/transferFilesRegistrar.js.map +1 -0
- package/dist/src/uploader/transferUpload.d.ts +21 -14
- package/dist/src/uploader/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +122 -142
- package/dist/src/uploader/transferUpload.js.map +1 -1
- package/dist/src/uploader/transferUploadAcker.d.ts +18 -0
- package/dist/src/uploader/transferUploadAcker.d.ts.map +1 -0
- package/dist/src/uploader/transferUploadAcker.js +123 -0
- package/dist/src/uploader/transferUploadAcker.js.map +1 -0
- package/dist/src/uploader/transferUploadEvent.d.ts +4 -1
- package/dist/src/uploader/transferUploadEvent.d.ts.map +1 -1
- package/dist/src/uploader/transferUploadEvent.js +4 -1
- package/dist/src/uploader/transferUploadEvent.js.map +1 -1
- package/dist/src/utils/api/apiClient.d.ts +6 -0
- package/dist/src/utils/api/apiClient.d.ts.map +1 -1
- package/dist/src/utils/api/apiClient.js.map +1 -1
- package/dist/src/utils/api/apiClientBase.d.ts +0 -2
- package/dist/src/utils/api/apiClientBase.d.ts.map +1 -1
- package/dist/src/utils/api/apiClientBase.js +6 -13
- package/dist/src/utils/api/apiClientBase.js.map +1 -1
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.d.ts +9 -0
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.d.ts.map +1 -0
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.js +2 -0
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.js.map +1 -0
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.d.ts +7 -0
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.d.ts.map +1 -0
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.js +2 -0
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.js.map +1 -0
- package/dist/src/utils/api/dtos/finalizeTransferRequest.d.ts +1 -1
- package/dist/src/utils/api/dtos/finalizeTransferRequest.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/finalizeTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts +1 -0
- package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferResponse.d.ts +0 -9
- package/dist/src/utils/api/dtos/initializeTransferResponse.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts +18 -0
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts.map +1 -0
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.js +2 -0
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.js.map +1 -0
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts +9 -0
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts.map +1 -0
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.js +2 -0
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.js.map +1 -0
- package/dist/src/utils/api/fileServerClientFactory.d.ts +2 -4
- package/dist/src/utils/api/fileServerClientFactory.d.ts.map +1 -1
- package/dist/src/utils/api/fileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/node/nodeApiClient.d.ts +6 -0
- package/dist/src/utils/api/node/nodeApiClient.d.ts.map +1 -1
- package/dist/src/utils/api/node/nodeApiClient.js +26 -2
- package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
- package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts +2 -4
- package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts.map +1 -1
- package/dist/src/utils/api/node/nodeFileServerClientFactory.js +3 -7
- package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/web/webApiClient.d.ts +6 -0
- package/dist/src/utils/api/web/webApiClient.d.ts.map +1 -1
- package/dist/src/utils/api/web/webApiClient.js +24 -2
- package/dist/src/utils/api/web/webApiClient.js.map +1 -1
- package/dist/src/utils/api/web/webFileServerClientFactory.d.ts +2 -4
- package/dist/src/utils/api/web/webFileServerClientFactory.d.ts.map +1 -1
- package/dist/src/utils/api/web/webFileServerClientFactory.js +3 -6
- package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeFileSystemService.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeFileSystemService.js +0 -3
- package/dist/src/utils/fileSystem/node/nodeFileSystemService.js.map +1 -1
- package/dist/src/utils/mergeAbortAndPauseSignals.d.ts +6 -1
- package/dist/src/utils/mergeAbortAndPauseSignals.d.ts.map +1 -1
- package/dist/src/utils/mergeAbortAndPauseSignals.js +14 -7
- package/dist/src/utils/mergeAbortAndPauseSignals.js.map +1 -1
- package/dist/src/utils/promiseAll.d.ts.map +1 -1
- package/dist/src/utils/promiseAll.js +0 -1
- package/dist/src/utils/promiseAll.js.map +1 -1
- package/package.json +1 -2
- package/dist/src/uploader/api/dtos/handshakeRequest.d.ts +0 -6
- package/dist/src/uploader/api/dtos/handshakeRequest.d.ts.map +0 -1
- package/dist/src/uploader/api/dtos/handshakeRequest.js +0 -2
- package/dist/src/uploader/api/dtos/handshakeRequest.js.map +0 -1
- package/dist/src/uploader/api/dtos/handshakeResponse.d.ts +0 -6
- package/dist/src/uploader/api/dtos/handshakeResponse.d.ts.map +0 -1
- package/dist/src/uploader/api/dtos/handshakeResponse.js +0 -2
- package/dist/src/uploader/api/dtos/handshakeResponse.js.map +0 -1
- package/dist/src/uploader/api/dtos/pingResponse.d.ts +0 -5
- package/dist/src/uploader/api/dtos/pingResponse.d.ts.map +0 -1
- package/dist/src/uploader/api/dtos/pingResponse.js +0 -2
- package/dist/src/uploader/api/dtos/pingResponse.js.map +0 -1
- package/dist/src/uploader/api/dtos/sendChunkRequest.d.ts +0 -10
- package/dist/src/uploader/api/dtos/sendChunkRequest.d.ts.map +0 -1
- package/dist/src/uploader/api/dtos/sendChunkRequest.js +0 -2
- package/dist/src/uploader/api/dtos/sendChunkRequest.js.map +0 -1
- package/dist/src/uploader/api/fileServerUdpClient.d.ts +0 -19
- package/dist/src/uploader/api/fileServerUdpClient.d.ts.map +0 -1
- package/dist/src/uploader/api/fileServerUdpClient.js +0 -2
- package/dist/src/uploader/api/fileServerUdpClient.js.map +0 -1
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.d.ts +0 -39
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.d.ts.map +0 -1
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.js +0 -264
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.js.map +0 -1
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.d.ts +0 -7
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.d.ts.map +0 -1
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js +0 -2
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js.map +0 -1
- package/dist/src/uploader/optimizer/optimizationValues.d.ts +0 -9
- package/dist/src/uploader/optimizer/optimizationValues.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/optimizationValues.js +0 -2
- package/dist/src/uploader/optimizer/optimizationValues.js.map +0 -1
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts +0 -33
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js +0 -135
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map +0 -1
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.d.ts +0 -30
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js +0 -106
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js.map +0 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.d.ts +0 -20
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js +0 -2
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js.map +0 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizer.d.ts +0 -27
- package/dist/src/uploader/optimizer/transferUploadOptimizer.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizer.js +0 -169
- package/dist/src/uploader/optimizer/transferUploadOptimizer.js.map +0 -1
- package/dist/src/uploader/optimizer/uploadOptimizer.d.ts +0 -11
- package/dist/src/uploader/optimizer/uploadOptimizer.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/uploadOptimizer.js +0 -2
- package/dist/src/uploader/optimizer/uploadOptimizer.js.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import sleep from 'abortable-sleep';
|
|
2
|
-
import ApiError from '../utils/api/apiError.js';
|
|
3
|
-
import FsError from '../utils/fileSystem/fsError.js';
|
|
4
1
|
import TransferUploadState from "./state/transferUploadState.js";
|
|
5
2
|
import TransferUploadError from "./transferUploadError.js";
|
|
6
3
|
import TransferStatus from "../utils/types/transferStatus.js";
|
|
7
4
|
import TransferUploadEvent from './transferUploadEvent.js';
|
|
8
5
|
import ChunksIterator from './chunksIterator/chunksIterator.js';
|
|
6
|
+
import TransferFilesRegistrar from './transferFilesRegistrar.js';
|
|
9
7
|
import mergeAbortAndPauseSignals from '../utils/mergeAbortAndPauseSignals.js';
|
|
8
|
+
import ApiError from '../utils/api/apiError.js';
|
|
9
|
+
import FsError from '../utils/fileSystem/fsError.js';
|
|
10
10
|
import ApiFilemail449Error from '../utils/api/apiFilemail449Error.js';
|
|
11
11
|
import { promiseAllSettled } from '../utils/promiseAll.js';
|
|
12
12
|
import { isTransferFailureAbortReason } from './transferFailureAbortReason.js';
|
|
@@ -19,8 +19,9 @@ export default class TransferUpload {
|
|
|
19
19
|
#eventsEngine;
|
|
20
20
|
#info;
|
|
21
21
|
#config;
|
|
22
|
-
#
|
|
22
|
+
#concurrencyController;
|
|
23
23
|
#cryptography;
|
|
24
|
+
#acker;
|
|
24
25
|
#transferState;
|
|
25
26
|
#transferMetadata;
|
|
26
27
|
#transferDownloadUrl;
|
|
@@ -28,11 +29,10 @@ export default class TransferUpload {
|
|
|
28
29
|
#transferRecipientTrackingLinks;
|
|
29
30
|
#pauseSignal;
|
|
30
31
|
#abortSignal;
|
|
31
|
-
#
|
|
32
|
+
#mergedPauseAndAbortController;
|
|
33
|
+
#filesRegistrar;
|
|
32
34
|
pauseEventListener;
|
|
33
35
|
abortEventListener;
|
|
34
|
-
#isUdpUploadMode;
|
|
35
|
-
#serverLatencyInMs;
|
|
36
36
|
#isRunMethodRunning = false;
|
|
37
37
|
get status() {
|
|
38
38
|
return this.#transferState?.status ?? TransferStatus.Initialized;
|
|
@@ -63,21 +63,23 @@ export default class TransferUpload {
|
|
|
63
63
|
get transferId() {
|
|
64
64
|
return this.#transferMetadata?.transferId;
|
|
65
65
|
}
|
|
66
|
-
constructor(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, info, config,
|
|
66
|
+
constructor(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, info, config, concurrencyController, cryptography, acker) {
|
|
67
67
|
if (info.files.length === 0)
|
|
68
68
|
throw new TransferUploadError(`Files can't be empty`);
|
|
69
69
|
this.#totalSizeInBytes = info.files.reduce((partialSum, file) => partialSum + file.fileSizeInBytes, 0);
|
|
70
|
-
this.#isUdpUploadMode = false;
|
|
71
70
|
this.#chunkStreamProviderFactory = chunkStreamProviderFactory;
|
|
72
71
|
this.#apiClient = apiClient;
|
|
73
72
|
this.#fileServerClientFactory = fileServerClientFactory;
|
|
74
73
|
this.#eventsEngine = eventsEngine;
|
|
75
74
|
this.#info = info;
|
|
76
75
|
this.#config = config;
|
|
77
|
-
this.#
|
|
76
|
+
this.#concurrencyController = concurrencyController;
|
|
78
77
|
this.#cryptography = cryptography;
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
this.#acker = acker;
|
|
79
|
+
this.#filesRegistrar = this.isLegacyTransferAppend() ? undefined : new TransferFilesRegistrar(apiClient, eventsEngine, info.files);
|
|
80
|
+
}
|
|
81
|
+
isLegacyTransferAppend() {
|
|
82
|
+
return this.isUploadAppendInfo(this.#info) && (this.#info.isLegacyTransfer === undefined || this.#info.isLegacyTransfer === true);
|
|
81
83
|
}
|
|
82
84
|
isUploadAppend() {
|
|
83
85
|
return this.isUploadAppendInfo(this.#info);
|
|
@@ -85,16 +87,16 @@ export default class TransferUpload {
|
|
|
85
87
|
isUploadAppendInfo(info) {
|
|
86
88
|
return info.transferKey !== undefined;
|
|
87
89
|
}
|
|
88
|
-
createTransferMetadataFromInfo(
|
|
89
|
-
if (!this.isUploadAppendInfo(info))
|
|
90
|
+
createTransferMetadataFromInfo() {
|
|
91
|
+
if (!this.isUploadAppendInfo(this.#info))
|
|
90
92
|
throw new TransferUploadError(`Options are not TransferUploadAppendOptions`);
|
|
91
|
-
this.#transferDownloadUrl = info.transferDownloadUrl;
|
|
93
|
+
this.#transferDownloadUrl = this.#info.transferDownloadUrl;
|
|
92
94
|
this.#transferMetadata = {
|
|
93
|
-
transferId: info.transferId,
|
|
94
|
-
transferKey: info.transferKey,
|
|
95
|
-
transferFileServerUrl: info.transferFileServerUrl,
|
|
96
|
-
transferRegion: info.transferRegion,
|
|
97
|
-
encryptionData: info.e2eeData,
|
|
95
|
+
transferId: this.#info.transferId,
|
|
96
|
+
transferKey: this.#info.transferKey,
|
|
97
|
+
transferFileServerUrl: this.#info.transferFileServerUrl,
|
|
98
|
+
transferRegion: this.#info.transferRegion,
|
|
99
|
+
encryptionData: this.#info.e2eeData,
|
|
98
100
|
};
|
|
99
101
|
}
|
|
100
102
|
async run(transferPauseSignal, transferAbortSignal) {
|
|
@@ -103,34 +105,36 @@ export default class TransferUpload {
|
|
|
103
105
|
try {
|
|
104
106
|
this.#pauseSignal = transferPauseSignal;
|
|
105
107
|
this.#abortSignal = transferAbortSignal;
|
|
106
|
-
this.#
|
|
108
|
+
this.#mergedPauseAndAbortController = mergeAbortAndPauseSignals(transferPauseSignal, transferAbortSignal);
|
|
107
109
|
if (!this.#transferState)
|
|
108
110
|
this.#transferState = new TransferUploadState(this.files, this.#eventsEngine, this.#config.currentRatesTimespanInMs, this.#config.progressEventThrottlingInMs);
|
|
109
111
|
else
|
|
110
112
|
this.#transferState.recover();
|
|
111
113
|
this.#transferState.transferRun();
|
|
112
114
|
this.addPauseAndStopListeners();
|
|
113
|
-
if (!this.#transferMetadata)
|
|
115
|
+
if (this.isUploadAppend() && !this.#transferMetadata)
|
|
116
|
+
this.createTransferMetadataFromInfo();
|
|
117
|
+
else if (!this.#transferMetadata)
|
|
114
118
|
await this.startApiTransferAndCreateMetadata();
|
|
115
119
|
this.notifyMetadataDetermined();
|
|
116
|
-
|
|
117
|
-
if (this.#isUdpUploadMode && !this.#transferMetadata.udpData.handshakeData)
|
|
118
|
-
await this.serverUdpHandshake();
|
|
119
|
-
this.#optimizer.start(this.#isUdpUploadMode, this.#serverLatencyInMs);
|
|
120
|
+
this.startBackgroundWorkers(transferPauseSignal, transferAbortSignal);
|
|
120
121
|
const ongoingChunkUploads = new Set();
|
|
121
122
|
for (const file of this.files) {
|
|
122
123
|
const fileStatus = this.#transferState.getFile(file.externalId);
|
|
123
124
|
if (fileStatus.isCompleted)
|
|
124
125
|
continue;
|
|
126
|
+
const registrationResult = await this.waitUntilFileRegistered(file);
|
|
127
|
+
if (!registrationResult.isRegisteredSuccessfully)
|
|
128
|
+
continue;
|
|
129
|
+
if (fileStatus.isUploadCompleted) {
|
|
130
|
+
this.enqueueFileAck(file);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
125
133
|
const alreadySentChunks = this.#transferState.getChunksForFile(file.externalId);
|
|
126
|
-
const chunksIterator = new ChunksIterator(alreadySentChunks, file.fileSizeInBytes, this.#
|
|
134
|
+
const chunksIterator = new ChunksIterator(alreadySentChunks, file.fileSizeInBytes, this.#config.chunkSizeInBytes);
|
|
127
135
|
for (const chunk of chunksIterator.getChunksIterator()) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (this.#optimizer.currentSleepTimeInMs >= 1)
|
|
131
|
-
// eslint-disable-next-line no-await-in-loop
|
|
132
|
-
await sleep(this.#optimizer.currentSleepTimeInMs, this.#mergedPauseAndAbortSignal);
|
|
133
|
-
if (this.shouldStopSchedulingChunks()) {
|
|
136
|
+
const releaseSemaphore = await this.#concurrencyController.acquire();
|
|
137
|
+
if (this.shouldStopProcessing()) {
|
|
134
138
|
releaseSemaphore();
|
|
135
139
|
break;
|
|
136
140
|
}
|
|
@@ -139,21 +143,19 @@ export default class TransferUpload {
|
|
|
139
143
|
ongoingChunkUploads.delete(trackedChunkUploadPromise);
|
|
140
144
|
});
|
|
141
145
|
ongoingChunkUploads.add(trackedChunkUploadPromise);
|
|
142
|
-
if (this.
|
|
146
|
+
if (this.shouldStopProcessing())
|
|
143
147
|
break;
|
|
144
148
|
}
|
|
145
|
-
if (this.
|
|
149
|
+
if (this.shouldStopProcessing())
|
|
146
150
|
break;
|
|
147
151
|
}
|
|
148
152
|
await promiseAllSettled(Array.from(ongoingChunkUploads));
|
|
149
|
-
this.#
|
|
153
|
+
await this.#acker.flush();
|
|
150
154
|
if (this.#transferState.status === TransferStatus.Pausing)
|
|
151
155
|
this.#transferState.transferPaused();
|
|
152
156
|
else if (this.#transferState.status === TransferStatus.Aborting)
|
|
153
157
|
this.#transferState.transferAborted();
|
|
154
|
-
|
|
155
|
-
// this.#transferState.transferFailed();
|
|
156
|
-
else if (this.uploadedBytesCount !== this.totalSizeInBytes)
|
|
158
|
+
else if (this.uploadedBytesCount !== this.totalSizeInBytes || this.hasUnackedFiles())
|
|
157
159
|
this.#transferState.transferFailed();
|
|
158
160
|
else {
|
|
159
161
|
await this.finalizeTransfer();
|
|
@@ -164,10 +166,6 @@ export default class TransferUpload {
|
|
|
164
166
|
// We can get here with pausing or aborting status if any API call fails (e.g., finalizeTransfer) so we need to check the status again
|
|
165
167
|
if (!this.#transferState)
|
|
166
168
|
this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);
|
|
167
|
-
// else if (this.isFailureAbortRequested()) {
|
|
168
|
-
// this.#transferState.transferFailed();
|
|
169
|
-
// return;
|
|
170
|
-
// }
|
|
171
169
|
else if (this.#transferState.status === TransferStatus.Pausing) {
|
|
172
170
|
this.#transferState.transferPaused();
|
|
173
171
|
return;
|
|
@@ -184,80 +182,55 @@ export default class TransferUpload {
|
|
|
184
182
|
throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error });
|
|
185
183
|
}
|
|
186
184
|
finally {
|
|
185
|
+
await this.stopBackgroundWorkers();
|
|
187
186
|
this.removePauseAndStopListeners();
|
|
188
|
-
this.#optimizer.stop();
|
|
189
187
|
this.#isRunMethodRunning = false;
|
|
190
188
|
}
|
|
191
189
|
}
|
|
190
|
+
startBackgroundWorkers(transferPauseSignal, transferAbortSignal) {
|
|
191
|
+
const fileAckSuccessfullCallback = (externalFileId, uploadItemId) => this.#transferState.fileCompleted(externalFileId, uploadItemId);
|
|
192
|
+
const fileAckFailedCallback = (externalFileId, uploadItemId, reason, error) => this.#transferState.fileAckFailed(externalFileId, uploadItemId, reason, error);
|
|
193
|
+
this.#acker.start(this.#transferMetadata.transferId, this.#transferMetadata.transferKey, fileAckSuccessfullCallback, fileAckFailedCallback, transferPauseSignal, transferAbortSignal);
|
|
194
|
+
this.#filesRegistrar?.start(this.#transferMetadata.transferId, this.#transferMetadata.transferKey, this.#mergedPauseAndAbortController?.signal);
|
|
195
|
+
}
|
|
196
|
+
async stopBackgroundWorkers() {
|
|
197
|
+
await Promise.allSettled([
|
|
198
|
+
this.#filesRegistrar?.stop(),
|
|
199
|
+
this.#acker.stop(),
|
|
200
|
+
]);
|
|
201
|
+
}
|
|
202
|
+
async waitUntilFileRegistered(file) {
|
|
203
|
+
if (this.isLegacyTransfer())
|
|
204
|
+
return { isRegisteredSuccessfully: true };
|
|
205
|
+
return await this.#filesRegistrar.waitUntilFileRegistered(file.externalId);
|
|
206
|
+
}
|
|
192
207
|
notifyMetadataDetermined() {
|
|
193
|
-
if (!this.#transferMetadata)
|
|
194
|
-
return;
|
|
195
208
|
const eventArgs = {
|
|
196
209
|
transferId: this.#transferMetadata.transferId,
|
|
197
210
|
fileServerUrl: this.#transferMetadata.transferFileServerUrl,
|
|
198
211
|
region: this.#transferMetadata.transferRegion,
|
|
199
212
|
};
|
|
200
213
|
this.#eventsEngine.emit(TransferUploadEvent.TransferMetadataDetermined, eventArgs);
|
|
201
|
-
|
|
202
|
-
async pingServerAndChooseUploadMode() {
|
|
203
|
-
try {
|
|
204
|
-
if (this.#config.turnOffUdp)
|
|
205
|
-
throw new Error(`UDP is turned off`);
|
|
206
|
-
const udpData = this.#transferMetadata?.udpData;
|
|
207
|
-
if (!udpData)
|
|
208
|
-
throw new Error(`No UDP data is available`);
|
|
209
|
-
const requestTimeout = this.#config.forceUdp ? 3 * 1000 : this.getPingTimeout(udpData.threshold);
|
|
210
|
-
const retryDelay = 1000;
|
|
211
|
-
const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, requestTimeout, this.#mergedPauseAndAbortSignal, undefined, retryDelay);
|
|
212
|
-
await udpClient.connect();
|
|
213
|
-
const pingResult = await udpClient.ping();
|
|
214
|
-
udpClient.close().catch(() => { });
|
|
215
|
-
this.#serverLatencyInMs = pingResult.latencyInMs;
|
|
216
|
-
this.#isUdpUploadMode = pingResult.latencyInMs >= udpData.threshold;
|
|
217
|
-
const eventArgs = { isUdpMode: this.#isUdpUploadMode, latency: pingResult.latencyInMs };
|
|
218
|
-
this.#eventsEngine.emit(TransferUploadEvent.TransferUploadModeChosen, eventArgs);
|
|
219
|
-
}
|
|
220
|
-
catch (error) {
|
|
221
|
-
this.#isUdpUploadMode = false;
|
|
222
|
-
const eventArgs = { isUdpMode: this.#isUdpUploadMode, error: error };
|
|
223
|
-
this.#eventsEngine.emit(TransferUploadEvent.TransferUploadModeChosen, eventArgs);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
getPingTimeout(udpPingThreshold) {
|
|
227
|
-
const pingTimeout = Math.min(3 * 1000, udpPingThreshold * 20);
|
|
228
|
-
return Math.max(500, pingTimeout);
|
|
229
|
-
}
|
|
230
|
-
async serverUdpHandshake() {
|
|
231
|
-
const transferMetadata = this.#transferMetadata;
|
|
232
|
-
const udpData = transferMetadata.udpData;
|
|
233
|
-
const requestTimeout = this.getHandshakeTimeout();
|
|
234
|
-
const retryDelay = 1000;
|
|
235
|
-
const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, requestTimeout, this.#mergedPauseAndAbortSignal, undefined, retryDelay);
|
|
236
|
-
await udpClient.connect();
|
|
237
|
-
const handshakeRequest = { transferId: transferMetadata.transferId, transferKey: transferMetadata.transferKey };
|
|
238
|
-
const handshakeResponse = await udpClient.handshake(handshakeRequest);
|
|
239
|
-
udpClient.close().catch(() => { });
|
|
240
|
-
this.#transferMetadata.udpData.handshakeData = handshakeResponse;
|
|
241
|
-
}
|
|
242
|
-
getHandshakeTimeout() {
|
|
243
|
-
const timeout = Math.min(this.#serverLatencyInMs * 30, 30 * 1000);
|
|
244
|
-
return Math.max(2000, timeout);
|
|
214
|
+
this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);
|
|
245
215
|
}
|
|
246
216
|
async sendChunkAndKeepUpdatingState(file, chunkStartPosition, chunkSizeInBytes, releaseSemaphore) {
|
|
247
217
|
let uploadedBytesCount = 0;
|
|
218
|
+
const registeredFile = this.getRegisteredFile(file.externalId);
|
|
219
|
+
const uploadItemId = registeredFile?.uploadItemId;
|
|
248
220
|
try {
|
|
249
|
-
this.#transferState.chunkUploadStarted(file.externalId, chunkStartPosition, chunkSizeInBytes);
|
|
221
|
+
this.#transferState.chunkUploadStarted(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes);
|
|
250
222
|
const chunkStreamProvider = this.#chunkStreamProviderFactory.createChunkStreamProvider(file, chunkStartPosition, chunkSizeInBytes, this.#transferMetadata?.encryptionData);
|
|
251
223
|
const progressEventHandler = (eventArgs) => {
|
|
252
224
|
uploadedBytesCount += eventArgs.transferredBytesSinceLastEvent;
|
|
253
|
-
this.#transferState.chunkUploadProgressed(file.externalId, chunkStartPosition, chunkSizeInBytes, eventArgs);
|
|
225
|
+
this.#transferState.chunkUploadProgressed(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, eventArgs);
|
|
254
226
|
};
|
|
255
|
-
|
|
256
|
-
const latencyInMsIfUdp = this.#isUdpUploadMode ? response.latencyInMs : undefined;
|
|
227
|
+
await this.sendChunk(file, registeredFile?.fileId, chunkStreamProvider, progressEventHandler);
|
|
257
228
|
if (uploadedBytesCount === chunkSizeInBytes)
|
|
258
|
-
this.#transferState.chunkUploadCompleted(file.externalId, chunkStartPosition, chunkSizeInBytes
|
|
229
|
+
this.#transferState.chunkUploadCompleted(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes);
|
|
259
230
|
else
|
|
260
|
-
this.#transferState.chunkUploadCompletedPartially(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal.paused
|
|
231
|
+
this.#transferState.chunkUploadCompletedPartially(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal.paused);
|
|
232
|
+
if (this.#transferState.getFile(file.externalId).isUploadCompleted)
|
|
233
|
+
this.enqueueFileAck(file);
|
|
261
234
|
}
|
|
262
235
|
catch (error) {
|
|
263
236
|
const chunkError = error;
|
|
@@ -266,46 +239,22 @@ export default class TransferUpload {
|
|
|
266
239
|
&& chunkError.cause.message === `Wrong md5 hash`
|
|
267
240
|
&& this.#pauseSignal?.paused === true;
|
|
268
241
|
if (isTcpPausingError)
|
|
269
|
-
this.#transferState.chunkUploadCompletedPartially(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal.paused);
|
|
242
|
+
this.#transferState.chunkUploadCompletedPartially(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal.paused);
|
|
270
243
|
else {
|
|
271
244
|
const failedReason = this.getChunkFailedReason(error);
|
|
272
|
-
this.#transferState.chunkUploadFailed(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, failedReason, error);
|
|
245
|
+
this.#transferState.chunkUploadFailed(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, failedReason, error);
|
|
273
246
|
}
|
|
274
247
|
}
|
|
275
248
|
finally {
|
|
276
249
|
releaseSemaphore();
|
|
277
250
|
}
|
|
278
251
|
}
|
|
279
|
-
async sendChunk(file, chunkStreamProvider, progressEventHandler) {
|
|
280
|
-
if (this.#isUdpUploadMode)
|
|
281
|
-
return await this.sendChunkUsingUdp(file, chunkStreamProvider, progressEventHandler);
|
|
282
|
-
return await this.sendChunkUsingTcp(file, chunkStreamProvider, progressEventHandler);
|
|
283
|
-
}
|
|
284
|
-
async sendChunkUsingUdp(file, chunkStreamProvider, progressEventHandler) {
|
|
285
|
-
const transferMetadata = this.#transferMetadata;
|
|
286
|
-
const udpData = transferMetadata.udpData;
|
|
287
|
-
const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, this.#optimizer.currentRequestTimeoutInMs, this.#mergedPauseAndAbortSignal, 0);
|
|
288
|
-
const sendChunkRequest = {
|
|
289
|
-
sessionGuid: this.#transferMetadata.udpData.handshakeData.sessionGuid,
|
|
290
|
-
aesKey: this.#transferMetadata.udpData.handshakeData.aesKey,
|
|
291
|
-
chunkStartPosition: chunkStreamProvider.chunkStartPosition,
|
|
292
|
-
fileSizeInBytes: file.fileSizeInBytes,
|
|
293
|
-
fileDestinationPathInTransfer: file.fileDestinationPathInTransfer,
|
|
294
|
-
fileName: file.fileName,
|
|
295
|
-
};
|
|
296
|
-
await udpClient.connect();
|
|
297
|
-
const result = await udpClient.sendChunk(sendChunkRequest, chunkStreamProvider);
|
|
298
|
-
udpClient.close().catch(() => { });
|
|
299
|
-
const chunkProgressEventArgs = { transferredBytesTotal: chunkStreamProvider.chunkLengthInBytes, transferredBytesSinceLastEvent: chunkStreamProvider.chunkLengthInBytes };
|
|
300
|
-
progressEventHandler(chunkProgressEventArgs);
|
|
301
|
-
return result;
|
|
302
|
-
}
|
|
303
|
-
async sendChunkUsingTcp(file, chunkStreamProvider, progressEventHandler) {
|
|
252
|
+
async sendChunk(file, fileId, chunkStreamProvider, progressEventHandler) {
|
|
304
253
|
const request = {
|
|
305
254
|
chunkLengthInBytes: chunkStreamProvider.chunkLengthInBytes,
|
|
306
255
|
chunkStartPosition: chunkStreamProvider.chunkStartPosition,
|
|
307
256
|
};
|
|
308
|
-
const fileServerClient = this.#fileServerClientFactory.
|
|
257
|
+
const fileServerClient = this.#fileServerClientFactory.createFileServerUploadClient(this.#transferMetadata.transferFileServerUrl, this.#transferMetadata.transferId, this.#transferMetadata.transferKey, file.fileName, file.fileDestinationPathInTransfer, file.fileSizeInBytes, fileId);
|
|
309
258
|
const ongoingRequestPromise = fileServerClient.sendFileChunk(request, chunkStreamProvider, this.#pauseSignal, this.#abortSignal);
|
|
310
259
|
fileServerClient.addEventListener(`progress`, progressEventHandler);
|
|
311
260
|
await ongoingRequestPromise;
|
|
@@ -354,8 +303,9 @@ export default class TransferUpload {
|
|
|
354
303
|
removePauseAndStopListeners() {
|
|
355
304
|
this.#pauseSignal.removeEventListener(`pause`, this.pauseEventListener);
|
|
356
305
|
this.#abortSignal.removeEventListener(`abort`, this.abortEventListener);
|
|
306
|
+
this.#mergedPauseAndAbortController?.dispose();
|
|
357
307
|
}
|
|
358
|
-
|
|
308
|
+
shouldStopProcessing() {
|
|
359
309
|
return this.#transferState.status !== TransferStatus.Running || this.#abortSignal?.aborted === true || this.#pauseSignal?.paused === true;
|
|
360
310
|
}
|
|
361
311
|
isFailureAbortRequested() {
|
|
@@ -385,20 +335,40 @@ export default class TransferUpload {
|
|
|
385
335
|
filerequestshareid: this.#info.fileRequestShareId,
|
|
386
336
|
customfields: this.#info.customFields,
|
|
387
337
|
};
|
|
388
|
-
const response = await this.#apiClient.initializeTransfer(request, this.#
|
|
338
|
+
const response = await this.#apiClient.initializeTransfer(request, this.#mergedPauseAndAbortController?.signal);
|
|
389
339
|
this.#transferMetadata = {
|
|
390
340
|
transferId: response.transferId,
|
|
391
341
|
transferKey: response.transferKey,
|
|
392
342
|
transferFileServerUrl: response.transferUrl,
|
|
393
343
|
transferRegion: response.transferRegion,
|
|
394
344
|
encryptionData: encryptionDataAndIvSaltHex?.encryptionData,
|
|
395
|
-
udpData: this.getResponseOrForcedUdpData(response),
|
|
396
345
|
};
|
|
397
346
|
}
|
|
398
347
|
catch (error) {
|
|
399
348
|
throw new TransferUploadError(`Error initializing transfer through the API`, { cause: error });
|
|
400
349
|
}
|
|
401
350
|
}
|
|
351
|
+
getRegisteredFile(externalFileId) {
|
|
352
|
+
return this.#filesRegistrar?.getRegisteredFile(externalFileId);
|
|
353
|
+
}
|
|
354
|
+
enqueueFileAck(file) {
|
|
355
|
+
if (this.isLegacyTransfer()) {
|
|
356
|
+
this.#transferState.fileCompleted(file.externalId, undefined);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
const registeredFile = this.getRegisteredFile(file.externalId);
|
|
360
|
+
if (!registeredFile)
|
|
361
|
+
throw new TransferUploadError(`Can't ack file with external id = ${file.externalId} - no registered file found. The transfer state is malformed.`);
|
|
362
|
+
this.#acker.enqueue({ externalFileId: file.externalId, uploadItemId: registeredFile.uploadItemId, sizeInBytes: file.fileSizeInBytes });
|
|
363
|
+
}
|
|
364
|
+
hasUnackedFiles() {
|
|
365
|
+
if (this.isLegacyTransfer())
|
|
366
|
+
return false;
|
|
367
|
+
return this.files.some(file => !this.#transferState.getFile(file.externalId).isCompleted);
|
|
368
|
+
}
|
|
369
|
+
isLegacyTransfer() {
|
|
370
|
+
return this.#filesRegistrar === undefined;
|
|
371
|
+
}
|
|
402
372
|
async generateEncryptionDataAndIvSaltHmacHex(e2eeKey) {
|
|
403
373
|
if (!e2eeKey)
|
|
404
374
|
return undefined;
|
|
@@ -415,14 +385,6 @@ export default class TransferUpload {
|
|
|
415
385
|
ivSaltHmacHex,
|
|
416
386
|
};
|
|
417
387
|
}
|
|
418
|
-
getResponseOrForcedUdpData(response) {
|
|
419
|
-
if (!this.#config.forceUdp || !response.udp)
|
|
420
|
-
return response.udp;
|
|
421
|
-
return {
|
|
422
|
-
...response.udp,
|
|
423
|
-
threshold: 0,
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
388
|
async finalizeTransfer() {
|
|
427
389
|
this.#eventsEngine.emit(TransferUploadEvent.TransferFinalizing);
|
|
428
390
|
if (this.isUploadAppend())
|
|
@@ -435,7 +397,7 @@ export default class TransferUpload {
|
|
|
435
397
|
const request = {
|
|
436
398
|
transferid: this.#transferMetadata.transferId,
|
|
437
399
|
};
|
|
438
|
-
await this.#apiClient.resetTransfer(request, this.#
|
|
400
|
+
await this.#apiClient.resetTransfer(request, this.#mergedPauseAndAbortController?.signal);
|
|
439
401
|
}
|
|
440
402
|
catch (error) {
|
|
441
403
|
throw new TransferUploadError(`Error resetting transfer through the API`, { cause: error });
|
|
@@ -446,9 +408,9 @@ export default class TransferUpload {
|
|
|
446
408
|
const request = {
|
|
447
409
|
transferid: this.#transferMetadata.transferId,
|
|
448
410
|
transferkey: this.#transferMetadata.transferKey,
|
|
449
|
-
protocol:
|
|
411
|
+
protocol: `tcp`,
|
|
450
412
|
};
|
|
451
|
-
const response = await this.#apiClient.finalizeTransfer(request, this.#
|
|
413
|
+
const response = await this.#apiClient.finalizeTransfer(request, this.#mergedPauseAndAbortController?.signal);
|
|
452
414
|
this.#transferDownloadUrl = response.downloadUrl;
|
|
453
415
|
this.#transferConfirmationUrl = response.confirmationUrl;
|
|
454
416
|
this.#transferRecipientTrackingLinks = response.recipientTrackingLinks;
|
|
@@ -459,7 +421,7 @@ export default class TransferUpload {
|
|
|
459
421
|
}
|
|
460
422
|
async cancel(abortSignal) {
|
|
461
423
|
try {
|
|
462
|
-
const isTransferApiInitialized = Boolean(this.#transferState) && Boolean(this.#transferMetadata);
|
|
424
|
+
const isTransferApiInitialized = Boolean(this.#transferState) && (Boolean(this.#transferMetadata) || this.isUploadAppend());
|
|
463
425
|
if (!isTransferApiInitialized) {
|
|
464
426
|
this.emitCancelEvents();
|
|
465
427
|
return;
|
|
@@ -523,10 +485,22 @@ export default class TransferUpload {
|
|
|
523
485
|
throw new TransferUploadError(`Can't export not started Transfer`); // fileStatuses are not created yet and it really doesn't make any sens to export not started transfer
|
|
524
486
|
return {
|
|
525
487
|
transferMetadata: this.getTransferMetadataExportValue(),
|
|
526
|
-
info: this
|
|
488
|
+
info: this.getInfoExportValue(),
|
|
527
489
|
state: this.#transferState.export(),
|
|
490
|
+
registeredFiles: this.#filesRegistrar ? Array.from(this.#filesRegistrar.export().entries()) : undefined,
|
|
528
491
|
};
|
|
529
492
|
}
|
|
493
|
+
getInfoExportValue() {
|
|
494
|
+
if (this.isUploadAppendInfo(this.#info)) {
|
|
495
|
+
const { e2eeData, ...appendInfoWithoutE2eeData } = this.#info;
|
|
496
|
+
return appendInfoWithoutE2eeData;
|
|
497
|
+
}
|
|
498
|
+
// Until the transfer is initialized the key is still needed - a resumed run re-initializes from the info.
|
|
499
|
+
if (!this.#transferMetadata)
|
|
500
|
+
return this.#info;
|
|
501
|
+
const { e2eeKey, ...infoWithoutE2eeKey } = this.#info;
|
|
502
|
+
return infoWithoutE2eeKey;
|
|
503
|
+
}
|
|
530
504
|
getTransferMetadataExportValue() {
|
|
531
505
|
if (!this.#transferMetadata)
|
|
532
506
|
return undefined;
|
|
@@ -539,12 +513,18 @@ export default class TransferUpload {
|
|
|
539
513
|
},
|
|
540
514
|
};
|
|
541
515
|
}
|
|
542
|
-
static recreate(transferExportData, config, chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine,
|
|
516
|
+
static recreate(transferExportData, config, chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, concurrencyController, cryptography, acker) {
|
|
543
517
|
try {
|
|
544
518
|
TransferUpload.validateRecreateParams(transferExportData);
|
|
545
|
-
const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferExportData.info, config,
|
|
519
|
+
const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferExportData.info, config, concurrencyController, cryptography, acker);
|
|
546
520
|
transfer.#transferMetadata = this.recreateTransferMetadata(transferExportData.transferMetadata);
|
|
547
521
|
transfer.#transferState = new TransferUploadState(transferExportData.info.files, eventsEngine, config.currentRatesTimespanInMs, config.progressEventThrottlingInMs, transferExportData.state);
|
|
522
|
+
if (transfer.isUploadAppendInfo(transferExportData.info))
|
|
523
|
+
transfer.#transferDownloadUrl = transferExportData.info.transferDownloadUrl;
|
|
524
|
+
if (transferExportData.registeredFiles)
|
|
525
|
+
transfer.#filesRegistrar.recoverFromExportedState(transferExportData.registeredFiles);
|
|
526
|
+
else
|
|
527
|
+
transfer.#filesRegistrar = undefined;
|
|
548
528
|
return transfer;
|
|
549
529
|
}
|
|
550
530
|
catch (error) {
|