filemail-sdk 9.4.10 → 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.
- package/dist/src/client/downloader/downloaderCore.js +1 -1
- package/dist/src/client/downloader/downloaderCore.js.map +1 -1
- package/dist/src/client/uploader/node/nodeTransferUploader.d.ts.map +1 -1
- package/dist/src/client/uploader/node/nodeTransferUploader.js +6 -5
- package/dist/src/client/uploader/node/nodeTransferUploader.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderBase.d.ts +1 -0
- package/dist/src/client/uploader/transferUploaderBase.d.ts.map +1 -1
- package/dist/src/client/uploader/transferUploaderBase.js +23 -28
- package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
- package/dist/src/client/uploader/transferUploaderConfig.d.ts +3 -4
- package/dist/src/client/uploader/transferUploaderConfig.d.ts.map +1 -1
- package/dist/src/client/uploader/transferUploaderConfig.js.map +1 -1
- package/dist/src/client/uploader/utils/uploaderUtils.d.ts.map +1 -1
- package/dist/src/client/uploader/utils/uploaderUtils.js +1 -2
- package/dist/src/client/uploader/utils/uploaderUtils.js.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.d.ts.map +1 -1
- package/dist/src/client/uploader/web/webTransferUploader.js +5 -4
- package/dist/src/client/uploader/web/webTransferUploader.js.map +1 -1
- package/dist/src/downloader/chunkDownloader.js +2 -2
- package/dist/src/downloader/chunkDownloader.js.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.d.ts.map +1 -1
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js +5 -4
- package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.d.ts.map +1 -1
- package/dist/src/uploader/api/web/webFileServerUploadClient.js +5 -4
- package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.d.ts +1 -3
- package/dist/src/uploader/chunksIterator/chunksIterator.d.ts.map +1 -1
- package/dist/src/uploader/chunksIterator/chunksIterator.js +4 -4
- package/dist/src/uploader/chunksIterator/chunksIterator.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.d.ts +8 -0
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.d.ts.map +1 -0
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js +2 -0
- package/dist/src/uploader/eventArgs/fileAckFailedEventArgs.js.map +1 -0
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.d.ts +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadCompletedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.d.ts +1 -0
- package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.d.ts +1 -0
- package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/fileChunkUploadProgressedEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/fileUploadEventArgs.d.ts +1 -0
- package/dist/src/uploader/eventArgs/fileUploadEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/fileUploadEventArgs.js.map +1 -1
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.d.ts +6 -0
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.d.ts.map +1 -0
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js +2 -0
- package/dist/src/uploader/eventArgs/filesBatchAckFailedEventArgs.js.map +1 -0
- package/dist/src/uploader/export/transferUploadExportData.d.ts +3 -1
- package/dist/src/uploader/export/transferUploadExportData.d.ts.map +1 -1
- package/dist/src/uploader/export/transferUploadExportData.js.map +1 -1
- package/dist/src/uploader/export/transferUploadExportState.d.ts +4 -1
- package/dist/src/uploader/export/transferUploadExportState.d.ts.map +1 -1
- package/dist/src/uploader/export/transferUploadExportState.js.map +1 -1
- package/dist/src/uploader/export/transferUploadMetadata.d.ts +2 -9
- package/dist/src/uploader/export/transferUploadMetadata.d.ts.map +1 -1
- package/dist/src/uploader/export/transferUploadMetadata.js.map +1 -1
- package/dist/src/uploader/options/transferUploadConfig.d.ts +1 -2
- package/dist/src/uploader/options/transferUploadConfig.d.ts.map +1 -1
- package/dist/src/uploader/options/transferUploadConfig.js.map +1 -1
- package/dist/src/uploader/pendingFileAck.d.ts +7 -0
- package/dist/src/uploader/pendingFileAck.d.ts.map +1 -0
- package/dist/src/uploader/pendingFileAck.js +2 -0
- package/dist/src/uploader/pendingFileAck.js.map +1 -0
- package/dist/src/uploader/registeredTransferFile.d.ts +6 -0
- package/dist/src/uploader/registeredTransferFile.d.ts.map +1 -0
- package/dist/src/uploader/registeredTransferFile.js +2 -0
- package/dist/src/uploader/registeredTransferFile.js.map +1 -0
- package/dist/src/uploader/state/transferUploadState.d.ts +11 -8
- package/dist/src/uploader/state/transferUploadState.d.ts.map +1 -1
- package/dist/src/uploader/state/transferUploadState.js +54 -26
- package/dist/src/uploader/state/transferUploadState.js.map +1 -1
- package/dist/src/uploader/state/transferUploadStateFile.d.ts +1 -0
- package/dist/src/uploader/state/transferUploadStateFile.d.ts.map +1 -1
- package/dist/src/uploader/state/transferUploadStateFile.js +1 -0
- package/dist/src/uploader/state/transferUploadStateFile.js.map +1 -1
- package/dist/src/uploader/transferUpload.d.ts +17 -14
- package/dist/src/uploader/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +109 -123
- package/dist/src/uploader/transferUpload.js.map +1 -1
- package/dist/src/uploader/transferUploadAcker.d.ts +19 -0
- package/dist/src/uploader/transferUploadAcker.d.ts.map +1 -0
- package/dist/src/uploader/transferUploadAcker.js +119 -0
- package/dist/src/uploader/transferUploadAcker.js.map +1 -0
- package/dist/src/uploader/transferUploadEvent.d.ts +3 -1
- package/dist/src/uploader/transferUploadEvent.d.ts.map +1 -1
- package/dist/src/uploader/transferUploadEvent.js +3 -1
- package/dist/src/uploader/transferUploadEvent.js.map +1 -1
- package/dist/src/utils/api/apiClient.d.ts +6 -0
- package/dist/src/utils/api/apiClient.d.ts.map +1 -1
- package/dist/src/utils/api/apiClient.js.map +1 -1
- package/dist/src/utils/api/apiClientBase.d.ts +0 -2
- package/dist/src/utils/api/apiClientBase.d.ts.map +1 -1
- package/dist/src/utils/api/apiClientBase.js +6 -13
- package/dist/src/utils/api/apiClientBase.js.map +1 -1
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.d.ts +9 -0
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.d.ts.map +1 -0
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.js +2 -0
- package/dist/src/utils/api/dtos/ackTransferFilesRequest.js.map +1 -0
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.d.ts +7 -0
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.d.ts.map +1 -0
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.js +2 -0
- package/dist/src/utils/api/dtos/ackTransferFilesResponse.js.map +1 -0
- package/dist/src/utils/api/dtos/finalizeTransferRequest.d.ts +1 -1
- package/dist/src/utils/api/dtos/finalizeTransferRequest.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/finalizeTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts +1 -0
- package/dist/src/utils/api/dtos/initializeTransferRequest.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferRequest.js.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferResponse.d.ts +0 -9
- package/dist/src/utils/api/dtos/initializeTransferResponse.d.ts.map +1 -1
- package/dist/src/utils/api/dtos/initializeTransferResponse.js.map +1 -1
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts +18 -0
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.d.ts.map +1 -0
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.js +2 -0
- package/dist/src/utils/api/dtos/registerTransferFilesRequest.js.map +1 -0
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts +9 -0
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.d.ts.map +1 -0
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.js +2 -0
- package/dist/src/utils/api/dtos/registerTransferFilesResponse.js.map +1 -0
- package/dist/src/utils/api/fileServerClientFactory.d.ts +2 -4
- package/dist/src/utils/api/fileServerClientFactory.d.ts.map +1 -1
- package/dist/src/utils/api/fileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/node/nodeApiClient.d.ts +6 -0
- package/dist/src/utils/api/node/nodeApiClient.d.ts.map +1 -1
- package/dist/src/utils/api/node/nodeApiClient.js +26 -2
- package/dist/src/utils/api/node/nodeApiClient.js.map +1 -1
- package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts +2 -4
- package/dist/src/utils/api/node/nodeFileServerClientFactory.d.ts.map +1 -1
- package/dist/src/utils/api/node/nodeFileServerClientFactory.js +3 -7
- package/dist/src/utils/api/node/nodeFileServerClientFactory.js.map +1 -1
- package/dist/src/utils/api/web/webApiClient.d.ts +6 -0
- package/dist/src/utils/api/web/webApiClient.d.ts.map +1 -1
- package/dist/src/utils/api/web/webApiClient.js +24 -2
- package/dist/src/utils/api/web/webApiClient.js.map +1 -1
- package/dist/src/utils/api/web/webFileServerClientFactory.d.ts +2 -4
- package/dist/src/utils/api/web/webFileServerClientFactory.d.ts.map +1 -1
- package/dist/src/utils/api/web/webFileServerClientFactory.js +3 -6
- package/dist/src/utils/api/web/webFileServerClientFactory.js.map +1 -1
- package/package.json +1 -2
- package/dist/src/uploader/api/dtos/handshakeRequest.d.ts +0 -6
- package/dist/src/uploader/api/dtos/handshakeRequest.d.ts.map +0 -1
- package/dist/src/uploader/api/dtos/handshakeRequest.js +0 -2
- package/dist/src/uploader/api/dtos/handshakeRequest.js.map +0 -1
- package/dist/src/uploader/api/dtos/handshakeResponse.d.ts +0 -6
- package/dist/src/uploader/api/dtos/handshakeResponse.d.ts.map +0 -1
- package/dist/src/uploader/api/dtos/handshakeResponse.js +0 -2
- package/dist/src/uploader/api/dtos/handshakeResponse.js.map +0 -1
- package/dist/src/uploader/api/dtos/pingResponse.d.ts +0 -5
- package/dist/src/uploader/api/dtos/pingResponse.d.ts.map +0 -1
- package/dist/src/uploader/api/dtos/pingResponse.js +0 -2
- package/dist/src/uploader/api/dtos/pingResponse.js.map +0 -1
- package/dist/src/uploader/api/dtos/sendChunkRequest.d.ts +0 -10
- package/dist/src/uploader/api/dtos/sendChunkRequest.d.ts.map +0 -1
- package/dist/src/uploader/api/dtos/sendChunkRequest.js +0 -2
- package/dist/src/uploader/api/dtos/sendChunkRequest.js.map +0 -1
- package/dist/src/uploader/api/fileServerUdpClient.d.ts +0 -19
- package/dist/src/uploader/api/fileServerUdpClient.d.ts.map +0 -1
- package/dist/src/uploader/api/fileServerUdpClient.js +0 -2
- package/dist/src/uploader/api/fileServerUdpClient.js.map +0 -1
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.d.ts +0 -39
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.d.ts.map +0 -1
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.js +0 -264
- package/dist/src/uploader/api/node/nodeFileServerUdpClient.js.map +0 -1
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.d.ts +0 -7
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.d.ts.map +0 -1
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js +0 -2
- package/dist/src/uploader/eventArgs/transferUploadModeChosenEventArgs.js.map +0 -1
- package/dist/src/uploader/optimizer/optimizationValues.d.ts +0 -9
- package/dist/src/uploader/optimizer/optimizationValues.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/optimizationValues.js +0 -2
- package/dist/src/uploader/optimizer/optimizationValues.js.map +0 -1
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts +0 -33
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js +0 -135
- package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map +0 -1
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.d.ts +0 -30
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js +0 -106
- package/dist/src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.js.map +0 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.d.ts +0 -20
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js +0 -2
- package/dist/src/uploader/optimizer/transferUploadOptimizationStrategy.js.map +0 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizer.d.ts +0 -27
- package/dist/src/uploader/optimizer/transferUploadOptimizer.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/transferUploadOptimizer.js +0 -169
- package/dist/src/uploader/optimizer/transferUploadOptimizer.js.map +0 -1
- package/dist/src/uploader/optimizer/uploadOptimizer.d.ts +0 -11
- package/dist/src/uploader/optimizer/uploadOptimizer.d.ts.map +0 -1
- package/dist/src/uploader/optimizer/uploadOptimizer.js +0 -2
- 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 +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 +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;"]}
|