@ardrive/turbo-sdk 1.44.1-alpha.3 → 1.44.1
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/lib/cjs/common/upload.js
CHANGED
|
@@ -116,11 +116,16 @@ class TurboUnauthenticatedUploadService {
|
|
|
116
116
|
headers,
|
|
117
117
|
x402Options,
|
|
118
118
|
});
|
|
119
|
-
|
|
119
|
+
/*
|
|
120
|
+
Emitted outside the try, and with listener failures contained. A
|
|
121
|
+
settled x402 payment must not be reported as an upload failure: the
|
|
122
|
+
retry loop above would send a second paid request.
|
|
123
|
+
*/
|
|
124
|
+
emitQuietly(emitter, this.logger, 'upload-success');
|
|
120
125
|
return response;
|
|
121
126
|
}
|
|
122
127
|
catch (error) {
|
|
123
|
-
emitter.
|
|
128
|
+
emitQuietly(emitter, this.logger, 'upload-error', error);
|
|
124
129
|
throw error;
|
|
125
130
|
}
|
|
126
131
|
}
|
|
@@ -410,6 +415,19 @@ class TurboAuthenticatedBaseUploadService extends TurboUnauthenticatedUploadServ
|
|
|
410
415
|
chunks far past the buffer cap, so an x402 item over the cap chunks
|
|
411
416
|
whatever the chunk size.
|
|
412
417
|
*/
|
|
418
|
+
/*
|
|
419
|
+
The guard before signing works from an estimate of the signing
|
|
420
|
+
overhead, so an item with large tags can pass it and still exceed the
|
|
421
|
+
cap once signed. With chunking disabled there is no chunked path to
|
|
422
|
+
fall back to, so refuse it here rather than buffering it.
|
|
423
|
+
*/
|
|
424
|
+
if (x402Options !== undefined &&
|
|
425
|
+
params.chunkingMode === 'disabled' &&
|
|
426
|
+
dataItemSizeFactory() > maxX402SingleRequestByteCount) {
|
|
427
|
+
throw new errors_js_1.ProvidedInputError(`The signed x402 item is ${dataItemSizeFactory()} bytes, over the ` +
|
|
428
|
+
`${maxX402SingleRequestByteCount}-byte single-request limit. ` +
|
|
429
|
+
`Remove chunkingMode: 'disabled' to upload this item.`);
|
|
430
|
+
}
|
|
413
431
|
const chunkingMode = x402Options !== undefined &&
|
|
414
432
|
(params.chunkingMode ?? 'auto') === 'auto' &&
|
|
415
433
|
dataItemSizeFactory() > maxX402SingleRequestByteCount
|
|
@@ -465,6 +483,11 @@ class TurboAuthenticatedBaseUploadService extends TurboUnauthenticatedUploadServ
|
|
|
465
483
|
catch (error) {
|
|
466
484
|
// Store the last encountered error and status for re-throwing after retries
|
|
467
485
|
lastError = error;
|
|
486
|
+
// Nothing about the caller's input changes between attempts, so a
|
|
487
|
+
// rejected input fails once rather than after every retry.
|
|
488
|
+
if (error instanceof errors_js_1.ProvidedInputError) {
|
|
489
|
+
throw error;
|
|
490
|
+
}
|
|
468
491
|
if (error instanceof errors_js_2.FailedRequestError) {
|
|
469
492
|
lastStatusCode = error.status;
|
|
470
493
|
}
|
|
@@ -1234,6 +1257,25 @@ const maxX402SingleRequestByteCount = 100 * 1024 * 1024;
|
|
|
1234
1257
|
* Same allowance folder uploads already use for the same overhead.
|
|
1235
1258
|
*/
|
|
1236
1259
|
const x402SignedItemOverheadByteCount = 1200;
|
|
1260
|
+
/**
|
|
1261
|
+
* Emits an event whose listeners belong to the caller, so one that throws
|
|
1262
|
+
* cannot change the result of a request that already settled. A settled x402
|
|
1263
|
+
* payment reported as a failure would be retried, and paid for twice. The
|
|
1264
|
+
* listener's failure is logged instead.
|
|
1265
|
+
*/
|
|
1266
|
+
function emitQuietly(emitter, logger, event, error) {
|
|
1267
|
+
try {
|
|
1268
|
+
if (event === 'upload-error') {
|
|
1269
|
+
emitter.emit('upload-error', error);
|
|
1270
|
+
}
|
|
1271
|
+
else {
|
|
1272
|
+
emitter.emit('upload-success');
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
catch (listenerError) {
|
|
1276
|
+
logger.error(`A ${event} listener threw`, listenerError);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1237
1279
|
/**
|
|
1238
1280
|
* Drain a data-item stream into a Buffer, resuming it once the reader is
|
|
1239
1281
|
* attached so upload-progress events still fire.
|
package/lib/cjs/version.js
CHANGED
package/lib/esm/common/upload.js
CHANGED
|
@@ -18,7 +18,7 @@ import { Readable } from 'node:stream';
|
|
|
18
18
|
import { pLimit } from 'plimit-lit';
|
|
19
19
|
import { ExistingBalanceFunding, OnDemandFunding, X402Funding, } from '../types.js';
|
|
20
20
|
import { isBlob, isValidArweaveBase64URL, sleep } from '../utils/common.js';
|
|
21
|
-
import { AbortError } from '../utils/errors.js';
|
|
21
|
+
import { AbortError, ProvidedInputError } from '../utils/errors.js';
|
|
22
22
|
import { FailedRequestError } from '../utils/errors.js';
|
|
23
23
|
import { contentHashFromFolderIndexKey, contentHashTagName, folderIndexKey, } from '../utils/folderIndex.js';
|
|
24
24
|
import { ChunkedUploader } from './chunked.js';
|
|
@@ -113,11 +113,16 @@ export class TurboUnauthenticatedUploadService {
|
|
|
113
113
|
headers,
|
|
114
114
|
x402Options,
|
|
115
115
|
});
|
|
116
|
-
|
|
116
|
+
/*
|
|
117
|
+
Emitted outside the try, and with listener failures contained. A
|
|
118
|
+
settled x402 payment must not be reported as an upload failure: the
|
|
119
|
+
retry loop above would send a second paid request.
|
|
120
|
+
*/
|
|
121
|
+
emitQuietly(emitter, this.logger, 'upload-success');
|
|
117
122
|
return response;
|
|
118
123
|
}
|
|
119
124
|
catch (error) {
|
|
120
|
-
emitter.
|
|
125
|
+
emitQuietly(emitter, this.logger, 'upload-error', error);
|
|
121
126
|
throw error;
|
|
122
127
|
}
|
|
123
128
|
}
|
|
@@ -406,6 +411,19 @@ export class TurboAuthenticatedBaseUploadService extends TurboUnauthenticatedUpl
|
|
|
406
411
|
chunks far past the buffer cap, so an x402 item over the cap chunks
|
|
407
412
|
whatever the chunk size.
|
|
408
413
|
*/
|
|
414
|
+
/*
|
|
415
|
+
The guard before signing works from an estimate of the signing
|
|
416
|
+
overhead, so an item with large tags can pass it and still exceed the
|
|
417
|
+
cap once signed. With chunking disabled there is no chunked path to
|
|
418
|
+
fall back to, so refuse it here rather than buffering it.
|
|
419
|
+
*/
|
|
420
|
+
if (x402Options !== undefined &&
|
|
421
|
+
params.chunkingMode === 'disabled' &&
|
|
422
|
+
dataItemSizeFactory() > maxX402SingleRequestByteCount) {
|
|
423
|
+
throw new ProvidedInputError(`The signed x402 item is ${dataItemSizeFactory()} bytes, over the ` +
|
|
424
|
+
`${maxX402SingleRequestByteCount}-byte single-request limit. ` +
|
|
425
|
+
`Remove chunkingMode: 'disabled' to upload this item.`);
|
|
426
|
+
}
|
|
409
427
|
const chunkingMode = x402Options !== undefined &&
|
|
410
428
|
(params.chunkingMode ?? 'auto') === 'auto' &&
|
|
411
429
|
dataItemSizeFactory() > maxX402SingleRequestByteCount
|
|
@@ -461,6 +479,11 @@ export class TurboAuthenticatedBaseUploadService extends TurboUnauthenticatedUpl
|
|
|
461
479
|
catch (error) {
|
|
462
480
|
// Store the last encountered error and status for re-throwing after retries
|
|
463
481
|
lastError = error;
|
|
482
|
+
// Nothing about the caller's input changes between attempts, so a
|
|
483
|
+
// rejected input fails once rather than after every retry.
|
|
484
|
+
if (error instanceof ProvidedInputError) {
|
|
485
|
+
throw error;
|
|
486
|
+
}
|
|
464
487
|
if (error instanceof FailedRequestError) {
|
|
465
488
|
lastStatusCode = error.status;
|
|
466
489
|
}
|
|
@@ -1229,6 +1252,25 @@ const maxX402SingleRequestByteCount = 100 * 1024 * 1024;
|
|
|
1229
1252
|
* Same allowance folder uploads already use for the same overhead.
|
|
1230
1253
|
*/
|
|
1231
1254
|
const x402SignedItemOverheadByteCount = 1200;
|
|
1255
|
+
/**
|
|
1256
|
+
* Emits an event whose listeners belong to the caller, so one that throws
|
|
1257
|
+
* cannot change the result of a request that already settled. A settled x402
|
|
1258
|
+
* payment reported as a failure would be retried, and paid for twice. The
|
|
1259
|
+
* listener's failure is logged instead.
|
|
1260
|
+
*/
|
|
1261
|
+
function emitQuietly(emitter, logger, event, error) {
|
|
1262
|
+
try {
|
|
1263
|
+
if (event === 'upload-error') {
|
|
1264
|
+
emitter.emit('upload-error', error);
|
|
1265
|
+
}
|
|
1266
|
+
else {
|
|
1267
|
+
emitter.emit('upload-success');
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
catch (listenerError) {
|
|
1271
|
+
logger.error(`A ${event} listener threw`, listenerError);
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1232
1274
|
/**
|
|
1233
1275
|
* Drain a data-item stream into a Buffer, resuming it once the reader is
|
|
1234
1276
|
* attached so upload-progress events still fire.
|
package/lib/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/common/upload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,OAAO,EACL,eAAe,EACf,mBAAmB,EAGnB,cAAc,EAEd,SAAS,EACT,gBAAgB,EAChB,4CAA4C,EAC5C,wCAAwC,EACxC,mBAAmB,EACnB,oCAAoC,EAEpC,mBAAmB,EACnB,gBAAgB,EAEhB,WAAW,EACX,wBAAwB,EACxB,8CAA8C,EAC9C,0CAA0C,EAC1C,kCAAkC,EAClC,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EAGrB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,8BAA8B,EAC9B,2BAA2B,EAC3B,6BAA6B,EAC7B,eAAe,EACf,cAAc,EACd,0BAA0B,EAE3B,MAAM,aAAa,CAAC;AAWrB,OAAO,EAAE,WAAW,EAAsB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAuB,MAAM,WAAW,CAAC;AAGlE,OAAO,EAAE,gCAAgC,EAAE,MAAM,cAAc,CAAC;AAGhE,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAC9C,gBAAgB,GAChB,wBAAwB,CAAC;AAc3B,eAAO,MAAM,qBAAqB;;;;;CAKjC,CAAC;AAEF,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAC/E,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AAEnE,qBAAa,iCACX,YAAW,0CAA0C;IAErD,SAAS,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACxC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,iBAAiB,EAAE,SAAS,EAAE,CAAiB;IAEzD,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;gBACvB,EACV,GAA6B,EAC7B,MAAuB,EACvB,WAAwC,EACxC,KAAiB,GAClB,EAAE,8CAA8C;IAW3C,oBAAoB,CAAC,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,MAAM,EACN,MAAW,EACX,WAAW,GACZ,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/common/upload.ts"],"names":[],"mappings":"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"}
|
package/lib/types/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,eAAO,MAAM,OAAO,WAAW,CAAC"}
|