filemail-sdk 9.4.5 → 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.d.ts +1 -0
- package/dist/src/client/uploader/transferUploaderBase.d.ts.map +1 -1
- package/dist/src/client/uploader/transferUploaderBase.js +15 -8
- 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 +9 -9
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js +3 -3
- 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 +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.d.ts +4 -0
- package/dist/src/uploader/transferFailureAbortReason.d.ts.map +1 -0
- package/dist/src/uploader/transferFailureAbortReason.js +9 -0
- package/dist/src/uploader/transferFailureAbortReason.js.map +1 -0
- package/dist/src/uploader/transferUpload.d.ts +2 -0
- package/dist/src/uploader/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +22 -5
- 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.d.ts +2 -2
- package/dist/src/utils/fileSystem/chunkStreamProvider.d.ts.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.d.ts +9 -4
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js +117 -26
- 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.d.ts +2 -2
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js +2 -2
- 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":"chunkStreamProvider.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProvider.ts"],"names":[],"mappings":"","sourcesContent":["import type { Writable } from \"stream\";\nimport type { ReadableStream as NodeReadableStream } from \"stream/web\";\nimport type { PauseSignal } from \"../../uploader/pauseController.js\";\n\ninterface ChunkStreamProvider {\n readonly isReleased: boolean;\n readonly chunkStartPosition: number;\n readonly chunkLengthInBytes: number;\n\n getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal): Promise<string>;\n getChunkReadStream(pauseSignal?: PauseSignal): Promise<ReadableStream | NodeReadableStream>;\n getChunkBlob(): Promise<Blob>;\n getChunkWriteStream(): Promise<{ fileStream: Writable, decipherStream?: Writable }>;\n release(): Promise<void>;\n}\n\nexport type ChunkStreamProviderEncryptionData = {\n iv: Uint8Array,\n key: Uint8Array,\n}\n\nexport default ChunkStreamProvider;"]}
|
|
1
|
+
{"version":3,"file":"chunkStreamProvider.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProvider.ts"],"names":[],"mappings":"","sourcesContent":["import type { Writable } from \"stream\";\r\nimport type { ReadableStream as NodeReadableStream } from \"stream/web\";\r\nimport type { PauseSignal } from \"../../uploader/pauseController.js\";\r\n\r\ninterface ChunkStreamProvider {\r\n readonly isReleased: boolean;\r\n readonly chunkStartPosition: number;\r\n readonly chunkLengthInBytes: number;\r\n\r\n getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string>;\r\n getChunkReadStream(pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<ReadableStream | NodeReadableStream>;\r\n getChunkBlob(): Promise<Blob>;\r\n getChunkWriteStream(): Promise<{ fileStream: Writable, decipherStream?: Writable }>;\r\n release(): Promise<void>;\r\n}\r\n\r\nexport type ChunkStreamProviderEncryptionData = {\r\n iv: Uint8Array,\r\n key: Uint8Array,\r\n}\r\n\r\nexport default ChunkStreamProvider;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProviderFactory.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkStreamProvider from \"./chunkStreamProvider.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"./chunkStreamProvider.js\";\n\ninterface ChunkStreamProviderFactory<T extends string | File> {\n provide(file: T, start: number, size: number, encryptionData?: ChunkStreamProviderEncryptionData): ChunkStreamProvider;\n}\n\nexport default ChunkStreamProviderFactory;"]}
|
|
1
|
+
{"version":3,"file":"chunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProviderFactory.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkStreamProvider from \"./chunkStreamProvider.js\";\r\nimport type { ChunkStreamProviderEncryptionData } from \"./chunkStreamProvider.js\";\r\n\r\ninterface ChunkStreamProviderFactory<T extends string | File> {\r\n provide(file: T, start: number, size: number, encryptionData?: ChunkStreamProviderEncryptionData): ChunkStreamProvider;\r\n}\r\n\r\nexport default ChunkStreamProviderFactory;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileDetails.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/fileDetails.ts"],"names":[],"mappings":"","sourcesContent":["interface FileDetails {\n readonly externalId: string | number;\n readonly fileSizeInBytes: number;\n readonly fileName: string;\n readonly fileDestinationPathInTransfer: string;\n}\n\nexport default FileDetails;"]}
|
|
1
|
+
{"version":3,"file":"fileDetails.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/fileDetails.ts"],"names":[],"mappings":"","sourcesContent":["interface FileDetails {\r\n readonly externalId: string | number;\r\n readonly fileSizeInBytes: number;\r\n readonly fileName: string;\r\n readonly fileDestinationPathInTransfer: string;\r\n}\r\n\r\nexport default FileDetails;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileSystemService.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/fileSystemService.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadErrorCode from \"../../downloader/dtos/downloadErrorCode.js\";\nimport type ParsedPath from \"./parsedPath.js\";\n\ninterface FileSystemService {\n writeFile(filePath: string, data: string, encoding?: BufferEncoding, abort?: AbortSignal): unknown;\n createFolder(folderPath: string): Promise<void>;\n getAllFilePaths(folderPath: string): Promise<Array<string>>;\n getAllFilePathsRecursive(folderPath: string): Promise<Array<string>>;\n readFileAsString(filePath: string, encoding?: BufferEncoding, abort?: AbortSignal): Promise<string>;\n pathJoin(...paths: Array<string>): string;\n deleteFolder(folderPath: string): Promise<boolean>;\n folderIsEmpty(folderPath: string): Promise<boolean>;\n deleteFile(filePath: string): Promise<boolean>;\n /**\n * Creates the file specified by **filePath**. Returns a bool flag whether the file was physically created or overwritten.\n * @param filePath - full path of the file to create\n * @param overwriteExisting - when **true** this method will create or overwrite the file (if exists) and return true. If **false** this method will create the file only if it does not exist and in such case it will return true. It will return false if the file already exists.\n */\n createFile(filePath: string, overwriteExisting: boolean): Promise<boolean>;\n pathExists(thePath: string, checkReadWriteAccess?: boolean): Promise<boolean>;\n getFileSize(filePath: string): Promise<number>;\n truncateFile(filePath: string, newSize: number): Promise<void>;\n renameFile(filePath: string, newPath: string): Promise<void>;\n getAvailableDiskSpace(path: string): Promise<bigint>;\n parseFilePath(filePath: string): ParsedPath;\n formatFilePath(parsedPath: ParsedPath): string;\n replaceFilenameInPath(filePath: string, newFileName: string): string;\n\n fileErrorToDownloadErrorCode(error: Error): DownloadErrorCode | undefined;\n}\n\nexport default FileSystemService;\n"]}
|
|
1
|
+
{"version":3,"file":"fileSystemService.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/fileSystemService.ts"],"names":[],"mappings":"","sourcesContent":["import type DownloadErrorCode from \"../../downloader/dtos/downloadErrorCode.js\";\r\nimport type ParsedPath from \"./parsedPath.js\";\r\n\r\ninterface FileSystemService {\r\n writeFile(filePath: string, data: string, encoding?: BufferEncoding, abort?: AbortSignal): unknown;\r\n createFolder(folderPath: string): Promise<void>;\r\n getAllFilePaths(folderPath: string): Promise<Array<string>>;\r\n getAllFilePathsRecursive(folderPath: string): Promise<Array<string>>;\r\n readFileAsString(filePath: string, encoding?: BufferEncoding, abort?: AbortSignal): Promise<string>;\r\n pathJoin(...paths: Array<string>): string;\r\n deleteFolder(folderPath: string): Promise<boolean>;\r\n folderIsEmpty(folderPath: string): Promise<boolean>;\r\n deleteFile(filePath: string): Promise<boolean>;\r\n /**\r\n * Creates the file specified by **filePath**. Returns a bool flag whether the file was physically created or overwritten.\r\n * @param filePath - full path of the file to create\r\n * @param overwriteExisting - when **true** this method will create or overwrite the file (if exists) and return true. If **false** this method will create the file only if it does not exist and in such case it will return true. It will return false if the file already exists.\r\n */\r\n createFile(filePath: string, overwriteExisting: boolean): Promise<boolean>;\r\n pathExists(thePath: string, checkReadWriteAccess?: boolean): Promise<boolean>;\r\n getFileSize(filePath: string): Promise<number>;\r\n truncateFile(filePath: string, newSize: number): Promise<void>;\r\n renameFile(filePath: string, newPath: string): Promise<void>;\r\n getAvailableDiskSpace(path: string): Promise<bigint>;\r\n parseFilePath(filePath: string): ParsedPath;\r\n formatFilePath(parsedPath: ParsedPath): string;\r\n replaceFilenameInPath(filePath: string, newFileName: string): string;\r\n\r\n fileErrorToDownloadErrorCode(error: Error): DownloadErrorCode | undefined;\r\n}\r\n\r\nexport default FileSystemService;\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsError.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/fsError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,KAAK;IACtC,YAAY,OAAgB,EAAE,OAAsB;QAChD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IAC1B,CAAC;CACJ","sourcesContent":["export default class FsError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n this.name = `FsError`;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"fsError.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/fsError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,KAAK;IACtC,YAAY,OAAgB,EAAE,OAAsB;QAChD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IAC1B,CAAC;CACJ","sourcesContent":["export default class FsError extends Error {\r\n constructor(message?: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = `FsError`;\r\n }\r\n}"]}
|
|
@@ -10,8 +10,8 @@ export default class NodeChunkStreamProvider implements ChunkStreamProvider {
|
|
|
10
10
|
get isReleased(): boolean;
|
|
11
11
|
constructor(fullFilePath: string, chunkStartPosition: number, chunkLengthInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined);
|
|
12
12
|
private throwIfEncryptionDataIsNotValid;
|
|
13
|
-
getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal): Promise<string>;
|
|
14
|
-
getChunkReadStream(pauseSignal?: PauseSignal): Promise<ReadableStream>;
|
|
13
|
+
getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string>;
|
|
14
|
+
getChunkReadStream(pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<ReadableStream>;
|
|
15
15
|
getChunkBlob(): Promise<Blob>;
|
|
16
16
|
private getChunkEndPosition;
|
|
17
17
|
getChunkWriteStream(): Promise<{
|
|
@@ -19,8 +19,13 @@ export default class NodeChunkStreamProvider implements ChunkStreamProvider {
|
|
|
19
19
|
decipherStream?: Writable;
|
|
20
20
|
}>;
|
|
21
21
|
release(): Promise<void>;
|
|
22
|
-
private
|
|
23
|
-
private
|
|
22
|
+
private registerInterruptListeners;
|
|
23
|
+
private cleanupInterruptListeners;
|
|
24
|
+
private registerReadErrorListeners;
|
|
25
|
+
private cleanupReadErrorListeners;
|
|
26
|
+
private throwIfFileDoesNotExist;
|
|
27
|
+
private awaitAbortable;
|
|
28
|
+
private createAbortError;
|
|
24
29
|
private closeHandle;
|
|
25
30
|
private destroyStream;
|
|
26
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeChunkStreamProvider.d.ts","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeChunkStreamProvider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAMvC,OAAO,KAAK,mBAAmB,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAEnF,MAAM,CAAC,OAAO,OAAO,uBAAwB,YAAW,mBAAmB;;IACvE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"nodeChunkStreamProvider.d.ts","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeChunkStreamProvider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAMvC,OAAO,KAAK,mBAAmB,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAEnF,MAAM,CAAC,OAAO,OAAO,uBAAwB,YAAW,mBAAmB;;IACvE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAkBpC,IAAI,UAAU,IAAI,OAAO,CAWxB;gBAEW,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE,iCAAiC,GAAG,SAAS;IAavJ,OAAO,CAAC,+BAA+B;IAUjC,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB/G,kBAAkB,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IA4CvG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,OAAO,CAAC,mBAAmB;IAOrB,mBAAmB,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,QAAQ,CAAC;QAAC,cAAc,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;IA8BnF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B,OAAO,CAAC,0BAA0B;IAsBlC,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,0BAA0B;IAuBlC,OAAO,CAAC,yBAAyB;YAWnB,uBAAuB;YAWvB,cAAc;IA4C5B,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,aAAa,CAQnB;CACL"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from "fs/promises";
|
|
2
|
-
import { constants as fsConsts } from "fs";
|
|
2
|
+
import fsSync, { constants as fsConsts } from "fs";
|
|
3
3
|
import crypto from "crypto";
|
|
4
4
|
import { pipeline, finished } from "stream/promises";
|
|
5
5
|
import { PassThrough } from "stream";
|
|
@@ -11,24 +11,26 @@ export default class NodeChunkStreamProvider {
|
|
|
11
11
|
chunkLengthInBytes;
|
|
12
12
|
#encryptionData;
|
|
13
13
|
#fullFilePath;
|
|
14
|
-
#fileReadHandle = null;
|
|
15
14
|
#fileReadStream = null;
|
|
16
15
|
#fileReadCipherStream = null;
|
|
17
16
|
#fileReadPassThroughStream = null;
|
|
18
17
|
#fileWriteHandle = null;
|
|
19
18
|
#fileWriteStream = null;
|
|
20
19
|
#fileWriteDecipherStream = null;
|
|
20
|
+
#fileReadStreamErrorListener;
|
|
21
|
+
#fileReadCipherStreamErrorListener;
|
|
21
22
|
#pauseSignal;
|
|
22
23
|
#pauseListener;
|
|
24
|
+
#abortSignal;
|
|
25
|
+
#abortListener;
|
|
23
26
|
get isReleased() {
|
|
24
|
-
const isFileReadHandleReleased = this.#fileReadHandle === null;
|
|
25
27
|
const isFileReadStreamReleased = this.#fileReadStream?.destroyed ?? true;
|
|
26
28
|
const isFileReadCipherStreamReleased = this.#fileReadCipherStream?.destroyed ?? true;
|
|
27
29
|
const isFileReadPassThroughStreamReleased = this.#fileReadPassThroughStream?.destroyed ?? true;
|
|
28
30
|
const isFileWriteHandleReleased = this.#fileWriteHandle === null;
|
|
29
31
|
const isFileWriteStreamReleased = this.#fileWriteStream?.destroyed ?? true;
|
|
30
32
|
const isFileWriteDecipherStreamReleased = this.#fileWriteDecipherStream?.destroyed ?? true;
|
|
31
|
-
return
|
|
33
|
+
return isFileReadStreamReleased && isFileReadCipherStreamReleased
|
|
32
34
|
&& isFileReadPassThroughStreamReleased && isFileWriteStreamReleased && isFileWriteDecipherStreamReleased
|
|
33
35
|
&& isFileWriteHandleReleased;
|
|
34
36
|
}
|
|
@@ -49,14 +51,18 @@ export default class NodeChunkStreamProvider {
|
|
|
49
51
|
if (encryptionData.key.length !== 32)
|
|
50
52
|
throw new FsError(`Encryption key must be 32 bytes long`);
|
|
51
53
|
}
|
|
52
|
-
async getMd5Checksum(format, pauseSignal) {
|
|
54
|
+
async getMd5Checksum(format, pauseSignal, abortSignal) {
|
|
53
55
|
try {
|
|
54
|
-
const fileStream = await this.getChunkReadStream(pauseSignal);
|
|
56
|
+
const fileStream = await this.getChunkReadStream(pauseSignal, abortSignal);
|
|
55
57
|
const hash = crypto.createHash(`md5`);
|
|
56
58
|
await pipeline(fileStream, hash);
|
|
57
59
|
return hash.digest(format);
|
|
58
60
|
}
|
|
59
61
|
catch (error) {
|
|
62
|
+
if (abortSignal?.aborted)
|
|
63
|
+
throw this.createAbortError(abortSignal);
|
|
64
|
+
if (error instanceof FsError)
|
|
65
|
+
throw error;
|
|
60
66
|
throw new FsError(`ComputingFileMd5ChecksumException`, { cause: error });
|
|
61
67
|
}
|
|
62
68
|
finally {
|
|
@@ -64,28 +70,32 @@ export default class NodeChunkStreamProvider {
|
|
|
64
70
|
await this.release();
|
|
65
71
|
}
|
|
66
72
|
}
|
|
67
|
-
async getChunkReadStream(pauseSignal) {
|
|
73
|
+
async getChunkReadStream(pauseSignal, abortSignal) {
|
|
68
74
|
try {
|
|
69
75
|
if (!this.isReleased)
|
|
70
76
|
await this.release();
|
|
71
|
-
|
|
72
|
-
this.#fileReadStream =
|
|
77
|
+
await this.throwIfFileDoesNotExist(abortSignal);
|
|
78
|
+
this.#fileReadStream = fsSync.createReadStream(this.#fullFilePath, {
|
|
73
79
|
start: this.chunkStartPosition,
|
|
74
80
|
end: this.getChunkEndPosition(),
|
|
75
81
|
});
|
|
76
82
|
this.#fileReadPassThroughStream = new PassThrough();
|
|
77
83
|
if (this.#encryptionData) {
|
|
78
84
|
this.#fileReadCipherStream = createCipher(Buffer.from(this.#encryptionData.key), Buffer.from(this.#encryptionData.iv), this.chunkStartPosition);
|
|
79
|
-
this.#fileReadStream.pipe(this.#fileReadCipherStream).pipe(this.#fileReadPassThroughStream);
|
|
80
85
|
}
|
|
86
|
+
this.registerReadErrorListeners();
|
|
87
|
+
if (this.#fileReadCipherStream)
|
|
88
|
+
this.#fileReadStream.pipe(this.#fileReadCipherStream).pipe(this.#fileReadPassThroughStream);
|
|
81
89
|
else
|
|
82
90
|
this.#fileReadStream.pipe(this.#fileReadPassThroughStream);
|
|
83
|
-
this.
|
|
91
|
+
this.registerInterruptListeners(pauseSignal, abortSignal);
|
|
84
92
|
return ReadableStream.from(this.#fileReadPassThroughStream);
|
|
85
93
|
}
|
|
86
94
|
catch (error) {
|
|
87
95
|
if (!this.isReleased)
|
|
88
96
|
await this.release();
|
|
97
|
+
if (abortSignal?.aborted)
|
|
98
|
+
throw this.createAbortError(abortSignal);
|
|
89
99
|
throw new FsError(`CreatingFileReadStreamException`, { cause: error });
|
|
90
100
|
}
|
|
91
101
|
}
|
|
@@ -117,9 +127,9 @@ export default class NodeChunkStreamProvider {
|
|
|
117
127
|
}
|
|
118
128
|
}
|
|
119
129
|
async release() {
|
|
120
|
-
this.
|
|
130
|
+
this.cleanupInterruptListeners();
|
|
131
|
+
this.cleanupReadErrorListeners();
|
|
121
132
|
await Promise.allSettled([
|
|
122
|
-
this.closeHandle(this.#fileReadHandle),
|
|
123
133
|
this.destroyStream(this.#fileReadStream),
|
|
124
134
|
this.destroyStream(this.#fileReadCipherStream),
|
|
125
135
|
this.destroyStream(this.#fileReadPassThroughStream),
|
|
@@ -127,7 +137,6 @@ export default class NodeChunkStreamProvider {
|
|
|
127
137
|
this.destroyStream(this.#fileWriteStream),
|
|
128
138
|
this.destroyStream(this.#fileWriteDecipherStream),
|
|
129
139
|
]);
|
|
130
|
-
this.#fileReadHandle = null;
|
|
131
140
|
this.#fileReadStream = null;
|
|
132
141
|
this.#fileReadCipherStream = null;
|
|
133
142
|
this.#fileReadPassThroughStream = null;
|
|
@@ -135,24 +144,106 @@ export default class NodeChunkStreamProvider {
|
|
|
135
144
|
this.#fileWriteStream = null;
|
|
136
145
|
this.#fileWriteDecipherStream = null;
|
|
137
146
|
}
|
|
138
|
-
|
|
139
|
-
this.
|
|
140
|
-
|
|
141
|
-
return;
|
|
142
|
-
this.#pauseSignal = pauseSignal;
|
|
143
|
-
this.#pauseListener = () => {
|
|
147
|
+
registerInterruptListeners(pauseSignal, abortSignal) {
|
|
148
|
+
this.cleanupInterruptListeners();
|
|
149
|
+
const interruptReadStream = (error) => {
|
|
144
150
|
this.#fileReadStream?.destroy();
|
|
145
151
|
this.#fileReadCipherStream?.destroy();
|
|
146
|
-
this.#fileReadPassThroughStream?.
|
|
152
|
+
this.#fileReadPassThroughStream?.destroy(error);
|
|
147
153
|
};
|
|
148
|
-
|
|
154
|
+
if (pauseSignal) {
|
|
155
|
+
this.#pauseSignal = pauseSignal;
|
|
156
|
+
this.#pauseListener = () => interruptReadStream();
|
|
157
|
+
this.#pauseSignal.addEventListener(`pause`, this.#pauseListener);
|
|
158
|
+
}
|
|
159
|
+
if (abortSignal) {
|
|
160
|
+
this.#abortSignal = abortSignal;
|
|
161
|
+
this.#abortListener = () => interruptReadStream(this.createAbortError(abortSignal));
|
|
162
|
+
this.#abortSignal.addEventListener(`abort`, this.#abortListener);
|
|
163
|
+
}
|
|
149
164
|
}
|
|
150
|
-
|
|
151
|
-
if (
|
|
152
|
-
|
|
153
|
-
this.#
|
|
165
|
+
cleanupInterruptListeners() {
|
|
166
|
+
if (this.#pauseSignal && this.#pauseListener)
|
|
167
|
+
this.#pauseSignal.removeEventListener(`pause`, this.#pauseListener);
|
|
168
|
+
if (this.#abortSignal && this.#abortListener)
|
|
169
|
+
this.#abortSignal.removeEventListener(`abort`, this.#abortListener);
|
|
154
170
|
this.#pauseSignal = undefined;
|
|
155
171
|
this.#pauseListener = undefined;
|
|
172
|
+
this.#abortSignal = undefined;
|
|
173
|
+
this.#abortListener = undefined;
|
|
174
|
+
}
|
|
175
|
+
registerReadErrorListeners() {
|
|
176
|
+
this.cleanupReadErrorListeners();
|
|
177
|
+
const propagateReadError = (error) => {
|
|
178
|
+
if (this.#abortSignal?.aborted) {
|
|
179
|
+
this.#fileReadPassThroughStream?.destroy(this.createAbortError(this.#abortSignal));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
this.#fileReadPassThroughStream?.destroy(new FsError(`CreatingFileReadStreamException`, { cause: error }));
|
|
183
|
+
};
|
|
184
|
+
if (this.#fileReadStream) {
|
|
185
|
+
this.#fileReadStreamErrorListener = propagateReadError;
|
|
186
|
+
this.#fileReadStream.on(`error`, this.#fileReadStreamErrorListener);
|
|
187
|
+
}
|
|
188
|
+
if (this.#fileReadCipherStream) {
|
|
189
|
+
this.#fileReadCipherStreamErrorListener = propagateReadError;
|
|
190
|
+
this.#fileReadCipherStream.on(`error`, this.#fileReadCipherStreamErrorListener);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
cleanupReadErrorListeners() {
|
|
194
|
+
if (this.#fileReadStream && this.#fileReadStreamErrorListener)
|
|
195
|
+
this.#fileReadStream.removeListener(`error`, this.#fileReadStreamErrorListener);
|
|
196
|
+
if (this.#fileReadCipherStream && this.#fileReadCipherStreamErrorListener)
|
|
197
|
+
this.#fileReadCipherStream.removeListener(`error`, this.#fileReadCipherStreamErrorListener);
|
|
198
|
+
this.#fileReadStreamErrorListener = undefined;
|
|
199
|
+
this.#fileReadCipherStreamErrorListener = undefined;
|
|
200
|
+
}
|
|
201
|
+
async throwIfFileDoesNotExist(abortSignal) {
|
|
202
|
+
let fileReadHandle = null;
|
|
203
|
+
try {
|
|
204
|
+
fileReadHandle = await this.awaitAbortable(fs.open(this.#fullFilePath, fsConsts.O_RDONLY), abortSignal);
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
await this.closeHandle(fileReadHandle);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async awaitAbortable(promise, abortSignal) {
|
|
211
|
+
if (!abortSignal)
|
|
212
|
+
return await promise;
|
|
213
|
+
if (abortSignal.aborted)
|
|
214
|
+
throw this.createAbortError(abortSignal);
|
|
215
|
+
return await new Promise((resolve, reject) => {
|
|
216
|
+
let isSettled = false;
|
|
217
|
+
const cleanup = () => {
|
|
218
|
+
abortSignal.removeEventListener(`abort`, abortListener);
|
|
219
|
+
};
|
|
220
|
+
const resolveOnce = (value) => {
|
|
221
|
+
if (isSettled)
|
|
222
|
+
return;
|
|
223
|
+
isSettled = true;
|
|
224
|
+
cleanup();
|
|
225
|
+
resolve(value);
|
|
226
|
+
};
|
|
227
|
+
const rejectOnce = (error) => {
|
|
228
|
+
if (isSettled)
|
|
229
|
+
return;
|
|
230
|
+
isSettled = true;
|
|
231
|
+
cleanup();
|
|
232
|
+
reject(error);
|
|
233
|
+
};
|
|
234
|
+
const abortListener = () => {
|
|
235
|
+
rejectOnce(this.createAbortError(abortSignal));
|
|
236
|
+
};
|
|
237
|
+
abortSignal.addEventListener(`abort`, abortListener);
|
|
238
|
+
promise
|
|
239
|
+
.then(resolveOnce)
|
|
240
|
+
.catch(rejectOnce);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
createAbortError(abortSignal) {
|
|
244
|
+
if (abortSignal.reason instanceof Error)
|
|
245
|
+
return abortSignal.reason;
|
|
246
|
+
return new Error(`Aborted`);
|
|
156
247
|
}
|
|
157
248
|
closeHandle = async (handle) => {
|
|
158
249
|
if (!handle)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeChunkStreamProvider.js","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeChunkStreamProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs/promises\";\nimport { ReadStream, WriteStream, constants as fsConsts } from \"fs\";\nimport crypto from \"crypto\";\nimport { pipeline, finished } from \"stream/promises\";\nimport { PassThrough, Transform } from \"stream\";\n\nimport { ReadableStream } from \"stream/web\";\nimport type { Writable } from \"stream\";\n\nimport { createCipher, createDecipher } from 'aes-ctr-concurrent';\n\nimport FsError from '../fsError.js';\n\nimport type ChunkStreamProvider from \"../chunkStreamProvider.js\";\nimport type { PauseSignal } from \"../../../uploader/pauseController.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../chunkStreamProvider.js\";\n\nexport default class NodeChunkStreamProvider implements ChunkStreamProvider {\n readonly chunkStartPosition: number;\n readonly chunkLengthInBytes: number;\n\n readonly #encryptionData?: ChunkStreamProviderEncryptionData;\n readonly #fullFilePath: string;\n\n #fileReadHandle: fs.FileHandle | null = null;\n #fileReadStream: ReadStream | null = null;\n #fileReadCipherStream: Transform | null = null;\n #fileReadPassThroughStream: PassThrough | null = null;\n #fileWriteHandle: fs.FileHandle | null = null;\n #fileWriteStream: WriteStream | null = null;\n #fileWriteDecipherStream: Transform | null = null;\n #pauseSignal: PauseSignal | undefined;\n #pauseListener: (() => void) | undefined;\n\n get isReleased(): boolean {\n const isFileReadHandleReleased = this.#fileReadHandle === null;\n const isFileReadStreamReleased = this.#fileReadStream?.destroyed ?? true;\n const isFileReadCipherStreamReleased = this.#fileReadCipherStream?.destroyed ?? true;\n const isFileReadPassThroughStreamReleased = this.#fileReadPassThroughStream?.destroyed ?? true;\n const isFileWriteHandleReleased = this.#fileWriteHandle === null;\n const isFileWriteStreamReleased = this.#fileWriteStream?.destroyed ?? true;\n const isFileWriteDecipherStreamReleased = this.#fileWriteDecipherStream?.destroyed ?? true;\n\n return isFileReadHandleReleased && isFileReadStreamReleased && isFileReadCipherStreamReleased\n && isFileReadPassThroughStreamReleased && isFileWriteStreamReleased && isFileWriteDecipherStreamReleased\n && isFileWriteHandleReleased;\n }\n\n constructor(fullFilePath: string, chunkStartPosition: number, chunkLengthInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined) {\n this.throwIfEncryptionDataIsNotValid(encryptionData);\n\n this.#fullFilePath = fullFilePath;\n this.#encryptionData = encryptionData;\n this.chunkStartPosition = chunkStartPosition;\n\n if (chunkLengthInBytes < 0)\n throw new FsError(`chunkLengthInBytes can't be a negative value`);\n\n this.chunkLengthInBytes = chunkLengthInBytes;\n }\n\n private throwIfEncryptionDataIsNotValid(encryptionData: ChunkStreamProviderEncryptionData | undefined) {\n if (!encryptionData)\n return;\n\n if (encryptionData.iv.length !== 16)\n throw new FsError(`Encryption IV must be 16 bytes long`);\n if (encryptionData.key.length !== 32)\n throw new FsError(`Encryption key must be 32 bytes long`);\n }\n\n async getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal): Promise<string> {\n try {\n const fileStream = await this.getChunkReadStream(pauseSignal);\n\n const hash = crypto.createHash(`md5`);\n\n await pipeline(fileStream, hash);\n\n return hash.digest(format);\n }\n catch (error) {\n throw new FsError(`ComputingFileMd5ChecksumException`, { cause: error as Error });\n }\n finally {\n if (!this.isReleased)\n await this.release();\n }\n }\n\n async getChunkReadStream(pauseSignal?: PauseSignal): Promise<ReadableStream> {\n try {\n if (!this.isReleased)\n await this.release();\n\n this.#fileReadHandle = await fs.open(this.#fullFilePath, fsConsts.O_RDONLY);\n\n this.#fileReadStream = this.#fileReadHandle.createReadStream({\n start: this.chunkStartPosition,\n end: this.getChunkEndPosition(),\n });\n\n this.#fileReadPassThroughStream = new PassThrough();\n\n if (this.#encryptionData) {\n this.#fileReadCipherStream = createCipher(\n Buffer.from(this.#encryptionData.key),\n Buffer.from(this.#encryptionData.iv),\n this.chunkStartPosition,\n ) as Transform;\n this.#fileReadStream.pipe(this.#fileReadCipherStream).pipe(this.#fileReadPassThroughStream);\n }\n else\n this.#fileReadStream.pipe(this.#fileReadPassThroughStream);\n\n this.registerPauseListener(pauseSignal);\n\n return ReadableStream.from(this.#fileReadPassThroughStream);\n }\n catch (error) {\n if (!this.isReleased)\n await this.release();\n\n throw new FsError(`CreatingFileReadStreamException`, { cause: error as Error });\n }\n }\n\n getChunkBlob(): Promise<Blob> {\n throw new Error(`Not implemented for NodeJS`);\n }\n\n private getChunkEndPosition() {\n if (this.chunkLengthInBytes === 0)\n return this.chunkStartPosition;\n\n return this.chunkStartPosition + this.chunkLengthInBytes - 1;\n }\n\n async getChunkWriteStream(): Promise<{ fileStream: Writable, decipherStream?: Writable }> {\n try {\n if (!this.isReleased)\n await this.release();\n\n this.#fileWriteHandle = await fs.open(this.#fullFilePath, fsConsts.O_WRONLY);\n\n this.#fileWriteStream = this.#fileWriteHandle.createWriteStream({\n start: this.chunkStartPosition,\n });\n\n if (!this.#encryptionData)\n return { fileStream: this.#fileWriteStream };\n\n this.#fileWriteDecipherStream = createDecipher(\n Buffer.from(this.#encryptionData.key),\n Buffer.from(this.#encryptionData.iv),\n this.chunkStartPosition,\n ) as Transform;\n\n return { fileStream: this.#fileWriteStream, decipherStream: this.#fileWriteDecipherStream };\n }\n catch (error) {\n if (!this.isReleased)\n await this.release();\n\n throw new FsError(`CreatingFileWriteStreamException`, { cause: error as Error });\n }\n }\n\n async release(): Promise<void> {\n this.cleanupPauseListener();\n\n await Promise.allSettled([\n this.closeHandle(this.#fileReadHandle),\n this.destroyStream(this.#fileReadStream),\n this.destroyStream(this.#fileReadCipherStream),\n this.destroyStream(this.#fileReadPassThroughStream),\n this.closeHandle(this.#fileWriteHandle),\n this.destroyStream(this.#fileWriteStream),\n this.destroyStream(this.#fileWriteDecipherStream),\n ]);\n\n this.#fileReadHandle = null;\n this.#fileReadStream = null;\n this.#fileReadCipherStream = null;\n this.#fileReadPassThroughStream = null;\n this.#fileWriteHandle = null;\n this.#fileWriteStream = null;\n this.#fileWriteDecipherStream = null;\n }\n\n private registerPauseListener(pauseSignal?: PauseSignal) {\n this.cleanupPauseListener();\n\n if (!pauseSignal)\n return;\n\n this.#pauseSignal = pauseSignal;\n\n this.#pauseListener = () => {\n this.#fileReadStream?.destroy();\n this.#fileReadCipherStream?.destroy();\n this.#fileReadPassThroughStream?.end();\n };\n\n this.#pauseSignal.addEventListener(`pause`, this.#pauseListener);\n }\n\n private cleanupPauseListener() {\n if (!this.#pauseSignal || !this.#pauseListener)\n return;\n\n this.#pauseSignal.removeEventListener(`pause`, this.#pauseListener);\n\n this.#pauseSignal = undefined;\n this.#pauseListener = undefined;\n }\n\n private closeHandle = async (handle: fs.FileHandle | null): Promise<void> => {\n if (!handle)\n return;\n\n try {\n await handle.close();\n }\n catch { /* ignore errors during handle closing */ }\n };\n\n private destroyStream = async (stream: ReadStream | Writable | Transform | PassThrough | null): Promise<void> => {\n if (!stream || stream.destroyed)\n return;\n\n stream.once(`error`, () => { /* absorb premature close errors */ });\n const finishPromise = finished(stream).catch(() => { /* safely ignore */ });\n stream.destroy();\n await finishPromise;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nodeChunkStreamProvider.js","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeChunkStreamProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs/promises\";\r\nimport fsSync, { ReadStream, WriteStream, constants as fsConsts } from \"fs\";\r\nimport crypto from \"crypto\";\r\nimport { pipeline, finished } from \"stream/promises\";\r\nimport { PassThrough, Transform } from \"stream\";\r\n\r\nimport { ReadableStream } from \"stream/web\";\r\nimport type { Writable } from \"stream\";\r\n\r\nimport { createCipher, createDecipher } from 'aes-ctr-concurrent';\r\n\r\nimport FsError from '../fsError.js';\r\n\r\nimport type ChunkStreamProvider from \"../chunkStreamProvider.js\";\r\nimport type { PauseSignal } from \"../../../uploader/pauseController.js\";\r\nimport type { ChunkStreamProviderEncryptionData } from \"../chunkStreamProvider.js\";\r\n\r\nexport default class NodeChunkStreamProvider implements ChunkStreamProvider {\r\n readonly chunkStartPosition: number;\r\n readonly chunkLengthInBytes: number;\r\n\r\n readonly #encryptionData?: ChunkStreamProviderEncryptionData;\r\n readonly #fullFilePath: string;\r\n\r\n #fileReadStream: ReadStream | null = null;\r\n #fileReadCipherStream: Transform | null = null;\r\n #fileReadPassThroughStream: PassThrough | null = null;\r\n #fileWriteHandle: fs.FileHandle | null = null;\r\n #fileWriteStream: WriteStream | null = null;\r\n #fileWriteDecipherStream: Transform | null = null;\r\n #fileReadStreamErrorListener: ((error: Error) => void) | undefined;\r\n #fileReadCipherStreamErrorListener: ((error: Error) => void) | undefined;\r\n #pauseSignal: PauseSignal | undefined;\r\n #pauseListener: (() => void) | undefined;\r\n #abortSignal: AbortSignal | undefined;\r\n #abortListener: (() => void) | undefined;\r\n\r\n get isReleased(): boolean {\r\n const isFileReadStreamReleased = this.#fileReadStream?.destroyed ?? true;\r\n const isFileReadCipherStreamReleased = this.#fileReadCipherStream?.destroyed ?? true;\r\n const isFileReadPassThroughStreamReleased = this.#fileReadPassThroughStream?.destroyed ?? true;\r\n const isFileWriteHandleReleased = this.#fileWriteHandle === null;\r\n const isFileWriteStreamReleased = this.#fileWriteStream?.destroyed ?? true;\r\n const isFileWriteDecipherStreamReleased = this.#fileWriteDecipherStream?.destroyed ?? true;\r\n\r\n return isFileReadStreamReleased && isFileReadCipherStreamReleased\r\n && isFileReadPassThroughStreamReleased && isFileWriteStreamReleased && isFileWriteDecipherStreamReleased\r\n && isFileWriteHandleReleased;\r\n }\r\n\r\n constructor(fullFilePath: string, chunkStartPosition: number, chunkLengthInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined) {\r\n this.throwIfEncryptionDataIsNotValid(encryptionData);\r\n\r\n this.#fullFilePath = fullFilePath;\r\n this.#encryptionData = encryptionData;\r\n this.chunkStartPosition = chunkStartPosition;\r\n\r\n if (chunkLengthInBytes < 0)\r\n throw new FsError(`chunkLengthInBytes can't be a negative value`);\r\n\r\n this.chunkLengthInBytes = chunkLengthInBytes;\r\n }\r\n\r\n private throwIfEncryptionDataIsNotValid(encryptionData: ChunkStreamProviderEncryptionData | undefined) {\r\n if (!encryptionData)\r\n return;\r\n\r\n if (encryptionData.iv.length !== 16)\r\n throw new FsError(`Encryption IV must be 16 bytes long`);\r\n if (encryptionData.key.length !== 32)\r\n throw new FsError(`Encryption key must be 32 bytes long`);\r\n }\r\n\r\n async getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string> {\r\n try {\r\n const fileStream = await this.getChunkReadStream(pauseSignal, abortSignal);\r\n\r\n const hash = crypto.createHash(`md5`);\r\n\r\n await pipeline(fileStream, hash);\r\n\r\n return hash.digest(format);\r\n }\r\n catch (error) {\r\n if (abortSignal?.aborted)\r\n throw this.createAbortError(abortSignal);\r\n\r\n if (error instanceof FsError)\r\n throw error;\r\n\r\n throw new FsError(`ComputingFileMd5ChecksumException`, { cause: error as Error });\r\n }\r\n finally {\r\n if (!this.isReleased)\r\n await this.release();\r\n }\r\n }\r\n\r\n async getChunkReadStream(pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<ReadableStream> {\r\n try {\r\n if (!this.isReleased)\r\n await this.release();\r\n\r\n await this.throwIfFileDoesNotExist(abortSignal);\r\n\r\n this.#fileReadStream = fsSync.createReadStream(this.#fullFilePath, {\r\n start: this.chunkStartPosition,\r\n end: this.getChunkEndPosition(),\r\n });\r\n\r\n this.#fileReadPassThroughStream = new PassThrough();\r\n\r\n if (this.#encryptionData) {\r\n this.#fileReadCipherStream = createCipher(\r\n Buffer.from(this.#encryptionData.key),\r\n Buffer.from(this.#encryptionData.iv),\r\n this.chunkStartPosition,\r\n ) as Transform;\r\n }\r\n\r\n this.registerReadErrorListeners();\r\n\r\n if (this.#fileReadCipherStream)\r\n this.#fileReadStream.pipe(this.#fileReadCipherStream).pipe(this.#fileReadPassThroughStream);\r\n else\r\n this.#fileReadStream.pipe(this.#fileReadPassThroughStream);\r\n\r\n this.registerInterruptListeners(pauseSignal, abortSignal);\r\n\r\n return ReadableStream.from(this.#fileReadPassThroughStream);\r\n }\r\n catch (error) {\r\n if (!this.isReleased)\r\n await this.release();\r\n\r\n if (abortSignal?.aborted)\r\n throw this.createAbortError(abortSignal);\r\n\r\n throw new FsError(`CreatingFileReadStreamException`, { cause: error as Error });\r\n }\r\n }\r\n\r\n getChunkBlob(): Promise<Blob> {\r\n throw new Error(`Not implemented for NodeJS`);\r\n }\r\n\r\n private getChunkEndPosition() {\r\n if (this.chunkLengthInBytes === 0)\r\n return this.chunkStartPosition;\r\n\r\n return this.chunkStartPosition + this.chunkLengthInBytes - 1;\r\n }\r\n\r\n async getChunkWriteStream(): Promise<{ fileStream: Writable, decipherStream?: Writable }> {\r\n try {\r\n if (!this.isReleased)\r\n await this.release();\r\n\r\n this.#fileWriteHandle = await fs.open(this.#fullFilePath, fsConsts.O_WRONLY);\r\n\r\n this.#fileWriteStream = this.#fileWriteHandle.createWriteStream({\r\n start: this.chunkStartPosition,\r\n });\r\n\r\n if (!this.#encryptionData)\r\n return { fileStream: this.#fileWriteStream };\r\n\r\n this.#fileWriteDecipherStream = createDecipher(\r\n Buffer.from(this.#encryptionData.key),\r\n Buffer.from(this.#encryptionData.iv),\r\n this.chunkStartPosition,\r\n ) as Transform;\r\n\r\n return { fileStream: this.#fileWriteStream, decipherStream: this.#fileWriteDecipherStream };\r\n }\r\n catch (error) {\r\n if (!this.isReleased)\r\n await this.release();\r\n\r\n throw new FsError(`CreatingFileWriteStreamException`, { cause: error as Error });\r\n }\r\n }\r\n\r\n async release(): Promise<void> {\r\n this.cleanupInterruptListeners();\r\n this.cleanupReadErrorListeners();\r\n\r\n await Promise.allSettled([\r\n this.destroyStream(this.#fileReadStream),\r\n this.destroyStream(this.#fileReadCipherStream),\r\n this.destroyStream(this.#fileReadPassThroughStream),\r\n this.closeHandle(this.#fileWriteHandle),\r\n this.destroyStream(this.#fileWriteStream),\r\n this.destroyStream(this.#fileWriteDecipherStream),\r\n ]);\r\n\r\n this.#fileReadStream = null;\r\n this.#fileReadCipherStream = null;\r\n this.#fileReadPassThroughStream = null;\r\n this.#fileWriteHandle = null;\r\n this.#fileWriteStream = null;\r\n this.#fileWriteDecipherStream = null;\r\n }\r\n\r\n private registerInterruptListeners(pauseSignal?: PauseSignal, abortSignal?: AbortSignal) {\r\n this.cleanupInterruptListeners();\r\n\r\n const interruptReadStream = (error?: Error) => {\r\n this.#fileReadStream?.destroy();\r\n this.#fileReadCipherStream?.destroy();\r\n this.#fileReadPassThroughStream?.destroy(error);\r\n };\r\n\r\n if (pauseSignal) {\r\n this.#pauseSignal = pauseSignal;\r\n this.#pauseListener = () => interruptReadStream();\r\n this.#pauseSignal.addEventListener(`pause`, this.#pauseListener);\r\n }\r\n\r\n if (abortSignal) {\r\n this.#abortSignal = abortSignal;\r\n this.#abortListener = () => interruptReadStream(this.createAbortError(abortSignal));\r\n this.#abortSignal.addEventListener(`abort`, this.#abortListener);\r\n }\r\n }\r\n\r\n private cleanupInterruptListeners() {\r\n if (this.#pauseSignal && this.#pauseListener)\r\n this.#pauseSignal.removeEventListener(`pause`, this.#pauseListener);\r\n\r\n if (this.#abortSignal && this.#abortListener)\r\n this.#abortSignal.removeEventListener(`abort`, this.#abortListener);\r\n\r\n this.#pauseSignal = undefined;\r\n this.#pauseListener = undefined;\r\n this.#abortSignal = undefined;\r\n this.#abortListener = undefined;\r\n }\r\n\r\n private registerReadErrorListeners() {\r\n this.cleanupReadErrorListeners();\r\n\r\n const propagateReadError = (error: Error) => {\r\n if (this.#abortSignal?.aborted) {\r\n this.#fileReadPassThroughStream?.destroy(this.createAbortError(this.#abortSignal));\r\n return;\r\n }\r\n\r\n this.#fileReadPassThroughStream?.destroy(new FsError(`CreatingFileReadStreamException`, { cause: error }));\r\n };\r\n\r\n if (this.#fileReadStream) {\r\n this.#fileReadStreamErrorListener = propagateReadError;\r\n this.#fileReadStream.on(`error`, this.#fileReadStreamErrorListener);\r\n }\r\n\r\n if (this.#fileReadCipherStream) {\r\n this.#fileReadCipherStreamErrorListener = propagateReadError;\r\n this.#fileReadCipherStream.on(`error`, this.#fileReadCipherStreamErrorListener);\r\n }\r\n }\r\n\r\n private cleanupReadErrorListeners() {\r\n if (this.#fileReadStream && this.#fileReadStreamErrorListener)\r\n this.#fileReadStream.removeListener(`error`, this.#fileReadStreamErrorListener);\r\n\r\n if (this.#fileReadCipherStream && this.#fileReadCipherStreamErrorListener)\r\n this.#fileReadCipherStream.removeListener(`error`, this.#fileReadCipherStreamErrorListener);\r\n\r\n this.#fileReadStreamErrorListener = undefined;\r\n this.#fileReadCipherStreamErrorListener = undefined;\r\n }\r\n\r\n private async throwIfFileDoesNotExist(abortSignal?: AbortSignal) {\r\n let fileReadHandle: fs.FileHandle | null = null;\r\n\r\n try {\r\n fileReadHandle = await this.awaitAbortable(fs.open(this.#fullFilePath, fsConsts.O_RDONLY), abortSignal);\r\n }\r\n finally {\r\n await this.closeHandle(fileReadHandle);\r\n }\r\n }\r\n\r\n private async awaitAbortable<T>(promise: Promise<T>, abortSignal?: AbortSignal): Promise<T> {\r\n if (!abortSignal)\r\n return await promise;\r\n\r\n if (abortSignal.aborted)\r\n throw this.createAbortError(abortSignal);\r\n\r\n return await new Promise<T>((resolve, reject) => {\r\n let isSettled = false;\r\n\r\n const cleanup = () => {\r\n abortSignal.removeEventListener(`abort`, abortListener);\r\n };\r\n\r\n const resolveOnce = (value: T) => {\r\n if (isSettled)\r\n return;\r\n\r\n isSettled = true;\r\n cleanup();\r\n resolve(value);\r\n };\r\n\r\n const rejectOnce = (error: unknown) => {\r\n if (isSettled)\r\n return;\r\n\r\n isSettled = true;\r\n cleanup();\r\n reject(error);\r\n };\r\n\r\n const abortListener = () => {\r\n rejectOnce(this.createAbortError(abortSignal));\r\n };\r\n\r\n abortSignal.addEventListener(`abort`, abortListener);\r\n\r\n promise\r\n .then(resolveOnce)\r\n .catch(rejectOnce);\r\n });\r\n }\r\n\r\n private createAbortError(abortSignal: AbortSignal) {\r\n if (abortSignal.reason instanceof Error)\r\n return abortSignal.reason;\r\n\r\n return new Error(`Aborted`);\r\n }\r\n\r\n private closeHandle = async (handle: fs.FileHandle | null): Promise<void> => {\r\n if (!handle)\r\n return;\r\n\r\n try {\r\n await handle.close();\r\n }\r\n catch { /* ignore errors during handle closing */ }\r\n };\r\n\r\n private destroyStream = async (stream: ReadStream | Writable | Transform | PassThrough | null): Promise<void> => {\r\n if (!stream || stream.destroyed)\r\n return;\r\n\r\n stream.once(`error`, () => { /* absorb premature close errors */ });\r\n const finishPromise = finished(stream).catch(() => { /* safely ignore */ });\r\n stream.destroy();\r\n await finishPromise;\r\n };\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeChunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeChunkStreamProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAMnE,MAAM,CAAC,OAAO,OAAO,8BAA8B;IAC/C,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY,EAAE,cAA6D;QAC5G,OAAO,IAAI,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1E,CAAC;CACJ","sourcesContent":["import NodeChunkStreamProvider from \"./nodeChunkStreamProvider.js\";\n\nimport type ChunkStreamProvider from \"../chunkStreamProvider.js\";\nimport type ChunkStreamProviderFactory from \"../chunkStreamProviderFactory.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../chunkStreamProvider.js\";\n\nexport default class NodeChunkStreamProviderFactory implements ChunkStreamProviderFactory<string> {\n provide(file: string, start: number, size: number, encryptionData: ChunkStreamProviderEncryptionData | undefined): ChunkStreamProvider {\n return new NodeChunkStreamProvider(file, start, size, encryptionData);\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"nodeChunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeChunkStreamProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAMnE,MAAM,CAAC,OAAO,OAAO,8BAA8B;IAC/C,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY,EAAE,cAA6D;QAC5G,OAAO,IAAI,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1E,CAAC;CACJ","sourcesContent":["import NodeChunkStreamProvider from \"./nodeChunkStreamProvider.js\";\r\n\r\nimport type ChunkStreamProvider from \"../chunkStreamProvider.js\";\r\nimport type ChunkStreamProviderFactory from \"../chunkStreamProviderFactory.js\";\r\nimport type { ChunkStreamProviderEncryptionData } from \"../chunkStreamProvider.js\";\r\n\r\nexport default class NodeChunkStreamProviderFactory implements ChunkStreamProviderFactory<string> {\r\n provide(file: string, start: number, size: number, encryptionData: ChunkStreamProviderEncryptionData | undefined): ChunkStreamProvider {\r\n return new NodeChunkStreamProvider(file, start, size, encryptionData);\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeFileDetails.js","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeFileDetails.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAE3C,OAAO,OAAO,MAAM,eAAe,CAAC;AACpC,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAKnE,MAAM,CAAC,OAAO,OAAO,eAAe;IACvB,UAAU,CAAkB;IAC5B,YAAY,CAAS;IACrB,eAAe,CAAS;IACxB,QAAQ,CAAS;IACjB,6BAA6B,CAAS;IAE/C,YAAoB,UAA2B,EAAE,YAAoB,EAAE,6BAAqC,EAAE,QAAgB;QAC1H,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,6BAA6B,GAAG,6BAA6B,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAA2B,EAAE,YAAoB,EAAE,6BAAqC;QACxG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAEtD,OAAO,IAAI,eAAe,CAAC,UAAU,EAAE,YAAY,EAAE,6BAA6B,EAAE,QAAQ,CAAC,CAAC;IAClG,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,YAAoB;QACjD,IAAI,UAAU,GAAyB,IAAI,CAAC;QAE5C,IAAI,CAAC;YACD,UAAU,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAE5D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAE1C,OAAO,SAAS,CAAC,IAAI,CAAC;QAC1B,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,OAAO,CAAC,oBAAoB,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAC;QACrF,CAAC;gBACO,CAAC;YACL,UAAU,EAAE,KAAK,EAAE,CAAC;QACxB,CAAC;IACL,CAAC;IAED,yBAAyB,CAAC,aAAqB,EAAE,WAAmB;QAChE,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IACjG,CAAC;CACJ","sourcesContent":["import path from 'path';\nimport fs from 'fs/promises';\nimport { constants as fsConsts } from 'fs';\n\nimport FsError from '../fsError.js';\nimport NodeChunkStreamProvider from './nodeChunkStreamProvider.js';\n\nimport type FileDetails from \"../fileDetails.js\";\nimport type ChunkStreamProvider from '../chunkStreamProvider.js';\n\nexport default class NodeFileDetails implements FileDetails {\n readonly externalId: string | number;\n readonly fileFullPath: string;\n readonly fileSizeInBytes: number;\n readonly fileName: string;\n readonly fileDestinationPathInTransfer: string;\n\n private constructor(externalId: string | number, fileFullPath: string, fileDestinationPathInTransfer: string, fileSize: number) {\n this.externalId = externalId;\n this.fileFullPath = fileFullPath;\n this.fileSizeInBytes = fileSize;\n this.fileName = path.basename(fileFullPath);\n this.fileDestinationPathInTransfer = fileDestinationPathInTransfer;\n }\n\n static async create(externalId: string | number, fileFullPath: string, fileDestinationPathInTransfer: string): Promise<NodeFileDetails> {\n const fileSize = await this.getFileSize(fileFullPath);\n\n return new NodeFileDetails(externalId, fileFullPath, fileDestinationPathInTransfer, fileSize);\n }\n\n private static async getFileSize(fullFilePath: string): Promise<number> {\n let fileHandle: fs.FileHandle | null = null;\n\n try {\n fileHandle = await fs.open(fullFilePath, fsConsts.O_RDONLY);\n\n const fileStats = await fileHandle.stat();\n\n return fileStats.size;\n }\n catch (error) {\n throw new FsError(`Can't read file: ${fullFilePath}`, { cause: error as Error });\n }\n finally {\n fileHandle?.close();\n }\n }\n\n createChunkStreamProvider(startPosition: number, sizeInBytes: number): ChunkStreamProvider { // TODO: Remove this after all customers moved to >= 4.7.2\n return new NodeChunkStreamProvider(this.fileFullPath, startPosition, sizeInBytes, undefined);\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"nodeFileDetails.js","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeFileDetails.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAE3C,OAAO,OAAO,MAAM,eAAe,CAAC;AACpC,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAKnE,MAAM,CAAC,OAAO,OAAO,eAAe;IACvB,UAAU,CAAkB;IAC5B,YAAY,CAAS;IACrB,eAAe,CAAS;IACxB,QAAQ,CAAS;IACjB,6BAA6B,CAAS;IAE/C,YAAoB,UAA2B,EAAE,YAAoB,EAAE,6BAAqC,EAAE,QAAgB;QAC1H,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,6BAA6B,GAAG,6BAA6B,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAA2B,EAAE,YAAoB,EAAE,6BAAqC;QACxG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAEtD,OAAO,IAAI,eAAe,CAAC,UAAU,EAAE,YAAY,EAAE,6BAA6B,EAAE,QAAQ,CAAC,CAAC;IAClG,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,YAAoB;QACjD,IAAI,UAAU,GAAyB,IAAI,CAAC;QAE5C,IAAI,CAAC;YACD,UAAU,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAE5D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAE1C,OAAO,SAAS,CAAC,IAAI,CAAC;QAC1B,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,OAAO,CAAC,oBAAoB,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAC;QACrF,CAAC;gBACO,CAAC;YACL,UAAU,EAAE,KAAK,EAAE,CAAC;QACxB,CAAC;IACL,CAAC;IAED,yBAAyB,CAAC,aAAqB,EAAE,WAAmB;QAChE,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IACjG,CAAC;CACJ","sourcesContent":["import path from 'path';\r\nimport fs from 'fs/promises';\r\nimport { constants as fsConsts } from 'fs';\r\n\r\nimport FsError from '../fsError.js';\r\nimport NodeChunkStreamProvider from './nodeChunkStreamProvider.js';\r\n\r\nimport type FileDetails from \"../fileDetails.js\";\r\nimport type ChunkStreamProvider from '../chunkStreamProvider.js';\r\n\r\nexport default class NodeFileDetails implements FileDetails {\r\n readonly externalId: string | number;\r\n readonly fileFullPath: string;\r\n readonly fileSizeInBytes: number;\r\n readonly fileName: string;\r\n readonly fileDestinationPathInTransfer: string;\r\n\r\n private constructor(externalId: string | number, fileFullPath: string, fileDestinationPathInTransfer: string, fileSize: number) {\r\n this.externalId = externalId;\r\n this.fileFullPath = fileFullPath;\r\n this.fileSizeInBytes = fileSize;\r\n this.fileName = path.basename(fileFullPath);\r\n this.fileDestinationPathInTransfer = fileDestinationPathInTransfer;\r\n }\r\n\r\n static async create(externalId: string | number, fileFullPath: string, fileDestinationPathInTransfer: string): Promise<NodeFileDetails> {\r\n const fileSize = await this.getFileSize(fileFullPath);\r\n\r\n return new NodeFileDetails(externalId, fileFullPath, fileDestinationPathInTransfer, fileSize);\r\n }\r\n\r\n private static async getFileSize(fullFilePath: string): Promise<number> {\r\n let fileHandle: fs.FileHandle | null = null;\r\n\r\n try {\r\n fileHandle = await fs.open(fullFilePath, fsConsts.O_RDONLY);\r\n\r\n const fileStats = await fileHandle.stat();\r\n\r\n return fileStats.size;\r\n }\r\n catch (error) {\r\n throw new FsError(`Can't read file: ${fullFilePath}`, { cause: error as Error });\r\n }\r\n finally {\r\n fileHandle?.close();\r\n }\r\n }\r\n\r\n createChunkStreamProvider(startPosition: number, sizeInBytes: number): ChunkStreamProvider { // TODO: Remove this after all customers moved to >= 4.7.2\r\n return new NodeChunkStreamProvider(this.fileFullPath, startPosition, sizeInBytes, undefined);\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeFileSystemService.js","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeFileSystemService.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs/promises';\nimport path from 'path';\nimport DownloadErrorCode from '../../../downloader/dtos/downloadErrorCode.js';\nimport type FileSystemService from \"../fileSystemService.js\";\nimport type ParsedPath from '../parsedPath.js';\n\nexport default class NodeFileSystemService implements FileSystemService {\n static async #readDirRecursive(folder: string, accumulator: Array<string>) {\n const paths = await fs.readdir(folder);\n for (const itemPath of paths) {\n const abs = path.join(folder, itemPath);\n // eslint-disable-next-line no-await-in-loop\n if ((await fs.stat(abs)).isDirectory())\n // eslint-disable-next-line no-await-in-loop\n await this.#readDirRecursive(abs, accumulator);\n else\n accumulator.push(abs);\n }\n }\n\n static #isFolderTheRoot(folder: string): boolean {\n const thisOne = path.normalize(folder);\n const oneUp = path.join(folder, `..`);\n return oneUp === thisOne || oneUp === path.sep;\n }\n\n async getAllFilePathsRecursive(folderPath: string): Promise<string[]> {\n const files = new Array<string>();\n await NodeFileSystemService.#readDirRecursive(folderPath, files);\n return files;\n }\n\n async writeFile(filePath: string, data: string, encoding: BufferEncoding = `utf8`, abort: AbortSignal | undefined = undefined): Promise<void> {\n await fs.writeFile(filePath, data, { encoding, flag: `w`, signal: abort });\n }\n\n async getAllFilePaths(folderPath: string): Promise<Array<string>> {\n return await fs.readdir(folderPath);\n }\n\n async readFileAsString(filePath: string, encoding: BufferEncoding = `utf8`, abort: AbortSignal | undefined = undefined): Promise<string> {\n return await fs.readFile(filePath, { encoding, flag: `r`, signal: abort });\n }\n\n async pathExists(thePath: string, checkReadWriteAccess?: boolean): Promise<boolean> {\n try {\n // eslint-disable-next-line no-bitwise\n const mode = checkReadWriteAccess ? (fs.constants.W_OK | fs.constants.R_OK) : fs.constants.F_OK;\n await fs.access(thePath, mode);\n return true;\n }\n catch {\n return false;\n }\n }\n\n async createFolder(folderPath: string): Promise<void> {\n if (NodeFileSystemService.#isFolderTheRoot(folderPath))\n // the requested directory is a root directory (e.g. F:\\ or /) - consider it as existing\n return;\n\n try {\n await fs.mkdir(folderPath, { recursive: true });\n }\n catch (err) {\n const dirErr = err as Error;\n\n if (dirErr && dirErr.code === `EEXIST`)\n // EEXIST error is OK - the requested directory already exists\n return;\n\n await this.mkdirRecursiveSafe(folderPath);\n }\n }\n\n private async mkdirRecursiveSafe(target: string): Promise<void> {\n const foldersChain: string[] = [];\n\n let currentFolder = target;\n\n while (true) {\n foldersChain.push(currentFolder);\n\n const parent = path.dirname(currentFolder);\n\n if (parent === currentFolder)\n break;\n\n currentFolder = parent;\n }\n\n foldersChain.reverse();\n\n for (const dir of foldersChain) {\n if (NodeFileSystemService.#isFolderTheRoot(dir))\n continue; // the requested directory is a root directory (e.g. F:\\ or /) - consider it as existing\n try {\n // eslint-disable-next-line no-await-in-loop\n await fs.mkdir(dir);\n }\n catch (err: any) {\n if (err?.code !== `EEXIST`) // EEXIST error is OK - the requested directory already exists\n throw err;\n }\n }\n }\n\n async createFile(filePath: string, overwriteExisting: boolean): Promise<boolean> {\n // Check if file folder exists and create if it doesn't\n const folder = path.dirname(filePath);\n await this.createFolder(folder);\n\n // Open the file for writing\n // overwriteExisting === true --> 'w' creates the file (if it doesn't exist) or truncates it (if it exists)\n // overwriteExisting === false --> 'wx' creates the file (if it doesn't exist) or fails (if it exists)\n const openMode = overwriteExisting ? `w` : `wx`;\n let handle: fs.FileHandle | null = null;\n try {\n try {\n handle = await fs.open(filePath, openMode);\n }\n catch (err) {\n const fileErr = err as Error;\n if (fileErr && fileErr.code === `EEXIST`)\n return false;\n\n throw err;\n }\n\n return true;\n }\n finally {\n if (handle !== null)\n await handle.close();\n }\n }\n\n async deleteFile(filePath: string): Promise<boolean> {\n try {\n await fs.rm(filePath);\n return true;\n }\n catch {\n return false;\n }\n }\n\n async folderIsEmpty(folderPath: string): Promise<boolean> {\n const contents = await fs.readdir(folderPath);\n return contents.length === 0;\n }\n\n async deleteFolder(folderPath: string): Promise<boolean> {\n return (await fs.rm(folderPath, { recursive: true, force: true })) === undefined;\n }\n\n async getFileSize(filePath: string): Promise<number> {\n const stat = await fs.stat(filePath);\n return stat.size;\n }\n\n async truncateFile(filePath: string, size: number): Promise<void> {\n await fs.truncate(filePath, size);\n }\n\n async renameFile(oldPath: string, newPath: string): Promise<void> {\n await fs.rename(oldPath, newPath);\n }\n\n async getAvailableDiskSpace(pathToCheck: string): Promise<bigint> {\n const stats = await fs.statfs(pathToCheck, { bigint: true });\n return stats.bavail * stats.bsize;\n }\n\n pathJoin(...paths: Array<string>): string {\n return path.join(...paths);\n }\n\n fileErrorToDownloadErrorCode(error: Error): DownloadErrorCode | undefined {\n if (NodeFileSystemService.#extractErrorCode(error) === `ENOSPC`)\n return DownloadErrorCode.DiskFull;\n\n return undefined;\n }\n\n static #extractErrorCode(error: unknown): string | undefined {\n let current = error as { code?: string, cause?: unknown } | undefined;\n\n for (let depth = 0; depth < 8 && current; depth++) {\n if (typeof current.code === `string`)\n return current.code;\n\n current = current.cause as { code?: string, cause?: unknown } | undefined;\n }\n\n return undefined;\n }\n\n parseFilePath(filePath: string): ParsedPath {\n return path.parse(filePath);\n }\n\n formatFilePath(parsedPath: ParsedPath): string {\n return path.format(parsedPath);\n }\n\n replaceFilenameInPath(filePath: string, newFileName: string): string {\n const parsed = path.parse(filePath);\n return path.format({\n dir: parsed.dir,\n base: newFileName,\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nodeFileSystemService.js","sourceRoot":"","sources":["../../../../../src/utils/fileSystem/node/nodeFileSystemService.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs/promises';\r\nimport path from 'path';\r\nimport DownloadErrorCode from '../../../downloader/dtos/downloadErrorCode.js';\r\nimport type FileSystemService from \"../fileSystemService.js\";\r\nimport type ParsedPath from '../parsedPath.js';\r\n\r\nexport default class NodeFileSystemService implements FileSystemService {\r\n static async #readDirRecursive(folder: string, accumulator: Array<string>) {\r\n const paths = await fs.readdir(folder);\r\n for (const itemPath of paths) {\r\n const abs = path.join(folder, itemPath);\r\n // eslint-disable-next-line no-await-in-loop\r\n if ((await fs.stat(abs)).isDirectory())\r\n // eslint-disable-next-line no-await-in-loop\r\n await this.#readDirRecursive(abs, accumulator);\r\n else\r\n accumulator.push(abs);\r\n }\r\n }\r\n\r\n static #isFolderTheRoot(folder: string): boolean {\r\n const thisOne = path.normalize(folder);\r\n const oneUp = path.join(folder, `..`);\r\n return oneUp === thisOne || oneUp === path.sep;\r\n }\r\n\r\n async getAllFilePathsRecursive(folderPath: string): Promise<string[]> {\r\n const files = new Array<string>();\r\n await NodeFileSystemService.#readDirRecursive(folderPath, files);\r\n return files;\r\n }\r\n\r\n async writeFile(filePath: string, data: string, encoding: BufferEncoding = `utf8`, abort: AbortSignal | undefined = undefined): Promise<void> {\r\n await fs.writeFile(filePath, data, { encoding, flag: `w`, signal: abort });\r\n }\r\n\r\n async getAllFilePaths(folderPath: string): Promise<Array<string>> {\r\n return await fs.readdir(folderPath);\r\n }\r\n\r\n async readFileAsString(filePath: string, encoding: BufferEncoding = `utf8`, abort: AbortSignal | undefined = undefined): Promise<string> {\r\n return await fs.readFile(filePath, { encoding, flag: `r`, signal: abort });\r\n }\r\n\r\n async pathExists(thePath: string, checkReadWriteAccess?: boolean): Promise<boolean> {\r\n try {\r\n // eslint-disable-next-line no-bitwise\r\n const mode = checkReadWriteAccess ? (fs.constants.W_OK | fs.constants.R_OK) : fs.constants.F_OK;\r\n await fs.access(thePath, mode);\r\n return true;\r\n }\r\n catch {\r\n return false;\r\n }\r\n }\r\n\r\n async createFolder(folderPath: string): Promise<void> {\r\n if (NodeFileSystemService.#isFolderTheRoot(folderPath))\r\n // the requested directory is a root directory (e.g. F:\\ or /) - consider it as existing\r\n return;\r\n\r\n try {\r\n await fs.mkdir(folderPath, { recursive: true });\r\n }\r\n catch (err) {\r\n const dirErr = err as Error;\r\n\r\n if (dirErr && dirErr.code === `EEXIST`)\r\n // EEXIST error is OK - the requested directory already exists\r\n return;\r\n\r\n await this.mkdirRecursiveSafe(folderPath);\r\n }\r\n }\r\n\r\n private async mkdirRecursiveSafe(target: string): Promise<void> {\r\n const foldersChain: string[] = [];\r\n\r\n let currentFolder = target;\r\n\r\n while (true) {\r\n foldersChain.push(currentFolder);\r\n\r\n const parent = path.dirname(currentFolder);\r\n\r\n if (parent === currentFolder)\r\n break;\r\n\r\n currentFolder = parent;\r\n }\r\n\r\n foldersChain.reverse();\r\n\r\n for (const dir of foldersChain) {\r\n if (NodeFileSystemService.#isFolderTheRoot(dir))\r\n continue; // the requested directory is a root directory (e.g. F:\\ or /) - consider it as existing\r\n try {\r\n // eslint-disable-next-line no-await-in-loop\r\n await fs.mkdir(dir);\r\n }\r\n catch (err: any) {\r\n if (err?.code !== `EEXIST`) // EEXIST error is OK - the requested directory already exists\r\n throw err;\r\n }\r\n }\r\n }\r\n\r\n async createFile(filePath: string, overwriteExisting: boolean): Promise<boolean> {\r\n // Check if file folder exists and create if it doesn't\r\n const folder = path.dirname(filePath);\r\n await this.createFolder(folder);\r\n\r\n // Open the file for writing\r\n // overwriteExisting === true --> 'w' creates the file (if it doesn't exist) or truncates it (if it exists)\r\n // overwriteExisting === false --> 'wx' creates the file (if it doesn't exist) or fails (if it exists)\r\n const openMode = overwriteExisting ? `w` : `wx`;\r\n let handle: fs.FileHandle | null = null;\r\n try {\r\n try {\r\n handle = await fs.open(filePath, openMode);\r\n }\r\n catch (err) {\r\n const fileErr = err as Error;\r\n if (fileErr && fileErr.code === `EEXIST`)\r\n return false;\r\n\r\n throw err;\r\n }\r\n\r\n return true;\r\n }\r\n finally {\r\n if (handle !== null)\r\n await handle.close();\r\n }\r\n }\r\n\r\n async deleteFile(filePath: string): Promise<boolean> {\r\n try {\r\n await fs.rm(filePath);\r\n return true;\r\n }\r\n catch {\r\n return false;\r\n }\r\n }\r\n\r\n async folderIsEmpty(folderPath: string): Promise<boolean> {\r\n const contents = await fs.readdir(folderPath);\r\n return contents.length === 0;\r\n }\r\n\r\n async deleteFolder(folderPath: string): Promise<boolean> {\r\n return (await fs.rm(folderPath, { recursive: true, force: true })) === undefined;\r\n }\r\n\r\n async getFileSize(filePath: string): Promise<number> {\r\n const stat = await fs.stat(filePath);\r\n return stat.size;\r\n }\r\n\r\n async truncateFile(filePath: string, size: number): Promise<void> {\r\n await fs.truncate(filePath, size);\r\n }\r\n\r\n async renameFile(oldPath: string, newPath: string): Promise<void> {\r\n await fs.rename(oldPath, newPath);\r\n }\r\n\r\n async getAvailableDiskSpace(pathToCheck: string): Promise<bigint> {\r\n const stats = await fs.statfs(pathToCheck, { bigint: true });\r\n return stats.bavail * stats.bsize;\r\n }\r\n\r\n pathJoin(...paths: Array<string>): string {\r\n return path.join(...paths);\r\n }\r\n\r\n fileErrorToDownloadErrorCode(error: Error): DownloadErrorCode | undefined {\r\n if (NodeFileSystemService.#extractErrorCode(error) === `ENOSPC`)\r\n return DownloadErrorCode.DiskFull;\r\n\r\n return undefined;\r\n }\r\n\r\n static #extractErrorCode(error: unknown): string | undefined {\r\n let current = error as { code?: string, cause?: unknown } | undefined;\r\n\r\n for (let depth = 0; depth < 8 && current; depth++) {\r\n if (typeof current.code === `string`)\r\n return current.code;\r\n\r\n current = current.cause as { code?: string, cause?: unknown } | undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n parseFilePath(filePath: string): ParsedPath {\r\n return path.parse(filePath);\r\n }\r\n\r\n formatFilePath(parsedPath: ParsedPath): string {\r\n return path.format(parsedPath);\r\n }\r\n\r\n replaceFilenameInPath(filePath: string, newFileName: string): string {\r\n const parsed = path.parse(filePath);\r\n return path.format({\r\n dir: parsed.dir,\r\n base: newFileName,\r\n });\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsedPath.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/parsedPath.ts"],"names":[],"mappings":"","sourcesContent":["interface ParsedPath {\n root?: string | undefined,\n dir?: string | undefined,\n base?: string | undefined,\n ext?: string | undefined,\n name?: string | undefined,\n}\n\nexport default ParsedPath;\n"]}
|
|
1
|
+
{"version":3,"file":"parsedPath.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/parsedPath.ts"],"names":[],"mappings":"","sourcesContent":["interface ParsedPath {\r\n root?: string | undefined,\r\n dir?: string | undefined,\r\n base?: string | undefined,\r\n ext?: string | undefined,\r\n name?: string | undefined,\r\n}\r\n\r\nexport default ParsedPath;\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webChunkStreamEncrypter.js","sourceRoot":"","sources":["../../../../../../src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamEncrypter.ts"],"names":[],"mappings":"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","sourcesContent":["const AES_BLOCK_SIZE_IN_BYTES = 16n;\nconst IV_MAX = 0xffffffffffffffffffffffffffffffffn;\nconst IV_OVERFLOW_MODULO = IV_MAX + 1n;\n\nexport default class WebChunkStreamEncrypter {\n chunkStartPosition: number;\n iv: Uint8Array;\n key: Uint8Array;\n chunkBlob: Blob;\n\n constructor(chunkStartPosition: number, iv: Uint8Array, key: Uint8Array, chunkBlob: Blob) {\n if (chunkStartPosition < 0)\n throw new Error(`Chunk start position can't be negative`);\n if (iv.length !== 16)\n throw new Error(`IV must be 16 bytes long`);\n if (key.length !== 32)\n throw new Error(`Key must be 32 bytes long`);\n if (!chunkBlob)\n throw new Error(`Chunk blob has to be defined`);\n\n this.chunkStartPosition = chunkStartPosition;\n this.iv = iv;\n this.key = key;\n this.chunkBlob = chunkBlob;\n }\n\n async encryptBlob() {\n const chunkBuffer = await this.chunkBlob.arrayBuffer();\n const chunkBytesArray = new Uint8Array(chunkBuffer);\n\n const fullAesBlocksIncrement = BigInt(this.chunkStartPosition) / AES_BLOCK_SIZE_IN_BYTES;\n const incrementedIv = this.incrementIvByFullBlocks(this.iv, fullAesBlocksIncrement);\n const keyBytes = this.ensureArrayBuffer(this.key);\n const counterBytes = this.ensureArrayBuffer(incrementedIv);\n\n // AES works on blocks but it might happen that our chunk starts within an encryption block\n // so we need to append some zeros at the beginning of the block and do the encryption\n // and then discard these leading extra bytes\n const aesBlockOffset = this.chunkStartPosition % Number(AES_BLOCK_SIZE_IN_BYTES);\n\n const chunkDataPrefixedWithZeros = new Uint8Array(aesBlockOffset + chunkBytesArray.length);\n chunkDataPrefixedWithZeros.set(chunkBytesArray, aesBlockOffset);\n\n const cryptoKey = await crypto.subtle.importKey(`raw`, keyBytes, { name: `AES-CTR` }, false, [`encrypt`]);\n\n const encryptedDataBuffer = await crypto.subtle.encrypt(\n { name: `AES-CTR`, counter: counterBytes, length: 128 },\n cryptoKey,\n chunkDataPrefixedWithZeros.buffer,\n );\n\n // Remove the leading extra bytes\n const encryptedChunk = encryptedDataBuffer.slice(aesBlockOffset);\n\n return new Blob([encryptedChunk]);\n }\n\n private ensureArrayBuffer(value: Uint8Array): Uint8Array<ArrayBuffer> {\n if (value.buffer instanceof ArrayBuffer)\n return value as Uint8Array<ArrayBuffer>;\n\n return new Uint8Array(value) as Uint8Array<ArrayBuffer>;\n }\n\n private incrementIvByFullBlocks(originalIv: Uint8Array, fullBlocksToIncrement: bigint): Uint8Array {\n let ivBigInt = this.ivToBigInt(originalIv);\n\n ivBigInt += fullBlocksToIncrement;\n\n if (ivBigInt > IV_MAX)\n ivBigInt %= IV_OVERFLOW_MODULO;\n\n return this.bigIntToIV(ivBigInt);\n }\n\n private ivToBigInt(iv: Uint8Array): bigint {\n let hex = ``;\n\n for (const byte of iv)\n hex += byte.toString(16).padStart(2, `0`);\n\n return BigInt(`0x${hex}`);\n }\n\n private bigIntToIV(num: bigint): Uint8Array {\n const ivLength = 16;\n\n const hex = num.toString(16).padStart(ivLength * 2, `0`);\n const iv = new Uint8Array(ivLength);\n\n for (let i = 0; i < ivLength; i++)\n iv[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n\n return iv;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"webChunkStreamEncrypter.js","sourceRoot":"","sources":["../../../../../../src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamEncrypter.ts"],"names":[],"mappings":"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","sourcesContent":["const AES_BLOCK_SIZE_IN_BYTES = 16n;\r\nconst IV_MAX = 0xffffffffffffffffffffffffffffffffn;\r\nconst IV_OVERFLOW_MODULO = IV_MAX + 1n;\r\n\r\nexport default class WebChunkStreamEncrypter {\r\n chunkStartPosition: number;\r\n iv: Uint8Array;\r\n key: Uint8Array;\r\n chunkBlob: Blob;\r\n\r\n constructor(chunkStartPosition: number, iv: Uint8Array, key: Uint8Array, chunkBlob: Blob) {\r\n if (chunkStartPosition < 0)\r\n throw new Error(`Chunk start position can't be negative`);\r\n if (iv.length !== 16)\r\n throw new Error(`IV must be 16 bytes long`);\r\n if (key.length !== 32)\r\n throw new Error(`Key must be 32 bytes long`);\r\n if (!chunkBlob)\r\n throw new Error(`Chunk blob has to be defined`);\r\n\r\n this.chunkStartPosition = chunkStartPosition;\r\n this.iv = iv;\r\n this.key = key;\r\n this.chunkBlob = chunkBlob;\r\n }\r\n\r\n async encryptBlob() {\r\n const chunkBuffer = await this.chunkBlob.arrayBuffer();\r\n const chunkBytesArray = new Uint8Array(chunkBuffer);\r\n\r\n const fullAesBlocksIncrement = BigInt(this.chunkStartPosition) / AES_BLOCK_SIZE_IN_BYTES;\r\n const incrementedIv = this.incrementIvByFullBlocks(this.iv, fullAesBlocksIncrement);\r\n const keyBytes = this.ensureArrayBuffer(this.key);\r\n const counterBytes = this.ensureArrayBuffer(incrementedIv);\r\n\r\n // AES works on blocks but it might happen that our chunk starts within an encryption block\r\n // so we need to append some zeros at the beginning of the block and do the encryption\r\n // and then discard these leading extra bytes\r\n const aesBlockOffset = this.chunkStartPosition % Number(AES_BLOCK_SIZE_IN_BYTES);\r\n\r\n const chunkDataPrefixedWithZeros = new Uint8Array(aesBlockOffset + chunkBytesArray.length);\r\n chunkDataPrefixedWithZeros.set(chunkBytesArray, aesBlockOffset);\r\n\r\n const cryptoKey = await crypto.subtle.importKey(`raw`, keyBytes, { name: `AES-CTR` }, false, [`encrypt`]);\r\n\r\n const encryptedDataBuffer = await crypto.subtle.encrypt(\r\n { name: `AES-CTR`, counter: counterBytes, length: 128 },\r\n cryptoKey,\r\n chunkDataPrefixedWithZeros.buffer,\r\n );\r\n\r\n // Remove the leading extra bytes\r\n const encryptedChunk = encryptedDataBuffer.slice(aesBlockOffset);\r\n\r\n return new Blob([encryptedChunk]);\r\n }\r\n\r\n private ensureArrayBuffer(value: Uint8Array): Uint8Array<ArrayBuffer> {\r\n if (value.buffer instanceof ArrayBuffer)\r\n return value as Uint8Array<ArrayBuffer>;\r\n\r\n return new Uint8Array(value) as Uint8Array<ArrayBuffer>;\r\n }\r\n\r\n private incrementIvByFullBlocks(originalIv: Uint8Array, fullBlocksToIncrement: bigint): Uint8Array {\r\n let ivBigInt = this.ivToBigInt(originalIv);\r\n\r\n ivBigInt += fullBlocksToIncrement;\r\n\r\n if (ivBigInt > IV_MAX)\r\n ivBigInt %= IV_OVERFLOW_MODULO;\r\n\r\n return this.bigIntToIV(ivBigInt);\r\n }\r\n\r\n private ivToBigInt(iv: Uint8Array): bigint {\r\n let hex = ``;\r\n\r\n for (const byte of iv)\r\n hex += byte.toString(16).padStart(2, `0`);\r\n\r\n return BigInt(`0x${hex}`);\r\n }\r\n\r\n private bigIntToIV(num: bigint): Uint8Array {\r\n const ivLength = 16;\r\n\r\n const hex = num.toString(16).padStart(ivLength * 2, `0`);\r\n const iv = new Uint8Array(ivLength);\r\n\r\n for (let i = 0; i < ivLength; i++)\r\n iv[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\r\n\r\n return iv;\r\n }\r\n}"]}
|
|
@@ -8,8 +8,8 @@ export default class WebChunkStreamProvider implements ChunkStreamProvider {
|
|
|
8
8
|
get isReleased(): boolean;
|
|
9
9
|
constructor(file: File, chunkStartPosition: number, chunkLengthInBytes: number, encryptionData: ChunkStreamProviderEncryptionData | undefined);
|
|
10
10
|
private throwIfEncryptionDataIsNotValid;
|
|
11
|
-
getMd5Checksum(format: `hex` | `base64`, _pauseSignal?: PauseSignal): Promise<string>;
|
|
12
|
-
getChunkReadStream(_pauseSignal?: PauseSignal): Promise<ReadableStream>;
|
|
11
|
+
getMd5Checksum(format: `hex` | `base64`, _pauseSignal?: PauseSignal, _abortSignal?: AbortSignal): Promise<string>;
|
|
12
|
+
getChunkReadStream(_pauseSignal?: PauseSignal, _abortSignal?: AbortSignal): Promise<ReadableStream>;
|
|
13
13
|
getChunkBlob(): Promise<Blob>;
|
|
14
14
|
private getChunkEndPosition;
|
|
15
15
|
getChunkWriteStream(): Promise<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webChunkStreamProvider.d.ts","sourceRoot":"","sources":["../../../../../../src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,mBAAmB,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAGtF,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,mBAAmB;;IACtE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAKpC,IAAI,UAAU,IAAI,OAAO,CAExB;gBAEW,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE,iCAAiC,GAAG,SAAS;IAa7I,OAAO,CAAC,+BAA+B;IAWjC,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"webChunkStreamProvider.d.ts","sourceRoot":"","sources":["../../../../../../src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,mBAAmB,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAGtF,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,mBAAmB;;IACtE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAKpC,IAAI,UAAU,IAAI,OAAO,CAExB;gBAEW,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE,iCAAiC,GAAG,SAAS;IAa7I,OAAO,CAAC,+BAA+B;IAWjC,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBjH,kBAAkB,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAInG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBnC,OAAO,CAAC,mBAAmB;IAOrB,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC;IAInC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAUjC"}
|
|
@@ -27,7 +27,7 @@ export default class WebChunkStreamProvider {
|
|
|
27
27
|
throw new FsError(`Encryption key must be 32 bytes long`);
|
|
28
28
|
}
|
|
29
29
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
30
|
-
async getMd5Checksum(format, _pauseSignal) {
|
|
30
|
+
async getMd5Checksum(format, _pauseSignal, _abortSignal) {
|
|
31
31
|
try {
|
|
32
32
|
const blob = await this.getChunkBlob();
|
|
33
33
|
const buffer = await blob.arrayBuffer();
|
|
@@ -45,7 +45,7 @@ export default class WebChunkStreamProvider {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
48
|
-
async getChunkReadStream(_pauseSignal) {
|
|
48
|
+
async getChunkReadStream(_pauseSignal, _abortSignal) {
|
|
49
49
|
throw new Error(`This is not implemented for Web`);
|
|
50
50
|
}
|
|
51
51
|
async getChunkBlob() {
|