@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,357 @@
|
|
|
1
|
+
// classes.smartbucket.ts
|
|
2
|
+
import * as plugins from './plugins.js';
|
|
3
|
+
import { Bucket } from './classes.bucket.js';
|
|
4
|
+
import { normalizeStorageDescriptor } from './helpers.js';
|
|
5
|
+
import { beginOperationLifecycleClose, commitOperationLifecycleClient, completeOperationLifecycleClose, registerOperationLifecycle, reserveOperationLifecycleClientMutation, rollbackOperationLifecycleClientMutation, } from './internal.exactupload.capability.js';
|
|
6
|
+
const readinessDefaultTimeoutMs = 2_000;
|
|
7
|
+
const readinessMaximumTimeoutMs = 30_000;
|
|
8
|
+
export class SmartBucket {
|
|
9
|
+
config;
|
|
10
|
+
currentStorageClient;
|
|
11
|
+
ownedStorageClient;
|
|
12
|
+
lifecycleState = 'open';
|
|
13
|
+
lifecycleEpoch = 0;
|
|
14
|
+
activeReadinessControllers = new Set();
|
|
15
|
+
retiredStorageClients = new WeakSet();
|
|
16
|
+
storageClientMutationInProgress = false;
|
|
17
|
+
closePromise;
|
|
18
|
+
operationCloseStarted = false;
|
|
19
|
+
operationCloseSettlement;
|
|
20
|
+
/**
|
|
21
|
+
* The current S3 client used by bucket operations.
|
|
22
|
+
*/
|
|
23
|
+
get storageClient() {
|
|
24
|
+
return this.currentStorageClient;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Changes the current S3 client without transferring lifecycle ownership.
|
|
28
|
+
*/
|
|
29
|
+
set storageClient(storageClientArg) {
|
|
30
|
+
if (!this.isStorageClient(storageClientArg)) {
|
|
31
|
+
throw new TypeError('storageClient must provide send() and destroy() methods.');
|
|
32
|
+
}
|
|
33
|
+
if (this.lifecycleState !== 'open') {
|
|
34
|
+
throw new Error(`Cannot assign storageClient while SmartBucket is ${this.lifecycleState}.`);
|
|
35
|
+
}
|
|
36
|
+
if (this.storageClientMutationInProgress) {
|
|
37
|
+
throw new Error('Cannot assign storageClient during another client change.');
|
|
38
|
+
}
|
|
39
|
+
if (storageClientArg === this.currentStorageClient) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (this.retiredStorageClients.has(storageClientArg)) {
|
|
43
|
+
throw new Error('Cannot reuse a storageClient retired by this SmartBucket.');
|
|
44
|
+
}
|
|
45
|
+
this.storageClientMutationInProgress = true;
|
|
46
|
+
let mutationReserved = false;
|
|
47
|
+
try {
|
|
48
|
+
reserveOperationLifecycleClientMutation(this);
|
|
49
|
+
mutationReserved = true;
|
|
50
|
+
this.lifecycleEpoch++;
|
|
51
|
+
this.abortActiveReadinessProbes();
|
|
52
|
+
this.currentStorageClient = storageClientArg;
|
|
53
|
+
commitOperationLifecycleClient(this, storageClientArg);
|
|
54
|
+
mutationReserved = false;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
if (mutationReserved) {
|
|
58
|
+
rollbackOperationLifecycleClientMutation(this);
|
|
59
|
+
}
|
|
60
|
+
this.storageClientMutationInProgress = false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** @deprecated Use storageClient instead */
|
|
64
|
+
get s3Client() {
|
|
65
|
+
return this.currentStorageClient;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* the constructor of SmartBucket
|
|
69
|
+
*/
|
|
70
|
+
constructor(configArg, clientOptions = {}) {
|
|
71
|
+
this.config = configArg;
|
|
72
|
+
// Use the normalizer to handle various endpoint formats
|
|
73
|
+
const { normalized } = normalizeStorageDescriptor(configArg);
|
|
74
|
+
this.currentStorageClient = new plugins.s3.S3Client({
|
|
75
|
+
endpoint: normalized.endpointUrl,
|
|
76
|
+
region: normalized.region,
|
|
77
|
+
credentials: normalized.credentials,
|
|
78
|
+
forcePathStyle: clientOptions.forcePathStyle ?? normalized.forcePathStyle,
|
|
79
|
+
});
|
|
80
|
+
this.ownedStorageClient = this.currentStorageClient;
|
|
81
|
+
registerOperationLifecycle(this, this.currentStorageClient);
|
|
82
|
+
}
|
|
83
|
+
async createBucket(bucketNameArg) {
|
|
84
|
+
const bucket = await Bucket.createBucketByName(this, bucketNameArg);
|
|
85
|
+
return bucket;
|
|
86
|
+
}
|
|
87
|
+
async removeBucket(bucketName) {
|
|
88
|
+
await Bucket.removeBucketByName(this, bucketName);
|
|
89
|
+
}
|
|
90
|
+
async getBucketByName(bucketNameArg) {
|
|
91
|
+
return Bucket.getBucketByName(this, bucketNameArg);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if a bucket exists
|
|
95
|
+
*/
|
|
96
|
+
async bucketExists(bucketNameArg) {
|
|
97
|
+
const command = new plugins.s3.ListBucketsCommand({});
|
|
98
|
+
const buckets = await this.currentStorageClient.send(command);
|
|
99
|
+
return buckets.Buckets?.some(bucket => bucket.Name === bucketNameArg) ?? false;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Transfers exclusive lifecycle ownership of an S3 client to this SmartBucket.
|
|
103
|
+
*/
|
|
104
|
+
replaceStorageClient(storageClientArg) {
|
|
105
|
+
if (!this.isStorageClient(storageClientArg)) {
|
|
106
|
+
throw new TypeError('storageClient must provide send() and destroy() methods.');
|
|
107
|
+
}
|
|
108
|
+
if (this.lifecycleState !== 'open') {
|
|
109
|
+
throw new Error(`Cannot replace storageClient while SmartBucket is ${this.lifecycleState}.`);
|
|
110
|
+
}
|
|
111
|
+
if (this.storageClientMutationInProgress) {
|
|
112
|
+
throw new Error('Cannot replace storageClient during another client change.');
|
|
113
|
+
}
|
|
114
|
+
if (this.retiredStorageClients.has(storageClientArg)) {
|
|
115
|
+
throw new Error('Cannot reuse a storageClient retired by this SmartBucket.');
|
|
116
|
+
}
|
|
117
|
+
if (storageClientArg === this.currentStorageClient &&
|
|
118
|
+
storageClientArg === this.ownedStorageClient) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.storageClientMutationInProgress = true;
|
|
122
|
+
let mutationReserved = false;
|
|
123
|
+
try {
|
|
124
|
+
reserveOperationLifecycleClientMutation(this);
|
|
125
|
+
mutationReserved = true;
|
|
126
|
+
if (storageClientArg !== this.ownedStorageClient) {
|
|
127
|
+
const previousOwnedStorageClient = this.ownedStorageClient;
|
|
128
|
+
try {
|
|
129
|
+
previousOwnedStorageClient.destroy();
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
// A throwing destroy has an unknown partial-teardown outcome. Keep
|
|
133
|
+
// the lifecycle reserved so no later operation can reuse it.
|
|
134
|
+
mutationReserved = false;
|
|
135
|
+
this.lifecycleState = 'closing';
|
|
136
|
+
this.lifecycleEpoch++;
|
|
137
|
+
this.abortActiveReadinessProbes();
|
|
138
|
+
this.operationCloseSettlement = beginOperationLifecycleClose(this);
|
|
139
|
+
this.operationCloseStarted = true;
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
this.retiredStorageClients.add(previousOwnedStorageClient);
|
|
143
|
+
this.ownedStorageClient = storageClientArg;
|
|
144
|
+
}
|
|
145
|
+
this.currentStorageClient = storageClientArg;
|
|
146
|
+
commitOperationLifecycleClient(this, storageClientArg);
|
|
147
|
+
mutationReserved = false;
|
|
148
|
+
this.lifecycleEpoch++;
|
|
149
|
+
this.abortActiveReadinessProbes();
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
if (mutationReserved) {
|
|
153
|
+
rollbackOperationLifecycleClientMutation(this);
|
|
154
|
+
}
|
|
155
|
+
this.storageClientMutationInProgress = false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Performs a bounded, read-only round trip to verify bucket readiness.
|
|
160
|
+
*/
|
|
161
|
+
async checkReadiness(bucketNameArg, optionsArg = {}) {
|
|
162
|
+
const startedAt = performance.now();
|
|
163
|
+
if (typeof bucketNameArg !== 'string' ||
|
|
164
|
+
bucketNameArg.length === 0 ||
|
|
165
|
+
bucketNameArg.trim() !== bucketNameArg) {
|
|
166
|
+
throw new TypeError('Readiness bucketName must be a non-empty trimmed string.');
|
|
167
|
+
}
|
|
168
|
+
const timeoutMs = optionsArg.timeoutMs ?? readinessDefaultTimeoutMs;
|
|
169
|
+
if (!Number.isSafeInteger(timeoutMs) ||
|
|
170
|
+
timeoutMs <= 0 ||
|
|
171
|
+
timeoutMs > readinessMaximumTimeoutMs) {
|
|
172
|
+
throw new TypeError(`Readiness timeoutMs must be a positive safe integer no greater than ${readinessMaximumTimeoutMs}.`);
|
|
173
|
+
}
|
|
174
|
+
const lifecycleReason = this.getReadinessLifecycleReason();
|
|
175
|
+
if (lifecycleReason) {
|
|
176
|
+
return this.createReadinessFailure(lifecycleReason, startedAt);
|
|
177
|
+
}
|
|
178
|
+
if (this.storageClientMutationInProgress) {
|
|
179
|
+
return this.createReadinessFailure('unavailable', startedAt);
|
|
180
|
+
}
|
|
181
|
+
const callerSignal = optionsArg.signal;
|
|
182
|
+
if (callerSignal?.aborted) {
|
|
183
|
+
return this.createReadinessFailure('aborted', startedAt);
|
|
184
|
+
}
|
|
185
|
+
const lifecycleEpoch = this.lifecycleEpoch;
|
|
186
|
+
const storageClient = this.currentStorageClient;
|
|
187
|
+
const readinessController = new AbortController();
|
|
188
|
+
let abortSource;
|
|
189
|
+
const abortForCaller = () => {
|
|
190
|
+
if (!abortSource) {
|
|
191
|
+
abortSource = 'caller';
|
|
192
|
+
}
|
|
193
|
+
readinessController.abort();
|
|
194
|
+
};
|
|
195
|
+
callerSignal?.addEventListener('abort', abortForCaller, { once: true });
|
|
196
|
+
const deadlineTimer = setTimeout(() => {
|
|
197
|
+
if (!abortSource) {
|
|
198
|
+
abortSource = 'deadline';
|
|
199
|
+
}
|
|
200
|
+
readinessController.abort();
|
|
201
|
+
}, timeoutMs);
|
|
202
|
+
this.activeReadinessControllers.add(readinessController);
|
|
203
|
+
let sendOutcome;
|
|
204
|
+
try {
|
|
205
|
+
sendOutcome = await this.sendReadinessProbe(storageClient, bucketNameArg, readinessController.signal);
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
clearTimeout(deadlineTimer);
|
|
209
|
+
callerSignal?.removeEventListener('abort', abortForCaller);
|
|
210
|
+
this.activeReadinessControllers.delete(readinessController);
|
|
211
|
+
}
|
|
212
|
+
const staleReason = this.getStaleReadinessReason(lifecycleEpoch, storageClient);
|
|
213
|
+
if (staleReason) {
|
|
214
|
+
return this.createReadinessFailure(staleReason, startedAt);
|
|
215
|
+
}
|
|
216
|
+
if (sendOutcome === 'aborted') {
|
|
217
|
+
if (abortSource === 'caller') {
|
|
218
|
+
return this.createReadinessFailure('aborted', startedAt);
|
|
219
|
+
}
|
|
220
|
+
if (abortSource === 'deadline') {
|
|
221
|
+
return this.createReadinessFailure('timeout', startedAt);
|
|
222
|
+
}
|
|
223
|
+
return this.createReadinessFailure('unavailable', startedAt);
|
|
224
|
+
}
|
|
225
|
+
if (sendOutcome === 'unavailable') {
|
|
226
|
+
return this.createReadinessFailure('unavailable', startedAt);
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
ready: true,
|
|
230
|
+
status: 'ready',
|
|
231
|
+
durationMs: performance.now() - startedAt,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Cancels active readiness and object operations before closing the owned S3 client.
|
|
236
|
+
*/
|
|
237
|
+
close() {
|
|
238
|
+
if (this.storageClientMutationInProgress) {
|
|
239
|
+
throw new Error('Cannot close SmartBucket during a storageClient change.');
|
|
240
|
+
}
|
|
241
|
+
if (this.closePromise) {
|
|
242
|
+
return this.closePromise;
|
|
243
|
+
}
|
|
244
|
+
let resolveClose;
|
|
245
|
+
let rejectClose;
|
|
246
|
+
const closePromise = new Promise((resolve, reject) => {
|
|
247
|
+
resolveClose = resolve;
|
|
248
|
+
rejectClose = reject;
|
|
249
|
+
});
|
|
250
|
+
this.closePromise = closePromise;
|
|
251
|
+
if (!this.operationCloseStarted) {
|
|
252
|
+
this.lifecycleState = 'closing';
|
|
253
|
+
this.lifecycleEpoch++;
|
|
254
|
+
this.abortActiveReadinessProbes();
|
|
255
|
+
this.operationCloseSettlement = beginOperationLifecycleClose(this);
|
|
256
|
+
this.operationCloseStarted = true;
|
|
257
|
+
}
|
|
258
|
+
const finishClose = () => {
|
|
259
|
+
try {
|
|
260
|
+
this.ownedStorageClient.destroy();
|
|
261
|
+
completeOperationLifecycleClose(this);
|
|
262
|
+
this.lifecycleState = 'closed';
|
|
263
|
+
resolveClose();
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
rejectClose(error);
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
if (this.operationCloseSettlement) {
|
|
270
|
+
void this.operationCloseSettlement.then(finishClose);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
finishClose();
|
|
274
|
+
}
|
|
275
|
+
void closePromise.catch(() => {
|
|
276
|
+
if (this.closePromise === closePromise) {
|
|
277
|
+
this.closePromise = undefined;
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
return closePromise;
|
|
281
|
+
}
|
|
282
|
+
isStorageClient(storageClientArg) {
|
|
283
|
+
if (typeof storageClientArg !== 'object' || storageClientArg === null) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
const storageClientCandidate = storageClientArg;
|
|
287
|
+
return (typeof storageClientCandidate.send === 'function' &&
|
|
288
|
+
typeof storageClientCandidate.destroy === 'function');
|
|
289
|
+
}
|
|
290
|
+
abortActiveReadinessProbes() {
|
|
291
|
+
for (const readinessController of [...this.activeReadinessControllers]) {
|
|
292
|
+
readinessController.abort();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
sendReadinessProbe(storageClientArg, bucketNameArg, signalArg) {
|
|
296
|
+
return new Promise((resolve) => {
|
|
297
|
+
let settled = false;
|
|
298
|
+
const settle = (outcomeArg) => {
|
|
299
|
+
if (settled) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
settled = true;
|
|
303
|
+
signalArg.removeEventListener('abort', abortReadinessProbe);
|
|
304
|
+
resolve(outcomeArg);
|
|
305
|
+
};
|
|
306
|
+
const abortReadinessProbe = () => {
|
|
307
|
+
settle('aborted');
|
|
308
|
+
};
|
|
309
|
+
signalArg.addEventListener('abort', abortReadinessProbe, { once: true });
|
|
310
|
+
if (signalArg.aborted) {
|
|
311
|
+
abortReadinessProbe();
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
const providerPromise = storageClientArg.send(new plugins.s3.HeadBucketCommand({
|
|
316
|
+
Bucket: bucketNameArg,
|
|
317
|
+
}), {
|
|
318
|
+
abortSignal: signalArg,
|
|
319
|
+
});
|
|
320
|
+
void providerPromise.then(() => settle('ready'), () => settle('unavailable'));
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
settle('unavailable');
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
getReadinessLifecycleReason() {
|
|
328
|
+
switch (this.lifecycleState) {
|
|
329
|
+
case 'open':
|
|
330
|
+
return undefined;
|
|
331
|
+
case 'closing':
|
|
332
|
+
return 'closing';
|
|
333
|
+
case 'closed':
|
|
334
|
+
return 'closed';
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
getStaleReadinessReason(lifecycleEpochArg, storageClientArg) {
|
|
338
|
+
const lifecycleReason = this.getReadinessLifecycleReason();
|
|
339
|
+
if (lifecycleReason) {
|
|
340
|
+
return lifecycleReason;
|
|
341
|
+
}
|
|
342
|
+
if (this.lifecycleEpoch !== lifecycleEpochArg ||
|
|
343
|
+
this.currentStorageClient !== storageClientArg) {
|
|
344
|
+
return 'unavailable';
|
|
345
|
+
}
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
createReadinessFailure(reasonArg, startedAtArg) {
|
|
349
|
+
return {
|
|
350
|
+
ready: false,
|
|
351
|
+
status: 'unavailable',
|
|
352
|
+
reason: reasonArg,
|
|
353
|
+
durationMs: performance.now() - startedAtArg,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGJ1Y2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL29iamVjdHN0b3JhZ2UvY2xhc3Nlcy5zbWFydGJ1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5QkFBeUI7QUFFekIsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDhCQUE4QixFQUM5QiwrQkFBK0IsRUFDL0IsMEJBQTBCLEVBQzFCLHVDQUF1QyxFQUN2Qyx3Q0FBd0MsR0FDekMsTUFBTSxzQ0FBc0MsQ0FBQztBQVc5QyxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQztBQUN4QyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUV6QyxNQUFNLE9BQU8sV0FBVztJQUNmLE1BQU0sQ0FBNkM7SUFFbEQsb0JBQW9CLENBQXNCO0lBQzFDLGtCQUFrQixDQUFzQjtJQUN4QyxjQUFjLEdBQStCLE1BQU0sQ0FBQztJQUNwRCxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ3hELHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0lBQzNELCtCQUErQixHQUFHLEtBQUssQ0FBQztJQUN4QyxZQUFZLENBQTRCO0lBQ3hDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUM5Qix3QkFBd0IsQ0FBNEI7SUFFNUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxhQUFhLENBQUMsZ0JBQXFDO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdC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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as interfaces from './interfaces.js';
|
|
2
|
+
import type { Bucket } from './classes.bucket.js';
|
|
3
|
+
import type { Directory } from './classes.directory.js';
|
|
4
|
+
import type { File } from './classes.file.js';
|
|
5
|
+
export declare class Trash {
|
|
6
|
+
bucketRef: Bucket;
|
|
7
|
+
constructor(bucketRefArg: Bucket);
|
|
8
|
+
getTrashDir(): Promise<Directory>;
|
|
9
|
+
getTrashedFileByOriginalName(pathDescriptor: interfaces.IPathDecriptor): Promise<File>;
|
|
10
|
+
getTrashKeyByOriginalBasePath(originalPath: string): Promise<string>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as interfaces from './interfaces.js';
|
|
3
|
+
import * as helpers from './helpers.js';
|
|
4
|
+
export class Trash {
|
|
5
|
+
bucketRef;
|
|
6
|
+
constructor(bucketRefArg) {
|
|
7
|
+
this.bucketRef = bucketRefArg;
|
|
8
|
+
}
|
|
9
|
+
async getTrashDir() {
|
|
10
|
+
return this.bucketRef.getDirectoryFromPath({ path: '.trash' });
|
|
11
|
+
}
|
|
12
|
+
async getTrashedFileByOriginalName(pathDescriptor) {
|
|
13
|
+
const trashDir = await this.getTrashDir();
|
|
14
|
+
const originalPath = await helpers.reducePathDescriptorToPath(pathDescriptor);
|
|
15
|
+
const trashKey = await this.getTrashKeyByOriginalBasePath(originalPath);
|
|
16
|
+
return trashDir.getFile({ path: trashKey });
|
|
17
|
+
}
|
|
18
|
+
async getTrashKeyByOriginalBasePath(originalPath) {
|
|
19
|
+
return plugins.smartstring.base64.encode(originalPath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50cmFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL29iamVjdHN0b3JhZ2UvY2xhc3Nlcy50cmFzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBTXhDLE1BQU0sT0FBTyxLQUFLO0lBQ1QsU0FBUyxDQUFTO0lBRXpCLFlBQVksWUFBb0I7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUM7SUFDaEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTSxLQUFLLENBQUMsNEJBQTRCLENBQUMsY0FBeUM7UUFDakYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxPQUFPLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEUsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBRSxZQUFvQjtRQUM5RCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as interfaces from './interfaces.js';
|
|
3
|
+
import type { Bucket } from './classes.bucket.js';
|
|
4
|
+
import { EventEmitter } from 'node:events';
|
|
5
|
+
/**
|
|
6
|
+
* BucketWatcher monitors a storage bucket for changes (add/modify/delete)
|
|
7
|
+
* using a polling-based approach. Designed to follow the SmartdataDbWatcher pattern.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const watcher = bucket.createWatcher({ prefix: 'uploads/', pollIntervalMs: 3000 });
|
|
12
|
+
*
|
|
13
|
+
* // RxJS Observable pattern
|
|
14
|
+
* watcher.changeSubject.subscribe((change) => {
|
|
15
|
+
* console.log('Change:', change);
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // EventEmitter pattern
|
|
19
|
+
* watcher.on('change', (change) => console.log(change));
|
|
20
|
+
* watcher.on('error', (err) => console.error(err));
|
|
21
|
+
*
|
|
22
|
+
* await watcher.start();
|
|
23
|
+
* await watcher.readyDeferred.promise; // Wait for initial state
|
|
24
|
+
*
|
|
25
|
+
* // Later...
|
|
26
|
+
* await watcher.stop();
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class BucketWatcher extends EventEmitter {
|
|
30
|
+
/** Deferred that resolves when initial state is built and watcher is ready */
|
|
31
|
+
readyDeferred: plugins.smartpromise.Deferred<void>;
|
|
32
|
+
/** Observable for receiving change events (supports RxJS operators) */
|
|
33
|
+
changeSubject: plugins.smartrx.rxjs.Observable<interfaces.IStorageChangeEvent | interfaces.IStorageChangeEvent[]>;
|
|
34
|
+
private rawSubject;
|
|
35
|
+
private previousState;
|
|
36
|
+
private pollIntervalId;
|
|
37
|
+
private isPolling;
|
|
38
|
+
private isStopped;
|
|
39
|
+
private readonly bucketRef;
|
|
40
|
+
private readonly prefix;
|
|
41
|
+
private readonly pollIntervalMs;
|
|
42
|
+
private readonly bufferTimeMs?;
|
|
43
|
+
private readonly includeInitial;
|
|
44
|
+
private readonly pageSize;
|
|
45
|
+
constructor(bucketRef: Bucket, options?: interfaces.IBucketWatcherOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Start watching the bucket for changes
|
|
48
|
+
*/
|
|
49
|
+
start(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Stop watching the bucket
|
|
52
|
+
*/
|
|
53
|
+
stop(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Alias for stop() - for consistency with other APIs
|
|
56
|
+
*/
|
|
57
|
+
close(): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Build the initial state by listing all objects with metadata
|
|
60
|
+
*/
|
|
61
|
+
private buildInitialState;
|
|
62
|
+
/**
|
|
63
|
+
* Poll for changes by comparing current state against previous state
|
|
64
|
+
*/
|
|
65
|
+
private poll;
|
|
66
|
+
/**
|
|
67
|
+
* Detect changes between current and previous state
|
|
68
|
+
*/
|
|
69
|
+
private detectChanges;
|
|
70
|
+
/**
|
|
71
|
+
* Emit a change event via both RxJS Subject and EventEmitter
|
|
72
|
+
*/
|
|
73
|
+
private emitChange;
|
|
74
|
+
/**
|
|
75
|
+
* List objects with full metadata (ETag, Size, LastModified)
|
|
76
|
+
* This is a private method that yields full _Object data, not just keys
|
|
77
|
+
*/
|
|
78
|
+
private listObjectsWithMetadata;
|
|
79
|
+
}
|