@ardrive/turbo-sdk 1.31.0-alpha.1 → 1.31.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -2
- package/bundles/web.bundle.min.js +342 -475
- package/lib/cjs/cli/commands/uploadFolder.js +2 -1
- package/lib/cjs/cli/options.js +5 -0
- package/lib/cjs/cli/utils.js +1 -0
- package/lib/cjs/common/chunked.js +88 -27
- package/lib/cjs/common/http.js +39 -4
- package/lib/cjs/common/payment.js +2 -1
- package/lib/cjs/common/upload.js +5 -6
- package/lib/cjs/types.js +13 -1
- package/lib/cjs/utils/axiosClient.js +3 -37
- package/lib/cjs/version.js +1 -1
- package/lib/esm/cli/commands/uploadFolder.js +2 -1
- package/lib/esm/cli/options.js +5 -0
- package/lib/esm/cli/utils.js +1 -0
- package/lib/esm/common/chunked.js +89 -28
- package/lib/esm/common/http.js +40 -5
- package/lib/esm/common/payment.js +2 -1
- package/lib/esm/common/upload.js +5 -6
- package/lib/esm/types.js +12 -0
- package/lib/esm/utils/axiosClient.js +3 -14
- package/lib/esm/version.js +1 -1
- package/lib/types/cli/commands/uploadFolder.d.ts.map +1 -1
- package/lib/types/cli/options.d.ts +13 -0
- package/lib/types/cli/options.d.ts.map +1 -1
- package/lib/types/cli/types.d.ts +1 -0
- package/lib/types/cli/types.d.ts.map +1 -1
- package/lib/types/cli/utils.d.ts +3 -10
- package/lib/types/cli/utils.d.ts.map +1 -1
- package/lib/types/common/chunked.d.ts +5 -1
- package/lib/types/common/chunked.d.ts.map +1 -1
- package/lib/types/common/http.d.ts +5 -3
- package/lib/types/common/http.d.ts.map +1 -1
- package/lib/types/common/payment.d.ts +1 -1
- package/lib/types/common/payment.d.ts.map +1 -1
- package/lib/types/common/upload.d.ts +2 -2
- package/lib/types/common/upload.d.ts.map +1 -1
- package/lib/types/types.d.ts +34 -2
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/utils/axiosClient.d.ts +8 -4
- package/lib/types/utils/axiosClient.d.ts.map +1 -1
- package/lib/types/version.d.ts +1 -1
- package/lib/types/version.d.ts.map +1 -1
- package/package.json +9 -10
|
@@ -15,12 +15,16 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { CanceledError } from 'axios';
|
|
17
17
|
import { pLimit } from 'plimit-lit';
|
|
18
|
-
import { validChunkingModes, } from '../types.js';
|
|
18
|
+
import { multipartFailedStatus, validChunkingModes, } from '../types.js';
|
|
19
|
+
import { sleep } from '../utils/common.js';
|
|
20
|
+
import { FailedRequestError } from '../utils/errors.js';
|
|
19
21
|
import { TurboEventEmitter, createStreamWithUploadEvents } from './events.js';
|
|
20
22
|
import { TurboWinstonLogger } from './logger.js';
|
|
21
23
|
const fiveMiB = 5 * 1024 * 1024; // 5 MiB
|
|
22
24
|
const fiveHundredMiB = fiveMiB * 100; // 500 MiB
|
|
23
25
|
export const defaultMaxChunkConcurrency = 5;
|
|
26
|
+
// Limit uploaders to protect server
|
|
27
|
+
const absoluteMaxChunkConcurrency = 256;
|
|
24
28
|
export const maxChunkByteCount = fiveHundredMiB;
|
|
25
29
|
export const minChunkByteCount = fiveMiB;
|
|
26
30
|
export const defaultChunkByteCount = minChunkByteCount;
|
|
@@ -31,17 +35,19 @@ const chunkingHeader = { 'x-chunking-version': '2' };
|
|
|
31
35
|
* uploading them in parallel, and emitting progress/error events.
|
|
32
36
|
*/
|
|
33
37
|
export class ChunkedUploader {
|
|
34
|
-
constructor({ http, token, maxChunkConcurrency = defaultMaxChunkConcurrency, chunkByteCount = defaultChunkByteCount, logger = TurboWinstonLogger.default, chunkingMode = 'auto', dataItemByteCount, }) {
|
|
35
|
-
this.chunkByteCount = chunkByteCount;
|
|
36
|
-
this.maxChunkConcurrency = maxChunkConcurrency;
|
|
37
|
-
this.http = http;
|
|
38
|
-
this.token = token;
|
|
39
|
-
this.logger = logger;
|
|
38
|
+
constructor({ http, token, maxChunkConcurrency = defaultMaxChunkConcurrency, maxFinalizeMs, chunkByteCount = defaultChunkByteCount, logger = TurboWinstonLogger.default, chunkingMode = 'auto', dataItemByteCount, }) {
|
|
40
39
|
this.assertChunkParams({
|
|
41
40
|
chunkByteCount,
|
|
42
41
|
chunkingMode,
|
|
43
42
|
maxChunkConcurrency,
|
|
43
|
+
maxFinalizeMs,
|
|
44
44
|
});
|
|
45
|
+
this.chunkByteCount = chunkByteCount;
|
|
46
|
+
this.maxChunkConcurrency = maxChunkConcurrency;
|
|
47
|
+
this.maxFinalizeMs = maxFinalizeMs;
|
|
48
|
+
this.http = http;
|
|
49
|
+
this.token = token;
|
|
50
|
+
this.logger = logger;
|
|
45
51
|
this.shouldUseChunkUploader = this.shouldChunkUpload({
|
|
46
52
|
chunkByteCount,
|
|
47
53
|
chunkingMode,
|
|
@@ -59,11 +65,18 @@ export class ChunkedUploader {
|
|
|
59
65
|
const isMoreThanTwoChunksOfData = dataItemByteCount > chunkByteCount * 2;
|
|
60
66
|
return isMoreThanTwoChunksOfData;
|
|
61
67
|
}
|
|
62
|
-
assertChunkParams({ chunkByteCount, chunkingMode, maxChunkConcurrency, }) {
|
|
68
|
+
assertChunkParams({ chunkByteCount, chunkingMode, maxChunkConcurrency, maxFinalizeMs, }) {
|
|
69
|
+
if (maxFinalizeMs !== undefined &&
|
|
70
|
+
(Number.isNaN(maxFinalizeMs) ||
|
|
71
|
+
!Number.isInteger(maxFinalizeMs) ||
|
|
72
|
+
maxFinalizeMs < 0)) {
|
|
73
|
+
throw new Error('Invalid max finalization wait time. Must be a non-negative integer.');
|
|
74
|
+
}
|
|
63
75
|
if (Number.isNaN(maxChunkConcurrency) ||
|
|
64
76
|
!Number.isInteger(maxChunkConcurrency) ||
|
|
65
|
-
maxChunkConcurrency < 1
|
|
66
|
-
|
|
77
|
+
maxChunkConcurrency < 1 ||
|
|
78
|
+
maxChunkConcurrency > absoluteMaxChunkConcurrency) {
|
|
79
|
+
throw new Error('Invalid max chunk concurrency. Must be an integer of at least 1 and at most 256.');
|
|
67
80
|
}
|
|
68
81
|
if (Number.isNaN(chunkByteCount) ||
|
|
69
82
|
!Number.isInteger(chunkByteCount) ||
|
|
@@ -86,8 +99,8 @@ export class ChunkedUploader {
|
|
|
86
99
|
});
|
|
87
100
|
if (res.chunkSize !== this.chunkByteCount) {
|
|
88
101
|
this.logger.warn('Chunk size mismatch! Overriding with server value.', {
|
|
89
|
-
|
|
90
|
-
|
|
102
|
+
clientExpected: this.chunkByteCount,
|
|
103
|
+
serverReturned: res.chunkSize,
|
|
91
104
|
});
|
|
92
105
|
this.chunkByteCount = res.chunkSize;
|
|
93
106
|
}
|
|
@@ -131,11 +144,6 @@ export class ChunkedUploader {
|
|
|
131
144
|
const chunkByteCount = chunk.length;
|
|
132
145
|
const chunkOffset = currentOffset;
|
|
133
146
|
currentOffset += chunkByteCount;
|
|
134
|
-
this.logger.debug('Queueing chunk', {
|
|
135
|
-
chunkPartNumber,
|
|
136
|
-
chunkOffset,
|
|
137
|
-
chunkByteCount,
|
|
138
|
-
});
|
|
139
147
|
const promise = limit(async () => {
|
|
140
148
|
if (firstError !== undefined) {
|
|
141
149
|
return;
|
|
@@ -191,26 +199,79 @@ export class ChunkedUploader {
|
|
|
191
199
|
if (firstError !== undefined) {
|
|
192
200
|
throw firstError;
|
|
193
201
|
}
|
|
202
|
+
const finalizeResponse = await this.finalizeUpload(uploadId, dataItemByteCount, dataItemOpts?.paidBy, combinedSignal);
|
|
203
|
+
emitter.emit('upload-success');
|
|
204
|
+
return finalizeResponse;
|
|
205
|
+
}
|
|
206
|
+
toGiB(bytes) {
|
|
207
|
+
return bytes / 1024 ** 3;
|
|
208
|
+
}
|
|
209
|
+
async finalizeUpload(uploadId, dataItemByteCount, paidBy, signal) {
|
|
210
|
+
// Wait up to 1 minute per GiB of data for the upload to finalize
|
|
211
|
+
const fileSizeInGiB = Math.ceil(this.toGiB(dataItemByteCount));
|
|
212
|
+
const defaultMaxWaitTimeMins = fileSizeInGiB;
|
|
213
|
+
const maxWaitTimeMs = this.maxFinalizeMs ?? defaultMaxWaitTimeMins * 60 * 1000;
|
|
214
|
+
const minimumWaitPerStepMs =
|
|
215
|
+
// Per step, files smaller than 100MB will wait 2 second,
|
|
216
|
+
dataItemByteCount < 1024 * 1024 * 100
|
|
217
|
+
? 2000
|
|
218
|
+
: // files smaller than 3 GiB will wait 3 seconds,
|
|
219
|
+
dataItemByteCount < 1024 * 1024 * 1024 * 3
|
|
220
|
+
? 3000
|
|
221
|
+
: // and larger files will wait 1 second per GiB with max of 10 seconds
|
|
222
|
+
Math.max(1000 * fileSizeInGiB, 10000);
|
|
194
223
|
const paidByHeader = {};
|
|
195
|
-
if (
|
|
196
|
-
paidByHeader['x-paid-by'] = Array.isArray(
|
|
197
|
-
?
|
|
198
|
-
:
|
|
224
|
+
if (paidBy !== undefined) {
|
|
225
|
+
paidByHeader['x-paid-by'] = Array.isArray(paidBy)
|
|
226
|
+
? paidBy.join(',')
|
|
227
|
+
: paidBy;
|
|
199
228
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
const finalizeResponse = await this.http.post({
|
|
203
|
-
endpoint: `/chunks/${this.token}/${uploadId}/-1`,
|
|
229
|
+
await this.http.post({
|
|
230
|
+
endpoint: `/chunks/${this.token}/${uploadId}/finalize`,
|
|
204
231
|
data: Buffer.alloc(0),
|
|
205
232
|
headers: {
|
|
206
233
|
'Content-Type': 'application/octet-stream',
|
|
207
234
|
...paidByHeader,
|
|
208
235
|
...chunkingHeader,
|
|
209
236
|
},
|
|
210
|
-
signal
|
|
237
|
+
signal,
|
|
211
238
|
});
|
|
212
|
-
|
|
213
|
-
|
|
239
|
+
this.logger.debug(`Confirming upload to Turbo with uploadId ${uploadId} for up to ${defaultMaxWaitTimeMins} minutes.`);
|
|
240
|
+
const startTime = Date.now();
|
|
241
|
+
const cutoffTime = startTime + maxWaitTimeMs;
|
|
242
|
+
let attempts = 0;
|
|
243
|
+
while (Date.now() < cutoffTime) {
|
|
244
|
+
// Wait for 3/4 of the time remaining per attempt or minimum step
|
|
245
|
+
const waitTimeMs = Math.min(Math.floor((cutoffTime - Date.now()) * (3 / 4)), minimumWaitPerStepMs);
|
|
246
|
+
await sleep(waitTimeMs);
|
|
247
|
+
if (signal?.aborted) {
|
|
248
|
+
this.logger.warn(`Upload finalization aborted by signal.`);
|
|
249
|
+
throw new CanceledError();
|
|
250
|
+
}
|
|
251
|
+
const response = await this.http.get({
|
|
252
|
+
endpoint: `/chunks/${this.token}/${uploadId}/status`,
|
|
253
|
+
signal,
|
|
254
|
+
});
|
|
255
|
+
this.logger.debug(`Upload status found: ${response.status}`, {
|
|
256
|
+
status: response.status,
|
|
257
|
+
attempts: attempts++,
|
|
258
|
+
maxWaitTimeMs,
|
|
259
|
+
minimumWaitPerStepMs,
|
|
260
|
+
waitTimeMs,
|
|
261
|
+
elapsedMs: Date.now() - startTime,
|
|
262
|
+
});
|
|
263
|
+
if (response.status === 'FINALIZED') {
|
|
264
|
+
this.logger.debug(`Upload finalized successfully.`);
|
|
265
|
+
return response.receipt;
|
|
266
|
+
}
|
|
267
|
+
if (response.status === 'UNDERFUNDED') {
|
|
268
|
+
throw new FailedRequestError(`Insufficient balance`, 402);
|
|
269
|
+
}
|
|
270
|
+
if (multipartFailedStatus.includes(response.status)) {
|
|
271
|
+
throw new FailedRequestError(`Upload failed with multi-part status ${response.status}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
throw new Error(`Upload multi-part finalization has timed out for Upload ID ${uploadId}`);
|
|
214
275
|
}
|
|
215
276
|
}
|
|
216
277
|
/**
|
package/lib/esm/common/http.js
CHANGED
|
@@ -14,27 +14,34 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import { AxiosError, CanceledError } from 'axios';
|
|
17
|
-
import {
|
|
17
|
+
import { Readable } from 'node:stream';
|
|
18
|
+
import { createAxiosInstance, defaultRetryConfig, } from '../utils/axiosClient.js';
|
|
19
|
+
import { sleep } from '../utils/common.js';
|
|
18
20
|
import { FailedRequestError } from '../utils/errors.js';
|
|
19
21
|
export class TurboHTTPService {
|
|
20
|
-
constructor({ url,
|
|
22
|
+
constructor({ url, logger, retryConfig = defaultRetryConfig(logger), }) {
|
|
21
23
|
this.logger = logger;
|
|
22
24
|
this.axios = createAxiosInstance({
|
|
23
25
|
axiosConfig: {
|
|
24
26
|
baseURL: url,
|
|
25
27
|
maxRedirects: 0, // prevents backpressure issues when uploading larger streams via https
|
|
26
28
|
},
|
|
27
|
-
retryConfig,
|
|
28
29
|
logger: this.logger,
|
|
29
30
|
});
|
|
31
|
+
this.retryConfig = retryConfig;
|
|
30
32
|
}
|
|
31
33
|
async get({ endpoint, signal, allowedStatuses = [200, 202], headers, }) {
|
|
32
|
-
return this.
|
|
34
|
+
return this.retryRequest(() => this.axios.get(endpoint, { headers, signal }), allowedStatuses);
|
|
33
35
|
}
|
|
34
36
|
async post({ endpoint, signal, allowedStatuses = [200, 202], headers, data, }) {
|
|
35
37
|
// Buffer and Readable → keep Axios (streams work fine there)
|
|
36
38
|
if (!(data instanceof ReadableStream)) {
|
|
37
|
-
|
|
39
|
+
if (data instanceof Readable) {
|
|
40
|
+
return this.tryRequest(
|
|
41
|
+
// Can't retry a Readable stream that has already been partially consumed
|
|
42
|
+
() => this.axios.post(endpoint, data, { headers, signal }), allowedStatuses);
|
|
43
|
+
}
|
|
44
|
+
return this.retryRequest(() => this.axios.post(endpoint, data, { headers, signal }), allowedStatuses);
|
|
38
45
|
}
|
|
39
46
|
// Browser ReadableStream → use fetch with progressive enhancement of duplex
|
|
40
47
|
// Note: fetch does not support streams in Safari and Firefox, so we convert to Blob
|
|
@@ -92,6 +99,34 @@ export class TurboHTTPService {
|
|
|
92
99
|
throw error;
|
|
93
100
|
}
|
|
94
101
|
}
|
|
102
|
+
async retryRequest(request, allowedStatuses) {
|
|
103
|
+
let attempt = 0;
|
|
104
|
+
let lastError;
|
|
105
|
+
while (attempt < this.retryConfig.retries) {
|
|
106
|
+
try {
|
|
107
|
+
const resp = await this.tryRequest(request, allowedStatuses);
|
|
108
|
+
return resp;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof FailedRequestError) {
|
|
112
|
+
lastError = error;
|
|
113
|
+
this.retryConfig.onRetry(attempt + 1, error);
|
|
114
|
+
if (error.status !== undefined &&
|
|
115
|
+
error.status >= 400 &&
|
|
116
|
+
error.status < 500) {
|
|
117
|
+
// If it's a client error, we can stop retrying
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
await sleep(this.retryConfig.retryDelay(attempt + 1));
|
|
121
|
+
attempt++;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
throw new FailedRequestError('Max retries reached - ' + lastError?.message, lastError?.status);
|
|
129
|
+
}
|
|
95
130
|
}
|
|
96
131
|
async function toFetchBody(data) {
|
|
97
132
|
if (!navigator.userAgent.includes('Firefox') &&
|
|
@@ -14,13 +14,14 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import { BigNumber } from 'bignumber.js';
|
|
17
|
+
import { defaultRetryConfig } from '../utils/axiosClient.js';
|
|
17
18
|
import { TurboHTTPService } from './http.js';
|
|
18
19
|
import { TurboWinstonLogger } from './logger.js';
|
|
19
20
|
import { exponentMap, tokenToBaseMap } from './token/index.js';
|
|
20
21
|
export const developmentPaymentServiceURL = 'https://payment.ardrive.dev';
|
|
21
22
|
export const defaultPaymentServiceURL = 'https://payment.ardrive.io';
|
|
22
23
|
export class TurboUnauthenticatedPaymentService {
|
|
23
|
-
constructor({ url = defaultPaymentServiceURL,
|
|
24
|
+
constructor({ url = defaultPaymentServiceURL, logger = TurboWinstonLogger.default, retryConfig = defaultRetryConfig(logger), token = 'arweave', }) {
|
|
24
25
|
this.logger = logger;
|
|
25
26
|
this.httpService = new TurboHTTPService({
|
|
26
27
|
url: `${url}/v1`,
|
package/lib/esm/common/upload.js
CHANGED
|
@@ -188,6 +188,7 @@ export class TurboAuthenticatedBaseUploadService extends TurboUnauthenticatedUpl
|
|
|
188
188
|
logger: this.logger,
|
|
189
189
|
dataItemByteCount: dataItemSizeFactory(),
|
|
190
190
|
chunkingMode: params.chunkingMode,
|
|
191
|
+
maxFinalizeMs: params.maxFinalizeMs,
|
|
191
192
|
});
|
|
192
193
|
if (chunkedUploader.shouldUseChunkUploader) {
|
|
193
194
|
const response = await chunkedUploader.upload({
|
|
@@ -230,13 +231,10 @@ export class TurboAuthenticatedBaseUploadService extends TurboUnauthenticatedUpl
|
|
|
230
231
|
resolve();
|
|
231
232
|
});
|
|
232
233
|
});
|
|
233
|
-
await Promise.race([
|
|
234
|
-
sleep(retryDelay(retries, error)),
|
|
235
|
-
abortEventPromise,
|
|
236
|
-
]);
|
|
234
|
+
await Promise.race([sleep(retryDelay(retries)), abortEventPromise]);
|
|
237
235
|
}
|
|
238
236
|
}
|
|
239
|
-
const msg = `Failed to upload file after ${
|
|
237
|
+
const msg = `Failed to upload file after ${retries + 1} attempts\n${lastError instanceof Error ? lastError.message : lastError}`;
|
|
240
238
|
// After all retries, throw the last error for catching
|
|
241
239
|
if (lastError instanceof FailedRequestError) {
|
|
242
240
|
lastError.message = msg;
|
|
@@ -287,7 +285,7 @@ export class TurboAuthenticatedBaseUploadService extends TurboUnauthenticatedUpl
|
|
|
287
285
|
*/
|
|
288
286
|
async uploadFolder(params) {
|
|
289
287
|
this.logger.debug('Uploading folder...', { params });
|
|
290
|
-
const { dataItemOpts, signal, manifestOptions = {}, maxConcurrentUploads = 1, throwOnFailure = true, maxChunkConcurrency, chunkByteCount, chunkingMode, } = params;
|
|
288
|
+
const { dataItemOpts, signal, manifestOptions = {}, maxConcurrentUploads = 1, throwOnFailure = true, maxChunkConcurrency, chunkByteCount, chunkingMode, maxFinalizeMs, } = params;
|
|
291
289
|
const { disableManifest, indexFile, fallbackFile } = manifestOptions;
|
|
292
290
|
const paths = {};
|
|
293
291
|
const response = {
|
|
@@ -361,6 +359,7 @@ export class TurboAuthenticatedBaseUploadService extends TurboUnauthenticatedUpl
|
|
|
361
359
|
dataItemOpts: { ...dataItemOpts, tags: tagsWithManifestContentType },
|
|
362
360
|
chunkByteCount,
|
|
363
361
|
maxChunkConcurrency,
|
|
362
|
+
maxFinalizeMs,
|
|
364
363
|
chunkingMode,
|
|
365
364
|
});
|
|
366
365
|
return {
|
package/lib/esm/types.js
CHANGED
|
@@ -23,6 +23,18 @@ export const tokenTypes = [
|
|
|
23
23
|
'pol',
|
|
24
24
|
'base-eth',
|
|
25
25
|
];
|
|
26
|
+
export const multipartPendingStatus = [
|
|
27
|
+
'ASSEMBLING',
|
|
28
|
+
'VALIDATING',
|
|
29
|
+
'FINALIZING',
|
|
30
|
+
];
|
|
31
|
+
export const multipartFailedStatus = [
|
|
32
|
+
'UNDERFUNDED',
|
|
33
|
+
'INVALID',
|
|
34
|
+
'APPROVAL_FAILED',
|
|
35
|
+
'REVOKE_FAILED',
|
|
36
|
+
];
|
|
37
|
+
export const multipartFinalizedStatus = ['FINALIZED'];
|
|
26
38
|
export const isNodeUploadFolderParams = (p) => p.folderPath !== undefined;
|
|
27
39
|
export const isWebUploadFolderParams = (p) => p.files !== undefined;
|
|
28
40
|
export function isKyvePrivateKey(wallet) {
|
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import axios
|
|
17
|
-
import axiosRetry from 'axios-retry';
|
|
16
|
+
import axios from 'axios';
|
|
18
17
|
import { TurboWinstonLogger } from '../common/logger.js';
|
|
19
18
|
import { version } from '../version.js';
|
|
20
19
|
export const defaultRequestHeaders = {
|
|
@@ -22,18 +21,13 @@ export const defaultRequestHeaders = {
|
|
|
22
21
|
'x-turbo-source-identifier': 'turbo-sdk',
|
|
23
22
|
};
|
|
24
23
|
export const defaultRetryConfig = (logger = TurboWinstonLogger.default) => ({
|
|
25
|
-
retryDelay:
|
|
24
|
+
retryDelay: (retryCount) => Math.min(1000 * 2 ** (retryCount - 1), 30 * 1000), // exponential backoff up to 30s
|
|
26
25
|
retries: 5,
|
|
27
|
-
retryCondition: (error) => {
|
|
28
|
-
return (!(error instanceof CanceledError) &&
|
|
29
|
-
axiosRetry.isIdempotentRequestError(error) &&
|
|
30
|
-
axiosRetry.isNetworkError(error));
|
|
31
|
-
},
|
|
32
26
|
onRetry: (retryCount, error) => {
|
|
33
27
|
logger.debug(`Request failed, ${error}. Retry attempt #${retryCount}...`);
|
|
34
28
|
},
|
|
35
29
|
});
|
|
36
|
-
export const createAxiosInstance = ({
|
|
30
|
+
export const createAxiosInstance = ({ axiosConfig = {}, } = {}) => {
|
|
37
31
|
const axiosInstance = axios.create({
|
|
38
32
|
...axiosConfig,
|
|
39
33
|
headers: {
|
|
@@ -43,10 +37,5 @@ export const createAxiosInstance = ({ logger = TurboWinstonLogger.default, axios
|
|
|
43
37
|
adapter: 'fetch',
|
|
44
38
|
validateStatus: () => true, // don't throw on non-200 status codes
|
|
45
39
|
});
|
|
46
|
-
if (retryConfig.retries !== undefined && retryConfig.retries > 0) {
|
|
47
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
48
|
-
// @ts-ignore
|
|
49
|
-
axiosRetry(axiosInstance, retryConfig);
|
|
50
|
-
}
|
|
51
40
|
return axiosInstance;
|
|
52
41
|
};
|
package/lib/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadFolder.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/uploadFolder.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"uploadFolder.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/uploadFolder.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAkCf"}
|
|
@@ -160,6 +160,10 @@ export declare const optionMap: {
|
|
|
160
160
|
readonly alias: "--max-chunk-concurrency <maxChunkConcurrency>";
|
|
161
161
|
readonly description: "Maximum number of concurrent chunks to upload per file";
|
|
162
162
|
};
|
|
163
|
+
readonly maxFinalizeMs: {
|
|
164
|
+
readonly alias: "--max-finalize-ms <maxFinalizeMs>";
|
|
165
|
+
readonly description: "Maximum time in milliseconds to wait for the finalization of all chunks after the last chunk is uploaded. Defaults to 1 minute per GiB of the total file size.";
|
|
166
|
+
};
|
|
163
167
|
readonly chunkByteCount: {
|
|
164
168
|
readonly alias: "--chunk-byte-count <chunkByteCount>";
|
|
165
169
|
readonly description: "Size of each chunk in bytes";
|
|
@@ -245,6 +249,9 @@ export declare const uploadOptions: ({
|
|
|
245
249
|
} | {
|
|
246
250
|
readonly alias: "--max-chunk-concurrency <maxChunkConcurrency>";
|
|
247
251
|
readonly description: "Maximum number of concurrent chunks to upload per file";
|
|
252
|
+
} | {
|
|
253
|
+
readonly alias: "--max-finalize-ms <maxFinalizeMs>";
|
|
254
|
+
readonly description: "Maximum time in milliseconds to wait for the finalization of all chunks after the last chunk is uploaded. Defaults to 1 minute per GiB of the total file size.";
|
|
248
255
|
} | {
|
|
249
256
|
readonly alias: "--chunk-byte-count <chunkByteCount>";
|
|
250
257
|
readonly description: "Size of each chunk in bytes";
|
|
@@ -297,6 +304,9 @@ export declare const uploadFolderOptions: ({
|
|
|
297
304
|
} | {
|
|
298
305
|
readonly alias: "--max-chunk-concurrency <maxChunkConcurrency>";
|
|
299
306
|
readonly description: "Maximum number of concurrent chunks to upload per file";
|
|
307
|
+
} | {
|
|
308
|
+
readonly alias: "--max-finalize-ms <maxFinalizeMs>";
|
|
309
|
+
readonly description: "Maximum time in milliseconds to wait for the finalization of all chunks after the last chunk is uploaded. Defaults to 1 minute per GiB of the total file size.";
|
|
300
310
|
} | {
|
|
301
311
|
readonly alias: "--chunk-byte-count <chunkByteCount>";
|
|
302
312
|
readonly description: "Size of each chunk in bytes";
|
|
@@ -336,6 +346,9 @@ export declare const uploadFileOptions: ({
|
|
|
336
346
|
} | {
|
|
337
347
|
readonly alias: "--max-chunk-concurrency <maxChunkConcurrency>";
|
|
338
348
|
readonly description: "Maximum number of concurrent chunks to upload per file";
|
|
349
|
+
} | {
|
|
350
|
+
readonly alias: "--max-finalize-ms <maxFinalizeMs>";
|
|
351
|
+
readonly description: "Maximum time in milliseconds to wait for the finalization of all chunks after the last chunk is uploaded. Defaults to 1 minute per GiB of the total file size.";
|
|
339
352
|
} | {
|
|
340
353
|
readonly alias: "--chunk-byte-count <chunkByteCount>";
|
|
341
354
|
readonly description: "Size of each chunk in bytes";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/cli/options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/cli/options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyKZ,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;;;IAIzB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAUzB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAUzB,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAO/B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAyC,CAAC;AAExE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;IAK/B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;IAAwC,CAAC;AAE1E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;IAAuB,CAAC"}
|
package/lib/types/cli/types.d.ts
CHANGED
|
@@ -45,6 +45,7 @@ export type UploadOptions = WalletOptions & {
|
|
|
45
45
|
useSignerBalanceFirst: boolean;
|
|
46
46
|
tags: string[] | undefined;
|
|
47
47
|
maxChunkConcurrency: string | undefined;
|
|
48
|
+
maxFinalizeMs: string | undefined;
|
|
48
49
|
chunkByteCount: string | undefined;
|
|
49
50
|
chunkingMode: TurboChunkingMode | undefined;
|
|
50
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/types.ts"],"names":[],"mappings":"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"}
|
package/lib/types/cli/utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Command, OptionValues } from 'commander';
|
|
2
|
-
import { Currency, TokenType, TurboAuthenticatedClient,
|
|
2
|
+
import { Currency, TokenType, TurboAuthenticatedClient, TurboChunkingParams, TurboUnauthenticatedConfiguration } from '../node/index.js';
|
|
3
3
|
import { AddressOptions, GlobalOptions, TokenPriceOptions, UploadFolderOptions, UploadOptions, WalletOptions } from './types.js';
|
|
4
4
|
export declare function exitWithErrorLog(error: unknown): void;
|
|
5
5
|
export declare function runCommand<T extends OptionValues>(command: Command, action: (options: T) => Promise<void>): Promise<void>;
|
|
@@ -27,10 +27,7 @@ export declare function getUploadFolderOptions(options: UploadFolderOptions): {
|
|
|
27
27
|
fallbackFile: string | undefined;
|
|
28
28
|
disableManifest: boolean;
|
|
29
29
|
maxConcurrentUploads: number;
|
|
30
|
-
|
|
31
|
-
chunkByteCount?: number;
|
|
32
|
-
chunkingMode?: TurboChunkingMode;
|
|
33
|
-
};
|
|
30
|
+
} & Partial<TurboChunkingParams>;
|
|
34
31
|
/**
|
|
35
32
|
* Parse tags array from CLI input into Tag array
|
|
36
33
|
* Accepts format: ["name1", "value1", "name2", "value2"]
|
|
@@ -49,10 +46,6 @@ export declare function currencyFromOptions<T extends GlobalOptions & {
|
|
|
49
46
|
currency?: string;
|
|
50
47
|
}>(options: T): Currency | undefined;
|
|
51
48
|
export declare function requiredByteCountFromOptions({ byteCount, }: TokenPriceOptions): number;
|
|
52
|
-
export declare function getChunkingOptions<O extends UploadOptions>(options: O):
|
|
53
|
-
chunkingMode?: TurboChunkingMode;
|
|
54
|
-
chunkByteCount?: number;
|
|
55
|
-
maxChunkConcurrency?: number;
|
|
56
|
-
};
|
|
49
|
+
export declare function getChunkingOptions<O extends UploadOptions>(options: O): Partial<TurboChunkingParams>;
|
|
57
50
|
export {};
|
|
58
51
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/cli/utils.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGlD,OAAO,EACL,QAAQ,EACR,SAAS,EACT,wBAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/cli/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,12 +12,14 @@ export declare const defaultChunkByteCount: number;
|
|
|
12
12
|
export declare class ChunkedUploader {
|
|
13
13
|
private chunkByteCount;
|
|
14
14
|
private readonly maxChunkConcurrency;
|
|
15
|
+
private readonly maxFinalizeMs;
|
|
15
16
|
private readonly http;
|
|
16
17
|
private readonly token;
|
|
17
18
|
private readonly logger;
|
|
18
19
|
readonly shouldUseChunkUploader: boolean;
|
|
19
20
|
private maxBacklogQueue;
|
|
20
|
-
constructor({ http, token, maxChunkConcurrency, chunkByteCount, logger, chunkingMode, dataItemByteCount, }: {
|
|
21
|
+
constructor({ http, token, maxChunkConcurrency, maxFinalizeMs, chunkByteCount, logger, chunkingMode, dataItemByteCount, }: {
|
|
22
|
+
maxFinalizeMs?: number;
|
|
21
23
|
http: TurboHTTPService;
|
|
22
24
|
token: string;
|
|
23
25
|
logger: TurboLogger;
|
|
@@ -33,6 +35,8 @@ export declare class ChunkedUploader {
|
|
|
33
35
|
*/
|
|
34
36
|
private initUpload;
|
|
35
37
|
upload({ dataItemSizeFactory, dataItemStreamFactory, dataItemOpts, signal, events, }: UploadSignedDataItemParams): Promise<TurboUploadDataItemResponse>;
|
|
38
|
+
private toGiB;
|
|
39
|
+
private finalizeUpload;
|
|
36
40
|
}
|
|
37
41
|
/**
|
|
38
42
|
* Yield Buffers of up to `chunkByteCount`, coalescing whatever small pieces
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunked.d.ts","sourceRoot":"","sources":["../../../src/common/chunked.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EACL,SAAS,
|
|
1
|
+
{"version":3,"file":"chunked.d.ts","sourceRoot":"","sources":["../../../src/common/chunked.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EACL,SAAS,EAET,iBAAiB,EACjB,WAAW,EAEX,2BAA2B,EAC3B,0BAA0B,EAG3B,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAK7C,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAK5C,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAChD,eAAO,MAAM,iBAAiB,QAAU,CAAC;AACzC,eAAO,MAAM,qBAAqB,QAAoB,CAAC;AAKvD;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IAErC,SAAgB,sBAAsB,EAAE,OAAO,CAAC;IAChD,OAAO,CAAC,eAAe,CAAS;gBAEpB,EACV,IAAI,EACJ,KAAK,EACL,mBAAgD,EAChD,aAAa,EACb,cAAsC,EACtC,MAAmC,EACnC,YAAqB,EACrB,iBAAiB,GAClB,EAAE;QACD,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,IAAI,EAAE,gBAAgB,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,WAAW,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,YAAY,CAAC,EAAE,iBAAiB,CAAC;QACjC,iBAAiB,EAAE,SAAS,CAAC;KAC9B;IAqBD,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,iBAAiB;IAwDzB;;OAEG;YACW,UAAU;IAqBX,MAAM,CAAC,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,MAAM,EACN,MAAM,GACP,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAwHpE,OAAO,CAAC,KAAK;YAIC,cAAc;CAkG7B;AAED;;;GAGG;AACH,wBAAuB,eAAe,CACpC,MAAM,EAAE,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,EAC7C,cAAc,EAAE,MAAM,GACrB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAMvC;AACD,wBAAuB,uBAAuB,CAC5C,MAAM,EAAE,QAAQ,EAChB,cAAc,EAAE,MAAM,GACrB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAkDvC;AAED,wBAAuB,6BAA6B,CAClD,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,cAAc,EAAE,MAAM,GACrB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAyDvC"}
|
|
@@ -14,15 +14,16 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import { AxiosInstance } from 'axios';
|
|
17
|
-
import { IAxiosRetryConfig } from 'axios-retry';
|
|
18
17
|
import { Readable } from 'node:stream';
|
|
19
18
|
import { TurboHTTPServiceInterface, TurboLogger, TurboSignedRequestHeaders } from '../types.js';
|
|
19
|
+
import { RetryConfig } from '../utils/axiosClient.js';
|
|
20
20
|
export declare class TurboHTTPService implements TurboHTTPServiceInterface {
|
|
21
21
|
protected axios: AxiosInstance;
|
|
22
22
|
protected logger: TurboLogger;
|
|
23
|
-
|
|
23
|
+
protected retryConfig: RetryConfig;
|
|
24
|
+
constructor({ url, logger, retryConfig, }: {
|
|
24
25
|
url: string;
|
|
25
|
-
retryConfig
|
|
26
|
+
retryConfig: RetryConfig;
|
|
26
27
|
logger: TurboLogger;
|
|
27
28
|
});
|
|
28
29
|
get<T>({ endpoint, signal, allowedStatuses, headers, }: {
|
|
@@ -39,5 +40,6 @@ export declare class TurboHTTPService implements TurboHTTPServiceInterface {
|
|
|
39
40
|
data: Readable | Buffer | ReadableStream | Uint8Array;
|
|
40
41
|
}): Promise<T>;
|
|
41
42
|
private tryRequest;
|
|
43
|
+
private retryRequest;
|
|
42
44
|
}
|
|
43
45
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/common/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAc,aAAa,EAAgC,MAAM,OAAO,CAAC;AAChF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/common/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAc,aAAa,EAAgC,MAAM,OAAO,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EAGZ,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,gBAAiB,YAAW,yBAAyB;IAChE,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC;IAC/B,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;gBAEvB,EACV,GAAG,EACH,MAAM,EACN,WAAwC,GACzC,EAAE;QACD,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,WAAW,CAAC;QACzB,MAAM,EAAE,WAAW,CAAC;KACrB;IAYK,GAAG,CAAC,CAAC,EAAE,EACX,QAAQ,EACR,MAAM,EACN,eAA4B,EAC5B,OAAO,GACR,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACvE,GAAG,OAAO,CAAC,CAAC,CAAC;IAOR,IAAI,CAAC,CAAC,EAAE,EACZ,QAAQ,EACR,MAAM,EACN,eAA4B,EAC5B,OAAO,EACP,IAAI,GACL,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAAC;KACvD,GAAG,OAAO,CAAC,CAAC,CAAC;YA2DA,UAAU;YA2BV,YAAY;CAqC3B"}
|
|
@@ -6,7 +6,7 @@ export declare class TurboUnauthenticatedPaymentService implements TurboUnauthen
|
|
|
6
6
|
protected readonly httpService: TurboHTTPService;
|
|
7
7
|
protected logger: TurboLogger;
|
|
8
8
|
protected readonly token: TokenType;
|
|
9
|
-
constructor({ url,
|
|
9
|
+
constructor({ url, logger, retryConfig, token, }: TurboUnauthenticatedPaymentServiceConfiguration);
|
|
10
10
|
getBalance(address: string): Promise<TurboBalanceResponse>;
|
|
11
11
|
getFiatRates(): Promise<TurboRatesResponse>;
|
|
12
12
|
getFiatToAR({ currency, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../../../src/common/payment.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,QAAQ,EACR,+BAA+B,EAE/B,UAAU,EACV,SAAS,EAET,6CAA6C,EAC7C,yCAAyC,EACzC,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,iCAAiC,EACjC,qBAAqB,EACrB,yBAAyB,EAEzB,WAAW,EACX,wBAAwB,EACxB,0BAA0B,EAE1B,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,+BAA+B,EAC/B,+CAA+C,EAC/C,2CAA2C,EAC3C,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,WAAW,EACZ,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../../../src/common/payment.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { IAxiosRetryConfig } from 'axios-retry';
|
|
2
1
|
import { Readable } from 'node:stream';
|
|
3
2
|
import { ArweaveManifest, CreditShareApproval, TokenType, TurboAbortSignal, TurboAuthenticatedUploadServiceConfiguration, TurboAuthenticatedUploadServiceInterface, TurboChunkingParams, TurboCreateCreditShareApprovalParams, TurboDataItemSigner, TurboFileFactory, TurboLogger, TurboRevokeCreditsParams, TurboUnauthenticatedUploadServiceConfiguration, TurboUnauthenticatedUploadServiceInterface, TurboUploadAndSigningEmitterEvents, TurboUploadDataItemResponse, TurboUploadEmitterEvents, TurboUploadFileParams, TurboUploadFolderParams, TurboUploadFolderResponse, UploadDataInput, UploadSignedDataItemParams } from '../types.js';
|
|
3
|
+
import { RetryConfig } from '../utils/axiosClient.js';
|
|
4
4
|
import { TurboHTTPService } from './http.js';
|
|
5
5
|
export type TurboUploadConfig = TurboFileFactory & TurboAbortSignal & TurboUploadEmitterEvents;
|
|
6
6
|
export declare const creditSharingTagNames: {
|
|
@@ -15,7 +15,7 @@ export declare class TurboUnauthenticatedUploadService implements TurboUnauthent
|
|
|
15
15
|
protected httpService: TurboHTTPService;
|
|
16
16
|
protected logger: TurboLogger;
|
|
17
17
|
protected token: TokenType;
|
|
18
|
-
protected retryConfig:
|
|
18
|
+
protected retryConfig: RetryConfig;
|
|
19
19
|
constructor({ url, logger, retryConfig, token, }: TurboUnauthenticatedUploadServiceConfiguration);
|
|
20
20
|
uploadSignedDataItem({ dataItemStreamFactory, dataItemSizeFactory, dataItemOpts, signal, events, }: UploadSignedDataItemParams): Promise<TurboUploadDataItemResponse>;
|
|
21
21
|
}
|