@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.
Files changed (255) hide show
  1. package/.smartconfig.json +37 -0
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/classes.losslessorgclient.d.ts +32 -0
  5. package/dist_ts/classes.losslessorgclient.js +103 -0
  6. package/dist_ts/core/classes.error.d.ts +16 -0
  7. package/dist_ts/core/classes.error.js +29 -0
  8. package/dist_ts/core/classes.operation.d.ts +17 -0
  9. package/dist_ts/core/classes.operation.js +70 -0
  10. package/dist_ts/core/interfaces.d.ts +18 -0
  11. package/dist_ts/core/interfaces.js +2 -0
  12. package/dist_ts/index.d.ts +4 -0
  13. package/dist_ts/index.js +3 -0
  14. package/dist_ts/nosqldb/classes.atomicdelete.d.ts +26 -0
  15. package/dist_ts/nosqldb/classes.atomicdelete.js +44 -0
  16. package/dist_ts/nosqldb/classes.atomicfindoneandupdate.d.ts +27 -0
  17. package/dist_ts/nosqldb/classes.atomicfindoneandupdate.js +86 -0
  18. package/dist_ts/nosqldb/classes.atomicupdate.d.ts +26 -0
  19. package/dist_ts/nosqldb/classes.atomicupdate.js +55 -0
  20. package/dist_ts/nosqldb/classes.bootstraprecord.d.ts +14 -0
  21. package/dist_ts/nosqldb/classes.bootstraprecord.js +80 -0
  22. package/dist_ts/nosqldb/classes.bsonassertion.d.ts +2 -0
  23. package/dist_ts/nosqldb/classes.bsonassertion.js +29 -0
  24. package/dist_ts/nosqldb/classes.bsonobjectid.d.ts +2 -0
  25. package/dist_ts/nosqldb/classes.bsonobjectid.js +50 -0
  26. package/dist_ts/nosqldb/classes.bsonsnapshot.d.ts +3 -0
  27. package/dist_ts/nosqldb/classes.bsonsnapshot.js +126 -0
  28. package/dist_ts/nosqldb/classes.cached-document.d.ts +27 -0
  29. package/dist_ts/nosqldb/classes.cached-document.js +112 -0
  30. package/dist_ts/nosqldb/classes.collection.d.ts +302 -0
  31. package/dist_ts/nosqldb/classes.collection.js +1568 -0
  32. package/dist_ts/nosqldb/classes.collectionfactory.d.ts +30 -0
  33. package/dist_ts/nosqldb/classes.collectionfactory.js +65 -0
  34. package/dist_ts/nosqldb/classes.collectionlifecycle.d.ts +4 -0
  35. package/dist_ts/nosqldb/classes.collectionlifecycle.js +15 -0
  36. package/dist_ts/nosqldb/classes.collectionpreparation.d.ts +34 -0
  37. package/dist_ts/nosqldb/classes.collectionpreparation.js +134 -0
  38. package/dist_ts/nosqldb/classes.collectiontopology.d.ts +47 -0
  39. package/dist_ts/nosqldb/classes.collectiontopology.js +388 -0
  40. package/dist_ts/nosqldb/classes.connection.d.ts +18 -0
  41. package/dist_ts/nosqldb/classes.connection.js +23 -0
  42. package/dist_ts/nosqldb/classes.convenience.d.ts +1 -0
  43. package/dist_ts/nosqldb/classes.convenience.js +5 -0
  44. package/dist_ts/nosqldb/classes.cursor.d.ts +15 -0
  45. package/dist_ts/nosqldb/classes.cursor.js +82 -0
  46. package/dist_ts/nosqldb/classes.cursoroperation.d.ts +7 -0
  47. package/dist_ts/nosqldb/classes.cursoroperation.js +36 -0
  48. package/dist_ts/nosqldb/classes.db.d.ts +98 -0
  49. package/dist_ts/nosqldb/classes.db.js +434 -0
  50. package/dist_ts/nosqldb/classes.distributedcoordinator.d.ts +52 -0
  51. package/dist_ts/nosqldb/classes.distributedcoordinator.js +314 -0
  52. package/dist_ts/nosqldb/classes.doc.d.ts +722 -0
  53. package/dist_ts/nosqldb/classes.doc.js +2976 -0
  54. package/dist_ts/nosqldb/classes.easystore.d.ts +42 -0
  55. package/dist_ts/nosqldb/classes.easystore.js +199 -0
  56. package/dist_ts/nosqldb/classes.exactpersistence.d.ts +141 -0
  57. package/dist_ts/nosqldb/classes.exactpersistence.js +1110 -0
  58. package/dist_ts/nosqldb/classes.lucene.adapter.d.ts +173 -0
  59. package/dist_ts/nosqldb/classes.lucene.adapter.js +623 -0
  60. package/dist_ts/nosqldb/classes.mongoadministration.d.ts +73 -0
  61. package/dist_ts/nosqldb/classes.mongoadministration.js +497 -0
  62. package/dist_ts/nosqldb/classes.namespaceinspection.d.ts +42 -0
  63. package/dist_ts/nosqldb/classes.namespaceinspection.js +138 -0
  64. package/dist_ts/nosqldb/classes.operationbudget.d.ts +22 -0
  65. package/dist_ts/nosqldb/classes.operationbudget.js +65 -0
  66. package/dist_ts/nosqldb/classes.ordinarypersistence.d.ts +18 -0
  67. package/dist_ts/nosqldb/classes.ordinarypersistence.js +71 -0
  68. package/dist_ts/nosqldb/classes.persistence.d.ts +14 -0
  69. package/dist_ts/nosqldb/classes.persistence.js +34 -0
  70. package/dist_ts/nosqldb/classes.session.d.ts +28 -0
  71. package/dist_ts/nosqldb/classes.session.js +246 -0
  72. package/dist_ts/nosqldb/classes.storedinspection.d.ts +44 -0
  73. package/dist_ts/nosqldb/classes.storedinspection.js +100 -0
  74. package/dist_ts/nosqldb/classes.testdatabase.d.ts +56 -0
  75. package/dist_ts/nosqldb/classes.testdatabase.js +250 -0
  76. package/dist_ts/nosqldb/classes.watcher.d.ts +37 -0
  77. package/dist_ts/nosqldb/classes.watcher.js +98 -0
  78. package/dist_ts/nosqldb/index.d.ts +27 -0
  79. package/dist_ts/nosqldb/index.js +18 -0
  80. package/dist_ts/nosqldb/logging.d.ts +2 -0
  81. package/dist_ts/nosqldb/logging.js +3 -0
  82. package/dist_ts/nosqldb/plugins.d.ts +17 -0
  83. package/dist_ts/nosqldb/plugins.js +20 -0
  84. package/dist_ts/nosqldb/shim.d.ts +1 -0
  85. package/dist_ts/nosqldb/shim.js +8 -0
  86. package/dist_ts/nosqldb/testsupport.d.ts +3 -0
  87. package/dist_ts/nosqldb/testsupport.js +3 -0
  88. package/dist_ts/objectstorage/classes.bucket.d.ts +227 -0
  89. package/dist_ts/objectstorage/classes.bucket.js +939 -0
  90. package/dist_ts/objectstorage/classes.connection.d.ts +21 -0
  91. package/dist_ts/objectstorage/classes.connection.js +27 -0
  92. package/dist_ts/objectstorage/classes.directory.d.ts +124 -0
  93. package/dist_ts/objectstorage/classes.directory.js +335 -0
  94. package/dist_ts/objectstorage/classes.exactpathpurgeerror.d.ts +5 -0
  95. package/dist_ts/objectstorage/classes.exactpathpurgeerror.js +18 -0
  96. package/dist_ts/objectstorage/classes.exactuploaderror.d.ts +5 -0
  97. package/dist_ts/objectstorage/classes.exactuploaderror.js +19 -0
  98. package/dist_ts/objectstorage/classes.file.d.ts +91 -0
  99. package/dist_ts/objectstorage/classes.file.js +255 -0
  100. package/dist_ts/objectstorage/classes.listcursor.d.ts +41 -0
  101. package/dist_ts/objectstorage/classes.listcursor.js +67 -0
  102. package/dist_ts/objectstorage/classes.metadata.d.ts +57 -0
  103. package/dist_ts/objectstorage/classes.metadata.js +113 -0
  104. package/dist_ts/objectstorage/classes.smartbucket.d.ts +57 -0
  105. package/dist_ts/objectstorage/classes.smartbucket.js +357 -0
  106. package/dist_ts/objectstorage/classes.trash.d.ts +11 -0
  107. package/dist_ts/objectstorage/classes.trash.js +22 -0
  108. package/dist_ts/objectstorage/classes.watcher.d.ts +79 -0
  109. package/dist_ts/objectstorage/classes.watcher.js +249 -0
  110. package/dist_ts/objectstorage/helpers.d.ts +25 -0
  111. package/dist_ts/objectstorage/helpers.js +215 -0
  112. package/dist_ts/objectstorage/index.d.ts +13 -0
  113. package/dist_ts/objectstorage/index.js +13 -0
  114. package/dist_ts/objectstorage/interfaces.d.ts +276 -0
  115. package/dist_ts/objectstorage/interfaces.js +2 -0
  116. package/dist_ts/objectstorage/internal.exactpathpurge.operations.d.ts +11 -0
  117. package/dist_ts/objectstorage/internal.exactpathpurge.operations.js +1069 -0
  118. package/dist_ts/objectstorage/internal.exactupload.capability.d.ts +40 -0
  119. package/dist_ts/objectstorage/internal.exactupload.capability.js +382 -0
  120. package/dist_ts/objectstorage/internal.exactupload.operations.d.ts +11 -0
  121. package/dist_ts/objectstorage/internal.exactupload.operations.js +1104 -0
  122. package/dist_ts/objectstorage/internal.multipart.planner.d.ts +8 -0
  123. package/dist_ts/objectstorage/internal.multipart.planner.js +63 -0
  124. package/dist_ts/objectstorage/internal.multipart.stream.d.ts +17 -0
  125. package/dist_ts/objectstorage/internal.multipart.stream.js +440 -0
  126. package/dist_ts/objectstorage/internal.multipart.types.d.ts +82 -0
  127. package/dist_ts/objectstorage/internal.multipart.types.js +2 -0
  128. package/dist_ts/objectstorage/plugins.d.ts +17 -0
  129. package/dist_ts/objectstorage/plugins.js +23 -0
  130. package/dist_ts/plugins.d.ts +4 -0
  131. package/dist_ts/plugins.js +5 -0
  132. package/dist_ts/sqldb/classes.clickhouseconnection.d.ts +39 -0
  133. package/dist_ts/sqldb/classes.clickhouseconnection.js +225 -0
  134. package/dist_ts/sqldb/classes.sqlconnection.d.ts +50 -0
  135. package/dist_ts/sqldb/classes.sqlconnection.js +376 -0
  136. package/dist_ts/sqldb/classes.sqltable.d.ts +29 -0
  137. package/dist_ts/sqldb/classes.sqltable.js +70 -0
  138. package/dist_ts/sqldb/clickhouse/classes.metricwriter.d.ts +27 -0
  139. package/dist_ts/sqldb/clickhouse/classes.metricwriter.js +89 -0
  140. package/dist_ts/sqldb/clickhouse/index.d.ts +9 -0
  141. package/dist_ts/sqldb/clickhouse/index.js +13 -0
  142. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.d.ts +88 -0
  143. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.js +304 -0
  144. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.d.ts +28 -0
  145. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.js +46 -0
  146. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.d.ts +43 -0
  147. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.js +155 -0
  148. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.resultset.d.ts +13 -0
  149. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.resultset.js +36 -0
  150. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.d.ts +49 -0
  151. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.js +106 -0
  152. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.d.ts +51 -0
  153. package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.js +96 -0
  154. package/dist_ts/sqldb/clickhouse/smartclickhouse.plugins.d.ts +5 -0
  155. package/dist_ts/sqldb/clickhouse/smartclickhouse.plugins.js +6 -0
  156. package/dist_ts/sqldb/clickhouse/smartclickhouse.types.d.ts +53 -0
  157. package/dist_ts/sqldb/clickhouse/smartclickhouse.types.js +41 -0
  158. package/dist_ts/sqldb/index.d.ts +6 -0
  159. package/dist_ts/sqldb/index.js +6 -0
  160. package/dist_ts/sqldb/interfaces.d.ts +53 -0
  161. package/dist_ts/sqldb/interfaces.js +19 -0
  162. package/dist_ts/sqldb/internal.sqlpool.d.ts +51 -0
  163. package/dist_ts/sqldb/internal.sqlpool.js +214 -0
  164. package/dist_ts/sqldb/plugins.clickhouse.d.ts +4 -0
  165. package/dist_ts/sqldb/plugins.clickhouse.js +5 -0
  166. package/dist_ts/sqldb/plugins.mariadb.d.ts +4 -0
  167. package/dist_ts/sqldb/plugins.mariadb.js +5 -0
  168. package/docs/source/smartbucket/license.md +19 -0
  169. package/docs/source/smartclickhouse/license.md +19 -0
  170. package/license.md +21 -0
  171. package/package.json +101 -0
  172. package/readme.md +157 -0
  173. package/ts/00_commitinfo_data.ts +8 -0
  174. package/ts/classes.losslessorgclient.ts +104 -0
  175. package/ts/core/classes.error.ts +31 -0
  176. package/ts/core/classes.operation.ts +60 -0
  177. package/ts/core/interfaces.ts +24 -0
  178. package/ts/index.ts +4 -0
  179. package/ts/nosqldb/classes.atomicdelete.ts +81 -0
  180. package/ts/nosqldb/classes.atomicfindoneandupdate.ts +152 -0
  181. package/ts/nosqldb/classes.atomicupdate.ts +99 -0
  182. package/ts/nosqldb/classes.bootstraprecord.ts +107 -0
  183. package/ts/nosqldb/classes.bsonassertion.ts +25 -0
  184. package/ts/nosqldb/classes.bsonobjectid.ts +45 -0
  185. package/ts/nosqldb/classes.bsonsnapshot.ts +105 -0
  186. package/ts/nosqldb/classes.cached-document.ts +67 -0
  187. package/ts/nosqldb/classes.collection.ts +2399 -0
  188. package/ts/nosqldb/classes.collectionfactory.ts +87 -0
  189. package/ts/nosqldb/classes.collectionlifecycle.ts +24 -0
  190. package/ts/nosqldb/classes.collectionpreparation.ts +164 -0
  191. package/ts/nosqldb/classes.collectiontopology.ts +645 -0
  192. package/ts/nosqldb/classes.connection.ts +31 -0
  193. package/ts/nosqldb/classes.convenience.ts +5 -0
  194. package/ts/nosqldb/classes.cursor.ts +88 -0
  195. package/ts/nosqldb/classes.cursoroperation.ts +38 -0
  196. package/ts/nosqldb/classes.db.ts +637 -0
  197. package/ts/nosqldb/classes.distributedcoordinator.ts +305 -0
  198. package/ts/nosqldb/classes.doc.ts +4928 -0
  199. package/ts/nosqldb/classes.easystore.ts +154 -0
  200. package/ts/nosqldb/classes.exactpersistence.ts +1974 -0
  201. package/ts/nosqldb/classes.lucene.adapter.ts +780 -0
  202. package/ts/nosqldb/classes.mongoadministration.ts +867 -0
  203. package/ts/nosqldb/classes.namespaceinspection.ts +199 -0
  204. package/ts/nosqldb/classes.operationbudget.ts +75 -0
  205. package/ts/nosqldb/classes.ordinarypersistence.ts +84 -0
  206. package/ts/nosqldb/classes.persistence.ts +62 -0
  207. package/ts/nosqldb/classes.session.ts +389 -0
  208. package/ts/nosqldb/classes.storedinspection.ts +151 -0
  209. package/ts/nosqldb/classes.testdatabase.ts +272 -0
  210. package/ts/nosqldb/classes.watcher.ts +96 -0
  211. package/ts/nosqldb/index.ts +51 -0
  212. package/ts/nosqldb/logging.ts +3 -0
  213. package/ts/nosqldb/plugins.ts +37 -0
  214. package/ts/nosqldb/shim.ts +6 -0
  215. package/ts/nosqldb/testsupport.ts +13 -0
  216. package/ts/objectstorage/classes.bucket.ts +1114 -0
  217. package/ts/objectstorage/classes.connection.ts +36 -0
  218. package/ts/objectstorage/classes.directory.ts +425 -0
  219. package/ts/objectstorage/classes.exactpathpurgeerror.ts +24 -0
  220. package/ts/objectstorage/classes.exactuploaderror.ts +25 -0
  221. package/ts/objectstorage/classes.file.ts +303 -0
  222. package/ts/objectstorage/classes.listcursor.ts +89 -0
  223. package/ts/objectstorage/classes.metadata.ts +134 -0
  224. package/ts/objectstorage/classes.smartbucket.ts +445 -0
  225. package/ts/objectstorage/classes.trash.ts +30 -0
  226. package/ts/objectstorage/classes.watcher.ts +289 -0
  227. package/ts/objectstorage/helpers.ts +254 -0
  228. package/ts/objectstorage/index.ts +13 -0
  229. package/ts/objectstorage/interfaces.ts +389 -0
  230. package/ts/objectstorage/internal.exactpathpurge.operations.ts +1936 -0
  231. package/ts/objectstorage/internal.exactupload.capability.ts +580 -0
  232. package/ts/objectstorage/internal.exactupload.operations.ts +1715 -0
  233. package/ts/objectstorage/internal.multipart.planner.ts +90 -0
  234. package/ts/objectstorage/internal.multipart.stream.ts +606 -0
  235. package/ts/objectstorage/internal.multipart.types.ts +106 -0
  236. package/ts/objectstorage/plugins.ts +35 -0
  237. package/ts/plugins.ts +4 -0
  238. package/ts/sqldb/classes.clickhouseconnection.ts +189 -0
  239. package/ts/sqldb/classes.sqlconnection.ts +350 -0
  240. package/ts/sqldb/classes.sqltable.ts +70 -0
  241. package/ts/sqldb/clickhouse/classes.metricwriter.ts +72 -0
  242. package/ts/sqldb/clickhouse/index.ts +16 -0
  243. package/ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.ts +372 -0
  244. package/ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.ts +52 -0
  245. package/ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.ts +120 -0
  246. package/ts/sqldb/clickhouse/smartclickhouse.classes.resultset.ts +44 -0
  247. package/ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.ts +123 -0
  248. package/ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.ts +114 -0
  249. package/ts/sqldb/clickhouse/smartclickhouse.plugins.ts +5 -0
  250. package/ts/sqldb/clickhouse/smartclickhouse.types.ts +134 -0
  251. package/ts/sqldb/index.ts +6 -0
  252. package/ts/sqldb/interfaces.ts +61 -0
  253. package/ts/sqldb/internal.sqlpool.ts +179 -0
  254. package/ts/sqldb/plugins.clickhouse.ts +4 -0
  255. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGJ1Y2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL29iamVjdHN0b3JhZ2UvY2xhc3Nlcy5zbWFydGJ1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5QkFBeUI7QUFFekIsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDhCQUE4QixFQUM5QiwrQkFBK0IsRUFDL0IsMEJBQTBCLEVBQzFCLHVDQUF1QyxFQUN2Qyx3Q0FBd0MsR0FDekMsTUFBTSxzQ0FBc0MsQ0FBQztBQVc5QyxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQztBQUN4QyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUV6QyxNQUFNLE9BQU8sV0FBVztJQUNmLE1BQU0sQ0FBNkM7SUFFbEQsb0JBQW9CLENBQXNCO0lBQzFDLGtCQUFrQixDQUFzQjtJQUN4QyxjQUFjLEdBQStCLE1BQU0sQ0FBQztJQUNwRCxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ3hELHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0lBQzNELCtCQUErQixHQUFHLEtBQUssQ0FBQztJQUN4QyxZQUFZLENBQTRCO0lBQ3hDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUM5Qix3QkFBd0IsQ0FBNEI7SUFFNUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxhQUFhLENBQUMsZ0JBQXFDO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksU0FBUyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELElBQUksZ0JBQWdCLEtBQUssSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDbkQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQztRQUM1QyxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUM7WUFDSCx1Q0FBdUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQztZQUM3Qyw4QkFBOEIsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN2RCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQix3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLCtCQUErQixHQUFHLEtBQUssQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxTQUFxRCxFQUFFLGdCQUE4QyxFQUFFO1FBQ2pILElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBRXhCLHdEQUF3RDtRQUN4RCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsMEJBQTBCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDbEQsUUFBUSxFQUFFLFVBQVUsQ0FBQyxXQUFXO1lBQ2hDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtZQUN6QixXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7WUFDbkMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjLElBQUksVUFBVSxDQUFDLGNBQWM7U0FDMUUsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUNwRCwwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBcUI7UUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQWtCO1FBQzFDLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxhQUFxQjtRQUNoRCxPQUFPLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBcUI7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDakYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0JBQW9CLENBQUMsZ0JBQXFDO1FBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksU0FBUyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxJQUNFLGdCQUFnQixLQUFLLElBQUksQ0FBQyxvQkFBb0I7WUFDOUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLGtCQUFrQixFQUM1QyxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsK0JBQStCLEdBQUcsSUFBSSxDQUFDO1FBQzVDLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQztZQUNILHVDQUF1QyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLGdCQUFnQixLQUFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDM0QsSUFBSSxDQUFDO29CQUNILDBCQUEwQixDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN2QyxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsbUVBQW1FO29CQUNuRSw2REFBNkQ7b0JBQzdELGdCQUFnQixHQUFHLEtBQUssQ0FBQztvQkFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7b0JBQ2xDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbkUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztvQkFDbEMsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO1lBQzdDLDhCQUE4QixDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3ZELGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDcEMsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQix3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLCtCQUErQixHQUFHLEtBQUssQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGNBQWMsQ0FDekIsYUFBcUIsRUFDckIsYUFBMkMsRUFBRTtRQUU3QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFDRSxPQUFPLGFBQWEsS0FBSyxRQUFRO1lBQ2pDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUMxQixhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssYUFBYSxFQUN0QyxDQUFDO1lBQ0QsTUFBTSxJQUFJLFNBQVMsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxJQUFJLHlCQUF5QixDQUFDO1FBQ3BFLElBQ0UsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUNoQyxTQUFTLElBQUksQ0FBQztZQUNkLFNBQVMsR0FBRyx5QkFBeUIsRUFDckMsQ0FBQztZQUNELE1BQU0sSUFBSSxTQUFTLENBQ2pCLHVFQUF1RSx5QkFBeUIsR0FBRyxDQUNwRyxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQzNELElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDM0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ2hELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNsRCxJQUFJLFdBQXlELENBQUM7UUFFOUQsTUFBTSxjQUFjLEdBQUcsR0FBUyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUN6QixDQUFDO1lBQ0QsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDO1FBRUYsWUFBWSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsV0FBVyxHQUFHLFVBQVUsQ0FBQztZQUMzQixDQUFDO1lBQ0QsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXpELElBQUksV0FBNkMsQ0FBQztRQUNsRCxJQUFJLENBQUM7WUFDSCxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQ3pDLGFBQWEsRUFDYixhQUFhLEVBQ2IsbUJBQW1CLENBQUMsTUFBTSxDQUMzQixDQUFDO1FBQ0osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVCLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2hGLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixJQUFJLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxJQUFJLFdBQVcsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELElBQUksV0FBVyxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLE9BQU87WUFDZixVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVM7U0FDMUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLFlBQXlCLENBQUM7UUFDOUIsSUFBSSxXQUF5QyxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3pELFlBQVksR0FBRyxPQUFPLENBQUM7WUFDdkIsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBRWpDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLEdBQVMsRUFBRTtZQUM3QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7Z0JBQy9CLFlBQVksRUFBRSxDQUFDO1lBQ2pCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNsQyxLQUFLLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBQ0QsS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUMzQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxlQUFlLENBQUMsZ0JBQXlCO1FBQy9DLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdEUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxzQkFBc0IsR0FBRyxnQkFHOUIsQ0FBQztRQUNGLE9BQU8sQ0FDTCxPQUFPLHNCQUFzQixDQUFDLElBQUksS0FBSyxVQUFVO1lBQ2pELE9BQU8sc0JBQXNCLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFFTywwQkFBMEI7UUFDaEMsS0FBSyxNQUFNLG1CQUFtQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQ3hCLGdCQUFxQyxFQUNyQyxhQUFxQixFQUNyQixTQUFzQjtRQUV0QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sTUFBTSxHQUFHLENBQUMsVUFBNEMsRUFBUSxFQUFFO2dCQUNwRSxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNmLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztnQkFDNUQsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsQ0FBQztZQUNGLE1BQU0sbUJBQW1CLEdBQUcsR0FBUyxFQUFFO2dCQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEIsQ0FBQyxDQUFDO1lBRUYsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN0QixtQkFBbUIsRUFBRSxDQUFDO2dCQUN0QixPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQzNDLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDL0IsTUFBTSxFQUFFLGFBQWE7aUJBQ3RCLENBQUMsRUFDRjtvQkFDRSxXQUFXLEVBQUUsU0FBUztpQkFDdkIsQ0FDRixDQUFDO2dCQUNGLEtBQUssZUFBZSxDQUFDLElBQUksQ0FDdkIsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUNyQixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQzVCLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sMkJBQTJCO1FBR2pDLFFBQVEsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVCLEtBQUssTUFBTTtnQkFDVCxPQUFPLFNBQVMsQ0FBQztZQUNuQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sUUFBUSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRU8sdUJBQXVCLENBQzdCLGlCQUF5QixFQUN6QixnQkFBcUM7UUFFckMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDM0QsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFDRSxJQUFJLENBQUMsY0FBYyxLQUFLLGlCQUFpQjtZQUN6QyxJQUFJLENBQUMsb0JBQW9CLEtBQUssZ0JBQWdCLEVBQzlDLENBQUM7WUFDRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixTQUE2QyxFQUM3QyxZQUFvQjtRQUVwQixPQUFPO1lBQ0wsS0FBSyxFQUFFLEtBQUs7WUFDWixNQUFNLEVBQUUsYUFBYTtZQUNyQixNQUFNLEVBQUUsU0FBUztZQUNqQixVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLFlBQVk7U0FDN0MsQ0FBQztJQUNKLENBQUM7Q0FDRiJ9
@@ -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
+ }