filemail-sdk 9.4.7 → 9.4.8

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 (218) 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.js.map +1 -1
  17. package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.js.map +1 -1
  18. package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfer.js.map +1 -1
  19. package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfersRetriever.js.map +1 -1
  20. package/dist/src/autoDownloader/node/nodeAutoDownloaderStateSerializer.js.map +1 -1
  21. package/dist/src/autoDownloader/node/nodeTransferDownloaderFactory.js.map +1 -1
  22. package/dist/src/autoDownloader/state/autoDownloaderRecoverableState.js.map +1 -1
  23. package/dist/src/autoDownloader/state/autoDownloaderState.js.map +1 -1
  24. package/dist/src/autoDownloader/state/autoDownloaderStateRecoverableTransfer.js.map +1 -1
  25. package/dist/src/autoDownloader/state/autoDownloaderStateRunningTransfer.js.map +1 -1
  26. package/dist/src/autoDownloader/state/autoDownloaderStateSnapshot.js.map +1 -1
  27. package/dist/src/autoDownloader/transferDownloaderFactory.js.map +1 -1
  28. package/dist/src/autoDownloader/transferHandler/autoDownloaderNewTransferHandler.js.map +1 -1
  29. package/dist/src/autoDownloader/transferHandler/autoDownloaderRecoverableTransferHandler.js.map +1 -1
  30. package/dist/src/autoDownloader/transferHandler/autoDownloaderTransferHandlerBase.js.map +1 -1
  31. package/dist/src/client/downloader/downloaderCore.js.map +1 -1
  32. package/dist/src/client/downloader/node/nodeTransferDownloader.js.map +1 -1
  33. package/dist/src/client/downloader/transferDownloader.js.map +1 -1
  34. package/dist/src/client/environmentVariables.js.map +1 -1
  35. package/dist/src/client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js.map +1 -1
  36. package/dist/src/client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js.map +1 -1
  37. package/dist/src/client/healthMonitor/events/transferHealthMonitorEvent.js.map +1 -1
  38. package/dist/src/client/healthMonitor/onlineChecker/nodeOnlineChecker.js.map +1 -1
  39. package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.js.map +1 -1
  40. package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.js.map +1 -1
  41. package/dist/src/client/healthMonitor/transferDownloaderHealthMonitor.js.map +1 -1
  42. package/dist/src/client/healthMonitor/transferHealthMonitorBase.js.map +1 -1
  43. package/dist/src/client/healthMonitor/transferUploaderHealthMonitor.js.map +1 -1
  44. package/dist/src/client/loggers/dummyLogger.js.map +1 -1
  45. package/dist/src/client/loggers/logger.js.map +1 -1
  46. package/dist/src/client/loggers/utils/logHealthyStatus.js.map +1 -1
  47. package/dist/src/client/node/nodeFileDetailsProvider.js.map +1 -1
  48. package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
  49. package/dist/src/client/uploader/transferUploader.js.map +1 -1
  50. package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
  51. package/dist/src/client/uploader/transferUploaderConfig.js.map +1 -1
  52. package/dist/src/client/uploader/utils/uploaderUtils.js.map +1 -1
  53. package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
  54. package/dist/src/downloader/api/fileServerDownloadClient.js.map +1 -1
  55. package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js.map +1 -1
  56. package/dist/src/downloader/chunkDownloader.js.map +1 -1
  57. package/dist/src/downloader/downloadFolderResolver.js.map +1 -1
  58. package/dist/src/downloader/downloadLogger.js.map +1 -1
  59. package/dist/src/downloader/downloadOptions.js.map +1 -1
  60. package/dist/src/downloader/downloadStatus/downloadFileChunkProgress.js.map +1 -1
  61. package/dist/src/downloader/downloadStatus/downloadFileProgress.js.map +1 -1
  62. package/dist/src/downloader/downloadStatus/downloadFilePromise.js.map +1 -1
  63. package/dist/src/downloader/downloadStatus/downloadState.js.map +1 -1
  64. package/dist/src/downloader/downloadTracker.js.map +1 -1
  65. package/dist/src/downloader/dtos/downloadCommand.js.map +1 -1
  66. package/dist/src/downloader/dtos/downloadError.js.map +1 -1
  67. package/dist/src/downloader/dtos/downloadErrorCode.js.map +1 -1
  68. package/dist/src/downloader/dtos/downloadEvent.js.map +1 -1
  69. package/dist/src/downloader/dtos/downloadFileChunkInfo.js.map +1 -1
  70. package/dist/src/downloader/dtos/downloadFileInfo.js.map +1 -1
  71. package/dist/src/downloader/dtos/downloadFilesCommand.js.map +1 -1
  72. package/dist/src/downloader/dtos/downloadInfo.js.map +1 -1
  73. package/dist/src/downloader/dtos/downloadRegistrationMode.js.map +1 -1
  74. package/dist/src/downloader/dtos/downloadTrackerFileInfo.js.map +1 -1
  75. package/dist/src/downloader/dtos/downloadTrackerFileProgressInfo.js.map +1 -1
  76. package/dist/src/downloader/dtos/downloadTrackerProgressInfo.js.map +1 -1
  77. package/dist/src/downloader/dtos/downloadTrackingMetadata.js.map +1 -1
  78. package/dist/src/downloader/dtos/downloaderRestoredState.js.map +1 -1
  79. package/dist/src/downloader/eventArgs/chunkDownloadEventArgs.js.map +1 -1
  80. package/dist/src/downloader/eventArgs/chunkDownloadFailedEventArgs.js.map +1 -1
  81. package/dist/src/downloader/eventArgs/downloadCompletedEventArgs.js.map +1 -1
  82. package/dist/src/downloader/eventArgs/downloadEventArgs.js.map +1 -1
  83. package/dist/src/downloader/eventArgs/downloadMetadataDeterminedEventArgs.js.map +1 -1
  84. package/dist/src/downloader/eventArgs/downloadPauseEventArgs.js.map +1 -1
  85. package/dist/src/downloader/eventArgs/downloadTrackingFailedEventArgs.js.map +1 -1
  86. package/dist/src/downloader/eventArgs/fileDownloadEventArgs.js.map +1 -1
  87. package/dist/src/downloader/eventArgs/fileDownloadFailedEventArgs.js.map +1 -1
  88. package/dist/src/downloader/filesDownloader.js.map +1 -1
  89. package/dist/src/downloader/filesPreparer.js.map +1 -1
  90. package/dist/src/index.js.map +1 -1
  91. package/dist/src/index.node.js.map +1 -1
  92. package/dist/src/index.web.js.map +1 -1
  93. package/dist/src/uploader/api/dtos/handshakeRequest.js.map +1 -1
  94. package/dist/src/uploader/api/dtos/handshakeResponse.js.map +1 -1
  95. package/dist/src/uploader/api/dtos/pingResponse.js.map +1 -1
  96. package/dist/src/uploader/api/dtos/sendChunkRequest.js.map +1 -1
  97. package/dist/src/uploader/api/fileServerUdpClient.js.map +1 -1
  98. package/dist/src/uploader/api/fileServerUploadClient.js.map +1 -1
  99. package/dist/src/uploader/api/node/nodeFileServerUdpClient.js +8 -8
  100. package/dist/src/uploader/api/node/nodeFileServerUdpClient.js.map +1 -1
  101. package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
  102. package/dist/src/uploader/api/web/utils/axiosIdleTimeoutManager.js.map +1 -1
  103. package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
  104. package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -1
  105. package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js.map +1 -1
  106. package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -1
  107. package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
  108. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.js.map +1 -1
  109. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js.map +1 -1
  110. package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.js.map +1 -1
  111. package/dist/src/uploader/eventArgs/fileChunkUploadFailedEventArgs.js.map +1 -1
  112. package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.js.map +1 -1
  113. package/dist/src/uploader/eventArgs/fileUploadEventArgs.js.map +1 -1
  114. package/dist/src/uploader/eventArgs/fileUploadFailedEventArgs.js.map +1 -1
  115. package/dist/src/uploader/eventArgs/transferMetadataDeterminedEventArgs.js.map +1 -1
  116. package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.d.ts +2 -0
  117. package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.d.ts.map +1 -1
  118. package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.js.map +1 -1
  119. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js.map +1 -1
  120. package/dist/src/uploader/eventArgs/transferUploadProgressedEventArgs.js.map +1 -1
  121. package/dist/src/uploader/export/transferUploadExportData.js.map +1 -1
  122. package/dist/src/uploader/export/transferUploadExportState.js.map +1 -1
  123. package/dist/src/uploader/export/transferUploadMetadata.js.map +1 -1
  124. package/dist/src/uploader/optimizer/optimizationValues.js.map +1 -1
  125. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map +1 -1
  126. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js.map +1 -1
  127. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js.map +1 -1
  128. package/dist/src/uploader/optimizer/transferUploadOptimizer.js.map +1 -1
  129. package/dist/src/uploader/optimizer/uploadOptimizer.js.map +1 -1
  130. package/dist/src/uploader/options/transferUploadAppendInfo.js.map +1 -1
  131. package/dist/src/uploader/options/transferUploadConfig.js.map +1 -1
  132. package/dist/src/uploader/options/transferUploadInfo.js.map +1 -1
  133. package/dist/src/uploader/options/transferUploadInfoBase.js.map +1 -1
  134. package/dist/src/uploader/pauseController.js.map +1 -1
  135. package/dist/src/uploader/state/continuousChunksCalculator.js.map +1 -1
  136. package/dist/src/uploader/state/readonlyTransferUploadStateFile.js.map +1 -1
  137. package/dist/src/uploader/state/readonlyTransferUploadStateFiles.js.map +1 -1
  138. package/dist/src/uploader/state/transferUploadProgressCalculator.js.map +1 -1
  139. package/dist/src/uploader/state/transferUploadState.d.ts.map +1 -1
  140. package/dist/src/uploader/state/transferUploadState.js +7 -1
  141. package/dist/src/uploader/state/transferUploadState.js.map +1 -1
  142. package/dist/src/uploader/state/transferUploadStateFile.js.map +1 -1
  143. package/dist/src/uploader/state/transferUploadStateFiles.js.map +1 -1
  144. package/dist/src/uploader/transferFailureAbortReason.js.map +1 -1
  145. package/dist/src/uploader/transferUpload.js.map +1 -1
  146. package/dist/src/uploader/transferUploadError.js.map +1 -1
  147. package/dist/src/uploader/transferUploadEvent.js.map +1 -1
  148. package/dist/src/utils/api/apiClient.js.map +1 -1
  149. package/dist/src/utils/api/apiClientBase.js.map +1 -1
  150. package/dist/src/utils/api/apiError.js.map +1 -1
  151. package/dist/src/utils/api/apiFilemail449Error.js.map +1 -1
  152. package/dist/src/utils/api/apiFilemailError.js.map +1 -1
  153. package/dist/src/utils/api/dtos/baseResponse.js.map +1 -1
  154. package/dist/src/utils/api/dtos/cancelTransferRequest.js.map +1 -1
  155. package/dist/src/utils/api/dtos/finalizeTransferRequest.js.map +1 -1
  156. package/dist/src/utils/api/dtos/finalizeTransferResponse.js.map +1 -1
  157. package/dist/src/utils/api/dtos/getCompanyResponse.js.map +1 -1
  158. package/dist/src/utils/api/dtos/getCompressedFileMetadataResponse.js.map +1 -1
  159. package/dist/src/utils/api/dtos/getInboxTransfersRequest.js.map +1 -1
  160. package/dist/src/utils/api/dtos/getInboxTransfersResponse.js.map +1 -1
  161. package/dist/src/utils/api/dtos/getRangehashResponse.js.map +1 -1
  162. package/dist/src/utils/api/dtos/getTransferRequest.js.map +1 -1
  163. package/dist/src/utils/api/dtos/getTransferResponse.js.map +1 -1
  164. package/dist/src/utils/api/dtos/initializeTransferRequest.js.map +1 -1
  165. package/dist/src/utils/api/dtos/initializeTransferResponse.js.map +1 -1
  166. package/dist/src/utils/api/dtos/loginRequest.js.map +1 -1
  167. package/dist/src/utils/api/dtos/loginResponse.js.map +1 -1
  168. package/dist/src/utils/api/dtos/registerFileDownloadRequest.js.map +1 -1
  169. package/dist/src/utils/api/dtos/registerTransferDownloadRequest.js.map +1 -1
  170. package/dist/src/utils/api/dtos/resetTransferRequest.js.map +1 -1
  171. package/dist/src/utils/api/dtos/sendFileChunkRequest.js.map +1 -1
  172. package/dist/src/utils/api/dtos/transferCustomFieldDto.js.map +1 -1
  173. package/dist/src/utils/api/dtos/transferFileDto.js.map +1 -1
  174. package/dist/src/utils/api/fileServerClientFactory.js.map +1 -1
  175. package/dist/src/utils/api/node/gotWorkarounds.js.map +1 -1
  176. package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
  177. package/dist/src/utils/api/node/nodeClientBase.js.map +1 -1
  178. package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
  179. package/dist/src/utils/api/node/nodeFileserverClientBase.js.map +1 -1
  180. package/dist/src/utils/api/urlUtil.js.map +1 -1
  181. package/dist/src/utils/api/web/webApiClient.js.map +1 -1
  182. package/dist/src/utils/api/web/webClientBase.js.map +1 -1
  183. package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
  184. package/dist/src/utils/api/web/webFileserverClientBase.js.map +1 -1
  185. package/dist/src/utils/concurrencyController/concurrencyController.js.map +1 -1
  186. package/dist/src/utils/concurrencyController/concurrencyReleaser.js.map +1 -1
  187. package/dist/src/utils/concurrencyController/transferConcurrencyController.js.map +1 -1
  188. package/dist/src/utils/crypto/cryptographyProvider.js.map +1 -1
  189. package/dist/src/utils/crypto/node/nodeCryptographyProvider.js.map +1 -1
  190. package/dist/src/utils/crypto/web/webCryptographyProvider.js.map +1 -1
  191. package/dist/src/utils/dateAndTime/simpleDateFormatter.js.map +1 -1
  192. package/dist/src/utils/events/chunkProgressEvent.js.map +1 -1
  193. package/dist/src/utils/events/eventsEngine.js.map +1 -1
  194. package/dist/src/utils/events/node/nodeEventsEngine.js.map +1 -1
  195. package/dist/src/utils/events/web/webEventsEngine.js.map +1 -1
  196. package/dist/src/utils/fileSystem/chunkStreamProvider.js.map +1 -1
  197. package/dist/src/utils/fileSystem/chunkStreamProviderFactory.js.map +1 -1
  198. package/dist/src/utils/fileSystem/fileDetails.js.map +1 -1
  199. package/dist/src/utils/fileSystem/fileSystemService.js.map +1 -1
  200. package/dist/src/utils/fileSystem/fsError.js.map +1 -1
  201. package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js.map +1 -1
  202. package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.js.map +1 -1
  203. package/dist/src/utils/fileSystem/node/nodeFileDetails.js.map +1 -1
  204. package/dist/src/utils/fileSystem/node/nodeFileSystemService.js.map +1 -1
  205. package/dist/src/utils/fileSystem/parsedPath.js.map +1 -1
  206. package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamEncrypter.js.map +1 -1
  207. package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js.map +1 -1
  208. package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.js.map +1 -1
  209. package/dist/src/utils/fileSystem/web/webFileDetails.js.map +1 -1
  210. package/dist/src/utils/jsonParsing.js.map +1 -1
  211. package/dist/src/utils/logging/logEventPropertyNames.js.map +1 -1
  212. package/dist/src/utils/mergeAbortAndPauseSignals.js.map +1 -1
  213. package/dist/src/utils/networking/throttlingOptions.js.map +1 -1
  214. package/dist/src/utils/promiseAll.js.map +1 -1
  215. package/dist/src/utils/types/transferStatus.js.map +1 -1
  216. package/dist/src/utils/uint8ArrayUtils.js.map +1 -1
  217. package/package.json +79 -79
  218. package/readme.md +18 -18
@@ -1 +1 @@
1
- {"version":3,"file":"autoDownloaderRecoverableTransferHandler.js","sourceRoot":"","sources":["../../../../src/autoDownloader/transferHandler/autoDownloaderRecoverableTransferHandler.ts"],"names":[],"mappings":"AAAA,OAAO,iCAAiC,MAAM,wCAAwC,CAAC;AAUvF,MAAM,wCAAyC,SAAQ,iCAAiC;IACpF,WAAW,CAAU;IAErB,YAAY,QAA0B,EAAE,UAA8B,EAAE,KAA0B,EAAE,yBAAoD,EAAE,MAAc;QACpK,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,yBAAyB,EAAE,MAAM,CAAC,CAAC;QAE1D,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAEkB,KAAK,CAAC,2BAA2B,CAAC,UAA8B;QAC/E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAE1D,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAExD,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,UAA8B;QACtD,IAAI,IAAI,CAAC,WAAW;YAChB,OAAO,MAAM,UAAU,CAAC,0BAA0B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAoB;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;YAClC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;SACjC,CAAC;QAEF,OAAO,MAAM,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAEkB,sBAAsB,CAAC,QAA0B,EAAE,KAAY,EAAE,MAAc;QAC9F,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;CACJ;AAED,eAAe,wCAAwC,CAAC","sourcesContent":["import AutoDownloaderTransferHandlerBase from \"./autoDownloaderTransferHandlerBase.js\";\r\n\r\nimport type TransferDownloader from \"../../client/downloader/transferDownloader.js\";\r\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\r\nimport type Logger from '../../client/loggers/logger.js';\r\nimport type TransferDownloaderFactory from '../transferDownloaderFactory.js';\r\nimport type AutoDownloaderState from '../state/autoDownloaderState.js';\r\nimport type DownloadCommand from '../../downloader/dtos/downloadCommand.js';\r\nimport type NewInboxTransfer from '../newInboxTransfersRetriever/newInboxTransfer.js';\r\n\r\nclass AutoDownloaderRecoverableTransferHandler extends AutoDownloaderTransferHandlerBase {\r\n #downloadId?: string;\r\n\r\n constructor(transfer: NewInboxTransfer, downloadId: string | undefined, state: AutoDownloaderState, transferDownloaderFactory: TransferDownloaderFactory, logger: Logger) {\r\n super(transfer, state, transferDownloaderFactory, logger);\r\n\r\n this.#downloadId = downloadId;\r\n }\r\n\r\n protected override async startDownloadAndUpdateState(downloader: TransferDownloader): Promise<DownloadInfo> {\r\n const downloadInfo = await this.startDownload(downloader);\r\n\r\n this.state.transferRecovered(this.transfer, downloader);\r\n\r\n return downloadInfo;\r\n }\r\n\r\n private async startDownload(downloader: TransferDownloader): Promise<DownloadInfo> {\r\n if (this.#downloadId)\r\n return await downloader.recoverInterruptedDownload(this.#downloadId);\r\n\r\n const options: DownloadCommand = {\r\n transfer: this.transfer.transferId,\r\n trackId: this.transfer.trackId,\r\n };\r\n\r\n return await downloader.downloadAllFiles(options);\r\n }\r\n\r\n protected override transferStartingFailed(transfer: NewInboxTransfer, error: Error, reason: string): void {\r\n this.state.transferRecoveryFailed(transfer, error, reason);\r\n }\r\n}\r\n\r\nexport default AutoDownloaderRecoverableTransferHandler;"]}
1
+ {"version":3,"file":"autoDownloaderRecoverableTransferHandler.js","sourceRoot":"","sources":["../../../../src/autoDownloader/transferHandler/autoDownloaderRecoverableTransferHandler.ts"],"names":[],"mappings":"AAAA,OAAO,iCAAiC,MAAM,wCAAwC,CAAC;AAUvF,MAAM,wCAAyC,SAAQ,iCAAiC;IACpF,WAAW,CAAU;IAErB,YAAY,QAA0B,EAAE,UAA8B,EAAE,KAA0B,EAAE,yBAAoD,EAAE,MAAc;QACpK,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,yBAAyB,EAAE,MAAM,CAAC,CAAC;QAE1D,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAEkB,KAAK,CAAC,2BAA2B,CAAC,UAA8B;QAC/E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAE1D,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAExD,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,UAA8B;QACtD,IAAI,IAAI,CAAC,WAAW;YAChB,OAAO,MAAM,UAAU,CAAC,0BAA0B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAoB;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;YAClC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;SACjC,CAAC;QAEF,OAAO,MAAM,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAEkB,sBAAsB,CAAC,QAA0B,EAAE,KAAY,EAAE,MAAc;QAC9F,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;CACJ;AAED,eAAe,wCAAwC,CAAC","sourcesContent":["import AutoDownloaderTransferHandlerBase from \"./autoDownloaderTransferHandlerBase.js\";\n\nimport type TransferDownloader from \"../../client/downloader/transferDownloader.js\";\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\nimport type Logger from '../../client/loggers/logger.js';\nimport type TransferDownloaderFactory from '../transferDownloaderFactory.js';\nimport type AutoDownloaderState from '../state/autoDownloaderState.js';\nimport type DownloadCommand from '../../downloader/dtos/downloadCommand.js';\nimport type NewInboxTransfer from '../newInboxTransfersRetriever/newInboxTransfer.js';\n\nclass AutoDownloaderRecoverableTransferHandler extends AutoDownloaderTransferHandlerBase {\n #downloadId?: string;\n\n constructor(transfer: NewInboxTransfer, downloadId: string | undefined, state: AutoDownloaderState, transferDownloaderFactory: TransferDownloaderFactory, logger: Logger) {\n super(transfer, state, transferDownloaderFactory, logger);\n\n this.#downloadId = downloadId;\n }\n\n protected override async startDownloadAndUpdateState(downloader: TransferDownloader): Promise<DownloadInfo> {\n const downloadInfo = await this.startDownload(downloader);\n\n this.state.transferRecovered(this.transfer, downloader);\n\n return downloadInfo;\n }\n\n private async startDownload(downloader: TransferDownloader): Promise<DownloadInfo> {\n if (this.#downloadId)\n return await downloader.recoverInterruptedDownload(this.#downloadId);\n\n const options: DownloadCommand = {\n transfer: this.transfer.transferId,\n trackId: this.transfer.trackId,\n };\n\n return await downloader.downloadAllFiles(options);\n }\n\n protected override transferStartingFailed(transfer: NewInboxTransfer, error: Error, reason: string): void {\n this.state.transferRecoveryFailed(transfer, error, reason);\n }\n}\n\nexport default AutoDownloaderRecoverableTransferHandler;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"autoDownloaderTransferHandlerBase.js","sourceRoot":"","sources":["../../../../src/autoDownloader/transferHandler/autoDownloaderTransferHandlerBase.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\r\nimport AutoDownloaderError from \"../autoDownloaderError.js\";\r\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport TransferHealthMonitorEvent from \"../../client/healthMonitor/events/transferHealthMonitorEvent.js\";\r\n\r\nimport type Logger from \"../../client/loggers/logger.js\";\r\nimport type TransferDownloader from \"../../client/downloader/transferDownloader.js\";\r\nimport type ConcurrencyReleaser from \"../../utils/concurrencyController/concurrencyReleaser.js\";\r\nimport type AutoDownloaderState from \"../state/autoDownloaderState.js\";\r\nimport type TransferDownloaderFactory from \"../transferDownloaderFactory.js\";\r\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\r\nimport type NewInboxTransfer from \"../newInboxTransfersRetriever/newInboxTransfer.js\";\r\n\r\nabstract class AutoDownloaderTransferHandlerBase {\r\n #transferDownloaderFactory: TransferDownloaderFactory;\r\n #logger: Logger;\r\n\r\n protected state: AutoDownloaderState;\r\n protected transfer: NewInboxTransfer;\r\n\r\n #lastError: Error | undefined;\r\n\r\n constructor(transfer: NewInboxTransfer, state: AutoDownloaderState, transferDownloaderFactory: TransferDownloaderFactory, logger: Logger) {\r\n this.#transferDownloaderFactory = transferDownloaderFactory;\r\n this.#logger = logger;\r\n\r\n this.state = state;\r\n this.transfer = transfer;\r\n }\r\n\r\n get transferId(): string {\r\n return this.transfer.transferId;\r\n }\r\n\r\n async startTransfer(concurrencyReleaser: ConcurrencyReleaser) {\r\n try {\r\n const downloader = this.#transferDownloaderFactory.create();\r\n\r\n this.addEventListeners(downloader);\r\n\r\n const downloadInfo = await this.startDownloadAndUpdateState(downloader);\r\n\r\n await downloadInfo.completion;\r\n }\r\n catch (error) {\r\n const reason = `AutoDownloader transfer handler failed (transfer id = ${this.transfer.transferId})`;\r\n this.#logger.logError(error as Error, reason);\r\n\r\n if (this.state.runningTransfers.has(this.transfer.transferId))\r\n this.state.transferFailed(this.transfer.transferId, error as Error, reason);\r\n else\r\n this.transferStartingFailed(this.transfer, error as Error, reason);\r\n }\r\n finally {\r\n concurrencyReleaser();\r\n }\r\n }\r\n\r\n protected abstract startDownloadAndUpdateState(downloader: TransferDownloader): Promise<DownloadInfo>;\r\n protected abstract transferStartingFailed(transfer: NewInboxTransfer, error: Error, reason: string): void;\r\n\r\n private addEventListeners(downloader: TransferDownloader) {\r\n downloader.healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, () => this.state.transferHealthy(this.transfer.transferId));\r\n downloader.healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => this.state.transferUnhealthy(this.transfer.transferId, eventArgs));\r\n\r\n downloader.addEventListener(TransferDownloadEvent.DownloadCompleted, eventArgs => {\r\n if (eventArgs.status === TransferStatus.Completed)\r\n this.state.transferCompleted(this.transfer.transferId);\r\n else {\r\n const error = this.getFailureReason(downloader);\r\n this.state.transferFailed(this.transfer.transferId, error, error.message);\r\n }\r\n });\r\n\r\n downloader.addEventListener(TransferDownloadEvent.Pausing, eventArgs => {\r\n if (eventArgs.interruptPendingChunks)\r\n this.state.transferStopping(this.transfer.transferId);\r\n else\r\n this.state.transferPausing(this.transfer.transferId);\r\n });\r\n\r\n downloader.addEventListener(TransferDownloadEvent.Paused, eventArgs => {\r\n if (eventArgs.interruptPendingChunks)\r\n this.state.transferStopped(this.transfer.transferId);\r\n else\r\n this.state.transferPaused(this.transfer.transferId);\r\n });\r\n\r\n downloader.addEventListener(TransferDownloadEvent.FileDownloadFailed, eventArgs => (this.#lastError = eventArgs.reason));\r\n downloader.addEventListener(TransferDownloadEvent.ChunkDownloadFailed, eventArgs => (this.#lastError = eventArgs.reason));\r\n\r\n downloader.addEventListener(TransferDownloadEvent.DownloadProgressed, eventArgs => this.state.transferProgressed(this.transfer.transferId, eventArgs));\r\n\r\n downloader.addEventListener(TransferDownloadEvent.Aborting, () => this.state.transferAborting(this.transfer.transferId));\r\n downloader.addEventListener(TransferDownloadEvent.Aborted, () => this.state.transferAborted(this.transfer.transferId));\r\n downloader.addEventListener(TransferDownloadEvent.Resumed, () => this.state.transferResumed(this.transfer.transferId));\r\n }\r\n\r\n private getFailureReason(downloader: TransferDownloader): Error {\r\n if (this.#lastError)\r\n return this.#lastError;\r\n\r\n return new AutoDownloaderError(`Download finished in state: ${downloader.status === null ? `NULL` : TransferStatus[downloader.status]}`);\r\n }\r\n}\r\n\r\nexport default AutoDownloaderTransferHandlerBase;"]}
1
+ {"version":3,"file":"autoDownloaderTransferHandlerBase.js","sourceRoot":"","sources":["../../../../src/autoDownloader/transferHandler/autoDownloaderTransferHandlerBase.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\nimport AutoDownloaderError from \"../autoDownloaderError.js\";\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferHealthMonitorEvent from \"../../client/healthMonitor/events/transferHealthMonitorEvent.js\";\n\nimport type Logger from \"../../client/loggers/logger.js\";\nimport type TransferDownloader from \"../../client/downloader/transferDownloader.js\";\nimport type ConcurrencyReleaser from \"../../utils/concurrencyController/concurrencyReleaser.js\";\nimport type AutoDownloaderState from \"../state/autoDownloaderState.js\";\nimport type TransferDownloaderFactory from \"../transferDownloaderFactory.js\";\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\nimport type NewInboxTransfer from \"../newInboxTransfersRetriever/newInboxTransfer.js\";\n\nabstract class AutoDownloaderTransferHandlerBase {\n #transferDownloaderFactory: TransferDownloaderFactory;\n #logger: Logger;\n\n protected state: AutoDownloaderState;\n protected transfer: NewInboxTransfer;\n\n #lastError: Error | undefined;\n\n constructor(transfer: NewInboxTransfer, state: AutoDownloaderState, transferDownloaderFactory: TransferDownloaderFactory, logger: Logger) {\n this.#transferDownloaderFactory = transferDownloaderFactory;\n this.#logger = logger;\n\n this.state = state;\n this.transfer = transfer;\n }\n\n get transferId(): string {\n return this.transfer.transferId;\n }\n\n async startTransfer(concurrencyReleaser: ConcurrencyReleaser) {\n try {\n const downloader = this.#transferDownloaderFactory.create();\n\n this.addEventListeners(downloader);\n\n const downloadInfo = await this.startDownloadAndUpdateState(downloader);\n\n await downloadInfo.completion;\n }\n catch (error) {\n const reason = `AutoDownloader transfer handler failed (transfer id = ${this.transfer.transferId})`;\n this.#logger.logError(error as Error, reason);\n\n if (this.state.runningTransfers.has(this.transfer.transferId))\n this.state.transferFailed(this.transfer.transferId, error as Error, reason);\n else\n this.transferStartingFailed(this.transfer, error as Error, reason);\n }\n finally {\n concurrencyReleaser();\n }\n }\n\n protected abstract startDownloadAndUpdateState(downloader: TransferDownloader): Promise<DownloadInfo>;\n protected abstract transferStartingFailed(transfer: NewInboxTransfer, error: Error, reason: string): void;\n\n private addEventListeners(downloader: TransferDownloader) {\n downloader.healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, () => this.state.transferHealthy(this.transfer.transferId));\n downloader.healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => this.state.transferUnhealthy(this.transfer.transferId, eventArgs));\n\n downloader.addEventListener(TransferDownloadEvent.DownloadCompleted, eventArgs => {\n if (eventArgs.status === TransferStatus.Completed)\n this.state.transferCompleted(this.transfer.transferId);\n else {\n const error = this.getFailureReason(downloader);\n this.state.transferFailed(this.transfer.transferId, error, error.message);\n }\n });\n\n downloader.addEventListener(TransferDownloadEvent.Pausing, eventArgs => {\n if (eventArgs.interruptPendingChunks)\n this.state.transferStopping(this.transfer.transferId);\n else\n this.state.transferPausing(this.transfer.transferId);\n });\n\n downloader.addEventListener(TransferDownloadEvent.Paused, eventArgs => {\n if (eventArgs.interruptPendingChunks)\n this.state.transferStopped(this.transfer.transferId);\n else\n this.state.transferPaused(this.transfer.transferId);\n });\n\n downloader.addEventListener(TransferDownloadEvent.FileDownloadFailed, eventArgs => (this.#lastError = eventArgs.reason));\n downloader.addEventListener(TransferDownloadEvent.ChunkDownloadFailed, eventArgs => (this.#lastError = eventArgs.reason));\n\n downloader.addEventListener(TransferDownloadEvent.DownloadProgressed, eventArgs => this.state.transferProgressed(this.transfer.transferId, eventArgs));\n\n downloader.addEventListener(TransferDownloadEvent.Aborting, () => this.state.transferAborting(this.transfer.transferId));\n downloader.addEventListener(TransferDownloadEvent.Aborted, () => this.state.transferAborted(this.transfer.transferId));\n downloader.addEventListener(TransferDownloadEvent.Resumed, () => this.state.transferResumed(this.transfer.transferId));\n }\n\n private getFailureReason(downloader: TransferDownloader): Error {\n if (this.#lastError)\n return this.#lastError;\n\n return new AutoDownloaderError(`Download finished in state: ${downloader.status === null ? `NULL` : TransferStatus[downloader.status]}`);\n }\n}\n\nexport default AutoDownloaderTransferHandlerBase;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloaderCore.js","sourceRoot":"","sources":["../../../../src/client/downloader/downloaderCore.ts"],"names":[],"mappings":"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","sourcesContent":["import ApiError from \"../../utils/api/apiError.js\";\r\nimport DownloadErrorCode from \"../../downloader/dtos/downloadErrorCode.js\";\r\nimport TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\r\nimport FilesDownloader from \"../../downloader/filesDownloader.js\";\r\nimport DownloadFileInfo from \"../../downloader/dtos/downloadFileInfo.js\";\r\nimport TransferConcurrencyController from \"../../utils/concurrencyController/transferConcurrencyController.js\";\r\nimport DownloadError from '../../downloader/dtos/downloadError.js';\r\nimport UrlUtil from \"../../utils/api/urlUtil.js\";\r\nimport DownloadTracker from \"../../downloader/downloadTracker.js\";\r\nimport FilesPreparer from \"../../downloader/filesPreparer.js\";\r\nimport DownloadFolderResolver from \"../../downloader/downloadFolderResolver.js\";\r\nimport DownloadRegistrationMode from \"../../downloader/dtos/downloadRegistrationMode.js\";\r\n\r\nimport type DownloadOptions from \"../../downloader/downloadOptions.js\";\r\nimport type ApiClient from \"../../utils/api/apiClient.js\";\r\nimport type ThrottlingOptions from '../../utils/networking/throttlingOptions.js';\r\nimport TransferStatus from '../../utils/types/transferStatus.js';\r\nimport type GetTransferResponse from \"../../utils/api/dtos/getTransferResponse.js\";\r\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\r\nimport type TransferFileDto from \"../../utils/api/dtos/transferFileDto.js\";\r\nimport type GetTransferRequest from \"../../utils/api/dtos/getTransferRequest.js\";\r\nimport type DownloadCommand from \"../../downloader/dtos/downloadCommand.js\";\r\nimport type DownloadFilesCommand from \"../../downloader/dtos/downloadFilesCommand.js\";\r\nimport type DownloaderRestoredState from \"../../downloader/dtos/downloaderRestoredState.js\";\r\nimport type ChunkStreamProviderFactory from \"../../utils/fileSystem/chunkStreamProviderFactory.js\";\r\nimport type FileServerClientFactory from \"../../utils/api/fileServerClientFactory.js\";\r\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\r\nimport type FileSystemService from \"../../utils/fileSystem/fileSystemService.js\";\r\nimport type DownloadLogger from \"../../downloader/downloadLogger.js\";\r\nimport type DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\r\nimport type { DownloadCommandE2eeData } from \"../../downloader/dtos/downloadCommand.js\";\r\nimport type { DownloadTrackingMetadataE2eeData } from \"../../downloader/dtos/downloadTrackingMetadata.js\";\r\nimport type CryptographyProvider from \"../../utils/crypto/cryptographyProvider.js\";\r\nimport type TransferDownloaderHealthMonitor from \"../healthMonitor/transferDownloaderHealthMonitor.js\";\r\n\r\nexport default class DownloaderCore {\r\n readonly #apiClient: ApiClient;\r\n readonly #options: DownloadOptions;\r\n readonly #chunkProviderFactory: ChunkStreamProviderFactory<string>;\r\n readonly #fileserverClientFactory: FileServerClientFactory;\r\n readonly #fileSystem: FileSystemService;\r\n readonly #eventsEngine: EventsEngine;\r\n readonly #logger: DownloadLogger;\r\n readonly #cryptography: CryptographyProvider;\r\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\r\n\r\n #downloadId?: string;\r\n #transferId?: string;\r\n #trackId?: string;\r\n #filesDownloader: FilesDownloader | null = null;\r\n #downloadTracker: DownloadTracker | null = null;\r\n #downloadRegistrationMode: DownloadRegistrationMode = DownloadRegistrationMode.Transfer;\r\n\r\n constructor(options: DownloadOptions, logger: DownloadLogger, apiClient: ApiClient, chunkProviderFactory: ChunkStreamProviderFactory<string>, fileserverClientFactory: FileServerClientFactory, fileSystem: FileSystemService, eventsEngine: EventsEngine, cryptography: CryptographyProvider, healthMonitor: TransferDownloaderHealthMonitor) {\r\n this.#options = options;\r\n this.#logger = logger;\r\n this.#apiClient = apiClient;\r\n this.#chunkProviderFactory = chunkProviderFactory;\r\n this.#fileserverClientFactory = fileserverClientFactory;\r\n this.#fileSystem = fileSystem;\r\n this.#eventsEngine = eventsEngine;\r\n this.#cryptography = cryptography;\r\n this.#healthMonitor = healthMonitor;\r\n }\r\n\r\n get status(): TransferStatus | null {\r\n if (this.#filesDownloader === null)\r\n return null;\r\n\r\n return this.#filesDownloader.status;\r\n }\r\n\r\n get state(): DownloadEventArgs | null {\r\n if (this.#filesDownloader === null)\r\n return null;\r\n\r\n return this.#filesDownloader.getCurrentState(true);\r\n }\r\n\r\n get downloadId(): string | undefined {\r\n return this.#downloadId;\r\n }\r\n\r\n async pause(options: { interruptPendingChunks: boolean }): Promise<boolean> {\r\n this.#throwIfNotRunning();\r\n\r\n const paused = await new Promise<boolean>(resolve => {\r\n const pauseOptions = { ...options, pausedTrigger: resolve };\r\n this.#filesDownloader!.requestPause(pauseOptions);\r\n });\r\n\r\n if (paused)\r\n this.#healthMonitor.stop();\r\n\r\n if (paused)\r\n await this.#downloadTracker?.saveState();\r\n\r\n return paused;\r\n }\r\n\r\n resume(): boolean {\r\n this.#throwIfNotRunning();\r\n const result = this.#filesDownloader!.resume();\r\n if (result)\r\n this.#healthMonitor.start();\r\n return result;\r\n }\r\n\r\n abort(): boolean {\r\n this.#throwIfNotRunning();\r\n const aborted = this.#filesDownloader!.requestAbort();\r\n if (aborted)\r\n this.#healthMonitor.stop();\r\n return aborted;\r\n }\r\n\r\n configureThrottling(options: ThrottlingOptions): void {\r\n this.#eventsEngine.emit(TransferDownloadEvent.ConfigureThrottling, options);\r\n }\r\n\r\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\r\n this.#throwIfRunning();\r\n this.#validateOptions();\r\n\r\n this.#trackId = command.trackId;\r\n const transfer = await this.#getEffectiveTransfer(command, 0);\r\n\r\n this.#downloadRegistrationMode = DownloadRegistrationMode.Transfer;\r\n\r\n return this.#downloadZipped(transfer, command.e2eeDataOrTextKey);\r\n }\r\n\r\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\r\n this.#throwIfRunning();\r\n this.#validateOptions();\r\n\r\n this.#trackId = command.trackId;\r\n const transfer = await this.#getEffectiveTransfer(command, -1);\r\n\r\n this.#downloadRegistrationMode = DownloadRegistrationMode.Transfer;\r\n\r\n return this.#download(transfer, transfer.files, command.e2eeDataOrTextKey);\r\n }\r\n\r\n async downloadSpecificFiles(command: DownloadFilesCommand) {\r\n this.#throwIfRunning();\r\n this.#validateOptions();\r\n\r\n this.#trackId = command.trackId;\r\n const transfer = await this.#getEffectiveTransfer(command, 0);\r\n\r\n this.#downloadRegistrationMode = typeof transfer.numberoffiles === `number` && command.files.length === transfer.numberoffiles\r\n ? DownloadRegistrationMode.Transfer\r\n : DownloadRegistrationMode.EverySingleFile;\r\n\r\n return this.#download(transfer, command.files, command.e2eeDataOrTextKey);\r\n }\r\n\r\n async restartFailedDownloader() {\r\n if (!this.#downloadTracker)\r\n throw new Error(`Download tracker hasn't been initialized`);\r\n if (!this.#options.downloadTrackingBaseFolder)\r\n throw new Error(`Download tracking base folder hasn't been populated`);\r\n if (this.#filesDownloader?.status !== TransferStatus.Failed && this.#filesDownloader?.status !== TransferStatus.Aborted)\r\n throw new Error(`Downloader has to be in Failed or Aborted stated`);\r\n\r\n const downloadMetadata = await DownloadTracker.restoreDownloadMetadata(this.#downloadId!, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\r\n const downloadCommandE2eeData = this.createDownloadCommandE2eeDataFromMetadata(downloadMetadata.e2eeData);\r\n const restoredOptions = await this.#downloadTracker.restoreDownloadOptions();\r\n\r\n // keep restart behavior deterministic by reusing the exact options used in the original run\r\n this.#options.downloadFolder = restoredOptions.downloadFolder;\r\n this.#options.downloadTrackingBaseFolder = restoredOptions.downloadTrackingBaseFolder;\r\n this.#options.maxChunkSize = restoredOptions.maxChunkSize;\r\n this.#options.checkChunksMd5 = restoredOptions.checkChunksMd5;\r\n\r\n // find out from disk the entire list of files, which were in progress and how many chunks have completed already\r\n const downloaderState = await this.#downloadTracker.restoreDownloaderState();\r\n\r\n // restart from where we left off\r\n const runningInfo = this.#run(downloaderState.files, downloadCommandE2eeData, downloadMetadata.region, downloaderState.state);\r\n runningInfo.then((di: DownloadInfo) => {\r\n this.#eventsEngine.emit(TransferDownloadEvent.RecoveredInterruptedDownload, di.initialState);\r\n });\r\n return runningInfo;\r\n }\r\n\r\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\r\n this.#logger.applyDownloadId(downloadId);\r\n this.#logger.logInfo(`Download recovery requested for ${downloadId}`);\r\n\r\n this.#throwIfRunning();\r\n\r\n if (!this.#options.downloadTrackingBaseFolder)\r\n throw new DownloadError(`The download tracking folder is not specified for ${downloadId}`, undefined, DownloadErrorCode.TrackingNotAvailable);\r\n\r\n this.#downloadId = downloadId;\r\n this.#transferId = downloadId.split(`_`)[0]!;\r\n this.#logger.applyTransferId(this.#transferId);\r\n\r\n const downloadMetadata = await DownloadTracker.restoreDownloadMetadata(this.#downloadId!, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\r\n\r\n const downloadCommandE2eeData = this.createDownloadCommandE2eeDataFromMetadata(downloadMetadata.e2eeData);\r\n\r\n this.#downloadTracker = new DownloadTracker(this.#downloadId!, this.#options, this.#fileSystem, this.#eventsEngine, downloadCommandE2eeData, downloadMetadata.region);\r\n const restoredOptions = await this.#downloadTracker.restoreDownloadOptions();\r\n\r\n // just make sure we are running the same config as when the download was last dumped to disk - otherwise things could get out of sync\r\n this.#options.downloadFolder = restoredOptions.downloadFolder;\r\n this.#options.downloadTrackingBaseFolder = restoredOptions.downloadTrackingBaseFolder;\r\n this.#options.maxChunkSize = restoredOptions.maxChunkSize;\r\n this.#options.checkChunksMd5 = restoredOptions.checkChunksMd5;\r\n\r\n // find out from disk the entire list of files, which were in progress and how many chunks have completed already\r\n const downloaderState = await this.#downloadTracker.restoreDownloaderState();\r\n\r\n // restart from where we left off\r\n const runningInfo = this.#run(downloaderState.files, downloadCommandE2eeData, downloadMetadata.region, downloaderState.state);\r\n runningInfo.then((di: DownloadInfo) => {\r\n this.#eventsEngine.emit(TransferDownloadEvent.RecoveredInterruptedDownload, di.initialState);\r\n });\r\n return runningInfo;\r\n }\r\n\r\n private createDownloadCommandE2eeDataFromMetadata(metadataE2eeData?: DownloadTrackingMetadataE2eeData): DownloadCommandE2eeData | undefined {\r\n if (!metadataE2eeData)\r\n return undefined;\r\n\r\n return {\r\n iv: Buffer.from(metadataE2eeData.ivAsHex, `hex`),\r\n key: Buffer.from(metadataE2eeData.keyAsHex, `hex`),\r\n };\r\n }\r\n\r\n async cleanupDownload(downloadId: string | null = null) {\r\n const cleanupDownloadId = downloadId ?? this.#downloadId;\r\n\r\n if (!cleanupDownloadId)\r\n throw new DownloadError(`Cannot cleanup unknown download`);\r\n\r\n if (!this.#options.downloadTrackingBaseFolder)\r\n throw new DownloadError(`The download tracking folder is not specified for download ${cleanupDownloadId}`);\r\n\r\n this.#logger.applyDownloadId(cleanupDownloadId);\r\n\r\n await DownloadTracker.removeDownloadTrackingFolder(cleanupDownloadId, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\r\n }\r\n\r\n async #downloadZipped(transfer: GetTransferResponse, e2eeDataOrTextKey?: DownloadCommandE2eeData | string): Promise<DownloadInfo> {\r\n const fsClient = this.#fileserverClientFactory.createFileServerTcpDownloadClient(transfer.compressedfileurl!, null, null, transfer.id, ``, this.#options);\r\n const metaData = await fsClient.getCompressedFileMetadata();\r\n\r\n // for now fileservers are not able to validate md5 for chunks of the zip\r\n // note: this should be rather handled in files downloader logic\r\n this.#options.checkChunksMd5 = false;\r\n\r\n const zipFile: TransferFileDto = {\r\n downloadurl: transfer.compressedfileurl!,\r\n fileid: UrlUtil.getQueryStringFromUrl(transfer.compressedfileurl!).compressedfilekey!,\r\n filename: metaData.fileName,\r\n filesize: metaData.fileSize,\r\n compressed: true,\r\n };\r\n\r\n return this.#download(transfer, [zipFile], e2eeDataOrTextKey);\r\n }\r\n\r\n async #download(transfer: GetTransferResponse, files: Array<TransferFileDto>, e2eeDataOrTextKey?: DownloadCommandE2eeData | string): Promise<DownloadInfo> {\r\n this.#transferId = transfer.id;\r\n this.#downloadId = this.#generateDownloadId();\r\n\r\n this.#logger.applyDownloadId(this.#downloadId);\r\n this.#logger.applyTransferId(this.#transferId);\r\n\r\n if (this.#options.downloadFolderTemplate)\r\n this.#options.downloadFolder = DownloadFolderResolver.prepareDownloadFolder(this.#options.downloadFolderTemplate!, transfer);\r\n\r\n const e2eeData = await this.#getE2eeDataOrThrow(transfer, e2eeDataOrTextKey);\r\n\r\n const downloadFiles = this.#mapTransferFilesDtosToFileInfos(files);\r\n const preparer = new FilesPreparer(this.#options.downloadFolder!, this.#options.maxChunkSize, this.#fileSystem);\r\n preparer.prepareFiles(downloadFiles);\r\n\r\n return this.#run(downloadFiles, e2eeData, transfer.region);\r\n }\r\n\r\n async #getE2eeDataOrThrow(transfer: GetTransferResponse, e2eeDataOrTextKey?: string | DownloadCommandE2eeData): Promise<DownloadCommandE2eeData | undefined> {\r\n if (!transfer.e2ee)\r\n return undefined;\r\n\r\n if (!e2eeDataOrTextKey)\r\n throw new DownloadError(`No E2EE data or text key available to decrypt the transfer`);\r\n\r\n if (typeof e2eeDataOrTextKey === `object`)\r\n return e2eeDataOrTextKey;\r\n\r\n if (!transfer.e2ee_keyhash)\r\n throw new DownloadError(`No E2EE db data available to decrypt the transfer`);\r\n\r\n const e2eeDbDataBuffer = Buffer.from(transfer.e2ee_keyhash, `hex`);\r\n\r\n const iv = e2eeDbDataBuffer.subarray(0, 16);\r\n const salt = e2eeDbDataBuffer.subarray(16, 32);\r\n const key = await this.#cryptography.deriveKey(e2eeDataOrTextKey, salt);\r\n\r\n return { iv, key: Buffer.from(key) };\r\n }\r\n\r\n async #run(downloadFiles: Array<DownloadFileInfo>, e2eeData?: DownloadCommandE2eeData, region?: string, restoredState?: DownloaderRestoredState): Promise<DownloadInfo> {\r\n if (!this.#transferId)\r\n throw new DownloadError(`This downloader has no transfer ID specified`);\r\n\r\n if (!this.#downloadId)\r\n throw new DownloadError(`This downloader has no download ID initialized`);\r\n\r\n this.#filesDownloader = new FilesDownloader(\r\n this.#logger,\r\n this.#transferId!,\r\n this.#trackId,\r\n this.#downloadId!,\r\n region,\r\n downloadFiles,\r\n restoredState,\r\n this.#fileSystem,\r\n new TransferConcurrencyController(this.#options.parallelChunks!),\r\n this.#eventsEngine,\r\n this.#cryptography,\r\n this.#options,\r\n this.#apiClient,\r\n this.#fileserverClientFactory,\r\n this.#chunkProviderFactory,\r\n this.#downloadRegistrationMode,\r\n e2eeData,\r\n );\r\n\r\n if (this.#options.downloadTrackingBaseFolder) {\r\n if (!this.#downloadTracker)\r\n this.#downloadTracker = new DownloadTracker(this.#downloadId!, this.#options, this.#fileSystem, this.#eventsEngine, e2eeData, region);\r\n\r\n await this.#downloadTracker.start(downloadFiles);\r\n }\r\n\r\n const initialState = this.#filesDownloader.getCurrentState(false);\r\n\r\n this.#healthMonitor.start();\r\n\r\n const completion = this.#filesDownloader.start();\r\n\r\n completion.finally(() => {\r\n this.#healthMonitor.stop();\r\n });\r\n\r\n return { downloadId: this.#downloadId!, transferId: this.#transferId!, completion, initialState };\r\n }\r\n\r\n async #getEffectiveTransfer(command: DownloadCommand, fileslimit: number) {\r\n let effectiveTransfer: GetTransferResponse | null = null;\r\n\r\n if (command.transfer)\r\n effectiveTransfer = await this.#fetchTransfer(command.transfer, undefined, command.password, fileslimit, command.checkLogintoken);\r\n\r\n if (!effectiveTransfer) {\r\n // still don't know the transfer - must use track ID to fetch it\r\n if (!this.#trackId)\r\n throw new DownloadError(`Could not resolve transfer to be downloaded - missing transfer info and missing track id`);\r\n\r\n effectiveTransfer = await this.#fetchTransfer(undefined, this.#trackId!, command.password, fileslimit, command.checkLogintoken);\r\n }\r\n\r\n if (!effectiveTransfer)\r\n throw new DownloadError(`Could not resolve transfer to be downloaded - transfer=${command.transfer} track=${command.trackId}`);\r\n\r\n if (effectiveTransfer.isexpired === true)\r\n throw new DownloadError(`Transfer is expired transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.TransferExpired);\r\n\r\n if (effectiveTransfer.blockdownloads === true)\r\n throw new DownloadError(`Transfer has downloads disabled transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.DownloadsDisabled);\r\n\r\n if (fileslimit !== 0 && (!effectiveTransfer.files || effectiveTransfer.files.length === 0))\r\n throw new DownloadError(`Transfer has no files to download transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.NoFilesToDownload);\r\n\r\n return effectiveTransfer;\r\n }\r\n\r\n async #fetchTransfer(\r\n transferid?: string | undefined,\r\n trackid?: string | undefined,\r\n password?: string | undefined,\r\n fileslimit?: number | undefined,\r\n checkLogintoken?: boolean,\r\n ): Promise<GetTransferResponse> {\r\n try {\r\n // specifying which file properties we want to get from API\r\n // reason: api adds lots of other unnecessary properties - downloader doesn't need them and if a transfer has lots of files (some can be up to 100k)\r\n // it makes the response much smaller (up to 80% size reduction)\r\n const request: GetTransferRequest = { fileslimit, transferid, trackid, password, fprops: [`fileid`, `filesize`, `filename`, `downloadurl`], checkLogintoken };\r\n return await this.#apiClient.getTransfer(request);\r\n }\r\n catch (error) {\r\n const code = this.#apiErrorToDownloadErrorCode(error);\r\n const downloadError = new DownloadError(`Could not fetch transfer by id=${transferid ?? `---`} track=${trackid ?? `---`}`, { cause: error as Error }, code);\r\n throw downloadError;\r\n }\r\n }\r\n\r\n #apiErrorToDownloadErrorCode(error: unknown) {\r\n if (error instanceof ApiError) {\r\n switch (error.httpStatus) {\r\n case 401: return DownloadErrorCode.InvalidTransferPassword;\r\n case 404: return DownloadErrorCode.TransferNotFound;\r\n case 409: return DownloadErrorCode.TransferInvalidState;\r\n default: break;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n #throwIfRunning() {\r\n if (this.#filesDownloader)\r\n throw new DownloadError(`This instance of downloader is already in use. Please create a new one.`);\r\n }\r\n\r\n #throwIfNotRunning() {\r\n if (!this.#filesDownloader)\r\n throw new DownloadError(`This instance of downloader is not running yet. Please start the download first.`);\r\n }\r\n\r\n #generateDownloadId(): string {\r\n return `${this.#transferId}_${this.#cryptography.generateRandomString(10)}`;\r\n }\r\n\r\n #mapTransferFilesDtosToFileInfos(files: Array<TransferFileDto>) {\r\n return files.map(file => new DownloadFileInfo(\r\n file.fileid,\r\n file.downloadurl,\r\n file.filename,\r\n file.filesize,\r\n ));\r\n }\r\n\r\n #validateOptions() {\r\n if (!this.#options.downloadFolder && !this.#options.downloadFolderTemplate)\r\n throw new DownloadError(`downloadFolder OR downloadFolderTemplate is required`);\r\n\r\n if (this.#options.maxChunkSize !== null && this.#options.maxChunkSize! <= 0)\r\n throw new DownloadError(`maxChunkSize must be greater than 0. Provide \"null\" if you want to download without chunking.`);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"downloaderCore.js","sourceRoot":"","sources":["../../../../src/client/downloader/downloaderCore.ts"],"names":[],"mappings":"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","sourcesContent":["import ApiError from \"../../utils/api/apiError.js\";\nimport DownloadErrorCode from \"../../downloader/dtos/downloadErrorCode.js\";\nimport TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\nimport FilesDownloader from \"../../downloader/filesDownloader.js\";\nimport DownloadFileInfo from \"../../downloader/dtos/downloadFileInfo.js\";\nimport TransferConcurrencyController from \"../../utils/concurrencyController/transferConcurrencyController.js\";\nimport DownloadError from '../../downloader/dtos/downloadError.js';\nimport UrlUtil from \"../../utils/api/urlUtil.js\";\nimport DownloadTracker from \"../../downloader/downloadTracker.js\";\nimport FilesPreparer from \"../../downloader/filesPreparer.js\";\nimport DownloadFolderResolver from \"../../downloader/downloadFolderResolver.js\";\nimport DownloadRegistrationMode from \"../../downloader/dtos/downloadRegistrationMode.js\";\n\nimport type DownloadOptions from \"../../downloader/downloadOptions.js\";\nimport type ApiClient from \"../../utils/api/apiClient.js\";\nimport type ThrottlingOptions from '../../utils/networking/throttlingOptions.js';\nimport TransferStatus from '../../utils/types/transferStatus.js';\nimport type GetTransferResponse from \"../../utils/api/dtos/getTransferResponse.js\";\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\nimport type TransferFileDto from \"../../utils/api/dtos/transferFileDto.js\";\nimport type GetTransferRequest from \"../../utils/api/dtos/getTransferRequest.js\";\nimport type DownloadCommand from \"../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../downloader/dtos/downloadFilesCommand.js\";\nimport type DownloaderRestoredState from \"../../downloader/dtos/downloaderRestoredState.js\";\nimport type ChunkStreamProviderFactory from \"../../utils/fileSystem/chunkStreamProviderFactory.js\";\nimport type FileServerClientFactory from \"../../utils/api/fileServerClientFactory.js\";\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport type FileSystemService from \"../../utils/fileSystem/fileSystemService.js\";\nimport type DownloadLogger from \"../../downloader/downloadLogger.js\";\nimport type DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\nimport type { DownloadCommandE2eeData } from \"../../downloader/dtos/downloadCommand.js\";\nimport type { DownloadTrackingMetadataE2eeData } from \"../../downloader/dtos/downloadTrackingMetadata.js\";\nimport type CryptographyProvider from \"../../utils/crypto/cryptographyProvider.js\";\nimport type TransferDownloaderHealthMonitor from \"../healthMonitor/transferDownloaderHealthMonitor.js\";\n\nexport default class DownloaderCore {\n readonly #apiClient: ApiClient;\n readonly #options: DownloadOptions;\n readonly #chunkProviderFactory: ChunkStreamProviderFactory<string>;\n readonly #fileserverClientFactory: FileServerClientFactory;\n readonly #fileSystem: FileSystemService;\n readonly #eventsEngine: EventsEngine;\n readonly #logger: DownloadLogger;\n readonly #cryptography: CryptographyProvider;\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\n\n #downloadId?: string;\n #transferId?: string;\n #trackId?: string;\n #filesDownloader: FilesDownloader | null = null;\n #downloadTracker: DownloadTracker | null = null;\n #downloadRegistrationMode: DownloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n constructor(options: DownloadOptions, logger: DownloadLogger, apiClient: ApiClient, chunkProviderFactory: ChunkStreamProviderFactory<string>, fileserverClientFactory: FileServerClientFactory, fileSystem: FileSystemService, eventsEngine: EventsEngine, cryptography: CryptographyProvider, healthMonitor: TransferDownloaderHealthMonitor) {\n this.#options = options;\n this.#logger = logger;\n this.#apiClient = apiClient;\n this.#chunkProviderFactory = chunkProviderFactory;\n this.#fileserverClientFactory = fileserverClientFactory;\n this.#fileSystem = fileSystem;\n this.#eventsEngine = eventsEngine;\n this.#cryptography = cryptography;\n this.#healthMonitor = healthMonitor;\n }\n\n get status(): TransferStatus | null {\n if (this.#filesDownloader === null)\n return null;\n\n return this.#filesDownloader.status;\n }\n\n get state(): DownloadEventArgs | null {\n if (this.#filesDownloader === null)\n return null;\n\n return this.#filesDownloader.getCurrentState(true);\n }\n\n get downloadId(): string | undefined {\n return this.#downloadId;\n }\n\n async pause(options: { interruptPendingChunks: boolean }): Promise<boolean> {\n this.#throwIfNotRunning();\n\n const paused = await new Promise<boolean>(resolve => {\n const pauseOptions = { ...options, pausedTrigger: resolve };\n this.#filesDownloader!.requestPause(pauseOptions);\n });\n\n if (paused)\n this.#healthMonitor.stop();\n\n if (paused)\n await this.#downloadTracker?.saveState();\n\n return paused;\n }\n\n resume(): boolean {\n this.#throwIfNotRunning();\n const result = this.#filesDownloader!.resume();\n if (result)\n this.#healthMonitor.start();\n return result;\n }\n\n abort(): boolean {\n this.#throwIfNotRunning();\n const aborted = this.#filesDownloader!.requestAbort();\n if (aborted)\n this.#healthMonitor.stop();\n return aborted;\n }\n\n configureThrottling(options: ThrottlingOptions): void {\n this.#eventsEngine.emit(TransferDownloadEvent.ConfigureThrottling, options);\n }\n\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, 0);\n\n this.#downloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n return this.#downloadZipped(transfer, command.e2eeDataOrTextKey);\n }\n\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, -1);\n\n this.#downloadRegistrationMode = DownloadRegistrationMode.Transfer;\n\n return this.#download(transfer, transfer.files, command.e2eeDataOrTextKey);\n }\n\n async downloadSpecificFiles(command: DownloadFilesCommand) {\n this.#throwIfRunning();\n this.#validateOptions();\n\n this.#trackId = command.trackId;\n const transfer = await this.#getEffectiveTransfer(command, 0);\n\n this.#downloadRegistrationMode = typeof transfer.numberoffiles === `number` && command.files.length === transfer.numberoffiles\n ? DownloadRegistrationMode.Transfer\n : DownloadRegistrationMode.EverySingleFile;\n\n return this.#download(transfer, command.files, command.e2eeDataOrTextKey);\n }\n\n async restartFailedDownloader() {\n if (!this.#downloadTracker)\n throw new Error(`Download tracker hasn't been initialized`);\n if (!this.#options.downloadTrackingBaseFolder)\n throw new Error(`Download tracking base folder hasn't been populated`);\n if (this.#filesDownloader?.status !== TransferStatus.Failed && this.#filesDownloader?.status !== TransferStatus.Aborted)\n throw new Error(`Downloader has to be in Failed or Aborted stated`);\n\n const downloadMetadata = await DownloadTracker.restoreDownloadMetadata(this.#downloadId!, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n const downloadCommandE2eeData = this.createDownloadCommandE2eeDataFromMetadata(downloadMetadata.e2eeData);\n const restoredOptions = await this.#downloadTracker.restoreDownloadOptions();\n\n // keep restart behavior deterministic by reusing the exact options used in the original run\n this.#options.downloadFolder = restoredOptions.downloadFolder;\n this.#options.downloadTrackingBaseFolder = restoredOptions.downloadTrackingBaseFolder;\n this.#options.maxChunkSize = restoredOptions.maxChunkSize;\n this.#options.checkChunksMd5 = restoredOptions.checkChunksMd5;\n\n // find out from disk the entire list of files, which were in progress and how many chunks have completed already\n const downloaderState = await this.#downloadTracker.restoreDownloaderState();\n\n // restart from where we left off\n const runningInfo = this.#run(downloaderState.files, downloadCommandE2eeData, downloadMetadata.region, downloaderState.state);\n runningInfo.then((di: DownloadInfo) => {\n this.#eventsEngine.emit(TransferDownloadEvent.RecoveredInterruptedDownload, di.initialState);\n });\n return runningInfo;\n }\n\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\n this.#logger.applyDownloadId(downloadId);\n this.#logger.logInfo(`Download recovery requested for ${downloadId}`);\n\n this.#throwIfRunning();\n\n if (!this.#options.downloadTrackingBaseFolder)\n throw new DownloadError(`The download tracking folder is not specified for ${downloadId}`, undefined, DownloadErrorCode.TrackingNotAvailable);\n\n this.#downloadId = downloadId;\n this.#transferId = downloadId.split(`_`)[0]!;\n this.#logger.applyTransferId(this.#transferId);\n\n const downloadMetadata = await DownloadTracker.restoreDownloadMetadata(this.#downloadId!, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n\n const downloadCommandE2eeData = this.createDownloadCommandE2eeDataFromMetadata(downloadMetadata.e2eeData);\n\n this.#downloadTracker = new DownloadTracker(this.#downloadId!, this.#options, this.#fileSystem, this.#eventsEngine, downloadCommandE2eeData, downloadMetadata.region);\n const restoredOptions = await this.#downloadTracker.restoreDownloadOptions();\n\n // just make sure we are running the same config as when the download was last dumped to disk - otherwise things could get out of sync\n this.#options.downloadFolder = restoredOptions.downloadFolder;\n this.#options.downloadTrackingBaseFolder = restoredOptions.downloadTrackingBaseFolder;\n this.#options.maxChunkSize = restoredOptions.maxChunkSize;\n this.#options.checkChunksMd5 = restoredOptions.checkChunksMd5;\n\n // find out from disk the entire list of files, which were in progress and how many chunks have completed already\n const downloaderState = await this.#downloadTracker.restoreDownloaderState();\n\n // restart from where we left off\n const runningInfo = this.#run(downloaderState.files, downloadCommandE2eeData, downloadMetadata.region, downloaderState.state);\n runningInfo.then((di: DownloadInfo) => {\n this.#eventsEngine.emit(TransferDownloadEvent.RecoveredInterruptedDownload, di.initialState);\n });\n return runningInfo;\n }\n\n private createDownloadCommandE2eeDataFromMetadata(metadataE2eeData?: DownloadTrackingMetadataE2eeData): DownloadCommandE2eeData | undefined {\n if (!metadataE2eeData)\n return undefined;\n\n return {\n iv: Buffer.from(metadataE2eeData.ivAsHex, `hex`),\n key: Buffer.from(metadataE2eeData.keyAsHex, `hex`),\n };\n }\n\n async cleanupDownload(downloadId: string | null = null) {\n const cleanupDownloadId = downloadId ?? this.#downloadId;\n\n if (!cleanupDownloadId)\n throw new DownloadError(`Cannot cleanup unknown download`);\n\n if (!this.#options.downloadTrackingBaseFolder)\n throw new DownloadError(`The download tracking folder is not specified for download ${cleanupDownloadId}`);\n\n this.#logger.applyDownloadId(cleanupDownloadId);\n\n await DownloadTracker.removeDownloadTrackingFolder(cleanupDownloadId, this.#options.downloadTrackingBaseFolder, this.#fileSystem);\n }\n\n async #downloadZipped(transfer: GetTransferResponse, e2eeDataOrTextKey?: DownloadCommandE2eeData | string): Promise<DownloadInfo> {\n const fsClient = this.#fileserverClientFactory.createFileServerTcpDownloadClient(transfer.compressedfileurl!, null, null, transfer.id, ``, this.#options);\n const metaData = await fsClient.getCompressedFileMetadata();\n\n // for now fileservers are not able to validate md5 for chunks of the zip\n // note: this should be rather handled in files downloader logic\n this.#options.checkChunksMd5 = false;\n\n const zipFile: TransferFileDto = {\n downloadurl: transfer.compressedfileurl!,\n fileid: UrlUtil.getQueryStringFromUrl(transfer.compressedfileurl!).compressedfilekey!,\n filename: metaData.fileName,\n filesize: metaData.fileSize,\n compressed: true,\n };\n\n return this.#download(transfer, [zipFile], e2eeDataOrTextKey);\n }\n\n async #download(transfer: GetTransferResponse, files: Array<TransferFileDto>, e2eeDataOrTextKey?: DownloadCommandE2eeData | string): Promise<DownloadInfo> {\n this.#transferId = transfer.id;\n this.#downloadId = this.#generateDownloadId();\n\n this.#logger.applyDownloadId(this.#downloadId);\n this.#logger.applyTransferId(this.#transferId);\n\n if (this.#options.downloadFolderTemplate)\n this.#options.downloadFolder = DownloadFolderResolver.prepareDownloadFolder(this.#options.downloadFolderTemplate!, transfer);\n\n const e2eeData = await this.#getE2eeDataOrThrow(transfer, e2eeDataOrTextKey);\n\n const downloadFiles = this.#mapTransferFilesDtosToFileInfos(files);\n const preparer = new FilesPreparer(this.#options.downloadFolder!, this.#options.maxChunkSize, this.#fileSystem);\n preparer.prepareFiles(downloadFiles);\n\n return this.#run(downloadFiles, e2eeData, transfer.region);\n }\n\n async #getE2eeDataOrThrow(transfer: GetTransferResponse, e2eeDataOrTextKey?: string | DownloadCommandE2eeData): Promise<DownloadCommandE2eeData | undefined> {\n if (!transfer.e2ee)\n return undefined;\n\n if (!e2eeDataOrTextKey)\n throw new DownloadError(`No E2EE data or text key available to decrypt the transfer`);\n\n if (typeof e2eeDataOrTextKey === `object`)\n return e2eeDataOrTextKey;\n\n if (!transfer.e2ee_keyhash)\n throw new DownloadError(`No E2EE db data available to decrypt the transfer`);\n\n const e2eeDbDataBuffer = Buffer.from(transfer.e2ee_keyhash, `hex`);\n\n const iv = e2eeDbDataBuffer.subarray(0, 16);\n const salt = e2eeDbDataBuffer.subarray(16, 32);\n const key = await this.#cryptography.deriveKey(e2eeDataOrTextKey, salt);\n\n return { iv, key: Buffer.from(key) };\n }\n\n async #run(downloadFiles: Array<DownloadFileInfo>, e2eeData?: DownloadCommandE2eeData, region?: string, restoredState?: DownloaderRestoredState): Promise<DownloadInfo> {\n if (!this.#transferId)\n throw new DownloadError(`This downloader has no transfer ID specified`);\n\n if (!this.#downloadId)\n throw new DownloadError(`This downloader has no download ID initialized`);\n\n this.#filesDownloader = new FilesDownloader(\n this.#logger,\n this.#transferId!,\n this.#trackId,\n this.#downloadId!,\n region,\n downloadFiles,\n restoredState,\n this.#fileSystem,\n new TransferConcurrencyController(this.#options.parallelChunks!),\n this.#eventsEngine,\n this.#cryptography,\n this.#options,\n this.#apiClient,\n this.#fileserverClientFactory,\n this.#chunkProviderFactory,\n this.#downloadRegistrationMode,\n e2eeData,\n );\n\n if (this.#options.downloadTrackingBaseFolder) {\n if (!this.#downloadTracker)\n this.#downloadTracker = new DownloadTracker(this.#downloadId!, this.#options, this.#fileSystem, this.#eventsEngine, e2eeData, region);\n\n await this.#downloadTracker.start(downloadFiles);\n }\n\n const initialState = this.#filesDownloader.getCurrentState(false);\n\n this.#healthMonitor.start();\n\n const completion = this.#filesDownloader.start();\n\n completion.finally(() => {\n this.#healthMonitor.stop();\n });\n\n return { downloadId: this.#downloadId!, transferId: this.#transferId!, completion, initialState };\n }\n\n async #getEffectiveTransfer(command: DownloadCommand, fileslimit: number) {\n let effectiveTransfer: GetTransferResponse | null = null;\n\n if (command.transfer)\n effectiveTransfer = await this.#fetchTransfer(command.transfer, undefined, command.password, fileslimit, command.checkLogintoken);\n\n if (!effectiveTransfer) {\n // still don't know the transfer - must use track ID to fetch it\n if (!this.#trackId)\n throw new DownloadError(`Could not resolve transfer to be downloaded - missing transfer info and missing track id`);\n\n effectiveTransfer = await this.#fetchTransfer(undefined, this.#trackId!, command.password, fileslimit, command.checkLogintoken);\n }\n\n if (!effectiveTransfer)\n throw new DownloadError(`Could not resolve transfer to be downloaded - transfer=${command.transfer} track=${command.trackId}`);\n\n if (effectiveTransfer.isexpired === true)\n throw new DownloadError(`Transfer is expired transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.TransferExpired);\n\n if (effectiveTransfer.blockdownloads === true)\n throw new DownloadError(`Transfer has downloads disabled transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.DownloadsDisabled);\n\n if (fileslimit !== 0 && (!effectiveTransfer.files || effectiveTransfer.files.length === 0))\n throw new DownloadError(`Transfer has no files to download transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.NoFilesToDownload);\n\n return effectiveTransfer;\n }\n\n async #fetchTransfer(\n transferid?: string | undefined,\n trackid?: string | undefined,\n password?: string | undefined,\n fileslimit?: number | undefined,\n checkLogintoken?: boolean,\n ): Promise<GetTransferResponse> {\n try {\n // specifying which file properties we want to get from API\n // reason: api adds lots of other unnecessary properties - downloader doesn't need them and if a transfer has lots of files (some can be up to 100k)\n // it makes the response much smaller (up to 80% size reduction)\n const request: GetTransferRequest = { fileslimit, transferid, trackid, password, fprops: [`fileid`, `filesize`, `filename`, `downloadurl`], checkLogintoken };\n return await this.#apiClient.getTransfer(request);\n }\n catch (error) {\n const code = this.#apiErrorToDownloadErrorCode(error);\n const downloadError = new DownloadError(`Could not fetch transfer by id=${transferid ?? `---`} track=${trackid ?? `---`}`, { cause: error as Error }, code);\n throw downloadError;\n }\n }\n\n #apiErrorToDownloadErrorCode(error: unknown) {\n if (error instanceof ApiError) {\n switch (error.httpStatus) {\n case 401: return DownloadErrorCode.InvalidTransferPassword;\n case 404: return DownloadErrorCode.TransferNotFound;\n case 409: return DownloadErrorCode.TransferInvalidState;\n default: break;\n }\n }\n return undefined;\n }\n\n #throwIfRunning() {\n if (this.#filesDownloader)\n throw new DownloadError(`This instance of downloader is already in use. Please create a new one.`);\n }\n\n #throwIfNotRunning() {\n if (!this.#filesDownloader)\n throw new DownloadError(`This instance of downloader is not running yet. Please start the download first.`);\n }\n\n #generateDownloadId(): string {\n return `${this.#transferId}_${this.#cryptography.generateRandomString(10)}`;\n }\n\n #mapTransferFilesDtosToFileInfos(files: Array<TransferFileDto>) {\n return files.map(file => new DownloadFileInfo(\n file.fileid,\n file.downloadurl,\n file.filename,\n file.filesize,\n ));\n }\n\n #validateOptions() {\n if (!this.#options.downloadFolder && !this.#options.downloadFolderTemplate)\n throw new DownloadError(`downloadFolder OR downloadFolderTemplate is required`);\n\n if (this.#options.maxChunkSize !== null && this.#options.maxChunkSize! <= 0)\n throw new DownloadError(`maxChunkSize must be greater than 0. Provide \"null\" if you want to download without chunking.`);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeTransferDownloader.js","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as guid } from 'uuid';\r\nimport throttle from \"lodash.throttle\";\r\n\r\nimport DownloadOptions from \"../../../downloader/downloadOptions.js\";\r\nimport DownloaderCore from \"../downloaderCore.js\";\r\nimport TransferDownloadEvent from \"../../../downloader/dtos/downloadEvent.js\";\r\nimport NodeFileServerClientFactory from \"../../../utils/api/node/nodeFileServerClientFactory.js\";\r\nimport NodeChunkStreamProviderFactory from \"../../../utils/fileSystem/node/nodeChunkStreamProviderFactory.js\";\r\nimport NodeFileSystemService from \"../../../utils/fileSystem/node/nodeFileSystemService.js\";\r\nimport NodeApiClient from \"../../../utils/api/node/nodeApiClient.js\";\r\nimport NodeEventsEngine from '../../../utils/events/node/nodeEventsEngine.js';\r\nimport DownloadLogger from \"../../../downloader/downloadLogger.js\";\r\nimport NodeCryptographyProvider from '../../../utils/crypto/node/nodeCryptographyProvider.js';\r\nimport TransferDownloaderHealthMonitor from '../../healthMonitor/transferDownloaderHealthMonitor.js';\r\nimport logHealthyStatus from '../../loggers/utils/logHealthyStatus.js';\r\nimport NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';\r\nimport TransferHealthMonitorEvent from '../../healthMonitor/events/transferHealthMonitorEvent.js';\r\nimport logEventPropertyName from '../../../utils/logging/logEventPropertyNames.js';\r\n\r\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\r\nimport type TransferDownloader from \"../transferDownloader.js\";\r\nimport type DownloadEventArgs from '../../../downloader/eventArgs/downloadEventArgs.js';\r\nimport type FileDownloadEventArgs from '../../../downloader/eventArgs/fileDownloadEventArgs.js';\r\nimport type FileDownloadFailedEventArgs from '../../../downloader/eventArgs/fileDownloadFailedEventArgs.js';\r\nimport type TransferStatus from '../../../utils/types/transferStatus.js';\r\nimport type ChunkDownloadEventArgs from '../../../downloader/eventArgs/chunkDownloadEventArgs.js';\r\nimport type ChunkDownloadFailedEventArgs from '../../../downloader/eventArgs/chunkDownloadFailedEventArgs.js';\r\nimport type DownloadCompletedEventArgs from '../../../downloader/eventArgs/downloadCompletedEventArgs.js';\r\nimport type DownloadPauseEventArgs from \"../../../downloader/eventArgs/downloadPauseEventArgs.js\";\r\nimport type Logger from \"../../loggers/logger.js\";\r\nimport type DownloadInfo from \"../../../downloader/dtos/downloadInfo.js\";\r\nimport type DownloadCommand from \"../../../downloader/dtos/downloadCommand.js\";\r\nimport type DownloadFilesCommand from \"../../../downloader/dtos/downloadFilesCommand.js\";\r\nimport type DownloadTrackingFailedEventArgs from \"../../../downloader/eventArgs/downloadTrackingFailedEventArgs.js\";\r\nimport type DownloadMetadataDeterminedEventArgs from '../../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js';\r\n\r\nexport default class NodeTransferDownloader implements TransferDownloader {\r\n readonly #eventsEngine: NodeEventsEngine;\r\n readonly #downloader: DownloaderCore;\r\n readonly #logger: DownloadLogger;\r\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\r\n readonly #trackingId: string | number;\r\n\r\n #isHealthy = true;\r\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\r\n\r\n constructor(options: DownloadOptions, envValues: EnvironmentVariables, logger: Logger) {\r\n const optionsResolved = this.#buildOptions(options);\r\n\r\n const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, optionsResolved.apiRequestTotalTimeoutInMs, optionsResolved.apiRetryLimit);\r\n if (optionsResolved.logintoken)\r\n apiClient.setLoginToken(optionsResolved.logintoken);\r\n\r\n const chunkProvider = new NodeChunkStreamProviderFactory();\r\n const fileserverClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, optionsResolved.fileserverDownloadIdleTimeMs!, optionsResolved.fileserverAttemptLimit!);\r\n const fileSystem = new NodeFileSystemService();\r\n const cryptography = new NodeCryptographyProvider();\r\n\r\n this.#logger = new DownloadLogger(logger, optionsResolved.trackingId!);\r\n this.#eventsEngine = new NodeEventsEngine();\r\n this.#healthMonitor = new TransferDownloaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), this.#eventsEngine);\r\n this.#trackingId = optionsResolved.trackingId!;\r\n\r\n this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient, chunkProvider, fileserverClientFactory, fileSystem, this.#eventsEngine, cryptography, this.#healthMonitor);\r\n\r\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\r\n\r\n this.addHealthMonitorEventListeners();\r\n this.addTransferEventListeners();\r\n }\r\n\r\n private addHealthMonitorEventListeners() {\r\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\r\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\r\n\r\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, logEntryMetadata);\r\n\r\n if (!this.#isHealthy)\r\n logHealthyStatus(this.#logger, true, eventArgs, logEntryMetadata);\r\n\r\n this.#isHealthy = true;\r\n });\r\n\r\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {\r\n if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)\r\n return;\r\n\r\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\r\n\r\n this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, logEntryMetadata);\r\n\r\n if (this.#isHealthy)\r\n logHealthyStatus(this.#logger, false, eventArgs, logEntryMetadata);\r\n\r\n this.#isHealthy = false;\r\n });\r\n }\r\n\r\n private getHealthStatusLogEntryMetadata(): Record<string, unknown> {\r\n const metadata: Record<string, unknown> = {\r\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\r\n };\r\n\r\n const state = this.#downloader.state;\r\n\r\n if (state?.transferId)\r\n metadata[logEventPropertyName.TransferIdPropertyName] = state.transferId;\r\n\r\n if (state?.downloadId)\r\n metadata[logEventPropertyName.DownloadIdPropertyName] = state.downloadId;\r\n\r\n return metadata;\r\n }\r\n\r\n private addTransferEventListeners() {\r\n this.addEventListener(TransferDownloadEvent.DownloadStarted, args => {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { files, ...downloadInfoWithoutFiles } = args;\r\n this.#logger.logInfo(`Download started`, downloadInfoWithoutFiles);\r\n });\r\n this.addEventListener(TransferDownloadEvent.Aborting, args => this.#logger.logInfo(`Download aborting ${args.transferId} / ${args.downloadId}`));\r\n this.addEventListener(TransferDownloadEvent.Aborted, args => this.#logger.logInfo(`Download aborted ${args.transferId} / ${args.downloadId}`));\r\n this.addEventListener(TransferDownloadEvent.Pausing, args => this.#logger.logInfo(`Download pausing ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\r\n this.addEventListener(TransferDownloadEvent.Paused, args => this.#logger.logInfo(`Download paused ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\r\n this.addEventListener(TransferDownloadEvent.RecoveredInterruptedDownload, args => this.#logger.logInfo(`Download recovered ${args.transferId} / ${args.downloadId}`));\r\n this.addEventListener(TransferDownloadEvent.DownloadCompleted, args => {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { files, ...downloadInfoWithoutFiles } = args;\r\n this.#logger.logInfo(`Download completed`, downloadInfoWithoutFiles);\r\n });\r\n this.addEventListener(TransferDownloadEvent.FileDownloadStarted, args => this.#logger.logDebug(`File download started`, args));\r\n this.addEventListener(TransferDownloadEvent.FileDownloadCompleted, args => this.#logger.logDebug(`File download completed`, args));\r\n this.addEventListener(TransferDownloadEvent.FileDownloadFailed, args => {\r\n const { reason, ...errorInfoWithoutException } = args;\r\n this.#logger.logError(reason, `File download failed`, errorInfoWithoutException);\r\n });\r\n this.addEventListener(TransferDownloadEvent.DownloadTrackingFailed, args => {\r\n const { error, ...errorInfoWithoutException } = args;\r\n if (error)\r\n this.#logger.logError(error, `Progress tracking failed`, errorInfoWithoutException);\r\n else\r\n this.#logger.logWarning(`Progress tracking failed`, errorInfoWithoutException);\r\n });\r\n }\r\n\r\n #buildOptions(options: DownloadOptions) {\r\n const opts = { ...new DownloadOptions(), ...options };\r\n if (!opts.trackingId)\r\n opts.trackingId = guid();\r\n return opts;\r\n }\r\n\r\n get status(): TransferStatus | null {\r\n return this.#downloader.status;\r\n }\r\n\r\n get state(): DownloadEventArgs | null {\r\n return this.#downloader.state;\r\n }\r\n\r\n get downloadId(): string | undefined {\r\n return this.#downloader.downloadId;\r\n }\r\n\r\n get healthMonitor(): TransferDownloaderHealthMonitor {\r\n return this.#healthMonitor;\r\n }\r\n\r\n async pause(): Promise<boolean> {\r\n return await this.#downloader.pause({ interruptPendingChunks: false });\r\n }\r\n\r\n async stop(): Promise<boolean> {\r\n return await this.#downloader.pause({ interruptPendingChunks: true });\r\n }\r\n\r\n resume(): boolean {\r\n return this.#downloader.resume();\r\n }\r\n\r\n abort(): boolean {\r\n return this.#downloader.abort();\r\n }\r\n\r\n addEventListener(eventName:\r\n TransferDownloadEvent.Aborting |\r\n TransferDownloadEvent.Aborted |\r\n TransferDownloadEvent.Resumed |\r\n TransferDownloadEvent.RecoveredInterruptedDownload |\r\n TransferDownloadEvent.DownloadStarted |\r\n TransferDownloadEvent.DownloadProgressed, handler: (args: DownloadEventArgs) => void): void\r\n\r\n addEventListener(eventName: TransferDownloadEvent.DownloadCompleted, handler: (args: DownloadCompletedEventArgs) => void): void\r\n addEventListener(eventName: TransferDownloadEvent.Pausing | TransferDownloadEvent.Paused, handler: (args: DownloadPauseEventArgs) => void): void\r\n addEventListener(eventName: TransferDownloadEvent.NetworkFailure | TransferDownloadEvent.NetworkOk, handler: () => void): void\r\n addEventListener(eventName: TransferDownloadEvent.TransferMetadataDetermined, handler: (args: DownloadMetadataDeterminedEventArgs) => void): void\r\n\r\n addEventListener(eventName:\r\n TransferDownloadEvent.ChunkDownloadStarted |\r\n TransferDownloadEvent.ChunkDownloadProgressed |\r\n TransferDownloadEvent.ChunkDownloadCompleted, handler: (args: ChunkDownloadEventArgs) => void): void;\r\n\r\n addEventListener(eventName: TransferDownloadEvent.ChunkDownloadFailed, handler: (args: ChunkDownloadFailedEventArgs) => void): void\r\n\r\n addEventListener(eventName:\r\n TransferDownloadEvent.PossibleSupersizedFile |\r\n TransferDownloadEvent.FileDownloadStarted |\r\n TransferDownloadEvent.FileDownloadProgressed |\r\n TransferDownloadEvent.FileDownloadCompleting |\r\n TransferDownloadEvent.FileDownloadCompleted, handler: (args: FileDownloadEventArgs) => void): void\r\n\r\n addEventListener(eventName: TransferDownloadEvent.FileDownloadFailed, handler: (args: FileDownloadFailedEventArgs) => void): void\r\n addEventListener(eventName: TransferDownloadEvent.DownloadTrackingFailed, handler: (args: DownloadTrackingFailedEventArgs) => void): void\r\n\r\n addEventListener(eventName: string, handler: (args?: any) => void): void {\r\n this.#eventsEngine.addEventListener(eventName, handler);\r\n }\r\n\r\n private cancelHealthyStatusThrottledMethod(promise: Promise<DownloadInfo>) {\r\n promise.then(downloadInfo => downloadInfo.completion.finally(() => this.#logHealthyStatusThrottled.cancel()));\r\n }\r\n\r\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\r\n const promise = this.#downloader.downloadAllFiles(command);\r\n\r\n this.cancelHealthyStatusThrottledMethod(promise);\r\n\r\n return promise;\r\n }\r\n\r\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\r\n const promise = this.#downloader.downloadAllFilesZipped(command);\r\n\r\n this.cancelHealthyStatusThrottledMethod(promise);\r\n\r\n return promise;\r\n }\r\n\r\n async downloadSpecificFiles(command: DownloadFilesCommand): Promise<DownloadInfo> {\r\n const promise = this.#downloader.downloadSpecificFiles(command);\r\n\r\n this.cancelHealthyStatusThrottledMethod(promise);\r\n\r\n return promise;\r\n }\r\n\r\n async restartFailedDownloader(): Promise<DownloadInfo> {\r\n const promise = this.#downloader.restartFailedDownloader();\r\n\r\n this.cancelHealthyStatusThrottledMethod(promise);\r\n\r\n return promise;\r\n }\r\n\r\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\r\n const promise = this.#downloader.recoverInterruptedDownload(downloadId);\r\n\r\n this.cancelHealthyStatusThrottledMethod(promise);\r\n\r\n return promise;\r\n }\r\n\r\n async cleanupDownload(downloadId: string | null = null) {\r\n await this.#downloader.cleanupDownload(downloadId);\r\n }\r\n}"]}
1
+ {"version":3,"file":"nodeTransferDownloader.js","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as guid } from 'uuid';\nimport throttle from \"lodash.throttle\";\n\nimport DownloadOptions from \"../../../downloader/downloadOptions.js\";\nimport DownloaderCore from \"../downloaderCore.js\";\nimport TransferDownloadEvent from \"../../../downloader/dtos/downloadEvent.js\";\nimport NodeFileServerClientFactory from \"../../../utils/api/node/nodeFileServerClientFactory.js\";\nimport NodeChunkStreamProviderFactory from \"../../../utils/fileSystem/node/nodeChunkStreamProviderFactory.js\";\nimport NodeFileSystemService from \"../../../utils/fileSystem/node/nodeFileSystemService.js\";\nimport NodeApiClient from \"../../../utils/api/node/nodeApiClient.js\";\nimport NodeEventsEngine from '../../../utils/events/node/nodeEventsEngine.js';\nimport DownloadLogger from \"../../../downloader/downloadLogger.js\";\nimport NodeCryptographyProvider from '../../../utils/crypto/node/nodeCryptographyProvider.js';\nimport TransferDownloaderHealthMonitor from '../../healthMonitor/transferDownloaderHealthMonitor.js';\nimport logHealthyStatus from '../../loggers/utils/logHealthyStatus.js';\nimport NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';\nimport TransferHealthMonitorEvent from '../../healthMonitor/events/transferHealthMonitorEvent.js';\nimport logEventPropertyName from '../../../utils/logging/logEventPropertyNames.js';\n\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferDownloader from \"../transferDownloader.js\";\nimport type DownloadEventArgs from '../../../downloader/eventArgs/downloadEventArgs.js';\nimport type FileDownloadEventArgs from '../../../downloader/eventArgs/fileDownloadEventArgs.js';\nimport type FileDownloadFailedEventArgs from '../../../downloader/eventArgs/fileDownloadFailedEventArgs.js';\nimport type TransferStatus from '../../../utils/types/transferStatus.js';\nimport type ChunkDownloadEventArgs from '../../../downloader/eventArgs/chunkDownloadEventArgs.js';\nimport type ChunkDownloadFailedEventArgs from '../../../downloader/eventArgs/chunkDownloadFailedEventArgs.js';\nimport type DownloadCompletedEventArgs from '../../../downloader/eventArgs/downloadCompletedEventArgs.js';\nimport type DownloadPauseEventArgs from \"../../../downloader/eventArgs/downloadPauseEventArgs.js\";\nimport type Logger from \"../../loggers/logger.js\";\nimport type DownloadInfo from \"../../../downloader/dtos/downloadInfo.js\";\nimport type DownloadCommand from \"../../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../../downloader/dtos/downloadFilesCommand.js\";\nimport type DownloadTrackingFailedEventArgs from \"../../../downloader/eventArgs/downloadTrackingFailedEventArgs.js\";\nimport type DownloadMetadataDeterminedEventArgs from '../../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js';\n\nexport default class NodeTransferDownloader implements TransferDownloader {\n readonly #eventsEngine: NodeEventsEngine;\n readonly #downloader: DownloaderCore;\n readonly #logger: DownloadLogger;\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\n readonly #trackingId: string | number;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(options: DownloadOptions, envValues: EnvironmentVariables, logger: Logger) {\n const optionsResolved = this.#buildOptions(options);\n\n const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, optionsResolved.apiRequestTotalTimeoutInMs, optionsResolved.apiRetryLimit);\n if (optionsResolved.logintoken)\n apiClient.setLoginToken(optionsResolved.logintoken);\n\n const chunkProvider = new NodeChunkStreamProviderFactory();\n const fileserverClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, optionsResolved.fileserverDownloadIdleTimeMs!, optionsResolved.fileserverAttemptLimit!);\n const fileSystem = new NodeFileSystemService();\n const cryptography = new NodeCryptographyProvider();\n\n this.#logger = new DownloadLogger(logger, optionsResolved.trackingId!);\n this.#eventsEngine = new NodeEventsEngine();\n this.#healthMonitor = new TransferDownloaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), this.#eventsEngine);\n this.#trackingId = optionsResolved.trackingId!;\n\n this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient, chunkProvider, fileserverClientFactory, fileSystem, this.#eventsEngine, cryptography, this.#healthMonitor);\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\n\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, logEntryMetadata);\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, logEntryMetadata);\n\n this.#isHealthy = true;\n });\n\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {\n if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)\n return;\n\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\n\n this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, logEntryMetadata);\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, logEntryMetadata);\n\n this.#isHealthy = false;\n });\n }\n\n private getHealthStatusLogEntryMetadata(): Record<string, unknown> {\n const metadata: Record<string, unknown> = {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n };\n\n const state = this.#downloader.state;\n\n if (state?.transferId)\n metadata[logEventPropertyName.TransferIdPropertyName] = state.transferId;\n\n if (state?.downloadId)\n metadata[logEventPropertyName.DownloadIdPropertyName] = state.downloadId;\n\n return metadata;\n }\n\n private addTransferEventListeners() {\n this.addEventListener(TransferDownloadEvent.DownloadStarted, args => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download started`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.Aborting, args => this.#logger.logInfo(`Download aborting ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Aborted, args => this.#logger.logInfo(`Download aborted ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Pausing, args => this.#logger.logInfo(`Download pausing ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.Paused, args => this.#logger.logInfo(`Download paused ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.RecoveredInterruptedDownload, args => this.#logger.logInfo(`Download recovered ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.DownloadCompleted, args => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download completed`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.FileDownloadStarted, args => this.#logger.logDebug(`File download started`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadCompleted, args => this.#logger.logDebug(`File download completed`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadFailed, args => {\n const { reason, ...errorInfoWithoutException } = args;\n this.#logger.logError(reason, `File download failed`, errorInfoWithoutException);\n });\n this.addEventListener(TransferDownloadEvent.DownloadTrackingFailed, args => {\n const { error, ...errorInfoWithoutException } = args;\n if (error)\n this.#logger.logError(error, `Progress tracking failed`, errorInfoWithoutException);\n else\n this.#logger.logWarning(`Progress tracking failed`, errorInfoWithoutException);\n });\n }\n\n #buildOptions(options: DownloadOptions) {\n const opts = { ...new DownloadOptions(), ...options };\n if (!opts.trackingId)\n opts.trackingId = guid();\n return opts;\n }\n\n get status(): TransferStatus | null {\n return this.#downloader.status;\n }\n\n get state(): DownloadEventArgs | null {\n return this.#downloader.state;\n }\n\n get downloadId(): string | undefined {\n return this.#downloader.downloadId;\n }\n\n get healthMonitor(): TransferDownloaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n async pause(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: false });\n }\n\n async stop(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: true });\n }\n\n resume(): boolean {\n return this.#downloader.resume();\n }\n\n abort(): boolean {\n return this.#downloader.abort();\n }\n\n addEventListener(eventName:\n TransferDownloadEvent.Aborting |\n TransferDownloadEvent.Aborted |\n TransferDownloadEvent.Resumed |\n TransferDownloadEvent.RecoveredInterruptedDownload |\n TransferDownloadEvent.DownloadStarted |\n TransferDownloadEvent.DownloadProgressed, handler: (args: DownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.DownloadCompleted, handler: (args: DownloadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.Pausing | TransferDownloadEvent.Paused, handler: (args: DownloadPauseEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.NetworkFailure | TransferDownloadEvent.NetworkOk, handler: () => void): void\n addEventListener(eventName: TransferDownloadEvent.TransferMetadataDetermined, handler: (args: DownloadMetadataDeterminedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.ChunkDownloadStarted |\n TransferDownloadEvent.ChunkDownloadProgressed |\n TransferDownloadEvent.ChunkDownloadCompleted, handler: (args: ChunkDownloadEventArgs) => void): void;\n\n addEventListener(eventName: TransferDownloadEvent.ChunkDownloadFailed, handler: (args: ChunkDownloadFailedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.PossibleSupersizedFile |\n TransferDownloadEvent.FileDownloadStarted |\n TransferDownloadEvent.FileDownloadProgressed |\n TransferDownloadEvent.FileDownloadCompleting |\n TransferDownloadEvent.FileDownloadCompleted, handler: (args: FileDownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.FileDownloadFailed, handler: (args: FileDownloadFailedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.DownloadTrackingFailed, handler: (args: DownloadTrackingFailedEventArgs) => void): void\n\n addEventListener(eventName: string, handler: (args?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n private cancelHealthyStatusThrottledMethod(promise: Promise<DownloadInfo>) {\n promise.then(downloadInfo => downloadInfo.completion.finally(() => this.#logHealthyStatusThrottled.cancel()));\n }\n\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFilesZipped(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadSpecificFiles(command: DownloadFilesCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadSpecificFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async restartFailedDownloader(): Promise<DownloadInfo> {\n const promise = this.#downloader.restartFailedDownloader();\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\n const promise = this.#downloader.recoverInterruptedDownload(downloadId);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async cleanupDownload(downloadId: string | null = null) {\n await this.#downloader.cleanupDownload(downloadId);\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transferDownloader.js","sourceRoot":"","sources":["../../../../src/client/downloader/transferDownloader.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkDownloadEventArgs from \"../../downloader/eventArgs/chunkDownloadEventArgs.js\";\r\nimport type ChunkDownloadFailedEventArgs from \"../../downloader/eventArgs/chunkDownloadFailedEventArgs.js\";\r\nimport type FileDownloadEventArgs from \"../../downloader/eventArgs/fileDownloadEventArgs.js\";\r\nimport type FileDownloadFailedEventArgs from \"../../downloader/eventArgs/fileDownloadFailedEventArgs.js\";\r\n\r\nimport type DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\r\nimport type DownloadPauseEventArgs from \"../../downloader/eventArgs/downloadPauseEventArgs.js\";\r\nimport type DownloadCompletedEventArgs from \"../../downloader/eventArgs/downloadCompletedEventArgs.js\";\r\n\r\nimport type TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\r\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\r\nimport type DownloadCommand from \"../../downloader/dtos/downloadCommand.js\";\r\nimport type DownloadFilesCommand from \"../../downloader/dtos/downloadFilesCommand.js\";\r\nimport type TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport type DownloadMetadataDeterminedEventArgs from \"../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js\";\r\nimport type TransferDownloaderHealthMonitor from \"../healthMonitor/transferDownloaderHealthMonitor.js\";\r\n\r\ninterface TransferDownloader {\r\n\r\n get status(): TransferStatus | null;\r\n get state(): DownloadEventArgs | null;\r\n get downloadId(): string | undefined;\r\n get healthMonitor(): TransferDownloaderHealthMonitor;\r\n\r\n addEventListener(eventName:\r\n TransferDownloadEvent.Aborting |\r\n TransferDownloadEvent.Aborted |\r\n TransferDownloadEvent.Resumed |\r\n TransferDownloadEvent.RecoveredInterruptedDownload |\r\n TransferDownloadEvent.DownloadStarted |\r\n TransferDownloadEvent.DownloadProgressed, handler: (args: DownloadEventArgs) => void): void\r\n\r\n addEventListener(eventName: TransferDownloadEvent.DownloadCompleted, handler: (args: DownloadCompletedEventArgs) => void): void\r\n addEventListener(eventName: TransferDownloadEvent.Pausing | TransferDownloadEvent.Paused, handler: (args: DownloadPauseEventArgs) => void): void\r\n addEventListener(eventName: TransferDownloadEvent.NetworkFailure | TransferDownloadEvent.NetworkOk, handler: () => void): void\r\n addEventListener(eventName: TransferDownloadEvent.TransferMetadataDetermined, handler: (args: DownloadMetadataDeterminedEventArgs) => void): void\r\n\r\n addEventListener(eventName:\r\n TransferDownloadEvent.ChunkDownloadStarted |\r\n TransferDownloadEvent.ChunkDownloadProgressed |\r\n TransferDownloadEvent.ChunkDownloadCompleted, handler: (args: ChunkDownloadEventArgs) => void): void;\r\n\r\n addEventListener(eventName: TransferDownloadEvent.ChunkDownloadFailed, handler: (args: ChunkDownloadFailedEventArgs) => void): void\r\n\r\n addEventListener(eventName:\r\n TransferDownloadEvent.PossibleSupersizedFile |\r\n TransferDownloadEvent.FileDownloadStarted |\r\n TransferDownloadEvent.FileDownloadProgressed |\r\n TransferDownloadEvent.FileDownloadCompleting |\r\n TransferDownloadEvent.FileDownloadCompleted, handler: (args: FileDownloadEventArgs) => void): void\r\n\r\n addEventListener(eventName: TransferDownloadEvent.FileDownloadFailed, handler: (args: FileDownloadFailedEventArgs) => void): void\r\n\r\n recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo>\r\n\r\n downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo>\r\n downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo>\r\n downloadSpecificFiles(command: DownloadFilesCommand): Promise<DownloadInfo>\r\n\r\n // downloadAllFilesZipped(transferId: string, downloadPath: string): Promise<void>\r\n // downloadTorrentFile(transferId: string, downloadPath: string): Promise<void>\r\n\r\n /**\r\n * Lets pending chunks continue until all are complete, then pauses further processing, keeps tracking information intact.\r\n * It will take a few seconds to pause a download due to wait on pending chunks.\r\n * Emits {@link TransferDownloadEvent.Pausing} event when method is called and {@link TransferDownloadEvent.Paused} event when all pending chunks complete and processing is paused.\r\n * Both events emit an event argument indicating that pending chunks will not be interrupted. See {@link DownloadPauseEventArgs}.\r\n * Downloader will end up in {@link TransferStatus.Paused} state.\r\n */\r\n pause(): Promise<boolean>\r\n /**\r\n * Immediately cancels pending chunks, pauses processing.\r\n * Emits {@link TransferDownloadEvent.Pausing} event on method call and then and then {@link TransferDownloadEvent.Paused} event when processing is stopped.\r\n * Both events emit an event argument indicating that pending chunks will be interrupted. See {@link DownloadPauseEventArgs}.\r\n * Downloader will end up in {@link TransferStatus.Paused} state.\r\n */\r\n stop(): Promise<boolean>\r\n /**\r\n * Resumes paused or stopped download based on tracking information stored locally.\r\n */\r\n resume(): void\r\n /**\r\n * Immediately cancels pending chunks, stops further processing, cleans up download data (optionally via config), cleans up tracking data.\r\n * Emits {@link TransferDownloadEvent.Aborting} and {@link TransferDownloadEvent.Aborted} events.\r\n * Downloader will end up in {@link TransferStatus.Aborted} state.\r\n */\r\n abort(): boolean\r\n\r\n cleanupDownload(downloadId: string | null): Promise<void>\r\n}\r\n\r\nexport default TransferDownloader;"]}
1
+ {"version":3,"file":"transferDownloader.js","sourceRoot":"","sources":["../../../../src/client/downloader/transferDownloader.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkDownloadEventArgs from \"../../downloader/eventArgs/chunkDownloadEventArgs.js\";\nimport type ChunkDownloadFailedEventArgs from \"../../downloader/eventArgs/chunkDownloadFailedEventArgs.js\";\nimport type FileDownloadEventArgs from \"../../downloader/eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"../../downloader/eventArgs/fileDownloadFailedEventArgs.js\";\n\nimport type DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\nimport type DownloadPauseEventArgs from \"../../downloader/eventArgs/downloadPauseEventArgs.js\";\nimport type DownloadCompletedEventArgs from \"../../downloader/eventArgs/downloadCompletedEventArgs.js\";\n\nimport type TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\nimport type DownloadInfo from \"../../downloader/dtos/downloadInfo.js\";\nimport type DownloadCommand from \"../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../downloader/dtos/downloadFilesCommand.js\";\nimport type TransferStatus from \"../../utils/types/transferStatus.js\";\nimport type DownloadMetadataDeterminedEventArgs from \"../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js\";\nimport type TransferDownloaderHealthMonitor from \"../healthMonitor/transferDownloaderHealthMonitor.js\";\n\ninterface TransferDownloader {\n\n get status(): TransferStatus | null;\n get state(): DownloadEventArgs | null;\n get downloadId(): string | undefined;\n get healthMonitor(): TransferDownloaderHealthMonitor;\n\n addEventListener(eventName:\n TransferDownloadEvent.Aborting |\n TransferDownloadEvent.Aborted |\n TransferDownloadEvent.Resumed |\n TransferDownloadEvent.RecoveredInterruptedDownload |\n TransferDownloadEvent.DownloadStarted |\n TransferDownloadEvent.DownloadProgressed, handler: (args: DownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.DownloadCompleted, handler: (args: DownloadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.Pausing | TransferDownloadEvent.Paused, handler: (args: DownloadPauseEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.NetworkFailure | TransferDownloadEvent.NetworkOk, handler: () => void): void\n addEventListener(eventName: TransferDownloadEvent.TransferMetadataDetermined, handler: (args: DownloadMetadataDeterminedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.ChunkDownloadStarted |\n TransferDownloadEvent.ChunkDownloadProgressed |\n TransferDownloadEvent.ChunkDownloadCompleted, handler: (args: ChunkDownloadEventArgs) => void): void;\n\n addEventListener(eventName: TransferDownloadEvent.ChunkDownloadFailed, handler: (args: ChunkDownloadFailedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.PossibleSupersizedFile |\n TransferDownloadEvent.FileDownloadStarted |\n TransferDownloadEvent.FileDownloadProgressed |\n TransferDownloadEvent.FileDownloadCompleting |\n TransferDownloadEvent.FileDownloadCompleted, handler: (args: FileDownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.FileDownloadFailed, handler: (args: FileDownloadFailedEventArgs) => void): void\n\n recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo>\n\n downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo>\n downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo>\n downloadSpecificFiles(command: DownloadFilesCommand): Promise<DownloadInfo>\n\n // downloadAllFilesZipped(transferId: string, downloadPath: string): Promise<void>\n // downloadTorrentFile(transferId: string, downloadPath: string): Promise<void>\n\n /**\n * Lets pending chunks continue until all are complete, then pauses further processing, keeps tracking information intact.\n * It will take a few seconds to pause a download due to wait on pending chunks.\n * Emits {@link TransferDownloadEvent.Pausing} event when method is called and {@link TransferDownloadEvent.Paused} event when all pending chunks complete and processing is paused.\n * Both events emit an event argument indicating that pending chunks will not be interrupted. See {@link DownloadPauseEventArgs}.\n * Downloader will end up in {@link TransferStatus.Paused} state.\n */\n pause(): Promise<boolean>\n /**\n * Immediately cancels pending chunks, pauses processing.\n * Emits {@link TransferDownloadEvent.Pausing} event on method call and then and then {@link TransferDownloadEvent.Paused} event when processing is stopped.\n * Both events emit an event argument indicating that pending chunks will be interrupted. See {@link DownloadPauseEventArgs}.\n * Downloader will end up in {@link TransferStatus.Paused} state.\n */\n stop(): Promise<boolean>\n /**\n * Resumes paused or stopped download based on tracking information stored locally.\n */\n resume(): void\n /**\n * Immediately cancels pending chunks, stops further processing, cleans up download data (optionally via config), cleans up tracking data.\n * Emits {@link TransferDownloadEvent.Aborting} and {@link TransferDownloadEvent.Aborted} events.\n * Downloader will end up in {@link TransferStatus.Aborted} state.\n */\n abort(): boolean\n\n cleanupDownload(downloadId: string | null): Promise<void>\n}\n\nexport default TransferDownloader;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"environmentVariables.js","sourceRoot":"","sources":["../../../src/client/environmentVariables.ts"],"names":[],"mappings":"","sourcesContent":["interface EnvironmentVariables {\r\n apiBaseUrl: string,\r\n source: string,\r\n sourceDetails: string\r\n}\r\n\r\nexport default EnvironmentVariables;"]}
1
+ {"version":3,"file":"environmentVariables.js","sourceRoot":"","sources":["../../../src/client/environmentVariables.ts"],"names":[],"mappings":"","sourcesContent":["interface EnvironmentVariables {\n apiBaseUrl: string,\n source: string,\n sourceDetails: string\n}\n\nexport default EnvironmentVariables;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"healthMonitorHealthyEventArgs.js","sourceRoot":"","sources":["../../../../../../src/client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface HealthMonitorHealthyEventArgs {\r\n transferredBytesTotalCount: number | undefined;\r\n progressInPercentage: number | undefined;\r\n remainingSeconds: number | undefined;\r\n averageSpeedInBytesPerSecond: number | undefined;\r\n currentSpeedInBytesPerSecond: number | undefined;\r\n}\r\n\r\nexport default HealthMonitorHealthyEventArgs;"]}
1
+ {"version":3,"file":"healthMonitorHealthyEventArgs.js","sourceRoot":"","sources":["../../../../../../src/client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface HealthMonitorHealthyEventArgs {\n transferredBytesTotalCount: number | undefined;\n progressInPercentage: number | undefined;\n remainingSeconds: number | undefined;\n averageSpeedInBytesPerSecond: number | undefined;\n currentSpeedInBytesPerSecond: number | undefined;\n}\n\nexport default HealthMonitorHealthyEventArgs;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"healthMonitorUnhealthyEventArgs.js","sourceRoot":"","sources":["../../../../../../src/client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface HealthMonitorUnhealthyEventArgs {\r\n reason: HealthMonitorUnhealthyEventArgsReason,\r\n transferredBytesTotalCount?: number;\r\n progressInPercentage?: number;\r\n remainingSeconds?: number;\r\n averageSpeedInBytesPerSecond?: number;\r\n currentSpeedInBytesPerSecond?: number;\r\n}\r\n\r\nexport interface HealthMonitorUnhealthyEventArgsReason {\r\n internet: HealthMonitorUnhealthyEventArgsReasonValue,\r\n api: HealthMonitorUnhealthyEventArgsReasonValue,\r\n fileServer: HealthMonitorUnhealthyEventArgsReasonValue,\r\n}\r\n\r\nexport interface HealthMonitorUnhealthyEventArgsReasonValue {\r\n status: `Checking` | `Ok` | `Error` | `Unknown`\r\n error?: Error,\r\n}\r\n\r\nexport default HealthMonitorUnhealthyEventArgs;"]}
1
+ {"version":3,"file":"healthMonitorUnhealthyEventArgs.js","sourceRoot":"","sources":["../../../../../../src/client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface HealthMonitorUnhealthyEventArgs {\n reason: HealthMonitorUnhealthyEventArgsReason,\n transferredBytesTotalCount?: number;\n progressInPercentage?: number;\n remainingSeconds?: number;\n averageSpeedInBytesPerSecond?: number;\n currentSpeedInBytesPerSecond?: number;\n}\n\nexport interface HealthMonitorUnhealthyEventArgsReason {\n internet: HealthMonitorUnhealthyEventArgsReasonValue,\n api: HealthMonitorUnhealthyEventArgsReasonValue,\n fileServer: HealthMonitorUnhealthyEventArgsReasonValue,\n}\n\nexport interface HealthMonitorUnhealthyEventArgsReasonValue {\n status: `Checking` | `Ok` | `Error` | `Unknown`\n error?: Error,\n}\n\nexport default HealthMonitorUnhealthyEventArgs;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transferHealthMonitorEvent.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/events/transferHealthMonitorEvent.ts"],"names":[],"mappings":"AAAA,IAAK,0BAGJ;AAHD,WAAK,0BAA0B;IAC3B,+DAAiC,CAAA;IACjC,mEAAqC,CAAA;AACzC,CAAC,EAHI,0BAA0B,KAA1B,0BAA0B,QAG9B;AAED,eAAe,0BAA0B,CAAC","sourcesContent":["enum TransferHealthMonitorEvent {\r\n Healthy = `HealthMonitor_Healthy`,\r\n Unhealthy = `HealthMonitor_Unhealthy`,\r\n}\r\n\r\nexport default TransferHealthMonitorEvent;"]}
1
+ {"version":3,"file":"transferHealthMonitorEvent.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/events/transferHealthMonitorEvent.ts"],"names":[],"mappings":"AAAA,IAAK,0BAGJ;AAHD,WAAK,0BAA0B;IAC3B,+DAAiC,CAAA;IACjC,mEAAqC,CAAA;AACzC,CAAC,EAHI,0BAA0B,KAA1B,0BAA0B,QAG9B;AAED,eAAe,0BAA0B,CAAC","sourcesContent":["enum TransferHealthMonitorEvent {\n Healthy = `HealthMonitor_Healthy`,\n Unhealthy = `HealthMonitor_Unhealthy`,\n}\n\nexport default TransferHealthMonitorEvent;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeOnlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/nodeOnlineChecker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAsC,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,aAAa;IACjD,KAAK,CAAC,gBAAgB;QACzB,OAAO,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1C,CAAC;CACJ","sourcesContent":["import OnlineChecker, { OnlineCheckerResult } from \"./onlineChecker.js\";\r\n\r\nexport default class NodeOnlineChecker extends OnlineChecker {\r\n public async isInternetOnline(): Promise<OnlineCheckerResult> {\r\n return await this.isGoogleReachable();\r\n }\r\n}"]}
1
+ {"version":3,"file":"nodeOnlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/nodeOnlineChecker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAsC,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,aAAa;IACjD,KAAK,CAAC,gBAAgB;QACzB,OAAO,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1C,CAAC;CACJ","sourcesContent":["import OnlineChecker, { OnlineCheckerResult } from \"./onlineChecker.js\";\n\nexport default class NodeOnlineChecker extends OnlineChecker {\n public async isInternetOnline(): Promise<OnlineCheckerResult> {\n return await this.isGoogleReachable();\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"onlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/onlineChecker.ts"],"names":[],"mappings":"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","sourcesContent":["export default abstract class OnlineChecker {\r\n protected apiBaseUrl: string;\r\n\r\n constructor(apiBaseUrl: string) {\r\n if (!apiBaseUrl || apiBaseUrl.length === 0)\r\n throw new Error(`Api Base URL is required`);\r\n\r\n this.apiBaseUrl = apiBaseUrl;\r\n }\r\n\r\n public abstract isInternetOnline(): Promise<OnlineCheckerResult>;\r\n\r\n public async isApiReachable(): Promise<OnlineCheckerResult> {\r\n return await this.probe(`${this.apiBaseUrl}/heartbeat?d=${Date.now()}`);\r\n }\r\n\r\n public async isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult> {\r\n return await this.probe(`${fileServerBaseUrl}/up?d=${Date.now()}`);\r\n }\r\n\r\n protected async isGoogleReachable(): Promise<OnlineCheckerResult> {\r\n return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`);\r\n }\r\n\r\n protected async probe(url: string, timeoutInMs = 4000, options: ProbeRequestOptions = {}): Promise<OnlineCheckerResult> {\r\n const startedAt = Date.now();\r\n\r\n try {\r\n const timeoutSignal = AbortSignal.timeout(timeoutInMs);\r\n const result = await fetch(url, this.createProbeRequestInit(timeoutSignal, options.requestMode));\r\n const probeDurationInMs = Date.now() - startedAt;\r\n\r\n if (result.ok || (options.opaqueResponseMeansOnline && result.type === `opaque`))\r\n return { isOnline: true };\r\n\r\n const response = await this.getProbeResponseDetails(result);\r\n\r\n throw this.enrichProbeError(new Error(`Response returned ${result.status} status`), url, response, {\r\n probeRequestMode: options.requestMode,\r\n probeResponseType: result.type,\r\n probeTimeoutInMs: timeoutInMs,\r\n probeDurationInMs,\r\n probeFailureCategory: `HttpError`,\r\n });\r\n }\r\n catch (error) {\r\n const errorObject = this.getErrorObject(error);\r\n const probeDurationInMs = Date.now() - startedAt;\r\n\r\n return {\r\n isOnline: false,\r\n error: this.enrichProbeError(errorObject, url, undefined, {\r\n probeRequestMode: options.requestMode,\r\n probeTimeoutInMs: timeoutInMs,\r\n probeDurationInMs,\r\n probeFailureCategory: this.getProbeFailureCategory(errorObject),\r\n }),\r\n };\r\n }\r\n }\r\n\r\n protected async probeReadableWithFallback(url: string, timeoutInMs = 4000, readableProbeBlockedHint?: string): Promise<OnlineCheckerResult> {\r\n const readableResult = await this.probe(url, timeoutInMs, { requestMode: `cors` });\r\n\r\n if (readableResult.isOnline)\r\n return readableResult;\r\n\r\n const readableError = this.getErrorObject(readableResult.error) as ProbeError;\r\n\r\n if (readableError.response !== undefined)\r\n return readableResult;\r\n\r\n const fallbackResult = await this.probe(url, timeoutInMs, {\r\n requestMode: `no-cors`,\r\n opaqueResponseMeansOnline: true,\r\n });\r\n\r\n if (fallbackResult.isOnline) {\r\n return {\r\n isOnline: false,\r\n error: this.enrichProbeError(readableError, url, undefined, {\r\n probeFailureCategory: `ReadableResponseBlocked`,\r\n probeFailureHint: readableProbeBlockedHint,\r\n probeFallbackRequestMode: `no-cors`,\r\n probeFallbackSucceeded: true,\r\n }),\r\n };\r\n }\r\n\r\n const fallbackError = this.getErrorObject(fallbackResult.error);\r\n\r\n return {\r\n isOnline: false,\r\n error: this.enrichProbeError(readableError, url, undefined, {\r\n probeFallbackRequestMode: `no-cors`,\r\n probeFallbackSucceeded: false,\r\n probeFallbackErrorName: fallbackError.name,\r\n probeFallbackErrorMessage: fallbackError.message,\r\n }),\r\n };\r\n }\r\n\r\n private createProbeRequestInit(timeoutSignal: AbortSignal, requestMode?: RequestMode): RequestInit {\r\n return {\r\n method: `GET`,\r\n cache: `no-store`,\r\n signal: timeoutSignal,\r\n ...(requestMode ? { mode: requestMode } : {}),\r\n };\r\n }\r\n\r\n private async getProbeResponseDetails(response: Response): Promise<ProbeResponseDetails> {\r\n const body = await this.tryGetResponseBody(response);\r\n const headers: Record<string, string> = {};\r\n\r\n response.headers.forEach((value, key) => {\r\n headers[key] = value;\r\n });\r\n\r\n return {\r\n status: response.status,\r\n statusText: response.statusText || undefined,\r\n headers: Object.keys(headers).length > 0 ? headers : undefined,\r\n body,\r\n };\r\n }\r\n\r\n private async tryGetResponseBody(response: Response): Promise<string | undefined> {\r\n try {\r\n const body = await response.text();\r\n\r\n return body.length > 0 ? body : undefined;\r\n }\r\n catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n private enrichProbeError(error: unknown, requestUrl: string, response?: ProbeResponseDetails, diagnostics?: ProbeErrorDiagnostics): Error {\r\n const errorToEnrich = this.getErrorObject(error) as ProbeError;\r\n\r\n try {\r\n this.applyProbeErrorMetadata(errorToEnrich, requestUrl, response, diagnostics);\r\n\r\n return errorToEnrich;\r\n }\r\n catch {\r\n const wrappedError = new Error(errorToEnrich.message, { cause: errorToEnrich }) as ProbeError;\r\n\r\n wrappedError.name = errorToEnrich.name;\r\n this.applyProbeErrorMetadata(wrappedError, requestUrl, response, diagnostics);\r\n\r\n return wrappedError;\r\n }\r\n }\r\n\r\n private applyProbeErrorMetadata(errorToEnrich: ProbeError, requestUrl: string, response?: ProbeResponseDetails, diagnostics?: ProbeErrorDiagnostics): void {\r\n const enrichedError = errorToEnrich;\r\n\r\n enrichedError.requestUrl ??= requestUrl;\r\n\r\n if (response !== undefined && enrichedError.response === undefined)\r\n enrichedError.response = response;\r\n\r\n if (diagnostics?.probeRequestMode !== undefined)\r\n enrichedError.probeRequestMode = diagnostics.probeRequestMode;\r\n\r\n if (diagnostics?.probeResponseType !== undefined)\r\n enrichedError.probeResponseType = diagnostics.probeResponseType;\r\n\r\n if (diagnostics?.probeTimeoutInMs !== undefined)\r\n enrichedError.probeTimeoutInMs = diagnostics.probeTimeoutInMs;\r\n\r\n if (diagnostics?.probeDurationInMs !== undefined)\r\n enrichedError.probeDurationInMs = diagnostics.probeDurationInMs;\r\n\r\n if (diagnostics?.probeFailureCategory !== undefined)\r\n enrichedError.probeFailureCategory = diagnostics.probeFailureCategory;\r\n\r\n if (diagnostics?.probeFailureHint !== undefined)\r\n enrichedError.probeFailureHint = diagnostics.probeFailureHint;\r\n\r\n if (diagnostics?.probeFallbackRequestMode !== undefined)\r\n enrichedError.probeFallbackRequestMode = diagnostics.probeFallbackRequestMode;\r\n\r\n if (diagnostics?.probeFallbackSucceeded !== undefined)\r\n enrichedError.probeFallbackSucceeded = diagnostics.probeFallbackSucceeded;\r\n\r\n if (diagnostics?.probeFallbackErrorName !== undefined)\r\n enrichedError.probeFallbackErrorName = diagnostics.probeFallbackErrorName;\r\n\r\n if (diagnostics?.probeFallbackErrorMessage !== undefined)\r\n enrichedError.probeFallbackErrorMessage = diagnostics.probeFallbackErrorMessage;\r\n }\r\n\r\n private getProbeFailureCategory(error: Error): ProbeFailureCategory {\r\n const errorWithMetadata = error as ProbeError;\r\n\r\n if (errorWithMetadata.probeFailureCategory !== undefined)\r\n return errorWithMetadata.probeFailureCategory;\r\n\r\n const errorMessage = error.message.toLowerCase();\r\n const isTimeoutError = error.name === `AbortError` || errorMessage.includes(`timeout`) || errorMessage.includes(`aborted`);\r\n\r\n if (isTimeoutError)\r\n return `Timeout`;\r\n\r\n return `NetworkError`;\r\n }\r\n\r\n private getErrorObject(error: unknown): Error {\r\n if (error instanceof Error)\r\n return error;\r\n\r\n if (typeof error === `string`)\r\n return new Error(error);\r\n\r\n return new Error(`Unknown health monitor probe error`);\r\n }\r\n}\r\n\r\nexport interface OnlineCheckerResult {\r\n isOnline: boolean,\r\n error?: Error,\r\n}\r\n\r\ninterface ProbeResponseDetails {\r\n status?: number,\r\n statusText?: string,\r\n headers?: Record<string, string>,\r\n body?: string,\r\n}\r\n\r\ninterface ProbeRequestOptions {\r\n requestMode?: RequestMode,\r\n opaqueResponseMeansOnline?: boolean,\r\n}\r\n\r\ntype ProbeFailureCategory = `HttpError` | `NetworkError` | `Timeout` | `ReadableResponseBlocked`;\r\n\r\ninterface ProbeErrorDiagnostics {\r\n probeRequestMode?: RequestMode,\r\n probeResponseType?: ResponseType,\r\n probeTimeoutInMs?: number,\r\n probeDurationInMs?: number,\r\n probeFailureCategory?: ProbeFailureCategory,\r\n probeFailureHint?: string,\r\n probeFallbackRequestMode?: RequestMode,\r\n probeFallbackSucceeded?: boolean,\r\n probeFallbackErrorName?: string,\r\n probeFallbackErrorMessage?: string,\r\n}\r\n\r\ninterface ProbeError extends Error {\r\n requestUrl?: string,\r\n response?: ProbeResponseDetails,\r\n probeRequestMode?: RequestMode,\r\n probeResponseType?: ResponseType,\r\n probeTimeoutInMs?: number,\r\n probeDurationInMs?: number,\r\n probeFailureCategory?: ProbeFailureCategory,\r\n probeFailureHint?: string,\r\n probeFallbackRequestMode?: RequestMode,\r\n probeFallbackSucceeded?: boolean,\r\n probeFallbackErrorName?: string,\r\n probeFallbackErrorMessage?: string,\r\n}"]}
1
+ {"version":3,"file":"onlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/onlineChecker.ts"],"names":[],"mappings":"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","sourcesContent":["export default abstract class OnlineChecker {\n protected apiBaseUrl: string;\n\n constructor(apiBaseUrl: string) {\n if (!apiBaseUrl || apiBaseUrl.length === 0)\n throw new Error(`Api Base URL is required`);\n\n this.apiBaseUrl = apiBaseUrl;\n }\n\n public abstract isInternetOnline(): Promise<OnlineCheckerResult>;\n\n public async isApiReachable(): Promise<OnlineCheckerResult> {\n return await this.probe(`${this.apiBaseUrl}/heartbeat?d=${Date.now()}`);\n }\n\n public async isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult> {\n return await this.probe(`${fileServerBaseUrl}/up?d=${Date.now()}`);\n }\n\n protected async isGoogleReachable(): Promise<OnlineCheckerResult> {\n return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`);\n }\n\n protected async probe(url: string, timeoutInMs = 4000, options: ProbeRequestOptions = {}): Promise<OnlineCheckerResult> {\n const startedAt = Date.now();\n\n try {\n const timeoutSignal = AbortSignal.timeout(timeoutInMs);\n const result = await fetch(url, this.createProbeRequestInit(timeoutSignal, options.requestMode));\n const probeDurationInMs = Date.now() - startedAt;\n\n if (result.ok || (options.opaqueResponseMeansOnline && result.type === `opaque`))\n return { isOnline: true };\n\n const response = await this.getProbeResponseDetails(result);\n\n throw this.enrichProbeError(new Error(`Response returned ${result.status} status`), url, response, {\n probeRequestMode: options.requestMode,\n probeResponseType: result.type,\n probeTimeoutInMs: timeoutInMs,\n probeDurationInMs,\n probeFailureCategory: `HttpError`,\n });\n }\n catch (error) {\n const errorObject = this.getErrorObject(error);\n const probeDurationInMs = Date.now() - startedAt;\n\n return {\n isOnline: false,\n error: this.enrichProbeError(errorObject, url, undefined, {\n probeRequestMode: options.requestMode,\n probeTimeoutInMs: timeoutInMs,\n probeDurationInMs,\n probeFailureCategory: this.getProbeFailureCategory(errorObject),\n }),\n };\n }\n }\n\n protected async probeReadableWithFallback(url: string, timeoutInMs = 4000, readableProbeBlockedHint?: string): Promise<OnlineCheckerResult> {\n const readableResult = await this.probe(url, timeoutInMs, { requestMode: `cors` });\n\n if (readableResult.isOnline)\n return readableResult;\n\n const readableError = this.getErrorObject(readableResult.error) as ProbeError;\n\n if (readableError.response !== undefined)\n return readableResult;\n\n const fallbackResult = await this.probe(url, timeoutInMs, {\n requestMode: `no-cors`,\n opaqueResponseMeansOnline: true,\n });\n\n if (fallbackResult.isOnline) {\n return {\n isOnline: false,\n error: this.enrichProbeError(readableError, url, undefined, {\n probeFailureCategory: `ReadableResponseBlocked`,\n probeFailureHint: readableProbeBlockedHint,\n probeFallbackRequestMode: `no-cors`,\n probeFallbackSucceeded: true,\n }),\n };\n }\n\n const fallbackError = this.getErrorObject(fallbackResult.error);\n\n return {\n isOnline: false,\n error: this.enrichProbeError(readableError, url, undefined, {\n probeFallbackRequestMode: `no-cors`,\n probeFallbackSucceeded: false,\n probeFallbackErrorName: fallbackError.name,\n probeFallbackErrorMessage: fallbackError.message,\n }),\n };\n }\n\n private createProbeRequestInit(timeoutSignal: AbortSignal, requestMode?: RequestMode): RequestInit {\n return {\n method: `GET`,\n cache: `no-store`,\n signal: timeoutSignal,\n ...(requestMode ? { mode: requestMode } : {}),\n };\n }\n\n private async getProbeResponseDetails(response: Response): Promise<ProbeResponseDetails> {\n const body = await this.tryGetResponseBody(response);\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n statusText: response.statusText || undefined,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n body,\n };\n }\n\n private async tryGetResponseBody(response: Response): Promise<string | undefined> {\n try {\n const body = await response.text();\n\n return body.length > 0 ? body : undefined;\n }\n catch {\n return undefined;\n }\n }\n\n private enrichProbeError(error: unknown, requestUrl: string, response?: ProbeResponseDetails, diagnostics?: ProbeErrorDiagnostics): Error {\n const errorToEnrich = this.getErrorObject(error) as ProbeError;\n\n try {\n this.applyProbeErrorMetadata(errorToEnrich, requestUrl, response, diagnostics);\n\n return errorToEnrich;\n }\n catch {\n const wrappedError = new Error(errorToEnrich.message, { cause: errorToEnrich }) as ProbeError;\n\n wrappedError.name = errorToEnrich.name;\n this.applyProbeErrorMetadata(wrappedError, requestUrl, response, diagnostics);\n\n return wrappedError;\n }\n }\n\n private applyProbeErrorMetadata(errorToEnrich: ProbeError, requestUrl: string, response?: ProbeResponseDetails, diagnostics?: ProbeErrorDiagnostics): void {\n const enrichedError = errorToEnrich;\n\n enrichedError.requestUrl ??= requestUrl;\n\n if (response !== undefined && enrichedError.response === undefined)\n enrichedError.response = response;\n\n if (diagnostics?.probeRequestMode !== undefined)\n enrichedError.probeRequestMode = diagnostics.probeRequestMode;\n\n if (diagnostics?.probeResponseType !== undefined)\n enrichedError.probeResponseType = diagnostics.probeResponseType;\n\n if (diagnostics?.probeTimeoutInMs !== undefined)\n enrichedError.probeTimeoutInMs = diagnostics.probeTimeoutInMs;\n\n if (diagnostics?.probeDurationInMs !== undefined)\n enrichedError.probeDurationInMs = diagnostics.probeDurationInMs;\n\n if (diagnostics?.probeFailureCategory !== undefined)\n enrichedError.probeFailureCategory = diagnostics.probeFailureCategory;\n\n if (diagnostics?.probeFailureHint !== undefined)\n enrichedError.probeFailureHint = diagnostics.probeFailureHint;\n\n if (diagnostics?.probeFallbackRequestMode !== undefined)\n enrichedError.probeFallbackRequestMode = diagnostics.probeFallbackRequestMode;\n\n if (diagnostics?.probeFallbackSucceeded !== undefined)\n enrichedError.probeFallbackSucceeded = diagnostics.probeFallbackSucceeded;\n\n if (diagnostics?.probeFallbackErrorName !== undefined)\n enrichedError.probeFallbackErrorName = diagnostics.probeFallbackErrorName;\n\n if (diagnostics?.probeFallbackErrorMessage !== undefined)\n enrichedError.probeFallbackErrorMessage = diagnostics.probeFallbackErrorMessage;\n }\n\n private getProbeFailureCategory(error: Error): ProbeFailureCategory {\n const errorWithMetadata = error as ProbeError;\n\n if (errorWithMetadata.probeFailureCategory !== undefined)\n return errorWithMetadata.probeFailureCategory;\n\n const errorMessage = error.message.toLowerCase();\n const isTimeoutError = error.name === `AbortError` || errorMessage.includes(`timeout`) || errorMessage.includes(`aborted`);\n\n if (isTimeoutError)\n return `Timeout`;\n\n return `NetworkError`;\n }\n\n private getErrorObject(error: unknown): Error {\n if (error instanceof Error)\n return error;\n\n if (typeof error === `string`)\n return new Error(error);\n\n return new Error(`Unknown health monitor probe error`);\n }\n}\n\nexport interface OnlineCheckerResult {\n isOnline: boolean,\n error?: Error,\n}\n\ninterface ProbeResponseDetails {\n status?: number,\n statusText?: string,\n headers?: Record<string, string>,\n body?: string,\n}\n\ninterface ProbeRequestOptions {\n requestMode?: RequestMode,\n opaqueResponseMeansOnline?: boolean,\n}\n\ntype ProbeFailureCategory = `HttpError` | `NetworkError` | `Timeout` | `ReadableResponseBlocked`;\n\ninterface ProbeErrorDiagnostics {\n probeRequestMode?: RequestMode,\n probeResponseType?: ResponseType,\n probeTimeoutInMs?: number,\n probeDurationInMs?: number,\n probeFailureCategory?: ProbeFailureCategory,\n probeFailureHint?: string,\n probeFallbackRequestMode?: RequestMode,\n probeFallbackSucceeded?: boolean,\n probeFallbackErrorName?: string,\n probeFallbackErrorMessage?: string,\n}\n\ninterface ProbeError extends Error {\n requestUrl?: string,\n response?: ProbeResponseDetails,\n probeRequestMode?: RequestMode,\n probeResponseType?: ResponseType,\n probeTimeoutInMs?: number,\n probeDurationInMs?: number,\n probeFailureCategory?: ProbeFailureCategory,\n probeFailureHint?: string,\n probeFallbackRequestMode?: RequestMode,\n probeFallbackSucceeded?: boolean,\n probeFallbackErrorName?: string,\n probeFallbackErrorMessage?: string,\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"webOnlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/webOnlineChecker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAsC,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IAChD,KAAK,CAAC,gBAAgB;QACzB,IAAI,SAAS,EAAE,MAAM,KAAK,KAAK;YAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAErF,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE;YAClF,WAAW,EAAE,SAAS;YACtB,yBAAyB,EAAE,IAAI;SAClC,CAAC,CAAC;IACP,CAAC;IAEe,KAAK,CAAC,cAAc;QAChC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,UAAU,gBAAgB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAElE,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;IAChH,CAAC;IAEe,KAAK,CAAC,qBAAqB,CAAC,iBAAyB;QACjE,MAAM,UAAU,GAAG,GAAG,iBAAiB,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE7D,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;IAChH,CAAC;IAEO,2BAA2B,CAAC,UAAkB;QAClD,IAAI,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC;YACtC,OAAO,iIAAiI,CAAC;QAE7I,IAAI,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;YACrC,OAAO,yKAAyK,CAAC;QAErL,OAAO,iKAAiK,CAAC;IAC7K,CAAC;IAEO,qBAAqB,CAAC,UAAkB;QAC5C,OAAO,UAAU,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxF,CAAC;IAEO,oBAAoB,CAAC,UAAkB;QAC3C,IAAI,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM;gBAC5B,OAAO,KAAK,CAAC;YAEjB,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrE,CAAC;QACD,MAAM,CAAC;YACH,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;CACJ","sourcesContent":["import OnlineChecker, { OnlineCheckerResult } from \"./onlineChecker.js\";\r\n\r\nexport default class WebOnlineChecker extends OnlineChecker {\r\n public async isInternetOnline(): Promise<OnlineCheckerResult> {\r\n if (navigator?.onLine === false)\r\n return { isOnline: false, error: new Error(`Offline mode detected by browser`) };\r\n\r\n return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`, 4000, {\r\n requestMode: `no-cors`,\r\n opaqueResponseMeansOnline: true,\r\n });\r\n }\r\n\r\n public override async isApiReachable(): Promise<OnlineCheckerResult> {\r\n const requestUrl = `${this.apiBaseUrl}/heartbeat?d=${Date.now()}`;\r\n\r\n return await this.probeReadableWithFallback(requestUrl, 4000, this.getReadableProbeBlockedHint(requestUrl));\r\n }\r\n\r\n public override async isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult> {\r\n const requestUrl = `${fileServerBaseUrl}/up?d=${Date.now()}`;\r\n\r\n return await this.probeReadableWithFallback(requestUrl, 4000, this.getReadableProbeBlockedHint(requestUrl));\r\n }\r\n\r\n private getReadableProbeBlockedHint(requestUrl: string): string {\r\n if (this.isMixedContentRequest(requestUrl))\r\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means the browser blocked mixed-content traffic.`;\r\n\r\n if (this.isCrossOriginRequest(requestUrl))\r\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means a CORS or browser policy restriction, not a missing HTTP response from the server.`;\r\n\r\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means a browser policy restriction, not a missing HTTP response from the server.`;\r\n }\r\n\r\n private isMixedContentRequest(requestUrl: string): boolean {\r\n return globalThis.location?.protocol === `https:` && requestUrl.startsWith(`http:`);\r\n }\r\n\r\n private isCrossOriginRequest(requestUrl: string): boolean {\r\n try {\r\n if (!globalThis.location?.origin)\r\n return false;\r\n\r\n return new URL(requestUrl).origin !== globalThis.location.origin;\r\n }\r\n catch {\r\n return false;\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"webOnlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/webOnlineChecker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAsC,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IAChD,KAAK,CAAC,gBAAgB;QACzB,IAAI,SAAS,EAAE,MAAM,KAAK,KAAK;YAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAErF,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE;YAClF,WAAW,EAAE,SAAS;YACtB,yBAAyB,EAAE,IAAI;SAClC,CAAC,CAAC;IACP,CAAC;IAEe,KAAK,CAAC,cAAc;QAChC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,UAAU,gBAAgB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAElE,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;IAChH,CAAC;IAEe,KAAK,CAAC,qBAAqB,CAAC,iBAAyB;QACjE,MAAM,UAAU,GAAG,GAAG,iBAAiB,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE7D,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;IAChH,CAAC;IAEO,2BAA2B,CAAC,UAAkB;QAClD,IAAI,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC;YACtC,OAAO,iIAAiI,CAAC;QAE7I,IAAI,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;YACrC,OAAO,yKAAyK,CAAC;QAErL,OAAO,iKAAiK,CAAC;IAC7K,CAAC;IAEO,qBAAqB,CAAC,UAAkB;QAC5C,OAAO,UAAU,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxF,CAAC;IAEO,oBAAoB,CAAC,UAAkB;QAC3C,IAAI,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM;gBAC5B,OAAO,KAAK,CAAC;YAEjB,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrE,CAAC;QACD,MAAM,CAAC;YACH,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;CACJ","sourcesContent":["import OnlineChecker, { OnlineCheckerResult } from \"./onlineChecker.js\";\n\nexport default class WebOnlineChecker extends OnlineChecker {\n public async isInternetOnline(): Promise<OnlineCheckerResult> {\n if (navigator?.onLine === false)\n return { isOnline: false, error: new Error(`Offline mode detected by browser`) };\n\n return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`, 4000, {\n requestMode: `no-cors`,\n opaqueResponseMeansOnline: true,\n });\n }\n\n public override async isApiReachable(): Promise<OnlineCheckerResult> {\n const requestUrl = `${this.apiBaseUrl}/heartbeat?d=${Date.now()}`;\n\n return await this.probeReadableWithFallback(requestUrl, 4000, this.getReadableProbeBlockedHint(requestUrl));\n }\n\n public override async isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult> {\n const requestUrl = `${fileServerBaseUrl}/up?d=${Date.now()}`;\n\n return await this.probeReadableWithFallback(requestUrl, 4000, this.getReadableProbeBlockedHint(requestUrl));\n }\n\n private getReadableProbeBlockedHint(requestUrl: string): string {\n if (this.isMixedContentRequest(requestUrl))\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means the browser blocked mixed-content traffic.`;\n\n if (this.isCrossOriginRequest(requestUrl))\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means a CORS or browser policy restriction, not a missing HTTP response from the server.`;\n\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means a browser policy restriction, not a missing HTTP response from the server.`;\n }\n\n private isMixedContentRequest(requestUrl: string): boolean {\n return globalThis.location?.protocol === `https:` && requestUrl.startsWith(`http:`);\n }\n\n private isCrossOriginRequest(requestUrl: string): boolean {\n try {\n if (!globalThis.location?.origin)\n return false;\n\n return new URL(requestUrl).origin !== globalThis.location.origin;\n }\n catch {\n return false;\n }\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transferDownloaderHealthMonitor.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferDownloaderHealthMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,wCAAwC,CAAC;AAI3E,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,yBAA4C;IAC3F,+CAA+C,CAAC,SAAkB;QACxE,MAAM,aAAa,GAAI,SAAiD,CAAC,aAAa,CAAC;QAEvF,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEtF,OAAO,aAAa,CAAC;IACzB,CAAC;IAES,2BAA2B;QACjC,OAAO,qBAAqB,CAAC,0BAA0B,CAAC;IAC5D,CAAC;IAES,8BAA8B;QACpC,OAAO,qBAAqB,CAAC,kBAAkB,CAAC;IACpD,CAAC;IAES,6BAA6B,CAAC,+BAAmD;QACvF,OAAO,+BAA+B,EAAE,eAAe,IAAI,CAAC,CAAC;IACjE,CAAC;IAES,mBAAmB;QACzB,OAAO;YACH,0BAA0B,EAAE,IAAI,CAAC,mCAAmC,EAAE,eAAe;YACrF,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,qBAAqB;YAC7F,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,qBAAqB;YAC7F,oBAAoB,EAAE,IAAI,CAAC,mCAAmC,EAAE,eAAe;YAC/E,gBAAgB,EAAE,IAAI,CAAC,mCAAmC,EAAE,6BAA6B,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,EAAE,6BAA6B;SAC3L,CAAC;IACN,CAAC;CACJ","sourcesContent":["import TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\r\nimport DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\r\nimport DownloadMetadataDeterminedEventArgs from \"../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js\";\r\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\r\nimport TransferHealthMonitorBase from \"./transferHealthMonitorBase.js\";\r\n\r\nexport default class TransferDownloaderHealthMonitor extends TransferHealthMonitorBase<DownloadEventArgs> {\r\n protected getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs: unknown): string {\r\n const fileServerUrl = (eventArgs as DownloadMetadataDeterminedEventArgs).fileServerUrl;\r\n\r\n if (!fileServerUrl)\r\n throw new Error(`Event args are not of DownloadMetadataDeterminedEventArgs type`);\r\n\r\n return fileServerUrl;\r\n }\r\n\r\n protected getFileServerKnownEventName(): string {\r\n return TransferDownloadEvent.TransferMetadataDetermined;\r\n }\r\n\r\n protected getTransferProgressedEventName(): string {\r\n return TransferDownloadEvent.DownloadProgressed;\r\n }\r\n\r\n protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: DownloadEventArgs): number {\r\n return currentHistoryLastProgressEvent?.downloadedBytes ?? 0;\r\n }\r\n\r\n protected getHealthyEventArgs(): HealthMonitorHealthyEventArgs {\r\n return {\r\n transferredBytesTotalCount: this.lastProgressEventFromPreviousPeriod?.downloadedBytes,\r\n averageSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.bytesPerSecondAverage,\r\n currentSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.bytesPerSecondCurrent,\r\n progressInPercentage: this.lastProgressEventFromPreviousPeriod?.progressPercent,\r\n remainingSeconds: this.lastProgressEventFromPreviousPeriod?.estimatedRemainingTimeSeconds === null ? undefined : this.lastProgressEventFromPreviousPeriod?.estimatedRemainingTimeSeconds,\r\n };\r\n }\r\n}"]}
1
+ {"version":3,"file":"transferDownloaderHealthMonitor.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferDownloaderHealthMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,wCAAwC,CAAC;AAI3E,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,yBAA4C;IAC3F,+CAA+C,CAAC,SAAkB;QACxE,MAAM,aAAa,GAAI,SAAiD,CAAC,aAAa,CAAC;QAEvF,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEtF,OAAO,aAAa,CAAC;IACzB,CAAC;IAES,2BAA2B;QACjC,OAAO,qBAAqB,CAAC,0BAA0B,CAAC;IAC5D,CAAC;IAES,8BAA8B;QACpC,OAAO,qBAAqB,CAAC,kBAAkB,CAAC;IACpD,CAAC;IAES,6BAA6B,CAAC,+BAAmD;QACvF,OAAO,+BAA+B,EAAE,eAAe,IAAI,CAAC,CAAC;IACjE,CAAC;IAES,mBAAmB;QACzB,OAAO;YACH,0BAA0B,EAAE,IAAI,CAAC,mCAAmC,EAAE,eAAe;YACrF,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,qBAAqB;YAC7F,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,qBAAqB;YAC7F,oBAAoB,EAAE,IAAI,CAAC,mCAAmC,EAAE,eAAe;YAC/E,gBAAgB,EAAE,IAAI,CAAC,mCAAmC,EAAE,6BAA6B,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,EAAE,6BAA6B;SAC3L,CAAC;IACN,CAAC;CACJ","sourcesContent":["import TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\nimport DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\nimport DownloadMetadataDeterminedEventArgs from \"../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js\";\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport TransferHealthMonitorBase from \"./transferHealthMonitorBase.js\";\n\nexport default class TransferDownloaderHealthMonitor extends TransferHealthMonitorBase<DownloadEventArgs> {\n protected getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs: unknown): string {\n const fileServerUrl = (eventArgs as DownloadMetadataDeterminedEventArgs).fileServerUrl;\n\n if (!fileServerUrl)\n throw new Error(`Event args are not of DownloadMetadataDeterminedEventArgs type`);\n\n return fileServerUrl;\n }\n\n protected getFileServerKnownEventName(): string {\n return TransferDownloadEvent.TransferMetadataDetermined;\n }\n\n protected getTransferProgressedEventName(): string {\n return TransferDownloadEvent.DownloadProgressed;\n }\n\n protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: DownloadEventArgs): number {\n return currentHistoryLastProgressEvent?.downloadedBytes ?? 0;\n }\n\n protected getHealthyEventArgs(): HealthMonitorHealthyEventArgs {\n return {\n transferredBytesTotalCount: this.lastProgressEventFromPreviousPeriod?.downloadedBytes,\n averageSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.bytesPerSecondAverage,\n currentSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.bytesPerSecondCurrent,\n progressInPercentage: this.lastProgressEventFromPreviousPeriod?.progressPercent,\n remainingSeconds: this.lastProgressEventFromPreviousPeriod?.estimatedRemainingTimeSeconds === null ? undefined : this.lastProgressEventFromPreviousPeriod?.estimatedRemainingTimeSeconds,\n };\n }\n}"]}