@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,250 @@
1
+ import * as plugins from './plugins.js';
2
+ import { snapshotBoundedBsonDocument } from './classes.bsonsnapshot.js';
3
+ import { SmartdataDb } from './classes.db.js';
4
+ import { SmartDataDbDoc } from './classes.doc.js';
5
+ import { SmartdataPersistenceError } from './classes.persistence.js';
6
+ import { assertDataOptions, SmartdataOperationBudget } from './classes.operationbudget.js';
7
+ /** Construction failed and cleanup also failed. Explicit close retries the retained owner. */
8
+ export class SmartdataTestDatabaseCreationError extends SmartdataPersistenceError {
9
+ #cleanup;
10
+ constructor(cleanupArg) {
11
+ super('unsupported_operation', 'Disposable database setup failed and cleanup must be retried with close().');
12
+ this.name = 'SmartdataTestDatabaseCreationError';
13
+ this.#cleanup = cleanupArg;
14
+ }
15
+ close() { return this.#cleanup(); }
16
+ }
17
+ const faultError = () => new SmartdataPersistenceError('invalid_argument', 'Fault data must be bounded, inert, canonical BSON with an explicit scalar _id.');
18
+ const canonicalFaultDocument = (valueArg, maxBytesArg) => snapshotBoundedBsonDocument(valueArg, maxBytesArg, faultError);
19
+ /** Disposable fault injection is available only through the testsupport package subpath. */
20
+ export class SmartdataTestDatabase {
21
+ db;
22
+ #name = `smartdata_test_${plugins.nodeCrypto.randomBytes(24).toString('hex')}`;
23
+ #descriptor;
24
+ #owned = false;
25
+ #closed = false;
26
+ #stopping = false;
27
+ #reconnectForRemoval = false;
28
+ #active;
29
+ #closing;
30
+ constructor(connectionArg) {
31
+ const host = connectionArg.host === 'localhost' ? '127.0.0.1' : connectionArg.host;
32
+ const authority = host === '::1' ? '[::1]' : host;
33
+ const credentials = connectionArg.username === undefined ? ''
34
+ : `${encodeURIComponent(connectionArg.username)}:${encodeURIComponent(connectionArg.password)}@`;
35
+ this.#descriptor = Object.freeze({
36
+ mongoDbName: this.#name,
37
+ mongoDbUrl: `mongodb://${credentials}${authority}:${connectionArg.port}/?directConnection=true&authSource=admin`,
38
+ });
39
+ this.db = new SmartdataDb(this.#descriptor);
40
+ }
41
+ static async create(optionsArg) {
42
+ const options = assertDataOptions(optionsArg, ['connection', 'timeoutMs', 'signal']);
43
+ const connection = assertDataOptions(options.connection, ['host', 'port', 'username', 'password']);
44
+ if (typeof connection.host !== 'string' ||
45
+ !(connection.host === 'localhost' || connection.host === '::1' ||
46
+ (plugins.nodeNet.isIP(connection.host) === 4 && connection.host.startsWith('127.'))) ||
47
+ !Number.isSafeInteger(connection.port) || connection.port < 1 || connection.port > 65535 ||
48
+ ((connection.username === undefined) !== (connection.password === undefined)) ||
49
+ [connection.username, connection.password].some((valueArg) => valueArg !== undefined &&
50
+ (typeof valueArg !== 'string' || valueArg.length < 1 || valueArg.length > 1024))) {
51
+ throw new SmartdataPersistenceError('invalid_argument', 'An explicit loopback host, port and optional credential pair are required.');
52
+ }
53
+ const budget = new SmartdataOperationBudget(options.timeoutMs ?? 5000, options.signal);
54
+ let fixture;
55
+ try {
56
+ budget.check();
57
+ fixture = new SmartdataTestDatabase(connection);
58
+ await fixture.db.init({ timeoutMs: budget.remainingMs(), signal: budget.signal });
59
+ const databases = await fixture.db.mongoDb.admin().listDatabases({
60
+ filter: { name: fixture.#name }, nameOnly: true, authorizedDatabases: false,
61
+ ...budget.operationOptions(),
62
+ });
63
+ if (databases.ok !== 1 || !Array.isArray(databases.databases) || databases.databases.length !== 0) {
64
+ throw new SmartdataPersistenceError('invalid_configuration', 'The disposable namespace already exists or cannot be verified.');
65
+ }
66
+ const namespace = await fixture.db.inspectNamespace({ maxCollections: 1,
67
+ timeoutMs: budget.remainingMs(), signal: budget.signal });
68
+ if (namespace.collections.length)
69
+ throw new SmartdataPersistenceError('invalid_configuration', 'The disposable namespace is not blank.');
70
+ budget.check();
71
+ fixture.#owned = true;
72
+ return fixture;
73
+ }
74
+ catch (errorArg) {
75
+ if (fixture) {
76
+ try {
77
+ await fixture.close();
78
+ }
79
+ catch {
80
+ const retained = fixture;
81
+ throw new SmartdataTestDatabaseCreationError(() => retained.close());
82
+ }
83
+ }
84
+ throw new SmartdataPersistenceError(errorArg instanceof SmartdataPersistenceError ? errorArg.code : 'unsupported_operation', 'Disposable database setup failed or was cancelled.');
85
+ }
86
+ finally {
87
+ budget.close();
88
+ }
89
+ }
90
+ insertStoredDocumentFault(modelArg, documentArg, optionsArg = {}) {
91
+ return this.inject(modelArg, documentArg, undefined, optionsArg);
92
+ }
93
+ replaceStoredDocumentFault(modelArg, expectedIdArg, documentArg, optionsArg = {}) {
94
+ return this.inject(modelArg, documentArg, { expectedId: expectedIdArg }, optionsArg);
95
+ }
96
+ /** Remove one declared secondary index from an exact, owned test collection. */
97
+ async dropDeclaredIndexFault(modelArg, indexNameArg, optionsArg = {}) {
98
+ const options = assertDataOptions(optionsArg, ['timeoutMs', 'signal']);
99
+ const budget = new SmartdataOperationBudget(options.timeoutMs ?? 5000, options.signal);
100
+ try {
101
+ budget.check();
102
+ this.assertFaultAvailable();
103
+ const expected = this.getFaultModelTopology(modelArg);
104
+ if (typeof indexNameArg !== 'string' || indexNameArg === '_id_' || indexNameArg === '*' ||
105
+ !expected.indexes.some((indexArg) => indexArg.name === indexNameArg)) {
106
+ throw new SmartdataPersistenceError('invalid_argument', 'Index fault injection requires one declared secondary index name.');
107
+ }
108
+ const operation = (async () => {
109
+ this.assertOwnedBinding();
110
+ const targetDb = this.db.mongoDb;
111
+ await modelArg.prepareCollection({ mode: 'requireExact', timeoutMs: budget.remainingMs(), signal: budget.signal });
112
+ this.assertOwnedBinding();
113
+ if (this.db.mongoDb !== targetDb)
114
+ throw new SmartdataPersistenceError('unsupported_operation', 'The disposable database connection changed.');
115
+ await targetDb.collection(expected.collectionName).dropIndex(indexNameArg, budget.operationOptions());
116
+ budget.check();
117
+ this.assertOwnedBinding();
118
+ if (this.db.mongoDb !== targetDb)
119
+ throw new SmartdataPersistenceError('unsupported_operation', 'The disposable database connection changed.');
120
+ })();
121
+ this.#active = operation;
122
+ try {
123
+ await operation;
124
+ }
125
+ finally {
126
+ this.#active = undefined;
127
+ }
128
+ }
129
+ catch (errorArg) {
130
+ throw new SmartdataPersistenceError(errorArg instanceof SmartdataPersistenceError ? errorArg.code : 'unsupported_operation', 'Declared-index fault injection failed or was cancelled.');
131
+ }
132
+ finally {
133
+ budget.close();
134
+ }
135
+ }
136
+ assertFaultAvailable() {
137
+ if (this.#stopping || this.#closed || !this.#owned || this.#active)
138
+ throw new SmartdataPersistenceError('unsupported_operation', 'The disposable database is closed, closing, or already injecting a fault.');
139
+ }
140
+ getFaultModelTopology(modelArg) {
141
+ if (typeof modelArg !== 'function' || plugins.nodeUtil.types.isProxy(modelArg) ||
142
+ !(modelArg.prototype instanceof SmartDataDbDoc))
143
+ throw new SmartdataPersistenceError('invalid_argument', 'Fault injection requires the declared SmartData model constructor.');
144
+ const collection = modelArg.collection;
145
+ const expected = modelArg.getExpectedCollectionTopology();
146
+ if (collection.smartdataDb !== this.db || collection.collectionName !== expected.collectionName) {
147
+ throw new SmartdataPersistenceError('invalid_configuration', 'The fault model must belong to this disposable database.');
148
+ }
149
+ return expected;
150
+ }
151
+ assertOwnedBinding() {
152
+ if (this.db.smartdataOptions !== this.#descriptor || this.db.mongoDb.databaseName !== this.#name ||
153
+ this.db.mongoDb.client !== this.db.mongoDbClient || this.db.status !== 'connected') {
154
+ throw new SmartdataPersistenceError('invalid_configuration', 'The disposable database binding has changed.');
155
+ }
156
+ }
157
+ async inject(modelArg, documentArg, replacementArg, optionsArg) {
158
+ const options = assertDataOptions(optionsArg, ['maxBytes', 'timeoutMs', 'signal']);
159
+ const maxBytes = options.maxBytes ?? 65536;
160
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 1 || maxBytes > 1024 * 1024)
161
+ throw faultError();
162
+ const budget = new SmartdataOperationBudget(options.timeoutMs ?? 5000, options.signal);
163
+ try {
164
+ budget.check();
165
+ this.assertFaultAvailable();
166
+ const document = canonicalFaultDocument(documentArg, maxBytes);
167
+ if (replacementArg) {
168
+ const expected = canonicalFaultDocument({ _id: replacementArg.expectedId }, maxBytes);
169
+ if (!Buffer.from(plugins.mongodb.BSON.serialize(expected)).equals(Buffer.from(plugins.mongodb.BSON.serialize({ _id: document._id }))))
170
+ throw faultError();
171
+ }
172
+ const expected = this.getFaultModelTopology(modelArg);
173
+ const operation = (async () => {
174
+ this.assertOwnedBinding();
175
+ await modelArg.prepareCollection({ mode: 'ensureCompatible', timeoutMs: budget.remainingMs(), signal: budget.signal });
176
+ this.assertOwnedBinding();
177
+ const raw = this.db.mongoDb.collection(expected.collectionName);
178
+ if (replacementArg) {
179
+ const result = await raw.replaceOne({ _id: document._id }, document, { upsert: false, ...budget.operationOptions() });
180
+ if (!result.acknowledged || result.matchedCount !== 1)
181
+ throw new SmartdataPersistenceError('unsupported_operation', 'Exact fault replacement requires one existing document.');
182
+ }
183
+ else {
184
+ const result = await raw.insertOne(document, budget.operationOptions());
185
+ if (!result.acknowledged)
186
+ throw new SmartdataPersistenceError('unsupported_operation', 'Fault insertion was not acknowledged.');
187
+ }
188
+ budget.check();
189
+ })();
190
+ this.#active = operation;
191
+ try {
192
+ await operation;
193
+ }
194
+ finally {
195
+ this.#active = undefined;
196
+ }
197
+ }
198
+ catch (errorArg) {
199
+ throw new SmartdataPersistenceError(errorArg instanceof SmartdataPersistenceError ? errorArg.code : 'unsupported_operation', 'Stored-document fault injection failed or was cancelled.');
200
+ }
201
+ finally {
202
+ budget.close();
203
+ }
204
+ }
205
+ /** Idempotent after success. A failed close retains ownership for an explicit retry. */
206
+ async close(optionsArg = {}) {
207
+ const options = assertDataOptions(optionsArg, ['timeoutMs']);
208
+ const budget = new SmartdataOperationBudget(options.timeoutMs ?? 5000);
209
+ try {
210
+ if (this.#closed)
211
+ return;
212
+ this.#stopping = true;
213
+ if (this.#closing) {
214
+ const closing = this.#closing;
215
+ await budget.waitFor(closing);
216
+ await closing;
217
+ return;
218
+ }
219
+ const closing = this.dispose(budget);
220
+ this.#closing = closing;
221
+ try {
222
+ await closing;
223
+ }
224
+ finally {
225
+ this.#closing = undefined;
226
+ }
227
+ }
228
+ catch {
229
+ throw new SmartdataPersistenceError('unsupported_operation', 'Disposable database cleanup failed; close must be retried.');
230
+ }
231
+ finally {
232
+ budget.close();
233
+ }
234
+ }
235
+ async dispose(budgetArg) {
236
+ if (this.#active)
237
+ await budgetArg.waitFor(this.#active);
238
+ if (this.#owned && this.#reconnectForRemoval) {
239
+ await this.db.close({ timeoutMs: budgetArg.remainingMs() });
240
+ this.db.smartdataOptions = this.#descriptor;
241
+ await this.db.init({ timeoutMs: budgetArg.remainingMs(), signal: budgetArg.signal });
242
+ }
243
+ this.#reconnectForRemoval = this.#owned;
244
+ await this.db.close({ timeoutMs: budgetArg.remainingMs(),
245
+ ...(this.#owned ? { dropDatabase: { expectedDatabaseName: this.#name } } : {}) });
246
+ this.#closed = true;
247
+ this.#owned = false;
248
+ }
249
+ }
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50ZXN0ZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2NsYXNzZXMudGVzdGRhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFvQzNGLDhGQUE4RjtBQUM5RixNQUFNLE9BQU8sa0NBQW1DLFNBQVEseUJBQXlCO0lBQ3RFLFFBQVEsQ0FBc0I7SUFDdkMsWUFBWSxVQUErQjtRQUN6QyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsNEVBQTRFLENBQUMsQ0FBQztRQUM3RyxJQUFJLENBQUMsSUFBSSxHQUFHLG9DQUFvQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFDTSxLQUFLLEtBQW9CLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUMxRDtBQUVELE1BQU0sVUFBVSxHQUFHLEdBQThCLEVBQUUsQ0FBQyxJQUFJLHlCQUF5QixDQUMvRSxrQkFBa0IsRUFBRSxnRkFBZ0YsQ0FDckcsQ0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxRQUFpQixFQUFFLFdBQW1CLEVBQTRCLEVBQUUsQ0FDbEcsMkJBQTJCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUVqRSw0RkFBNEY7QUFDNUYsTUFBTSxP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
@@ -0,0 +1,37 @@
1
+ import { SmartDataDbDoc } from './classes.doc.js';
2
+ import * as plugins from './plugins.js';
3
+ import { EventEmitter } from 'node:events';
4
+ /**
5
+ * a wrapper for the native mongodb cursor. Exposes better
6
+ */
7
+ /**
8
+ * Wraps a MongoDB ChangeStream with RxJS and EventEmitter support.
9
+ */
10
+ export declare class SmartdataDbWatcher<T = any> extends EventEmitter {
11
+ readyDeferred: plugins.smartpromise.Deferred<void>;
12
+ private changeStream;
13
+ private rawSubject;
14
+ private closePromise?;
15
+ private onChange;
16
+ private onStreamError;
17
+ /** Terminal read/hydration failure, also delivered to subscribed error handlers. */
18
+ failure?: unknown;
19
+ /** Emits change documents (or arrays of documents if buffered) */
20
+ changeSubject: any;
21
+ /**
22
+ * @param changeStreamArg native MongoDB ChangeStream
23
+ * @param smartdataDbDocArg document class for instance creation
24
+ * @param opts.bufferTimeMs optional milliseconds to buffer events via RxJS
25
+ */
26
+ constructor(changeStreamArg: plugins.mongodb.ChangeStream<any>, smartdataDbDocArg: typeof SmartDataDbDoc, opts?: {
27
+ bufferTimeMs?: number;
28
+ });
29
+ /**
30
+ * Close the change stream, complete the RxJS subject, and remove listeners.
31
+ */
32
+ close(): Promise<void>;
33
+ /**
34
+ * Alias for close(), matching README usage
35
+ */
36
+ stop(): Promise<void>;
37
+ }
@@ -0,0 +1,98 @@
1
+ import { SmartDataDbDoc } from './classes.doc.js';
2
+ import * as plugins from './plugins.js';
3
+ import { EventEmitter } from 'node:events';
4
+ /**
5
+ * a wrapper for the native mongodb cursor. Exposes better
6
+ */
7
+ /**
8
+ * Wraps a MongoDB ChangeStream with RxJS and EventEmitter support.
9
+ */
10
+ export class SmartdataDbWatcher extends EventEmitter {
11
+ // STATIC
12
+ readyDeferred = plugins.smartpromise.defer();
13
+ // INSTANCE
14
+ changeStream;
15
+ rawSubject;
16
+ closePromise;
17
+ onChange;
18
+ onStreamError;
19
+ /** Terminal read/hydration failure, also delivered to subscribed error handlers. */
20
+ failure;
21
+ /** Emits change documents (or arrays of documents if buffered) */
22
+ changeSubject;
23
+ /**
24
+ * @param changeStreamArg native MongoDB ChangeStream
25
+ * @param smartdataDbDocArg document class for instance creation
26
+ * @param opts.bufferTimeMs optional milliseconds to buffer events via RxJS
27
+ */
28
+ constructor(changeStreamArg, smartdataDbDocArg, opts) {
29
+ super();
30
+ this.rawSubject = new plugins.smartrx.rxjs.Subject();
31
+ // Apply buffering if requested
32
+ if (opts && opts.bufferTimeMs) {
33
+ this.changeSubject = this.rawSubject.pipe(plugins.smartrx.rxjs.ops.bufferTime(opts.bufferTimeMs));
34
+ }
35
+ else {
36
+ this.changeSubject = this.rawSubject;
37
+ }
38
+ this.changeStream = changeStreamArg;
39
+ this.onStreamError = (errorArg) => {
40
+ if (this.closePromise)
41
+ return;
42
+ this.failure = errorArg;
43
+ void this.close().catch((closeErrorArg) => {
44
+ this.failure = new AggregateError([errorArg, closeErrorArg], 'Watcher failed and cleanup failed.');
45
+ });
46
+ this.rawSubject.error(errorArg);
47
+ if (this.listenerCount('error') > 0)
48
+ this.emit('error', errorArg);
49
+ };
50
+ this.onChange = (item) => {
51
+ if (this.closePromise)
52
+ return;
53
+ let docInstance = null;
54
+ try {
55
+ if (item.fullDocument) {
56
+ docInstance = smartdataDbDocArg.createInstanceFromMongoDbNativeDoc(item.fullDocument);
57
+ }
58
+ }
59
+ catch (errorArg) {
60
+ this.onStreamError(errorArg);
61
+ return;
62
+ }
63
+ // Notify subscribers
64
+ this.rawSubject.next(docInstance);
65
+ this.emit('change', docInstance);
66
+ };
67
+ this.changeStream.on('change', this.onChange);
68
+ this.changeStream.on('error', this.onStreamError);
69
+ // Signal readiness after one tick
70
+ plugins.smartdelay.delayFor(0).then(() => {
71
+ this.readyDeferred.resolve();
72
+ });
73
+ }
74
+ /**
75
+ * Close the change stream, complete the RxJS subject, and remove listeners.
76
+ */
77
+ async close() {
78
+ this.closePromise ??= (async () => {
79
+ try {
80
+ await this.changeStream.close();
81
+ }
82
+ finally {
83
+ this.changeStream.off('change', this.onChange);
84
+ this.changeStream.off('error', this.onStreamError);
85
+ this.rawSubject.complete();
86
+ this.removeAllListeners();
87
+ }
88
+ })();
89
+ return this.closePromise;
90
+ }
91
+ /**
92
+ * Alias for close(), matching README usage
93
+ */
94
+ async stop() {
95
+ return this.close();
96
+ }
97
+ }
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53YXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLndhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0M7O0dBRUc7QUFDSDs7R0FFRztBQUNILE1BQU0sT0FBTyxrQkFBNEIsU0FBUSxZQUFZO0lBQzNELFNBQVM7SUFDRixhQUFhLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVwRCxXQUFXO0lBQ0gsWUFBWSxDQUFvQztJQUNoRCxVQUFVLENBQWtDO0lBQzVDLFlBQVksQ0FBaUI7SUFDN0IsUUFBUSxDQUF5QjtJQUNqQyxhQUFhLENBQThCO0lBQ25ELG9GQUFvRjtJQUM3RSxPQUFPLENBQVc7SUFDekIsa0VBQWtFO0lBQzNELGFBQWEsQ0FBTTtJQUMxQjs7OztPQUlHO0lBQ0gsWUFDRSxlQUFrRCxFQUNsRCxpQkFBd0MsRUFDeEMsSUFBZ0M7UUFFaEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFLLENBQUM7UUFDeEQsK0JBQStCO1FBQy9CLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDcEcsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMs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
@@ -0,0 +1,27 @@
1
+ import './shim.js';
2
+ export { NoSqlConnection } from './classes.connection.js';
3
+ export type { INoSqlConnectionOptions } from './classes.connection.js';
4
+ export * from './classes.db.js';
5
+ export * from './classes.mongoadministration.js';
6
+ export type { ISmartdataNamespaceInspectionOptions, ISmartdataNamespaceInspection, ISmartdataObservedCollection, TSmartdataObservedDocumentCount, } from './classes.namespaceinspection.js';
7
+ export * from './classes.collection.js';
8
+ export type { ISmartdataCollectionPreparationOptions } from './classes.collectionpreparation.js';
9
+ export type { ISmartdataBootstrapRecordOptions, ISmartdataBootstrapRecordResult } from './classes.bootstraprecord.js';
10
+ export type { ISmartdataCollectionTopologyIndex, ISmartdataCollectionTopologyIndexKey, ISmartdataCollectionTopologyInspection, ISmartdataExpectedCollectionTopology, TSmartdataCollectionTopologyIndexDirection, TSmartdataCollectionTopologyReasonCode, TSmartdataCollectionTopologyStatus, } from './classes.collectiontopology.js';
11
+ export * from './classes.doc.js';
12
+ export { ordinaryPersistence } from './classes.ordinarypersistence.js';
13
+ export type { IOrdinaryPersistenceOptions } from './classes.ordinarypersistence.js';
14
+ export type { ISmartdataStoredInspectionOptions, ISmartdataStoredInspection, ISmartdataStoredDocumentEvidence, ISmartdataStoredEvidenceInspection, TSmartdataOrdinaryDocumentEvidence, } from './classes.storedinspection.js';
15
+ export { SmartdataPersistenceError } from './classes.persistence.js';
16
+ export type { TSmartdataPersistenceErrorCode } from './classes.persistence.js';
17
+ export * from './classes.exactpersistence.js';
18
+ export * from './classes.easystore.js';
19
+ export * from './classes.cursor.js';
20
+ export * from './classes.watcher.js';
21
+ export * from './classes.distributedcoordinator.js';
22
+ export * from './classes.cached-document.js';
23
+ import * as convenience from './classes.convenience.js';
24
+ export { convenience };
25
+ import type * as plugins from './plugins.js';
26
+ type IMongoDescriptor = plugins.tsclass.database.IMongoDescriptor;
27
+ export type { IMongoDescriptor };
@@ -0,0 +1,18 @@
1
+ // Polyfill must be imported first - ES modules hoist exports before code runs
2
+ import './shim.js';
3
+ export { NoSqlConnection } from './classes.connection.js';
4
+ export * from './classes.db.js';
5
+ export * from './classes.mongoadministration.js';
6
+ export * from './classes.collection.js';
7
+ export * from './classes.doc.js';
8
+ export { ordinaryPersistence } from './classes.ordinarypersistence.js';
9
+ export { SmartdataPersistenceError } from './classes.persistence.js';
10
+ export * from './classes.exactpersistence.js';
11
+ export * from './classes.easystore.js';
12
+ export * from './classes.cursor.js';
13
+ export * from './classes.watcher.js';
14
+ export * from './classes.distributedcoordinator.js';
15
+ export * from './classes.cached-document.js';
16
+ import * as convenience from './classes.convenience.js';
17
+ export { convenience };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhFQUE4RTtBQUM5RSxPQUFPLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHMUQsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGtDQUFrQyxDQUFDO0FBT2pELGNBQWMseUJBQXlCLENBQUM7QUFZeEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU92RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRSxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxPQUFPLEtBQUssV0FBVyxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,2 @@
1
+ import * as plugins from './plugins.js';
2
+ export declare const logger: plugins.smartlog.ConsoleLog;
@@ -0,0 +1,3 @@
1
+ import * as plugins from './plugins.js';
2
+ export const logger = new plugins.smartlog.ConsoleLog();
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvbG9nZ2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDIn0=
@@ -0,0 +1,17 @@
1
+ import * as tsclass from '@tsclass/tsclass';
2
+ export { tsclass };
3
+ import * as lik from '@push.rocks/lik';
4
+ import * as smartdelay from '@push.rocks/smartdelay';
5
+ import * as smartlog from '@push.rocks/smartlog';
6
+ import * as smartpromise from '@push.rocks/smartpromise';
7
+ import * as smartrx from '@push.rocks/smartrx';
8
+ import * as smartstring from '@push.rocks/smartstring';
9
+ import * as smarttime from '@push.rocks/smarttime';
10
+ import * as smartunique from '@push.rocks/smartunique';
11
+ import * as taskbuffer from '@push.rocks/taskbuffer';
12
+ import * as mongodb from 'mongodb';
13
+ import * as nodeUtil from 'node:util';
14
+ import * as nodeAsyncHooks from 'node:async_hooks';
15
+ import * as nodeCrypto from 'node:crypto';
16
+ import * as nodeNet from 'node:net';
17
+ export { lik, smartdelay, smartpromise, smartlog, smartrx, mongodb, nodeUtil, nodeAsyncHooks, nodeCrypto, nodeNet, smartstring, smarttime, smartunique, taskbuffer, };
@@ -0,0 +1,20 @@
1
+ // tsclass scope
2
+ import * as tsclass from '@tsclass/tsclass';
3
+ export { tsclass };
4
+ // @pushrocks scope
5
+ import * as lik from '@push.rocks/lik';
6
+ import * as smartdelay from '@push.rocks/smartdelay';
7
+ import * as smartlog from '@push.rocks/smartlog';
8
+ import * as smartpromise from '@push.rocks/smartpromise';
9
+ import * as smartrx from '@push.rocks/smartrx';
10
+ import * as smartstring from '@push.rocks/smartstring';
11
+ import * as smarttime from '@push.rocks/smarttime';
12
+ import * as smartunique from '@push.rocks/smartunique';
13
+ import * as taskbuffer from '@push.rocks/taskbuffer';
14
+ import * as mongodb from 'mongodb';
15
+ import * as nodeUtil from 'node:util';
16
+ import * as nodeAsyncHooks from 'node:async_hooks';
17
+ import * as nodeCrypto from 'node:crypto';
18
+ import * as nodeNet from 'node:net';
19
+ export { lik, smartdelay, smartpromise, smartlog, smartrx, mongodb, nodeUtil, nodeAsyncHooks, nodeCrypto, nodeNet, smartstring, smarttime, smartunique, taskbuffer, };
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0I7QUFDaEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFFbkIsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxjQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxVQUFVLENBQUM7QUFFcEMsT0FBTyxFQUNMLEdBQUcsRUFDSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixjQUFjLEVBQ2QsVUFBVSxFQUNWLE9BQU8sRUFDUCxXQUFXLEVBQ1gsU0FBUyxFQUNULFdBQVcsRUFDWCxVQUFVLEdBQ1gsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Polyfill for Symbol.metadata required by TC39 Stage 3 decorators.
3
+ * Must be imported before any decorator code loads.
4
+ * @see https://github.com/tc39/proposal-decorator-metadata
5
+ */
6
+ Symbol.metadata ??= Symbol.for('Symbol.metadata');
7
+ export {};
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvc2hpbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0YsTUFBYyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMifQ==
@@ -0,0 +1,3 @@
1
+ import './shim.js';
2
+ export { SmartdataTestDatabase, SmartdataTestDatabaseCreationError, } from './classes.testdatabase.js';
3
+ export type { ISmartdataTestConnection, ISmartdataTestDatabaseOptions, ISmartdataStoredDocumentFaultOptions, ISmartdataIndexFaultOptions, TSmartdataTestModel, } from './classes.testdatabase.js';
@@ -0,0 +1,3 @@
1
+ import './shim.js';
2
+ export { SmartdataTestDatabase, SmartdataTestDatabaseCreationError, } from './classes.testdatabase.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHN1cHBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL3Rlc3RzdXBwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sV0FBVyxDQUFDO0FBRW5CLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsa0NBQWtDLEdBQ25DLE1BQU0sMkJBQTJCLENBQUMifQ==