filemail-sdk 9.0.2 → 9.0.3

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.
@@ -4,6 +4,8 @@ export default class ChunksIterator {
4
4
  constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, currentChunkSizeProvider: {
5
5
  readonly currentChunkSize: number;
6
6
  });
7
+ private sanitizeChunks;
8
+ private removeZeroByteChunks;
7
9
  getChunksIterator(): IterableIterator<ContinuousChunk>;
8
10
  private isZeroBytesFilesCase;
9
11
  private getNextIteratorValueForZeroBytesFile;
@@ -1 +1 @@
1
- {"version":3,"file":"chunksIterator.d.ts","sourceRoot":"","sources":["../../../../src/uploader/chunksIterator/chunksIterator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,MAAM,CAAC,OAAO,OAAO,cAAc;;gBASnB,iBAAiB,EAAE,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,wBAAwB,EAAE;QAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;IAM7J,iBAAiB,IAAI,gBAAgB,CAAC,eAAe,CAAC;IActD,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,oCAAoC;IAS5C,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,mBAAmB;CAgB9B"}
1
+ {"version":3,"file":"chunksIterator.d.ts","sourceRoot":"","sources":["../../../../src/uploader/chunksIterator/chunksIterator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,MAAM,CAAC,OAAO,OAAO,cAAc;;gBASnB,iBAAiB,EAAE,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,wBAAwB,EAAE;QAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;IAO7J,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,oBAAoB;IAI5B,iBAAiB,IAAI,gBAAgB,CAAC,eAAe,CAAC;IActD,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,oCAAoC;IAS5C,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,mBAAmB;CAgB9B"}
@@ -5,10 +5,17 @@ export default class ChunksIterator {
5
5
  #nextChunkStartPosition = 0;
6
6
  #isValueAlreadyReturnedForZeroBytesFile = false;
7
7
  constructor(alreadySentChunks, fileSizeInBytes, currentChunkSizeProvider) {
8
- this.#alreadySentChunks = alreadySentChunks;
8
+ this.#alreadySentChunks = this.sanitizeChunks(alreadySentChunks);
9
9
  this.#fileSizeInBytes = fileSizeInBytes;
10
10
  this.#currentChunkSizeProvider = currentChunkSizeProvider;
11
11
  }
12
+ // This is an anti corruption layer that can be removed after everybody migrates to desktop > 4.8.2
13
+ sanitizeChunks(alreadySentChunks) {
14
+ return this.removeZeroByteChunks(alreadySentChunks);
15
+ }
16
+ removeZeroByteChunks(alreadySentChunks) {
17
+ return alreadySentChunks.filter(c => c.sizeInBytes > 0);
18
+ }
12
19
  getChunksIterator() {
13
20
  return {
14
21
  [Symbol.iterator]() {
@@ -1 +1 @@
1
- {"version":3,"file":"chunksIterator.js","sourceRoot":"","sources":["../../../../src/uploader/chunksIterator/chunksIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContinuousChunk } from \"../state/continuousChunksCalculator.js\";\r\n\r\nexport default class ChunksIterator {\r\n #alreadySentChunks: readonly Readonly<ContinuousChunk>[];\r\n #fileSizeInBytes: number;\r\n #currentChunkSizeProvider: { readonly currentChunkSize: number };\r\n\r\n #nextChunkStartPosition = 0;\r\n\r\n #isValueAlreadyReturnedForZeroBytesFile = false;\r\n\r\n constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, currentChunkSizeProvider: { readonly currentChunkSize: number }) {\r\n this.#alreadySentChunks = alreadySentChunks;\r\n this.#fileSizeInBytes = fileSizeInBytes;\r\n this.#currentChunkSizeProvider = currentChunkSizeProvider;\r\n }\r\n\r\n getChunksIterator(): IterableIterator<ContinuousChunk> {\r\n return {\r\n [Symbol.iterator](): IterableIterator<ContinuousChunk> {\r\n return this;\r\n },\r\n next: (): IteratorResult<ContinuousChunk> => {\r\n if (this.isZeroBytesFilesCase())\r\n return this.getNextIteratorValueForZeroBytesFile();\r\n\r\n return this.getNextIteratorValue();\r\n },\r\n };\r\n }\r\n\r\n private isZeroBytesFilesCase(): boolean {\r\n return this.#fileSizeInBytes === 0;\r\n }\r\n\r\n private getNextIteratorValueForZeroBytesFile(): IteratorResult<ContinuousChunk> {\r\n if (this.#isValueAlreadyReturnedForZeroBytesFile)\r\n return { value: null, done: true };\r\n\r\n this.#isValueAlreadyReturnedForZeroBytesFile = true;\r\n\r\n return { value: { startPosition: 0, sizeInBytes: 0 }, done: false };\r\n }\r\n\r\n private getNextIteratorValue(): IteratorResult<ContinuousChunk> {\r\n const startPosition = this.getChunkStartPosition(this.#nextChunkStartPosition);\r\n\r\n if (startPosition === this.#fileSizeInBytes)\r\n return { value: null, done: true };\r\n\r\n const sizeInBytes = this.getChunkSizeInBytes(startPosition);\r\n\r\n this.#nextChunkStartPosition = startPosition + sizeInBytes;\r\n\r\n return { value: { startPosition, sizeInBytes }, done: false };\r\n }\r\n\r\n private getChunkStartPosition(nextChunkStartPosition: number): number {\r\n const alreadySentChunkStartingHere = this.#alreadySentChunks.find(c => c.startPosition === nextChunkStartPosition);\r\n\r\n if (!alreadySentChunkStartingHere)\r\n return nextChunkStartPosition;\r\n\r\n const newNextChunkStartPosition = nextChunkStartPosition + alreadySentChunkStartingHere.sizeInBytes;\r\n\r\n return this.getChunkStartPosition(newNextChunkStartPosition);\r\n }\r\n\r\n private getChunkSizeInBytes(newChunkStartPosition: number) {\r\n const currentMaxChunkSize = this.#currentChunkSizeProvider.currentChunkSize;\r\n const newChunkEndPosition = newChunkStartPosition + currentMaxChunkSize - 1;\r\n\r\n const alreadySentChunkStartingInTheMiddle = this.#alreadySentChunks.find(c => newChunkStartPosition < c.startPosition && c.startPosition <= newChunkEndPosition);\r\n\r\n if (alreadySentChunkStartingInTheMiddle)\r\n return alreadySentChunkStartingInTheMiddle.startPosition - newChunkStartPosition;\r\n\r\n const chunkEndsBeyondFile = newChunkEndPosition >= this.#fileSizeInBytes;\r\n\r\n if (chunkEndsBeyondFile)\r\n return this.#fileSizeInBytes - newChunkStartPosition;\r\n\r\n return currentMaxChunkSize;\r\n }\r\n}"]}
1
+ {"version":3,"file":"chunksIterator.js","sourceRoot":"","sources":["../../../../src/uploader/chunksIterator/chunksIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContinuousChunk } from \"../state/continuousChunksCalculator.js\";\r\n\r\nexport default class ChunksIterator {\r\n #alreadySentChunks: readonly Readonly<ContinuousChunk>[];\r\n #fileSizeInBytes: number;\r\n #currentChunkSizeProvider: { readonly currentChunkSize: number };\r\n\r\n #nextChunkStartPosition = 0;\r\n\r\n #isValueAlreadyReturnedForZeroBytesFile = false;\r\n\r\n constructor(alreadySentChunks: readonly Readonly<ContinuousChunk>[], fileSizeInBytes: number, currentChunkSizeProvider: { readonly currentChunkSize: number }) {\r\n this.#alreadySentChunks = this.sanitizeChunks(alreadySentChunks);\r\n this.#fileSizeInBytes = fileSizeInBytes;\r\n this.#currentChunkSizeProvider = currentChunkSizeProvider;\r\n }\r\n\r\n // This is an anti corruption layer that can be removed after everybody migrates to desktop > 4.8.2\r\n private sanitizeChunks(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): readonly Readonly<ContinuousChunk>[] {\r\n return this.removeZeroByteChunks(alreadySentChunks);\r\n }\r\n\r\n private removeZeroByteChunks(alreadySentChunks: readonly Readonly<ContinuousChunk>[]): readonly Readonly<ContinuousChunk>[] {\r\n return alreadySentChunks.filter(c => c.sizeInBytes > 0);\r\n }\r\n\r\n getChunksIterator(): IterableIterator<ContinuousChunk> {\r\n return {\r\n [Symbol.iterator](): IterableIterator<ContinuousChunk> {\r\n return this;\r\n },\r\n next: (): IteratorResult<ContinuousChunk> => {\r\n if (this.isZeroBytesFilesCase())\r\n return this.getNextIteratorValueForZeroBytesFile();\r\n\r\n return this.getNextIteratorValue();\r\n },\r\n };\r\n }\r\n\r\n private isZeroBytesFilesCase(): boolean {\r\n return this.#fileSizeInBytes === 0;\r\n }\r\n\r\n private getNextIteratorValueForZeroBytesFile(): IteratorResult<ContinuousChunk> {\r\n if (this.#isValueAlreadyReturnedForZeroBytesFile)\r\n return { value: null, done: true };\r\n\r\n this.#isValueAlreadyReturnedForZeroBytesFile = true;\r\n\r\n return { value: { startPosition: 0, sizeInBytes: 0 }, done: false };\r\n }\r\n\r\n private getNextIteratorValue(): IteratorResult<ContinuousChunk> {\r\n const startPosition = this.getChunkStartPosition(this.#nextChunkStartPosition);\r\n\r\n if (startPosition === this.#fileSizeInBytes)\r\n return { value: null, done: true };\r\n\r\n const sizeInBytes = this.getChunkSizeInBytes(startPosition);\r\n\r\n this.#nextChunkStartPosition = startPosition + sizeInBytes;\r\n\r\n return { value: { startPosition, sizeInBytes }, done: false };\r\n }\r\n\r\n private getChunkStartPosition(nextChunkStartPosition: number): number {\r\n const alreadySentChunkStartingHere = this.#alreadySentChunks.find(c => c.startPosition === nextChunkStartPosition);\r\n\r\n if (!alreadySentChunkStartingHere)\r\n return nextChunkStartPosition;\r\n\r\n const newNextChunkStartPosition = nextChunkStartPosition + alreadySentChunkStartingHere.sizeInBytes;\r\n\r\n return this.getChunkStartPosition(newNextChunkStartPosition);\r\n }\r\n\r\n private getChunkSizeInBytes(newChunkStartPosition: number) {\r\n const currentMaxChunkSize = this.#currentChunkSizeProvider.currentChunkSize;\r\n const newChunkEndPosition = newChunkStartPosition + currentMaxChunkSize - 1;\r\n\r\n const alreadySentChunkStartingInTheMiddle = this.#alreadySentChunks.find(c => newChunkStartPosition < c.startPosition && c.startPosition <= newChunkEndPosition);\r\n\r\n if (alreadySentChunkStartingInTheMiddle)\r\n return alreadySentChunkStartingInTheMiddle.startPosition - newChunkStartPosition;\r\n\r\n const chunkEndsBeyondFile = newChunkEndPosition >= this.#fileSizeInBytes;\r\n\r\n if (chunkEndsBeyondFile)\r\n return this.#fileSizeInBytes - newChunkStartPosition;\r\n\r\n return currentMaxChunkSize;\r\n }\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"continuousChunksCalculator.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/continuousChunksCalculator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,0BAA0B;;IAG3C,MAAM,IAAI,+BAA+B;IAIzC,OAAO,CAAC,aAAa,EAAE,+BAA+B;IAItD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAIxE,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAI5D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,eAAe;IAS9D,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,iCAAiC;IAWzC,OAAO,CAAC,+BAA+B;IAKvC,OAAO,CAAC,6BAA6B;IAMrC,OAAO,CAAC,0BAA0B;CAIrC;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,+BAA+B,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"continuousChunksCalculator.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/continuousChunksCalculator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,0BAA0B;;IAG3C,MAAM,IAAI,+BAA+B;IAIzC,OAAO,CAAC,aAAa,EAAE,+BAA+B;IAItD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAIxE,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAI5D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,eAAe;IAY9D,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,iCAAiC;IAWzC,OAAO,CAAC,+BAA+B;IAKvC,OAAO,CAAC,6BAA6B;IAMrC,OAAO,CAAC,0BAA0B;CAIrC;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,+BAA+B,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC"}
@@ -13,6 +13,8 @@ export default class ContinuousChunksCalculator {
13
13
  return this.getChunks(fileId).reduce((partialSum, chunk) => partialSum + chunk.sizeInBytes, 0);
14
14
  }
15
15
  addNewChunk(fileId, newChunk) {
16
+ if (newChunk.sizeInBytes === 0)
17
+ return;
16
18
  if (!this.#filesChunks.has(fileId)) {
17
19
  this.initializeNewFileWithNewChunk(fileId, newChunk);
18
20
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"continuousChunksCalculator.js","sourceRoot":"","sources":["../../../../src/uploader/state/continuousChunksCalculator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAC3C,YAAY,GAA4C,IAAI,GAAG,EAAE,CAAC;IAElE,MAAM;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAC,aAA8C;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS,CAAC,MAAuB;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,2BAA2B,CAAC,MAAuB;QAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,WAAW,CAAC,MAAuB,EAAE,QAAyB;QAC1D,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,6BAA6B,CAAC,MAAuB,EAAE,QAAyB;QACpF,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEzC,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,eAAe,CAAC,MAAuB,EAAE,QAAyB;QACtE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;YAE7B,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;YACjC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE9F,MAAM,0CAA0C,GAAG,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,WAAW,CAAC;YACnG,MAAM,yCAAyC,GAAG,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC;YAEhG,MAAM,gCAAgC,GAAG,SAAS,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;YAE1F,MAAM,kBAAkB,GAAG,0CAA0C,KAAK,QAAQ,CAAC,aAAa,CAAC;YACjG,MAAM,oBAAoB,GAAG,SAAS,CAAC,aAAa,KAAK,yCAAyC,CAAC;YACnG,MAAM,oBAAoB,GAAG,SAAS,IAAI,SAAS,CAAC,aAAa,KAAK,yCAAyC,CAAC;YAEhH,IAAI,kBAAkB,IAAI,oBAAoB,EAAE,CAAC;gBAC7C,IAAI,CAAC,iCAAiC,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAC5E,OAAO;YACX,CAAC;YAED,IAAI,kBAAkB,EAAE,CAAC;gBACrB,IAAI,CAAC,+BAA+B,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC1D,OAAO;YACX,CAAC;YAED,IAAI,oBAAoB,EAAE,CAAC;gBACvB,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO;YACX,CAAC;YAED,IAAI,gCAAgC,EAAE,CAAC;gBACnC,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACrD,OAAO;YACX,CAAC;QACL,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEO,iCAAiC,CAAC,MAAuB,EAAE,cAAsB,EAAE,QAAyB,EAAE,eAAuB;QACzI,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAElD,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,CAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,eAAe,CAAE,CAAC;QAEhD,SAAS,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QAEvE,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,+BAA+B,CAAC,MAAuB,EAAE,kBAA0B,EAAE,QAAyB;QAClH,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAClD,UAAU,CAAC,kBAAkB,CAAE,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC;IACxE,CAAC;IAEO,6BAA6B,CAAC,MAAuB,EAAE,QAAyB,EAAE,kBAA0B;QAChH,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAClD,UAAU,CAAC,kBAAkB,CAAE,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;QACvE,UAAU,CAAC,kBAAkB,CAAE,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC;IACxE,CAAC;IAEO,0BAA0B,CAAC,MAAuB,EAAE,eAAuB,EAAE,QAAyB;QAC1G,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAClD,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;CACJ","sourcesContent":["export default class ContinuousChunksCalculator {\r\n #filesChunks: Map<string | number, ContinuousChunk[]> = new Map();\r\n\r\n export(): ContinuousChunksCalculatorState {\r\n return Array.from(this.#filesChunks.entries());\r\n }\r\n\r\n recover(exportedState: ContinuousChunksCalculatorState) {\r\n this.#filesChunks = new Map(exportedState);\r\n }\r\n\r\n getChunks(fileId: string | number): readonly Readonly<ContinuousChunk>[] {\r\n return this.#filesChunks.get(fileId) ?? [];\r\n }\r\n\r\n getChunksUploadedBytesCount(fileId: string | number): number {\r\n return this.getChunks(fileId).reduce((partialSum, chunk) => partialSum + chunk.sizeInBytes, 0);\r\n }\r\n\r\n addNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n if (!this.#filesChunks.has(fileId)) {\r\n this.initializeNewFileWithNewChunk(fileId, newChunk);\r\n return;\r\n }\r\n\r\n this.processNewChunk(fileId, newChunk);\r\n }\r\n\r\n private initializeNewFileWithNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n const initValue = [newChunk];\r\n\r\n this.#filesChunks.set(fileId, initValue);\r\n\r\n return initValue;\r\n }\r\n\r\n private processNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n\r\n for (let i = 0; i < fileChunks.length; i++) {\r\n const nextChunkIndex = i + 1;\r\n\r\n const thisChunk = fileChunks[i]!;\r\n const nextChunk = fileChunks.length > nextChunkIndex ? fileChunks[nextChunkIndex] : undefined;\r\n\r\n const thisChunksNextContinuousChunkStartPosition = thisChunk.startPosition + thisChunk.sizeInBytes;\r\n const newChunksNextContinuousChunkStartPosition = newChunk.startPosition + newChunk.sizeInBytes;\r\n\r\n const isThisChunkStartingAfterNewChunk = thisChunk.startPosition > newChunk.startPosition;\r\n\r\n const canExtendThisChunk = thisChunksNextContinuousChunkStartPosition === newChunk.startPosition;\r\n const canJoinWithThisChunk = thisChunk.startPosition === newChunksNextContinuousChunkStartPosition;\r\n const canJoinWithNextChunk = nextChunk && nextChunk.startPosition === newChunksNextContinuousChunkStartPosition;\r\n\r\n if (canExtendThisChunk && canJoinWithNextChunk) {\r\n this.joinTwoExistingChunksWithNewChunk(fileId, i, newChunk, nextChunkIndex);\r\n return;\r\n }\r\n\r\n if (canExtendThisChunk) {\r\n this.extendExistingChunkWithNewChunk(fileId, i, newChunk);\r\n return;\r\n }\r\n\r\n if (canJoinWithThisChunk) {\r\n this.joinNewChunkWithExistingChunk(fileId, newChunk, i);\r\n return;\r\n }\r\n\r\n if (isThisChunkStartingAfterNewChunk) {\r\n this.insertNewChunkIntoSequence(fileId, i, newChunk);\r\n return;\r\n }\r\n }\r\n\r\n fileChunks.push(newChunk);\r\n }\r\n\r\n private joinTwoExistingChunksWithNewChunk(fileId: string | number, leftChunkIndex: number, newChunk: ContinuousChunk, rightChunkIndex: number) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n\r\n const leftChunk = fileChunks[leftChunkIndex]!;\r\n const rightChunk = fileChunks[rightChunkIndex]!;\r\n\r\n leftChunk.sizeInBytes += newChunk.sizeInBytes + rightChunk.sizeInBytes;\r\n\r\n fileChunks.splice(rightChunkIndex, 1);\r\n }\r\n\r\n private extendExistingChunkWithNewChunk(fileId: string | number, existingChunkIndex: number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks[existingChunkIndex]!.sizeInBytes += newChunk.sizeInBytes;\r\n }\r\n\r\n private joinNewChunkWithExistingChunk(fileId: string | number, newChunk: ContinuousChunk, existingChunkIndex: number) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks[existingChunkIndex]!.startPosition = newChunk.startPosition;\r\n fileChunks[existingChunkIndex]!.sizeInBytes += newChunk.sizeInBytes;\r\n }\r\n\r\n private insertNewChunkIntoSequence(fileId: string | number, indexToInsertAt: number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks.splice(indexToInsertAt, 0, newChunk);\r\n }\r\n}\r\n\r\nexport type ContinuousChunk = { startPosition: number, sizeInBytes: number };\r\nexport type ContinuousChunksCalculatorState = [string | number, ContinuousChunk[]][];"]}
1
+ {"version":3,"file":"continuousChunksCalculator.js","sourceRoot":"","sources":["../../../../src/uploader/state/continuousChunksCalculator.ts"],"names":[],"mappings":"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","sourcesContent":["export default class ContinuousChunksCalculator {\r\n #filesChunks: Map<string | number, ContinuousChunk[]> = new Map();\r\n\r\n export(): ContinuousChunksCalculatorState {\r\n return Array.from(this.#filesChunks.entries());\r\n }\r\n\r\n recover(exportedState: ContinuousChunksCalculatorState) {\r\n this.#filesChunks = new Map(exportedState);\r\n }\r\n\r\n getChunks(fileId: string | number): readonly Readonly<ContinuousChunk>[] {\r\n return this.#filesChunks.get(fileId) ?? [];\r\n }\r\n\r\n getChunksUploadedBytesCount(fileId: string | number): number {\r\n return this.getChunks(fileId).reduce((partialSum, chunk) => partialSum + chunk.sizeInBytes, 0);\r\n }\r\n\r\n addNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n if (newChunk.sizeInBytes === 0)\r\n return;\r\n\r\n if (!this.#filesChunks.has(fileId)) {\r\n this.initializeNewFileWithNewChunk(fileId, newChunk);\r\n return;\r\n }\r\n\r\n this.processNewChunk(fileId, newChunk);\r\n }\r\n\r\n private initializeNewFileWithNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n const initValue = [newChunk];\r\n\r\n this.#filesChunks.set(fileId, initValue);\r\n\r\n return initValue;\r\n }\r\n\r\n private processNewChunk(fileId: string | number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n\r\n for (let i = 0; i < fileChunks.length; i++) {\r\n const nextChunkIndex = i + 1;\r\n\r\n const thisChunk = fileChunks[i]!;\r\n const nextChunk = fileChunks.length > nextChunkIndex ? fileChunks[nextChunkIndex] : undefined;\r\n\r\n const thisChunksNextContinuousChunkStartPosition = thisChunk.startPosition + thisChunk.sizeInBytes;\r\n const newChunksNextContinuousChunkStartPosition = newChunk.startPosition + newChunk.sizeInBytes;\r\n\r\n const isThisChunkStartingAfterNewChunk = thisChunk.startPosition > newChunk.startPosition;\r\n\r\n const canExtendThisChunk = thisChunksNextContinuousChunkStartPosition === newChunk.startPosition;\r\n const canJoinWithThisChunk = thisChunk.startPosition === newChunksNextContinuousChunkStartPosition;\r\n const canJoinWithNextChunk = nextChunk && nextChunk.startPosition === newChunksNextContinuousChunkStartPosition;\r\n\r\n if (canExtendThisChunk && canJoinWithNextChunk) {\r\n this.joinTwoExistingChunksWithNewChunk(fileId, i, newChunk, nextChunkIndex);\r\n return;\r\n }\r\n\r\n if (canExtendThisChunk) {\r\n this.extendExistingChunkWithNewChunk(fileId, i, newChunk);\r\n return;\r\n }\r\n\r\n if (canJoinWithThisChunk) {\r\n this.joinNewChunkWithExistingChunk(fileId, newChunk, i);\r\n return;\r\n }\r\n\r\n if (isThisChunkStartingAfterNewChunk) {\r\n this.insertNewChunkIntoSequence(fileId, i, newChunk);\r\n return;\r\n }\r\n }\r\n\r\n fileChunks.push(newChunk);\r\n }\r\n\r\n private joinTwoExistingChunksWithNewChunk(fileId: string | number, leftChunkIndex: number, newChunk: ContinuousChunk, rightChunkIndex: number) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n\r\n const leftChunk = fileChunks[leftChunkIndex]!;\r\n const rightChunk = fileChunks[rightChunkIndex]!;\r\n\r\n leftChunk.sizeInBytes += newChunk.sizeInBytes + rightChunk.sizeInBytes;\r\n\r\n fileChunks.splice(rightChunkIndex, 1);\r\n }\r\n\r\n private extendExistingChunkWithNewChunk(fileId: string | number, existingChunkIndex: number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks[existingChunkIndex]!.sizeInBytes += newChunk.sizeInBytes;\r\n }\r\n\r\n private joinNewChunkWithExistingChunk(fileId: string | number, newChunk: ContinuousChunk, existingChunkIndex: number) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks[existingChunkIndex]!.startPosition = newChunk.startPosition;\r\n fileChunks[existingChunkIndex]!.sizeInBytes += newChunk.sizeInBytes;\r\n }\r\n\r\n private insertNewChunkIntoSequence(fileId: string | number, indexToInsertAt: number, newChunk: ContinuousChunk) {\r\n const fileChunks = this.#filesChunks.get(fileId)!;\r\n fileChunks.splice(indexToInsertAt, 0, newChunk);\r\n }\r\n}\r\n\r\nexport type ContinuousChunk = { startPosition: number, sizeInBytes: number };\r\nexport type ContinuousChunksCalculatorState = [string | number, ContinuousChunk[]][];"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploadState.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAEnE,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAKjE,OAAO,KAAK,kBAAkB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,WAAW,MAAM,uCAAuC,CAAC;AAMrE,OAAO,KAAK,+BAA+B,MAAM,sCAAsC,CAAC;AACxF,OAAO,KAAK,gCAAgC,MAAM,uCAAuC,CAAC;AAE1F,OAAO,KAAK,yBAAyB,MAAM,wCAAwC,CAAC;AAEpF,OAAO,KAAK,sBAAsB,MAAM,qCAAqC,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,CAAC,OAAO,OAAO,mBAAmB;;IAmBpC,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,KAAK,IAAI,gCAAgC,CAE5C;gBAEW,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM;gBAChI,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,EAAE,aAAa,EAAE,yBAAyB;IAgBtL,OAAO,CAAC,wBAAwB;IAQhC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAInF,MAAM,IAAI,yBAAyB;IAInC,OAAO;IAuBP,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,+BAA+B;IAIzE,OAAO,CAAC,eAAe;IASvB,WAAW;IAQX,sBAAsB;IAMtB,cAAc;IAQd,sBAAsB;IAMtB,eAAe;IAkBf,uBAAuB;IAMvB,gBAAgB;IAQhB,iBAAiB,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM;IASvF,cAAc;IAQd,iBAAiB,CAAC,IAAI,EAAE,uBAAuB;IAO/C,mBAAmB,CAAC,IAAI,EAAE,uBAAuB;IAUjD,gBAAgB,CAAC,IAAI,EAAE,uBAAuB;IAU9C,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAYxG,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,GAAG,IAAI;IAcpJ,OAAO,CAAC,iCAAiC;IAczC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS;IAqBtI,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAwB3L,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAsB1K"}
1
+ {"version":3,"file":"transferUploadState.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAEnE,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAKjE,OAAO,KAAK,kBAAkB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,WAAW,MAAM,uCAAuC,CAAC;AAMrE,OAAO,KAAK,+BAA+B,MAAM,sCAAsC,CAAC;AACxF,OAAO,KAAK,gCAAgC,MAAM,uCAAuC,CAAC;AAE1F,OAAO,KAAK,yBAAyB,MAAM,wCAAwC,CAAC;AAEpF,OAAO,KAAK,sBAAsB,MAAM,qCAAqC,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,CAAC,OAAO,OAAO,mBAAmB;;IAmBpC,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,KAAK,IAAI,gCAAgC,CAE5C;gBAEW,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM;gBAChI,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,EAAE,aAAa,EAAE,yBAAyB;IAgBtL,OAAO,CAAC,wBAAwB;IAQhC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAInF,MAAM,IAAI,yBAAyB;IAInC,OAAO;IAuBP,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,+BAA+B;IAIzE,OAAO,CAAC,eAAe;IASvB,WAAW;IAQX,sBAAsB;IAMtB,cAAc;IAQd,sBAAsB;IAMtB,eAAe;IAkBf,uBAAuB;IAMvB,gBAAgB;IAQhB,iBAAiB,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM;IASvF,cAAc;IAQd,iBAAiB,CAAC,IAAI,EAAE,uBAAuB;IAO/C,mBAAmB,CAAC,IAAI,EAAE,uBAAuB;IAUjD,gBAAgB,CAAC,IAAI,EAAE,uBAAuB;IAU9C,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAYxG,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,GAAG,IAAI;IAcpJ,OAAO,CAAC,iCAAiC;IAczC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS;IAqBtI,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAyB3L,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAsB1K"}
@@ -217,7 +217,8 @@ export default class TransferUploadState {
217
217
  this.#failedBytesCount += failedBytes;
218
218
  if (!file.failedReason)
219
219
  file.failedReason = isPauseRequested ? `Pause requested` : `Chunk upload completed partially`;
220
- this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes: uploadedBytesCount });
220
+ if (uploadedBytesCount > 0)
221
+ this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes: uploadedBytesCount });
221
222
  this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);
222
223
  const eventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, uploadedBytesCount, isPauseRequested, latencyInMsIfUdp };
223
224
  this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs);
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploadState.js","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AAEvC,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AACnE,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAC5D,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAC5D,OAAO,6BAA6B,MAAM,uCAAuC,CAAC;AAClF,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AAqBzE,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACpC,OAAO,GAAmB,cAAc,CAAC,WAAW,CAAC;IAErD,oBAAoB,GAAG,CAAC,CAAC;IACzB,iBAAiB,GAAG,CAAC,CAAC;IACtB,MAAM,GAA6B,EAAE,CAAC;IACtC,aAAa,CAAe;IAE5B,gBAAgB,CAAgC;IAChD,0BAA0B,CAA6B;IACvD,yBAAyB,CAAS;IAElC,mBAAmB,GAAG,CAAC,CAAC;IACxB,iBAAiB,GAAG,CAAC,CAAC;IAEtB,gBAAgB,GAAG,CAAC,CAAC;IAErB,2CAA2C,CAAwF;IAEnI,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAID,YAAY,KAA6B,EAAE,YAA0B,EAAE,wBAAgC,EAAE,2BAAmC,EAAE,aAAyC;QACnL,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,yBAAyB,GAAG,wBAAwB,CAAC;QAE1D,IAAI,CAAC,2CAA2C,GAAG,QAAQ,CAAC,IAAI,CAAC,iCAAiC,EAAE,2BAA2B,CAAC,CAAC;QAEjI,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,CAAC,gBAAgB,GAAG,IAAI,6BAA6B,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACjH,IAAI,CAAC,0BAA0B,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAEnE,IAAI,aAAa;YACb,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC;IAEO,wBAAwB,CAAC,YAAoC;QACjE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEjH,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,CAAC;QAClD,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,UAA2B;QACxC,OAAO,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC;IAED,MAAM;QACF,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,CAAC;IACpD,CAAC;IAED,OAAO;QACH,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAE3B,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAE1B,IAAI,IAAI,CAAC,WAAW;gBAChB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;YAEnC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,CAAC,2BAA2B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvG,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,kBAAkB,CAAC;QACxD,CAAC;IACL,CAAC;IAEO,wBAAwB,CAAC,aAAwC;QACrE,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAEvD,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,UAAU,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE9E,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAE,CAAC,aAAa,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAE,CAAC,WAAW,KAAK,IAAI,CAAC,eAAe,CAAC;YACxI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,CAAC,2BAA2B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvG,IAAI,IAAI,CAAC,WAAW;gBAChB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;YAEnC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,kBAAkB,CAAC;QACxD,CAAC;IACL,CAAC;IAED,OAAO,CAAC,cAA+B;QACnC,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IAEO,eAAe,CAAC,cAA+B;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAEzC,IAAI,CAAC,IAAI;YACL,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,cAAc,gBAAgB,CAAC,CAAC;QAEpF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,WAAW;QACP,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;QAEtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,6BAA6B,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAEjH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED,sBAAsB;QAClB,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;QAEtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC;IAED,cAAc;QACV,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC;QAErC,IAAI,CAAC,2CAA2C,CAAC,KAAK,EAAE,CAAC;QAEzD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;IAChE,CAAC;IAED,sBAAsB;QAClB,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC;QAEvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC;IAED,eAAe;QACX,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;QAEtC,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,IAAI,CAAC,IAAI,CAAC,YAAY;oBAClB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YACtC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,2CAA2C,CAAC,MAAM,EAAE,CAAC;QAE1D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC;IAED,uBAAuB;QACnB,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC;QAExC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,CAAC;IACzE,CAAC;IAED,gBAAgB;QACZ,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC;QAEvC,IAAI,CAAC,2CAA2C,CAAC,MAAM,EAAE,CAAC;QAE1D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAClE,CAAC;IAED,iBAAiB,CAAC,gBAAwC,EAAE,mBAA2B;QACnF,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC;QAExC,IAAI,CAAC,2CAA2C,CAAC,KAAK,EAAE,CAAC;QAEzD,MAAM,SAAS,GAAqC,EAAE,UAAU,EAAE,gBAAgB,CAAC,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC,WAAW,EAAE,mBAAmB,EAAE,CAAC;QAChK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC9E,CAAC;IAED,cAAc;QACV,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC;QAErC,IAAI,CAAC,2CAA2C,CAAC,MAAM,EAAE,CAAC;QAE1D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;IAChE,CAAC;IAED,iBAAiB,CAAC,IAA6B;QAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,MAAM,SAAS,GAAwB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC9E,CAAC;IAED,mBAAmB,CAAC,IAA6B;QAC7C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAE/B,MAAM,SAAS,GAAwB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAChF,CAAC;IAED,gBAAgB,CAAC,IAA6B;QAC1C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAE5B,MAAM,SAAS,GAA8B,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;IAED,kBAAkB,CAAC,cAA+B,EAAE,kBAA0B,EAAE,gBAAwB;QACpG,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC,IAAI,CAAC,eAAe;YACrB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAE7B,MAAM,SAAS,GAA6B,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;QACvG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACnF,CAAC;IAED,qBAAqB,CAAC,cAA+B,EAAE,kBAA0B,EAAE,gBAAwB,EAAE,YAAgC;QACzI,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC,kBAAkB,IAAI,YAAY,CAAC,8BAA8B,CAAC;QACvE,IAAI,CAAC,mBAAmB,IAAI,YAAY,CAAC,8BAA8B,CAAC;QAExE,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,YAAY,CAAC,8BAA8B,CAAC,CAAC;QAEvF,MAAM,SAAS,GAAuC,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,YAAY,CAAC,8BAA8B,EAAE,CAAC;QAC9L,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;QAElF,IAAI,CAAC,2CAA2C,EAAE,CAAC;IACvD,CAAC;IAEO,iCAAiC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAE/E,MAAM,gBAAgB,GAAsC;YACxD,uBAAuB,EAAE,IAAI,CAAC,mBAAmB;YACjD,oBAAoB,EAAE,CAAC,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB;YAC9E,gBAAgB,EAAE,aAAa,CAAC,gBAAgB;YAChD,4BAA4B,EAAE,aAAa,CAAC,yBAAyB;YACrE,4BAA4B,EAAE,aAAa,CAAC,yBAAyB;SACxE,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;IACtF,CAAC;IAED,oBAAoB,CAAC,cAA+B,EAAE,aAAqB,EAAE,WAAmB,EAAE,gBAAoC;QAClI,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;QAE5F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;QAEjE,MAAM,SAAS,GAAsC,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;QAC9J,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;QAEjF,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC;YAC3B,OAAO;QAEX,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,eAAe;YAChD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;aAC9B,IAAI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,eAAe;YAC7E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,6BAA6B,CAAC,cAA+B,EAAE,aAAqB,EAAE,WAAmB,EAAE,kBAA0B,EAAE,gBAAyB,EAAE,gBAAyB;QACvL,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAE7B,MAAM,WAAW,GAAG,WAAW,GAAG,kBAAkB,CAAC;QAErD,IAAI,CAAC,gBAAgB,IAAI,WAAW,CAAC;QACrC,IAAI,CAAC,iBAAiB,IAAI,WAAW,CAAC;QAEtC,IAAI,CAAC,IAAI,CAAC,YAAY;YAClB,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kCAAkC,CAAC;QAElG,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEhH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;QAEjE,MAAM,SAAS,GAA+C,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;QAC7M,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,iCAAiC,EAAE,SAAS,CAAC,CAAC;QAE1F,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,eAAe;YACzG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,iBAAiB,CAAC,cAA+B,EAAE,kBAA0B,EAAE,gBAAwB,EAAE,kBAA0B,EAAE,YAAoB,EAAE,KAAY;QACnK,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAE7B,MAAM,WAAW,GAAG,gBAAgB,CAAC;QAErC,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC;QAC9C,IAAI,CAAC,gBAAgB,IAAI,WAAW,CAAC;QAErC,IAAI,CAAC,mBAAmB,IAAI,kBAAkB,CAAC;QAC/C,IAAI,CAAC,iBAAiB,IAAI,WAAW,CAAC;QAEtC,IAAI,CAAC,IAAI,CAAC,YAAY;YAClB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QAErC,MAAM,SAAS,GAAmC,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC1I,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;QAE9E,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,eAAe;YACzG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACJ","sourcesContent":["/* eslint-disable no-param-reassign */\r\nimport throttle from 'lodash.throttle';\r\n\r\nimport TransferUploadStateFile from \"./transferUploadStateFile.js\";\r\nimport TransferUploadEvent from \"../transferUploadEvent.js\";\r\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport TransferUploadError from \"../transferUploadError.js\";\r\nimport TransferUploadRatesCalculator from \"./transferUploadProgressCalculator.js\";\r\nimport ContinuousChunksCalculator from './continuousChunksCalculator.js';\r\n\r\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\r\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\r\nimport type FileDetails from \"../../utils/fileSystem/fileDetails.js\";\r\nimport type TransferUploadStateFiles from \"./transferUploadStateFiles.js\";\r\nimport type FileChunkUploadFailedEventArgs from \"../eventArgs/fileChunkUploadFailedEventArgs.js\";\r\nimport type FileChunkUploadEventArgs from \"../eventArgs/fileChunkUploadEventArgs.js\";\r\nimport type FileUploadEventArgs from \"../eventArgs/fileUploadEventArgs.js\";\r\nimport type TransferUploadCompletedEventArgs from \"../eventArgs/transferUploadCompletedEventArgs.js\";\r\nimport type ReadonlyTransferUploadStateFile from \"./readonlyTransferUploadStateFile.js\";\r\nimport type ReadonlyTransferUploadStateFiles from \"./readonlyTransferUploadStateFiles.js\";\r\nimport type FileUploadFailedEventArgs from \"../eventArgs/fileUploadFailedEventArgs.js\";\r\nimport type TransferUploadExportState from \"../export/transferUploadExportState.js\";\r\nimport type TransferUploadProgressedEventArgs from \"../eventArgs/transferUploadProgressedEventArgs.js\";\r\nimport type TransferUploadMetadata from '../export/transferUploadMetadata.js';\r\nimport type FileChunkUploadProgressedEventArgs from '../eventArgs/fileChunkUploadProgressedEventArgs.js';\r\nimport type { ContinuousChunk } from './continuousChunksCalculator.js';\r\nimport type FileChunkUploadCompletedPartiallyEventArgs from '../eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js';\r\nimport type FileChunkUploadCompletedEventArgs from '../eventArgs/fileChunkUploadCompletedEventArgs.js';\r\n\r\nexport default class TransferUploadState {\r\n #status: TransferStatus = TransferStatus.Initialized;\r\n\r\n #completedFilesCount = 0;\r\n #failedFilesCount = 0;\r\n #files: TransferUploadStateFiles = {};\r\n #eventsEngine: EventsEngine;\r\n\r\n #ratesCalculator: TransferUploadRatesCalculator;\r\n #continuousChunkCalculator: ContinuousChunksCalculator;\r\n #currentRatesTimespanInMs: number;\r\n\r\n #uploadedBytesCount = 0;\r\n #failedBytesCount = 0;\r\n\r\n #totalBytesCount = 0;\r\n\r\n #getRatesAndNotifyUploadProgressedThrottled: ReturnType<typeof throttle<TransferUploadState[`getRatesAndNotifyUploadProgressed`]>>;\r\n\r\n get status(): TransferStatus {\r\n return this.#status;\r\n }\r\n\r\n get completedFilesCount(): number {\r\n return this.#completedFilesCount;\r\n }\r\n\r\n get failedFilesCount(): number {\r\n return this.#failedFilesCount;\r\n }\r\n\r\n get uploadedBytesCount(): number {\r\n return this.#uploadedBytesCount;\r\n }\r\n\r\n get failedBytesCount(): number {\r\n return this.#failedBytesCount;\r\n }\r\n\r\n get files(): ReadonlyTransferUploadStateFiles {\r\n return this.#files;\r\n }\r\n\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number)\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number, exportedState: TransferUploadExportState)\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number, exportedState?: TransferUploadExportState) {\r\n this.#eventsEngine = eventsEngine;\r\n this.#currentRatesTimespanInMs = currentRatesTimespanInMs;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled = throttle(this.getRatesAndNotifyUploadProgressed, progressEventThrottlingInMs);\r\n\r\n this.initializeTransferStatus(files);\r\n\r\n this.#ratesCalculator = new TransferUploadRatesCalculator(this.#totalBytesCount, this.#currentRatesTimespanInMs);\r\n this.#continuousChunkCalculator = new ContinuousChunksCalculator();\r\n\r\n if (exportedState)\r\n this.recoverFromExportedState(exportedState);\r\n }\r\n\r\n private initializeTransferStatus(filesDetails: readonly FileDetails[]) {\r\n for (const file of filesDetails) {\r\n this.#files[file.externalId] = new TransferUploadStateFile(file.externalId, file.fileSizeInBytes, file.fileName);\r\n\r\n this.#totalBytesCount += file.fileSizeInBytes;\r\n }\r\n }\r\n\r\n getChunksForFile(externalId: string | number): readonly Readonly<ContinuousChunk>[] {\r\n return this.#continuousChunkCalculator.getChunks(externalId);\r\n }\r\n\r\n export(): TransferUploadExportState {\r\n return this.#continuousChunkCalculator.export();\r\n }\r\n\r\n recover() {\r\n this.#status = TransferStatus.Initialized;\r\n this.#completedFilesCount = 0;\r\n this.#uploadedBytesCount = 0;\r\n this.#failedFilesCount = 0;\r\n this.#failedBytesCount = 0;\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n file.isBeingUploaded = false;\r\n file.runningChunksCount = 0;\r\n file.isFailed = false;\r\n file.failedReason = null;\r\n file.failedBytesCount = 0;\r\n\r\n if (file.isCompleted)\r\n this.#completedFilesCount += 1;\r\n\r\n file.uploadedBytesCount = this.#continuousChunkCalculator.getChunksUploadedBytesCount(file.externalId);\r\n\r\n this.#uploadedBytesCount += file.uploadedBytesCount;\r\n }\r\n }\r\n\r\n private recoverFromExportedState(exportedState: TransferUploadExportState) {\r\n this.#continuousChunkCalculator.recover(exportedState);\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n const fileChunks = this.#continuousChunkCalculator.getChunks(file.externalId);\r\n\r\n file.isCompleted = fileChunks.length === 1 && fileChunks[0]!.startPosition === 0 && fileChunks[0]!.sizeInBytes === file.fileSizeInBytes;\r\n file.uploadedBytesCount = this.#continuousChunkCalculator.getChunksUploadedBytesCount(file.externalId);\r\n\r\n if (file.isCompleted)\r\n this.#completedFilesCount += 1;\r\n\r\n this.#uploadedBytesCount += file.uploadedBytesCount;\r\n }\r\n }\r\n\r\n getFile(externalFileId: string | number): ReadonlyTransferUploadStateFile {\r\n return this.getFileInternal(externalFileId);\r\n }\r\n\r\n private getFileInternal(externalFileId: string | number): TransferUploadStateFile {\r\n const file = this.#files[externalFileId];\r\n\r\n if (!file)\r\n throw new TransferUploadError(`File with id = ${externalFileId} doesn't exist`);\r\n\r\n return file;\r\n }\r\n\r\n transferRun() {\r\n this.#status = TransferStatus.Running;\r\n\r\n this.#ratesCalculator = new TransferUploadRatesCalculator(this.#totalBytesCount, this.#currentRatesTimespanInMs);\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferRun);\r\n }\r\n\r\n transferPauseRequested() {\r\n this.#status = TransferStatus.Pausing;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferPauseRequested);\r\n }\r\n\r\n transferPaused() {\r\n this.#status = TransferStatus.Paused;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.flush();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferPaused);\r\n }\r\n\r\n transferAbortRequested() {\r\n this.#status = TransferStatus.Aborting;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferAbortRequested);\r\n }\r\n\r\n transferAborted() {\r\n this.#status = TransferStatus.Aborted;\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n if (file.isBeingUploaded) {\r\n file.isBeingUploaded = false;\r\n file.isFailed = true;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = `Aborted`;\r\n }\r\n }\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferAborted);\r\n }\r\n\r\n transferCancelRequested() {\r\n this.#status = TransferStatus.Canceling;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCancelRequested);\r\n }\r\n\r\n transferCanceled() {\r\n this.#status = TransferStatus.Canceled;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCanceled);\r\n }\r\n\r\n transferCompleted(transferMetadata: TransferUploadMetadata, transferDownloadUrl: string) {\r\n this.#status = TransferStatus.Completed;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.flush();\r\n\r\n const eventArgs: TransferUploadCompletedEventArgs = { transferId: transferMetadata.transferId, transferKey: transferMetadata.transferKey, transferDownloadUrl };\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCompleted, eventArgs);\r\n }\r\n\r\n transferFailed() {\r\n this.#status = TransferStatus.Failed;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);\r\n }\r\n\r\n fileUploadStarted(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = true;\r\n\r\n const eventArgs: FileUploadEventArgs = { fileStatus: file };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadStarted, eventArgs);\r\n }\r\n\r\n fileUploadCompleted(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = false;\r\n file.isCompleted = true;\r\n\r\n this.#completedFilesCount += 1;\r\n\r\n const eventArgs: FileUploadEventArgs = { fileStatus: file };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadCompleted, eventArgs);\r\n }\r\n\r\n fileUploadFailed(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = false;\r\n file.isFailed = true;\r\n\r\n this.#failedFilesCount += 1;\r\n\r\n const eventArgs: FileUploadFailedEventArgs = { fileStatus: file, reason: file.failedReason };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadFailed, eventArgs);\r\n }\r\n\r\n chunkUploadStarted(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n if (!file.isBeingUploaded)\r\n this.fileUploadStarted(file);\r\n\r\n file.runningChunksCount += 1;\r\n\r\n const eventArgs: FileChunkUploadEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadStarted, eventArgs);\r\n }\r\n\r\n chunkUploadProgressed(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number, apiEventArgs: ChunkProgressEvent): void {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.uploadedBytesCount += apiEventArgs.transferredBytesSinceLastEvent;\r\n this.#uploadedBytesCount += apiEventArgs.transferredBytesSinceLastEvent;\r\n\r\n this.#ratesCalculator.addNewProgressEvent(apiEventArgs.transferredBytesSinceLastEvent);\r\n\r\n const eventArgs: FileChunkUploadProgressedEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes, transferredBytesSinceLastEvent: apiEventArgs.transferredBytesSinceLastEvent };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadProgressed, eventArgs);\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled();\r\n }\r\n\r\n private getRatesAndNotifyUploadProgressed() {\r\n const progressStats = this.#ratesCalculator.getRates(this.#uploadedBytesCount);\r\n\r\n const tranferEventArgs: TransferUploadProgressedEventArgs = {\r\n uploadedBytesTotalCount: this.#uploadedBytesCount,\r\n progressInPercentage: (this.#uploadedBytesCount * 100) / this.#totalBytesCount,\r\n remainingSeconds: progressStats.remainingSeconds,\r\n averageSpeedInBytesPerSecond: progressStats.averageSpeedInBytesPerSec,\r\n currentSpeedInBytesPerSecond: progressStats.currentSpeedInBytesPerSec,\r\n };\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferProgressed, tranferEventArgs);\r\n }\r\n\r\n chunkUploadCompleted(externalFileId: string | number, startPosition: number, sizeInBytes: number, latencyInMsIfUdp: number | undefined) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes });\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\r\n\r\n const eventArgs: FileChunkUploadCompletedEventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, latencyInMsIfUdp };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompleted, eventArgs);\r\n\r\n if (file.runningChunksCount > 0)\r\n return;\r\n\r\n if (file.uploadedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadCompleted(file);\r\n else if (file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n\r\n chunkUploadCompletedPartially(externalFileId: string | number, startPosition: number, sizeInBytes: number, uploadedBytesCount: number, isPauseRequested: boolean, latencyInMsIfUdp?: number) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n const failedBytes = sizeInBytes - uploadedBytesCount;\r\n\r\n file.failedBytesCount += failedBytes;\r\n this.#failedBytesCount += failedBytes;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = isPauseRequested ? `Pause requested` : `Chunk upload completed partially`;\r\n\r\n this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes: uploadedBytesCount });\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\r\n\r\n const eventArgs: FileChunkUploadCompletedPartiallyEventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, uploadedBytesCount, isPauseRequested, latencyInMsIfUdp };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs);\r\n\r\n if (file.runningChunksCount === 0 && file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n\r\n chunkUploadFailed(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number, uploadedBytesCount: number, failedReason: string, error: Error) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n const failedBytes = chunkSizeInBytes;\r\n\r\n file.uploadedBytesCount -= uploadedBytesCount;\r\n file.failedBytesCount += failedBytes;\r\n\r\n this.#uploadedBytesCount -= uploadedBytesCount;\r\n this.#failedBytesCount += failedBytes;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = failedReason;\r\n\r\n const eventArgs: FileChunkUploadFailedEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes, reason: failedReason, error };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadFailed, eventArgs);\r\n\r\n if (file.runningChunksCount === 0 && file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n}"]}
1
+ {"version":3,"file":"transferUploadState.js","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\r\nimport throttle from 'lodash.throttle';\r\n\r\nimport TransferUploadStateFile from \"./transferUploadStateFile.js\";\r\nimport TransferUploadEvent from \"../transferUploadEvent.js\";\r\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\r\nimport TransferUploadError from \"../transferUploadError.js\";\r\nimport TransferUploadRatesCalculator from \"./transferUploadProgressCalculator.js\";\r\nimport ContinuousChunksCalculator from './continuousChunksCalculator.js';\r\n\r\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\r\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\r\nimport type FileDetails from \"../../utils/fileSystem/fileDetails.js\";\r\nimport type TransferUploadStateFiles from \"./transferUploadStateFiles.js\";\r\nimport type FileChunkUploadFailedEventArgs from \"../eventArgs/fileChunkUploadFailedEventArgs.js\";\r\nimport type FileChunkUploadEventArgs from \"../eventArgs/fileChunkUploadEventArgs.js\";\r\nimport type FileUploadEventArgs from \"../eventArgs/fileUploadEventArgs.js\";\r\nimport type TransferUploadCompletedEventArgs from \"../eventArgs/transferUploadCompletedEventArgs.js\";\r\nimport type ReadonlyTransferUploadStateFile from \"./readonlyTransferUploadStateFile.js\";\r\nimport type ReadonlyTransferUploadStateFiles from \"./readonlyTransferUploadStateFiles.js\";\r\nimport type FileUploadFailedEventArgs from \"../eventArgs/fileUploadFailedEventArgs.js\";\r\nimport type TransferUploadExportState from \"../export/transferUploadExportState.js\";\r\nimport type TransferUploadProgressedEventArgs from \"../eventArgs/transferUploadProgressedEventArgs.js\";\r\nimport type TransferUploadMetadata from '../export/transferUploadMetadata.js';\r\nimport type FileChunkUploadProgressedEventArgs from '../eventArgs/fileChunkUploadProgressedEventArgs.js';\r\nimport type { ContinuousChunk } from './continuousChunksCalculator.js';\r\nimport type FileChunkUploadCompletedPartiallyEventArgs from '../eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js';\r\nimport type FileChunkUploadCompletedEventArgs from '../eventArgs/fileChunkUploadCompletedEventArgs.js';\r\n\r\nexport default class TransferUploadState {\r\n #status: TransferStatus = TransferStatus.Initialized;\r\n\r\n #completedFilesCount = 0;\r\n #failedFilesCount = 0;\r\n #files: TransferUploadStateFiles = {};\r\n #eventsEngine: EventsEngine;\r\n\r\n #ratesCalculator: TransferUploadRatesCalculator;\r\n #continuousChunkCalculator: ContinuousChunksCalculator;\r\n #currentRatesTimespanInMs: number;\r\n\r\n #uploadedBytesCount = 0;\r\n #failedBytesCount = 0;\r\n\r\n #totalBytesCount = 0;\r\n\r\n #getRatesAndNotifyUploadProgressedThrottled: ReturnType<typeof throttle<TransferUploadState[`getRatesAndNotifyUploadProgressed`]>>;\r\n\r\n get status(): TransferStatus {\r\n return this.#status;\r\n }\r\n\r\n get completedFilesCount(): number {\r\n return this.#completedFilesCount;\r\n }\r\n\r\n get failedFilesCount(): number {\r\n return this.#failedFilesCount;\r\n }\r\n\r\n get uploadedBytesCount(): number {\r\n return this.#uploadedBytesCount;\r\n }\r\n\r\n get failedBytesCount(): number {\r\n return this.#failedBytesCount;\r\n }\r\n\r\n get files(): ReadonlyTransferUploadStateFiles {\r\n return this.#files;\r\n }\r\n\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number)\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number, exportedState: TransferUploadExportState)\r\n constructor(files: readonly FileDetails[], eventsEngine: EventsEngine, currentRatesTimespanInMs: number, progressEventThrottlingInMs: number, exportedState?: TransferUploadExportState) {\r\n this.#eventsEngine = eventsEngine;\r\n this.#currentRatesTimespanInMs = currentRatesTimespanInMs;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled = throttle(this.getRatesAndNotifyUploadProgressed, progressEventThrottlingInMs);\r\n\r\n this.initializeTransferStatus(files);\r\n\r\n this.#ratesCalculator = new TransferUploadRatesCalculator(this.#totalBytesCount, this.#currentRatesTimespanInMs);\r\n this.#continuousChunkCalculator = new ContinuousChunksCalculator();\r\n\r\n if (exportedState)\r\n this.recoverFromExportedState(exportedState);\r\n }\r\n\r\n private initializeTransferStatus(filesDetails: readonly FileDetails[]) {\r\n for (const file of filesDetails) {\r\n this.#files[file.externalId] = new TransferUploadStateFile(file.externalId, file.fileSizeInBytes, file.fileName);\r\n\r\n this.#totalBytesCount += file.fileSizeInBytes;\r\n }\r\n }\r\n\r\n getChunksForFile(externalId: string | number): readonly Readonly<ContinuousChunk>[] {\r\n return this.#continuousChunkCalculator.getChunks(externalId);\r\n }\r\n\r\n export(): TransferUploadExportState {\r\n return this.#continuousChunkCalculator.export();\r\n }\r\n\r\n recover() {\r\n this.#status = TransferStatus.Initialized;\r\n this.#completedFilesCount = 0;\r\n this.#uploadedBytesCount = 0;\r\n this.#failedFilesCount = 0;\r\n this.#failedBytesCount = 0;\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n file.isBeingUploaded = false;\r\n file.runningChunksCount = 0;\r\n file.isFailed = false;\r\n file.failedReason = null;\r\n file.failedBytesCount = 0;\r\n\r\n if (file.isCompleted)\r\n this.#completedFilesCount += 1;\r\n\r\n file.uploadedBytesCount = this.#continuousChunkCalculator.getChunksUploadedBytesCount(file.externalId);\r\n\r\n this.#uploadedBytesCount += file.uploadedBytesCount;\r\n }\r\n }\r\n\r\n private recoverFromExportedState(exportedState: TransferUploadExportState) {\r\n this.#continuousChunkCalculator.recover(exportedState);\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n const fileChunks = this.#continuousChunkCalculator.getChunks(file.externalId);\r\n\r\n file.isCompleted = fileChunks.length === 1 && fileChunks[0]!.startPosition === 0 && fileChunks[0]!.sizeInBytes === file.fileSizeInBytes;\r\n file.uploadedBytesCount = this.#continuousChunkCalculator.getChunksUploadedBytesCount(file.externalId);\r\n\r\n if (file.isCompleted)\r\n this.#completedFilesCount += 1;\r\n\r\n this.#uploadedBytesCount += file.uploadedBytesCount;\r\n }\r\n }\r\n\r\n getFile(externalFileId: string | number): ReadonlyTransferUploadStateFile {\r\n return this.getFileInternal(externalFileId);\r\n }\r\n\r\n private getFileInternal(externalFileId: string | number): TransferUploadStateFile {\r\n const file = this.#files[externalFileId];\r\n\r\n if (!file)\r\n throw new TransferUploadError(`File with id = ${externalFileId} doesn't exist`);\r\n\r\n return file;\r\n }\r\n\r\n transferRun() {\r\n this.#status = TransferStatus.Running;\r\n\r\n this.#ratesCalculator = new TransferUploadRatesCalculator(this.#totalBytesCount, this.#currentRatesTimespanInMs);\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferRun);\r\n }\r\n\r\n transferPauseRequested() {\r\n this.#status = TransferStatus.Pausing;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferPauseRequested);\r\n }\r\n\r\n transferPaused() {\r\n this.#status = TransferStatus.Paused;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.flush();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferPaused);\r\n }\r\n\r\n transferAbortRequested() {\r\n this.#status = TransferStatus.Aborting;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferAbortRequested);\r\n }\r\n\r\n transferAborted() {\r\n this.#status = TransferStatus.Aborted;\r\n\r\n for (const [, file] of Object.entries(this.#files)) {\r\n if (file.isBeingUploaded) {\r\n file.isBeingUploaded = false;\r\n file.isFailed = true;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = `Aborted`;\r\n }\r\n }\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferAborted);\r\n }\r\n\r\n transferCancelRequested() {\r\n this.#status = TransferStatus.Canceling;\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCancelRequested);\r\n }\r\n\r\n transferCanceled() {\r\n this.#status = TransferStatus.Canceled;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCanceled);\r\n }\r\n\r\n transferCompleted(transferMetadata: TransferUploadMetadata, transferDownloadUrl: string) {\r\n this.#status = TransferStatus.Completed;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.flush();\r\n\r\n const eventArgs: TransferUploadCompletedEventArgs = { transferId: transferMetadata.transferId, transferKey: transferMetadata.transferKey, transferDownloadUrl };\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferCompleted, eventArgs);\r\n }\r\n\r\n transferFailed() {\r\n this.#status = TransferStatus.Failed;\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled.cancel();\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);\r\n }\r\n\r\n fileUploadStarted(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = true;\r\n\r\n const eventArgs: FileUploadEventArgs = { fileStatus: file };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadStarted, eventArgs);\r\n }\r\n\r\n fileUploadCompleted(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = false;\r\n file.isCompleted = true;\r\n\r\n this.#completedFilesCount += 1;\r\n\r\n const eventArgs: FileUploadEventArgs = { fileStatus: file };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadCompleted, eventArgs);\r\n }\r\n\r\n fileUploadFailed(file: TransferUploadStateFile) {\r\n file.isBeingUploaded = false;\r\n file.isFailed = true;\r\n\r\n this.#failedFilesCount += 1;\r\n\r\n const eventArgs: FileUploadFailedEventArgs = { fileStatus: file, reason: file.failedReason };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileUploadFailed, eventArgs);\r\n }\r\n\r\n chunkUploadStarted(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n if (!file.isBeingUploaded)\r\n this.fileUploadStarted(file);\r\n\r\n file.runningChunksCount += 1;\r\n\r\n const eventArgs: FileChunkUploadEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadStarted, eventArgs);\r\n }\r\n\r\n chunkUploadProgressed(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number, apiEventArgs: ChunkProgressEvent): void {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.uploadedBytesCount += apiEventArgs.transferredBytesSinceLastEvent;\r\n this.#uploadedBytesCount += apiEventArgs.transferredBytesSinceLastEvent;\r\n\r\n this.#ratesCalculator.addNewProgressEvent(apiEventArgs.transferredBytesSinceLastEvent);\r\n\r\n const eventArgs: FileChunkUploadProgressedEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes, transferredBytesSinceLastEvent: apiEventArgs.transferredBytesSinceLastEvent };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadProgressed, eventArgs);\r\n\r\n this.#getRatesAndNotifyUploadProgressedThrottled();\r\n }\r\n\r\n private getRatesAndNotifyUploadProgressed() {\r\n const progressStats = this.#ratesCalculator.getRates(this.#uploadedBytesCount);\r\n\r\n const tranferEventArgs: TransferUploadProgressedEventArgs = {\r\n uploadedBytesTotalCount: this.#uploadedBytesCount,\r\n progressInPercentage: (this.#uploadedBytesCount * 100) / this.#totalBytesCount,\r\n remainingSeconds: progressStats.remainingSeconds,\r\n averageSpeedInBytesPerSecond: progressStats.averageSpeedInBytesPerSec,\r\n currentSpeedInBytesPerSecond: progressStats.currentSpeedInBytesPerSec,\r\n };\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.TransferProgressed, tranferEventArgs);\r\n }\r\n\r\n chunkUploadCompleted(externalFileId: string | number, startPosition: number, sizeInBytes: number, latencyInMsIfUdp: number | undefined) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes });\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\r\n\r\n const eventArgs: FileChunkUploadCompletedEventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, latencyInMsIfUdp };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompleted, eventArgs);\r\n\r\n if (file.runningChunksCount > 0)\r\n return;\r\n\r\n if (file.uploadedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadCompleted(file);\r\n else if (file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n\r\n chunkUploadCompletedPartially(externalFileId: string | number, startPosition: number, sizeInBytes: number, uploadedBytesCount: number, isPauseRequested: boolean, latencyInMsIfUdp?: number) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n const failedBytes = sizeInBytes - uploadedBytesCount;\r\n\r\n file.failedBytesCount += failedBytes;\r\n this.#failedBytesCount += failedBytes;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = isPauseRequested ? `Pause requested` : `Chunk upload completed partially`;\r\n\r\n if (uploadedBytesCount > 0)\r\n this.#continuousChunkCalculator.addNewChunk(externalFileId, { startPosition, sizeInBytes: uploadedBytesCount });\r\n\r\n this.#eventsEngine.emit(TransferUploadEvent.RecreateDataUpdated);\r\n\r\n const eventArgs: FileChunkUploadCompletedPartiallyEventArgs = { fileStatus: file, chunkStartPosition: startPosition, chunkSizeInBytes: sizeInBytes, uploadedBytesCount, isPauseRequested, latencyInMsIfUdp };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs);\r\n\r\n if (file.runningChunksCount === 0 && file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n\r\n chunkUploadFailed(externalFileId: string | number, chunkStartPosition: number, chunkSizeInBytes: number, uploadedBytesCount: number, failedReason: string, error: Error) {\r\n const file = this.getFileInternal(externalFileId);\r\n\r\n file.runningChunksCount -= 1;\r\n\r\n const failedBytes = chunkSizeInBytes;\r\n\r\n file.uploadedBytesCount -= uploadedBytesCount;\r\n file.failedBytesCount += failedBytes;\r\n\r\n this.#uploadedBytesCount -= uploadedBytesCount;\r\n this.#failedBytesCount += failedBytes;\r\n\r\n if (!file.failedReason)\r\n file.failedReason = failedReason;\r\n\r\n const eventArgs: FileChunkUploadFailedEventArgs = { fileStatus: file, chunkStartPosition, chunkSizeInBytes, reason: failedReason, error };\r\n this.#eventsEngine.emit(TransferUploadEvent.FileChunkUploadFailed, eventArgs);\r\n\r\n if (file.runningChunksCount === 0 && file.uploadedBytesCount + file.failedBytesCount === file.fileSizeInBytes)\r\n this.fileUploadFailed(file);\r\n }\r\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "filemail-sdk",
3
- "version": "9.0.2",
3
+ "version": "9.0.3",
4
4
  "description": "Library for transferring files to and from Filemail.com",
5
5
  "author": "Filemail AS",
6
6
  "license": "BSD-3-Clause",