filemail-sdk 9.3.1 → 9.3.2
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloaderCore.d.ts","sourceRoot":"","sources":["../../../../src/client/downloader/downloaderCore.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,eAAe,MAAM,qCAAqC,CAAC;AACvE,OAAO,KAAK,SAAS,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,iBAAiB,MAAM,6CAA6C,CAAC;AACjF,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAEjE,OAAO,KAAK,YAAY,MAAM,uCAAuC,CAAC;AAGtE,OAAO,KAAK,eAAe,MAAM,0CAA0C,CAAC;AAC5E,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAC;AAEtF,OAAO,KAAK,0BAA0B,MAAM,sDAAsD,CAAC;AACnG,OAAO,KAAK,uBAAuB,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,iBAAiB,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,cAAc,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,iBAAiB,MAAM,iDAAiD,CAAC;AAGrF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAC;AACnF,OAAO,KAAK,+BAA+B,MAAM,qDAAqD,CAAC;AAEvG,MAAM,CAAC,OAAO,OAAO,cAAc;;gBAkBnB,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,+BAA+B;IAY7U,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAKlC;IAED,IAAI,KAAK,IAAI,iBAAiB,GAAG,IAAI,CAKpC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAEK,KAAK,CAAC,OAAO,EAAE;QAAE,sBAAsB,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB3E,MAAM,IAAI,OAAO;
|
|
1
|
+
{"version":3,"file":"downloaderCore.d.ts","sourceRoot":"","sources":["../../../../src/client/downloader/downloaderCore.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,eAAe,MAAM,qCAAqC,CAAC;AACvE,OAAO,KAAK,SAAS,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,iBAAiB,MAAM,6CAA6C,CAAC;AACjF,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAEjE,OAAO,KAAK,YAAY,MAAM,uCAAuC,CAAC;AAGtE,OAAO,KAAK,eAAe,MAAM,0CAA0C,CAAC;AAC5E,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAC;AAEtF,OAAO,KAAK,0BAA0B,MAAM,sDAAsD,CAAC;AACnG,OAAO,KAAK,uBAAuB,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,iBAAiB,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,cAAc,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,iBAAiB,MAAM,iDAAiD,CAAC;AAGrF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAC;AACnF,OAAO,KAAK,+BAA+B,MAAM,qDAAqD,CAAC;AAEvG,MAAM,CAAC,OAAO,OAAO,cAAc;;gBAkBnB,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,+BAA+B;IAY7U,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAKlC;IAED,IAAI,KAAK,IAAI,iBAAiB,GAAG,IAAI,CAKpC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAEK,KAAK,CAAC,OAAO,EAAE;QAAE,sBAAsB,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB3E,MAAM,IAAI,OAAO;IAOjB,KAAK,IAAI,OAAO;IAMhB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAI/C,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAYvE,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAYjE,qBAAqB,CAAC,OAAO,EAAE,oBAAoB;IAcnD,uBAAuB;IAsBvB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqC3E,OAAO,CAAC,yCAAyC;IAU3C,eAAe,CAAC,UAAU,GAAE,MAAM,GAAG,IAAW;CAqNzD"}
|
|
@@ -64,7 +64,9 @@ export default class DownloaderCore {
|
|
|
64
64
|
}
|
|
65
65
|
resume() {
|
|
66
66
|
this.#throwIfNotRunning();
|
|
67
|
-
|
|
67
|
+
const result = this.#filesDownloader.resume();
|
|
68
|
+
this.#healthMonitor.stop();
|
|
69
|
+
return result;
|
|
68
70
|
}
|
|
69
71
|
abort() {
|
|
70
72
|
this.#throwIfNotRunning();
|
|
@@ -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 await this.#downloadTracker?.saveState();\r\n\r\n this.#healthMonitor.stop();\r\n\r\n return paused;\r\n }\r\n\r\n resume(): boolean {\r\n this.#throwIfNotRunning();\r\n return this.#filesDownloader!.resume();\r\n }\r\n\r\n abort(): boolean {\r\n this.#throwIfNotRunning();\r\n this.#healthMonitor.stop();\r\n return this.#filesDownloader!.requestAbort();\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\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}"]}
|
|
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 await this.#downloadTracker?.saveState();\r\n\r\n this.#healthMonitor.stop();\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 this.#healthMonitor.stop();\r\n return result;\r\n }\r\n\r\n abort(): boolean {\r\n this.#throwIfNotRunning();\r\n this.#healthMonitor.stop();\r\n return this.#filesDownloader!.requestAbort();\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\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}"]}
|