filemail-sdk 9.4.6 → 9.4.7
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.d.ts +10 -1
- package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.d.ts.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.js +103 -12
- package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.js.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.d.ts +5 -0
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.d.ts.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.js +32 -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 +23 -0
- 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.d.ts.map +1 -1
- package/dist/src/downloader/chunkDownloader.js +18 -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/dtos/handshakeRequest.js.map +1 -1
- package/dist/src/uploader/api/dtos/handshakeResponse.js.map +1 -1
- package/dist/src/uploader/api/dtos/pingResponse.js.map +1 -1
- package/dist/src/uploader/api/dtos/sendChunkRequest.js.map +1 -1
- package/dist/src/uploader/api/fileServerUdpClient.js.map +1 -1
- package/dist/src/uploader/api/fileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.js +8 -8
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.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/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/transferMetadataDeterminedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.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/optimizer/optimizationValues.js.map +1 -1
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map +1 -1
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js.map +1 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js.map +1 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizer.js.map +1 -1
- package/dist/src/uploader/optimizer/uploadOptimizer.js.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.js.map +1 -1
- package/dist/src/uploader/pauseController.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/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +4 -2
- package/dist/src/uploader/transferUpload.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.map +1 -1
- package/dist/src/utils/api/apiError.d.ts +4 -1
- package/dist/src/utils/api/apiError.d.ts.map +1 -1
- package/dist/src/utils/api/apiError.js +2 -0
- 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/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.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/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.js.map +1 -1
- package/dist/src/utils/api/node/nodeClientBase.d.ts +1 -0
- package/dist/src/utils/api/node/nodeClientBase.d.ts.map +1 -1
- package/dist/src/utils/api/node/nodeClientBase.js +7 -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.d.ts +1 -0
- package/dist/src/utils/api/web/webClientBase.d.ts.map +1 -1
- package/dist/src/utils/api/web/webClientBase.js +7 -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 +79 -79
- package/readme.md +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeFileServerUdpClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/node/nodeFileServerUdpClient.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport path from 'path';\nimport { clearTimeout } from 'timers';\nimport { publicEncrypt, randomBytes, createCipheriv } from 'crypto';\n\nimport type { RemoteInfo } from 'dgram';\nimport type { ReadableStream as NodeReadableStream } from \"stream/web\";\n\nimport UdpClient from 'promisified-udp-client';\nimport sleep from 'abortable-sleep';\n\nimport { v4 as newGuid, parse as guidToBytes, stringify as bytesToGuid } from 'uuid';\n\nimport FsError from '../../../utils/fileSystem/fsError.js';\n\nimport type LatencyResponse from \"../dtos/pingResponse.js\";\nimport type HandshakeRequest from '../dtos/handshakeRequest.js';\nimport type SendChunkRequest from '../dtos/sendChunkRequest.js';\nimport type FileServerUdpClient from '../fileServerUdpClient.js';\nimport type HandshakeResponse from '../dtos/handshakeResponse.js';\nimport type ChunkStreamProvider from '../../../utils/fileSystem/chunkStreamProvider.js';\n\nconst pingPrefix = Buffer.from(`P2`);\nconst handshakePrefix = Buffer.from(`H2`);\nconst chunkDataPrefix = Buffer.from(`D2`);\nconst encryptedPrefix = Buffer.from(`E2`);\n\nconst filemailPublicKey = `-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmW7lnKl2UN7gLrLjsIP\nWMMA2Nc8zROtwcGuumiN5bpw8ju/58MSE2DiYnGJKOVXxI2A52FgVK4I9hXKstwZ\n5Sotcf3BXw1wMusnHwVGYRsQob76EJKiqQODc/pLyLtRDiFRY5tgafkW0dU1X8AU\nkjtAawPp7ed/Z6DJaV2jWOQyJ9sCBXGhnNSExPOeSFvRKFM5vfurPXPXG4ii6tGU\nXaqjVeX5+b9dJFTJ2HzUSUxAkYUCS1y4E9jehlimM7gGTR0m7ISQa/bg1eE1X8iA\nD2DVevYVGqs9A6p+e/WJ2dMXU4XxBmfxWZe+szqgfU3wqvOmCS5JrGUKi6SAx8a5\nWQIDAQAB\n-----END PUBLIC KEY-----`;\n\nexport default class NodeFileServerUdpClient implements FileServerUdpClient {\n #address: string;\n #port: number;\n\n #requestTimeout: number;\n #retries: number;\n #retryDelay: number;\n\n #abortSignal?: AbortSignal;\n\n #udpClient: UdpClient;\n\n constructor(address: string, port: number, requestTimeout: number, retries: number, abortSignal?: AbortSignal, retryDelay: number = 1000) {\n this.#address = address;\n this.#port = port;\n this.#requestTimeout = requestTimeout;\n this.#retries = retries;\n this.#retryDelay = retryDelay;\n this.#abortSignal = abortSignal;\n\n this.#udpClient = new UdpClient(abortSignal);\n }\n\n addMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.addMessageListener(listener);\n }\n\n removeMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.removeMessageListener(listener);\n }\n\n addErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.addErrorListener(listener);\n }\n\n removeErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.removeErrorListener(listener);\n }\n\n async connect(): Promise<void> {\n await this.#udpClient.connect(this.#port, this.#address);\n }\n\n async close(): Promise<void> {\n await this.#udpClient.close();\n }\n\n private async retryMechanism<T>(apiCall: () => Promise<T>): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.#retries; attempt++) {\n try {\n const result = await apiCall();\n return result;\n }\n catch (error) {\n if (attempt < this.#retries) {\n lastError = error as Error;\n await sleep(this.#retryDelay * attempt, this.#abortSignal);\n }\n\n if (this.#abortSignal?.aborted)\n throw new Error(`Aborted`);\n }\n }\n\n throw lastError;\n }\n\n async ping(): Promise<LatencyResponse> {\n return await this.retryMechanism(async () => await this.pingCall());\n }\n\n async handshake(request: HandshakeRequest): Promise<HandshakeResponse> {\n return await this.retryMechanism(async () => await this.handshakeCall(request));\n }\n\n async sendChunk(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\n try {\n return await this.retryMechanism(async () => await this.sendChunkCall(request, chunkStreamProvider));\n }\n catch (error) {\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\n throw new FsError((error as Error).message);\n\n throw error;\n }\n finally {\n if (!chunkStreamProvider.isReleased)\n await chunkStreamProvider.release();\n }\n }\n\n private isWrappedCreatingFileReadStreamException(error: Error): boolean {\n return error.message === `CreatingFileReadStreamException`;\n }\n\n private async pingCall(): Promise<LatencyResponse> {\n const packetGuid = newGuid();\n\n const udpRequest = this.createPingRequest(packetGuid);\n\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\n }\n\n private createPingRequest(packetGuid: string): Buffer {\n const guidBytes = guidToBytes(packetGuid);\n return Buffer.concat([pingPrefix, guidBytes]);\n }\n\n private createLatencyResponse(sentTime: number, responseTime: number): LatencyResponse {\n return {\n latencyInMs: responseTime - sentTime,\n };\n }\n\n private async handshakeCall(request: HandshakeRequest): Promise<HandshakeResponse> {\n const packetGuid = newGuid();\n const sessionGuid = newGuid();\n const aesKey = this.generateAes256Key();\n\n const udpRequest = this.createHandshakeRequest(packetGuid, sessionGuid, aesKey, request);\n\n return await this.makeCall(udpRequest, packetGuid, () => this.createHandshakeResponse(sessionGuid, aesKey));\n }\n\n private generateAes256Key(): Buffer {\n return randomBytes(32);\n }\n\n private createHandshakeRequest(packetGuid: string, sessionGuid: string, aesKey: Buffer, request: HandshakeRequest) {\n const packetGuidBytes = guidToBytes(packetGuid);\n const sessionGuidBytes = guidToBytes(sessionGuid);\n const transferKeyBytes = guidToBytes(this.transferKeyToGuid(request.transferKey));\n const transferIdBytes = Buffer.from(request.transferId);\n\n const encryptableRequestPart = Buffer.concat([\n packetGuidBytes,\n sessionGuidBytes,\n transferKeyBytes,\n transferIdBytes,\n aesKey,\n ]);\n\n const encryptedRequestPart = this.publicRsaEncrypt(encryptableRequestPart);\n\n return Buffer.concat([handshakePrefix, encryptedRequestPart]);\n }\n\n private transferKeyToGuid(transferKey: string): string {\n return `${transferKey.slice(0, 8)}-${transferKey.slice(8, 12)}-${transferKey.slice(12, 16)}-${transferKey.slice(16, 20)}-${transferKey.slice(20)}`;\n }\n\n private publicRsaEncrypt(data: Buffer) {\n return publicEncrypt(filemailPublicKey, data);\n }\n\n private createHandshakeResponse(sessionGuid: string, aesKey: Buffer): HandshakeResponse {\n return {\n aesKey,\n sessionGuid,\n };\n }\n\n private async sendChunkCall(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\n const packetGuid = newGuid();\n\n const chunkReadStream = await chunkStreamProvider.getChunkReadStream(undefined, this.#abortSignal);\n const chunkBytes = await this.readStreamToEnd(chunkReadStream);\n\n const udpRequest = this.createSendChunkRequest(packetGuid, request, chunkBytes);\n\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\n }\n\n private async readStreamToEnd(stream: ReadableStream | NodeReadableStream) {\n const reader = stream.getReader();\n\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done)\n break;\n\n if (value)\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\n const merged = new Uint8Array(totalLength);\n\n let offset = 0;\n\n for (const c of chunks) {\n merged.set(c, offset);\n offset += c.length;\n }\n\n return Buffer.from(merged);\n }\n\n private createSendChunkRequest(packetGuid: string, request: SendChunkRequest, chunkBytes: Buffer) {\n const fullDestinationFileNameString = path.posix.join(request.fileDestinationPathInTransfer, request.fileName);\n const fullDestinationFileName = Buffer.from(fullDestinationFileNameString);\n\n const fullDestinationFileNameLength = Buffer.alloc(2);\n fullDestinationFileNameLength.writeUint16BE(fullDestinationFileName.length);\n\n const fileSize = Buffer.alloc(8);\n fileSize.writeBigInt64BE(BigInt(request.fileSizeInBytes));\n\n const chunkStartPosition = Buffer.alloc(8);\n chunkStartPosition.writeBigInt64BE(BigInt(request.chunkStartPosition));\n\n const encryptableRequestPart = Buffer.concat([\n chunkDataPrefix,\n fullDestinationFileNameLength,\n fileSize,\n chunkStartPosition,\n fullDestinationFileName,\n chunkBytes,\n ]);\n\n const aesKey = Buffer.from(request.aesKey).subarray(0, 16); // .subarray directly on request.aesKey throws in Electron\n\n const { encryptedData, iv, authTag } = this.aesEncrypt(encryptableRequestPart, aesKey);\n\n const packetGuidBytes = guidToBytes(packetGuid);\n const sessionGuidBytes = guidToBytes(request.sessionGuid);\n\n return Buffer.concat([\n encryptedPrefix,\n packetGuidBytes,\n sessionGuidBytes,\n iv,\n authTag,\n encryptedData,\n ]);\n }\n\n private aesEncrypt(data: Buffer, aesKey: Buffer): { encryptedData: Buffer, iv: Buffer, authTag: Buffer } {\n const iv = randomBytes(12);\n\n const cipher = createCipheriv(`aes-128-gcm`, aesKey, iv);\n\n let encryptedData = cipher.update(data);\n encryptedData = Buffer.concat([encryptedData, cipher.final()]);\n\n const authTag = cipher.getAuthTag();\n\n return { encryptedData, iv, authTag };\n }\n\n private async makeCall<T>(request: string | readonly any[] | Uint8Array, packetGuid: string, createResponse?: (sentTime: number, responseTime: number, message: Buffer) => T): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const sentTime = new Date().getTime();\n\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(`Timeout`));\n }, this.#requestTimeout);\n\n const responseListener = (msg: Buffer) => {\n const responseTime = new Date().getTime();\n\n if (!this.isAckResponse(msg, packetGuid))\n return;\n\n cleanup();\n\n if (!createResponse)\n resolve(undefined as any);\n else {\n const response = createResponse(sentTime, responseTime, msg);\n resolve(response);\n }\n };\n\n this.addMessageListener(responseListener);\n\n const sendPromise = this.#udpClient.send(request);\n\n const errorAndAbortHandler = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const abortSignalListener = () => errorAndAbortHandler(new Error(`Aborted`));\n\n const cleanup = () => {\n this.removeMessageListener(responseListener);\n clearTimeout(timeout);\n this.#abortSignal?.removeEventListener(`abort`, abortSignalListener);\n };\n\n sendPromise.catch(error => errorAndAbortHandler(error));\n this.#abortSignal?.addEventListener(`abort`, abortSignalListener);\n });\n }\n\n private isAckResponse(msg: Buffer, guid: string) {\n try {\n if (!this.isAck(msg) || msg.length !== 18)\n return false;\n\n const responseGuid = bytesToGuid(msg, 2);\n\n return guid === responseGuid;\n }\n catch {\n return false;\n }\n }\n\n private isAck(msg: Buffer) {\n const prefix = msg.subarray(0, 2).toString(`utf8`);\n return prefix === `A1`;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"nodeFileServerUdpClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/node/nodeFileServerUdpClient.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\r\nimport path from 'path';\r\nimport { clearTimeout } from 'timers';\r\nimport { publicEncrypt, randomBytes, createCipheriv } from 'crypto';\r\n\r\nimport type { RemoteInfo } from 'dgram';\r\nimport type { ReadableStream as NodeReadableStream } from \"stream/web\";\r\n\r\nimport UdpClient from 'promisified-udp-client';\r\nimport sleep from 'abortable-sleep';\r\n\r\nimport { v4 as newGuid, parse as guidToBytes, stringify as bytesToGuid } from 'uuid';\r\n\r\nimport FsError from '../../../utils/fileSystem/fsError.js';\r\n\r\nimport type LatencyResponse from \"../dtos/pingResponse.js\";\r\nimport type HandshakeRequest from '../dtos/handshakeRequest.js';\r\nimport type SendChunkRequest from '../dtos/sendChunkRequest.js';\r\nimport type FileServerUdpClient from '../fileServerUdpClient.js';\r\nimport type HandshakeResponse from '../dtos/handshakeResponse.js';\r\nimport type ChunkStreamProvider from '../../../utils/fileSystem/chunkStreamProvider.js';\r\n\r\nconst pingPrefix = Buffer.from(`P2`);\r\nconst handshakePrefix = Buffer.from(`H2`);\r\nconst chunkDataPrefix = Buffer.from(`D2`);\r\nconst encryptedPrefix = Buffer.from(`E2`);\r\n\r\nconst filemailPublicKey = `-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmW7lnKl2UN7gLrLjsIP\r\nWMMA2Nc8zROtwcGuumiN5bpw8ju/58MSE2DiYnGJKOVXxI2A52FgVK4I9hXKstwZ\r\n5Sotcf3BXw1wMusnHwVGYRsQob76EJKiqQODc/pLyLtRDiFRY5tgafkW0dU1X8AU\r\nkjtAawPp7ed/Z6DJaV2jWOQyJ9sCBXGhnNSExPOeSFvRKFM5vfurPXPXG4ii6tGU\r\nXaqjVeX5+b9dJFTJ2HzUSUxAkYUCS1y4E9jehlimM7gGTR0m7ISQa/bg1eE1X8iA\r\nD2DVevYVGqs9A6p+e/WJ2dMXU4XxBmfxWZe+szqgfU3wqvOmCS5JrGUKi6SAx8a5\r\nWQIDAQAB\r\n-----END PUBLIC KEY-----`;\r\n\r\nexport default class NodeFileServerUdpClient implements FileServerUdpClient {\r\n #address: string;\r\n #port: number;\r\n\r\n #requestTimeout: number;\r\n #retries: number;\r\n #retryDelay: number;\r\n\r\n #abortSignal?: AbortSignal;\r\n\r\n #udpClient: UdpClient;\r\n\r\n constructor(address: string, port: number, requestTimeout: number, retries: number, abortSignal?: AbortSignal, retryDelay: number = 1000) {\r\n this.#address = address;\r\n this.#port = port;\r\n this.#requestTimeout = requestTimeout;\r\n this.#retries = retries;\r\n this.#retryDelay = retryDelay;\r\n this.#abortSignal = abortSignal;\r\n\r\n this.#udpClient = new UdpClient(abortSignal);\r\n }\r\n\r\n addMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\r\n this.#udpClient.addMessageListener(listener);\r\n }\r\n\r\n removeMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\r\n this.#udpClient.removeMessageListener(listener);\r\n }\r\n\r\n addErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\r\n this.#udpClient.addErrorListener(listener);\r\n }\r\n\r\n removeErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\r\n this.#udpClient.removeErrorListener(listener);\r\n }\r\n\r\n async connect(): Promise<void> {\r\n await this.#udpClient.connect(this.#port, this.#address);\r\n }\r\n\r\n async close(): Promise<void> {\r\n await this.#udpClient.close();\r\n }\r\n\r\n private async retryMechanism<T>(apiCall: () => Promise<T>): Promise<T> {\r\n let lastError: Error | undefined;\r\n\r\n for (let attempt = 0; attempt <= this.#retries; attempt++) {\r\n try {\r\n const result = await apiCall();\r\n return result;\r\n }\r\n catch (error) {\r\n if (attempt < this.#retries) {\r\n lastError = error as Error;\r\n await sleep(this.#retryDelay * attempt, this.#abortSignal);\r\n }\r\n\r\n if (this.#abortSignal?.aborted)\r\n throw new Error(`Aborted`);\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n async ping(): Promise<LatencyResponse> {\r\n return await this.retryMechanism(async () => await this.pingCall());\r\n }\r\n\r\n async handshake(request: HandshakeRequest): Promise<HandshakeResponse> {\r\n return await this.retryMechanism(async () => await this.handshakeCall(request));\r\n }\r\n\r\n async sendChunk(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\r\n try {\r\n return await this.retryMechanism(async () => await this.sendChunkCall(request, chunkStreamProvider));\r\n }\r\n catch (error) {\r\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\r\n throw new FsError((error as Error).message);\r\n\r\n throw error;\r\n }\r\n finally {\r\n if (!chunkStreamProvider.isReleased)\r\n await chunkStreamProvider.release();\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 private async pingCall(): Promise<LatencyResponse> {\r\n const packetGuid = newGuid();\r\n\r\n const udpRequest = this.createPingRequest(packetGuid);\r\n\r\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\r\n }\r\n\r\n private createPingRequest(packetGuid: string): Buffer {\r\n const guidBytes = guidToBytes(packetGuid);\r\n return Buffer.concat([pingPrefix, guidBytes]);\r\n }\r\n\r\n private createLatencyResponse(sentTime: number, responseTime: number): LatencyResponse {\r\n return {\r\n latencyInMs: responseTime - sentTime,\r\n };\r\n }\r\n\r\n private async handshakeCall(request: HandshakeRequest): Promise<HandshakeResponse> {\r\n const packetGuid = newGuid();\r\n const sessionGuid = newGuid();\r\n const aesKey = this.generateAes256Key();\r\n\r\n const udpRequest = this.createHandshakeRequest(packetGuid, sessionGuid, aesKey, request);\r\n\r\n return await this.makeCall(udpRequest, packetGuid, () => this.createHandshakeResponse(sessionGuid, aesKey));\r\n }\r\n\r\n private generateAes256Key(): Buffer {\r\n return randomBytes(32);\r\n }\r\n\r\n private createHandshakeRequest(packetGuid: string, sessionGuid: string, aesKey: Buffer, request: HandshakeRequest) {\r\n const packetGuidBytes = guidToBytes(packetGuid);\r\n const sessionGuidBytes = guidToBytes(sessionGuid);\r\n const transferKeyBytes = guidToBytes(this.transferKeyToGuid(request.transferKey));\r\n const transferIdBytes = Buffer.from(request.transferId);\r\n\r\n const encryptableRequestPart = Buffer.concat([\r\n packetGuidBytes,\r\n sessionGuidBytes,\r\n transferKeyBytes,\r\n transferIdBytes,\r\n aesKey,\r\n ]);\r\n\r\n const encryptedRequestPart = this.publicRsaEncrypt(encryptableRequestPart);\r\n\r\n return Buffer.concat([handshakePrefix, encryptedRequestPart]);\r\n }\r\n\r\n private transferKeyToGuid(transferKey: string): string {\r\n return `${transferKey.slice(0, 8)}-${transferKey.slice(8, 12)}-${transferKey.slice(12, 16)}-${transferKey.slice(16, 20)}-${transferKey.slice(20)}`;\r\n }\r\n\r\n private publicRsaEncrypt(data: Buffer) {\r\n return publicEncrypt(filemailPublicKey, data);\r\n }\r\n\r\n private createHandshakeResponse(sessionGuid: string, aesKey: Buffer): HandshakeResponse {\r\n return {\r\n aesKey,\r\n sessionGuid,\r\n };\r\n }\r\n\r\n private async sendChunkCall(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\r\n const packetGuid = newGuid();\r\n\r\n const chunkReadStream = await chunkStreamProvider.getChunkReadStream(undefined, this.#abortSignal);\r\n const chunkBytes = await this.readStreamToEnd(chunkReadStream);\r\n\r\n const udpRequest = this.createSendChunkRequest(packetGuid, request, chunkBytes);\r\n\r\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\r\n }\r\n\r\n private async readStreamToEnd(stream: ReadableStream | NodeReadableStream) {\r\n const reader = stream.getReader();\r\n\r\n const chunks: Uint8Array[] = [];\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n break;\r\n\r\n if (value)\r\n chunks.push(value);\r\n }\r\n\r\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\r\n const merged = new Uint8Array(totalLength);\r\n\r\n let offset = 0;\r\n\r\n for (const c of chunks) {\r\n merged.set(c, offset);\r\n offset += c.length;\r\n }\r\n\r\n return Buffer.from(merged);\r\n }\r\n\r\n private createSendChunkRequest(packetGuid: string, request: SendChunkRequest, chunkBytes: Buffer) {\r\n const fullDestinationFileNameString = path.posix.join(request.fileDestinationPathInTransfer, request.fileName);\r\n const fullDestinationFileName = Buffer.from(fullDestinationFileNameString);\r\n\r\n const fullDestinationFileNameLength = Buffer.alloc(2);\r\n fullDestinationFileNameLength.writeUint16BE(fullDestinationFileName.length);\r\n\r\n const fileSize = Buffer.alloc(8);\r\n fileSize.writeBigInt64BE(BigInt(request.fileSizeInBytes));\r\n\r\n const chunkStartPosition = Buffer.alloc(8);\r\n chunkStartPosition.writeBigInt64BE(BigInt(request.chunkStartPosition));\r\n\r\n const encryptableRequestPart = Buffer.concat([\r\n chunkDataPrefix,\r\n fullDestinationFileNameLength,\r\n fileSize,\r\n chunkStartPosition,\r\n fullDestinationFileName,\r\n chunkBytes,\r\n ]);\r\n\r\n const aesKey = Buffer.from(request.aesKey).subarray(0, 16); // .subarray directly on request.aesKey throws in Electron\r\n\r\n const { encryptedData, iv, authTag } = this.aesEncrypt(encryptableRequestPart, aesKey);\r\n\r\n const packetGuidBytes = guidToBytes(packetGuid);\r\n const sessionGuidBytes = guidToBytes(request.sessionGuid);\r\n\r\n return Buffer.concat([\r\n encryptedPrefix,\r\n packetGuidBytes,\r\n sessionGuidBytes,\r\n iv,\r\n authTag,\r\n encryptedData,\r\n ]);\r\n }\r\n\r\n private aesEncrypt(data: Buffer, aesKey: Buffer): { encryptedData: Buffer, iv: Buffer, authTag: Buffer } {\r\n const iv = randomBytes(12);\r\n\r\n const cipher = createCipheriv(`aes-128-gcm`, aesKey, iv);\r\n\r\n let encryptedData = cipher.update(data);\r\n encryptedData = Buffer.concat([encryptedData, cipher.final()]);\r\n\r\n const authTag = cipher.getAuthTag();\r\n\r\n return { encryptedData, iv, authTag };\r\n }\r\n\r\n private async makeCall<T>(request: string | readonly any[] | Uint8Array, packetGuid: string, createResponse?: (sentTime: number, responseTime: number, message: Buffer) => T): Promise<T> {\r\n return new Promise<T>((resolve, reject) => {\r\n const sentTime = new Date().getTime();\r\n\r\n const timeout = setTimeout(() => {\r\n cleanup();\r\n reject(new Error(`Timeout`));\r\n }, this.#requestTimeout);\r\n\r\n const responseListener = (msg: Buffer) => {\r\n const responseTime = new Date().getTime();\r\n\r\n if (!this.isAckResponse(msg, packetGuid))\r\n return;\r\n\r\n cleanup();\r\n\r\n if (!createResponse)\r\n resolve(undefined as any);\r\n else {\r\n const response = createResponse(sentTime, responseTime, msg);\r\n resolve(response);\r\n }\r\n };\r\n\r\n this.addMessageListener(responseListener);\r\n\r\n const sendPromise = this.#udpClient.send(request);\r\n\r\n const errorAndAbortHandler = (error: Error) => {\r\n cleanup();\r\n reject(error);\r\n };\r\n\r\n const abortSignalListener = () => errorAndAbortHandler(new Error(`Aborted`));\r\n\r\n const cleanup = () => {\r\n this.removeMessageListener(responseListener);\r\n clearTimeout(timeout);\r\n this.#abortSignal?.removeEventListener(`abort`, abortSignalListener);\r\n };\r\n\r\n sendPromise.catch(error => errorAndAbortHandler(error));\r\n this.#abortSignal?.addEventListener(`abort`, abortSignalListener);\r\n });\r\n }\r\n\r\n private isAckResponse(msg: Buffer, guid: string) {\r\n try {\r\n if (!this.isAck(msg) || msg.length !== 18)\r\n return false;\r\n\r\n const responseGuid = bytesToGuid(msg, 2);\r\n\r\n return guid === responseGuid;\r\n }\r\n catch {\r\n return false;\r\n }\r\n }\r\n\r\n private isAck(msg: Buffer) {\r\n const prefix = msg.subarray(0, 2).toString(`utf8`);\r\n return prefix === `A1`;\r\n }\r\n}"]}
|
|
@@ -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, 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, source, sourceDetails, uploadIdleTimeoutInMs, retryLimit);\n }\n\n private createGotInstance(transferId: string, transferKey: string, fullDestinationFileName: string, fileTotalSizeInBytes: number, 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 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, 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, source, sourceDetails, uploadIdleTimeoutInMs, retryLimit);\r\n }\r\n\r\n private createGotInstance(transferId: string, transferKey: string, fullDestinationFileName: string, fileTotalSizeInBytes: number, 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 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, 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, 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, source: string, sourceDetails: string): AxiosInstance {\n return axios.create({\n params: {\n transferid: transferId,\n transferkey: transferKey,\n 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, 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, 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, source: string, sourceDetails: string): AxiosInstance {\r\n return axios.create({\r\n params: {\r\n transferid: transferId,\r\n transferkey: transferKey,\r\n 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 #currentChunkSizeProvider: { readonly currentChunkSize: number };\n\n #nextChunkStartPosition = 0;\n\n #isValueAlreadyReturnedForZeroBytesFile = false;\n\n constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, currentChunkSizeProvider: { readonly currentChunkSize: number }) {\n this.#alreadySentChunks = this.sanitizeChunks(alreadySentChunks);\n this.#alreadySentChunksByStartPosition = this.createChunksByStartPositionMap(this.#alreadySentChunks);\n this.#fileSizeInBytes = fileSizeInBytes;\n this.#currentChunkSizeProvider = currentChunkSizeProvider;\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.#currentChunkSizeProvider.currentChunkSize;\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 #currentChunkSizeProvider: { readonly currentChunkSize: number };\r\n\r\n #nextChunkStartPosition = 0;\r\n\r\n #isValueAlreadyReturnedForZeroBytesFile = false;\r\n\r\n constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, currentChunkSizeProvider: { readonly currentChunkSize: number }) {\r\n this.#alreadySentChunks = this.sanitizeChunks(alreadySentChunks);\r\n this.#alreadySentChunksByStartPosition = this.createChunksByStartPositionMap(this.#alreadySentChunks);\r\n this.#fileSizeInBytes = fileSizeInBytes;\r\n this.#currentChunkSizeProvider = currentChunkSizeProvider;\r\n }\r\n\r\n // This is an anti corruption layer that can be removed after everybody migrates to desktop > 4.8.2\r\n private sanitizeChunks(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): readonly Readonly<ContinuousChunk>[] {\r\n return this.removeZeroByteChunks(alreadySentChunks);\r\n }\r\n\r\n private removeZeroByteChunks(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): readonly Readonly<ContinuousChunk>[] {\r\n return alreadySentChunks.filter(c => c.sizeInBytes > 0);\r\n }\r\n\r\n 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.#currentChunkSizeProvider.currentChunkSize;\r\n const newChunkEndPosition = newChunkStartPosition + currentMaxChunkSize - 1;\r\n\r\n const alreadySentChunkStartingInTheMiddle = this.#alreadySentChunks.find(c => newChunkStartPosition < c.startPosition && c.startPosition <= newChunkEndPosition);\r\n\r\n if (alreadySentChunkStartingInTheMiddle)\r\n return alreadySentChunkStartingInTheMiddle.startPosition - newChunkStartPosition;\r\n\r\n const chunkEndsBeyondFile = newChunkEndPosition >= this.#fileSizeInBytes;\r\n\r\n if (chunkEndsBeyondFile)\r\n return this.#fileSizeInBytes - newChunkStartPosition;\r\n\r\n return currentMaxChunkSize;\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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 chunkStartPosition: number,\n chunkSizeInBytes: number,\n latencyInMsIfUdp: number | undefined,\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 chunkStartPosition: number,\r\n chunkSizeInBytes: number,\r\n latencyInMsIfUdp: number | undefined,\r\n}\r\n\r\nexport default FileChunkUploadCompletedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileChunkUploadCompletedPartiallyEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type FileChunkUploadCompletedEventArgs from \"./fileChunkUploadCompletedEventArgs.js\";\n\ninterface FileChunkUploadCompletedPartiallyEventArgs extends FileChunkUploadCompletedEventArgs {\n isPauseRequested: boolean,\n uploadedBytesCount: number,\n}\n\nexport default FileChunkUploadCompletedPartiallyEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"fileChunkUploadCompletedPartiallyEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadCompletedPartiallyEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type FileChunkUploadCompletedEventArgs from \"./fileChunkUploadCompletedEventArgs.js\";\r\n\r\ninterface FileChunkUploadCompletedPartiallyEventArgs extends FileChunkUploadCompletedEventArgs {\r\n isPauseRequested: boolean,\r\n uploadedBytesCount: number,\r\n}\r\n\r\nexport default FileChunkUploadCompletedPartiallyEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileChunkUploadEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type ReadonlyTransferUploadStateFile from \"../state/readonlyTransferUploadStateFile.js\";\n\ninterface FileChunkUploadEventArgs {\n fileStatus: ReadonlyTransferUploadStateFile,\n chunkStartPosition: number,\n chunkSizeInBytes: number,\n}\n\nexport default FileChunkUploadEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"fileChunkUploadEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type ReadonlyTransferUploadStateFile from \"../state/readonlyTransferUploadStateFile.js\";\r\n\r\ninterface FileChunkUploadEventArgs {\r\n fileStatus: ReadonlyTransferUploadStateFile,\r\n chunkStartPosition: number,\r\n chunkSizeInBytes: number,\r\n}\r\n\r\nexport default FileChunkUploadEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileChunkUploadFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type FileChunkUploadEventArgs from \"./fileChunkUploadEventArgs.js\";\n\ninterface FileChunkUploadFailedEventArgs extends FileChunkUploadEventArgs {\n reason: string,\n error: Error,\n}\n\nexport default FileChunkUploadFailedEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"fileChunkUploadFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type FileChunkUploadEventArgs from \"./fileChunkUploadEventArgs.js\";\r\n\r\ninterface FileChunkUploadFailedEventArgs extends FileChunkUploadEventArgs {\r\n reason: string,\r\n error: Error,\r\n}\r\n\r\nexport default FileChunkUploadFailedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileChunkUploadProgressedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type ReadonlyTransferUploadStateFile from \"../state/readonlyTransferUploadStateFile.js\";\n\ninterface FileChunkUploadProgressedEventArgs {\n fileStatus: ReadonlyTransferUploadStateFile,\n chunkStartPosition: number,\n chunkSizeInBytes: number,\n transferredBytesSinceLastEvent: number,\n}\n\nexport default FileChunkUploadProgressedEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"fileChunkUploadProgressedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type ReadonlyTransferUploadStateFile from \"../state/readonlyTransferUploadStateFile.js\";\r\n\r\ninterface FileChunkUploadProgressedEventArgs {\r\n fileStatus: ReadonlyTransferUploadStateFile,\r\n chunkStartPosition: number,\r\n chunkSizeInBytes: number,\r\n transferredBytesSinceLastEvent: number,\r\n}\r\n\r\nexport default FileChunkUploadProgressedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileUploadEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileUploadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type ReadonlyTransferUploadStateFile from \"../state/readonlyTransferUploadStateFile.js\";\n\ninterface FileUploadEventArgs {\n fileStatus: ReadonlyTransferUploadStateFile\n}\n\nexport default FileUploadEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"fileUploadEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileUploadEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type ReadonlyTransferUploadStateFile from \"../state/readonlyTransferUploadStateFile.js\";\r\n\r\ninterface FileUploadEventArgs {\r\n fileStatus: ReadonlyTransferUploadStateFile\r\n}\r\n\r\nexport default FileUploadEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileUploadFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileUploadFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type FileUploadEventArgs from \"./fileUploadEventArgs.js\";\n\ninterface FileUploadFailedEventArgs extends FileUploadEventArgs {\n reason: string | null\n}\n\nexport default FileUploadFailedEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"fileUploadFailedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/fileUploadFailedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["import type FileUploadEventArgs from \"./fileUploadEventArgs.js\";\r\n\r\ninterface FileUploadFailedEventArgs extends FileUploadEventArgs {\r\n reason: string | null\r\n}\r\n\r\nexport default FileUploadFailedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferMetadataDeterminedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferMetadataDeterminedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferMetadataDeterminedEventArgs {\n transferId: string,\n fileServerUrl: string,\n region?: string,\n}\n\nexport default TransferMetadataDeterminedEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"transferMetadataDeterminedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferMetadataDeterminedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferMetadataDeterminedEventArgs {\r\n transferId: string,\r\n fileServerUrl: string,\r\n region?: string,\r\n}\r\n\r\nexport default TransferMetadataDeterminedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadCompletedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadCompletedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadCompletedEventArgs {\n transferId: string,\n transferKey: string,\n transferDownloadUrl: string\n}\n\nexport default TransferUploadCompletedEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"transferUploadCompletedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadCompletedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadCompletedEventArgs {\r\n transferId: string,\r\n transferKey: string,\r\n transferDownloadUrl: string\r\n}\r\n\r\nexport default TransferUploadCompletedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadModeChosenEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadModeChosenEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadModeChosenEventArgs {\n isUdpMode: boolean,\n latency?: number,\n error?: Error,\n}\n\nexport default TransferUploadModeChosenEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"transferUploadModeChosenEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadModeChosenEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadModeChosenEventArgs {\r\n isUdpMode: boolean,\r\n latency?: number,\r\n error?: Error,\r\n}\r\n\r\nexport default TransferUploadModeChosenEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadProgressedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadProgressedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadProgressedEventArgs {\n uploadedBytesTotalCount: number;\n progressInPercentage: number;\n remainingSeconds: number;\n averageSpeedInBytesPerSecond: number;\n currentSpeedInBytesPerSecond: number;\n}\n\nexport default TransferUploadProgressedEventArgs;"]}
|
|
1
|
+
{"version":3,"file":"transferUploadProgressedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadProgressedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadProgressedEventArgs {\r\n uploadedBytesTotalCount: number;\r\n progressInPercentage: number;\r\n remainingSeconds: number;\r\n averageSpeedInBytesPerSecond: number;\r\n currentSpeedInBytesPerSecond: number;\r\n}\r\n\r\nexport default TransferUploadProgressedEventArgs;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadExportData.js","sourceRoot":"","sources":["../../../../src/uploader/export/transferUploadExportData.ts"],"names":[],"mappings":"","sourcesContent":["import type FileDetails from \"../../utils/fileSystem/fileDetails.js\";\nimport type { TransferUploadAppendInfo } from \"../options/transferUploadAppendInfo.js\";\nimport type TransferUploadInfo from \"../options/transferUploadInfo.js\";\nimport type TransferUploadExportState from \"./transferUploadExportState.js\";\nimport type TransferUploadMetadata from \"./transferUploadMetadata.js\";\n\nexport interface TransferUploadExportData<T extends FileDetails> {\n transferMetadata?: TransferUploadExportDataMetadata,\n info: Readonly<TransferUploadInfo<T> | TransferUploadAppendInfo<T>>,\n state: TransferUploadExportState,\n}\n\nexport type TransferUploadExportDataMetadata = Readonly<Omit<TransferUploadMetadata, `encryptionData`> & {\n encryptionData?: {\n ivHex: string,\n keyHex: string,\n },\n}>;"]}
|
|
1
|
+
{"version":3,"file":"transferUploadExportData.js","sourceRoot":"","sources":["../../../../src/uploader/export/transferUploadExportData.ts"],"names":[],"mappings":"","sourcesContent":["import type FileDetails from \"../../utils/fileSystem/fileDetails.js\";\r\nimport type { TransferUploadAppendInfo } from \"../options/transferUploadAppendInfo.js\";\r\nimport type TransferUploadInfo from \"../options/transferUploadInfo.js\";\r\nimport type TransferUploadExportState from \"./transferUploadExportState.js\";\r\nimport type TransferUploadMetadata from \"./transferUploadMetadata.js\";\r\n\r\nexport interface TransferUploadExportData<T extends FileDetails> {\r\n transferMetadata?: TransferUploadExportDataMetadata,\r\n info: Readonly<TransferUploadInfo<T> | TransferUploadAppendInfo<T>>,\r\n state: TransferUploadExportState,\r\n}\r\n\r\nexport type TransferUploadExportDataMetadata = Readonly<Omit<TransferUploadMetadata, `encryptionData`> & {\r\n encryptionData?: {\r\n ivHex: string,\r\n keyHex: string,\r\n },\r\n}>;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadExportState.js","sourceRoot":"","sources":["../../../../src/uploader/export/transferUploadExportState.ts"],"names":[],"mappings":"","sourcesContent":["import type { ContinuousChunksCalculatorState } from \"../state/continuousChunksCalculator.js\";\n\ntype TransferUploadExportState = ContinuousChunksCalculatorState;\n\nexport default TransferUploadExportState;\n"]}
|
|
1
|
+
{"version":3,"file":"transferUploadExportState.js","sourceRoot":"","sources":["../../../../src/uploader/export/transferUploadExportState.ts"],"names":[],"mappings":"","sourcesContent":["import type { ContinuousChunksCalculatorState } from \"../state/continuousChunksCalculator.js\";\r\n\r\ntype TransferUploadExportState = ContinuousChunksCalculatorState;\r\n\r\nexport default TransferUploadExportState;\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadMetadata.js","sourceRoot":"","sources":["../../../../src/uploader/export/transferUploadMetadata.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadMetadata {\n transferId: string,\n transferKey: string,\n transferFileServerUrl: string,\n transferRegion?: string,\n encryptionData?: {\n iv: Uint8Array,\n key: Uint8Array,\n },\n udpData?: {\n ip: string,\n port: number,\n threshold: number,\n handshakeData?: {\n sessionGuid: string,\n aesKey: Uint8Array,\n }\n }\n}\n\nexport default TransferUploadMetadata;"]}
|
|
1
|
+
{"version":3,"file":"transferUploadMetadata.js","sourceRoot":"","sources":["../../../../src/uploader/export/transferUploadMetadata.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadMetadata {\r\n transferId: string,\r\n transferKey: string,\r\n transferFileServerUrl: string,\r\n transferRegion?: string,\r\n encryptionData?: {\r\n iv: Uint8Array,\r\n key: Uint8Array,\r\n },\r\n udpData?: {\r\n ip: string,\r\n port: number,\r\n threshold: number,\r\n handshakeData?: {\r\n sessionGuid: string,\r\n aesKey: Uint8Array,\r\n }\r\n }\r\n}\r\n\r\nexport default TransferUploadMetadata;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimizationValues.js","sourceRoot":"","sources":["../../../../src/uploader/optimizer/optimizationValues.ts"],"names":[],"mappings":"","sourcesContent":["type OptimizationValues = {\n maxParallelChunksAmount: number,\n chunkSize: number,\n optimizationIntervalInMs: number,\n minTimeBetweenChunksStartInMs: number,\n requestTimeoutInMs: number,\n};\n\nexport default OptimizationValues;"]}
|
|
1
|
+
{"version":3,"file":"optimizationValues.js","sourceRoot":"","sources":["../../../../src/uploader/optimizer/optimizationValues.ts"],"names":[],"mappings":"","sourcesContent":["type OptimizationValues = {\r\n maxParallelChunksAmount: number,\r\n chunkSize: number,\r\n optimizationIntervalInMs: number,\r\n minTimeBetweenChunksStartInMs: number,\r\n requestTimeoutInMs: number,\r\n};\r\n\r\nexport default OptimizationValues;"]}
|
package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"udpConcurrencyBasedOptimizationStrategy.js","sourceRoot":"","sources":["../../../../../src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import type OptimizationValues from \"../optimizationValues.js\";\nimport type TransferUploadOptimizationStrategy from \"../transferUploadOptimizationStrategy.js\";\n\nexport default class UdpConcurrencyBasedOptimizationStrategy implements TransferUploadOptimizationStrategy {\n #values = {\n const: {\n sleep: 0.5,\n },\n step: {\n chunksCount: 4,\n chunkSize: 12244,\n optimizationInterval: 50,\n },\n min: {\n chunksCount: 4,\n chunkSize: 15424,\n optimizationInterval: 50,\n },\n max: {\n chunksCount: 125,\n chunkSize: 64400,\n optimizationInterval: 500,\n },\n };\n\n msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): { chunkSize: number } {\n const chunkSize = currentOptimizedValues.chunkSize - 1000;\n\n this.#values.max.chunkSize = chunkSize;\n\n return { chunkSize };\n }\n\n noBufsErrorHandler(currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number } {\n return {\n maxParallelChunksAmount: this.#values.min.chunksCount,\n minTimeBetweenChunksStartInMs: currentOptimizedValues.minTimeBetweenChunksStartInMs,\n };\n }\n\n getInitialValues(serverLatencyInMs: number): OptimizationValues {\n return {\n chunkSize: this.#values.max.chunkSize,\n minTimeBetweenChunksStartInMs: this.#values.const.sleep,\n optimizationIntervalInMs: (this.#values.max.optimizationInterval + this.#values.min.optimizationInterval) / 3,\n maxParallelChunksAmount: this.#values.min.chunksCount,\n requestTimeoutInMs: serverLatencyInMs * 2,\n };\n }\n\n getOptimizedValues(_startedChunksTimeHistory: number[], ackedChunksHistory: { time: number, latencyInMs: number }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): { optimizedValues: OptimizationValues, clearChunksHistory: boolean } {\n const finishedChunks = ackedChunksHistory.length + failedChunksTimeHistory.length;\n\n if (finishedChunks === 0 || ackedChunksHistory.length === 0)\n return { optimizedValues: currentOptimizedValues, clearChunksHistory: false };\n\n const failuresRate = failedChunksTimeHistory.length / finishedChunks;\n const acksRate = 1 - failuresRate;\n\n const optimizedChunkSizeAndChunksCount = this.getOptimizedChunkSizeAndChunksCount(acksRate, currentOptimizedValues.chunkSize, currentOptimizedValues.maxParallelChunksAmount);\n\n const optimizedValues: OptimizationValues = {\n ...currentOptimizedValues,\n maxParallelChunksAmount: optimizedChunkSizeAndChunksCount.optimizedChunksCount,\n chunkSize: optimizedChunkSizeAndChunksCount.optimizedChunkSize,\n optimizationIntervalInMs: this.getOptimizedOptimizationInterval(ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\n requestTimeoutInMs: this.getOptimizedRequestTimeout(ackedChunksHistory),\n };\n\n return { optimizedValues, clearChunksHistory: false };\n }\n\n private getOptimizedChunkSizeAndChunksCount(acksRate: number, currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\n if (acksRate < 0.7)\n return this.slowDown(currentChunkSize, currentChunksCount);\n\n if (acksRate > 0.9)\n return this.speedUp(currentChunkSize, currentChunksCount);\n\n return {\n optimizedChunkSize: currentChunkSize,\n optimizedChunksCount: currentChunksCount,\n };\n }\n\n private speedUp(currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\n if (currentChunkSize! < this.#values.max.chunkSize) {\n return {\n optimizedChunkSize: this.getIncreasedChunkSize(currentChunkSize),\n optimizedChunksCount: currentChunksCount,\n };\n }\n\n return {\n optimizedChunkSize: currentChunkSize,\n optimizedChunksCount: this.getIncreasedChunksCount(currentChunksCount),\n };\n }\n\n private slowDown(currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\n if (currentChunksCount > this.#values.min.chunksCount) {\n return {\n optimizedChunkSize: currentChunkSize,\n optimizedChunksCount: this.getDecreasedChunksCount(currentChunksCount),\n };\n }\n\n return {\n optimizedChunkSize: this.getDecreasedChunkSize(currentChunkSize),\n optimizedChunksCount: currentChunksCount,\n };\n }\n\n private getIncreasedChunkSize = (currentChunkSize: number) => {\n const newChunkSize = currentChunkSize + this.#values.step.chunkSize;\n\n return Math.min(newChunkSize, this.#values.max.chunkSize);\n };\n\n private getDecreasedChunkSize = (currentChunkSize: number) => {\n const newChunkSize = currentChunkSize - this.#values.step.chunkSize;\n\n return Math.max(newChunkSize, this.#values.min.chunkSize);\n };\n\n private getIncreasedChunksCount = (currentChunksCount: number) => {\n const newChunksCount = currentChunksCount + this.#values.step.chunksCount;\n\n return Math.min(newChunksCount, this.#values.max.chunksCount);\n };\n\n private getDecreasedChunksCount = (currentChunksCount: number) => {\n const newChunksCount = currentChunksCount - this.#values.step.chunksCount;\n\n return Math.max(newChunksCount, this.#values.min.chunksCount);\n };\n\n private getOptimizedRequestTimeout(ackedChunksHistory: { time: number; latencyInMs: number; }[]) {\n const averageLatency = ackedChunksHistory.reduce((sum, ack) => sum + ack.latencyInMs, 0) / ackedChunksHistory.length;\n const latencyPercentile = this.findLatencyPercentile(ackedChunksHistory);\n\n return Math.max(averageLatency * 4, latencyPercentile);\n }\n\n private findLatencyPercentile(ackedChunks: { time: number; latencyInMs: number; }[]): number {\n const latencies = ackedChunks.map(v => v.latencyInMs);\n const sortedLatencies = latencies.slice().sort((a, b) => a - b);\n const index = Math.ceil(0.90 * (sortedLatencies.length - 1));\n\n return sortedLatencies[index]!;\n }\n\n private getOptimizedOptimizationInterval(ackedChunksCount: number, currentOptimizationIntervalInMs: number): number {\n if (ackedChunksCount > 30)\n return this.getDecreasedOptimizationInterval(currentOptimizationIntervalInMs);\n\n if (ackedChunksCount < 15)\n return this.getIncreasedOptimizationInterval(currentOptimizationIntervalInMs);\n\n return currentOptimizationIntervalInMs;\n }\n\n private getIncreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\n const interval = optimizationIntervalInMs + this.#values.step.optimizationInterval;\n\n return Math.min(interval, this.#values.max.optimizationInterval);\n };\n\n private getDecreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\n const interval = optimizationIntervalInMs - this.#values.step.optimizationInterval;\n\n return Math.max(interval, this.#values.min.optimizationInterval);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"udpConcurrencyBasedOptimizationStrategy.js","sourceRoot":"","sources":["../../../../../src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import type OptimizationValues from \"../optimizationValues.js\";\r\nimport type TransferUploadOptimizationStrategy from \"../transferUploadOptimizationStrategy.js\";\r\n\r\nexport default class UdpConcurrencyBasedOptimizationStrategy implements TransferUploadOptimizationStrategy {\r\n #values = {\r\n const: {\r\n sleep: 0.5,\r\n },\r\n step: {\r\n chunksCount: 4,\r\n chunkSize: 12244,\r\n optimizationInterval: 50,\r\n },\r\n min: {\r\n chunksCount: 4,\r\n chunkSize: 15424,\r\n optimizationInterval: 50,\r\n },\r\n max: {\r\n chunksCount: 125,\r\n chunkSize: 64400,\r\n optimizationInterval: 500,\r\n },\r\n };\r\n\r\n msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): { chunkSize: number } {\r\n const chunkSize = currentOptimizedValues.chunkSize - 1000;\r\n\r\n this.#values.max.chunkSize = chunkSize;\r\n\r\n return { chunkSize };\r\n }\r\n\r\n noBufsErrorHandler(currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number } {\r\n return {\r\n maxParallelChunksAmount: this.#values.min.chunksCount,\r\n minTimeBetweenChunksStartInMs: currentOptimizedValues.minTimeBetweenChunksStartInMs,\r\n };\r\n }\r\n\r\n getInitialValues(serverLatencyInMs: number): OptimizationValues {\r\n return {\r\n chunkSize: this.#values.max.chunkSize,\r\n minTimeBetweenChunksStartInMs: this.#values.const.sleep,\r\n optimizationIntervalInMs: (this.#values.max.optimizationInterval + this.#values.min.optimizationInterval) / 3,\r\n maxParallelChunksAmount: this.#values.min.chunksCount,\r\n requestTimeoutInMs: serverLatencyInMs * 2,\r\n };\r\n }\r\n\r\n getOptimizedValues(_startedChunksTimeHistory: number[], ackedChunksHistory: { time: number, latencyInMs: number }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): { optimizedValues: OptimizationValues, clearChunksHistory: boolean } {\r\n const finishedChunks = ackedChunksHistory.length + failedChunksTimeHistory.length;\r\n\r\n if (finishedChunks === 0 || ackedChunksHistory.length === 0)\r\n return { optimizedValues: currentOptimizedValues, clearChunksHistory: false };\r\n\r\n const failuresRate = failedChunksTimeHistory.length / finishedChunks;\r\n const acksRate = 1 - failuresRate;\r\n\r\n const optimizedChunkSizeAndChunksCount = this.getOptimizedChunkSizeAndChunksCount(acksRate, currentOptimizedValues.chunkSize, currentOptimizedValues.maxParallelChunksAmount);\r\n\r\n const optimizedValues: OptimizationValues = {\r\n ...currentOptimizedValues,\r\n maxParallelChunksAmount: optimizedChunkSizeAndChunksCount.optimizedChunksCount,\r\n chunkSize: optimizedChunkSizeAndChunksCount.optimizedChunkSize,\r\n optimizationIntervalInMs: this.getOptimizedOptimizationInterval(ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\r\n requestTimeoutInMs: this.getOptimizedRequestTimeout(ackedChunksHistory),\r\n };\r\n\r\n return { optimizedValues, clearChunksHistory: false };\r\n }\r\n\r\n private getOptimizedChunkSizeAndChunksCount(acksRate: number, currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\r\n if (acksRate < 0.7)\r\n return this.slowDown(currentChunkSize, currentChunksCount);\r\n\r\n if (acksRate > 0.9)\r\n return this.speedUp(currentChunkSize, currentChunksCount);\r\n\r\n return {\r\n optimizedChunkSize: currentChunkSize,\r\n optimizedChunksCount: currentChunksCount,\r\n };\r\n }\r\n\r\n private speedUp(currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\r\n if (currentChunkSize! < this.#values.max.chunkSize) {\r\n return {\r\n optimizedChunkSize: this.getIncreasedChunkSize(currentChunkSize),\r\n optimizedChunksCount: currentChunksCount,\r\n };\r\n }\r\n\r\n return {\r\n optimizedChunkSize: currentChunkSize,\r\n optimizedChunksCount: this.getIncreasedChunksCount(currentChunksCount),\r\n };\r\n }\r\n\r\n private slowDown(currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\r\n if (currentChunksCount > this.#values.min.chunksCount) {\r\n return {\r\n optimizedChunkSize: currentChunkSize,\r\n optimizedChunksCount: this.getDecreasedChunksCount(currentChunksCount),\r\n };\r\n }\r\n\r\n return {\r\n optimizedChunkSize: this.getDecreasedChunkSize(currentChunkSize),\r\n optimizedChunksCount: currentChunksCount,\r\n };\r\n }\r\n\r\n private getIncreasedChunkSize = (currentChunkSize: number) => {\r\n const newChunkSize = currentChunkSize + this.#values.step.chunkSize;\r\n\r\n return Math.min(newChunkSize, this.#values.max.chunkSize);\r\n };\r\n\r\n private getDecreasedChunkSize = (currentChunkSize: number) => {\r\n const newChunkSize = currentChunkSize - this.#values.step.chunkSize;\r\n\r\n return Math.max(newChunkSize, this.#values.min.chunkSize);\r\n };\r\n\r\n private getIncreasedChunksCount = (currentChunksCount: number) => {\r\n const newChunksCount = currentChunksCount + this.#values.step.chunksCount;\r\n\r\n return Math.min(newChunksCount, this.#values.max.chunksCount);\r\n };\r\n\r\n private getDecreasedChunksCount = (currentChunksCount: number) => {\r\n const newChunksCount = currentChunksCount - this.#values.step.chunksCount;\r\n\r\n return Math.max(newChunksCount, this.#values.min.chunksCount);\r\n };\r\n\r\n private getOptimizedRequestTimeout(ackedChunksHistory: { time: number; latencyInMs: number; }[]) {\r\n const averageLatency = ackedChunksHistory.reduce((sum, ack) => sum + ack.latencyInMs, 0) / ackedChunksHistory.length;\r\n const latencyPercentile = this.findLatencyPercentile(ackedChunksHistory);\r\n\r\n return Math.max(averageLatency * 4, latencyPercentile);\r\n }\r\n\r\n private findLatencyPercentile(ackedChunks: { time: number; latencyInMs: number; }[]): number {\r\n const latencies = ackedChunks.map(v => v.latencyInMs);\r\n const sortedLatencies = latencies.slice().sort((a, b) => a - b);\r\n const index = Math.ceil(0.90 * (sortedLatencies.length - 1));\r\n\r\n return sortedLatencies[index]!;\r\n }\r\n\r\n private getOptimizedOptimizationInterval(ackedChunksCount: number, currentOptimizationIntervalInMs: number): number {\r\n if (ackedChunksCount > 30)\r\n return this.getDecreasedOptimizationInterval(currentOptimizationIntervalInMs);\r\n\r\n if (ackedChunksCount < 15)\r\n return this.getIncreasedOptimizationInterval(currentOptimizationIntervalInMs);\r\n\r\n return currentOptimizationIntervalInMs;\r\n }\r\n\r\n private getIncreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\r\n const interval = optimizationIntervalInMs + this.#values.step.optimizationInterval;\r\n\r\n return Math.min(interval, this.#values.max.optimizationInterval);\r\n };\r\n\r\n private getDecreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\r\n const interval = optimizationIntervalInMs - this.#values.step.optimizationInterval;\r\n\r\n return Math.max(interval, this.#values.min.optimizationInterval);\r\n };\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"udpSleepBasedOptimizationStrategy.js","sourceRoot":"","sources":["../../../../../src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import type OptimizationValues from \"../optimizationValues.js\";\nimport type TransferUploadOptimizationStrategy from \"../transferUploadOptimizationStrategy.js\";\n\nexport default class UdpSleepBasedOptimizationStrategy implements TransferUploadOptimizationStrategy {\n #values = {\n step: {\n chunksAmount: 4,\n chunkSize: 12244,\n optimizationInterval: 50,\n sleep: 1,\n },\n min: {\n chunksAmount: 4,\n chunkSize: 15424,\n optimizationInterval: 50,\n sleep: 0,\n },\n max: {\n chunksAmount: 150,\n chunkSize: 64400,\n optimizationInterval: 500,\n sleep: 50,\n },\n };\n\n msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): { chunkSize: number } {\n const chunkSize = currentOptimizedValues.chunkSize - 1000;\n\n this.#values.max.chunkSize = chunkSize;\n\n return { chunkSize };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n noBufsErrorHandler(_currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number } {\n return {\n maxParallelChunksAmount: this.#values.min.chunksAmount,\n minTimeBetweenChunksStartInMs: this.#values.max.sleep,\n };\n }\n\n getInitialValues(serverLatencyInMs: number): OptimizationValues {\n return {\n chunkSize: this.#values.max.chunkSize,\n minTimeBetweenChunksStartInMs: (this.#values.max.sleep + this.#values.min.sleep) / 3,\n optimizationIntervalInMs: (this.#values.max.optimizationInterval + this.#values.min.optimizationInterval) / 3,\n maxParallelChunksAmount: this.#values.max.chunksAmount,\n requestTimeoutInMs: serverLatencyInMs * 2,\n };\n }\n\n getOptimizedValues(_startedChunksTimeHistory: number[], ackedChunksHistory: { time: number, latencyInMs: number }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): { optimizedValues: OptimizationValues, clearChunksHistory: boolean } {\n const finishedChunks = ackedChunksHistory.length + failedChunksTimeHistory.length;\n\n if (finishedChunks === 0 || ackedChunksHistory.length === 0)\n return { optimizedValues: currentOptimizedValues, clearChunksHistory: false };\n\n const failuresRate = failedChunksTimeHistory.length / finishedChunks;\n const acksRate = 1 - failuresRate;\n\n const optimizedChunkSize = this.getOptimizedChunkSize(acksRate, failuresRate, currentOptimizedValues.chunkSize);\n\n const optimizedValues: OptimizationValues = {\n ...currentOptimizedValues,\n chunkSize: optimizedChunkSize,\n optimizationIntervalInMs: this.getOptimizedOptimizationInterval(ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\n minTimeBetweenChunksStartInMs: this.getOptimizedMinTimeBetweenChunksStart(currentOptimizedValues.chunkSize, optimizedChunkSize, ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\n requestTimeoutInMs: this.getOptimizedRequestTimeout(ackedChunksHistory),\n };\n\n return { optimizedValues, clearChunksHistory: false };\n }\n\n private getOptimizedRequestTimeout(ackedChunksHistory: { time: number; latencyInMs: number; }[]) {\n const averageLatency = ackedChunksHistory.reduce((sum, ack) => sum + ack.latencyInMs, 0) / ackedChunksHistory.length;\n const latencyPercentile = this.findLatencyPercentile(ackedChunksHistory);\n\n return Math.max(averageLatency * 4, latencyPercentile);\n }\n\n private findLatencyPercentile(ackedChunks: { time: number; latencyInMs: number; }[]): number {\n const latencies = ackedChunks.map(v => v.latencyInMs);\n const sortedLatencies = latencies.slice().sort((a, b) => a - b);\n const index = Math.ceil(0.90 * (sortedLatencies.length - 1));\n\n return sortedLatencies[index]!;\n }\n\n private getOptimizedMinTimeBetweenChunksStart(currentChunkSize: number, optimizedChunkSize: number, ackedChunksCount: number, periodInMs: number): number {\n const currentBytesPerMs = (currentChunkSize * ackedChunksCount) / periodInMs;\n const wantedBytesPerMs = currentBytesPerMs * 1.4;\n\n return Math.min(optimizedChunkSize / wantedBytesPerMs, this.#values.max.sleep);\n }\n\n private getOptimizedOptimizationInterval(ackedChunksCount: number, currentOptimizationIntervalInMs: number): number {\n if (ackedChunksCount > 30)\n return this.getDecreasedOptimizationInterval(currentOptimizationIntervalInMs);\n\n if (ackedChunksCount < 15)\n return this.getIncreasedOptimizationInterval(currentOptimizationIntervalInMs);\n\n return currentOptimizationIntervalInMs;\n }\n\n private getIncreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\n const interval = optimizationIntervalInMs + this.#values.step.optimizationInterval;\n\n return Math.min(interval, this.#values.max.optimizationInterval);\n };\n\n private getDecreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\n const interval = optimizationIntervalInMs - this.#values.step.optimizationInterval;\n\n return Math.max(interval, this.#values.min.optimizationInterval);\n };\n\n private getOptimizedChunkSize(acksRate: number, failuresRate: number, currentChunkSize: number): number {\n if (failuresRate > 0.4 || acksRate < 0.4)\n return this.getDecreasedChunkSize(currentChunkSize);\n\n if (failuresRate < 0.15 && acksRate > 0.6)\n return this.getIncreasedChunkSize(currentChunkSize);\n\n return currentChunkSize;\n }\n\n private getIncreasedChunkSize = (currentChunkSize: number) => {\n const newChunkSize = currentChunkSize + this.#values.step.chunkSize;\n\n return Math.min(newChunkSize, this.#values.max.chunkSize);\n };\n\n private getDecreasedChunkSize = (currentChunkSize: number) => {\n const newChunkSize = currentChunkSize - this.#values.step.chunkSize;\n\n return Math.max(newChunkSize, this.#values.min.chunkSize);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"udpSleepBasedOptimizationStrategy.js","sourceRoot":"","sources":["../../../../../src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import type OptimizationValues from \"../optimizationValues.js\";\r\nimport type TransferUploadOptimizationStrategy from \"../transferUploadOptimizationStrategy.js\";\r\n\r\nexport default class UdpSleepBasedOptimizationStrategy implements TransferUploadOptimizationStrategy {\r\n #values = {\r\n step: {\r\n chunksAmount: 4,\r\n chunkSize: 12244,\r\n optimizationInterval: 50,\r\n sleep: 1,\r\n },\r\n min: {\r\n chunksAmount: 4,\r\n chunkSize: 15424,\r\n optimizationInterval: 50,\r\n sleep: 0,\r\n },\r\n max: {\r\n chunksAmount: 150,\r\n chunkSize: 64400,\r\n optimizationInterval: 500,\r\n sleep: 50,\r\n },\r\n };\r\n\r\n msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): { chunkSize: number } {\r\n const chunkSize = currentOptimizedValues.chunkSize - 1000;\r\n\r\n this.#values.max.chunkSize = chunkSize;\r\n\r\n return { chunkSize };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n noBufsErrorHandler(_currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number } {\r\n return {\r\n maxParallelChunksAmount: this.#values.min.chunksAmount,\r\n minTimeBetweenChunksStartInMs: this.#values.max.sleep,\r\n };\r\n }\r\n\r\n getInitialValues(serverLatencyInMs: number): OptimizationValues {\r\n return {\r\n chunkSize: this.#values.max.chunkSize,\r\n minTimeBetweenChunksStartInMs: (this.#values.max.sleep + this.#values.min.sleep) / 3,\r\n optimizationIntervalInMs: (this.#values.max.optimizationInterval + this.#values.min.optimizationInterval) / 3,\r\n maxParallelChunksAmount: this.#values.max.chunksAmount,\r\n requestTimeoutInMs: serverLatencyInMs * 2,\r\n };\r\n }\r\n\r\n getOptimizedValues(_startedChunksTimeHistory: number[], ackedChunksHistory: { time: number, latencyInMs: number }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): { optimizedValues: OptimizationValues, clearChunksHistory: boolean } {\r\n const finishedChunks = ackedChunksHistory.length + failedChunksTimeHistory.length;\r\n\r\n if (finishedChunks === 0 || ackedChunksHistory.length === 0)\r\n return { optimizedValues: currentOptimizedValues, clearChunksHistory: false };\r\n\r\n const failuresRate = failedChunksTimeHistory.length / finishedChunks;\r\n const acksRate = 1 - failuresRate;\r\n\r\n const optimizedChunkSize = this.getOptimizedChunkSize(acksRate, failuresRate, currentOptimizedValues.chunkSize);\r\n\r\n const optimizedValues: OptimizationValues = {\r\n ...currentOptimizedValues,\r\n chunkSize: optimizedChunkSize,\r\n optimizationIntervalInMs: this.getOptimizedOptimizationInterval(ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\r\n minTimeBetweenChunksStartInMs: this.getOptimizedMinTimeBetweenChunksStart(currentOptimizedValues.chunkSize, optimizedChunkSize, ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\r\n requestTimeoutInMs: this.getOptimizedRequestTimeout(ackedChunksHistory),\r\n };\r\n\r\n return { optimizedValues, clearChunksHistory: false };\r\n }\r\n\r\n private getOptimizedRequestTimeout(ackedChunksHistory: { time: number; latencyInMs: number; }[]) {\r\n const averageLatency = ackedChunksHistory.reduce((sum, ack) => sum + ack.latencyInMs, 0) / ackedChunksHistory.length;\r\n const latencyPercentile = this.findLatencyPercentile(ackedChunksHistory);\r\n\r\n return Math.max(averageLatency * 4, latencyPercentile);\r\n }\r\n\r\n private findLatencyPercentile(ackedChunks: { time: number; latencyInMs: number; }[]): number {\r\n const latencies = ackedChunks.map(v => v.latencyInMs);\r\n const sortedLatencies = latencies.slice().sort((a, b) => a - b);\r\n const index = Math.ceil(0.90 * (sortedLatencies.length - 1));\r\n\r\n return sortedLatencies[index]!;\r\n }\r\n\r\n private getOptimizedMinTimeBetweenChunksStart(currentChunkSize: number, optimizedChunkSize: number, ackedChunksCount: number, periodInMs: number): number {\r\n const currentBytesPerMs = (currentChunkSize * ackedChunksCount) / periodInMs;\r\n const wantedBytesPerMs = currentBytesPerMs * 1.4;\r\n\r\n return Math.min(optimizedChunkSize / wantedBytesPerMs, this.#values.max.sleep);\r\n }\r\n\r\n private getOptimizedOptimizationInterval(ackedChunksCount: number, currentOptimizationIntervalInMs: number): number {\r\n if (ackedChunksCount > 30)\r\n return this.getDecreasedOptimizationInterval(currentOptimizationIntervalInMs);\r\n\r\n if (ackedChunksCount < 15)\r\n return this.getIncreasedOptimizationInterval(currentOptimizationIntervalInMs);\r\n\r\n return currentOptimizationIntervalInMs;\r\n }\r\n\r\n private getIncreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\r\n const interval = optimizationIntervalInMs + this.#values.step.optimizationInterval;\r\n\r\n return Math.min(interval, this.#values.max.optimizationInterval);\r\n };\r\n\r\n private getDecreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\r\n const interval = optimizationIntervalInMs - this.#values.step.optimizationInterval;\r\n\r\n return Math.max(interval, this.#values.min.optimizationInterval);\r\n };\r\n\r\n private getOptimizedChunkSize(acksRate: number, failuresRate: number, currentChunkSize: number): number {\r\n if (failuresRate > 0.4 || acksRate < 0.4)\r\n return this.getDecreasedChunkSize(currentChunkSize);\r\n\r\n if (failuresRate < 0.15 && acksRate > 0.6)\r\n return this.getIncreasedChunkSize(currentChunkSize);\r\n\r\n return currentChunkSize;\r\n }\r\n\r\n private getIncreasedChunkSize = (currentChunkSize: number) => {\r\n const newChunkSize = currentChunkSize + this.#values.step.chunkSize;\r\n\r\n return Math.min(newChunkSize, this.#values.max.chunkSize);\r\n };\r\n\r\n private getDecreasedChunkSize = (currentChunkSize: number) => {\r\n const newChunkSize = currentChunkSize - this.#values.step.chunkSize;\r\n\r\n return Math.max(newChunkSize, this.#values.min.chunkSize);\r\n };\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadOptimizationStrategy.js","sourceRoot":"","sources":["../../../../src/uploader/optimizer/transferUploadOptimizationStrategy.ts"],"names":[],"mappings":"","sourcesContent":["import type OptimizationValues from \"./optimizationValues.js\";\n\ninterface TransferUploadOptimizationStrategy {\n msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): { chunkSize: number };\n noBufsErrorHandler(currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number };\n getInitialValues(serverLatencyInMs: number): OptimizationValues;\n getOptimizedValues(startedChunksTimeHistory: number[], ackedChunksHistory: { time: number, latencyInMs: number }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): { optimizedValues: OptimizationValues, clearChunksHistory?: boolean };\n}\n\nexport default TransferUploadOptimizationStrategy;"]}
|
|
1
|
+
{"version":3,"file":"transferUploadOptimizationStrategy.js","sourceRoot":"","sources":["../../../../src/uploader/optimizer/transferUploadOptimizationStrategy.ts"],"names":[],"mappings":"","sourcesContent":["import type OptimizationValues from \"./optimizationValues.js\";\r\n\r\ninterface TransferUploadOptimizationStrategy {\r\n msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): { chunkSize: number };\r\n noBufsErrorHandler(currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number };\r\n getInitialValues(serverLatencyInMs: number): OptimizationValues;\r\n getOptimizedValues(startedChunksTimeHistory: number[], ackedChunksHistory: { time: number, latencyInMs: number }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): { optimizedValues: OptimizationValues, clearChunksHistory?: boolean };\r\n}\r\n\r\nexport default TransferUploadOptimizationStrategy;"]}
|