filemail-sdk 10.4.0 → 10.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/client/downloader/downloaderCore.d.ts +2 -1
- package/dist/src/client/downloader/downloaderCore.d.ts.map +1 -1
- package/dist/src/client/downloader/downloaderCore.js +6 -4
- package/dist/src/client/downloader/downloaderCore.js.map +1 -1
- package/dist/src/client/downloader/node/nodeTransferDownloader.d.ts.map +1 -1
- package/dist/src/client/downloader/node/nodeTransferDownloader.js +4 -2
- package/dist/src/client/downloader/node/nodeTransferDownloader.js.map +1 -1
- package/dist/src/client/uploader/node/nodeTransferUploader.d.ts.map +1 -1
- package/dist/src/client/uploader/node/nodeTransferUploader.js +10 -4
- package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderBase.js +1 -1
- package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.d.ts +2 -2
- package/dist/src/client/uploader/web/webTransferUploader.d.ts.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.js +7 -2
- package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploaderConfig.d.ts +7 -0
- package/dist/src/client/uploader/web/webTransferUploaderConfig.d.ts.map +1 -0
- package/dist/src/client/uploader/web/webTransferUploaderConfig.js +2 -0
- package/dist/src/client/uploader/web/webTransferUploaderConfig.js.map +1 -0
- package/dist/src/downloader/api/fileServerDownloadClient.d.ts +2 -2
- package/dist/src/downloader/api/fileServerDownloadClient.d.ts.map +1 -1
- package/dist/src/downloader/api/fileServerDownloadClient.js.map +1 -1
- package/dist/src/downloader/chunkDownloader.d.ts +3 -2
- package/dist/src/downloader/chunkDownloader.d.ts.map +1 -1
- package/dist/src/downloader/chunkDownloader.js +6 -3
- package/dist/src/downloader/chunkDownloader.js.map +1 -1
- package/dist/src/downloader/filesDownloader.d.ts +2 -1
- package/dist/src/downloader/filesDownloader.d.ts.map +1 -1
- package/dist/src/downloader/filesDownloader.js +4 -2
- package/dist/src/downloader/filesDownloader.js.map +1 -1
- package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.d.ts +6 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.d.ts.map +1 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.js +2 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5Provider.js.map +1 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.d.ts +7 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.d.ts.map +1 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.js +2 -0
- package/dist/src/downloader/md5Provider/downloaderChunkMD5ProviderFactory.js.map +1 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.d.ts +10 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.d.ts.map +1 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.js +36 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5Provider.js.map +1 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.d.ts +10 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.d.ts.map +1 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.js +14 -0
- package/dist/src/downloader/md5Provider/node/nodeOnDemandMD5ProviderFactory.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.node.d.ts +4 -0
- package/dist/src/index.node.d.ts.map +1 -1
- package/dist/src/index.node.js +4 -0
- package/dist/src/index.node.js.map +1 -1
- package/dist/src/index.web.d.ts +5 -0
- package/dist/src/index.web.d.ts.map +1 -1
- package/dist/src/index.web.js +4 -0
- package/dist/src/index.web.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js +1 -2
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.js +1 -2
- package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.d.ts +9 -0
- package/dist/src/uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.d.ts.map +1 -0
- package/dist/src/uploader/chunkStreamProviderFactory/{nodeFileDetailsUploaderChunkStreamProviderFactory.js → node/nodeFileDetailsUploaderChunkStreamProviderFactory.js} +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/node/nodeFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -0
- package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.d.ts +2 -2
- package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.d.ts.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/web/webFileDetailsUploaderChunkStreamProviderFactory.d.ts +9 -0
- package/dist/src/uploader/chunkStreamProviderFactory/web/webFileDetailsUploaderChunkStreamProviderFactory.d.ts.map +1 -0
- package/dist/src/uploader/chunkStreamProviderFactory/{webFileDetailsUploaderChunkStreamProviderFactory.js → web/webFileDetailsUploaderChunkStreamProviderFactory.js} +1 -1
- package/dist/src/uploader/chunkStreamProviderFactory/web/webFileDetailsUploaderChunkStreamProviderFactory.js.map +1 -0
- package/dist/src/uploader/fileChunksPlan.d.ts +8 -0
- package/dist/src/uploader/fileChunksPlan.d.ts.map +1 -0
- package/dist/src/uploader/fileChunksPlan.js +2 -0
- package/dist/src/uploader/fileChunksPlan.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.d.ts +10 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js +12 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/defaultMD5ComputationStrategyFactory.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.d.ts +7 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.js +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationSession.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.d.ts +6 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.js +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategy.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.d.ts +6 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.js +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/md5ComputationStrategyFactory.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.d.ts +7 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.js +14 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/node/nodeAsyncMD5ComputationStrategy.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.d.ts +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.js +27 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/computeBlobMD5.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.d.ts +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.js +5 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5.worker.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.d.ts +14 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.js +2 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkerMessages.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.d.ts +17 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.js +113 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/md5WorkersManager.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.d.ts +7 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.js +17 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/md5WebWorker/registerMD5Worker.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.d.ts +9 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.js +62 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webAsyncWebWorkerMD5ComputationStrategy.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.d.ts +9 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.js +41 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webMD5ComputationStrategyFactory.js.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.d.ts +6 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.js +9 -0
- package/dist/src/uploader/md5Provider/md5ComputationStrategies/web/webSyncMD5ComputationStrategy.js.map +1 -0
- package/dist/src/uploader/md5Provider/precomputedMD5Provider.d.ts +27 -0
- package/dist/src/uploader/md5Provider/precomputedMD5Provider.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/precomputedMD5Provider.js +189 -0
- package/dist/src/uploader/md5Provider/precomputedMD5Provider.js.map +1 -0
- package/dist/src/uploader/md5Provider/uploaderMD5Provider.d.ts +28 -0
- package/dist/src/uploader/md5Provider/uploaderMD5Provider.d.ts.map +1 -0
- package/dist/src/uploader/md5Provider/uploaderMD5Provider.js +2 -0
- package/dist/src/uploader/md5Provider/uploaderMD5Provider.js.map +1 -0
- package/dist/src/uploader/transferUpload.d.ts +4 -2
- package/dist/src/uploader/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +27 -9
- package/dist/src/uploader/transferUpload.js.map +1 -1
- package/dist/src/utils/api/dtos/sendFileChunkRequest.d.ts +1 -0
- package/dist/src/utils/api/dtos/sendFileChunkRequest.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/sendFileChunkRequest.js.map +1 -1
- package/dist/src/utils/fileSystem/chunkStreamEncryptionData.d.ts +6 -0
- package/dist/src/utils/fileSystem/chunkStreamEncryptionData.d.ts.map +1 -0
- package/dist/src/utils/fileSystem/chunkStreamEncryptionData.js +2 -0
- package/dist/src/utils/fileSystem/chunkStreamEncryptionData.js.map +1 -0
- package/dist/src/utils/fileSystem/chunkStreamProvider.d.ts +0 -5
- 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.d.ts +2 -2
- package/dist/src/utils/fileSystem/chunkStreamProviderFactory.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/chunkStreamProviderFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.d.ts +2 -3
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js +9 -28
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.d.ts +2 -2
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.js +1 -1
- package/dist/src/utils/fileSystem/node/nodeChunkStreamProviderFactory.js.map +1 -1
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.d.ts +2 -3
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js +0 -19
- package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js.map +1 -1
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.d.ts +2 -2
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.d.ts.map +1 -1
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.js +1 -1
- package/dist/src/utils/fileSystem/web/webChunkStreamProviderFactory.js.map +1 -1
- package/package.json +5 -4
- package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.d.ts +0 -9
- package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.d.ts.map +0 -1
- package/dist/src/uploader/chunkStreamProviderFactory/nodeFileDetailsUploaderChunkStreamProviderFactory.js.map +0 -1
- package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.d.ts +0 -9
- package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.d.ts.map +0 -1
- package/dist/src/uploader/chunkStreamProviderFactory/webFileDetailsUploaderChunkStreamProviderFactory.js.map +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import ChunkStreamEncryptionData from "../../utils/fileSystem/chunkStreamEncryptionData.js";
|
|
2
|
+
interface UploaderMD5Provider<T> {
|
|
3
|
+
start(files: UploaderMD5ProviderFileToBeMD5Hashed<T>[], encryptionData: ChunkStreamEncryptionData | undefined, abortSignal?: AbortSignal): Promise<void>;
|
|
4
|
+
stop(): Promise<void>;
|
|
5
|
+
getMd5Checksum(file: T, chunkStartPosition: number): Promise<string>;
|
|
6
|
+
}
|
|
7
|
+
export default UploaderMD5Provider;
|
|
8
|
+
export type MD5ComputationResult = ({
|
|
9
|
+
isSuccess: true;
|
|
10
|
+
md5: string;
|
|
11
|
+
} | {
|
|
12
|
+
isSuccess: false;
|
|
13
|
+
error: Error;
|
|
14
|
+
});
|
|
15
|
+
export type UploaderMD5ProviderFileToBeMD5Hashed<T> = {
|
|
16
|
+
file: Readonly<T>;
|
|
17
|
+
chunksIterator: IterableIterator<{
|
|
18
|
+
startPosition: number;
|
|
19
|
+
sizeInBytes: number;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
export type MD5ProviderObserver = {
|
|
23
|
+
fileId: string | number;
|
|
24
|
+
chunkStartPosition: number;
|
|
25
|
+
resolve: (md5: string) => void;
|
|
26
|
+
reject: (error: Error) => void;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=uploaderMD5Provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploaderMD5Provider.d.ts","sourceRoot":"","sources":["../../../../src/uploader/md5Provider/uploaderMD5Provider.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,MAAM,qDAAqD,CAAC;AAE5F,UAAU,mBAAmB,CAAC,CAAC;IAC3B,KAAK,CAAC,KAAK,EAAE,oCAAoC,CAAC,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,yBAAyB,GAAG,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzJ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxE;AAED,eAAe,mBAAmB,CAAC;AAEnC,MAAM,MAAM,oBAAoB,GAAG,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACf,GAAG;IACA,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,oCAAoC,CAAC,CAAC,IAAI;IAClD,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClB,cAAc,EAAE,gBAAgB,CAAC;QAC7B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;CACN,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploaderMD5Provider.js","sourceRoot":"","sources":["../../../../src/uploader/md5Provider/uploaderMD5Provider.ts"],"names":[],"mappings":"","sourcesContent":["import ChunkStreamEncryptionData from \"../../utils/fileSystem/chunkStreamEncryptionData.js\";\n\ninterface UploaderMD5Provider<T> {\n start(files: UploaderMD5ProviderFileToBeMD5Hashed<T>[], encryptionData: ChunkStreamEncryptionData | undefined, abortSignal?: AbortSignal): Promise<void>;\n\n stop(): Promise<void>;\n\n getMd5Checksum(file: T, chunkStartPosition: number): Promise<string>;\n}\n\nexport default UploaderMD5Provider;\n\nexport type MD5ComputationResult = ({\n isSuccess: true;\n md5: string;\n} | {\n isSuccess: false;\n error: Error;\n});\n\nexport type UploaderMD5ProviderFileToBeMD5Hashed<T> = {\n file: Readonly<T>;\n chunksIterator: IterableIterator<{\n startPosition: number;\n sizeInBytes: number;\n }>;\n};\n\nexport type MD5ProviderObserver = {\n fileId: string | number;\n chunkStartPosition: number;\n resolve: (md5: string) => void;\n reject: (error: Error) => void;\n};"]}
|
|
@@ -26,6 +26,7 @@ import type FileChunkUploadCompletedEventArgs from './eventArgs/fileChunkUploadC
|
|
|
26
26
|
import type TransferMetadataDeterminedEventArgs from './eventArgs/transferMetadataDeterminedEventArgs.js';
|
|
27
27
|
import type CryptographyProvider from '../utils/crypto/cryptographyProvider.js';
|
|
28
28
|
import type { TransferUploadExportData } from './export/transferUploadExportData.js';
|
|
29
|
+
import type UploaderMD5Provider from "./md5Provider/uploaderMD5Provider.js";
|
|
29
30
|
export default class TransferUpload<T extends FileDetails> {
|
|
30
31
|
#private;
|
|
31
32
|
pauseEventListener: (() => void) | undefined;
|
|
@@ -39,12 +40,13 @@ export default class TransferUpload<T extends FileDetails> {
|
|
|
39
40
|
get files(): readonly Readonly<T>[];
|
|
40
41
|
get totalSizeInBytes(): number;
|
|
41
42
|
get transferId(): string | undefined;
|
|
42
|
-
constructor(chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>, config: TransferUploadConfig, concurrencyController: ConcurrencyController, cryptography: CryptographyProvider, acker: TransferUploadAcker);
|
|
43
|
+
constructor(chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>, config: TransferUploadConfig, concurrencyController: ConcurrencyController, cryptography: CryptographyProvider, acker: TransferUploadAcker, md5Provider: UploaderMD5Provider<T>);
|
|
43
44
|
private isUploadAppend;
|
|
44
45
|
private isUploadAppendInfo;
|
|
45
46
|
private createTransferMetadataFromInfo;
|
|
46
47
|
run(transferPauseSignal: PauseSignal, transferAbortSignal: AbortSignal): Promise<void>;
|
|
47
48
|
private startBackgroundWorkers;
|
|
49
|
+
private createChunksPlan;
|
|
48
50
|
private stopBackgroundWorkers;
|
|
49
51
|
private waitUntilFileRegistered;
|
|
50
52
|
private notifyMetadataDetermined;
|
|
@@ -87,7 +89,7 @@ export default class TransferUpload<T extends FileDetails> {
|
|
|
87
89
|
export(): TransferUploadExportData<T>;
|
|
88
90
|
private getInfoExportValue;
|
|
89
91
|
private getTransferMetadataExportValue;
|
|
90
|
-
static recreate<T extends FileDetails>(transferExportData: TransferUploadExportData<T>, config: TransferUploadConfig, chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, concurrencyController: ConcurrencyController, cryptography: CryptographyProvider, acker: TransferUploadAcker): TransferUpload<T>;
|
|
92
|
+
static recreate<T extends FileDetails>(transferExportData: TransferUploadExportData<T>, config: TransferUploadConfig, chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, concurrencyController: ConcurrencyController, cryptography: CryptographyProvider, acker: TransferUploadAcker, md5Provider: UploaderMD5Provider<T>): TransferUpload<T>;
|
|
91
93
|
private static recreateTransferMetadata;
|
|
92
94
|
private static validateRecreateParams;
|
|
93
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUpload.d.ts","sourceRoot":"","sources":["../../../src/uploader/transferUpload.ts"],"names":[],"mappings":"AAEA,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAW3D,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAC;AAGvD,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,WAAW,MAAM,oCAAoC,CAAC;AAElE,OAAO,KAAK,kBAAkB,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAEtF,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,wBAAwB,MAAM,yCAAyC,CAAC;AACpF,OAAO,KAAK,8BAA8B,MAAM,+CAA+C,CAAC;AAGhG,OAAO,KAAK,mBAAmB,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,gCAAgC,MAAM,iDAAiD,CAAC;AAGpG,OAAO,KAAK,yBAAyB,MAAM,0CAA0C,CAAC;AACtF,OAAO,KAAK,qCAAqC,MAAM,sDAAsD,CAAC;AAC9G,OAAO,KAAK,sBAAsB,MAAM,uCAAuC,CAAC;AAChF,OAAO,KAAK,4BAA4B,MAAM,6CAA6C,CAAC;AAC5F,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,iCAAiC,MAAM,kDAAkD,CAAC;AACtG,OAAO,KAAK,kCAAkC,MAAM,mDAAmD,CAAC;AACxG,OAAO,KAAK,kCAAkC,MAAM,oEAAoE,CAAC;AACzH,OAAO,KAAK,oBAAoB,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,qBAAqB,MAAM,yDAAyD,CAAC;AACjG,OAAO,KAAK,0CAA0C,MAAM,2DAA2D,CAAC;AACxH,OAAO,KAAK,iCAAiC,MAAM,kDAAkD,CAAC;AACtG,OAAO,KAAK,mCAAmC,MAAM,oDAAoD,CAAC;AAC1G,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAC;AAChF,OAAO,KAAK,EAAE,wBAAwB,EAAwE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"transferUpload.d.ts","sourceRoot":"","sources":["../../../src/uploader/transferUpload.ts"],"names":[],"mappings":"AAEA,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAW3D,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAC;AAGvD,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,WAAW,MAAM,oCAAoC,CAAC;AAElE,OAAO,KAAK,kBAAkB,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAEtF,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,wBAAwB,MAAM,yCAAyC,CAAC;AACpF,OAAO,KAAK,8BAA8B,MAAM,+CAA+C,CAAC;AAGhG,OAAO,KAAK,mBAAmB,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,gCAAgC,MAAM,iDAAiD,CAAC;AAGpG,OAAO,KAAK,yBAAyB,MAAM,0CAA0C,CAAC;AACtF,OAAO,KAAK,qCAAqC,MAAM,sDAAsD,CAAC;AAC9G,OAAO,KAAK,sBAAsB,MAAM,uCAAuC,CAAC;AAChF,OAAO,KAAK,4BAA4B,MAAM,6CAA6C,CAAC;AAC5F,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,iCAAiC,MAAM,kDAAkD,CAAC;AACtG,OAAO,KAAK,kCAAkC,MAAM,mDAAmD,CAAC;AACxG,OAAO,KAAK,kCAAkC,MAAM,oEAAoE,CAAC;AACzH,OAAO,KAAK,oBAAoB,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,qBAAqB,MAAM,yDAAyD,CAAC;AACjG,OAAO,KAAK,0CAA0C,MAAM,2DAA2D,CAAC;AACxH,OAAO,KAAK,iCAAiC,MAAM,kDAAkD,CAAC;AACtG,OAAO,KAAK,mCAAmC,MAAM,oDAAoD,CAAC;AAC1G,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAC;AAChF,OAAO,KAAK,EAAE,wBAAwB,EAAwE,MAAM,sCAAsC,CAAC;AAC3J,OAAO,KAAK,mBAAmB,MAAM,sCAAsC,CAAC;AAG5E,MAAM,CAAC,OAAO,OAAO,cAAc,CAAC,CAAC,SAAS,WAAW;;IA2BrD,kBAAkB,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7C,kBAAkB,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAI7C,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,oBAAoB,IAAI,MAAM,CAKjC;IAED,IAAI,KAAK,IAAI,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAElC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;gBAEW,0BAA0B,EAAE,kCAAkC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,YAAY,EAAE,oBAAoB,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAuB7Z,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,8BAA8B;IAehC,GAAG,CAAC,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmH5F,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,gBAAgB;YAeV,qBAAqB;YAQrB,uBAAuB;IAOrC,OAAO,CAAC,wBAAwB;YAWlB,6BAA6B;YA8C7B,SAAS;IAkBvB,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,uBAAuB;IAqB/B,OAAO,CAAC,wBAAwB;IAsBhC,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,uBAAuB;YAIjB,iCAAiC;IA4C/C,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,eAAe;YAOT,sCAAsC;YAoBtC,gBAAgB;YAShB,gBAAgB;YAahB,mBAAmB;IAmB3B,MAAM,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCtD,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,2BAA2B;YAWrB,iBAAiB;IAc/B,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,WAAW,GAAG,mBAAmB,CAAC,sBAAsB,GAAG,mBAAmB,CAAC,cAAc,GAAG,mBAAmB,CAAC,sBAAsB,GAAG,mBAAmB,CAAC,eAAe,GAAG,mBAAmB,CAAC,uBAAuB,GAAG,mBAAmB,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IACtX,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IACrM,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,GAAG,IAAI;IAC5H,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,4BAA4B,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,qCAAqC,KAAK,IAAI,GAAG,IAAI;IACpJ,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI;IACtH,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,mBAAmB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,IAAI,GAAG,IAAI;IAClI,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,yBAAyB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,kCAAkC,KAAK,IAAI,GAAG,IAAI;IAC9I,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,GAAG,IAAI;IACjI,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,wBAAwB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,iCAAiC,KAAK,IAAI,GAAG,IAAI;IAC5I,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,iCAAiC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,0CAA0C,KAAK,IAAI,GAAG,IAAI;IAC9J,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,qBAAqB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,IAAI,GAAG,IAAI;IACtI,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,iCAAiC,KAAK,IAAI,GAAG,IAAI;IACtI,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,IAAI,GAAG,IAAI;IACpI,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,0BAA0B,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,mCAAmC,KAAK,IAAI,GAAG,IAAI;IAChJ,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAKvE,cAAc,IAAI,MAAM;IAKxB,MAAM,IAAI,wBAAwB,CAAC,CAAC,CAAC;IAYrC,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,8BAA8B;IAetC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,WAAW,EAAE,kBAAkB,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,kCAAkC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,YAAY,EAAE,oBAAoB,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IA8Blc,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAevC,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAiBxC"}
|
|
@@ -23,6 +23,7 @@ export default class TransferUpload {
|
|
|
23
23
|
#concurrencyController;
|
|
24
24
|
#cryptography;
|
|
25
25
|
#acker;
|
|
26
|
+
#md5Provider;
|
|
26
27
|
#transferState;
|
|
27
28
|
#transferMetadata;
|
|
28
29
|
#transferDownloadUrl;
|
|
@@ -64,7 +65,7 @@ export default class TransferUpload {
|
|
|
64
65
|
get transferId() {
|
|
65
66
|
return this.#transferMetadata?.transferId;
|
|
66
67
|
}
|
|
67
|
-
constructor(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, info, config, concurrencyController, cryptography, acker) {
|
|
68
|
+
constructor(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, info, config, concurrencyController, cryptography, acker, md5Provider) {
|
|
68
69
|
if (info.files.length === 0)
|
|
69
70
|
throw new TransferUploadError(`Files can't be empty`);
|
|
70
71
|
this.#totalSizeInBytes = info.files.reduce((partialSum, file) => partialSum + file.fileSizeInBytes, 0);
|
|
@@ -78,6 +79,7 @@ export default class TransferUpload {
|
|
|
78
79
|
this.#concurrencyController = concurrencyController;
|
|
79
80
|
this.#cryptography = cryptography;
|
|
80
81
|
this.#acker = acker;
|
|
82
|
+
this.#md5Provider = md5Provider;
|
|
81
83
|
this.#filesRegistrar = this.#isLegacyTransfer
|
|
82
84
|
? undefined
|
|
83
85
|
: new TransferFilesRegistrar(apiClient, eventsEngine, info.files);
|
|
@@ -118,9 +120,10 @@ export default class TransferUpload {
|
|
|
118
120
|
else if (!this.#transferMetadata)
|
|
119
121
|
await this.startApiTransferAndCreateMetadata();
|
|
120
122
|
this.notifyMetadataDetermined();
|
|
121
|
-
this.
|
|
123
|
+
const chunksPlan = this.createChunksPlan();
|
|
124
|
+
this.startBackgroundWorkers(chunksPlan, transferPauseSignal, transferAbortSignal);
|
|
122
125
|
const ongoingChunkUploads = new Set();
|
|
123
|
-
for (const file of
|
|
126
|
+
for (const { file, createChunksIterator } of chunksPlan) {
|
|
124
127
|
const fileStatus = this.#transferState.getFile(file.externalId);
|
|
125
128
|
if (fileStatus.isCompleted)
|
|
126
129
|
continue;
|
|
@@ -131,9 +134,7 @@ export default class TransferUpload {
|
|
|
131
134
|
this.enqueueFileAck(file);
|
|
132
135
|
continue;
|
|
133
136
|
}
|
|
134
|
-
const
|
|
135
|
-
const chunksIterator = new ChunksIterator(alreadySentChunks, file.fileSizeInBytes, this.#config.chunkSizeInBytes);
|
|
136
|
-
for (const chunk of chunksIterator.getChunksIterator()) {
|
|
137
|
+
for (const chunk of createChunksIterator()) {
|
|
137
138
|
const releaseSemaphore = await this.#concurrencyController.acquire();
|
|
138
139
|
if (this.shouldStopProcessing()) {
|
|
139
140
|
releaseSemaphore();
|
|
@@ -188,14 +189,29 @@ export default class TransferUpload {
|
|
|
188
189
|
this.#isRunMethodRunning = false;
|
|
189
190
|
}
|
|
190
191
|
}
|
|
191
|
-
startBackgroundWorkers(transferPauseSignal, transferAbortSignal) {
|
|
192
|
+
startBackgroundWorkers(chunksPlan, transferPauseSignal, transferAbortSignal) {
|
|
193
|
+
const filesToHash = chunksPlan.map(({ file, createChunksIterator }) => ({ file, chunksIterator: createChunksIterator() }));
|
|
192
194
|
const fileAckSuccessfullCallback = (externalFileId, uploadItemId) => this.#transferState.fileCompleted(externalFileId, uploadItemId);
|
|
193
195
|
const fileAckFailedCallback = (externalFileId, uploadItemId, reason, error) => this.#transferState.fileAckFailed(externalFileId, uploadItemId, reason, error);
|
|
196
|
+
this.#md5Provider.start(filesToHash, this.#transferMetadata?.encryptionData, this.#mergedPauseAndAbortController?.signal);
|
|
194
197
|
this.#acker.start(this.#transferMetadata.transferId, this.#transferMetadata.transferKey, fileAckSuccessfullCallback, fileAckFailedCallback, transferPauseSignal, transferAbortSignal);
|
|
195
198
|
this.#filesRegistrar?.start(this.#transferMetadata.transferId, this.#transferMetadata.transferKey, this.#mergedPauseAndAbortController?.signal);
|
|
196
199
|
}
|
|
200
|
+
createChunksPlan() {
|
|
201
|
+
const chunkSizeInBytes = this.#config.chunkSizeInBytes;
|
|
202
|
+
return this.files.map(file => {
|
|
203
|
+
// Upload progress mutates these ranges, so both iterators need the same snapshot for this run.
|
|
204
|
+
const alreadySentChunks = this.#transferState.getChunksForFile(file.externalId).map(chunk => ({ ...chunk }));
|
|
205
|
+
const fileSizeInBytes = file.fileSizeInBytes;
|
|
206
|
+
return {
|
|
207
|
+
file,
|
|
208
|
+
createChunksIterator: () => new ChunksIterator(alreadySentChunks, fileSizeInBytes, chunkSizeInBytes).getChunksIterator(),
|
|
209
|
+
};
|
|
210
|
+
});
|
|
211
|
+
}
|
|
197
212
|
async stopBackgroundWorkers() {
|
|
198
213
|
await Promise.allSettled([
|
|
214
|
+
this.#md5Provider?.stop(),
|
|
199
215
|
this.#filesRegistrar?.stop(),
|
|
200
216
|
this.#acker.stop(),
|
|
201
217
|
]);
|
|
@@ -251,7 +267,9 @@ export default class TransferUpload {
|
|
|
251
267
|
}
|
|
252
268
|
}
|
|
253
269
|
async sendChunk(file, fileId, chunkStreamProvider, progressEventHandler) {
|
|
270
|
+
const md5 = await this.#md5Provider.getMd5Checksum(file, chunkStreamProvider.chunkStartPosition);
|
|
254
271
|
const request = {
|
|
272
|
+
md5,
|
|
255
273
|
chunkLengthInBytes: chunkStreamProvider.chunkLengthInBytes,
|
|
256
274
|
chunkStartPosition: chunkStreamProvider.chunkStartPosition,
|
|
257
275
|
};
|
|
@@ -513,14 +531,14 @@ export default class TransferUpload {
|
|
|
513
531
|
},
|
|
514
532
|
};
|
|
515
533
|
}
|
|
516
|
-
static recreate(transferExportData, config, chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, concurrencyController, cryptography, acker) {
|
|
534
|
+
static recreate(transferExportData, config, chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, concurrencyController, cryptography, acker, md5Provider) {
|
|
517
535
|
try {
|
|
518
536
|
TransferUpload.validateRecreateParams(transferExportData);
|
|
519
537
|
const recreatedInfo = {
|
|
520
538
|
...transferExportData.info,
|
|
521
539
|
isLegacyTransfer: transferExportData.registeredFiles === undefined,
|
|
522
540
|
};
|
|
523
|
-
const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, recreatedInfo, config, concurrencyController, cryptography, acker);
|
|
541
|
+
const transfer = new TransferUpload(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, recreatedInfo, config, concurrencyController, cryptography, acker, md5Provider);
|
|
524
542
|
transfer.#transferMetadata = this.recreateTransferMetadata(transferExportData.transferMetadata);
|
|
525
543
|
transfer.#transferState = new TransferUploadState(transferExportData.info.files, eventsEngine, config.currentRatesTimespanInMs, config.progressEventThrottlingInMs, transferExportData.state);
|
|
526
544
|
if (transfer.isUploadAppendInfo(transferExportData.info))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUpload.js","sourceRoot":"","sources":["../../../src/uploader/transferUpload.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferUploadState from \"./state/transferUploadState.js\";\nimport TransferUploadError from \"./transferUploadError.js\";\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport TransferUploadEvent from './transferUploadEvent.js';\nimport ChunksIterator from './chunksIterator/chunksIterator.js';\nimport TransferFilesRegistrar, { type RegistrationResult } from './transferFilesRegistrar.js';\nimport mergeAbortAndPauseSignals, { type MergedAbortAndPauseController } from '../utils/mergeAbortAndPauseSignals.js';\nimport ApiError from '../utils/api/apiError.js';\nimport FsError from '../utils/fileSystem/fsError.js';\nimport ApiFilemail449Error from '../utils/api/apiFilemail449Error.js';\nimport { promiseAllSettled } from '../utils/promiseAll.js';\nimport { isTransferFailureAbortReason } from './transferFailureAbortReason.js';\nimport { concatUint8Arrays, hexToUint8Array, uint8ArrayToHex } from '../utils/uint8ArrayUtils.js';\n\nimport type ApiClient from \"../utils/api/apiClient.js\";\nimport type { InitializeTransferRequest } from \"../utils/api/dtos/initializeTransferRequest.js\";\nimport type SendFileChunkRequest from '../utils/api/dtos/sendFileChunkRequest.js';\nimport type FileServerClientFactory from '../utils/api/fileServerClientFactory.js';\nimport type FileDetails from \"../utils/fileSystem/fileDetails.js\";\nimport type TransferUploadMetadata from \"./export/transferUploadMetadata.js\";\nimport type TransferUploadInfo from \"./options/transferUploadInfo.js\";\nimport type { TransferUploadAppendInfo } from './options/transferUploadAppendInfo.js';\nimport type ResetTransferRequest from '../utils/api/dtos/resetTransferRequest.js';\nimport type EventsEngine from '../utils/events/eventsEngine.js';\nimport type FileChunkUploadEventArgs from './eventArgs/fileChunkUploadEventArgs.js';\nimport type FileChunkUploadFailedEventArgs from './eventArgs/fileChunkUploadFailedEventArgs.js';\nimport type ChunkProgressEvent from '../utils/events/chunkProgressEvent.js';\nimport type FinalizeTransferRequest from '../utils/api/dtos/finalizeTransferRequest.js';\nimport type FileUploadEventArgs from './eventArgs/fileUploadEventArgs.js';\nimport type TransferUploadCompletedEventArgs from './eventArgs/transferUploadCompletedEventArgs.js';\nimport type CancelTransferRequest from '../utils/api/dtos/cancelTransferRequest.js';\nimport type ConcurrencyReleaser from \"../utils/concurrencyController/concurrencyReleaser.js\";\nimport type FileUploadFailedEventArgs from './eventArgs/fileUploadFailedEventArgs.js';\nimport type FilesRegistrationBatchFailedEventArgs from './eventArgs/filesRegistrationBatchFailedEventArgs.js';\nimport type FileAckFailedEventArgs from './eventArgs/fileAckFailedEventArgs.js';\nimport type FilesBatchAckFailedEventArgs from './eventArgs/filesBatchAckFailedEventArgs.js';\nimport type TransferUploadAcker from './transferUploadAcker.js';\nimport type RegisteredTransferFile from './registeredTransferFile.js';\nimport type TransferUploadProgressedEventArgs from './eventArgs/transferUploadProgressedEventArgs.js';\nimport type FileChunkUploadProgressedEventArgs from './eventArgs/fileChunkUploadProgressedEventArgs.js';\nimport type UploaderChunkStreamProviderFactory from './chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js';\nimport type TransferUploadConfig from './options/transferUploadConfig.js';\nimport type { PauseSignal } from './pauseController.js';\nimport type ChunkStreamProvider from '../utils/fileSystem/chunkStreamProvider.js';\nimport type ConcurrencyController from '../utils/concurrencyController/concurrencyController.js';\nimport type FileChunkUploadCompletedPartiallyEventArgs from './eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js';\nimport type FileChunkUploadCompletedEventArgs from './eventArgs/fileChunkUploadCompletedEventArgs.js';\nimport type TransferMetadataDeterminedEventArgs from './eventArgs/transferMetadataDeterminedEventArgs.js';\nimport type CryptographyProvider from '../utils/crypto/cryptographyProvider.js';\nimport type { TransferUploadExportData, TransferUploadExportDataAppendInfo, TransferUploadExportDataMetadata } from './export/transferUploadExportData.js';\n\nexport default class TransferUpload<T extends FileDetails> {\n #totalSizeInBytes: number;\n\n #chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>;\n #apiClient: ApiClient;\n #fileServerClientFactory: FileServerClientFactory;\n #eventsEngine: EventsEngine;\n #info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>;\n #isLegacyTransfer: boolean;\n #config: TransferUploadConfig;\n #concurrencyController: ConcurrencyController;\n #cryptography: CryptographyProvider;\n #acker: TransferUploadAcker;\n\n #transferState?: TransferUploadState;\n #transferMetadata?: TransferUploadMetadata;\n #transferDownloadUrl?: string;\n #transferConfirmationUrl?: string;\n #transferRecipientTrackingLinks?: TransferUploadCompletedEventArgs[`recipientTrackingLinks`];\n\n #pauseSignal: PauseSignal | undefined;\n #abortSignal: AbortSignal | undefined;\n #mergedPauseAndAbortController: MergedAbortAndPauseController | undefined;\n\n #filesRegistrar: TransferFilesRegistrar | undefined;\n\n pauseEventListener: (() => void) | undefined;\n abortEventListener: (() => void) | undefined;\n\n #isRunMethodRunning = false;\n\n get status(): TransferStatus {\n return this.#transferState?.status ?? TransferStatus.Initialized;\n }\n\n get completedFilesCount(): number {\n return this.#transferState?.completedFilesCount ?? 0;\n }\n\n get failedFilesCount(): number {\n return this.#transferState?.failedFilesCount ?? 0;\n }\n\n get uploadedBytesCount(): number {\n return this.#transferState?.uploadedBytesCount ?? 0;\n }\n\n get failedBytesCount(): number {\n return this.#transferState?.failedBytesCount ?? 0;\n }\n\n get progressInPercentage(): number {\n if (this.totalSizeInBytes === 0)\n return 0;\n\n return (this.uploadedBytesCount * 100) / this.totalSizeInBytes;\n }\n\n get files(): readonly Readonly<T>[] {\n return this.#info.files;\n }\n\n get totalSizeInBytes(): number {\n return this.#totalSizeInBytes;\n }\n\n get transferId(): string | undefined {\n return this.#transferMetadata?.transferId;\n }\n\n constructor(chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>, config: TransferUploadConfig, concurrencyController: ConcurrencyController, cryptography: CryptographyProvider, acker: TransferUploadAcker) {\n if (info.files.length === 0)\n throw new TransferUploadError(`Files can't be empty`);\n\n this.#totalSizeInBytes = info.files.reduce((partialSum, file) => partialSum + file.fileSizeInBytes, 0);\n\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#apiClient = apiClient;\n this.#fileServerClientFactory = fileServerClientFactory;\n this.#eventsEngine = eventsEngine;\n this.#info = info;\n this.#isLegacyTransfer = info.isLegacyTransfer ?? false;\n this.#config = config;\n this.#concurrencyController = concurrencyController;\n this.#cryptography = cryptography;\n this.#acker = acker;\n\n this.#filesRegistrar = this.#isLegacyTransfer\n ? undefined\n : new TransferFilesRegistrar(apiClient, eventsEngine, info.files);\n }\n\n private isUploadAppend(): boolean {\n return this.isUploadAppendInfo(this.#info);\n }\n\n private isUploadAppendInfo(info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): info is TransferUploadAppendInfo<T> {\n return (info as TransferUploadAppendInfo<T>).transferKey !== undefined;\n }\n\n private createTransferMetadataFromInfo() {\n if (!this.isUploadAppendInfo(this.#info))\n throw new TransferUploadError(`Options are not TransferUploadAppendOptions`);\n\n this.#transferDownloadUrl = this.#info.transferDownloadUrl;\n\n this.#transferMetadata = {\n transferId: this.#info.transferId,\n transferKey: this.#info.transferKey,\n transferFileServerUrl: this.#info.transferFileServerUrl,\n transferRegion: this.#info.transferRegion,\n encryptionData: this.#info.e2eeData,\n };\n }\n\n async run(transferPauseSignal: PauseSignal, transferAbortSignal: AbortSignal): Promise<void> {\n this.throwIfNotPossibleToRun(transferPauseSignal, transferAbortSignal);\n\n this.#isRunMethodRunning = true;\n\n try {\n this.#pauseSignal = transferPauseSignal;\n this.#abortSignal = transferAbortSignal;\n this.#mergedPauseAndAbortController = mergeAbortAndPauseSignals(transferPauseSignal, transferAbortSignal);\n\n if (!this.#transferState)\n this.#transferState = new TransferUploadState(this.files, this.#eventsEngine, this.#config.currentRatesTimespanInMs, this.#config.progressEventThrottlingInMs);\n else\n this.#transferState.recover();\n\n this.#transferState.transferRun();\n\n this.addPauseAndStopListeners();\n\n if (this.isUploadAppend() && !this.#transferMetadata)\n this.createTransferMetadataFromInfo();\n else if (!this.#transferMetadata)\n await this.startApiTransferAndCreateMetadata();\n\n this.notifyMetadataDetermined();\n\n this.startBackgroundWorkers(transferPauseSignal, transferAbortSignal);\n\n const ongoingChunkUploads = new Set<Promise<void>>();\n\n for (const file of this.files) {\n const fileStatus = this.#transferState.getFile(file.externalId);\n\n if (fileStatus.isCompleted)\n continue;\n\n const registrationResult = await this.waitUntilFileRegistered(file);\n\n if (!registrationResult.isRegisteredSuccessfully)\n continue;\n\n if (fileStatus.isUploadCompleted) {\n this.enqueueFileAck(file);\n continue;\n }\n\n const alreadySentChunks = this.#transferState.getChunksForFile(file.externalId);\n const chunksIterator = new ChunksIterator(alreadySentChunks, file.fileSizeInBytes, this.#config.chunkSizeInBytes);\n\n for (const chunk of chunksIterator.getChunksIterator()) {\n const releaseSemaphore = await this.#concurrencyController.acquire();\n\n if (this.shouldStopProcessing()) {\n releaseSemaphore();\n break;\n }\n\n const chunkUploadPromise = this.sendChunkAndKeepUpdatingState(file, chunk.startPosition, chunk.sizeInBytes, releaseSemaphore);\n\n const trackedChunkUploadPromise = chunkUploadPromise.finally(() => {\n ongoingChunkUploads.delete(trackedChunkUploadPromise);\n });\n\n ongoingChunkUploads.add(trackedChunkUploadPromise);\n\n if (this.shouldStopProcessing())\n break;\n }\n\n if (this.shouldStopProcessing())\n break;\n }\n\n await promiseAllSettled(Array.from(ongoingChunkUploads));\n\n await this.#acker.flush();\n\n if (this.#transferState.status === TransferStatus.Pausing)\n this.#transferState.transferPaused();\n else if (this.#transferState.status === TransferStatus.Aborting)\n this.#transferState.transferAborted();\n else if (this.uploadedBytesCount !== this.totalSizeInBytes || this.hasUnackedFiles())\n this.#transferState.transferFailed();\n else {\n await this.finalizeTransfer();\n this.#transferState.transferCompleted(this.#transferMetadata!, this.#transferDownloadUrl!, this.#transferConfirmationUrl, this.#transferRecipientTrackingLinks);\n }\n }\n catch (error) {\n // We can get here with pausing or aborting status if any API call fails (e.g., finalizeTransfer) so we need to check the status again\n if (!this.#transferState)\n this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);\n else if (this.#transferState.status === TransferStatus.Pausing) {\n this.#transferState.transferPaused();\n return;\n }\n else if (this.#transferState.status === TransferStatus.Aborting) {\n this.#transferState.transferAborted();\n return;\n }\n else\n this.#transferState.transferFailed();\n\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n finally {\n await this.stopBackgroundWorkers();\n\n this.removePauseAndStopListeners();\n this.#isRunMethodRunning = false;\n }\n }\n\n private startBackgroundWorkers(transferPauseSignal: PauseSignal, transferAbortSignal: AbortSignal) {\n const fileAckSuccessfullCallback = (externalFileId: string | number, uploadItemId: string) => this.#transferState!.fileCompleted(externalFileId, uploadItemId);\n const fileAckFailedCallback = (externalFileId: string | number, uploadItemId: string, reason: string, error: Error) => this.#transferState!.fileAckFailed(externalFileId, uploadItemId, reason, error);\n\n this.#acker.start(this.#transferMetadata!.transferId, this.#transferMetadata!.transferKey, fileAckSuccessfullCallback, fileAckFailedCallback, transferPauseSignal, transferAbortSignal);\n this.#filesRegistrar?.start(this.#transferMetadata!.transferId, this.#transferMetadata!.transferKey, this.#mergedPauseAndAbortController?.signal);\n }\n\n private async stopBackgroundWorkers() {\n await Promise.allSettled([\n this.#filesRegistrar?.stop(),\n this.#acker.stop(),\n ]);\n }\n\n private async waitUntilFileRegistered(file: Readonly<T>): Promise<RegistrationResult> {\n if (this.#isLegacyTransfer)\n return { isRegisteredSuccessfully: true };\n\n return await this.#filesRegistrar!.waitUntilFileRegistered(file.externalId);\n }\n\n private notifyMetadataDetermined() {\n const eventArgs: TransferMetadataDeterminedEventArgs = {\n transferId: this.#transferMetadata!.transferId,\n fileServerUrl: this.#transferMetadata!.transferFileServerUrl,\n region: this.#transferMetadata!.transferRegion,\n };\n\n this.#eventsEngine.emit(TransferUploadEvent.TransferMetadataDetermined, eventArgs);\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\n }\n\n private async sendChunkAndKeepUpdatingState(file: T, chunkStartPosition: number, chunkSizeInBytes: number, releaseSemaphore: ConcurrencyReleaser): Promise<void> {\n let uploadedBytesCount = 0;\n\n const registeredFile = this.getRegisteredFile(file.externalId);\n const uploadItemId = registeredFile?.uploadItemId;\n\n try {\n this.#transferState!.chunkUploadStarted(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes);\n\n const chunkStreamProvider = this.#chunkStreamProviderFactory.createChunkStreamProvider(file, chunkStartPosition, chunkSizeInBytes, this.#transferMetadata?.encryptionData);\n\n const progressEventHandler = (eventArgs: ChunkProgressEvent) => {\n uploadedBytesCount += eventArgs.transferredBytesSinceLastEvent;\n this.#transferState!.chunkUploadProgressed(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, eventArgs);\n };\n\n await this.sendChunk(file, registeredFile?.fileId, chunkStreamProvider, progressEventHandler);\n\n if (uploadedBytesCount === chunkSizeInBytes)\n this.#transferState!.chunkUploadCompleted(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes);\n else\n this.#transferState!.chunkUploadCompletedPartially(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal!.paused);\n\n if (this.#transferState!.getFile(file.externalId).isUploadCompleted)\n this.enqueueFileAck(file);\n }\n catch (error) {\n const chunkError = error as Error;\n\n const isTcpPausingError = chunkError.cause !== undefined\n && chunkError.cause instanceof ApiFilemail449Error\n && chunkError.cause.message === `Wrong md5 hash`\n && this.#pauseSignal?.paused === true;\n\n if (isTcpPausingError)\n this.#transferState!.chunkUploadCompletedPartially(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal!.paused);\n else {\n const failedReason = this.getChunkFailedReason(error);\n this.#transferState!.chunkUploadFailed(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, failedReason, error as Error);\n }\n }\n finally {\n releaseSemaphore();\n }\n }\n\n private async sendChunk(file: T, fileId: string | undefined, chunkStreamProvider: ChunkStreamProvider, progressEventHandler: (eventArgs: ChunkProgressEvent) => void): Promise<void> {\n const request: SendFileChunkRequest = {\n chunkLengthInBytes: chunkStreamProvider.chunkLengthInBytes,\n chunkStartPosition: chunkStreamProvider.chunkStartPosition,\n };\n\n const fileServerClient = this.#fileServerClientFactory.createFileServerUploadClient(this.#transferMetadata!.transferFileServerUrl, this.#transferMetadata!.transferId, this.#transferMetadata!.transferKey, file.fileName, file.fileDestinationPathInTransfer, file.fileSizeInBytes, fileId);\n\n const ongoingRequestPromise = fileServerClient.sendFileChunk(request, chunkStreamProvider, this.#pauseSignal!, this.#abortSignal!);\n\n fileServerClient.addEventListener(`progress`, progressEventHandler);\n\n await ongoingRequestPromise;\n }\n\n private getChunkFailedReason(error: unknown) {\n if (error instanceof FsError)\n return `Can't read file. ${error.message}`;\n\n if (error instanceof ApiError) {\n const baseMessage = error.cause?.message ? `${error.message}. ${error.cause.message}` : error.message;\n return error.requestUrl ? `${baseMessage}. Request URL: ${error.requestUrl}` : baseMessage;\n }\n\n return (error as Error)?.message;\n }\n\n private throwIfNotPossibleToRun(pauseSignal: PauseSignal, abortSignal: AbortSignal) {\n if (this.#isRunMethodRunning)\n throw new TransferUploadError(`This transfer is running and cannot be run`);\n\n if (this.#transferState\n && this.#transferState.status !== TransferStatus.Failed\n && this.#transferState.status !== TransferStatus.Aborted\n && this.#transferState.status !== TransferStatus.Initialized\n && this.#transferState.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be run`);\n\n if (this.files.length === 0)\n throw new TransferUploadError(`There are no files passed to the transfer`);\n\n if (pauseSignal.paused)\n throw new TransferUploadError(`Can't run transfer with already paused PauseController`);\n\n if (abortSignal.aborted)\n throw new TransferUploadError(`Can't run transfer with already aborted AbortController`);\n }\n\n private addPauseAndStopListeners() {\n this.pauseEventListener = () => {\n if (this.#transferState!.status !== TransferStatus.Running)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be paused`);\n\n this.#transferState!.transferPauseRequested();\n };\n\n this.abortEventListener = () => {\n if (this.isFailureAbortRequested())\n return;\n\n if (this.#transferState!.status !== TransferStatus.Running)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be stopped`);\n\n this.#transferState!.transferAbortRequested();\n };\n\n this.#pauseSignal!.addEventListener(`pause`, this.pauseEventListener);\n this.#abortSignal!.addEventListener(`abort`, this.abortEventListener);\n }\n\n private removePauseAndStopListeners() {\n this.#pauseSignal!.removeEventListener(`pause`, this.pauseEventListener!);\n this.#abortSignal!.removeEventListener(`abort`, this.abortEventListener!);\n\n this.#mergedPauseAndAbortController?.dispose();\n }\n\n private shouldStopProcessing() {\n return this.#transferState!.status !== TransferStatus.Running || this.#abortSignal?.aborted === true || this.#pauseSignal?.paused === true;\n }\n\n private isFailureAbortRequested() {\n return isTransferFailureAbortReason(this.#abortSignal?.reason);\n }\n\n private async startApiTransferAndCreateMetadata() {\n if (this.isUploadAppendInfo(this.#info))\n throw new TransferUploadError(`Options are not TransferUploadOptions`);\n\n try {\n const encryptionDataAndIvSaltHex = await this.generateEncryptionDataAndIvSaltHmacHex(this.#info.e2eeKey);\n\n const request: InitializeTransferRequest = {\n dataRegion: this.#info.dataRegion,\n e2ee: Boolean(encryptionDataAndIvSaltHex),\n e2ee_keyhash: encryptionDataAndIvSaltHex?.ivSaltHmacHex,\n transfersize: this.totalSizeInBytes,\n to: this.#info.to,\n from: this.#info.from,\n subject: this.#info.subject,\n message: this.#info.message,\n notify: this.#info.notify,\n confirmation: this.#info.confirmation,\n days: this.#info.days,\n password: this.#info.uploadPassword,\n companyid: this.#info.companyId,\n incominglogintoken: this.#info.incomingLoginToken,\n incomingpageid: this.#info.incomingPageId,\n filerequestid: this.#info.fileRequestId,\n filerequestshareid: this.#info.fileRequestShareId,\n customfields: this.#info.customFields,\n filesdb: !this.#isLegacyTransfer,\n };\n\n const response = await this.#apiClient.initializeTransfer(request, this.#mergedPauseAndAbortController?.signal);\n\n this.#transferMetadata = {\n transferId: response.transferId,\n transferKey: response.transferKey,\n transferFileServerUrl: response.transferUrl,\n transferRegion: response.transferRegion,\n encryptionData: encryptionDataAndIvSaltHex?.encryptionData,\n };\n }\n catch (error) {\n throw new TransferUploadError(`Error initializing transfer through the API`, { cause: error as Error });\n }\n }\n\n private getRegisteredFile(externalFileId: string | number): RegisteredTransferFile | undefined {\n return this.#filesRegistrar?.getRegisteredFile(externalFileId);\n }\n\n private enqueueFileAck(file: Readonly<T>): void {\n if (this.#isLegacyTransfer) {\n this.#transferState!.fileCompleted(file.externalId, undefined);\n return;\n }\n\n const registeredFile = this.getRegisteredFile(file.externalId);\n\n if (!registeredFile)\n throw new TransferUploadError(`Can't ack file with external id = ${file.externalId} - no registered file found. The transfer state is malformed.`);\n\n this.#acker.enqueue({ externalFileId: file.externalId, uploadItemId: registeredFile.uploadItemId, sizeInBytes: file.fileSizeInBytes });\n }\n\n private hasUnackedFiles(): boolean {\n if (this.#isLegacyTransfer)\n return false;\n\n return this.files.some(file => !this.#transferState!.getFile(file.externalId).isCompleted);\n }\n\n private async generateEncryptionDataAndIvSaltHmacHex(e2eeKey?: string): Promise<{ encryptionData: { iv: Uint8Array, key: Uint8Array }, ivSaltHmacHex: string, salt: Uint8Array, hmac: Uint8Array } | undefined> {\n if (!e2eeKey)\n return undefined;\n\n const salt = this.#cryptography.generateRandomBytes(16);\n const key = await this.#cryptography.deriveKey(e2eeKey, salt);\n const hmac = await this.#cryptography.generateHmac(key);\n const iv = this.#cryptography.generateRandomBytes(16);\n\n const ivSaltHmac = concatUint8Arrays([iv, salt, hmac]);\n const ivSaltHmacHex = uint8ArrayToHex(ivSaltHmac);\n\n return {\n encryptionData: { iv, key },\n hmac,\n salt,\n ivSaltHmacHex,\n };\n }\n\n private async finalizeTransfer(): Promise<void> {\n this.#eventsEngine.emit(TransferUploadEvent.TransferFinalizing);\n\n if (this.isUploadAppend())\n await this.resetApiTransfer();\n else\n await this.finalizeApiTransfer();\n }\n\n private async resetApiTransfer(): Promise<void> {\n try {\n const request: ResetTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n };\n\n await this.#apiClient.resetTransfer(request, this.#mergedPauseAndAbortController?.signal);\n }\n catch (error) {\n throw new TransferUploadError(`Error resetting transfer through the API`, { cause: error as Error });\n }\n }\n\n private async finalizeApiTransfer(): Promise<void> {\n try {\n const request: FinalizeTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n transferkey: this.#transferMetadata!.transferKey,\n protocol: `tcp`,\n };\n\n const response = await this.#apiClient.finalizeTransfer(request, this.#mergedPauseAndAbortController?.signal);\n\n this.#transferDownloadUrl = response.downloadUrl;\n this.#transferConfirmationUrl = response.confirmationUrl;\n this.#transferRecipientTrackingLinks = response.recipientTrackingLinks;\n }\n catch (error) {\n throw new TransferUploadError(`Error finalizing transfer through the API`, { cause: error as Error });\n }\n }\n\n async cancel(abortSignal?: AbortSignal): Promise<void> {\n try {\n const isTransferApiInitialized = Boolean(this.#transferState) && (Boolean(this.#transferMetadata) || this.isUploadAppend());\n\n if (!isTransferApiInitialized) {\n this.emitCancelEvents();\n return;\n }\n\n this.throwIfInWrongStateToCancel();\n\n this.#transferState!.transferCancelRequested();\n\n if (this.isUploadAppend()) {\n // There is no possibility to cancel transfer upload append on API for now\n }\n else {\n try {\n await this.cancelApiTransfer(abortSignal);\n }\n catch {\n // If API cancel fails we still finalize local transfer state as canceled to avoid hanging in Canceling.\n }\n }\n\n this.#transferState!.transferCanceled();\n }\n catch (error) {\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n }\n\n private emitCancelEvents() {\n this.#eventsEngine.emit(TransferUploadEvent.TransferCancelRequested);\n this.#eventsEngine.emit(TransferUploadEvent.TransferCanceled);\n }\n\n private throwIfInWrongStateToCancel() {\n if (!this.#transferState)\n return;\n\n if (this.#transferState.status !== TransferStatus.Failed\n && this.#transferState.status !== TransferStatus.Aborted\n && this.#transferState.status !== TransferStatus.Initialized\n && this.#transferState.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be canceled`);\n }\n\n private async cancelApiTransfer(abortSignal?: AbortSignal): Promise<void> {\n try {\n const request: CancelTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n transferkey: this.#transferMetadata!.transferKey,\n };\n\n await this.#apiClient.cancelTransfer(request, abortSignal);\n }\n catch (error) {\n throw new TransferUploadError(`Error canceling transfer through the API`, { cause: error as Error });\n }\n }\n\n addEventListener(eventName: TransferUploadEvent.TransferRun | TransferUploadEvent.TransferPauseRequested | TransferUploadEvent.TransferPaused | TransferUploadEvent.TransferAbortRequested | TransferUploadEvent.TransferAborted | TransferUploadEvent.TransferCancelRequested | TransferUploadEvent.TransferCanceled | TransferUploadEvent.TransferFailed, handler: () => void): void\n addEventListener(eventName: TransferUploadEvent.FileUploadStarted | TransferUploadEvent.FileUploadCompleted | TransferUploadEvent.FileCompleted, handler: (event: FileUploadEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileUploadFailed, handler: (event: FileUploadFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FilesRegistrationBatchFailed, handler: (event: FilesRegistrationBatchFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileAckFailed, handler: (event: FileAckFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FilesBatchAckFailed, handler: (event: FilesBatchAckFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadProgressed, handler: (event: FileChunkUploadProgressedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadStarted, handler: (event: FileChunkUploadEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadCompleted, handler: (event: FileChunkUploadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadCompletedPartially, handler: (event: FileChunkUploadCompletedPartiallyEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadFailed, handler: (event: FileChunkUploadFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferProgressed, handler: (event: TransferUploadProgressedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferCompleted, handler: (event: TransferUploadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferMetadataDetermined, handler: (event: TransferMetadataDeterminedEventArgs) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n exportAsString(): string {\n const exportData = this.export();\n return JSON.stringify(exportData);\n }\n\n export(): TransferUploadExportData<T> {\n if (!this.#transferState?.files)\n throw new TransferUploadError(`Can't export not started Transfer`); // fileStatuses are not created yet and it really doesn't make any sens to export not started transfer\n\n return {\n transferMetadata: this.getTransferMetadataExportValue(),\n info: this.getInfoExportValue(),\n state: this.#transferState.export(),\n registeredFiles: this.#filesRegistrar ? Array.from(this.#filesRegistrar.export().entries()) : undefined,\n };\n }\n\n private getInfoExportValue(): Readonly<TransferUploadInfo<T> | TransferUploadExportDataAppendInfo<T>> {\n if (this.isUploadAppendInfo(this.#info)) {\n const { e2eeData, ...appendInfoWithoutE2eeData } = this.#info;\n\n return appendInfoWithoutE2eeData;\n }\n\n // Until the transfer is initialized the key is still needed - a resumed run re-initializes from the info.\n if (!this.#transferMetadata)\n return this.#info;\n\n const { e2eeKey, ...infoWithoutE2eeKey } = this.#info;\n\n return infoWithoutE2eeKey;\n }\n\n private getTransferMetadataExportValue(): TransferUploadExportDataMetadata | undefined {\n if (!this.#transferMetadata)\n return undefined;\n\n const { encryptionData, ...rest } = this.#transferMetadata;\n\n return {\n ...rest,\n encryptionData: !encryptionData ? undefined : {\n ivHex: uint8ArrayToHex(encryptionData.iv),\n keyHex: uint8ArrayToHex(encryptionData.key),\n },\n };\n }\n\n static recreate<T extends FileDetails>(transferExportData: TransferUploadExportData<T>, config: TransferUploadConfig, chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, concurrencyController: ConcurrencyController, cryptography: CryptographyProvider, acker: TransferUploadAcker): TransferUpload<T> {\n try {\n TransferUpload.validateRecreateParams(transferExportData);\n\n const recreatedInfo = {\n ...transferExportData.info,\n isLegacyTransfer: transferExportData.registeredFiles === undefined,\n };\n\n const transfer = new TransferUpload<T>(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, recreatedInfo, config, concurrencyController, cryptography, acker);\n\n transfer.#transferMetadata = this.recreateTransferMetadata(transferExportData.transferMetadata);\n transfer.#transferState = new TransferUploadState(transferExportData.info.files, eventsEngine, config.currentRatesTimespanInMs, config.progressEventThrottlingInMs, transferExportData.state);\n\n if (transfer.isUploadAppendInfo(transferExportData.info))\n transfer.#transferDownloadUrl = transferExportData.info.transferDownloadUrl;\n\n if (transferExportData.registeredFiles)\n transfer.#filesRegistrar!.recoverFromExportedState(transferExportData.registeredFiles);\n\n return transfer;\n }\n catch (error) {\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n }\n\n private static recreateTransferMetadata(transferMetadata?: TransferUploadExportDataMetadata): TransferUploadMetadata | undefined {\n if (!transferMetadata)\n return undefined;\n\n const { encryptionData, ...rest } = transferMetadata;\n\n return {\n ...rest,\n encryptionData: !encryptionData ? undefined : {\n iv: hexToUint8Array(encryptionData.ivHex),\n key: hexToUint8Array(encryptionData.keyHex),\n },\n };\n }\n\n private static validateRecreateParams<T extends FileDetails>(transferExportData: TransferUploadExportData<T>) {\n if (!transferExportData.info)\n throw new TransferUploadError(`Info must be defined`);\n\n if (!transferExportData.state)\n throw new TransferUploadError(`State must be defined`);\n\n if (transferExportData.transferMetadata && (!transferExportData.transferMetadata.transferId || !transferExportData.transferMetadata.transferKey || !transferExportData.transferMetadata.transferFileServerUrl))\n throw new TransferUploadError(`Not all transfer metadata properties are defined`);\n\n if (transferExportData.transferMetadata?.encryptionData) {\n if (transferExportData.transferMetadata.encryptionData.ivHex.length !== 32)\n throw new TransferUploadError(`Encryption IV must be 16 bytes long`);\n if (transferExportData.transferMetadata.encryptionData.keyHex.length !== 64)\n throw new TransferUploadError(`Encryption key must be 32 bytes long`);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transferUpload.js","sourceRoot":"","sources":["../../../src/uploader/transferUpload.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferUploadState from \"./state/transferUploadState.js\";\nimport TransferUploadError from \"./transferUploadError.js\";\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport TransferUploadEvent from './transferUploadEvent.js';\nimport ChunksIterator from './chunksIterator/chunksIterator.js';\nimport TransferFilesRegistrar, { type RegistrationResult } from './transferFilesRegistrar.js';\nimport mergeAbortAndPauseSignals, { type MergedAbortAndPauseController } from '../utils/mergeAbortAndPauseSignals.js';\nimport ApiError from '../utils/api/apiError.js';\nimport FsError from '../utils/fileSystem/fsError.js';\nimport ApiFilemail449Error from '../utils/api/apiFilemail449Error.js';\nimport { promiseAllSettled } from '../utils/promiseAll.js';\nimport { isTransferFailureAbortReason } from './transferFailureAbortReason.js';\nimport { concatUint8Arrays, hexToUint8Array, uint8ArrayToHex } from '../utils/uint8ArrayUtils.js';\n\nimport type ApiClient from \"../utils/api/apiClient.js\";\nimport type { InitializeTransferRequest } from \"../utils/api/dtos/initializeTransferRequest.js\";\nimport type SendFileChunkRequest from '../utils/api/dtos/sendFileChunkRequest.js';\nimport type FileServerClientFactory from '../utils/api/fileServerClientFactory.js';\nimport type FileDetails from \"../utils/fileSystem/fileDetails.js\";\nimport type TransferUploadMetadata from \"./export/transferUploadMetadata.js\";\nimport type TransferUploadInfo from \"./options/transferUploadInfo.js\";\nimport type { TransferUploadAppendInfo } from './options/transferUploadAppendInfo.js';\nimport type ResetTransferRequest from '../utils/api/dtos/resetTransferRequest.js';\nimport type EventsEngine from '../utils/events/eventsEngine.js';\nimport type FileChunkUploadEventArgs from './eventArgs/fileChunkUploadEventArgs.js';\nimport type FileChunkUploadFailedEventArgs from './eventArgs/fileChunkUploadFailedEventArgs.js';\nimport type ChunkProgressEvent from '../utils/events/chunkProgressEvent.js';\nimport type FinalizeTransferRequest from '../utils/api/dtos/finalizeTransferRequest.js';\nimport type FileUploadEventArgs from './eventArgs/fileUploadEventArgs.js';\nimport type TransferUploadCompletedEventArgs from './eventArgs/transferUploadCompletedEventArgs.js';\nimport type CancelTransferRequest from '../utils/api/dtos/cancelTransferRequest.js';\nimport type ConcurrencyReleaser from \"../utils/concurrencyController/concurrencyReleaser.js\";\nimport type FileUploadFailedEventArgs from './eventArgs/fileUploadFailedEventArgs.js';\nimport type FilesRegistrationBatchFailedEventArgs from './eventArgs/filesRegistrationBatchFailedEventArgs.js';\nimport type FileAckFailedEventArgs from './eventArgs/fileAckFailedEventArgs.js';\nimport type FilesBatchAckFailedEventArgs from './eventArgs/filesBatchAckFailedEventArgs.js';\nimport type TransferUploadAcker from './transferUploadAcker.js';\nimport type RegisteredTransferFile from './registeredTransferFile.js';\nimport type TransferUploadProgressedEventArgs from './eventArgs/transferUploadProgressedEventArgs.js';\nimport type FileChunkUploadProgressedEventArgs from './eventArgs/fileChunkUploadProgressedEventArgs.js';\nimport type UploaderChunkStreamProviderFactory from './chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js';\nimport type TransferUploadConfig from './options/transferUploadConfig.js';\nimport type { PauseSignal } from './pauseController.js';\nimport type ChunkStreamProvider from '../utils/fileSystem/chunkStreamProvider.js';\nimport type ConcurrencyController from '../utils/concurrencyController/concurrencyController.js';\nimport type FileChunkUploadCompletedPartiallyEventArgs from './eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js';\nimport type FileChunkUploadCompletedEventArgs from './eventArgs/fileChunkUploadCompletedEventArgs.js';\nimport type TransferMetadataDeterminedEventArgs from './eventArgs/transferMetadataDeterminedEventArgs.js';\nimport type CryptographyProvider from '../utils/crypto/cryptographyProvider.js';\nimport type { TransferUploadExportData, TransferUploadExportDataAppendInfo, TransferUploadExportDataMetadata } from './export/transferUploadExportData.js';\nimport type UploaderMD5Provider from \"./md5Provider/uploaderMD5Provider.js\";\nimport type FileChunksPlan from \"./fileChunksPlan.js\";\n\nexport default class TransferUpload<T extends FileDetails> {\n #totalSizeInBytes: number;\n\n #chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>;\n #apiClient: ApiClient;\n #fileServerClientFactory: FileServerClientFactory;\n #eventsEngine: EventsEngine;\n #info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>;\n #isLegacyTransfer: boolean;\n #config: TransferUploadConfig;\n #concurrencyController: ConcurrencyController;\n #cryptography: CryptographyProvider;\n #acker: TransferUploadAcker;\n #md5Provider: UploaderMD5Provider<T>;\n\n #transferState?: TransferUploadState;\n #transferMetadata?: TransferUploadMetadata;\n #transferDownloadUrl?: string;\n #transferConfirmationUrl?: string;\n #transferRecipientTrackingLinks?: TransferUploadCompletedEventArgs[`recipientTrackingLinks`];\n\n #pauseSignal: PauseSignal | undefined;\n #abortSignal: AbortSignal | undefined;\n #mergedPauseAndAbortController: MergedAbortAndPauseController | undefined;\n\n #filesRegistrar: TransferFilesRegistrar | undefined;\n\n pauseEventListener: (() => void) | undefined;\n abortEventListener: (() => void) | undefined;\n\n #isRunMethodRunning = false;\n\n get status(): TransferStatus {\n return this.#transferState?.status ?? TransferStatus.Initialized;\n }\n\n get completedFilesCount(): number {\n return this.#transferState?.completedFilesCount ?? 0;\n }\n\n get failedFilesCount(): number {\n return this.#transferState?.failedFilesCount ?? 0;\n }\n\n get uploadedBytesCount(): number {\n return this.#transferState?.uploadedBytesCount ?? 0;\n }\n\n get failedBytesCount(): number {\n return this.#transferState?.failedBytesCount ?? 0;\n }\n\n get progressInPercentage(): number {\n if (this.totalSizeInBytes === 0)\n return 0;\n\n return (this.uploadedBytesCount * 100) / this.totalSizeInBytes;\n }\n\n get files(): readonly Readonly<T>[] {\n return this.#info.files;\n }\n\n get totalSizeInBytes(): number {\n return this.#totalSizeInBytes;\n }\n\n get transferId(): string | undefined {\n return this.#transferMetadata?.transferId;\n }\n\n constructor(chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>, config: TransferUploadConfig, concurrencyController: ConcurrencyController, cryptography: CryptographyProvider, acker: TransferUploadAcker, md5Provider: UploaderMD5Provider<T>) {\n if (info.files.length === 0)\n throw new TransferUploadError(`Files can't be empty`);\n\n this.#totalSizeInBytes = info.files.reduce((partialSum, file) => partialSum + file.fileSizeInBytes, 0);\n\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#apiClient = apiClient;\n this.#fileServerClientFactory = fileServerClientFactory;\n this.#eventsEngine = eventsEngine;\n this.#info = info;\n this.#isLegacyTransfer = info.isLegacyTransfer ?? false;\n this.#config = config;\n this.#concurrencyController = concurrencyController;\n this.#cryptography = cryptography;\n this.#acker = acker;\n this.#md5Provider = md5Provider;\n\n this.#filesRegistrar = this.#isLegacyTransfer\n ? undefined\n : new TransferFilesRegistrar(apiClient, eventsEngine, info.files);\n }\n\n private isUploadAppend(): boolean {\n return this.isUploadAppendInfo(this.#info);\n }\n\n private isUploadAppendInfo(info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): info is TransferUploadAppendInfo<T> {\n return (info as TransferUploadAppendInfo<T>).transferKey !== undefined;\n }\n\n private createTransferMetadataFromInfo() {\n if (!this.isUploadAppendInfo(this.#info))\n throw new TransferUploadError(`Options are not TransferUploadAppendOptions`);\n\n this.#transferDownloadUrl = this.#info.transferDownloadUrl;\n\n this.#transferMetadata = {\n transferId: this.#info.transferId,\n transferKey: this.#info.transferKey,\n transferFileServerUrl: this.#info.transferFileServerUrl,\n transferRegion: this.#info.transferRegion,\n encryptionData: this.#info.e2eeData,\n };\n }\n\n async run(transferPauseSignal: PauseSignal, transferAbortSignal: AbortSignal): Promise<void> {\n this.throwIfNotPossibleToRun(transferPauseSignal, transferAbortSignal);\n\n this.#isRunMethodRunning = true;\n\n try {\n this.#pauseSignal = transferPauseSignal;\n this.#abortSignal = transferAbortSignal;\n this.#mergedPauseAndAbortController = mergeAbortAndPauseSignals(transferPauseSignal, transferAbortSignal);\n\n if (!this.#transferState)\n this.#transferState = new TransferUploadState(this.files, this.#eventsEngine, this.#config.currentRatesTimespanInMs, this.#config.progressEventThrottlingInMs);\n else\n this.#transferState.recover();\n\n this.#transferState.transferRun();\n\n this.addPauseAndStopListeners();\n\n if (this.isUploadAppend() && !this.#transferMetadata)\n this.createTransferMetadataFromInfo();\n else if (!this.#transferMetadata)\n await this.startApiTransferAndCreateMetadata();\n\n this.notifyMetadataDetermined();\n\n const chunksPlan = this.createChunksPlan();\n\n this.startBackgroundWorkers(chunksPlan, transferPauseSignal, transferAbortSignal);\n\n const ongoingChunkUploads = new Set<Promise<void>>();\n\n for (const { file, createChunksIterator } of chunksPlan) {\n const fileStatus = this.#transferState.getFile(file.externalId);\n\n if (fileStatus.isCompleted)\n continue;\n\n const registrationResult = await this.waitUntilFileRegistered(file);\n\n if (!registrationResult.isRegisteredSuccessfully)\n continue;\n\n if (fileStatus.isUploadCompleted) {\n this.enqueueFileAck(file);\n continue;\n }\n\n for (const chunk of createChunksIterator()) {\n const releaseSemaphore = await this.#concurrencyController.acquire();\n\n if (this.shouldStopProcessing()) {\n releaseSemaphore();\n break;\n }\n\n const chunkUploadPromise = this.sendChunkAndKeepUpdatingState(file, chunk.startPosition, chunk.sizeInBytes, releaseSemaphore);\n\n const trackedChunkUploadPromise = chunkUploadPromise.finally(() => {\n ongoingChunkUploads.delete(trackedChunkUploadPromise);\n });\n\n ongoingChunkUploads.add(trackedChunkUploadPromise);\n\n if (this.shouldStopProcessing())\n break;\n }\n\n if (this.shouldStopProcessing())\n break;\n }\n\n await promiseAllSettled(Array.from(ongoingChunkUploads));\n\n await this.#acker.flush();\n\n if (this.#transferState.status === TransferStatus.Pausing)\n this.#transferState.transferPaused();\n else if (this.#transferState.status === TransferStatus.Aborting)\n this.#transferState.transferAborted();\n else if (this.uploadedBytesCount !== this.totalSizeInBytes || this.hasUnackedFiles())\n this.#transferState.transferFailed();\n else {\n await this.finalizeTransfer();\n this.#transferState.transferCompleted(this.#transferMetadata!, this.#transferDownloadUrl!, this.#transferConfirmationUrl, this.#transferRecipientTrackingLinks);\n }\n }\n catch (error) {\n // We can get here with pausing or aborting status if any API call fails (e.g., finalizeTransfer) so we need to check the status again\n if (!this.#transferState)\n this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);\n else if (this.#transferState.status === TransferStatus.Pausing) {\n this.#transferState.transferPaused();\n return;\n }\n else if (this.#transferState.status === TransferStatus.Aborting) {\n this.#transferState.transferAborted();\n return;\n }\n else\n this.#transferState.transferFailed();\n\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n finally {\n await this.stopBackgroundWorkers();\n\n this.removePauseAndStopListeners();\n this.#isRunMethodRunning = false;\n }\n }\n\n private startBackgroundWorkers(chunksPlan: readonly FileChunksPlan<T>[], transferPauseSignal: PauseSignal, transferAbortSignal: AbortSignal) {\n const filesToHash = chunksPlan.map(({ file, createChunksIterator }) => ({ file, chunksIterator: createChunksIterator() }));\n const fileAckSuccessfullCallback = (externalFileId: string | number, uploadItemId: string) => this.#transferState!.fileCompleted(externalFileId, uploadItemId);\n const fileAckFailedCallback = (externalFileId: string | number, uploadItemId: string, reason: string, error: Error) => this.#transferState!.fileAckFailed(externalFileId, uploadItemId, reason, error);\n\n this.#md5Provider.start(filesToHash, this.#transferMetadata?.encryptionData, this.#mergedPauseAndAbortController?.signal);\n this.#acker.start(this.#transferMetadata!.transferId, this.#transferMetadata!.transferKey, fileAckSuccessfullCallback, fileAckFailedCallback, transferPauseSignal, transferAbortSignal);\n this.#filesRegistrar?.start(this.#transferMetadata!.transferId, this.#transferMetadata!.transferKey, this.#mergedPauseAndAbortController?.signal);\n }\n\n private createChunksPlan(): FileChunksPlan<T>[] {\n const chunkSizeInBytes = this.#config.chunkSizeInBytes;\n\n return this.files.map(file => {\n // Upload progress mutates these ranges, so both iterators need the same snapshot for this run.\n const alreadySentChunks = this.#transferState!.getChunksForFile(file.externalId).map(chunk => ({ ...chunk }));\n const fileSizeInBytes = file.fileSizeInBytes;\n\n return {\n file,\n createChunksIterator: () => new ChunksIterator(alreadySentChunks, fileSizeInBytes, chunkSizeInBytes).getChunksIterator(),\n };\n });\n }\n\n private async stopBackgroundWorkers() {\n await Promise.allSettled([\n this.#md5Provider?.stop(),\n this.#filesRegistrar?.stop(),\n this.#acker.stop(),\n ]);\n }\n\n private async waitUntilFileRegistered(file: Readonly<T>): Promise<RegistrationResult> {\n if (this.#isLegacyTransfer)\n return { isRegisteredSuccessfully: true };\n\n return await this.#filesRegistrar!.waitUntilFileRegistered(file.externalId);\n }\n\n private notifyMetadataDetermined() {\n const eventArgs: TransferMetadataDeterminedEventArgs = {\n transferId: this.#transferMetadata!.transferId,\n fileServerUrl: this.#transferMetadata!.transferFileServerUrl,\n region: this.#transferMetadata!.transferRegion,\n };\n\n this.#eventsEngine.emit(TransferUploadEvent.TransferMetadataDetermined, eventArgs);\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\n }\n\n private async sendChunkAndKeepUpdatingState(file: T, chunkStartPosition: number, chunkSizeInBytes: number, releaseSemaphore: ConcurrencyReleaser): Promise<void> {\n let uploadedBytesCount = 0;\n\n const registeredFile = this.getRegisteredFile(file.externalId);\n const uploadItemId = registeredFile?.uploadItemId;\n\n try {\n this.#transferState!.chunkUploadStarted(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes);\n\n const chunkStreamProvider = this.#chunkStreamProviderFactory.createChunkStreamProvider(file, chunkStartPosition, chunkSizeInBytes, this.#transferMetadata?.encryptionData);\n\n const progressEventHandler = (eventArgs: ChunkProgressEvent) => {\n uploadedBytesCount += eventArgs.transferredBytesSinceLastEvent;\n this.#transferState!.chunkUploadProgressed(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, eventArgs);\n };\n\n await this.sendChunk(file, registeredFile?.fileId, chunkStreamProvider, progressEventHandler);\n\n if (uploadedBytesCount === chunkSizeInBytes)\n this.#transferState!.chunkUploadCompleted(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes);\n else\n this.#transferState!.chunkUploadCompletedPartially(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal!.paused);\n\n if (this.#transferState!.getFile(file.externalId).isUploadCompleted)\n this.enqueueFileAck(file);\n }\n catch (error) {\n const chunkError = error as Error;\n\n const isTcpPausingError = chunkError.cause !== undefined\n && chunkError.cause instanceof ApiFilemail449Error\n && chunkError.cause.message === `Wrong md5 hash`\n && this.#pauseSignal?.paused === true;\n\n if (isTcpPausingError)\n this.#transferState!.chunkUploadCompletedPartially(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal!.paused);\n else {\n const failedReason = this.getChunkFailedReason(error);\n this.#transferState!.chunkUploadFailed(file.externalId, uploadItemId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, failedReason, error as Error);\n }\n }\n finally {\n releaseSemaphore();\n }\n }\n\n private async sendChunk(file: T, fileId: string | undefined, chunkStreamProvider: ChunkStreamProvider, progressEventHandler: (eventArgs: ChunkProgressEvent) => void): Promise<void> {\n const md5 = await this.#md5Provider.getMd5Checksum(file, chunkStreamProvider.chunkStartPosition);\n\n const request: SendFileChunkRequest = {\n md5,\n chunkLengthInBytes: chunkStreamProvider.chunkLengthInBytes,\n chunkStartPosition: chunkStreamProvider.chunkStartPosition,\n };\n\n const fileServerClient = this.#fileServerClientFactory.createFileServerUploadClient(this.#transferMetadata!.transferFileServerUrl, this.#transferMetadata!.transferId, this.#transferMetadata!.transferKey, file.fileName, file.fileDestinationPathInTransfer, file.fileSizeInBytes, fileId);\n\n const ongoingRequestPromise = fileServerClient.sendFileChunk(request, chunkStreamProvider, this.#pauseSignal!, this.#abortSignal!);\n\n fileServerClient.addEventListener(`progress`, progressEventHandler);\n\n await ongoingRequestPromise;\n }\n\n private getChunkFailedReason(error: unknown) {\n if (error instanceof FsError)\n return `Can't read file. ${error.message}`;\n\n if (error instanceof ApiError) {\n const baseMessage = error.cause?.message ? `${error.message}. ${error.cause.message}` : error.message;\n return error.requestUrl ? `${baseMessage}. Request URL: ${error.requestUrl}` : baseMessage;\n }\n\n return (error as Error)?.message;\n }\n\n private throwIfNotPossibleToRun(pauseSignal: PauseSignal, abortSignal: AbortSignal) {\n if (this.#isRunMethodRunning)\n throw new TransferUploadError(`This transfer is running and cannot be run`);\n\n if (this.#transferState\n && this.#transferState.status !== TransferStatus.Failed\n && this.#transferState.status !== TransferStatus.Aborted\n && this.#transferState.status !== TransferStatus.Initialized\n && this.#transferState.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be run`);\n\n if (this.files.length === 0)\n throw new TransferUploadError(`There are no files passed to the transfer`);\n\n if (pauseSignal.paused)\n throw new TransferUploadError(`Can't run transfer with already paused PauseController`);\n\n if (abortSignal.aborted)\n throw new TransferUploadError(`Can't run transfer with already aborted AbortController`);\n }\n\n private addPauseAndStopListeners() {\n this.pauseEventListener = () => {\n if (this.#transferState!.status !== TransferStatus.Running)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be paused`);\n\n this.#transferState!.transferPauseRequested();\n };\n\n this.abortEventListener = () => {\n if (this.isFailureAbortRequested())\n return;\n\n if (this.#transferState!.status !== TransferStatus.Running)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be stopped`);\n\n this.#transferState!.transferAbortRequested();\n };\n\n this.#pauseSignal!.addEventListener(`pause`, this.pauseEventListener);\n this.#abortSignal!.addEventListener(`abort`, this.abortEventListener);\n }\n\n private removePauseAndStopListeners() {\n this.#pauseSignal!.removeEventListener(`pause`, this.pauseEventListener!);\n this.#abortSignal!.removeEventListener(`abort`, this.abortEventListener!);\n\n this.#mergedPauseAndAbortController?.dispose();\n }\n\n private shouldStopProcessing() {\n return this.#transferState!.status !== TransferStatus.Running || this.#abortSignal?.aborted === true || this.#pauseSignal?.paused === true;\n }\n\n private isFailureAbortRequested() {\n return isTransferFailureAbortReason(this.#abortSignal?.reason);\n }\n\n private async startApiTransferAndCreateMetadata() {\n if (this.isUploadAppendInfo(this.#info))\n throw new TransferUploadError(`Options are not TransferUploadOptions`);\n\n try {\n const encryptionDataAndIvSaltHex = await this.generateEncryptionDataAndIvSaltHmacHex(this.#info.e2eeKey);\n\n const request: InitializeTransferRequest = {\n dataRegion: this.#info.dataRegion,\n e2ee: Boolean(encryptionDataAndIvSaltHex),\n e2ee_keyhash: encryptionDataAndIvSaltHex?.ivSaltHmacHex,\n transfersize: this.totalSizeInBytes,\n to: this.#info.to,\n from: this.#info.from,\n subject: this.#info.subject,\n message: this.#info.message,\n notify: this.#info.notify,\n confirmation: this.#info.confirmation,\n days: this.#info.days,\n password: this.#info.uploadPassword,\n companyid: this.#info.companyId,\n incominglogintoken: this.#info.incomingLoginToken,\n incomingpageid: this.#info.incomingPageId,\n filerequestid: this.#info.fileRequestId,\n filerequestshareid: this.#info.fileRequestShareId,\n customfields: this.#info.customFields,\n filesdb: !this.#isLegacyTransfer,\n };\n\n const response = await this.#apiClient.initializeTransfer(request, this.#mergedPauseAndAbortController?.signal);\n\n this.#transferMetadata = {\n transferId: response.transferId,\n transferKey: response.transferKey,\n transferFileServerUrl: response.transferUrl,\n transferRegion: response.transferRegion,\n encryptionData: encryptionDataAndIvSaltHex?.encryptionData,\n };\n }\n catch (error) {\n throw new TransferUploadError(`Error initializing transfer through the API`, { cause: error as Error });\n }\n }\n\n private getRegisteredFile(externalFileId: string | number): RegisteredTransferFile | undefined {\n return this.#filesRegistrar?.getRegisteredFile(externalFileId);\n }\n\n private enqueueFileAck(file: Readonly<T>): void {\n if (this.#isLegacyTransfer) {\n this.#transferState!.fileCompleted(file.externalId, undefined);\n return;\n }\n\n const registeredFile = this.getRegisteredFile(file.externalId);\n\n if (!registeredFile)\n throw new TransferUploadError(`Can't ack file with external id = ${file.externalId} - no registered file found. The transfer state is malformed.`);\n\n this.#acker.enqueue({ externalFileId: file.externalId, uploadItemId: registeredFile.uploadItemId, sizeInBytes: file.fileSizeInBytes });\n }\n\n private hasUnackedFiles(): boolean {\n if (this.#isLegacyTransfer)\n return false;\n\n return this.files.some(file => !this.#transferState!.getFile(file.externalId).isCompleted);\n }\n\n private async generateEncryptionDataAndIvSaltHmacHex(e2eeKey?: string): Promise<{ encryptionData: { iv: Uint8Array, key: Uint8Array }, ivSaltHmacHex: string, salt: Uint8Array, hmac: Uint8Array } | undefined> {\n if (!e2eeKey)\n return undefined;\n\n const salt = this.#cryptography.generateRandomBytes(16);\n const key = await this.#cryptography.deriveKey(e2eeKey, salt);\n const hmac = await this.#cryptography.generateHmac(key);\n const iv = this.#cryptography.generateRandomBytes(16);\n\n const ivSaltHmac = concatUint8Arrays([iv, salt, hmac]);\n const ivSaltHmacHex = uint8ArrayToHex(ivSaltHmac);\n\n return {\n encryptionData: { iv, key },\n hmac,\n salt,\n ivSaltHmacHex,\n };\n }\n\n private async finalizeTransfer(): Promise<void> {\n this.#eventsEngine.emit(TransferUploadEvent.TransferFinalizing);\n\n if (this.isUploadAppend())\n await this.resetApiTransfer();\n else\n await this.finalizeApiTransfer();\n }\n\n private async resetApiTransfer(): Promise<void> {\n try {\n const request: ResetTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n };\n\n await this.#apiClient.resetTransfer(request, this.#mergedPauseAndAbortController?.signal);\n }\n catch (error) {\n throw new TransferUploadError(`Error resetting transfer through the API`, { cause: error as Error });\n }\n }\n\n private async finalizeApiTransfer(): Promise<void> {\n try {\n const request: FinalizeTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n transferkey: this.#transferMetadata!.transferKey,\n protocol: `tcp`,\n };\n\n const response = await this.#apiClient.finalizeTransfer(request, this.#mergedPauseAndAbortController?.signal);\n\n this.#transferDownloadUrl = response.downloadUrl;\n this.#transferConfirmationUrl = response.confirmationUrl;\n this.#transferRecipientTrackingLinks = response.recipientTrackingLinks;\n }\n catch (error) {\n throw new TransferUploadError(`Error finalizing transfer through the API`, { cause: error as Error });\n }\n }\n\n async cancel(abortSignal?: AbortSignal): Promise<void> {\n try {\n const isTransferApiInitialized = Boolean(this.#transferState) && (Boolean(this.#transferMetadata) || this.isUploadAppend());\n\n if (!isTransferApiInitialized) {\n this.emitCancelEvents();\n return;\n }\n\n this.throwIfInWrongStateToCancel();\n\n this.#transferState!.transferCancelRequested();\n\n if (this.isUploadAppend()) {\n // There is no possibility to cancel transfer upload append on API for now\n }\n else {\n try {\n await this.cancelApiTransfer(abortSignal);\n }\n catch {\n // If API cancel fails we still finalize local transfer state as canceled to avoid hanging in Canceling.\n }\n }\n\n this.#transferState!.transferCanceled();\n }\n catch (error) {\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n }\n\n private emitCancelEvents() {\n this.#eventsEngine.emit(TransferUploadEvent.TransferCancelRequested);\n this.#eventsEngine.emit(TransferUploadEvent.TransferCanceled);\n }\n\n private throwIfInWrongStateToCancel() {\n if (!this.#transferState)\n return;\n\n if (this.#transferState.status !== TransferStatus.Failed\n && this.#transferState.status !== TransferStatus.Aborted\n && this.#transferState.status !== TransferStatus.Initialized\n && this.#transferState.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be canceled`);\n }\n\n private async cancelApiTransfer(abortSignal?: AbortSignal): Promise<void> {\n try {\n const request: CancelTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n transferkey: this.#transferMetadata!.transferKey,\n };\n\n await this.#apiClient.cancelTransfer(request, abortSignal);\n }\n catch (error) {\n throw new TransferUploadError(`Error canceling transfer through the API`, { cause: error as Error });\n }\n }\n\n addEventListener(eventName: TransferUploadEvent.TransferRun | TransferUploadEvent.TransferPauseRequested | TransferUploadEvent.TransferPaused | TransferUploadEvent.TransferAbortRequested | TransferUploadEvent.TransferAborted | TransferUploadEvent.TransferCancelRequested | TransferUploadEvent.TransferCanceled | TransferUploadEvent.TransferFailed, handler: () => void): void\n addEventListener(eventName: TransferUploadEvent.FileUploadStarted | TransferUploadEvent.FileUploadCompleted | TransferUploadEvent.FileCompleted, handler: (event: FileUploadEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileUploadFailed, handler: (event: FileUploadFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FilesRegistrationBatchFailed, handler: (event: FilesRegistrationBatchFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileAckFailed, handler: (event: FileAckFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FilesBatchAckFailed, handler: (event: FilesBatchAckFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadProgressed, handler: (event: FileChunkUploadProgressedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadStarted, handler: (event: FileChunkUploadEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadCompleted, handler: (event: FileChunkUploadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadCompletedPartially, handler: (event: FileChunkUploadCompletedPartiallyEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadFailed, handler: (event: FileChunkUploadFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferProgressed, handler: (event: TransferUploadProgressedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferCompleted, handler: (event: TransferUploadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferMetadataDetermined, handler: (event: TransferMetadataDeterminedEventArgs) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n exportAsString(): string {\n const exportData = this.export();\n return JSON.stringify(exportData);\n }\n\n export(): TransferUploadExportData<T> {\n if (!this.#transferState?.files)\n throw new TransferUploadError(`Can't export not started Transfer`); // fileStatuses are not created yet and it really doesn't make any sens to export not started transfer\n\n return {\n transferMetadata: this.getTransferMetadataExportValue(),\n info: this.getInfoExportValue(),\n state: this.#transferState.export(),\n registeredFiles: this.#filesRegistrar ? Array.from(this.#filesRegistrar.export().entries()) : undefined,\n };\n }\n\n private getInfoExportValue(): Readonly<TransferUploadInfo<T> | TransferUploadExportDataAppendInfo<T>> {\n if (this.isUploadAppendInfo(this.#info)) {\n const { e2eeData, ...appendInfoWithoutE2eeData } = this.#info;\n\n return appendInfoWithoutE2eeData;\n }\n\n // Until the transfer is initialized the key is still needed - a resumed run re-initializes from the info.\n if (!this.#transferMetadata)\n return this.#info;\n\n const { e2eeKey, ...infoWithoutE2eeKey } = this.#info;\n\n return infoWithoutE2eeKey;\n }\n\n private getTransferMetadataExportValue(): TransferUploadExportDataMetadata | undefined {\n if (!this.#transferMetadata)\n return undefined;\n\n const { encryptionData, ...rest } = this.#transferMetadata;\n\n return {\n ...rest,\n encryptionData: !encryptionData ? undefined : {\n ivHex: uint8ArrayToHex(encryptionData.iv),\n keyHex: uint8ArrayToHex(encryptionData.key),\n },\n };\n }\n\n static recreate<T extends FileDetails>(transferExportData: TransferUploadExportData<T>, config: TransferUploadConfig, chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, concurrencyController: ConcurrencyController, cryptography: CryptographyProvider, acker: TransferUploadAcker, md5Provider: UploaderMD5Provider<T>): TransferUpload<T> {\n try {\n TransferUpload.validateRecreateParams(transferExportData);\n\n const recreatedInfo = {\n ...transferExportData.info,\n isLegacyTransfer: transferExportData.registeredFiles === undefined,\n };\n\n const transfer = new TransferUpload<T>(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, recreatedInfo, config, concurrencyController, cryptography, acker, md5Provider);\n\n transfer.#transferMetadata = this.recreateTransferMetadata(transferExportData.transferMetadata);\n transfer.#transferState = new TransferUploadState(transferExportData.info.files, eventsEngine, config.currentRatesTimespanInMs, config.progressEventThrottlingInMs, transferExportData.state);\n\n if (transfer.isUploadAppendInfo(transferExportData.info))\n transfer.#transferDownloadUrl = transferExportData.info.transferDownloadUrl;\n\n if (transferExportData.registeredFiles)\n transfer.#filesRegistrar!.recoverFromExportedState(transferExportData.registeredFiles);\n\n return transfer;\n }\n catch (error) {\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n }\n\n private static recreateTransferMetadata(transferMetadata?: TransferUploadExportDataMetadata): TransferUploadMetadata | undefined {\n if (!transferMetadata)\n return undefined;\n\n const { encryptionData, ...rest } = transferMetadata;\n\n return {\n ...rest,\n encryptionData: !encryptionData ? undefined : {\n iv: hexToUint8Array(encryptionData.ivHex),\n key: hexToUint8Array(encryptionData.keyHex),\n },\n };\n }\n\n private static validateRecreateParams<T extends FileDetails>(transferExportData: TransferUploadExportData<T>) {\n if (!transferExportData.info)\n throw new TransferUploadError(`Info must be defined`);\n\n if (!transferExportData.state)\n throw new TransferUploadError(`State must be defined`);\n\n if (transferExportData.transferMetadata && (!transferExportData.transferMetadata.transferId || !transferExportData.transferMetadata.transferKey || !transferExportData.transferMetadata.transferFileServerUrl))\n throw new TransferUploadError(`Not all transfer metadata properties are defined`);\n\n if (transferExportData.transferMetadata?.encryptionData) {\n if (transferExportData.transferMetadata.encryptionData.ivHex.length !== 32)\n throw new TransferUploadError(`Encryption IV must be 16 bytes long`);\n if (transferExportData.transferMetadata.encryptionData.keyHex.length !== 64)\n throw new TransferUploadError(`Encryption key must be 32 bytes long`);\n }\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sendFileChunkRequest.d.ts","sourceRoot":"","sources":["../../../../../src/utils/api/dtos/sendFileChunkRequest.ts"],"names":[],"mappings":"AAAA,UAAU,oBAAoB;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAED,eAAe,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"sendFileChunkRequest.d.ts","sourceRoot":"","sources":["../../../../../src/utils/api/dtos/sendFileChunkRequest.ts"],"names":[],"mappings":"AAAA,UAAU,oBAAoB;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAED,eAAe,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sendFileChunkRequest.js","sourceRoot":"","sources":["../../../../../src/utils/api/dtos/sendFileChunkRequest.ts"],"names":[],"mappings":"","sourcesContent":["interface SendFileChunkRequest {\n chunkStartPosition: number,\n chunkLengthInBytes: number;\n}\n\nexport default SendFileChunkRequest;"]}
|
|
1
|
+
{"version":3,"file":"sendFileChunkRequest.js","sourceRoot":"","sources":["../../../../../src/utils/api/dtos/sendFileChunkRequest.ts"],"names":[],"mappings":"","sourcesContent":["interface SendFileChunkRequest {\n md5: string,\n chunkStartPosition: number,\n chunkLengthInBytes: number;\n}\n\nexport default SendFileChunkRequest;"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkStreamEncryptionData.d.ts","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamEncryptionData.ts"],"names":[],"mappings":"AAAA,KAAK,yBAAyB,GAAG;IAC7B,EAAE,EAAE,UAAU,CAAC;IACf,GAAG,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkStreamEncryptionData.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamEncryptionData.ts"],"names":[],"mappings":"","sourcesContent":["type ChunkStreamEncryptionData = {\n iv: Uint8Array;\n key: Uint8Array;\n};\n\nexport default ChunkStreamEncryptionData;"]}
|
|
@@ -5,7 +5,6 @@ interface ChunkStreamProvider {
|
|
|
5
5
|
readonly isReleased: boolean;
|
|
6
6
|
readonly chunkStartPosition: number;
|
|
7
7
|
readonly chunkLengthInBytes: number;
|
|
8
|
-
getMd5Checksum(format: `hex` | `base64`, pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<string>;
|
|
9
8
|
getChunkReadStream(pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<ReadableStream | NodeReadableStream>;
|
|
10
9
|
getChunkBlob(): Promise<Blob>;
|
|
11
10
|
getChunkWriteStream(): Promise<{
|
|
@@ -14,9 +13,5 @@ interface ChunkStreamProvider {
|
|
|
14
13
|
}>;
|
|
15
14
|
release(): Promise<void>;
|
|
16
15
|
}
|
|
17
|
-
export type ChunkStreamProviderEncryptionData = {
|
|
18
|
-
iv: Uint8Array;
|
|
19
|
-
key: Uint8Array;
|
|
20
|
-
};
|
|
21
16
|
export default ChunkStreamProvider;
|
|
22
17
|
//# sourceMappingURL=chunkStreamProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkStreamProvider.d.ts","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAErE,UAAU,mBAAmB;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAEpC,
|
|
1
|
+
{"version":3,"file":"chunkStreamProvider.d.ts","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAErE,UAAU,mBAAmB;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAEpC,kBAAkB,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC;IACvH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,QAAQ,CAAC;QAAC,cAAc,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;IACpF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -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
|
|
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 getChunkReadStream(pauseSignal?: PauseSignal, abortSignal?: AbortSignal): Promise<ReadableStream | NodeReadableStream>;\n getChunkBlob(): Promise<Blob>;\n getChunkWriteStream(): Promise<{ fileStream: Writable, decipherStream?: Writable }>;\n release(): Promise<void>;\n}\n\nexport default ChunkStreamProvider;"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import type ChunkStreamEncryptionData from "./chunkStreamEncryptionData.js";
|
|
1
2
|
import type ChunkStreamProvider from "./chunkStreamProvider.js";
|
|
2
|
-
import type { ChunkStreamProviderEncryptionData } from "./chunkStreamProvider.js";
|
|
3
3
|
interface ChunkStreamProviderFactory<T extends string | File> {
|
|
4
|
-
|
|
4
|
+
create(file: T, start: number, size: number, encryptionData?: ChunkStreamEncryptionData): ChunkStreamProvider;
|
|
5
5
|
}
|
|
6
6
|
export default ChunkStreamProviderFactory;
|
|
7
7
|
//# sourceMappingURL=chunkStreamProviderFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkStreamProviderFactory.d.ts","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"chunkStreamProviderFactory.d.ts","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,yBAAyB,MAAM,gCAAgC,CAAC;AAC5E,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAC;AAEhE,UAAU,0BAA0B,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI;IACxD,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,yBAAyB,GAAG,mBAAmB,CAAC;CACjH;AAED,eAAe,0BAA0B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProviderFactory.ts"],"names":[],"mappings":"","sourcesContent":["import type
|
|
1
|
+
{"version":3,"file":"chunkStreamProviderFactory.js","sourceRoot":"","sources":["../../../../src/utils/fileSystem/chunkStreamProviderFactory.ts"],"names":[],"mappings":"","sourcesContent":["import type ChunkStreamEncryptionData from \"./chunkStreamEncryptionData.js\";\nimport type ChunkStreamProvider from \"./chunkStreamProvider.js\";\n\ninterface ChunkStreamProviderFactory<T extends string | File> {\n create(file: T, start: number, size: number, encryptionData?: ChunkStreamEncryptionData): ChunkStreamProvider;\n}\n\nexport default ChunkStreamProviderFactory;"]}
|