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,4 +1,3 @@
1
- /* eslint-disable @typescript-eslint/ban-ts-comment */
2
1
  import sleep from "abortable-sleep";
3
2
  import throttle from "lodash.throttle";
4
3
  import PauseController from "../../uploader/pauseController.js";
@@ -24,7 +23,6 @@ export default class TransferUploaderBase {
24
23
  #healthMonitor;
25
24
  #isShuttingDown = false;
26
25
  #failedReason;
27
- #isUdp;
28
26
  #isHealthy = true;
29
27
  #logHealthyStatusThrottled;
30
28
  constructor(transfer, fileDetails, config, envValues, logger, healthMonitor, trackingId) {
@@ -67,8 +65,7 @@ export default class TransferUploaderBase {
67
65
  await this.#transfer.cancel(abortSignal);
68
66
  }
69
67
  async start() {
70
- if (this.#transfer.status !== TransferStatus.Failed && this.#transfer.status !== TransferStatus.Aborted && this.#transfer.status !== TransferStatus.Initialized && this.#transfer.status !== TransferStatus.Paused)
71
- throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transfer.status]} state and cannot be run`);
68
+ this.throwIfCannotStart();
72
69
  this.logInfo(`Starting upload. Already uploaded bytes: ${this.transfer.uploadedBytesCount}/${this.#transfer.totalSizeInBytes}B, completed files: ${this.transfer.completedFilesCount}.`);
73
70
  const logMessageEntries = this.#transfer.files.map(f => `'Sending ${f.fileName}' with id = ${f.externalId}. It will be put into '${f.fileDestinationPathInTransfer}' folder.`);
74
71
  this.logInfo(`Transfer file details:\n${logMessageEntries.join(`\n`)}`);
@@ -78,7 +75,6 @@ export default class TransferUploaderBase {
78
75
  this.#abortController = new AbortController();
79
76
  this.#healthMonitor.start();
80
77
  do {
81
- /* eslint-disable no-await-in-loop */
82
78
  try {
83
79
  await this.#transfer.run(this.#pauseController.signal, this.#abortController.signal);
84
80
  }
@@ -89,17 +85,20 @@ export default class TransferUploaderBase {
89
85
  break;
90
86
  }
91
87
  finally {
92
- // @ts-ignore Typescript's brainfart
93
88
  if (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown) {
94
89
  this.logWarning(`Retrying transfer in ${TransferFailedSleepInMs}ms.`);
95
90
  await sleep(TransferFailedSleepInMs);
96
91
  }
97
92
  }
98
- } while (this.#transfer.progressInPercentage < 100 && !this.#isShuttingDown);
93
+ } while (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown);
99
94
  this.#healthMonitor.stop();
100
95
  this.#logHealthyStatusThrottled.cancel();
101
96
  this.logInfo(`Upload finished in status ${TransferStatus[this.#transfer.status]} having ${this.#transfer.progressInPercentage}% completed`);
102
97
  }
98
+ throwIfCannotStart() {
99
+ if (this.#transfer.status !== TransferStatus.Failed && this.#transfer.status !== TransferStatus.Aborted && this.#transfer.status !== TransferStatus.Initialized && this.#transfer.status !== TransferStatus.Paused)
100
+ throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transfer.status]} state and cannot be run`);
101
+ }
103
102
  setFailedReasonFromError(error) {
104
103
  const apiFilemailError = this.tryGetApiFilemailError(error);
105
104
  if (apiFilemailError) {
@@ -112,6 +111,12 @@ export default class TransferUploaderBase {
112
111
  }
113
112
  this.#failedReason = error.message;
114
113
  }
114
+ tryGetPermanentAckError(error) {
115
+ const apiFilemailError = this.tryGetApiFilemailError(error);
116
+ if (apiFilemailError?.status === `InvalidParameter`)
117
+ return apiFilemailError;
118
+ return null;
119
+ }
115
120
  tryGetApiFilemailError(error) {
116
121
  if (error instanceof ApiFilemailError)
117
122
  return error;
@@ -136,16 +141,9 @@ export default class TransferUploaderBase {
136
141
  });
137
142
  }
138
143
  addTransferEventListeners() {
139
- this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => {
140
- this.#isUdp = eventArgs.isUdpMode;
141
- });
142
144
  this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadFailed, eventArgs => {
143
- const isTimeoutError = eventArgs.error.message.includes(`Timeout`);
144
- const errorMessage = `File ${eventArgs.fileStatus.externalId} chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} upload failed: ${eventArgs.reason}`;
145
- if (this.#isUdp && isTimeoutError)
146
- this.logDebug(errorMessage);
147
- else
148
- this.logError(eventArgs.error, errorMessage);
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
+ this.logError(eventArgs.error, errorMessage);
149
147
  const isFileAccessError = eventArgs.error.cause instanceof FsError;
150
148
  const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);
151
149
  if (isFileAccessError && !this.#isShuttingDown) {
@@ -160,12 +158,28 @@ export default class TransferUploaderBase {
160
158
  }
161
159
  });
162
160
  this.#transfer.addEventListener(TransferUploadEvent.FileUploadFailed, eventArgs => {
163
- const isTimeoutError = eventArgs.reason?.includes(`Timeout`);
164
- const errorMessage = `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload failed: ${eventArgs.reason}`;
165
- if (this.#isUdp && isTimeoutError)
166
- this.logWarning(errorMessage);
167
- else
168
- this.logError(new Error(errorMessage));
161
+ const errorMessage = `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`} - upload failed: ${eventArgs.reason}`;
162
+ this.logError(new Error(errorMessage));
163
+ });
164
+ this.#transfer.addEventListener(TransferUploadEvent.FilesRegistrationBatchFailed, eventArgs => {
165
+ this.logError(eventArgs.error, `Registering a batch of files failed: ${eventArgs.error.message}`, { externalFileIds: eventArgs.externalFileIds });
166
+ if (!this.#config.infiniteRetries && !this.#isShuttingDown) {
167
+ this.#failedReason = `Registering a batch of ${eventArgs.externalFileIds.length} files failed`;
168
+ this.logWarning(`${this.#failedReason}. Failing transfer...`);
169
+ this.failTransfer();
170
+ }
171
+ });
172
+ this.#transfer.addEventListener(TransferUploadEvent.FileAckFailed, eventArgs => {
173
+ this.logError(eventArgs.error, `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - file ack failed (uploadItemId = ${eventArgs.uploadItemId}): ${eventArgs.reason}`);
174
+ const permanentAckError = this.tryGetPermanentAckError(eventArgs.error);
175
+ if (permanentAckError && !this.#isShuttingDown) {
176
+ this.#failedReason = permanentAckError.reason;
177
+ this.logWarning(`${this.#failedReason}. Failing transfer...`);
178
+ this.failTransfer();
179
+ }
180
+ });
181
+ this.#transfer.addEventListener(TransferUploadEvent.FilesBatchAckFailed, eventArgs => {
182
+ this.logError(eventArgs.error, `Acking a batch of files failed: ${eventArgs.reason}`);
169
183
  });
170
184
  this.#transfer.addEventListener(TransferUploadEvent.TransferRun, () => this.logInfo(`Transfer run.`));
171
185
  this.#transfer.addEventListener(TransferUploadEvent.TransferAbortRequested, () => this.logInfo(`Transfer abort requested`));
@@ -173,14 +187,14 @@ export default class TransferUploaderBase {
173
187
  this.#transfer.addEventListener(TransferUploadEvent.TransferCancelRequested, () => this.logInfo(`Transfer cancel requested.`));
174
188
  this.#transfer.addEventListener(TransferUploadEvent.TransferCanceled, () => this.logInfo(`Transfer canceled.`));
175
189
  this.#transfer.addEventListener(TransferUploadEvent.TransferFailed, () => this.logError(new Error(`Transfer failed.`)));
176
- this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => this.logInfo(`Transfer upload mode chosen. Is UDP: ${eventArgs.isUdpMode}; Latency: ${eventArgs.latency ?? `<unkown>`}; Error: ${eventArgs.error ?? `<none>`}`));
177
190
  this.#transfer.addEventListener(TransferUploadEvent.TransferCompleted, eventArgs => this.logInfo(`Transfer completed successfully. ID: ${eventArgs.transferId}, URL: ${eventArgs.transferDownloadUrl}`));
178
- this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadProgressed, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} progressed: ${eventArgs.transferredBytesSinceLastEvent} bytes sinc last event. Total progress: ${this.#transfer?.progressInPercentage}%.`));
179
- this.#transfer.addEventListener(TransferUploadEvent.FileUploadStarted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload started.`));
180
- this.#transfer.addEventListener(TransferUploadEvent.FileUploadCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload completed.`));
181
- this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadStarted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload started`));
182
- this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));
183
- this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));
191
+ this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadProgressed, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} progressed: ${eventArgs.transferredBytesSinceLastEvent} bytes sinc last event. Total progress: ${this.#transfer?.progressInPercentage}%.`));
192
+ this.#transfer.addEventListener(TransferUploadEvent.FileUploadStarted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`} - upload started.`));
193
+ this.#transfer.addEventListener(TransferUploadEvent.FileUploadCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`} - upload completed.`));
194
+ this.#transfer.addEventListener(TransferUploadEvent.FileCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`} - completed.`));
195
+ this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadStarted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload started`));
196
+ this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));
197
+ this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));
184
198
  }
185
199
  failTransfer() {
186
200
  if (!this.#abortController)
@@ -204,8 +218,8 @@ export default class TransferUploaderBase {
204
218
  const logEntryMetadata = this.getLogEntryMetadata();
205
219
  this.#logger.logWarning(message, logEntryMetadata);
206
220
  }
207
- logError(error, message) {
208
- const logEntryMetadata = this.getLogEntryMetadata();
221
+ logError(error, message, additionalData) {
222
+ const logEntryMetadata = { ...additionalData, ...this.getLogEntryMetadata() };
209
223
  this.#logger.logError(error, message, logEntryMetadata);
210
224
  }
211
225
  getLogEntryMetadata() {
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploaderBase.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderBase.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport sleep from \"abortable-sleep\";\nimport throttle from \"lodash.throttle\";\n\nimport TransferUpload from \"../../uploader/transferUpload.js\";\nimport PauseController from \"../../uploader/pauseController.js\";\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\nimport FsError from \"../../utils/fileSystem/fsError.js\";\nimport TransferUploadError from \"../../uploader/transferUploadError.js\";\nimport { createTransferFailureAbortReason } from \"../../uploader/transferFailureAbortReason.js\";\nimport logEventPropertyName from \"../../utils/logging/logEventPropertyNames.js\";\nimport ApiFilemailError from \"../../utils/api/apiFilemailError.js\";\nimport logHealthyStatus from \"../loggers/utils/logHealthyStatus.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 TransferUploader from \"./transferUploader.js\";\nimport type ReadonlyTransferUploadStateFile from \"../../uploader/state/readonlyTransferUploadStateFile.js\";\nimport type TransferUploaderConfig from \"./transferUploaderConfig.js\";\nimport type WebFileDetails from \"../../utils/fileSystem/web/webFileDetails.js\";\nimport TransferHealthMonitorEvent from \"../healthMonitor/events/transferHealthMonitorEvent.js\";\nimport type TransferUploaderHealthMonitor from \"../healthMonitor/transferUploaderHealthMonitor.js\";\n\nconst TransferFailedSleepInMs = 500;\n\nexport default abstract class TransferUploaderBase<T extends NodeFileDetails | WebFileDetails> implements TransferUploader<T> {\n #logger: Logger;\n #trackingId: number | string;\n\n #fileDetails: T[];\n\n #config: TransferUploaderConfig;\n #envValues: EnvironmentVariables;\n\n #pauseController?: PauseController;\n #abortController?: AbortController;\n\n #transfer: TransferUpload<T>;\n #healthMonitor: TransferUploaderHealthMonitor;\n\n #isShuttingDown = false;\n\n #failedReason?: string;\n\n #isUdp?: boolean;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(transfer: TransferUpload<T>, fileDetails: T[], config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger, healthMonitor: TransferUploaderHealthMonitor, trackingId: number | string) {\n this.#logger = logger;\n this.#trackingId = trackingId;\n\n this.#config = config;\n this.#envValues = envValues;\n\n this.#fileDetails = fileDetails;\n this.#transfer = transfer;\n this.#healthMonitor = healthMonitor;\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n get transfer(): TransferUpload<T> {\n return this.#transfer;\n }\n\n get healthMonitor(): TransferUploaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n get failedReason(): string | undefined {\n return this.#failedReason;\n }\n\n public pause() {\n this.logInfo(`Pause called on uploader client`);\n\n if (!this.#pauseController)\n throw new TransferUploadError(`Can't pause not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#pauseController.pause();\n }\n\n public stop() {\n this.logInfo(`Stop called on uploader client`);\n\n if (!this.#abortController)\n throw new TransferUploadError(`Can't stop not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#abortController.abort(new Error(`Transfer stop requested`));\n }\n\n public async cancel(abortSignal?: AbortSignal) {\n this.logInfo(`Cancel called on uploader client`);\n\n await this.#transfer.cancel(abortSignal);\n }\n\n async start(): Promise<void> {\n if (this.#transfer.status !== TransferStatus.Failed && this.#transfer.status !== TransferStatus.Aborted && this.#transfer.status !== TransferStatus.Initialized && this.#transfer.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transfer.status]} state and cannot be run`);\n\n this.logInfo(`Starting upload. Already uploaded bytes: ${this.transfer.uploadedBytesCount}/${this.#transfer.totalSizeInBytes}B, completed files: ${this.transfer.completedFilesCount}.`);\n\n const logMessageEntries = this.#transfer.files.map(f => `'Sending ${f.fileName}' with id = ${f.externalId}. It will be put into '${f.fileDestinationPathInTransfer}' folder.`);\n this.logInfo(`Transfer file details:\\n${logMessageEntries.join(`\\n`)}`);\n\n this.#failedReason = undefined;\n this.#isShuttingDown = false;\n\n this.#pauseController = new PauseController();\n this.#abortController = new AbortController();\n\n this.#healthMonitor.start();\n\n do {\n /* eslint-disable no-await-in-loop */\n try {\n await this.#transfer.run(this.#pauseController.signal, this.#abortController.signal);\n }\n catch (error) {\n this.logError(error as TransferUploadError, `Transfer upload run method exception`);\n\n this.setFailedReasonFromError(error as TransferUploadError);\n this.#isShuttingDown = true;\n\n break;\n }\n finally {\n // @ts-ignore Typescript's brainfart\n if (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown) {\n this.logWarning(`Retrying transfer in ${TransferFailedSleepInMs}ms.`);\n\n await sleep(TransferFailedSleepInMs);\n }\n }\n }\n while (this.#transfer.progressInPercentage < 100 && !this.#isShuttingDown);\n\n this.#healthMonitor.stop();\n this.#logHealthyStatusThrottled.cancel();\n\n this.logInfo(`Upload finished in status ${TransferStatus[this.#transfer.status]} having ${this.#transfer.progressInPercentage}% completed`);\n }\n\n private setFailedReasonFromError(error: TransferUploadError) {\n const apiFilemailError = this.tryGetApiFilemailError(error);\n\n if (apiFilemailError) {\n this.#failedReason = apiFilemailError.reason;\n return;\n }\n\n if (error.message.startsWith(`Unhandled error occured`) && error.cause) {\n this.#failedReason = error.cause.message;\n return;\n }\n\n this.#failedReason = error.message;\n }\n\n private tryGetApiFilemailError(error: Error): ApiFilemailError | null {\n if (error instanceof ApiFilemailError)\n return error;\n\n if (error.cause)\n return this.tryGetApiFilemailError(error.cause);\n\n return null;\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, this.getLogEntryMetadata());\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, this.getLogEntryMetadata());\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 this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, this.getLogEntryMetadata());\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, this.getLogEntryMetadata());\n\n this.#isHealthy = false;\n });\n }\n\n private addTransferEventListeners() {\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => {\n this.#isUdp = eventArgs.isUdpMode;\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadFailed, eventArgs => {\n const isTimeoutError = eventArgs.error.message.includes(`Timeout`);\n const errorMessage = `File ${eventArgs.fileStatus.externalId} chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} upload failed: ${eventArgs.reason}`;\n\n if (this.#isUdp && isTimeoutError)\n this.logDebug(errorMessage);\n else\n this.logError(eventArgs.error, errorMessage);\n\n const isFileAccessError = eventArgs.error.cause instanceof FsError;\n const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);\n\n if (isFileAccessError && !this.#isShuttingDown) {\n this.#failedReason = `Can't read ${fullFilePathOrName} anymore`;\n\n this.logWarning(`${this.#failedReason}. Failing transfer...`);\n this.failTransfer();\n }\n\n if (!this.#config.infiniteRetries && !this.#isShuttingDown) {\n this.#failedReason = `Uploading ${fullFilePathOrName} failed after ${this.#config.chunkUploadRetryLimit} retries`;\n\n this.logWarning(`${this.#failedReason}. Failing transfer...`);\n this.failTransfer();\n }\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadFailed, eventArgs => {\n const isTimeoutError = eventArgs.reason?.includes(`Timeout`);\n const errorMessage = `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload failed: ${eventArgs.reason}`;\n\n if (this.#isUdp && isTimeoutError)\n this.logWarning(errorMessage);\n else\n this.logError(new Error(errorMessage));\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferRun, () => this.logInfo(`Transfer run.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAbortRequested, () => this.logInfo(`Transfer abort requested`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAborted, async () => this.logInfo(`Transfer aborted.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCancelRequested, () => this.logInfo(`Transfer cancel requested.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCanceled, () => this.logInfo(`Transfer canceled.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferFailed, () => this.logError(new Error(`Transfer failed.`)));\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => this.logInfo(`Transfer upload mode chosen. Is UDP: ${eventArgs.isUdpMode}; Latency: ${eventArgs.latency ?? `<unkown>`}; Error: ${eventArgs.error ?? `<none>`}`));\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferCompleted, eventArgs => this.logInfo(`Transfer completed successfully. ID: ${eventArgs.transferId}, URL: ${eventArgs.transferDownloadUrl}`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadProgressed, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} progressed: ${eventArgs.transferredBytesSinceLastEvent} bytes sinc last event. Total progress: ${this.#transfer?.progressInPercentage}%.`));\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadStarted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload started.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload completed.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadStarted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload started`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));\n }\n\n private failTransfer() {\n if (!this.#abortController)\n throw new TransferUploadError(`Can't fail not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#abortController.abort(createTransferFailureAbortReason());\n }\n\n private logTrace(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logTrace(message, logEntryMetadata);\n }\n\n private logDebug(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logDebug(message, logEntryMetadata);\n }\n\n private logInfo(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logInfo(message, logEntryMetadata);\n }\n\n private logWarning(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logWarning(message, logEntryMetadata);\n }\n\n private logError(error: Error, message?: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logError(error, message, logEntryMetadata);\n }\n\n private getLogEntryMetadata() {\n return {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n [logEventPropertyName.TransferIdPropertyName]: this.#transfer.transferId,\n };\n }\n\n private getFullFilePathOrFileName(fileStatus: ReadonlyTransferUploadStateFile): string {\n const fileDetails = this.#fileDetails.find(f => f.externalId === fileStatus.externalId);\n\n if (!fileDetails)\n return fileStatus.fileName;\n\n if (this.isNodeFileDetails(fileDetails))\n return fileDetails.fileFullPath;\n\n return fileDetails.file.name;\n }\n\n private isNodeFileDetails(fileDetails: NodeFileDetails | WebFileDetails): fileDetails is NodeFileDetails {\n return typeof (fileDetails as NodeFileDetails).fileFullPath === `string`;\n }\n}"]}
1
+ {"version":3,"file":"transferUploaderBase.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderBase.ts"],"names":[],"mappings":"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","sourcesContent":["import sleep from \"abortable-sleep\";\nimport throttle from \"lodash.throttle\";\n\nimport TransferUpload from \"../../uploader/transferUpload.js\";\nimport PauseController from \"../../uploader/pauseController.js\";\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\nimport FsError from \"../../utils/fileSystem/fsError.js\";\nimport TransferUploadError from \"../../uploader/transferUploadError.js\";\nimport { createTransferFailureAbortReason } from \"../../uploader/transferFailureAbortReason.js\";\nimport logEventPropertyName from \"../../utils/logging/logEventPropertyNames.js\";\nimport ApiFilemailError from \"../../utils/api/apiFilemailError.js\";\nimport logHealthyStatus from \"../loggers/utils/logHealthyStatus.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 TransferUploader from \"./transferUploader.js\";\nimport type ReadonlyTransferUploadStateFile from \"../../uploader/state/readonlyTransferUploadStateFile.js\";\nimport type TransferUploaderConfig from \"./transferUploaderConfig.js\";\nimport type WebFileDetails from \"../../utils/fileSystem/web/webFileDetails.js\";\nimport TransferHealthMonitorEvent from \"../healthMonitor/events/transferHealthMonitorEvent.js\";\nimport type TransferUploaderHealthMonitor from \"../healthMonitor/transferUploaderHealthMonitor.js\";\n\nconst TransferFailedSleepInMs = 500;\n\nexport default abstract class TransferUploaderBase<T extends NodeFileDetails | WebFileDetails> implements TransferUploader<T> {\n #logger: Logger;\n #trackingId: number | string;\n\n #fileDetails: T[];\n\n #config: TransferUploaderConfig;\n #envValues: EnvironmentVariables;\n\n #pauseController?: PauseController;\n #abortController?: AbortController;\n\n #transfer: TransferUpload<T>;\n #healthMonitor: TransferUploaderHealthMonitor;\n\n #isShuttingDown = false;\n\n #failedReason?: string;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(transfer: TransferUpload<T>, fileDetails: T[], config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger, healthMonitor: TransferUploaderHealthMonitor, trackingId: number | string) {\n this.#logger = logger;\n this.#trackingId = trackingId;\n\n this.#config = config;\n this.#envValues = envValues;\n\n this.#fileDetails = fileDetails;\n this.#transfer = transfer;\n this.#healthMonitor = healthMonitor;\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n get transfer(): TransferUpload<T> {\n return this.#transfer;\n }\n\n get healthMonitor(): TransferUploaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n get failedReason(): string | undefined {\n return this.#failedReason;\n }\n\n public pause() {\n this.logInfo(`Pause called on uploader client`);\n\n if (!this.#pauseController)\n throw new TransferUploadError(`Can't pause not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#pauseController.pause();\n }\n\n public stop() {\n this.logInfo(`Stop called on uploader client`);\n\n if (!this.#abortController)\n throw new TransferUploadError(`Can't stop not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#abortController.abort(new Error(`Transfer stop requested`));\n }\n\n public async cancel(abortSignal?: AbortSignal) {\n this.logInfo(`Cancel called on uploader client`);\n\n await this.#transfer.cancel(abortSignal);\n }\n\n async start(): Promise<void> {\n this.throwIfCannotStart();\n\n this.logInfo(`Starting upload. Already uploaded bytes: ${this.transfer.uploadedBytesCount}/${this.#transfer.totalSizeInBytes}B, completed files: ${this.transfer.completedFilesCount}.`);\n\n const logMessageEntries = this.#transfer.files.map(f => `'Sending ${f.fileName}' with id = ${f.externalId}. It will be put into '${f.fileDestinationPathInTransfer}' folder.`);\n this.logInfo(`Transfer file details:\\n${logMessageEntries.join(`\\n`)}`);\n\n this.#failedReason = undefined;\n this.#isShuttingDown = false;\n\n this.#pauseController = new PauseController();\n this.#abortController = new AbortController();\n\n this.#healthMonitor.start();\n\n do {\n try {\n await this.#transfer.run(this.#pauseController.signal, this.#abortController.signal);\n }\n catch (error) {\n this.logError(error as TransferUploadError, `Transfer upload run method exception`);\n\n this.setFailedReasonFromError(error as TransferUploadError);\n this.#isShuttingDown = true;\n\n break;\n }\n finally {\n if (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown) {\n this.logWarning(`Retrying transfer in ${TransferFailedSleepInMs}ms.`);\n\n await sleep(TransferFailedSleepInMs);\n }\n }\n }\n while (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown);\n\n this.#healthMonitor.stop();\n this.#logHealthyStatusThrottled.cancel();\n\n this.logInfo(`Upload finished in status ${TransferStatus[this.#transfer.status]} having ${this.#transfer.progressInPercentage}% completed`);\n }\n\n private throwIfCannotStart() {\n if (this.#transfer.status !== TransferStatus.Failed && this.#transfer.status !== TransferStatus.Aborted && this.#transfer.status !== TransferStatus.Initialized && this.#transfer.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transfer.status]} state and cannot be run`);\n }\n\n private setFailedReasonFromError(error: TransferUploadError) {\n const apiFilemailError = this.tryGetApiFilemailError(error);\n\n if (apiFilemailError) {\n this.#failedReason = apiFilemailError.reason;\n return;\n }\n\n if (error.message.startsWith(`Unhandled error occured`) && error.cause) {\n this.#failedReason = error.cause.message;\n return;\n }\n\n this.#failedReason = error.message;\n }\n\n private tryGetPermanentAckError(error: Error): ApiFilemailError | null {\n const apiFilemailError = this.tryGetApiFilemailError(error);\n\n if (apiFilemailError?.status === `InvalidParameter`)\n return apiFilemailError;\n\n return null;\n }\n\n private tryGetApiFilemailError(error: Error): ApiFilemailError | null {\n if (error instanceof ApiFilemailError)\n return error;\n\n if (error.cause)\n return this.tryGetApiFilemailError(error.cause);\n\n return null;\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, this.getLogEntryMetadata());\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, this.getLogEntryMetadata());\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 this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, this.getLogEntryMetadata());\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, this.getLogEntryMetadata());\n\n this.#isHealthy = false;\n });\n }\n\n private addTransferEventListeners() {\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadFailed, eventArgs => {\n const errorMessage = `File ${eventArgs.fileStatus.externalId} having uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} upload failed: ${eventArgs.reason}`;\n\n this.logError(eventArgs.error, errorMessage);\n\n const isFileAccessError = eventArgs.error.cause instanceof FsError;\n const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);\n\n if (isFileAccessError && !this.#isShuttingDown) {\n this.#failedReason = `Can't read ${fullFilePathOrName} anymore`;\n\n this.logWarning(`${this.#failedReason}. Failing transfer...`);\n this.failTransfer();\n }\n\n if (!this.#config.infiniteRetries && !this.#isShuttingDown) {\n this.#failedReason = `Uploading ${fullFilePathOrName} failed after ${this.#config.chunkUploadRetryLimit} retries`;\n\n this.logWarning(`${this.#failedReason}. Failing transfer...`);\n this.failTransfer();\n }\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadFailed, eventArgs => {\n const errorMessage = `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`} - upload failed: ${eventArgs.reason}`;\n\n this.logError(new Error(errorMessage));\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FilesRegistrationBatchFailed, eventArgs => {\n this.logError(eventArgs.error, `Registering a batch of files failed: ${eventArgs.error.message}`, { externalFileIds: eventArgs.externalFileIds });\n\n if (!this.#config.infiniteRetries && !this.#isShuttingDown) {\n this.#failedReason = `Registering a batch of ${eventArgs.externalFileIds.length} files failed`;\n\n this.logWarning(`${this.#failedReason}. Failing transfer...`);\n this.failTransfer();\n }\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileAckFailed, eventArgs => {\n this.logError(eventArgs.error, `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - file ack failed (uploadItemId = ${eventArgs.uploadItemId}): ${eventArgs.reason}`);\n\n const permanentAckError = this.tryGetPermanentAckError(eventArgs.error);\n\n if (permanentAckError && !this.#isShuttingDown) {\n this.#failedReason = permanentAckError.reason;\n\n this.logWarning(`${this.#failedReason}. Failing transfer...`);\n this.failTransfer();\n }\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FilesBatchAckFailed, eventArgs => {\n this.logError(eventArgs.error, `Acking a batch of files failed: ${eventArgs.reason}`);\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferRun, () => this.logInfo(`Transfer run.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAbortRequested, () => this.logInfo(`Transfer abort requested`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAborted, async () => this.logInfo(`Transfer aborted.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCancelRequested, () => this.logInfo(`Transfer cancel requested.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCanceled, () => this.logInfo(`Transfer canceled.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferFailed, () => this.logError(new Error(`Transfer failed.`)));\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferCompleted, eventArgs => this.logInfo(`Transfer completed successfully. ID: ${eventArgs.transferId}, URL: ${eventArgs.transferDownloadUrl}`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadProgressed, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} progressed: ${eventArgs.transferredBytesSinceLastEvent} bytes sinc last event. Total progress: ${this.#transfer?.progressInPercentage}%.`));\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadStarted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`} - upload started.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`} - upload completed.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`} - completed.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadStarted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload started`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} and uploadItemId = ${eventArgs.uploadItemId ?? `<unknown>`}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));\n }\n\n private failTransfer() {\n if (!this.#abortController)\n throw new TransferUploadError(`Can't fail not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#abortController.abort(createTransferFailureAbortReason());\n }\n\n private logTrace(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logTrace(message, logEntryMetadata);\n }\n\n private logDebug(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logDebug(message, logEntryMetadata);\n }\n\n private logInfo(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logInfo(message, logEntryMetadata);\n }\n\n private logWarning(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logWarning(message, logEntryMetadata);\n }\n\n private logError(error: Error, message?: string, additionalData?: Record<string, unknown>) {\n const logEntryMetadata = { ...additionalData, ...this.getLogEntryMetadata() };\n this.#logger.logError(error, message, logEntryMetadata);\n }\n\n private getLogEntryMetadata() {\n return {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n [logEventPropertyName.TransferIdPropertyName]: this.#transfer.transferId,\n };\n }\n\n private getFullFilePathOrFileName(fileStatus: ReadonlyTransferUploadStateFile): string {\n const fileDetails = this.#fileDetails.find(f => f.externalId === fileStatus.externalId);\n\n if (!fileDetails)\n return fileStatus.fileName;\n\n if (this.isNodeFileDetails(fileDetails))\n return fileDetails.fileFullPath;\n\n return fileDetails.file.name;\n }\n\n private isNodeFileDetails(fileDetails: NodeFileDetails | WebFileDetails): fileDetails is NodeFileDetails {\n return typeof (fileDetails as NodeFileDetails).fileFullPath === `string`;\n }\n}"]}
@@ -3,14 +3,13 @@ export default interface TransferUploaderConfig {
3
3
  logintoken?: string;
4
4
  chunkUploadRetryLimit: number;
5
5
  uploadIdleTimeoutInMs: number;
6
- tcpChunksUploadInParallel: number;
7
- tcpChunkSizeInBytes: number;
6
+ chunksUploadInParallel: number;
7
+ chunkSizeInBytes: number;
8
8
  apiRetryLimit: number;
9
9
  apiRequestTotalTimeoutInMs: number;
10
10
  trackingId?: number | string;
11
11
  progressEventThrottlingInMs: number;
12
12
  currentRatesTimespanInMs: number;
13
- forceUdp?: boolean;
14
- turnOffUdp?: boolean;
13
+ fileAckIntervalInMs: number;
15
14
  }
16
15
  //# sourceMappingURL=transferUploaderConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploaderConfig.d.ts","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderConfig.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,OAAO,WAAW,sBAAsB;IAC3C,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,yBAAyB,EAAE,MAAM,CAAC;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B,EAAE,MAAM,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,wBAAwB,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB"}
1
+ {"version":3,"file":"transferUploaderConfig.d.ts","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderConfig.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,OAAO,WAAW,sBAAsB;IAC3C,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B,EAAE,MAAM,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,wBAAwB,EAAE,MAAM,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;CAC/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploaderConfig.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderConfig.ts"],"names":[],"mappings":"","sourcesContent":["/* eslint-disable semi */\nexport default interface TransferUploaderConfig {\n infiniteRetries: boolean,\n logintoken?: string,\n chunkUploadRetryLimit: number,\n uploadIdleTimeoutInMs: number,\n tcpChunksUploadInParallel: number,\n tcpChunkSizeInBytes: number,\n apiRetryLimit: number,\n apiRequestTotalTimeoutInMs: number,\n trackingId?: number | string,\n progressEventThrottlingInMs: number,\n currentRatesTimespanInMs: number,\n forceUdp?: boolean,\n turnOffUdp?: boolean,\n}"]}
1
+ {"version":3,"file":"transferUploaderConfig.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderConfig.ts"],"names":[],"mappings":"","sourcesContent":["/* eslint-disable semi */\nexport default interface TransferUploaderConfig {\n infiniteRetries: boolean,\n logintoken?: string,\n chunkUploadRetryLimit: number,\n uploadIdleTimeoutInMs: number,\n chunksUploadInParallel: number,\n chunkSizeInBytes: number,\n apiRetryLimit: number,\n apiRequestTotalTimeoutInMs: number,\n trackingId?: number | string,\n progressEventThrottlingInMs: number,\n currentRatesTimespanInMs: number,\n fileAckIntervalInMs: number,\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"uploaderUtils.d.ts","sourceRoot":"","sources":["../../../../../src/client/uploader/utils/uploaderUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AACrG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACtG,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAC;AAC1F,OAAO,KAAK,kBAAkB,MAAM,iDAAiD,CAAC;AACtF,OAAO,KAAK,WAAW,MAAM,0CAA0C,CAAC;AACxE,OAAO,KAAK,sBAAsB,MAAM,8BAA8B,CAAC;AAEvE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,oBAAoB,CAOtF;AAGD,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAG1G;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,wBAAwB,CAAC,CAAC,CAAC,CAE9I;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,WAAW,EAAE,wBAAwB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,wBAAwB,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAGpP"}
1
+ {"version":3,"file":"uploaderUtils.d.ts","sourceRoot":"","sources":["../../../../../src/client/uploader/utils/uploaderUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AACrG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACtG,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAC;AAC1F,OAAO,KAAK,kBAAkB,MAAM,iDAAiD,CAAC;AACtF,OAAO,KAAK,WAAW,MAAM,0CAA0C,CAAC;AACxE,OAAO,KAAK,sBAAsB,MAAM,8BAA8B,CAAC;AAEvE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,oBAAoB,CAMtF;AAGD,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAG1G;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,wBAAwB,CAAC,CAAC,CAAC,CAE9I;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,WAAW,EAAE,wBAAwB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,wBAAwB,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAGpP"}
@@ -2,8 +2,7 @@ export function buildUploadConfig(config) {
2
2
  return {
3
3
  progressEventThrottlingInMs: config.progressEventThrottlingInMs,
4
4
  currentRatesTimespanInMs: config.currentRatesTimespanInMs,
5
- forceUdp: config.forceUdp,
6
- turnOffUdp: config.turnOffUdp,
5
+ chunkSizeInBytes: config.chunkSizeInBytes,
7
6
  };
8
7
  }
9
8
  /* eslint-disable no-param-reassign */
@@ -1 +1 @@
1
- {"version":3,"file":"uploaderUtils.js","sourceRoot":"","sources":["../../../../../src/client/uploader/utils/uploaderUtils.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAAC,MAA8B;IAC5D,OAAO;QACH,2BAA2B,EAAE,MAAM,CAAC,2BAA2B;QAC/D,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;QACzD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC;AACN,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,eAAe,CAAI,YAAiE;IAChG,IAAI,4BAA4B,CAAC,YAAY,CAAC;QAC1C,YAAY,CAAC,qBAAqB,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAI,IAAyD;IACrG,OAAQ,IAAoC,CAAC,WAAW,KAAK,SAAS,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc,CAAwB,wBAA6G;IAC/J,MAAM,oBAAoB,GAAG,wBAA+E,CAAC;IAC7G,OAAO,oBAAoB,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACjG,CAAC","sourcesContent":["import type { TransferUploadExportData } from \"../../../uploader/export/transferUploadExportData.js\";\nimport type { TransferUploadAppendInfo } from \"../../../uploader/options/transferUploadAppendInfo.js\";\nimport type TransferUploadConfig from \"../../../uploader/options/transferUploadConfig.js\";\nimport type TransferUploadInfo from \"../../../uploader/options/transferUploadInfo.js\";\nimport type FileDetails from \"../../../utils/fileSystem/fileDetails.js\";\nimport type TransferUploaderConfig from \"../transferUploaderConfig.js\";\n\nexport function buildUploadConfig(config: TransferUploaderConfig): TransferUploadConfig {\n return {\n progressEventThrottlingInMs: config.progressEventThrottlingInMs,\n currentRatesTimespanInMs: config.currentRatesTimespanInMs,\n forceUdp: config.forceUdp,\n turnOffUdp: config.turnOffUdp,\n };\n}\n\n/* eslint-disable no-param-reassign */\nexport function fixTransferInfo<T>(transferInfo: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): void {\n if (isTransferUploaderAppendInfo(transferInfo))\n transferInfo.transferFileServerUrl = new URL(`savefile.ashx`, transferInfo.transferFileServerUrl).href;\n}\n\nexport function isTransferUploaderAppendInfo<T>(info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): info is TransferUploadAppendInfo<T> {\n return (info as TransferUploadAppendInfo<T>).transferKey !== undefined;\n}\n\nexport function isTransferInfo<T extends FileDetails>(transferInfoOrExportData: (TransferUploadInfo<T> | TransferUploadAppendInfo<T>) | TransferUploadExportData<T>): transferInfoOrExportData is TransferUploadInfo<T> | TransferUploadAppendInfo<T> {\n const possiblyTransferInfo = transferInfoOrExportData as TransferUploadInfo<T> | TransferUploadAppendInfo<T>;\n return possiblyTransferInfo.files !== undefined && Array.isArray(possiblyTransferInfo.files);\n}"]}
1
+ {"version":3,"file":"uploaderUtils.js","sourceRoot":"","sources":["../../../../../src/client/uploader/utils/uploaderUtils.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAAC,MAA8B;IAC5D,OAAO;QACH,2BAA2B,EAAE,MAAM,CAAC,2BAA2B;QAC/D,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;QACzD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KAC5C,CAAC;AACN,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,eAAe,CAAI,YAAiE;IAChG,IAAI,4BAA4B,CAAC,YAAY,CAAC;QAC1C,YAAY,CAAC,qBAAqB,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAI,IAAyD;IACrG,OAAQ,IAAoC,CAAC,WAAW,KAAK,SAAS,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc,CAAwB,wBAA6G;IAC/J,MAAM,oBAAoB,GAAG,wBAA+E,CAAC;IAC7G,OAAO,oBAAoB,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACjG,CAAC","sourcesContent":["import type { TransferUploadExportData } from \"../../../uploader/export/transferUploadExportData.js\";\nimport type { TransferUploadAppendInfo } from \"../../../uploader/options/transferUploadAppendInfo.js\";\nimport type TransferUploadConfig from \"../../../uploader/options/transferUploadConfig.js\";\nimport type TransferUploadInfo from \"../../../uploader/options/transferUploadInfo.js\";\nimport type FileDetails from \"../../../utils/fileSystem/fileDetails.js\";\nimport type TransferUploaderConfig from \"../transferUploaderConfig.js\";\n\nexport function buildUploadConfig(config: TransferUploaderConfig): TransferUploadConfig {\n return {\n progressEventThrottlingInMs: config.progressEventThrottlingInMs,\n currentRatesTimespanInMs: config.currentRatesTimespanInMs,\n chunkSizeInBytes: config.chunkSizeInBytes,\n };\n}\n\n/* eslint-disable no-param-reassign */\nexport function fixTransferInfo<T>(transferInfo: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): void {\n if (isTransferUploaderAppendInfo(transferInfo))\n transferInfo.transferFileServerUrl = new URL(`savefile.ashx`, transferInfo.transferFileServerUrl).href;\n}\n\nexport function isTransferUploaderAppendInfo<T>(info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): info is TransferUploadAppendInfo<T> {\n return (info as TransferUploadAppendInfo<T>).transferKey !== undefined;\n}\n\nexport function isTransferInfo<T extends FileDetails>(transferInfoOrExportData: (TransferUploadInfo<T> | TransferUploadAppendInfo<T>) | TransferUploadExportData<T>): transferInfoOrExportData is TransferUploadInfo<T> | TransferUploadAppendInfo<T> {\n const possiblyTransferInfo = transferInfoOrExportData as TransferUploadInfo<T> | TransferUploadAppendInfo<T>;\n return possiblyTransferInfo.files !== undefined && Array.isArray(possiblyTransferInfo.files);\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"webTransferUploader.d.ts","sourceRoot":"","sources":["../../../../../src/client/uploader/web/webTransferUploader.ts"],"names":[],"mappings":"AAMA,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAS9D,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,uDAAuD,CAAC;AACtG,OAAO,KAAK,sBAAsB,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,cAAc,MAAM,iDAAiD,CAAC;AAElF,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,oBAAoB,CAAC,cAAc,CAAC;gBACrE,YAAY,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,wBAAwB,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;CAsB3L"}
1
+ {"version":3,"file":"webTransferUploader.d.ts","sourceRoot":"","sources":["../../../../../src/client/uploader/web/webTransferUploader.ts"],"names":[],"mappings":"AAMA,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAS9D,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,uDAAuD,CAAC;AACtG,OAAO,KAAK,sBAAsB,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,cAAc,MAAM,iDAAiD,CAAC;AAElF,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,oBAAoB,CAAC,cAAc,CAAC;gBACrE,YAAY,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,wBAAwB,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;CAwB3L"}
@@ -1,7 +1,7 @@
1
1
  import { v4 as guid } from 'uuid';
2
2
  import TransferUpload from "../../../uploader/transferUpload.js";
3
- import TransferUploadOptimizer from "../../../uploader/optimizer/transferUploadOptimizer.js";
4
- import UdpConcurrencyBasedOptimizationStrategy from "../../../uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js";
3
+ import TransferUploadAcker from "../../../uploader/transferUploadAcker.js";
4
+ import TransferConcurrencyController from "../../../utils/concurrencyController/transferConcurrencyController.js";
5
5
  import { buildUploadConfig, fixTransferInfo } from '../utils/uploaderUtils.js';
6
6
  import TransferUploaderBase from "../transferUploaderBase.js";
7
7
  import WebEventsEngine from '../../../utils/events/web/webEventsEngine.js';
@@ -16,7 +16,7 @@ export default class WebTransferUploader extends TransferUploaderBase {
16
16
  const trackingId = config.trackingId || guid();
17
17
  const eventsEngine = new WebEventsEngine();
18
18
  const chunkStreamProviderFactory = new WebFileDetailsUploaderChunkStreamProviderFactory();
19
- const optimizer = new TransferUploadOptimizer(config.tcpChunkSizeInBytes, config.tcpChunksUploadInParallel, eventsEngine, new UdpConcurrencyBasedOptimizationStrategy());
19
+ const concurrencyController = new TransferConcurrencyController(config.chunksUploadInParallel);
20
20
  const fileServerClientFactory = new WebFileServerClientFactory(envValues.source, envValues.sourceDetails, config.uploadIdleTimeoutInMs, config.chunkUploadRetryLimit);
21
21
  const cryptography = new WebCryptographyProvider();
22
22
  const uploadConfig = buildUploadConfig(config);
@@ -24,8 +24,9 @@ export default class WebTransferUploader extends TransferUploaderBase {
24
24
  const apiClient = new WebApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, config.apiRequestTotalTimeoutInMs, config.apiRetryLimit);
25
25
  if (config.logintoken)
26
26
  apiClient.setLoginToken(config.logintoken);
27
+ const acker = new TransferUploadAcker(apiClient, eventsEngine, config.fileAckIntervalInMs);
27
28
  fixTransferInfo(transferInfo);
28
- const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfo, uploadConfig, optimizer, cryptography);
29
+ const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfo, uploadConfig, concurrencyController, cryptography, acker);
29
30
  super(transfer, transferInfo.files, config, envValues, logger, healthMonitor, trackingId);
30
31
  }
31
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webTransferUploader.js","sourceRoot":"","sources":["../../../../../src/client/uploader/web/webTransferUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,uBAAuB,MAAM,wDAAwD,CAAC;AAC7F,OAAO,uCAAuC,MAAM,mFAAmF,CAAC;AACxI,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAC9D,OAAO,eAAe,MAAM,8CAA8C,CAAC;AAC3E,OAAO,gDAAgD,MAAM,kGAAkG,CAAC;AAChK,OAAO,uBAAuB,MAAM,sDAAsD,CAAC;AAC3F,OAAO,0BAA0B,MAAM,sDAAsD,CAAC;AAC9F,OAAO,YAAY,MAAM,wCAAwC,CAAC;AAClE,OAAO,gBAAgB,MAAM,uDAAuD,CAAC;AACrF,OAAO,6BAA6B,MAAM,sDAAsD,CAAC;AASjG,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,oBAAoC;IACjF,YAAY,YAA2F,EAAE,MAA8B,EAAE,SAA+B,EAAE,MAAc;QACpL,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAE/C,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,MAAM,0BAA0B,GAAG,IAAI,gDAAgD,EAAE,CAAC;QAC1F,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,yBAAyB,EAAE,YAAY,EAAE,IAAI,uCAAuC,EAAE,CAAC,CAAC;QACzK,MAAM,uBAAuB,GAAG,IAAI,0BAA0B,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACtK,MAAM,YAAY,GAAG,IAAI,uBAAuB,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,6BAA6B,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAElH,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAE7J,IAAI,MAAM,CAAC,UAAU;YACjB,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/C,eAAe,CAAC,YAAY,CAAC,CAAC;QAE9B,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,0BAA0B,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAEvK,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAC9F,CAAC;CACJ","sourcesContent":["import { v4 as guid } from 'uuid';\n\nimport TransferUpload from \"../../../uploader/transferUpload.js\";\nimport TransferUploadOptimizer from \"../../../uploader/optimizer/transferUploadOptimizer.js\";\nimport UdpConcurrencyBasedOptimizationStrategy from \"../../../uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js\";\nimport { buildUploadConfig, fixTransferInfo } from '../utils/uploaderUtils.js';\nimport TransferUploaderBase from \"../transferUploaderBase.js\";\nimport WebEventsEngine from '../../../utils/events/web/webEventsEngine.js';\nimport WebFileDetailsUploaderChunkStreamProviderFactory from '../../../uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.js';\nimport WebCryptographyProvider from '../../../utils/crypto/web/webCryptographyProvider.js';\nimport WebFileServerClientFactory from '../../../utils/api/web/webFileServerClientFactory.js';\nimport WebApiClient from '../../../utils/api/web/webApiClient.js';\nimport WebOnlineChecker from '../../healthMonitor/onlineChecker/webOnlineChecker.js';\nimport TransferUploaderHealthMonitor from '../../healthMonitor/transferUploaderHealthMonitor.js';\n\nimport type Logger from \"../../loggers/logger.js\";\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferUploadInfo from \"../../../uploader/options/transferUploadInfo.js\";\nimport type { TransferUploadAppendInfo } from \"../../../uploader/options/transferUploadAppendInfo.js\";\nimport type TransferUploaderConfig from \"../transferUploaderConfig.js\";\nimport type WebFileDetails from \"../../../utils/fileSystem/web/webFileDetails.js\";\n\nexport default class WebTransferUploader extends TransferUploaderBase<WebFileDetails> {\n constructor(transferInfo: TransferUploadInfo<WebFileDetails> | TransferUploadAppendInfo<WebFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger) {\n const trackingId = config.trackingId || guid();\n\n const eventsEngine = new WebEventsEngine();\n const chunkStreamProviderFactory = new WebFileDetailsUploaderChunkStreamProviderFactory();\n const optimizer = new TransferUploadOptimizer(config.tcpChunkSizeInBytes, config.tcpChunksUploadInParallel, eventsEngine, new UdpConcurrencyBasedOptimizationStrategy());\n const fileServerClientFactory = new WebFileServerClientFactory(envValues.source, envValues.sourceDetails, config.uploadIdleTimeoutInMs, config.chunkUploadRetryLimit);\n const cryptography = new WebCryptographyProvider();\n const uploadConfig = buildUploadConfig(config);\n const healthMonitor = new TransferUploaderHealthMonitor(new WebOnlineChecker(envValues.apiBaseUrl), eventsEngine);\n\n const apiClient = new WebApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, config.apiRequestTotalTimeoutInMs, config.apiRetryLimit);\n\n if (config.logintoken)\n apiClient.setLoginToken(config.logintoken);\n\n fixTransferInfo(transferInfo);\n\n const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfo, uploadConfig, optimizer, cryptography);\n\n super(transfer, transferInfo.files, config, envValues, logger, healthMonitor, trackingId);\n }\n}"]}
1
+ {"version":3,"file":"webTransferUploader.js","sourceRoot":"","sources":["../../../../../src/client/uploader/web/webTransferUploader.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,6BAA6B,MAAM,uEAAuE,CAAC;AAClH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAC9D,OAAO,eAAe,MAAM,8CAA8C,CAAC;AAC3E,OAAO,gDAAgD,MAAM,kGAAkG,CAAC;AAChK,OAAO,uBAAuB,MAAM,sDAAsD,CAAC;AAC3F,OAAO,0BAA0B,MAAM,sDAAsD,CAAC;AAC9F,OAAO,YAAY,MAAM,wCAAwC,CAAC;AAClE,OAAO,gBAAgB,MAAM,uDAAuD,CAAC;AACrF,OAAO,6BAA6B,MAAM,sDAAsD,CAAC;AASjG,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,oBAAoC;IACjF,YAAY,YAA2F,EAAE,MAA8B,EAAE,SAA+B,EAAE,MAAc;QACpL,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAE/C,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,MAAM,0BAA0B,GAAG,IAAI,gDAAgD,EAAE,CAAC;QAC1F,MAAM,qBAAqB,GAAG,IAAI,6BAA6B,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/F,MAAM,uBAAuB,GAAG,IAAI,0BAA0B,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACtK,MAAM,YAAY,GAAG,IAAI,uBAAuB,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,6BAA6B,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAElH,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAE7J,IAAI,MAAM,CAAC,UAAU;YACjB,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAE3F,eAAe,CAAC,YAAY,CAAC,CAAC;QAE9B,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,0BAA0B,EAAE,SAAS,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QAE1L,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAC9F,CAAC;CACJ","sourcesContent":["import { v4 as guid } from 'uuid';\n\nimport TransferUpload from \"../../../uploader/transferUpload.js\";\nimport TransferUploadAcker from \"../../../uploader/transferUploadAcker.js\";\nimport TransferConcurrencyController from \"../../../utils/concurrencyController/transferConcurrencyController.js\";\nimport { buildUploadConfig, fixTransferInfo } from '../utils/uploaderUtils.js';\nimport TransferUploaderBase from \"../transferUploaderBase.js\";\nimport WebEventsEngine from '../../../utils/events/web/webEventsEngine.js';\nimport WebFileDetailsUploaderChunkStreamProviderFactory from '../../../uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.js';\nimport WebCryptographyProvider from '../../../utils/crypto/web/webCryptographyProvider.js';\nimport WebFileServerClientFactory from '../../../utils/api/web/webFileServerClientFactory.js';\nimport WebApiClient from '../../../utils/api/web/webApiClient.js';\nimport WebOnlineChecker from '../../healthMonitor/onlineChecker/webOnlineChecker.js';\nimport TransferUploaderHealthMonitor from '../../healthMonitor/transferUploaderHealthMonitor.js';\n\nimport type Logger from \"../../loggers/logger.js\";\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferUploadInfo from \"../../../uploader/options/transferUploadInfo.js\";\nimport type { TransferUploadAppendInfo } from \"../../../uploader/options/transferUploadAppendInfo.js\";\nimport type TransferUploaderConfig from \"../transferUploaderConfig.js\";\nimport type WebFileDetails from \"../../../utils/fileSystem/web/webFileDetails.js\";\n\nexport default class WebTransferUploader extends TransferUploaderBase<WebFileDetails> {\n constructor(transferInfo: TransferUploadInfo<WebFileDetails> | TransferUploadAppendInfo<WebFileDetails>, config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger) {\n const trackingId = config.trackingId || guid();\n\n const eventsEngine = new WebEventsEngine();\n const chunkStreamProviderFactory = new WebFileDetailsUploaderChunkStreamProviderFactory();\n const concurrencyController = new TransferConcurrencyController(config.chunksUploadInParallel);\n const fileServerClientFactory = new WebFileServerClientFactory(envValues.source, envValues.sourceDetails, config.uploadIdleTimeoutInMs, config.chunkUploadRetryLimit);\n const cryptography = new WebCryptographyProvider();\n const uploadConfig = buildUploadConfig(config);\n const healthMonitor = new TransferUploaderHealthMonitor(new WebOnlineChecker(envValues.apiBaseUrl), eventsEngine);\n\n const apiClient = new WebApiClient(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 fixTransferInfo(transferInfo);\n\n const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferInfo, uploadConfig, concurrencyController, cryptography, acker);\n\n super(transfer, transferInfo.files, config, envValues, logger, healthMonitor, trackingId);\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeFileServerDownloadClient.d.ts","sourceRoot":"","sources":["../../../../../src/downloader/api/node/nodeFileServerDownloadClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,mBAAmB,MAAM,kDAAkD,CAAC;AAGxF,OAAO,KAAK,iCAAiC,MAAM,8DAA8D,CAAC;AAClH,OAAO,KAAK,wBAAwB,MAAM,gCAAgC,CAAC;AAC3E,OAAO,wBAAwB,MAAM,qDAAqD,CAAC;AAI3F,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,wBAAyB,YAAW,wBAAwB;;gBAWtG,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM;IAapK,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvE,OAAO,IAAI,IAAI;IAKT,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAejC,yBAAyB,IAAI,OAAO,CAAC,iCAAiC,CAAC;CAuFhF"}
1
+ {"version":3,"file":"nodeFileServerDownloadClient.d.ts","sourceRoot":"","sources":["../../../../../src/downloader/api/node/nodeFileServerDownloadClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,mBAAmB,MAAM,kDAAkD,CAAC;AAGxF,OAAO,KAAK,iCAAiC,MAAM,8DAA8D,CAAC;AAClH,OAAO,KAAK,wBAAwB,MAAM,gCAAgC,CAAC;AAC3E,OAAO,wBAAwB,MAAM,qDAAqD,CAAC;AAI3F,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,wBAAyB,YAAW,wBAAwB;;gBAWtG,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM;IAapK,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvE,OAAO,IAAI,IAAI;IAKT,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAejC,yBAAyB,IAAI,OAAO,CAAC,iCAAiC,CAAC;CA4FhF"}
@@ -80,10 +80,14 @@ export default class NodeFileServerDownloadClient extends NodeFileServerClientBa
80
80
  throw new Error(`${response.responsestatus}: ${response.errormessage}`);
81
81
  }
82
82
  #crateGotRangeHashOptions() {
83
+ // FilesDB transfers cannot be resolved by transferid+thefilename on the fileserver - the filetoken from the download url must be used instead
84
+ const { filetoken } = UrlUtil.getQueryStringFromUrl(this.#downloadUrl);
85
+ const fileIdentification = filetoken
86
+ ? { filetoken }
87
+ : { transferid: this.#transferId, thefilename: this.#fileName };
83
88
  return {
84
89
  searchParams: {
85
- transferid: this.#transferId,
86
- thefilename: this.#fileName,
90
+ ...fileIdentification,
87
91
  position: this.#start,
88
92
  length: 1 + this.#end - this.#start,
89
93
  },
@@ -1 +1 @@
1
- {"version":3,"file":"nodeFileServerDownloadClient.js","sourceRoot":"","sources":["../../../../../src/downloader/api/node/nodeFileServerDownloadClient.ts"],"names":[],"mappings":"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","sourcesContent":["import got, { Got, Headers as GotHeaders, Options as GotOptions, Request as GotRequest } from \"got\";\nimport { pipeline } from \"stream/promises\";\n\nimport type DownloadOptions from \"../../downloadOptions.js\";\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\nimport { type BaseResponse, isBaseResponse } from \"../../../utils/api/dtos/baseResponse.js\";\nimport type GetRangehashResponse from \"../../../utils/api/dtos/getRangehashResponse.js\";\nimport type GetCompressedFileMetadataResponse from \"../../../utils/api/dtos/getCompressedFileMetadataResponse.js\";\nimport type FileServerDownloadClient from \"../fileServerDownloadClient.js\";\nimport NodeFileServerClientBase from \"../../../utils/api/node/nodeFileserverClientBase.js\";\nimport UrlUtil from \"../../../utils/api/urlUtil.js\";\nimport { retryEconnresetWorkaround } from \"../../../utils/api/node/gotWorkarounds.js\";\n\nexport default class NodeFileServerDownloadClient extends NodeFileServerClientBase implements FileServerDownloadClient {\n #downloadUrl: string;\n #start: number | null;\n #end: number | null;\n #options: DownloadOptions;\n #fileName: string;\n #transferId: string;\n #fileserverClient: Got;\n #downloadStream: GotRequest | null = null;\n #downloadIdleTimeoutInMs: number;\n\n constructor(downloadUrl: string, start: number | null, end: number | null, transferId: string, fileName: string, options: DownloadOptions, downloadIdleTimeoutInMs: number) {\n super();\n\n this.#downloadUrl = downloadUrl;\n this.#start = start;\n this.#end = end;\n this.#options = options;\n this.#transferId = transferId;\n this.#fileName = fileName;\n this.#fileserverClient = this.#createBaseGotInstance();\n this.#downloadIdleTimeoutInMs = downloadIdleTimeoutInMs;\n }\n\n async download(chunkStreamProvider: ChunkStreamProvider): Promise<void> {\n this.#throwIfRunning();\n\n const downloadRequest = this.#createGotChunkDownloadOptions();\n this.#downloadStream = got.stream(this.#downloadUrl, { ...downloadRequest });\n const { fileStream, decipherStream } = await chunkStreamProvider.getChunkWriteStream();\n\n const progressHandler = this.getDataTransferProgressHandler();\n this.#downloadStream.on(`downloadProgress`, progressHandler);\n\n if (decipherStream) {\n return await pipeline(\n this.#downloadStream,\n decipherStream as unknown as NodeJS.ReadWriteStream,\n fileStream,\n );\n }\n\n return pipeline(\n this.#downloadStream,\n fileStream,\n );\n }\n\n release(): void {\n this.#downloadStream?.destroy();\n this.#downloadStream = null;\n }\n\n async getMd5Checksum(): Promise<string> {\n if (this.#start === null || this.#end === null)\n throw new Error(`MD5 checksum cannot be calculated if the start or end is not known --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n const rangeHashOptions = this.#crateGotRangeHashOptions();\n const md5response = await this.#fileserverClient(`GetRangehash.ashx`, rangeHashOptions).json<GetRangehashResponse>();\n\n this.#throwIfResponseNotOk(md5response);\n\n if (!md5response.hash)\n throw new Error(`Range hash is empty --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n return md5response.hash;\n }\n\n async getCompressedFileMetadata(): Promise<GetCompressedFileMetadataResponse> {\n this.#throwIfRunning();\n\n const metadataResponse = await got.head(this.#downloadUrl);\n\n if (metadataResponse.statusCode !== 200)\n throw new Error(`HTTP ${metadataResponse.statusCode}`);\n\n const disposition = metadataResponse.headers[`content-disposition`];\n let fileName = ``;\n if (disposition && disposition.indexOf(`attachment;`) === 0) {\n const filenameRegex = /filename\\*?=['\"]?(?:UTF-\\d['\"]*)?([^;\\r\\n\"']*)['\"]?;?/;\n const matches = filenameRegex.exec(disposition);\n if (matches && matches.length > 1 && matches[1])\n fileName = matches[1];\n }\n return {\n fileSize: parseInt(metadataResponse.headers[`content-length`]!, 10),\n fileName,\n };\n }\n\n #throwIfRunning() {\n if (this.#downloadStream)\n throw new Error(`Attempted to run a chunk download while it is already running`);\n }\n\n #throwIfResponseNotOk(response: BaseResponse<unknown>) {\n if (!isBaseResponse(response))\n throw new Error(`FS response is not a valid base response object --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n if (response.responsestatus !== `OK`)\n throw new Error(`${response.responsestatus}: ${response.errormessage}`);\n }\n\n #crateGotRangeHashOptions() {\n return {\n searchParams: {\n transferid: this.#transferId,\n thefilename: this.#fileName,\n position: this.#start!,\n length: 1 + this.#end! - this.#start!,\n },\n retry: {\n limit: 5,\n backoffLimit: 10000,\n },\n };\n }\n\n #createGotChunkDownloadOptions(): GotOptions {\n const query = UrlUtil.getQueryStringFromUrl(this.#downloadUrl);\n const headers: GotHeaders = {};\n\n if (this.#options.userAgent)\n headers[`User-Agent`] = this.#options.userAgent;\n\n if (this.#start !== null && this.#end !== null)\n headers.Range = `bytes=${this.#start}-${this.#end}`;\n\n return new GotOptions({\n headers,\n searchParams: {\n ...query, // need to unfold original query - when using url with query included got will replace the query with provided searchParams option\n skipreg: true, // make sure to implement download registrations - figure out a good way for file-by-file scenarios (current desktop v2 is a bit verbose...)\n skipcheck: true,\n },\n timeout: {\n socket: this.#downloadIdleTimeoutInMs > 0 ? this.#downloadIdleTimeoutInMs : undefined,\n },\n });\n }\n\n #createBaseGotInstance(): Got {\n const headers: GotHeaders = {};\n\n if (this.#options.userAgent)\n headers[`User-Agent`] = this.#options.userAgent;\n\n return got.extend({\n prefixUrl: UrlUtil.getHostFromUrl(this.#downloadUrl),\n headers,\n retry: {\n ...retryEconnresetWorkaround,\n },\n });\n }\n}"]}
1
+ {"version":3,"file":"nodeFileServerDownloadClient.js","sourceRoot":"","sources":["../../../../../src/downloader/api/node/nodeFileServerDownloadClient.ts"],"names":[],"mappings":"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","sourcesContent":["import got, { Got, Headers as GotHeaders, Options as GotOptions, Request as GotRequest } from \"got\";\nimport { pipeline } from \"stream/promises\";\n\nimport type DownloadOptions from \"../../downloadOptions.js\";\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\nimport { type BaseResponse, isBaseResponse } from \"../../../utils/api/dtos/baseResponse.js\";\nimport type GetRangehashResponse from \"../../../utils/api/dtos/getRangehashResponse.js\";\nimport type GetCompressedFileMetadataResponse from \"../../../utils/api/dtos/getCompressedFileMetadataResponse.js\";\nimport type FileServerDownloadClient from \"../fileServerDownloadClient.js\";\nimport NodeFileServerClientBase from \"../../../utils/api/node/nodeFileserverClientBase.js\";\nimport UrlUtil from \"../../../utils/api/urlUtil.js\";\nimport { retryEconnresetWorkaround } from \"../../../utils/api/node/gotWorkarounds.js\";\n\nexport default class NodeFileServerDownloadClient extends NodeFileServerClientBase implements FileServerDownloadClient {\n #downloadUrl: string;\n #start: number | null;\n #end: number | null;\n #options: DownloadOptions;\n #fileName: string;\n #transferId: string;\n #fileserverClient: Got;\n #downloadStream: GotRequest | null = null;\n #downloadIdleTimeoutInMs: number;\n\n constructor(downloadUrl: string, start: number | null, end: number | null, transferId: string, fileName: string, options: DownloadOptions, downloadIdleTimeoutInMs: number) {\n super();\n\n this.#downloadUrl = downloadUrl;\n this.#start = start;\n this.#end = end;\n this.#options = options;\n this.#transferId = transferId;\n this.#fileName = fileName;\n this.#fileserverClient = this.#createBaseGotInstance();\n this.#downloadIdleTimeoutInMs = downloadIdleTimeoutInMs;\n }\n\n async download(chunkStreamProvider: ChunkStreamProvider): Promise<void> {\n this.#throwIfRunning();\n\n const downloadRequest = this.#createGotChunkDownloadOptions();\n this.#downloadStream = got.stream(this.#downloadUrl, { ...downloadRequest });\n const { fileStream, decipherStream } = await chunkStreamProvider.getChunkWriteStream();\n\n const progressHandler = this.getDataTransferProgressHandler();\n this.#downloadStream.on(`downloadProgress`, progressHandler);\n\n if (decipherStream) {\n return await pipeline(\n this.#downloadStream,\n decipherStream as unknown as NodeJS.ReadWriteStream,\n fileStream,\n );\n }\n\n return pipeline(\n this.#downloadStream,\n fileStream,\n );\n }\n\n release(): void {\n this.#downloadStream?.destroy();\n this.#downloadStream = null;\n }\n\n async getMd5Checksum(): Promise<string> {\n if (this.#start === null || this.#end === null)\n throw new Error(`MD5 checksum cannot be calculated if the start or end is not known --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n const rangeHashOptions = this.#crateGotRangeHashOptions();\n const md5response = await this.#fileserverClient(`GetRangehash.ashx`, rangeHashOptions).json<GetRangehashResponse>();\n\n this.#throwIfResponseNotOk(md5response);\n\n if (!md5response.hash)\n throw new Error(`Range hash is empty --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n return md5response.hash;\n }\n\n async getCompressedFileMetadata(): Promise<GetCompressedFileMetadataResponse> {\n this.#throwIfRunning();\n\n const metadataResponse = await got.head(this.#downloadUrl);\n\n if (metadataResponse.statusCode !== 200)\n throw new Error(`HTTP ${metadataResponse.statusCode}`);\n\n const disposition = metadataResponse.headers[`content-disposition`];\n let fileName = ``;\n if (disposition && disposition.indexOf(`attachment;`) === 0) {\n const filenameRegex = /filename\\*?=['\"]?(?:UTF-\\d['\"]*)?([^;\\r\\n\"']*)['\"]?;?/;\n const matches = filenameRegex.exec(disposition);\n if (matches && matches.length > 1 && matches[1])\n fileName = matches[1];\n }\n return {\n fileSize: parseInt(metadataResponse.headers[`content-length`]!, 10),\n fileName,\n };\n }\n\n #throwIfRunning() {\n if (this.#downloadStream)\n throw new Error(`Attempted to run a chunk download while it is already running`);\n }\n\n #throwIfResponseNotOk(response: BaseResponse<unknown>) {\n if (!isBaseResponse(response))\n throw new Error(`FS response is not a valid base response object --> ${this.#downloadUrl}:${this.#start}:${this.#end}`);\n\n if (response.responsestatus !== `OK`)\n throw new Error(`${response.responsestatus}: ${response.errormessage}`);\n }\n\n #crateGotRangeHashOptions() {\n // FilesDB transfers cannot be resolved by transferid+thefilename on the fileserver - the filetoken from the download url must be used instead\n const { filetoken } = UrlUtil.getQueryStringFromUrl(this.#downloadUrl);\n const fileIdentification = filetoken\n ? { filetoken }\n : { transferid: this.#transferId, thefilename: this.#fileName };\n\n return {\n searchParams: {\n ...fileIdentification,\n position: this.#start!,\n length: 1 + this.#end! - this.#start!,\n },\n retry: {\n limit: 5,\n backoffLimit: 10000,\n },\n };\n }\n\n #createGotChunkDownloadOptions(): GotOptions {\n const query = UrlUtil.getQueryStringFromUrl(this.#downloadUrl);\n const headers: GotHeaders = {};\n\n if (this.#options.userAgent)\n headers[`User-Agent`] = this.#options.userAgent;\n\n if (this.#start !== null && this.#end !== null)\n headers.Range = `bytes=${this.#start}-${this.#end}`;\n\n return new GotOptions({\n headers,\n searchParams: {\n ...query, // need to unfold original query - when using url with query included got will replace the query with provided searchParams option\n skipreg: true, // make sure to implement download registrations - figure out a good way for file-by-file scenarios (current desktop v2 is a bit verbose...)\n skipcheck: true,\n },\n timeout: {\n socket: this.#downloadIdleTimeoutInMs > 0 ? this.#downloadIdleTimeoutInMs : undefined,\n },\n });\n }\n\n #createBaseGotInstance(): Got {\n const headers: GotHeaders = {};\n\n if (this.#options.userAgent)\n headers[`User-Agent`] = this.#options.userAgent;\n\n return got.extend({\n prefixUrl: UrlUtil.getHostFromUrl(this.#downloadUrl),\n headers,\n retry: {\n ...retryEconnresetWorkaround,\n },\n });\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chunkDownloader.d.ts","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,qBAAqB,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,gBAAgB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,0BAA0B,MAAM,mDAAmD,CAAC;AAChG,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAIhE,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAEpG,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAiB5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,qBAAqB,EAC5B,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,eAAe,EACxB,uBAAuB,EAAE,uBAAuB,EAChD,0BAA0B,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAC9D,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,cAAc,EACtB,cAAc,CAAC,EAAE,iCAAiC;IAehD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA8QlC"}
1
+ {"version":3,"file":"chunkDownloader.d.ts","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,qBAAqB,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,gBAAgB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,0BAA0B,MAAM,mDAAmD,CAAC;AAChG,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAIhE,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAEpG,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAiB5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,qBAAqB,EAC5B,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,eAAe,EACxB,uBAAuB,EAAE,uBAAuB,EAChD,0BAA0B,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAC9D,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,cAAc,EACtB,cAAc,CAAC,EAAE,iCAAiC;IAehD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA8QlC"}
@@ -1,4 +1,3 @@
1
- /* eslint-disable no-await-in-loop */
2
1
  import { RequestError } from "got";
3
2
  import sleep from "abortable-sleep";
4
3
  import TransferStatus from "../utils/types/transferStatus.js";
@@ -31,7 +30,7 @@ export default class ChunkDownloader {
31
30
  this.#fileServerClientFactory = fileServerClientFactory;
32
31
  this.#chunkStreamProviderFactory = chunkStreamProviderFactory;
33
32
  this.#eventsEngine = eventsEngine;
34
- this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerTcpDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);
33
+ this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);
35
34
  this.#logger = logger;
36
35
  this.#encryptionData = encryptionData;
37
36
  }
@@ -150,7 +149,7 @@ export default class ChunkDownloader {
150
149
  }
151
150
  #recreateDownloadClient() {
152
151
  this.#chunkDownloadClient.removeEventListener(`progress`, this.#onProgress);
153
- this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerTcpDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);
152
+ this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);
154
153
  this.#chunkDownloadClient.addEventListener(`progress`, this.#onProgress);
155
154
  }
156
155
  #throwIfRunning() {