@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,580 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type {
|
|
3
|
+
IExactPathPurgeCapability,
|
|
4
|
+
IExactUploadCapability,
|
|
5
|
+
TExactPathPurgeVersioningMode,
|
|
6
|
+
} from './interfaces.js';
|
|
7
|
+
|
|
8
|
+
interface ISmartBucketCapabilityRef {
|
|
9
|
+
readonly storageClient: plugins.s3.S3Client;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface IBucketCapabilityRef {
|
|
13
|
+
name: string;
|
|
14
|
+
smartbucketRef: ISmartBucketCapabilityRef;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type TCapabilityLifecycleState = 'open' | 'closing' | 'closed';
|
|
18
|
+
|
|
19
|
+
interface IOwnedIndependentAbort {
|
|
20
|
+
abortController: AbortController;
|
|
21
|
+
dispose: () => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface IActiveCapabilityOperation {
|
|
25
|
+
abortController: AbortController;
|
|
26
|
+
ownedIndependentAborts: Set<IOwnedIndependentAbort>;
|
|
27
|
+
settlement: Promise<void>;
|
|
28
|
+
settle: () => void;
|
|
29
|
+
releaseCallerAbortListener: () => void;
|
|
30
|
+
forceFinish: (causeArg: unknown) => void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface ICapabilityLifecycleRecord {
|
|
34
|
+
state: TCapabilityLifecycleState;
|
|
35
|
+
generation: number;
|
|
36
|
+
storageClient: plugins.s3.S3Client;
|
|
37
|
+
activeOperations: Set<IActiveCapabilityOperation>;
|
|
38
|
+
clientMutationReserved: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface IExactCapabilityBinding {
|
|
42
|
+
bucketRef: IBucketCapabilityRef;
|
|
43
|
+
bucketName: string;
|
|
44
|
+
smartbucketRef: ISmartBucketCapabilityRef;
|
|
45
|
+
storageClient: plugins.s3.S3Client;
|
|
46
|
+
lifecycleGeneration: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface IExactPathPurgeCapabilityBinding extends IExactCapabilityBinding {
|
|
50
|
+
versioningMode: TExactPathPurgeVersioningMode;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface IExactUploadOperation {
|
|
54
|
+
readonly bucketName: string;
|
|
55
|
+
readonly client: plugins.s3.S3Client;
|
|
56
|
+
readonly signal: AbortSignal;
|
|
57
|
+
registerOwnedIndependentAbort(
|
|
58
|
+
abortControllerArg: AbortController,
|
|
59
|
+
disposeArg: () => void,
|
|
60
|
+
): () => void;
|
|
61
|
+
assertLifecycleCurrent(): void;
|
|
62
|
+
assertCurrent(): void;
|
|
63
|
+
finish(): void;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface IBasicBucketOperation extends IExactUploadOperation {
|
|
67
|
+
runProvider<T>(
|
|
68
|
+
sendArg: () => Promise<T>,
|
|
69
|
+
optionsArg?: {
|
|
70
|
+
disposeLateResult?: (resultArg: T) => void | Promise<void>;
|
|
71
|
+
},
|
|
72
|
+
): Promise<T>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface IExactPathPurgeOperation extends IExactUploadOperation {
|
|
76
|
+
readonly versioningMode: TExactPathPurgeVersioningMode;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const lifecycleRecords = new WeakMap<
|
|
80
|
+
ISmartBucketCapabilityRef,
|
|
81
|
+
ICapabilityLifecycleRecord
|
|
82
|
+
>();
|
|
83
|
+
const capabilityBindings = new WeakMap<
|
|
84
|
+
IExactUploadCapability,
|
|
85
|
+
IExactCapabilityBinding
|
|
86
|
+
>();
|
|
87
|
+
const purgeCapabilityBindings = new WeakMap<
|
|
88
|
+
IExactPathPurgeCapability,
|
|
89
|
+
IExactPathPurgeCapabilityBinding
|
|
90
|
+
>();
|
|
91
|
+
const operationCloseSettlementTimeoutMs = 35_000;
|
|
92
|
+
const basicOperationLateDisposalTimeoutMs = 5_000;
|
|
93
|
+
|
|
94
|
+
const abortAndDisposeIndependentWork = (
|
|
95
|
+
activeOperationArg: IActiveCapabilityOperation,
|
|
96
|
+
causeArg: unknown,
|
|
97
|
+
): void => {
|
|
98
|
+
for (const ownedAbort of activeOperationArg.ownedIndependentAborts) {
|
|
99
|
+
ownedAbort.abortController.abort(causeArg);
|
|
100
|
+
ownedAbort.dispose();
|
|
101
|
+
}
|
|
102
|
+
activeOperationArg.ownedIndependentAborts.clear();
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const getLifecycleRecord = (
|
|
106
|
+
smartbucketRefArg: ISmartBucketCapabilityRef,
|
|
107
|
+
): ICapabilityLifecycleRecord => {
|
|
108
|
+
const lifecycleRecord = lifecycleRecords.get(smartbucketRefArg);
|
|
109
|
+
if (!lifecycleRecord) {
|
|
110
|
+
throw new Error(
|
|
111
|
+
'The Bucket is not attached to a lifecycle-managed SmartBucket.',
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
return lifecycleRecord;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const assertOpenLifecycle = (
|
|
118
|
+
lifecycleRecordArg: ICapabilityLifecycleRecord,
|
|
119
|
+
): void => {
|
|
120
|
+
if (lifecycleRecordArg.state !== 'open') {
|
|
121
|
+
throw new Error(
|
|
122
|
+
`The SmartBucket operation lifecycle is ${lifecycleRecordArg.state}.`,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
if (lifecycleRecordArg.clientMutationReserved) {
|
|
126
|
+
throw new Error('The SmartBucket storageClient is changing.');
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export const registerOperationLifecycle = (
|
|
131
|
+
smartbucketRefArg: ISmartBucketCapabilityRef,
|
|
132
|
+
storageClientArg: plugins.s3.S3Client,
|
|
133
|
+
): void => {
|
|
134
|
+
if (lifecycleRecords.has(smartbucketRefArg)) {
|
|
135
|
+
throw new Error(
|
|
136
|
+
'The SmartBucket operation lifecycle is already registered.',
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
lifecycleRecords.set(smartbucketRefArg, {
|
|
140
|
+
state: 'open',
|
|
141
|
+
generation: 0,
|
|
142
|
+
storageClient: storageClientArg,
|
|
143
|
+
activeOperations: new Set(),
|
|
144
|
+
clientMutationReserved: false,
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export const reserveOperationLifecycleClientMutation = (
|
|
149
|
+
smartbucketRefArg: ISmartBucketCapabilityRef,
|
|
150
|
+
): void => {
|
|
151
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRefArg);
|
|
152
|
+
assertOpenLifecycle(lifecycleRecord);
|
|
153
|
+
if (lifecycleRecord.activeOperations.size > 0) {
|
|
154
|
+
throw new Error(
|
|
155
|
+
'Cannot change storageClient while a lifecycle-managed operation is active.',
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
lifecycleRecord.clientMutationReserved = true;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export const commitOperationLifecycleClient = (
|
|
162
|
+
smartbucketRefArg: ISmartBucketCapabilityRef,
|
|
163
|
+
storageClientArg: plugins.s3.S3Client,
|
|
164
|
+
): void => {
|
|
165
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRefArg);
|
|
166
|
+
if (lifecycleRecord.state !== 'open' || !lifecycleRecord.clientMutationReserved) {
|
|
167
|
+
throw new Error('The SmartBucket storageClient mutation was not reserved.');
|
|
168
|
+
}
|
|
169
|
+
lifecycleRecord.generation++;
|
|
170
|
+
lifecycleRecord.storageClient = storageClientArg;
|
|
171
|
+
lifecycleRecord.clientMutationReserved = false;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export const rollbackOperationLifecycleClientMutation = (
|
|
175
|
+
smartbucketRefArg: ISmartBucketCapabilityRef,
|
|
176
|
+
): void => {
|
|
177
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRefArg);
|
|
178
|
+
if (lifecycleRecord.state === 'open') {
|
|
179
|
+
lifecycleRecord.clientMutationReserved = false;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
export const beginOperationLifecycleClose = (
|
|
184
|
+
smartbucketRefArg: ISmartBucketCapabilityRef,
|
|
185
|
+
): Promise<void> | undefined => {
|
|
186
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRefArg);
|
|
187
|
+
if (lifecycleRecord.state === 'closed') {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
lifecycleRecord.state = 'closing';
|
|
191
|
+
lifecycleRecord.generation++;
|
|
192
|
+
const lifecycleAbortCause = new Error(
|
|
193
|
+
'The SmartBucket lifecycle closed during an object operation.',
|
|
194
|
+
);
|
|
195
|
+
const activeSettlements: Promise<void>[] = [];
|
|
196
|
+
for (const activeOperation of lifecycleRecord.activeOperations) {
|
|
197
|
+
activeSettlements.push(activeOperation.settlement);
|
|
198
|
+
activeOperation.abortController.abort(lifecycleAbortCause);
|
|
199
|
+
}
|
|
200
|
+
if (activeSettlements.length === 0) {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
const settleAllOperations = Promise.allSettled(activeSettlements).then(
|
|
204
|
+
() => undefined,
|
|
205
|
+
);
|
|
206
|
+
return new Promise<void>((resolveArg) => {
|
|
207
|
+
const settlementDeadline = setTimeout(() => {
|
|
208
|
+
for (const activeOperation of lifecycleRecord.activeOperations) {
|
|
209
|
+
activeOperation.forceFinish(lifecycleAbortCause);
|
|
210
|
+
}
|
|
211
|
+
resolveArg();
|
|
212
|
+
}, operationCloseSettlementTimeoutMs);
|
|
213
|
+
void settleAllOperations.then(() => {
|
|
214
|
+
clearTimeout(settlementDeadline);
|
|
215
|
+
resolveArg();
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export const completeOperationLifecycleClose = (
|
|
221
|
+
smartbucketRefArg: ISmartBucketCapabilityRef,
|
|
222
|
+
): void => {
|
|
223
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRefArg);
|
|
224
|
+
lifecycleRecord.state = 'closed';
|
|
225
|
+
for (const activeOperation of lifecycleRecord.activeOperations) {
|
|
226
|
+
activeOperation.forceFinish(
|
|
227
|
+
new Error('The SmartBucket operation lifecycle is closed.'),
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
lifecycleRecords.delete(smartbucketRefArg);
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const assertBindingCurrent = (
|
|
234
|
+
bindingArg: IExactCapabilityBinding,
|
|
235
|
+
): void => {
|
|
236
|
+
const lifecycleRecord = getLifecycleRecord(bindingArg.smartbucketRef);
|
|
237
|
+
assertOpenLifecycle(lifecycleRecord);
|
|
238
|
+
if (
|
|
239
|
+
bindingArg.bucketRef.smartbucketRef !== bindingArg.smartbucketRef ||
|
|
240
|
+
bindingArg.bucketRef.name !== bindingArg.bucketName ||
|
|
241
|
+
lifecycleRecord.generation !== bindingArg.lifecycleGeneration ||
|
|
242
|
+
lifecycleRecord.storageClient !== bindingArg.storageClient ||
|
|
243
|
+
bindingArg.smartbucketRef.storageClient !== bindingArg.storageClient
|
|
244
|
+
) {
|
|
245
|
+
throw new Error('The exact upload capability is invalid or stale.');
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
const beginOperation = (
|
|
250
|
+
bindingArg: IExactCapabilityBinding,
|
|
251
|
+
callerSignalArg?: AbortSignal,
|
|
252
|
+
): IBasicBucketOperation => {
|
|
253
|
+
assertBindingCurrent(bindingArg);
|
|
254
|
+
const lifecycleRecord = getLifecycleRecord(bindingArg.smartbucketRef);
|
|
255
|
+
const operationAbortController = new AbortController();
|
|
256
|
+
let settleOperation!: () => void;
|
|
257
|
+
const operationSettlement = new Promise<void>((resolveArg) => {
|
|
258
|
+
settleOperation = resolveArg;
|
|
259
|
+
});
|
|
260
|
+
const abortForCaller = (): void => {
|
|
261
|
+
operationAbortController.abort(
|
|
262
|
+
callerSignalArg?.reason ?? new Error('The object operation was aborted.'),
|
|
263
|
+
);
|
|
264
|
+
};
|
|
265
|
+
let callerAbortListenerReleased = false;
|
|
266
|
+
const releaseCallerAbortListener = (): void => {
|
|
267
|
+
if (callerAbortListenerReleased) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
callerAbortListenerReleased = true;
|
|
271
|
+
callerSignalArg?.removeEventListener('abort', abortForCaller);
|
|
272
|
+
};
|
|
273
|
+
let finishRequested = false;
|
|
274
|
+
let pendingProviderCount = 0;
|
|
275
|
+
let settled = false;
|
|
276
|
+
const settleIfFinished = (): void => {
|
|
277
|
+
if (!finishRequested || pendingProviderCount > 0 || settled) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
settled = true;
|
|
281
|
+
activeOperation.releaseCallerAbortListener();
|
|
282
|
+
lifecycleRecord.activeOperations.delete(activeOperation);
|
|
283
|
+
activeOperation.settle();
|
|
284
|
+
};
|
|
285
|
+
const activeOperation: IActiveCapabilityOperation = {
|
|
286
|
+
abortController: operationAbortController,
|
|
287
|
+
ownedIndependentAborts: new Set(),
|
|
288
|
+
settlement: operationSettlement,
|
|
289
|
+
settle: settleOperation,
|
|
290
|
+
releaseCallerAbortListener,
|
|
291
|
+
forceFinish: (causeArg: unknown): void => {
|
|
292
|
+
if (settled) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
finishRequested = true;
|
|
296
|
+
pendingProviderCount = 0;
|
|
297
|
+
abortAndDisposeIndependentWork(activeOperation, causeArg);
|
|
298
|
+
settleIfFinished();
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
lifecycleRecord.activeOperations.add(activeOperation);
|
|
302
|
+
|
|
303
|
+
callerSignalArg?.addEventListener('abort', abortForCaller, { once: true });
|
|
304
|
+
if (callerSignalArg?.aborted) {
|
|
305
|
+
abortForCaller();
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return {
|
|
309
|
+
bucketName: bindingArg.bucketName,
|
|
310
|
+
client: bindingArg.storageClient,
|
|
311
|
+
signal: operationAbortController.signal,
|
|
312
|
+
registerOwnedIndependentAbort(
|
|
313
|
+
abortControllerArg: AbortController,
|
|
314
|
+
disposeArg: () => void,
|
|
315
|
+
): () => void {
|
|
316
|
+
this.assertLifecycleCurrent();
|
|
317
|
+
const ownedAbort: IOwnedIndependentAbort = {
|
|
318
|
+
abortController: abortControllerArg,
|
|
319
|
+
dispose: disposeArg,
|
|
320
|
+
};
|
|
321
|
+
activeOperation.ownedIndependentAborts.add(ownedAbort);
|
|
322
|
+
let released = false;
|
|
323
|
+
return (): void => {
|
|
324
|
+
if (released) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
released = true;
|
|
328
|
+
activeOperation.ownedIndependentAborts.delete(ownedAbort);
|
|
329
|
+
};
|
|
330
|
+
},
|
|
331
|
+
assertLifecycleCurrent(): void {
|
|
332
|
+
if (
|
|
333
|
+
lifecycleRecord.state === 'closed' ||
|
|
334
|
+
!lifecycleRecord.activeOperations.has(activeOperation) ||
|
|
335
|
+
bindingArg.bucketRef.smartbucketRef !== bindingArg.smartbucketRef ||
|
|
336
|
+
bindingArg.bucketRef.name !== bindingArg.bucketName ||
|
|
337
|
+
lifecycleRecord.storageClient !== bindingArg.storageClient ||
|
|
338
|
+
bindingArg.smartbucketRef.storageClient !== bindingArg.storageClient
|
|
339
|
+
) {
|
|
340
|
+
throw new Error(
|
|
341
|
+
'The object operation lifecycle or storage client is stale.',
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
assertCurrent(): void {
|
|
346
|
+
if (operationAbortController.signal.aborted) {
|
|
347
|
+
throw operationAbortController.signal.reason;
|
|
348
|
+
}
|
|
349
|
+
assertBindingCurrent(bindingArg);
|
|
350
|
+
},
|
|
351
|
+
runProvider<T>(
|
|
352
|
+
sendArg: () => Promise<T>,
|
|
353
|
+
optionsArg: {
|
|
354
|
+
disposeLateResult?: (resultArg: T) => void | Promise<void>;
|
|
355
|
+
} = {},
|
|
356
|
+
): Promise<T> {
|
|
357
|
+
this.assertCurrent();
|
|
358
|
+
pendingProviderCount++;
|
|
359
|
+
return new Promise<T>((resolveArg, rejectArg) => {
|
|
360
|
+
let publicSettled = false;
|
|
361
|
+
const settlePublic = (
|
|
362
|
+
outcomeArg: { result: T } | { error: unknown },
|
|
363
|
+
): void => {
|
|
364
|
+
if (publicSettled) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
publicSettled = true;
|
|
368
|
+
operationAbortController.signal.removeEventListener('abort', abortPublicWait);
|
|
369
|
+
if ('result' in outcomeArg) {
|
|
370
|
+
resolveArg(outcomeArg.result);
|
|
371
|
+
} else {
|
|
372
|
+
rejectArg(outcomeArg.error);
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
const abortPublicWait = (): void => {
|
|
376
|
+
settlePublic({
|
|
377
|
+
error: operationAbortController.signal.reason
|
|
378
|
+
?? new Error('The bucket operation was aborted.'),
|
|
379
|
+
});
|
|
380
|
+
};
|
|
381
|
+
operationAbortController.signal.addEventListener('abort', abortPublicWait, {
|
|
382
|
+
once: true,
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
let providerPromise: Promise<T>;
|
|
386
|
+
try {
|
|
387
|
+
providerPromise = sendArg();
|
|
388
|
+
} catch (error) {
|
|
389
|
+
pendingProviderCount--;
|
|
390
|
+
settleIfFinished();
|
|
391
|
+
settlePublic({ error });
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
void providerPromise.then(
|
|
396
|
+
async (resultArg) => {
|
|
397
|
+
if (
|
|
398
|
+
operationAbortController.signal.aborted
|
|
399
|
+
&& optionsArg.disposeLateResult
|
|
400
|
+
) {
|
|
401
|
+
const disposal = Promise.resolve()
|
|
402
|
+
.then(() => optionsArg.disposeLateResult!(resultArg));
|
|
403
|
+
void disposal.catch(() => undefined);
|
|
404
|
+
let disposalDeadline: ReturnType<typeof setTimeout> | undefined;
|
|
405
|
+
try {
|
|
406
|
+
await Promise.race([
|
|
407
|
+
disposal.catch(() => undefined),
|
|
408
|
+
new Promise<void>((resolveDisposalArg) => {
|
|
409
|
+
disposalDeadline = setTimeout(
|
|
410
|
+
resolveDisposalArg,
|
|
411
|
+
basicOperationLateDisposalTimeoutMs,
|
|
412
|
+
);
|
|
413
|
+
}),
|
|
414
|
+
]);
|
|
415
|
+
} finally {
|
|
416
|
+
if (disposalDeadline) {
|
|
417
|
+
clearTimeout(disposalDeadline);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
pendingProviderCount--;
|
|
422
|
+
settleIfFinished();
|
|
423
|
+
if (operationAbortController.signal.aborted) {
|
|
424
|
+
abortPublicWait();
|
|
425
|
+
} else {
|
|
426
|
+
settlePublic({ result: resultArg });
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
(errorArg: unknown) => {
|
|
430
|
+
pendingProviderCount--;
|
|
431
|
+
settleIfFinished();
|
|
432
|
+
if (operationAbortController.signal.aborted) {
|
|
433
|
+
abortPublicWait();
|
|
434
|
+
} else {
|
|
435
|
+
settlePublic({ error: errorArg });
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
);
|
|
439
|
+
|
|
440
|
+
if (operationAbortController.signal.aborted) {
|
|
441
|
+
abortPublicWait();
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
},
|
|
445
|
+
finish(): void {
|
|
446
|
+
if (finishRequested) {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
finishRequested = true;
|
|
450
|
+
abortAndDisposeIndependentWork(
|
|
451
|
+
activeOperation,
|
|
452
|
+
new Error('The object operation finished.'),
|
|
453
|
+
);
|
|
454
|
+
settleIfFinished();
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
export const beginBasicBucketOperation = (
|
|
460
|
+
bucketRefArg: IBucketCapabilityRef,
|
|
461
|
+
callerSignalArg?: AbortSignal,
|
|
462
|
+
): IBasicBucketOperation => {
|
|
463
|
+
const smartbucketRef = bucketRefArg.smartbucketRef;
|
|
464
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRef);
|
|
465
|
+
const binding: IExactCapabilityBinding = {
|
|
466
|
+
bucketRef: bucketRefArg,
|
|
467
|
+
bucketName: bucketRefArg.name,
|
|
468
|
+
smartbucketRef,
|
|
469
|
+
storageClient: lifecycleRecord.storageClient,
|
|
470
|
+
lifecycleGeneration: lifecycleRecord.generation,
|
|
471
|
+
};
|
|
472
|
+
return beginOperation(binding, callerSignalArg);
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
export const beginExactUploadProbeOperation = (
|
|
476
|
+
bucketRefArg: IBucketCapabilityRef,
|
|
477
|
+
callerSignalArg?: AbortSignal,
|
|
478
|
+
): IExactUploadOperation => {
|
|
479
|
+
const smartbucketRef = bucketRefArg.smartbucketRef;
|
|
480
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRef);
|
|
481
|
+
const binding: IExactCapabilityBinding = {
|
|
482
|
+
bucketRef: bucketRefArg,
|
|
483
|
+
bucketName: bucketRefArg.name,
|
|
484
|
+
smartbucketRef,
|
|
485
|
+
storageClient: lifecycleRecord.storageClient,
|
|
486
|
+
lifecycleGeneration: lifecycleRecord.generation,
|
|
487
|
+
};
|
|
488
|
+
return beginOperation(binding, callerSignalArg);
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
export const beginExactPathPurgeProbeOperation = (
|
|
492
|
+
bucketRefArg: IBucketCapabilityRef,
|
|
493
|
+
callerSignalArg?: AbortSignal,
|
|
494
|
+
): IExactUploadOperation => {
|
|
495
|
+
const smartbucketRef = bucketRefArg.smartbucketRef;
|
|
496
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRef);
|
|
497
|
+
const binding: IExactCapabilityBinding = {
|
|
498
|
+
bucketRef: bucketRefArg,
|
|
499
|
+
bucketName: bucketRefArg.name,
|
|
500
|
+
smartbucketRef,
|
|
501
|
+
storageClient: lifecycleRecord.storageClient,
|
|
502
|
+
lifecycleGeneration: lifecycleRecord.generation,
|
|
503
|
+
};
|
|
504
|
+
return beginOperation(binding, callerSignalArg);
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
export const mintExactUploadCapability = (
|
|
508
|
+
bucketRefArg: IBucketCapabilityRef,
|
|
509
|
+
operationArg: IExactUploadOperation,
|
|
510
|
+
): IExactUploadCapability => {
|
|
511
|
+
operationArg.assertCurrent();
|
|
512
|
+
const smartbucketRef = bucketRefArg.smartbucketRef;
|
|
513
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRef);
|
|
514
|
+
const capability = Object.freeze({}) as IExactUploadCapability;
|
|
515
|
+
capabilityBindings.set(capability, {
|
|
516
|
+
bucketRef: bucketRefArg,
|
|
517
|
+
bucketName: operationArg.bucketName,
|
|
518
|
+
smartbucketRef,
|
|
519
|
+
storageClient: operationArg.client,
|
|
520
|
+
lifecycleGeneration: lifecycleRecord.generation,
|
|
521
|
+
});
|
|
522
|
+
return capability;
|
|
523
|
+
};
|
|
524
|
+
|
|
525
|
+
export const beginExactUploadCapabilityOperation = (
|
|
526
|
+
bucketRefArg: IBucketCapabilityRef,
|
|
527
|
+
capabilityArg: IExactUploadCapability,
|
|
528
|
+
callerSignalArg?: AbortSignal,
|
|
529
|
+
): IExactUploadOperation => {
|
|
530
|
+
if (
|
|
531
|
+
typeof capabilityArg !== 'object' ||
|
|
532
|
+
capabilityArg === null
|
|
533
|
+
) {
|
|
534
|
+
throw new Error('The exact upload capability is invalid or stale.');
|
|
535
|
+
}
|
|
536
|
+
const binding = capabilityBindings.get(capabilityArg);
|
|
537
|
+
if (!binding || binding.bucketRef !== bucketRefArg) {
|
|
538
|
+
throw new Error('The exact upload capability is invalid or stale.');
|
|
539
|
+
}
|
|
540
|
+
return beginOperation(binding, callerSignalArg);
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
export const mintExactPathPurgeCapability = (
|
|
544
|
+
bucketRefArg: IBucketCapabilityRef,
|
|
545
|
+
operationArg: IExactUploadOperation,
|
|
546
|
+
versioningModeArg: TExactPathPurgeVersioningMode,
|
|
547
|
+
): IExactPathPurgeCapability => {
|
|
548
|
+
operationArg.assertCurrent();
|
|
549
|
+
const smartbucketRef = bucketRefArg.smartbucketRef;
|
|
550
|
+
const lifecycleRecord = getLifecycleRecord(smartbucketRef);
|
|
551
|
+
const capability = Object.freeze({}) as IExactPathPurgeCapability;
|
|
552
|
+
purgeCapabilityBindings.set(capability, {
|
|
553
|
+
bucketRef: bucketRefArg,
|
|
554
|
+
bucketName: operationArg.bucketName,
|
|
555
|
+
smartbucketRef,
|
|
556
|
+
storageClient: operationArg.client,
|
|
557
|
+
lifecycleGeneration: lifecycleRecord.generation,
|
|
558
|
+
versioningMode: versioningModeArg,
|
|
559
|
+
});
|
|
560
|
+
return capability;
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
export const beginExactPathPurgeCapabilityOperation = (
|
|
564
|
+
bucketRefArg: IBucketCapabilityRef,
|
|
565
|
+
capabilityArg: IExactPathPurgeCapability,
|
|
566
|
+
callerSignalArg?: AbortSignal,
|
|
567
|
+
): IExactPathPurgeOperation => {
|
|
568
|
+
if (typeof capabilityArg !== 'object' || capabilityArg === null) {
|
|
569
|
+
throw new Error('The exact-path purge capability is invalid or stale.');
|
|
570
|
+
}
|
|
571
|
+
const binding = purgeCapabilityBindings.get(capabilityArg);
|
|
572
|
+
if (!binding || binding.bucketRef !== bucketRefArg) {
|
|
573
|
+
throw new Error('The exact-path purge capability is invalid or stale.');
|
|
574
|
+
}
|
|
575
|
+
const operation = beginOperation(binding, callerSignalArg);
|
|
576
|
+
return {
|
|
577
|
+
...operation,
|
|
578
|
+
versioningMode: binding.versioningMode,
|
|
579
|
+
};
|
|
580
|
+
};
|