@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,37 @@
1
+ {
2
+ "@git.zone/cli": {
3
+ "schemaVersion": 2,
4
+ "projectType": "npm",
5
+ "module": {
6
+ "githost": "code.foss.global",
7
+ "gitscope": "lossless.org",
8
+ "gitrepo": "client",
9
+ "npmPackagename": "@lossless.org/client",
10
+ "description": "One typed client for NoSQLDB, MongoDB, SQLDB, MariaDB, ClickHouse and S3 object storage.",
11
+ "license": "MIT"
12
+ },
13
+ "release": {
14
+ "preflight": {
15
+ "test": true,
16
+ "build": true
17
+ },
18
+ "targets": {
19
+ "git": {
20
+ "enabled": true,
21
+ "remote": "origin",
22
+ "pushBranch": true,
23
+ "pushTags": true
24
+ },
25
+ "npm": {
26
+ "enabled": true,
27
+ "registries": [
28
+ "https://verdaccio.lossless.digital",
29
+ "https://registry.npmjs.org"
30
+ ],
31
+ "accessLevel": "public",
32
+ "alreadyPublished": "success"
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export declare const commitinfo: {
5
+ name: string;
6
+ version: string;
7
+ description: string;
8
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export const commitinfo = {
5
+ name: '@lossless.org/client',
6
+ version: '0.1.0',
7
+ description: 'One typed client for NoSQLDB, MongoDB, SQLDB, MariaDB, ClickHouse and S3 object storage.'
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBGQUEwRjtDQUN4RyxDQUFBIn0=
@@ -0,0 +1,32 @@
1
+ import type { NoSqlConnection, INoSqlConnectionOptions } from './nosqldb/classes.connection.js';
2
+ import type { ObjectStorageConnection, IObjectStorageConnectionOptions } from './objectstorage/classes.connection.js';
3
+ import type { SqlConnection } from './sqldb/classes.sqlconnection.js';
4
+ import type { ClickHouseConnection } from './sqldb/classes.clickhouseconnection.js';
5
+ import type { ISqlConnectionOptions, IClickHouseConnectionOptions } from './sqldb/interfaces.js';
6
+ import type { IOperationOptions, IReadiness } from './core/interfaces.js';
7
+ export interface ILosslessOrgClientOptions {
8
+ nosqldb?: Record<string, INoSqlConnectionOptions>;
9
+ sqldb?: Record<string, ISqlConnectionOptions | IClickHouseConnectionOptions>;
10
+ objectstorage?: Record<string, IObjectStorageConnectionOptions>;
11
+ }
12
+ type TSqlFor<Options> = Options extends {
13
+ backend: 'clickhouse';
14
+ } ? ClickHouseConnection : SqlConnection;
15
+ /** Named connections with one lifecycle; engines and persisted domain semantics stay separate. */
16
+ export declare class LosslessOrgClient<const Options extends ILosslessOrgClientOptions = ILosslessOrgClientOptions> {
17
+ readonly options: Options;
18
+ private readonly resources;
19
+ private connecting?;
20
+ private closing?;
21
+ private connectOperation?;
22
+ private state;
23
+ constructor(options: Options);
24
+ connect(options?: IOperationOptions): Promise<void>;
25
+ private get;
26
+ nosqldb<Name extends keyof NonNullable<Options['nosqldb']> & string>(name: Name): NoSqlConnection;
27
+ sqldb<Name extends keyof NonNullable<Options['sqldb']> & string>(name: Name): TSqlFor<NonNullable<Options['sqldb']>[Name]>;
28
+ objectstorage<Name extends keyof NonNullable<Options['objectstorage']> & string>(name: Name): ObjectStorageConnection;
29
+ ready(options?: IOperationOptions): Promise<Record<string, IReadiness>>;
30
+ close(): Promise<void>;
31
+ }
32
+ export {};
@@ -0,0 +1,103 @@
1
+ import * as plugins from './plugins.js';
2
+ import { LosslessClientError } from './core/classes.error.js';
3
+ import { Operation } from './core/classes.operation.js';
4
+ /** Named connections with one lifecycle; engines and persisted domain semantics stay separate. */
5
+ export class LosslessOrgClient {
6
+ options;
7
+ resources = new Map();
8
+ connecting;
9
+ closing;
10
+ connectOperation;
11
+ state = 'initial';
12
+ constructor(options) {
13
+ this.options = options;
14
+ }
15
+ connect(options = {}) {
16
+ if (this.state === 'connected')
17
+ return Promise.resolve();
18
+ if (this.state === 'connecting' && this.connecting)
19
+ return this.connecting;
20
+ if (this.state !== 'initial')
21
+ return Promise.reject(new LosslessClientError('closed', 'Create a new client after failure or close.'));
22
+ this.connectOperation = new Operation(options);
23
+ this.state = 'connecting';
24
+ const operation = this.connectOperation;
25
+ this.connecting = (async () => {
26
+ try {
27
+ for (const [name, config] of Object.entries(this.options.nosqldb ?? {})) {
28
+ operation.check();
29
+ const { NoSqlConnection } = await plugins.loadNoSql();
30
+ const connection = new NoSqlConnection(config);
31
+ this.resources.set(`nosqldb:${name}`, connection);
32
+ await connection.connect({ signal: operation.signal });
33
+ }
34
+ for (const [name, config] of Object.entries(this.options.sqldb ?? {})) {
35
+ operation.check();
36
+ const connection = config.backend === 'clickhouse'
37
+ ? new (await plugins.loadClickHouse()).ClickHouseConnection(config)
38
+ : new (await plugins.loadSql()).SqlConnection(config);
39
+ this.resources.set(`sqldb:${name}`, connection);
40
+ await connection.connect({ signal: operation.signal });
41
+ operation.check();
42
+ }
43
+ for (const [name, config] of Object.entries(this.options.objectstorage ?? {})) {
44
+ operation.check();
45
+ const { ObjectStorageConnection } = await plugins.loadObjects();
46
+ this.resources.set(`objectstorage:${name}`, new ObjectStorageConnection(config));
47
+ }
48
+ operation.check();
49
+ this.state = 'connected';
50
+ }
51
+ catch (error) {
52
+ const cleanup = await Promise.allSettled([...this.resources.values()].map(resource => resource.close()));
53
+ this.state = 'failed';
54
+ const errors = cleanup.flatMap(result => result.status === 'rejected' ? [result.reason] : []);
55
+ if (errors.length)
56
+ throw new AggregateError([error, ...errors], 'Client connection and cleanup failed.');
57
+ throw error;
58
+ }
59
+ finally {
60
+ operation.dispose();
61
+ this.connectOperation = undefined;
62
+ }
63
+ })();
64
+ void this.connecting.finally(() => { this.connecting = undefined; }).catch(() => { });
65
+ return this.connecting;
66
+ }
67
+ get(family, name) {
68
+ if (this.state !== 'connected')
69
+ throw new LosslessClientError('not_connected', 'Call and await client.connect() first.');
70
+ const resource = this.resources.get(`${family}:${name}`);
71
+ if (!resource)
72
+ throw new LosslessClientError('invalid_argument', `Unknown ${family} connection: ${name}`);
73
+ return resource;
74
+ }
75
+ nosqldb(name) {
76
+ return this.get('nosqldb', name);
77
+ }
78
+ sqldb(name) {
79
+ return this.get('sqldb', name);
80
+ }
81
+ objectstorage(name) {
82
+ return this.get('objectstorage', name);
83
+ }
84
+ async ready(options = {}) {
85
+ if (this.state !== 'connected')
86
+ throw new LosslessClientError('not_connected', 'Client is not connected.');
87
+ return Object.fromEntries(await Promise.all([...this.resources].map(async ([name, resource]) => [name, await resource.ready(options)])));
88
+ }
89
+ close() {
90
+ return this.closing ??= (async () => {
91
+ this.state = 'closing';
92
+ this.connectOperation?.cancel();
93
+ await this.connecting?.catch(() => { });
94
+ const result = await Promise.allSettled([...this.resources.values()].map(resource => resource.close()));
95
+ const errors = result.flatMap(item => item.status === 'rejected' ? [item.reason] : []);
96
+ if (errors.length)
97
+ throw new AggregateError(errors, 'Client cleanup failed.');
98
+ this.resources.clear();
99
+ this.state = 'closed';
100
+ })();
101
+ }
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5sb3NzbGVzc29yZ2NsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMubG9zc2xlc3NvcmdjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBVXhELGtHQUFrRztBQUNsRyxNQUFNLE9BQU8saUJBQWlCO0lBT0E7SUFOWCxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7SUFDbEQsVUFBVSxDQUFpQjtJQUMzQixPQUFPLENBQWlCO0lBQ3hCLGdCQUFnQixDQUFhO0lBQzdCLEtBQUssR0FBNkUsU0FBUyxDQUFDO0lBRXBHLFlBQTRCLE9BQWdCO1FBQWhCLFlBQU8sR0FBUCxPQUFPLENBQVM7SUFBRyxDQUFDO0lBRXpDLE9BQU8sQ0FBQyxVQUE2QixFQUFFO1FBQzVDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMzRSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixDQUFDLFFBQVEsRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDLENBQUM7UUFDdEksSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1FBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFB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
@@ -0,0 +1,16 @@
1
+ import type { TClientErrorCode } from './interfaces.js';
2
+ export declare class LosslessClientError extends Error {
3
+ readonly code: TClientErrorCode;
4
+ readonly backendCode?: string;
5
+ /** A transient cause is a hint, never permission to retry an ambiguous mutation. */
6
+ readonly retryability: 'transient' | 'permanent' | 'unknown';
7
+ readonly outcome: 'unknown' | 'partial' | undefined;
8
+ readonly acknowledgedRows?: number;
9
+ constructor(code: TClientErrorCode, message: string, options?: ErrorOptions & {
10
+ backendCode?: string;
11
+ retryability?: 'transient' | 'permanent' | 'unknown';
12
+ acknowledgedRows?: number;
13
+ });
14
+ }
15
+ /** Safe outer message; the original backend error remains available explicitly through cause. */
16
+ export declare const backendError: (error: unknown) => LosslessClientError;
@@ -0,0 +1,29 @@
1
+ export class LosslessClientError extends Error {
2
+ code;
3
+ backendCode;
4
+ /** A transient cause is a hint, never permission to retry an ambiguous mutation. */
5
+ retryability;
6
+ outcome;
7
+ acknowledgedRows;
8
+ constructor(code, message, options) {
9
+ super(message, options);
10
+ this.code = code;
11
+ this.name = 'LosslessClientError';
12
+ this.backendCode = options?.backendCode;
13
+ this.retryability = options?.retryability ?? 'unknown';
14
+ this.outcome = code === 'ambiguous_write' ? 'unknown' : code === 'partial_write' ? 'partial' : undefined;
15
+ this.acknowledgedRows = options?.acknowledgedRows;
16
+ }
17
+ }
18
+ /** Safe outer message; the original backend error remains available explicitly through cause. */
19
+ export const backendError = (error) => {
20
+ if (error instanceof LosslessClientError)
21
+ return error;
22
+ const details = error && typeof error === 'object' ? error : {};
23
+ const code = String(details.code ?? details.errno ?? '');
24
+ const authentication = ['ER_ACCESS_DENIED_ERROR', 'ER_DBACCESS_DENIED_ERROR', '1045', '1044', '516'].includes(code);
25
+ const conflict = ['ER_DUP_ENTRY', 'ER_LOCK_DEADLOCK', 'ER_LOCK_WAIT_TIMEOUT', '1062', '1213', '1205'].includes(code);
26
+ const transient = ['ER_LOCK_DEADLOCK', 'ER_LOCK_WAIT_TIMEOUT', '1213', '1205', 'ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT'].includes(code);
27
+ return new LosslessClientError(authentication ? 'authentication' : conflict ? 'conflict' : 'backend_error', authentication ? 'Backend authentication failed.' : conflict ? 'Backend operation conflicted.' : 'Backend operation failed.', { cause: error, backendCode: code || undefined, retryability: transient ? 'transient' : authentication ? 'permanent' : 'unknown' });
28
+ };
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvcmUvY2xhc3Nlcy5lcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsS0FBSztJQU1oQjtJQUxaLFdBQVcsQ0FBVTtJQUNyQyxvRkFBb0Y7SUFDcEUsWUFBWSxDQUF3QztJQUNwRCxPQUFPLENBQW9DO0lBQzNDLGdCQUFnQixDQUFVO0lBQzFDLFlBQTRCLElBQXNCLEVBQUUsT0FBZSxFQUNqRSxPQUFrSTtRQUNsSSxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRkUsU0FBSSxHQUFKLElBQUksQ0FBa0I7UUFHaEQsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sRUFBRSxXQUFXLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLEVBQUUsWUFBWSxJQUFJLFNBQVMsQ0FBQztRQUN2RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN6RyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxFQUFFLGdCQUFnQixDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQUVELGlHQUFpRztBQUNqRyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFjLEVBQXVCLEVBQUU7SUFDbEUsSUFBSSxLQUFLLFlBQVksbUJBQW1CO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkQsTUFBTSxPQUFPLEdBQUcsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBZ0MsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekQsTUFBTSxjQUFjLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwSCxNQUFNLFFBQVEsR0FBRyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNySCxNQUFNLFNBQVMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekksT0FBTyxJQUFJLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQ3hHLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixFQUM1SCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksSUFBSSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUN4SSxDQUFDLENBQUMifQ==
@@ -0,0 +1,17 @@
1
+ import { LosslessClientError } from './classes.error.js';
2
+ import type { IOperationOptions } from './interfaces.js';
3
+ /** Owns one deadline and abort listener; callers join resource cleanup before disposal. */
4
+ export declare class Operation {
5
+ readonly controller: AbortController;
6
+ get signal(): AbortSignal;
7
+ private readonly timer;
8
+ private readonly upstream?;
9
+ private readonly onAbort;
10
+ constructor(options?: IOperationOptions, defaultTimeoutMs?: number);
11
+ check(): void;
12
+ /** Revoke admission while waiting for caller code. This cannot interrupt arbitrary JavaScript. */
13
+ wait<Result>(task: PromiseLike<Result>): Promise<Result>;
14
+ iterate<Row>(rows: AsyncIterable<Row> | Iterable<Row>): AsyncGenerator<Row>;
15
+ cancel(reason?: LosslessClientError): void;
16
+ dispose(): void;
17
+ }
@@ -0,0 +1,70 @@
1
+ import { LosslessClientError } from './classes.error.js';
2
+ /** Owns one deadline and abort listener; callers join resource cleanup before disposal. */
3
+ export class Operation {
4
+ controller = new AbortController();
5
+ get signal() { return this.controller.signal; }
6
+ timer;
7
+ upstream;
8
+ onAbort = () => this.cancel(new LosslessClientError('cancelled', 'Operation cancelled.'));
9
+ constructor(options = {}, defaultTimeoutMs = 30_000) {
10
+ const timeout = options.timeoutMs ?? defaultTimeoutMs;
11
+ if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 86_400_000) {
12
+ throw new LosslessClientError('invalid_argument', 'timeoutMs must be an integer between 1 and 86400000.');
13
+ }
14
+ this.upstream = options.signal;
15
+ this.upstream?.addEventListener('abort', this.onAbort, { once: true });
16
+ this.timer = setTimeout(() => this.cancel(new LosslessClientError('timeout', 'Operation deadline exceeded.')), timeout);
17
+ this.timer.unref();
18
+ if (this.upstream?.aborted)
19
+ this.onAbort();
20
+ }
21
+ check() { if (this.signal.aborted)
22
+ throw this.signal.reason; }
23
+ /** Revoke admission while waiting for caller code. This cannot interrupt arbitrary JavaScript. */
24
+ async wait(task) {
25
+ const aborted = Promise.withResolvers();
26
+ const abort = () => aborted.reject(this.signal.reason);
27
+ this.signal.addEventListener('abort', abort, { once: true });
28
+ if (this.signal.aborted)
29
+ abort();
30
+ try {
31
+ return await Promise.race([task, aborted.promise]);
32
+ }
33
+ finally {
34
+ this.signal.removeEventListener('abort', abort);
35
+ }
36
+ }
37
+ async *iterate(rows) {
38
+ const asyncRows = rows;
39
+ const iterator = asyncRows[Symbol.asyncIterator]?.() ?? rows[Symbol.iterator]?.();
40
+ if (!iterator)
41
+ throw new LosslessClientError('invalid_argument', 'Insert input must be iterable.');
42
+ let completed = false;
43
+ try {
44
+ while (true) {
45
+ this.check();
46
+ const result = await this.wait(Promise.resolve(iterator.next()));
47
+ if (result.done) {
48
+ completed = true;
49
+ return;
50
+ }
51
+ this.check();
52
+ yield result.value;
53
+ }
54
+ }
55
+ finally {
56
+ // Request source cleanup even after cancellation. A caller-owned producer must cooperate
57
+ // with the supplied signal to stop its own pending I/O; no backend lease remains attached.
58
+ if (!completed && iterator.return)
59
+ await this.wait(Promise.resolve(iterator.return()));
60
+ }
61
+ }
62
+ cancel(reason = new LosslessClientError('closed', 'Connection closed.')) {
63
+ this.controller.abort(reason);
64
+ }
65
+ dispose() {
66
+ clearTimeout(this.timer);
67
+ this.upstream?.removeEventListener('abort', this.onAbort);
68
+ }
69
+ }
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcGVyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb3JlL2NsYXNzZXMub3BlcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3pELDJGQUEyRjtBQUMzRixNQUFNLE9BQU8sU0FBUztJQUNKLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ25ELElBQVcsTUFBTSxLQUFrQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNsRCxLQUFLLENBQWdDO0lBQ3JDLFFBQVEsQ0FBZTtJQUN2QixPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFFM0csWUFBWSxVQUE2QixFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsTUFBTTtRQUNwRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLGdCQUFnQixDQUFDO1FBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQzFFLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1FBQzVHLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxD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
@@ -0,0 +1,18 @@
1
+ export type TBackend = 'nosqldb' | 'mongodb' | 'sqldb' | 'mariadb' | 'clickhouse' | 'objectstorage' | 's3';
2
+ export type TCapability = 'available' | 'unsupported' | 'unknown';
3
+ export interface ICapabilities {
4
+ readonly backend: TBackend;
5
+ readonly transactions: TCapability;
6
+ readonly changeStreams: TCapability;
7
+ readonly objectMetrics: TCapability;
8
+ readonly diskResidentScans: TCapability;
9
+ }
10
+ export interface IOperationOptions {
11
+ signal?: AbortSignal;
12
+ timeoutMs?: number;
13
+ }
14
+ export interface IReadiness {
15
+ ready: boolean;
16
+ reason?: string;
17
+ }
18
+ export type TClientErrorCode = 'invalid_argument' | 'unsupported_capability' | 'not_connected' | 'closed' | 'timeout' | 'cancelled' | 'result_limit' | 'authentication' | 'conflict' | 'backend_error' | 'ambiguous_write' | 'partial_write';
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvcmUvaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,4 @@
1
+ export { LosslessOrgClient } from './classes.losslessorgclient.js';
2
+ export type { ILosslessOrgClientOptions } from './classes.losslessorgclient.js';
3
+ export { LosslessClientError } from './core/classes.error.js';
4
+ export type { ICapabilities, IOperationOptions, IReadiness, TBackend, TCapability, TClientErrorCode } from './core/interfaces.js';
@@ -0,0 +1,3 @@
1
+ export { LosslessOrgClient } from './classes.losslessorgclient.js';
2
+ export { LosslessClientError } from './core/classes.error.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQyJ9
@@ -0,0 +1,26 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { SmartdataCollection } from './classes.collection.js';
3
+ import { type TSmartdataOrdinarySession } from './classes.session.js';
4
+ /**
5
+ * Executes a model-validated atomic delete against MongoDB.
6
+ *
7
+ * This helper is package-internal. `SmartDataDbDoc.atomicDelete()` owns the
8
+ * public API and must validate every filter before calling this raw persistence
9
+ * boundary.
10
+ */
11
+ export declare const executeAtomicDelete: <T>(collectionArg: SmartdataCollection<T>, filterArg: plugins.mongodb.Filter<plugins.mongodb.Document>, optsArg?: {
12
+ session?: TSmartdataOrdinarySession;
13
+ timeoutMS?: number;
14
+ }) => Promise<plugins.mongodb.DeleteResult>;
15
+ /**
16
+ * Executes a model-validated atomic delete-many against MongoDB.
17
+ *
18
+ * This helper is package-internal. `SmartDataDbDoc.atomicDeleteMany()` owns
19
+ * the public API and must validate every filter before calling this raw
20
+ * persistence boundary. Each matched document is deleted atomically; the
21
+ * batch as a whole is not isolated.
22
+ */
23
+ export declare const executeAtomicDeleteMany: <T>(collectionArg: SmartdataCollection<T>, filterArg: plugins.mongodb.Filter<plugins.mongodb.Document>, optsArg?: {
24
+ session?: TSmartdataOrdinarySession;
25
+ timeoutMS?: number;
26
+ }) => Promise<plugins.mongodb.DeleteResult>;
@@ -0,0 +1,44 @@
1
+ import * as plugins from './plugins.js';
2
+ import { runWithOrdinarySmartdataSession, } from './classes.session.js';
3
+ /**
4
+ * Executes a model-validated atomic delete against MongoDB.
5
+ *
6
+ * This helper is package-internal. `SmartDataDbDoc.atomicDelete()` owns the
7
+ * public API and must validate every filter before calling this raw persistence
8
+ * boundary.
9
+ */
10
+ export const executeAtomicDelete = async (collectionArg, filterArg, optsArg) => {
11
+ return runWithOrdinarySmartdataSession(optsArg?.session, collectionArg.smartdataDb, {
12
+ ordinaryWrite: true,
13
+ prepared: collectionArg.isInitializedForCurrentDatabase(),
14
+ preparationMessage: `Initialize collection "${collectionArg.collectionName}" before using an owned SmartData session.`,
15
+ }, async (rawSessionArg) => {
16
+ await collectionArg.init();
17
+ return collectionArg.mongoDbCollection.deleteOne(filterArg, {
18
+ session: rawSessionArg,
19
+ timeoutMS: optsArg?.timeoutMS,
20
+ });
21
+ });
22
+ };
23
+ /**
24
+ * Executes a model-validated atomic delete-many against MongoDB.
25
+ *
26
+ * This helper is package-internal. `SmartDataDbDoc.atomicDeleteMany()` owns
27
+ * the public API and must validate every filter before calling this raw
28
+ * persistence boundary. Each matched document is deleted atomically; the
29
+ * batch as a whole is not isolated.
30
+ */
31
+ export const executeAtomicDeleteMany = async (collectionArg, filterArg, optsArg) => {
32
+ return runWithOrdinarySmartdataSession(optsArg?.session, collectionArg.smartdataDb, {
33
+ ordinaryWrite: true,
34
+ prepared: collectionArg.isInitializedForCurrentDatabase(),
35
+ preparationMessage: `Initialize collection "${collectionArg.collectionName}" before using an owned SmartData session.`,
36
+ }, async (rawSessionArg) => {
37
+ await collectionArg.init();
38
+ return collectionArg.mongoDbCollection.deleteMany(filterArg, {
39
+ session: rawSessionArg,
40
+ timeoutMS: optsArg?.timeoutMS,
41
+ });
42
+ });
43
+ };
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdG9taWNkZWxldGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2NsYXNzZXMuYXRvbWljZGVsZXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTCwrQkFBK0IsR0FFaEMsTUFBTSxzQkFBc0IsQ0FBQztBQUU5Qjs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQ3RDLGFBQXFDLEVBQ3JDLFNBQTJELEVBQzNELE9BR0MsRUFDc0MsRUFBRTtJQUN6QyxPQUFPLCtCQUErQixDQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUNoQixhQUFhLENBQUMsV0FBVyxFQUN6QjtRQUNFLGFBQWEsRUFBRSxJQUFJO1FBQ25CLFFBQVEsRUFBRSxhQUFhLENBQUMsK0JBQStCLEVBQUU7UUFDekQsa0JBQWtCLEVBQ2hCLDBCQUEwQixhQUFhLENBQUMsY0FBYyw0Q0FBNEM7S0FDckcsRUFDRCxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUU7UUFDdEIsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsT0FBTyxhQUFhLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUM5QyxTQUFTLEVBQ1Q7WUFDRSxPQUFPLEVBQUUsYUFBYTtZQUN0QixTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVM7U0FDOUIsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxFQUMxQyxhQUFxQyxFQUNyQyxTQUEyRCxFQUMzRCxPQUdDLEVBQ3NDLEVBQUU7SUFDekMsT0FBTywrQkFBK0IsQ0FDcEMsT0FBTyxFQUFFLE9BQU8sRUFDaEIsYUFBYSxDQUFDLFdBQVcsRUFDekI7UUFDRSxhQUFhLEVBQUUsSUFBSTtRQUNuQixRQUFRLEVBQUUsYUFBYSxDQUFDLCtCQUErQixFQUFFO1FBQ3pELGtCQUFrQixFQUNoQiwwQkFBMEIsYUFBYSxDQUFDLGNBQWMsNENBQTRDO0tBQ3JHLEVBQ0QsS0FBSyxFQUFFLGFBQWEsRUFBRSxFQUFFO1FBQ3RCLE1BQU0sYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLE9BQU8sYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FDL0MsU0FBUyxFQUNUO1lBQ0UsT0FBTyxFQUFFLGFBQWE7WUFDdEIsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO1NBQzlCLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
@@ -0,0 +1,27 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { SmartdataCollection } from './classes.collection.js';
3
+ import { type TSmartdataOrdinarySession } from './classes.session.js';
4
+ type TRawDocument = plugins.mongodb.WithId<plugins.mongodb.Document>;
5
+ export type TAtomicFindOneAndUpdateExecutionResult = {
6
+ status: 'matched';
7
+ document: TRawDocument;
8
+ } | {
9
+ status: 'upserted';
10
+ document: TRawDocument | null;
11
+ } | {
12
+ status: 'not_matched';
13
+ document: null;
14
+ };
15
+ /**
16
+ * Executes a model-validated atomic find-one-and-update against MongoDB.
17
+ *
18
+ * This helper is package-internal. It classifies driver metadata before
19
+ * returning and never exposes a MongoDB ModifyResult to the public model API.
20
+ */
21
+ export declare const executeAtomicFindOneAndUpdate: <T>(collectionArg: SmartdataCollection<T>, filterArg: plugins.mongodb.Filter<plugins.mongodb.Document>, updateArg: plugins.mongodb.UpdateFilter<plugins.mongodb.Document>, optionsArg: {
22
+ returnDocument: "before" | "after";
23
+ upsert: boolean;
24
+ sort?: Record<string, 1 | -1>;
25
+ session?: TSmartdataOrdinarySession;
26
+ }) => Promise<TAtomicFindOneAndUpdateExecutionResult>;
27
+ export {};
@@ -0,0 +1,86 @@
1
+ import * as plugins from './plugins.js';
2
+ import { normalizeOrdinaryPersistenceError, SmartdataPersistenceError, } from './classes.persistence.js';
3
+ import { runWithOrdinarySmartdataSession, isSmartdataSession, failSmartdataTransaction, } from './classes.session.js';
4
+ import { validateOrdinaryStoredDocument } from './classes.ordinarypersistence.js';
5
+ const unsupportedResult = () => {
6
+ throw new SmartdataPersistenceError('unsupported_operation', 'MongoDB returned unsupported atomic find-one-and-update metadata.');
7
+ };
8
+ const classifyResult = (resultArg, optionsArg) => {
9
+ const metadata = resultArg.lastErrorObject;
10
+ if (resultArg.ok !== 1 || !metadata)
11
+ return unsupportedResult();
12
+ const hasUpserted = Object.prototype.hasOwnProperty.call(metadata, 'upserted');
13
+ const upserted = metadata.upserted;
14
+ if (metadata.n === 1
15
+ && metadata.updatedExisting === true
16
+ && !hasUpserted
17
+ && resultArg.value !== null) {
18
+ return { status: 'matched', document: resultArg.value };
19
+ }
20
+ if (optionsArg.upsert
21
+ && metadata.n === 1
22
+ && metadata.updatedExisting === false
23
+ && hasUpserted
24
+ && upserted !== undefined
25
+ && upserted !== null
26
+ && ((optionsArg.returnDocument === 'before' && resultArg.value === null)
27
+ || (optionsArg.returnDocument === 'after' && resultArg.value !== null))) {
28
+ return { status: 'upserted', document: resultArg.value };
29
+ }
30
+ if (!optionsArg.upsert
31
+ && metadata.n === 0
32
+ && metadata.updatedExisting === false
33
+ && !hasUpserted
34
+ && resultArg.value === null) {
35
+ return { status: 'not_matched', document: null };
36
+ }
37
+ return unsupportedResult();
38
+ };
39
+ /**
40
+ * Executes a model-validated atomic find-one-and-update against MongoDB.
41
+ *
42
+ * This helper is package-internal. It classifies driver metadata before
43
+ * returning and never exposes a MongoDB ModifyResult to the public model API.
44
+ */
45
+ export const executeAtomicFindOneAndUpdate = async (collectionArg, filterArg, updateArg, optionsArg) => {
46
+ const policy = collectionArg.getBoundModelSchema()?.ordinaryPersistence;
47
+ if (policy && (!isSmartdataSession(optionsArg.session) || optionsArg.returnDocument !== 'after')) {
48
+ throw new SmartdataPersistenceError('unsupported_operation', 'Validated ordinary updates require an owned transaction and an after image.');
49
+ }
50
+ return runWithOrdinarySmartdataSession(optionsArg.session, collectionArg.smartdataDb, {
51
+ ordinaryWrite: true,
52
+ prepared: collectionArg.isInitializedForCurrentDatabase(),
53
+ preparationMessage: `Initialize collection "${collectionArg.collectionName}" before using an owned SmartData session.`,
54
+ }, async (rawSessionArg) => {
55
+ if (policy && !rawSessionArg?.inTransaction()) {
56
+ throw new SmartdataPersistenceError('unsupported_operation', 'Validated ordinary updates require an active owned transaction.');
57
+ }
58
+ await collectionArg.init();
59
+ try {
60
+ const result = await collectionArg.mongoDbCollection.findOneAndUpdate(filterArg, updateArg, {
61
+ includeResultMetadata: true,
62
+ returnDocument: optionsArg.returnDocument,
63
+ upsert: optionsArg.upsert,
64
+ ...(optionsArg.sort ? { sort: optionsArg.sort } : {}),
65
+ session: rawSessionArg,
66
+ });
67
+ try {
68
+ const classified = classifyResult(result, optionsArg);
69
+ if (policy && classified.document) {
70
+ classified.document = validateOrdinaryStoredDocument(classified.document, policy, collectionArg.getBoundModelSchema().persistedFields);
71
+ }
72
+ return classified;
73
+ }
74
+ catch (errorArg) {
75
+ if (policy) {
76
+ failSmartdataTransaction(optionsArg.session, collectionArg.smartdataDb, errorArg);
77
+ }
78
+ throw errorArg;
79
+ }
80
+ }
81
+ catch (errorArg) {
82
+ return normalizeOrdinaryPersistenceError(errorArg, `Atomic find-one-and-update conflicts with a unique index in collection "${collectionArg.collectionName}".`);
83
+ }
84
+ });
85
+ };
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdG9taWNmaW5kb25lYW5kdXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLmF0b21pY2ZpbmRvbmVhbmR1cGRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUNMLGlDQUFpQyxFQUNqQyx5QkFBeUIsR0FDMUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGtCQUFrQixFQUNsQix3QkFBd0IsR0FHekIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVNsRixNQUFNLGlCQUFpQixHQUFHLEdBQVUsRUFBRTtJQUNwQyxNQUFNLElBQUkseUJBQXlCLENBQ2pDLHVCQUF1QixFQUN2QixtRUFBbUUsQ0FDcEUsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQ3JCLFNBQWlFLEVBQ2pFLFVBR0MsRUFDdUMsRUFBRTtJQUMxQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDO0lBQzNDLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2hFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0UsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUVuQyxJQUNFLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQztXQUNiLFFBQVEsQ0FBQyxlQUFlLEtBQUssSUFBSTtXQUNqQyxDQUFDLFdBQVc7V0FDWixTQUFTLENBQUMsS0FBSyxLQUFLLElBQUksRUFDM0IsQ0FB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
@@ -0,0 +1,26 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { SmartdataCollection } from './classes.collection.js';
3
+ import { type TSmartdataOrdinarySession } from './classes.session.js';
4
+ /**
5
+ * Executes a model-validated atomic update against MongoDB.
6
+ *
7
+ * This helper is package-internal. `SmartDataDbDoc.atomicUpdate()` owns the
8
+ * public API and must validate and normalize every filter and update before
9
+ * calling this raw persistence boundary.
10
+ */
11
+ export declare const executeAtomicUpdate: <T>(collectionArg: SmartdataCollection<T>, filterArg: plugins.mongodb.Filter<plugins.mongodb.Document>, updateArg: plugins.mongodb.UpdateFilter<plugins.mongodb.Document>, optsArg?: {
12
+ upsert?: boolean;
13
+ session?: TSmartdataOrdinarySession;
14
+ }) => Promise<plugins.mongodb.UpdateResult>;
15
+ /**
16
+ * Executes a model-validated atomic update-many against MongoDB.
17
+ *
18
+ * This helper is package-internal. `SmartDataDbDoc.atomicUpdateMany()` owns
19
+ * the public API and must validate and normalize every filter and update
20
+ * before calling this raw persistence boundary. Each matched document is
21
+ * updated atomically; the batch as a whole is not isolated and no upsert is
22
+ * possible.
23
+ */
24
+ export declare const executeAtomicUpdateMany: <T>(collectionArg: SmartdataCollection<T>, filterArg: plugins.mongodb.Filter<plugins.mongodb.Document>, updateArg: plugins.mongodb.UpdateFilter<plugins.mongodb.Document>, optsArg?: {
25
+ session?: TSmartdataOrdinarySession;
26
+ }) => Promise<plugins.mongodb.UpdateResult>;