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.
Files changed (240) hide show
  1. package/dist/src/autoDownloader/autoDownloader.d.ts.map +1 -1
  2. package/dist/src/autoDownloader/autoDownloader.js +0 -1
  3. package/dist/src/autoDownloader/autoDownloader.js.map +1 -1
  4. package/dist/src/client/downloader/downloaderCore.js +1 -1
  5. package/dist/src/client/downloader/downloaderCore.js.map +1 -1
  6. package/dist/src/client/downloader/node/nodeTransferDownloader.d.ts.map +1 -1
  7. package/dist/src/client/downloader/node/nodeTransferDownloader.js +0 -2
  8. package/dist/src/client/downloader/node/nodeTransferDownloader.js.map +1 -1
  9. package/dist/src/client/uploader/node/nodeTransferUploader.d.ts.map +1 -1
  10. package/dist/src/client/uploader/node/nodeTransferUploader.js +6 -5
  11. package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
  12. package/dist/src/client/uploader/transferUploaderBase.d.ts +2 -0
  13. package/dist/src/client/uploader/transferUploaderBase.d.ts.map +1 -1
  14. package/dist/src/client/uploader/transferUploaderBase.js +45 -31
  15. package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
  16. package/dist/src/client/uploader/transferUploaderConfig.d.ts +3 -4
  17. package/dist/src/client/uploader/transferUploaderConfig.d.ts.map +1 -1
  18. package/dist/src/client/uploader/transferUploaderConfig.js.map +1 -1
  19. package/dist/src/client/uploader/utils/uploaderUtils.d.ts.map +1 -1
  20. package/dist/src/client/uploader/utils/uploaderUtils.js +1 -2
  21. package/dist/src/client/uploader/utils/uploaderUtils.js.map +1 -1
  22. package/dist/src/client/uploader/web/webTransferUploader.d.ts.map +1 -1
  23. package/dist/src/client/uploader/web/webTransferUploader.js +5 -4
  24. package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
  25. package/dist/src/downloader/api/node/nodeFileServerDownloadClient.d.ts.map +1 -1
  26. package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js +6 -2
  27. package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js.map +1 -1
  28. package/dist/src/downloader/chunkDownloader.d.ts.map +1 -1
  29. package/dist/src/downloader/chunkDownloader.js +2 -3
  30. package/dist/src/downloader/chunkDownloader.js.map +1 -1
  31. package/dist/src/downloader/downloadTracker.d.ts.map +1 -1
  32. package/dist/src/downloader/downloadTracker.js +0 -1
  33. package/dist/src/downloader/downloadTracker.js.map +1 -1
  34. package/dist/src/downloader/filesDownloader.d.ts.map +1 -1
  35. package/dist/src/downloader/filesDownloader.js +0 -1
  36. package/dist/src/downloader/filesDownloader.js.map +1 -1
  37. package/dist/src/index.d.ts +5 -2
  38. package/dist/src/index.d.ts.map +1 -1
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts +1 -1
  41. package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts.map +1 -1
  42. package/dist/src/uploader/api/node/nodeFileServerUploadClient.js +5 -4
  43. package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
  44. package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts +1 -1
  45. package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts.map +1 -1
  46. package/dist/src/uploader/api/web/webFileServerUploadClient.js +5 -4
  47. package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
  48. package/dist/src/uploader/chunksIterator/chunksIterator.d.ts +1 -3
  49. package/dist/src/uploader/chunksIterator/chunksIterator.d.ts.map +1 -1
  50. package/dist/src/uploader/chunksIterator/chunksIterator.js +4 -4
  51. package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
  52. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.d.ts +8 -0
  53. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.d.ts.map +1 -0
  54. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js +2 -0
  55. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js.map +1 -0
  56. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.d.ts +1 -1
  57. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.d.ts.map +1 -1
  58. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.js.map +1 -1
  59. package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.d.ts +1 -0
  60. package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.d.ts.map +1 -1
  61. package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.js.map +1 -1
  62. package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.d.ts +1 -0
  63. package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.d.ts.map +1 -1
  64. package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.js.map +1 -1
  65. package/dist/src/uploader/eventArgs/fileUploadEventArgs.d.ts +1 -0
  66. package/dist/src/uploader/eventArgs/fileUploadEventArgs.d.ts.map +1 -1
  67. package/dist/src/uploader/eventArgs/fileUploadEventArgs.js.map +1 -1
  68. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.d.ts +6 -0
  69. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.d.ts.map +1 -0
  70. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js +2 -0
  71. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js.map +1 -0
  72. package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.d.ts +6 -0
  73. package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.d.ts.map +1 -0
  74. package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js +2 -0
  75. package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js.map +1 -0
  76. package/dist/src/uploader/export/transferUploadExportData.d.ts +4 -1
  77. package/dist/src/uploader/export/transferUploadExportData.d.ts.map +1 -1
  78. package/dist/src/uploader/export/transferUploadExportData.js.map +1 -1
  79. package/dist/src/uploader/export/transferUploadExportState.d.ts +4 -1
  80. package/dist/src/uploader/export/transferUploadExportState.d.ts.map +1 -1
  81. package/dist/src/uploader/export/transferUploadExportState.js.map +1 -1
  82. package/dist/src/uploader/export/transferUploadMetadata.d.ts +0 -9
  83. package/dist/src/uploader/export/transferUploadMetadata.d.ts.map +1 -1
  84. package/dist/src/uploader/export/transferUploadMetadata.js.map +1 -1
  85. package/dist/src/uploader/options/transferUploadAppendInfo.d.ts +1 -0
  86. package/dist/src/uploader/options/transferUploadAppendInfo.d.ts.map +1 -1
  87. package/dist/src/uploader/options/transferUploadAppendInfo.js.map +1 -1
  88. package/dist/src/uploader/options/transferUploadConfig.d.ts +1 -2
  89. package/dist/src/uploader/options/transferUploadConfig.d.ts.map +1 -1
  90. package/dist/src/uploader/options/transferUploadConfig.js.map +1 -1
  91. package/dist/src/uploader/pendingFileAck.d.ts +7 -0
  92. package/dist/src/uploader/pendingFileAck.d.ts.map +1 -0
  93. package/dist/src/uploader/pendingFileAck.js +2 -0
  94. package/dist/src/uploader/pendingFileAck.js.map +1 -0
  95. package/dist/src/uploader/registeredTransferFile.d.ts +6 -0
  96. package/dist/src/uploader/registeredTransferFile.d.ts.map +1 -0
  97. package/dist/src/uploader/registeredTransferFile.js +2 -0
  98. package/dist/src/uploader/registeredTransferFile.js.map +1 -0
  99. package/dist/src/uploader/state/continuousChunksCalculator.d.ts +1 -0
  100. package/dist/src/uploader/state/continuousChunksCalculator.d.ts.map +1 -1
  101. package/dist/src/uploader/state/continuousChunksCalculator.js +8 -2
  102. package/dist/src/uploader/state/continuousChunksCalculator.js.map +1 -1
  103. package/dist/src/uploader/state/transferUploadState.d.ts +11 -8
  104. package/dist/src/uploader/state/transferUploadState.d.ts.map +1 -1
  105. package/dist/src/uploader/state/transferUploadState.js +57 -28
  106. package/dist/src/uploader/state/transferUploadState.js.map +1 -1
  107. package/dist/src/uploader/state/transferUploadStateFile.d.ts +1 -0
  108. package/dist/src/uploader/state/transferUploadStateFile.d.ts.map +1 -1
  109. package/dist/src/uploader/state/transferUploadStateFile.js +1 -0
  110. package/dist/src/uploader/state/transferUploadStateFile.js.map +1 -1
  111. package/dist/src/uploader/transferFilesRegistrar.d.ts +30 -0
  112. package/dist/src/uploader/transferFilesRegistrar.d.ts.map +1 -0
  113. package/dist/src/uploader/transferFilesRegistrar.js +158 -0
  114. package/dist/src/uploader/transferFilesRegistrar.js.map +1 -0
  115. package/dist/src/uploader/transferUpload.d.ts +21 -14
  116. package/dist/src/uploader/transferUpload.d.ts.map +1 -1
  117. package/dist/src/uploader/transferUpload.js +122 -142
  118. package/dist/src/uploader/transferUpload.js.map +1 -1
  119. package/dist/src/uploader/transferUploadAcker.d.ts +18 -0
  120. package/dist/src/uploader/transferUploadAcker.d.ts.map +1 -0
  121. package/dist/src/uploader/transferUploadAcker.js +123 -0
  122. package/dist/src/uploader/transferUploadAcker.js.map +1 -0
  123. package/dist/src/uploader/transferUploadEvent.d.ts +4 -1
  124. package/dist/src/uploader/transferUploadEvent.d.ts.map +1 -1
  125. package/dist/src/uploader/transferUploadEvent.js +4 -1
  126. package/dist/src/uploader/transferUploadEvent.js.map +1 -1
  127. package/dist/src/utils/api/apiClient.d.ts +6 -0
  128. package/dist/src/utils/api/apiClient.d.ts.map +1 -1
  129. package/dist/src/utils/api/apiClient.js.map +1 -1
  130. package/dist/src/utils/api/apiClientBase.d.ts +0 -2
  131. package/dist/src/utils/api/apiClientBase.d.ts.map +1 -1
  132. package/dist/src/utils/api/apiClientBase.js +6 -13
  133. package/dist/src/utils/api/apiClientBase.js.map +1 -1
  134. package/dist/src/utils/api/dtos/ackTransferFilesRequest.d.ts +9 -0
  135. package/dist/src/utils/api/dtos/ackTransferFilesRequest.d.ts.map +1 -0
  136. package/dist/src/utils/api/dtos/ackTransferFilesRequest.js +2 -0
  137. package/dist/src/utils/api/dtos/ackTransferFilesRequest.js.map +1 -0
  138. package/dist/src/utils/api/dtos/ackTransferFilesResponse.d.ts +7 -0
  139. package/dist/src/utils/api/dtos/ackTransferFilesResponse.d.ts.map +1 -0
  140. package/dist/src/utils/api/dtos/ackTransferFilesResponse.js +2 -0
  141. package/dist/src/utils/api/dtos/ackTransferFilesResponse.js.map +1 -0
  142. package/dist/src/utils/api/dtos/finalizeTransferRequest.d.ts +1 -1
  143. package/dist/src/utils/api/dtos/finalizeTransferRequest.d.ts.map +1 -1
  144. package/dist/src/utils/api/dtos/finalizeTransferRequest.js.map +1 -1
  145. package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts +1 -0
  146. package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts.map +1 -1
  147. package/dist/src/utils/api/dtos/initializeTransferRequest.js.map +1 -1
  148. package/dist/src/utils/api/dtos/initializeTransferResponse.d.ts +0 -9
  149. package/dist/src/utils/api/dtos/initializeTransferResponse.d.ts.map +1 -1
  150. package/dist/src/utils/api/dtos/initializeTransferResponse.js.map +1 -1
  151. package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts +18 -0
  152. package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts.map +1 -0
  153. package/dist/src/utils/api/dtos/registerTransferFilesRequest.js +2 -0
  154. package/dist/src/utils/api/dtos/registerTransferFilesRequest.js.map +1 -0
  155. package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts +9 -0
  156. package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts.map +1 -0
  157. package/dist/src/utils/api/dtos/registerTransferFilesResponse.js +2 -0
  158. package/dist/src/utils/api/dtos/registerTransferFilesResponse.js.map +1 -0
  159. package/dist/src/utils/api/fileServerClientFactory.d.ts +2 -4
  160. package/dist/src/utils/api/fileServerClientFactory.d.ts.map +1 -1
  161. package/dist/src/utils/api/fileServerClientFactory.js.map +1 -1
  162. package/dist/src/utils/api/node/nodeApiClient.d.ts +6 -0
  163. package/dist/src/utils/api/node/nodeApiClient.d.ts.map +1 -1
  164. package/dist/src/utils/api/node/nodeApiClient.js +26 -2
  165. package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
  166. package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts +2 -4
  167. package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts.map +1 -1
  168. package/dist/src/utils/api/node/nodeFileServerClientFactory.js +3 -7
  169. package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
  170. package/dist/src/utils/api/web/webApiClient.d.ts +6 -0
  171. package/dist/src/utils/api/web/webApiClient.d.ts.map +1 -1
  172. package/dist/src/utils/api/web/webApiClient.js +24 -2
  173. package/dist/src/utils/api/web/webApiClient.js.map +1 -1
  174. package/dist/src/utils/api/web/webFileServerClientFactory.d.ts +2 -4
  175. package/dist/src/utils/api/web/webFileServerClientFactory.d.ts.map +1 -1
  176. package/dist/src/utils/api/web/webFileServerClientFactory.js +3 -6
  177. package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
  178. package/dist/src/utils/fileSystem/node/nodeFileSystemService.d.ts.map +1 -1
  179. package/dist/src/utils/fileSystem/node/nodeFileSystemService.js +0 -3
  180. package/dist/src/utils/fileSystem/node/nodeFileSystemService.js.map +1 -1
  181. package/dist/src/utils/mergeAbortAndPauseSignals.d.ts +6 -1
  182. package/dist/src/utils/mergeAbortAndPauseSignals.d.ts.map +1 -1
  183. package/dist/src/utils/mergeAbortAndPauseSignals.js +14 -7
  184. package/dist/src/utils/mergeAbortAndPauseSignals.js.map +1 -1
  185. package/dist/src/utils/promiseAll.d.ts.map +1 -1
  186. package/dist/src/utils/promiseAll.js +0 -1
  187. package/dist/src/utils/promiseAll.js.map +1 -1
  188. package/package.json +1 -2
  189. package/dist/src/uploader/api/dtos/handshakeRequest.d.ts +0 -6
  190. package/dist/src/uploader/api/dtos/handshakeRequest.d.ts.map +0 -1
  191. package/dist/src/uploader/api/dtos/handshakeRequest.js +0 -2
  192. package/dist/src/uploader/api/dtos/handshakeRequest.js.map +0 -1
  193. package/dist/src/uploader/api/dtos/handshakeResponse.d.ts +0 -6
  194. package/dist/src/uploader/api/dtos/handshakeResponse.d.ts.map +0 -1
  195. package/dist/src/uploader/api/dtos/handshakeResponse.js +0 -2
  196. package/dist/src/uploader/api/dtos/handshakeResponse.js.map +0 -1
  197. package/dist/src/uploader/api/dtos/pingResponse.d.ts +0 -5
  198. package/dist/src/uploader/api/dtos/pingResponse.d.ts.map +0 -1
  199. package/dist/src/uploader/api/dtos/pingResponse.js +0 -2
  200. package/dist/src/uploader/api/dtos/pingResponse.js.map +0 -1
  201. package/dist/src/uploader/api/dtos/sendChunkRequest.d.ts +0 -10
  202. package/dist/src/uploader/api/dtos/sendChunkRequest.d.ts.map +0 -1
  203. package/dist/src/uploader/api/dtos/sendChunkRequest.js +0 -2
  204. package/dist/src/uploader/api/dtos/sendChunkRequest.js.map +0 -1
  205. package/dist/src/uploader/api/fileServerUdpClient.d.ts +0 -19
  206. package/dist/src/uploader/api/fileServerUdpClient.d.ts.map +0 -1
  207. package/dist/src/uploader/api/fileServerUdpClient.js +0 -2
  208. package/dist/src/uploader/api/fileServerUdpClient.js.map +0 -1
  209. package/dist/src/uploader/api/node/nodeFileServerUdpClient.d.ts +0 -39
  210. package/dist/src/uploader/api/node/nodeFileServerUdpClient.d.ts.map +0 -1
  211. package/dist/src/uploader/api/node/nodeFileServerUdpClient.js +0 -264
  212. package/dist/src/uploader/api/node/nodeFileServerUdpClient.js.map +0 -1
  213. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.d.ts +0 -7
  214. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.d.ts.map +0 -1
  215. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js +0 -2
  216. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js.map +0 -1
  217. package/dist/src/uploader/optimizer/optimizationValues.d.ts +0 -9
  218. package/dist/src/uploader/optimizer/optimizationValues.d.ts.map +0 -1
  219. package/dist/src/uploader/optimizer/optimizationValues.js +0 -2
  220. package/dist/src/uploader/optimizer/optimizationValues.js.map +0 -1
  221. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts +0 -33
  222. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts.map +0 -1
  223. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js +0 -135
  224. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map +0 -1
  225. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.d.ts +0 -30
  226. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.d.ts.map +0 -1
  227. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js +0 -106
  228. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js.map +0 -1
  229. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.d.ts +0 -20
  230. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.d.ts.map +0 -1
  231. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js +0 -2
  232. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js.map +0 -1
  233. package/dist/src/uploader/optimizer/transferUploadOptimizer.d.ts +0 -27
  234. package/dist/src/uploader/optimizer/transferUploadOptimizer.d.ts.map +0 -1
  235. package/dist/src/uploader/optimizer/transferUploadOptimizer.js +0 -169
  236. package/dist/src/uploader/optimizer/transferUploadOptimizer.js.map +0 -1
  237. package/dist/src/uploader/optimizer/uploadOptimizer.d.ts +0 -11
  238. package/dist/src/uploader/optimizer/uploadOptimizer.d.ts.map +0 -1
  239. package/dist/src/uploader/optimizer/uploadOptimizer.js +0 -2
  240. 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
- #optimizer;
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
- #mergedPauseAndAbortSignal;
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, optimizer, cryptography) {
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.#optimizer = optimizer;
76
+ this.#concurrencyController = concurrencyController;
78
77
  this.#cryptography = cryptography;
79
- if (this.isUploadAppendInfo(this.#info))
80
- this.createTransferMetadataFromInfo(this.#info);
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(info) {
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.#mergedPauseAndAbortSignal = mergeAbortAndPauseSignals(transferPauseSignal, transferAbortSignal);
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
- await this.pingServerAndChooseUploadMode();
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.#optimizer);
134
+ const chunksIterator = new ChunksIterator(alreadySentChunks, file.fileSizeInBytes, this.#config.chunkSizeInBytes);
127
135
  for (const chunk of chunksIterator.getChunksIterator()) {
128
- // eslint-disable-next-line no-await-in-loop
129
- const releaseSemaphore = await this.#optimizer.semaphoreAcquire();
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.shouldStopSchedulingChunks())
146
+ if (this.shouldStopProcessing())
143
147
  break;
144
148
  }
145
- if (this.shouldStopSchedulingChunks())
149
+ if (this.shouldStopProcessing())
146
150
  break;
147
151
  }
148
152
  await promiseAllSettled(Array.from(ongoingChunkUploads));
149
- this.#optimizer.stop();
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
- // else if (this.isFailureAbortRequested())
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
- const response = await this.sendChunk(file, chunkStreamProvider, progressEventHandler);
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, latencyInMsIfUdp);
229
+ this.#transferState.chunkUploadCompleted(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes);
259
230
  else
260
- this.#transferState.chunkUploadCompletedPartially(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal.paused, latencyInMsIfUdp);
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.createFileServerTcpUploadClient(this.#transferMetadata.transferFileServerUrl, this.#transferMetadata.transferId, this.#transferMetadata.transferKey, file.fileName, file.fileDestinationPathInTransfer, file.fileSizeInBytes);
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
- shouldStopSchedulingChunks() {
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.#mergedPauseAndAbortSignal);
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.#mergedPauseAndAbortSignal);
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: this.#isUdpUploadMode ? `udp` : `tcp`,
411
+ protocol: `tcp`,
450
412
  };
451
- const response = await this.#apiClient.finalizeTransfer(request, this.#mergedPauseAndAbortSignal);
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.#info,
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, optimizer, cryptography) {
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, optimizer, cryptography);
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) {