@lossless.org/client 2.0.0 → 2.2.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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/nosqldb/classes.persistence.d.ts +21 -1
- package/dist_ts/nosqldb/classes.persistence.js +23 -1
- package/dist_ts/nosqldb/classes.session.d.ts +8 -0
- package/dist_ts/nosqldb/classes.session.js +27 -2
- package/dist_ts/nosqldb/index.d.ts +1 -1
- package/dist_ts/nosqldb/index.js +2 -2
- package/dist_ts/objectstorage/interfaces.d.ts +16 -2
- package/dist_ts/objectstorage/internal.exactupload.operations.js +148 -77
- package/dist_ts/objectstorage/internal.multipart.planner.d.ts +8 -2
- package/dist_ts/objectstorage/internal.multipart.planner.js +30 -1
- package/dist_ts/objectstorage/internal.multipart.stream.js +68 -19
- package/dist_ts/objectstorage/internal.multipart.types.d.ts +32 -3
- package/package.json +1 -1
- package/readme.md +2 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/nosqldb/classes.persistence.ts +30 -1
- package/ts/nosqldb/classes.session.ts +26 -0
- package/ts/nosqldb/index.ts +1 -1
- package/ts/objectstorage/interfaces.ts +16 -2
- package/ts/objectstorage/internal.exactupload.operations.ts +190 -97
- package/ts/objectstorage/internal.multipart.planner.ts +46 -2
- package/ts/objectstorage/internal.multipart.stream.ts +79 -21
- package/ts/objectstorage/internal.multipart.types.ts +35 -2
|
@@ -60,4 +60,33 @@ export const planMultipartUpload = (optionsArg) => {
|
|
|
60
60
|
maximumBufferedBytes: Math.min(optionsArg.objectSize, partSize * concurrency) + Math.min(optionsArg.objectSize, partSize),
|
|
61
61
|
};
|
|
62
62
|
};
|
|
63
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Plans an upload of undeclared length that must not exceed
|
|
65
|
+
* `maxObjectSize`. The part size grows with the maximum so that the largest
|
|
66
|
+
* allowed source still fits into the multipart part limit.
|
|
67
|
+
*/
|
|
68
|
+
export const planBoundedMultipartUpload = (optionsArg) => {
|
|
69
|
+
if (!Number.isSafeInteger(optionsArg.maxObjectSize) || optionsArg.maxObjectSize < 1) {
|
|
70
|
+
throw new TypeError('maxObjectSize must be a positive safe integer.');
|
|
71
|
+
}
|
|
72
|
+
if (optionsArg.maxObjectSize > MULTIPART_MAX_OBJECT_SIZE) {
|
|
73
|
+
throw new RangeError(`maxObjectSize exceeds the ${MULTIPART_MAX_OBJECT_SIZE} byte multipart limit.`);
|
|
74
|
+
}
|
|
75
|
+
const requestedConcurrency = normalizeRequestedConcurrency(optionsArg.requestedConcurrency);
|
|
76
|
+
const preferredPartSize = normalizeRequestedPartSize(optionsArg.requestedPartSize);
|
|
77
|
+
const partSize = Math.max(preferredPartSize, Math.ceil(optionsArg.maxObjectSize / MULTIPART_MAX_PART_COUNT));
|
|
78
|
+
if (partSize > MULTIPART_MAX_PART_SIZE) {
|
|
79
|
+
throw new RangeError('The maximum cannot be represented by legal multipart parts.');
|
|
80
|
+
}
|
|
81
|
+
const maxPartCount = Math.ceil(optionsArg.maxObjectSize / partSize);
|
|
82
|
+
const concurrency = Math.min(requestedConcurrency, maxPartCount);
|
|
83
|
+
return {
|
|
84
|
+
classification: 'bounded',
|
|
85
|
+
maxObjectSize: optionsArg.maxObjectSize,
|
|
86
|
+
partSize,
|
|
87
|
+
maxPartCount,
|
|
88
|
+
concurrency,
|
|
89
|
+
maximumBufferedBytes: Math.min(optionsArg.maxObjectSize, partSize * concurrency) + Math.min(optionsArg.maxObjectSize, partSize),
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwubXVsdGlwYXJ0LnBsYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9vYmplY3RzdG9yYWdlL2ludGVybmFsLm11bHRpcGFydC5wbGFubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBRTVDLE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE9BQWUsRUFBUSxFQUFFO0lBQ2hGLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsT0FBTyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLDBCQUEwQixHQUFHLENBQUMsb0JBQXdDLEVBQVUsRUFBRTtJQUN0RixJQUFJLG9CQUFvQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sdUJBQXVCLENBQUM7SUFDakMsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksb0JBQW9CLElBQUksQ0FBQyxF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
|
|
@@ -6,6 +6,7 @@ const failureMessages = {
|
|
|
6
6
|
'source-empty-chunk-limit': 'The multipart source emitted too many consecutive empty chunks.',
|
|
7
7
|
'source-short': 'The multipart source ended before the declared content length.',
|
|
8
8
|
'source-extra': 'The multipart source exceeded the declared content length.',
|
|
9
|
+
'source-over-maximum': 'The multipart source exceeded the maximum content length.',
|
|
9
10
|
'part-callback': 'A multipart part callback failed.',
|
|
10
11
|
};
|
|
11
12
|
const failureSettlementMaximumTimeoutMs = 30_000;
|
|
@@ -33,16 +34,33 @@ export class MultipartStreamConsumptionError extends Error {
|
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
const validatePlan = (planArg) => {
|
|
36
|
-
if (!Number.isSafeInteger(planArg.objectSize) ||
|
|
37
|
-
planArg.objectSize < 0 ||
|
|
38
|
-
planArg.objectSize > MULTIPART_MAX_OBJECT_SIZE) {
|
|
39
|
-
throw new TypeError('plan.objectSize is invalid.');
|
|
40
|
-
}
|
|
41
37
|
if (!Number.isSafeInteger(planArg.concurrency) ||
|
|
42
38
|
planArg.concurrency < 1 ||
|
|
43
39
|
planArg.concurrency > MULTIPART_MAX_CONCURRENCY) {
|
|
44
40
|
throw new TypeError('plan.concurrency is invalid.');
|
|
45
41
|
}
|
|
42
|
+
if (planArg.classification === 'bounded') {
|
|
43
|
+
if (!Number.isSafeInteger(planArg.maxObjectSize) ||
|
|
44
|
+
planArg.maxObjectSize < 1 ||
|
|
45
|
+
planArg.maxObjectSize > MULTIPART_MAX_OBJECT_SIZE ||
|
|
46
|
+
!Number.isSafeInteger(planArg.partSize) ||
|
|
47
|
+
planArg.partSize < MULTIPART_MIN_PART_SIZE ||
|
|
48
|
+
planArg.partSize > MULTIPART_MAX_PART_SIZE ||
|
|
49
|
+
planArg.maxPartCount !== Math.ceil(planArg.maxObjectSize / planArg.partSize) ||
|
|
50
|
+
planArg.maxPartCount > MULTIPART_MAX_PART_COUNT ||
|
|
51
|
+
planArg.concurrency > planArg.maxPartCount ||
|
|
52
|
+
planArg.maximumBufferedBytes !==
|
|
53
|
+
Math.min(planArg.maxObjectSize, planArg.partSize * planArg.concurrency) +
|
|
54
|
+
Math.min(planArg.maxObjectSize, planArg.partSize)) {
|
|
55
|
+
throw new TypeError('The bounded multipart plan is inconsistent.');
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!Number.isSafeInteger(planArg.objectSize) ||
|
|
60
|
+
planArg.objectSize < 0 ||
|
|
61
|
+
planArg.objectSize > MULTIPART_MAX_OBJECT_SIZE) {
|
|
62
|
+
throw new TypeError('plan.objectSize is invalid.');
|
|
63
|
+
}
|
|
46
64
|
if (planArg.classification === 'zero') {
|
|
47
65
|
if (planArg.objectSize !== 0 ||
|
|
48
66
|
planArg.partSize !== 0 ||
|
|
@@ -82,6 +100,14 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
82
100
|
failureSettlementTimeoutMs > failureSettlementMaximumTimeoutMs) {
|
|
83
101
|
throw new TypeError(`failureSettlementTimeoutMs must be a positive safe integer no greater than ${failureSettlementMaximumTimeoutMs}.`);
|
|
84
102
|
}
|
|
103
|
+
const plan = optionsArg.plan;
|
|
104
|
+
// A bounded plan reads parts until the source ends and refuses more than
|
|
105
|
+
// its maximum; an exact plan reads exactly the declared length.
|
|
106
|
+
const bounded = plan.classification === 'bounded';
|
|
107
|
+
const sizeLimit = bounded ? plan.maxObjectSize : plan.objectSize;
|
|
108
|
+
const overLimitKind = bounded
|
|
109
|
+
? 'source-over-maximum'
|
|
110
|
+
: 'source-extra';
|
|
85
111
|
const reader = optionsArg.readableStream.getReader();
|
|
86
112
|
const callbackAbortController = new AbortController();
|
|
87
113
|
const inFlightParts = new Map();
|
|
@@ -187,7 +213,7 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
187
213
|
return outcome.result;
|
|
188
214
|
}
|
|
189
215
|
};
|
|
190
|
-
const dispatchPart = (dataArg, partNumberArg) => {
|
|
216
|
+
const dispatchPart = (dataArg, partNumberArg, isLastPartArg) => {
|
|
191
217
|
const token = Symbol(`multipart-part-${partNumberArg}`);
|
|
192
218
|
partCallbacksStarted++;
|
|
193
219
|
currentPartBytes = 0;
|
|
@@ -196,8 +222,8 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
196
222
|
const outcome = Promise.resolve()
|
|
197
223
|
.then(() => optionsArg.onPart({
|
|
198
224
|
partNumber: partNumberArg,
|
|
199
|
-
byteOffset: (partNumberArg - 1) *
|
|
200
|
-
isLastPart:
|
|
225
|
+
byteOffset: (partNumberArg - 1) * plan.partSize,
|
|
226
|
+
isLastPart: isLastPartArg,
|
|
201
227
|
data: dataArg,
|
|
202
228
|
signal: callbackAbortController.signal,
|
|
203
229
|
}))
|
|
@@ -233,10 +259,14 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
233
259
|
try {
|
|
234
260
|
let pendingChunk;
|
|
235
261
|
let pendingChunkOffset = 0;
|
|
236
|
-
for (let partNumber = 1; partNumber <=
|
|
262
|
+
for (let partNumber = 1; bounded ? !sourceClosed : partNumber <= plan.partCount; partNumber++) {
|
|
237
263
|
await waitForCapacity();
|
|
238
|
-
const partByteLength = Math.min(
|
|
239
|
-
|
|
264
|
+
const partByteLength = Math.min(plan.partSize, sizeLimit - (partNumber - 1) * plan.partSize);
|
|
265
|
+
if (partByteLength <= 0) {
|
|
266
|
+
// A bounded source filled its maximum, which ends at or inside the
|
|
267
|
+
// previous part; the trailing read below refuses any further byte.
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
240
270
|
if (inFlightBytes + partByteLength >
|
|
241
271
|
optionsArg.plan.maximumBufferedBytes) {
|
|
242
272
|
throw new Error('The multipart plan cannot honor its buffering bound.');
|
|
@@ -262,6 +292,9 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
262
292
|
const readResult = await readWhileObservingCallbacks();
|
|
263
293
|
if (readResult.done) {
|
|
264
294
|
sourceClosed = true;
|
|
295
|
+
if (bounded) {
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
265
298
|
throw {
|
|
266
299
|
kind: 'source-short',
|
|
267
300
|
};
|
|
@@ -276,22 +309,36 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
276
309
|
continue;
|
|
277
310
|
}
|
|
278
311
|
observedBytes += readResult.value.byteLength;
|
|
279
|
-
if (observedBytes >
|
|
312
|
+
if (observedBytes > sizeLimit) {
|
|
280
313
|
throw {
|
|
281
|
-
kind:
|
|
314
|
+
kind: overLimitKind,
|
|
282
315
|
};
|
|
283
316
|
}
|
|
284
|
-
if (readResult.value.byteLength >
|
|
317
|
+
if (readResult.value.byteLength > plan.partSize) {
|
|
285
318
|
throw {
|
|
286
319
|
kind: 'source-buffer-limit',
|
|
287
|
-
cause: new RangeError(`Source chunks must not exceed ${
|
|
320
|
+
cause: new RangeError(`Source chunks must not exceed ${plan.partSize} bytes.`),
|
|
288
321
|
};
|
|
289
322
|
}
|
|
290
323
|
pendingChunk = readResult.value;
|
|
291
324
|
pendingChunkBytes = readResult.value.byteLength;
|
|
292
325
|
observeBufferedBytes();
|
|
293
326
|
}
|
|
294
|
-
|
|
327
|
+
if (partOffset === 0) {
|
|
328
|
+
// A bounded source ended at a part boundary.
|
|
329
|
+
currentPartBytes = 0;
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
if (partOffset < partByteLength) {
|
|
333
|
+
// Only a bounded source ends inside a part; its last part keeps the
|
|
334
|
+
// bytes read, as an exact copy.
|
|
335
|
+
dispatchPart(partData.slice(0, partOffset), partNumber, true);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
dispatchPart(partData, partNumber, bounded
|
|
339
|
+
? sourceClosed || observedBytes === sizeLimit
|
|
340
|
+
: partNumber === plan.partCount);
|
|
341
|
+
}
|
|
295
342
|
}
|
|
296
343
|
while (!sourceClosed) {
|
|
297
344
|
const readResult = await readWhileObservingCallbacks();
|
|
@@ -310,7 +357,7 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
310
357
|
}
|
|
311
358
|
observedBytes += readResult.value.byteLength;
|
|
312
359
|
throw {
|
|
313
|
-
kind:
|
|
360
|
+
kind: overLimitKind,
|
|
314
361
|
};
|
|
315
362
|
}
|
|
316
363
|
while (inFlightParts.size > 0) {
|
|
@@ -407,7 +454,9 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
407
454
|
completionAuthorized: false,
|
|
408
455
|
kind: failure.kind,
|
|
409
456
|
cause: failure.cause,
|
|
410
|
-
|
|
457
|
+
...(bounded
|
|
458
|
+
? { maxBytes: plan.maxObjectSize }
|
|
459
|
+
: { expectedBytes: plan.objectSize }),
|
|
411
460
|
observedBytes,
|
|
412
461
|
partCallbacksStarted,
|
|
413
462
|
completedPartNumbers: [...completedPartNumbers].sort((leftArg, rightArg) => {
|
|
@@ -437,4 +486,4 @@ export const consumeExactMultipartStream = async (optionsArg) => {
|
|
|
437
486
|
}
|
|
438
487
|
}
|
|
439
488
|
};
|
|
440
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwubXVsdGlwYXJ0LnN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL29iamVjdHN0b3JhZ2UvaW50ZXJuYWwubXVsdGlwYXJ0LnN0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsdUJBQXVCLEVBQ3ZCLHVCQUF1QixHQUN4QixNQUFNLGlDQUFpQyxDQUFDO0FBZ0R6QyxNQUFNLGVBQWUsR0FBZ0Q7SUFDbkUsT0FBTyxFQUFFLDJDQUEyQztJQUNwRCxhQUFhLEVBQUUsc0RBQXNEO0lBQ3JFLHFCQUFxQixFQUFFLG9FQUFvRTtJQUMzRiwwQkFBMEIsRUFDeEIsaUVBQWlFO0lBQ25FLGNBQWMsRUFBRSxnRUFBZ0U7SUFDaEYsY0FBYyxFQUFFLDREQUE0RDtJQUM1RSxlQUFlLEVBQUUsbUNBQW1DO0NBQ3JELENBQUM7QUFDRixNQUFNLGlDQUFpQyxHQUFHLE1BQU0sQ0FBQztBQUNqRCxNQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUU1QyxNQUFNLE9BQU8sK0JBQWdDLFNBQVEsS0FBSztJQUN4QyxLQUFLLENBQStCO0lBQ3BEOztPQUVHO0lBQ2Esa0JBQWtCLENBQWdCO0lBQ2xEOztPQUVHO0lBQ2EsZUFBZSxDQUFnQjtJQUUvQyxZQUNFLFFBQXNDLEVBQ3RDLGNBR0M7UUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCO1lBQ3JCLGNBQWMsRUFBRSxrQkFBa0IsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLGVBQWU7WUFDbEIsY0FBYyxFQUFFLGVBQWUsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekQsQ0FBQztDQUNGO0FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUE2QixFQUFRLEVBQUU7SUFDM0QsSUFDRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN6QyxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUM7UUFDdEIsT0FBTyxDQUFDLFVBQVUsR0FBRyx5QkFBeUIsRUFDOUMsQ0FBQztRQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsSUFDRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUMxQyxPQUFPLENBQUMsV0FBVyxHQUFHLENBQUM7UUFDdkIsT0FBTyxDQUFDLFdBQVcsR0FBRyx5QkFBeUIsRUFDL0MsQ0FBQztRQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsY0FBYyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3RDLElBQ0UsT0FBTyxDQUFDLFVBQVUsS0FBSyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxRQUFRLEtBQUssQ0FBQztZQUN0QixPQUFPLENBQUMsU0FBUyxLQUFLLENBQUM7WUFDdkIsT0FBTyxDQUFDLG9CQUFvQixLQUFLLENBQUMsRUFDbEMsQ0FBQztZQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFFRCxJQUNFLE9BQU8sQ0FBQyxVQUFVLEtBQUssQ0FBQztRQUN4QixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUN2QyxPQUFPLENBQUMsUUFBUSxHQUFHLHVCQUF1QjtRQUMxQyxPQUFPLENBQUMsUUFBUSxHQUFHLHVCQUF1QjtRQUMxQyxPQUFPLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ3RFLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQztRQUNyQixPQUFPLENBQUMsU0FBUyxHQUFHLHdCQUF3QjtRQUM1QyxPQUFPLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTO1FBQ3ZDLE9BQU8sQ0FBQyxvQkFBb0I7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFDbEQsQ0FBQztRQUNELE1BQU0sSUFBSSxTQUFTLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxFQUM5QyxVQUErQyxFQUNILEVBQUU7SUFDOUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUNFLENBQUMsVUFBVSxDQUFDLGNBQWM7UUFDMUIsT0FBTyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQ3pELENBQUM7UUFDRCxNQUFNLElBQUksU0FBUyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELElBQUksT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsTUFBTSwwQkFBMEIsR0FDOUIsVUFBVSxDQUFDLDBCQUEwQjtRQUNyQyxpQ0FBaUMsQ0FBQztJQUNwQyxJQUNFLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztRQUNqRCwwQkFBMEIsSUFBSSxDQUFDO1FBQy9CLDBCQUEwQixHQUFHLGlDQUFpQyxFQUM5RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLFNBQVMsQ0FDakIsOEVBQThFLGlDQUFpQyxHQUFHLENBQ25ILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyRCxNQUFNLHVCQUF1QixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDdEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7SUFDdkQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9DLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztJQUN0QixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUN6QixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDdEIsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBRS9CLElBQUksWUFBa0QsQ0FBQztJQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sQ0FBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUM3RCxZQUFZLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBUyxFQUFFO1FBQzdCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDbEYsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLFlBQVksQ0FBQztZQUNYLElBQUksRUFBRSxPQUFPO1lBQ2IsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUNGLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMvQixXQUFXLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFVBQXdCLEVBQVEsRUFBRTtRQUM1RCxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFDRCxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxhQUFhLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUN6QyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hELE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTTtZQUNKLElBQUksRUFBRSxlQUFlO1lBQ3JCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztTQUNFLENBQUM7SUFDOUIsQ0FBQyxDQUFDO0lBRUYsTUFBTSxvQkFBb0IsR0FBRyxHQUFTLEVBQUU7UUFDdEMsTUFBTSxhQUFhLEdBQUcsYUFBYSxHQUFHLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDO1FBQzNFLElBQUksYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUN6RCxNQUFNO2dCQUNKLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxpREFBaUQsQ0FBQzthQUMvQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2pFLENBQUMsQ0FBQztJQUVGLE1BQU0sY0FBYyxHQUFHLEtBQUssSUFBbUIsRUFBRTtRQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQ2hDO1lBQ0UsWUFBWTtZQUNaLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDaEMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQzdDO1NBQ0YsQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTTtnQkFDSixJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7YUFDSyxDQUFDO1FBQzlCLENBQUM7UUFDRCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxLQUFLLElBQW1CLEVBQUU7UUFDaEQsT0FBTyxhQUFhLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekQsTUFBTSxjQUFjLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLElBRXZDLEVBQUU7UUFDRixNQUFNLFdBQVcsR0FBMEIsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FDM0QsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDZCxJQUFJLEVBQUUsTUFBTTtZQUNaLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsRUFDRixDQUFDLFFBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEIsSUFBSSxFQUFFLFlBQVk7WUFDbEIsS0FBSyxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUNILENBQUM7UUFFRixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxXQUFXO2dCQUNYLFlBQVk7Z0JBQ1osR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUNoQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FDN0M7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixNQUFNO29CQUNKLElBQUksRUFBRSxTQUFTO29CQUNmLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztpQkFDSyxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU07b0JBQ0osSUFBSSxFQUFFLGFBQWE7b0JBQ25CLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztpQkFDSyxDQUFDO1lBQzlCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBbUIsRUFBRSxhQUFxQixFQUFRLEVBQUU7UUFDeEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELG9CQUFvQixFQUFFLENBQUM7UUFDdkIsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLGFBQWEsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3BDLG9CQUFvQixFQUFFLENBQUM7UUFDdkIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRTthQUM5QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQ1QsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNoQixVQUFVLEVBQUUsYUFBYTtZQUN6QixVQUFVLEVBQUUsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQzFELFVBQVUsRUFBRSxhQUFhLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQ3ZELElBQUksRUFBRSxPQUFPO1lBQ2IsTUFBTSxFQUFFLHVCQUF1QixDQUFDLE1BQU07U0FDdkMsQ0FBQyxDQUNIO2FBQ0EsSUFBSSxDQUNILEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDTCxLQUFLO1lBQ0wsVUFBVSxFQUFFLGFBQWE7WUFDekIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxFQUNGLENBQUMsUUFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QixLQUFLO1lBQ0wsVUFBVSxFQUFFLGFBQWE7WUFDekIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsS0FBSyxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUNILENBQUM7UUFDSixhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRTtZQUN2QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsT0FBTztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFvQixFQUFXLEVBQUU7UUFDMUQsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLHNCQUFzQixHQUFHLENBQUMsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pCLElBQUksc0JBQXNCLEdBQUcsNkJBQTZCLEVBQUUsQ0FBQztZQUMzRCxNQUFNO2dCQUNKLElBQUksRUFBRSwwQkFBMEI7Z0JBQ2hDLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FDbkIsMENBQTBDLDZCQUE2Qiw0QkFBNEIsQ0FDcEc7YUFDd0IsQ0FBQztRQUM5QixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixJQUFJLENBQUM7UUFDSCxJQUFJLFlBQW9DLENBQUM7UUFDekMsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFFM0IsS0FDRSxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQ2xCLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFDdkMsVUFBVSxFQUFFLEVBQ1osQ0FBQztZQUNELE1BQU0sZUFBZSxFQUFFLENBQUM7WUFDeEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDN0IsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQ3hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDeEIsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQzlDLENBQUM7WUFDRixJQUNFLGFBQWEsR0FBRyxjQUFjO2dCQUM5QixVQUFVLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUNwQyxDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEQsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDO1lBQ2xDLG9CQUFvQixFQUFFLENBQUM7WUFDdkIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBRW5CLE9BQU8sVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUNuQyxJQUNFLFlBQVk7b0JBQ1osa0JBQWtCLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFDNUMsQ0FBQztvQkFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUM3QixjQUFjLEdBQUcsVUFBVSxFQUMzQixZQUFZLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUM3QyxDQUFDO29CQUNGLFFBQVEsQ0FBQyxHQUFHLENBQ1YsWUFBWSxDQUFDLFFBQVEsQ0FDbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixHQUFHLGNBQWMsQ0FDcEMsRUFDRCxVQUFVLENBQ1gsQ0FBQztvQkFDRixrQkFBa0IsSUFBSSxjQUFjLENBQUM7b0JBQ3JDLFVBQVUsSUFBSSxjQUFjLENBQUM7b0JBQzdCLElBQUksa0JBQWtCLEtBQUssWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUNuRCxZQUFZLEdBQUcsU0FBUyxDQUFDO3dCQUN6QixrQkFBa0IsR0FBRyxDQUFDLENBQUM7d0JBQ3ZCLGlCQUFpQixHQUFHLENBQUMsQ0FBQztvQkFDeEIsQ0FBQztvQkFDRCxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSwyQkFBMkIsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDcEIsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDcEIsTUFBTTt3QkFDSixJQUFJLEVBQUUsY0FBYztxQkFDSyxDQUFDO2dCQUM5QixDQUFDO2dCQUNELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDOUMsTUFBTTt3QkFDSixJQUFJLEVBQUUsYUFBYTt3QkFDbkIsS0FBSyxFQUFFLElBQUksU0FBUyxDQUFDLHNEQUFzRCxDQUFDO3FCQUNuRCxDQUFDO2dCQUM5QixDQUFDO2dCQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDekMsU0FBUztnQkFDWCxDQUFDO2dCQUNELGFBQWEsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztnQkFDN0MsSUFBSSxhQUFhLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDL0MsTUFBTTt3QkFDSixJQUFJLEVBQUUsY0FBYztxQkFDSyxDQUFDO2dCQUM5QixDQUFDO2dCQUNELElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDM0QsTUFBTTt3QkFDSixJQUFJLEVBQUUscUJBQXFCO3dCQUMzQixLQUFLLEVBQUUsSUFBSSxVQUFVLENBQ25CLGlDQUFpQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsU0FBUyxDQUNuRTtxQkFDd0IsQ0FBQztnQkFDOUIsQ0FBQztnQkFDRCxZQUFZLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDaEMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQ2hELG9CQUFvQixFQUFFLENBQUM7WUFDekIsQ0FBQztZQUVELFlBQVksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVELE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNyQixNQUFNLFVBQVUsR0FBRyxNQUFNLDJCQUEyQixFQUFFLENBQUM7WUFDdkQsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLE1BQU07WUFDUixDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxNQUFNO29CQUNKLElBQUksRUFBRSxhQUFhO29CQUNuQixLQUFLLEVBQUUsSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUM7aUJBQ25ELENBQUM7WUFDOUIsQ0FBQztZQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsU0FBUztZQUNYLENBQUM7WUFDRCxhQUFhLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDN0MsTUFBTTtnQkFDSixJQUFJLEVBQUUsY0FBYzthQUNLLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLGNBQWMsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDL0IsTUFBTTtnQkFDSixJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2FBQ04sQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTztZQUNMLG9CQUFvQixFQUFFLElBQUk7WUFDMUIsYUFBYSxFQUFFLGFBQWE7WUFDNUIsYUFBYSxFQUFFLG9CQUFvQixDQUFDLElBQUk7WUFDeEMsaUJBQWlCO1lBQ2pCLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CO1NBQzNELENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDekIsS0FBSyxLQUFLLElBQUk7WUFDZCxNQUFNLElBQUksS0FBSztZQUNmLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQzVCLENBQUMsQ0FBRSxLQUF5QjtZQUM1QixDQUFDLENBQUU7Z0JBQ0MsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLEtBQUssRUFBRSxLQUFLO2FBQ2MsQ0FBQztRQUNuQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RixNQUFNLG9CQUFvQixHQUEwQyxZQUFZO1lBQzlFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCLENBQUM7WUFDSixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtpQkFDZCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3hDLElBQUksQ0FDSCxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNMLE1BQU0sRUFBRSxXQUFXO2FBQ3BCLENBQUMsRUFDRixDQUFDLFFBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sRUFBRSxlQUFlO2dCQUN2QixLQUFLLEVBQUUsUUFBUTthQUNoQixDQUFDLENBQ0gsQ0FBQztRQUVSLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzdCLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FDcEMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDN0IsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQzdDLENBQ0Y7YUFDRSxJQUFJLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBQzdCLEtBQUssTUFBTSxPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3RCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQy9DLENBQUM7WUFDSCxDQUFDO1lBQ0QsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUNILEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFDZixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQ2hCLENBQUM7UUFDSixNQUFNLDBCQUEwQixHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDOUQsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUF1RCxDQUFDO1FBQzVELElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLE1BQU0scUJBQXFCLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUNyRCxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDbkIsYUFBYSxHQUFHLGdCQUFnQixDQUFDO1lBQ2pDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLEVBQ0QsR0FBRyxFQUFFO1lBQ0gsYUFBYSxHQUFHO2dCQUNkLE1BQU0sRUFBRSxlQUFlO2dCQUN2QixLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUM7YUFDL0QsQ0FBQztZQUNGLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQ0YsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDekMsMEJBQTBCO1lBQzFCLHFCQUFxQjtTQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUNwQyx1Q0FBdUMsQ0FDeEMsQ0FBQztRQUNGLElBQUkseUJBRUssQ0FBQztRQUNWLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxPQUFPLENBRTNDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDZix5QkFBeUIsR0FBRyxVQUFVLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDekMseUJBQXlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRCxDQUFDLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUMvQixNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sS0FBSyxHQUNULG9CQUFvQixLQUFLLENBQUM7WUFDeEIsQ0FBQyxDQUFFO2dCQUNDLFdBQVcsRUFBRSxlQUFlO2dCQUM1QixzQkFBc0IsRUFBRSxLQUFLO2FBQ3BCO1lBQ2IsQ0FBQyxDQUFFO2dCQUNDLFdBQVcsRUFBRSx1QkFBdUI7Z0JBQ3BDLHNCQUFzQixFQUFFLElBQUk7YUFDbkIsQ0FBQztRQUVsQixNQUFNLElBQUksK0JBQStCLENBQ3ZDO1lBQ0Usb0JBQW9CLEVBQUUsS0FBSztZQUMzQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLGFBQWEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDekMsYUFBYTtZQUNiLG9CQUFvQjtZQUNwQixvQkFBb0IsRUFBRSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQ2xELENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUNwQixPQUFPLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDNUIsQ0FBQyxDQUNGO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVO2dCQUNwRCxNQUFNLEVBQ0osb0JBQW9CLElBQUksYUFBYTtvQkFDbkMsQ0FBQyxDQUFDLGFBQWE7b0JBQ2YsQ0FBQyxDQUFDO3dCQUNFLE1BQU0sRUFBRSxpQkFBaUI7cUJBQzFCO2FBQ1I7WUFDRCxLQUFLO1NBQ04sRUFDRDtZQUNFLGtCQUFrQjtZQUNsQixlQUFlO1NBQ2hCLENBQ0YsQ0FBQztJQUNKLENBQUM7WUFBUyxDQUFDO1FBQ1QsVUFBVSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxtRUFBbUU7UUFDckUsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDLENBQUMifQ==
|
|
489
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwubXVsdGlwYXJ0LnN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL29iamVjdHN0b3JhZ2UvaW50ZXJuYWwubXVsdGlwYXJ0LnN0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsdUJBQXVCLEVBQ3ZCLHVCQUF1QixHQUN4QixNQUFNLGlDQUFpQyxDQUFDO0FBZ0R6QyxNQUFNLGVBQWUsR0FBZ0Q7SUFDbkUsT0FBTyxFQUFFLDJDQUEyQztJQUNwRCxhQUFhLEVBQUUsc0RBQXNEO0lBQ3JFLHFCQUFxQixFQUFFLG9FQUFvRTtJQUMzRiwwQkFBMEIsRUFDeEIsaUVBQWlFO0lBQ25FLGNBQWMsRUFBRSxnRUFBZ0U7SUFDaEYsY0FBYyxFQUFFLDREQUE0RDtJQUM1RSxxQkFBcUIsRUFBRSwyREFBMkQ7SUFDbEYsZUFBZSxFQUFFLG1DQUFtQztDQUNyRCxDQUFDO0FBQ0YsTUFBTSxpQ0FBaUMsR0FBRyxNQUFNLENBQUM7QUFDakQsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7QUFFNUMsTUFBTSxPQUFPLCtCQUFnQyxTQUFRLEtBQUs7SUFDeEMsS0FBSyxDQUErQjtJQUNwRDs7T0FFRztJQUNhLGtCQUFrQixDQUFnQjtJQUNsRDs7T0FFRztJQUNhLGVBQWUsQ0FBZ0I7SUFFL0MsWUFDRSxRQUFzQyxFQUN0QyxjQUdDO1FBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQ3RCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEdBQUcsaUNBQWlDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQjtZQUNyQixjQUFjLEVBQUUsa0JBQWtCLElBQUks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
|
|
@@ -3,6 +3,11 @@ export interface IMultipartPlanningOptions {
|
|
|
3
3
|
requestedPartSize?: number;
|
|
4
4
|
requestedConcurrency?: number;
|
|
5
5
|
}
|
|
6
|
+
export interface IMultipartBoundedPlanningOptions {
|
|
7
|
+
maxObjectSize: number;
|
|
8
|
+
requestedPartSize?: number;
|
|
9
|
+
requestedConcurrency?: number;
|
|
10
|
+
}
|
|
6
11
|
interface IMultipartUploadPlanBase {
|
|
7
12
|
objectSize: number;
|
|
8
13
|
concurrency: number;
|
|
@@ -20,10 +25,31 @@ export interface IMultipartDataUploadPlan extends IMultipartUploadPlanBase {
|
|
|
20
25
|
partSize: number;
|
|
21
26
|
partCount: number;
|
|
22
27
|
}
|
|
23
|
-
|
|
28
|
+
/**
|
|
29
|
+
* A plan for a source of undeclared length: full parts are read until the
|
|
30
|
+
* source ends, and a source longer than `maxObjectSize` fails. The part size
|
|
31
|
+
* is chosen so that `maxObjectSize` fits into the multipart part limit.
|
|
32
|
+
*/
|
|
33
|
+
export interface IMultipartBoundedUploadPlan {
|
|
34
|
+
classification: 'bounded';
|
|
35
|
+
maxObjectSize: number;
|
|
36
|
+
partSize: number;
|
|
37
|
+
/** Parts that `maxObjectSize` needs; the source may need fewer. */
|
|
38
|
+
maxPartCount: number;
|
|
39
|
+
concurrency: number;
|
|
40
|
+
maximumBufferedBytes: number;
|
|
41
|
+
}
|
|
42
|
+
/** A plan for a source of declared length. */
|
|
43
|
+
export type TMultipartDeclaredUploadPlan = IMultipartZeroUploadPlan | IMultipartDataUploadPlan;
|
|
44
|
+
export type TMultipartUploadPlan = TMultipartDeclaredUploadPlan | IMultipartBoundedUploadPlan;
|
|
24
45
|
export interface IMultipartStreamPart {
|
|
25
46
|
partNumber: number;
|
|
26
47
|
byteOffset: number;
|
|
48
|
+
/**
|
|
49
|
+
* Under a bounded plan a part is only known to be the last when the source
|
|
50
|
+
* ended inside it or it reached the maximum; a source that ends exactly at
|
|
51
|
+
* a part boundary leaves its last part marked false.
|
|
52
|
+
*/
|
|
27
53
|
isLastPart: boolean;
|
|
28
54
|
/**
|
|
29
55
|
* An exact, exclusively owned copy. The consumer never mutates or reuses it.
|
|
@@ -46,7 +72,7 @@ export interface IMultipartStreamConsumptionResult {
|
|
|
46
72
|
peakBufferedBytes: number;
|
|
47
73
|
maximumBufferedBytes: number;
|
|
48
74
|
}
|
|
49
|
-
export type TMultipartStreamFailureKind = 'aborted' | 'source-read' | 'source-buffer-limit' | 'source-empty-chunk-limit' | 'source-short' | 'source-extra' | 'part-callback';
|
|
75
|
+
export type TMultipartStreamFailureKind = 'aborted' | 'source-read' | 'source-buffer-limit' | 'source-empty-chunk-limit' | 'source-short' | 'source-extra' | 'source-over-maximum' | 'part-callback';
|
|
50
76
|
export type TMultipartOwnedReaderCleanup = {
|
|
51
77
|
status: 'closed';
|
|
52
78
|
} | {
|
|
@@ -72,7 +98,10 @@ export interface IMultipartStreamFailureState {
|
|
|
72
98
|
completionAuthorized: false;
|
|
73
99
|
kind: TMultipartStreamFailureKind;
|
|
74
100
|
cause?: unknown;
|
|
75
|
-
|
|
101
|
+
/** The declared length; absent under a bounded plan. */
|
|
102
|
+
expectedBytes?: number;
|
|
103
|
+
/** The maximum length of a bounded plan. */
|
|
104
|
+
maxBytes?: number;
|
|
76
105
|
observedBytes: number;
|
|
77
106
|
partCallbacksStarted: number;
|
|
78
107
|
completedPartNumbers: number[];
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -113,6 +113,7 @@ Family imports preserve the established SmartData and SmartBucket names and cons
|
|
|
113
113
|
| Client deadlines | `timeoutMS` (1..120000) on every ordinary model read and write, instance `save()`/`saveIf()`/`delete()` included, on every exact call, and `session.withTransaction(callback, { timeoutMS })` for a whole transaction, retries and commit included; expiry rejects with `SmartdataPersistenceError` code `timeout`, and an exact write interrupted in flight with `ambiguous_write` |
|
|
114
114
|
| Bounded database close | `db.close({ timeoutMs })` bounds the whole close — session cleanup, the optional database removal and the driver client's close — and rejects at its deadline with `SmartdataPersistenceError` code `timeout`, leaving the database `close_failed`; the driver's close keeps running until it settles on its own, and the next `close()` joins it |
|
|
115
115
|
| Transactions ended by close | a `session.withTransaction()` whose session `db.close()` ends while it runs rejects with `SmartdataPersistenceError` code `unsupported_operation` — "nothing was committed" before the commit, "the commit outcome is unknown" during it — instead of resolving with the callback's result |
|
|
116
|
+
| Transaction conflicts | a `session.withTransaction()` whose every attempt the database aborted as transient (a write conflict or another error labelled `TransientTransactionError`) until the driver's 120-second retry window closed rejects with `SmartdataTransactionConflictError` (a `SmartdataPersistenceError` of code `transaction_conflict`) carrying `attempts`, `elapsedMS` and the last attempt's error as `cause`: nothing was committed and the transaction is safe to re-run. With `timeoutMS` it rejects with `timeout` instead. Ordinary model writes that run in their own transaction reject the same way |
|
|
116
117
|
| Transaction commit outcome | `SmartdataSession.getCommitOutcome(error)` states for every value a `session.withTransaction()` rejected with whether the transaction could have committed: `not_committed` (nothing was committed) or `unknown` (a commit was sent and never confirmed); the rejection itself keeps its identity |
|
|
117
118
|
| Cancellation | `signal` on every exact call, `atomicDeleteMany()` and `session.withTransaction(callback, { signal })`, which interrupts the session's operation in flight, rolls the attempt back and never commits after an abort |
|
|
118
119
|
| Nested array paths | `@svDb({ arrayPaths: [...] })` declares nested arrays below a persisted root; `$push`, `$addToSet` and `$pull` in `atomicUpdate()`, `atomicUpdateMany()`, `atomicFindOneAndUpdate()` and `atomicUpsertMany()` accept them, while undeclared and non-array nested paths stay refused with `invalid_argument` |
|
|
@@ -148,7 +149,7 @@ A bucket lookup sends one HeadBucket for the named bucket, never ListBuckets, so
|
|
|
148
149
|
|
|
149
150
|
`fastGetIfPresent()` answers "read it, or tell me it is gone" with one GetObject, so an object removed between an existence check and a read can no longer turn into a failed read: a provider answer that the key does not exist — `NoSuchKey`, `NotFound` or any other HTTP 404 — resolves `null`. Every other failure rejects as `fastGet()` does, the provider error unchanged: a missing bucket (`NoSuchBucket`), a denied request, a failure while the body streams, and an abort through `signal` or `SmartBucket.close()`, which rejects with the abort reason even when the provider answers not-found after it. `fastExists()` and the create-only check of `fastPutStream()` classify a missing object the same way.
|
|
150
151
|
|
|
151
|
-
Every request of the S3 client a `SmartBucket` builds is bounded. An attempt whose socket does not connect within `connectionTimeoutMs` (default 10 s, at most 60 s), or whose response headers do not arrive within `requestTimeoutMs` of its start (default 60 s, at most 1 h; the upload of the request body counts), fails with the SDK's `TimeoutError`; the SDK retries it up to `maxAttempts` attempts in all (default 3, at most 10, standard retry mode, `AWS_MAX_ATTEMPTS` and shared config files ignored). Each value must be a positive safe integer; anything else is refused with a `TypeError` before a client is built. `smartBucket.requestBounds` (and `connection.requestBounds`) reads the frozen bounds, including `requestDeadlineMs = maxAttempts × requestTimeoutMs + (maxAttempts − 1) × 20 000 ms + 1 000 ms` — the attempts, the longest wait the retry strategy takes before a retry (a provider's retry-after hint included), and a second for the client's own work. 221 000 ms with the defaults. A request still unsettled at that deadline, a stalled error body included, rejects with `ObjectStorageRequestDeadlineError`, its attempt in flight is destroyed and no further attempt of it starts, so a consumer can hold the client to an upper bound of its own (`requestDeadlineMs < bound`). The bound does not undo a request: a PutObject the provider received completely before the deadline or an abort may still take effect. It covers requests, not the time a caller takes to read a download it received: a response body streams at the caller's pace until it is consumed, the caller's signal aborts or the SmartBucket closes. While a client assigned through `storageClient` or `replaceStorageClient()` is in use, `requestBounds` is `undefined` and that client's own configuration applies. A single-request upload (`fastPut`, `fastPutStream`) must finish sending its body within `requestTimeoutMs`;
|
|
152
|
+
Every request of the S3 client a `SmartBucket` builds is bounded. An attempt whose socket does not connect within `connectionTimeoutMs` (default 10 s, at most 60 s), or whose response headers do not arrive within `requestTimeoutMs` of its start (default 60 s, at most 1 h; the upload of the request body counts), fails with the SDK's `TimeoutError`; the SDK retries it up to `maxAttempts` attempts in all (default 3, at most 10, standard retry mode, `AWS_MAX_ATTEMPTS` and shared config files ignored). Each value must be a positive safe integer; anything else is refused with a `TypeError` before a client is built. `smartBucket.requestBounds` (and `connection.requestBounds`) reads the frozen bounds, including `requestDeadlineMs = maxAttempts × requestTimeoutMs + (maxAttempts − 1) × 20 000 ms + 1 000 ms` — the attempts, the longest wait the retry strategy takes before a retry (a provider's retry-after hint included), and a second for the client's own work. 221 000 ms with the defaults. A request still unsettled at that deadline, a stalled error body included, rejects with `ObjectStorageRequestDeadlineError`, its attempt in flight is destroyed and no further attempt of it starts, so a consumer can hold the client to an upper bound of its own (`requestDeadlineMs < bound`). The bound does not undo a request: a PutObject the provider received completely before the deadline or an abort may still take effect. It covers requests, not the time a caller takes to read a download it received: a response body streams at the caller's pace until it is consumed, the caller's signal aborts or the SmartBucket closes. While a client assigned through `storageClient` or `replaceStorageClient()` is in use, `requestBounds` is `undefined` and that client's own configuration applies. A single-request upload (`fastPut`, `fastPutStream`) must finish sending its body within `requestTimeoutMs`; large or slow bodies use `fastPutStreamExact()`, whose parts are separate requests, each bounded on its own (5 MiB unless `requestedPartSize` asks for more or the length needs more than 10,000 parts).
|
|
152
153
|
|
|
153
154
|
A `signal` aborts the request in flight, stops its retries and rejects with the signal's reason; an already aborted signal sends nothing. A signal of a bucket read, write, copy, move, removal, existence check or listing that is not an `AbortSignal`, a `Proxy` of one included, is refused with a `TypeError` before any request. A per-call time limit is a signal as well, `AbortSignal.timeout(ms)` or an own `AbortController`.
|
|
154
155
|
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -7,7 +7,8 @@ export type TSmartdataPersistenceErrorCode =
|
|
|
7
7
|
| 'unique_conflict'
|
|
8
8
|
| 'ambiguous_write'
|
|
9
9
|
| 'unsupported_operation'
|
|
10
|
-
| 'timeout'
|
|
10
|
+
| 'timeout'
|
|
11
|
+
| 'transaction_conflict';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Stable errors for ordinary SmartData model configuration and persistence.
|
|
@@ -28,6 +29,34 @@ export class SmartdataPersistenceError extends Error {
|
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
|
|
32
|
+
/**
|
|
33
|
+
* `session.withTransaction()` gave up because every attempt of the transaction
|
|
34
|
+
* was aborted as transient: a write conflict or another error the database
|
|
35
|
+
* labelled `TransientTransactionError`, through the driver's whole retry
|
|
36
|
+
* window. Nothing was committed, so the transaction is safe to re-run. The
|
|
37
|
+
* last attempt's error is the `cause` and tells which error it was; like every
|
|
38
|
+
* driver error it can contain statement data. A transaction with `timeoutMS`
|
|
39
|
+
* rejects with code `timeout` instead once its deadline expires.
|
|
40
|
+
*/
|
|
41
|
+
export class SmartdataTransactionConflictError extends SmartdataPersistenceError {
|
|
42
|
+
/** How many times the callback ran. */
|
|
43
|
+
public readonly attempts: number;
|
|
44
|
+
/** Milliseconds from the start of `withTransaction()` until it gave up. */
|
|
45
|
+
public readonly elapsedMS: number;
|
|
46
|
+
|
|
47
|
+
constructor(optionsArg: { attempts: number; elapsedMS: number; cause: unknown }) {
|
|
48
|
+
super(
|
|
49
|
+
'transaction_conflict',
|
|
50
|
+
`SmartData transaction gave up after ${optionsArg.attempts} attempts in ${optionsArg.elapsedMS} ms: `
|
|
51
|
+
+ 'every attempt was aborted as transient; nothing was committed.',
|
|
52
|
+
{ cause: optionsArg.cause },
|
|
53
|
+
);
|
|
54
|
+
this.name = 'SmartdataTransactionConflictError';
|
|
55
|
+
this.attempts = optionsArg.attempts;
|
|
56
|
+
this.elapsedMS = optionsArg.elapsedMS;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
31
60
|
/**
|
|
32
61
|
* The client-side deadline of a model call or transaction expired. The
|
|
33
62
|
* driver's own `MongoOperationTimeoutError` stays available as `cause` when
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
import { assertDataOptions } from './classes.operationbudget.js';
|
|
12
12
|
import {
|
|
13
13
|
SmartdataPersistenceError,
|
|
14
|
+
SmartdataTransactionConflictError,
|
|
14
15
|
createSmartdataTimeoutError,
|
|
15
16
|
isMongoDeadlineError,
|
|
16
17
|
isMongoTransientTransactionError,
|
|
@@ -355,6 +356,14 @@ export class SmartdataSession {
|
|
|
355
356
|
* committed, afterwards the commit outcome is unknown. The callback's
|
|
356
357
|
* error, if it threw, is the `cause`.
|
|
357
358
|
*
|
|
359
|
+
* The driver re-runs an attempt the database aborted as transient — a
|
|
360
|
+
* write conflict or another error labelled `TransientTransactionError` —
|
|
361
|
+
* until its retry window of 120 seconds closes. When every attempt was
|
|
362
|
+
* aborted that way, the call rejects with `SmartdataTransactionConflictError`
|
|
363
|
+
* (code `transaction_conflict`): nothing was committed and the transaction
|
|
364
|
+
* is safe to re-run. With `timeoutMS` the deadline is the window, and the
|
|
365
|
+
* call rejects with `timeout` instead.
|
|
366
|
+
*
|
|
358
367
|
* Every rejection states whether the transaction could have committed:
|
|
359
368
|
* `SmartdataSession.getCommitOutcome(error)` returns `not_committed` or
|
|
360
369
|
* `unknown` for the value the call rejected with.
|
|
@@ -370,6 +379,9 @@ export class SmartdataSession {
|
|
|
370
379
|
throw rejectTransaction(errorArg, 'not_committed');
|
|
371
380
|
}
|
|
372
381
|
const { binding, timeoutMS, signal } = admitted;
|
|
382
|
+
const startedAt = performance.now();
|
|
383
|
+
/** How many times the driver started the callback. */
|
|
384
|
+
let attempts = 0;
|
|
373
385
|
binding.transactionActive = true;
|
|
374
386
|
binding.transactionTimeoutMS = timeoutMS;
|
|
375
387
|
binding.transactionSignal = signal;
|
|
@@ -385,6 +397,7 @@ export class SmartdataSession {
|
|
|
385
397
|
const runAttempt = async () => {
|
|
386
398
|
// The last attempt's slots end after this one starts, so it bumps others.
|
|
387
399
|
const attemptStartedAt = performance.now();
|
|
400
|
+
attempts++;
|
|
388
401
|
revisionAttempt?.finish(false);
|
|
389
402
|
revisionAttempt = beginSmartdataWriteRevisionAttempt(binding.owner, attemptStartedAt);
|
|
390
403
|
// The driver starts another attempt only once the last one was aborted.
|
|
@@ -511,6 +524,19 @@ export class SmartdataSession {
|
|
|
511
524
|
outcome: commitOutcomeOfTransactionEnd(binding.transactionEnded),
|
|
512
525
|
};
|
|
513
526
|
}
|
|
527
|
+
// The driver re-runs every attempt aborted as transient until its retry
|
|
528
|
+
// window closes, so such an error that still reaches here exhausted it.
|
|
529
|
+
// With `timeoutMS` the driver raises a deadline error in its place.
|
|
530
|
+
if (isMongoTransientTransactionError(errorArg) && !isMongoDeadlineError(errorArg)) {
|
|
531
|
+
return {
|
|
532
|
+
error: new SmartdataTransactionConflictError({
|
|
533
|
+
attempts,
|
|
534
|
+
elapsedMS: Math.round(performance.now() - startedAt),
|
|
535
|
+
cause: errorArg,
|
|
536
|
+
}),
|
|
537
|
+
outcome: 'not_committed',
|
|
538
|
+
};
|
|
539
|
+
}
|
|
514
540
|
if (errorArg === callbackError) {
|
|
515
541
|
return { error: normalizeDeadlineError(errorArg), outcome: 'not_committed' };
|
|
516
542
|
}
|
package/ts/nosqldb/index.ts
CHANGED
|
@@ -48,7 +48,7 @@ export type {
|
|
|
48
48
|
export type {
|
|
49
49
|
ISmartdataQueryPlanOptions, ISmartdataQueryPlan, ISmartdataQueryPlanStage,
|
|
50
50
|
} from './classes.queryplaninspection.js';
|
|
51
|
-
export { SmartdataPersistenceError } from './classes.persistence.js';
|
|
51
|
+
export { SmartdataPersistenceError, SmartdataTransactionConflictError } from './classes.persistence.js';
|
|
52
52
|
export type { TSmartdataPersistenceErrorCode } from './classes.persistence.js';
|
|
53
53
|
export * from './classes.exactpersistence.js';
|
|
54
54
|
export * from './classes.easystore.js';
|
|
@@ -264,7 +264,18 @@ export interface IFastPutStreamExactOptions {
|
|
|
264
264
|
* size (5 MiB by default).
|
|
265
265
|
*/
|
|
266
266
|
readableStream: Readable | ReadableStream<Uint8Array>;
|
|
267
|
-
|
|
267
|
+
/**
|
|
268
|
+
* The exact source length. Exactly one of `contentLength` and
|
|
269
|
+
* `maxContentLength` must be given.
|
|
270
|
+
*/
|
|
271
|
+
contentLength?: number;
|
|
272
|
+
/**
|
|
273
|
+
* The upper bound for a source of undeclared length. The part size grows so
|
|
274
|
+
* that the maximum fits in 10,000 parts, and buffering stays bounded to the
|
|
275
|
+
* planned parts in flight. A source that exceeds the maximum fails the
|
|
276
|
+
* upload, and the multipart upload is aborted instead of completed.
|
|
277
|
+
*/
|
|
278
|
+
maxContentLength?: number;
|
|
268
279
|
nativeMetadata?: Record<string, string>;
|
|
269
280
|
/**
|
|
270
281
|
* Native S3 object properties that must retain their semantic header
|
|
@@ -316,7 +327,10 @@ export type TExactUploadMultipartCleanup =
|
|
|
316
327
|
export interface IExactUploadFailureState {
|
|
317
328
|
phase: TExactUploadFailurePhase;
|
|
318
329
|
destinationPath: string;
|
|
319
|
-
|
|
330
|
+
/** The declared source length, when the upload declared one. */
|
|
331
|
+
expectedContentLength?: number;
|
|
332
|
+
/** The source maximum, when the upload had an undeclared length. */
|
|
333
|
+
maxContentLength?: number;
|
|
320
334
|
/**
|
|
321
335
|
* Whether this operation can prove that it did not publish the destination.
|
|
322
336
|
* A conditional PutObject or CompleteMultipartUpload response can be lost
|