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,264 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-await-in-loop */
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { clearTimeout } from 'timers';
|
|
4
|
-
import { publicEncrypt, randomBytes, createCipheriv } from 'crypto';
|
|
5
|
-
import UdpClient from 'promisified-udp-client';
|
|
6
|
-
import sleep from 'abortable-sleep';
|
|
7
|
-
import { v4 as newGuid, parse as guidToBytes, stringify as bytesToGuid } from 'uuid';
|
|
8
|
-
import FsError from '../../../utils/fileSystem/fsError.js';
|
|
9
|
-
const pingPrefix = Buffer.from(`P2`);
|
|
10
|
-
const handshakePrefix = Buffer.from(`H2`);
|
|
11
|
-
const chunkDataPrefix = Buffer.from(`D2`);
|
|
12
|
-
const encryptedPrefix = Buffer.from(`E2`);
|
|
13
|
-
const filemailPublicKey = `-----BEGIN PUBLIC KEY-----
|
|
14
|
-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmW7lnKl2UN7gLrLjsIP
|
|
15
|
-
WMMA2Nc8zROtwcGuumiN5bpw8ju/58MSE2DiYnGJKOVXxI2A52FgVK4I9hXKstwZ
|
|
16
|
-
5Sotcf3BXw1wMusnHwVGYRsQob76EJKiqQODc/pLyLtRDiFRY5tgafkW0dU1X8AU
|
|
17
|
-
kjtAawPp7ed/Z6DJaV2jWOQyJ9sCBXGhnNSExPOeSFvRKFM5vfurPXPXG4ii6tGU
|
|
18
|
-
XaqjVeX5+b9dJFTJ2HzUSUxAkYUCS1y4E9jehlimM7gGTR0m7ISQa/bg1eE1X8iA
|
|
19
|
-
D2DVevYVGqs9A6p+e/WJ2dMXU4XxBmfxWZe+szqgfU3wqvOmCS5JrGUKi6SAx8a5
|
|
20
|
-
WQIDAQAB
|
|
21
|
-
-----END PUBLIC KEY-----`;
|
|
22
|
-
export default class NodeFileServerUdpClient {
|
|
23
|
-
#address;
|
|
24
|
-
#port;
|
|
25
|
-
#requestTimeout;
|
|
26
|
-
#retries;
|
|
27
|
-
#retryDelay;
|
|
28
|
-
#abortSignal;
|
|
29
|
-
#udpClient;
|
|
30
|
-
constructor(address, port, requestTimeout, retries, abortSignal, retryDelay = 1000) {
|
|
31
|
-
this.#address = address;
|
|
32
|
-
this.#port = port;
|
|
33
|
-
this.#requestTimeout = requestTimeout;
|
|
34
|
-
this.#retries = retries;
|
|
35
|
-
this.#retryDelay = retryDelay;
|
|
36
|
-
this.#abortSignal = abortSignal;
|
|
37
|
-
this.#udpClient = new UdpClient(abortSignal);
|
|
38
|
-
}
|
|
39
|
-
addMessageListener(listener) {
|
|
40
|
-
this.#udpClient.addMessageListener(listener);
|
|
41
|
-
}
|
|
42
|
-
removeMessageListener(listener) {
|
|
43
|
-
this.#udpClient.removeMessageListener(listener);
|
|
44
|
-
}
|
|
45
|
-
addErrorListener(listener) {
|
|
46
|
-
this.#udpClient.addErrorListener(listener);
|
|
47
|
-
}
|
|
48
|
-
removeErrorListener(listener) {
|
|
49
|
-
this.#udpClient.removeErrorListener(listener);
|
|
50
|
-
}
|
|
51
|
-
async connect() {
|
|
52
|
-
await this.#udpClient.connect(this.#port, this.#address);
|
|
53
|
-
}
|
|
54
|
-
async close() {
|
|
55
|
-
await this.#udpClient.close();
|
|
56
|
-
}
|
|
57
|
-
async retryMechanism(apiCall) {
|
|
58
|
-
let lastError;
|
|
59
|
-
for (let attempt = 0; attempt <= this.#retries; attempt++) {
|
|
60
|
-
try {
|
|
61
|
-
const result = await apiCall();
|
|
62
|
-
return result;
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
if (attempt < this.#retries) {
|
|
66
|
-
lastError = error;
|
|
67
|
-
await sleep(this.#retryDelay * attempt, this.#abortSignal);
|
|
68
|
-
}
|
|
69
|
-
if (this.#abortSignal?.aborted)
|
|
70
|
-
throw new Error(`Aborted`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
throw lastError;
|
|
74
|
-
}
|
|
75
|
-
async ping() {
|
|
76
|
-
return await this.retryMechanism(async () => await this.pingCall());
|
|
77
|
-
}
|
|
78
|
-
async handshake(request) {
|
|
79
|
-
return await this.retryMechanism(async () => await this.handshakeCall(request));
|
|
80
|
-
}
|
|
81
|
-
async sendChunk(request, chunkStreamProvider) {
|
|
82
|
-
try {
|
|
83
|
-
return await this.retryMechanism(async () => await this.sendChunkCall(request, chunkStreamProvider));
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
if (this.isWrappedCreatingFileReadStreamException(error))
|
|
87
|
-
throw new FsError(error.message);
|
|
88
|
-
throw error;
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
if (!chunkStreamProvider.isReleased)
|
|
92
|
-
await chunkStreamProvider.release();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
isWrappedCreatingFileReadStreamException(error) {
|
|
96
|
-
return error.message === `CreatingFileReadStreamException`;
|
|
97
|
-
}
|
|
98
|
-
async pingCall() {
|
|
99
|
-
const packetGuid = newGuid();
|
|
100
|
-
const udpRequest = this.createPingRequest(packetGuid);
|
|
101
|
-
return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));
|
|
102
|
-
}
|
|
103
|
-
createPingRequest(packetGuid) {
|
|
104
|
-
const guidBytes = guidToBytes(packetGuid);
|
|
105
|
-
return Buffer.concat([pingPrefix, guidBytes]);
|
|
106
|
-
}
|
|
107
|
-
createLatencyResponse(sentTime, responseTime) {
|
|
108
|
-
return {
|
|
109
|
-
latencyInMs: responseTime - sentTime,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
async handshakeCall(request) {
|
|
113
|
-
const packetGuid = newGuid();
|
|
114
|
-
const sessionGuid = newGuid();
|
|
115
|
-
const aesKey = this.generateAes256Key();
|
|
116
|
-
const udpRequest = this.createHandshakeRequest(packetGuid, sessionGuid, aesKey, request);
|
|
117
|
-
return await this.makeCall(udpRequest, packetGuid, () => this.createHandshakeResponse(sessionGuid, aesKey));
|
|
118
|
-
}
|
|
119
|
-
generateAes256Key() {
|
|
120
|
-
return randomBytes(32);
|
|
121
|
-
}
|
|
122
|
-
createHandshakeRequest(packetGuid, sessionGuid, aesKey, request) {
|
|
123
|
-
const packetGuidBytes = guidToBytes(packetGuid);
|
|
124
|
-
const sessionGuidBytes = guidToBytes(sessionGuid);
|
|
125
|
-
const transferKeyBytes = guidToBytes(this.transferKeyToGuid(request.transferKey));
|
|
126
|
-
const transferIdBytes = Buffer.from(request.transferId);
|
|
127
|
-
const encryptableRequestPart = Buffer.concat([
|
|
128
|
-
packetGuidBytes,
|
|
129
|
-
sessionGuidBytes,
|
|
130
|
-
transferKeyBytes,
|
|
131
|
-
transferIdBytes,
|
|
132
|
-
aesKey,
|
|
133
|
-
]);
|
|
134
|
-
const encryptedRequestPart = this.publicRsaEncrypt(encryptableRequestPart);
|
|
135
|
-
return Buffer.concat([handshakePrefix, encryptedRequestPart]);
|
|
136
|
-
}
|
|
137
|
-
transferKeyToGuid(transferKey) {
|
|
138
|
-
return `${transferKey.slice(0, 8)}-${transferKey.slice(8, 12)}-${transferKey.slice(12, 16)}-${transferKey.slice(16, 20)}-${transferKey.slice(20)}`;
|
|
139
|
-
}
|
|
140
|
-
publicRsaEncrypt(data) {
|
|
141
|
-
return publicEncrypt(filemailPublicKey, data);
|
|
142
|
-
}
|
|
143
|
-
createHandshakeResponse(sessionGuid, aesKey) {
|
|
144
|
-
return {
|
|
145
|
-
aesKey,
|
|
146
|
-
sessionGuid,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
async sendChunkCall(request, chunkStreamProvider) {
|
|
150
|
-
const packetGuid = newGuid();
|
|
151
|
-
const chunkReadStream = await chunkStreamProvider.getChunkReadStream(undefined, this.#abortSignal);
|
|
152
|
-
const chunkBytes = await this.readStreamToEnd(chunkReadStream);
|
|
153
|
-
const udpRequest = this.createSendChunkRequest(packetGuid, request, chunkBytes);
|
|
154
|
-
return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));
|
|
155
|
-
}
|
|
156
|
-
async readStreamToEnd(stream) {
|
|
157
|
-
const reader = stream.getReader();
|
|
158
|
-
const chunks = [];
|
|
159
|
-
while (true) {
|
|
160
|
-
const { done, value } = await reader.read();
|
|
161
|
-
if (done)
|
|
162
|
-
break;
|
|
163
|
-
if (value)
|
|
164
|
-
chunks.push(value);
|
|
165
|
-
}
|
|
166
|
-
const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);
|
|
167
|
-
const merged = new Uint8Array(totalLength);
|
|
168
|
-
let offset = 0;
|
|
169
|
-
for (const c of chunks) {
|
|
170
|
-
merged.set(c, offset);
|
|
171
|
-
offset += c.length;
|
|
172
|
-
}
|
|
173
|
-
return Buffer.from(merged);
|
|
174
|
-
}
|
|
175
|
-
createSendChunkRequest(packetGuid, request, chunkBytes) {
|
|
176
|
-
const fullDestinationFileNameString = path.posix.join(request.fileDestinationPathInTransfer, request.fileName);
|
|
177
|
-
const fullDestinationFileName = Buffer.from(fullDestinationFileNameString);
|
|
178
|
-
const fullDestinationFileNameLength = Buffer.alloc(2);
|
|
179
|
-
fullDestinationFileNameLength.writeUint16BE(fullDestinationFileName.length);
|
|
180
|
-
const fileSize = Buffer.alloc(8);
|
|
181
|
-
fileSize.writeBigInt64BE(BigInt(request.fileSizeInBytes));
|
|
182
|
-
const chunkStartPosition = Buffer.alloc(8);
|
|
183
|
-
chunkStartPosition.writeBigInt64BE(BigInt(request.chunkStartPosition));
|
|
184
|
-
const encryptableRequestPart = Buffer.concat([
|
|
185
|
-
chunkDataPrefix,
|
|
186
|
-
fullDestinationFileNameLength,
|
|
187
|
-
fileSize,
|
|
188
|
-
chunkStartPosition,
|
|
189
|
-
fullDestinationFileName,
|
|
190
|
-
chunkBytes,
|
|
191
|
-
]);
|
|
192
|
-
const aesKey = Buffer.from(request.aesKey).subarray(0, 16); // .subarray directly on request.aesKey throws in Electron
|
|
193
|
-
const { encryptedData, iv, authTag } = this.aesEncrypt(encryptableRequestPart, aesKey);
|
|
194
|
-
const packetGuidBytes = guidToBytes(packetGuid);
|
|
195
|
-
const sessionGuidBytes = guidToBytes(request.sessionGuid);
|
|
196
|
-
return Buffer.concat([
|
|
197
|
-
encryptedPrefix,
|
|
198
|
-
packetGuidBytes,
|
|
199
|
-
sessionGuidBytes,
|
|
200
|
-
iv,
|
|
201
|
-
authTag,
|
|
202
|
-
encryptedData,
|
|
203
|
-
]);
|
|
204
|
-
}
|
|
205
|
-
aesEncrypt(data, aesKey) {
|
|
206
|
-
const iv = randomBytes(12);
|
|
207
|
-
const cipher = createCipheriv(`aes-128-gcm`, aesKey, iv);
|
|
208
|
-
let encryptedData = cipher.update(data);
|
|
209
|
-
encryptedData = Buffer.concat([encryptedData, cipher.final()]);
|
|
210
|
-
const authTag = cipher.getAuthTag();
|
|
211
|
-
return { encryptedData, iv, authTag };
|
|
212
|
-
}
|
|
213
|
-
async makeCall(request, packetGuid, createResponse) {
|
|
214
|
-
return new Promise((resolve, reject) => {
|
|
215
|
-
const sentTime = new Date().getTime();
|
|
216
|
-
const timeout = setTimeout(() => {
|
|
217
|
-
cleanup();
|
|
218
|
-
reject(new Error(`Timeout`));
|
|
219
|
-
}, this.#requestTimeout);
|
|
220
|
-
const responseListener = (msg) => {
|
|
221
|
-
const responseTime = new Date().getTime();
|
|
222
|
-
if (!this.isAckResponse(msg, packetGuid))
|
|
223
|
-
return;
|
|
224
|
-
cleanup();
|
|
225
|
-
if (!createResponse)
|
|
226
|
-
resolve(undefined);
|
|
227
|
-
else {
|
|
228
|
-
const response = createResponse(sentTime, responseTime, msg);
|
|
229
|
-
resolve(response);
|
|
230
|
-
}
|
|
231
|
-
};
|
|
232
|
-
this.addMessageListener(responseListener);
|
|
233
|
-
const sendPromise = this.#udpClient.send(request);
|
|
234
|
-
const errorAndAbortHandler = (error) => {
|
|
235
|
-
cleanup();
|
|
236
|
-
reject(error);
|
|
237
|
-
};
|
|
238
|
-
const abortSignalListener = () => errorAndAbortHandler(new Error(`Aborted`));
|
|
239
|
-
const cleanup = () => {
|
|
240
|
-
this.removeMessageListener(responseListener);
|
|
241
|
-
clearTimeout(timeout);
|
|
242
|
-
this.#abortSignal?.removeEventListener(`abort`, abortSignalListener);
|
|
243
|
-
};
|
|
244
|
-
sendPromise.catch(error => errorAndAbortHandler(error));
|
|
245
|
-
this.#abortSignal?.addEventListener(`abort`, abortSignalListener);
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
isAckResponse(msg, guid) {
|
|
249
|
-
try {
|
|
250
|
-
if (!this.isAck(msg) || msg.length !== 18)
|
|
251
|
-
return false;
|
|
252
|
-
const responseGuid = bytesToGuid(msg, 2);
|
|
253
|
-
return guid === responseGuid;
|
|
254
|
-
}
|
|
255
|
-
catch {
|
|
256
|
-
return false;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
isAck(msg) {
|
|
260
|
-
const prefix = msg.subarray(0, 2).toString(`utf8`);
|
|
261
|
-
return prefix === `A1`;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
//# sourceMappingURL=nodeFileServerUdpClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nodeFileServerUdpClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/node/nodeFileServerUdpClient.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport path from 'path';\nimport { clearTimeout } from 'timers';\nimport { publicEncrypt, randomBytes, createCipheriv } from 'crypto';\n\nimport type { RemoteInfo } from 'dgram';\nimport type { ReadableStream as NodeReadableStream } from \"stream/web\";\n\nimport UdpClient from 'promisified-udp-client';\nimport sleep from 'abortable-sleep';\n\nimport { v4 as newGuid, parse as guidToBytes, stringify as bytesToGuid } from 'uuid';\n\nimport FsError from '../../../utils/fileSystem/fsError.js';\n\nimport type LatencyResponse from \"../dtos/pingResponse.js\";\nimport type HandshakeRequest from '../dtos/handshakeRequest.js';\nimport type SendChunkRequest from '../dtos/sendChunkRequest.js';\nimport type FileServerUdpClient from '../fileServerUdpClient.js';\nimport type HandshakeResponse from '../dtos/handshakeResponse.js';\nimport type ChunkStreamProvider from '../../../utils/fileSystem/chunkStreamProvider.js';\n\nconst pingPrefix = Buffer.from(`P2`);\nconst handshakePrefix = Buffer.from(`H2`);\nconst chunkDataPrefix = Buffer.from(`D2`);\nconst encryptedPrefix = Buffer.from(`E2`);\n\nconst filemailPublicKey = `-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmW7lnKl2UN7gLrLjsIP\nWMMA2Nc8zROtwcGuumiN5bpw8ju/58MSE2DiYnGJKOVXxI2A52FgVK4I9hXKstwZ\n5Sotcf3BXw1wMusnHwVGYRsQob76EJKiqQODc/pLyLtRDiFRY5tgafkW0dU1X8AU\nkjtAawPp7ed/Z6DJaV2jWOQyJ9sCBXGhnNSExPOeSFvRKFM5vfurPXPXG4ii6tGU\nXaqjVeX5+b9dJFTJ2HzUSUxAkYUCS1y4E9jehlimM7gGTR0m7ISQa/bg1eE1X8iA\nD2DVevYVGqs9A6p+e/WJ2dMXU4XxBmfxWZe+szqgfU3wqvOmCS5JrGUKi6SAx8a5\nWQIDAQAB\n-----END PUBLIC KEY-----`;\n\nexport default class NodeFileServerUdpClient implements FileServerUdpClient {\n #address: string;\n #port: number;\n\n #requestTimeout: number;\n #retries: number;\n #retryDelay: number;\n\n #abortSignal?: AbortSignal;\n\n #udpClient: UdpClient;\n\n constructor(address: string, port: number, requestTimeout: number, retries: number, abortSignal?: AbortSignal, retryDelay: number = 1000) {\n this.#address = address;\n this.#port = port;\n this.#requestTimeout = requestTimeout;\n this.#retries = retries;\n this.#retryDelay = retryDelay;\n this.#abortSignal = abortSignal;\n\n this.#udpClient = new UdpClient(abortSignal);\n }\n\n addMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.addMessageListener(listener);\n }\n\n removeMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.removeMessageListener(listener);\n }\n\n addErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.addErrorListener(listener);\n }\n\n removeErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.removeErrorListener(listener);\n }\n\n async connect(): Promise<void> {\n await this.#udpClient.connect(this.#port, this.#address);\n }\n\n async close(): Promise<void> {\n await this.#udpClient.close();\n }\n\n private async retryMechanism<T>(apiCall: () => Promise<T>): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.#retries; attempt++) {\n try {\n const result = await apiCall();\n return result;\n }\n catch (error) {\n if (attempt < this.#retries) {\n lastError = error as Error;\n await sleep(this.#retryDelay * attempt, this.#abortSignal);\n }\n\n if (this.#abortSignal?.aborted)\n throw new Error(`Aborted`);\n }\n }\n\n throw lastError;\n }\n\n async ping(): Promise<LatencyResponse> {\n return await this.retryMechanism(async () => await this.pingCall());\n }\n\n async handshake(request: HandshakeRequest): Promise<HandshakeResponse> {\n return await this.retryMechanism(async () => await this.handshakeCall(request));\n }\n\n async sendChunk(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\n try {\n return await this.retryMechanism(async () => await this.sendChunkCall(request, chunkStreamProvider));\n }\n catch (error) {\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\n throw new FsError((error as Error).message);\n\n throw error;\n }\n finally {\n if (!chunkStreamProvider.isReleased)\n await chunkStreamProvider.release();\n }\n }\n\n private isWrappedCreatingFileReadStreamException(error: Error): boolean {\n return error.message === `CreatingFileReadStreamException`;\n }\n\n private async pingCall(): Promise<LatencyResponse> {\n const packetGuid = newGuid();\n\n const udpRequest = this.createPingRequest(packetGuid);\n\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\n }\n\n private createPingRequest(packetGuid: string): Buffer {\n const guidBytes = guidToBytes(packetGuid);\n return Buffer.concat([pingPrefix, guidBytes]);\n }\n\n private createLatencyResponse(sentTime: number, responseTime: number): LatencyResponse {\n return {\n latencyInMs: responseTime - sentTime,\n };\n }\n\n private async handshakeCall(request: HandshakeRequest): Promise<HandshakeResponse> {\n const packetGuid = newGuid();\n const sessionGuid = newGuid();\n const aesKey = this.generateAes256Key();\n\n const udpRequest = this.createHandshakeRequest(packetGuid, sessionGuid, aesKey, request);\n\n return await this.makeCall(udpRequest, packetGuid, () => this.createHandshakeResponse(sessionGuid, aesKey));\n }\n\n private generateAes256Key(): Buffer {\n return randomBytes(32);\n }\n\n private createHandshakeRequest(packetGuid: string, sessionGuid: string, aesKey: Buffer, request: HandshakeRequest) {\n const packetGuidBytes = guidToBytes(packetGuid);\n const sessionGuidBytes = guidToBytes(sessionGuid);\n const transferKeyBytes = guidToBytes(this.transferKeyToGuid(request.transferKey));\n const transferIdBytes = Buffer.from(request.transferId);\n\n const encryptableRequestPart = Buffer.concat([\n packetGuidBytes,\n sessionGuidBytes,\n transferKeyBytes,\n transferIdBytes,\n aesKey,\n ]);\n\n const encryptedRequestPart = this.publicRsaEncrypt(encryptableRequestPart);\n\n return Buffer.concat([handshakePrefix, encryptedRequestPart]);\n }\n\n private transferKeyToGuid(transferKey: string): string {\n return `${transferKey.slice(0, 8)}-${transferKey.slice(8, 12)}-${transferKey.slice(12, 16)}-${transferKey.slice(16, 20)}-${transferKey.slice(20)}`;\n }\n\n private publicRsaEncrypt(data: Buffer) {\n return publicEncrypt(filemailPublicKey, data);\n }\n\n private createHandshakeResponse(sessionGuid: string, aesKey: Buffer): HandshakeResponse {\n return {\n aesKey,\n sessionGuid,\n };\n }\n\n private async sendChunkCall(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\n const packetGuid = newGuid();\n\n const chunkReadStream = await chunkStreamProvider.getChunkReadStream(undefined, this.#abortSignal);\n const chunkBytes = await this.readStreamToEnd(chunkReadStream);\n\n const udpRequest = this.createSendChunkRequest(packetGuid, request, chunkBytes);\n\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\n }\n\n private async readStreamToEnd(stream: ReadableStream | NodeReadableStream) {\n const reader = stream.getReader();\n\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done)\n break;\n\n if (value)\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\n const merged = new Uint8Array(totalLength);\n\n let offset = 0;\n\n for (const c of chunks) {\n merged.set(c, offset);\n offset += c.length;\n }\n\n return Buffer.from(merged);\n }\n\n private createSendChunkRequest(packetGuid: string, request: SendChunkRequest, chunkBytes: Buffer) {\n const fullDestinationFileNameString = path.posix.join(request.fileDestinationPathInTransfer, request.fileName);\n const fullDestinationFileName = Buffer.from(fullDestinationFileNameString);\n\n const fullDestinationFileNameLength = Buffer.alloc(2);\n fullDestinationFileNameLength.writeUint16BE(fullDestinationFileName.length);\n\n const fileSize = Buffer.alloc(8);\n fileSize.writeBigInt64BE(BigInt(request.fileSizeInBytes));\n\n const chunkStartPosition = Buffer.alloc(8);\n chunkStartPosition.writeBigInt64BE(BigInt(request.chunkStartPosition));\n\n const encryptableRequestPart = Buffer.concat([\n chunkDataPrefix,\n fullDestinationFileNameLength,\n fileSize,\n chunkStartPosition,\n fullDestinationFileName,\n chunkBytes,\n ]);\n\n const aesKey = Buffer.from(request.aesKey).subarray(0, 16); // .subarray directly on request.aesKey throws in Electron\n\n const { encryptedData, iv, authTag } = this.aesEncrypt(encryptableRequestPart, aesKey);\n\n const packetGuidBytes = guidToBytes(packetGuid);\n const sessionGuidBytes = guidToBytes(request.sessionGuid);\n\n return Buffer.concat([\n encryptedPrefix,\n packetGuidBytes,\n sessionGuidBytes,\n iv,\n authTag,\n encryptedData,\n ]);\n }\n\n private aesEncrypt(data: Buffer, aesKey: Buffer): { encryptedData: Buffer, iv: Buffer, authTag: Buffer } {\n const iv = randomBytes(12);\n\n const cipher = createCipheriv(`aes-128-gcm`, aesKey, iv);\n\n let encryptedData = cipher.update(data);\n encryptedData = Buffer.concat([encryptedData, cipher.final()]);\n\n const authTag = cipher.getAuthTag();\n\n return { encryptedData, iv, authTag };\n }\n\n private async makeCall<T>(request: string | readonly any[] | Uint8Array, packetGuid: string, createResponse?: (sentTime: number, responseTime: number, message: Buffer) => T): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const sentTime = new Date().getTime();\n\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(`Timeout`));\n }, this.#requestTimeout);\n\n const responseListener = (msg: Buffer) => {\n const responseTime = new Date().getTime();\n\n if (!this.isAckResponse(msg, packetGuid))\n return;\n\n cleanup();\n\n if (!createResponse)\n resolve(undefined as any);\n else {\n const response = createResponse(sentTime, responseTime, msg);\n resolve(response);\n }\n };\n\n this.addMessageListener(responseListener);\n\n const sendPromise = this.#udpClient.send(request);\n\n const errorAndAbortHandler = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const abortSignalListener = () => errorAndAbortHandler(new Error(`Aborted`));\n\n const cleanup = () => {\n this.removeMessageListener(responseListener);\n clearTimeout(timeout);\n this.#abortSignal?.removeEventListener(`abort`, abortSignalListener);\n };\n\n sendPromise.catch(error => errorAndAbortHandler(error));\n this.#abortSignal?.addEventListener(`abort`, abortSignalListener);\n });\n }\n\n private isAckResponse(msg: Buffer, guid: string) {\n try {\n if (!this.isAck(msg) || msg.length !== 18)\n return false;\n\n const responseGuid = bytesToGuid(msg, 2);\n\n return guid === responseGuid;\n }\n catch {\n return false;\n }\n }\n\n private isAck(msg: Buffer) {\n const prefix = msg.subarray(0, 2).toString(`utf8`);\n return prefix === `A1`;\n }\n}"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadModeChosenEventArgs.d.ts","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadModeChosenEventArgs.ts"],"names":[],"mappings":"AAAA,UAAU,iCAAiC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,eAAe,iCAAiC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadModeChosenEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadModeChosenEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadModeChosenEventArgs {\n isUdpMode: boolean,\n latency?: number,\n error?: Error,\n}\n\nexport default TransferUploadModeChosenEventArgs;"]}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
type OptimizationValues = {
|
|
2
|
-
maxParallelChunksAmount: number;
|
|
3
|
-
chunkSize: number;
|
|
4
|
-
optimizationIntervalInMs: number;
|
|
5
|
-
minTimeBetweenChunksStartInMs: number;
|
|
6
|
-
requestTimeoutInMs: number;
|
|
7
|
-
};
|
|
8
|
-
export default OptimizationValues;
|
|
9
|
-
//# sourceMappingURL=optimizationValues.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"optimizationValues.d.ts","sourceRoot":"","sources":["../../../../src/uploader/optimizer/optimizationValues.ts"],"names":[],"mappings":"AAAA,KAAK,kBAAkB,GAAG;IACtB,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,6BAA6B,EAAE,MAAM,CAAC;IACtC,kBAAkB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"optimizationValues.js","sourceRoot":"","sources":["../../../../src/uploader/optimizer/optimizationValues.ts"],"names":[],"mappings":"","sourcesContent":["type OptimizationValues = {\n maxParallelChunksAmount: number,\n chunkSize: number,\n optimizationIntervalInMs: number,\n minTimeBetweenChunksStartInMs: number,\n requestTimeoutInMs: number,\n};\n\nexport default OptimizationValues;"]}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type OptimizationValues from "../optimizationValues.js";
|
|
2
|
-
import type TransferUploadOptimizationStrategy from "../transferUploadOptimizationStrategy.js";
|
|
3
|
-
export default class UdpConcurrencyBasedOptimizationStrategy implements TransferUploadOptimizationStrategy {
|
|
4
|
-
#private;
|
|
5
|
-
msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): {
|
|
6
|
-
chunkSize: number;
|
|
7
|
-
};
|
|
8
|
-
noBufsErrorHandler(currentOptimizedValues: OptimizationValues): {
|
|
9
|
-
maxParallelChunksAmount: number;
|
|
10
|
-
minTimeBetweenChunksStartInMs: number;
|
|
11
|
-
};
|
|
12
|
-
getInitialValues(serverLatencyInMs: number): OptimizationValues;
|
|
13
|
-
getOptimizedValues(_startedChunksTimeHistory: number[], ackedChunksHistory: {
|
|
14
|
-
time: number;
|
|
15
|
-
latencyInMs: number;
|
|
16
|
-
}[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): {
|
|
17
|
-
optimizedValues: OptimizationValues;
|
|
18
|
-
clearChunksHistory: boolean;
|
|
19
|
-
};
|
|
20
|
-
private getOptimizedChunkSizeAndChunksCount;
|
|
21
|
-
private speedUp;
|
|
22
|
-
private slowDown;
|
|
23
|
-
private getIncreasedChunkSize;
|
|
24
|
-
private getDecreasedChunkSize;
|
|
25
|
-
private getIncreasedChunksCount;
|
|
26
|
-
private getDecreasedChunksCount;
|
|
27
|
-
private getOptimizedRequestTimeout;
|
|
28
|
-
private findLatencyPercentile;
|
|
29
|
-
private getOptimizedOptimizationInterval;
|
|
30
|
-
private getIncreasedOptimizationInterval;
|
|
31
|
-
private getDecreasedOptimizationInterval;
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=udpConcurrencyBasedOptimizationStrategy.d.ts.map
|
package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"udpConcurrencyBasedOptimizationStrategy.d.ts","sourceRoot":"","sources":["../../../../../src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,kCAAkC,MAAM,0CAA0C,CAAC;AAE/F,MAAM,CAAC,OAAO,OAAO,uCAAwC,YAAW,kCAAkC;;IAsBtG,mBAAmB,CAAC,sBAAsB,EAAE,kBAAkB,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;IAQtF,kBAAkB,CAAC,sBAAsB,EAAE,kBAAkB,GAAG;QAAE,uBAAuB,EAAE,MAAM,CAAC;QAAC,6BAA6B,EAAE,MAAM,CAAA;KAAE;IAO1I,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB;IAU/D,kBAAkB,CAAC,yBAAyB,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,EAAE,OAAO,CAAA;KAAE;IAsBzQ,OAAO,CAAC,mCAAmC;IAa3C,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,qBAAqB,CAI3B;IAEF,OAAO,CAAC,qBAAqB,CAI3B;IAEF,OAAO,CAAC,uBAAuB,CAI7B;IAEF,OAAO,CAAC,uBAAuB,CAI7B;IAEF,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,gCAAgC;IAUxC,OAAO,CAAC,gCAAgC,CAItC;IAEF,OAAO,CAAC,gCAAgC,CAItC;CACL"}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
export default class UdpConcurrencyBasedOptimizationStrategy {
|
|
2
|
-
#values = {
|
|
3
|
-
const: {
|
|
4
|
-
sleep: 0.5,
|
|
5
|
-
},
|
|
6
|
-
step: {
|
|
7
|
-
chunksCount: 4,
|
|
8
|
-
chunkSize: 12244,
|
|
9
|
-
optimizationInterval: 50,
|
|
10
|
-
},
|
|
11
|
-
min: {
|
|
12
|
-
chunksCount: 4,
|
|
13
|
-
chunkSize: 15424,
|
|
14
|
-
optimizationInterval: 50,
|
|
15
|
-
},
|
|
16
|
-
max: {
|
|
17
|
-
chunksCount: 125,
|
|
18
|
-
chunkSize: 64400,
|
|
19
|
-
optimizationInterval: 500,
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
msgSizeErrorHandler(currentOptimizedValues) {
|
|
23
|
-
const chunkSize = currentOptimizedValues.chunkSize - 1000;
|
|
24
|
-
this.#values.max.chunkSize = chunkSize;
|
|
25
|
-
return { chunkSize };
|
|
26
|
-
}
|
|
27
|
-
noBufsErrorHandler(currentOptimizedValues) {
|
|
28
|
-
return {
|
|
29
|
-
maxParallelChunksAmount: this.#values.min.chunksCount,
|
|
30
|
-
minTimeBetweenChunksStartInMs: currentOptimizedValues.minTimeBetweenChunksStartInMs,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
getInitialValues(serverLatencyInMs) {
|
|
34
|
-
return {
|
|
35
|
-
chunkSize: this.#values.max.chunkSize,
|
|
36
|
-
minTimeBetweenChunksStartInMs: this.#values.const.sleep,
|
|
37
|
-
optimizationIntervalInMs: (this.#values.max.optimizationInterval + this.#values.min.optimizationInterval) / 3,
|
|
38
|
-
maxParallelChunksAmount: this.#values.min.chunksCount,
|
|
39
|
-
requestTimeoutInMs: serverLatencyInMs * 2,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
getOptimizedValues(_startedChunksTimeHistory, ackedChunksHistory, failedChunksTimeHistory, currentOptimizedValues) {
|
|
43
|
-
const finishedChunks = ackedChunksHistory.length + failedChunksTimeHistory.length;
|
|
44
|
-
if (finishedChunks === 0 || ackedChunksHistory.length === 0)
|
|
45
|
-
return { optimizedValues: currentOptimizedValues, clearChunksHistory: false };
|
|
46
|
-
const failuresRate = failedChunksTimeHistory.length / finishedChunks;
|
|
47
|
-
const acksRate = 1 - failuresRate;
|
|
48
|
-
const optimizedChunkSizeAndChunksCount = this.getOptimizedChunkSizeAndChunksCount(acksRate, currentOptimizedValues.chunkSize, currentOptimizedValues.maxParallelChunksAmount);
|
|
49
|
-
const optimizedValues = {
|
|
50
|
-
...currentOptimizedValues,
|
|
51
|
-
maxParallelChunksAmount: optimizedChunkSizeAndChunksCount.optimizedChunksCount,
|
|
52
|
-
chunkSize: optimizedChunkSizeAndChunksCount.optimizedChunkSize,
|
|
53
|
-
optimizationIntervalInMs: this.getOptimizedOptimizationInterval(ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),
|
|
54
|
-
requestTimeoutInMs: this.getOptimizedRequestTimeout(ackedChunksHistory),
|
|
55
|
-
};
|
|
56
|
-
return { optimizedValues, clearChunksHistory: false };
|
|
57
|
-
}
|
|
58
|
-
getOptimizedChunkSizeAndChunksCount(acksRate, currentChunkSize, currentChunksCount) {
|
|
59
|
-
if (acksRate < 0.7)
|
|
60
|
-
return this.slowDown(currentChunkSize, currentChunksCount);
|
|
61
|
-
if (acksRate > 0.9)
|
|
62
|
-
return this.speedUp(currentChunkSize, currentChunksCount);
|
|
63
|
-
return {
|
|
64
|
-
optimizedChunkSize: currentChunkSize,
|
|
65
|
-
optimizedChunksCount: currentChunksCount,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
speedUp(currentChunkSize, currentChunksCount) {
|
|
69
|
-
if (currentChunkSize < this.#values.max.chunkSize) {
|
|
70
|
-
return {
|
|
71
|
-
optimizedChunkSize: this.getIncreasedChunkSize(currentChunkSize),
|
|
72
|
-
optimizedChunksCount: currentChunksCount,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
optimizedChunkSize: currentChunkSize,
|
|
77
|
-
optimizedChunksCount: this.getIncreasedChunksCount(currentChunksCount),
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
slowDown(currentChunkSize, currentChunksCount) {
|
|
81
|
-
if (currentChunksCount > this.#values.min.chunksCount) {
|
|
82
|
-
return {
|
|
83
|
-
optimizedChunkSize: currentChunkSize,
|
|
84
|
-
optimizedChunksCount: this.getDecreasedChunksCount(currentChunksCount),
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
return {
|
|
88
|
-
optimizedChunkSize: this.getDecreasedChunkSize(currentChunkSize),
|
|
89
|
-
optimizedChunksCount: currentChunksCount,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
getIncreasedChunkSize = (currentChunkSize) => {
|
|
93
|
-
const newChunkSize = currentChunkSize + this.#values.step.chunkSize;
|
|
94
|
-
return Math.min(newChunkSize, this.#values.max.chunkSize);
|
|
95
|
-
};
|
|
96
|
-
getDecreasedChunkSize = (currentChunkSize) => {
|
|
97
|
-
const newChunkSize = currentChunkSize - this.#values.step.chunkSize;
|
|
98
|
-
return Math.max(newChunkSize, this.#values.min.chunkSize);
|
|
99
|
-
};
|
|
100
|
-
getIncreasedChunksCount = (currentChunksCount) => {
|
|
101
|
-
const newChunksCount = currentChunksCount + this.#values.step.chunksCount;
|
|
102
|
-
return Math.min(newChunksCount, this.#values.max.chunksCount);
|
|
103
|
-
};
|
|
104
|
-
getDecreasedChunksCount = (currentChunksCount) => {
|
|
105
|
-
const newChunksCount = currentChunksCount - this.#values.step.chunksCount;
|
|
106
|
-
return Math.max(newChunksCount, this.#values.min.chunksCount);
|
|
107
|
-
};
|
|
108
|
-
getOptimizedRequestTimeout(ackedChunksHistory) {
|
|
109
|
-
const averageLatency = ackedChunksHistory.reduce((sum, ack) => sum + ack.latencyInMs, 0) / ackedChunksHistory.length;
|
|
110
|
-
const latencyPercentile = this.findLatencyPercentile(ackedChunksHistory);
|
|
111
|
-
return Math.max(averageLatency * 4, latencyPercentile);
|
|
112
|
-
}
|
|
113
|
-
findLatencyPercentile(ackedChunks) {
|
|
114
|
-
const latencies = ackedChunks.map(v => v.latencyInMs);
|
|
115
|
-
const sortedLatencies = latencies.slice().sort((a, b) => a - b);
|
|
116
|
-
const index = Math.ceil(0.90 * (sortedLatencies.length - 1));
|
|
117
|
-
return sortedLatencies[index];
|
|
118
|
-
}
|
|
119
|
-
getOptimizedOptimizationInterval(ackedChunksCount, currentOptimizationIntervalInMs) {
|
|
120
|
-
if (ackedChunksCount > 30)
|
|
121
|
-
return this.getDecreasedOptimizationInterval(currentOptimizationIntervalInMs);
|
|
122
|
-
if (ackedChunksCount < 15)
|
|
123
|
-
return this.getIncreasedOptimizationInterval(currentOptimizationIntervalInMs);
|
|
124
|
-
return currentOptimizationIntervalInMs;
|
|
125
|
-
}
|
|
126
|
-
getIncreasedOptimizationInterval = (optimizationIntervalInMs) => {
|
|
127
|
-
const interval = optimizationIntervalInMs + this.#values.step.optimizationInterval;
|
|
128
|
-
return Math.min(interval, this.#values.max.optimizationInterval);
|
|
129
|
-
};
|
|
130
|
-
getDecreasedOptimizationInterval = (optimizationIntervalInMs) => {
|
|
131
|
-
const interval = optimizationIntervalInMs - this.#values.step.optimizationInterval;
|
|
132
|
-
return Math.max(interval, this.#values.min.optimizationInterval);
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=udpConcurrencyBasedOptimizationStrategy.js.map
|
package/dist/src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"udpConcurrencyBasedOptimizationStrategy.js","sourceRoot":"","sources":["../../../../../src/uploader/optimizer/strategies/udpConcurrencyBasedOptimizationStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import type OptimizationValues from \"../optimizationValues.js\";\nimport type TransferUploadOptimizationStrategy from \"../transferUploadOptimizationStrategy.js\";\n\nexport default class UdpConcurrencyBasedOptimizationStrategy implements TransferUploadOptimizationStrategy {\n #values = {\n const: {\n sleep: 0.5,\n },\n step: {\n chunksCount: 4,\n chunkSize: 12244,\n optimizationInterval: 50,\n },\n min: {\n chunksCount: 4,\n chunkSize: 15424,\n optimizationInterval: 50,\n },\n max: {\n chunksCount: 125,\n chunkSize: 64400,\n optimizationInterval: 500,\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 noBufsErrorHandler(currentOptimizedValues: OptimizationValues): { maxParallelChunksAmount: number, minTimeBetweenChunksStartInMs: number } {\n return {\n maxParallelChunksAmount: this.#values.min.chunksCount,\n minTimeBetweenChunksStartInMs: currentOptimizedValues.minTimeBetweenChunksStartInMs,\n };\n }\n\n getInitialValues(serverLatencyInMs: number): OptimizationValues {\n return {\n chunkSize: this.#values.max.chunkSize,\n minTimeBetweenChunksStartInMs: this.#values.const.sleep,\n optimizationIntervalInMs: (this.#values.max.optimizationInterval + this.#values.min.optimizationInterval) / 3,\n maxParallelChunksAmount: this.#values.min.chunksCount,\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 optimizedChunkSizeAndChunksCount = this.getOptimizedChunkSizeAndChunksCount(acksRate, currentOptimizedValues.chunkSize, currentOptimizedValues.maxParallelChunksAmount);\n\n const optimizedValues: OptimizationValues = {\n ...currentOptimizedValues,\n maxParallelChunksAmount: optimizedChunkSizeAndChunksCount.optimizedChunksCount,\n chunkSize: optimizedChunkSizeAndChunksCount.optimizedChunkSize,\n optimizationIntervalInMs: this.getOptimizedOptimizationInterval(ackedChunksHistory.length, currentOptimizedValues.optimizationIntervalInMs),\n requestTimeoutInMs: this.getOptimizedRequestTimeout(ackedChunksHistory),\n };\n\n return { optimizedValues, clearChunksHistory: false };\n }\n\n private getOptimizedChunkSizeAndChunksCount(acksRate: number, currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\n if (acksRate < 0.7)\n return this.slowDown(currentChunkSize, currentChunksCount);\n\n if (acksRate > 0.9)\n return this.speedUp(currentChunkSize, currentChunksCount);\n\n return {\n optimizedChunkSize: currentChunkSize,\n optimizedChunksCount: currentChunksCount,\n };\n }\n\n private speedUp(currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\n if (currentChunkSize! < this.#values.max.chunkSize) {\n return {\n optimizedChunkSize: this.getIncreasedChunkSize(currentChunkSize),\n optimizedChunksCount: currentChunksCount,\n };\n }\n\n return {\n optimizedChunkSize: currentChunkSize,\n optimizedChunksCount: this.getIncreasedChunksCount(currentChunksCount),\n };\n }\n\n private slowDown(currentChunkSize: number, currentChunksCount: number): { optimizedChunkSize: number, optimizedChunksCount: number } {\n if (currentChunksCount > this.#values.min.chunksCount) {\n return {\n optimizedChunkSize: currentChunkSize,\n optimizedChunksCount: this.getDecreasedChunksCount(currentChunksCount),\n };\n }\n\n return {\n optimizedChunkSize: this.getDecreasedChunkSize(currentChunkSize),\n optimizedChunksCount: currentChunksCount,\n };\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 private getIncreasedChunksCount = (currentChunksCount: number) => {\n const newChunksCount = currentChunksCount + this.#values.step.chunksCount;\n\n return Math.min(newChunksCount, this.#values.max.chunksCount);\n };\n\n private getDecreasedChunksCount = (currentChunksCount: number) => {\n const newChunksCount = currentChunksCount - this.#values.step.chunksCount;\n\n return Math.max(newChunksCount, this.#values.min.chunksCount);\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 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"]}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type OptimizationValues from "../optimizationValues.js";
|
|
2
|
-
import type TransferUploadOptimizationStrategy from "../transferUploadOptimizationStrategy.js";
|
|
3
|
-
export default class UdpSleepBasedOptimizationStrategy implements TransferUploadOptimizationStrategy {
|
|
4
|
-
#private;
|
|
5
|
-
msgSizeErrorHandler(currentOptimizedValues: OptimizationValues): {
|
|
6
|
-
chunkSize: number;
|
|
7
|
-
};
|
|
8
|
-
noBufsErrorHandler(_currentOptimizedValues: OptimizationValues): {
|
|
9
|
-
maxParallelChunksAmount: number;
|
|
10
|
-
minTimeBetweenChunksStartInMs: number;
|
|
11
|
-
};
|
|
12
|
-
getInitialValues(serverLatencyInMs: number): OptimizationValues;
|
|
13
|
-
getOptimizedValues(_startedChunksTimeHistory: number[], ackedChunksHistory: {
|
|
14
|
-
time: number;
|
|
15
|
-
latencyInMs: number;
|
|
16
|
-
}[], failedChunksTimeHistory: number[], currentOptimizedValues: OptimizationValues): {
|
|
17
|
-
optimizedValues: OptimizationValues;
|
|
18
|
-
clearChunksHistory: boolean;
|
|
19
|
-
};
|
|
20
|
-
private getOptimizedRequestTimeout;
|
|
21
|
-
private findLatencyPercentile;
|
|
22
|
-
private getOptimizedMinTimeBetweenChunksStart;
|
|
23
|
-
private getOptimizedOptimizationInterval;
|
|
24
|
-
private getIncreasedOptimizationInterval;
|
|
25
|
-
private getDecreasedOptimizationInterval;
|
|
26
|
-
private getOptimizedChunkSize;
|
|
27
|
-
private getIncreasedChunkSize;
|
|
28
|
-
private getDecreasedChunkSize;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=udpSleepBasedOptimizationStrategy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"udpSleepBasedOptimizationStrategy.d.ts","sourceRoot":"","sources":["../../../../../src/uploader/optimizer/strategies/udpSleepBasedOptimizationStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,kCAAkC,MAAM,0CAA0C,CAAC;AAE/F,MAAM,CAAC,OAAO,OAAO,iCAAkC,YAAW,kCAAkC;;IAsBhG,mBAAmB,CAAC,sBAAsB,EAAE,kBAAkB,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;IAStF,kBAAkB,CAAC,uBAAuB,EAAE,kBAAkB,GAAG;QAAE,uBAAuB,EAAE,MAAM,CAAC;QAAC,6BAA6B,EAAE,MAAM,CAAA;KAAE;IAO3I,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB;IAU/D,kBAAkB,CAAC,yBAAyB,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,EAAE,OAAO,CAAA;KAAE;IAsBzQ,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,qCAAqC;IAO7C,OAAO,CAAC,gCAAgC;IAUxC,OAAO,CAAC,gCAAgC,CAItC;IAEF,OAAO,CAAC,gCAAgC,CAItC;IAEF,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,qBAAqB,CAI3B;IAEF,OAAO,CAAC,qBAAqB,CAI3B;CACL"}
|