@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,98 @@
1
+ import * as plugins from './plugins.js';
2
+ import { SmartdataCollection } from './classes.collection.js';
3
+ import { EasyStore } from './classes.easystore.js';
4
+ import { SmartdataMongoAdministration } from './classes.mongoadministration.js';
5
+ import { SmartdataSession } from './classes.session.js';
6
+ import { collectionTopologyDbInspectionSymbol } from './classes.collectiontopology.js';
7
+ import { type ISmartdataNamespaceInspectionOptions, type ISmartdataNamespaceInspection } from './classes.namespaceinspection.js';
8
+ export { SmartdataSession } from './classes.session.js';
9
+ export type { TSmartdataOrdinarySession } from './classes.session.js';
10
+ /**
11
+ * interface - indicates the connection status of the db
12
+ */
13
+ export type TConnectionStatus = 'initial' | 'disconnected' | 'connected' | 'failed';
14
+ export interface ISmartdataReadinessOptions {
15
+ timeoutMs?: number;
16
+ signal?: AbortSignal;
17
+ }
18
+ export interface ISmartdataInitOptions {
19
+ /** Bounds connection setup; cleanup is always joined before the call settles. */
20
+ timeoutMs?: number;
21
+ signal?: AbortSignal;
22
+ }
23
+ export interface ISmartdataCloseOptions {
24
+ /** Total deadline for removal, including preceding session cleanup (1..120000 ms). */
25
+ timeoutMs?: number;
26
+ dropDatabase?: {
27
+ expectedDatabaseName: string;
28
+ };
29
+ }
30
+ export type TSmartdataReadinessFailureReason = 'not_initialized' | 'connecting' | 'connection_failed' | 'closing' | 'closed' | 'close_failed' | 'aborted' | 'timeout' | 'unavailable';
31
+ export type TSmartdataReadinessResult = {
32
+ ready: true;
33
+ status: 'ready';
34
+ durationMs: number;
35
+ } | {
36
+ ready: false;
37
+ status: 'unavailable';
38
+ reason: TSmartdataReadinessFailureReason;
39
+ durationMs: number;
40
+ };
41
+ export declare class SmartdataDb {
42
+ smartdataOptions: plugins.tsclass.database.IMongoDescriptor;
43
+ mongoDbClient: plugins.mongodb.MongoClient;
44
+ mongoDb: plugins.mongodb.Db;
45
+ status: TConnectionStatus;
46
+ statusConnectedDeferred: plugins.smartpromise.Deferred<void>;
47
+ smartdataCollectionMap: plugins.lik.ObjectMap<SmartdataCollection<any>>;
48
+ private lifecycleState;
49
+ private lifecycleEpoch;
50
+ private activeLifecycleOperation;
51
+ private pendingClient?;
52
+ constructor(smartdataOptions: plugins.tsclass.database.IMongoDescriptor);
53
+ createEasyStore<T = unknown>(nameIdArg: string): Promise<EasyStore<T>>;
54
+ /**
55
+ * connects to the database that was specified during instance creation
56
+ */
57
+ init(optionsArg?: ISmartdataInitOptions): Promise<void>;
58
+ /**
59
+ * closes the connection to the databse
60
+ */
61
+ close(optionsArg?: ISmartdataCloseOptions): Promise<void>;
62
+ /**
63
+ * Performs a bounded, read-only round trip to verify database readiness.
64
+ */
65
+ checkReadiness(optionsArg?: ISmartdataReadinessOptions): Promise<TSmartdataReadinessResult>;
66
+ /**
67
+ * Starts a raw MongoDB session. Use createSession() when every transaction
68
+ * operation goes through SmartData and stable persistence errors are needed.
69
+ */
70
+ startSession(): plugins.mongodb.ClientSession;
71
+ /**
72
+ * Creates a SmartData-owned session for model transactions.
73
+ */
74
+ createSession(): SmartdataSession;
75
+ /**
76
+ * Creates a narrowly scoped MongoDB administration facade bound to this
77
+ * SmartData lifecycle. Applications never need direct driver access.
78
+ */
79
+ createMongoAdministration(): SmartdataMongoAdministration;
80
+ /** Observe all namespaces, indexes and bounded counts without initializing models. */
81
+ inspectNamespace(optionsArg?: ISmartdataNamespaceInspectionOptions): Promise<ISmartdataNamespaceInspection>;
82
+ /** @internal Runs inspection or explicit model preparation against one connection generation. */
83
+ [collectionTopologyDbInspectionSymbol]<TResult>(operationArg: (mongoDbArg: plugins.mongodb.Db, assertCurrentArg: () => void) => Promise<TResult>): Promise<TResult>;
84
+ addCollection(SmartdataCollectionArg: SmartdataCollection<any>): void;
85
+ /**
86
+ * Gets a collection's name and returns a SmartdataCollection instance
87
+ * @param nameArg
88
+ * @returns DbTable
89
+ */
90
+ getSmartdataCollectionByName<T>(nameArg: string): Promise<SmartdataCollection<T>>;
91
+ private beginLifecycleOperation;
92
+ private assertLifecycleOperationCanBegin;
93
+ private resolveDatabaseToDrop;
94
+ private endLifecycleOperation;
95
+ private transitionLifecycle;
96
+ private getReadinessLifecycleReason;
97
+ private createReadinessFailure;
98
+ }
@@ -0,0 +1,434 @@
1
+ import * as plugins from './plugins.js';
2
+ import { SmartdataCollection } from './classes.collection.js';
3
+ import { EasyStore } from './classes.easystore.js';
4
+ import { SmartdataPersistenceError } from './classes.persistence.js';
5
+ import { SmartdataMongoAdministration } from './classes.mongoadministration.js';
6
+ import { createSmartdataSession, invalidateSmartdataSessions, SmartdataSession, unwrapSmartdataSessionInvalidationErrors, } from './classes.session.js';
7
+ import { collectionTopologyDbInspectionSymbol } from './classes.collectiontopology.js';
8
+ import { inspectSmartdataNamespace, } from './classes.namespaceinspection.js';
9
+ export { SmartdataSession } from './classes.session.js';
10
+ import { logger } from './logging.js';
11
+ import { assertDataOptions, SmartdataOperationBudget } from './classes.operationbudget.js';
12
+ const readinessDefaultTimeoutMs = 2_000;
13
+ const readinessMaximumTimeoutMs = 30_000;
14
+ const assertExactDataObject = (valueArg, expectedKeysArg, descriptionArg, allowEmptyArg = false) => {
15
+ if (valueArg === null ||
16
+ typeof valueArg !== 'object' ||
17
+ Array.isArray(valueArg) ||
18
+ Object.getPrototypeOf(valueArg) !== Object.prototype) {
19
+ throw new SmartdataPersistenceError('invalid_argument', `${descriptionArg} must be a plain object.`);
20
+ }
21
+ const keys = Reflect.ownKeys(valueArg);
22
+ if ((!allowEmptyArg && keys.length !== expectedKeysArg.length) ||
23
+ (allowEmptyArg && keys.length !== 0 && keys.length !== expectedKeysArg.length) ||
24
+ keys.some((keyArg) => typeof keyArg !== 'string' || !expectedKeysArg.includes(keyArg))) {
25
+ throw new SmartdataPersistenceError('invalid_argument', `${descriptionArg} has an invalid shape.`);
26
+ }
27
+ for (const key of keys) {
28
+ const descriptor = Object.getOwnPropertyDescriptor(valueArg, key);
29
+ if (!descriptor || !('value' in descriptor)) {
30
+ throw new SmartdataPersistenceError('invalid_argument', `${descriptionArg} must contain data properties only.`);
31
+ }
32
+ }
33
+ return valueArg;
34
+ };
35
+ export class SmartdataDb {
36
+ smartdataOptions;
37
+ mongoDbClient;
38
+ mongoDb;
39
+ status;
40
+ statusConnectedDeferred = plugins.smartpromise.defer();
41
+ smartdataCollectionMap = new plugins.lik.ObjectMap();
42
+ lifecycleState = 'initial';
43
+ lifecycleEpoch = 0;
44
+ activeLifecycleOperation = null;
45
+ pendingClient;
46
+ constructor(smartdataOptions) {
47
+ this.smartdataOptions = smartdataOptions;
48
+ this.status = 'initial';
49
+ void this.statusConnectedDeferred.promise.catch(() => { });
50
+ }
51
+ // easystore
52
+ async createEasyStore(nameIdArg) {
53
+ const easyStore = new EasyStore(nameIdArg, this);
54
+ return easyStore;
55
+ }
56
+ // basic connection stuff ----------------------------------------------
57
+ /**
58
+ * connects to the database that was specified during instance creation
59
+ */
60
+ async init(optionsArg = {}) {
61
+ this.assertLifecycleOperationCanBegin('init');
62
+ const options = assertDataOptions(optionsArg, ['timeoutMs', 'signal']);
63
+ const budget = Object.keys(options).length
64
+ ? new SmartdataOperationBudget(options.timeoutMs ?? 30_000, options.signal) : undefined;
65
+ try {
66
+ budget?.check();
67
+ }
68
+ catch (errorArg) {
69
+ budget?.close();
70
+ throw errorArg;
71
+ }
72
+ this.beginLifecycleOperation('init');
73
+ this.transitionLifecycle('connecting');
74
+ let candidateClient;
75
+ try {
76
+ try {
77
+ // Safely encode credentials to handle special characters
78
+ const encodedUser = this.smartdataOptions.mongoDbUser
79
+ ? encodeURIComponent(this.smartdataOptions.mongoDbUser)
80
+ : '';
81
+ const encodedPass = this.smartdataOptions.mongoDbPass
82
+ ? encodeURIComponent(this.smartdataOptions.mongoDbPass)
83
+ : '';
84
+ const finalConnectionUrl = this.smartdataOptions.mongoDbUrl
85
+ .replace('<USERNAME>', encodedUser)
86
+ .replace('<username>', encodedUser)
87
+ .replace('<USER>', encodedUser)
88
+ .replace('<user>', encodedUser)
89
+ .replace('<PASSWORD>', encodedPass)
90
+ .replace('<password>', encodedPass)
91
+ .replace('<DBNAME>', this.smartdataOptions.mongoDbName || '')
92
+ .replace('<dbname>', this.smartdataOptions.mongoDbName || '');
93
+ const descriptor = this.smartdataOptions;
94
+ const clientOptions = {
95
+ maxPoolSize: descriptor.maxPoolSize ?? 100,
96
+ maxIdleTimeMS: descriptor.maxIdleTimeMS ?? 300000,
97
+ serverSelectionTimeoutMS: budget?.remainingMs() ?? descriptor.serverSelectionTimeoutMS ?? 30000,
98
+ ...(budget ? { connectTimeoutMS: budget.remainingMs() } : {}),
99
+ socketTimeoutMS: descriptor.socketTimeoutMS ?? 30000,
100
+ retryWrites: true,
101
+ };
102
+ candidateClient = new plugins.mongodb.MongoClient(finalConnectionUrl, clientOptions);
103
+ this.pendingClient = candidateClient;
104
+ const connectingClient = candidateClient;
105
+ let cancellationCleanup;
106
+ const onAbort = () => {
107
+ cancellationCleanup ??= connectingClient.close();
108
+ // The connection and this cleanup are both joined below.
109
+ void cancellationCleanup.catch(() => { });
110
+ };
111
+ budget?.signal.addEventListener('abort', onAbort, { once: true });
112
+ try {
113
+ budget?.check();
114
+ await connectingClient.connect();
115
+ budget?.check();
116
+ }
117
+ finally {
118
+ budget?.signal.removeEventListener('abort', onAbort);
119
+ if (cancellationCleanup)
120
+ await cancellationCleanup;
121
+ }
122
+ const candidateDb = candidateClient.db(this.smartdataOptions.mongoDbName);
123
+ for (const collection of this.smartdataCollectionMap.getArray()) {
124
+ collection.resetForDatabaseReconnect();
125
+ }
126
+ budget?.check();
127
+ this.mongoDbClient = candidateClient;
128
+ this.mongoDb = candidateDb;
129
+ candidateClient = undefined;
130
+ this.pendingClient = undefined;
131
+ this.status = 'connected';
132
+ this.transitionLifecycle('connected');
133
+ this.statusConnectedDeferred.resolve();
134
+ logger.log('info', `Connected to database ${this.smartdataOptions.mongoDbName}`);
135
+ }
136
+ catch (error) {
137
+ let cleanupError;
138
+ if (candidateClient) {
139
+ try {
140
+ // A cancelled connect may establish resources after its first close.
141
+ await candidateClient.close();
142
+ this.pendingClient = undefined;
143
+ }
144
+ catch (errorArg) {
145
+ cleanupError = errorArg;
146
+ }
147
+ }
148
+ this.status = 'disconnected';
149
+ this.transitionLifecycle(this.pendingClient ? 'close_failed' : 'connection_failed');
150
+ logger.log('error', 'Failed to connect to the SmartData database.');
151
+ if (budget) {
152
+ throw new SmartdataPersistenceError('unsupported_operation', this.pendingClient
153
+ ? 'SmartData connection setup and cleanup failed; close must be retried.'
154
+ : 'SmartData connection setup failed or was cancelled.');
155
+ }
156
+ if (cleanupError)
157
+ throw new AggregateError([error, cleanupError], 'SmartData connection setup and cleanup failed; close must be retried.');
158
+ throw error;
159
+ }
160
+ }
161
+ finally {
162
+ this.endLifecycleOperation('init');
163
+ budget?.close();
164
+ }
165
+ }
166
+ /**
167
+ * closes the connection to the databse
168
+ */
169
+ async close(optionsArg = {}) {
170
+ this.assertLifecycleOperationCanBegin('close');
171
+ const databaseToDrop = this.resolveDatabaseToDrop(optionsArg);
172
+ const timeoutMs = Object.hasOwn(optionsArg, 'timeoutMs') ? optionsArg.timeoutMs : undefined;
173
+ const budget = timeoutMs === undefined ? undefined : new SmartdataOperationBudget(timeoutMs);
174
+ this.beginLifecycleOperation('close');
175
+ this.transitionLifecycle('closing');
176
+ this.status = 'disconnected';
177
+ const mongoDbClient = this.pendingClient ?? this.mongoDbClient;
178
+ try {
179
+ const closeErrors = [];
180
+ try {
181
+ await invalidateSmartdataSessions(this);
182
+ }
183
+ catch (errorArg) {
184
+ closeErrors.push(...(unwrapSmartdataSessionInvalidationErrors(errorArg) ?? [errorArg]));
185
+ }
186
+ if (databaseToDrop) {
187
+ try {
188
+ const databaseDropped = await databaseToDrop.dropDatabase(budget?.operationOptions());
189
+ if (!databaseDropped) {
190
+ throw new SmartdataPersistenceError('unsupported_operation', 'MongoDB did not acknowledge the requested database removal.');
191
+ }
192
+ }
193
+ catch (errorArg) {
194
+ closeErrors.push(errorArg);
195
+ }
196
+ }
197
+ try {
198
+ await mongoDbClient?.close();
199
+ this.pendingClient = undefined;
200
+ }
201
+ catch (errorArg) {
202
+ closeErrors.push(errorArg);
203
+ }
204
+ if (closeErrors.length > 0) {
205
+ this.transitionLifecycle('close_failed');
206
+ if (budget)
207
+ throw new SmartdataPersistenceError('unsupported_operation', 'SmartData database cleanup failed; close must be retried.');
208
+ if (closeErrors.length === 1) {
209
+ throw closeErrors[0];
210
+ }
211
+ throw new AggregateError(closeErrors, 'Multiple SmartData database cleanup operations failed.');
212
+ }
213
+ this.transitionLifecycle('closed');
214
+ logger.log('info', `disconnected from database ${this.smartdataOptions.mongoDbName}`);
215
+ }
216
+ finally {
217
+ this.endLifecycleOperation('close');
218
+ budget?.close();
219
+ }
220
+ }
221
+ /**
222
+ * Performs a bounded, read-only round trip to verify database readiness.
223
+ */
224
+ async checkReadiness(optionsArg = {}) {
225
+ const startedAt = performance.now();
226
+ const timeoutMs = optionsArg.timeoutMs ?? readinessDefaultTimeoutMs;
227
+ if (!Number.isSafeInteger(timeoutMs) ||
228
+ timeoutMs <= 0 ||
229
+ timeoutMs > readinessMaximumTimeoutMs) {
230
+ throw new SmartdataPersistenceError('invalid_argument', `Readiness timeoutMs must be a positive safe integer no greater than ${readinessMaximumTimeoutMs}.`);
231
+ }
232
+ const lifecycleReason = this.getReadinessLifecycleReason();
233
+ if (lifecycleReason) {
234
+ return this.createReadinessFailure(lifecycleReason, startedAt);
235
+ }
236
+ const signal = optionsArg.signal;
237
+ if (signal?.aborted) {
238
+ return this.createReadinessFailure('aborted', startedAt);
239
+ }
240
+ const lifecycleEpoch = this.lifecycleEpoch;
241
+ const mongoDb = this.mongoDb;
242
+ const mongoDbClient = this.mongoDbClient;
243
+ let response;
244
+ try {
245
+ response = await mongoDb.command({ ping: 1 }, {
246
+ timeoutMS: timeoutMs,
247
+ signal,
248
+ });
249
+ }
250
+ catch (error) {
251
+ if (signal?.aborted) {
252
+ return this.createReadinessFailure('aborted', startedAt);
253
+ }
254
+ if (this.lifecycleEpoch !== lifecycleEpoch ||
255
+ this.mongoDb !== mongoDb ||
256
+ this.mongoDbClient !== mongoDbClient) {
257
+ return this.createReadinessFailure(this.getReadinessLifecycleReason() ?? 'unavailable', startedAt);
258
+ }
259
+ if (error instanceof plugins.mongodb.MongoOperationTimeoutError) {
260
+ return this.createReadinessFailure('timeout', startedAt);
261
+ }
262
+ return this.createReadinessFailure('unavailable', startedAt);
263
+ }
264
+ if (this.lifecycleEpoch !== lifecycleEpoch ||
265
+ this.mongoDb !== mongoDb ||
266
+ this.mongoDbClient !== mongoDbClient) {
267
+ return this.createReadinessFailure(this.getReadinessLifecycleReason() ?? 'unavailable', startedAt);
268
+ }
269
+ if (response.ok !== 1) {
270
+ return this.createReadinessFailure('unavailable', startedAt);
271
+ }
272
+ return {
273
+ ready: true,
274
+ status: 'ready',
275
+ durationMs: performance.now() - startedAt,
276
+ };
277
+ }
278
+ /**
279
+ * Starts a raw MongoDB session. Use createSession() when every transaction
280
+ * operation goes through SmartData and stable persistence errors are needed.
281
+ */
282
+ startSession() {
283
+ return this.mongoDbClient.startSession();
284
+ }
285
+ /**
286
+ * Creates a SmartData-owned session for model transactions.
287
+ */
288
+ createSession() {
289
+ return createSmartdataSession(this);
290
+ }
291
+ /**
292
+ * Creates a narrowly scoped MongoDB administration facade bound to this
293
+ * SmartData lifecycle. Applications never need direct driver access.
294
+ */
295
+ createMongoAdministration() {
296
+ return new SmartdataMongoAdministration(this);
297
+ }
298
+ /** Observe all namespaces, indexes and bounded counts without initializing models. */
299
+ async inspectNamespace(optionsArg) {
300
+ return inspectSmartdataNamespace(this, optionsArg);
301
+ }
302
+ /** @internal Runs inspection or explicit model preparation against one connection generation. */
303
+ async [collectionTopologyDbInspectionSymbol](operationArg) {
304
+ if (this.lifecycleState !== 'connected' ||
305
+ this.status !== 'connected' ||
306
+ !this.mongoDb ||
307
+ !this.mongoDbClient ||
308
+ this.mongoDb.client !== this.mongoDbClient) {
309
+ throw new SmartdataPersistenceError('unsupported_operation', 'Collection topology inspection requires a connected SmartdataDb.');
310
+ }
311
+ const lifecycleEpoch = this.lifecycleEpoch;
312
+ const mongoDb = this.mongoDb;
313
+ const mongoDbClient = this.mongoDbClient;
314
+ const connectionIsCurrent = () => this.lifecycleState === 'connected' &&
315
+ this.status === 'connected' &&
316
+ this.lifecycleEpoch === lifecycleEpoch &&
317
+ this.mongoDb === mongoDb &&
318
+ this.mongoDbClient === mongoDbClient &&
319
+ mongoDb.client === mongoDbClient;
320
+ let result;
321
+ try {
322
+ result = await operationArg(mongoDb, () => {
323
+ if (!connectionIsCurrent()) {
324
+ throw new SmartdataPersistenceError('unsupported_operation', 'SmartData connection changed during operation.');
325
+ }
326
+ });
327
+ }
328
+ catch {
329
+ if (!connectionIsCurrent()) {
330
+ throw new SmartdataPersistenceError('unsupported_operation', 'SmartData connection changed during collection topology inspection.');
331
+ }
332
+ throw new SmartdataPersistenceError('unsupported_operation', 'Collection topology inspection failed.');
333
+ }
334
+ if (!connectionIsCurrent()) {
335
+ throw new SmartdataPersistenceError('unsupported_operation', 'SmartData connection changed during collection topology inspection.');
336
+ }
337
+ return result;
338
+ }
339
+ // handle table to class distribution
340
+ addCollection(SmartdataCollectionArg) {
341
+ this.smartdataCollectionMap.add(SmartdataCollectionArg);
342
+ }
343
+ /**
344
+ * Gets a collection's name and returns a SmartdataCollection instance
345
+ * @param nameArg
346
+ * @returns DbTable
347
+ */
348
+ async getSmartdataCollectionByName(nameArg) {
349
+ const resultCollection = await this.smartdataCollectionMap.find(async (dbTableArg) => {
350
+ return dbTableArg.collectionName === nameArg;
351
+ });
352
+ return resultCollection;
353
+ }
354
+ beginLifecycleOperation(operationArg) {
355
+ this.assertLifecycleOperationCanBegin(operationArg);
356
+ this.activeLifecycleOperation = operationArg;
357
+ }
358
+ assertLifecycleOperationCanBegin(operationArg) {
359
+ if (this.activeLifecycleOperation) {
360
+ throw new SmartdataPersistenceError('unsupported_operation', `Cannot start SmartData database ${operationArg} while ${this.activeLifecycleOperation} is still running.`);
361
+ }
362
+ if (operationArg === 'init' &&
363
+ (this.lifecycleState === 'connected' ||
364
+ this.lifecycleState === 'close_failed')) {
365
+ throw new SmartdataPersistenceError('unsupported_operation', `Cannot start SmartData database init while the existing client is ${this.lifecycleState}.`);
366
+ }
367
+ }
368
+ resolveDatabaseToDrop(optionsArg) {
369
+ const options = assertDataOptions(optionsArg, ['dropDatabase', 'timeoutMs']);
370
+ if (!Object.hasOwn(options, 'dropDatabase')) {
371
+ return undefined;
372
+ }
373
+ const dropDatabaseOptions = assertExactDataObject(options.dropDatabase, ['expectedDatabaseName'], 'SmartData dropDatabase options');
374
+ const expectedDatabaseName = dropDatabaseOptions.expectedDatabaseName;
375
+ if (typeof expectedDatabaseName !== 'string' ||
376
+ expectedDatabaseName.length === 0 ||
377
+ expectedDatabaseName.trim() !== expectedDatabaseName) {
378
+ throw new SmartdataPersistenceError('invalid_argument', 'SmartData expectedDatabaseName must be a non-empty string without surrounding whitespace.');
379
+ }
380
+ if (this.lifecycleState !== 'connected' ||
381
+ this.status !== 'connected' ||
382
+ !this.mongoDbClient ||
383
+ !this.mongoDb) {
384
+ throw new SmartdataPersistenceError('unsupported_operation', 'SmartData can remove a database only from a connected lifecycle.');
385
+ }
386
+ if (this.mongoDb.client !== this.mongoDbClient) {
387
+ throw new SmartdataPersistenceError('invalid_configuration', 'SmartData database and client bindings are inconsistent.');
388
+ }
389
+ const boundDatabaseName = this.mongoDb.databaseName;
390
+ if (expectedDatabaseName !== boundDatabaseName) {
391
+ throw new SmartdataPersistenceError('invalid_argument', 'SmartData expectedDatabaseName does not match the connected database.');
392
+ }
393
+ if (this.smartdataOptions.mongoDbName !== boundDatabaseName) {
394
+ throw new SmartdataPersistenceError('invalid_configuration', 'SmartData database descriptor no longer matches the connected database.');
395
+ }
396
+ return this.mongoDb;
397
+ }
398
+ endLifecycleOperation(operationArg) {
399
+ if (this.activeLifecycleOperation === operationArg) {
400
+ this.activeLifecycleOperation = null;
401
+ }
402
+ }
403
+ transitionLifecycle(stateArg) {
404
+ this.lifecycleState = stateArg;
405
+ this.lifecycleEpoch++;
406
+ }
407
+ getReadinessLifecycleReason() {
408
+ switch (this.lifecycleState) {
409
+ case 'initial':
410
+ return 'not_initialized';
411
+ case 'connecting':
412
+ return 'connecting';
413
+ case 'connection_failed':
414
+ return 'connection_failed';
415
+ case 'closing':
416
+ return 'closing';
417
+ case 'closed':
418
+ return 'closed';
419
+ case 'close_failed':
420
+ return 'close_failed';
421
+ case 'connected':
422
+ return undefined;
423
+ }
424
+ }
425
+ createReadinessFailure(reasonArg, startedAtArg) {
426
+ return {
427
+ ready: false,
428
+ status: 'unavailable',
429
+ reason: reasonArg,
430
+ durationMs: performance.now() - startedAtArg,
431
+ };
432
+ }
433
+ }
434
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvY2xhc3Nlcy5kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IsZ0JBQWdCLEVBQ2hCLHdDQUF3QyxHQUN6QyxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZGLE9BQU8sRUFDTCx5QkFBeUIsR0FHMUIsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBNkQzRixNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQztBQUN4QyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUV6QyxNQUFNLHFCQUFxQixHQUFHLENBQzVCLFFBQWlCLEVBQ2pCLGVBQWtDLEVBQ2xDLGNBQXNCLEVBQ3RCLGFBQWEsR0FBRyxLQUFLLEVBQ0ksRUFBRTtJQUMzQixJQUNFLFFBQVEsS0FBSyxJQUFJO1FBQ2pCLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFDNUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFD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
@@ -0,0 +1,52 @@
1
+ import * as plugins from './plugins.js';
2
+ import { SmartdataDb } from './classes.db.js';
3
+ import { SmartDataDbDoc } from './classes.doc.js';
4
+ import { SmartdataDbWatcher } from './classes.watcher.js';
5
+ export declare class DistributedClass extends SmartDataDbDoc<DistributedClass, DistributedClass> {
6
+ id: string;
7
+ data: {
8
+ status: 'initializing' | 'bidding' | 'settled' | 'stopped';
9
+ biddingShortcode?: string;
10
+ biddingStartTime?: number;
11
+ lastUpdated: number;
12
+ elected: boolean;
13
+ /**
14
+ * used to store request
15
+ */
16
+ taskRequests: plugins.taskbuffer.distributedCoordination.IDistributedTaskRequest[];
17
+ /**
18
+ * only used by the leader to convey consultation results
19
+ */
20
+ taskRequestResults: plugins.taskbuffer.distributedCoordination.IDistributedTaskRequestResult[];
21
+ };
22
+ }
23
+ /**
24
+ * This file implements a distributed coordinator according to the @pushrocks/taskbuffer standard.
25
+ * you should not set up this yourself. Instead, there is a factory on the SmartdataDb class
26
+ * that will take care of setting this up.
27
+ */
28
+ export declare class SmartdataDistributedCoordinator extends plugins.taskbuffer.distributedCoordination
29
+ .AbstractDistributedCoordinator {
30
+ readyPromise: Promise<any>;
31
+ db: SmartdataDb;
32
+ private asyncExecutionStack;
33
+ ownInstance: DistributedClass;
34
+ distributedWatcher: SmartdataDbWatcher<DistributedClass>;
35
+ constructor(dbArg: SmartdataDb);
36
+ start(): Promise<void>;
37
+ stop(): Promise<void>;
38
+ id: string;
39
+ private startHeartbeat;
40
+ sendHeartbeat(): Promise<void>;
41
+ private init;
42
+ getEligibleLeader(): Promise<DistributedClass | undefined>;
43
+ checkAndMaybeLead(): Promise<void>;
44
+ /**
45
+ * when it has been determined
46
+ * that this instance is leading
47
+ * the leading is implemented here
48
+ */
49
+ leadFunction(): Promise<void>;
50
+ fireDistributedTaskRequest(taskRequestArg: plugins.taskbuffer.distributedCoordination.IDistributedTaskRequest): Promise<plugins.taskbuffer.distributedCoordination.IDistributedTaskRequestResult>;
51
+ updateDistributedTaskRequest(infoBasisArg: plugins.taskbuffer.distributedCoordination.IDistributedTaskRequest): Promise<void>;
52
+ }