@lossless.org/client 0.1.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/.smartconfig.json +37 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.losslessorgclient.d.ts +32 -0
- package/dist_ts/classes.losslessorgclient.js +103 -0
- package/dist_ts/core/classes.error.d.ts +16 -0
- package/dist_ts/core/classes.error.js +29 -0
- package/dist_ts/core/classes.operation.d.ts +17 -0
- package/dist_ts/core/classes.operation.js +70 -0
- package/dist_ts/core/interfaces.d.ts +18 -0
- package/dist_ts/core/interfaces.js +2 -0
- package/dist_ts/index.d.ts +4 -0
- package/dist_ts/index.js +3 -0
- package/dist_ts/nosqldb/classes.atomicdelete.d.ts +26 -0
- package/dist_ts/nosqldb/classes.atomicdelete.js +44 -0
- package/dist_ts/nosqldb/classes.atomicfindoneandupdate.d.ts +27 -0
- package/dist_ts/nosqldb/classes.atomicfindoneandupdate.js +86 -0
- package/dist_ts/nosqldb/classes.atomicupdate.d.ts +26 -0
- package/dist_ts/nosqldb/classes.atomicupdate.js +55 -0
- package/dist_ts/nosqldb/classes.bootstraprecord.d.ts +14 -0
- package/dist_ts/nosqldb/classes.bootstraprecord.js +80 -0
- package/dist_ts/nosqldb/classes.bsonassertion.d.ts +2 -0
- package/dist_ts/nosqldb/classes.bsonassertion.js +29 -0
- package/dist_ts/nosqldb/classes.bsonobjectid.d.ts +2 -0
- package/dist_ts/nosqldb/classes.bsonobjectid.js +50 -0
- package/dist_ts/nosqldb/classes.bsonsnapshot.d.ts +3 -0
- package/dist_ts/nosqldb/classes.bsonsnapshot.js +126 -0
- package/dist_ts/nosqldb/classes.cached-document.d.ts +27 -0
- package/dist_ts/nosqldb/classes.cached-document.js +112 -0
- package/dist_ts/nosqldb/classes.collection.d.ts +302 -0
- package/dist_ts/nosqldb/classes.collection.js +1568 -0
- package/dist_ts/nosqldb/classes.collectionfactory.d.ts +30 -0
- package/dist_ts/nosqldb/classes.collectionfactory.js +65 -0
- package/dist_ts/nosqldb/classes.collectionlifecycle.d.ts +4 -0
- package/dist_ts/nosqldb/classes.collectionlifecycle.js +15 -0
- package/dist_ts/nosqldb/classes.collectionpreparation.d.ts +34 -0
- package/dist_ts/nosqldb/classes.collectionpreparation.js +134 -0
- package/dist_ts/nosqldb/classes.collectiontopology.d.ts +47 -0
- package/dist_ts/nosqldb/classes.collectiontopology.js +388 -0
- package/dist_ts/nosqldb/classes.connection.d.ts +18 -0
- package/dist_ts/nosqldb/classes.connection.js +23 -0
- package/dist_ts/nosqldb/classes.convenience.d.ts +1 -0
- package/dist_ts/nosqldb/classes.convenience.js +5 -0
- package/dist_ts/nosqldb/classes.cursor.d.ts +15 -0
- package/dist_ts/nosqldb/classes.cursor.js +82 -0
- package/dist_ts/nosqldb/classes.cursoroperation.d.ts +7 -0
- package/dist_ts/nosqldb/classes.cursoroperation.js +36 -0
- package/dist_ts/nosqldb/classes.db.d.ts +98 -0
- package/dist_ts/nosqldb/classes.db.js +434 -0
- package/dist_ts/nosqldb/classes.distributedcoordinator.d.ts +52 -0
- package/dist_ts/nosqldb/classes.distributedcoordinator.js +314 -0
- package/dist_ts/nosqldb/classes.doc.d.ts +722 -0
- package/dist_ts/nosqldb/classes.doc.js +2976 -0
- package/dist_ts/nosqldb/classes.easystore.d.ts +42 -0
- package/dist_ts/nosqldb/classes.easystore.js +199 -0
- package/dist_ts/nosqldb/classes.exactpersistence.d.ts +141 -0
- package/dist_ts/nosqldb/classes.exactpersistence.js +1110 -0
- package/dist_ts/nosqldb/classes.lucene.adapter.d.ts +173 -0
- package/dist_ts/nosqldb/classes.lucene.adapter.js +623 -0
- package/dist_ts/nosqldb/classes.mongoadministration.d.ts +73 -0
- package/dist_ts/nosqldb/classes.mongoadministration.js +497 -0
- package/dist_ts/nosqldb/classes.namespaceinspection.d.ts +42 -0
- package/dist_ts/nosqldb/classes.namespaceinspection.js +138 -0
- package/dist_ts/nosqldb/classes.operationbudget.d.ts +22 -0
- package/dist_ts/nosqldb/classes.operationbudget.js +65 -0
- package/dist_ts/nosqldb/classes.ordinarypersistence.d.ts +18 -0
- package/dist_ts/nosqldb/classes.ordinarypersistence.js +71 -0
- package/dist_ts/nosqldb/classes.persistence.d.ts +14 -0
- package/dist_ts/nosqldb/classes.persistence.js +34 -0
- package/dist_ts/nosqldb/classes.session.d.ts +28 -0
- package/dist_ts/nosqldb/classes.session.js +246 -0
- package/dist_ts/nosqldb/classes.storedinspection.d.ts +44 -0
- package/dist_ts/nosqldb/classes.storedinspection.js +100 -0
- package/dist_ts/nosqldb/classes.testdatabase.d.ts +56 -0
- package/dist_ts/nosqldb/classes.testdatabase.js +250 -0
- package/dist_ts/nosqldb/classes.watcher.d.ts +37 -0
- package/dist_ts/nosqldb/classes.watcher.js +98 -0
- package/dist_ts/nosqldb/index.d.ts +27 -0
- package/dist_ts/nosqldb/index.js +18 -0
- package/dist_ts/nosqldb/logging.d.ts +2 -0
- package/dist_ts/nosqldb/logging.js +3 -0
- package/dist_ts/nosqldb/plugins.d.ts +17 -0
- package/dist_ts/nosqldb/plugins.js +20 -0
- package/dist_ts/nosqldb/shim.d.ts +1 -0
- package/dist_ts/nosqldb/shim.js +8 -0
- package/dist_ts/nosqldb/testsupport.d.ts +3 -0
- package/dist_ts/nosqldb/testsupport.js +3 -0
- package/dist_ts/objectstorage/classes.bucket.d.ts +227 -0
- package/dist_ts/objectstorage/classes.bucket.js +939 -0
- package/dist_ts/objectstorage/classes.connection.d.ts +21 -0
- package/dist_ts/objectstorage/classes.connection.js +27 -0
- package/dist_ts/objectstorage/classes.directory.d.ts +124 -0
- package/dist_ts/objectstorage/classes.directory.js +335 -0
- package/dist_ts/objectstorage/classes.exactpathpurgeerror.d.ts +5 -0
- package/dist_ts/objectstorage/classes.exactpathpurgeerror.js +18 -0
- package/dist_ts/objectstorage/classes.exactuploaderror.d.ts +5 -0
- package/dist_ts/objectstorage/classes.exactuploaderror.js +19 -0
- package/dist_ts/objectstorage/classes.file.d.ts +91 -0
- package/dist_ts/objectstorage/classes.file.js +255 -0
- package/dist_ts/objectstorage/classes.listcursor.d.ts +41 -0
- package/dist_ts/objectstorage/classes.listcursor.js +67 -0
- package/dist_ts/objectstorage/classes.metadata.d.ts +57 -0
- package/dist_ts/objectstorage/classes.metadata.js +113 -0
- package/dist_ts/objectstorage/classes.smartbucket.d.ts +57 -0
- package/dist_ts/objectstorage/classes.smartbucket.js +357 -0
- package/dist_ts/objectstorage/classes.trash.d.ts +11 -0
- package/dist_ts/objectstorage/classes.trash.js +22 -0
- package/dist_ts/objectstorage/classes.watcher.d.ts +79 -0
- package/dist_ts/objectstorage/classes.watcher.js +249 -0
- package/dist_ts/objectstorage/helpers.d.ts +25 -0
- package/dist_ts/objectstorage/helpers.js +215 -0
- package/dist_ts/objectstorage/index.d.ts +13 -0
- package/dist_ts/objectstorage/index.js +13 -0
- package/dist_ts/objectstorage/interfaces.d.ts +276 -0
- package/dist_ts/objectstorage/interfaces.js +2 -0
- package/dist_ts/objectstorage/internal.exactpathpurge.operations.d.ts +11 -0
- package/dist_ts/objectstorage/internal.exactpathpurge.operations.js +1069 -0
- package/dist_ts/objectstorage/internal.exactupload.capability.d.ts +40 -0
- package/dist_ts/objectstorage/internal.exactupload.capability.js +382 -0
- package/dist_ts/objectstorage/internal.exactupload.operations.d.ts +11 -0
- package/dist_ts/objectstorage/internal.exactupload.operations.js +1104 -0
- package/dist_ts/objectstorage/internal.multipart.planner.d.ts +8 -0
- package/dist_ts/objectstorage/internal.multipart.planner.js +63 -0
- package/dist_ts/objectstorage/internal.multipart.stream.d.ts +17 -0
- package/dist_ts/objectstorage/internal.multipart.stream.js +440 -0
- package/dist_ts/objectstorage/internal.multipart.types.d.ts +82 -0
- package/dist_ts/objectstorage/internal.multipart.types.js +2 -0
- package/dist_ts/objectstorage/plugins.d.ts +17 -0
- package/dist_ts/objectstorage/plugins.js +23 -0
- package/dist_ts/plugins.d.ts +4 -0
- package/dist_ts/plugins.js +5 -0
- package/dist_ts/sqldb/classes.clickhouseconnection.d.ts +39 -0
- package/dist_ts/sqldb/classes.clickhouseconnection.js +225 -0
- package/dist_ts/sqldb/classes.sqlconnection.d.ts +50 -0
- package/dist_ts/sqldb/classes.sqlconnection.js +376 -0
- package/dist_ts/sqldb/classes.sqltable.d.ts +29 -0
- package/dist_ts/sqldb/classes.sqltable.js +70 -0
- package/dist_ts/sqldb/clickhouse/classes.metricwriter.d.ts +27 -0
- package/dist_ts/sqldb/clickhouse/classes.metricwriter.js +89 -0
- package/dist_ts/sqldb/clickhouse/index.d.ts +9 -0
- package/dist_ts/sqldb/clickhouse/index.js +13 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.d.ts +88 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.js +304 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.d.ts +28 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.js +46 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.d.ts +43 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.js +155 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.resultset.d.ts +13 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.resultset.js +36 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.d.ts +49 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.js +106 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.d.ts +51 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.js +96 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.plugins.d.ts +5 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.plugins.js +6 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.types.d.ts +53 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.types.js +41 -0
- package/dist_ts/sqldb/index.d.ts +6 -0
- package/dist_ts/sqldb/index.js +6 -0
- package/dist_ts/sqldb/interfaces.d.ts +53 -0
- package/dist_ts/sqldb/interfaces.js +19 -0
- package/dist_ts/sqldb/internal.sqlpool.d.ts +51 -0
- package/dist_ts/sqldb/internal.sqlpool.js +214 -0
- package/dist_ts/sqldb/plugins.clickhouse.d.ts +4 -0
- package/dist_ts/sqldb/plugins.clickhouse.js +5 -0
- package/dist_ts/sqldb/plugins.mariadb.d.ts +4 -0
- package/dist_ts/sqldb/plugins.mariadb.js +5 -0
- package/docs/source/smartbucket/license.md +19 -0
- package/docs/source/smartclickhouse/license.md +19 -0
- package/license.md +21 -0
- package/package.json +101 -0
- package/readme.md +157 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.losslessorgclient.ts +104 -0
- package/ts/core/classes.error.ts +31 -0
- package/ts/core/classes.operation.ts +60 -0
- package/ts/core/interfaces.ts +24 -0
- package/ts/index.ts +4 -0
- package/ts/nosqldb/classes.atomicdelete.ts +81 -0
- package/ts/nosqldb/classes.atomicfindoneandupdate.ts +152 -0
- package/ts/nosqldb/classes.atomicupdate.ts +99 -0
- package/ts/nosqldb/classes.bootstraprecord.ts +107 -0
- package/ts/nosqldb/classes.bsonassertion.ts +25 -0
- package/ts/nosqldb/classes.bsonobjectid.ts +45 -0
- package/ts/nosqldb/classes.bsonsnapshot.ts +105 -0
- package/ts/nosqldb/classes.cached-document.ts +67 -0
- package/ts/nosqldb/classes.collection.ts +2399 -0
- package/ts/nosqldb/classes.collectionfactory.ts +87 -0
- package/ts/nosqldb/classes.collectionlifecycle.ts +24 -0
- package/ts/nosqldb/classes.collectionpreparation.ts +164 -0
- package/ts/nosqldb/classes.collectiontopology.ts +645 -0
- package/ts/nosqldb/classes.connection.ts +31 -0
- package/ts/nosqldb/classes.convenience.ts +5 -0
- package/ts/nosqldb/classes.cursor.ts +88 -0
- package/ts/nosqldb/classes.cursoroperation.ts +38 -0
- package/ts/nosqldb/classes.db.ts +637 -0
- package/ts/nosqldb/classes.distributedcoordinator.ts +305 -0
- package/ts/nosqldb/classes.doc.ts +4928 -0
- package/ts/nosqldb/classes.easystore.ts +154 -0
- package/ts/nosqldb/classes.exactpersistence.ts +1974 -0
- package/ts/nosqldb/classes.lucene.adapter.ts +780 -0
- package/ts/nosqldb/classes.mongoadministration.ts +867 -0
- package/ts/nosqldb/classes.namespaceinspection.ts +199 -0
- package/ts/nosqldb/classes.operationbudget.ts +75 -0
- package/ts/nosqldb/classes.ordinarypersistence.ts +84 -0
- package/ts/nosqldb/classes.persistence.ts +62 -0
- package/ts/nosqldb/classes.session.ts +389 -0
- package/ts/nosqldb/classes.storedinspection.ts +151 -0
- package/ts/nosqldb/classes.testdatabase.ts +272 -0
- package/ts/nosqldb/classes.watcher.ts +96 -0
- package/ts/nosqldb/index.ts +51 -0
- package/ts/nosqldb/logging.ts +3 -0
- package/ts/nosqldb/plugins.ts +37 -0
- package/ts/nosqldb/shim.ts +6 -0
- package/ts/nosqldb/testsupport.ts +13 -0
- package/ts/objectstorage/classes.bucket.ts +1114 -0
- package/ts/objectstorage/classes.connection.ts +36 -0
- package/ts/objectstorage/classes.directory.ts +425 -0
- package/ts/objectstorage/classes.exactpathpurgeerror.ts +24 -0
- package/ts/objectstorage/classes.exactuploaderror.ts +25 -0
- package/ts/objectstorage/classes.file.ts +303 -0
- package/ts/objectstorage/classes.listcursor.ts +89 -0
- package/ts/objectstorage/classes.metadata.ts +134 -0
- package/ts/objectstorage/classes.smartbucket.ts +445 -0
- package/ts/objectstorage/classes.trash.ts +30 -0
- package/ts/objectstorage/classes.watcher.ts +289 -0
- package/ts/objectstorage/helpers.ts +254 -0
- package/ts/objectstorage/index.ts +13 -0
- package/ts/objectstorage/interfaces.ts +389 -0
- package/ts/objectstorage/internal.exactpathpurge.operations.ts +1936 -0
- package/ts/objectstorage/internal.exactupload.capability.ts +580 -0
- package/ts/objectstorage/internal.exactupload.operations.ts +1715 -0
- package/ts/objectstorage/internal.multipart.planner.ts +90 -0
- package/ts/objectstorage/internal.multipart.stream.ts +606 -0
- package/ts/objectstorage/internal.multipart.types.ts +106 -0
- package/ts/objectstorage/plugins.ts +35 -0
- package/ts/plugins.ts +4 -0
- package/ts/sqldb/classes.clickhouseconnection.ts +189 -0
- package/ts/sqldb/classes.sqlconnection.ts +350 -0
- package/ts/sqldb/classes.sqltable.ts +70 -0
- package/ts/sqldb/clickhouse/classes.metricwriter.ts +72 -0
- package/ts/sqldb/clickhouse/index.ts +16 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.ts +372 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.ts +52 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.ts +120 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.resultset.ts +44 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.ts +123 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.ts +114 -0
- package/ts/sqldb/clickhouse/smartclickhouse.plugins.ts +5 -0
- package/ts/sqldb/clickhouse/smartclickhouse.types.ts +134 -0
- package/ts/sqldb/index.ts +6 -0
- package/ts/sqldb/interfaces.ts +61 -0
- package/ts/sqldb/internal.sqlpool.ts +179 -0
- package/ts/sqldb/plugins.clickhouse.ts +4 -0
- package/ts/sqldb/plugins.mariadb.ts +4 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IMultipartPlanningOptions, TMultipartUploadPlan } from './internal.multipart.types.js';
|
|
2
|
+
export declare const MULTIPART_MIN_PART_SIZE: number;
|
|
3
|
+
export declare const MULTIPART_MAX_PART_SIZE: number;
|
|
4
|
+
export declare const MULTIPART_MAX_PART_COUNT = 10000;
|
|
5
|
+
export declare const MULTIPART_MAX_OBJECT_SIZE: number;
|
|
6
|
+
export declare const MULTIPART_DEFAULT_CONCURRENCY = 1;
|
|
7
|
+
export declare const MULTIPART_MAX_CONCURRENCY = 32;
|
|
8
|
+
export declare const planMultipartUpload: (optionsArg: IMultipartPlanningOptions) => TMultipartUploadPlan;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const MULTIPART_MIN_PART_SIZE = 5 * 1024 * 1024;
|
|
2
|
+
export const MULTIPART_MAX_PART_SIZE = 5 * 1024 * 1024 * 1024;
|
|
3
|
+
export const MULTIPART_MAX_PART_COUNT = 10_000;
|
|
4
|
+
export const MULTIPART_MAX_OBJECT_SIZE = 5 * 1024 * 1024 * 1024 * 1024;
|
|
5
|
+
export const MULTIPART_DEFAULT_CONCURRENCY = 1;
|
|
6
|
+
export const MULTIPART_MAX_CONCURRENCY = 32;
|
|
7
|
+
const requireSafeNonNegativeInteger = (valueArg, nameArg) => {
|
|
8
|
+
if (!Number.isSafeInteger(valueArg) || valueArg < 0) {
|
|
9
|
+
throw new TypeError(`${nameArg} must be a non-negative safe integer.`);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const normalizeRequestedPartSize = (requestedPartSizeArg) => {
|
|
13
|
+
if (requestedPartSizeArg === undefined) {
|
|
14
|
+
return MULTIPART_MIN_PART_SIZE;
|
|
15
|
+
}
|
|
16
|
+
if (!Number.isSafeInteger(requestedPartSizeArg) || requestedPartSizeArg <= 0) {
|
|
17
|
+
throw new TypeError('requestedPartSize must be a positive safe integer.');
|
|
18
|
+
}
|
|
19
|
+
return Math.min(MULTIPART_MAX_PART_SIZE, Math.max(MULTIPART_MIN_PART_SIZE, requestedPartSizeArg));
|
|
20
|
+
};
|
|
21
|
+
const normalizeRequestedConcurrency = (requestedConcurrencyArg) => {
|
|
22
|
+
if (requestedConcurrencyArg === undefined) {
|
|
23
|
+
return MULTIPART_DEFAULT_CONCURRENCY;
|
|
24
|
+
}
|
|
25
|
+
if (!Number.isSafeInteger(requestedConcurrencyArg) || requestedConcurrencyArg <= 0) {
|
|
26
|
+
throw new TypeError('requestedConcurrency must be a positive safe integer.');
|
|
27
|
+
}
|
|
28
|
+
return Math.min(MULTIPART_MAX_CONCURRENCY, requestedConcurrencyArg);
|
|
29
|
+
};
|
|
30
|
+
export const planMultipartUpload = (optionsArg) => {
|
|
31
|
+
requireSafeNonNegativeInteger(optionsArg.objectSize, 'objectSize');
|
|
32
|
+
if (optionsArg.objectSize > MULTIPART_MAX_OBJECT_SIZE) {
|
|
33
|
+
throw new RangeError(`objectSize exceeds the ${MULTIPART_MAX_OBJECT_SIZE} byte multipart limit.`);
|
|
34
|
+
}
|
|
35
|
+
const requestedConcurrency = normalizeRequestedConcurrency(optionsArg.requestedConcurrency);
|
|
36
|
+
if (optionsArg.objectSize === 0) {
|
|
37
|
+
return {
|
|
38
|
+
classification: 'zero',
|
|
39
|
+
objectSize: 0,
|
|
40
|
+
partSize: 0,
|
|
41
|
+
partCount: 0,
|
|
42
|
+
concurrency: requestedConcurrency,
|
|
43
|
+
maximumBufferedBytes: 0,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const preferredPartSize = normalizeRequestedPartSize(optionsArg.requestedPartSize);
|
|
47
|
+
const minimumPartSizeForCount = Math.ceil(optionsArg.objectSize / MULTIPART_MAX_PART_COUNT);
|
|
48
|
+
const partSize = Math.max(preferredPartSize, minimumPartSizeForCount);
|
|
49
|
+
if (partSize > MULTIPART_MAX_PART_SIZE) {
|
|
50
|
+
throw new RangeError('The object cannot be represented by legal multipart parts.');
|
|
51
|
+
}
|
|
52
|
+
const partCount = Math.ceil(optionsArg.objectSize / partSize);
|
|
53
|
+
const concurrency = Math.min(requestedConcurrency, partCount);
|
|
54
|
+
return {
|
|
55
|
+
classification: 'multipart',
|
|
56
|
+
objectSize: optionsArg.objectSize,
|
|
57
|
+
partSize,
|
|
58
|
+
partCount,
|
|
59
|
+
concurrency,
|
|
60
|
+
maximumBufferedBytes: Math.min(optionsArg.objectSize, partSize * concurrency) + Math.min(optionsArg.objectSize, partSize),
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwubXVsdGlwYXJ0LnBsYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9vYmplY3RzdG9yYWdlL2ludGVybmFsLm11bHRpcGFydC5wbGFubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBRTVDLE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE9BQWUsRUFBUSxFQUFFO0lBQ2hGLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsT0FBTyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLDBCQUEwQixHQUFHLENBQUMsb0JBQXdDLEVBQVUsRUFBRTtJQUN0RixJQUFJLG9CQUFvQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sdUJBQXVCLENBQUM7SUFDakMsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksb0JBQW9CLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0UsTUFBTSxJQUFJLFNBQVMsQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQ2IsdUJBQXVCLEVBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLENBQUMsQ0FDeEQsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sNkJBQTZCLEdBQUcsQ0FDcEMsdUJBQTJDLEVBQ25DLEVBQUU7SUFDVixJQUFJLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sNkJBQTZCLENBQUM7SUFDdkMsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLElBQUksdUJBQXVCLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkYsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztBQUN0RSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUNqQyxVQUFxQyxFQUNmLEVBQUU7SUFDeEIsNkJBQTZCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNuRSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEdBQUcseUJBQXlCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksVUFBVSxDQUNsQiwwQkFBMEIseUJBQXlCLHdCQUF3QixDQUM1RSxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sb0JBQW9CLEdBQUcsNkJBQTZCLENBQ3hELFVBQVUsQ0FBQyxvQkFBb0IsQ0FDaEMsQ0FBQztJQUNGLElBQUksVUFBVSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxPQUFPO1lBQ0wsY0FBYyxFQUFFLE1BQU07WUFDdEIsVUFBVSxFQUFFLENBQUM7WUFDYixRQUFRLEVBQUUsQ0FBQztZQUNYLFNBQVMsRUFBRSxDQUFDO1lBQ1osV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxvQkFBb0IsRUFBRSxDQUFDO1NBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNuRixNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQ3ZDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsd0JBQXdCLENBQ2pELENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDdEUsSUFBSSxRQUFRLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLElBQUksVUFBVSxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUM5RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlELE9BQU87UUFDTCxjQUFjLEVBQUUsV0FBVztRQUMzQixVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVU7UUFDakMsUUFBUTtRQUNSLFNBQVM7UUFDVCxXQUFXO1FBQ1gsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FDNUIsVUFBVSxDQUFDLFVBQVUsRUFDckIsUUFBUSxHQUFHLFdBQVcsQ0FDdkIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDO0tBQzlDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IConsumeExactMultipartStreamOptions, IMultipartStreamConsumptionResult, IMultipartStreamFailureState } from './internal.multipart.types.js';
|
|
2
|
+
export declare class MultipartStreamConsumptionError extends Error {
|
|
3
|
+
readonly state: IMultipartStreamFailureState;
|
|
4
|
+
/**
|
|
5
|
+
* Non-rejecting settlement of every started part callback.
|
|
6
|
+
*/
|
|
7
|
+
readonly callbackSettlement: Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Non-rejecting settlement of callbacks and owned reader cancellation.
|
|
10
|
+
*/
|
|
11
|
+
readonly ownedSettlement: Promise<void>;
|
|
12
|
+
constructor(stateArg: IMultipartStreamFailureState, settlementsArg?: {
|
|
13
|
+
callbackSettlement: Promise<void>;
|
|
14
|
+
ownedSettlement: Promise<void>;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export declare const consumeExactMultipartStream: (optionsArg: IConsumeExactMultipartStreamOptions) => Promise<IMultipartStreamConsumptionResult>;
|
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { MULTIPART_MAX_CONCURRENCY, MULTIPART_MAX_OBJECT_SIZE, MULTIPART_MAX_PART_COUNT, MULTIPART_MAX_PART_SIZE, MULTIPART_MIN_PART_SIZE, } from './internal.multipart.planner.js';
|
|
2
|
+
const failureMessages = {
|
|
3
|
+
aborted: 'Multipart stream consumption was aborted.',
|
|
4
|
+
'source-read': 'The multipart source stream failed while being read.',
|
|
5
|
+
'source-buffer-limit': 'The multipart source emitted a chunk larger than the buffer limit.',
|
|
6
|
+
'source-empty-chunk-limit': 'The multipart source emitted too many consecutive empty chunks.',
|
|
7
|
+
'source-short': 'The multipart source ended before the declared content length.',
|
|
8
|
+
'source-extra': 'The multipart source exceeded the declared content length.',
|
|
9
|
+
'part-callback': 'A multipart part callback failed.',
|
|
10
|
+
};
|
|
11
|
+
const failureSettlementMaximumTimeoutMs = 30_000;
|
|
12
|
+
const maximumConsecutiveEmptyChunks = 1_024;
|
|
13
|
+
export class MultipartStreamConsumptionError extends Error {
|
|
14
|
+
state;
|
|
15
|
+
/**
|
|
16
|
+
* Non-rejecting settlement of every started part callback.
|
|
17
|
+
*/
|
|
18
|
+
callbackSettlement;
|
|
19
|
+
/**
|
|
20
|
+
* Non-rejecting settlement of callbacks and owned reader cancellation.
|
|
21
|
+
*/
|
|
22
|
+
ownedSettlement;
|
|
23
|
+
constructor(stateArg, settlementsArg) {
|
|
24
|
+
super(failureMessages[stateArg.kind], {
|
|
25
|
+
cause: stateArg.cause,
|
|
26
|
+
});
|
|
27
|
+
this.name = 'MultipartStreamConsumptionError';
|
|
28
|
+
this.state = stateArg;
|
|
29
|
+
this.callbackSettlement =
|
|
30
|
+
settlementsArg?.callbackSettlement ?? Promise.resolve();
|
|
31
|
+
this.ownedSettlement =
|
|
32
|
+
settlementsArg?.ownedSettlement ?? Promise.resolve();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
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
|
+
if (!Number.isSafeInteger(planArg.concurrency) ||
|
|
42
|
+
planArg.concurrency < 1 ||
|
|
43
|
+
planArg.concurrency > MULTIPART_MAX_CONCURRENCY) {
|
|
44
|
+
throw new TypeError('plan.concurrency is invalid.');
|
|
45
|
+
}
|
|
46
|
+
if (planArg.classification === 'zero') {
|
|
47
|
+
if (planArg.objectSize !== 0 ||
|
|
48
|
+
planArg.partSize !== 0 ||
|
|
49
|
+
planArg.partCount !== 0 ||
|
|
50
|
+
planArg.maximumBufferedBytes !== 0) {
|
|
51
|
+
throw new TypeError('The zero-byte multipart plan is inconsistent.');
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (planArg.objectSize === 0 ||
|
|
56
|
+
!Number.isSafeInteger(planArg.partSize) ||
|
|
57
|
+
planArg.partSize < MULTIPART_MIN_PART_SIZE ||
|
|
58
|
+
planArg.partSize > MULTIPART_MAX_PART_SIZE ||
|
|
59
|
+
planArg.partCount !== Math.ceil(planArg.objectSize / planArg.partSize) ||
|
|
60
|
+
planArg.partCount < 1 ||
|
|
61
|
+
planArg.partCount > MULTIPART_MAX_PART_COUNT ||
|
|
62
|
+
planArg.concurrency > planArg.partCount ||
|
|
63
|
+
planArg.maximumBufferedBytes !==
|
|
64
|
+
Math.min(planArg.objectSize, planArg.partSize * planArg.concurrency) +
|
|
65
|
+
Math.min(planArg.objectSize, planArg.partSize)) {
|
|
66
|
+
throw new TypeError('The multipart plan is inconsistent.');
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
export const consumeExactMultipartStream = async (optionsArg) => {
|
|
70
|
+
validatePlan(optionsArg.plan);
|
|
71
|
+
if (!optionsArg.readableStream ||
|
|
72
|
+
typeof optionsArg.readableStream.getReader !== 'function') {
|
|
73
|
+
throw new TypeError('readableStream must be a web ReadableStream.');
|
|
74
|
+
}
|
|
75
|
+
if (typeof optionsArg.onPart !== 'function') {
|
|
76
|
+
throw new TypeError('onPart must be a function.');
|
|
77
|
+
}
|
|
78
|
+
const failureSettlementTimeoutMs = optionsArg.failureSettlementTimeoutMs ??
|
|
79
|
+
failureSettlementMaximumTimeoutMs;
|
|
80
|
+
if (!Number.isSafeInteger(failureSettlementTimeoutMs) ||
|
|
81
|
+
failureSettlementTimeoutMs <= 0 ||
|
|
82
|
+
failureSettlementTimeoutMs > failureSettlementMaximumTimeoutMs) {
|
|
83
|
+
throw new TypeError(`failureSettlementTimeoutMs must be a positive safe integer no greater than ${failureSettlementMaximumTimeoutMs}.`);
|
|
84
|
+
}
|
|
85
|
+
const reader = optionsArg.readableStream.getReader();
|
|
86
|
+
const callbackAbortController = new AbortController();
|
|
87
|
+
const inFlightParts = new Map();
|
|
88
|
+
const completedPartNumbers = new Set();
|
|
89
|
+
let inFlightBytes = 0;
|
|
90
|
+
let currentPartBytes = 0;
|
|
91
|
+
let pendingChunkBytes = 0;
|
|
92
|
+
let peakBufferedBytes = 0;
|
|
93
|
+
let observedBytes = 0;
|
|
94
|
+
let partCallbacksStarted = 0;
|
|
95
|
+
let sourceClosed = false;
|
|
96
|
+
let consecutiveEmptyChunks = 0;
|
|
97
|
+
let resolveAbort;
|
|
98
|
+
const abortOutcome = new Promise((resolveArg) => {
|
|
99
|
+
resolveAbort = resolveArg;
|
|
100
|
+
});
|
|
101
|
+
const handleAbort = () => {
|
|
102
|
+
const cause = optionsArg.signal?.reason ?? new Error('Multipart stream aborted.');
|
|
103
|
+
callbackAbortController.abort(cause);
|
|
104
|
+
resolveAbort({
|
|
105
|
+
type: 'abort',
|
|
106
|
+
cause,
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
optionsArg.signal?.addEventListener('abort', handleAbort, { once: true });
|
|
110
|
+
if (optionsArg.signal?.aborted) {
|
|
111
|
+
handleAbort();
|
|
112
|
+
}
|
|
113
|
+
const processPartOutcome = (outcomeArg) => {
|
|
114
|
+
const inFlightPart = inFlightParts.get(outcomeArg.token);
|
|
115
|
+
if (!inFlightPart) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
inFlightParts.delete(outcomeArg.token);
|
|
119
|
+
inFlightBytes -= inFlightPart.byteLength;
|
|
120
|
+
if (outcomeArg.succeeded) {
|
|
121
|
+
completedPartNumbers.add(outcomeArg.partNumber);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
throw {
|
|
125
|
+
kind: 'part-callback',
|
|
126
|
+
cause: outcomeArg.cause,
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
const observeBufferedBytes = () => {
|
|
130
|
+
const bufferedBytes = inFlightBytes + currentPartBytes + pendingChunkBytes;
|
|
131
|
+
if (bufferedBytes > optionsArg.plan.maximumBufferedBytes) {
|
|
132
|
+
throw {
|
|
133
|
+
kind: 'source-buffer-limit',
|
|
134
|
+
cause: new RangeError('Multipart buffering exceeded its planned bound.'),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
peakBufferedBytes = Math.max(peakBufferedBytes, bufferedBytes);
|
|
138
|
+
};
|
|
139
|
+
const waitForOnePart = async () => {
|
|
140
|
+
const outcome = await Promise.race([
|
|
141
|
+
abortOutcome,
|
|
142
|
+
...[...inFlightParts.values()].map((inFlightPartArg) => inFlightPartArg.outcome),
|
|
143
|
+
]);
|
|
144
|
+
if (!('token' in outcome)) {
|
|
145
|
+
throw {
|
|
146
|
+
kind: 'aborted',
|
|
147
|
+
cause: outcome.cause,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
processPartOutcome(outcome);
|
|
151
|
+
};
|
|
152
|
+
const waitForCapacity = async () => {
|
|
153
|
+
while (inFlightParts.size >= optionsArg.plan.concurrency) {
|
|
154
|
+
await waitForOnePart();
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const readWhileObservingCallbacks = async () => {
|
|
158
|
+
const readOutcome = reader.read().then((resultArg) => ({
|
|
159
|
+
type: 'read',
|
|
160
|
+
result: resultArg,
|
|
161
|
+
}), (causeArg) => ({
|
|
162
|
+
type: 'read-error',
|
|
163
|
+
cause: causeArg,
|
|
164
|
+
}));
|
|
165
|
+
while (true) {
|
|
166
|
+
const outcome = await Promise.race([
|
|
167
|
+
readOutcome,
|
|
168
|
+
abortOutcome,
|
|
169
|
+
...[...inFlightParts.values()].map((inFlightPartArg) => inFlightPartArg.outcome),
|
|
170
|
+
]);
|
|
171
|
+
if ('token' in outcome) {
|
|
172
|
+
processPartOutcome(outcome);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (outcome.type === 'abort') {
|
|
176
|
+
throw {
|
|
177
|
+
kind: 'aborted',
|
|
178
|
+
cause: outcome.cause,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (outcome.type === 'read-error') {
|
|
182
|
+
throw {
|
|
183
|
+
kind: 'source-read',
|
|
184
|
+
cause: outcome.cause,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return outcome.result;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const dispatchPart = (dataArg, partNumberArg) => {
|
|
191
|
+
const token = Symbol(`multipart-part-${partNumberArg}`);
|
|
192
|
+
partCallbacksStarted++;
|
|
193
|
+
currentPartBytes = 0;
|
|
194
|
+
inFlightBytes += dataArg.byteLength;
|
|
195
|
+
observeBufferedBytes();
|
|
196
|
+
const outcome = Promise.resolve()
|
|
197
|
+
.then(() => optionsArg.onPart({
|
|
198
|
+
partNumber: partNumberArg,
|
|
199
|
+
byteOffset: (partNumberArg - 1) * optionsArg.plan.partSize,
|
|
200
|
+
isLastPart: partNumberArg === optionsArg.plan.partCount,
|
|
201
|
+
data: dataArg,
|
|
202
|
+
signal: callbackAbortController.signal,
|
|
203
|
+
}))
|
|
204
|
+
.then(() => ({
|
|
205
|
+
token,
|
|
206
|
+
partNumber: partNumberArg,
|
|
207
|
+
succeeded: true,
|
|
208
|
+
}), (causeArg) => ({
|
|
209
|
+
token,
|
|
210
|
+
partNumber: partNumberArg,
|
|
211
|
+
succeeded: false,
|
|
212
|
+
cause: causeArg,
|
|
213
|
+
}));
|
|
214
|
+
inFlightParts.set(token, {
|
|
215
|
+
byteLength: dataArg.byteLength,
|
|
216
|
+
outcome,
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
const acceptSourceChunk = (chunkArg) => {
|
|
220
|
+
if (chunkArg.byteLength > 0) {
|
|
221
|
+
consecutiveEmptyChunks = 0;
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
consecutiveEmptyChunks++;
|
|
225
|
+
if (consecutiveEmptyChunks > maximumConsecutiveEmptyChunks) {
|
|
226
|
+
throw {
|
|
227
|
+
kind: 'source-empty-chunk-limit',
|
|
228
|
+
cause: new RangeError(`The multipart source emitted more than ${maximumConsecutiveEmptyChunks} consecutive empty chunks.`),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
};
|
|
233
|
+
try {
|
|
234
|
+
let pendingChunk;
|
|
235
|
+
let pendingChunkOffset = 0;
|
|
236
|
+
for (let partNumber = 1; partNumber <= optionsArg.plan.partCount; partNumber++) {
|
|
237
|
+
await waitForCapacity();
|
|
238
|
+
const partByteLength = Math.min(optionsArg.plan.partSize, optionsArg.plan.objectSize -
|
|
239
|
+
(partNumber - 1) * optionsArg.plan.partSize);
|
|
240
|
+
if (inFlightBytes + partByteLength >
|
|
241
|
+
optionsArg.plan.maximumBufferedBytes) {
|
|
242
|
+
throw new Error('The multipart plan cannot honor its buffering bound.');
|
|
243
|
+
}
|
|
244
|
+
const partData = new Uint8Array(partByteLength);
|
|
245
|
+
currentPartBytes = partByteLength;
|
|
246
|
+
observeBufferedBytes();
|
|
247
|
+
let partOffset = 0;
|
|
248
|
+
while (partOffset < partByteLength) {
|
|
249
|
+
if (pendingChunk &&
|
|
250
|
+
pendingChunkOffset < pendingChunk.byteLength) {
|
|
251
|
+
const copyByteLength = Math.min(partByteLength - partOffset, pendingChunk.byteLength - pendingChunkOffset);
|
|
252
|
+
partData.set(pendingChunk.subarray(pendingChunkOffset, pendingChunkOffset + copyByteLength), partOffset);
|
|
253
|
+
pendingChunkOffset += copyByteLength;
|
|
254
|
+
partOffset += copyByteLength;
|
|
255
|
+
if (pendingChunkOffset === pendingChunk.byteLength) {
|
|
256
|
+
pendingChunk = undefined;
|
|
257
|
+
pendingChunkOffset = 0;
|
|
258
|
+
pendingChunkBytes = 0;
|
|
259
|
+
}
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const readResult = await readWhileObservingCallbacks();
|
|
263
|
+
if (readResult.done) {
|
|
264
|
+
sourceClosed = true;
|
|
265
|
+
throw {
|
|
266
|
+
kind: 'source-short',
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
if (!(readResult.value instanceof Uint8Array)) {
|
|
270
|
+
throw {
|
|
271
|
+
kind: 'source-read',
|
|
272
|
+
cause: new TypeError('The multipart source emitted a non-Uint8Array chunk.'),
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
if (!acceptSourceChunk(readResult.value)) {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
observedBytes += readResult.value.byteLength;
|
|
279
|
+
if (observedBytes > optionsArg.plan.objectSize) {
|
|
280
|
+
throw {
|
|
281
|
+
kind: 'source-extra',
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
if (readResult.value.byteLength > optionsArg.plan.partSize) {
|
|
285
|
+
throw {
|
|
286
|
+
kind: 'source-buffer-limit',
|
|
287
|
+
cause: new RangeError(`Source chunks must not exceed ${optionsArg.plan.partSize} bytes.`),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
pendingChunk = readResult.value;
|
|
291
|
+
pendingChunkBytes = readResult.value.byteLength;
|
|
292
|
+
observeBufferedBytes();
|
|
293
|
+
}
|
|
294
|
+
dispatchPart(partData, partNumber);
|
|
295
|
+
}
|
|
296
|
+
while (!sourceClosed) {
|
|
297
|
+
const readResult = await readWhileObservingCallbacks();
|
|
298
|
+
if (readResult.done) {
|
|
299
|
+
sourceClosed = true;
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
if (!(readResult.value instanceof Uint8Array)) {
|
|
303
|
+
throw {
|
|
304
|
+
kind: 'source-read',
|
|
305
|
+
cause: new TypeError('The multipart source emitted a non-Uint8Array chunk.'),
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
if (!acceptSourceChunk(readResult.value)) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
observedBytes += readResult.value.byteLength;
|
|
312
|
+
throw {
|
|
313
|
+
kind: 'source-extra',
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
while (inFlightParts.size > 0) {
|
|
317
|
+
await waitForOnePart();
|
|
318
|
+
}
|
|
319
|
+
if (optionsArg.signal?.aborted) {
|
|
320
|
+
throw {
|
|
321
|
+
kind: 'aborted',
|
|
322
|
+
cause: optionsArg.signal.reason,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
completionAuthorized: true,
|
|
327
|
+
bytesConsumed: observedBytes,
|
|
328
|
+
partsConsumed: completedPartNumbers.size,
|
|
329
|
+
peakBufferedBytes,
|
|
330
|
+
maximumBufferedBytes: optionsArg.plan.maximumBufferedBytes,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
const failure = typeof error === 'object' &&
|
|
335
|
+
error !== null &&
|
|
336
|
+
'kind' in error &&
|
|
337
|
+
typeof error.kind === 'string'
|
|
338
|
+
? error
|
|
339
|
+
: {
|
|
340
|
+
kind: 'source-read',
|
|
341
|
+
cause: error,
|
|
342
|
+
};
|
|
343
|
+
callbackAbortController.abort(failure.cause ?? new Error(failureMessages[failure.kind]));
|
|
344
|
+
const readerCleanupPromise = sourceClosed
|
|
345
|
+
? Promise.resolve({
|
|
346
|
+
status: 'closed',
|
|
347
|
+
})
|
|
348
|
+
: Promise.resolve()
|
|
349
|
+
.then(() => reader.cancel(failure.cause))
|
|
350
|
+
.then(() => ({
|
|
351
|
+
status: 'cancelled',
|
|
352
|
+
}), (causeArg) => ({
|
|
353
|
+
status: 'cancel-failed',
|
|
354
|
+
cause: causeArg,
|
|
355
|
+
}));
|
|
356
|
+
let callbacksSettled = false;
|
|
357
|
+
const callbackSettlement = Promise.all([...inFlightParts.values()].map((inFlightPartArg) => inFlightPartArg.outcome))
|
|
358
|
+
.then((remainingOutcomesArg) => {
|
|
359
|
+
for (const outcome of remainingOutcomesArg) {
|
|
360
|
+
if (outcome.succeeded) {
|
|
361
|
+
completedPartNumbers.add(outcome.partNumber);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
inFlightParts.clear();
|
|
365
|
+
inFlightBytes = 0;
|
|
366
|
+
})
|
|
367
|
+
.then(() => undefined, () => undefined);
|
|
368
|
+
const observedCallbackSettlement = callbackSettlement.then(() => {
|
|
369
|
+
callbacksSettled = true;
|
|
370
|
+
});
|
|
371
|
+
let readerCleanup;
|
|
372
|
+
let readerCleanupSettled = false;
|
|
373
|
+
const observedReaderCleanup = readerCleanupPromise.then((readerCleanupArg) => {
|
|
374
|
+
readerCleanup = readerCleanupArg;
|
|
375
|
+
readerCleanupSettled = true;
|
|
376
|
+
}, () => {
|
|
377
|
+
readerCleanup = {
|
|
378
|
+
status: 'cancel-failed',
|
|
379
|
+
cause: new Error('Reader cancellation rejected unexpectedly.'),
|
|
380
|
+
};
|
|
381
|
+
readerCleanupSettled = true;
|
|
382
|
+
});
|
|
383
|
+
const ownedSettlement = Promise.allSettled([
|
|
384
|
+
observedCallbackSettlement,
|
|
385
|
+
observedReaderCleanup,
|
|
386
|
+
]).then(() => undefined);
|
|
387
|
+
const settlementDeadlineToken = Symbol('multipart-failure-settlement-deadline');
|
|
388
|
+
let resolveSettlementDeadline;
|
|
389
|
+
const settlementDeadlineOutcome = new Promise((resolveArg) => {
|
|
390
|
+
resolveSettlementDeadline = resolveArg;
|
|
391
|
+
});
|
|
392
|
+
const settlementDeadline = setTimeout(() => {
|
|
393
|
+
resolveSettlementDeadline(settlementDeadlineToken);
|
|
394
|
+
}, failureSettlementTimeoutMs);
|
|
395
|
+
await Promise.race([ownedSettlement, settlementDeadlineOutcome]);
|
|
396
|
+
clearTimeout(settlementDeadline);
|
|
397
|
+
const retry = partCallbacksStarted === 0
|
|
398
|
+
? {
|
|
399
|
+
disposition: 'safe-to-retry',
|
|
400
|
+
requiresMultipartAbort: false,
|
|
401
|
+
}
|
|
402
|
+
: {
|
|
403
|
+
disposition: 'abort-multipart-first',
|
|
404
|
+
requiresMultipartAbort: true,
|
|
405
|
+
};
|
|
406
|
+
throw new MultipartStreamConsumptionError({
|
|
407
|
+
completionAuthorized: false,
|
|
408
|
+
kind: failure.kind,
|
|
409
|
+
cause: failure.cause,
|
|
410
|
+
expectedBytes: optionsArg.plan.objectSize,
|
|
411
|
+
observedBytes,
|
|
412
|
+
partCallbacksStarted,
|
|
413
|
+
completedPartNumbers: [...completedPartNumbers].sort((leftArg, rightArg) => {
|
|
414
|
+
return leftArg - rightArg;
|
|
415
|
+
}),
|
|
416
|
+
cleanup: {
|
|
417
|
+
callbacks: callbacksSettled ? 'settled' : 'detached',
|
|
418
|
+
reader: readerCleanupSettled && readerCleanup
|
|
419
|
+
? readerCleanup
|
|
420
|
+
: {
|
|
421
|
+
status: 'cancel-detached',
|
|
422
|
+
},
|
|
423
|
+
},
|
|
424
|
+
retry,
|
|
425
|
+
}, {
|
|
426
|
+
callbackSettlement,
|
|
427
|
+
ownedSettlement,
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
finally {
|
|
431
|
+
optionsArg.signal?.removeEventListener('abort', handleAbort);
|
|
432
|
+
try {
|
|
433
|
+
reader.releaseLock();
|
|
434
|
+
}
|
|
435
|
+
catch {
|
|
436
|
+
// Detached reader cancellation retains ownership until it settles.
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
};
|
|
440
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwubXVsdGlwYXJ0LnN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL29iamVjdHN0b3JhZ2UvaW50ZXJuYWwubXVsdGlwYXJ0LnN0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsdUJBQXVCLEVBQ3ZCLHVCQUF1QixHQUN4QixNQUFNLGlDQUFpQyxDQUFDO0FBZ0R6QyxNQUFNLGVBQWUsR0FBZ0Q7SUFDbkUsT0FBTyxFQUFFLDJDQUEyQztJQUNwRCxhQUFhLEVBQUUsc0RBQXNEO0lBQ3JFLHFCQUFxQixFQUFFLG9FQUFvRTtJQUMzRiwwQkFBMEIsRUFDeEIsaUVBQWlFO0lBQ25FLGNBQWMsRUFBRSxnRUFBZ0U7SUFDaEYsY0FBYyxFQUFFLDREQUE0RDtJQUM1RSxlQUFlLEVBQUUsbUNBQW1DO0NBQ3JELENBQUM7QUFDRixNQUFNLGlDQUFpQyxHQUFHLE1BQU0sQ0FBQztBQUNqRCxNQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUU1QyxNQUFNLE9BQU8sK0JBQWdDLFNBQVEsS0FBSztJQUN4QyxLQUFLLENBQStCO0lBQ3BEOztPQUVHO0lBQ2Esa0JBQWtCLENBQWdCO0lBQ2xEOztPQUVHO0lBQ2EsZUFBZSxDQUFnQjtJQUUvQyxZQUNFLFFBQXNDLEVBQ3RDLGNBR0M7UUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCO1lBQ3JCLGNBQWMsRUFBRSxrQkFBa0IsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLGVBQWU7WUFDbEIsY0FBYyxFQUFFLGVBQWUsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekQsQ0FBQztDQUNGO0FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUE2QixFQUFRLEVBQUU7SUFDM0QsSUFDRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN6QyxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUM7UUFDdEIsT0FBTyxDQUFDLFVBQVUsR0FBRyx5QkFBeUIsRUFDOUMsQ0FBQztRQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsSUFDRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUMxQyxPQUFPLENBQUMsV0FBVyxHQUFHLENBQUM7UUFDdkIsT0FBTyxDQUFDLFdBQVcsR0FBRyx5QkFBeUIsRUFDL0MsQ0FBQztRQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsY0FBYyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3RDLElBQ0UsT0FBTyxDQUFDLFVBQVUsS0FBSyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxRQUFRLEtBQUssQ0FBQztZQUN0QixPQUFPLENBQUMsU0FBUyxLQUFLLENBQUM7WUFDdkIsT0FBTyxDQUFDLG9CQUFvQixLQUFLLENBQUMsRUFDbEMsQ0FBQztZQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFFRCxJQUNFLE9BQU8sQ0FBQyxVQUFVLEtBQUssQ0FBQztRQUN4QixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUN2QyxPQUFPLENBQUMsUUFBUSxHQUFHLHVCQUF1QjtRQUMxQyxPQUFPLENBQUMsUUFBUSxHQUFHLHVCQUF1QjtRQUMxQyxPQUFPLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ3RFLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQztRQUNyQixPQUFPLENBQUMsU0FBUyxHQUFHLHdCQUF3QjtRQUM1QyxPQUFPLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTO1FBQ3ZDLE9BQU8sQ0FBQyxvQkFBb0I7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFDbEQsQ0FBQztRQUNELE1BQU0sSUFBSSxTQUFTLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxFQUM5QyxVQUErQyxFQUNILEVBQUU7SUFDOUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUNFLENBQUMsVUFBVSxDQUFDLGNBQWM7UUFDMUIsT0FBTyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQ3pELENBQUM7UUFDRCxNQUFNLElBQUksU0FBUyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELElBQUksT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsTUFBTSwwQkFBMEIsR0FDOUIsVUFBVSxDQUFDLDBCQUEwQjtRQUNyQyxpQ0FBaUMsQ0FBQztJQUNwQyxJQUNFLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztRQUNqRCwwQkFBMEIsSUFBSSxDQUFDO1FBQy9CLDBCQUEwQixHQUFHLGlDQUFpQyxFQUM5RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLFNBQVMsQ0FDakIsOEVBQThFLGlDQUFpQyxHQUFHLENBQ25ILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyRCxNQUFNLHVCQUF1QixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDdEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7SUFDdkQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9DLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztJQUN0QixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUN6QixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDdEIsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBRS9CLElBQUksWUFBa0QsQ0FBQztJQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sQ0FBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUM3RCxZQUFZLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBUyxFQUFFO1FBQzdCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDbEYsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLFlBQVksQ0FBQztZQUNYLElBQUksRUFBRSxPQUFPO1lBQ2IsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUNGLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMvQixXQUFXLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFVBQXdCLEVBQVEsRUFBRTtRQUM1RCxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFDRCxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxhQUFhLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUN6QyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hELE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTTtZQUNKLElBQUksRUFBRSxlQUFlO1lBQ3JCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztTQUNFLENBQUM7SUFDOUIsQ0FBQyxDQUFDO0lBRUYsTUFBTSxvQkFBb0IsR0FBRyxHQUFTLEVBQUU7UUFDdEMsTUFBTSxhQUFhLEdBQUcsYUFBYSxHQUFHLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDO1FBQzNFLElBQUksYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUN6RCxNQUFNO2dCQUNKLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxpREFBaUQsQ0FBQzthQUMvQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2pFLENBQUMsQ0FBQztJQUVGLE1BQU0sY0FBYyxHQUFHLEtBQUssSUFBbUIsRUFBRTtRQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQ2hDO1lBQ0UsWUFBWTtZQUNaLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDaEMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQzdDO1NBQ0YsQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTTtnQkFDSixJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7YUFDSyxDQUFDO1FBQzlCLENBQUM7UUFDRCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxLQUFLLElBQW1CLEVBQUU7UUFDaEQsT0FBTyxhQUFhLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekQsTUFBTSxjQUFjLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLElBRXZDLEVBQUU7UUFDRixNQUFNLFdBQVcsR0FBMEIsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FDM0QsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDZCxJQUFJLEVBQUUsTUFBTTtZQUNaLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsRUFDRixDQUFDLFFBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEIsSUFBSSxFQUFFLFlBQVk7WUFDbEIsS0FBSyxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUNILENBQUM7UUFFRixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxXQUFXO2dCQUNYLFlBQVk7Z0JBQ1osR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUNoQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FDN0M7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixNQUFNO29CQUNKLElBQUksRUFBRSxTQUFTO29CQUNmLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztpQkFDSyxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU07b0JBQ0osSUFBSSxFQUFFLGFBQWE7b0JBQ25CLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztpQkFDSyxDQUFDO1lBQzlCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBbUIsRUFBRSxhQUFxQixFQUFRLEVBQUU7UUFDeEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELG9CQUFvQixFQUFFLENBQUM7UUFDdkIsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLGFBQWEsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3BDLG9CQUFvQixFQUFFLENBQUM7UUFDdkIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRTthQUM5QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQ1QsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNoQixVQUFVLEVBQUUsYUFBYTtZQUN6QixVQUFVLEVBQUUsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQzFELFVBQVUsRUFBRSxhQUFhLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQ3ZELElBQUksRUFBRSxPQUFPO1lBQ2IsTUFBTSxFQUFFLHVCQUF1QixDQUFDLE1BQU07U0FDdkMsQ0FBQyxDQUNIO2FBQ0EsSUFBSSxDQUNILEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDTCxLQUFLO1lBQ0wsVUFBVSxFQUFFLGFBQWE7WUFDekIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxFQUNGLENBQUMsUUFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QixLQUFLO1lBQ0wsVUFBVSxFQUFFLGFBQWE7WUFDekIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsS0FBSyxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUNILENBQUM7UUFDSixhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRTtZQUN2QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsT0FBTztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFvQixFQUFXLEVBQUU7UUFDMUQsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLHNCQUFzQixHQUFHLENBQUMsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pCLElBQUksc0JBQXNCLEdBQUcsNkJBQTZCLEVBQUUsQ0FBQztZQUMzRCxNQUFNO2dCQUNKLElBQUksRUFBRSwwQkFBMEI7Z0JBQ2hDLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FDbkIsMENBQTBDLDZCQUE2Qiw0QkFBNEIsQ0FDcEc7YUFDd0IsQ0FBQztRQUM5QixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixJQUFJLENBQUM7UUFDSCxJQUFJLFlBQW9DLENBQUM7UUFDekMsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFFM0IsS0FDRSxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQ2xCLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFDdkMsVUFBVSxFQUFFLEVBQ1osQ0FBQztZQUNELE1BQU0sZUFBZSxFQUFFLENBQUM7WUFDeEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDN0IsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQ3hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDeEIsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQzlDLENBQUM7WUFDRixJQUNFLGFBQWEsR0FBRyxjQUFjO2dCQUM5QixVQUFVLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUNwQyxDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEQsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDO1lBQ2xDLG9CQUFvQixFQUFFLENBQUM7WUFDdkIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBRW5CLE9BQU8sVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUNuQyxJQUNFLFlBQVk7b0JBQ1osa0JBQWtCLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFDNUMsQ0FBQztvQkFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUM3QixjQUFjLEdBQUcsVUFBVSxFQUMzQixZQUFZLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUM3QyxDQUFDO29CQUNGLFFBQVEsQ0FBQyxHQUFHLENBQ1YsWUFBWSxDQUFDLFFBQVEsQ0FDbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixHQUFHLGNBQWMsQ0FDcEMsRUFDRCxVQUFVLENBQ1gsQ0FBQztvQkFDRixrQkFBa0IsSUFBSSxjQUFjLENBQUM7b0JBQ3JDLFVBQVUsSUFBSSxjQUFjLENBQUM7b0JBQzdCLElBQUksa0JBQWtCLEtBQUssWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUNuRCxZQUFZLEdBQUcsU0FBUyxDQUFDO3dCQUN6QixrQkFBa0IsR0FBRyxDQUFDLENBQUM7d0JBQ3ZCLGlCQUFpQixHQUFHLENBQUMsQ0FBQztvQkFDeEIsQ0FBQztvQkFDRCxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSwyQkFBMkIsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDcEIsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDcEIsTUFBTTt3QkFDSixJQUFJLEVBQUUsY0FBYztxQkFDSyxDQUFDO2dCQUM5QixDQUFDO2dCQUNELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDOUMsTUFBTTt3QkFDSixJQUFJLEVBQUUsYUFBYTt3QkFDbkIsS0FBSyxFQUFFLElBQUksU0FBUyxDQUFDLHNEQUFzRCxDQUFDO3FCQUNuRCxDQUFDO2dCQUM5QixDQUFDO2dCQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDekMsU0FBUztnQkFDWCxDQUFDO2dCQUNELGFBQWEsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztnQkFDN0MsSUFBSSxhQUFhLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDL0MsTUFBTTt3QkFDSixJQUFJLEVBQUUsY0FBYztxQkFDSyxDQUFDO2dCQUM5QixDQUFDO2dCQUNELElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDM0QsTUFBTTt3QkFDSixJQUFJLEVBQUUscUJBQXFCO3dCQUMzQixLQUFLLEVBQUUsSUFBSSxVQUFVLENBQ25CLGlDQUFpQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsU0FBUyxDQUNuRTtxQkFDd0IsQ0FBQztnQkFDOUIsQ0FBQztnQkFDRCxZQUFZLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDaEMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQ2hELG9CQUFvQixFQUFFLENBQUM7WUFDekIsQ0FBQztZQUVELFlBQVksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVELE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNyQixNQUFNLFVBQVUsR0FBRyxNQUFNLDJCQUEyQixFQUFFLENBQUM7WUFDdkQsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLE1BQU07WUFDUixDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxNQUFNO29CQUNKLElBQUksRUFBRSxhQUFhO29CQUNuQixLQUFLLEVBQUUsSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUM7aUJBQ25ELENBQUM7WUFDOUIsQ0FBQztZQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsU0FBUztZQUNYLENBQUM7WUFDRCxhQUFhLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDN0MsTUFBTTtnQkFDSixJQUFJLEVBQUUsY0FBYzthQUNLLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLGNBQWMsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDL0IsTUFBTTtnQkFDSixJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2FBQ04sQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTztZQUNMLG9CQUFvQixFQUFFLElBQUk7WUFDMUIsYUFBYSxFQUFFLGFBQWE7WUFDNUIsYUFBYSxFQUFFLG9CQUFvQixDQUFDLElBQUk7WUFDeEMsaUJBQWlCO1lBQ2pCLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CO1NBQzNELENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDekIsS0FBSyxLQUFLLElBQUk7WUFDZCxNQUFNLElBQUksS0FBSztZQUNmLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQzVCLENBQUMsQ0FBRSxLQUF5QjtZQUM1QixDQUFDLENBQUU7Z0JBQ0MsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLEtBQUssRUFBRSxLQUFLO2FBQ2MsQ0FBQztRQUNuQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RixNQUFNLG9CQUFvQixHQUEwQyxZQUFZO1lBQzlFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCLENBQUM7WUFDSixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtpQkFDZCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3hDLElBQUksQ0FDSCxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNMLE1BQU0sRUFBRSxXQUFXO2FBQ3BCLENBQUMsRUFDRixDQUFDLFFBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sRUFBRSxlQUFlO2dCQUN2QixLQUFLLEVBQUUsUUFBUTthQUNoQixDQUFDLENBQ0gsQ0FBQztRQUVSLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzdCLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FDcEMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDN0IsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQzdDLENBQ0Y7YUFDRSxJQUFJLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBQzdCLEtBQUssTUFBTSxPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3RCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQy9DLENBQUM7WUFDSCxDQUFDO1lBQ0QsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUNILEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFDZixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQ2hCLENBQUM7UUFDSixNQUFNLDBCQUEwQixHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDOUQsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUF1RCxDQUFDO1FBQzVELElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLE1BQU0scUJBQXFCLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUNyRCxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDbkIsYUFBYSxHQUFHLGdCQUFnQixDQUFDO1lBQ2pDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLEVBQ0QsR0FBRyxFQUFFO1lBQ0gsYUFBYSxHQUFHO2dCQUNkLE1BQU0sRUFBRSxlQUFlO2dCQUN2QixLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUM7YUFDL0QsQ0FBQztZQUNGLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQ0YsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDekMsMEJBQTBCO1lBQzFCLHFCQUFxQjtTQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUNwQyx1Q0FBdUMsQ0FDeEMsQ0FBQztRQUNGLElBQUkseUJBRUssQ0FBQztRQUNWLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxPQUFPLENBRTNDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDZix5QkFBeUIsR0FBRyxVQUFVLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDekMseUJBQXlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRCxDQUFDLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUMvQixNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sS0FBSyxHQUNULG9CQUFvQixLQUFLLENBQUM7WUFDeEIsQ0FBQyxDQUFFO2dCQUNDLFdBQVcsRUFBRSxlQUFlO2dCQUM1QixzQkFBc0IsRUFBRSxLQUFLO2FBQ3BCO1lBQ2IsQ0FBQyxDQUFFO2dCQUNDLFdBQVcsRUFBRSx1QkFBdUI7Z0JBQ3BDLHNCQUFzQixFQUFFLElBQUk7YUFDbkIsQ0FBQztRQUVsQixNQUFNLElBQUksK0JBQStCLENBQ3ZDO1lBQ0Usb0JBQW9CLEVBQUUsS0FBSztZQUMzQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLGFBQWEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDekMsYUFBYTtZQUNiLG9CQUFvQjtZQUNwQixvQkFBb0IsRUFBRSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQ2xELENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUNwQixPQUFPLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDNUIsQ0FBQyxDQUNGO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVO2dCQUNwRCxNQUFNLEVBQ0osb0JBQW9CLElBQUksYUFBYTtvQkFDbkMsQ0FBQyxDQUFDLGFBQWE7b0JBQ2YsQ0FBQyxDQUFDO3dCQUNFLE1BQU0sRUFBRSxpQkFBaUI7cUJBQzFCO2FBQ1I7WUFDRCxLQUFLO1NBQ04sRUFDRDtZQUNFLGtCQUFrQjtZQUNsQixlQUFlO1NBQ2hCLENBQ0YsQ0FBQztJQUNKLENBQUM7WUFBUyxDQUFDO1FBQ1QsVUFBVSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxtRUFBbUU7UUFDckUsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface IMultipartPlanningOptions {
|
|
2
|
+
objectSize: number;
|
|
3
|
+
requestedPartSize?: number;
|
|
4
|
+
requestedConcurrency?: number;
|
|
5
|
+
}
|
|
6
|
+
interface IMultipartUploadPlanBase {
|
|
7
|
+
objectSize: number;
|
|
8
|
+
concurrency: number;
|
|
9
|
+
maximumBufferedBytes: number;
|
|
10
|
+
}
|
|
11
|
+
export interface IMultipartZeroUploadPlan extends IMultipartUploadPlanBase {
|
|
12
|
+
classification: 'zero';
|
|
13
|
+
objectSize: 0;
|
|
14
|
+
partSize: 0;
|
|
15
|
+
partCount: 0;
|
|
16
|
+
maximumBufferedBytes: 0;
|
|
17
|
+
}
|
|
18
|
+
export interface IMultipartDataUploadPlan extends IMultipartUploadPlanBase {
|
|
19
|
+
classification: 'multipart';
|
|
20
|
+
partSize: number;
|
|
21
|
+
partCount: number;
|
|
22
|
+
}
|
|
23
|
+
export type TMultipartUploadPlan = IMultipartZeroUploadPlan | IMultipartDataUploadPlan;
|
|
24
|
+
export interface IMultipartStreamPart {
|
|
25
|
+
partNumber: number;
|
|
26
|
+
byteOffset: number;
|
|
27
|
+
isLastPart: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* An exact, exclusively owned copy. The consumer never mutates or reuses it.
|
|
30
|
+
*/
|
|
31
|
+
data: Uint8Array;
|
|
32
|
+
signal: AbortSignal;
|
|
33
|
+
}
|
|
34
|
+
export interface IConsumeExactMultipartStreamOptions {
|
|
35
|
+
readableStream: ReadableStream<Uint8Array>;
|
|
36
|
+
plan: TMultipartUploadPlan;
|
|
37
|
+
onPart: (part: IMultipartStreamPart) => Promise<void>;
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
/** Internal failure-teardown bound (default and maximum: 30000ms). */
|
|
40
|
+
failureSettlementTimeoutMs?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface IMultipartStreamConsumptionResult {
|
|
43
|
+
completionAuthorized: true;
|
|
44
|
+
bytesConsumed: number;
|
|
45
|
+
partsConsumed: number;
|
|
46
|
+
peakBufferedBytes: number;
|
|
47
|
+
maximumBufferedBytes: number;
|
|
48
|
+
}
|
|
49
|
+
export type TMultipartStreamFailureKind = 'aborted' | 'source-read' | 'source-buffer-limit' | 'source-empty-chunk-limit' | 'source-short' | 'source-extra' | 'part-callback';
|
|
50
|
+
export type TMultipartOwnedReaderCleanup = {
|
|
51
|
+
status: 'closed';
|
|
52
|
+
} | {
|
|
53
|
+
status: 'cancelled';
|
|
54
|
+
} | {
|
|
55
|
+
status: 'cancel-failed';
|
|
56
|
+
cause: unknown;
|
|
57
|
+
} | {
|
|
58
|
+
status: 'cancel-detached';
|
|
59
|
+
};
|
|
60
|
+
export interface IMultipartOwnedCleanupState {
|
|
61
|
+
callbacks: 'settled' | 'detached';
|
|
62
|
+
reader: TMultipartOwnedReaderCleanup;
|
|
63
|
+
}
|
|
64
|
+
export type TMultipartRetryState = {
|
|
65
|
+
disposition: 'safe-to-retry';
|
|
66
|
+
requiresMultipartAbort: false;
|
|
67
|
+
} | {
|
|
68
|
+
disposition: 'abort-multipart-first';
|
|
69
|
+
requiresMultipartAbort: true;
|
|
70
|
+
};
|
|
71
|
+
export interface IMultipartStreamFailureState {
|
|
72
|
+
completionAuthorized: false;
|
|
73
|
+
kind: TMultipartStreamFailureKind;
|
|
74
|
+
cause?: unknown;
|
|
75
|
+
expectedBytes: number;
|
|
76
|
+
observedBytes: number;
|
|
77
|
+
partCallbacksStarted: number;
|
|
78
|
+
completedPartNumbers: number[];
|
|
79
|
+
cleanup: IMultipartOwnedCleanupState;
|
|
80
|
+
retry: TMultipartRetryState;
|
|
81
|
+
}
|
|
82
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as crypto from 'node:crypto';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as stream from 'node:stream';
|
|
4
|
+
export { crypto, path, stream };
|
|
5
|
+
import * as smartmime from '@push.rocks/smartmime';
|
|
6
|
+
import * as smartpath from '@push.rocks/smartpath';
|
|
7
|
+
import * as smartpromise from '@push.rocks/smartpromise';
|
|
8
|
+
import * as smartrx from '@push.rocks/smartrx';
|
|
9
|
+
import * as smartstream from '@push.rocks/smartstream';
|
|
10
|
+
import * as smartstring from '@push.rocks/smartstring';
|
|
11
|
+
import * as smartunique from '@push.rocks/smartunique';
|
|
12
|
+
export { smartmime, smartpath, smartpromise, smartrx, smartstream, smartstring, smartunique };
|
|
13
|
+
import * as tsclass from '@tsclass/tsclass';
|
|
14
|
+
export { tsclass, };
|
|
15
|
+
import * as s3 from '@aws-sdk/client-s3';
|
|
16
|
+
import { Minimatch } from 'minimatch';
|
|
17
|
+
export { s3, Minimatch, };
|