filemail-sdk 9.0.2 → 9.0.4
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.
- package/dist/src/client/downloader/downloaderCore.js +1 -1
- package/dist/src/client/downloader/downloaderCore.js.map +1 -1
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.d.ts +2 -0
- package/dist/src/uploader/chunksIterator/chunksIterator.d.ts.map +1 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.js +8 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
- package/dist/src/uploader/state/continuousChunksCalculator.d.ts.map +1 -1
- package/dist/src/uploader/state/continuousChunksCalculator.js +2 -0
- package/dist/src/uploader/state/continuousChunksCalculator.js.map +1 -1
- package/dist/src/uploader/state/transferUploadState.d.ts.map +1 -1
- package/dist/src/uploader/state/transferUploadState.js +2 -1
- package/dist/src/uploader/state/transferUploadState.js.map +1 -1
- package/dist/src/utils/api/dtos/getTransferResponse.d.ts +1 -0
- package/dist/src/utils/api/dtos/getTransferResponse.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/getTransferResponse.js.map +1 -1
- package/dist/src/utils/api/web/webClientBase.d.ts +0 -1
- package/dist/src/utils/api/web/webClientBase.d.ts.map +1 -1
- package/dist/src/utils/api/web/webClientBase.js +0 -3
- package/dist/src/utils/api/web/webClientBase.js.map +1 -1
- package/package.json +1 -1
|
@@ -233,7 +233,7 @@ export default class DownloaderCore {
|
|
|
233
233
|
if (effectiveTransfer.blockdownloads === true)
|
|
234
234
|
throw new DownloadError(`Transfer has downloads disabled transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.DownloadsDisabled);
|
|
235
235
|
if (fileslimit !== 0 && (!effectiveTransfer.files || effectiveTransfer.files.length === 0))
|
|
236
|
-
throw new DownloadError(`
|
|
236
|
+
throw new DownloadError(`Transfer has no files to download transfer=${effectiveTransfer.id}`, undefined, DownloadErrorCode.NoFilesToDownload);
|
|
237
237
|
return effectiveTransfer;
|
|
238
238
|
}
|
|
239
239
|
async #fetchTransfer(transferid, trackid, password, fileslimit, checkLogintoken) {
|
|
@@ -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\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\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) {\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 }\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 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 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 const completion = this.#filesDownloader.start();\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(`Ttransfer 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\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\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) {\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 }\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 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 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 const completion = this.#filesDownloader.start();\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}"]}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -8,7 +8,9 @@ export { default as InitializeTransferResponse } from "./utils/api/dtos/initiali
|
|
|
8
8
|
export { default as LoginRequest } from "./utils/api/dtos/loginRequest.js";
|
|
9
9
|
export { default as LoginResponse } from "./utils/api/dtos/loginResponse.js";
|
|
10
10
|
export { default as SendFileChunkRequest } from "./utils/api/dtos/sendFileChunkRequest.js";
|
|
11
|
+
export { default as GetTransferRequest } from "./utils/api/dtos/getTransferRequest.js";
|
|
11
12
|
export { default as GetTransferResponse } from "./utils/api/dtos/getTransferResponse.js";
|
|
13
|
+
export { default as TransferFileDto } from "./utils/api/dtos/transferFileDto.js";
|
|
12
14
|
export { default as RegisterTransferDownloadRequest } from "./utils/api/dtos/registerTransferDownloadRequest.js";
|
|
13
15
|
export { default as RegisterFileDownloadRequest } from "./utils/api/dtos/registerFileDownloadRequest.js";
|
|
14
16
|
export { default as TransferCustomFieldDto } from "./utils/api/dtos/transferCustomFieldDto.js";
|
|
@@ -62,4 +64,7 @@ export { default as Logger } from "./client/loggers/logger.js";
|
|
|
62
64
|
export { default as TransferUploader } from "./client/uploader/transferUploader.js";
|
|
63
65
|
export { default as EnvironmentVariables } from "./client/environmentVariables.js";
|
|
64
66
|
export { default as TransferUploaderConfig } from "./client/uploader/transferUploaderConfig.js";
|
|
67
|
+
export { default as DownloadError } from "./downloader/dtos/downloadError.js";
|
|
68
|
+
export { default as DownloadErrorCode } from "./downloader/dtos/downloadErrorCode.js";
|
|
69
|
+
export { default as TransferDownloadEvent } from "./downloader/dtos/downloadEvent.js";
|
|
65
70
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACjG,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AACnG,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,oCAAoC,EAAE,4BAA4B,EAAE,uCAAuC,EAAE,MAAM,+CAA+C,CAAC;AACvM,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AACvG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,qDAAqD,CAAC;AACjH,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AACzG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAE/F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAErF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAE5F,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,wDAAwD,CAAC;AAC1G,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AACtG,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,gEAAgE,CAAC;AAE1H,OAAO,EAAE,wBAAwB,EAAE,gCAAgC,EAAE,MAAM,+CAA+C,CAAC;AAC3H,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAEtG,OAAO,EAAE,+BAA+B,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAElH,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,wDAAwD,CAAC;AACnH,OAAO,EAAE,OAAO,IAAI,0CAA0C,EAAE,MAAM,oEAAoE,CAAC;AAC3I,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AACvG,OAAO,EAAE,OAAO,IAAI,iCAAiC,EAAE,MAAM,2DAA2D,CAAC;AACzH,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,4DAA4D,CAAC;AAC3H,OAAO,EAAE,OAAO,IAAI,iCAAiC,EAAE,MAAM,2DAA2D,CAAC;AACzH,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,mDAAmD,CAAC;AACzG,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,0DAA0D,CAAC;AACvH,OAAO,EAAE,OAAO,IAAI,iCAAiC,EAAE,MAAM,2DAA2D,CAAC;AACzH,OAAO,EAAE,OAAO,IAAI,iCAAiC,EAAE,MAAM,2DAA2D,CAAC;AAEzH,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,qDAAqD,CAAC;AACjH,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,sDAAsD,CAAC;AACnH,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAE9F,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACxH,OAAO,EAAE,wBAAwB,EAAE,gCAAgC,EAAE,MAAM,gDAAgD,CAAC;AAC5H,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AACjG,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6CAA6C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -12,4 +12,7 @@ export { default as TransferUploadEvent } from "./uploader/transferUploadEvent.j
|
|
|
12
12
|
export { default as TransferState } from "./uploader/state/transferUploadState.js";
|
|
13
13
|
export { default as TransferStatus } from "./utils/types/transferStatus.js";
|
|
14
14
|
export { default as DummyLogger } from "./client/loggers/dummyLogger.js";
|
|
15
|
+
export { default as DownloadError } from "./downloader/dtos/downloadError.js";
|
|
16
|
+
export { default as DownloadErrorCode } from "./downloader/dtos/downloadErrorCode.js";
|
|
17
|
+
export { default as TransferDownloadEvent } from "./downloader/dtos/downloadEvent.js";
|
|
15
18
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AASpF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAInE,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,gEAAgE,CAAC;AAsB1H,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAE9F,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAKnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAMzE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAC","sourcesContent":["export { default as CancelTransferRequest } from \"./utils/api/dtos/cancelTransferRequest.js\";\r\nexport { BaseResponse } from \"./utils/api/dtos/baseResponse.js\";\r\nexport { default as FinalizeTransferRequest } from \"./utils/api/dtos/finalizeTransferRequest.js\";\r\nexport { default as FinalizeTransferResponse } from \"./utils/api/dtos/finalizeTransferResponse.js\";\r\nexport { default as ResetTransferRequest } from \"./utils/api/dtos/resetTransferRequest.js\";\r\nexport { InitializeTransferRequest, InitializeTransferRequestCustomField, InitializeTransferRequestRaw, InitializeTransferRequestCustomFieldRaw } from \"./utils/api/dtos/initializeTransferRequest.js\";\r\nexport { default as InitializeTransferResponse } from \"./utils/api/dtos/initializeTransferResponse.js\";\r\nexport { default as LoginRequest } from \"./utils/api/dtos/loginRequest.js\";\r\nexport { default as LoginResponse } from \"./utils/api/dtos/loginResponse.js\";\r\nexport { default as SendFileChunkRequest } from \"./utils/api/dtos/sendFileChunkRequest.js\";\r\nexport { default as GetTransferRequest } from \"./utils/api/dtos/getTransferRequest.js\";\r\nexport { default as GetTransferResponse } from \"./utils/api/dtos/getTransferResponse.js\";\r\nexport { default as TransferFileDto } from \"./utils/api/dtos/transferFileDto.js\";\r\nexport { default as RegisterTransferDownloadRequest } from \"./utils/api/dtos/registerTransferDownloadRequest.js\";\r\nexport { default as RegisterFileDownloadRequest } from \"./utils/api/dtos/registerFileDownloadRequest.js\";\r\nexport { default as TransferCustomFieldDto } from \"./utils/api/dtos/transferCustomFieldDto.js\";\r\n\r\nexport { default as ChunkProgressEvent } from \"./utils/events/chunkProgressEvent.js\";\r\n\r\nexport { default as ApiClient } from \"./utils/api/apiClient.js\";\r\nexport { default as ApiError } from \"./utils/api/apiError.js\";\r\nexport { default as ApiFilemailError } from \"./utils/api/apiFilemailError.js\";\r\nexport { default as ApiFilemail449Error } from \"./utils/api/apiFilemail449Error.js\";\r\nexport { default as FileServerClient } from \"./uploader/api/fileServerUploadClient.js\";\r\nexport { default as FileServerClientFactory } from \"./utils/api/fileServerClientFactory.js\";\r\n\r\nexport { default as EventsEngine } from \"./utils/events/eventsEngine.js\";\r\nexport { EventsEngineEventHandler } from \"./utils/events/eventsEngine.js\";\r\n\r\nexport { default as ChunkStreamProvider } from \"./utils/fileSystem/chunkStreamProvider.js\";\r\nexport { default as FileDetails } from \"./utils/fileSystem/fileDetails.js\";\r\nexport { default as FsError } from \"./utils/fileSystem/fsError.js\";\r\n\r\nexport { default as ConcurrencyController } from \"./utils/concurrencyController/concurrencyController.js\";\r\nexport { default as ConcurrencyReleaser } from \"./utils/concurrencyController/concurrencyReleaser.js\";\r\nexport { default as TransferConcurrencyController } from \"./utils/concurrencyController/transferConcurrencyController.js\";\r\n\r\nexport { TransferUploadExportData, TransferUploadExportDataMetadata } from \"./uploader/export/transferUploadExportData.js\";\r\nexport { default as TransferUploadMetadata } from \"./uploader/export/transferUploadMetadata.js\";\r\nexport { default as TransferUploadExportState } from \"./uploader/export/transferUploadExportState.js\";\r\n\r\nexport { ContinuousChunksCalculatorState, ContinuousChunk } from \"./uploader/state/continuousChunksCalculator.js\";\r\n\r\nexport { default as FileChunkUploadFailedEventArgs } from \"./uploader/eventArgs/fileChunkUploadFailedEventArgs.js\";\r\nexport { default as FileChunkUploadCompletedPartiallyEventArgs } from \"./uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js\";\r\nexport { default as FileChunkUploadEventArgs } from \"./uploader/eventArgs/fileChunkUploadEventArgs.js\";\r\nexport { default as FileChunkUploadCompletedEventArgs } from \"./uploader/eventArgs/fileChunkUploadCompletedEventArgs.js\";\r\nexport { default as FileChunkUploadProgressedEventArgs } from \"./uploader/eventArgs/fileChunkUploadProgressedEventArgs.js\";\r\nexport { default as TransferUploadProgressedEventArgs } from \"./uploader/eventArgs/transferUploadProgressedEventArgs.js\";\r\nexport { default as FileUploadEventArgs } from \"./uploader/eventArgs/fileUploadEventArgs.js\";\r\nexport { default as FileUploadFailedEventArgs } from \"./uploader/eventArgs/fileUploadFailedEventArgs.js\";\r\nexport { default as TransferUploadCompletedEventArgs } from \"./uploader/eventArgs/transferUploadCompletedEventArgs.js\";\r\nexport { default as TransferRegionDeterminedEventArgs } from \"./uploader/eventArgs/transferRegionDeterminedEventArgs.js\";\r\nexport { default as TransferUploadModeChosenEventArgs } from \"./uploader/eventArgs/transferUploadModeChosenEventArgs.js\";\r\n\r\nexport { default as ReadonlyTransferUploadStateFile } from \"./uploader/state/readonlyTransferUploadStateFile.js\";\r\nexport { default as ReadonlyTransferUploadStateFiles } from \"./uploader/state/readonlyTransferUploadStateFiles.js\";\r\nexport { default as TransferStatusFile } from \"./uploader/state/transferUploadStateFile.js\";\r\nexport { default as TransferStatusFiles } from \"./uploader/state/transferUploadStateFiles.js\";\r\n\r\nexport { default as PauseController } from \"./uploader/pauseController.js\";\r\nexport { PauseSignal } from \"./uploader/pauseController.js\";\r\nexport { default as Transfer } from \"./uploader/transferUpload.js\";\r\nexport { default as TransferUploadError } from \"./uploader/transferUploadError.js\";\r\nexport { default as TransferUploadEvent } from \"./uploader/transferUploadEvent.js\";\r\nexport { default as TransferUploadConfig } from \"./uploader/options/transferUploadConfig.js\";\r\nexport { default as TransferUploadInfo, TransferUploadInfoCustomField } from \"./uploader/options/transferUploadInfo.js\";\r\nexport { TransferUploadAppendInfo, TransferUploadAppendInfoE2eeData } from \"./uploader/options/transferUploadAppendInfo.js\";\r\nexport { default as TransferUploadInfoBase } from \"./uploader/options/transferUploadInfoBase.js\";\r\nexport { default as TransferState } from \"./uploader/state/transferUploadState.js\";\r\nexport { default as TransferStatus } from \"./utils/types/transferStatus.js\";\r\n\r\nexport { default as DummyLogger } from \"./client/loggers/dummyLogger.js\";\r\nexport { default as Logger } from \"./client/loggers/logger.js\";\r\nexport { default as TransferUploader } from \"./client/uploader/transferUploader.js\";\r\nexport { default as EnvironmentVariables } from \"./client/environmentVariables.js\";\r\nexport { default as TransferUploaderConfig } from \"./client/uploader/transferUploaderConfig.js\";\r\n\r\nexport { default as DownloadError } from \"./downloader/dtos/downloadError.js\";\r\nexport { default as DownloadErrorCode } from \"./downloader/dtos/downloadErrorCode.js\";\r\nexport { default as TransferDownloadEvent } from \"./downloader/dtos/downloadEvent.js\";"]}
|
|
@@ -4,6 +4,8 @@ export default class ChunksIterator {
|
|
|
4
4
|
constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, currentChunkSizeProvider: {
|
|
5
5
|
readonly currentChunkSize: number;
|
|
6
6
|
});
|
|
7
|
+
private sanitizeChunks;
|
|
8
|
+
private removeZeroByteChunks;
|
|
7
9
|
getChunksIterator(): IterableIterator<ContinuousChunk>;
|
|
8
10
|
private isZeroBytesFilesCase;
|
|
9
11
|
private getNextIteratorValueForZeroBytesFile;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunksIterator.d.ts","sourceRoot":"","sources":["../../../../src/uploader/chunksIterator/chunksIterator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,MAAM,CAAC,OAAO,OAAO,cAAc;;gBASnB,iBAAiB,EAAE,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,wBAAwB,EAAE;QAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;
|
|
1
|
+
{"version":3,"file":"chunksIterator.d.ts","sourceRoot":"","sources":["../../../../src/uploader/chunksIterator/chunksIterator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,MAAM,CAAC,OAAO,OAAO,cAAc;;gBASnB,iBAAiB,EAAE,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,wBAAwB,EAAE;QAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;IAO7J,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,oBAAoB;IAI5B,iBAAiB,IAAI,gBAAgB,CAAC,eAAe,CAAC;IActD,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,oCAAoC;IAS5C,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,mBAAmB;CAgB9B"}
|
|
@@ -5,10 +5,17 @@ export default class ChunksIterator {
|
|
|
5
5
|
#nextChunkStartPosition = 0;
|
|
6
6
|
#isValueAlreadyReturnedForZeroBytesFile = false;
|
|
7
7
|
constructor(alreadySentChunks, fileSizeInBytes, currentChunkSizeProvider) {
|
|
8
|
-
this.#alreadySentChunks = alreadySentChunks;
|
|
8
|
+
this.#alreadySentChunks = this.sanitizeChunks(alreadySentChunks);
|
|
9
9
|
this.#fileSizeInBytes = fileSizeInBytes;
|
|
10
10
|
this.#currentChunkSizeProvider = currentChunkSizeProvider;
|
|
11
11
|
}
|
|
12
|
+
// This is an anti corruption layer that can be removed after everybody migrates to desktop > 4.8.2
|
|
13
|
+
sanitizeChunks(alreadySentChunks) {
|
|
14
|
+
return this.removeZeroByteChunks(alreadySentChunks);
|
|
15
|
+
}
|
|
16
|
+
removeZeroByteChunks(alreadySentChunks) {
|
|
17
|
+
return alreadySentChunks.filter(c => c.sizeInBytes > 0);
|
|
18
|
+
}
|
|
12
19
|
getChunksIterator() {
|
|
13
20
|
return {
|
|
14
21
|
[Symbol.iterator]() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunksIterator.js","sourceRoot":"","sources":["../../../../src/uploader/chunksIterator/chunksIterator.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,kBAAkB,CAAuC;IACzD,gBAAgB,CAAS;IACzB,yBAAyB,CAAwC;IAEjE,uBAAuB,GAAG,CAAC,CAAC;IAE5B,uCAAuC,GAAG,KAAK,CAAC;IAEhD,YAAY,iBAAuD,EAAE,eAAuB,EAAE,wBAA+D;QACzJ,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"chunksIterator.js","sourceRoot":"","sources":["../../../../src/uploader/chunksIterator/chunksIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContinuousChunk } from \"../state/continuousChunksCalculator.js\";\r\n\r\nexport default class ChunksIterator {\r\n #alreadySentChunks: readonly Readonly<ContinuousChunk>[];\r\n #fileSizeInBytes: number;\r\n #currentChunkSizeProvider: { readonly currentChunkSize: number };\r\n\r\n #nextChunkStartPosition = 0;\r\n\r\n #isValueAlreadyReturnedForZeroBytesFile = false;\r\n\r\n constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, currentChunkSizeProvider: { readonly currentChunkSize: number }) {\r\n this.#alreadySentChunks = this.sanitizeChunks(alreadySentChunks);\r\n this.#fileSizeInBytes = fileSizeInBytes;\r\n this.#currentChunkSizeProvider = currentChunkSizeProvider;\r\n }\r\n\r\n // This is an anti corruption layer that can be removed after everybody migrates to desktop > 4.8.2\r\n private sanitizeChunks(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): readonly Readonly<ContinuousChunk>[] {\r\n return this.removeZeroByteChunks(alreadySentChunks);\r\n }\r\n\r\n private removeZeroByteChunks(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): readonly Readonly<ContinuousChunk>[] {\r\n return alreadySentChunks.filter(c => c.sizeInBytes > 0);\r\n }\r\n\r\n getChunksIterator(): IterableIterator<ContinuousChunk> {\r\n return {\r\n [Symbol.iterator](): IterableIterator<ContinuousChunk> {\r\n return this;\r\n },\r\n next: (): IteratorResult<ContinuousChunk> => {\r\n if (this.isZeroBytesFilesCase())\r\n return this.getNextIteratorValueForZeroBytesFile();\r\n\r\n return this.getNextIteratorValue();\r\n },\r\n };\r\n }\r\n\r\n private isZeroBytesFilesCase(): boolean {\r\n return this.#fileSizeInBytes === 0;\r\n }\r\n\r\n private getNextIteratorValueForZeroBytesFile(): IteratorResult<ContinuousChunk> {\r\n if (this.#isValueAlreadyReturnedForZeroBytesFile)\r\n return { value: null, done: true };\r\n\r\n this.#isValueAlreadyReturnedForZeroBytesFile = true;\r\n\r\n return { value: { startPosition: 0, sizeInBytes: 0 }, done: false };\r\n }\r\n\r\n private getNextIteratorValue(): IteratorResult<ContinuousChunk> {\r\n const startPosition = this.getChunkStartPosition(this.#nextChunkStartPosition);\r\n\r\n if (startPosition === this.#fileSizeInBytes)\r\n return { value: null, done: true };\r\n\r\n const sizeInBytes = this.getChunkSizeInBytes(startPosition);\r\n\r\n this.#nextChunkStartPosition = startPosition + sizeInBytes;\r\n\r\n return { value: { startPosition, sizeInBytes }, done: false };\r\n }\r\n\r\n private getChunkStartPosition(nextChunkStartPosition: number): number {\r\n const alreadySentChunkStartingHere = this.#alreadySentChunks.find(c => c.startPosition === nextChunkStartPosition);\r\n\r\n if (!alreadySentChunkStartingHere)\r\n return nextChunkStartPosition;\r\n\r\n const newNextChunkStartPosition = nextChunkStartPosition + alreadySentChunkStartingHere.sizeInBytes;\r\n\r\n return this.getChunkStartPosition(newNextChunkStartPosition);\r\n }\r\n\r\n private getChunkSizeInBytes(newChunkStartPosition: number) {\r\n const currentMaxChunkSize = this.#currentChunkSizeProvider.currentChunkSize;\r\n const newChunkEndPosition = newChunkStartPosition + currentMaxChunkSize - 1;\r\n\r\n const alreadySentChunkStartingInTheMiddle = this.#alreadySentChunks.find(c => newChunkStartPosition < c.startPosition && c.startPosition <= newChunkEndPosition);\r\n\r\n if (alreadySentChunkStartingInTheMiddle)\r\n return alreadySentChunkStartingInTheMiddle.startPosition - newChunkStartPosition;\r\n\r\n const chunkEndsBeyondFile = newChunkEndPosition >= this.#fileSizeInBytes;\r\n\r\n if (chunkEndsBeyondFile)\r\n return this.#fileSizeInBytes - newChunkStartPosition;\r\n\r\n return currentMaxChunkSize;\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuousChunksCalculator.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/continuousChunksCalculator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,0BAA0B;;IAG3C,MAAM,IAAI,+BAA+B;IAIzC,OAAO,CAAC,aAAa,EAAE,+BAA+B;IAItD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAIxE,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAI5D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,eAAe;
|
|
1
|
+
{"version":3,"file":"continuousChunksCalculator.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/continuousChunksCalculator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,0BAA0B;;IAG3C,MAAM,IAAI,+BAA+B;IAIzC,OAAO,CAAC,aAAa,EAAE,+BAA+B;IAItD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAIxE,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAI5D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,eAAe;IAY9D,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,iCAAiC;IAWzC,OAAO,CAAC,+BAA+B;IAKvC,OAAO,CAAC,6BAA6B;IAMrC,OAAO,CAAC,0BAA0B;CAIrC;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,+BAA+B,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC"}
|
|
@@ -13,6 +13,8 @@ export default class ContinuousChunksCalculator {
|
|
|
13
13
|
return this.getChunks(fileId).reduce((partialSum, chunk) => partialSum + chunk.sizeInBytes, 0);
|
|
14
14
|
}
|
|
15
15
|
addNewChunk(fileId, newChunk) {
|
|
16
|
+
if (newChunk.sizeInBytes === 0)
|
|
17
|
+
return;
|
|
16
18
|
if (!this.#filesChunks.has(fileId)) {
|
|
17
19
|
this.initializeNewFileWithNewChunk(fileId, newChunk);
|
|
18
20
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuousChunksCalculator.js","sourceRoot":"","sources":["../../../../src/uploader/state/continuousChunksCalculator.ts"],"names":[],"mappings":"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","sourcesContent":["export default class ContinuousChunksCalculator {\r\n #filesChunks: Map<string | number, ContinuousChunk[]> = new Map();\r\n\r\n export(): ContinuousChunksCalculatorState {\r\n return Array.from(this.#filesChunks.entries());\r\n }\r\n\r\n recover(exportedState: ContinuousChunksCalculatorState) {\r\n this.#filesChunks = new Map(exportedState);\r\n }\r\n\r\n getChunks(fileId: string | number): readonly Readonly<ContinuousChunk>[] {\r\n return this.#filesChunks.get(fileId) ?? [];\r\n }\r\n\r\n getChunksUploadedBytesCount(fileId: string | number): number {\r\n return this.getChunks(fileId).reduce((partialSum, chunk) => partialSum + chunk.sizeInBytes, 0);\r\n }\r\n\r\n addNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n if (!this.#filesChunks.has(fileId)) {\r\n this.initializeNewFileWithNewChunk(fileId, newChunk);\r\n return;\r\n }\r\n\r\n this.processNewChunk(fileId, newChunk);\r\n }\r\n\r\n private initializeNewFileWithNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n const initValue = [newChunk];\r\n\r\n this.#filesChunks.set(fileId, initValue);\r\n\r\n return initValue;\r\n }\r\n\r\n private processNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n\r\n for (let i = 0; i < fileChunks.length; i++) {\r\n const nextChunkIndex = i + 1;\r\n\r\n const thisChunk = fileChunks[i]!;\r\n const nextChunk = fileChunks.length > nextChunkIndex ? fileChunks[nextChunkIndex] : undefined;\r\n\r\n const thisChunksNextContinuousChunkStartPosition = thisChunk.startPosition + thisChunk.sizeInBytes;\r\n const newChunksNextContinuousChunkStartPosition = newChunk.startPosition + newChunk.sizeInBytes;\r\n\r\n const isThisChunkStartingAfterNewChunk = thisChunk.startPosition > newChunk.startPosition;\r\n\r\n const canExtendThisChunk = thisChunksNextContinuousChunkStartPosition === newChunk.startPosition;\r\n const canJoinWithThisChunk = thisChunk.startPosition === newChunksNextContinuousChunkStartPosition;\r\n const canJoinWithNextChunk = nextChunk && nextChunk.startPosition === newChunksNextContinuousChunkStartPosition;\r\n\r\n if (canExtendThisChunk && canJoinWithNextChunk) {\r\n this.joinTwoExistingChunksWithNewChunk(fileId, i, newChunk, nextChunkIndex);\r\n return;\r\n }\r\n\r\n if (canExtendThisChunk) {\r\n this.extendExistingChunkWithNewChunk(fileId, i, newChunk);\r\n return;\r\n }\r\n\r\n if (canJoinWithThisChunk) {\r\n this.joinNewChunkWithExistingChunk(fileId, newChunk, i);\r\n return;\r\n }\r\n\r\n if (isThisChunkStartingAfterNewChunk) {\r\n this.insertNewChunkIntoSequence(fileId, i, newChunk);\r\n return;\r\n }\r\n }\r\n\r\n fileChunks.push(newChunk);\r\n }\r\n\r\n private joinTwoExistingChunksWithNewChunk(fileId: string | number, leftChunkIndex: number, newChunk: ContinuousChunk, rightChunkIndex: number) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n\r\n const leftChunk = fileChunks[leftChunkIndex]!;\r\n const rightChunk = fileChunks[rightChunkIndex]!;\r\n\r\n leftChunk.sizeInBytes += newChunk.sizeInBytes + rightChunk.sizeInBytes;\r\n\r\n fileChunks.splice(rightChunkIndex, 1);\r\n }\r\n\r\n private extendExistingChunkWithNewChunk(fileId: string | number, existingChunkIndex: number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks[existingChunkIndex]!.sizeInBytes += newChunk.sizeInBytes;\r\n }\r\n\r\n private joinNewChunkWithExistingChunk(fileId: string | number, newChunk: ContinuousChunk, existingChunkIndex: number) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks[existingChunkIndex]!.startPosition = newChunk.startPosition;\r\n fileChunks[existingChunkIndex]!.sizeInBytes += newChunk.sizeInBytes;\r\n }\r\n\r\n private insertNewChunkIntoSequence(fileId: string | number, indexToInsertAt: number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks.splice(indexToInsertAt, 0, newChunk);\r\n }\r\n}\r\n\r\nexport type ContinuousChunk = { startPosition: number, sizeInBytes: number };\r\nexport type ContinuousChunksCalculatorState = [string | number, ContinuousChunk[]][];"]}
|
|
1
|
+
{"version":3,"file":"continuousChunksCalculator.js","sourceRoot":"","sources":["../../../../src/uploader/state/continuousChunksCalculator.ts"],"names":[],"mappings":"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","sourcesContent":["export default class ContinuousChunksCalculator {\r\n #filesChunks: Map<string | number, ContinuousChunk[]> = new Map();\r\n\r\n export(): ContinuousChunksCalculatorState {\r\n return Array.from(this.#filesChunks.entries());\r\n }\r\n\r\n recover(exportedState: ContinuousChunksCalculatorState) {\r\n this.#filesChunks = new Map(exportedState);\r\n }\r\n\r\n getChunks(fileId: string | number): readonly Readonly<ContinuousChunk>[] {\r\n return this.#filesChunks.get(fileId) ?? [];\r\n }\r\n\r\n getChunksUploadedBytesCount(fileId: string | number): number {\r\n return this.getChunks(fileId).reduce((partialSum, chunk) => partialSum + chunk.sizeInBytes, 0);\r\n }\r\n\r\n addNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n if (newChunk.sizeInBytes === 0)\r\n return;\r\n\r\n if (!this.#filesChunks.has(fileId)) {\r\n this.initializeNewFileWithNewChunk(fileId, newChunk);\r\n return;\r\n }\r\n\r\n this.processNewChunk(fileId, newChunk);\r\n }\r\n\r\n private initializeNewFileWithNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n const initValue = [newChunk];\r\n\r\n this.#filesChunks.set(fileId, initValue);\r\n\r\n return initValue;\r\n }\r\n\r\n private processNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n\r\n for (let i = 0; i < fileChunks.length; i++) {\r\n const nextChunkIndex = i + 1;\r\n\r\n const thisChunk = fileChunks[i]!;\r\n const nextChunk = fileChunks.length > nextChunkIndex ? fileChunks[nextChunkIndex] : undefined;\r\n\r\n const thisChunksNextContinuousChunkStartPosition = thisChunk.startPosition + thisChunk.sizeInBytes;\r\n const newChunksNextContinuousChunkStartPosition = newChunk.startPosition + newChunk.sizeInBytes;\r\n\r\n const isThisChunkStartingAfterNewChunk = thisChunk.startPosition > newChunk.startPosition;\r\n\r\n const canExtendThisChunk = thisChunksNextContinuousChunkStartPosition === newChunk.startPosition;\r\n const canJoinWithThisChunk = thisChunk.startPosition === newChunksNextContinuousChunkStartPosition;\r\n const canJoinWithNextChunk = nextChunk && nextChunk.startPosition === newChunksNextContinuousChunkStartPosition;\r\n\r\n if (canExtendThisChunk && canJoinWithNextChunk) {\r\n this.joinTwoExistingChunksWithNewChunk(fileId, i, newChunk, nextChunkIndex);\r\n return;\r\n }\r\n\r\n if (canExtendThisChunk) {\r\n this.extendExistingChunkWithNewChunk(fileId, i, newChunk);\r\n return;\r\n }\r\n\r\n if (canJoinWithThisChunk) {\r\n this.joinNewChunkWithExistingChunk(fileId, newChunk, i);\r\n return;\r\n }\r\n\r\n if (isThisChunkStartingAfterNewChunk) {\r\n this.insertNewChunkIntoSequence(fileId, i, newChunk);\r\n return;\r\n }\r\n }\r\n\r\n fileChunks.push(newChunk);\r\n }\r\n\r\n private joinTwoExistingChunksWithNewChunk(fileId: string | number, leftChunkIndex: number, newChunk: ContinuousChunk, rightChunkIndex: number) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n\r\n const leftChunk = fileChunks[leftChunkIndex]!;\r\n const rightChunk = fileChunks[rightChunkIndex]!;\r\n\r\n leftChunk.sizeInBytes += newChunk.sizeInBytes + rightChunk.sizeInBytes;\r\n\r\n fileChunks.splice(rightChunkIndex, 1);\r\n }\r\n\r\n private extendExistingChunkWithNewChunk(fileId: string | number, existingChunkIndex: number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks[existingChunkIndex]!.sizeInBytes += newChunk.sizeInBytes;\r\n }\r\n\r\n private joinNewChunkWithExistingChunk(fileId: string | number, newChunk: ContinuousChunk, existingChunkIndex: number) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks[existingChunkIndex]!.startPosition = newChunk.startPosition;\r\n fileChunks[existingChunkIndex]!.sizeInBytes += newChunk.sizeInBytes;\r\n }\r\n\r\n private insertNewChunkIntoSequence(fileId: string | number, indexToInsertAt: number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks.splice(indexToInsertAt, 0, newChunk);\r\n }\r\n}\r\n\r\nexport type ContinuousChunk = { startPosition: number, sizeInBytes: number };\r\nexport type ContinuousChunksCalculatorState = [string | number, ContinuousChunk[]][];"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadState.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAEnE,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAKjE,OAAO,KAAK,kBAAkB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,WAAW,MAAM,uCAAuC,CAAC;AAMrE,OAAO,KAAK,+BAA+B,MAAM,sCAAsC,CAAC;AACxF,OAAO,KAAK,gCAAgC,MAAM,uCAAuC,CAAC;AAE1F,OAAO,KAAK,yBAAyB,MAAM,wCAAwC,CAAC;AAEpF,OAAO,KAAK,sBAAsB,MAAM,qCAAqC,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,CAAC,OAAO,OAAO,mBAAmB;;IAmBpC,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,KAAK,IAAI,gCAAgC,CAE5C;gBAEW,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM;gBAChI,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,EAAE,aAAa,EAAE,yBAAyB;IAgBtL,OAAO,CAAC,wBAAwB;IAQhC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAInF,MAAM,IAAI,yBAAyB;IAInC,OAAO;IAuBP,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,+BAA+B;IAIzE,OAAO,CAAC,eAAe;IASvB,WAAW;IAQX,sBAAsB;IAMtB,cAAc;IAQd,sBAAsB;IAMtB,eAAe;IAkBf,uBAAuB;IAMvB,gBAAgB;IAQhB,iBAAiB,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM;IASvF,cAAc;IAQd,iBAAiB,CAAC,IAAI,EAAE,uBAAuB;IAO/C,mBAAmB,CAAC,IAAI,EAAE,uBAAuB;IAUjD,gBAAgB,CAAC,IAAI,EAAE,uBAAuB;IAU9C,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAYxG,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,GAAG,IAAI;IAcpJ,OAAO,CAAC,iCAAiC;IAczC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS;IAqBtI,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"transferUploadState.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAEnE,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAKjE,OAAO,KAAK,kBAAkB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,WAAW,MAAM,uCAAuC,CAAC;AAMrE,OAAO,KAAK,+BAA+B,MAAM,sCAAsC,CAAC;AACxF,OAAO,KAAK,gCAAgC,MAAM,uCAAuC,CAAC;AAE1F,OAAO,KAAK,yBAAyB,MAAM,wCAAwC,CAAC;AAEpF,OAAO,KAAK,sBAAsB,MAAM,qCAAqC,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,CAAC,OAAO,OAAO,mBAAmB;;IAmBpC,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,KAAK,IAAI,gCAAgC,CAE5C;gBAEW,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM;gBAChI,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,EAAE,aAAa,EAAE,yBAAyB;IAgBtL,OAAO,CAAC,wBAAwB;IAQhC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAInF,MAAM,IAAI,yBAAyB;IAInC,OAAO;IAuBP,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,+BAA+B;IAIzE,OAAO,CAAC,eAAe;IASvB,WAAW;IAQX,sBAAsB;IAMtB,cAAc;IAQd,sBAAsB;IAMtB,eAAe;IAkBf,uBAAuB;IAMvB,gBAAgB;IAQhB,iBAAiB,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM;IASvF,cAAc;IAQd,iBAAiB,CAAC,IAAI,EAAE,uBAAuB;IAO/C,mBAAmB,CAAC,IAAI,EAAE,uBAAuB;IAUjD,gBAAgB,CAAC,IAAI,EAAE,uBAAuB;IAU9C,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAYxG,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,GAAG,IAAI;IAcpJ,OAAO,CAAC,iCAAiC;IAczC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS;IAqBtI,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAyB3L,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAsB1K"}
|
|
@@ -217,7 +217,8 @@ export default class TransferUploadState {
|
|
|
217
217
|
this.#failedBytesCount += failedBytes;
|
|
218
218
|
if (!file.failedReason)
|
|
219
219
|
file.failedReason = isPauseRequested ? `Pause requested` : `Chunk upload completed partially`;
|
|
220
|
-
|
|
220
|
+
if (uploadedBytesCount > 0)
|
|
221
|
+
this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes: uploadedBytesCount });
|
|
221
222
|
this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);
|
|
222
223
|
const eventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, uploadedBytesCount, isPauseRequested, latencyInMsIfUdp };
|
|
223
224
|
this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadState.js","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\r\nimport throttle from 'lodash.throttle';\r\n\r\nimport TransferUploadStateFile from \"./transferUploadStateFile.js\";\r\nimport TransferUploadEvent from \"../transferUploadEvent.js\";\r\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport TransferUploadError from \"../transferUploadError.js\";\r\nimport TransferUploadRatesCalculator from \"./transferUploadProgressCalculator.js\";\r\nimport ContinuousChunksCalculator from './continuousChunksCalculator.js';\r\n\r\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\r\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\r\nimport type FileDetails from \"../../utils/fileSystem/fileDetails.js\";\r\nimport type TransferUploadStateFiles from \"./transferUploadStateFiles.js\";\r\nimport type FileChunkUploadFailedEventArgs from \"../eventArgs/fileChunkUploadFailedEventArgs.js\";\r\nimport type FileChunkUploadEventArgs from \"../eventArgs/fileChunkUploadEventArgs.js\";\r\nimport type FileUploadEventArgs from \"../eventArgs/fileUploadEventArgs.js\";\r\nimport type TransferUploadCompletedEventArgs from \"../eventArgs/transferUploadCompletedEventArgs.js\";\r\nimport type ReadonlyTransferUploadStateFile from \"./readonlyTransferUploadStateFile.js\";\r\nimport type ReadonlyTransferUploadStateFiles from \"./readonlyTransferUploadStateFiles.js\";\r\nimport type FileUploadFailedEventArgs from \"../eventArgs/fileUploadFailedEventArgs.js\";\r\nimport type TransferUploadExportState from \"../export/transferUploadExportState.js\";\r\nimport type TransferUploadProgressedEventArgs from \"../eventArgs/transferUploadProgressedEventArgs.js\";\r\nimport type TransferUploadMetadata from '../export/transferUploadMetadata.js';\r\nimport type FileChunkUploadProgressedEventArgs from '../eventArgs/fileChunkUploadProgressedEventArgs.js';\r\nimport type { ContinuousChunk } from './continuousChunksCalculator.js';\r\nimport type FileChunkUploadCompletedPartiallyEventArgs from '../eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js';\r\nimport type FileChunkUploadCompletedEventArgs from '../eventArgs/fileChunkUploadCompletedEventArgs.js';\r\n\r\nexport default class TransferUploadState {\r\n #status: TransferStatus = TransferStatus.Initialized;\r\n\r\n #completedFilesCount = 0;\r\n #failedFilesCount = 0;\r\n #files: TransferUploadStateFiles = {};\r\n #eventsEngine: EventsEngine;\r\n\r\n #ratesCalculator: TransferUploadRatesCalculator;\r\n #continuousChunkCalculator: ContinuousChunksCalculator;\r\n #currentRatesTimespanInMs: number;\r\n\r\n #uploadedBytesCount = 0;\r\n #failedBytesCount = 0;\r\n\r\n #totalBytesCount = 0;\r\n\r\n #getRatesAndNotifyUploadProgressedThrottled: ReturnType<typeof throttle<TransferUploadState[`getRatesAndNotifyUploadProgressed`]>>;\r\n\r\n get status(): TransferStatus {\r\n return this.#status;\r\n }\r\n\r\n get completedFilesCount(): number {\r\n return this.#completedFilesCount;\r\n }\r\n\r\n get failedFilesCount(): number {\r\n return this.#failedFilesCount;\r\n }\r\n\r\n get uploadedBytesCount(): number {\r\n return this.#uploadedBytesCount;\r\n }\r\n\r\n get failedBytesCount(): number {\r\n return this.#failedBytesCount;\r\n }\r\n\r\n get files(): ReadonlyTransferUploadStateFiles {\r\n return this.#files;\r\n }\r\n\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number)\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number, exportedState: TransferUploadExportState)\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number, exportedState?: TransferUploadExportState) {\r\n this.#eventsEngine = eventsEngine;\r\n this.#currentRatesTimespanInMs = currentRatesTimespanInMs;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled = throttle(this.getRatesAndNotifyUploadProgressed, progressEventThrottlingInMs);\r\n\r\n this.initializeTransferStatus(files);\r\n\r\n this.#ratesCalculator = new TransferUploadRatesCalculator(this.#totalBytesCount, this.#currentRatesTimespanInMs);\r\n this.#continuousChunkCalculator = new ContinuousChunksCalculator();\r\n\r\n if (exportedState)\r\n this.recoverFromExportedState(exportedState);\r\n }\r\n\r\n private initializeTransferStatus(filesDetails: readonly FileDetails[]) {\r\n for (const file of filesDetails) {\r\n this.#files[file.externalId] = new TransferUploadStateFile(file.externalId, file.fileSizeInBytes, file.fileName);\r\n\r\n this.#totalBytesCount += file.fileSizeInBytes;\r\n }\r\n }\r\n\r\n getChunksForFile(externalId: string | number): readonly Readonly<ContinuousChunk>[] {\r\n return this.#continuousChunkCalculator.getChunks(externalId);\r\n }\r\n\r\n export(): TransferUploadExportState {\r\n return this.#continuousChunkCalculator.export();\r\n }\r\n\r\n recover() {\r\n this.#status = TransferStatus.Initialized;\r\n this.#completedFilesCount = 0;\r\n this.#uploadedBytesCount = 0;\r\n this.#failedFilesCount = 0;\r\n this.#failedBytesCount = 0;\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n file.isBeingUploaded = false;\r\n file.runningChunksCount = 0;\r\n file.isFailed = false;\r\n file.failedReason = null;\r\n file.failedBytesCount = 0;\r\n\r\n if (file.isCompleted)\r\n this.#completedFilesCount += 1;\r\n\r\n file.uploadedBytesCount = this.#continuousChunkCalculator.getChunksUploadedBytesCount(file.externalId);\r\n\r\n this.#uploadedBytesCount += file.uploadedBytesCount;\r\n }\r\n }\r\n\r\n private recoverFromExportedState(exportedState: TransferUploadExportState) {\r\n this.#continuousChunkCalculator.recover(exportedState);\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n const fileChunks = this.#continuousChunkCalculator.getChunks(file.externalId);\r\n\r\n file.isCompleted = fileChunks.length === 1 && fileChunks[0]!.startPosition === 0 && fileChunks[0]!.sizeInBytes === file.fileSizeInBytes;\r\n file.uploadedBytesCount = this.#continuousChunkCalculator.getChunksUploadedBytesCount(file.externalId);\r\n\r\n if (file.isCompleted)\r\n this.#completedFilesCount += 1;\r\n\r\n this.#uploadedBytesCount += file.uploadedBytesCount;\r\n }\r\n }\r\n\r\n getFile(externalFileId: string | number): ReadonlyTransferUploadStateFile {\r\n return this.getFileInternal(externalFileId);\r\n }\r\n\r\n private getFileInternal(externalFileId: string | number): TransferUploadStateFile {\r\n const file = this.#files[externalFileId];\r\n\r\n if (!file)\r\n throw new TransferUploadError(`File with id = ${externalFileId} doesn't exist`);\r\n\r\n return file;\r\n }\r\n\r\n transferRun() {\r\n this.#status = TransferStatus.Running;\r\n\r\n this.#ratesCalculator = new TransferUploadRatesCalculator(this.#totalBytesCount, this.#currentRatesTimespanInMs);\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferRun);\r\n }\r\n\r\n transferPauseRequested() {\r\n this.#status = TransferStatus.Pausing;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferPauseRequested);\r\n }\r\n\r\n transferPaused() {\r\n this.#status = TransferStatus.Paused;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.flush();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferPaused);\r\n }\r\n\r\n transferAbortRequested() {\r\n this.#status = TransferStatus.Aborting;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferAbortRequested);\r\n }\r\n\r\n transferAborted() {\r\n this.#status = TransferStatus.Aborted;\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n if (file.isBeingUploaded) {\r\n file.isBeingUploaded = false;\r\n file.isFailed = true;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = `Aborted`;\r\n }\r\n }\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferAborted);\r\n }\r\n\r\n transferCancelRequested() {\r\n this.#status = TransferStatus.Canceling;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCancelRequested);\r\n }\r\n\r\n transferCanceled() {\r\n this.#status = TransferStatus.Canceled;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCanceled);\r\n }\r\n\r\n transferCompleted(transferMetadata: TransferUploadMetadata, transferDownloadUrl: string) {\r\n this.#status = TransferStatus.Completed;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.flush();\r\n\r\n const eventArgs: TransferUploadCompletedEventArgs = { transferId: transferMetadata.transferId, transferKey: transferMetadata.transferKey, transferDownloadUrl };\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCompleted, eventArgs);\r\n }\r\n\r\n transferFailed() {\r\n this.#status = TransferStatus.Failed;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);\r\n }\r\n\r\n fileUploadStarted(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = true;\r\n\r\n const eventArgs: FileUploadEventArgs = { fileStatus: file };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadStarted, eventArgs);\r\n }\r\n\r\n fileUploadCompleted(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = false;\r\n file.isCompleted = true;\r\n\r\n this.#completedFilesCount += 1;\r\n\r\n const eventArgs: FileUploadEventArgs = { fileStatus: file };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadCompleted, eventArgs);\r\n }\r\n\r\n fileUploadFailed(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = false;\r\n file.isFailed = true;\r\n\r\n this.#failedFilesCount += 1;\r\n\r\n const eventArgs: FileUploadFailedEventArgs = { fileStatus: file, reason: file.failedReason };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadFailed, eventArgs);\r\n }\r\n\r\n chunkUploadStarted(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n if (!file.isBeingUploaded)\r\n this.fileUploadStarted(file);\r\n\r\n file.runningChunksCount += 1;\r\n\r\n const eventArgs: FileChunkUploadEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadStarted, eventArgs);\r\n }\r\n\r\n chunkUploadProgressed(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number, apiEventArgs: ChunkProgressEvent): void {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.uploadedBytesCount += apiEventArgs.transferredBytesSinceLastEvent;\r\n this.#uploadedBytesCount += apiEventArgs.transferredBytesSinceLastEvent;\r\n\r\n this.#ratesCalculator.addNewProgressEvent(apiEventArgs.transferredBytesSinceLastEvent);\r\n\r\n const eventArgs: FileChunkUploadProgressedEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes, transferredBytesSinceLastEvent: apiEventArgs.transferredBytesSinceLastEvent };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadProgressed, eventArgs);\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled();\r\n }\r\n\r\n private getRatesAndNotifyUploadProgressed() {\r\n const progressStats = this.#ratesCalculator.getRates(this.#uploadedBytesCount);\r\n\r\n const tranferEventArgs: TransferUploadProgressedEventArgs = {\r\n uploadedBytesTotalCount: this.#uploadedBytesCount,\r\n progressInPercentage: (this.#uploadedBytesCount * 100) / this.#totalBytesCount,\r\n remainingSeconds: progressStats.remainingSeconds,\r\n averageSpeedInBytesPerSecond: progressStats.averageSpeedInBytesPerSec,\r\n currentSpeedInBytesPerSecond: progressStats.currentSpeedInBytesPerSec,\r\n };\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferProgressed, tranferEventArgs);\r\n }\r\n\r\n chunkUploadCompleted(externalFileId: string | number, startPosition: number, sizeInBytes: number, latencyInMsIfUdp: number | undefined) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes });\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\r\n\r\n const eventArgs: FileChunkUploadCompletedEventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, latencyInMsIfUdp };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompleted, eventArgs);\r\n\r\n if (file.runningChunksCount > 0)\r\n return;\r\n\r\n if (file.uploadedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadCompleted(file);\r\n else if (file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n\r\n chunkUploadCompletedPartially(externalFileId: string | number, startPosition: number, sizeInBytes: number, uploadedBytesCount: number, isPauseRequested: boolean, latencyInMsIfUdp?: number) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n const failedBytes = sizeInBytes - uploadedBytesCount;\r\n\r\n file.failedBytesCount += failedBytes;\r\n this.#failedBytesCount += failedBytes;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = isPauseRequested ? `Pause requested` : `Chunk upload completed partially`;\r\n\r\n this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes: uploadedBytesCount });\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\r\n\r\n const eventArgs: FileChunkUploadCompletedPartiallyEventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, uploadedBytesCount, isPauseRequested, latencyInMsIfUdp };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs);\r\n\r\n if (file.runningChunksCount === 0 && file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n\r\n chunkUploadFailed(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number, uploadedBytesCount: number, failedReason: string, error: Error) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n const failedBytes = chunkSizeInBytes;\r\n\r\n file.uploadedBytesCount -= uploadedBytesCount;\r\n file.failedBytesCount += failedBytes;\r\n\r\n this.#uploadedBytesCount -= uploadedBytesCount;\r\n this.#failedBytesCount += failedBytes;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = failedReason;\r\n\r\n const eventArgs: FileChunkUploadFailedEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes, reason: failedReason, error };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadFailed, eventArgs);\r\n\r\n if (file.runningChunksCount === 0 && file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"transferUploadState.js","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\r\nimport throttle from 'lodash.throttle';\r\n\r\nimport TransferUploadStateFile from \"./transferUploadStateFile.js\";\r\nimport TransferUploadEvent from \"../transferUploadEvent.js\";\r\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport TransferUploadError from \"../transferUploadError.js\";\r\nimport TransferUploadRatesCalculator from \"./transferUploadProgressCalculator.js\";\r\nimport ContinuousChunksCalculator from './continuousChunksCalculator.js';\r\n\r\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\r\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\r\nimport type FileDetails from \"../../utils/fileSystem/fileDetails.js\";\r\nimport type TransferUploadStateFiles from \"./transferUploadStateFiles.js\";\r\nimport type FileChunkUploadFailedEventArgs from \"../eventArgs/fileChunkUploadFailedEventArgs.js\";\r\nimport type FileChunkUploadEventArgs from \"../eventArgs/fileChunkUploadEventArgs.js\";\r\nimport type FileUploadEventArgs from \"../eventArgs/fileUploadEventArgs.js\";\r\nimport type TransferUploadCompletedEventArgs from \"../eventArgs/transferUploadCompletedEventArgs.js\";\r\nimport type ReadonlyTransferUploadStateFile from \"./readonlyTransferUploadStateFile.js\";\r\nimport type ReadonlyTransferUploadStateFiles from \"./readonlyTransferUploadStateFiles.js\";\r\nimport type FileUploadFailedEventArgs from \"../eventArgs/fileUploadFailedEventArgs.js\";\r\nimport type TransferUploadExportState from \"../export/transferUploadExportState.js\";\r\nimport type TransferUploadProgressedEventArgs from \"../eventArgs/transferUploadProgressedEventArgs.js\";\r\nimport type TransferUploadMetadata from '../export/transferUploadMetadata.js';\r\nimport type FileChunkUploadProgressedEventArgs from '../eventArgs/fileChunkUploadProgressedEventArgs.js';\r\nimport type { ContinuousChunk } from './continuousChunksCalculator.js';\r\nimport type FileChunkUploadCompletedPartiallyEventArgs from '../eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js';\r\nimport type FileChunkUploadCompletedEventArgs from '../eventArgs/fileChunkUploadCompletedEventArgs.js';\r\n\r\nexport default class TransferUploadState {\r\n #status: TransferStatus = TransferStatus.Initialized;\r\n\r\n #completedFilesCount = 0;\r\n #failedFilesCount = 0;\r\n #files: TransferUploadStateFiles = {};\r\n #eventsEngine: EventsEngine;\r\n\r\n #ratesCalculator: TransferUploadRatesCalculator;\r\n #continuousChunkCalculator: ContinuousChunksCalculator;\r\n #currentRatesTimespanInMs: number;\r\n\r\n #uploadedBytesCount = 0;\r\n #failedBytesCount = 0;\r\n\r\n #totalBytesCount = 0;\r\n\r\n #getRatesAndNotifyUploadProgressedThrottled: ReturnType<typeof throttle<TransferUploadState[`getRatesAndNotifyUploadProgressed`]>>;\r\n\r\n get status(): TransferStatus {\r\n return this.#status;\r\n }\r\n\r\n get completedFilesCount(): number {\r\n return this.#completedFilesCount;\r\n }\r\n\r\n get failedFilesCount(): number {\r\n return this.#failedFilesCount;\r\n }\r\n\r\n get uploadedBytesCount(): number {\r\n return this.#uploadedBytesCount;\r\n }\r\n\r\n get failedBytesCount(): number {\r\n return this.#failedBytesCount;\r\n }\r\n\r\n get files(): ReadonlyTransferUploadStateFiles {\r\n return this.#files;\r\n }\r\n\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number)\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number, exportedState: TransferUploadExportState)\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number, exportedState?: TransferUploadExportState) {\r\n this.#eventsEngine = eventsEngine;\r\n this.#currentRatesTimespanInMs = currentRatesTimespanInMs;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled = throttle(this.getRatesAndNotifyUploadProgressed, progressEventThrottlingInMs);\r\n\r\n this.initializeTransferStatus(files);\r\n\r\n this.#ratesCalculator = new TransferUploadRatesCalculator(this.#totalBytesCount, this.#currentRatesTimespanInMs);\r\n this.#continuousChunkCalculator = new ContinuousChunksCalculator();\r\n\r\n if (exportedState)\r\n this.recoverFromExportedState(exportedState);\r\n }\r\n\r\n private initializeTransferStatus(filesDetails: readonly FileDetails[]) {\r\n for (const file of filesDetails) {\r\n this.#files[file.externalId] = new TransferUploadStateFile(file.externalId, file.fileSizeInBytes, file.fileName);\r\n\r\n this.#totalBytesCount += file.fileSizeInBytes;\r\n }\r\n }\r\n\r\n getChunksForFile(externalId: string | number): readonly Readonly<ContinuousChunk>[] {\r\n return this.#continuousChunkCalculator.getChunks(externalId);\r\n }\r\n\r\n export(): TransferUploadExportState {\r\n return this.#continuousChunkCalculator.export();\r\n }\r\n\r\n recover() {\r\n this.#status = TransferStatus.Initialized;\r\n this.#completedFilesCount = 0;\r\n this.#uploadedBytesCount = 0;\r\n this.#failedFilesCount = 0;\r\n this.#failedBytesCount = 0;\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n file.isBeingUploaded = false;\r\n file.runningChunksCount = 0;\r\n file.isFailed = false;\r\n file.failedReason = null;\r\n file.failedBytesCount = 0;\r\n\r\n if (file.isCompleted)\r\n this.#completedFilesCount += 1;\r\n\r\n file.uploadedBytesCount = this.#continuousChunkCalculator.getChunksUploadedBytesCount(file.externalId);\r\n\r\n this.#uploadedBytesCount += file.uploadedBytesCount;\r\n }\r\n }\r\n\r\n private recoverFromExportedState(exportedState: TransferUploadExportState) {\r\n this.#continuousChunkCalculator.recover(exportedState);\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n const fileChunks = this.#continuousChunkCalculator.getChunks(file.externalId);\r\n\r\n file.isCompleted = fileChunks.length === 1 && fileChunks[0]!.startPosition === 0 && fileChunks[0]!.sizeInBytes === file.fileSizeInBytes;\r\n file.uploadedBytesCount = this.#continuousChunkCalculator.getChunksUploadedBytesCount(file.externalId);\r\n\r\n if (file.isCompleted)\r\n this.#completedFilesCount += 1;\r\n\r\n this.#uploadedBytesCount += file.uploadedBytesCount;\r\n }\r\n }\r\n\r\n getFile(externalFileId: string | number): ReadonlyTransferUploadStateFile {\r\n return this.getFileInternal(externalFileId);\r\n }\r\n\r\n private getFileInternal(externalFileId: string | number): TransferUploadStateFile {\r\n const file = this.#files[externalFileId];\r\n\r\n if (!file)\r\n throw new TransferUploadError(`File with id = ${externalFileId} doesn't exist`);\r\n\r\n return file;\r\n }\r\n\r\n transferRun() {\r\n this.#status = TransferStatus.Running;\r\n\r\n this.#ratesCalculator = new TransferUploadRatesCalculator(this.#totalBytesCount, this.#currentRatesTimespanInMs);\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferRun);\r\n }\r\n\r\n transferPauseRequested() {\r\n this.#status = TransferStatus.Pausing;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferPauseRequested);\r\n }\r\n\r\n transferPaused() {\r\n this.#status = TransferStatus.Paused;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.flush();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferPaused);\r\n }\r\n\r\n transferAbortRequested() {\r\n this.#status = TransferStatus.Aborting;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferAbortRequested);\r\n }\r\n\r\n transferAborted() {\r\n this.#status = TransferStatus.Aborted;\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n if (file.isBeingUploaded) {\r\n file.isBeingUploaded = false;\r\n file.isFailed = true;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = `Aborted`;\r\n }\r\n }\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferAborted);\r\n }\r\n\r\n transferCancelRequested() {\r\n this.#status = TransferStatus.Canceling;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCancelRequested);\r\n }\r\n\r\n transferCanceled() {\r\n this.#status = TransferStatus.Canceled;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCanceled);\r\n }\r\n\r\n transferCompleted(transferMetadata: TransferUploadMetadata, transferDownloadUrl: string) {\r\n this.#status = TransferStatus.Completed;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.flush();\r\n\r\n const eventArgs: TransferUploadCompletedEventArgs = { transferId: transferMetadata.transferId, transferKey: transferMetadata.transferKey, transferDownloadUrl };\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCompleted, eventArgs);\r\n }\r\n\r\n transferFailed() {\r\n this.#status = TransferStatus.Failed;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);\r\n }\r\n\r\n fileUploadStarted(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = true;\r\n\r\n const eventArgs: FileUploadEventArgs = { fileStatus: file };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadStarted, eventArgs);\r\n }\r\n\r\n fileUploadCompleted(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = false;\r\n file.isCompleted = true;\r\n\r\n this.#completedFilesCount += 1;\r\n\r\n const eventArgs: FileUploadEventArgs = { fileStatus: file };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadCompleted, eventArgs);\r\n }\r\n\r\n fileUploadFailed(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = false;\r\n file.isFailed = true;\r\n\r\n this.#failedFilesCount += 1;\r\n\r\n const eventArgs: FileUploadFailedEventArgs = { fileStatus: file, reason: file.failedReason };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadFailed, eventArgs);\r\n }\r\n\r\n chunkUploadStarted(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n if (!file.isBeingUploaded)\r\n this.fileUploadStarted(file);\r\n\r\n file.runningChunksCount += 1;\r\n\r\n const eventArgs: FileChunkUploadEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadStarted, eventArgs);\r\n }\r\n\r\n chunkUploadProgressed(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number, apiEventArgs: ChunkProgressEvent): void {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.uploadedBytesCount += apiEventArgs.transferredBytesSinceLastEvent;\r\n this.#uploadedBytesCount += apiEventArgs.transferredBytesSinceLastEvent;\r\n\r\n this.#ratesCalculator.addNewProgressEvent(apiEventArgs.transferredBytesSinceLastEvent);\r\n\r\n const eventArgs: FileChunkUploadProgressedEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes, transferredBytesSinceLastEvent: apiEventArgs.transferredBytesSinceLastEvent };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadProgressed, eventArgs);\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled();\r\n }\r\n\r\n private getRatesAndNotifyUploadProgressed() {\r\n const progressStats = this.#ratesCalculator.getRates(this.#uploadedBytesCount);\r\n\r\n const tranferEventArgs: TransferUploadProgressedEventArgs = {\r\n uploadedBytesTotalCount: this.#uploadedBytesCount,\r\n progressInPercentage: (this.#uploadedBytesCount * 100) / this.#totalBytesCount,\r\n remainingSeconds: progressStats.remainingSeconds,\r\n averageSpeedInBytesPerSecond: progressStats.averageSpeedInBytesPerSec,\r\n currentSpeedInBytesPerSecond: progressStats.currentSpeedInBytesPerSec,\r\n };\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferProgressed, tranferEventArgs);\r\n }\r\n\r\n chunkUploadCompleted(externalFileId: string | number, startPosition: number, sizeInBytes: number, latencyInMsIfUdp: number | undefined) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes });\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\r\n\r\n const eventArgs: FileChunkUploadCompletedEventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, latencyInMsIfUdp };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompleted, eventArgs);\r\n\r\n if (file.runningChunksCount > 0)\r\n return;\r\n\r\n if (file.uploadedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadCompleted(file);\r\n else if (file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n\r\n chunkUploadCompletedPartially(externalFileId: string | number, startPosition: number, sizeInBytes: number, uploadedBytesCount: number, isPauseRequested: boolean, latencyInMsIfUdp?: number) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n const failedBytes = sizeInBytes - uploadedBytesCount;\r\n\r\n file.failedBytesCount += failedBytes;\r\n this.#failedBytesCount += failedBytes;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = isPauseRequested ? `Pause requested` : `Chunk upload completed partially`;\r\n\r\n if (uploadedBytesCount > 0)\r\n this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes: uploadedBytesCount });\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\r\n\r\n const eventArgs: FileChunkUploadCompletedPartiallyEventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, uploadedBytesCount, isPauseRequested, latencyInMsIfUdp };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs);\r\n\r\n if (file.runningChunksCount === 0 && file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n\r\n chunkUploadFailed(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number, uploadedBytesCount: number, failedReason: string, error: Error) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n const failedBytes = chunkSizeInBytes;\r\n\r\n file.uploadedBytesCount -= uploadedBytesCount;\r\n file.failedBytesCount += failedBytes;\r\n\r\n this.#uploadedBytesCount -= uploadedBytesCount;\r\n this.#failedBytesCount += failedBytes;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = failedReason;\r\n\r\n const eventArgs: FileChunkUploadFailedEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes, reason: failedReason, error };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadFailed, eventArgs);\r\n\r\n if (file.runningChunksCount === 0 && file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTransferResponse.d.ts","sourceRoot":"","sources":["../../../../../src/utils/api/dtos/getTransferResponse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,sBAAsB,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AAExD,UAAU,mBAAmB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAe,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"getTransferResponse.d.ts","sourceRoot":"","sources":["../../../../../src/utils/api/dtos/getTransferResponse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,sBAAsB,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AAExD,UAAU,mBAAmB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTransferResponse.js","sourceRoot":"","sources":["../../../../../src/utils/api/dtos/getTransferResponse.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferCustomFieldDto from \"./transferCustomFieldDto.js\";\r\nimport type TransferFileDto from \"./transferFileDto.js\";\r\n\r\ninterface GetTransferResponse {\r\n id: string;\r\n url: string;\r\n numberoffiles?: number;\r\n size?: number;\r\n sentdate: number;\r\n compressedfileurl?: string;\r\n torrenturl?: string;\r\n from?: string;\r\n message?: string;\r\n subject?: string;\r\n to?: string[];\r\n files: TransferFileDto[];\r\n customfields: TransferCustomFieldDto[];\r\n isexpired?: boolean;\r\n blockdownloads?: boolean;\r\n passwordprotected: boolean;\r\n region?: string;\r\n e2ee?: boolean;\r\n e2ee_keyhash?: string;\r\n}\r\n\r\nexport default GetTransferResponse;"]}
|
|
1
|
+
{"version":3,"file":"getTransferResponse.js","sourceRoot":"","sources":["../../../../../src/utils/api/dtos/getTransferResponse.ts"],"names":[],"mappings":"","sourcesContent":["import type TransferCustomFieldDto from \"./transferCustomFieldDto.js\";\r\nimport type TransferFileDto from \"./transferFileDto.js\";\r\n\r\ninterface GetTransferResponse {\r\n id: string;\r\n trackid?: string;\r\n url: string;\r\n numberoffiles?: number;\r\n size?: number;\r\n sentdate: number;\r\n compressedfileurl?: string;\r\n torrenturl?: string;\r\n from?: string;\r\n message?: string;\r\n subject?: string;\r\n to?: string[];\r\n files: TransferFileDto[];\r\n customfields: TransferCustomFieldDto[];\r\n isexpired?: boolean;\r\n blockdownloads?: boolean;\r\n passwordprotected: boolean;\r\n region?: string;\r\n e2ee?: boolean;\r\n e2ee_keyhash?: string;\r\n}\r\n\r\nexport default GetTransferResponse;"]}
|
|
@@ -7,7 +7,6 @@ export default class WebClientBase extends ApiClientBase {
|
|
|
7
7
|
addEventListener(eventName: string, handler: (event: any) => void): void;
|
|
8
8
|
removeEventListener(eventName: string, handler: (event: any) => void): void;
|
|
9
9
|
protected createApiError(error: unknown, errorMessage: string, idleTimeoutSignal?: AbortSignal): ApiError;
|
|
10
|
-
protected isSuccessStatusCode(statusCode: number): boolean;
|
|
11
10
|
private getErrorHttpStatus;
|
|
12
11
|
private getErrorCause;
|
|
13
12
|
private tryGetErrorResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webClientBase.d.ts","sourceRoot":"","sources":["../../../../../src/utils/api/web/webClientBase.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAC;AAG7D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,aAAa;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;;IAOvC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIxE,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIlF,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,WAAW;IAM9F,
|
|
1
|
+
{"version":3,"file":"webClientBase.d.ts","sourceRoot":"","sources":["../../../../../src/utils/api/web/webClientBase.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAC;AAG7D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,aAAa;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;;IAOvC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIxE,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIlF,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,WAAW;IAM9F,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;CAkB7B"}
|
|
@@ -22,9 +22,6 @@ export default class WebClientBase extends ApiClientBase {
|
|
|
22
22
|
const httpStatus = this.getErrorHttpStatus(error);
|
|
23
23
|
return new ApiError(errorMessage, httpStatus, { cause });
|
|
24
24
|
}
|
|
25
|
-
isSuccessStatusCode(statusCode) {
|
|
26
|
-
return statusCode >= 200 && statusCode < 300;
|
|
27
|
-
}
|
|
28
25
|
getErrorHttpStatus(error) {
|
|
29
26
|
if (axios.isAxiosError(error))
|
|
30
27
|
return error.response?.status;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webClientBase.js","sourceRoot":"","sources":["../../../../../src/utils/api/web/webClientBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,gBAAgB,MAAM,wBAAwB,CAAC;AACtD,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,eAAe,MAAM,qCAAqC,CAAC;AAClE,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAKhD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,aAAa;IACjC,YAAY,CAAe;IAE9C;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,CAAC;IAEM,gBAAgB,CAAC,SAAiB,EAAE,OAA6B;QACpE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAEM,mBAAmB,CAAC,SAAiB,EAAE,OAA6B;QACvE,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAES,cAAc,CAAC,KAAc,EAAE,YAAoB,EAAE,iBAA+B;QAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;
|
|
1
|
+
{"version":3,"file":"webClientBase.js","sourceRoot":"","sources":["../../../../../src/utils/api/web/webClientBase.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, { AxiosError } from \"axios\";\r\n\r\nimport ApiError from \"../apiError.js\";\r\nimport ApiFilemailError from \"../apiFilemailError.js\";\r\nimport ApiFilemail449Error from \"../apiFilemail449Error.js\";\r\nimport { isBaseResponse } from \"../dtos/baseResponse.js\";\r\nimport WebEventsEngine from \"../../events/web/webEventsEngine.js\";\r\nimport ApiClientBase from \"../apiClientBase.js\";\r\n\r\nimport type EventsEngine from \"../../events/eventsEngine.js\";\r\nimport type { BaseResponse } from \"../dtos/baseResponse.js\";\r\n\r\nexport default class WebClientBase extends ApiClientBase {\r\n protected readonly eventsEngine: EventsEngine;\r\n\r\n constructor() {\r\n super();\r\n this.eventsEngine = new WebEventsEngine();\r\n }\r\n\r\n public addEventListener(eventName: string, handler: (event: any) => void): void {\r\n this.eventsEngine.addEventListener(eventName, handler);\r\n }\r\n\r\n public removeEventListener(eventName: string, handler: (event: any) => void): void {\r\n this.eventsEngine.removeEventListener(eventName, handler);\r\n }\r\n\r\n protected createApiError(error: unknown, errorMessage: string, idleTimeoutSignal?: AbortSignal) {\r\n const cause = this.getErrorCause(error, idleTimeoutSignal);\r\n const httpStatus = this.getErrorHttpStatus(error);\r\n return new ApiError(errorMessage, httpStatus, { cause });\r\n }\r\n\r\n private getErrorHttpStatus(error: unknown): number | undefined {\r\n if (axios.isAxiosError(error))\r\n return error.response?.status;\r\n\r\n return undefined;\r\n }\r\n\r\n private getErrorCause(error: unknown, idleTimeoutSignal?: AbortSignal): Error {\r\n if (!axios.isAxiosError(error))\r\n return error as Error;\r\n\r\n const filemailErrorResponse = this.tryGetErrorResponse(error);\r\n\r\n if (filemailErrorResponse) {\r\n const filemailErrorReason = filemailErrorResponse.errormessage || filemailErrorResponse.errorcode?.toString() || filemailErrorResponse.exception || `UNKNOWN`;\r\n const errorText = `${filemailErrorResponse.responsestatus}: ${filemailErrorReason}`;\r\n\r\n return new ApiFilemailError(errorText, filemailErrorReason, filemailErrorResponse.responsestatus, { cause: error });\r\n }\r\n\r\n const response449Message = this.tryGet449Response(error);\r\n\r\n if (response449Message)\r\n return new ApiFilemail449Error(response449Message);\r\n\r\n const errorReasonText = this.getErrorReasonText(error, idleTimeoutSignal);\r\n\r\n return new Error(errorReasonText, { cause: error });\r\n }\r\n\r\n private tryGetErrorResponse(error: AxiosError<any, any>): BaseResponse<unknown> | null {\r\n try {\r\n if (this.isBaseNotOkResponse(error.response?.data))\r\n return error.response.data;\r\n\r\n if (typeof error.response?.data !== `string`)\r\n return null;\r\n\r\n const response = JSON.parse(error.response?.data);\r\n\r\n if (this.isBaseNotOkResponse(response))\r\n return response;\r\n\r\n return null;\r\n }\r\n catch {\r\n return null;\r\n }\r\n }\r\n\r\n private isBaseNotOkResponse(obj: any): obj is BaseResponse<unknown> {\r\n return isBaseResponse(obj) && obj.responsestatus !== `OK`;\r\n }\r\n\r\n private tryGet449Response(error: AxiosError<any, any>): string | null {\r\n try {\r\n if (error.response?.status !== 449)\r\n return null;\r\n\r\n if (typeof error.response?.data !== `string`)\r\n return null;\r\n\r\n return error.response?.data;\r\n }\r\n catch {\r\n return null;\r\n }\r\n }\r\n\r\n private getErrorReasonText(error: AxiosError<any, any>, idleTimeoutSignal?: AbortSignal): string {\r\n const isIdleTimeout = error.code === `ERR_CANCELED` && idleTimeoutSignal?.aborted;\r\n const isRequestTimeout = error.code === `ECONNABORTED` && error.message.startsWith(`timeout`);\r\n\r\n if (isIdleTimeout || isRequestTimeout)\r\n return `Timeout`;\r\n\r\n if (error.response?.status)\r\n return `${error.response.status}: ${error.response.statusText || error.code || error.message}`;\r\n\r\n if (error.code)\r\n return error.code;\r\n\r\n if (error.message)\r\n return error.message;\r\n\r\n return `UKNOWN API ERROR`;\r\n }\r\n}\r\n"]}
|