filemail-sdk 10.2.0 → 10.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +10 -10
- package/dist/src/autoDownloader/autoDownloader.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderDestroyer.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderError.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderEvent.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderOptions.js.map +1 -1
- package/dist/src/autoDownloader/autoDownloaderStateSerializer.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadProgressedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadStartedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadStartingFailedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/autoDownloadUnhealthyEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/checkingForNewTransfersStartedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/eventArgs/newTransfersCheckCompletedEventArgs.js.map +1 -1
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/factory/nodeAutoDownloaderFactoryOptions.js.map +1 -1
- package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfer.js.map +1 -1
- package/dist/src/autoDownloader/newInboxTransfersRetriever/newInboxTransfersRetriever.js.map +1 -1
- package/dist/src/autoDownloader/node/nodeAutoDownloaderStateSerializer.js.map +1 -1
- package/dist/src/autoDownloader/node/nodeTransferDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderRecoverableState.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderState.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateRecoverableTransfer.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateRunningTransfer.js.map +1 -1
- package/dist/src/autoDownloader/state/autoDownloaderStateSnapshot.js.map +1 -1
- package/dist/src/autoDownloader/transferDownloaderFactory.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderNewTransferHandler.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderRecoverableTransferHandler.js.map +1 -1
- package/dist/src/autoDownloader/transferHandler/autoDownloaderTransferHandlerBase.js.map +1 -1
- package/dist/src/client/downloader/downloaderCore.js.map +1 -1
- package/dist/src/client/downloader/node/nodeTransferDownloader.js.map +1 -1
- package/dist/src/client/downloader/transferDownloader.js.map +1 -1
- package/dist/src/client/environmentVariables.js.map +1 -1
- package/dist/src/client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js.map +1 -1
- package/dist/src/client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js.map +1 -1
- package/dist/src/client/healthMonitor/events/transferHealthMonitorEvent.js.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/nodeOnlineChecker.js.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.js.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.js.map +1 -1
- package/dist/src/client/healthMonitor/transferDownloaderHealthMonitor.js.map +1 -1
- package/dist/src/client/healthMonitor/transferHealthMonitorBase.js.map +1 -1
- package/dist/src/client/healthMonitor/transferUploaderHealthMonitor.js.map +1 -1
- package/dist/src/client/loggers/dummyLogger.js.map +1 -1
- package/dist/src/client/loggers/logger.js.map +1 -1
- package/dist/src/client/loggers/utils/logHealthyStatus.js.map +1 -1
- package/dist/src/client/node/nodeFileDetailsProvider.js.map +1 -1
- package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
- package/dist/src/client/uploader/transferUploader.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderConfig.js.map +1 -1
- package/dist/src/client/uploader/utils/uploaderUtils.js.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
- package/dist/src/downloader/api/fileServerDownloadClient.js.map +1 -1
- package/dist/src/downloader/api/node/nodeFileServerDownloadClient.js.map +1 -1
- package/dist/src/downloader/chunkDownloader.js.map +1 -1
- package/dist/src/downloader/downloadFolderResolver.js.map +1 -1
- package/dist/src/downloader/downloadLogger.js.map +1 -1
- package/dist/src/downloader/downloadOptions.js.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadFileChunkProgress.js.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadFileProgress.js.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadFilePromise.js.map +1 -1
- package/dist/src/downloader/downloadStatus/downloadState.js.map +1 -1
- package/dist/src/downloader/downloadTracker.js.map +1 -1
- package/dist/src/downloader/dtos/downloadCommand.js.map +1 -1
- package/dist/src/downloader/dtos/downloadError.js.map +1 -1
- package/dist/src/downloader/dtos/downloadErrorCode.js.map +1 -1
- package/dist/src/downloader/dtos/downloadEvent.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFileChunkInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFileInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadFilesCommand.js.map +1 -1
- package/dist/src/downloader/dtos/downloadInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadRegistrationMode.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerFileInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerFileProgressInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackerProgressInfo.js.map +1 -1
- package/dist/src/downloader/dtos/downloadTrackingMetadata.js.map +1 -1
- package/dist/src/downloader/dtos/downloaderRestoredState.js.map +1 -1
- package/dist/src/downloader/eventArgs/chunkDownloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/chunkDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadCompletedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadMetadataDeterminedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadPauseEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/downloadTrackingFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/fileDownloadEventArgs.js.map +1 -1
- package/dist/src/downloader/eventArgs/fileDownloadFailedEventArgs.js.map +1 -1
- package/dist/src/downloader/filesDownloader.js.map +1 -1
- package/dist/src/downloader/filesPreparer.js.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.node.js.map +1 -1
- package/dist/src/index.web.js.map +1 -1
- package/dist/src/uploader/api/fileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/web/utils/axiosIdleTimeoutManager.js.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadFailedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileUploadEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileUploadFailedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferMetadataDeterminedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadProgressedEventArgs.js.map +1 -1
- package/dist/src/uploader/export/transferUploadExportData.js.map +1 -1
- package/dist/src/uploader/export/transferUploadExportState.js.map +1 -1
- package/dist/src/uploader/export/transferUploadMetadata.js.map +1 -1
- package/dist/src/uploader/options/transferUploadAppendInfo.d.ts +0 -1
- package/dist/src/uploader/options/transferUploadAppendInfo.d.ts.map +1 -1
- package/dist/src/uploader/options/transferUploadAppendInfo.js.map +1 -1
- package/dist/src/uploader/options/transferUploadConfig.js.map +1 -1
- package/dist/src/uploader/options/transferUploadInfo.js.map +1 -1
- package/dist/src/uploader/options/transferUploadInfoBase.d.ts +1 -0
- package/dist/src/uploader/options/transferUploadInfoBase.d.ts.map +1 -1
- package/dist/src/uploader/options/transferUploadInfoBase.js.map +1 -1
- package/dist/src/uploader/pauseController.js.map +1 -1
- package/dist/src/uploader/pendingFileAck.js.map +1 -1
- package/dist/src/uploader/registeredTransferFile.js.map +1 -1
- package/dist/src/uploader/state/continuousChunksCalculator.js.map +1 -1
- package/dist/src/uploader/state/readonlyTransferUploadStateFile.js.map +1 -1
- package/dist/src/uploader/state/readonlyTransferUploadStateFiles.js.map +1 -1
- package/dist/src/uploader/state/transferUploadProgressCalculator.js.map +1 -1
- package/dist/src/uploader/state/transferUploadState.js.map +1 -1
- package/dist/src/uploader/state/transferUploadStateFile.js.map +1 -1
- package/dist/src/uploader/state/transferUploadStateFiles.js.map +1 -1
- package/dist/src/uploader/transferFailureAbortReason.js.map +1 -1
- package/dist/src/uploader/transferFilesRegistrar.d.ts.map +1 -1
- package/dist/src/uploader/transferFilesRegistrar.js +4 -2
- package/dist/src/uploader/transferFilesRegistrar.js.map +1 -1
- package/dist/src/uploader/transferUpload.d.ts +0 -2
- package/dist/src/uploader/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +14 -13
- package/dist/src/uploader/transferUpload.js.map +1 -1
- package/dist/src/uploader/transferUploadAcker.js.map +1 -1
- package/dist/src/uploader/transferUploadError.js.map +1 -1
- package/dist/src/uploader/transferUploadEvent.js.map +1 -1
- package/dist/src/utils/api/apiClient.js.map +1 -1
- package/dist/src/utils/api/apiClientBase.js +1 -1
- package/dist/src/utils/api/apiClientBase.js.map +1 -1
- package/dist/src/utils/api/apiError.js.map +1 -1
- package/dist/src/utils/api/apiFilemail449Error.js.map +1 -1
- package/dist/src/utils/api/apiFilemailError.js.map +1 -1
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/baseResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/cancelTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/finalizeTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/finalizeTransferResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getCompanyResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getCompressedFileMetadataResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getInboxTransfersRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/getInboxTransfersResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getRangehashResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/getTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/getTransferResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts +2 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/loginRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/loginResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/registerFileDownloadRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferDownloadRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts +1 -0
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts +6 -2
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/resetTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/sendFileChunkRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/transferCustomFieldDto.js.map +1 -1
- package/dist/src/utils/api/dtos/transferFileDto.js.map +1 -1
- package/dist/src/utils/api/fileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/node/gotWorkarounds.js.map +1 -1
- package/dist/src/utils/api/node/nodeApiClient.d.ts.map +1 -1
- package/dist/src/utils/api/node/nodeApiClient.js +1 -0
- package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
- package/dist/src/utils/api/node/nodeClientBase.js.map +1 -1
- package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/node/nodeFileserverClientBase.js.map +1 -1
- package/dist/src/utils/api/urlUtil.js.map +1 -1
- package/dist/src/utils/api/web/webApiClient.js.map +1 -1
- package/dist/src/utils/api/web/webClientBase.js.map +1 -1
- package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/web/webFileserverClientBase.js.map +1 -1
- package/dist/src/utils/concurrencyController/concurrencyController.js.map +1 -1
- package/dist/src/utils/concurrencyController/concurrencyReleaser.js.map +1 -1
- package/dist/src/utils/concurrencyController/transferConcurrencyController.js.map +1 -1
- package/dist/src/utils/crypto/cryptographyProvider.js.map +1 -1
- package/dist/src/utils/crypto/node/nodeCryptographyProvider.js.map +1 -1
- package/dist/src/utils/crypto/web/webCryptographyProvider.js.map +1 -1
- package/dist/src/utils/dateAndTime/simpleDateFormatter.js.map +1 -1
- package/dist/src/utils/events/chunkProgressEvent.js.map +1 -1
- package/dist/src/utils/events/eventsEngine.js.map +1 -1
- package/dist/src/utils/events/node/nodeEventsEngine.js.map +1 -1
- package/dist/src/utils/events/web/webEventsEngine.js.map +1 -1
- package/dist/src/utils/fileSystem/chunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/chunkStreamProviderFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/fileDetails.js.map +1 -1
- package/dist/src/utils/fileSystem/fileSystemService.js.map +1 -1
- package/dist/src/utils/fileSystem/fsError.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeFileDetails.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeFileSystemService.js.map +1 -1
- package/dist/src/utils/fileSystem/parsedPath.js.map +1 -1
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamEncrypter.js.map +1 -1
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/web/webFileDetails.js.map +1 -1
- package/dist/src/utils/jsonParsing.js.map +1 -1
- package/dist/src/utils/logging/logEventPropertyNames.js.map +1 -1
- package/dist/src/utils/mergeAbortAndPauseSignals.js.map +1 -1
- package/dist/src/utils/networking/throttlingOptions.js.map +1 -1
- package/dist/src/utils/promiseAll.js.map +1 -1
- package/dist/src/utils/types/transferStatus.js.map +1 -1
- package/dist/src/utils/uint8ArrayUtils.js.map +1 -1
- package/package.json +78 -78
- package/readme.md +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesDownloader.js","sourceRoot":"","sources":["../../../src/downloader/filesDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import DownloadState from \"./downloadStatus/downloadState.js\";\nimport DownloadFilePromise from \"./downloadStatus/downloadFilePromise.js\";\nimport DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\nimport DownloadFileProgress from \"./downloadStatus/downloadFileProgress.js\";\nimport DownloadError from \"./dtos/downloadError.js\";\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\nimport ChunkDownloader from \"./chunkDownloader.js\";\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\nimport DownloadRegistrationMode from \"./dtos/downloadRegistrationMode.js\";\nimport { promiseAllSettled } from \"../utils/promiseAll.js\";\n\nimport type FileSystemService from \"../utils/fileSystem/fileSystemService.js\";\nimport type DownloadOptions from \"./downloadOptions.js\";\nimport type ConcurrencyController from \"../utils/concurrencyController/concurrencyController.js\";\nimport type DownloaderRestoredState from \"./dtos/downloaderRestoredState.js\";\nimport type FileServerClientFactory from \"../utils/api/fileServerClientFactory.js\";\nimport type ChunkStreamProviderFactory from \"../utils/fileSystem/chunkStreamProviderFactory.js\";\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\nimport type DownloadEventArgs from \"./eventArgs/downloadEventArgs.js\";\nimport type ApiClient from \"../utils/api/apiClient.js\";\nimport type FileDownloadEventArgs from \"./eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\nimport type DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport type DownloadLogger from \"./downloadLogger.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../utils/fileSystem/chunkStreamProvider.js\";\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\nimport type CryptographyProvider from \"../utils/crypto/cryptographyProvider.js\";\n\nexport default class FilesDownloader {\n readonly #logger: DownloadLogger;\n readonly #transferId: string;\n readonly #trackId: string | undefined;\n readonly #downloadId: string;\n readonly #region?: string;\n readonly #files: Array<DownloadFileInfo>;\n readonly #downloadState: DownloadState;\n readonly #options: DownloadOptions;\n readonly #concurrencyController: ConcurrencyController;\n readonly #fileSystem: FileSystemService;\n readonly #apiClient: ApiClient;\n readonly #fileserverClientFactory: FileServerClientFactory;\n readonly #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\n readonly #downloadRegistrationMode: DownloadRegistrationMode;\n readonly #eventsEngine: EventsEngine;\n readonly #cryptography: CryptographyProvider;\n readonly #ongoingChunkDownloads: Record<string, Promise<void>>;\n readonly #ongoingFileDownloads: Record<string, DownloadFilePromise>;\n readonly #encryptionData?: ChunkStreamProviderEncryptionData;\n\n constructor(\n logger: DownloadLogger,\n transferId: string,\n trackId: string | undefined,\n downloadId: string,\n region: string | undefined,\n files: DownloadFileInfo | Array<DownloadFileInfo>,\n oldState: DownloaderRestoredState | undefined,\n fileSystem: FileSystemService,\n concurrencyController: ConcurrencyController,\n eventsEngine: EventsEngine,\n cryptography: CryptographyProvider,\n options: DownloadOptions,\n apiClient: ApiClient,\n fileserverClientFactory: FileServerClientFactory,\n chunkStreamProviderFactory: ChunkStreamProviderFactory<string>,\n downloadRegistrationMode: DownloadRegistrationMode,\n e2eeData?: DownloadCommandE2eeData,\n ) {\n if (!transferId)\n throw new DownloadError(`No transfer specified`);\n\n if (!files)\n throw new DownloadError(`No files added to downloader`);\n\n if (Array.isArray(files) && files.length === 0)\n throw new DownloadError(`No files added to downloader`);\n\n if (!options.downloadFolder)\n throw new DownloadError(`No downloadFolder specified`);\n\n if (e2eeData && e2eeData.iv.length !== 16)\n throw new DownloadError(`IV must be 16 bytes long`);\n\n if (e2eeData && e2eeData.key.length !== 32)\n throw new DownloadError(`Encryption key must be 32 bytes long`);\n\n this.#logger = logger;\n this.#downloadId = downloadId;\n this.#transferId = transferId;\n this.#trackId = trackId;\n this.#region = region;\n this.#fileSystem = fileSystem;\n this.#files = Array.isArray(files) ? files : [files];\n this.#options = options;\n this.#eventsEngine = eventsEngine;\n this.#cryptography = cryptography;\n this.#downloadState = new DownloadState(this.#downloadId, this.#transferId, this.#files, this.#options, eventsEngine, oldState);\n this.#concurrencyController = concurrencyController;\n this.#apiClient = apiClient;\n this.#fileserverClientFactory = fileserverClientFactory;\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#downloadRegistrationMode = downloadRegistrationMode;\n this.#ongoingChunkDownloads = {};\n this.#ongoingFileDownloads = {};\n\n if (e2eeData)\n this.#encryptionData = this.createEncryptionData(e2eeData);\n }\n\n private createEncryptionData(e2eeData: DownloadCommandE2eeData): ChunkStreamProviderEncryptionData {\n return {\n iv: e2eeData.iv,\n key: e2eeData.key,\n };\n }\n\n async start(): Promise<DownloadEventArgs> {\n try {\n await this.#throwIfNotEnoughDiskSpaceBeforeStart();\n\n this.#addEventListeners();\n\n let isDownloaderRunning = true;\n\n while (isDownloaderRunning) {\n this.#downloadState.start();\n\n const fileServerUrl = new URL(this.#files[0].url).origin;\n this.#downloadState.notifyMetadataDetermined(fileServerUrl, this.#region);\n\n // MAIN FILE LOOP\n for (const file of this.#files) {\n if (file.isCompleted || file.isFailed)\n continue;\n\n if (this.#downloadState.isRunning === false)\n break;\n\n // figure out if we are downloading a new file or resuming a file that was interrupted\n if (file.wasEverWritten) {\n // this a resumed file (recreated from progress.json) - it must already exist under its temporary path\n if (!file.temporaryDownloadPath) {\n this.#downloadState.fileFailed(file, new DownloadError(`File ${file.downloadPath} was supposed to be resumed but its temporary path is not known.`, undefined, DownloadErrorCode.ResumedFilePathNotSpecified));\n continue;\n }\n\n if ((await this.#fileSystem.pathExists(file.temporaryDownloadPath!)) === false) {\n this.#downloadState.fileFailed(file, new DownloadError(`File ${file.downloadPath} was supposed to be resumed at ${file.temporaryDownloadPath}, but it does not exist on disk anymore.`, undefined, DownloadErrorCode.ResumedFileNotFound));\n continue;\n }\n }\n else {\n // in some edge cases the temporary file may exist and its name be persisted in the tracker file\n // but the wasEverWritten flag was not yet set - just abandon such temporary file (it will be 'empty' - null bytes only)\n if (file.temporaryDownloadPath) {\n this.#logDeletingFile(file, file.temporaryDownloadPath, `start`);\n this.#fileSystem.deleteFile(file.temporaryDownloadPath);\n }\n\n // this is a new file - create it\n await this.#createDownloadFile(file);\n }\n\n this.#ongoingFileDownloads[file.externalId] = new DownloadFilePromise(file.externalId);\n this.#ongoingFileDownloads[file.externalId]!.awaiter.then(id => {\n delete this.#ongoingFileDownloads[id];\n });\n\n this.#downloadState.fileStarting(file);\n\n // note: this call does not really wait for all chunks to be downloaded, but until all chunks of a file have been **scheduled**\n await this.#downloadAllChunksForFile(file);\n\n // so when we are here, the file is not complete\n // to track completeness of a file we look at events emitted by this.#downloadState\n }\n\n // when we got here it's either pause request, stop request (which is just like pause but without waiting for pending chunks), abort request (cancel the download entirely) or everything is complete;\n\n // wait for any remaining pending chunks\n await promiseAllSettled(Object.values(this.#ongoingChunkDownloads));\n\n // Wait for any remaining pending files\n // Note: we cannot rely just on chunk downloads being completed, because downloading chunks\n // doesn't mean that a file is complete; last phase of file completion is renaming the file\n // from a temporary name (unconfirmed_somefile.txt_qweasd1234.fmdownload) to its real name, which may need adjustments if a file with same name already exists.\n // When file already exists - a unique filename will be generated automatically e.g.: file.txt --> file (1).txt\n await promiseAllSettled(Object.values(this.#ongoingFileDownloads).map(x => x.awaiter));\n\n if (this.#downloadState.status === TransferStatus.Pausing) {\n // set status to paused and await until resume/abort\n await this.#downloadState.paused();\n }\n\n isDownloaderRunning = await this.#prepareDownloaderForAnotherIteration();\n }\n\n await this.#cleanupEmptyDownloadFolderIfConfigured();\n }\n catch (error) {\n this.#logger.logError(error as Error, `Unhandled downloader error occured.`);\n this.#downloadState.completed(error as Error);\n }\n finally {\n this.#removeEventListeners();\n }\n\n return this.#downloadState.getCurrentState(true);\n }\n\n async #throwIfNotEnoughDiskSpaceBeforeStart() {\n await this.#fileSystem.createFolder(this.#options.downloadFolder!);\n\n const requiredBytes = this.#getRemainingBytesToDownload();\n\n if (requiredBytes <= 0n)\n return;\n\n try {\n const availableBytes = await this.#fileSystem.getAvailableDiskSpace(this.#options.downloadFolder!);\n\n if (availableBytes < requiredBytes)\n throw new DownloadError(`ENOSPC: Not enough disk space. Required=${requiredBytes}B, available=${availableBytes}B`, undefined, DownloadErrorCode.DiskFull);\n }\n catch (error) {\n if (this.#shouldSkipFreeDiskSpaceCheck(error)) {\n this.#logger.logWarning(`Skipping free disk space check because filesystem does not support statfs`, { error });\n return;\n }\n\n throw this.#toDownloadError(error, `Checking free disk space before download failed for ${this.#options.downloadFolder!}`);\n }\n }\n\n #getRemainingBytesToDownload(): bigint {\n let requiredBytes = 0n;\n\n for (const file of this.#files) {\n if (file.isCompleted || file.isFailed)\n continue;\n\n const remaining = file.sizeInBytes - file.downloadedBytes;\n requiredBytes += BigInt(remaining);\n }\n\n return requiredBytes;\n }\n\n #shouldSkipFreeDiskSpaceCheck(error: unknown): boolean {\n const code = this.#extractErrorCode(error);\n if (code === `ENOSYS` || code === `ENOTSUP` || code === `EOPNOTSUPP`)\n return true;\n\n const message = this.#extractErrorMessage(error)?.toLowerCase() ?? ``;\n if (code === `ENOENT` && message.includes(`statfs`))\n return true;\n\n return false;\n }\n\n #extractErrorCode(error: unknown): string | undefined {\n let current = error as { code?: string, cause?: unknown } | undefined;\n\n for (let depth = 0; depth < 8 && current; depth++) {\n if (typeof current.code === `string`)\n return current.code;\n\n current = current.cause as { code?: string, cause?: unknown } | undefined;\n }\n\n return undefined;\n }\n\n #extractErrorMessage(error: unknown): string | undefined {\n let current = error as { message?: string, cause?: unknown } | undefined;\n\n for (let depth = 0; depth < 8 && current; depth++) {\n if (typeof current.message === `string`)\n return current.message;\n\n current = current.cause as { message?: string, cause?: unknown } | undefined;\n }\n\n return undefined;\n }\n\n #logDeletingFile(file: DownloadFileInfo | DownloadFileProgress, path: string, method: string) {\n let fileDataToLog = file;\n if (file instanceof DownloadFileInfo)\n fileDataToLog = DownloadFileProgress.FromFileDownloadInfo(file);\n\n this.#logger.logInfo(`[DELETE_TEMPFILE] Deleting temp file path=${path} method=${method}\\n\\n${JSON.stringify(fileDataToLog, null, 4)}\\n`);\n }\n\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\n Object.values(this.#ongoingFileDownloads).forEach(filePromise => filePromise.complete());\n this.#downloadState.requestPause(options);\n }\n\n resume(): boolean {\n return this.#downloadState.resume();\n }\n\n requestAbort(): boolean {\n Object.values(this.#ongoingFileDownloads).forEach(filePromise => filePromise.complete());\n return this.#downloadState.requestAbort();\n }\n\n getCurrentState(withFiles: boolean): DownloadEventArgs {\n return this.#downloadState.getCurrentState(withFiles);\n }\n\n get status(): TransferStatus {\n return this.#downloadState.status;\n }\n\n async #deleteAllTemporaryAndCompletedFiles() {\n for (const file of this.#files) {\n if (file.temporaryDownloadPath) {\n this.#logDeletingFile(file, file.temporaryDownloadPath, `deleteAllTemporaryAndCompletedFiles`);\n await this.#fileSystem.deleteFile(file.temporaryDownloadPath);\n }\n\n if (file.isCompleted)\n await this.#fileSystem.deleteFile(file.downloadPath);\n }\n }\n\n async #registerTransferDownload() {\n this.#downloadState.registeringTransferDownload();\n await this.#apiClient.registerTransferDownload({\n transferid: this.#transferId,\n track: this.#trackId,\n bps: this.#downloadState.averageBytesPerSecond,\n browser: this.#options.userAgent,\n });\n }\n\n async #registerFileDownload(filename: string, filesize: number) {\n this.#downloadState.registeringFileDownload();\n await this.#apiClient.registerFileDownload({\n transferid: this.#transferId,\n track: this.#trackId,\n bps: this.#downloadState.averageBytesPerSecond,\n browser: this.#options.userAgent,\n filename,\n filesize,\n });\n }\n\n #addEventListeners() {\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.PossibleSupersizedFile, this.#onFileSupersized);\n }\n\n #removeEventListeners() {\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.PossibleSupersizedFile, this.#onFileSupersized);\n }\n\n #onFileCompleted = async (args: FileDownloadEventArgs) => {\n if (this.#downloadRegistrationMode === DownloadRegistrationMode.EverySingleFile && !this.#options.skipRegistration)\n await this.#registerFileDownload(args.file.name, args.file.size);\n\n this.#ongoingFileDownloads[args.file.id]?.complete();\n };\n\n #onFileCompleting = async (args: FileDownloadEventArgs) => {\n // note the args.file.downloadPath may not be final - if a file with this name eixsts the following method will generate new name e.g. \"file.txt\" --> \"file (1).txt\"\n try {\n const finalDownloadPath = await this.#doTheFinalFileRenameAfterFilesIsDownloaded(args.file);\n this.#downloadState.fileCompleted(args.file.id, finalDownloadPath);\n }\n catch (error) {\n this.#downloadState.fileFailedById(args.file.id, error as DownloadError);\n }\n };\n\n #onFileSupersized = async (fileArgs: FileDownloadEventArgs) => {\n if (fileArgs.file.temporaryDownloadPath && await this.#fileSystem.getFileSize(fileArgs.file.temporaryDownloadPath) > fileArgs.file.size)\n await this.#fileSystem.truncateFile(fileArgs.file.temporaryDownloadPath, fileArgs.file.size);\n };\n\n #onFileFailed = async (args: FileDownloadFailedEventArgs) => {\n this.#ongoingFileDownloads[args.file.id]?.complete();\n\n const shouldKeepTemporaryFile = this.#shouldKeepTemporaryFileOnFailure();\n\n if (this.#options.deleteFailedFilesFromDisk) {\n if (args.file.temporaryDownloadPath && !shouldKeepTemporaryFile) {\n this.#logDeletingFile(args.file, args.file.temporaryDownloadPath, `onFileFailed`);\n await this.#fileSystem.deleteFile(args.file.temporaryDownloadPath);\n }\n }\n };\n\n #shouldKeepTemporaryFileOnFailure(): boolean {\n // Resuming failed files requires tracking state + preserved temporary files.\n // If tracking is disabled there is no benefit in leaving temp files behind.\n return this.#options.downloadTrackingBaseFolder !== null;\n }\n\n async #createDownloadFile(file: DownloadFileInfo) {\n this.#downloadState.fileCreating(file);\n\n try {\n await this.#autoGenerateUniqueDownloadFile(file);\n this.#downloadState.fileCreated(file);\n }\n catch (error) {\n throw this.#toDownloadError(error, `Creating download file failed for ${file.downloadPath}`);\n }\n }\n\n async #autoGenerateUniqueDownloadFile(file: DownloadFileInfo) {\n let counter = 0;\n const fileLeafName = this.#fileSystem.parseFilePath(file.name).base;\n do {\n const newFileName = `unconfirmed_${fileLeafName}_${this.#cryptography.generateRandomString(10)}.fmdownload`;\n const newPath = this.#fileSystem.replaceFilenameInPath(file.downloadPath, newFileName);\n if (await this.#fileSystem.createFile(newPath, false)) {\n // eslint-disable-next-line no-param-reassign\n file.temporaryDownloadPath = newPath;\n return;\n }\n\n counter += 1;\n } while (counter < 10000);\n\n throw new DownloadError(`Downloader could not generate unique download path for ${file.downloadPath}. It tried until counter=${counter}`, undefined, DownloadErrorCode.TooManyFileRenameAttempts);\n }\n\n #toDownloadError(error: unknown, message: string): DownloadError {\n if (error instanceof DownloadError)\n return error;\n\n const wrappedError = error instanceof Error\n ? error\n : new Error(`${error}`);\n\n const code = this.#fileSystem.fileErrorToDownloadErrorCode(wrappedError);\n return new DownloadError(message, { cause: wrappedError }, code);\n }\n\n async #downloadAllChunksForFile(file: DownloadFileInfo) {\n if (file.chunks.length) {\n // MAIN CHUNK LOOP\n for (const chunk of file.chunks) {\n if (chunk.isCompleted || chunk.isFailed)\n continue;\n\n const downloadScheduled = await this.#downloadSingleChunk(file, chunk);\n if (downloadScheduled === false) {\n // downloader is not running or file is in failed state - stop the chunk loop\n break;\n }\n }\n\n // Restored files can have all chunks already completed (e.g. rename failed in a previous run).\n // In such case there is nothing to schedule, so we need to trigger finalization explicitly.\n if (!file.isFailed && file.chunks.every(chunk => chunk.isCompleted)) {\n this.#downloadState.ensureFileStarted(file);\n file.updateProgress();\n this.#downloadState.fileCompleting(file);\n }\n }\n else {\n // zerobyte file\n file.updateProgress();\n this.#downloadState.fileCompleting(file);\n }\n }\n\n async #downloadSingleChunk(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): Promise<boolean> {\n const releaseSemaphore = await this.#concurrencyController.acquire();\n\n if (this.#downloadState.isRunning === false) {\n // downloader is not running - stop trying more chunks\n releaseSemaphore();\n return false;\n }\n\n if (file.isFailed) {\n // do not try to download more chunks if the file has failed\n releaseSemaphore();\n return false;\n }\n\n const chunkDownloader = new ChunkDownloader(this.#transferId, file, chunk, this.#downloadState, this.#options, this.#fileserverClientFactory, this.#chunkStreamProviderFactory, this.#eventsEngine, this.#logger, this.#encryptionData);\n const chunkPromise: Promise<void> = chunkDownloader.download();\n this.#ongoingChunkDownloads[chunk.id] = chunkPromise;\n\n chunkPromise.finally(() => {\n releaseSemaphore();\n delete this.#ongoingChunkDownloads[chunk.id];\n });\n\n return true;\n }\n\n /**\n * Prepares downloader for next loop iteration. Handles two main scenarios:\n * 1. Aborting - cleans up the disk state, calls downloadState to trigger Aborted event and returns a false flag (to break the loop).\n * 2. Completed - registers download to web api, calls downloadState to trigger Completed event and returns a false flag (to break the loop).\n * 3. For all other cases returns true - to continue the loop.\n */\n async #prepareDownloaderForAnotherIteration(): Promise<boolean> {\n let shouldDownloaderContinue = true;\n if (this.#downloadState.status === TransferStatus.Aborting) {\n shouldDownloaderContinue = false;\n if (this.#options.deleteAbortedDownloadsFromDisk)\n await this.#deleteAllTemporaryAndCompletedFiles();\n\n this.#downloadState.aborted();\n }\n else if (this.#downloadState.allFilesCompletedOrFailed) {\n shouldDownloaderContinue = false;\n if (this.#downloadRegistrationMode === DownloadRegistrationMode.Transfer && !this.#options.skipRegistration)\n await this.#registerTransferDownload();\n\n this.#downloadState.completed();\n }\n return shouldDownloaderContinue;\n }\n\n async #cleanupEmptyDownloadFolderIfConfigured() {\n try {\n if (this.#options.deleteEmptyDownloadFoldersAfterDownload && await this.#fileSystem.folderIsEmpty(this.#options.downloadFolder!))\n await this.#fileSystem.deleteFolder(this.#options.downloadFolder!);\n }\n catch (error) {\n this.#logger.logWarning(`cleanupEmptyDownloadFolderIfConfigured failed`, { error });\n }\n }\n\n async #doTheFinalFileRenameAfterFilesIsDownloaded(file: DownloadFileProgress) {\n let created = false;\n let createCounter = 0;\n const original = this.#fileSystem.parseFilePath(file.downloadPath);\n let newPathFormatted = file.downloadPath;\n do {\n // we do not want to re-reserve disk space when creating the target file (final name) - so file size is omitted\n created = await this.#fileSystem.createFile(newPathFormatted, false);\n if (!created) {\n createCounter += 1;\n const newPath = {\n dir: original.dir,\n name: `${original.name} (${createCounter})`,\n ext: original.ext,\n };\n newPathFormatted = this.#fileSystem.formatFilePath(newPath);\n }\n } while (created === false && createCounter < 10000);\n\n if (!created)\n throw new DownloadError(`Downloader could not rename temp file ${file.temporaryDownloadPath} to ${file.downloadPath}. It tried until counter=${createCounter}`, undefined, DownloadErrorCode.TooManyFileRenameAttempts);\n\n let renamed = false;\n let renameCounter = 0;\n let lastError: Error | undefined;\n while (!renamed && renameCounter < 5) {\n renameCounter += 1;\n try {\n await this.#fileSystem.renameFile(file.temporaryDownloadPath!, newPathFormatted);\n renamed = true;\n this.#logger.logInfo(`Downloader renamed ${file.temporaryDownloadPath} to ${newPathFormatted} at attempt ${renameCounter}`);\n }\n catch (error) {\n lastError = error as Error;\n this.#logger.logError(lastError, `Downloader could not rename ${file.temporaryDownloadPath} to ${newPathFormatted} attempt ${renameCounter}`);\n }\n }\n if (!renamed)\n await this.#cleanupFailedRenameTarget(newPathFormatted);\n\n if (!renamed)\n throw new DownloadError(`Downloader could not rename ${file.temporaryDownloadPath} to ${newPathFormatted} after ${renameCounter} attempts.`, { cause: lastError }, DownloadErrorCode.RenameFromTemporaryFilenameToFinalFailure);\n else\n return newPathFormatted;\n }\n\n async #cleanupFailedRenameTarget(pathToDelete: string) {\n try {\n await this.#fileSystem.deleteFile(pathToDelete);\n }\n catch (error) {\n this.#logger.logWarning(`Could not cleanup failed rename target ${pathToDelete}`, { error });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"filesDownloader.js","sourceRoot":"","sources":["../../../src/downloader/filesDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import DownloadState from \"./downloadStatus/downloadState.js\";\r\nimport DownloadFilePromise from \"./downloadStatus/downloadFilePromise.js\";\r\nimport DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\r\nimport DownloadFileProgress from \"./downloadStatus/downloadFileProgress.js\";\r\nimport DownloadError from \"./dtos/downloadError.js\";\r\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\r\nimport ChunkDownloader from \"./chunkDownloader.js\";\r\nimport TransferStatus from \"../utils/types/transferStatus.js\";\r\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\r\nimport DownloadRegistrationMode from \"./dtos/downloadRegistrationMode.js\";\r\nimport { promiseAllSettled } from \"../utils/promiseAll.js\";\r\n\r\nimport type FileSystemService from \"../utils/fileSystem/fileSystemService.js\";\r\nimport type DownloadOptions from \"./downloadOptions.js\";\r\nimport type ConcurrencyController from \"../utils/concurrencyController/concurrencyController.js\";\r\nimport type DownloaderRestoredState from \"./dtos/downloaderRestoredState.js\";\r\nimport type FileServerClientFactory from \"../utils/api/fileServerClientFactory.js\";\r\nimport type ChunkStreamProviderFactory from \"../utils/fileSystem/chunkStreamProviderFactory.js\";\r\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\r\nimport type DownloadEventArgs from \"./eventArgs/downloadEventArgs.js\";\r\nimport type ApiClient from \"../utils/api/apiClient.js\";\r\nimport type FileDownloadEventArgs from \"./eventArgs/fileDownloadEventArgs.js\";\r\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\r\nimport type DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\r\nimport type DownloadLogger from \"./downloadLogger.js\";\r\nimport type { ChunkStreamProviderEncryptionData } from \"../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type { DownloadCommandE2eeData } from \"./dtos/downloadCommand.js\";\r\nimport type CryptographyProvider from \"../utils/crypto/cryptographyProvider.js\";\r\n\r\nexport default class FilesDownloader {\r\n readonly #logger: DownloadLogger;\r\n readonly #transferId: string;\r\n readonly #trackId: string | undefined;\r\n readonly #downloadId: string;\r\n readonly #region?: string;\r\n readonly #files: Array<DownloadFileInfo>;\r\n readonly #downloadState: DownloadState;\r\n readonly #options: DownloadOptions;\r\n readonly #concurrencyController: ConcurrencyController;\r\n readonly #fileSystem: FileSystemService;\r\n readonly #apiClient: ApiClient;\r\n readonly #fileserverClientFactory: FileServerClientFactory;\r\n readonly #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\r\n readonly #downloadRegistrationMode: DownloadRegistrationMode;\r\n readonly #eventsEngine: EventsEngine;\r\n readonly #cryptography: CryptographyProvider;\r\n readonly #ongoingChunkDownloads: Record<string, Promise<void>>;\r\n readonly #ongoingFileDownloads: Record<string, DownloadFilePromise>;\r\n readonly #encryptionData?: ChunkStreamProviderEncryptionData;\r\n\r\n constructor(\r\n logger: DownloadLogger,\r\n transferId: string,\r\n trackId: string | undefined,\r\n downloadId: string,\r\n region: string | undefined,\r\n files: DownloadFileInfo | Array<DownloadFileInfo>,\r\n oldState: DownloaderRestoredState | undefined,\r\n fileSystem: FileSystemService,\r\n concurrencyController: ConcurrencyController,\r\n eventsEngine: EventsEngine,\r\n cryptography: CryptographyProvider,\r\n options: DownloadOptions,\r\n apiClient: ApiClient,\r\n fileserverClientFactory: FileServerClientFactory,\r\n chunkStreamProviderFactory: ChunkStreamProviderFactory<string>,\r\n downloadRegistrationMode: DownloadRegistrationMode,\r\n e2eeData?: DownloadCommandE2eeData,\r\n ) {\r\n if (!transferId)\r\n throw new DownloadError(`No transfer specified`);\r\n\r\n if (!files)\r\n throw new DownloadError(`No files added to downloader`);\r\n\r\n if (Array.isArray(files) && files.length === 0)\r\n throw new DownloadError(`No files added to downloader`);\r\n\r\n if (!options.downloadFolder)\r\n throw new DownloadError(`No downloadFolder specified`);\r\n\r\n if (e2eeData && e2eeData.iv.length !== 16)\r\n throw new DownloadError(`IV must be 16 bytes long`);\r\n\r\n if (e2eeData && e2eeData.key.length !== 32)\r\n throw new DownloadError(`Encryption key must be 32 bytes long`);\r\n\r\n this.#logger = logger;\r\n this.#downloadId = downloadId;\r\n this.#transferId = transferId;\r\n this.#trackId = trackId;\r\n this.#region = region;\r\n this.#fileSystem = fileSystem;\r\n this.#files = Array.isArray(files) ? files : [files];\r\n this.#options = options;\r\n this.#eventsEngine = eventsEngine;\r\n this.#cryptography = cryptography;\r\n this.#downloadState = new DownloadState(this.#downloadId, this.#transferId, this.#files, this.#options, eventsEngine, oldState);\r\n this.#concurrencyController = concurrencyController;\r\n this.#apiClient = apiClient;\r\n this.#fileserverClientFactory = fileserverClientFactory;\r\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\r\n this.#downloadRegistrationMode = downloadRegistrationMode;\r\n this.#ongoingChunkDownloads = {};\r\n this.#ongoingFileDownloads = {};\r\n\r\n if (e2eeData)\r\n this.#encryptionData = this.createEncryptionData(e2eeData);\r\n }\r\n\r\n private createEncryptionData(e2eeData: DownloadCommandE2eeData): ChunkStreamProviderEncryptionData {\r\n return {\r\n iv: e2eeData.iv,\r\n key: e2eeData.key,\r\n };\r\n }\r\n\r\n async start(): Promise<DownloadEventArgs> {\r\n try {\r\n await this.#throwIfNotEnoughDiskSpaceBeforeStart();\r\n\r\n this.#addEventListeners();\r\n\r\n let isDownloaderRunning = true;\r\n\r\n while (isDownloaderRunning) {\r\n this.#downloadState.start();\r\n\r\n const fileServerUrl = new URL(this.#files[0].url).origin;\r\n this.#downloadState.notifyMetadataDetermined(fileServerUrl, this.#region);\r\n\r\n // MAIN FILE LOOP\r\n for (const file of this.#files) {\r\n if (file.isCompleted || file.isFailed)\r\n continue;\r\n\r\n if (this.#downloadState.isRunning === false)\r\n break;\r\n\r\n // figure out if we are downloading a new file or resuming a file that was interrupted\r\n if (file.wasEverWritten) {\r\n // this a resumed file (recreated from progress.json) - it must already exist under its temporary path\r\n if (!file.temporaryDownloadPath) {\r\n this.#downloadState.fileFailed(file, new DownloadError(`File ${file.downloadPath} was supposed to be resumed but its temporary path is not known.`, undefined, DownloadErrorCode.ResumedFilePathNotSpecified));\r\n continue;\r\n }\r\n\r\n if ((await this.#fileSystem.pathExists(file.temporaryDownloadPath!)) === false) {\r\n this.#downloadState.fileFailed(file, new DownloadError(`File ${file.downloadPath} was supposed to be resumed at ${file.temporaryDownloadPath}, but it does not exist on disk anymore.`, undefined, DownloadErrorCode.ResumedFileNotFound));\r\n continue;\r\n }\r\n }\r\n else {\r\n // in some edge cases the temporary file may exist and its name be persisted in the tracker file\r\n // but the wasEverWritten flag was not yet set - just abandon such temporary file (it will be 'empty' - null bytes only)\r\n if (file.temporaryDownloadPath) {\r\n this.#logDeletingFile(file, file.temporaryDownloadPath, `start`);\r\n this.#fileSystem.deleteFile(file.temporaryDownloadPath);\r\n }\r\n\r\n // this is a new file - create it\r\n await this.#createDownloadFile(file);\r\n }\r\n\r\n this.#ongoingFileDownloads[file.externalId] = new DownloadFilePromise(file.externalId);\r\n this.#ongoingFileDownloads[file.externalId]!.awaiter.then(id => {\r\n delete this.#ongoingFileDownloads[id];\r\n });\r\n\r\n this.#downloadState.fileStarting(file);\r\n\r\n // note: this call does not really wait for all chunks to be downloaded, but until all chunks of a file have been **scheduled**\r\n await this.#downloadAllChunksForFile(file);\r\n\r\n // so when we are here, the file is not complete\r\n // to track completeness of a file we look at events emitted by this.#downloadState\r\n }\r\n\r\n // when we got here it's either pause request, stop request (which is just like pause but without waiting for pending chunks), abort request (cancel the download entirely) or everything is complete;\r\n\r\n // wait for any remaining pending chunks\r\n await promiseAllSettled(Object.values(this.#ongoingChunkDownloads));\r\n\r\n // Wait for any remaining pending files\r\n // Note: we cannot rely just on chunk downloads being completed, because downloading chunks\r\n // doesn't mean that a file is complete; last phase of file completion is renaming the file\r\n // from a temporary name (unconfirmed_somefile.txt_qweasd1234.fmdownload) to its real name, which may need adjustments if a file with same name already exists.\r\n // When file already exists - a unique filename will be generated automatically e.g.: file.txt --> file (1).txt\r\n await promiseAllSettled(Object.values(this.#ongoingFileDownloads).map(x => x.awaiter));\r\n\r\n if (this.#downloadState.status === TransferStatus.Pausing) {\r\n // set status to paused and await until resume/abort\r\n await this.#downloadState.paused();\r\n }\r\n\r\n isDownloaderRunning = await this.#prepareDownloaderForAnotherIteration();\r\n }\r\n\r\n await this.#cleanupEmptyDownloadFolderIfConfigured();\r\n }\r\n catch (error) {\r\n this.#logger.logError(error as Error, `Unhandled downloader error occured.`);\r\n this.#downloadState.completed(error as Error);\r\n }\r\n finally {\r\n this.#removeEventListeners();\r\n }\r\n\r\n return this.#downloadState.getCurrentState(true);\r\n }\r\n\r\n async #throwIfNotEnoughDiskSpaceBeforeStart() {\r\n await this.#fileSystem.createFolder(this.#options.downloadFolder!);\r\n\r\n const requiredBytes = this.#getRemainingBytesToDownload();\r\n\r\n if (requiredBytes <= 0n)\r\n return;\r\n\r\n try {\r\n const availableBytes = await this.#fileSystem.getAvailableDiskSpace(this.#options.downloadFolder!);\r\n\r\n if (availableBytes < requiredBytes)\r\n throw new DownloadError(`ENOSPC: Not enough disk space. Required=${requiredBytes}B, available=${availableBytes}B`, undefined, DownloadErrorCode.DiskFull);\r\n }\r\n catch (error) {\r\n if (this.#shouldSkipFreeDiskSpaceCheck(error)) {\r\n this.#logger.logWarning(`Skipping free disk space check because filesystem does not support statfs`, { error });\r\n return;\r\n }\r\n\r\n throw this.#toDownloadError(error, `Checking free disk space before download failed for ${this.#options.downloadFolder!}`);\r\n }\r\n }\r\n\r\n #getRemainingBytesToDownload(): bigint {\r\n let requiredBytes = 0n;\r\n\r\n for (const file of this.#files) {\r\n if (file.isCompleted || file.isFailed)\r\n continue;\r\n\r\n const remaining = file.sizeInBytes - file.downloadedBytes;\r\n requiredBytes += BigInt(remaining);\r\n }\r\n\r\n return requiredBytes;\r\n }\r\n\r\n #shouldSkipFreeDiskSpaceCheck(error: unknown): boolean {\r\n const code = this.#extractErrorCode(error);\r\n if (code === `ENOSYS` || code === `ENOTSUP` || code === `EOPNOTSUPP`)\r\n return true;\r\n\r\n const message = this.#extractErrorMessage(error)?.toLowerCase() ?? ``;\r\n if (code === `ENOENT` && message.includes(`statfs`))\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n #extractErrorCode(error: unknown): string | undefined {\r\n let current = error as { code?: string, cause?: unknown } | undefined;\r\n\r\n for (let depth = 0; depth < 8 && current; depth++) {\r\n if (typeof current.code === `string`)\r\n return current.code;\r\n\r\n current = current.cause as { code?: string, cause?: unknown } | undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n #extractErrorMessage(error: unknown): string | undefined {\r\n let current = error as { message?: string, cause?: unknown } | undefined;\r\n\r\n for (let depth = 0; depth < 8 && current; depth++) {\r\n if (typeof current.message === `string`)\r\n return current.message;\r\n\r\n current = current.cause as { message?: string, cause?: unknown } | undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n #logDeletingFile(file: DownloadFileInfo | DownloadFileProgress, path: string, method: string) {\r\n let fileDataToLog = file;\r\n if (file instanceof DownloadFileInfo)\r\n fileDataToLog = DownloadFileProgress.FromFileDownloadInfo(file);\r\n\r\n this.#logger.logInfo(`[DELETE_TEMPFILE] Deleting temp file path=${path} method=${method}\\n\\n${JSON.stringify(fileDataToLog, null, 4)}\\n`);\r\n }\r\n\r\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\r\n Object.values(this.#ongoingFileDownloads).forEach(filePromise => filePromise.complete());\r\n this.#downloadState.requestPause(options);\r\n }\r\n\r\n resume(): boolean {\r\n return this.#downloadState.resume();\r\n }\r\n\r\n requestAbort(): boolean {\r\n Object.values(this.#ongoingFileDownloads).forEach(filePromise => filePromise.complete());\r\n return this.#downloadState.requestAbort();\r\n }\r\n\r\n getCurrentState(withFiles: boolean): DownloadEventArgs {\r\n return this.#downloadState.getCurrentState(withFiles);\r\n }\r\n\r\n get status(): TransferStatus {\r\n return this.#downloadState.status;\r\n }\r\n\r\n async #deleteAllTemporaryAndCompletedFiles() {\r\n for (const file of this.#files) {\r\n if (file.temporaryDownloadPath) {\r\n this.#logDeletingFile(file, file.temporaryDownloadPath, `deleteAllTemporaryAndCompletedFiles`);\r\n await this.#fileSystem.deleteFile(file.temporaryDownloadPath);\r\n }\r\n\r\n if (file.isCompleted)\r\n await this.#fileSystem.deleteFile(file.downloadPath);\r\n }\r\n }\r\n\r\n async #registerTransferDownload() {\r\n this.#downloadState.registeringTransferDownload();\r\n await this.#apiClient.registerTransferDownload({\r\n transferid: this.#transferId,\r\n track: this.#trackId,\r\n bps: this.#downloadState.averageBytesPerSecond,\r\n browser: this.#options.userAgent,\r\n });\r\n }\r\n\r\n async #registerFileDownload(filename: string, filesize: number) {\r\n this.#downloadState.registeringFileDownload();\r\n await this.#apiClient.registerFileDownload({\r\n transferid: this.#transferId,\r\n track: this.#trackId,\r\n bps: this.#downloadState.averageBytesPerSecond,\r\n browser: this.#options.userAgent,\r\n filename,\r\n filesize,\r\n });\r\n }\r\n\r\n #addEventListeners() {\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#eventsEngine.addEventListener(TransferDownloadEvent.PossibleSupersizedFile, this.#onFileSupersized);\r\n }\r\n\r\n #removeEventListeners() {\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleted, this.#onFileCompleted);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadCompleting, this.#onFileCompleting);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\r\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.PossibleSupersizedFile, this.#onFileSupersized);\r\n }\r\n\r\n #onFileCompleted = async (args: FileDownloadEventArgs) => {\r\n if (this.#downloadRegistrationMode === DownloadRegistrationMode.EverySingleFile && !this.#options.skipRegistration)\r\n await this.#registerFileDownload(args.file.name, args.file.size);\r\n\r\n this.#ongoingFileDownloads[args.file.id]?.complete();\r\n };\r\n\r\n #onFileCompleting = async (args: FileDownloadEventArgs) => {\r\n // note the args.file.downloadPath may not be final - if a file with this name eixsts the following method will generate new name e.g. \"file.txt\" --> \"file (1).txt\"\r\n try {\r\n const finalDownloadPath = await this.#doTheFinalFileRenameAfterFilesIsDownloaded(args.file);\r\n this.#downloadState.fileCompleted(args.file.id, finalDownloadPath);\r\n }\r\n catch (error) {\r\n this.#downloadState.fileFailedById(args.file.id, error as DownloadError);\r\n }\r\n };\r\n\r\n #onFileSupersized = async (fileArgs: FileDownloadEventArgs) => {\r\n if (fileArgs.file.temporaryDownloadPath && await this.#fileSystem.getFileSize(fileArgs.file.temporaryDownloadPath) > fileArgs.file.size)\r\n await this.#fileSystem.truncateFile(fileArgs.file.temporaryDownloadPath, fileArgs.file.size);\r\n };\r\n\r\n #onFileFailed = async (args: FileDownloadFailedEventArgs) => {\r\n this.#ongoingFileDownloads[args.file.id]?.complete();\r\n\r\n const shouldKeepTemporaryFile = this.#shouldKeepTemporaryFileOnFailure();\r\n\r\n if (this.#options.deleteFailedFilesFromDisk) {\r\n if (args.file.temporaryDownloadPath && !shouldKeepTemporaryFile) {\r\n this.#logDeletingFile(args.file, args.file.temporaryDownloadPath, `onFileFailed`);\r\n await this.#fileSystem.deleteFile(args.file.temporaryDownloadPath);\r\n }\r\n }\r\n };\r\n\r\n #shouldKeepTemporaryFileOnFailure(): boolean {\r\n // Resuming failed files requires tracking state + preserved temporary files.\r\n // If tracking is disabled there is no benefit in leaving temp files behind.\r\n return this.#options.downloadTrackingBaseFolder !== null;\r\n }\r\n\r\n async #createDownloadFile(file: DownloadFileInfo) {\r\n this.#downloadState.fileCreating(file);\r\n\r\n try {\r\n await this.#autoGenerateUniqueDownloadFile(file);\r\n this.#downloadState.fileCreated(file);\r\n }\r\n catch (error) {\r\n throw this.#toDownloadError(error, `Creating download file failed for ${file.downloadPath}`);\r\n }\r\n }\r\n\r\n async #autoGenerateUniqueDownloadFile(file: DownloadFileInfo) {\r\n let counter = 0;\r\n const fileLeafName = this.#fileSystem.parseFilePath(file.name).base;\r\n do {\r\n const newFileName = `unconfirmed_${fileLeafName}_${this.#cryptography.generateRandomString(10)}.fmdownload`;\r\n const newPath = this.#fileSystem.replaceFilenameInPath(file.downloadPath, newFileName);\r\n if (await this.#fileSystem.createFile(newPath, false)) {\r\n // eslint-disable-next-line no-param-reassign\r\n file.temporaryDownloadPath = newPath;\r\n return;\r\n }\r\n\r\n counter += 1;\r\n } while (counter < 10000);\r\n\r\n throw new DownloadError(`Downloader could not generate unique download path for ${file.downloadPath}. It tried until counter=${counter}`, undefined, DownloadErrorCode.TooManyFileRenameAttempts);\r\n }\r\n\r\n #toDownloadError(error: unknown, message: string): DownloadError {\r\n if (error instanceof DownloadError)\r\n return error;\r\n\r\n const wrappedError = error instanceof Error\r\n ? error\r\n : new Error(`${error}`);\r\n\r\n const code = this.#fileSystem.fileErrorToDownloadErrorCode(wrappedError);\r\n return new DownloadError(message, { cause: wrappedError }, code);\r\n }\r\n\r\n async #downloadAllChunksForFile(file: DownloadFileInfo) {\r\n if (file.chunks.length) {\r\n // MAIN CHUNK LOOP\r\n for (const chunk of file.chunks) {\r\n if (chunk.isCompleted || chunk.isFailed)\r\n continue;\r\n\r\n const downloadScheduled = await this.#downloadSingleChunk(file, chunk);\r\n if (downloadScheduled === false) {\r\n // downloader is not running or file is in failed state - stop the chunk loop\r\n break;\r\n }\r\n }\r\n\r\n // Restored files can have all chunks already completed (e.g. rename failed in a previous run).\r\n // In such case there is nothing to schedule, so we need to trigger finalization explicitly.\r\n if (!file.isFailed && file.chunks.every(chunk => chunk.isCompleted)) {\r\n this.#downloadState.ensureFileStarted(file);\r\n file.updateProgress();\r\n this.#downloadState.fileCompleting(file);\r\n }\r\n }\r\n else {\r\n // zerobyte file\r\n file.updateProgress();\r\n this.#downloadState.fileCompleting(file);\r\n }\r\n }\r\n\r\n async #downloadSingleChunk(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): Promise<boolean> {\r\n const releaseSemaphore = await this.#concurrencyController.acquire();\r\n\r\n if (this.#downloadState.isRunning === false) {\r\n // downloader is not running - stop trying more chunks\r\n releaseSemaphore();\r\n return false;\r\n }\r\n\r\n if (file.isFailed) {\r\n // do not try to download more chunks if the file has failed\r\n releaseSemaphore();\r\n return false;\r\n }\r\n\r\n const chunkDownloader = new ChunkDownloader(this.#transferId, file, chunk, this.#downloadState, this.#options, this.#fileserverClientFactory, this.#chunkStreamProviderFactory, this.#eventsEngine, this.#logger, this.#encryptionData);\r\n const chunkPromise: Promise<void> = chunkDownloader.download();\r\n this.#ongoingChunkDownloads[chunk.id] = chunkPromise;\r\n\r\n chunkPromise.finally(() => {\r\n releaseSemaphore();\r\n delete this.#ongoingChunkDownloads[chunk.id];\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Prepares downloader for next loop iteration. Handles two main scenarios:\r\n * 1. Aborting - cleans up the disk state, calls downloadState to trigger Aborted event and returns a false flag (to break the loop).\r\n * 2. Completed - registers download to web api, calls downloadState to trigger Completed event and returns a false flag (to break the loop).\r\n * 3. For all other cases returns true - to continue the loop.\r\n */\r\n async #prepareDownloaderForAnotherIteration(): Promise<boolean> {\r\n let shouldDownloaderContinue = true;\r\n if (this.#downloadState.status === TransferStatus.Aborting) {\r\n shouldDownloaderContinue = false;\r\n if (this.#options.deleteAbortedDownloadsFromDisk)\r\n await this.#deleteAllTemporaryAndCompletedFiles();\r\n\r\n this.#downloadState.aborted();\r\n }\r\n else if (this.#downloadState.allFilesCompletedOrFailed) {\r\n shouldDownloaderContinue = false;\r\n if (this.#downloadRegistrationMode === DownloadRegistrationMode.Transfer && !this.#options.skipRegistration)\r\n await this.#registerTransferDownload();\r\n\r\n this.#downloadState.completed();\r\n }\r\n return shouldDownloaderContinue;\r\n }\r\n\r\n async #cleanupEmptyDownloadFolderIfConfigured() {\r\n try {\r\n if (this.#options.deleteEmptyDownloadFoldersAfterDownload && await this.#fileSystem.folderIsEmpty(this.#options.downloadFolder!))\r\n await this.#fileSystem.deleteFolder(this.#options.downloadFolder!);\r\n }\r\n catch (error) {\r\n this.#logger.logWarning(`cleanupEmptyDownloadFolderIfConfigured failed`, { error });\r\n }\r\n }\r\n\r\n async #doTheFinalFileRenameAfterFilesIsDownloaded(file: DownloadFileProgress) {\r\n let created = false;\r\n let createCounter = 0;\r\n const original = this.#fileSystem.parseFilePath(file.downloadPath);\r\n let newPathFormatted = file.downloadPath;\r\n do {\r\n // we do not want to re-reserve disk space when creating the target file (final name) - so file size is omitted\r\n created = await this.#fileSystem.createFile(newPathFormatted, false);\r\n if (!created) {\r\n createCounter += 1;\r\n const newPath = {\r\n dir: original.dir,\r\n name: `${original.name} (${createCounter})`,\r\n ext: original.ext,\r\n };\r\n newPathFormatted = this.#fileSystem.formatFilePath(newPath);\r\n }\r\n } while (created === false && createCounter < 10000);\r\n\r\n if (!created)\r\n throw new DownloadError(`Downloader could not rename temp file ${file.temporaryDownloadPath} to ${file.downloadPath}. It tried until counter=${createCounter}`, undefined, DownloadErrorCode.TooManyFileRenameAttempts);\r\n\r\n let renamed = false;\r\n let renameCounter = 0;\r\n let lastError: Error | undefined;\r\n while (!renamed && renameCounter < 5) {\r\n renameCounter += 1;\r\n try {\r\n await this.#fileSystem.renameFile(file.temporaryDownloadPath!, newPathFormatted);\r\n renamed = true;\r\n this.#logger.logInfo(`Downloader renamed ${file.temporaryDownloadPath} to ${newPathFormatted} at attempt ${renameCounter}`);\r\n }\r\n catch (error) {\r\n lastError = error as Error;\r\n this.#logger.logError(lastError, `Downloader could not rename ${file.temporaryDownloadPath} to ${newPathFormatted} attempt ${renameCounter}`);\r\n }\r\n }\r\n if (!renamed)\r\n await this.#cleanupFailedRenameTarget(newPathFormatted);\r\n\r\n if (!renamed)\r\n throw new DownloadError(`Downloader could not rename ${file.temporaryDownloadPath} to ${newPathFormatted} after ${renameCounter} attempts.`, { cause: lastError }, DownloadErrorCode.RenameFromTemporaryFilenameToFinalFailure);\r\n else\r\n return newPathFormatted;\r\n }\r\n\r\n async #cleanupFailedRenameTarget(pathToDelete: string) {\r\n try {\r\n await this.#fileSystem.deleteFile(pathToDelete);\r\n }\r\n catch (error) {\r\n this.#logger.logWarning(`Could not cleanup failed rename target ${pathToDelete}`, { error });\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesPreparer.js","sourceRoot":"","sources":["../../../src/downloader/filesPreparer.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AAGpE,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,mBAAmB,CAAS;IAC5B,aAAa,CAAgB;IAC7B,WAAW,CAAa;IAExB,YAAY,kBAA0B,EAAE,YAA2B,EAAE,UAAsB;QACvF,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,KAA8B;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,UAAU;gBAChB,MAAM,IAAI,aAAa,CAAC,qCAAqC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7E,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;oBAC3B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;oBAEpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAc,CAAC,CAAC;YAC5E,CAAC;;gBAEG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YAExB,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAwB,IAAI,CAAC,UAAU,CAAC,CAAC;YAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;IAED,wBAAwB,CAAC,IAAsB;QAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,6CAA6C;YAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;CACJ","sourcesContent":["import type FileSystem from \"../utils/fileSystem/fileSystemService.js\";\nimport DownloadError from \"./dtos/downloadError.js\";\nimport DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport type DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\n\nexport default class FilesPreparer {\n #downloadBaseFolder: string;\n #maxChunkSize: number | null;\n #fileSystem: FileSystem;\n\n constructor(downloadBaseFolder: string, maxChunkSize: number | null, fileSystem: FileSystem) {\n this.#downloadBaseFolder = downloadBaseFolder;\n this.#maxChunkSize = maxChunkSize;\n this.#fileSystem = fileSystem;\n }\n\n prepareFiles(files: Array<DownloadFileInfo>) {\n for (const file of files) {\n if (!file.externalId)\n throw new DownloadError(`All files require an external ID: ${file.url}`);\n\n this.#computeFileDownloadPath(file);\n\n if (file.sizeInBytes > 0) {\n if (this.#maxChunkSize === null)\n file.chunkCount = 1;\n else\n file.chunkCount = Math.ceil(file.sizeInBytes / this.#maxChunkSize!);\n }\n else\n file.chunkCount = 0;\n\n file.chunks = new Array<DownloadFileChunkInfo>(file.chunkCount);\n for (let k = 0; k < file.chunkCount; k++)\n file.chunks[k] = new DownloadFileChunkInfo(file, k, this.#maxChunkSize || null);\n }\n }\n\n #computeFileDownloadPath(file: DownloadFileInfo): void {\n if (!file.hasDownloadPath) {\n // eslint-disable-next-line no-param-reassign\n file.downloadPath = this.#fileSystem.pathJoin(this.#downloadBaseFolder!, file.name);\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"filesPreparer.js","sourceRoot":"","sources":["../../../src/downloader/filesPreparer.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AAGpE,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,mBAAmB,CAAS;IAC5B,aAAa,CAAgB;IAC7B,WAAW,CAAa;IAExB,YAAY,kBAA0B,EAAE,YAA2B,EAAE,UAAsB;QACvF,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,KAA8B;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,UAAU;gBAChB,MAAM,IAAI,aAAa,CAAC,qCAAqC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7E,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;oBAC3B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;oBAEpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAc,CAAC,CAAC;YAC5E,CAAC;;gBAEG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YAExB,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAwB,IAAI,CAAC,UAAU,CAAC,CAAC;YAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;IAED,wBAAwB,CAAC,IAAsB;QAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,6CAA6C;YAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;CACJ","sourcesContent":["import type FileSystem from \"../utils/fileSystem/fileSystemService.js\";\r\nimport DownloadError from \"./dtos/downloadError.js\";\r\nimport DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\r\nimport type DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\r\n\r\nexport default class FilesPreparer {\r\n #downloadBaseFolder: string;\r\n #maxChunkSize: number | null;\r\n #fileSystem: FileSystem;\r\n\r\n constructor(downloadBaseFolder: string, maxChunkSize: number | null, fileSystem: FileSystem) {\r\n this.#downloadBaseFolder = downloadBaseFolder;\r\n this.#maxChunkSize = maxChunkSize;\r\n this.#fileSystem = fileSystem;\r\n }\r\n\r\n prepareFiles(files: Array<DownloadFileInfo>) {\r\n for (const file of files) {\r\n if (!file.externalId)\r\n throw new DownloadError(`All files require an external ID: ${file.url}`);\r\n\r\n this.#computeFileDownloadPath(file);\r\n\r\n if (file.sizeInBytes > 0) {\r\n if (this.#maxChunkSize === null)\r\n file.chunkCount = 1;\r\n else\r\n file.chunkCount = Math.ceil(file.sizeInBytes / this.#maxChunkSize!);\r\n }\r\n else\r\n file.chunkCount = 0;\r\n\r\n file.chunks = new Array<DownloadFileChunkInfo>(file.chunkCount);\r\n for (let k = 0; k < file.chunkCount; k++)\r\n file.chunks[k] = new DownloadFileChunkInfo(file, k, this.#maxChunkSize || null);\r\n }\r\n }\r\n\r\n #computeFileDownloadPath(file: DownloadFileInfo): void {\r\n if (!file.hasDownloadPath) {\r\n // eslint-disable-next-line no-param-reassign\r\n file.downloadPath = this.#fileSystem.pathJoin(this.#downloadBaseFolder!, file.name);\r\n }\r\n }\r\n}"]}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;AAyB1H,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,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AAC3G,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,yDAAyD,CAAC;AACnH,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,2DAA2D,CAAC;AACvH,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,6DAA6D,CAAC;AAGpH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAuB,MAAM,uDAAuD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,2DAA2D,CAAC;AACzG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0DAA0D,CAAC;AAEvG,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\";\nexport { BaseResponse } from \"./utils/api/dtos/baseResponse.js\";\nexport { default as FinalizeTransferRequest } from \"./utils/api/dtos/finalizeTransferRequest.js\";\nexport { default as FinalizeTransferResponse } from \"./utils/api/dtos/finalizeTransferResponse.js\";\nexport { default as ResetTransferRequest } from \"./utils/api/dtos/resetTransferRequest.js\";\nexport { InitializeTransferRequest, InitializeTransferRequestCustomField, InitializeTransferRequestRaw, InitializeTransferRequestCustomFieldRaw } from \"./utils/api/dtos/initializeTransferRequest.js\";\nexport { default as InitializeTransferResponse } from \"./utils/api/dtos/initializeTransferResponse.js\";\nexport { default as LoginRequest } from \"./utils/api/dtos/loginRequest.js\";\nexport { default as LoginResponse } from \"./utils/api/dtos/loginResponse.js\";\nexport { default as SendFileChunkRequest } from \"./utils/api/dtos/sendFileChunkRequest.js\";\nexport { default as GetTransferRequest } from \"./utils/api/dtos/getTransferRequest.js\";\nexport { default as GetTransferResponse } from \"./utils/api/dtos/getTransferResponse.js\";\nexport { default as TransferFileDto } from \"./utils/api/dtos/transferFileDto.js\";\nexport { default as RegisterTransferDownloadRequest } from \"./utils/api/dtos/registerTransferDownloadRequest.js\";\nexport { default as RegisterFileDownloadRequest } from \"./utils/api/dtos/registerFileDownloadRequest.js\";\nexport { default as TransferCustomFieldDto } from \"./utils/api/dtos/transferCustomFieldDto.js\";\n\nexport { default as ChunkProgressEvent } from \"./utils/events/chunkProgressEvent.js\";\n\nexport { default as ApiClient } from \"./utils/api/apiClient.js\";\nexport { default as ApiError } from \"./utils/api/apiError.js\";\nexport { default as ApiFilemailError } from \"./utils/api/apiFilemailError.js\";\nexport { default as ApiFilemail449Error } from \"./utils/api/apiFilemail449Error.js\";\nexport { default as FileServerClient } from \"./uploader/api/fileServerUploadClient.js\";\nexport { default as FileServerClientFactory } from \"./utils/api/fileServerClientFactory.js\";\n\nexport { default as EventsEngine } from \"./utils/events/eventsEngine.js\";\nexport { EventsEngineEventHandler } from \"./utils/events/eventsEngine.js\";\n\nexport { default as ChunkStreamProvider } from \"./utils/fileSystem/chunkStreamProvider.js\";\nexport { default as FileDetails } from \"./utils/fileSystem/fileDetails.js\";\nexport { default as FsError } from \"./utils/fileSystem/fsError.js\";\n\nexport { default as ConcurrencyController } from \"./utils/concurrencyController/concurrencyController.js\";\nexport { default as ConcurrencyReleaser } from \"./utils/concurrencyController/concurrencyReleaser.js\";\nexport { default as TransferConcurrencyController } from \"./utils/concurrencyController/transferConcurrencyController.js\";\n\nexport { TransferUploadExportData, TransferUploadExportDataAppendInfo, TransferUploadExportDataMetadata } from \"./uploader/export/transferUploadExportData.js\";\nexport { default as TransferUploadMetadata } from \"./uploader/export/transferUploadMetadata.js\";\nexport { default as TransferUploadExportState } from \"./uploader/export/transferUploadExportState.js\";\nexport { default as RegisteredTransferFile } from \"./uploader/registeredTransferFile.js\";\n\nexport { ContinuousChunksCalculatorState, ContinuousChunk } from \"./uploader/state/continuousChunksCalculator.js\";\n\nexport { default as FileChunkUploadFailedEventArgs } from \"./uploader/eventArgs/fileChunkUploadFailedEventArgs.js\";\nexport { default as FileChunkUploadCompletedPartiallyEventArgs } from \"./uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js\";\nexport { default as FileChunkUploadEventArgs } from \"./uploader/eventArgs/fileChunkUploadEventArgs.js\";\nexport { default as FileChunkUploadCompletedEventArgs } from \"./uploader/eventArgs/fileChunkUploadCompletedEventArgs.js\";\nexport { default as FileChunkUploadProgressedEventArgs } from \"./uploader/eventArgs/fileChunkUploadProgressedEventArgs.js\";\nexport { default as TransferUploadProgressedEventArgs } from \"./uploader/eventArgs/transferUploadProgressedEventArgs.js\";\nexport { default as FileUploadEventArgs } from \"./uploader/eventArgs/fileUploadEventArgs.js\";\nexport { default as FileUploadFailedEventArgs } from \"./uploader/eventArgs/fileUploadFailedEventArgs.js\";\nexport { default as FilesRegistrationBatchFailedEventArgs } from \"./uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js\";\nexport { default as FileAckFailedEventArgs } from \"./uploader/eventArgs/fileAckFailedEventArgs.js\";\nexport { default as FilesBatchAckFailedEventArgs } from \"./uploader/eventArgs/filesBatchAckFailedEventArgs.js\";\nexport { default as TransferUploadCompletedEventArgs } from \"./uploader/eventArgs/transferUploadCompletedEventArgs.js\";\nexport { default as TransferMetadataDeterminedEventArgs } from \"./uploader/eventArgs/transferMetadataDeterminedEventArgs.js\";\n\nexport { default as ReadonlyTransferUploadStateFile } from \"./uploader/state/readonlyTransferUploadStateFile.js\";\nexport { default as ReadonlyTransferUploadStateFiles } from \"./uploader/state/readonlyTransferUploadStateFiles.js\";\nexport { default as TransferStatusFile } from \"./uploader/state/transferUploadStateFile.js\";\nexport { default as TransferStatusFiles } from \"./uploader/state/transferUploadStateFiles.js\";\n\nexport { default as PauseController } from \"./uploader/pauseController.js\";\nexport { PauseSignal } from \"./uploader/pauseController.js\";\nexport { default as Transfer } from \"./uploader/transferUpload.js\";\nexport { default as TransferUploadError } from \"./uploader/transferUploadError.js\";\nexport { default as TransferUploadEvent } from \"./uploader/transferUploadEvent.js\";\nexport { default as TransferUploadConfig } from \"./uploader/options/transferUploadConfig.js\";\nexport { default as TransferUploadInfo, TransferUploadInfoCustomField } from \"./uploader/options/transferUploadInfo.js\";\nexport { TransferUploadAppendInfo, TransferUploadAppendInfoE2eeData } from \"./uploader/options/transferUploadAppendInfo.js\";\nexport { default as TransferUploadInfoBase } from \"./uploader/options/transferUploadInfoBase.js\";\nexport { default as TransferState } from \"./uploader/state/transferUploadState.js\";\nexport { default as TransferStatus } from \"./utils/types/transferStatus.js\";\n\nexport { default as DummyLogger } from \"./client/loggers/dummyLogger.js\";\nexport { default as Logger } from \"./client/loggers/logger.js\";\nexport { default as TransferUploader } from \"./client/uploader/transferUploader.js\";\nexport { default as EnvironmentVariables } from \"./client/environmentVariables.js\";\nexport { default as TransferUploaderConfig } from \"./client/uploader/transferUploaderConfig.js\";\n\nexport { default as TransferHealthMonitorBase } from \"./client/healthMonitor/transferHealthMonitorBase.js\";\nexport { default as TransferUploaderHealthMonitor } from \"./client/healthMonitor/transferUploaderHealthMonitor.js\";\nexport { default as TransferDownloaderHealthMonitor } from \"./client/healthMonitor/transferDownloaderHealthMonitor.js\";\nexport { default as TransferHealthMonitorEvent } from \"./client/healthMonitor/events/transferHealthMonitorEvent.js\";\nexport { default as HealthMonitorHealthyEventArgs } from \"./client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js\";\nexport { default as HealthMonitorUnhealthyEventArgs, HealthMonitorUnhealthyEventArgsReason, HealthMonitorUnhealthyEventArgsReasonValue } from \"./client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\nexport { default as OnlineChecker, OnlineCheckerResult } from \"./client/healthMonitor/onlineChecker/onlineChecker.js\";\nexport { default as NodeOnlineChecker } from \"./client/healthMonitor/onlineChecker/nodeOnlineChecker.js\";\nexport { default as WebOnlineChecker } from \"./client/healthMonitor/onlineChecker/webOnlineChecker.js\";\n\nexport { default as DownloadError } from \"./downloader/dtos/downloadError.js\";\nexport { default as DownloadErrorCode } from \"./downloader/dtos/downloadErrorCode.js\";\nexport { default as TransferDownloadEvent } from \"./downloader/dtos/downloadEvent.js\";"]}
|
|
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;AAyB1H,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,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AAC3G,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,yDAAyD,CAAC;AACnH,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,2DAA2D,CAAC;AACvH,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,6DAA6D,CAAC;AAGpH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAuB,MAAM,uDAAuD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,2DAA2D,CAAC;AACzG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0DAA0D,CAAC;AAEvG,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, TransferUploadExportDataAppendInfo, 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\nexport { default as RegisteredTransferFile } from \"./uploader/registeredTransferFile.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 FilesRegistrationBatchFailedEventArgs } from \"./uploader/eventArgs/filesRegistrationBatchFailedEventArgs.js\";\r\nexport { default as FileAckFailedEventArgs } from \"./uploader/eventArgs/fileAckFailedEventArgs.js\";\r\nexport { default as FilesBatchAckFailedEventArgs } from \"./uploader/eventArgs/filesBatchAckFailedEventArgs.js\";\r\nexport { default as TransferUploadCompletedEventArgs } from \"./uploader/eventArgs/transferUploadCompletedEventArgs.js\";\r\nexport { default as TransferMetadataDeterminedEventArgs } from \"./uploader/eventArgs/transferMetadataDeterminedEventArgs.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 TransferHealthMonitorBase } from \"./client/healthMonitor/transferHealthMonitorBase.js\";\r\nexport { default as TransferUploaderHealthMonitor } from \"./client/healthMonitor/transferUploaderHealthMonitor.js\";\r\nexport { default as TransferDownloaderHealthMonitor } from \"./client/healthMonitor/transferDownloaderHealthMonitor.js\";\r\nexport { default as TransferHealthMonitorEvent } from \"./client/healthMonitor/events/transferHealthMonitorEvent.js\";\r\nexport { default as HealthMonitorHealthyEventArgs } from \"./client/healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js\";\r\nexport { default as HealthMonitorUnhealthyEventArgs, HealthMonitorUnhealthyEventArgsReason, HealthMonitorUnhealthyEventArgsReasonValue } from \"./client/healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\r\nexport { default as OnlineChecker, OnlineCheckerResult } from \"./client/healthMonitor/onlineChecker/onlineChecker.js\";\r\nexport { default as NodeOnlineChecker } from \"./client/healthMonitor/onlineChecker/nodeOnlineChecker.js\";\r\nexport { default as WebOnlineChecker } from \"./client/healthMonitor/onlineChecker/webOnlineChecker.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\";"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.node.js","sourceRoot":"","sources":["../../src/index.node.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,mDAAmD,CAAC;AAC1G,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,uDAAuD,CAAC;AAChH,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AAEzG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAExF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AAEjG,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACpG,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,2DAA2D,CAAC;AAEtH,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAEvG,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAG7G,OAAO,EAAE,OAAO,IAAI,iCAAiC,EAAE,MAAM,4DAA4D,CAAC;AAC1H,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,wDAAwD,CAAC;AAElH,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAS3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAGpF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAMtF,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AACpG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAG3F,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAgBlF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAC","sourcesContent":["export * from \"./index.js\";\n\nexport { default as NodeApiClient } from \"./utils/api/node/nodeApiClient.js\";\nexport { default as NodeClientBase } from \"./utils/api/node/nodeClientBase.js\";\nexport { default as NodeFileServerUploadClient } from \"./uploader/api/node/nodeFileServerUploadClient.js\";\nexport { default as NodeFileServerDownloadClient } from \"./downloader/api/node/nodeFileServerDownloadClient.js\";\nexport { default as NodeFileServerClientFactory } from \"./utils/api/node/nodeFileServerClientFactory.js\";\n\nexport { default as NodeEventsEngine } from \"./utils/events/node/nodeEventsEngine.js\";\n\nexport { default as NodeChunkStreamProvider } from \"./utils/fileSystem/node/nodeChunkStreamProvider.js\";\nexport { default as NodeFileDetails } from \"./utils/fileSystem/node/nodeFileDetails.js\";\n\nexport { default as NodeFileDetailsProvider } from \"./client/node/nodeFileDetailsProvider.js\";\nexport { default as NodeTransferUploader } from \"./client/uploader/node/nodeTransferUploader.js\";\n\nexport { default as NodeFileSystemService } from \"./utils/fileSystem/node/nodeFileSystemService.js\";\nexport { default as NodeChunkStreamProviderFactory } from \"./utils/fileSystem/node/nodeChunkStreamProviderFactory.js\";\n\nexport { default as NodeTransferDownloader } from \"./client/downloader/node/nodeTransferDownloader.js\";\n\nexport { default as NodeAutoDownloaderFactory } from \"./autoDownloader/factory/nodeAutoDownloaderFactory.js\";\nexport { default as NodeAutoDownloaderFactoryOptions } from \"./autoDownloader/factory/nodeAutoDownloaderFactoryOptions.js\";\n\nexport { default as NodeAutoDownloaderStateSerializer } from \"./autoDownloader/node/nodeAutoDownloaderStateSerializer.js\";\nexport { default as NodeTransferDownloaderFactory } from \"./autoDownloader/node/nodeTransferDownloaderFactory.js\";\n\nexport { default as FilesDownloader } from \"./downloader/filesDownloader.js\";\nexport { default as DownloadLogger } from \"./downloader/downloadLogger.js\";\nexport { default as DownloadEventArgs } from \"./downloader/eventArgs/downloadEventArgs.js\";\nexport { default as DownloadPauseEventArgs } from \"./downloader/eventArgs/downloadPauseEventArgs.js\";\nexport { default as DownloadCompletedEventArgs } from \"./downloader/eventArgs/downloadCompletedEventArgs.js\";\nexport { default as DownloadMetadataDeterminedEventArgs } from \"./downloader/eventArgs/downloadMetadataDeterminedEventArgs.js\";\nexport { default as FileDownloadEventArgs } from \"./downloader/eventArgs/fileDownloadEventArgs.js\";\nexport { default as FileDownloadFailedEventArgs } from \"./downloader/eventArgs/fileDownloadFailedEventArgs.js\";\nexport { default as ChunkDownloadEventArgs } from \"./downloader/eventArgs/chunkDownloadEventArgs.js\";\nexport { default as ChunkDownloadFailedEventArgs } from \"./downloader/eventArgs/chunkDownloadFailedEventArgs.js\";\nexport { default as DownloadOptions } from \"./downloader/downloadOptions.js\";\nexport { default as DownloadError } from \"./downloader/dtos/downloadError.js\";\nexport { default as DownloadErrorCode } from \"./downloader/dtos/downloadErrorCode.js\";\nexport { default as DownloadFileInfo } from \"./downloader/dtos/downloadFileInfo.js\";\nexport { default as DownloadInfo } from \"./downloader/dtos/downloadInfo.js\";\nexport { default as DownloaderRestoredState } from \"./downloader/dtos/downloaderRestoredState.js\";\nexport { default as DownloadFileChunkInfo } from \"./downloader/dtos/downloadFileChunkInfo.js\";\nexport { default as TransferDownloadEvent } from \"./downloader/dtos/downloadEvent.js\";\nexport { default as DownloadCommand } from \"./downloader/dtos/downloadCommand.js\";\nexport { default as DownloadFilesCommand } from \"./downloader/dtos/downloadFilesCommand.js\";\nexport { default as TransferFileDto } from \"./utils/api/dtos/transferFileDto.js\";\nexport { default as DownloadTrackerFileInfo } from \"./downloader/dtos/downloadTrackerFileInfo.js\";\nexport { default as DownloadTrackerProgressInfo } from \"./downloader/dtos/downloadTrackerProgressInfo.js\";\nexport { default as DownloadRegistrationMode } from \"./downloader/dtos/downloadRegistrationMode.js\";\nexport { default as DownloadFolderResolver } from \"./downloader/downloadFolderResolver.js\";\n\nexport { default as TransferDownloader } from \"./client/downloader/transferDownloader.js\";\nexport { default as DownloaderCore } from \"./client/downloader/downloaderCore.js\";\n\nexport { default as AutoDownloadEventArgs } from \"./autoDownloader/eventArgs/autoDownloadEventArgs.js\";\nexport { default as AutoDownloadFailedEventArgs } from \"./autoDownloader/eventArgs/autoDownloadFailedEventArgs.js\";\nexport { default as AutoDownloadProgressedEventArgs } from \"./autoDownloader/eventArgs/autoDownloadProgressedEventArgs.js\";\nexport { default as AutoDownloadUnhealthyEventArgs } from \"./autoDownloader/eventArgs/autoDownloadUnhealthyEventArgs.js\";\nexport { default as AutoDownloadStartedEventArgs } from \"./autoDownloader/eventArgs/autoDownloadStartedEventArgs.js\";\nexport { default as NewTransfersCheckCompletedEventArgs } from \"./autoDownloader/eventArgs/newTransfersCheckCompletedEventArgs.js\";\nexport { default as AutoDownloadStartingFailedEventArgs } from \"./autoDownloader/eventArgs/autoDownloadStartingFailedEventArgs.js\";\nexport { default as CheckingForNewTransfersStartedEventArgs } from \"./autoDownloader/eventArgs/checkingForNewTransfersStartedEventArgs.js\";\n\nexport { default as NewInboxTransfer } from \"./autoDownloader/newInboxTransfersRetriever/newInboxTransfer.js\";\n\nexport { default as AutoDownloaderRecoverableState } from \"./autoDownloader/state/autoDownloaderRecoverableState.js\";\nexport { default as AutoDownloaderStateSnapshot } from \"./autoDownloader/state/autoDownloaderStateSnapshot.js\";\n\nexport { default as AutoDownloader } from \"./autoDownloader/autoDownloader.js\";\nexport { default as AutoDownloaderError } from \"./autoDownloader/autoDownloaderError.js\";\nexport { default as AutoDownloaderEvent } from \"./autoDownloader/autoDownloaderEvent.js\";\nexport { default as AutoDownloaderOptions } from \"./autoDownloader/autoDownloaderOptions.js\";\nexport { default as AutoDownloaderStateSerializer } from \"./autoDownloader/autoDownloaderStateSerializer.js\";\nexport { default as TransferDownloaderFactory } from \"./autoDownloader/transferDownloaderFactory.js\";"]}
|
|
1
|
+
{"version":3,"file":"index.node.js","sourceRoot":"","sources":["../../src/index.node.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,mDAAmD,CAAC;AAC1G,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,uDAAuD,CAAC;AAChH,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AAEzG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAExF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AAEjG,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACpG,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,2DAA2D,CAAC;AAEtH,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAEvG,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAG7G,OAAO,EAAE,OAAO,IAAI,iCAAiC,EAAE,MAAM,4DAA4D,CAAC;AAC1H,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,wDAAwD,CAAC;AAElH,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAS3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAGpF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAMtF,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AACpG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAG3F,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAgBlF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAC","sourcesContent":["export * from \"./index.js\";\r\n\r\nexport { default as NodeApiClient } from \"./utils/api/node/nodeApiClient.js\";\r\nexport { default as NodeClientBase } from \"./utils/api/node/nodeClientBase.js\";\r\nexport { default as NodeFileServerUploadClient } from \"./uploader/api/node/nodeFileServerUploadClient.js\";\r\nexport { default as NodeFileServerDownloadClient } from \"./downloader/api/node/nodeFileServerDownloadClient.js\";\r\nexport { default as NodeFileServerClientFactory } from \"./utils/api/node/nodeFileServerClientFactory.js\";\r\n\r\nexport { default as NodeEventsEngine } from \"./utils/events/node/nodeEventsEngine.js\";\r\n\r\nexport { default as NodeChunkStreamProvider } from \"./utils/fileSystem/node/nodeChunkStreamProvider.js\";\r\nexport { default as NodeFileDetails } from \"./utils/fileSystem/node/nodeFileDetails.js\";\r\n\r\nexport { default as NodeFileDetailsProvider } from \"./client/node/nodeFileDetailsProvider.js\";\r\nexport { default as NodeTransferUploader } from \"./client/uploader/node/nodeTransferUploader.js\";\r\n\r\nexport { default as NodeFileSystemService } from \"./utils/fileSystem/node/nodeFileSystemService.js\";\r\nexport { default as NodeChunkStreamProviderFactory } from \"./utils/fileSystem/node/nodeChunkStreamProviderFactory.js\";\r\n\r\nexport { default as NodeTransferDownloader } from \"./client/downloader/node/nodeTransferDownloader.js\";\r\n\r\nexport { default as NodeAutoDownloaderFactory } from \"./autoDownloader/factory/nodeAutoDownloaderFactory.js\";\r\nexport { default as NodeAutoDownloaderFactoryOptions } from \"./autoDownloader/factory/nodeAutoDownloaderFactoryOptions.js\";\r\n\r\nexport { default as NodeAutoDownloaderStateSerializer } from \"./autoDownloader/node/nodeAutoDownloaderStateSerializer.js\";\r\nexport { default as NodeTransferDownloaderFactory } from \"./autoDownloader/node/nodeTransferDownloaderFactory.js\";\r\n\r\nexport { default as FilesDownloader } from \"./downloader/filesDownloader.js\";\r\nexport { default as DownloadLogger } from \"./downloader/downloadLogger.js\";\r\nexport { default as DownloadEventArgs } from \"./downloader/eventArgs/downloadEventArgs.js\";\r\nexport { default as DownloadPauseEventArgs } from \"./downloader/eventArgs/downloadPauseEventArgs.js\";\r\nexport { default as DownloadCompletedEventArgs } from \"./downloader/eventArgs/downloadCompletedEventArgs.js\";\r\nexport { default as DownloadMetadataDeterminedEventArgs } from \"./downloader/eventArgs/downloadMetadataDeterminedEventArgs.js\";\r\nexport { default as FileDownloadEventArgs } from \"./downloader/eventArgs/fileDownloadEventArgs.js\";\r\nexport { default as FileDownloadFailedEventArgs } from \"./downloader/eventArgs/fileDownloadFailedEventArgs.js\";\r\nexport { default as ChunkDownloadEventArgs } from \"./downloader/eventArgs/chunkDownloadEventArgs.js\";\r\nexport { default as ChunkDownloadFailedEventArgs } from \"./downloader/eventArgs/chunkDownloadFailedEventArgs.js\";\r\nexport { default as DownloadOptions } from \"./downloader/downloadOptions.js\";\r\nexport { default as DownloadError } from \"./downloader/dtos/downloadError.js\";\r\nexport { default as DownloadErrorCode } from \"./downloader/dtos/downloadErrorCode.js\";\r\nexport { default as DownloadFileInfo } from \"./downloader/dtos/downloadFileInfo.js\";\r\nexport { default as DownloadInfo } from \"./downloader/dtos/downloadInfo.js\";\r\nexport { default as DownloaderRestoredState } from \"./downloader/dtos/downloaderRestoredState.js\";\r\nexport { default as DownloadFileChunkInfo } from \"./downloader/dtos/downloadFileChunkInfo.js\";\r\nexport { default as TransferDownloadEvent } from \"./downloader/dtos/downloadEvent.js\";\r\nexport { default as DownloadCommand } from \"./downloader/dtos/downloadCommand.js\";\r\nexport { default as DownloadFilesCommand } from \"./downloader/dtos/downloadFilesCommand.js\";\r\nexport { default as TransferFileDto } from \"./utils/api/dtos/transferFileDto.js\";\r\nexport { default as DownloadTrackerFileInfo } from \"./downloader/dtos/downloadTrackerFileInfo.js\";\r\nexport { default as DownloadTrackerProgressInfo } from \"./downloader/dtos/downloadTrackerProgressInfo.js\";\r\nexport { default as DownloadRegistrationMode } from \"./downloader/dtos/downloadRegistrationMode.js\";\r\nexport { default as DownloadFolderResolver } from \"./downloader/downloadFolderResolver.js\";\r\n\r\nexport { default as TransferDownloader } from \"./client/downloader/transferDownloader.js\";\r\nexport { default as DownloaderCore } from \"./client/downloader/downloaderCore.js\";\r\n\r\nexport { default as AutoDownloadEventArgs } from \"./autoDownloader/eventArgs/autoDownloadEventArgs.js\";\r\nexport { default as AutoDownloadFailedEventArgs } from \"./autoDownloader/eventArgs/autoDownloadFailedEventArgs.js\";\r\nexport { default as AutoDownloadProgressedEventArgs } from \"./autoDownloader/eventArgs/autoDownloadProgressedEventArgs.js\";\r\nexport { default as AutoDownloadUnhealthyEventArgs } from \"./autoDownloader/eventArgs/autoDownloadUnhealthyEventArgs.js\";\r\nexport { default as AutoDownloadStartedEventArgs } from \"./autoDownloader/eventArgs/autoDownloadStartedEventArgs.js\";\r\nexport { default as NewTransfersCheckCompletedEventArgs } from \"./autoDownloader/eventArgs/newTransfersCheckCompletedEventArgs.js\";\r\nexport { default as AutoDownloadStartingFailedEventArgs } from \"./autoDownloader/eventArgs/autoDownloadStartingFailedEventArgs.js\";\r\nexport { default as CheckingForNewTransfersStartedEventArgs } from \"./autoDownloader/eventArgs/checkingForNewTransfersStartedEventArgs.js\";\r\n\r\nexport { default as NewInboxTransfer } from \"./autoDownloader/newInboxTransfersRetriever/newInboxTransfer.js\";\r\n\r\nexport { default as AutoDownloaderRecoverableState } from \"./autoDownloader/state/autoDownloaderRecoverableState.js\";\r\nexport { default as AutoDownloaderStateSnapshot } from \"./autoDownloader/state/autoDownloaderStateSnapshot.js\";\r\n\r\nexport { default as AutoDownloader } from \"./autoDownloader/autoDownloader.js\";\r\nexport { default as AutoDownloaderError } from \"./autoDownloader/autoDownloaderError.js\";\r\nexport { default as AutoDownloaderEvent } from \"./autoDownloader/autoDownloaderEvent.js\";\r\nexport { default as AutoDownloaderOptions } from \"./autoDownloader/autoDownloaderOptions.js\";\r\nexport { default as AutoDownloaderStateSerializer } from \"./autoDownloader/autoDownloaderStateSerializer.js\";\r\nexport { default as TransferDownloaderFactory } from \"./autoDownloader/transferDownloaderFactory.js\";"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.web.js","sourceRoot":"","sources":["../../src/index.web.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AACvG,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,+CAA+C,CAAC;AAEtG,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAEnF,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,sEAAsE,CAAC;AACzH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAErF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAE9F,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,yDAAyD,CAAC","sourcesContent":["export * from \"./index.js\";\n\nexport { default as WebApiClient } from \"./utils/api/web/webApiClient.js\";\nexport { default as WebClientBase } from \"./utils/api/web/webClientBase.js\";\nexport { default as WebFileServerUploadClient } from \"./uploader/api/web/webFileServerUploadClient.js\";\nexport { default as WebFileServerClientFactory } from \"./utils/api/web/webFileServerClientFactory.js\";\n\nexport { default as WebEventsEngine } from \"./utils/events/web/webEventsEngine.js\";\n\nexport { default as WebChunkStreamProvider } from \"./utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js\";\nexport { default as WebFileDetails } from \"./utils/fileSystem/web/webFileDetails.js\";\n\nexport { default as WebTransferUploader } from \"./client/uploader/web/webTransferUploader.js\";\n\nexport { default as WebChunkStreamProviderFactory } from \"./utils/fileSystem/web/webChunkStreamProviderFactory.js\";"]}
|
|
1
|
+
{"version":3,"file":"index.web.js","sourceRoot":"","sources":["../../src/index.web.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AACvG,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,+CAA+C,CAAC;AAEtG,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAEnF,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,sEAAsE,CAAC;AACzH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAErF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAE9F,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,yDAAyD,CAAC","sourcesContent":["export * from \"./index.js\";\r\n\r\nexport { default as WebApiClient } from \"./utils/api/web/webApiClient.js\";\r\nexport { default as WebClientBase } from \"./utils/api/web/webClientBase.js\";\r\nexport { default as WebFileServerUploadClient } from \"./uploader/api/web/webFileServerUploadClient.js\";\r\nexport { default as WebFileServerClientFactory } from \"./utils/api/web/webFileServerClientFactory.js\";\r\n\r\nexport { default as WebEventsEngine } from \"./utils/events/web/webEventsEngine.js\";\r\n\r\nexport { default as WebChunkStreamProvider } from \"./utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js\";\r\nexport { default as WebFileDetails } from \"./utils/fileSystem/web/webFileDetails.js\";\r\n\r\nexport { default as WebTransferUploader } from \"./client/uploader/web/webTransferUploader.js\";\r\n\r\nexport { default as WebChunkStreamProviderFactory } from \"./utils/fileSystem/web/webChunkStreamProviderFactory.js\";"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileServerUploadClient.js","sourceRoot":"","sources":["../../../../src/uploader/api/fileServerUploadClient.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\nimport type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\nimport type SendFileChunkRequest from \"../../utils/api/dtos/sendFileChunkRequest.js\";\nimport type { PauseSignal } from \"../pauseController.js\";\n\n// This should be used as a transient object - a new instance for every chunk\ninterface FileServerUploadClient {\n sendFileChunk(request: SendFileChunkRequest, chunkStreamProvider: ChunkStreamProvider, pauseSignal: PauseSignal, abortSignal: AbortSignal): Promise<void>\n addEventListener(eventName: `progress`, handler: (event: ChunkProgressEvent) => void): void\n}\n\nexport default FileServerUploadClient;"]}
|
|
1
|
+
{"version":3,"file":"fileServerUploadClient.js","sourceRoot":"","sources":["../../../../src/uploader/api/fileServerUploadClient.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\r\nimport type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type SendFileChunkRequest from \"../../utils/api/dtos/sendFileChunkRequest.js\";\r\nimport type { PauseSignal } from \"../pauseController.js\";\r\n\r\n// This should be used as a transient object - a new instance for every chunk\r\ninterface FileServerUploadClient {\r\n sendFileChunk(request: SendFileChunkRequest, chunkStreamProvider: ChunkStreamProvider, pauseSignal: PauseSignal, abortSignal: AbortSignal): Promise<void>\r\n addEventListener(eventName: `progress`, handler: (event: ChunkProgressEvent) => void): void\r\n}\r\n\r\nexport default FileServerUploadClient;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeFileServerUploadClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/node/nodeFileServerUploadClient.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport { Readable } from \"stream\";\n\nimport got, { Got, Response, CancelableRequest } from \"got\";\n\nimport type { ReadableStream } from \"stream/web\";\n\nimport NodeFileServerClientBase from \"../../../utils/api/node/nodeFileserverClientBase.js\";\n\nimport FsError from \"../../../utils/fileSystem/fsError.js\";\nimport { retryEconnresetWorkaround } from \"../../../utils/api/node/gotWorkarounds.js\";\n\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\nimport type SendFileChunkRequest from \"../../../utils/api/dtos/sendFileChunkRequest.js\";\nimport type FileServerUploadClient from \"../fileServerUploadClient.js\";\nimport type { PauseSignal } from \"../../pauseController.js\";\n\n// This should be used as a transient object - a new instance for every chunk\nexport default class NodeFileServerUploadClient extends NodeFileServerClientBase implements FileServerUploadClient {\n readonly #uploadUrl: string;\n readonly #gotInstance: Got;\n\n constructor(uploadUrl: string, transferId: string, transferKey: string, fileName: string, fileDestinationPath: string, fileTotalSizeInBytes: number, fileId: string | undefined, source: string, sourceDetails: string, uploadIdleTimeoutInMs: number, retryLimit: number) {\n super();\n\n this.#uploadUrl = uploadUrl;\n\n const fullDestinationFileName = path.posix.join(fileDestinationPath, fileName);\n\n this.#gotInstance = this.createGotInstance(transferId, transferKey, fullDestinationFileName, fileTotalSizeInBytes, fileId, source, sourceDetails, uploadIdleTimeoutInMs, retryLimit);\n }\n\n private createGotInstance(transferId: string, transferKey: string, fullDestinationFileName: string, fileTotalSizeInBytes: number, fileId: string | undefined, source: string, sourceDetails: string, uploadIdleTimeoutInMs: number, retryLimit: number): Got {\n return got.extend({\n timeout: {\n socket: uploadIdleTimeoutInMs > 0 ? uploadIdleTimeoutInMs : undefined,\n },\n searchParams: {\n transferid: transferId,\n transferkey: transferKey,\n // The file server saves the chunk into the files db only when fileid is present and thefilename is absent.\n ...(fileId ? { fileid: fileId } : { thefilename: fullDestinationFileName }),\n totalsize: fileTotalSizeInBytes,\n source,\n sourcedetails: sourceDetails,\n },\n retry: {\n limit: retryLimit,\n methods: [`GET`, `POST`, `PUT`, `PATCH`, `HEAD`, `DELETE`, `OPTIONS`, `TRACE`],\n ...retryEconnresetWorkaround,\n },\n });\n }\n\n async sendFileChunk(request: SendFileChunkRequest, chunkStreamProvider: ChunkStreamProvider, pauseSignal: PauseSignal, abortSignal: AbortSignal): Promise<void> {\n let ongoingRequestPromise: CancelableRequest<Response<string>> | null = null;\n\n const uploadProgressHandler = this.getDataTransferProgressHandler();\n\n try {\n let isRetry = false;\n\n const gotChunkInstance = this.#gotInstance.extend({\n headers: {\n 'Transfer-Encoding': `chunked`,\n },\n hooks: {\n beforeRetry: [\n requestError => {\n isRetry = true;\n // eslint-disable-next-line no-param-reassign\n requestError.options.body = ``; // clearing the body to avoid `Cannot retry with consumed body stream` error\n },\n ],\n beforeRequest: [\n async options => {\n /* eslint-disable no-param-reassign */\n if (!isRetry)\n return;\n\n const readableStream = await chunkStreamProvider.getChunkReadStream(pauseSignal, abortSignal) as ReadableStream;\n options.body = Readable.fromWeb(readableStream);\n },\n ],\n },\n });\n\n const md5checksum = await chunkStreamProvider.getMd5Checksum(`base64`, pauseSignal, abortSignal);\n\n const readableStream = await chunkStreamProvider.getChunkReadStream(pauseSignal, abortSignal) as ReadableStream;\n const body = Readable.fromWeb(readableStream);\n\n ongoingRequestPromise = gotChunkInstance.post(this.#uploadUrl, {\n body,\n signal: abortSignal,\n searchParams: {\n chunkpos: request.chunkStartPosition,\n chunksize: request.chunkLengthInBytes,\n md5: md5checksum,\n },\n });\n\n ongoingRequestPromise.on(`uploadProgress`, uploadProgressHandler);\n\n await ongoingRequestPromise;\n }\n catch (error) {\n /* eslint-disable no-ex-assign */\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\n error = new FsError((error as Error).message);\n\n throw this.createApiError(error, `Error sending file chunk`);\n }\n finally {\n if (!chunkStreamProvider.isReleased)\n await chunkStreamProvider.release();\n\n ongoingRequestPromise?.off(`uploadProgress`, uploadProgressHandler); // There is a bug in GOT that it fires this event once after the got promise was canceled https://github.com/sindresorhus/got/issues/2084\n }\n }\n\n private isWrappedCreatingFileReadStreamException(error: Error): boolean {\n return error.message === `CreatingFileReadStreamException`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nodeFileServerUploadClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/node/nodeFileServerUploadClient.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\nimport { Readable } from \"stream\";\r\n\r\nimport got, { Got, Response, CancelableRequest } from \"got\";\r\n\r\nimport type { ReadableStream } from \"stream/web\";\r\n\r\nimport NodeFileServerClientBase from \"../../../utils/api/node/nodeFileserverClientBase.js\";\r\n\r\nimport FsError from \"../../../utils/fileSystem/fsError.js\";\r\nimport { retryEconnresetWorkaround } from \"../../../utils/api/node/gotWorkarounds.js\";\r\n\r\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type SendFileChunkRequest from \"../../../utils/api/dtos/sendFileChunkRequest.js\";\r\nimport type FileServerUploadClient from \"../fileServerUploadClient.js\";\r\nimport type { PauseSignal } from \"../../pauseController.js\";\r\n\r\n// This should be used as a transient object - a new instance for every chunk\r\nexport default class NodeFileServerUploadClient extends NodeFileServerClientBase implements FileServerUploadClient {\r\n readonly #uploadUrl: string;\r\n readonly #gotInstance: Got;\r\n\r\n constructor(uploadUrl: string, transferId: string, transferKey: string, fileName: string, fileDestinationPath: string, fileTotalSizeInBytes: number, fileId: string | undefined, source: string, sourceDetails: string, uploadIdleTimeoutInMs: number, retryLimit: number) {\r\n super();\r\n\r\n this.#uploadUrl = uploadUrl;\r\n\r\n const fullDestinationFileName = path.posix.join(fileDestinationPath, fileName);\r\n\r\n this.#gotInstance = this.createGotInstance(transferId, transferKey, fullDestinationFileName, fileTotalSizeInBytes, fileId, source, sourceDetails, uploadIdleTimeoutInMs, retryLimit);\r\n }\r\n\r\n private createGotInstance(transferId: string, transferKey: string, fullDestinationFileName: string, fileTotalSizeInBytes: number, fileId: string | undefined, source: string, sourceDetails: string, uploadIdleTimeoutInMs: number, retryLimit: number): Got {\r\n return got.extend({\r\n timeout: {\r\n socket: uploadIdleTimeoutInMs > 0 ? uploadIdleTimeoutInMs : undefined,\r\n },\r\n searchParams: {\r\n transferid: transferId,\r\n transferkey: transferKey,\r\n // The file server saves the chunk into the files db only when fileid is present and thefilename is absent.\r\n ...(fileId ? { fileid: fileId } : { thefilename: fullDestinationFileName }),\r\n totalsize: fileTotalSizeInBytes,\r\n source,\r\n sourcedetails: sourceDetails,\r\n },\r\n retry: {\r\n limit: retryLimit,\r\n methods: [`GET`, `POST`, `PUT`, `PATCH`, `HEAD`, `DELETE`, `OPTIONS`, `TRACE`],\r\n ...retryEconnresetWorkaround,\r\n },\r\n });\r\n }\r\n\r\n async sendFileChunk(request: SendFileChunkRequest, chunkStreamProvider: ChunkStreamProvider, pauseSignal: PauseSignal, abortSignal: AbortSignal): Promise<void> {\r\n let ongoingRequestPromise: CancelableRequest<Response<string>> | null = null;\r\n\r\n const uploadProgressHandler = this.getDataTransferProgressHandler();\r\n\r\n try {\r\n let isRetry = false;\r\n\r\n const gotChunkInstance = this.#gotInstance.extend({\r\n headers: {\r\n 'Transfer-Encoding': `chunked`,\r\n },\r\n hooks: {\r\n beforeRetry: [\r\n requestError => {\r\n isRetry = true;\r\n // eslint-disable-next-line no-param-reassign\r\n requestError.options.body = ``; // clearing the body to avoid `Cannot retry with consumed body stream` error\r\n },\r\n ],\r\n beforeRequest: [\r\n async options => {\r\n /* eslint-disable no-param-reassign */\r\n if (!isRetry)\r\n return;\r\n\r\n const readableStream = await chunkStreamProvider.getChunkReadStream(pauseSignal, abortSignal) as ReadableStream;\r\n options.body = Readable.fromWeb(readableStream);\r\n },\r\n ],\r\n },\r\n });\r\n\r\n const md5checksum = await chunkStreamProvider.getMd5Checksum(`base64`, pauseSignal, abortSignal);\r\n\r\n const readableStream = await chunkStreamProvider.getChunkReadStream(pauseSignal, abortSignal) as ReadableStream;\r\n const body = Readable.fromWeb(readableStream);\r\n\r\n ongoingRequestPromise = gotChunkInstance.post(this.#uploadUrl, {\r\n body,\r\n signal: abortSignal,\r\n searchParams: {\r\n chunkpos: request.chunkStartPosition,\r\n chunksize: request.chunkLengthInBytes,\r\n md5: md5checksum,\r\n },\r\n });\r\n\r\n ongoingRequestPromise.on(`uploadProgress`, uploadProgressHandler);\r\n\r\n await ongoingRequestPromise;\r\n }\r\n catch (error) {\r\n /* eslint-disable no-ex-assign */\r\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\r\n error = new FsError((error as Error).message);\r\n\r\n throw this.createApiError(error, `Error sending file chunk`);\r\n }\r\n finally {\r\n if (!chunkStreamProvider.isReleased)\r\n await chunkStreamProvider.release();\r\n\r\n ongoingRequestPromise?.off(`uploadProgress`, uploadProgressHandler); // There is a bug in GOT that it fires this event once after the got promise was canceled https://github.com/sindresorhus/got/issues/2084\r\n }\r\n }\r\n\r\n private isWrappedCreatingFileReadStreamException(error: Error): boolean {\r\n return error.message === `CreatingFileReadStreamException`;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axiosIdleTimeoutManager.js","sourceRoot":"","sources":["../../../../../../src/uploader/api/web/utils/axiosIdleTimeoutManager.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,uBAAuB;IACxC,sBAAsB,CAAS;IAC/B,YAAY,CAAc;IAE1B,eAAe,CAA+B;IAE9C,YAAY,qBAA6B,EAAE,WAAwB;QAC/D,IAAI,CAAC,sBAAsB,GAAG,qBAAqB,CAAC;QACpD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IACpC,CAAC;IAED,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,uBAAuB;QACnB,IAAI,IAAI,CAAC,eAAe;YACpB,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;QAE3C,MAAM,qBAAqB,GAAG,IAAI,eAAe,EAAE,CAAC;QACpD,IAAI,SAAS,GAAyC,IAAI,CAAC;QAE3D,MAAM,gBAAgB,GAAG,GAAG,EAAE;YAC1B,IAAI,SAAS;gBACT,YAAY,CAAC,SAAS,CAAC,CAAC;YAE5B,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC;gBAChC,OAAO;YAEX,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBACxB,qBAAqB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,sBAAsB,IAAI,CAAC,CAAC,CAAC;YAC7F,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpC,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAC;QAEjD,MAAM,UAAU,GAAG,GAAG,EAAE;YACpB,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAC3B,eAAe,EAAE,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACxD,qBAAqB,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM,eAAe,GAAG,GAAG,EAAE;YACzB,IAAI,SAAS,EAAE,CAAC;gBACZ,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,SAAS,GAAG,IAAI,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC3D,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC1E,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO;YACzB,UAAU,EAAE,CAAC;QAEjB,IAAI,CAAC,eAAe,GAAG;YACnB,YAAY,EAAE,kBAAkB,CAAC,MAAM;YACvC,iBAAiB,EAAE,qBAAqB,CAAC,MAAM;YAC/C,gBAAgB;YAChB,eAAe;SAClB,CAAC;QAEF,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;CACJ","sourcesContent":["export type AxiosIdleTimeout = { mergedSignal: AbortSignal; idleTimeoutSignal: AbortSignal; resetIdleTimeout: () => void; stopIdleTimeout: () => void; }\n\nexport default class AxiosIdleTimeoutManager {\n #uploadIdleTimeoutInMs: number;\n #abortSignal: AbortSignal;\n\n #currentTimeout: AxiosIdleTimeout | undefined;\n\n constructor(uploadIdleTimeoutInMs: number, abortSignal: AbortSignal) {\n this.#uploadIdleTimeoutInMs = uploadIdleTimeoutInMs;\n this.#abortSignal = abortSignal;\n }\n\n get currentTimeout(): AxiosIdleTimeout | undefined {\n return this.#currentTimeout;\n }\n\n configureNewIdleTimeout(): AxiosIdleTimeout {\n if (this.#currentTimeout)\n this.#currentTimeout.stopIdleTimeout();\n\n const idleTimeoutController = new AbortController();\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const resetIdleTimeout = () => {\n if (idleTimer)\n clearTimeout(idleTimer);\n\n if (this.#uploadIdleTimeoutInMs <= 0)\n return;\n\n idleTimer = setTimeout(() => {\n idleTimeoutController.abort(new Error(`TIMEOUT: idle ${this.#uploadIdleTimeoutInMs}ms`));\n }, this.#uploadIdleTimeoutInMs);\n };\n\n const combinedController = new AbortController();\n\n const onAnyAbort = () => {\n combinedController.abort();\n stopIdleTimeout();\n };\n\n this.#abortSignal.addEventListener(`abort`, onAnyAbort);\n idleTimeoutController.signal.addEventListener(`abort`, onAnyAbort);\n\n const stopIdleTimeout = () => {\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = null;\n }\n\n this.#abortSignal.removeEventListener(`abort`, onAnyAbort);\n idleTimeoutController.signal.removeEventListener(`abort`, onAnyAbort);\n };\n\n if (this.#abortSignal.aborted)\n onAnyAbort();\n\n this.#currentTimeout = {\n mergedSignal: combinedController.signal,\n idleTimeoutSignal: idleTimeoutController.signal,\n resetIdleTimeout,\n stopIdleTimeout,\n };\n\n return this.#currentTimeout;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"axiosIdleTimeoutManager.js","sourceRoot":"","sources":["../../../../../../src/uploader/api/web/utils/axiosIdleTimeoutManager.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,uBAAuB;IACxC,sBAAsB,CAAS;IAC/B,YAAY,CAAc;IAE1B,eAAe,CAA+B;IAE9C,YAAY,qBAA6B,EAAE,WAAwB;QAC/D,IAAI,CAAC,sBAAsB,GAAG,qBAAqB,CAAC;QACpD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IACpC,CAAC;IAED,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,uBAAuB;QACnB,IAAI,IAAI,CAAC,eAAe;YACpB,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;QAE3C,MAAM,qBAAqB,GAAG,IAAI,eAAe,EAAE,CAAC;QACpD,IAAI,SAAS,GAAyC,IAAI,CAAC;QAE3D,MAAM,gBAAgB,GAAG,GAAG,EAAE;YAC1B,IAAI,SAAS;gBACT,YAAY,CAAC,SAAS,CAAC,CAAC;YAE5B,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC;gBAChC,OAAO;YAEX,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBACxB,qBAAqB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,sBAAsB,IAAI,CAAC,CAAC,CAAC;YAC7F,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpC,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAC;QAEjD,MAAM,UAAU,GAAG,GAAG,EAAE;YACpB,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAC3B,eAAe,EAAE,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACxD,qBAAqB,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM,eAAe,GAAG,GAAG,EAAE;YACzB,IAAI,SAAS,EAAE,CAAC;gBACZ,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,SAAS,GAAG,IAAI,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC3D,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC1E,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO;YACzB,UAAU,EAAE,CAAC;QAEjB,IAAI,CAAC,eAAe,GAAG;YACnB,YAAY,EAAE,kBAAkB,CAAC,MAAM;YACvC,iBAAiB,EAAE,qBAAqB,CAAC,MAAM;YAC/C,gBAAgB;YAChB,eAAe;SAClB,CAAC;QAEF,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;CACJ","sourcesContent":["export type AxiosIdleTimeout = { mergedSignal: AbortSignal; idleTimeoutSignal: AbortSignal; resetIdleTimeout: () => void; stopIdleTimeout: () => void; }\r\n\r\nexport default class AxiosIdleTimeoutManager {\r\n #uploadIdleTimeoutInMs: number;\r\n #abortSignal: AbortSignal;\r\n\r\n #currentTimeout: AxiosIdleTimeout | undefined;\r\n\r\n constructor(uploadIdleTimeoutInMs: number, abortSignal: AbortSignal) {\r\n this.#uploadIdleTimeoutInMs = uploadIdleTimeoutInMs;\r\n this.#abortSignal = abortSignal;\r\n }\r\n\r\n get currentTimeout(): AxiosIdleTimeout | undefined {\r\n return this.#currentTimeout;\r\n }\r\n\r\n configureNewIdleTimeout(): AxiosIdleTimeout {\r\n if (this.#currentTimeout)\r\n this.#currentTimeout.stopIdleTimeout();\r\n\r\n const idleTimeoutController = new AbortController();\r\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const resetIdleTimeout = () => {\r\n if (idleTimer)\r\n clearTimeout(idleTimer);\r\n\r\n if (this.#uploadIdleTimeoutInMs <= 0)\r\n return;\r\n\r\n idleTimer = setTimeout(() => {\r\n idleTimeoutController.abort(new Error(`TIMEOUT: idle ${this.#uploadIdleTimeoutInMs}ms`));\r\n }, this.#uploadIdleTimeoutInMs);\r\n };\r\n\r\n const combinedController = new AbortController();\r\n\r\n const onAnyAbort = () => {\r\n combinedController.abort();\r\n stopIdleTimeout();\r\n };\r\n\r\n this.#abortSignal.addEventListener(`abort`, onAnyAbort);\r\n idleTimeoutController.signal.addEventListener(`abort`, onAnyAbort);\r\n\r\n const stopIdleTimeout = () => {\r\n if (idleTimer) {\r\n clearTimeout(idleTimer);\r\n idleTimer = null;\r\n }\r\n\r\n this.#abortSignal.removeEventListener(`abort`, onAnyAbort);\r\n idleTimeoutController.signal.removeEventListener(`abort`, onAnyAbort);\r\n };\r\n\r\n if (this.#abortSignal.aborted)\r\n onAnyAbort();\r\n\r\n this.#currentTimeout = {\r\n mergedSignal: combinedController.signal,\r\n idleTimeoutSignal: idleTimeoutController.signal,\r\n resetIdleTimeout,\r\n stopIdleTimeout,\r\n };\r\n\r\n return this.#currentTimeout;\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webFileServerUploadClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/web/webFileServerUploadClient.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, { AxiosInstance } from \"axios\";\nimport axiosRetry, { isNetworkOrIdempotentRequestError } from \"axios-retry\";\n\nimport WebFileServerClientBase from \"../../../utils/api/web/webFileserverClientBase.js\";\n\nimport FsError from \"../../../utils/fileSystem/fsError.js\";\nimport AxiosIdleTimeoutManager from \"./utils/axiosIdleTimeoutManager.js\";\n\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\nimport type SendFileChunkRequest from \"../../../utils/api/dtos/sendFileChunkRequest.js\";\nimport type FileServerUploadClient from \"../fileServerUploadClient.js\";\nimport type { PauseSignal } from \"../../pauseController.js\";\n\n// This should be used as a transient object - a new instance for every chunk\nexport default class WebFileServerUploadClient extends WebFileServerClientBase implements FileServerUploadClient {\n readonly #uploadUrl: string;\n readonly #retryLimit: number;\n readonly #uploadIdleTimeoutInMs: number;\n\n readonly #axiosInstance: AxiosInstance;\n\n constructor(uploadUrl: string, transferId: string, transferKey: string, fileName: string, fileDestinationPath: string, fileTotalSizeInBytes: number, fileId: string | undefined, source: string, sourceDetails: string, uploadIdleTimeoutInMs: number, retryLimit: number) {\n super();\n\n this.#uploadUrl = uploadUrl;\n this.#retryLimit = retryLimit;\n this.#uploadIdleTimeoutInMs = uploadIdleTimeoutInMs;\n\n const fullDestinationFileName = this.joinDestinationPathAndFileName(fileDestinationPath, fileName);\n\n this.#axiosInstance = this.createAxiosInstance(transferId, transferKey, fullDestinationFileName, fileTotalSizeInBytes, fileId, source, sourceDetails);\n }\n\n private joinDestinationPathAndFileName(fileDestinationPath: string, fileName: string) {\n if (fileDestinationPath.endsWith(`/`))\n return `${fileDestinationPath}${fileName}`;\n\n return `${fileDestinationPath}/${fileName}`;\n }\n\n private createAxiosInstance(transferId: string, transferKey: string, fullDestinationFileName: string, fileTotalSizeInBytes: number, fileId: string | undefined, source: string, sourceDetails: string): AxiosInstance {\n return axios.create({\n params: {\n transferid: transferId,\n transferkey: transferKey,\n // The file server saves the chunk into the files db only when fileid is present and thefilename is absent.\n ...(fileId ? { fileid: fileId } : { thefilename: fullDestinationFileName }),\n totalsize: fileTotalSizeInBytes,\n source,\n sourcedetails: sourceDetails,\n },\n headers: {\n 'Content-Type': `application/octet-stream`,\n },\n });\n }\n\n async sendFileChunk(request: SendFileChunkRequest, chunkStreamProvider: ChunkStreamProvider, pauseSignal: PauseSignal, abortSignal: AbortSignal): Promise<void> {\n let isRequestFinished = false;\n\n const idleTimeoutManager = new AxiosIdleTimeoutManager(this.#uploadIdleTimeoutInMs, abortSignal);\n\n try {\n const md5checksum = await chunkStreamProvider.getMd5Checksum(`base64`, pauseSignal, abortSignal);\n const chunkBlob = await chunkStreamProvider.getChunkBlob();\n\n const idleTimeout = idleTimeoutManager.configureNewIdleTimeout();\n const uploadProgressHandler = this.getDataTransferProgressHandler();\n\n this.configureRetryMechanism(chunkStreamProvider, idleTimeoutManager);\n\n idleTimeoutManager.currentTimeout?.resetIdleTimeout();\n\n await this.#axiosInstance.post(this.#uploadUrl, chunkBlob, {\n maxBodyLength: Infinity,\n maxContentLength: Infinity,\n signal: idleTimeout.mergedSignal,\n onUploadProgress: progressEvent => {\n if (isRequestFinished)\n return; // Axios still sends events after abort signal was fired\n\n idleTimeoutManager.currentTimeout?.resetIdleTimeout();\n uploadProgressHandler(progressEvent);\n },\n params: {\n chunkpos: request.chunkStartPosition,\n chunksize: request.chunkLengthInBytes,\n md5: md5checksum,\n },\n });\n }\n catch (error) {\n /* eslint-disable no-ex-assign */\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\n error = new FsError((error as Error).message);\n\n throw this.createApiError(error, `Error sending file chunk`, idleTimeoutManager.currentTimeout?.idleTimeoutSignal);\n }\n finally {\n isRequestFinished = true;\n\n idleTimeoutManager.currentTimeout?.stopIdleTimeout();\n\n if (!chunkStreamProvider.isReleased)\n await chunkStreamProvider.release();\n }\n }\n\n /* eslint-disable no-param-reassign */\n private configureRetryMechanism(chunkStreamProvider: ChunkStreamProvider, idleTimeoutManager: AxiosIdleTimeoutManager) {\n axiosRetry(this.#axiosInstance, {\n retries: this.#retryLimit,\n retryDelay: retryCount => retryCount * 1000,\n shouldResetTimeout: true,\n retryCondition: e => {\n const isIdleTimeouted = e.code === `ERR_CANCELED` && Boolean(idleTimeoutManager.currentTimeout?.idleTimeoutSignal.aborted);\n const isRetryablePost = e.config?.method === `post`;\n return isNetworkOrIdempotentRequestError(e) || isRetryablePost || isIdleTimeouted;\n },\n onRetry: async (_retryCount, _error, requestConfig) => {\n const newIdleTimeout = idleTimeoutManager.configureNewIdleTimeout();\n\n requestConfig.signal = newIdleTimeout.mergedSignal;\n requestConfig.data = await chunkStreamProvider.getChunkBlob();\n },\n });\n }\n\n private isWrappedCreatingFileReadStreamException(error: Error): boolean {\n return error.message === `CreatingFileReadStreamException`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"webFileServerUploadClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/web/webFileServerUploadClient.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, { AxiosInstance } from \"axios\";\r\nimport axiosRetry, { isNetworkOrIdempotentRequestError } from \"axios-retry\";\r\n\r\nimport WebFileServerClientBase from \"../../../utils/api/web/webFileserverClientBase.js\";\r\n\r\nimport FsError from \"../../../utils/fileSystem/fsError.js\";\r\nimport AxiosIdleTimeoutManager from \"./utils/axiosIdleTimeoutManager.js\";\r\n\r\nimport type ChunkStreamProvider from \"../../../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type SendFileChunkRequest from \"../../../utils/api/dtos/sendFileChunkRequest.js\";\r\nimport type FileServerUploadClient from \"../fileServerUploadClient.js\";\r\nimport type { PauseSignal } from \"../../pauseController.js\";\r\n\r\n// This should be used as a transient object - a new instance for every chunk\r\nexport default class WebFileServerUploadClient extends WebFileServerClientBase implements FileServerUploadClient {\r\n readonly #uploadUrl: string;\r\n readonly #retryLimit: number;\r\n readonly #uploadIdleTimeoutInMs: number;\r\n\r\n readonly #axiosInstance: AxiosInstance;\r\n\r\n constructor(uploadUrl: string, transferId: string, transferKey: string, fileName: string, fileDestinationPath: string, fileTotalSizeInBytes: number, fileId: string | undefined, source: string, sourceDetails: string, uploadIdleTimeoutInMs: number, retryLimit: number) {\r\n super();\r\n\r\n this.#uploadUrl = uploadUrl;\r\n this.#retryLimit = retryLimit;\r\n this.#uploadIdleTimeoutInMs = uploadIdleTimeoutInMs;\r\n\r\n const fullDestinationFileName = this.joinDestinationPathAndFileName(fileDestinationPath, fileName);\r\n\r\n this.#axiosInstance = this.createAxiosInstance(transferId, transferKey, fullDestinationFileName, fileTotalSizeInBytes, fileId, source, sourceDetails);\r\n }\r\n\r\n private joinDestinationPathAndFileName(fileDestinationPath: string, fileName: string) {\r\n if (fileDestinationPath.endsWith(`/`))\r\n return `${fileDestinationPath}${fileName}`;\r\n\r\n return `${fileDestinationPath}/${fileName}`;\r\n }\r\n\r\n private createAxiosInstance(transferId: string, transferKey: string, fullDestinationFileName: string, fileTotalSizeInBytes: number, fileId: string | undefined, source: string, sourceDetails: string): AxiosInstance {\r\n return axios.create({\r\n params: {\r\n transferid: transferId,\r\n transferkey: transferKey,\r\n // The file server saves the chunk into the files db only when fileid is present and thefilename is absent.\r\n ...(fileId ? { fileid: fileId } : { thefilename: fullDestinationFileName }),\r\n totalsize: fileTotalSizeInBytes,\r\n source,\r\n sourcedetails: sourceDetails,\r\n },\r\n headers: {\r\n 'Content-Type': `application/octet-stream`,\r\n },\r\n });\r\n }\r\n\r\n async sendFileChunk(request: SendFileChunkRequest, chunkStreamProvider: ChunkStreamProvider, pauseSignal: PauseSignal, abortSignal: AbortSignal): Promise<void> {\r\n let isRequestFinished = false;\r\n\r\n const idleTimeoutManager = new AxiosIdleTimeoutManager(this.#uploadIdleTimeoutInMs, abortSignal);\r\n\r\n try {\r\n const md5checksum = await chunkStreamProvider.getMd5Checksum(`base64`, pauseSignal, abortSignal);\r\n const chunkBlob = await chunkStreamProvider.getChunkBlob();\r\n\r\n const idleTimeout = idleTimeoutManager.configureNewIdleTimeout();\r\n const uploadProgressHandler = this.getDataTransferProgressHandler();\r\n\r\n this.configureRetryMechanism(chunkStreamProvider, idleTimeoutManager);\r\n\r\n idleTimeoutManager.currentTimeout?.resetIdleTimeout();\r\n\r\n await this.#axiosInstance.post(this.#uploadUrl, chunkBlob, {\r\n maxBodyLength: Infinity,\r\n maxContentLength: Infinity,\r\n signal: idleTimeout.mergedSignal,\r\n onUploadProgress: progressEvent => {\r\n if (isRequestFinished)\r\n return; // Axios still sends events after abort signal was fired\r\n\r\n idleTimeoutManager.currentTimeout?.resetIdleTimeout();\r\n uploadProgressHandler(progressEvent);\r\n },\r\n params: {\r\n chunkpos: request.chunkStartPosition,\r\n chunksize: request.chunkLengthInBytes,\r\n md5: md5checksum,\r\n },\r\n });\r\n }\r\n catch (error) {\r\n /* eslint-disable no-ex-assign */\r\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\r\n error = new FsError((error as Error).message);\r\n\r\n throw this.createApiError(error, `Error sending file chunk`, idleTimeoutManager.currentTimeout?.idleTimeoutSignal);\r\n }\r\n finally {\r\n isRequestFinished = true;\r\n\r\n idleTimeoutManager.currentTimeout?.stopIdleTimeout();\r\n\r\n if (!chunkStreamProvider.isReleased)\r\n await chunkStreamProvider.release();\r\n }\r\n }\r\n\r\n /* eslint-disable no-param-reassign */\r\n private configureRetryMechanism(chunkStreamProvider: ChunkStreamProvider, idleTimeoutManager: AxiosIdleTimeoutManager) {\r\n axiosRetry(this.#axiosInstance, {\r\n retries: this.#retryLimit,\r\n retryDelay: retryCount => retryCount * 1000,\r\n shouldResetTimeout: true,\r\n retryCondition: e => {\r\n const isIdleTimeouted = e.code === `ERR_CANCELED` && Boolean(idleTimeoutManager.currentTimeout?.idleTimeoutSignal.aborted);\r\n const isRetryablePost = e.config?.method === `post`;\r\n return isNetworkOrIdempotentRequestError(e) || isRetryablePost || isIdleTimeouted;\r\n },\r\n onRetry: async (_retryCount, _error, requestConfig) => {\r\n const newIdleTimeout = idleTimeoutManager.configureNewIdleTimeout();\r\n\r\n requestConfig.signal = newIdleTimeout.mergedSignal;\r\n requestConfig.data = await chunkStreamProvider.getChunkBlob();\r\n },\r\n });\r\n }\r\n\r\n private isWrappedCreatingFileReadStreamException(error: Error): boolean {\r\n return error.message === `CreatingFileReadStreamException`;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeFileDetailsUploaderChunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,wDAAwD,CAAC;AAO7F,MAAM,iDAAiD;IACnD,yBAAyB,CAAC,YAA6B,EAAE,kBAA0B,EAAE,gBAAwB,EAAE,cAA6D;QACxK,OAAO,IAAI,uBAAuB,CAAC,YAAY,CAAC,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;IACxH,CAAC;CACJ;AAED,eAAe,iDAAiD,CAAC","sourcesContent":["import NodeChunkStreamProvider from \"../../utils/fileSystem/node/nodeChunkStreamProvider.js\";\n\nimport type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\nimport type UploaderChunkStreamProviderFactory from \"./uploaderChunkStreamProviderFactory.js\";\nimport type NodeFileDetails from \"../../utils/fileSystem/node/nodeFileDetails.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../../utils/fileSystem/chunkStreamProvider.js\";\n\nclass NodeFileDetailsUploaderChunkStreamProviderFactory implements UploaderChunkStreamProviderFactory<NodeFileDetails> {\n createChunkStreamProvider(chunkDetails: NodeFileDetails, chunkStartPosition: number, chunkSizeInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined): ChunkStreamProvider {\n return new NodeChunkStreamProvider(chunkDetails.fileFullPath, chunkStartPosition, chunkSizeInBytes, encryptionData);\n }\n}\n\nexport default NodeFileDetailsUploaderChunkStreamProviderFactory;"]}
|
|
1
|
+
{"version":3,"file":"nodeFileDetailsUploaderChunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,wDAAwD,CAAC;AAO7F,MAAM,iDAAiD;IACnD,yBAAyB,CAAC,YAA6B,EAAE,kBAA0B,EAAE,gBAAwB,EAAE,cAA6D;QACxK,OAAO,IAAI,uBAAuB,CAAC,YAAY,CAAC,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;IACxH,CAAC;CACJ;AAED,eAAe,iDAAiD,CAAC","sourcesContent":["import NodeChunkStreamProvider from \"../../utils/fileSystem/node/nodeChunkStreamProvider.js\";\r\n\r\nimport type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type UploaderChunkStreamProviderFactory from \"./uploaderChunkStreamProviderFactory.js\";\r\nimport type NodeFileDetails from \"../../utils/fileSystem/node/nodeFileDetails.js\";\r\nimport type { ChunkStreamProviderEncryptionData } from \"../../utils/fileSystem/chunkStreamProvider.js\";\r\n\r\nclass NodeFileDetailsUploaderChunkStreamProviderFactory implements UploaderChunkStreamProviderFactory<NodeFileDetails> {\r\n createChunkStreamProvider(chunkDetails: NodeFileDetails, chunkStartPosition: number, chunkSizeInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined): ChunkStreamProvider {\r\n return new NodeChunkStreamProvider(chunkDetails.fileFullPath, chunkStartPosition, chunkSizeInBytes, encryptionData);\r\n }\r\n}\r\n\r\nexport default NodeFileDetailsUploaderChunkStreamProviderFactory;"]}
|
package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploaderChunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../../utils/fileSystem/chunkStreamProvider.js\";\n\ninterface UploaderChunkStreamProviderFactory<T> {\n createChunkStreamProvider(fileDetails: T, chunkStartPosition: number, chunkSizeInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined): ChunkStreamProvider;\n}\n\nexport default UploaderChunkStreamProviderFactory;"]}
|
|
1
|
+
{"version":3,"file":"uploaderChunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type { ChunkStreamProviderEncryptionData } from \"../../utils/fileSystem/chunkStreamProvider.js\";\r\n\r\ninterface UploaderChunkStreamProviderFactory<T> {\r\n createChunkStreamProvider(fileDetails: T, chunkStartPosition: number, chunkSizeInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined): ChunkStreamProvider;\r\n}\r\n\r\nexport default UploaderChunkStreamProviderFactory;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webFileDetailsUploaderChunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,MAAM,0EAA0E,CAAC;AAO9G,MAAM,gDAAgD;IAClD,yBAAyB,CAAC,YAA4B,EAAE,kBAA0B,EAAE,gBAAwB,EAAE,cAA6D;QACvK,OAAO,IAAI,sBAAsB,CAAC,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAC/G,CAAC;CACJ;AAED,eAAe,gDAAgD,CAAC","sourcesContent":["import WebChunkStreamProvider from \"../../utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js\";\n\nimport type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\nimport type UploaderChunkStreamProviderFactory from \"./uploaderChunkStreamProviderFactory.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../../utils/fileSystem/chunkStreamProvider.js\";\nimport type WebFileDetails from \"../../utils/fileSystem/web/webFileDetails.js\";\n\nclass WebFileDetailsUploaderChunkStreamProviderFactory implements UploaderChunkStreamProviderFactory<WebFileDetails> {\n createChunkStreamProvider(chunkDetails: WebFileDetails, chunkStartPosition: number, chunkSizeInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined): ChunkStreamProvider {\n return new WebChunkStreamProvider(chunkDetails.file, chunkStartPosition, chunkSizeInBytes, encryptionData);\n }\n}\n\nexport default WebFileDetailsUploaderChunkStreamProviderFactory;"]}
|
|
1
|
+
{"version":3,"file":"webFileDetailsUploaderChunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,MAAM,0EAA0E,CAAC;AAO9G,MAAM,gDAAgD;IAClD,yBAAyB,CAAC,YAA4B,EAAE,kBAA0B,EAAE,gBAAwB,EAAE,cAA6D;QACvK,OAAO,IAAI,sBAAsB,CAAC,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAC/G,CAAC;CACJ;AAED,eAAe,gDAAgD,CAAC","sourcesContent":["import WebChunkStreamProvider from \"../../utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js\";\r\n\r\nimport type ChunkStreamProvider from \"../../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type UploaderChunkStreamProviderFactory from \"./uploaderChunkStreamProviderFactory.js\";\r\nimport type { ChunkStreamProviderEncryptionData } from \"../../utils/fileSystem/chunkStreamProvider.js\";\r\nimport type WebFileDetails from \"../../utils/fileSystem/web/webFileDetails.js\";\r\n\r\nclass WebFileDetailsUploaderChunkStreamProviderFactory implements UploaderChunkStreamProviderFactory<WebFileDetails> {\r\n createChunkStreamProvider(chunkDetails: WebFileDetails, chunkStartPosition: number, chunkSizeInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined): ChunkStreamProvider {\r\n return new WebChunkStreamProvider(chunkDetails.file, chunkStartPosition, chunkSizeInBytes, encryptionData);\r\n }\r\n}\r\n\r\nexport default WebFileDetailsUploaderChunkStreamProviderFactory;"]}
|
|
@@ -1 +1 @@
|
|
|
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\";\n\nexport default class ChunksIterator {\n #alreadySentChunks: readonly Readonly<ContinuousChunk>[];\n #alreadySentChunksByStartPosition: ReadonlyMap<number, number>;\n #fileSizeInBytes: number;\n #chunkSizeInBytes: number;\n\n #nextChunkStartPosition = 0;\n\n #isValueAlreadyReturnedForZeroBytesFile = false;\n\n constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, chunkSizeInBytes: number) {\n this.#alreadySentChunks = this.sanitizeChunks(alreadySentChunks);\n this.#alreadySentChunksByStartPosition = this.createChunksByStartPositionMap(this.#alreadySentChunks);\n this.#fileSizeInBytes = fileSizeInBytes;\n this.#chunkSizeInBytes = chunkSizeInBytes;\n }\n\n // This is an anti corruption layer that can be removed after everybody migrates to desktop > 4.8.2\n private sanitizeChunks(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): readonly Readonly<ContinuousChunk>[] {\n return this.removeZeroByteChunks(alreadySentChunks);\n }\n\n private removeZeroByteChunks(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): readonly Readonly<ContinuousChunk>[] {\n return alreadySentChunks.filter(c => c.sizeInBytes > 0);\n }\n\n private createChunksByStartPositionMap(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): ReadonlyMap<number, number> {\n return new Map(alreadySentChunks.map(chunk => [chunk.startPosition, chunk.sizeInBytes]));\n }\n\n getChunksIterator(): IterableIterator<ContinuousChunk> {\n return {\n [Symbol.iterator](): IterableIterator<ContinuousChunk> {\n return this;\n },\n next: (): IteratorResult<ContinuousChunk> => {\n if (this.isZeroBytesFilesCase())\n return this.getNextIteratorValueForZeroBytesFile();\n\n return this.getNextIteratorValue();\n },\n };\n }\n\n private isZeroBytesFilesCase(): boolean {\n return this.#fileSizeInBytes === 0;\n }\n\n private getNextIteratorValueForZeroBytesFile(): IteratorResult<ContinuousChunk> {\n if (this.#isValueAlreadyReturnedForZeroBytesFile)\n return { value: null, done: true };\n\n this.#isValueAlreadyReturnedForZeroBytesFile = true;\n\n return { value: { startPosition: 0, sizeInBytes: 0 }, done: false };\n }\n\n private getNextIteratorValue(): IteratorResult<ContinuousChunk> {\n const startPosition = this.getChunkStartPosition(this.#nextChunkStartPosition);\n\n if (startPosition === this.#fileSizeInBytes)\n return { value: null, done: true };\n\n const sizeInBytes = this.getChunkSizeInBytes(startPosition);\n\n this.#nextChunkStartPosition = startPosition + sizeInBytes;\n\n return { value: { startPosition, sizeInBytes }, done: false };\n }\n\n private getChunkStartPosition(nextChunkStartPosition: number): number {\n let chunkStartPosition = nextChunkStartPosition;\n\n while (true) {\n const alreadySentChunkSize = this.#alreadySentChunksByStartPosition.get(chunkStartPosition);\n\n if (!alreadySentChunkSize)\n return chunkStartPosition;\n\n chunkStartPosition += alreadySentChunkSize;\n }\n }\n\n private getChunkSizeInBytes(newChunkStartPosition: number) {\n const currentMaxChunkSize = this.#chunkSizeInBytes;\n const newChunkEndPosition = newChunkStartPosition + currentMaxChunkSize - 1;\n\n const alreadySentChunkStartingInTheMiddle = this.#alreadySentChunks.find(c => newChunkStartPosition < c.startPosition && c.startPosition <= newChunkEndPosition);\n\n if (alreadySentChunkStartingInTheMiddle)\n return alreadySentChunkStartingInTheMiddle.startPosition - newChunkStartPosition;\n\n const chunkEndsBeyondFile = newChunkEndPosition >= this.#fileSizeInBytes;\n\n if (chunkEndsBeyondFile)\n return this.#fileSizeInBytes - newChunkStartPosition;\n\n return currentMaxChunkSize;\n }\n}"]}
|
|
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 #alreadySentChunksByStartPosition: ReadonlyMap<number, number>;\r\n #fileSizeInBytes: number;\r\n #chunkSizeInBytes: number;\r\n\r\n #nextChunkStartPosition = 0;\r\n\r\n #isValueAlreadyReturnedForZeroBytesFile = false;\r\n\r\n constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, chunkSizeInBytes: number) {\r\n this.#alreadySentChunks = this.sanitizeChunks(alreadySentChunks);\r\n this.#alreadySentChunksByStartPosition = this.createChunksByStartPositionMap(this.#alreadySentChunks);\r\n this.#fileSizeInBytes = fileSizeInBytes;\r\n this.#chunkSizeInBytes = chunkSizeInBytes;\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 private createChunksByStartPositionMap(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): ReadonlyMap<number, number> {\r\n return new Map(alreadySentChunks.map(chunk => [chunk.startPosition, chunk.sizeInBytes]));\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 let chunkStartPosition = nextChunkStartPosition;\r\n\r\n while (true) {\r\n const alreadySentChunkSize = this.#alreadySentChunksByStartPosition.get(chunkStartPosition);\r\n\r\n if (!alreadySentChunkSize)\r\n return chunkStartPosition;\r\n\r\n chunkStartPosition += alreadySentChunkSize;\r\n }\r\n }\r\n\r\n private getChunkSizeInBytes(newChunkStartPosition: number) {\r\n const currentMaxChunkSize = this.#chunkSizeInBytes;\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":"fileAckFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileAckFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type FileUploadEventArgs from \"./fileUploadEventArgs.js\";\n\ninterface FileAckFailedEventArgs extends FileUploadEventArgs {\n uploadItemId: string,\n reason: string,\n error: Error,\n}\n\nexport default FileAckFailedEventArgs;\n"]}
|
|
1
|
+
{"version":3,"file":"fileAckFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileAckFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type FileUploadEventArgs from \"./fileUploadEventArgs.js\";\r\n\r\ninterface FileAckFailedEventArgs extends FileUploadEventArgs {\r\n uploadItemId: string,\r\n reason: string,\r\n error: Error,\r\n}\r\n\r\nexport default FileAckFailedEventArgs;\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileChunkUploadCompletedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type ReadonlyTransferUploadStateFile from \"../state/readonlyTransferUploadStateFile.js\";\n\ninterface FileChunkUploadCompletedEventArgs {\n fileStatus: ReadonlyTransferUploadStateFile,\n uploadItemId: string | undefined,\n chunkStartPosition: number,\n chunkSizeInBytes: number,\n}\n\nexport default FileChunkUploadCompletedEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"fileChunkUploadCompletedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type ReadonlyTransferUploadStateFile from \"../state/readonlyTransferUploadStateFile.js\";\r\n\r\ninterface FileChunkUploadCompletedEventArgs {\r\n fileStatus: ReadonlyTransferUploadStateFile,\r\n uploadItemId: string | undefined,\r\n chunkStartPosition: number,\r\n chunkSizeInBytes: number,\r\n}\r\n\r\nexport default FileChunkUploadCompletedEventArgs;"]}
|