filemail-sdk 10.5.0 → 10.6.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 (277) hide show
  1. package/LICENSE +10 -10
  2. package/dist/src/autoDownloader/autoDownloader.js.map +1 -1
  3. package/dist/src/autoDownloader/autoDownloaderDestroyer.js.map +1 -1
  4. package/dist/src/autoDownloader/autoDownloaderError.js.map +1 -1
  5. package/dist/src/autoDownloader/autoDownloaderEvent.js.map +1 -1
  6. package/dist/src/autoDownloader/autoDownloaderOptions.js.map +1 -1
  7. package/dist/src/autoDownloader/autoDownloaderStateSerializer.js.map +1 -1
  8. package/dist/src/autoDownloader/eventArgs/autoDownloadEventArgs.js.map +1 -1
  9. package/dist/src/autoDownloader/eventArgs/autoDownloadFailedEventArgs.js.map +1 -1
  10. package/dist/src/autoDownloader/eventArgs/autoDownloadProgressedEventArgs.js.map +1 -1
  11. package/dist/src/autoDownloader/eventArgs/autoDownloadStartedEventArgs.js.map +1 -1
  12. package/dist/src/autoDownloader/eventArgs/autoDownloadStartingFailedEventArgs.js.map +1 -1
  13. package/dist/src/autoDownloader/eventArgs/autoDownloadUnhealthyEventArgs.js.map +1 -1
  14. package/dist/src/autoDownloader/eventArgs/checkingForNewTransfersStartedEventArgs.js.map +1 -1
  15. package/dist/src/autoDownloader/eventArgs/newTransfersCheckCompletedEventArgs.js.map +1 -1
  16. package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactory.d.ts.map +1 -1
  17. package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactory.js +1 -0
  18. package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactory.js.map +1 -1
  19. package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.d.ts +1 -0
  20. package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.d.ts.map +1 -1
  21. package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.js.map +1 -1
  22. package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfer.js.map +1 -1
  23. package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfersRetriever.js.map +1 -1
  24. package/dist/src/autoDownloader/node/nodeAutoDownloaderStateSerializer.js.map +1 -1
  25. package/dist/src/autoDownloader/node/nodeTransferDownloaderFactory.js.map +1 -1
  26. package/dist/src/autoDownloader/state/autoDownloaderRecoverableState.js.map +1 -1
  27. package/dist/src/autoDownloader/state/autoDownloaderState.js.map +1 -1
  28. package/dist/src/autoDownloader/state/autoDownloaderStateRecoverableTransfer.js.map +1 -1
  29. package/dist/src/autoDownloader/state/autoDownloaderStateRunningTransfer.js.map +1 -1
  30. package/dist/src/autoDownloader/state/autoDownloaderStateSnapshot.js.map +1 -1
  31. package/dist/src/autoDownloader/transferDownloaderFactory.js.map +1 -1
  32. package/dist/src/autoDownloader/transferHandler/autoDownloaderNewTransferHandler.js.map +1 -1
  33. package/dist/src/autoDownloader/transferHandler/autoDownloaderRecoverableTransferHandler.js.map +1 -1
  34. package/dist/src/autoDownloader/transferHandler/autoDownloaderTransferHandlerBase.js.map +1 -1
  35. package/dist/src/client/downloader/downloaderCore.d.ts.map +1 -1
  36. package/dist/src/client/downloader/downloaderCore.js +13 -5
  37. package/dist/src/client/downloader/downloaderCore.js.map +1 -1
  38. package/dist/src/client/downloader/node/nodeTransferDownloader.js.map +1 -1
  39. package/dist/src/client/downloader/transferDownloader.js.map +1 -1
  40. package/dist/src/client/environmentVariables.js.map +1 -1
  41. package/dist/src/client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js.map +1 -1
  42. package/dist/src/client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js.map +1 -1
  43. package/dist/src/client/healthMonitor/events/transferHealthMonitorEvent.js.map +1 -1
  44. package/dist/src/client/healthMonitor/onlineChecker/nodeOnlineChecker.js.map +1 -1
  45. package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.js.map +1 -1
  46. package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.js.map +1 -1
  47. package/dist/src/client/healthMonitor/transferDownloaderHealthMonitor.js.map +1 -1
  48. package/dist/src/client/healthMonitor/transferHealthMonitorBase.js.map +1 -1
  49. package/dist/src/client/healthMonitor/transferUploaderHealthMonitor.js.map +1 -1
  50. package/dist/src/client/loggers/dummyLogger.js.map +1 -1
  51. package/dist/src/client/loggers/logger.js.map +1 -1
  52. package/dist/src/client/loggers/utils/logHealthyStatus.js.map +1 -1
  53. package/dist/src/client/node/nodeFileDetailsProvider.js.map +1 -1
  54. package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
  55. package/dist/src/client/uploader/transferUploader.js.map +1 -1
  56. package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
  57. package/dist/src/client/uploader/transferUploaderConfig.js.map +1 -1
  58. package/dist/src/client/uploader/utils/uploaderUtils.js.map +1 -1
  59. package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
  60. package/dist/src/client/uploader/web/webTransferUploaderConfig.js.map +1 -1
  61. package/dist/src/downloader/api/fileServerDownloadClient.js.map +1 -1
  62. package/dist/src/downloader/api/fileServerDownloadStatusClient.d.ts +6 -0
  63. package/dist/src/downloader/api/fileServerDownloadStatusClient.d.ts.map +1 -0
  64. package/dist/src/downloader/api/fileServerDownloadStatusClient.js +2 -0
  65. package/dist/src/downloader/api/fileServerDownloadStatusClient.js.map +1 -0
  66. package/dist/src/downloader/api/node/nodeFileServerDownloadClient.d.ts.map +1 -1
  67. package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js +8 -6
  68. package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js.map +1 -1
  69. package/dist/src/downloader/api/node/nodeFileServerDownloadStatusClient.d.ts +10 -0
  70. package/dist/src/downloader/api/node/nodeFileServerDownloadStatusClient.d.ts.map +1 -0
  71. package/dist/src/downloader/api/node/nodeFileServerDownloadStatusClient.js +39 -0
  72. package/dist/src/downloader/api/node/nodeFileServerDownloadStatusClient.js.map +1 -0
  73. package/dist/src/downloader/chunkDownloader.js.map +1 -1
  74. package/dist/src/downloader/downloadFolderResolver.js.map +1 -1
  75. package/dist/src/downloader/downloadLogger.js.map +1 -1
  76. package/dist/src/downloader/downloadOptions.d.ts +5 -0
  77. package/dist/src/downloader/downloadOptions.d.ts.map +1 -1
  78. package/dist/src/downloader/downloadOptions.js +5 -0
  79. package/dist/src/downloader/downloadOptions.js.map +1 -1
  80. package/dist/src/downloader/downloadStatus/downloadFileChunkProgress.js.map +1 -1
  81. package/dist/src/downloader/downloadStatus/downloadFileProgress.js.map +1 -1
  82. package/dist/src/downloader/downloadStatus/downloadFilePromise.js.map +1 -1
  83. package/dist/src/downloader/downloadStatus/downloadState.js.map +1 -1
  84. package/dist/src/downloader/downloadTracker.d.ts +2 -1
  85. package/dist/src/downloader/downloadTracker.d.ts.map +1 -1
  86. package/dist/src/downloader/downloadTracker.js +5 -4
  87. package/dist/src/downloader/downloadTracker.js.map +1 -1
  88. package/dist/src/downloader/dtos/downloadCommand.js.map +1 -1
  89. package/dist/src/downloader/dtos/downloadError.js.map +1 -1
  90. package/dist/src/downloader/dtos/downloadErrorCode.js.map +1 -1
  91. package/dist/src/downloader/dtos/downloadEvent.js.map +1 -1
  92. package/dist/src/downloader/dtos/downloadFileChunkInfo.js.map +1 -1
  93. package/dist/src/downloader/dtos/downloadFileInfo.js.map +1 -1
  94. package/dist/src/downloader/dtos/downloadFilesCommand.js.map +1 -1
  95. package/dist/src/downloader/dtos/downloadInfo.js.map +1 -1
  96. package/dist/src/downloader/dtos/downloadRegistrationMode.d.ts +2 -1
  97. package/dist/src/downloader/dtos/downloadRegistrationMode.d.ts.map +1 -1
  98. package/dist/src/downloader/dtos/downloadRegistrationMode.js +1 -0
  99. package/dist/src/downloader/dtos/downloadRegistrationMode.js.map +1 -1
  100. package/dist/src/downloader/dtos/downloadTrackerFileInfo.js.map +1 -1
  101. package/dist/src/downloader/dtos/downloadTrackerFileProgressInfo.js.map +1 -1
  102. package/dist/src/downloader/dtos/downloadTrackerProgressInfo.js.map +1 -1
  103. package/dist/src/downloader/dtos/downloadTrackingMetadata.d.ts +2 -0
  104. package/dist/src/downloader/dtos/downloadTrackingMetadata.d.ts.map +1 -1
  105. package/dist/src/downloader/dtos/downloadTrackingMetadata.js.map +1 -1
  106. package/dist/src/downloader/dtos/downloaderRestoredState.js.map +1 -1
  107. package/dist/src/downloader/eventArgs/chunkDownloadEventArgs.js.map +1 -1
  108. package/dist/src/downloader/eventArgs/chunkDownloadFailedEventArgs.js.map +1 -1
  109. package/dist/src/downloader/eventArgs/downloadCompletedEventArgs.js.map +1 -1
  110. package/dist/src/downloader/eventArgs/downloadEventArgs.js.map +1 -1
  111. package/dist/src/downloader/eventArgs/downloadMetadataDeterminedEventArgs.js.map +1 -1
  112. package/dist/src/downloader/eventArgs/downloadPauseEventArgs.js.map +1 -1
  113. package/dist/src/downloader/eventArgs/downloadTrackingFailedEventArgs.js.map +1 -1
  114. package/dist/src/downloader/eventArgs/fileDownloadEventArgs.js.map +1 -1
  115. package/dist/src/downloader/eventArgs/fileDownloadFailedEventArgs.js.map +1 -1
  116. package/dist/src/downloader/filesDownloader.d.ts.map +1 -1
  117. package/dist/src/downloader/filesDownloader.js +26 -0
  118. package/dist/src/downloader/filesDownloader.js.map +1 -1
  119. package/dist/src/downloader/filesPreparer.js.map +1 -1
  120. package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.js.map +1 -1
  121. package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.js.map +1 -1
  122. package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.js.map +1 -1
  123. package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.js.map +1 -1
  124. package/dist/src/index.d.ts +1 -0
  125. package/dist/src/index.d.ts.map +1 -1
  126. package/dist/src/index.js.map +1 -1
  127. package/dist/src/index.node.d.ts +1 -0
  128. package/dist/src/index.node.d.ts.map +1 -1
  129. package/dist/src/index.node.js +1 -0
  130. package/dist/src/index.node.js.map +1 -1
  131. package/dist/src/index.web.js.map +1 -1
  132. package/dist/src/uploader/api/fileServerUploadClient.js.map +1 -1
  133. package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
  134. package/dist/src/uploader/api/web/utils/axiosIdleTimeoutManager.js.map +1 -1
  135. package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
  136. package/dist/src/uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -1
  137. package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js.map +1 -1
  138. package/dist/src/uploader/chunkStreamProviderFactory/web/webFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -1
  139. package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
  140. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js.map +1 -1
  141. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.js.map +1 -1
  142. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js.map +1 -1
  143. package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.js.map +1 -1
  144. package/dist/src/uploader/eventArgs/fileChunkUploadFailedEventArgs.js.map +1 -1
  145. package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.js.map +1 -1
  146. package/dist/src/uploader/eventArgs/fileUploadEventArgs.js.map +1 -1
  147. package/dist/src/uploader/eventArgs/fileUploadFailedEventArgs.js.map +1 -1
  148. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js.map +1 -1
  149. package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js.map +1 -1
  150. package/dist/src/uploader/eventArgs/transferMetadataDeterminedEventArgs.js.map +1 -1
  151. package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.js.map +1 -1
  152. package/dist/src/uploader/eventArgs/transferUploadProgressedEventArgs.js.map +1 -1
  153. package/dist/src/uploader/export/transferUploadExportData.js.map +1 -1
  154. package/dist/src/uploader/export/transferUploadExportState.js.map +1 -1
  155. package/dist/src/uploader/export/transferUploadMetadata.js.map +1 -1
  156. package/dist/src/uploader/fileChunksPlan.js.map +1 -1
  157. package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js.map +1 -1
  158. package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.js.map +1 -1
  159. package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.js.map +1 -1
  160. package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.js.map +1 -1
  161. package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.js.map +1 -1
  162. package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.js.map +1 -1
  163. package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.js.map +1 -1
  164. package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.js.map +1 -1
  165. package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.js.map +1 -1
  166. package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.js.map +1 -1
  167. package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.js.map +1 -1
  168. package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.js.map +1 -1
  169. package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.js.map +1 -1
  170. package/dist/src/uploader/md5Provider/precomputedMD5Provider.js.map +1 -1
  171. package/dist/src/uploader/md5Provider/uploaderMD5Provider.js.map +1 -1
  172. package/dist/src/uploader/options/transferUploadAppendInfo.js.map +1 -1
  173. package/dist/src/uploader/options/transferUploadConfig.js.map +1 -1
  174. package/dist/src/uploader/options/transferUploadInfo.js.map +1 -1
  175. package/dist/src/uploader/options/transferUploadInfoBase.js.map +1 -1
  176. package/dist/src/uploader/pauseController.js.map +1 -1
  177. package/dist/src/uploader/pendingFileAck.js.map +1 -1
  178. package/dist/src/uploader/registeredTransferFile.js.map +1 -1
  179. package/dist/src/uploader/state/continuousChunksCalculator.js.map +1 -1
  180. package/dist/src/uploader/state/readonlyTransferUploadStateFile.js.map +1 -1
  181. package/dist/src/uploader/state/readonlyTransferUploadStateFiles.js.map +1 -1
  182. package/dist/src/uploader/state/transferUploadProgressCalculator.js.map +1 -1
  183. package/dist/src/uploader/state/transferUploadState.js.map +1 -1
  184. package/dist/src/uploader/state/transferUploadStateFile.js.map +1 -1
  185. package/dist/src/uploader/state/transferUploadStateFiles.js.map +1 -1
  186. package/dist/src/uploader/transferFailureAbortReason.js.map +1 -1
  187. package/dist/src/uploader/transferFilesRegistrar.js.map +1 -1
  188. package/dist/src/uploader/transferUpload.js.map +1 -1
  189. package/dist/src/uploader/transferUploadAcker.js.map +1 -1
  190. package/dist/src/uploader/transferUploadError.js.map +1 -1
  191. package/dist/src/uploader/transferUploadEvent.js.map +1 -1
  192. package/dist/src/utils/api/apiClient.js.map +1 -1
  193. package/dist/src/utils/api/apiClientBase.js.map +1 -1
  194. package/dist/src/utils/api/apiError.js.map +1 -1
  195. package/dist/src/utils/api/apiFilemail449Error.js.map +1 -1
  196. package/dist/src/utils/api/apiFilemailError.js.map +1 -1
  197. package/dist/src/utils/api/dtos/ackTransferFilesRequest.js.map +1 -1
  198. package/dist/src/utils/api/dtos/ackTransferFilesResponse.js.map +1 -1
  199. package/dist/src/utils/api/dtos/baseResponse.js.map +1 -1
  200. package/dist/src/utils/api/dtos/cancelTransferRequest.js.map +1 -1
  201. package/dist/src/utils/api/dtos/finalizeTransferRequest.js.map +1 -1
  202. package/dist/src/utils/api/dtos/finalizeTransferResponse.js.map +1 -1
  203. package/dist/src/utils/api/dtos/getCompanyResponse.js.map +1 -1
  204. package/dist/src/utils/api/dtos/getCompressedFileMetadataResponse.js.map +1 -1
  205. package/dist/src/utils/api/dtos/getInboxTransfersRequest.js.map +1 -1
  206. package/dist/src/utils/api/dtos/getInboxTransfersResponse.js.map +1 -1
  207. package/dist/src/utils/api/dtos/getRangehashResponse.js.map +1 -1
  208. package/dist/src/utils/api/dtos/getTransferRequest.js.map +1 -1
  209. package/dist/src/utils/api/dtos/getTransferResponse.d.ts +1 -0
  210. package/dist/src/utils/api/dtos/getTransferResponse.d.ts.map +1 -1
  211. package/dist/src/utils/api/dtos/getTransferResponse.js.map +1 -1
  212. package/dist/src/utils/api/dtos/initializeTransferRequest.js.map +1 -1
  213. package/dist/src/utils/api/dtos/initializeTransferResponse.js.map +1 -1
  214. package/dist/src/utils/api/dtos/loginRequest.js.map +1 -1
  215. package/dist/src/utils/api/dtos/loginResponse.js.map +1 -1
  216. package/dist/src/utils/api/dtos/registerFileDownloadRequest.js.map +1 -1
  217. package/dist/src/utils/api/dtos/registerTransferDownloadRequest.js.map +1 -1
  218. package/dist/src/utils/api/dtos/registerTransferFilesRequest.js.map +1 -1
  219. package/dist/src/utils/api/dtos/registerTransferFilesResponse.js.map +1 -1
  220. package/dist/src/utils/api/dtos/resetTransferRequest.js.map +1 -1
  221. package/dist/src/utils/api/dtos/sendFileChunkRequest.js.map +1 -1
  222. package/dist/src/utils/api/dtos/transferCustomFieldDto.js.map +1 -1
  223. package/dist/src/utils/api/dtos/transferFileDto.js.map +1 -1
  224. package/dist/src/utils/api/fileServerClientFactory.d.ts +2 -0
  225. package/dist/src/utils/api/fileServerClientFactory.d.ts.map +1 -1
  226. package/dist/src/utils/api/fileServerClientFactory.js.map +1 -1
  227. package/dist/src/utils/api/node/gotWorkarounds.js.map +1 -1
  228. package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
  229. package/dist/src/utils/api/node/nodeClientBase.js.map +1 -1
  230. package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts +2 -0
  231. package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts.map +1 -1
  232. package/dist/src/utils/api/node/nodeFileServerClientFactory.js +4 -0
  233. package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
  234. package/dist/src/utils/api/node/nodeFileserverClientBase.js.map +1 -1
  235. package/dist/src/utils/api/urlUtil.js.map +1 -1
  236. package/dist/src/utils/api/web/webApiClient.js.map +1 -1
  237. package/dist/src/utils/api/web/webClientBase.js.map +1 -1
  238. package/dist/src/utils/api/web/webFileServerClientFactory.d.ts +2 -0
  239. package/dist/src/utils/api/web/webFileServerClientFactory.d.ts.map +1 -1
  240. package/dist/src/utils/api/web/webFileServerClientFactory.js +3 -0
  241. package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
  242. package/dist/src/utils/api/web/webFileserverClientBase.js.map +1 -1
  243. package/dist/src/utils/concurrencyController/concurrencyController.js.map +1 -1
  244. package/dist/src/utils/concurrencyController/concurrencyReleaser.js.map +1 -1
  245. package/dist/src/utils/concurrencyController/transferConcurrencyController.js.map +1 -1
  246. package/dist/src/utils/crypto/cryptographyProvider.js.map +1 -1
  247. package/dist/src/utils/crypto/node/nodeCryptographyProvider.js.map +1 -1
  248. package/dist/src/utils/crypto/web/webCryptographyProvider.js.map +1 -1
  249. package/dist/src/utils/dateAndTime/simpleDateFormatter.js.map +1 -1
  250. package/dist/src/utils/events/chunkProgressEvent.js.map +1 -1
  251. package/dist/src/utils/events/eventsEngine.js.map +1 -1
  252. package/dist/src/utils/events/node/nodeEventsEngine.js.map +1 -1
  253. package/dist/src/utils/events/web/webEventsEngine.js.map +1 -1
  254. package/dist/src/utils/fileSystem/chunkStreamEncryptionData.js.map +1 -1
  255. package/dist/src/utils/fileSystem/chunkStreamProvider.js.map +1 -1
  256. package/dist/src/utils/fileSystem/chunkStreamProviderFactory.js.map +1 -1
  257. package/dist/src/utils/fileSystem/fileDetails.js.map +1 -1
  258. package/dist/src/utils/fileSystem/fileSystemService.js.map +1 -1
  259. package/dist/src/utils/fileSystem/fsError.js.map +1 -1
  260. package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js.map +1 -1
  261. package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.js.map +1 -1
  262. package/dist/src/utils/fileSystem/node/nodeFileDetails.js.map +1 -1
  263. package/dist/src/utils/fileSystem/node/nodeFileSystemService.js.map +1 -1
  264. package/dist/src/utils/fileSystem/parsedPath.js.map +1 -1
  265. package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamEncrypter.js.map +1 -1
  266. package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js.map +1 -1
  267. package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.js.map +1 -1
  268. package/dist/src/utils/fileSystem/web/webFileDetails.js.map +1 -1
  269. package/dist/src/utils/jsonParsing.js.map +1 -1
  270. package/dist/src/utils/logging/logEventPropertyNames.js.map +1 -1
  271. package/dist/src/utils/mergeAbortAndPauseSignals.js.map +1 -1
  272. package/dist/src/utils/networking/throttlingOptions.js.map +1 -1
  273. package/dist/src/utils/promiseAll.js.map +1 -1
  274. package/dist/src/utils/types/transferStatus.js.map +1 -1
  275. package/dist/src/utils/uint8ArrayUtils.js.map +1 -1
  276. package/package.json +80 -80
  277. package/readme.md +27 -27
@@ -1 +1 @@
1
- {"version":3,"file":"downloadState.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadState.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferDownloadEvent from \"../dtos/downloadEvent.js\";\nimport DownloadError from \"../dtos/downloadError.js\";\nimport DownloadFileProgress from \"./downloadFileProgress.js\";\nimport DownloadFileChunkProgress from \"./downloadFileChunkProgress.js\";\n\nimport type DownloadFileInfo from \"../dtos/downloadFileInfo.js\";\nimport type DownloadFileChunkInfo from \"../dtos/downloadFileChunkInfo.js\";\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\nimport type DownloadCompletedEventArgs from \"../eventArgs/downloadCompletedEventArgs.js\";\nimport type DownloadPauseEventArgs from \"../eventArgs/downloadPauseEventArgs.js\";\nimport type FileDownloadEventArgs from \"../eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"../eventArgs/fileDownloadFailedEventArgs.js\";\nimport type ChunkDownloadEventArgs from \"../eventArgs/chunkDownloadEventArgs.js\";\nimport type ChunkDownloadFailedEventArgs from \"../eventArgs/chunkDownloadFailedEventArgs.js\";\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\nimport type DownloaderRestoredState from \"../dtos/downloaderRestoredState.js\";\nimport type DownloadOptions from \"../downloadOptions.js\";\nimport type DownloadMetadataDeterminedEventArgs from \"../eventArgs/downloadMetadataDeterminedEventArgs.js\";\n\nexport default class DownloadState {\n readonly #transferId: string;\n readonly #downloadId: string;\n readonly #options: DownloadOptions;\n readonly #eventsEngine: EventsEngine;\n\n readonly #files: Array<DownloadFileInfo>;\n readonly #failedFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\n readonly #pendingFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\n\n #totalSize = 0;\n #networkStatus = true;\n #consecutiveNetworkErrors = 0;\n #status: TransferStatus = TransferStatus.Initialized;\n #firstStartedUnixEpochMillis: number | null = null;\n #startedUnixEpochMillis: number | null = null;\n #elapsedActiveMillis = 0;\n #lastProgressTickUnixEpochMillis: number | null = null;\n #lastSpeedCalc: number | null = null;\n #percent = 0;\n\n /**\n * How many bytes downloaded - counting only completed files.\n */\n #downloadedBytes_bank = 0;\n /**\n * How many bytes downloaded total (bank + pendingFiles).\n */\n #downloadedBytes = 0;\n\n #bytesPerSecondAverage = 0;\n #bytesPerSecondCurrent = 0;\n #currentSpeedMeasurementDownloadedBytes: Array<{ time: number, bytes: number }> = [];\n #estimatedRemainingTimeSeconds: number | null = null;\n #pauseImmediately = false;\n #pausedTriggers: Array<(pauseTriggered: boolean) => void> = [];\n #resumeResolve?: (status: TransferStatus) => void;\n\n constructor(downloadId: string, transferId: string, files: Array<DownloadFileInfo>, options: DownloadOptions, eventsEngine: EventsEngine, oldState?: DownloaderRestoredState) {\n this.#downloadId = downloadId;\n this.#transferId = transferId;\n this.#eventsEngine = eventsEngine;\n this.#files = files;\n this.#options = options;\n\n if (oldState) {\n this.#elapsedActiveMillis = oldState.activeTime;\n this.#downloadedBytes = oldState.downloadedBytes;\n this.#downloadedBytes_bank = oldState.downloadedBytesBank;\n this.#totalSize = oldState.totalSize;\n this.#percent = oldState.percent;\n }\n else {\n for (const file of this.#files)\n this.#totalSize += file.sizeInBytes;\n }\n }\n\n get isRunning(): boolean {\n return this.#status === TransferStatus.Running;\n }\n\n get status(): TransferStatus {\n return this.#status;\n }\n\n get hasFailedFiles(): boolean {\n return this.#failedFiles.size > 0;\n }\n\n get allFilesCompletedOrFailed(): boolean {\n return this.#files.every(x => x.isCompleted || x.isFailed);\n }\n\n get averageBytesPerSecond(): number {\n return this.#bytesPerSecondAverage;\n }\n\n get isThereNetworkProblem(): boolean {\n return this.#networkStatus === false;\n }\n\n get pauseImmediately(): boolean {\n return this.#pauseImmediately;\n }\n\n get currentState(): DownloadEventArgs {\n return this.#buildDownloadEventArgs();\n }\n\n get #nowUnixEpochMillis() {\n return new Date().getTime();\n }\n\n get #activeTimeMillis() {\n return this.#elapsedActiveMillis + this.#activeTimeMillisSinceLastStart;\n }\n\n get #activeTimeMillisSinceLastStart() {\n if (this.#startedUnixEpochMillis === null)\n return 0;\n\n return (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n }\n\n get #totalTime() {\n if (this.#firstStartedUnixEpochMillis === null)\n return 0;\n\n return this.#nowUnixEpochMillis - this.#firstStartedUnixEpochMillis;\n }\n\n get #remainingBytes() {\n return this.#totalSize - this.#downloadedBytes;\n }\n\n get #isItTimeForGlobalProgressEvent(): boolean {\n return this.#lastProgressTickUnixEpochMillis === null || (this.#nowUnixEpochMillis - this.#lastProgressTickUnixEpochMillis) > this.#options.progressTickMillis;\n }\n\n start(): boolean {\n if (this.#status === TransferStatus.Initialized) { // can start only once!\n this.#status = TransferStatus.Running;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n this.#firstStartedUnixEpochMillis = this.#startedUnixEpochMillis;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs(true);\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadStarted, args);\n return true;\n }\n return false;\n }\n\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\n if (options.pausedTrigger)\n this.#pausedTriggers.push(options.pausedTrigger);\n\n if (this.#status === TransferStatus.Running) {\n this.#status = TransferStatus.Pausing;\n this.#pauseImmediately = options.interruptPendingChunks;\n\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\n }\n else if (this.#status === TransferStatus.Pausing && options.interruptPendingChunks && !this.#pauseImmediately) {\n this.#pauseImmediately = true;\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\n }\n else if (this.#status !== TransferStatus.Pausing && options.pausedTrigger) {\n this.#pausedTriggers = this.#pausedTriggers.filter(x => x !== options.pausedTrigger);\n options.pausedTrigger(false);\n }\n }\n\n paused(): Promise<TransferStatus | null> {\n if (this.#status === TransferStatus.Pausing) {\n this.#status = TransferStatus.Paused;\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#startedUnixEpochMillis = null;\n this.#lastSpeedCalc = null;\n this.#currentSpeedMeasurementDownloadedBytes = [];\n this.#estimatedRemainingTimeSeconds = null;\n this.#pauseImmediately = false;\n this.#eventsEngine.emit(TransferDownloadEvent.Paused, pauseArgs);\n\n const pausedTriggers = this.#pausedTriggers;\n this.#pausedTriggers = [];\n pausedTriggers.forEach(pausedTrigger => pausedTrigger(true));\n\n return new Promise(resolve => {\n this.#resumeResolve = resolve;\n });\n }\n return Promise.resolve(null);\n }\n\n resume(): boolean {\n if (this.#status === TransferStatus.Pausing) {\n this.#status = TransferStatus.Running;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\n return true;\n }\n if (this.#status === TransferStatus.Paused) {\n this.#status = TransferStatus.Running;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\n if (this.#resumeResolve) {\n this.#resumeResolve(TransferStatus.Running);\n this.#resumeResolve = undefined;\n }\n return true;\n }\n return false;\n }\n\n requestAbort(): boolean {\n if (this.#status === TransferStatus.Running || this.#status === TransferStatus.Pausing || this.#status === TransferStatus.Paused) {\n this.#status = TransferStatus.Aborting;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Aborting, args);\n if (this.#resumeResolve) {\n this.#resumeResolve(TransferStatus.Aborting);\n this.#resumeResolve = undefined;\n }\n return true;\n }\n return false;\n }\n\n aborted(): boolean {\n if (this.#status === TransferStatus.Aborting) {\n this.#status = TransferStatus.Aborted;\n if (this.#startedUnixEpochMillis !== null)\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Aborted, args);\n\n return true;\n }\n return false;\n }\n\n fileStarting(file: DownloadFileInfo) {\n file.starting();\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarting, args);\n }\n\n fileCreating(file: DownloadFileInfo) {\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreating, args);\n }\n\n ensureFileStarted(file: DownloadFileInfo): void {\n if (!file.isStarted)\n this.#fileStarted(file);\n }\n\n fileCreated(file: DownloadFileInfo) {\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreated, args);\n }\n\n fileFailedById(fileId: string, reason: DownloadError) {\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\n this.fileFailed(actualFile, reason);\n }\n\n fileFailed(file: DownloadFileInfo, reason: DownloadError): void {\n if (file.isFailed === false) {\n file.fail(reason);\n const args: FileDownloadFailedEventArgs = {\n ...this.#buildFileDownloadEventArgs(file),\n reason,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadFailed, args);\n }\n\n this.#failedFiles.add(file);\n this.#pendingFiles.delete(file);\n }\n\n fileCompleted(fileId: string, finalDownloadPath: string): void {\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\n actualFile.complete(finalDownloadPath);\n const updatedArgs = this.#buildFileDownloadEventArgs(actualFile);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleted, updatedArgs);\n }\n\n fileCompleting(file: DownloadFileInfo): void {\n const removed = this.#pendingFiles.delete(file);\n if (removed || file.sizeInBytes === 0) {\n this.#downloadedBytes_bank += file.sizeInBytes;\n const fileArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleting, fileArgs);\n }\n }\n\n chunkDownloadStarted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\n file.chunkStarted(chunk);\n const args: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadStarted, args);\n }\n\n chunkDownloadProgressed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, progress: ChunkProgressEvent): void {\n if (!file.isStarted)\n this.#fileStarted(file);\n\n this.networkOk();\n\n chunk.setProgress(progress.transferredBytesTotal);\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\n\n if (this.#isItTimeForFileProgressEvent(file))\n this.#fileProgressed(file);\n\n if (this.#isItTimeForGlobalProgressEvent)\n this.#progressed();\n }\n\n chunkDownloadCompleted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\n chunk.complete();\n file.chunkCompleted(chunk);\n file.updateProgress();\n\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadCompleted, chunkArgs);\n\n this.#tryCompleteFile(file);\n }\n\n chunkDownloadFailed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, reason: DownloadError): void {\n chunk.fail(reason);\n file.chunkFailed(chunk);\n\n const args: ChunkDownloadFailedEventArgs = {\n ...this.#buildChunkDownloadEventArgs(file, chunk),\n reason,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadFailed, args);\n\n // we've tried multiple times - but chunk still cannot be downloaded - fail this file\n this.fileFailed(file, reason);\n }\n\n completed(error?: Error): void {\n if (this.#status === TransferStatus.Completed || this.#status === TransferStatus.Failed)\n throw new DownloadError(`Download ${this.#downloadId} completion cannot be triggered in state ${TransferStatus[this.#status]}`);\n\n const failedFiles = this.#mapFailedFiles();\n\n if (!!error || failedFiles.length)\n this.#status = TransferStatus.Failed;\n else\n this.#status = TransferStatus.Completed;\n\n this.#progressed();\n\n const args: DownloadCompletedEventArgs = {\n ...this.#buildDownloadEventArgs(true),\n failedFiles,\n downloadError: error,\n };\n\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadCompleted, args);\n }\n\n registeringTransferDownload(): void {\n if (this.#status !== TransferStatus.Completed) {\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadRegistrationTriggered, args);\n }\n }\n\n registeringFileDownload(): void {\n if (this.#status !== TransferStatus.Completed) {\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadRegistrationTriggered, args);\n }\n }\n\n getCurrentState(withFiles: boolean): DownloadEventArgs {\n return this.#buildDownloadEventArgs(withFiles);\n }\n\n networkFailure() {\n this.#consecutiveNetworkErrors += 1;\n if (this.#options.fileserverOfflineAfterConsecutiveAttempts > -1\n && this.#consecutiveNetworkErrors > this.#options.fileserverOfflineAfterConsecutiveAttempts\n && this.#networkStatus === true) {\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n this.#startedUnixEpochMillis = null;\n this.#lastSpeedCalc = null;\n this.#currentSpeedMeasurementDownloadedBytes = [];\n this.#estimatedRemainingTimeSeconds = null;\n this.#networkStatus = false;\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkFailure);\n }\n }\n\n networkOk() {\n this.#consecutiveNetworkErrors = 0;\n if (this.#networkStatus === false) {\n this.#networkStatus = true;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkOk);\n }\n }\n\n possibleSupersizedFile(file: DownloadFileInfo) {\n // sometimes when FS returns too many bytes the file size could get bigger on disk than it was initially created with\n // truncate the file in this case\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.PossibleSupersizedFile, fileArgs);\n }\n\n #progressed(): void {\n this.#updateProgress();\n\n const globalArgs: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadProgressed, globalArgs);\n }\n\n #fileProgressed(file: DownloadFileInfo): void {\n file.updateProgress();\n\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\n }\n\n #fileStarted(file: DownloadFileInfo): void {\n file.start();\n\n this.#pendingFiles.add(file);\n\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarted, args);\n }\n\n #tryCompleteFile(file: DownloadFileInfo): void {\n if (file.chunks.every(chunk => chunk.isCompleted))\n this.fileCompleting(file);\n }\n\n #isItTimeForFileProgressEvent(file: DownloadFileInfo): boolean {\n return file.lastProgressTick === null || (this.#nowUnixEpochMillis - file.lastProgressTick) > this.#options.progressTickMillis;\n }\n\n #buildFileDownloadEventArgs(file: DownloadFileInfo): FileDownloadEventArgs {\n return {\n transferId: this.#transferId,\n file: this.#mapFileProgress(file),\n activeTime: this.#activeTimeMillis,\n };\n }\n\n #buildChunkDownloadEventArgs(file: DownloadFileInfo, chunk: DownloadFileChunkInfo) {\n return {\n ...this.#buildFileDownloadEventArgs(file),\n chunk: this.#mapChunkProgress(chunk),\n };\n }\n\n #buildDownloadEventArgs(withFiles = false): DownloadEventArgs {\n return {\n status: this.#status,\n downloadId: this.#downloadId,\n transferId: this.#transferId,\n activeTimeMillis: this.#activeTimeMillis,\n totalTimeMillis: this.#totalTime,\n progressPercent: this.#percent,\n bytesPerSecondAverage: this.#bytesPerSecondAverage,\n bytesPerSecondCurrent: this.#bytesPerSecondCurrent,\n estimatedRemainingTimeSeconds: this.#estimatedRemainingTimeSeconds,\n totalSize: this.#totalSize,\n downloadedBytes: this.#downloadedBytes,\n files: withFiles ? this.#mapFilesProgress() : null,\n downloadBaseFolder: this.#options.downloadFolder!,\n };\n }\n\n notifyMetadataDetermined(fileServerUrl: string, region?: string) {\n const eventArgs: DownloadMetadataDeterminedEventArgs = { ...this.#buildDownloadEventArgs(), region, fileServerUrl };\n this.#eventsEngine.emit(TransferDownloadEvent.TransferMetadataDetermined, eventArgs);\n }\n\n #buildPauseDownloadEventArgs(): DownloadPauseEventArgs {\n return { ...this.#buildDownloadEventArgs(), interruptPendingChunks: this.#pauseImmediately };\n }\n\n #updateProgress(): void {\n const now = this.#nowUnixEpochMillis;\n this.#lastProgressTickUnixEpochMillis = now;\n\n this.#downloadedBytes = this.#downloadedBytes_bank;\n for (const file of this.#pendingFiles)\n this.#downloadedBytes += file.downloadedBytes;\n\n this.#currentSpeedMeasurementDownloadedBytes.push({ time: now, bytes: this.#downloadedBytes });\n\n if (this.#totalSize === 0)\n this.#percent = 100;\n else\n this.#percent = Math.min(100, (100 * this.#downloadedBytes) / this.#totalSize);\n\n // all-time bytes/sec\n const activeTime = this.#activeTimeMillis;\n if (activeTime > 0)\n this.#bytesPerSecondAverage = this.#downloadedBytes / (activeTime / 1000);\n\n const shouldWeCalculateSpeed = (this.#lastSpeedCalc === null && this.#activeTimeMillisSinceLastStart > 1500)\n || (this.#lastSpeedCalc !== null && (now - this.#lastSpeedCalc) > 200);\n\n if (shouldWeCalculateSpeed) {\n this.#lastSpeedCalc = now;\n\n // momentary bytes/sec\n const prev = this.#currentSpeedMeasurementDownloadedBytes[0]!;\n const timeDiff = now - prev.time;\n this.#bytesPerSecondCurrent = Math.max(0, this.#downloadedBytes - prev.bytes) / (timeDiff / 1000);\n if (timeDiff > this.#options.momentaryDownloadSpeedTimespanMillis)\n this.#currentSpeedMeasurementDownloadedBytes.shift();\n\n // remaining time (seconds) - based on momentary speed and remaining bytes to download - and smoothing factor\n if (this.#remainingBytes === 0)\n this.#estimatedRemainingTimeSeconds = 0;\n else if (this.#bytesPerSecondCurrent > 0) {\n const newRemaining = this.#remainingBytes / this.#bytesPerSecondCurrent;\n if (this.#estimatedRemainingTimeSeconds)\n this.#estimatedRemainingTimeSeconds = (0.7 * newRemaining) + (0.3 * this.#estimatedRemainingTimeSeconds);\n else\n this.#estimatedRemainingTimeSeconds = newRemaining;\n }\n }\n }\n\n #mapFilesProgress(): Array<DownloadFileProgress> {\n return this.#files.map(x => this.#mapFileProgress(x));\n }\n\n #mapFailedFiles(): Array<DownloadFileProgress> {\n const result: Array<DownloadFileProgress> = [];\n for (const x of this.#failedFiles)\n result.push(this.#mapFileProgress(x));\n return result;\n }\n\n #mapFileProgress(file: DownloadFileInfo): DownloadFileProgress {\n return DownloadFileProgress.FromFileDownloadInfo(file);\n }\n\n #mapChunkProgress(chunk: DownloadFileChunkInfo): DownloadFileChunkProgress {\n return DownloadFileChunkProgress.FromChunkInfo(chunk);\n }\n}\n"]}
1
+ {"version":3,"file":"downloadState.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadState.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport TransferDownloadEvent from \"../dtos/downloadEvent.js\";\r\nimport DownloadError from \"../dtos/downloadError.js\";\r\nimport DownloadFileProgress from \"./downloadFileProgress.js\";\r\nimport DownloadFileChunkProgress from \"./downloadFileChunkProgress.js\";\r\n\r\nimport type DownloadFileInfo from \"../dtos/downloadFileInfo.js\";\r\nimport type DownloadFileChunkInfo from \"../dtos/downloadFileChunkInfo.js\";\r\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\r\nimport type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\r\nimport type DownloadCompletedEventArgs from \"../eventArgs/downloadCompletedEventArgs.js\";\r\nimport type DownloadPauseEventArgs from \"../eventArgs/downloadPauseEventArgs.js\";\r\nimport type FileDownloadEventArgs from \"../eventArgs/fileDownloadEventArgs.js\";\r\nimport type FileDownloadFailedEventArgs from \"../eventArgs/fileDownloadFailedEventArgs.js\";\r\nimport type ChunkDownloadEventArgs from \"../eventArgs/chunkDownloadEventArgs.js\";\r\nimport type ChunkDownloadFailedEventArgs from \"../eventArgs/chunkDownloadFailedEventArgs.js\";\r\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\r\nimport type DownloaderRestoredState from \"../dtos/downloaderRestoredState.js\";\r\nimport type DownloadOptions from \"../downloadOptions.js\";\r\nimport type DownloadMetadataDeterminedEventArgs from \"../eventArgs/downloadMetadataDeterminedEventArgs.js\";\r\n\r\nexport default class DownloadState {\r\n readonly #transferId: string;\r\n readonly #downloadId: string;\r\n readonly #options: DownloadOptions;\r\n readonly #eventsEngine: EventsEngine;\r\n\r\n readonly #files: Array<DownloadFileInfo>;\r\n readonly #failedFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\r\n readonly #pendingFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\r\n\r\n #totalSize = 0;\r\n #networkStatus = true;\r\n #consecutiveNetworkErrors = 0;\r\n #status: TransferStatus = TransferStatus.Initialized;\r\n #firstStartedUnixEpochMillis: number | null = null;\r\n #startedUnixEpochMillis: number | null = null;\r\n #elapsedActiveMillis = 0;\r\n #lastProgressTickUnixEpochMillis: number | null = null;\r\n #lastSpeedCalc: number | null = null;\r\n #percent = 0;\r\n\r\n /**\r\n * How many bytes downloaded - counting only completed files.\r\n */\r\n #downloadedBytes_bank = 0;\r\n /**\r\n * How many bytes downloaded total (bank + pendingFiles).\r\n */\r\n #downloadedBytes = 0;\r\n\r\n #bytesPerSecondAverage = 0;\r\n #bytesPerSecondCurrent = 0;\r\n #currentSpeedMeasurementDownloadedBytes: Array<{ time: number, bytes: number }> = [];\r\n #estimatedRemainingTimeSeconds: number | null = null;\r\n #pauseImmediately = false;\r\n #pausedTriggers: Array<(pauseTriggered: boolean) => void> = [];\r\n #resumeResolve?: (status: TransferStatus) => void;\r\n\r\n constructor(downloadId: string, transferId: string, files: Array<DownloadFileInfo>, options: DownloadOptions, eventsEngine: EventsEngine, oldState?: DownloaderRestoredState) {\r\n this.#downloadId = downloadId;\r\n this.#transferId = transferId;\r\n this.#eventsEngine = eventsEngine;\r\n this.#files = files;\r\n this.#options = options;\r\n\r\n if (oldState) {\r\n this.#elapsedActiveMillis = oldState.activeTime;\r\n this.#downloadedBytes = oldState.downloadedBytes;\r\n this.#downloadedBytes_bank = oldState.downloadedBytesBank;\r\n this.#totalSize = oldState.totalSize;\r\n this.#percent = oldState.percent;\r\n }\r\n else {\r\n for (const file of this.#files)\r\n this.#totalSize += file.sizeInBytes;\r\n }\r\n }\r\n\r\n get isRunning(): boolean {\r\n return this.#status === TransferStatus.Running;\r\n }\r\n\r\n get status(): TransferStatus {\r\n return this.#status;\r\n }\r\n\r\n get hasFailedFiles(): boolean {\r\n return this.#failedFiles.size > 0;\r\n }\r\n\r\n get allFilesCompletedOrFailed(): boolean {\r\n return this.#files.every(x => x.isCompleted || x.isFailed);\r\n }\r\n\r\n get averageBytesPerSecond(): number {\r\n return this.#bytesPerSecondAverage;\r\n }\r\n\r\n get isThereNetworkProblem(): boolean {\r\n return this.#networkStatus === false;\r\n }\r\n\r\n get pauseImmediately(): boolean {\r\n return this.#pauseImmediately;\r\n }\r\n\r\n get currentState(): DownloadEventArgs {\r\n return this.#buildDownloadEventArgs();\r\n }\r\n\r\n get #nowUnixEpochMillis() {\r\n return new Date().getTime();\r\n }\r\n\r\n get #activeTimeMillis() {\r\n return this.#elapsedActiveMillis + this.#activeTimeMillisSinceLastStart;\r\n }\r\n\r\n get #activeTimeMillisSinceLastStart() {\r\n if (this.#startedUnixEpochMillis === null)\r\n return 0;\r\n\r\n return (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\r\n }\r\n\r\n get #totalTime() {\r\n if (this.#firstStartedUnixEpochMillis === null)\r\n return 0;\r\n\r\n return this.#nowUnixEpochMillis - this.#firstStartedUnixEpochMillis;\r\n }\r\n\r\n get #remainingBytes() {\r\n return this.#totalSize - this.#downloadedBytes;\r\n }\r\n\r\n get #isItTimeForGlobalProgressEvent(): boolean {\r\n return this.#lastProgressTickUnixEpochMillis === null || (this.#nowUnixEpochMillis - this.#lastProgressTickUnixEpochMillis) > this.#options.progressTickMillis;\r\n }\r\n\r\n start(): boolean {\r\n if (this.#status === TransferStatus.Initialized) { // can start only once!\r\n this.#status = TransferStatus.Running;\r\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\r\n this.#firstStartedUnixEpochMillis = this.#startedUnixEpochMillis;\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs(true);\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadStarted, args);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\r\n if (options.pausedTrigger)\r\n this.#pausedTriggers.push(options.pausedTrigger);\r\n\r\n if (this.#status === TransferStatus.Running) {\r\n this.#status = TransferStatus.Pausing;\r\n this.#pauseImmediately = options.interruptPendingChunks;\r\n\r\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\r\n }\r\n else if (this.#status === TransferStatus.Pausing && options.interruptPendingChunks && !this.#pauseImmediately) {\r\n this.#pauseImmediately = true;\r\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\r\n }\r\n else if (this.#status !== TransferStatus.Pausing && options.pausedTrigger) {\r\n this.#pausedTriggers = this.#pausedTriggers.filter(x => x !== options.pausedTrigger);\r\n options.pausedTrigger(false);\r\n }\r\n }\r\n\r\n paused(): Promise<TransferStatus | null> {\r\n if (this.#status === TransferStatus.Pausing) {\r\n this.#status = TransferStatus.Paused;\r\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\r\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\r\n this.#startedUnixEpochMillis = null;\r\n this.#lastSpeedCalc = null;\r\n this.#currentSpeedMeasurementDownloadedBytes = [];\r\n this.#estimatedRemainingTimeSeconds = null;\r\n this.#pauseImmediately = false;\r\n this.#eventsEngine.emit(TransferDownloadEvent.Paused, pauseArgs);\r\n\r\n const pausedTriggers = this.#pausedTriggers;\r\n this.#pausedTriggers = [];\r\n pausedTriggers.forEach(pausedTrigger => pausedTrigger(true));\r\n\r\n return new Promise(resolve => {\r\n this.#resumeResolve = resolve;\r\n });\r\n }\r\n return Promise.resolve(null);\r\n }\r\n\r\n resume(): boolean {\r\n if (this.#status === TransferStatus.Pausing) {\r\n this.#status = TransferStatus.Running;\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\r\n return true;\r\n }\r\n if (this.#status === TransferStatus.Paused) {\r\n this.#status = TransferStatus.Running;\r\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\r\n if (this.#resumeResolve) {\r\n this.#resumeResolve(TransferStatus.Running);\r\n this.#resumeResolve = undefined;\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n requestAbort(): boolean {\r\n if (this.#status === TransferStatus.Running || this.#status === TransferStatus.Pausing || this.#status === TransferStatus.Paused) {\r\n this.#status = TransferStatus.Aborting;\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Aborting, args);\r\n if (this.#resumeResolve) {\r\n this.#resumeResolve(TransferStatus.Aborting);\r\n this.#resumeResolve = undefined;\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n aborted(): boolean {\r\n if (this.#status === TransferStatus.Aborting) {\r\n this.#status = TransferStatus.Aborted;\r\n if (this.#startedUnixEpochMillis !== null)\r\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\r\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.Aborted, args);\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n fileStarting(file: DownloadFileInfo) {\r\n file.starting();\r\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarting, args);\r\n }\r\n\r\n fileCreating(file: DownloadFileInfo) {\r\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreating, args);\r\n }\r\n\r\n ensureFileStarted(file: DownloadFileInfo): void {\r\n if (!file.isStarted)\r\n this.#fileStarted(file);\r\n }\r\n\r\n fileCreated(file: DownloadFileInfo) {\r\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreated, args);\r\n }\r\n\r\n fileFailedById(fileId: string, reason: DownloadError) {\r\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\r\n this.fileFailed(actualFile, reason);\r\n }\r\n\r\n fileFailed(file: DownloadFileInfo, reason: DownloadError): void {\r\n if (file.isFailed === false) {\r\n file.fail(reason);\r\n const args: FileDownloadFailedEventArgs = {\r\n ...this.#buildFileDownloadEventArgs(file),\r\n reason,\r\n };\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadFailed, args);\r\n }\r\n\r\n this.#failedFiles.add(file);\r\n this.#pendingFiles.delete(file);\r\n }\r\n\r\n fileCompleted(fileId: string, finalDownloadPath: string): void {\r\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\r\n actualFile.complete(finalDownloadPath);\r\n const updatedArgs = this.#buildFileDownloadEventArgs(actualFile);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleted, updatedArgs);\r\n }\r\n\r\n fileCompleting(file: DownloadFileInfo): void {\r\n const removed = this.#pendingFiles.delete(file);\r\n if (removed || file.sizeInBytes === 0) {\r\n this.#downloadedBytes_bank += file.sizeInBytes;\r\n const fileArgs = this.#buildFileDownloadEventArgs(file!);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleting, fileArgs);\r\n }\r\n }\r\n\r\n chunkDownloadStarted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\r\n file.chunkStarted(chunk);\r\n const args: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadStarted, args);\r\n }\r\n\r\n chunkDownloadProgressed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, progress: ChunkProgressEvent): void {\r\n if (!file.isStarted)\r\n this.#fileStarted(file);\r\n\r\n this.networkOk();\r\n\r\n chunk.setProgress(progress.transferredBytesTotal);\r\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\r\n\r\n if (this.#isItTimeForFileProgressEvent(file))\r\n this.#fileProgressed(file);\r\n\r\n if (this.#isItTimeForGlobalProgressEvent)\r\n this.#progressed();\r\n }\r\n\r\n chunkDownloadCompleted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\r\n chunk.complete();\r\n file.chunkCompleted(chunk);\r\n file.updateProgress();\r\n\r\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\r\n\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadCompleted, chunkArgs);\r\n\r\n this.#tryCompleteFile(file);\r\n }\r\n\r\n chunkDownloadFailed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, reason: DownloadError): void {\r\n chunk.fail(reason);\r\n file.chunkFailed(chunk);\r\n\r\n const args: ChunkDownloadFailedEventArgs = {\r\n ...this.#buildChunkDownloadEventArgs(file, chunk),\r\n reason,\r\n };\r\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadFailed, args);\r\n\r\n // we've tried multiple times - but chunk still cannot be downloaded - fail this file\r\n this.fileFailed(file, reason);\r\n }\r\n\r\n completed(error?: Error): void {\r\n if (this.#status === TransferStatus.Completed || this.#status === TransferStatus.Failed)\r\n throw new DownloadError(`Download ${this.#downloadId} completion cannot be triggered in state ${TransferStatus[this.#status]}`);\r\n\r\n const failedFiles = this.#mapFailedFiles();\r\n\r\n if (!!error || failedFiles.length)\r\n this.#status = TransferStatus.Failed;\r\n else\r\n this.#status = TransferStatus.Completed;\r\n\r\n this.#progressed();\r\n\r\n const args: DownloadCompletedEventArgs = {\r\n ...this.#buildDownloadEventArgs(true),\r\n failedFiles,\r\n downloadError: error,\r\n };\r\n\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadCompleted, args);\r\n }\r\n\r\n registeringTransferDownload(): void {\r\n if (this.#status !== TransferStatus.Completed) {\r\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadRegistrationTriggered, args);\r\n }\r\n }\r\n\r\n registeringFileDownload(): void {\r\n if (this.#status !== TransferStatus.Completed) {\r\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadRegistrationTriggered, args);\r\n }\r\n }\r\n\r\n getCurrentState(withFiles: boolean): DownloadEventArgs {\r\n return this.#buildDownloadEventArgs(withFiles);\r\n }\r\n\r\n networkFailure() {\r\n this.#consecutiveNetworkErrors += 1;\r\n if (this.#options.fileserverOfflineAfterConsecutiveAttempts > -1\r\n && this.#consecutiveNetworkErrors > this.#options.fileserverOfflineAfterConsecutiveAttempts\r\n && this.#networkStatus === true) {\r\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\r\n this.#startedUnixEpochMillis = null;\r\n this.#lastSpeedCalc = null;\r\n this.#currentSpeedMeasurementDownloadedBytes = [];\r\n this.#estimatedRemainingTimeSeconds = null;\r\n this.#networkStatus = false;\r\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkFailure);\r\n }\r\n }\r\n\r\n networkOk() {\r\n this.#consecutiveNetworkErrors = 0;\r\n if (this.#networkStatus === false) {\r\n this.#networkStatus = true;\r\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\r\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkOk);\r\n }\r\n }\r\n\r\n possibleSupersizedFile(file: DownloadFileInfo) {\r\n // sometimes when FS returns too many bytes the file size could get bigger on disk than it was initially created with\r\n // truncate the file in this case\r\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\r\n this.#eventsEngine.emit(TransferDownloadEvent.PossibleSupersizedFile, fileArgs);\r\n }\r\n\r\n #progressed(): void {\r\n this.#updateProgress();\r\n\r\n const globalArgs: DownloadEventArgs = this.#buildDownloadEventArgs();\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadProgressed, globalArgs);\r\n }\r\n\r\n #fileProgressed(file: DownloadFileInfo): void {\r\n file.updateProgress();\r\n\r\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\r\n }\r\n\r\n #fileStarted(file: DownloadFileInfo): void {\r\n file.start();\r\n\r\n this.#pendingFiles.add(file);\r\n\r\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\r\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarted, args);\r\n }\r\n\r\n #tryCompleteFile(file: DownloadFileInfo): void {\r\n if (file.chunks.every(chunk => chunk.isCompleted))\r\n this.fileCompleting(file);\r\n }\r\n\r\n #isItTimeForFileProgressEvent(file: DownloadFileInfo): boolean {\r\n return file.lastProgressTick === null || (this.#nowUnixEpochMillis - file.lastProgressTick) > this.#options.progressTickMillis;\r\n }\r\n\r\n #buildFileDownloadEventArgs(file: DownloadFileInfo): FileDownloadEventArgs {\r\n return {\r\n transferId: this.#transferId,\r\n file: this.#mapFileProgress(file),\r\n activeTime: this.#activeTimeMillis,\r\n };\r\n }\r\n\r\n #buildChunkDownloadEventArgs(file: DownloadFileInfo, chunk: DownloadFileChunkInfo) {\r\n return {\r\n ...this.#buildFileDownloadEventArgs(file),\r\n chunk: this.#mapChunkProgress(chunk),\r\n };\r\n }\r\n\r\n #buildDownloadEventArgs(withFiles = false): DownloadEventArgs {\r\n return {\r\n status: this.#status,\r\n downloadId: this.#downloadId,\r\n transferId: this.#transferId,\r\n activeTimeMillis: this.#activeTimeMillis,\r\n totalTimeMillis: this.#totalTime,\r\n progressPercent: this.#percent,\r\n bytesPerSecondAverage: this.#bytesPerSecondAverage,\r\n bytesPerSecondCurrent: this.#bytesPerSecondCurrent,\r\n estimatedRemainingTimeSeconds: this.#estimatedRemainingTimeSeconds,\r\n totalSize: this.#totalSize,\r\n downloadedBytes: this.#downloadedBytes,\r\n files: withFiles ? this.#mapFilesProgress() : null,\r\n downloadBaseFolder: this.#options.downloadFolder!,\r\n };\r\n }\r\n\r\n notifyMetadataDetermined(fileServerUrl: string, region?: string) {\r\n const eventArgs: DownloadMetadataDeterminedEventArgs = { ...this.#buildDownloadEventArgs(), region, fileServerUrl };\r\n this.#eventsEngine.emit(TransferDownloadEvent.TransferMetadataDetermined, eventArgs);\r\n }\r\n\r\n #buildPauseDownloadEventArgs(): DownloadPauseEventArgs {\r\n return { ...this.#buildDownloadEventArgs(), interruptPendingChunks: this.#pauseImmediately };\r\n }\r\n\r\n #updateProgress(): void {\r\n const now = this.#nowUnixEpochMillis;\r\n this.#lastProgressTickUnixEpochMillis = now;\r\n\r\n this.#downloadedBytes = this.#downloadedBytes_bank;\r\n for (const file of this.#pendingFiles)\r\n this.#downloadedBytes += file.downloadedBytes;\r\n\r\n this.#currentSpeedMeasurementDownloadedBytes.push({ time: now, bytes: this.#downloadedBytes });\r\n\r\n if (this.#totalSize === 0)\r\n this.#percent = 100;\r\n else\r\n this.#percent = Math.min(100, (100 * this.#downloadedBytes) / this.#totalSize);\r\n\r\n // all-time bytes/sec\r\n const activeTime = this.#activeTimeMillis;\r\n if (activeTime > 0)\r\n this.#bytesPerSecondAverage = this.#downloadedBytes / (activeTime / 1000);\r\n\r\n const shouldWeCalculateSpeed = (this.#lastSpeedCalc === null && this.#activeTimeMillisSinceLastStart > 1500)\r\n || (this.#lastSpeedCalc !== null && (now - this.#lastSpeedCalc) > 200);\r\n\r\n if (shouldWeCalculateSpeed) {\r\n this.#lastSpeedCalc = now;\r\n\r\n // momentary bytes/sec\r\n const prev = this.#currentSpeedMeasurementDownloadedBytes[0]!;\r\n const timeDiff = now - prev.time;\r\n this.#bytesPerSecondCurrent = Math.max(0, this.#downloadedBytes - prev.bytes) / (timeDiff / 1000);\r\n if (timeDiff > this.#options.momentaryDownloadSpeedTimespanMillis)\r\n this.#currentSpeedMeasurementDownloadedBytes.shift();\r\n\r\n // remaining time (seconds) - based on momentary speed and remaining bytes to download - and smoothing factor\r\n if (this.#remainingBytes === 0)\r\n this.#estimatedRemainingTimeSeconds = 0;\r\n else if (this.#bytesPerSecondCurrent > 0) {\r\n const newRemaining = this.#remainingBytes / this.#bytesPerSecondCurrent;\r\n if (this.#estimatedRemainingTimeSeconds)\r\n this.#estimatedRemainingTimeSeconds = (0.7 * newRemaining) + (0.3 * this.#estimatedRemainingTimeSeconds);\r\n else\r\n this.#estimatedRemainingTimeSeconds = newRemaining;\r\n }\r\n }\r\n }\r\n\r\n #mapFilesProgress(): Array<DownloadFileProgress> {\r\n return this.#files.map(x => this.#mapFileProgress(x));\r\n }\r\n\r\n #mapFailedFiles(): Array<DownloadFileProgress> {\r\n const result: Array<DownloadFileProgress> = [];\r\n for (const x of this.#failedFiles)\r\n result.push(this.#mapFileProgress(x));\r\n return result;\r\n }\r\n\r\n #mapFileProgress(file: DownloadFileInfo): DownloadFileProgress {\r\n return DownloadFileProgress.FromFileDownloadInfo(file);\r\n }\r\n\r\n #mapChunkProgress(chunk: DownloadFileChunkInfo): DownloadFileChunkProgress {\r\n return DownloadFileChunkProgress.FromChunkInfo(chunk);\r\n }\r\n}\r\n"]}
@@ -4,10 +4,11 @@ import type FileSystemService from "../utils/fileSystem/fileSystemService.js";
4
4
  import type DownloadOptions from "./downloadOptions.js";
5
5
  import type DownloaderRestoredState from "./dtos/downloaderRestoredState.js";
6
6
  import type DownloadTrackingMetadata from "./dtos/downloadTrackingMetadata.js";
7
+ import type DownloadRegistrationMode from "./dtos/downloadRegistrationMode.js";
7
8
  import type { DownloadCommandE2eeData } from "./dtos/downloadCommand.js";
8
9
  export default class DownloadTracker {
9
10
  #private;
10
- constructor(downloadId: string, options: DownloadOptions, fileSystem: FileSystemService, eventsEngine: EventsEngine, e2eeData?: DownloadCommandE2eeData, region?: string);
11
+ constructor(downloadId: string, options: DownloadOptions, fileSystem: FileSystemService, eventsEngine: EventsEngine, e2eeData?: DownloadCommandE2eeData, region?: string, registrationMode?: DownloadRegistrationMode);
11
12
  private createMetadata;
12
13
  private static getTrackingPath;
13
14
  private static getMetadataFilePath;
@@ -1 +1 @@
1
- {"version":3,"file":"downloadTracker.d.ts","sourceRoot":"","sources":["../../../src/downloader/downloadTracker.ts"],"names":[],"mappings":"AAMA,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAG1D,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,iBAAiB,MAAM,0CAA0C,CAAC;AAC9E,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,uBAAuB,MAAM,mCAAmC,CAAC;AAU7E,OAAO,KAAK,wBAAwB,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEzE,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAkBpB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,MAAM;IAaxK,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,MAAM,CAAC,eAAe;IAgB9B,OAAO,CAAC,MAAM,CAAC,mBAAmB;mBA8Kb,sBAAsB;IAyGrC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC;IA8CvC,sBAAsB;WAYf,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAcxJ,sBAAsB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,uBAAuB,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;WAqD9F,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB;IAczH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAGnC"}
1
+ {"version":3,"file":"downloadTracker.d.ts","sourceRoot":"","sources":["../../../src/downloader/downloadTracker.ts"],"names":[],"mappings":"AAMA,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAG1D,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,iBAAiB,MAAM,0CAA0C,CAAC;AAC9E,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,uBAAuB,MAAM,mCAAmC,CAAC;AAU7E,OAAO,KAAK,wBAAwB,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,wBAAwB,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEzE,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAkBpB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,wBAAwB;IAarN,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,MAAM,CAAC,eAAe;IAgB9B,OAAO,CAAC,MAAM,CAAC,mBAAmB;mBA8Kb,sBAAsB;IAyGrC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC;IA8CvC,sBAAsB;WAYf,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAcxJ,sBAAsB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,uBAAuB,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;WAqD9F,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB;IAczH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAGnC"}
@@ -22,22 +22,23 @@ class DownloadTracker {
22
22
  #filesChanged = false;
23
23
  #progressChanged = false;
24
24
  #canTrack = false;
25
- constructor(downloadId, options, fileSystem, eventsEngine, e2eeData, region) {
25
+ constructor(downloadId, options, fileSystem, eventsEngine, e2eeData, region, registrationMode) {
26
26
  if (!options.downloadTrackingBaseFolder)
27
27
  throw new DownloadError(`Download tracker cannot be created - tracking folder is not specified`);
28
28
  this.#downloadId = downloadId;
29
29
  this.#options = options;
30
- this.#metadata = this.createMetadata(region, e2eeData);
30
+ this.#metadata = this.createMetadata(region, e2eeData, registrationMode);
31
31
  this.#fileSystem = fileSystem;
32
32
  this.#eventsEngine = eventsEngine;
33
33
  this.#trackingPath = _a.getTrackingPath(downloadId, options.downloadTrackingBaseFolder, fileSystem);
34
34
  this.#filesMutex = new Mutex();
35
35
  }
36
- createMetadata(region, e2eeData) {
36
+ createMetadata(region, e2eeData, registrationMode) {
37
37
  if (!e2eeData)
38
- return { region };
38
+ return { region, registrationMode };
39
39
  return {
40
40
  region,
41
+ registrationMode,
41
42
  e2eeData: {
42
43
  ivAsHex: e2eeData.iv.toString(`hex`),
43
44
  keyAsHex: e2eeData.key.toString(`hex`),
@@ -1 +1 @@
1
- {"version":3,"file":"downloadTracker.js","sourceRoot":"","sources":["../../../src/downloader/downloadTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mutex } from \"async-mutex\";\n\nimport DownloadError from \"./dtos/downloadError.js\";\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\nimport DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\nimport TransferStatus from \"../utils/types/transferStatus.js\";\n\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\nimport type FileSystemService from \"../utils/fileSystem/fileSystemService.js\";\nimport type DownloadOptions from \"./downloadOptions.js\";\nimport type DownloaderRestoredState from \"./dtos/downloaderRestoredState.js\";\nimport type DownloadTrackerFileInfo from \"./dtos/downloadTrackerFileInfo.js\";\nimport type DownloadTrackerProgressInfo from \"./dtos/downloadTrackerProgressInfo.js\";\nimport type ChunkDownloadEventArgs from \"./eventArgs/chunkDownloadEventArgs.js\";\nimport type DownloadPauseEventArgs from \"./eventArgs/downloadPauseEventArgs.js\";\nimport type FileDownloadEventArgs from \"./eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\nimport type DownloadTrackingFailedEventArgs from \"./eventArgs/downloadTrackingFailedEventArgs.js\";\nimport type DownloadCompletedEventArgs from \"./eventArgs/downloadCompletedEventArgs.js\";\nimport type DownloadTrackerFileProgressInfo from \"./dtos/downloadTrackerFileProgressInfo.js\";\nimport type DownloadTrackingMetadata from \"./dtos/downloadTrackingMetadata.js\";\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\n\nexport default class DownloadTracker {\n readonly #downloadId: string;\n readonly #fileSystem: FileSystemService;\n readonly #trackingPath: string;\n readonly #eventsEngine: EventsEngine;\n readonly #options: DownloadOptions;\n readonly #metadata: DownloadTrackingMetadata;\n readonly #filesMutex: Mutex;\n\n #progressIntervalTimer: ReturnType<typeof setInterval> | null = null;\n #allFiles: Record<string, DownloadTrackerFileInfo> = {};\n #progress: DownloadTrackerProgressInfo = { activeTime: 0, trackedFiles: {} };\n #running = false;\n #restored = false;\n #filesChanged = false;\n #progressChanged = false;\n #canTrack = false;\n\n constructor(downloadId: string, options: DownloadOptions, fileSystem: FileSystemService, eventsEngine: EventsEngine, e2eeData?: DownloadCommandE2eeData, region?: string) {\n if (!options.downloadTrackingBaseFolder)\n throw new DownloadError(`Download tracker cannot be created - tracking folder is not specified`);\n\n this.#downloadId = downloadId;\n this.#options = options;\n this.#metadata = this.createMetadata(region, e2eeData);\n this.#fileSystem = fileSystem;\n this.#eventsEngine = eventsEngine;\n this.#trackingPath = DownloadTracker.getTrackingPath(downloadId, options.downloadTrackingBaseFolder, fileSystem);\n this.#filesMutex = new Mutex();\n }\n\n private createMetadata(region: string | undefined, e2eeData?: DownloadCommandE2eeData): DownloadTrackingMetadata {\n if (!e2eeData)\n return { region };\n\n return {\n region,\n e2eeData:\n {\n ivAsHex: e2eeData.iv.toString(`hex`),\n keyAsHex: e2eeData.key.toString(`hex`),\n },\n };\n }\n\n private static getTrackingPath(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService) {\n return fileSystem.pathJoin(downloadTrackingBaseFolder, downloadId);\n }\n\n get #filesPath(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `files.json`);\n }\n\n get #filesPathTemp(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `files.tmp`);\n }\n\n get #optionsFilePath(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `options.json`);\n }\n\n private static getMetadataFilePath(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService): string {\n const trackingPath = DownloadTracker.getTrackingPath(downloadId, downloadTrackingBaseFolder, fileSystem);\n return fileSystem.pathJoin(trackingPath, `metadata.json`);\n }\n\n get #metadataFilePath(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `metadata.json`);\n }\n\n get #progressPath(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `progress.json`);\n }\n\n get #progressPathTemp(): string {\n return this.#fileSystem.pathJoin(this.#trackingPath, `progress.tmp`);\n }\n\n #addEventListeners() {\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileCreated, this.#onFileCreated);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadStarting, this.#onFileStarting);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.ChunkDownloadCompleted, this.#onChunkCompleted);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Paused, this.#onPaused);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Aborted, this.#onAborted);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.DownloadCompleted, this.#onCompleted);\n }\n\n #removeEventListeners() {\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileCreated, this.#onFileCreated);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadStarting, this.#onFileStarting);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.ChunkDownloadCompleted, this.#onChunkCompleted);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Paused, this.#onPaused);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Aborted, this.#onAborted);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.DownloadCompleted, this.#onCompleted);\n }\n\n #onFileCreated = async (args: FileDownloadEventArgs) => {\n const file = this.#allFiles[args.file.id]!;\n if (file.tdp !== args.file.temporaryDownloadPath) {\n file.tdp = args.file.temporaryDownloadPath;\n this.#filesChanged = true;\n }\n };\n\n #onFileStarting = async (args: FileDownloadEventArgs) => {\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\n if (pendingFile.wr === false) {\n pendingFile.wr = true;\n this.#progress.activeTime = args.activeTime;\n this.#progressChanged = true;\n }\n };\n\n #onFileCompleted = async (args: FileDownloadEventArgs) => {\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\n pendingFile.c = args.file.completed;\n pendingFile.er = args.file.failed;\n pendingFile.ok = args.file.lastOkChunk;\n pendingFile.ec = null;\n this.#progress.activeTime = args.activeTime;\n this.#progressChanged = true;\n\n const file = this.#allFiles[args.file.id]!;\n if (file.dp !== args.file.downloadPath) {\n file.dp = args.file.downloadPath;\n this.#filesChanged = true;\n }\n };\n\n #onFileFailed = async (args: FileDownloadFailedEventArgs) => {\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\n pendingFile.c = args.file.completed;\n pendingFile.er = args.file.failed;\n pendingFile.ok = args.file.lastOkChunk;\n pendingFile.ec = this.#toTrackedFailureCode(args.reason);\n this.#progress.activeTime = args.activeTime;\n this.#progressChanged = true;\n };\n\n #onChunkCompleted = async (args: ChunkDownloadEventArgs) => {\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\n pendingFile.c = args.file.completed;\n pendingFile.er = args.file.failed;\n pendingFile.ok = args.file.lastOkChunk;\n pendingFile.ec = null;\n this.#progress.activeTime = args.activeTime;\n this.#progressChanged = true;\n };\n\n #onPaused = async (args: DownloadPauseEventArgs) => {\n this.#progress.activeTime = args.activeTimeMillis;\n this.#progressChanged = true;\n };\n\n #onAborted = async () => {\n await this.#cleanUp(true);\n };\n\n #onCompleted = async (args: DownloadCompletedEventArgs) => {\n const removeTracking = args.status === TransferStatus.Completed;\n\n if (!removeTracking)\n await this.#dumpAllProgress();\n\n await this.#cleanUp(removeTracking);\n };\n\n #toTrackedFailureCode(error: DownloadError): DownloadErrorCode | null {\n if (error.errorCode !== null)\n return error.errorCode;\n\n if (DownloadTracker.#extractErrorCode(error) === `ENOSPC`)\n return DownloadErrorCode.DiskFull;\n\n return null;\n }\n\n static #extractErrorCode(error: unknown): string | undefined {\n let current = error as { code?: string, cause?: unknown } | undefined;\n\n for (let depth = 0; depth < 8 && current; depth++) {\n if (typeof current.code === `string`)\n return current.code;\n\n current = current.cause as { code?: string, cause?: unknown } | undefined;\n }\n\n return undefined;\n }\n\n async #cleanUp(removeTracking: boolean) {\n this.#running = false;\n this.#progressChanged = false;\n this.#filesChanged = false;\n if (this.#progressIntervalTimer !== null) {\n clearInterval(this.#progressIntervalTimer);\n this.#progressIntervalTimer = null;\n }\n this.#removeEventListeners();\n this.#allFiles = {};\n this.#progress = { activeTime: 0, trackedFiles: {} };\n\n if (removeTracking)\n await DownloadTracker.removeDownloadTrackingFolder(this.#downloadId, this.#options.downloadTrackingBaseFolder!, this.#fileSystem);\n }\n\n async #dumpOptions() {\n await this.#fileSystem.writeFile(this.#optionsFilePath, JSON.stringify(this.#options));\n }\n\n async #dumpMetadata() {\n await this.#fileSystem.writeFile(this.#metadataFilePath, JSON.stringify(this.#metadata));\n }\n\n async #dumpDownloaderFiles() {\n // write to disk - then rename: rename will be much faster than write (potentially few/few dozens MB) - minimizing risk of getting corrupt progress file on disk\n await this.#fileSystem.writeFile(this.#filesPathTemp, JSON.stringify(this.#allFiles));\n await this.#fileSystem.renameFile(this.#filesPathTemp, this.#filesPath);\n }\n\n async #dumpDownloaderProgress() {\n // write to disk - then rename: rename will be much faster than write (potentially few/few dozens MB) - minimizing risk of getting corrupt progress file on disk\n await this.#fileSystem.writeFile(this.#progressPathTemp, JSON.stringify(this.#progress));\n await this.#fileSystem.renameFile(this.#progressPathTemp, this.#progressPath);\n }\n\n #throwIfRunning() {\n if (this.#running)\n throw new DownloadError(`This download tracker is already running. Please create a new one.`);\n }\n\n private static async throwIfPathDoesntExist(path: string, reason: string, errorCode: DownloadErrorCode, fileSystem: FileSystemService) {\n if ((await fileSystem.pathExists(path)) === false)\n throw new DownloadError(reason, undefined, errorCode);\n }\n\n async #dumpAllProgress(): Promise<void> {\n await this.#filesMutex.runExclusive(async () => {\n try {\n if (this.#progressChanged) {\n this.#progressChanged = false;\n await this.#dumpDownloaderProgress();\n }\n if (this.#filesChanged) {\n this.#filesChanged = false;\n await this.#dumpDownloaderFiles();\n }\n }\n catch (err) {\n // When this event is emitted it means for the the caller that restoring interrupted download won't be able to recover\n // all downloaded data - but only some part of it. In general it is safe to continue after this event,\n // just keep in mind tracking data is not up-to-date.\n // Also note: in many cases tracking data will not be used at all (only when download was interrupted - by app restart, pc reboot etc.).\n const args: DownloadTrackingFailedEventArgs = {\n reason: `Could not update tracking data - recovering this transfer may re-download more data than needed ${this.#downloadId} @ ${this.#trackingPath}`,\n error: err as Error,\n errorCode: DownloadErrorCode.TrackingDataOutdated,\n downloadId: this.#downloadId,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadTrackingFailed, args);\n }\n });\n }\n\n #setupProgressTimer() {\n this.#progressIntervalTimer = setInterval(async () => {\n await this.#dumpAllProgress();\n }, this.#options.downloadTrackingIntervalMillis);\n }\n\n async #shouldPendingFileBeRestarted(file: DownloadFileInfo) {\n return file.wasEverWritten\n && (!file.temporaryDownloadPath || (await this.#fileSystem.pathExists(file.temporaryDownloadPath!)) === false);\n }\n\n async #restoreSingleFile(restoredFileId: string, restoredFile: DownloadTrackerFileInfo) {\n const fileTrack = this.#progress.trackedFiles[restoredFileId]!;\n const file = new DownloadFileInfo(restoredFileId, restoredFile.u, restoredFile.n, restoredFile.s, restoredFile.dp, restoredFile.cc, restoredFile.tdp);\n let fileWasReset = false;\n\n file.wasEverWritten = fileTrack.wr;\n file.isCompleted = fileTrack.c;\n file.isFailed = fileTrack.er;\n file.lastSuccessfulChunkNumber = fileTrack.ok;\n\n if (this.#shouldRetryFailedFile(fileTrack)) {\n fileTrack.er = false;\n fileTrack.ec = null;\n file.isFailed = false;\n fileWasReset = true;\n }\n\n if (file.isCompleted || file.isFailed)\n // let's save some cpu time on restoring chunk collection for file which will never be picked up\n file.downloadedBytes_bank = file.sizeInBytes;\n else {\n const shouldFileBeReset = await this.#shouldPendingFileBeRestarted(file);\n\n if (shouldFileBeReset) {\n // it maye happen that disk state is de-synced from the progress tracking file (the file.temporaryDownloadPath is gone)\n // in this case we want to simply re-start the file\n fileTrack.wr = false;\n fileTrack.ok = null;\n fileWasReset = true;\n\n file.wasEverWritten = false;\n file.lastSuccessfulChunkNumber = null;\n }\n\n for (let chunkIndex = 0; chunkIndex < file.chunkCount; chunkIndex++) {\n const chunk = this.#restoreSingleChunkInfo(file, chunkIndex, fileTrack);\n file.chunks.push(chunk);\n if (chunk.isCompleted)\n file.downloadedBytes_bank += chunk.chunkSize;\n }\n }\n\n // this method will update file.downloadedBytes properly based on file.downloadedBytes_bank\n // (and theoretically also based on file.#pendingChunks - but when restoring state #pendingChunks is always empty)\n file.updateProgress();\n\n return { file, fileWasReset };\n }\n\n #restoreSingleChunkInfo(file: DownloadFileInfo, chunkIndex: number, fileTrack: DownloadTrackerFileProgressInfo) {\n const chunk = new DownloadFileChunkInfo(file, chunkIndex, this.#options.maxChunkSize ?? null);\n chunk.isCompleted = fileTrack.ok !== null && chunkIndex <= fileTrack.ok;\n if (chunk.isCompleted)\n chunk.setProgress(chunk.chunkSize);\n return chunk;\n }\n\n #shouldRetryFailedFile(fileTrack: DownloadTrackerFileProgressInfo): boolean {\n return fileTrack.er === true && fileTrack.c === false;\n }\n\n async start(allFiles: Array<DownloadFileInfo>) {\n this.#throwIfRunning();\n\n this.#running = true;\n\n if (this.#restored === false) {\n for (const file of allFiles) {\n this.#progress.trackedFiles[file.externalId] = {\n c: file.isCompleted,\n er: file.isFailed,\n ok: file.lastSuccessfulChunkNumber,\n wr: file.wasEverWritten,\n ec: null,\n };\n this.#allFiles[file.externalId] = {\n u: file.url,\n s: file.sizeInBytes,\n n: file.name,\n dp: file.downloadPath,\n tdp: file.temporaryDownloadPath,\n cc: file.chunkCount,\n };\n }\n await this.#filesMutex.runExclusive(async () => {\n try {\n await this.#fileSystem.createFolder(this.#trackingPath);\n await this.#dumpOptions();\n await this.#dumpMetadata();\n await this.#dumpDownloaderFiles();\n await this.#dumpDownloaderProgress();\n this.#canTrack = true;\n }\n catch (err) {\n throw new DownloadError(`Could not create tracking folder - recovering this transfer will not be possible ${this.#downloadId} @ ${this.#trackingPath}`, { cause: err as Error }, DownloadErrorCode.TrackingNotAvailable);\n }\n });\n }\n else\n this.#canTrack = true;\n\n if (this.#canTrack) {\n this.#addEventListeners();\n this.#setupProgressTimer();\n }\n }\n\n async restoreDownloadOptions() {\n await DownloadTracker.throwIfPathDoesntExist(this.#optionsFilePath, `Options file \"${this.#optionsFilePath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\n try {\n const optionsFile = await this.#fileSystem.readFileAsString(this.#optionsFilePath);\n const options: DownloadOptions = JSON.parse(optionsFile);\n return options;\n }\n catch (err) {\n throw new DownloadError(`Could not read download options information ${this.#downloadId} @ ${this.#optionsFilePath}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\n }\n }\n\n static async restoreDownloadMetadata(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService): Promise<DownloadTrackingMetadata> {\n const metadataFilePath = this.getMetadataFilePath(downloadId, downloadTrackingBaseFolder, fileSystem);\n\n await this.throwIfPathDoesntExist(metadataFilePath, `Metadata file \"${metadataFilePath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, fileSystem);\n\n try {\n const metadataFile = await fileSystem.readFileAsString(metadataFilePath);\n return JSON.parse(metadataFile);\n }\n catch (err) {\n throw new DownloadError(`Could not read download metadata information ${downloadId} @ ${metadataFilePath}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\n }\n }\n\n async restoreDownloaderState(): Promise<{ state: DownloaderRestoredState, files: Array<DownloadFileInfo> }> {\n await DownloadTracker.throwIfPathDoesntExist(this.#filesPath, `Filesinfo file \"${this.#filesPath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\n await DownloadTracker.throwIfPathDoesntExist(this.#progressPath, `Tracking file \"${this.#progressPath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\n\n try {\n this.#allFiles = JSON.parse(await this.#fileSystem.readFileAsString(this.#filesPath));\n this.#progress = JSON.parse(await this.#fileSystem.readFileAsString(this.#progressPath));\n this.#restored = true;\n\n let totalSize = 0;\n let downloadedBytes = 0;\n let downloadedBytesBank = 0;\n let repeatProgressDump = false;\n const files: Array<DownloadFileInfo> = [];\n\n for (const [restoredFileId, restoredFile] of Object.entries(this.#allFiles)) {\n const { file, fileWasReset } = await this.#restoreSingleFile(restoredFileId, restoredFile);\n\n if (fileWasReset)\n repeatProgressDump = true;\n\n downloadedBytes += file.downloadedBytes;\n\n if (file.isCompleted)\n downloadedBytesBank += file.sizeInBytes;\n\n files.push(file);\n totalSize += file.sizeInBytes;\n }\n\n if (repeatProgressDump) {\n // some tracking info might have been updated (corrected) in above loop\n // persisting this makes sure we have most correct state in the progress tracking file\n // (e.g. some unconfirmed pending files might be deleted by end users etc.)\n await this.#dumpDownloaderProgress();\n }\n\n return {\n files,\n state: {\n activeTime: this.#progress.activeTime,\n downloadedBytes,\n downloadedBytesBank,\n totalSize,\n percent: totalSize === 0 ? 100 : ((100 * downloadedBytes) / totalSize),\n },\n };\n }\n catch (err) {\n throw new DownloadError(`Could not read download tracking information ${this.#downloadId}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\n }\n }\n\n static async removeDownloadTrackingFolder(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService) {\n const filesMutex = new Mutex();\n const trackingPath = DownloadTracker.getTrackingPath(downloadId, downloadTrackingBaseFolder, fileSystem);\n\n await filesMutex.runExclusive(async () => {\n try {\n await fileSystem.deleteFolder(trackingPath);\n }\n catch (err) {\n throw new DownloadError(`Could not remove tracking folder - ${downloadId} @ ${trackingPath}`, { cause: err as Error }, DownloadErrorCode.TrackingCleanupFailed);\n }\n });\n }\n\n async saveState(): Promise<void> {\n await this.#dumpAllProgress();\n }\n}\n"]}
1
+ {"version":3,"file":"downloadTracker.js","sourceRoot":"","sources":["../../../src/downloader/downloadTracker.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,iBAAiB,MAAM,6BAA6B,CAAC;AAC5D,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AACpE,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAC1D,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAmB9D,MAAqB,eAAe;IACvB,WAAW,CAAS;IACpB,WAAW,CAAoB;IAC/B,aAAa,CAAS;IACtB,aAAa,CAAe;IAC5B,QAAQ,CAAkB;IAC1B,SAAS,CAA2B;IACpC,WAAW,CAAQ;IAE5B,sBAAsB,GAA0C,IAAI,CAAC;IACrE,SAAS,GAA4C,EAAE,CAAC;IACxD,SAAS,GAAgC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC7E,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,GAAG,KAAK,CAAC;IAClB,aAAa,GAAG,KAAK,CAAC;IACtB,gBAAgB,GAAG,KAAK,CAAC;IACzB,SAAS,GAAG,KAAK,CAAC;IAElB,YAAY,UAAkB,EAAE,OAAwB,EAAE,UAA6B,EAAE,YAA0B,EAAE,QAAkC,EAAE,MAAe,EAAE,gBAA2C;QACjN,IAAI,CAAC,OAAO,CAAC,0BAA0B;YACnC,MAAM,IAAI,aAAa,CAAC,uEAAuE,CAAC,CAAC;QAErG,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACzE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,EAAe,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;QACjH,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;IACnC,CAAC;IAEO,cAAc,CAAC,MAA0B,EAAE,QAAkC,EAAE,gBAA2C;QAC9H,IAAI,CAAC,QAAQ;YACT,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QAExC,OAAO;YACH,MAAM;YACN,gBAAgB;YAChB,QAAQ,EACR;gBACI,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACpC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;aACzC;SACJ,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,UAAkB,EAAE,0BAAkC,EAAE,UAA6B;QAChH,OAAO,UAAU,CAAC,QAAQ,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACzE,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAAC,UAAkB,EAAE,0BAAkC,EAAE,UAA6B;QACpH,MAAM,YAAY,GAAG,EAAe,CAAC,eAAe,CAAC,UAAU,EAAE,0BAA0B,EAAE,UAAU,CAAC,CAAC;QACzG,OAAO,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,iBAAiB;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,iBAAiB;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACzE,CAAC;IAED,kBAAkB;QACd,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5F,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,oBAAoB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACtG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,qBAAqB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAClG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC1G,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAClF,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpF,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACpG,CAAC;IAED,qBAAqB;QACjB,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/F,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,oBAAoB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACzG,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,qBAAqB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3G,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACrG,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7G,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACvF,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACvG,CAAC;IAED,cAAc,GAAG,KAAK,EAAE,IAA2B,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC;YAC3C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC9B,CAAC;IACL,CAAC,CAAC;IAEF,eAAe,GAAG,KAAK,EAAE,IAA2B,EAAE,EAAE;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QAC/D,IAAI,WAAW,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC3B,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QACjC,CAAC;IACL,CAAC,CAAC;IAEF,gBAAgB,GAAG,KAAK,EAAE,IAA2B,EAAE,EAAE;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QAC/D,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAClC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACvC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC9B,CAAC;IACL,CAAC,CAAC;IAEF,aAAa,GAAG,KAAK,EAAE,IAAiC,EAAE,EAAE;QACxD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QAC/D,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAClC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACvC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACjC,CAAC,CAAC;IAEF,iBAAiB,GAAG,KAAK,EAAE,IAA4B,EAAE,EAAE;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QAC/D,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAClC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACvC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACjC,CAAC,CAAC;IAEF,SAAS,GAAG,KAAK,EAAE,IAA4B,EAAE,EAAE;QAC/C,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAClD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACjC,CAAC,CAAC;IAEF,UAAU,GAAG,KAAK,IAAI,EAAE;QACpB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,YAAY,GAAG,KAAK,EAAE,IAAgC,EAAE,EAAE;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,SAAS,CAAC;QAEhE,IAAI,CAAC,cAAc;YACf,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAElC,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,qBAAqB,CAAC,KAAoB;QACtC,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;YACxB,OAAO,KAAK,CAAC,SAAS,CAAC;QAE3B,IAAI,EAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,QAAQ;YACrD,OAAO,iBAAiB,CAAC,QAAQ,CAAC;QAEtC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,KAAc;QACnC,IAAI,OAAO,GAAG,KAAuD,CAAC;QAEtE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;YAChD,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;gBAChC,OAAO,OAAO,CAAC,IAAI,CAAC;YAExB,OAAO,GAAG,OAAO,CAAC,KAAuD,CAAC;QAC9E,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,cAAuB;QAClC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;YACvC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC3C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAErD,IAAI,cAAc;YACd,MAAM,EAAe,CAAC,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,0BAA2B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1I,CAAC;IAED,KAAK,CAAC,YAAY;QACd,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAAC,aAAa;QACf,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,oBAAoB;QACtB,gKAAgK;QAChK,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACtF,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,uBAAuB;QACzB,gKAAgK;QAChK,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACzF,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAClF,CAAC;IAED,eAAe;QACX,IAAI,IAAI,CAAC,QAAQ;YACb,MAAM,IAAI,aAAa,CAAC,oEAAoE,CAAC,CAAC;IACtG,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAY,EAAE,MAAc,EAAE,SAA4B,EAAE,UAA6B;QACjI,IAAI,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK;YAC7C,MAAM,IAAI,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,gBAAgB;QAClB,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YAC3C,IAAI,CAAC;gBACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACxB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;oBAC9B,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACzC,CAAC;gBACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;oBAC3B,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACtC,CAAC;YACL,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;gBACT,sHAAsH;gBACtH,sGAAsG;gBACtG,qDAAqD;gBACrD,wIAAwI;gBACxI,MAAM,IAAI,GAAoC;oBAC1C,MAAM,EAAE,mGAAmG,IAAI,CAAC,WAAW,MAAM,IAAI,CAAC,aAAa,EAAE;oBACrJ,KAAK,EAAE,GAAY;oBACnB,SAAS,EAAE,iBAAiB,CAAC,oBAAoB;oBACjD,UAAU,EAAE,IAAI,CAAC,WAAW;iBAC/B,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;YAChF,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,mBAAmB;QACf,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACjD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAClC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,6BAA6B,CAAC,IAAsB;QACtD,OAAO,IAAI,CAAC,cAAc;eACnB,CAAC,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAsB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IACvH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,cAAsB,EAAE,YAAqC;QAClF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,cAAc,CAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,gBAAgB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QACtJ,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,yBAAyB,GAAG,SAAS,CAAC,EAAE,CAAC;QAE9C,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC;YACrB,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,YAAY,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ;YACjC,gGAAgG;YAChG,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC;aAC5C,CAAC;YACF,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;YAEzE,IAAI,iBAAiB,EAAE,CAAC;gBACpB,uHAAuH;gBACvH,mDAAmD;gBACnD,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC;gBACrB,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;gBACpB,YAAY,GAAG,IAAI,CAAC;gBAEpB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;YAC1C,CAAC;YAED,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC;gBAClE,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBACxE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,KAAK,CAAC,WAAW;oBACjB,IAAI,CAAC,oBAAoB,IAAI,KAAK,CAAC,SAAS,CAAC;YACrD,CAAC;QACL,CAAC;QAED,2FAA2F;QAC3F,kHAAkH;QAClH,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,uBAAuB,CAAC,IAAsB,EAAE,UAAkB,EAAE,SAA0C;QAC1G,MAAM,KAAK,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;QAC9F,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,KAAK,IAAI,IAAI,UAAU,IAAI,SAAS,CAAC,EAAE,CAAC;QACxE,IAAI,KAAK,CAAC,WAAW;YACjB,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,sBAAsB,CAAC,SAA0C;QAC7D,OAAO,SAAS,CAAC,EAAE,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,KAAK,KAAK,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAiC;QACzC,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG;oBAC3C,CAAC,EAAE,IAAI,CAAC,WAAW;oBACnB,EAAE,EAAE,IAAI,CAAC,QAAQ;oBACjB,EAAE,EAAE,IAAI,CAAC,yBAAyB;oBAClC,EAAE,EAAE,IAAI,CAAC,cAAc;oBACvB,EAAE,EAAE,IAAI;iBACX,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG;oBAC9B,CAAC,EAAE,IAAI,CAAC,GAAG;oBACX,CAAC,EAAE,IAAI,CAAC,WAAW;oBACnB,CAAC,EAAE,IAAI,CAAC,IAAI;oBACZ,EAAE,EAAE,IAAI,CAAC,YAAY;oBACrB,GAAG,EAAE,IAAI,CAAC,qBAAqB;oBAC/B,EAAE,EAAE,IAAI,CAAC,UAAU;iBACtB,CAAC;YACN,CAAC;YACD,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;gBAC3C,IAAI,CAAC;oBACD,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBACxD,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC1B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC3B,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAClC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACrC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBAC1B,CAAC;gBACD,OAAO,GAAG,EAAE,CAAC;oBACT,MAAM,IAAI,aAAa,CAAC,oFAAoF,IAAI,CAAC,WAAW,MAAM,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;gBAC7N,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;;YAEG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAE1B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB;QACxB,MAAM,EAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,IAAI,CAAC,gBAAgB,kBAAkB,EAAE,iBAAiB,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5L,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACnF,MAAM,OAAO,GAAoB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACzD,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,aAAa,CAAC,+CAA+C,IAAI,CAAC,WAAW,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE,iBAAiB,CAAC,wBAAwB,CAAC,CAAC;QAC/L,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAkB,EAAE,0BAAkC,EAAE,UAA6B;QACtH,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,0BAA0B,EAAE,UAAU,CAAC,CAAC;QAEtG,MAAM,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,kBAAkB,gBAAgB,kBAAkB,EAAE,iBAAiB,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;QAElK,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,aAAa,CAAC,gDAAgD,UAAU,MAAM,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE,iBAAiB,CAAC,wBAAwB,CAAC,CAAC;QACrL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB;QACxB,MAAM,EAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,IAAI,CAAC,UAAU,kBAAkB,EAAE,iBAAiB,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAClL,MAAM,EAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,IAAI,CAAC,aAAa,kBAAkB,EAAE,iBAAiB,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvL,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACtF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACzF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YAEtB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,mBAAmB,GAAG,CAAC,CAAC;YAC5B,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAC/B,MAAM,KAAK,GAA4B,EAAE,CAAC;YAE1C,KAAK,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1E,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;gBAE3F,IAAI,YAAY;oBACZ,kBAAkB,GAAG,IAAI,CAAC;gBAE9B,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC;gBAExC,IAAI,IAAI,CAAC,WAAW;oBAChB,mBAAmB,IAAI,IAAI,CAAC,WAAW,CAAC;gBAE5C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC;YAClC,CAAC;YAED,IAAI,kBAAkB,EAAE,CAAC;gBACrB,uEAAuE;gBACvE,sFAAsF;gBACtF,2EAA2E;gBAC3E,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACzC,CAAC;YAED,OAAO;gBACH,KAAK;gBACL,KAAK,EAAE;oBACH,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;oBACrC,eAAe;oBACf,mBAAmB;oBACnB,SAAS;oBACT,OAAO,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,SAAS,CAAC;iBACzE;aACJ,CAAC;QACN,CAAC;QACD,OAAO,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,aAAa,CAAC,gDAAgD,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE,iBAAiB,CAAC,wBAAwB,CAAC,CAAC;QACrK,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,UAAkB,EAAE,0BAAkC,EAAE,UAA6B;QAC3H,MAAM,UAAU,GAAG,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,EAAe,CAAC,eAAe,CAAC,UAAU,EAAE,0BAA0B,EAAE,UAAU,CAAC,CAAC;QAEzG,MAAM,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACrC,IAAI,CAAC;gBACD,MAAM,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,aAAa,CAAC,sCAAsC,UAAU,MAAM,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;YACpK,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAClC,CAAC;CACJ;;eAneoB,eAAe","sourcesContent":["import { Mutex } from \"async-mutex\";\r\n\r\nimport DownloadError from \"./dtos/downloadError.js\";\r\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\r\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\r\nimport DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\r\nimport DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\r\nimport TransferStatus from \"../utils/types/transferStatus.js\";\r\n\r\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\r\nimport type FileSystemService from \"../utils/fileSystem/fileSystemService.js\";\r\nimport type DownloadOptions from \"./downloadOptions.js\";\r\nimport type DownloaderRestoredState from \"./dtos/downloaderRestoredState.js\";\r\nimport type DownloadTrackerFileInfo from \"./dtos/downloadTrackerFileInfo.js\";\r\nimport type DownloadTrackerProgressInfo from \"./dtos/downloadTrackerProgressInfo.js\";\r\nimport type ChunkDownloadEventArgs from \"./eventArgs/chunkDownloadEventArgs.js\";\r\nimport type DownloadPauseEventArgs from \"./eventArgs/downloadPauseEventArgs.js\";\r\nimport type FileDownloadEventArgs from \"./eventArgs/fileDownloadEventArgs.js\";\r\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\r\nimport type DownloadTrackingFailedEventArgs from \"./eventArgs/downloadTrackingFailedEventArgs.js\";\r\nimport type DownloadCompletedEventArgs from \"./eventArgs/downloadCompletedEventArgs.js\";\r\nimport type DownloadTrackerFileProgressInfo from \"./dtos/downloadTrackerFileProgressInfo.js\";\r\nimport type DownloadTrackingMetadata from \"./dtos/downloadTrackingMetadata.js\";\r\nimport type DownloadRegistrationMode from \"./dtos/downloadRegistrationMode.js\";\r\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\r\n\r\nexport default class DownloadTracker {\r\n readonly #downloadId: string;\r\n readonly #fileSystem: FileSystemService;\r\n readonly #trackingPath: string;\r\n readonly #eventsEngine: EventsEngine;\r\n readonly #options: DownloadOptions;\r\n readonly #metadata: DownloadTrackingMetadata;\r\n readonly #filesMutex: Mutex;\r\n\r\n #progressIntervalTimer: ReturnType<typeof setInterval> | null = null;\r\n #allFiles: Record<string, DownloadTrackerFileInfo> = {};\r\n #progress: DownloadTrackerProgressInfo = { activeTime: 0, trackedFiles: {} };\r\n #running = false;\r\n #restored = false;\r\n #filesChanged = false;\r\n #progressChanged = false;\r\n #canTrack = false;\r\n\r\n constructor(downloadId: string, options: DownloadOptions, fileSystem: FileSystemService, eventsEngine: EventsEngine, e2eeData?: DownloadCommandE2eeData, region?: string, registrationMode?: DownloadRegistrationMode) {\r\n if (!options.downloadTrackingBaseFolder)\r\n throw new DownloadError(`Download tracker cannot be created - tracking folder is not specified`);\r\n\r\n this.#downloadId = downloadId;\r\n this.#options = options;\r\n this.#metadata = this.createMetadata(region, e2eeData, registrationMode);\r\n this.#fileSystem = fileSystem;\r\n this.#eventsEngine = eventsEngine;\r\n this.#trackingPath = DownloadTracker.getTrackingPath(downloadId, options.downloadTrackingBaseFolder, fileSystem);\r\n this.#filesMutex = new Mutex();\r\n }\r\n\r\n private createMetadata(region: string | undefined, e2eeData?: DownloadCommandE2eeData, registrationMode?: DownloadRegistrationMode): DownloadTrackingMetadata {\r\n if (!e2eeData)\r\n return { region, registrationMode };\r\n\r\n return {\r\n region,\r\n registrationMode,\r\n e2eeData:\r\n {\r\n ivAsHex: e2eeData.iv.toString(`hex`),\r\n keyAsHex: e2eeData.key.toString(`hex`),\r\n },\r\n };\r\n }\r\n\r\n private static getTrackingPath(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService) {\r\n return fileSystem.pathJoin(downloadTrackingBaseFolder, downloadId);\r\n }\r\n\r\n get #filesPath(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `files.json`);\r\n }\r\n\r\n get #filesPathTemp(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `files.tmp`);\r\n }\r\n\r\n get #optionsFilePath(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `options.json`);\r\n }\r\n\r\n private static getMetadataFilePath(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService): string {\r\n const trackingPath = DownloadTracker.getTrackingPath(downloadId, downloadTrackingBaseFolder, fileSystem);\r\n return fileSystem.pathJoin(trackingPath, `metadata.json`);\r\n }\r\n\r\n get #metadataFilePath(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `metadata.json`);\r\n }\r\n\r\n get #progressPath(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `progress.json`);\r\n }\r\n\r\n get #progressPathTemp(): string {\r\n return this.#fileSystem.pathJoin(this.#trackingPath, `progress.tmp`);\r\n }\r\n\r\n #addEventListeners() {\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileCreated, this.#onFileCreated);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadStarting, this.#onFileStarting);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.ChunkDownloadCompleted, this.#onChunkCompleted);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Paused, this.#onPaused);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Aborted, this.#onAborted);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.DownloadCompleted, this.#onCompleted);\r\n }\r\n\r\n #removeEventListeners() {\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileCreated, this.#onFileCreated);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadStarting, this.#onFileStarting);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.ChunkDownloadCompleted, this.#onChunkCompleted);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Paused, this.#onPaused);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Aborted, this.#onAborted);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.DownloadCompleted, this.#onCompleted);\r\n }\r\n\r\n #onFileCreated = async (args: FileDownloadEventArgs) => {\r\n const file = this.#allFiles[args.file.id]!;\r\n if (file.tdp !== args.file.temporaryDownloadPath) {\r\n file.tdp = args.file.temporaryDownloadPath;\r\n this.#filesChanged = true;\r\n }\r\n };\r\n\r\n #onFileStarting = async (args: FileDownloadEventArgs) => {\r\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\r\n if (pendingFile.wr === false) {\r\n pendingFile.wr = true;\r\n this.#progress.activeTime = args.activeTime;\r\n this.#progressChanged = true;\r\n }\r\n };\r\n\r\n #onFileCompleted = async (args: FileDownloadEventArgs) => {\r\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\r\n pendingFile.c = args.file.completed;\r\n pendingFile.er = args.file.failed;\r\n pendingFile.ok = args.file.lastOkChunk;\r\n pendingFile.ec = null;\r\n this.#progress.activeTime = args.activeTime;\r\n this.#progressChanged = true;\r\n\r\n const file = this.#allFiles[args.file.id]!;\r\n if (file.dp !== args.file.downloadPath) {\r\n file.dp = args.file.downloadPath;\r\n this.#filesChanged = true;\r\n }\r\n };\r\n\r\n #onFileFailed = async (args: FileDownloadFailedEventArgs) => {\r\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\r\n pendingFile.c = args.file.completed;\r\n pendingFile.er = args.file.failed;\r\n pendingFile.ok = args.file.lastOkChunk;\r\n pendingFile.ec = this.#toTrackedFailureCode(args.reason);\r\n this.#progress.activeTime = args.activeTime;\r\n this.#progressChanged = true;\r\n };\r\n\r\n #onChunkCompleted = async (args: ChunkDownloadEventArgs) => {\r\n const pendingFile = this.#progress.trackedFiles[args.file.id]!;\r\n pendingFile.c = args.file.completed;\r\n pendingFile.er = args.file.failed;\r\n pendingFile.ok = args.file.lastOkChunk;\r\n pendingFile.ec = null;\r\n this.#progress.activeTime = args.activeTime;\r\n this.#progressChanged = true;\r\n };\r\n\r\n #onPaused = async (args: DownloadPauseEventArgs) => {\r\n this.#progress.activeTime = args.activeTimeMillis;\r\n this.#progressChanged = true;\r\n };\r\n\r\n #onAborted = async () => {\r\n await this.#cleanUp(true);\r\n };\r\n\r\n #onCompleted = async (args: DownloadCompletedEventArgs) => {\r\n const removeTracking = args.status === TransferStatus.Completed;\r\n\r\n if (!removeTracking)\r\n await this.#dumpAllProgress();\r\n\r\n await this.#cleanUp(removeTracking);\r\n };\r\n\r\n #toTrackedFailureCode(error: DownloadError): DownloadErrorCode | null {\r\n if (error.errorCode !== null)\r\n return error.errorCode;\r\n\r\n if (DownloadTracker.#extractErrorCode(error) === `ENOSPC`)\r\n return DownloadErrorCode.DiskFull;\r\n\r\n return null;\r\n }\r\n\r\n static #extractErrorCode(error: unknown): string | undefined {\r\n let current = error as { code?: string, cause?: unknown } | undefined;\r\n\r\n for (let depth = 0; depth < 8 && current; depth++) {\r\n if (typeof current.code === `string`)\r\n return current.code;\r\n\r\n current = current.cause as { code?: string, cause?: unknown } | undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n async #cleanUp(removeTracking: boolean) {\r\n this.#running = false;\r\n this.#progressChanged = false;\r\n this.#filesChanged = false;\r\n if (this.#progressIntervalTimer !== null) {\r\n clearInterval(this.#progressIntervalTimer);\r\n this.#progressIntervalTimer = null;\r\n }\r\n this.#removeEventListeners();\r\n this.#allFiles = {};\r\n this.#progress = { activeTime: 0, trackedFiles: {} };\r\n\r\n if (removeTracking)\r\n await DownloadTracker.removeDownloadTrackingFolder(this.#downloadId, this.#options.downloadTrackingBaseFolder!, this.#fileSystem);\r\n }\r\n\r\n async #dumpOptions() {\r\n await this.#fileSystem.writeFile(this.#optionsFilePath, JSON.stringify(this.#options));\r\n }\r\n\r\n async #dumpMetadata() {\r\n await this.#fileSystem.writeFile(this.#metadataFilePath, JSON.stringify(this.#metadata));\r\n }\r\n\r\n async #dumpDownloaderFiles() {\r\n // write to disk - then rename: rename will be much faster than write (potentially few/few dozens MB) - minimizing risk of getting corrupt progress file on disk\r\n await this.#fileSystem.writeFile(this.#filesPathTemp, JSON.stringify(this.#allFiles));\r\n await this.#fileSystem.renameFile(this.#filesPathTemp, this.#filesPath);\r\n }\r\n\r\n async #dumpDownloaderProgress() {\r\n // write to disk - then rename: rename will be much faster than write (potentially few/few dozens MB) - minimizing risk of getting corrupt progress file on disk\r\n await this.#fileSystem.writeFile(this.#progressPathTemp, JSON.stringify(this.#progress));\r\n await this.#fileSystem.renameFile(this.#progressPathTemp, this.#progressPath);\r\n }\r\n\r\n #throwIfRunning() {\r\n if (this.#running)\r\n throw new DownloadError(`This download tracker is already running. Please create a new one.`);\r\n }\r\n\r\n private static async throwIfPathDoesntExist(path: string, reason: string, errorCode: DownloadErrorCode, fileSystem: FileSystemService) {\r\n if ((await fileSystem.pathExists(path)) === false)\r\n throw new DownloadError(reason, undefined, errorCode);\r\n }\r\n\r\n async #dumpAllProgress(): Promise<void> {\r\n await this.#filesMutex.runExclusive(async () => {\r\n try {\r\n if (this.#progressChanged) {\r\n this.#progressChanged = false;\r\n await this.#dumpDownloaderProgress();\r\n }\r\n if (this.#filesChanged) {\r\n this.#filesChanged = false;\r\n await this.#dumpDownloaderFiles();\r\n }\r\n }\r\n catch (err) {\r\n // When this event is emitted it means for the the caller that restoring interrupted download won't be able to recover\r\n // all downloaded data - but only some part of it. In general it is safe to continue after this event,\r\n // just keep in mind tracking data is not up-to-date.\r\n // Also note: in many cases tracking data will not be used at all (only when download was interrupted - by app restart, pc reboot etc.).\r\n const args: DownloadTrackingFailedEventArgs = {\r\n reason: `Could not update tracking data - recovering this transfer may re-download more data than needed ${this.#downloadId} @ ${this.#trackingPath}`,\r\n error: err as Error,\r\n errorCode: DownloadErrorCode.TrackingDataOutdated,\r\n downloadId: this.#downloadId,\r\n };\r\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadTrackingFailed, args);\r\n }\r\n });\r\n }\r\n\r\n #setupProgressTimer() {\r\n this.#progressIntervalTimer = setInterval(async () => {\r\n await this.#dumpAllProgress();\r\n }, this.#options.downloadTrackingIntervalMillis);\r\n }\r\n\r\n async #shouldPendingFileBeRestarted(file: DownloadFileInfo) {\r\n return file.wasEverWritten\r\n && (!file.temporaryDownloadPath || (await this.#fileSystem.pathExists(file.temporaryDownloadPath!)) === false);\r\n }\r\n\r\n async #restoreSingleFile(restoredFileId: string, restoredFile: DownloadTrackerFileInfo) {\r\n const fileTrack = this.#progress.trackedFiles[restoredFileId]!;\r\n const file = new DownloadFileInfo(restoredFileId, restoredFile.u, restoredFile.n, restoredFile.s, restoredFile.dp, restoredFile.cc, restoredFile.tdp);\r\n let fileWasReset = false;\r\n\r\n file.wasEverWritten = fileTrack.wr;\r\n file.isCompleted = fileTrack.c;\r\n file.isFailed = fileTrack.er;\r\n file.lastSuccessfulChunkNumber = fileTrack.ok;\r\n\r\n if (this.#shouldRetryFailedFile(fileTrack)) {\r\n fileTrack.er = false;\r\n fileTrack.ec = null;\r\n file.isFailed = false;\r\n fileWasReset = true;\r\n }\r\n\r\n if (file.isCompleted || file.isFailed)\r\n // let's save some cpu time on restoring chunk collection for file which will never be picked up\r\n file.downloadedBytes_bank = file.sizeInBytes;\r\n else {\r\n const shouldFileBeReset = await this.#shouldPendingFileBeRestarted(file);\r\n\r\n if (shouldFileBeReset) {\r\n // it maye happen that disk state is de-synced from the progress tracking file (the file.temporaryDownloadPath is gone)\r\n // in this case we want to simply re-start the file\r\n fileTrack.wr = false;\r\n fileTrack.ok = null;\r\n fileWasReset = true;\r\n\r\n file.wasEverWritten = false;\r\n file.lastSuccessfulChunkNumber = null;\r\n }\r\n\r\n for (let chunkIndex = 0; chunkIndex < file.chunkCount; chunkIndex++) {\r\n const chunk = this.#restoreSingleChunkInfo(file, chunkIndex, fileTrack);\r\n file.chunks.push(chunk);\r\n if (chunk.isCompleted)\r\n file.downloadedBytes_bank += chunk.chunkSize;\r\n }\r\n }\r\n\r\n // this method will update file.downloadedBytes properly based on file.downloadedBytes_bank\r\n // (and theoretically also based on file.#pendingChunks - but when restoring state #pendingChunks is always empty)\r\n file.updateProgress();\r\n\r\n return { file, fileWasReset };\r\n }\r\n\r\n #restoreSingleChunkInfo(file: DownloadFileInfo, chunkIndex: number, fileTrack: DownloadTrackerFileProgressInfo) {\r\n const chunk = new DownloadFileChunkInfo(file, chunkIndex, this.#options.maxChunkSize ?? null);\r\n chunk.isCompleted = fileTrack.ok !== null && chunkIndex <= fileTrack.ok;\r\n if (chunk.isCompleted)\r\n chunk.setProgress(chunk.chunkSize);\r\n return chunk;\r\n }\r\n\r\n #shouldRetryFailedFile(fileTrack: DownloadTrackerFileProgressInfo): boolean {\r\n return fileTrack.er === true && fileTrack.c === false;\r\n }\r\n\r\n async start(allFiles: Array<DownloadFileInfo>) {\r\n this.#throwIfRunning();\r\n\r\n this.#running = true;\r\n\r\n if (this.#restored === false) {\r\n for (const file of allFiles) {\r\n this.#progress.trackedFiles[file.externalId] = {\r\n c: file.isCompleted,\r\n er: file.isFailed,\r\n ok: file.lastSuccessfulChunkNumber,\r\n wr: file.wasEverWritten,\r\n ec: null,\r\n };\r\n this.#allFiles[file.externalId] = {\r\n u: file.url,\r\n s: file.sizeInBytes,\r\n n: file.name,\r\n dp: file.downloadPath,\r\n tdp: file.temporaryDownloadPath,\r\n cc: file.chunkCount,\r\n };\r\n }\r\n await this.#filesMutex.runExclusive(async () => {\r\n try {\r\n await this.#fileSystem.createFolder(this.#trackingPath);\r\n await this.#dumpOptions();\r\n await this.#dumpMetadata();\r\n await this.#dumpDownloaderFiles();\r\n await this.#dumpDownloaderProgress();\r\n this.#canTrack = true;\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not create tracking folder - recovering this transfer will not be possible ${this.#downloadId} @ ${this.#trackingPath}`, { cause: err as Error }, DownloadErrorCode.TrackingNotAvailable);\r\n }\r\n });\r\n }\r\n else\r\n this.#canTrack = true;\r\n\r\n if (this.#canTrack) {\r\n this.#addEventListeners();\r\n this.#setupProgressTimer();\r\n }\r\n }\r\n\r\n async restoreDownloadOptions() {\r\n await DownloadTracker.throwIfPathDoesntExist(this.#optionsFilePath, `Options file \"${this.#optionsFilePath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\r\n try {\r\n const optionsFile = await this.#fileSystem.readFileAsString(this.#optionsFilePath);\r\n const options: DownloadOptions = JSON.parse(optionsFile);\r\n return options;\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not read download options information ${this.#downloadId} @ ${this.#optionsFilePath}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\r\n }\r\n }\r\n\r\n static async restoreDownloadMetadata(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService): Promise<DownloadTrackingMetadata> {\r\n const metadataFilePath = this.getMetadataFilePath(downloadId, downloadTrackingBaseFolder, fileSystem);\r\n\r\n await this.throwIfPathDoesntExist(metadataFilePath, `Metadata file \"${metadataFilePath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, fileSystem);\r\n\r\n try {\r\n const metadataFile = await fileSystem.readFileAsString(metadataFilePath);\r\n return JSON.parse(metadataFile);\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not read download metadata information ${downloadId} @ ${metadataFilePath}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\r\n }\r\n }\r\n\r\n async restoreDownloaderState(): Promise<{ state: DownloaderRestoredState, files: Array<DownloadFileInfo> }> {\r\n await DownloadTracker.throwIfPathDoesntExist(this.#filesPath, `Filesinfo file \"${this.#filesPath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\r\n await DownloadTracker.throwIfPathDoesntExist(this.#progressPath, `Tracking file \"${this.#progressPath}\" does not exist`, DownloadErrorCode.TrackingDataParsingError, this.#fileSystem);\r\n\r\n try {\r\n this.#allFiles = JSON.parse(await this.#fileSystem.readFileAsString(this.#filesPath));\r\n this.#progress = JSON.parse(await this.#fileSystem.readFileAsString(this.#progressPath));\r\n this.#restored = true;\r\n\r\n let totalSize = 0;\r\n let downloadedBytes = 0;\r\n let downloadedBytesBank = 0;\r\n let repeatProgressDump = false;\r\n const files: Array<DownloadFileInfo> = [];\r\n\r\n for (const [restoredFileId, restoredFile] of Object.entries(this.#allFiles)) {\r\n const { file, fileWasReset } = await this.#restoreSingleFile(restoredFileId, restoredFile);\r\n\r\n if (fileWasReset)\r\n repeatProgressDump = true;\r\n\r\n downloadedBytes += file.downloadedBytes;\r\n\r\n if (file.isCompleted)\r\n downloadedBytesBank += file.sizeInBytes;\r\n\r\n files.push(file);\r\n totalSize += file.sizeInBytes;\r\n }\r\n\r\n if (repeatProgressDump) {\r\n // some tracking info might have been updated (corrected) in above loop\r\n // persisting this makes sure we have most correct state in the progress tracking file\r\n // (e.g. some unconfirmed pending files might be deleted by end users etc.)\r\n await this.#dumpDownloaderProgress();\r\n }\r\n\r\n return {\r\n files,\r\n state: {\r\n activeTime: this.#progress.activeTime,\r\n downloadedBytes,\r\n downloadedBytesBank,\r\n totalSize,\r\n percent: totalSize === 0 ? 100 : ((100 * downloadedBytes) / totalSize),\r\n },\r\n };\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not read download tracking information ${this.#downloadId}`, { cause: err as Error }, DownloadErrorCode.TrackingDataParsingError);\r\n }\r\n }\r\n\r\n static async removeDownloadTrackingFolder(downloadId: string, downloadTrackingBaseFolder: string, fileSystem: FileSystemService) {\r\n const filesMutex = new Mutex();\r\n const trackingPath = DownloadTracker.getTrackingPath(downloadId, downloadTrackingBaseFolder, fileSystem);\r\n\r\n await filesMutex.runExclusive(async () => {\r\n try {\r\n await fileSystem.deleteFolder(trackingPath);\r\n }\r\n catch (err) {\r\n throw new DownloadError(`Could not remove tracking folder - ${downloadId} @ ${trackingPath}`, { cause: err as Error }, DownloadErrorCode.TrackingCleanupFailed);\r\n }\r\n });\r\n }\r\n\r\n async saveState(): Promise<void> {\r\n await this.#dumpAllProgress();\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadCommand.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadCommand.ts"],"names":[],"mappings":"","sourcesContent":["import type GetCompanyResponse from \"../../utils/api/dtos/getCompanyResponse.js\";\n\ninterface DownloadCommand {\n transfer?: string | undefined,\n trackId?: string | undefined,\n password?: string | undefined,\n e2eeDataOrTextKey?: DownloadCommandE2eeData | string,\n company?: GetCompanyResponse | undefined,\n checkLogintoken?: boolean | undefined,\n}\n\nexport default DownloadCommand;\n\nexport type DownloadCommandE2eeData = {\n iv: Buffer,\n key: Buffer,\n}"]}
1
+ {"version":3,"file":"downloadCommand.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadCommand.ts"],"names":[],"mappings":"","sourcesContent":["import type GetCompanyResponse from \"../../utils/api/dtos/getCompanyResponse.js\";\r\n\r\ninterface DownloadCommand {\r\n transfer?: string | undefined,\r\n trackId?: string | undefined,\r\n password?: string | undefined,\r\n e2eeDataOrTextKey?: DownloadCommandE2eeData | string,\r\n company?: GetCompanyResponse | undefined,\r\n checkLogintoken?: boolean | undefined,\r\n}\r\n\r\nexport default DownloadCommand;\r\n\r\nexport type DownloadCommandE2eeData = {\r\n iv: Buffer,\r\n key: Buffer,\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadError.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadError.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,KAAK;IACnC,SAAS,CAA2B;IAE7C,YAAY,OAAgB,EAAE,OAAsB,EAAE,IAAwB;QAC1E,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC;IAClC,CAAC;IAED,MAAM;QACF,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;SACtC,CAAC;IACN,CAAC;IAEO,WAAW,CAAC,UAAmB;QACnC,IAAI,CAAC,UAAU;YACX,OAAO,SAAS,CAAC;QAErB,IAAI,OAAQ,UAAkB,CAAC,MAAM,KAAK,UAAU;YAChD,OAAQ,UAAkB,CAAC,MAAM,EAAE,CAAC;QAExC,IAAI,UAAU,YAAY,KAAK,EAAE,CAAC;YAC9B,OAAO;gBACH,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;aAC5C,CAAC;QACN,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ","sourcesContent":["import type DownloadErrorCode from \"./downloadErrorCode.js\";\n\nexport default class DownloadError extends Error {\n readonly errorCode: DownloadErrorCode | null;\n\n constructor(message?: string, options?: ErrorOptions, code?: DownloadErrorCode) {\n super(message, options);\n this.name = `DownloadError`;\n this.errorCode = code || null;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n errorCode: this.errorCode,\n cause: this.causeToJSON(this.cause),\n };\n }\n\n private causeToJSON(innerError: unknown): unknown {\n if (!innerError)\n return undefined;\n\n if (typeof (innerError as any).toJSON === `function`)\n return (innerError as any).toJSON();\n\n if (innerError instanceof Error) {\n return {\n name: innerError.name,\n message: innerError.message,\n stack: innerError.stack,\n cause: this.causeToJSON(innerError.cause),\n };\n }\n\n return innerError;\n }\n}"]}
1
+ {"version":3,"file":"downloadError.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadError.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,KAAK;IACnC,SAAS,CAA2B;IAE7C,YAAY,OAAgB,EAAE,OAAsB,EAAE,IAAwB;QAC1E,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC;IAClC,CAAC;IAED,MAAM;QACF,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;SACtC,CAAC;IACN,CAAC;IAEO,WAAW,CAAC,UAAmB;QACnC,IAAI,CAAC,UAAU;YACX,OAAO,SAAS,CAAC;QAErB,IAAI,OAAQ,UAAkB,CAAC,MAAM,KAAK,UAAU;YAChD,OAAQ,UAAkB,CAAC,MAAM,EAAE,CAAC;QAExC,IAAI,UAAU,YAAY,KAAK,EAAE,CAAC;YAC9B,OAAO;gBACH,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;aAC5C,CAAC;QACN,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ","sourcesContent":["import type DownloadErrorCode from \"./downloadErrorCode.js\";\r\n\r\nexport default class DownloadError extends Error {\r\n readonly errorCode: DownloadErrorCode | null;\r\n\r\n constructor(message?: string, options?: ErrorOptions, code?: DownloadErrorCode) {\r\n super(message, options);\r\n this.name = `DownloadError`;\r\n this.errorCode = code || null;\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n stack: this.stack,\r\n errorCode: this.errorCode,\r\n cause: this.causeToJSON(this.cause),\r\n };\r\n }\r\n\r\n private causeToJSON(innerError: unknown): unknown {\r\n if (!innerError)\r\n return undefined;\r\n\r\n if (typeof (innerError as any).toJSON === `function`)\r\n return (innerError as any).toJSON();\r\n\r\n if (innerError instanceof Error) {\r\n return {\r\n name: innerError.name,\r\n message: innerError.message,\r\n stack: innerError.stack,\r\n cause: this.causeToJSON(innerError.cause),\r\n };\r\n }\r\n\r\n return innerError;\r\n }\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadErrorCode.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadErrorCode.ts"],"names":[],"mappings":"AAAA,IAAK,iBAiBJ;AAjBD,WAAK,iBAAiB;IAClB,iGAAwB,CAAA;IACxB,iEAAQ,CAAA;IACR,+FAAuB,CAAA;IACvB,iFAAgB,CAAA;IAChB,mFAAiB,CAAA;IACjB,+EAAe,CAAA;IACf,mFAAiB,CAAA;IACjB,yFAAoB,CAAA;IACpB,uFAAmB,CAAA;IACnB,uGAA2B,CAAA;IAC3B,0FAAoB,CAAA;IACpB,4FAAqB,CAAA;IACrB,0FAAoB,CAAA;IACpB,oGAAyB,CAAA;IACzB,wGAA2B,CAAA;IAC3B,oIAAyC,CAAA;AAC7C,CAAC,EAjBI,iBAAiB,KAAjB,iBAAiB,QAiBrB;AAED,eAAe,iBAAiB,CAAC","sourcesContent":["enum DownloadErrorCode {\n TrackingDataParsingError,\n DiskFull,\n InvalidTransferPassword,\n TransferNotFound,\n DownloadsDisabled,\n TransferExpired,\n NoFilesToDownload,\n TransferInvalidState,\n ResumedFileNotFound,\n ResumedFilePathNotSpecified,\n TrackingNotAvailable,\n TrackingCleanupFailed,\n TrackingDataOutdated,\n TooManyFileRenameAttempts,\n FileserverResponseWrongSize,\n RenameFromTemporaryFilenameToFinalFailure\n}\n\nexport default DownloadErrorCode;"]}
1
+ {"version":3,"file":"downloadErrorCode.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadErrorCode.ts"],"names":[],"mappings":"AAAA,IAAK,iBAiBJ;AAjBD,WAAK,iBAAiB;IAClB,iGAAwB,CAAA;IACxB,iEAAQ,CAAA;IACR,+FAAuB,CAAA;IACvB,iFAAgB,CAAA;IAChB,mFAAiB,CAAA;IACjB,+EAAe,CAAA;IACf,mFAAiB,CAAA;IACjB,yFAAoB,CAAA;IACpB,uFAAmB,CAAA;IACnB,uGAA2B,CAAA;IAC3B,0FAAoB,CAAA;IACpB,4FAAqB,CAAA;IACrB,0FAAoB,CAAA;IACpB,oGAAyB,CAAA;IACzB,wGAA2B,CAAA;IAC3B,oIAAyC,CAAA;AAC7C,CAAC,EAjBI,iBAAiB,KAAjB,iBAAiB,QAiBrB;AAED,eAAe,iBAAiB,CAAC","sourcesContent":["enum DownloadErrorCode {\r\n TrackingDataParsingError,\r\n DiskFull,\r\n InvalidTransferPassword,\r\n TransferNotFound,\r\n DownloadsDisabled,\r\n TransferExpired,\r\n NoFilesToDownload,\r\n TransferInvalidState,\r\n ResumedFileNotFound,\r\n ResumedFilePathNotSpecified,\r\n TrackingNotAvailable,\r\n TrackingCleanupFailed,\r\n TrackingDataOutdated,\r\n TooManyFileRenameAttempts,\r\n FileserverResponseWrongSize,\r\n RenameFromTemporaryFilenameToFinalFailure\r\n}\r\n\r\nexport default DownloadErrorCode;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadEvent.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadEvent.ts"],"names":[],"mappings":"AAAA,IAAK,qBA8BJ;AA9BD,WAAK,qBAAqB;IACtB,4DAAmC,CAAA;IACnC,kEAAyC,CAAA;IACzC,gEAAuC,CAAA;IACvC,wFAA+D,CAAA;IAC/D,sDAA6B,CAAA;IAC7B,oDAA2B,CAAA;IAC3B,sEAA6C,CAAA;IAC7C,oEAA2C,CAAA;IAC3C,0EAAiD,CAAA;IACjD,wEAA+C,CAAA;IAC/C,0EAAiD,CAAA;IACjD,kEAAyC,CAAA;IACzC,gGAAuE,CAAA;IACvE,sEAA6C,CAAA;IAC7C,4EAAmD,CAAA;IACnD,0EAAiD,CAAA;IACjD,oEAA2C,CAAA;IAC3C,oEAA2C,CAAA;IAC3C,8CAAqB,CAAA;IACrB,4CAAmB,CAAA;IACnB,4CAAmB,CAAA;IACnB,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;IACjB,0DAAiC,CAAA;IACjC,gDAAuB,CAAA;IACvB,0EAAiD,CAAA;IACjD,sFAA6D,CAAA;IAC7D,0EAAiD,CAAA;IACjD,kFAAyD,CAAA;AAC7D,CAAC,EA9BI,qBAAqB,KAArB,qBAAqB,QA8BzB;AAED,eAAe,qBAAqB,CAAC","sourcesContent":["enum TransferDownloadEvent {\n DownloadStarted = `DownloadStarted`,\n DownloadProgressed = `DownloadProgressed`,\n DownloadCompleted = `DownloadCompleted`,\n DownloadRegistrationTriggered = `DownloadRegistrationTriggered`,\n FileCreating = `FileCreating`,\n FileCreated = `FileCreated`,\n FileDownloadStarting = `FileDownloadStarting`,\n FileDownloadStarted = `FileDownloadStarted`,\n FileDownloadCompleting = `FileDownloadCompleting`,\n FileDownloadCompleted = `FileDownloadCompleted`,\n FileDownloadProgressed = `FileDownloadProgressed`,\n FileDownloadFailed = `FileDownloadFailed`,\n FileDownloadRegistrationTriggered = `FileDownloadRegistrationTriggered`,\n ChunkDownloadStarted = `ChunkDownloadStarted`,\n ChunkDownloadProgressed = `ChunkDownloadProgressed`,\n ChunkDownloadCompleted = `ChunkDownloadCompleted`,\n ChunkDownloadFailed = `ChunkDownloadFailed`,\n ConfigureThrottling = `ConfigureThrottling`,\n Aborting = `Aborting`,\n Aborted = `Aborted`,\n Resumed = `Resumed`,\n Pausing = `Pausing`,\n Paused = `Paused`,\n NetworkFailure = `NetworkFailure`,\n NetworkOk = `NetworkOk`,\n PossibleSupersizedFile = `PossibleSupersizedFile`,\n RecoveredInterruptedDownload = `RecoveredInterruptedDownload`,\n DownloadTrackingFailed = `DownloadTrackingFailed`,\n TransferMetadataDetermined = `TransferMetadataDetermined`,\n}\n\nexport default TransferDownloadEvent;"]}
1
+ {"version":3,"file":"downloadEvent.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadEvent.ts"],"names":[],"mappings":"AAAA,IAAK,qBA8BJ;AA9BD,WAAK,qBAAqB;IACtB,4DAAmC,CAAA;IACnC,kEAAyC,CAAA;IACzC,gEAAuC,CAAA;IACvC,wFAA+D,CAAA;IAC/D,sDAA6B,CAAA;IAC7B,oDAA2B,CAAA;IAC3B,sEAA6C,CAAA;IAC7C,oEAA2C,CAAA;IAC3C,0EAAiD,CAAA;IACjD,wEAA+C,CAAA;IAC/C,0EAAiD,CAAA;IACjD,kEAAyC,CAAA;IACzC,gGAAuE,CAAA;IACvE,sEAA6C,CAAA;IAC7C,4EAAmD,CAAA;IACnD,0EAAiD,CAAA;IACjD,oEAA2C,CAAA;IAC3C,oEAA2C,CAAA;IAC3C,8CAAqB,CAAA;IACrB,4CAAmB,CAAA;IACnB,4CAAmB,CAAA;IACnB,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;IACjB,0DAAiC,CAAA;IACjC,gDAAuB,CAAA;IACvB,0EAAiD,CAAA;IACjD,sFAA6D,CAAA;IAC7D,0EAAiD,CAAA;IACjD,kFAAyD,CAAA;AAC7D,CAAC,EA9BI,qBAAqB,KAArB,qBAAqB,QA8BzB;AAED,eAAe,qBAAqB,CAAC","sourcesContent":["enum TransferDownloadEvent {\r\n DownloadStarted = `DownloadStarted`,\r\n DownloadProgressed = `DownloadProgressed`,\r\n DownloadCompleted = `DownloadCompleted`,\r\n DownloadRegistrationTriggered = `DownloadRegistrationTriggered`,\r\n FileCreating = `FileCreating`,\r\n FileCreated = `FileCreated`,\r\n FileDownloadStarting = `FileDownloadStarting`,\r\n FileDownloadStarted = `FileDownloadStarted`,\r\n FileDownloadCompleting = `FileDownloadCompleting`,\r\n FileDownloadCompleted = `FileDownloadCompleted`,\r\n FileDownloadProgressed = `FileDownloadProgressed`,\r\n FileDownloadFailed = `FileDownloadFailed`,\r\n FileDownloadRegistrationTriggered = `FileDownloadRegistrationTriggered`,\r\n ChunkDownloadStarted = `ChunkDownloadStarted`,\r\n ChunkDownloadProgressed = `ChunkDownloadProgressed`,\r\n ChunkDownloadCompleted = `ChunkDownloadCompleted`,\r\n ChunkDownloadFailed = `ChunkDownloadFailed`,\r\n ConfigureThrottling = `ConfigureThrottling`,\r\n Aborting = `Aborting`,\r\n Aborted = `Aborted`,\r\n Resumed = `Resumed`,\r\n Pausing = `Pausing`,\r\n Paused = `Paused`,\r\n NetworkFailure = `NetworkFailure`,\r\n NetworkOk = `NetworkOk`,\r\n PossibleSupersizedFile = `PossibleSupersizedFile`,\r\n RecoveredInterruptedDownload = `RecoveredInterruptedDownload`,\r\n DownloadTrackingFailed = `DownloadTrackingFailed`,\r\n TransferMetadataDetermined = `TransferMetadataDetermined`,\r\n}\r\n\r\nexport default TransferDownloadEvent;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadFileChunkInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFileChunkInfo.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAC7B,EAAE,CAAS;IACX,IAAI,CAAmB;IAEhC;;OAEG;IACM,KAAK,CAAgB;IAC9B;;OAEG;IACM,GAAG,CAAgB;IAC5B;;OAEG;IACM,WAAW,CAAS;IAC7B;;;OAGG;IACM,SAAS,CAAS;IAE3B,WAAW,GAAG,KAAK,CAAC;IACpB,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,GAAyB,IAAI,CAAC;IACrC,eAAe,GAAG,CAAC,CAAC;IACpB,OAAO,GAAG,CAAC,CAAC;IAEZ,YAAY,IAAsB,EAAE,WAAmB,EAAE,YAA2B;QAChF,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QACtC,CAAC;aACI,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,YAAa,CAAC;YACzC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,YAAa,GAAG,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAqB;QACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,eAAuB;QAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;;YAEnB,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IAChE,CAAC;CACJ","sourcesContent":["import type DownloadError from \"./downloadError.js\";\nimport type DownloadFileInfo from \"./downloadFileInfo.js\";\n\nexport default class DownloadFileChunkInfo {\n readonly id: string;\n readonly file: DownloadFileInfo;\n\n /**\n * Zero-based index of first byte of this chunk within a file.\n */\n readonly start: number | null;\n /**\n * Zero-based index of last byte of this chunk within a file.\n */\n readonly end: number | null;\n /**\n * Zero-based index of the chunk within a file.\n */\n readonly chunkNumber: number;\n /**\n * The real chunk size in bytes (no matter of downloader chunkSize setting). For unspecified downloader chunkSize\n * this will equal to file size. Otherwise it is calculated as end-start+1\n */\n readonly chunkSize: number;\n\n isCompleted = false;\n isFailed = false;\n failure: DownloadError | null = null;\n downloadedBytes = 0;\n percent = 0;\n\n constructor(file: DownloadFileInfo, chunkNumber: number, maxChunkSize: number | null) {\n this.id = `${file.externalId}_${chunkNumber}`;\n this.file = file;\n this.chunkNumber = chunkNumber;\n if (maxChunkSize === null) {\n this.start = null;\n this.end = null;\n this.chunkSize = file.sizeInBytes;\n }\n else {\n this.start = chunkNumber * maxChunkSize!;\n this.end = Math.min(file.sizeInBytes - 1, this.start + maxChunkSize! - 1);\n this.chunkSize = this.end - this.start + 1;\n }\n }\n\n fail(reason: DownloadError): void {\n this.isCompleted = false;\n this.isFailed = true;\n this.failure = reason;\n }\n\n complete(): void {\n this.isCompleted = true;\n this.isFailed = false;\n }\n\n setProgress(downloadedBytes: number): void {\n this.downloadedBytes = downloadedBytes;\n if (this.chunkSize === 0)\n this.percent = 100;\n else\n this.percent = (100 * downloadedBytes) / this.chunkSize;\n }\n}\n"]}
1
+ {"version":3,"file":"downloadFileChunkInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFileChunkInfo.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAC7B,EAAE,CAAS;IACX,IAAI,CAAmB;IAEhC;;OAEG;IACM,KAAK,CAAgB;IAC9B;;OAEG;IACM,GAAG,CAAgB;IAC5B;;OAEG;IACM,WAAW,CAAS;IAC7B;;;OAGG;IACM,SAAS,CAAS;IAE3B,WAAW,GAAG,KAAK,CAAC;IACpB,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,GAAyB,IAAI,CAAC;IACrC,eAAe,GAAG,CAAC,CAAC;IACpB,OAAO,GAAG,CAAC,CAAC;IAEZ,YAAY,IAAsB,EAAE,WAAmB,EAAE,YAA2B;QAChF,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QACtC,CAAC;aACI,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,YAAa,CAAC;YACzC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,YAAa,GAAG,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAqB;QACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,eAAuB;QAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;;YAEnB,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IAChE,CAAC;CACJ","sourcesContent":["import type DownloadError from \"./downloadError.js\";\r\nimport type DownloadFileInfo from \"./downloadFileInfo.js\";\r\n\r\nexport default class DownloadFileChunkInfo {\r\n readonly id: string;\r\n readonly file: DownloadFileInfo;\r\n\r\n /**\r\n * Zero-based index of first byte of this chunk within a file.\r\n */\r\n readonly start: number | null;\r\n /**\r\n * Zero-based index of last byte of this chunk within a file.\r\n */\r\n readonly end: number | null;\r\n /**\r\n * Zero-based index of the chunk within a file.\r\n */\r\n readonly chunkNumber: number;\r\n /**\r\n * The real chunk size in bytes (no matter of downloader chunkSize setting). For unspecified downloader chunkSize\r\n * this will equal to file size. Otherwise it is calculated as end-start+1\r\n */\r\n readonly chunkSize: number;\r\n\r\n isCompleted = false;\r\n isFailed = false;\r\n failure: DownloadError | null = null;\r\n downloadedBytes = 0;\r\n percent = 0;\r\n\r\n constructor(file: DownloadFileInfo, chunkNumber: number, maxChunkSize: number | null) {\r\n this.id = `${file.externalId}_${chunkNumber}`;\r\n this.file = file;\r\n this.chunkNumber = chunkNumber;\r\n if (maxChunkSize === null) {\r\n this.start = null;\r\n this.end = null;\r\n this.chunkSize = file.sizeInBytes;\r\n }\r\n else {\r\n this.start = chunkNumber * maxChunkSize!;\r\n this.end = Math.min(file.sizeInBytes - 1, this.start + maxChunkSize! - 1);\r\n this.chunkSize = this.end - this.start + 1;\r\n }\r\n }\r\n\r\n fail(reason: DownloadError): void {\r\n this.isCompleted = false;\r\n this.isFailed = true;\r\n this.failure = reason;\r\n }\r\n\r\n complete(): void {\r\n this.isCompleted = true;\r\n this.isFailed = false;\r\n }\r\n\r\n setProgress(downloadedBytes: number): void {\r\n this.downloadedBytes = downloadedBytes;\r\n if (this.chunkSize === 0)\r\n this.percent = 100;\r\n else\r\n this.percent = (100 * downloadedBytes) / this.chunkSize;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadFileInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFileInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import type DownloadError from \"./downloadError.js\";\nimport type DownloadFileChunkInfo from \"./downloadFileChunkInfo.js\";\n\nexport default class DownloadFileInfo {\n #lastProgressTick: number | null = null;\n #downloadPath: string | null = null;\n #pendingChunks: Set<DownloadFileChunkInfo> = new Set<DownloadFileChunkInfo>();\n #completedChunkNumbers: Array<number> = [];\n\n readonly externalId: string;\n readonly url: string;\n readonly name: string;\n readonly sizeInBytes: number;\n\n wasEverWritten = false;\n isStarted = false;\n isCompleted = false;\n isFailed = false;\n lastSuccessfulChunkNumber: number | null = null;\n temporaryDownloadPath: string | null = null;\n\n /**\n * How many bytes have been downloaded counting only completed chunks.\n */\n downloadedBytes_bank = 0;\n /**\n * How many bytes have been downloaded: including completed chunks and pending chunks.\n * This value may go back and forward in case of a stop/resume flow or when there are retries of failed chunks.\n */\n downloadedBytes = 0;\n\n percent = 0;\n chunkCount = 0;\n chunks = new Array<DownloadFileChunkInfo>();\n failures = new Array<DownloadError>();\n\n /**\n * @param externalId ID of the file - returned in Filemail web API transfer response.\n * @param url Absolute url to the file on Fileserver.\n * @param name File name as it is returned from Filemail web API (relative to transfer folder, / is the path separator - api convention).\n * @param sizeInBytes Size of the file - obtained from Filemail web API transfer response.\n * @param downloadPath Optional: absolute download path where the file should be saved. This param is also used when restoring interrupted download.\n * When this parameter is null it will be set automatically by the downloader based on download folder (configured in the downloader) + {@link name}.\n * @param chunkCount How many chunks this file contains. Note: zero-byte (empty) files have 1 chunk.\n * @param temporaryDownloadPath Temporary download path - where the file is physically download until it is complete (and then renamed to {@link downloadPath}).\n */\n constructor(\n externalId: string,\n url: string,\n name: string,\n sizeInBytes: number,\n downloadPath: string | null = null,\n chunkCount: number | null = null,\n temporaryDownloadPath: string | null = null,\n ) {\n this.externalId = externalId;\n this.url = url;\n this.name = name;\n this.sizeInBytes = sizeInBytes;\n this.#downloadPath = downloadPath;\n this.temporaryDownloadPath = temporaryDownloadPath;\n if (chunkCount !== null)\n this.chunkCount = chunkCount;\n }\n\n start() {\n this.isStarted = true;\n }\n\n starting() {\n this.wasEverWritten = true;\n }\n\n fail(reason: DownloadError) {\n this.isFailed = true;\n this.failures.push(reason);\n }\n\n complete(finalDownloadPath: string) {\n this.downloadPath = finalDownloadPath;\n this.isFailed = false;\n this.isCompleted = true;\n }\n\n chunkStarted(chunk: DownloadFileChunkInfo) {\n this.#pendingChunks.add(chunk);\n }\n\n chunkCompleted(chunk: DownloadFileChunkInfo) {\n const removed = this.#pendingChunks.delete(chunk);\n if (removed) {\n this.downloadedBytes_bank += chunk.chunkSize;\n\n if (this.#completedChunkNumbers.indexOf(chunk.chunkNumber) === -1) {\n this.#completedChunkNumbers.push(chunk.chunkNumber);\n this.#completedChunkNumbers.sort((a, b) => a - b);\n }\n\n let minSuccessfulChunkNumber = this.lastSuccessfulChunkNumber ?? -1;\n while (this.#completedChunkNumbers.length > 0 && this.#completedChunkNumbers[0] === minSuccessfulChunkNumber + 1)\n minSuccessfulChunkNumber = this.#completedChunkNumbers.shift()!;\n\n if (minSuccessfulChunkNumber > -1)\n this.lastSuccessfulChunkNumber = minSuccessfulChunkNumber;\n }\n }\n\n chunkFailed(chunk: DownloadFileChunkInfo) {\n this.#pendingChunks.delete(chunk);\n }\n\n /**\n * Updates file's {@link downloadedBytes} by adding number of downloaded bytes of every pending chunk to {@link downloadedBytes_bank}.\n * Once {@link downloadedBytes} is updated - progress in percent is updated too ({@link percent}).\n */\n updateProgress() {\n this.#lastProgressTick = new Date().getTime();\n\n let downloaded = this.downloadedBytes_bank;\n\n for (const chunk of this.#pendingChunks)\n downloaded += chunk.downloadedBytes;\n\n this.downloadedBytes = downloaded;\n\n if (this.sizeInBytes > 0)\n this.percent = Math.min(100, (100 * this.downloadedBytes) / this.sizeInBytes);\n else\n this.percent = 100;\n }\n\n get lastProgressTick() {\n return this.#lastProgressTick;\n }\n\n get hasDownloadPath(): boolean {\n return !!this.#downloadPath;\n }\n\n get downloadPath(): string {\n if (!this.#downloadPath)\n throw new Error(`Download path not initialized!`);\n\n return this.#downloadPath;\n }\n\n set downloadPath(value: string) {\n this.#downloadPath = value;\n }\n}"]}
1
+ {"version":3,"file":"downloadFileInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFileInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import type DownloadError from \"./downloadError.js\";\r\nimport type DownloadFileChunkInfo from \"./downloadFileChunkInfo.js\";\r\n\r\nexport default class DownloadFileInfo {\r\n #lastProgressTick: number | null = null;\r\n #downloadPath: string | null = null;\r\n #pendingChunks: Set<DownloadFileChunkInfo> = new Set<DownloadFileChunkInfo>();\r\n #completedChunkNumbers: Array<number> = [];\r\n\r\n readonly externalId: string;\r\n readonly url: string;\r\n readonly name: string;\r\n readonly sizeInBytes: number;\r\n\r\n wasEverWritten = false;\r\n isStarted = false;\r\n isCompleted = false;\r\n isFailed = false;\r\n lastSuccessfulChunkNumber: number | null = null;\r\n temporaryDownloadPath: string | null = null;\r\n\r\n /**\r\n * How many bytes have been downloaded counting only completed chunks.\r\n */\r\n downloadedBytes_bank = 0;\r\n /**\r\n * How many bytes have been downloaded: including completed chunks and pending chunks.\r\n * This value may go back and forward in case of a stop/resume flow or when there are retries of failed chunks.\r\n */\r\n downloadedBytes = 0;\r\n\r\n percent = 0;\r\n chunkCount = 0;\r\n chunks = new Array<DownloadFileChunkInfo>();\r\n failures = new Array<DownloadError>();\r\n\r\n /**\r\n * @param externalId ID of the file - returned in Filemail web API transfer response.\r\n * @param url Absolute url to the file on Fileserver.\r\n * @param name File name as it is returned from Filemail web API (relative to transfer folder, / is the path separator - api convention).\r\n * @param sizeInBytes Size of the file - obtained from Filemail web API transfer response.\r\n * @param downloadPath Optional: absolute download path where the file should be saved. This param is also used when restoring interrupted download.\r\n * When this parameter is null it will be set automatically by the downloader based on download folder (configured in the downloader) + {@link name}.\r\n * @param chunkCount How many chunks this file contains. Note: zero-byte (empty) files have 1 chunk.\r\n * @param temporaryDownloadPath Temporary download path - where the file is physically download until it is complete (and then renamed to {@link downloadPath}).\r\n */\r\n constructor(\r\n externalId: string,\r\n url: string,\r\n name: string,\r\n sizeInBytes: number,\r\n downloadPath: string | null = null,\r\n chunkCount: number | null = null,\r\n temporaryDownloadPath: string | null = null,\r\n ) {\r\n this.externalId = externalId;\r\n this.url = url;\r\n this.name = name;\r\n this.sizeInBytes = sizeInBytes;\r\n this.#downloadPath = downloadPath;\r\n this.temporaryDownloadPath = temporaryDownloadPath;\r\n if (chunkCount !== null)\r\n this.chunkCount = chunkCount;\r\n }\r\n\r\n start() {\r\n this.isStarted = true;\r\n }\r\n\r\n starting() {\r\n this.wasEverWritten = true;\r\n }\r\n\r\n fail(reason: DownloadError) {\r\n this.isFailed = true;\r\n this.failures.push(reason);\r\n }\r\n\r\n complete(finalDownloadPath: string) {\r\n this.downloadPath = finalDownloadPath;\r\n this.isFailed = false;\r\n this.isCompleted = true;\r\n }\r\n\r\n chunkStarted(chunk: DownloadFileChunkInfo) {\r\n this.#pendingChunks.add(chunk);\r\n }\r\n\r\n chunkCompleted(chunk: DownloadFileChunkInfo) {\r\n const removed = this.#pendingChunks.delete(chunk);\r\n if (removed) {\r\n this.downloadedBytes_bank += chunk.chunkSize;\r\n\r\n if (this.#completedChunkNumbers.indexOf(chunk.chunkNumber) === -1) {\r\n this.#completedChunkNumbers.push(chunk.chunkNumber);\r\n this.#completedChunkNumbers.sort((a, b) => a - b);\r\n }\r\n\r\n let minSuccessfulChunkNumber = this.lastSuccessfulChunkNumber ?? -1;\r\n while (this.#completedChunkNumbers.length > 0 && this.#completedChunkNumbers[0] === minSuccessfulChunkNumber + 1)\r\n minSuccessfulChunkNumber = this.#completedChunkNumbers.shift()!;\r\n\r\n if (minSuccessfulChunkNumber > -1)\r\n this.lastSuccessfulChunkNumber = minSuccessfulChunkNumber;\r\n }\r\n }\r\n\r\n chunkFailed(chunk: DownloadFileChunkInfo) {\r\n this.#pendingChunks.delete(chunk);\r\n }\r\n\r\n /**\r\n * Updates file's {@link downloadedBytes} by adding number of downloaded bytes of every pending chunk to {@link downloadedBytes_bank}.\r\n * Once {@link downloadedBytes} is updated - progress in percent is updated too ({@link percent}).\r\n */\r\n updateProgress() {\r\n this.#lastProgressTick = new Date().getTime();\r\n\r\n let downloaded = this.downloadedBytes_bank;\r\n\r\n for (const chunk of this.#pendingChunks)\r\n downloaded += chunk.downloadedBytes;\r\n\r\n this.downloadedBytes = downloaded;\r\n\r\n if (this.sizeInBytes > 0)\r\n this.percent = Math.min(100, (100 * this.downloadedBytes) / this.sizeInBytes);\r\n else\r\n this.percent = 100;\r\n }\r\n\r\n get lastProgressTick() {\r\n return this.#lastProgressTick;\r\n }\r\n\r\n get hasDownloadPath(): boolean {\r\n return !!this.#downloadPath;\r\n }\r\n\r\n get downloadPath(): string {\r\n if (!this.#downloadPath)\r\n throw new Error(`Download path not initialized!`);\r\n\r\n return this.#downloadPath;\r\n }\r\n\r\n set downloadPath(value: string) {\r\n this.#downloadPath = value;\r\n }\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadFilesCommand.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFilesCommand.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferFileDto from \"../../utils/api/dtos/transferFileDto.js\";\nimport type DownloadCommand from \"./downloadCommand.js\";\n\ninterface DownloadFilesCommand extends DownloadCommand\n{\n files: Array<TransferFileDto>\n}\n\nexport default DownloadFilesCommand;"]}
1
+ {"version":3,"file":"downloadFilesCommand.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadFilesCommand.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferFileDto from \"../../utils/api/dtos/transferFileDto.js\";\r\nimport type DownloadCommand from \"./downloadCommand.js\";\r\n\r\ninterface DownloadFilesCommand extends DownloadCommand\r\n{\r\n files: Array<TransferFileDto>\r\n}\r\n\r\nexport default DownloadFilesCommand;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadInfo.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\n\ninterface DownloadInfo {\n downloadId: string;\n transferId: string;\n initialState: DownloadEventArgs;\n completion: Promise<DownloadEventArgs>;\n}\n\nexport default DownloadInfo;"]}
1
+ {"version":3,"file":"downloadInfo.js","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadInfo.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\r\n\r\ninterface DownloadInfo {\r\n downloadId: string;\r\n transferId: string;\r\n initialState: DownloadEventArgs;\r\n completion: Promise<DownloadEventArgs>;\r\n}\r\n\r\nexport default DownloadInfo;"]}
@@ -1,7 +1,8 @@
1
1
  declare enum DownloadRegistrationMode {
2
2
  Transfer = "Transfer",
3
3
  EverySingleFile = "EverySingleFile",
4
- MultipleFiles = "MultipleFiles"
4
+ MultipleFiles = "MultipleFiles",// for future use with new endpoint - see FILEMAIL-4034
5
+ ServerSide = "ServerSide"
5
6
  }
6
7
  export default DownloadRegistrationMode;
7
8
  //# sourceMappingURL=downloadRegistrationMode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"downloadRegistrationMode.d.ts","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadRegistrationMode.ts"],"names":[],"mappings":"AAAA,aAAK,wBAAwB;IACzB,QAAQ,aAAa;IACrB,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;CAClC;AAED,eAAe,wBAAwB,CAAC"}
1
+ {"version":3,"file":"downloadRegistrationMode.d.ts","sourceRoot":"","sources":["../../../../src/downloader/dtos/downloadRegistrationMode.ts"],"names":[],"mappings":"AAAA,aAAK,wBAAwB;IACzB,QAAQ,aAAa;IACrB,eAAe,oBAAoB;IACnC,aAAa,kBAAkB,CAAE,uDAAuD;IACxF,UAAU,eAAe;CAC5B;AAED,eAAe,wBAAwB,CAAC"}