filemail-sdk 9.4.9 → 10.0.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.
Files changed (205) hide show
  1. package/dist/src/client/downloader/downloaderCore.js +1 -1
  2. package/dist/src/client/downloader/downloaderCore.js.map +1 -1
  3. package/dist/src/client/uploader/node/nodeTransferUploader.d.ts.map +1 -1
  4. package/dist/src/client/uploader/node/nodeTransferUploader.js +6 -5
  5. package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
  6. package/dist/src/client/uploader/transferUploaderBase.d.ts +1 -0
  7. package/dist/src/client/uploader/transferUploaderBase.d.ts.map +1 -1
  8. package/dist/src/client/uploader/transferUploaderBase.js +23 -28
  9. package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
  10. package/dist/src/client/uploader/transferUploaderConfig.d.ts +3 -4
  11. package/dist/src/client/uploader/transferUploaderConfig.d.ts.map +1 -1
  12. package/dist/src/client/uploader/transferUploaderConfig.js.map +1 -1
  13. package/dist/src/client/uploader/utils/uploaderUtils.d.ts.map +1 -1
  14. package/dist/src/client/uploader/utils/uploaderUtils.js +1 -2
  15. package/dist/src/client/uploader/utils/uploaderUtils.js.map +1 -1
  16. package/dist/src/client/uploader/web/webTransferUploader.d.ts.map +1 -1
  17. package/dist/src/client/uploader/web/webTransferUploader.js +5 -4
  18. package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
  19. package/dist/src/downloader/chunkDownloader.js +2 -2
  20. package/dist/src/downloader/chunkDownloader.js.map +1 -1
  21. package/dist/src/index.d.ts +2 -1
  22. package/dist/src/index.d.ts.map +1 -1
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts +1 -1
  25. package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts.map +1 -1
  26. package/dist/src/uploader/api/node/nodeFileServerUploadClient.js +5 -4
  27. package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
  28. package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts +1 -1
  29. package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts.map +1 -1
  30. package/dist/src/uploader/api/web/webFileServerUploadClient.js +5 -4
  31. package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
  32. package/dist/src/uploader/chunksIterator/chunksIterator.d.ts +1 -3
  33. package/dist/src/uploader/chunksIterator/chunksIterator.d.ts.map +1 -1
  34. package/dist/src/uploader/chunksIterator/chunksIterator.js +4 -4
  35. package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
  36. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.d.ts +8 -0
  37. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.d.ts.map +1 -0
  38. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js +2 -0
  39. package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js.map +1 -0
  40. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.d.ts +1 -1
  41. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.d.ts.map +1 -1
  42. package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.js.map +1 -1
  43. package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.d.ts +1 -0
  44. package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.d.ts.map +1 -1
  45. package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.js.map +1 -1
  46. package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.d.ts +1 -0
  47. package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.d.ts.map +1 -1
  48. package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.js.map +1 -1
  49. package/dist/src/uploader/eventArgs/fileUploadEventArgs.d.ts +1 -0
  50. package/dist/src/uploader/eventArgs/fileUploadEventArgs.d.ts.map +1 -1
  51. package/dist/src/uploader/eventArgs/fileUploadEventArgs.js.map +1 -1
  52. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.d.ts +6 -0
  53. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.d.ts.map +1 -0
  54. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js +2 -0
  55. package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js.map +1 -0
  56. package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.d.ts +1 -0
  57. package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.d.ts.map +1 -1
  58. package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.js.map +1 -1
  59. package/dist/src/uploader/export/transferUploadExportData.d.ts +3 -1
  60. package/dist/src/uploader/export/transferUploadExportData.d.ts.map +1 -1
  61. package/dist/src/uploader/export/transferUploadExportData.js.map +1 -1
  62. package/dist/src/uploader/export/transferUploadExportState.d.ts +4 -1
  63. package/dist/src/uploader/export/transferUploadExportState.d.ts.map +1 -1
  64. package/dist/src/uploader/export/transferUploadExportState.js.map +1 -1
  65. package/dist/src/uploader/export/transferUploadMetadata.d.ts +2 -9
  66. package/dist/src/uploader/export/transferUploadMetadata.d.ts.map +1 -1
  67. package/dist/src/uploader/export/transferUploadMetadata.js.map +1 -1
  68. package/dist/src/uploader/options/transferUploadConfig.d.ts +1 -2
  69. package/dist/src/uploader/options/transferUploadConfig.d.ts.map +1 -1
  70. package/dist/src/uploader/options/transferUploadConfig.js.map +1 -1
  71. package/dist/src/uploader/pendingFileAck.d.ts +7 -0
  72. package/dist/src/uploader/pendingFileAck.d.ts.map +1 -0
  73. package/dist/src/uploader/pendingFileAck.js +2 -0
  74. package/dist/src/uploader/pendingFileAck.js.map +1 -0
  75. package/dist/src/uploader/registeredTransferFile.d.ts +6 -0
  76. package/dist/src/uploader/registeredTransferFile.d.ts.map +1 -0
  77. package/dist/src/uploader/registeredTransferFile.js +2 -0
  78. package/dist/src/uploader/registeredTransferFile.js.map +1 -0
  79. package/dist/src/uploader/state/transferUploadState.d.ts +12 -9
  80. package/dist/src/uploader/state/transferUploadState.d.ts.map +1 -1
  81. package/dist/src/uploader/state/transferUploadState.js +56 -27
  82. package/dist/src/uploader/state/transferUploadState.js.map +1 -1
  83. package/dist/src/uploader/state/transferUploadStateFile.d.ts +1 -0
  84. package/dist/src/uploader/state/transferUploadStateFile.d.ts.map +1 -1
  85. package/dist/src/uploader/state/transferUploadStateFile.js +1 -0
  86. package/dist/src/uploader/state/transferUploadStateFile.js.map +1 -1
  87. package/dist/src/uploader/transferUpload.d.ts +17 -14
  88. package/dist/src/uploader/transferUpload.d.ts.map +1 -1
  89. package/dist/src/uploader/transferUpload.js +112 -124
  90. package/dist/src/uploader/transferUpload.js.map +1 -1
  91. package/dist/src/uploader/transferUploadAcker.d.ts +19 -0
  92. package/dist/src/uploader/transferUploadAcker.d.ts.map +1 -0
  93. package/dist/src/uploader/transferUploadAcker.js +119 -0
  94. package/dist/src/uploader/transferUploadAcker.js.map +1 -0
  95. package/dist/src/uploader/transferUploadEvent.d.ts +3 -1
  96. package/dist/src/uploader/transferUploadEvent.d.ts.map +1 -1
  97. package/dist/src/uploader/transferUploadEvent.js +3 -1
  98. package/dist/src/uploader/transferUploadEvent.js.map +1 -1
  99. package/dist/src/utils/api/apiClient.d.ts +6 -0
  100. package/dist/src/utils/api/apiClient.d.ts.map +1 -1
  101. package/dist/src/utils/api/apiClient.js.map +1 -1
  102. package/dist/src/utils/api/apiClientBase.d.ts +0 -2
  103. package/dist/src/utils/api/apiClientBase.d.ts.map +1 -1
  104. package/dist/src/utils/api/apiClientBase.js +6 -13
  105. package/dist/src/utils/api/apiClientBase.js.map +1 -1
  106. package/dist/src/utils/api/dtos/ackTransferFilesRequest.d.ts +9 -0
  107. package/dist/src/utils/api/dtos/ackTransferFilesRequest.d.ts.map +1 -0
  108. package/dist/src/utils/api/dtos/ackTransferFilesRequest.js +2 -0
  109. package/dist/src/utils/api/dtos/ackTransferFilesRequest.js.map +1 -0
  110. package/dist/src/utils/api/dtos/ackTransferFilesResponse.d.ts +7 -0
  111. package/dist/src/utils/api/dtos/ackTransferFilesResponse.d.ts.map +1 -0
  112. package/dist/src/utils/api/dtos/ackTransferFilesResponse.js +2 -0
  113. package/dist/src/utils/api/dtos/ackTransferFilesResponse.js.map +1 -0
  114. package/dist/src/utils/api/dtos/finalizeTransferRequest.d.ts +1 -1
  115. package/dist/src/utils/api/dtos/finalizeTransferRequest.d.ts.map +1 -1
  116. package/dist/src/utils/api/dtos/finalizeTransferRequest.js.map +1 -1
  117. package/dist/src/utils/api/dtos/finalizeTransferResponse.d.ts +2 -0
  118. package/dist/src/utils/api/dtos/finalizeTransferResponse.d.ts.map +1 -1
  119. package/dist/src/utils/api/dtos/finalizeTransferResponse.js.map +1 -1
  120. package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts +1 -0
  121. package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts.map +1 -1
  122. package/dist/src/utils/api/dtos/initializeTransferRequest.js.map +1 -1
  123. package/dist/src/utils/api/dtos/initializeTransferResponse.d.ts +0 -9
  124. package/dist/src/utils/api/dtos/initializeTransferResponse.d.ts.map +1 -1
  125. package/dist/src/utils/api/dtos/initializeTransferResponse.js.map +1 -1
  126. package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts +18 -0
  127. package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts.map +1 -0
  128. package/dist/src/utils/api/dtos/registerTransferFilesRequest.js +2 -0
  129. package/dist/src/utils/api/dtos/registerTransferFilesRequest.js.map +1 -0
  130. package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts +9 -0
  131. package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts.map +1 -0
  132. package/dist/src/utils/api/dtos/registerTransferFilesResponse.js +2 -0
  133. package/dist/src/utils/api/dtos/registerTransferFilesResponse.js.map +1 -0
  134. package/dist/src/utils/api/fileServerClientFactory.d.ts +2 -4
  135. package/dist/src/utils/api/fileServerClientFactory.d.ts.map +1 -1
  136. package/dist/src/utils/api/fileServerClientFactory.js.map +1 -1
  137. package/dist/src/utils/api/node/nodeApiClient.d.ts +6 -0
  138. package/dist/src/utils/api/node/nodeApiClient.d.ts.map +1 -1
  139. package/dist/src/utils/api/node/nodeApiClient.js +27 -2
  140. package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
  141. package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts +2 -4
  142. package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts.map +1 -1
  143. package/dist/src/utils/api/node/nodeFileServerClientFactory.js +3 -7
  144. package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
  145. package/dist/src/utils/api/web/webApiClient.d.ts +6 -0
  146. package/dist/src/utils/api/web/webApiClient.d.ts.map +1 -1
  147. package/dist/src/utils/api/web/webApiClient.js +25 -2
  148. package/dist/src/utils/api/web/webApiClient.js.map +1 -1
  149. package/dist/src/utils/api/web/webFileServerClientFactory.d.ts +2 -4
  150. package/dist/src/utils/api/web/webFileServerClientFactory.d.ts.map +1 -1
  151. package/dist/src/utils/api/web/webFileServerClientFactory.js +3 -6
  152. package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
  153. package/package.json +1 -2
  154. package/dist/src/uploader/api/dtos/handshakeRequest.d.ts +0 -6
  155. package/dist/src/uploader/api/dtos/handshakeRequest.d.ts.map +0 -1
  156. package/dist/src/uploader/api/dtos/handshakeRequest.js +0 -2
  157. package/dist/src/uploader/api/dtos/handshakeRequest.js.map +0 -1
  158. package/dist/src/uploader/api/dtos/handshakeResponse.d.ts +0 -6
  159. package/dist/src/uploader/api/dtos/handshakeResponse.d.ts.map +0 -1
  160. package/dist/src/uploader/api/dtos/handshakeResponse.js +0 -2
  161. package/dist/src/uploader/api/dtos/handshakeResponse.js.map +0 -1
  162. package/dist/src/uploader/api/dtos/pingResponse.d.ts +0 -5
  163. package/dist/src/uploader/api/dtos/pingResponse.d.ts.map +0 -1
  164. package/dist/src/uploader/api/dtos/pingResponse.js +0 -2
  165. package/dist/src/uploader/api/dtos/pingResponse.js.map +0 -1
  166. package/dist/src/uploader/api/dtos/sendChunkRequest.d.ts +0 -10
  167. package/dist/src/uploader/api/dtos/sendChunkRequest.d.ts.map +0 -1
  168. package/dist/src/uploader/api/dtos/sendChunkRequest.js +0 -2
  169. package/dist/src/uploader/api/dtos/sendChunkRequest.js.map +0 -1
  170. package/dist/src/uploader/api/fileServerUdpClient.d.ts +0 -19
  171. package/dist/src/uploader/api/fileServerUdpClient.d.ts.map +0 -1
  172. package/dist/src/uploader/api/fileServerUdpClient.js +0 -2
  173. package/dist/src/uploader/api/fileServerUdpClient.js.map +0 -1
  174. package/dist/src/uploader/api/node/nodeFileServerUdpClient.d.ts +0 -39
  175. package/dist/src/uploader/api/node/nodeFileServerUdpClient.d.ts.map +0 -1
  176. package/dist/src/uploader/api/node/nodeFileServerUdpClient.js +0 -264
  177. package/dist/src/uploader/api/node/nodeFileServerUdpClient.js.map +0 -1
  178. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.d.ts +0 -7
  179. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.d.ts.map +0 -1
  180. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js +0 -2
  181. package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js.map +0 -1
  182. package/dist/src/uploader/optimizer/optimizationValues.d.ts +0 -9
  183. package/dist/src/uploader/optimizer/optimizationValues.d.ts.map +0 -1
  184. package/dist/src/uploader/optimizer/optimizationValues.js +0 -2
  185. package/dist/src/uploader/optimizer/optimizationValues.js.map +0 -1
  186. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts +0 -33
  187. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts.map +0 -1
  188. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js +0 -135
  189. package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map +0 -1
  190. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.d.ts +0 -30
  191. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.d.ts.map +0 -1
  192. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js +0 -106
  193. package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js.map +0 -1
  194. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.d.ts +0 -20
  195. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.d.ts.map +0 -1
  196. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js +0 -2
  197. package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js.map +0 -1
  198. package/dist/src/uploader/optimizer/transferUploadOptimizer.d.ts +0 -27
  199. package/dist/src/uploader/optimizer/transferUploadOptimizer.d.ts.map +0 -1
  200. package/dist/src/uploader/optimizer/transferUploadOptimizer.js +0 -169
  201. package/dist/src/uploader/optimizer/transferUploadOptimizer.js.map +0 -1
  202. package/dist/src/uploader/optimizer/uploadOptimizer.d.ts +0 -11
  203. package/dist/src/uploader/optimizer/uploadOptimizer.d.ts.map +0 -1
  204. package/dist/src/uploader/optimizer/uploadOptimizer.js +0 -2
  205. package/dist/src/uploader/optimizer/uploadOptimizer.js.map +0 -1
@@ -1,106 +0,0 @@
1
- export default class UdpSleepBasedOptimizationStrategy {
2
- #values = {
3
- step: {
4
- chunksAmount: 4,
5
- chunkSize: 12244,
6
- optimizationInterval: 50,
7
- sleep: 1,
8
- },
9
- min: {
10
- chunksAmount: 4,
11
- chunkSize: 15424,
12
- optimizationInterval: 50,
13
- sleep: 0,
14
- },
15
- max: {
16
- chunksAmount: 150,
17
- chunkSize: 64400,
18
- optimizationInterval: 500,
19
- sleep: 50,
20
- },
21
- };
22
- msgSizeErrorHandler(currentOptimizedValues) {
23
- const chunkSize = currentOptimizedValues.chunkSize - 1000;
24
- this.#values.max.chunkSize = chunkSize;
25
- return { chunkSize };
26
- }
27
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
28
- noBufsErrorHandler(_currentOptimizedValues) {
29
- return {
30
- maxParallelChunksAmount: this.#values.min.chunksAmount,
31
- minTimeBetweenChunksStartInMs: this.#values.max.sleep,
32
- };
33
- }
34
- getInitialValues(serverLatencyInMs) {
35
- return {
36
- chunkSize: this.#values.max.chunkSize,
37
- minTimeBetweenChunksStartInMs: (this.#values.max.sleep + this.#values.min.sleep) / 3,
38
- optimizationIntervalInMs: (this.#values.max.optimizationInterval + this.#values.min.optimizationInterval) / 3,
39
- maxParallelChunksAmount: this.#values.max.chunksAmount,
40
- requestTimeoutInMs: serverLatencyInMs * 2,
41
- };
42
- }
43
- getOptimizedValues(_startedChunksTimeHistory, ackedChunksHistory, failedChunksTimeHistory, currentOptimizedValues) {
44
- const finishedChunks = ackedChunksHistory.length + failedChunksTimeHistory.length;
45
- if (finishedChunks === 0 || ackedChunksHistory.length === 0)
46
- return { optimizedValues: currentOptimizedValues, clearChunksHistory: false };
47
- const failuresRate = failedChunksTimeHistory.length / finishedChunks;
48
- const acksRate = 1 - failuresRate;
49
- const optimizedChunkSize = this.getOptimizedChunkSize(acksRate, failuresRate, currentOptimizedValues.chunkSize);
50
- const optimizedValues = {
51
- ...currentOptimizedValues,
52
- chunkSize: optimizedChunkSize,
53
- optimizationIntervalInMs: this.getOptimizedOptimizationInterval(ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),
54
- minTimeBetweenChunksStartInMs: this.getOptimizedMinTimeBetweenChunksStart(currentOptimizedValues.chunkSize, optimizedChunkSize, ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),
55
- requestTimeoutInMs: this.getOptimizedRequestTimeout(ackedChunksHistory),
56
- };
57
- return { optimizedValues, clearChunksHistory: false };
58
- }
59
- getOptimizedRequestTimeout(ackedChunksHistory) {
60
- const averageLatency = ackedChunksHistory.reduce((sum, ack) => sum + ack.latencyInMs, 0) / ackedChunksHistory.length;
61
- const latencyPercentile = this.findLatencyPercentile(ackedChunksHistory);
62
- return Math.max(averageLatency * 4, latencyPercentile);
63
- }
64
- findLatencyPercentile(ackedChunks) {
65
- const latencies = ackedChunks.map(v => v.latencyInMs);
66
- const sortedLatencies = latencies.slice().sort((a, b) => a - b);
67
- const index = Math.ceil(0.90 * (sortedLatencies.length - 1));
68
- return sortedLatencies[index];
69
- }
70
- getOptimizedMinTimeBetweenChunksStart(currentChunkSize, optimizedChunkSize, ackedChunksCount, periodInMs) {
71
- const currentBytesPerMs = (currentChunkSize * ackedChunksCount) / periodInMs;
72
- const wantedBytesPerMs = currentBytesPerMs * 1.4;
73
- return Math.min(optimizedChunkSize / wantedBytesPerMs, this.#values.max.sleep);
74
- }
75
- getOptimizedOptimizationInterval(ackedChunksCount, currentOptimizationIntervalInMs) {
76
- if (ackedChunksCount > 30)
77
- return this.getDecreasedOptimizationInterval(currentOptimizationIntervalInMs);
78
- if (ackedChunksCount < 15)
79
- return this.getIncreasedOptimizationInterval(currentOptimizationIntervalInMs);
80
- return currentOptimizationIntervalInMs;
81
- }
82
- getIncreasedOptimizationInterval = (optimizationIntervalInMs) => {
83
- const interval = optimizationIntervalInMs + this.#values.step.optimizationInterval;
84
- return Math.min(interval, this.#values.max.optimizationInterval);
85
- };
86
- getDecreasedOptimizationInterval = (optimizationIntervalInMs) => {
87
- const interval = optimizationIntervalInMs - this.#values.step.optimizationInterval;
88
- return Math.max(interval, this.#values.min.optimizationInterval);
89
- };
90
- getOptimizedChunkSize(acksRate, failuresRate, currentChunkSize) {
91
- if (failuresRate > 0.4 || acksRate < 0.4)
92
- return this.getDecreasedChunkSize(currentChunkSize);
93
- if (failuresRate < 0.15 && acksRate > 0.6)
94
- return this.getIncreasedChunkSize(currentChunkSize);
95
- return currentChunkSize;
96
- }
97
- getIncreasedChunkSize = (currentChunkSize) => {
98
- const newChunkSize = currentChunkSize + this.#values.step.chunkSize;
99
- return Math.min(newChunkSize, this.#values.max.chunkSize);
100
- };
101
- getDecreasedChunkSize = (currentChunkSize) => {
102
- const newChunkSize = currentChunkSize - this.#values.step.chunkSize;
103
- return Math.max(newChunkSize, this.#values.min.chunkSize);
104
- };
105
- }
106
- //# sourceMappingURL=udpSleepBasedOptimizationStrategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"udpSleepBasedOptimizationStrategy.js","sourceRoot":"","sources":["../../../../../src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import type OptimizationValues from \"../optimizationValues.js\";\nimport type TransferUploadOptimizationStrategy from \"../transferUploadOptimizationStrategy.js\";\n\nexport default class UdpSleepBasedOptimizationStrategy implements TransferUploadOptimizationStrategy {\n #values = {\n step: {\n chunksAmount: 4,\n chunkSize: 12244,\n optimizationInterval: 50,\n sleep: 1,\n },\n min: {\n chunksAmount: 4,\n chunkSize: 15424,\n optimizationInterval: 50,\n sleep: 0,\n },\n max: {\n chunksAmount: 150,\n chunkSize: 64400,\n optimizationInterval: 500,\n sleep: 50,\n },\n };\n\n msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): { chunkSize: number } {\n const chunkSize = currentOptimizedValues.chunkSize - 1000;\n\n this.#values.max.chunkSize = chunkSize;\n\n return { chunkSize };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n noBufsErrorHandler(_currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number } {\n return {\n maxParallelChunksAmount: this.#values.min.chunksAmount,\n minTimeBetweenChunksStartInMs: this.#values.max.sleep,\n };\n }\n\n getInitialValues(serverLatencyInMs: number): OptimizationValues {\n return {\n chunkSize: this.#values.max.chunkSize,\n minTimeBetweenChunksStartInMs: (this.#values.max.sleep + this.#values.min.sleep) / 3,\n optimizationIntervalInMs: (this.#values.max.optimizationInterval + this.#values.min.optimizationInterval) / 3,\n maxParallelChunksAmount: this.#values.max.chunksAmount,\n requestTimeoutInMs: serverLatencyInMs * 2,\n };\n }\n\n getOptimizedValues(_startedChunksTimeHistory: number[], ackedChunksHistory: { time: number, latencyInMs: number }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): { optimizedValues: OptimizationValues, clearChunksHistory: boolean } {\n const finishedChunks = ackedChunksHistory.length + failedChunksTimeHistory.length;\n\n if (finishedChunks === 0 || ackedChunksHistory.length === 0)\n return { optimizedValues: currentOptimizedValues, clearChunksHistory: false };\n\n const failuresRate = failedChunksTimeHistory.length / finishedChunks;\n const acksRate = 1 - failuresRate;\n\n const optimizedChunkSize = this.getOptimizedChunkSize(acksRate, failuresRate, currentOptimizedValues.chunkSize);\n\n const optimizedValues: OptimizationValues = {\n ...currentOptimizedValues,\n chunkSize: optimizedChunkSize,\n optimizationIntervalInMs: this.getOptimizedOptimizationInterval(ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\n minTimeBetweenChunksStartInMs: this.getOptimizedMinTimeBetweenChunksStart(currentOptimizedValues.chunkSize, optimizedChunkSize, ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\n requestTimeoutInMs: this.getOptimizedRequestTimeout(ackedChunksHistory),\n };\n\n return { optimizedValues, clearChunksHistory: false };\n }\n\n private getOptimizedRequestTimeout(ackedChunksHistory: { time: number; latencyInMs: number; }[]) {\n const averageLatency = ackedChunksHistory.reduce((sum, ack) => sum + ack.latencyInMs, 0) / ackedChunksHistory.length;\n const latencyPercentile = this.findLatencyPercentile(ackedChunksHistory);\n\n return Math.max(averageLatency * 4, latencyPercentile);\n }\n\n private findLatencyPercentile(ackedChunks: { time: number; latencyInMs: number; }[]): number {\n const latencies = ackedChunks.map(v => v.latencyInMs);\n const sortedLatencies = latencies.slice().sort((a, b) => a - b);\n const index = Math.ceil(0.90 * (sortedLatencies.length - 1));\n\n return sortedLatencies[index]!;\n }\n\n private getOptimizedMinTimeBetweenChunksStart(currentChunkSize: number, optimizedChunkSize: number, ackedChunksCount: number, periodInMs: number): number {\n const currentBytesPerMs = (currentChunkSize * ackedChunksCount) / periodInMs;\n const wantedBytesPerMs = currentBytesPerMs * 1.4;\n\n return Math.min(optimizedChunkSize / wantedBytesPerMs, this.#values.max.sleep);\n }\n\n private getOptimizedOptimizationInterval(ackedChunksCount: number, currentOptimizationIntervalInMs: number): number {\n if (ackedChunksCount > 30)\n return this.getDecreasedOptimizationInterval(currentOptimizationIntervalInMs);\n\n if (ackedChunksCount < 15)\n return this.getIncreasedOptimizationInterval(currentOptimizationIntervalInMs);\n\n return currentOptimizationIntervalInMs;\n }\n\n private getIncreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\n const interval = optimizationIntervalInMs + this.#values.step.optimizationInterval;\n\n return Math.min(interval, this.#values.max.optimizationInterval);\n };\n\n private getDecreasedOptimizationInterval = (optimizationIntervalInMs: number) => {\n const interval = optimizationIntervalInMs - this.#values.step.optimizationInterval;\n\n return Math.max(interval, this.#values.min.optimizationInterval);\n };\n\n private getOptimizedChunkSize(acksRate: number, failuresRate: number, currentChunkSize: number): number {\n if (failuresRate > 0.4 || acksRate < 0.4)\n return this.getDecreasedChunkSize(currentChunkSize);\n\n if (failuresRate < 0.15 && acksRate > 0.6)\n return this.getIncreasedChunkSize(currentChunkSize);\n\n return currentChunkSize;\n }\n\n private getIncreasedChunkSize = (currentChunkSize: number) => {\n const newChunkSize = currentChunkSize + this.#values.step.chunkSize;\n\n return Math.min(newChunkSize, this.#values.max.chunkSize);\n };\n\n private getDecreasedChunkSize = (currentChunkSize: number) => {\n const newChunkSize = currentChunkSize - this.#values.step.chunkSize;\n\n return Math.max(newChunkSize, this.#values.min.chunkSize);\n };\n}\n"]}
@@ -1,20 +0,0 @@
1
- import type OptimizationValues from "./optimizationValues.js";
2
- interface TransferUploadOptimizationStrategy {
3
- msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): {
4
- chunkSize: number;
5
- };
6
- noBufsErrorHandler(currentOptimizedValues: OptimizationValues): {
7
- maxParallelChunksAmount: number;
8
- minTimeBetweenChunksStartInMs: number;
9
- };
10
- getInitialValues(serverLatencyInMs: number): OptimizationValues;
11
- getOptimizedValues(startedChunksTimeHistory: number[], ackedChunksHistory: {
12
- time: number;
13
- latencyInMs: number;
14
- }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): {
15
- optimizedValues: OptimizationValues;
16
- clearChunksHistory?: boolean;
17
- };
18
- }
19
- export default TransferUploadOptimizationStrategy;
20
- //# sourceMappingURL=transferUploadOptimizationStrategy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transferUploadOptimizationStrategy.d.ts","sourceRoot":"","sources":["../../../../src/uploader/optimizer/transferUploadOptimizationStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAE9D,UAAU,kCAAkC;IACxC,mBAAmB,CAAC,sBAAsB,EAAE,kBAAkB,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACvF,kBAAkB,CAAC,sBAAsB,EAAE,kBAAkB,GAAG;QAAE,uBAAuB,EAAE,MAAM,CAAC;QAAC,6BAA6B,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3I,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAChE,kBAAkB,CAAC,wBAAwB,EAAE,MAAM,EAAE,EAAE,kBAAkB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,EAAE,uBAAuB,EAAE,MAAM,EAAE,EAAE,sBAAsB,EAAE,kBAAkB,GAAG;QAAE,eAAe,EAAE,kBAAkB,CAAC;QAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7Q;AAED,eAAe,kCAAkC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=transferUploadOptimizationStrategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transferUploadOptimizationStrategy.js","sourceRoot":"","sources":["../../../../src/uploader/optimizer/transferUploadOptimizationStrategy.ts"],"names":[],"mappings":"","sourcesContent":["import type OptimizationValues from \"./optimizationValues.js\";\n\ninterface TransferUploadOptimizationStrategy {\n msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): { chunkSize: number };\n noBufsErrorHandler(currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number };\n getInitialValues(serverLatencyInMs: number): OptimizationValues;\n getOptimizedValues(startedChunksTimeHistory: number[], ackedChunksHistory: { time: number, latencyInMs: number }[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): { optimizedValues: OptimizationValues, clearChunksHistory?: boolean };\n}\n\nexport default TransferUploadOptimizationStrategy;"]}
@@ -1,27 +0,0 @@
1
- import type ConcurrencyReleaser from "../../utils/concurrencyController/concurrencyReleaser.js";
2
- import type UploadOptimizer from "./uploadOptimizer.js";
3
- import type EventsEngine from "../../utils/events/eventsEngine.js";
4
- import type TransferUploadOptimizationStrategy from "./transferUploadOptimizationStrategy.js";
5
- export default class TransferUploadOptimizer implements UploadOptimizer {
6
- #private;
7
- constructor(tcpChunkSize: number, tcpChunksUploadInParallel: number, transferEventsEngine: EventsEngine, udpOptimizationStrategy: TransferUploadOptimizationStrategy);
8
- get currentChunkSize(): number;
9
- get currentRequestTimeoutInMs(): number;
10
- get currentSleepTimeInMs(): number;
11
- semaphoreAcquire(): Promise<ConcurrencyReleaser>;
12
- private throwIfNotStarted;
13
- start(isUdp: boolean, serverLatencyInMs: number): void;
14
- stop(): void;
15
- private subscribeToTransferEvents;
16
- private unsubscribeFromTransferEvents;
17
- private chunkUploadStarted;
18
- private chunkUploadSucceeded;
19
- private chunkUploadSucceededPartially;
20
- private chunkUploadFailed;
21
- private isMsgSizeError;
22
- private isNoBufsError;
23
- private isErrorContainingErrorCode;
24
- private trimHistoryArrayToMaxEntries;
25
- private optimize;
26
- }
27
- //# sourceMappingURL=transferUploadOptimizer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transferUploadOptimizer.d.ts","sourceRoot":"","sources":["../../../../src/uploader/optimizer/transferUploadOptimizer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,mBAAmB,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AAInE,OAAO,KAAK,kCAAkC,MAAM,yCAAyC,CAAC;AAK9F,MAAM,CAAC,OAAO,OAAO,uBAAwB,YAAW,eAAe;;gBAoCvD,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,EAAE,oBAAoB,EAAE,YAAY,EAAE,uBAAuB,EAAE,kCAAkC;IAOpK,IAAI,gBAAgB,IAAI,MAAM,CAI7B;IAED,IAAI,yBAAyB,IAAI,MAAM,CAItC;IAED,IAAI,oBAAoB,IAAI,MAAM,CAyBjC;IAEK,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAMtD,OAAO,CAAC,iBAAiB;IAKzB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM;IA8B/C,IAAI;IASJ,OAAO,CAAC,yBAAyB;IAOjC,OAAO,CAAC,6BAA6B;IAOrC,OAAO,CAAC,kBAAkB,CAGxB;IAEF,OAAO,CAAC,oBAAoB,CAG1B;IAEF,OAAO,CAAC,6BAA6B,CAGnC;IAEF,OAAO,CAAC,iBAAiB,CAkBvB;IAEF,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,QAAQ,CAed;CACL"}
@@ -1,169 +0,0 @@
1
- import throttle from "lodash.throttle";
2
- import TransferConcurrencyController from "../../utils/concurrencyController/transferConcurrencyController.js";
3
- import TransferUploadEvent from "../transferUploadEvent.js";
4
- import FsError from "../../utils/fileSystem/fsError.js";
5
- const MAX_OPTIMIZER_HISTORY_ENTRIES = 10_000;
6
- const OPTIMIZER_HISTORY_TRIM_THRESHOLD = 12_000;
7
- export default class TransferUploadOptimizer {
8
- #tcpChunkSize;
9
- #tcpChunksUploadInParallel;
10
- #transferEventsEngine;
11
- #udpOptimizationStrategy;
12
- #concurrencyController;
13
- #isUdp;
14
- #initialOptimizationValues;
15
- #currentOptimizationValues;
16
- #timeout;
17
- #startedChunksTimeHistory = [];
18
- #ackedChunksHistory = [];
19
- #failedChunksTimeHistory = [];
20
- #chunksStartedInThisMs = 0;
21
- #noBufsErrorHandler = throttle(() => {
22
- const result = this.#udpOptimizationStrategy.noBufsErrorHandler(this.#currentOptimizationValues);
23
- this.#currentOptimizationValues.maxParallelChunksAmount = result.maxParallelChunksAmount;
24
- this.#currentOptimizationValues.minTimeBetweenChunksStartInMs = result.minTimeBetweenChunksStartInMs;
25
- this.#concurrencyController.maxConcurrency = this.#currentOptimizationValues.maxParallelChunksAmount;
26
- }, 500, { leading: true, trailing: false });
27
- #msgSizeErrorHandler = throttle(() => {
28
- const result = this.#udpOptimizationStrategy.msgSizeErrorHandler(this.#currentOptimizationValues);
29
- this.#currentOptimizationValues.chunkSize = result.chunkSize;
30
- }, 500, { leading: true, trailing: false });
31
- constructor(tcpChunkSize, tcpChunksUploadInParallel, transferEventsEngine, udpOptimizationStrategy) {
32
- this.#tcpChunkSize = tcpChunkSize;
33
- this.#tcpChunksUploadInParallel = tcpChunksUploadInParallel;
34
- this.#transferEventsEngine = transferEventsEngine;
35
- this.#udpOptimizationStrategy = udpOptimizationStrategy;
36
- }
37
- get currentChunkSize() {
38
- this.throwIfNotStarted();
39
- return this.#currentOptimizationValues.chunkSize;
40
- }
41
- get currentRequestTimeoutInMs() {
42
- this.throwIfNotStarted();
43
- return this.#currentOptimizationValues.requestTimeoutInMs;
44
- }
45
- get currentSleepTimeInMs() {
46
- this.throwIfNotStarted();
47
- if (this.#startedChunksTimeHistory.length === 0)
48
- return 0;
49
- if (this.#currentOptimizationValues.minTimeBetweenChunksStartInMs < 1) {
50
- const chunksToStartPerMs = Math.ceil(1 / this.#currentOptimizationValues.minTimeBetweenChunksStartInMs);
51
- if (this.#chunksStartedInThisMs < chunksToStartPerMs) {
52
- this.#chunksStartedInThisMs += 1;
53
- return 0;
54
- }
55
- this.#chunksStartedInThisMs = 0;
56
- return 1;
57
- }
58
- const lastChunkStartTime = this.#startedChunksTimeHistory[this.#startedChunksTimeHistory.length - 1];
59
- const timeSinceLastStart = new Date().getTime() - lastChunkStartTime;
60
- if (timeSinceLastStart < this.#currentOptimizationValues.minTimeBetweenChunksStartInMs)
61
- return this.#currentOptimizationValues.minTimeBetweenChunksStartInMs - timeSinceLastStart;
62
- return 0;
63
- }
64
- async semaphoreAcquire() {
65
- this.throwIfNotStarted();
66
- return await this.#concurrencyController.acquire();
67
- }
68
- throwIfNotStarted() {
69
- if (this.#isUdp === undefined)
70
- throw new Error(`Optimizer hasn't been started`);
71
- }
72
- start(isUdp, serverLatencyInMs) {
73
- this.#isUdp = isUdp;
74
- if (isUdp) {
75
- this.#initialOptimizationValues = this.#udpOptimizationStrategy.getInitialValues(serverLatencyInMs);
76
- this.#currentOptimizationValues = this.#initialOptimizationValues;
77
- this.#concurrencyController = new TransferConcurrencyController(this.#initialOptimizationValues.maxParallelChunksAmount);
78
- this.subscribeToTransferEvents();
79
- this.#timeout = setTimeout(() => this.optimize(), this.#initialOptimizationValues.optimizationIntervalInMs);
80
- }
81
- else {
82
- this.#timeout = undefined;
83
- this.#initialOptimizationValues = {
84
- chunkSize: this.#tcpChunkSize,
85
- maxParallelChunksAmount: this.#tcpChunksUploadInParallel,
86
- minTimeBetweenChunksStartInMs: 0,
87
- optimizationIntervalInMs: 0,
88
- requestTimeoutInMs: 0,
89
- };
90
- this.#currentOptimizationValues = this.#initialOptimizationValues;
91
- this.#concurrencyController = new TransferConcurrencyController(this.#tcpChunksUploadInParallel);
92
- }
93
- }
94
- stop() {
95
- if (!this.#isUdp)
96
- return;
97
- clearTimeout(this.#timeout);
98
- this.unsubscribeFromTransferEvents();
99
- }
100
- subscribeToTransferEvents() {
101
- this.#transferEventsEngine.addEventListener(TransferUploadEvent.FileChunkUploadStarted, this.chunkUploadStarted);
102
- this.#transferEventsEngine.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, this.chunkUploadSucceeded);
103
- this.#transferEventsEngine.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, this.chunkUploadSucceededPartially);
104
- this.#transferEventsEngine.addEventListener(TransferUploadEvent.FileChunkUploadFailed, this.chunkUploadFailed);
105
- }
106
- unsubscribeFromTransferEvents() {
107
- this.#transferEventsEngine.removeEventListener(TransferUploadEvent.FileChunkUploadStarted, this.chunkUploadStarted);
108
- this.#transferEventsEngine.removeEventListener(TransferUploadEvent.FileChunkUploadCompleted, this.chunkUploadSucceeded);
109
- this.#transferEventsEngine.removeEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, this.chunkUploadSucceededPartially);
110
- this.#transferEventsEngine.removeEventListener(TransferUploadEvent.FileChunkUploadFailed, this.chunkUploadFailed);
111
- }
112
- chunkUploadStarted = () => {
113
- this.#startedChunksTimeHistory.push(Date.now());
114
- this.#startedChunksTimeHistory = this.trimHistoryArrayToMaxEntries(this.#startedChunksTimeHistory);
115
- };
116
- chunkUploadSucceeded = (eventArgs) => {
117
- this.#ackedChunksHistory.push({ time: Date.now(), latencyInMs: eventArgs.latencyInMsIfUdp });
118
- this.#ackedChunksHistory = this.trimHistoryArrayToMaxEntries(this.#ackedChunksHistory);
119
- };
120
- chunkUploadSucceededPartially = (eventArgs) => {
121
- this.#ackedChunksHistory.push({ time: Date.now(), latencyInMs: eventArgs.latencyInMsIfUdp });
122
- this.#ackedChunksHistory = this.trimHistoryArrayToMaxEntries(this.#ackedChunksHistory);
123
- };
124
- chunkUploadFailed = (eventArgs) => {
125
- const isFileAccessError = eventArgs.error.cause instanceof FsError;
126
- if (isFileAccessError)
127
- return;
128
- if (this.isMsgSizeError(eventArgs.error)) {
129
- this.#msgSizeErrorHandler();
130
- return;
131
- }
132
- if (this.isNoBufsError(eventArgs.error)) {
133
- this.#noBufsErrorHandler();
134
- return;
135
- }
136
- this.#failedChunksTimeHistory.push(Date.now());
137
- this.#failedChunksTimeHistory = this.trimHistoryArrayToMaxEntries(this.#failedChunksTimeHistory);
138
- };
139
- isMsgSizeError(error) {
140
- return this.isErrorContainingErrorCode(error, `EMSGSIZE`);
141
- }
142
- isNoBufsError(error) {
143
- return this.isErrorContainingErrorCode(error, `ENOBUFS`);
144
- }
145
- isErrorContainingErrorCode(error, errorCode) {
146
- if (error.message.includes(errorCode))
147
- return true;
148
- if (error.cause)
149
- return this.isErrorContainingErrorCode(error.cause, errorCode);
150
- return false;
151
- }
152
- trimHistoryArrayToMaxEntries(history) {
153
- if (history.length <= OPTIMIZER_HISTORY_TRIM_THRESHOLD)
154
- return history;
155
- return history.slice(history.length - MAX_OPTIMIZER_HISTORY_ENTRIES);
156
- }
157
- optimize = async () => {
158
- const optimizationResult = this.#udpOptimizationStrategy.getOptimizedValues(this.#startedChunksTimeHistory, this.#ackedChunksHistory, this.#failedChunksTimeHistory, this.#currentOptimizationValues);
159
- this.#currentOptimizationValues = optimizationResult.optimizedValues;
160
- this.#concurrencyController.maxConcurrency = this.#currentOptimizationValues.maxParallelChunksAmount;
161
- this.#timeout = setTimeout(() => this.optimize(), optimizationResult.optimizedValues.optimizationIntervalInMs);
162
- if (optimizationResult.clearChunksHistory === false)
163
- return;
164
- this.#startedChunksTimeHistory = [];
165
- this.#ackedChunksHistory = [];
166
- this.#failedChunksTimeHistory = [];
167
- };
168
- }
169
- //# sourceMappingURL=transferUploadOptimizer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transferUploadOptimizer.js","sourceRoot":"","sources":["../../../../src/uploader/optimizer/transferUploadOptimizer.ts"],"names":[],"mappings":"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","sourcesContent":["import throttle from \"lodash.throttle\";\n\nimport TransferConcurrencyController from \"../../utils/concurrencyController/transferConcurrencyController.js\";\nimport TransferUploadEvent from \"../transferUploadEvent.js\";\nimport FsError from \"../../utils/fileSystem/fsError.js\";\n\nimport type OptimizationValues from \"./optimizationValues.js\";\nimport type ConcurrencyController from \"../../utils/concurrencyController/concurrencyController.js\";\nimport type ConcurrencyReleaser from \"../../utils/concurrencyController/concurrencyReleaser.js\";\nimport type UploadOptimizer from \"./uploadOptimizer.js\";\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport type FileChunkUploadFailedEventArgs from \"../eventArgs/fileChunkUploadFailedEventArgs.js\";\nimport type FileChunkUploadCompletedEventArgs from \"../eventArgs/fileChunkUploadCompletedEventArgs.js\";\nimport type FileChunkUploadCompletedPartiallyEventArgs from \"../eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js\";\nimport type TransferUploadOptimizationStrategy from \"./transferUploadOptimizationStrategy.js\";\n\nconst MAX_OPTIMIZER_HISTORY_ENTRIES = 10_000;\nconst OPTIMIZER_HISTORY_TRIM_THRESHOLD = 12_000;\n\nexport default class TransferUploadOptimizer implements UploadOptimizer {\n readonly #tcpChunkSize: number;\n readonly #tcpChunksUploadInParallel: number;\n readonly #transferEventsEngine: EventsEngine;\n readonly #udpOptimizationStrategy: TransferUploadOptimizationStrategy;\n\n #concurrencyController: ConcurrencyController | undefined;\n\n #isUdp: boolean | undefined;\n\n #initialOptimizationValues: OptimizationValues | undefined;\n #currentOptimizationValues: OptimizationValues | undefined;\n\n #timeout: NodeJS.Timeout | undefined;\n\n #startedChunksTimeHistory: number[] = [];\n #ackedChunksHistory: { time: number, latencyInMs: number }[] = [];\n #failedChunksTimeHistory: number[] = [];\n\n #chunksStartedInThisMs = 0;\n\n #noBufsErrorHandler = throttle(() => {\n const result = this.#udpOptimizationStrategy.noBufsErrorHandler(this.#currentOptimizationValues!);\n\n this.#currentOptimizationValues!.maxParallelChunksAmount = result.maxParallelChunksAmount;\n this.#currentOptimizationValues!.minTimeBetweenChunksStartInMs = result.minTimeBetweenChunksStartInMs;\n\n this.#concurrencyController!.maxConcurrency = this.#currentOptimizationValues!.maxParallelChunksAmount;\n }, 500, { leading: true, trailing: false });\n\n #msgSizeErrorHandler = throttle(() => {\n const result = this.#udpOptimizationStrategy.msgSizeErrorHandler(this.#currentOptimizationValues!);\n\n this.#currentOptimizationValues!.chunkSize = result.chunkSize;\n }, 500, { leading: true, trailing: false });\n\n constructor(tcpChunkSize: number, tcpChunksUploadInParallel: number, transferEventsEngine: EventsEngine, udpOptimizationStrategy: TransferUploadOptimizationStrategy) {\n this.#tcpChunkSize = tcpChunkSize;\n this.#tcpChunksUploadInParallel = tcpChunksUploadInParallel;\n this.#transferEventsEngine = transferEventsEngine;\n this.#udpOptimizationStrategy = udpOptimizationStrategy;\n }\n\n get currentChunkSize(): number {\n this.throwIfNotStarted();\n\n return this.#currentOptimizationValues!.chunkSize;\n }\n\n get currentRequestTimeoutInMs(): number {\n this.throwIfNotStarted();\n\n return this.#currentOptimizationValues!.requestTimeoutInMs;\n }\n\n get currentSleepTimeInMs(): number {\n this.throwIfNotStarted();\n\n if (this.#startedChunksTimeHistory.length === 0)\n return 0;\n\n if (this.#currentOptimizationValues!.minTimeBetweenChunksStartInMs < 1) {\n const chunksToStartPerMs = Math.ceil(1 / this.#currentOptimizationValues!.minTimeBetweenChunksStartInMs);\n\n if (this.#chunksStartedInThisMs < chunksToStartPerMs) {\n this.#chunksStartedInThisMs += 1;\n return 0;\n }\n\n this.#chunksStartedInThisMs = 0;\n return 1;\n }\n\n const lastChunkStartTime = this.#startedChunksTimeHistory[this.#startedChunksTimeHistory.length - 1]!;\n const timeSinceLastStart = new Date().getTime() - lastChunkStartTime;\n\n if (timeSinceLastStart < this.#currentOptimizationValues!.minTimeBetweenChunksStartInMs)\n return this.#currentOptimizationValues!.minTimeBetweenChunksStartInMs - timeSinceLastStart;\n\n return 0;\n }\n\n async semaphoreAcquire(): Promise<ConcurrencyReleaser> {\n this.throwIfNotStarted();\n\n return await this.#concurrencyController!.acquire();\n }\n\n private throwIfNotStarted() {\n if (this.#isUdp === undefined)\n throw new Error(`Optimizer hasn't been started`);\n }\n\n start(isUdp: boolean, serverLatencyInMs: number) {\n this.#isUdp = isUdp;\n\n if (isUdp) {\n this.#initialOptimizationValues = this.#udpOptimizationStrategy.getInitialValues(serverLatencyInMs);\n this.#currentOptimizationValues = this.#initialOptimizationValues;\n\n this.#concurrencyController = new TransferConcurrencyController(this.#initialOptimizationValues.maxParallelChunksAmount);\n\n this.subscribeToTransferEvents();\n\n this.#timeout = setTimeout(() => this.optimize(), this.#initialOptimizationValues.optimizationIntervalInMs);\n }\n else {\n this.#timeout = undefined;\n\n this.#initialOptimizationValues = {\n chunkSize: this.#tcpChunkSize,\n maxParallelChunksAmount: this.#tcpChunksUploadInParallel,\n minTimeBetweenChunksStartInMs: 0,\n optimizationIntervalInMs: 0,\n requestTimeoutInMs: 0,\n };\n\n this.#currentOptimizationValues = this.#initialOptimizationValues;\n\n this.#concurrencyController = new TransferConcurrencyController(this.#tcpChunksUploadInParallel);\n }\n }\n\n stop() {\n if (!this.#isUdp)\n return;\n\n clearTimeout(this.#timeout);\n\n this.unsubscribeFromTransferEvents();\n }\n\n private subscribeToTransferEvents() {\n this.#transferEventsEngine.addEventListener(TransferUploadEvent.FileChunkUploadStarted, this.chunkUploadStarted);\n this.#transferEventsEngine.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, this.chunkUploadSucceeded);\n this.#transferEventsEngine.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, this.chunkUploadSucceededPartially);\n this.#transferEventsEngine.addEventListener(TransferUploadEvent.FileChunkUploadFailed, this.chunkUploadFailed);\n }\n\n private unsubscribeFromTransferEvents() {\n this.#transferEventsEngine.removeEventListener(TransferUploadEvent.FileChunkUploadStarted, this.chunkUploadStarted);\n this.#transferEventsEngine.removeEventListener(TransferUploadEvent.FileChunkUploadCompleted, this.chunkUploadSucceeded);\n this.#transferEventsEngine.removeEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, this.chunkUploadSucceededPartially);\n this.#transferEventsEngine.removeEventListener(TransferUploadEvent.FileChunkUploadFailed, this.chunkUploadFailed);\n }\n\n private chunkUploadStarted = () => {\n this.#startedChunksTimeHistory.push(Date.now());\n this.#startedChunksTimeHistory = this.trimHistoryArrayToMaxEntries(this.#startedChunksTimeHistory);\n };\n\n private chunkUploadSucceeded = (eventArgs: FileChunkUploadCompletedEventArgs) => {\n this.#ackedChunksHistory.push({ time: Date.now(), latencyInMs: eventArgs.latencyInMsIfUdp! });\n this.#ackedChunksHistory = this.trimHistoryArrayToMaxEntries(this.#ackedChunksHistory);\n };\n\n private chunkUploadSucceededPartially = (eventArgs: FileChunkUploadCompletedPartiallyEventArgs) => {\n this.#ackedChunksHistory.push({ time: Date.now(), latencyInMs: eventArgs.latencyInMsIfUdp! });\n this.#ackedChunksHistory = this.trimHistoryArrayToMaxEntries(this.#ackedChunksHistory);\n };\n\n private chunkUploadFailed = (eventArgs: FileChunkUploadFailedEventArgs) => {\n const isFileAccessError = eventArgs.error.cause instanceof FsError;\n\n if (isFileAccessError)\n return;\n\n if (this.isMsgSizeError(eventArgs.error)) {\n this.#msgSizeErrorHandler();\n return;\n }\n\n if (this.isNoBufsError(eventArgs.error)) {\n this.#noBufsErrorHandler();\n return;\n }\n\n this.#failedChunksTimeHistory.push(Date.now());\n this.#failedChunksTimeHistory = this.trimHistoryArrayToMaxEntries(this.#failedChunksTimeHistory);\n };\n\n private isMsgSizeError(error: Error) {\n return this.isErrorContainingErrorCode(error, `EMSGSIZE`);\n }\n\n private isNoBufsError(error: Error) {\n return this.isErrorContainingErrorCode(error, `ENOBUFS`);\n }\n\n private isErrorContainingErrorCode(error: Error, errorCode: string): boolean {\n if (error.message.includes(errorCode))\n return true;\n\n if (error.cause)\n return this.isErrorContainingErrorCode(error.cause, errorCode);\n\n return false;\n }\n\n private trimHistoryArrayToMaxEntries<T>(history: T[]): T[] {\n if (history.length <= OPTIMIZER_HISTORY_TRIM_THRESHOLD)\n return history;\n\n return history.slice(history.length - MAX_OPTIMIZER_HISTORY_ENTRIES);\n }\n\n private optimize = async (): Promise<void> => {\n const optimizationResult = this.#udpOptimizationStrategy.getOptimizedValues(this.#startedChunksTimeHistory, this.#ackedChunksHistory, this.#failedChunksTimeHistory, this.#currentOptimizationValues!);\n\n this.#currentOptimizationValues = optimizationResult.optimizedValues;\n\n this.#concurrencyController!.maxConcurrency = this.#currentOptimizationValues.maxParallelChunksAmount;\n\n this.#timeout = setTimeout(() => this.optimize(), optimizationResult.optimizedValues.optimizationIntervalInMs);\n\n if (optimizationResult.clearChunksHistory === false)\n return;\n\n this.#startedChunksTimeHistory = [];\n this.#ackedChunksHistory = [];\n this.#failedChunksTimeHistory = [];\n };\n}"]}
@@ -1,11 +0,0 @@
1
- import type ConcurrencyReleaser from "../../utils/concurrencyController/concurrencyReleaser.js";
2
- interface UploadOptimizer {
3
- get currentChunkSize(): number;
4
- get currentSleepTimeInMs(): number;
5
- get currentRequestTimeoutInMs(): number;
6
- semaphoreAcquire(): Promise<ConcurrencyReleaser>;
7
- start(isUdpMode: boolean, serverLatencyInMs: number): void;
8
- stop(): void;
9
- }
10
- export default UploadOptimizer;
11
- //# sourceMappingURL=uploadOptimizer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploadOptimizer.d.ts","sourceRoot":"","sources":["../../../../src/uploader/optimizer/uploadOptimizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,mBAAmB,MAAM,0DAA0D,CAAC;AAEhG,UAAU,eAAe;IACrB,IAAI,gBAAgB,IAAI,MAAM,CAAC;IAC/B,IAAI,oBAAoB,IAAI,MAAM,CAAC;IACnC,IAAI,yBAAyB,IAAI,MAAM,CAAC;IACxC,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjD,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,IAAI,IAAI,IAAI,CAAC;CAChB;AAED,eAAe,eAAe,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=uploadOptimizer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploadOptimizer.js","sourceRoot":"","sources":["../../../../src/uploader/optimizer/uploadOptimizer.ts"],"names":[],"mappings":"","sourcesContent":["import type ConcurrencyReleaser from \"../../utils/concurrencyController/concurrencyReleaser.js\";\n\ninterface UploadOptimizer {\n get currentChunkSize(): number;\n get currentSleepTimeInMs(): number;\n get currentRequestTimeoutInMs(): number;\n semaphoreAcquire(): Promise<ConcurrencyReleaser>;\n start(isUdpMode: boolean, serverLatencyInMs: number): void;\n stop(): void;\n}\n\nexport default UploadOptimizer;"]}