@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,249 @@
|
|
|
1
|
+
// classes.watcher.ts
|
|
2
|
+
import * as plugins from './plugins.js';
|
|
3
|
+
import * as interfaces from './interfaces.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 class BucketWatcher extends EventEmitter {
|
|
30
|
+
/** Deferred that resolves when initial state is built and watcher is ready */
|
|
31
|
+
readyDeferred = plugins.smartpromise.defer();
|
|
32
|
+
/** Observable for receiving change events (supports RxJS operators) */
|
|
33
|
+
changeSubject;
|
|
34
|
+
// Internal subjects and state
|
|
35
|
+
rawSubject;
|
|
36
|
+
previousState;
|
|
37
|
+
pollIntervalId = null;
|
|
38
|
+
isPolling = false;
|
|
39
|
+
isStopped = false;
|
|
40
|
+
// Configuration
|
|
41
|
+
bucketRef;
|
|
42
|
+
prefix;
|
|
43
|
+
pollIntervalMs;
|
|
44
|
+
bufferTimeMs;
|
|
45
|
+
includeInitial;
|
|
46
|
+
pageSize;
|
|
47
|
+
constructor(bucketRef, options = {}) {
|
|
48
|
+
super();
|
|
49
|
+
this.bucketRef = bucketRef;
|
|
50
|
+
this.prefix = options.prefix ?? '';
|
|
51
|
+
this.pollIntervalMs = options.pollIntervalMs ?? 5000;
|
|
52
|
+
this.bufferTimeMs = options.bufferTimeMs;
|
|
53
|
+
this.includeInitial = options.includeInitial ?? false;
|
|
54
|
+
this.pageSize = options.pageSize ?? 1000;
|
|
55
|
+
// Initialize state tracking
|
|
56
|
+
this.previousState = new Map();
|
|
57
|
+
// Initialize raw subject for emitting changes
|
|
58
|
+
this.rawSubject = new plugins.smartrx.rxjs.Subject();
|
|
59
|
+
// Configure the public observable with optional buffering
|
|
60
|
+
if (this.bufferTimeMs && this.bufferTimeMs > 0) {
|
|
61
|
+
this.changeSubject = this.rawSubject.pipe(plugins.smartrx.rxjs.ops.bufferTime(this.bufferTimeMs), plugins.smartrx.rxjs.ops.filter((events) => events.length > 0));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.changeSubject = this.rawSubject.asObservable();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Start watching the bucket for changes
|
|
69
|
+
*/
|
|
70
|
+
async start() {
|
|
71
|
+
if (this.pollIntervalId !== null) {
|
|
72
|
+
console.log('BucketWatcher is already running');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.isStopped = false;
|
|
76
|
+
// Build initial state
|
|
77
|
+
await this.buildInitialState();
|
|
78
|
+
// Emit initial state as 'add' events if configured
|
|
79
|
+
if (this.includeInitial) {
|
|
80
|
+
for (const state of this.previousState.values()) {
|
|
81
|
+
this.emitChange({
|
|
82
|
+
type: 'add',
|
|
83
|
+
key: state.key,
|
|
84
|
+
size: state.size,
|
|
85
|
+
etag: state.etag,
|
|
86
|
+
lastModified: state.lastModified,
|
|
87
|
+
bucket: this.bucketRef.name,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Mark as ready
|
|
92
|
+
this.readyDeferred.resolve();
|
|
93
|
+
// Start polling loop
|
|
94
|
+
this.pollIntervalId = setInterval(() => {
|
|
95
|
+
this.poll().catch((err) => {
|
|
96
|
+
this.emit('error', err);
|
|
97
|
+
});
|
|
98
|
+
}, this.pollIntervalMs);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Stop watching the bucket
|
|
102
|
+
*/
|
|
103
|
+
async stop() {
|
|
104
|
+
this.isStopped = true;
|
|
105
|
+
if (this.pollIntervalId !== null) {
|
|
106
|
+
clearInterval(this.pollIntervalId);
|
|
107
|
+
this.pollIntervalId = null;
|
|
108
|
+
}
|
|
109
|
+
// Wait for any in-progress poll to complete
|
|
110
|
+
while (this.isPolling) {
|
|
111
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
112
|
+
}
|
|
113
|
+
this.rawSubject.complete();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Alias for stop() - for consistency with other APIs
|
|
117
|
+
*/
|
|
118
|
+
async close() {
|
|
119
|
+
return this.stop();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Build the initial state by listing all objects with metadata
|
|
123
|
+
*/
|
|
124
|
+
async buildInitialState() {
|
|
125
|
+
this.previousState.clear();
|
|
126
|
+
for await (const obj of this.listObjectsWithMetadata()) {
|
|
127
|
+
if (obj.Key) {
|
|
128
|
+
this.previousState.set(obj.Key, {
|
|
129
|
+
key: obj.Key,
|
|
130
|
+
etag: obj.ETag ?? '',
|
|
131
|
+
size: obj.Size ?? 0,
|
|
132
|
+
lastModified: obj.LastModified ?? new Date(0),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Poll for changes by comparing current state against previous state
|
|
139
|
+
*/
|
|
140
|
+
async poll() {
|
|
141
|
+
// Guard against overlapping polls
|
|
142
|
+
if (this.isPolling || this.isStopped) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.isPolling = true;
|
|
146
|
+
try {
|
|
147
|
+
// Build current state
|
|
148
|
+
const currentState = new Map();
|
|
149
|
+
for await (const obj of this.listObjectsWithMetadata()) {
|
|
150
|
+
if (this.isStopped) {
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
if (obj.Key) {
|
|
154
|
+
currentState.set(obj.Key, {
|
|
155
|
+
key: obj.Key,
|
|
156
|
+
etag: obj.ETag ?? '',
|
|
157
|
+
size: obj.Size ?? 0,
|
|
158
|
+
lastModified: obj.LastModified ?? new Date(0),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!this.isStopped) {
|
|
163
|
+
this.detectChanges(currentState);
|
|
164
|
+
this.previousState = currentState;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
this.emit('error', err);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
this.isPolling = false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Detect changes between current and previous state
|
|
176
|
+
*/
|
|
177
|
+
detectChanges(currentState) {
|
|
178
|
+
// Detect added and modified objects
|
|
179
|
+
for (const [key, current] of currentState) {
|
|
180
|
+
const previous = this.previousState.get(key);
|
|
181
|
+
if (!previous) {
|
|
182
|
+
// New object - emit 'add' event
|
|
183
|
+
this.emitChange({
|
|
184
|
+
type: 'add',
|
|
185
|
+
key: current.key,
|
|
186
|
+
size: current.size,
|
|
187
|
+
etag: current.etag,
|
|
188
|
+
lastModified: current.lastModified,
|
|
189
|
+
bucket: this.bucketRef.name,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else if (previous.etag !== current.etag ||
|
|
193
|
+
previous.size !== current.size ||
|
|
194
|
+
previous.lastModified.getTime() !== current.lastModified.getTime()) {
|
|
195
|
+
// Object modified - emit 'modify' event
|
|
196
|
+
this.emitChange({
|
|
197
|
+
type: 'modify',
|
|
198
|
+
key: current.key,
|
|
199
|
+
size: current.size,
|
|
200
|
+
etag: current.etag,
|
|
201
|
+
lastModified: current.lastModified,
|
|
202
|
+
bucket: this.bucketRef.name,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Detect deleted objects
|
|
207
|
+
for (const [key, previous] of this.previousState) {
|
|
208
|
+
if (!currentState.has(key)) {
|
|
209
|
+
// Object deleted - emit 'delete' event
|
|
210
|
+
this.emitChange({
|
|
211
|
+
type: 'delete',
|
|
212
|
+
key: previous.key,
|
|
213
|
+
bucket: this.bucketRef.name,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Emit a change event via both RxJS Subject and EventEmitter
|
|
220
|
+
*/
|
|
221
|
+
emitChange(event) {
|
|
222
|
+
this.rawSubject.next(event);
|
|
223
|
+
this.emit('change', event);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* List objects with full metadata (ETag, Size, LastModified)
|
|
227
|
+
* This is a private method that yields full _Object data, not just keys
|
|
228
|
+
*/
|
|
229
|
+
async *listObjectsWithMetadata() {
|
|
230
|
+
let continuationToken;
|
|
231
|
+
do {
|
|
232
|
+
if (this.isStopped) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const command = new plugins.s3.ListObjectsV2Command({
|
|
236
|
+
Bucket: this.bucketRef.name,
|
|
237
|
+
Prefix: this.prefix,
|
|
238
|
+
MaxKeys: this.pageSize,
|
|
239
|
+
ContinuationToken: continuationToken,
|
|
240
|
+
});
|
|
241
|
+
const response = await this.bucketRef.smartbucketRef.storageClient.send(command);
|
|
242
|
+
for (const obj of response.Contents || []) {
|
|
243
|
+
yield obj;
|
|
244
|
+
}
|
|
245
|
+
continuationToken = response.NextContinuationToken;
|
|
246
|
+
} while (continuationToken);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53YXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvb2JqZWN0c3RvcmFnZS9jbGFzc2VzLndhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCO0FBRXJCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLE9BQU8sYUFBYyxTQUFRLFlBQVk7SUFDN0MsOEVBQThFO0lBQ3ZFLGFBQWEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRXBELHVFQUF1RTtJQUNoRSxhQUFhLENBQXFHO0lBRXpILDhCQUE4QjtJQUN0QixVQUFVLENBQStEO0lBQ3pFLGFBQWEsQ0FBOEM7SUFDM0QsY0FBYyxHQUEwQyxJQUFJLENBQUM7SUFDN0QsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRTFCLGdCQUFnQjtJQUNDLFNBQVMsQ0FBUztJQUNsQixNQUFNLENBQVM7SUFDZixjQUFjLENBQVM7SUFDdkIsWUFBWSxDQUFVO0lBQ3RCLGNBQWMsQ0FBVTtJQUN4QixRQUFRLENBQVM7SUFFbEMsWUFBWSxTQUFpQixFQUFFLFVBQTRDLEVBQUU7UUFDM0UsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUM7UUFDckQsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFD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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as interfaces from './interfaces.js';
|
|
3
|
+
export declare const reducePathDescriptorToPath: (pathDescriptorArg: interfaces.IPathDecriptor) => Promise<string>;
|
|
4
|
+
export interface IStorageWarning {
|
|
5
|
+
code: string;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
export interface INormalizedStorageConfig {
|
|
9
|
+
endpointUrl: string;
|
|
10
|
+
host: string;
|
|
11
|
+
protocol: 'http' | 'https';
|
|
12
|
+
port?: number;
|
|
13
|
+
region: string;
|
|
14
|
+
credentials: {
|
|
15
|
+
accessKeyId: string;
|
|
16
|
+
secretAccessKey: string;
|
|
17
|
+
};
|
|
18
|
+
forcePathStyle: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function normalizeStorageDescriptor(input: plugins.tsclass.storage.IStorageDescriptor, logger?: {
|
|
21
|
+
warn: (msg: string) => void;
|
|
22
|
+
}): {
|
|
23
|
+
normalized: INormalizedStorageConfig;
|
|
24
|
+
warnings: IStorageWarning[];
|
|
25
|
+
};
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as interfaces from './interfaces.js';
|
|
3
|
+
export const reducePathDescriptorToPath = async (pathDescriptorArg) => {
|
|
4
|
+
let returnPath = ``;
|
|
5
|
+
if (pathDescriptorArg.directory) {
|
|
6
|
+
if (pathDescriptorArg.path && plugins.path.isAbsolute(pathDescriptorArg.path)) {
|
|
7
|
+
console.warn('Directory is being ignored when path is absolute.');
|
|
8
|
+
returnPath = pathDescriptorArg.path;
|
|
9
|
+
}
|
|
10
|
+
else if (pathDescriptorArg.path) {
|
|
11
|
+
returnPath = plugins.path.join(pathDescriptorArg.directory.getBasePath(), pathDescriptorArg.path);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
else if (pathDescriptorArg.path) {
|
|
15
|
+
returnPath = pathDescriptorArg.path;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
throw new Error('You must specify either a path or a directory.');
|
|
19
|
+
}
|
|
20
|
+
if (returnPath.startsWith('/')) {
|
|
21
|
+
returnPath = returnPath.substring(1);
|
|
22
|
+
}
|
|
23
|
+
return returnPath;
|
|
24
|
+
};
|
|
25
|
+
function coerceBooleanMaybe(value) {
|
|
26
|
+
if (typeof value === 'boolean')
|
|
27
|
+
return { value };
|
|
28
|
+
if (typeof value === 'string') {
|
|
29
|
+
const v = value.trim().toLowerCase();
|
|
30
|
+
if (v === 'true' || v === '1') {
|
|
31
|
+
return {
|
|
32
|
+
value: true,
|
|
33
|
+
warning: {
|
|
34
|
+
code: 'SBK_S3_COERCED_USESSL',
|
|
35
|
+
message: `Coerced useSsl='${value}' (string) to boolean true.`
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (v === 'false' || v === '0') {
|
|
40
|
+
return {
|
|
41
|
+
value: false,
|
|
42
|
+
warning: {
|
|
43
|
+
code: 'SBK_S3_COERCED_USESSL',
|
|
44
|
+
message: `Coerced useSsl='${value}' (string) to boolean false.`
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { value: undefined };
|
|
50
|
+
}
|
|
51
|
+
function coercePortMaybe(port) {
|
|
52
|
+
if (port === undefined || port === null || port === '')
|
|
53
|
+
return { value: undefined };
|
|
54
|
+
const n = typeof port === 'number' ? port : Number(String(port).trim());
|
|
55
|
+
if (!Number.isFinite(n) || !Number.isInteger(n) || n <= 0 || n > 65535) {
|
|
56
|
+
return {
|
|
57
|
+
value: undefined,
|
|
58
|
+
warning: {
|
|
59
|
+
code: 'SBK_S3_INVALID_PORT',
|
|
60
|
+
message: `Invalid port '${String(port)}' - expected integer in [1..65535].`
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return { value: n };
|
|
65
|
+
}
|
|
66
|
+
function sanitizeEndpointString(raw) {
|
|
67
|
+
const warnings = [];
|
|
68
|
+
let s = String(raw ?? '').trim();
|
|
69
|
+
if (s !== String(raw ?? '')) {
|
|
70
|
+
warnings.push({
|
|
71
|
+
code: 'SBK_S3_TRIMMED_ENDPOINT',
|
|
72
|
+
message: 'Trimmed surrounding whitespace from endpoint.'
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return { value: s, warnings };
|
|
76
|
+
}
|
|
77
|
+
function parseEndpointHostPort(endpoint, provisionalProtocol) {
|
|
78
|
+
let url;
|
|
79
|
+
const extras = {};
|
|
80
|
+
// Check if endpoint already has a scheme
|
|
81
|
+
const hasScheme = /^https?:\/\//i.test(endpoint);
|
|
82
|
+
// Try parsing as full URL first
|
|
83
|
+
try {
|
|
84
|
+
if (hasScheme) {
|
|
85
|
+
url = new URL(endpoint);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Not a full URL; try host[:port] by attaching provisional scheme
|
|
89
|
+
// Remove anything after first '/' for safety
|
|
90
|
+
const cleanEndpoint = endpoint.replace(/\/.*/, '');
|
|
91
|
+
url = new URL(`${provisionalProtocol}://${cleanEndpoint}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
throw new Error(`Unable to parse endpoint '${endpoint}'.`);
|
|
96
|
+
}
|
|
97
|
+
// Check for dropped components
|
|
98
|
+
if (url.username || url.password)
|
|
99
|
+
extras.droppedCreds = true;
|
|
100
|
+
if (url.pathname && url.pathname !== '/')
|
|
101
|
+
extras.droppedPath = true;
|
|
102
|
+
if (url.search)
|
|
103
|
+
extras.droppedQuery = true;
|
|
104
|
+
const hadScheme = hasScheme;
|
|
105
|
+
const host = url.hostname; // hostnames lowercased by URL; IPs preserved
|
|
106
|
+
const port = url.port ? Number(url.port) : undefined;
|
|
107
|
+
return { hadScheme, host, port, extras };
|
|
108
|
+
}
|
|
109
|
+
export function normalizeStorageDescriptor(input, logger) {
|
|
110
|
+
const warnings = [];
|
|
111
|
+
const logWarn = (w) => {
|
|
112
|
+
warnings.push(w);
|
|
113
|
+
if (logger) {
|
|
114
|
+
logger.warn(`[SmartBucket] ${w.code}: ${w.message}`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.warn(`[SmartBucket] ${w.code}: ${w.message}`);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
// Coerce and sanitize inputs
|
|
121
|
+
const { value: coercedUseSsl, warning: useSslWarn } = coerceBooleanMaybe(input.useSsl);
|
|
122
|
+
if (useSslWarn)
|
|
123
|
+
logWarn(useSslWarn);
|
|
124
|
+
const { value: coercedPort, warning: portWarn } = coercePortMaybe(input.port);
|
|
125
|
+
if (portWarn)
|
|
126
|
+
logWarn(portWarn);
|
|
127
|
+
const { value: endpointStr, warnings: endpointSanWarnings } = sanitizeEndpointString(input.endpoint);
|
|
128
|
+
endpointSanWarnings.forEach(logWarn);
|
|
129
|
+
if (!endpointStr) {
|
|
130
|
+
throw new Error('Storage endpoint is required (got empty string). Provide hostname or URL.');
|
|
131
|
+
}
|
|
132
|
+
// Provisional protocol selection for parsing host:port forms
|
|
133
|
+
const provisionalProtocol = coercedUseSsl === false ? 'http' : 'https';
|
|
134
|
+
const { hadScheme, host, port: epPort, extras } = parseEndpointHostPort(endpointStr, provisionalProtocol);
|
|
135
|
+
if (extras.droppedCreds) {
|
|
136
|
+
logWarn({
|
|
137
|
+
code: 'SBK_S3_DROPPED_CREDENTIALS',
|
|
138
|
+
message: 'Ignored credentials in endpoint URL.'
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
if (extras.droppedPath) {
|
|
142
|
+
logWarn({
|
|
143
|
+
code: 'SBK_S3_DROPPED_PATH',
|
|
144
|
+
message: 'Removed path segment from endpoint URL; S3 endpoint should be host[:port] only.'
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
if (extras.droppedQuery) {
|
|
148
|
+
logWarn({
|
|
149
|
+
code: 'SBK_S3_DROPPED_QUERY',
|
|
150
|
+
message: 'Removed query string from endpoint URL; S3 endpoint should be host[:port] only.'
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// Final protocol decision
|
|
154
|
+
let finalProtocol;
|
|
155
|
+
if (hadScheme) {
|
|
156
|
+
// Scheme from endpoint wins
|
|
157
|
+
const schemeFromEndpoint = endpointStr.trim().toLowerCase().startsWith('http://') ? 'http' : 'https';
|
|
158
|
+
finalProtocol = schemeFromEndpoint;
|
|
159
|
+
if (typeof coercedUseSsl === 'boolean') {
|
|
160
|
+
const expected = coercedUseSsl ? 'https' : 'http';
|
|
161
|
+
if (expected !== finalProtocol) {
|
|
162
|
+
logWarn({
|
|
163
|
+
code: 'SBK_S3_SCHEME_CONFLICT',
|
|
164
|
+
message: `useSsl=${String(coercedUseSsl)} conflicts with endpoint scheme '${finalProtocol}'; using endpoint scheme.`
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
if (typeof coercedUseSsl === 'boolean') {
|
|
171
|
+
finalProtocol = coercedUseSsl ? 'https' : 'http';
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
finalProtocol = 'https';
|
|
175
|
+
logWarn({
|
|
176
|
+
code: 'SBK_S3_GUESSED_PROTOCOL',
|
|
177
|
+
message: "No scheme in endpoint and useSsl not provided; defaulting to 'https'."
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Final port decision
|
|
182
|
+
let finalPort = undefined;
|
|
183
|
+
if (coercedPort !== undefined && epPort !== undefined && coercedPort !== epPort) {
|
|
184
|
+
logWarn({
|
|
185
|
+
code: 'SBK_S3_PORT_CONFLICT',
|
|
186
|
+
message: `Port in config (${coercedPort}) conflicts with endpoint port (${epPort}); using config port.`
|
|
187
|
+
});
|
|
188
|
+
finalPort = coercedPort;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
finalPort = (coercedPort !== undefined) ? coercedPort : epPort;
|
|
192
|
+
}
|
|
193
|
+
// Build canonical endpoint URL (origin only, no trailing slash)
|
|
194
|
+
const url = new URL(`${finalProtocol}://${host}`);
|
|
195
|
+
if (finalPort !== undefined)
|
|
196
|
+
url.port = String(finalPort);
|
|
197
|
+
const endpointUrl = url.origin;
|
|
198
|
+
const region = input.region || 'us-east-1';
|
|
199
|
+
return {
|
|
200
|
+
normalized: {
|
|
201
|
+
endpointUrl,
|
|
202
|
+
host,
|
|
203
|
+
protocol: finalProtocol,
|
|
204
|
+
port: finalPort,
|
|
205
|
+
region,
|
|
206
|
+
credentials: {
|
|
207
|
+
accessKeyId: input.accessKey,
|
|
208
|
+
secretAccessKey: input.accessSecret,
|
|
209
|
+
},
|
|
210
|
+
forcePathStyle: true,
|
|
211
|
+
},
|
|
212
|
+
warnings,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL29iamVjdHN0b3JhZ2UvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEtBQUssRUFBRSxpQkFBNEMsRUFBbUIsRUFBRTtJQUNoSCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUE7SUFDbkIsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLGlCQUFpQixDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlFLE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELENBQUMsQ0FBQztZQUNsRSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ3RDLENBQUM7YUFBTSxJQUFJLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEcsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQy9CLFVBQVUsR0FBRyxVQUFVLENB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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './classes.smartbucket.js';
|
|
2
|
+
export * from './classes.bucket.js';
|
|
3
|
+
export * from './classes.exactuploaderror.js';
|
|
4
|
+
export * from './classes.exactpathpurgeerror.js';
|
|
5
|
+
export * from './classes.directory.js';
|
|
6
|
+
export * from './classes.file.js';
|
|
7
|
+
export * from './classes.listcursor.js';
|
|
8
|
+
export * from './classes.metadata.js';
|
|
9
|
+
export * from './classes.trash.js';
|
|
10
|
+
export * from './classes.watcher.js';
|
|
11
|
+
export * from './interfaces.js';
|
|
12
|
+
export { ObjectStorageConnection } from './classes.connection.js';
|
|
13
|
+
export type { IObjectStorageConnectionOptions } from './classes.connection.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './classes.smartbucket.js';
|
|
2
|
+
export * from './classes.bucket.js';
|
|
3
|
+
export * from './classes.exactuploaderror.js';
|
|
4
|
+
export * from './classes.exactpathpurgeerror.js';
|
|
5
|
+
export * from './classes.directory.js';
|
|
6
|
+
export * from './classes.file.js';
|
|
7
|
+
export * from './classes.listcursor.js';
|
|
8
|
+
export * from './classes.metadata.js';
|
|
9
|
+
export * from './classes.trash.js';
|
|
10
|
+
export * from './classes.watcher.js';
|
|
11
|
+
export * from './interfaces.js';
|
|
12
|
+
export { ObjectStorageConnection } from './classes.connection.js';
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9vYmplY3RzdG9yYWdlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQyJ9
|