@lossless.org/client 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.smartconfig.json +37 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.losslessorgclient.d.ts +32 -0
- package/dist_ts/classes.losslessorgclient.js +103 -0
- package/dist_ts/core/classes.error.d.ts +16 -0
- package/dist_ts/core/classes.error.js +29 -0
- package/dist_ts/core/classes.operation.d.ts +17 -0
- package/dist_ts/core/classes.operation.js +70 -0
- package/dist_ts/core/interfaces.d.ts +18 -0
- package/dist_ts/core/interfaces.js +2 -0
- package/dist_ts/index.d.ts +4 -0
- package/dist_ts/index.js +3 -0
- package/dist_ts/nosqldb/classes.atomicdelete.d.ts +26 -0
- package/dist_ts/nosqldb/classes.atomicdelete.js +44 -0
- package/dist_ts/nosqldb/classes.atomicfindoneandupdate.d.ts +27 -0
- package/dist_ts/nosqldb/classes.atomicfindoneandupdate.js +86 -0
- package/dist_ts/nosqldb/classes.atomicupdate.d.ts +26 -0
- package/dist_ts/nosqldb/classes.atomicupdate.js +55 -0
- package/dist_ts/nosqldb/classes.bootstraprecord.d.ts +14 -0
- package/dist_ts/nosqldb/classes.bootstraprecord.js +80 -0
- package/dist_ts/nosqldb/classes.bsonassertion.d.ts +2 -0
- package/dist_ts/nosqldb/classes.bsonassertion.js +29 -0
- package/dist_ts/nosqldb/classes.bsonobjectid.d.ts +2 -0
- package/dist_ts/nosqldb/classes.bsonobjectid.js +50 -0
- package/dist_ts/nosqldb/classes.bsonsnapshot.d.ts +3 -0
- package/dist_ts/nosqldb/classes.bsonsnapshot.js +126 -0
- package/dist_ts/nosqldb/classes.cached-document.d.ts +27 -0
- package/dist_ts/nosqldb/classes.cached-document.js +112 -0
- package/dist_ts/nosqldb/classes.collection.d.ts +302 -0
- package/dist_ts/nosqldb/classes.collection.js +1568 -0
- package/dist_ts/nosqldb/classes.collectionfactory.d.ts +30 -0
- package/dist_ts/nosqldb/classes.collectionfactory.js +65 -0
- package/dist_ts/nosqldb/classes.collectionlifecycle.d.ts +4 -0
- package/dist_ts/nosqldb/classes.collectionlifecycle.js +15 -0
- package/dist_ts/nosqldb/classes.collectionpreparation.d.ts +34 -0
- package/dist_ts/nosqldb/classes.collectionpreparation.js +134 -0
- package/dist_ts/nosqldb/classes.collectiontopology.d.ts +47 -0
- package/dist_ts/nosqldb/classes.collectiontopology.js +388 -0
- package/dist_ts/nosqldb/classes.connection.d.ts +18 -0
- package/dist_ts/nosqldb/classes.connection.js +23 -0
- package/dist_ts/nosqldb/classes.convenience.d.ts +1 -0
- package/dist_ts/nosqldb/classes.convenience.js +5 -0
- package/dist_ts/nosqldb/classes.cursor.d.ts +15 -0
- package/dist_ts/nosqldb/classes.cursor.js +82 -0
- package/dist_ts/nosqldb/classes.cursoroperation.d.ts +7 -0
- package/dist_ts/nosqldb/classes.cursoroperation.js +36 -0
- package/dist_ts/nosqldb/classes.db.d.ts +98 -0
- package/dist_ts/nosqldb/classes.db.js +434 -0
- package/dist_ts/nosqldb/classes.distributedcoordinator.d.ts +52 -0
- package/dist_ts/nosqldb/classes.distributedcoordinator.js +314 -0
- package/dist_ts/nosqldb/classes.doc.d.ts +722 -0
- package/dist_ts/nosqldb/classes.doc.js +2976 -0
- package/dist_ts/nosqldb/classes.easystore.d.ts +42 -0
- package/dist_ts/nosqldb/classes.easystore.js +199 -0
- package/dist_ts/nosqldb/classes.exactpersistence.d.ts +141 -0
- package/dist_ts/nosqldb/classes.exactpersistence.js +1110 -0
- package/dist_ts/nosqldb/classes.lucene.adapter.d.ts +173 -0
- package/dist_ts/nosqldb/classes.lucene.adapter.js +623 -0
- package/dist_ts/nosqldb/classes.mongoadministration.d.ts +73 -0
- package/dist_ts/nosqldb/classes.mongoadministration.js +497 -0
- package/dist_ts/nosqldb/classes.namespaceinspection.d.ts +42 -0
- package/dist_ts/nosqldb/classes.namespaceinspection.js +138 -0
- package/dist_ts/nosqldb/classes.operationbudget.d.ts +22 -0
- package/dist_ts/nosqldb/classes.operationbudget.js +65 -0
- package/dist_ts/nosqldb/classes.ordinarypersistence.d.ts +18 -0
- package/dist_ts/nosqldb/classes.ordinarypersistence.js +71 -0
- package/dist_ts/nosqldb/classes.persistence.d.ts +14 -0
- package/dist_ts/nosqldb/classes.persistence.js +34 -0
- package/dist_ts/nosqldb/classes.session.d.ts +28 -0
- package/dist_ts/nosqldb/classes.session.js +246 -0
- package/dist_ts/nosqldb/classes.storedinspection.d.ts +44 -0
- package/dist_ts/nosqldb/classes.storedinspection.js +100 -0
- package/dist_ts/nosqldb/classes.testdatabase.d.ts +56 -0
- package/dist_ts/nosqldb/classes.testdatabase.js +250 -0
- package/dist_ts/nosqldb/classes.watcher.d.ts +37 -0
- package/dist_ts/nosqldb/classes.watcher.js +98 -0
- package/dist_ts/nosqldb/index.d.ts +27 -0
- package/dist_ts/nosqldb/index.js +18 -0
- package/dist_ts/nosqldb/logging.d.ts +2 -0
- package/dist_ts/nosqldb/logging.js +3 -0
- package/dist_ts/nosqldb/plugins.d.ts +17 -0
- package/dist_ts/nosqldb/plugins.js +20 -0
- package/dist_ts/nosqldb/shim.d.ts +1 -0
- package/dist_ts/nosqldb/shim.js +8 -0
- package/dist_ts/nosqldb/testsupport.d.ts +3 -0
- package/dist_ts/nosqldb/testsupport.js +3 -0
- package/dist_ts/objectstorage/classes.bucket.d.ts +227 -0
- package/dist_ts/objectstorage/classes.bucket.js +939 -0
- package/dist_ts/objectstorage/classes.connection.d.ts +21 -0
- package/dist_ts/objectstorage/classes.connection.js +27 -0
- package/dist_ts/objectstorage/classes.directory.d.ts +124 -0
- package/dist_ts/objectstorage/classes.directory.js +335 -0
- package/dist_ts/objectstorage/classes.exactpathpurgeerror.d.ts +5 -0
- package/dist_ts/objectstorage/classes.exactpathpurgeerror.js +18 -0
- package/dist_ts/objectstorage/classes.exactuploaderror.d.ts +5 -0
- package/dist_ts/objectstorage/classes.exactuploaderror.js +19 -0
- package/dist_ts/objectstorage/classes.file.d.ts +91 -0
- package/dist_ts/objectstorage/classes.file.js +255 -0
- package/dist_ts/objectstorage/classes.listcursor.d.ts +41 -0
- package/dist_ts/objectstorage/classes.listcursor.js +67 -0
- package/dist_ts/objectstorage/classes.metadata.d.ts +57 -0
- package/dist_ts/objectstorage/classes.metadata.js +113 -0
- package/dist_ts/objectstorage/classes.smartbucket.d.ts +57 -0
- package/dist_ts/objectstorage/classes.smartbucket.js +357 -0
- package/dist_ts/objectstorage/classes.trash.d.ts +11 -0
- package/dist_ts/objectstorage/classes.trash.js +22 -0
- package/dist_ts/objectstorage/classes.watcher.d.ts +79 -0
- package/dist_ts/objectstorage/classes.watcher.js +249 -0
- package/dist_ts/objectstorage/helpers.d.ts +25 -0
- package/dist_ts/objectstorage/helpers.js +215 -0
- package/dist_ts/objectstorage/index.d.ts +13 -0
- package/dist_ts/objectstorage/index.js +13 -0
- package/dist_ts/objectstorage/interfaces.d.ts +276 -0
- package/dist_ts/objectstorage/interfaces.js +2 -0
- package/dist_ts/objectstorage/internal.exactpathpurge.operations.d.ts +11 -0
- package/dist_ts/objectstorage/internal.exactpathpurge.operations.js +1069 -0
- package/dist_ts/objectstorage/internal.exactupload.capability.d.ts +40 -0
- package/dist_ts/objectstorage/internal.exactupload.capability.js +382 -0
- package/dist_ts/objectstorage/internal.exactupload.operations.d.ts +11 -0
- package/dist_ts/objectstorage/internal.exactupload.operations.js +1104 -0
- package/dist_ts/objectstorage/internal.multipart.planner.d.ts +8 -0
- package/dist_ts/objectstorage/internal.multipart.planner.js +63 -0
- package/dist_ts/objectstorage/internal.multipart.stream.d.ts +17 -0
- package/dist_ts/objectstorage/internal.multipart.stream.js +440 -0
- package/dist_ts/objectstorage/internal.multipart.types.d.ts +82 -0
- package/dist_ts/objectstorage/internal.multipart.types.js +2 -0
- package/dist_ts/objectstorage/plugins.d.ts +17 -0
- package/dist_ts/objectstorage/plugins.js +23 -0
- package/dist_ts/plugins.d.ts +4 -0
- package/dist_ts/plugins.js +5 -0
- package/dist_ts/sqldb/classes.clickhouseconnection.d.ts +39 -0
- package/dist_ts/sqldb/classes.clickhouseconnection.js +225 -0
- package/dist_ts/sqldb/classes.sqlconnection.d.ts +50 -0
- package/dist_ts/sqldb/classes.sqlconnection.js +376 -0
- package/dist_ts/sqldb/classes.sqltable.d.ts +29 -0
- package/dist_ts/sqldb/classes.sqltable.js +70 -0
- package/dist_ts/sqldb/clickhouse/classes.metricwriter.d.ts +27 -0
- package/dist_ts/sqldb/clickhouse/classes.metricwriter.js +89 -0
- package/dist_ts/sqldb/clickhouse/index.d.ts +9 -0
- package/dist_ts/sqldb/clickhouse/index.js +13 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.d.ts +88 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.js +304 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.d.ts +28 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.js +46 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.d.ts +43 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.js +155 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.resultset.d.ts +13 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.resultset.js +36 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.d.ts +49 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.js +106 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.d.ts +51 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.js +96 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.plugins.d.ts +5 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.plugins.js +6 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.types.d.ts +53 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.types.js +41 -0
- package/dist_ts/sqldb/index.d.ts +6 -0
- package/dist_ts/sqldb/index.js +6 -0
- package/dist_ts/sqldb/interfaces.d.ts +53 -0
- package/dist_ts/sqldb/interfaces.js +19 -0
- package/dist_ts/sqldb/internal.sqlpool.d.ts +51 -0
- package/dist_ts/sqldb/internal.sqlpool.js +214 -0
- package/dist_ts/sqldb/plugins.clickhouse.d.ts +4 -0
- package/dist_ts/sqldb/plugins.clickhouse.js +5 -0
- package/dist_ts/sqldb/plugins.mariadb.d.ts +4 -0
- package/dist_ts/sqldb/plugins.mariadb.js +5 -0
- package/docs/source/smartbucket/license.md +19 -0
- package/docs/source/smartclickhouse/license.md +19 -0
- package/license.md +21 -0
- package/package.json +101 -0
- package/readme.md +157 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.losslessorgclient.ts +104 -0
- package/ts/core/classes.error.ts +31 -0
- package/ts/core/classes.operation.ts +60 -0
- package/ts/core/interfaces.ts +24 -0
- package/ts/index.ts +4 -0
- package/ts/nosqldb/classes.atomicdelete.ts +81 -0
- package/ts/nosqldb/classes.atomicfindoneandupdate.ts +152 -0
- package/ts/nosqldb/classes.atomicupdate.ts +99 -0
- package/ts/nosqldb/classes.bootstraprecord.ts +107 -0
- package/ts/nosqldb/classes.bsonassertion.ts +25 -0
- package/ts/nosqldb/classes.bsonobjectid.ts +45 -0
- package/ts/nosqldb/classes.bsonsnapshot.ts +105 -0
- package/ts/nosqldb/classes.cached-document.ts +67 -0
- package/ts/nosqldb/classes.collection.ts +2399 -0
- package/ts/nosqldb/classes.collectionfactory.ts +87 -0
- package/ts/nosqldb/classes.collectionlifecycle.ts +24 -0
- package/ts/nosqldb/classes.collectionpreparation.ts +164 -0
- package/ts/nosqldb/classes.collectiontopology.ts +645 -0
- package/ts/nosqldb/classes.connection.ts +31 -0
- package/ts/nosqldb/classes.convenience.ts +5 -0
- package/ts/nosqldb/classes.cursor.ts +88 -0
- package/ts/nosqldb/classes.cursoroperation.ts +38 -0
- package/ts/nosqldb/classes.db.ts +637 -0
- package/ts/nosqldb/classes.distributedcoordinator.ts +305 -0
- package/ts/nosqldb/classes.doc.ts +4928 -0
- package/ts/nosqldb/classes.easystore.ts +154 -0
- package/ts/nosqldb/classes.exactpersistence.ts +1974 -0
- package/ts/nosqldb/classes.lucene.adapter.ts +780 -0
- package/ts/nosqldb/classes.mongoadministration.ts +867 -0
- package/ts/nosqldb/classes.namespaceinspection.ts +199 -0
- package/ts/nosqldb/classes.operationbudget.ts +75 -0
- package/ts/nosqldb/classes.ordinarypersistence.ts +84 -0
- package/ts/nosqldb/classes.persistence.ts +62 -0
- package/ts/nosqldb/classes.session.ts +389 -0
- package/ts/nosqldb/classes.storedinspection.ts +151 -0
- package/ts/nosqldb/classes.testdatabase.ts +272 -0
- package/ts/nosqldb/classes.watcher.ts +96 -0
- package/ts/nosqldb/index.ts +51 -0
- package/ts/nosqldb/logging.ts +3 -0
- package/ts/nosqldb/plugins.ts +37 -0
- package/ts/nosqldb/shim.ts +6 -0
- package/ts/nosqldb/testsupport.ts +13 -0
- package/ts/objectstorage/classes.bucket.ts +1114 -0
- package/ts/objectstorage/classes.connection.ts +36 -0
- package/ts/objectstorage/classes.directory.ts +425 -0
- package/ts/objectstorage/classes.exactpathpurgeerror.ts +24 -0
- package/ts/objectstorage/classes.exactuploaderror.ts +25 -0
- package/ts/objectstorage/classes.file.ts +303 -0
- package/ts/objectstorage/classes.listcursor.ts +89 -0
- package/ts/objectstorage/classes.metadata.ts +134 -0
- package/ts/objectstorage/classes.smartbucket.ts +445 -0
- package/ts/objectstorage/classes.trash.ts +30 -0
- package/ts/objectstorage/classes.watcher.ts +289 -0
- package/ts/objectstorage/helpers.ts +254 -0
- package/ts/objectstorage/index.ts +13 -0
- package/ts/objectstorage/interfaces.ts +389 -0
- package/ts/objectstorage/internal.exactpathpurge.operations.ts +1936 -0
- package/ts/objectstorage/internal.exactupload.capability.ts +580 -0
- package/ts/objectstorage/internal.exactupload.operations.ts +1715 -0
- package/ts/objectstorage/internal.multipart.planner.ts +90 -0
- package/ts/objectstorage/internal.multipart.stream.ts +606 -0
- package/ts/objectstorage/internal.multipart.types.ts +106 -0
- package/ts/objectstorage/plugins.ts +35 -0
- package/ts/plugins.ts +4 -0
- package/ts/sqldb/classes.clickhouseconnection.ts +189 -0
- package/ts/sqldb/classes.sqlconnection.ts +350 -0
- package/ts/sqldb/classes.sqltable.ts +70 -0
- package/ts/sqldb/clickhouse/classes.metricwriter.ts +72 -0
- package/ts/sqldb/clickhouse/index.ts +16 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.ts +372 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.ts +52 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.ts +120 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.resultset.ts +44 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.ts +123 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.ts +114 -0
- package/ts/sqldb/clickhouse/smartclickhouse.plugins.ts +5 -0
- package/ts/sqldb/clickhouse/smartclickhouse.types.ts +134 -0
- package/ts/sqldb/index.ts +6 -0
- package/ts/sqldb/interfaces.ts +61 -0
- package/ts/sqldb/internal.sqlpool.ts +179 -0
- package/ts/sqldb/plugins.clickhouse.ts +4 -0
- package/ts/sqldb/plugins.mariadb.ts +4 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SmartdataCollection, type INormalizedCollectionModelSchema } from './classes.collection.js';
|
|
2
|
+
import { SmartdataDb } from './classes.db.js';
|
|
3
|
+
/**
|
|
4
|
+
* Per-SmartdataDb collection cache.
|
|
5
|
+
*
|
|
6
|
+
* Historically this class keyed its cache by class name alone, which meant
|
|
7
|
+
* the first SmartdataDb to request a collection of a given class name
|
|
8
|
+
* "won" — every subsequent call from a different SmartdataDb instance
|
|
9
|
+
* received the cached collection bound to the first db. That silently
|
|
10
|
+
* broke multi-tenant SaaS apps (one db per tenant), tests instantiating
|
|
11
|
+
* multiple SmartdataDbs in sequence, and any in-process db cluster switch.
|
|
12
|
+
*
|
|
13
|
+
* The cache is now keyed by `(SmartdataDb instance, className)` using a
|
|
14
|
+
* WeakMap of db → Map<className, SmartdataCollection>. Entries are GC'd
|
|
15
|
+
* with their parent db automatically.
|
|
16
|
+
*/
|
|
17
|
+
export declare class CollectionFactory {
|
|
18
|
+
private perDbCollections;
|
|
19
|
+
getCollection: (nameArg: string, dbArg: SmartdataDb, schemaArg?: INormalizedCollectionModelSchema) => SmartdataCollection<any>;
|
|
20
|
+
/**
|
|
21
|
+
* @deprecated Internal back-compat shim. The previous field was a public
|
|
22
|
+
* Record<className, SmartdataCollection> but was not part of the
|
|
23
|
+
* documented public API. WeakMap is not iterable, so this getter returns
|
|
24
|
+
* an empty object — anyone actually relying on the old shape would get
|
|
25
|
+
* clean nothing rather than wrong-db data. Will be removed in 8.0.
|
|
26
|
+
*/
|
|
27
|
+
get collections(): {
|
|
28
|
+
[key: string]: SmartdataCollection<any>;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { SmartdataCollection, } from './classes.collection.js';
|
|
3
|
+
import { SmartdataDb } from './classes.db.js';
|
|
4
|
+
import { SmartdataPersistenceError } from './classes.persistence.js';
|
|
5
|
+
/**
|
|
6
|
+
* Per-SmartdataDb collection cache.
|
|
7
|
+
*
|
|
8
|
+
* Historically this class keyed its cache by class name alone, which meant
|
|
9
|
+
* the first SmartdataDb to request a collection of a given class name
|
|
10
|
+
* "won" — every subsequent call from a different SmartdataDb instance
|
|
11
|
+
* received the cached collection bound to the first db. That silently
|
|
12
|
+
* broke multi-tenant SaaS apps (one db per tenant), tests instantiating
|
|
13
|
+
* multiple SmartdataDbs in sequence, and any in-process db cluster switch.
|
|
14
|
+
*
|
|
15
|
+
* The cache is now keyed by `(SmartdataDb instance, className)` using a
|
|
16
|
+
* WeakMap of db → Map<className, SmartdataCollection>. Entries are GC'd
|
|
17
|
+
* with their parent db automatically.
|
|
18
|
+
*/
|
|
19
|
+
export class CollectionFactory {
|
|
20
|
+
perDbCollections = new WeakMap();
|
|
21
|
+
getCollection = (nameArg, dbArg, schemaArg) => {
|
|
22
|
+
if (!(dbArg instanceof SmartdataDb)) {
|
|
23
|
+
// Preserve the historical behavior of returning undefined-ish for
|
|
24
|
+
// non-db args. All in-repo callers already guard on instanceof
|
|
25
|
+
// before using the result (see classes.collection.ts).
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
let dbMap = this.perDbCollections.get(dbArg);
|
|
29
|
+
if (!dbMap) {
|
|
30
|
+
dbMap = new Map();
|
|
31
|
+
this.perDbCollections.set(dbArg, dbMap);
|
|
32
|
+
}
|
|
33
|
+
let entry = dbMap.get(nameArg);
|
|
34
|
+
if (!entry) {
|
|
35
|
+
const collection = new SmartdataCollection(nameArg, dbArg);
|
|
36
|
+
entry = { collection, schema: schemaArg };
|
|
37
|
+
if (schemaArg) {
|
|
38
|
+
collection.bindModelSchema(schemaArg);
|
|
39
|
+
}
|
|
40
|
+
dbMap.set(nameArg, entry);
|
|
41
|
+
}
|
|
42
|
+
else if (schemaArg) {
|
|
43
|
+
if (entry.schema &&
|
|
44
|
+
entry.schema.fingerprint !== schemaArg.fingerprint) {
|
|
45
|
+
throw new SmartdataPersistenceError('invalid_configuration', `Collection "${nameArg}" already has a divergent model schema in this SmartdataDb.`);
|
|
46
|
+
}
|
|
47
|
+
if (!entry.schema) {
|
|
48
|
+
entry.schema = schemaArg;
|
|
49
|
+
}
|
|
50
|
+
entry.collection.bindModelSchema(schemaArg);
|
|
51
|
+
}
|
|
52
|
+
return entry.collection;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* @deprecated Internal back-compat shim. The previous field was a public
|
|
56
|
+
* Record<className, SmartdataCollection> but was not part of the
|
|
57
|
+
* documented public API. WeakMap is not iterable, so this getter returns
|
|
58
|
+
* an empty object — anyone actually relying on the old shape would get
|
|
59
|
+
* clean nothing rather than wrong-db data. Will be removed in 8.0.
|
|
60
|
+
*/
|
|
61
|
+
get collections() {
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2xsZWN0aW9uZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvY2xhc3Nlcy5jb2xsZWN0aW9uZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJFOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLGdCQUFnQixHQVNwQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRVgsYUFBYSxHQUFHLENBQ3JCLE9BQWUsRUFDZixLQUFrQixFQUNsQixTQUE0QyxFQUNsQixFQUFFO1FBQzVCLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3BDLGtFQUFrRTtZQUNsRSwrREFBK0Q7WUFDL0QsdURBQXVEO1lBQ3ZELE9BQU8sU0FBZ0QsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLFVBQVUsR0FBRyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRCxLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQzFDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsVUFBVSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQzthQUFNLElBQUksU0FBUyxFQUFFLENBQUM7WUFDckIsSUFDRSxLQUFLLENBQUMsTUFBTTtnQkFDWixLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsV0FBVyxFQUNsRCxDQUFDO2dCQUNELE1BQU0sSUFBSSx5QkFBeUIsQ0FDakMsdUJBQXVCLEVBQ3ZCLGVBQWUsT0FBTyw2REFBNkQsQ0FDcEYsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUMzQixDQUFDO1lBQ0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUMxQixDQUFDLENBQUM7SUFFRjs7Ozs7O09BTUc7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
type TCollectionReconnectHandler = () => void;
|
|
2
|
+
export declare const registerCollectionReconnectHandler: (collectionArg: object, handlerArg: TCollectionReconnectHandler) => void;
|
|
3
|
+
export declare const notifyCollectionReconnect: (collectionArg: object) => void;
|
|
4
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const reconnectHandlersByCollection = new WeakMap();
|
|
2
|
+
export const registerCollectionReconnectHandler = (collectionArg, handlerArg) => {
|
|
3
|
+
let handlers = reconnectHandlersByCollection.get(collectionArg);
|
|
4
|
+
if (!handlers) {
|
|
5
|
+
handlers = new Set();
|
|
6
|
+
reconnectHandlersByCollection.set(collectionArg, handlers);
|
|
7
|
+
}
|
|
8
|
+
handlers.add(handlerArg);
|
|
9
|
+
};
|
|
10
|
+
export const notifyCollectionReconnect = (collectionArg) => {
|
|
11
|
+
for (const handler of reconnectHandlersByCollection.get(collectionArg) || []) {
|
|
12
|
+
handler();
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2xsZWN0aW9ubGlmZWN5Y2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLmNvbGxlY3Rpb25saWZlY3ljbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLE9BQU8sRUFHOUMsQ0FBQztBQUVKLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLENBQ2hELGFBQXFCLEVBQ3JCLFVBQXVDLEVBQ2pDLEVBQUU7SUFDUixJQUFJLFFBQVEsR0FBRyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckIsNkJBQTZCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLGFBQXFCLEVBQVEsRUFBRTtJQUN2RSxLQUFLLE1BQU0sT0FBTyxJQUFJLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM3RSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
|
+
import type { INormalizedCollectionModelSchema } from './classes.collection.js';
|
|
3
|
+
export interface ISmartdataCollectionPreparationOptions {
|
|
4
|
+
/** Observe an exact topology, or install only missing declarations. */
|
|
5
|
+
mode: 'requireExact' | 'ensureCompatible';
|
|
6
|
+
/** Total budget including queueing and cursor cleanup: 1 through 120000 ms. */
|
|
7
|
+
timeoutMs: number;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
/** @internal Validate before resolving a model manager or starting a deadline. */
|
|
11
|
+
export declare const validateCollectionPreparationOptions: (opts: ISmartdataCollectionPreparationOptions) => void;
|
|
12
|
+
/** @internal Owns the explicit preparation caller's deadline and queue wait. */
|
|
13
|
+
export declare class CollectionPreparationBudget {
|
|
14
|
+
readonly signal: AbortSignal;
|
|
15
|
+
readonly mode: ISmartdataCollectionPreparationOptions['mode'];
|
|
16
|
+
private readonly deadline;
|
|
17
|
+
private readonly expiresAt;
|
|
18
|
+
private readonly timer;
|
|
19
|
+
constructor(opts: ISmartdataCollectionPreparationOptions);
|
|
20
|
+
private expire;
|
|
21
|
+
check(): void;
|
|
22
|
+
operationOptions(): {
|
|
23
|
+
timeoutMS: number;
|
|
24
|
+
};
|
|
25
|
+
/** Cleanup still runs after expiration; zero would disable the driver's timeout. */
|
|
26
|
+
cleanupOptions(): {
|
|
27
|
+
timeoutMS: number;
|
|
28
|
+
};
|
|
29
|
+
/** Cancellation detaches only this waiter, never the operation it is waiting for. */
|
|
30
|
+
waitFor(operationArg: Promise<void>): Promise<void>;
|
|
31
|
+
close(): void;
|
|
32
|
+
}
|
|
33
|
+
/** @internal No state is published until all commands and cleanup have settled. */
|
|
34
|
+
export declare const prepareBoundCollection: (dbArg: plugins.mongodb.Db, schemaArg: INormalizedCollectionModelSchema, budgetArg: CollectionPreparationBudget, assertCurrentArg: () => void) => Promise<plugins.mongodb.Collection>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { SmartdataPersistenceError } from './classes.persistence.js';
|
|
2
|
+
import { readBoundedInspectionCursor } from './classes.namespaceinspection.js';
|
|
3
|
+
import { getExpectedCollectionTopologyForSchema, inspectCollectionTopologySnapshot, } from './classes.collectiontopology.js';
|
|
4
|
+
/** @internal Validate before resolving a model manager or starting a deadline. */
|
|
5
|
+
export const validateCollectionPreparationOptions = (opts) => {
|
|
6
|
+
if (!opts || Object.getPrototypeOf(opts) !== Object.prototype ||
|
|
7
|
+
Reflect.ownKeys(opts).some((keyArg) => typeof keyArg !== 'string' ||
|
|
8
|
+
!['mode', 'timeoutMs', 'signal'].includes(keyArg) ||
|
|
9
|
+
!('value' in Object.getOwnPropertyDescriptor(opts, keyArg))) ||
|
|
10
|
+
!['requireExact', 'ensureCompatible'].includes(opts.mode) ||
|
|
11
|
+
!Number.isSafeInteger(opts.timeoutMs) || opts.timeoutMs < 1 || opts.timeoutMs > 120_000 ||
|
|
12
|
+
(opts.signal !== undefined && !(opts.signal instanceof AbortSignal))) {
|
|
13
|
+
throw new SmartdataPersistenceError('invalid_argument', 'Invalid collection preparation options.');
|
|
14
|
+
}
|
|
15
|
+
opts.signal?.throwIfAborted();
|
|
16
|
+
};
|
|
17
|
+
/** @internal Owns the explicit preparation caller's deadline and queue wait. */
|
|
18
|
+
export class CollectionPreparationBudget {
|
|
19
|
+
signal;
|
|
20
|
+
mode;
|
|
21
|
+
deadline = new AbortController();
|
|
22
|
+
expiresAt;
|
|
23
|
+
timer;
|
|
24
|
+
constructor(opts) {
|
|
25
|
+
validateCollectionPreparationOptions(opts);
|
|
26
|
+
this.mode = opts.mode;
|
|
27
|
+
this.expiresAt = performance.now() + opts.timeoutMs;
|
|
28
|
+
this.timer = setTimeout(() => this.expire(), opts.timeoutMs);
|
|
29
|
+
this.signal = opts.signal ? AbortSignal.any([opts.signal, this.deadline.signal]) : this.deadline.signal;
|
|
30
|
+
}
|
|
31
|
+
expire() {
|
|
32
|
+
this.deadline.abort(new SmartdataPersistenceError('unsupported_operation', 'Collection preparation deadline exceeded.'));
|
|
33
|
+
}
|
|
34
|
+
check() {
|
|
35
|
+
if (performance.now() >= this.expiresAt)
|
|
36
|
+
this.expire();
|
|
37
|
+
this.signal.throwIfAborted();
|
|
38
|
+
}
|
|
39
|
+
operationOptions() {
|
|
40
|
+
this.check();
|
|
41
|
+
return this.cleanupOptions();
|
|
42
|
+
}
|
|
43
|
+
/** Cleanup still runs after expiration; zero would disable the driver's timeout. */
|
|
44
|
+
cleanupOptions() {
|
|
45
|
+
return { timeoutMS: Math.max(1, Math.ceil(this.expiresAt - performance.now())) };
|
|
46
|
+
}
|
|
47
|
+
/** Cancellation detaches only this waiter, never the operation it is waiting for. */
|
|
48
|
+
async waitFor(operationArg) {
|
|
49
|
+
this.check();
|
|
50
|
+
await new Promise((resolveArg, rejectArg) => {
|
|
51
|
+
const onAbort = () => { cleanup(); rejectArg(this.signal.reason); };
|
|
52
|
+
const cleanup = () => this.signal.removeEventListener('abort', onAbort);
|
|
53
|
+
this.signal.addEventListener('abort', onAbort, { once: true });
|
|
54
|
+
operationArg.then(() => { cleanup(); resolveArg(); }, () => { cleanup(); resolveArg(); });
|
|
55
|
+
if (this.signal.aborted)
|
|
56
|
+
onAbort();
|
|
57
|
+
});
|
|
58
|
+
this.check();
|
|
59
|
+
}
|
|
60
|
+
close() { clearTimeout(this.timer); }
|
|
61
|
+
}
|
|
62
|
+
/** @internal No state is published until all commands and cleanup have settled. */
|
|
63
|
+
export const prepareBoundCollection = async (dbArg, schemaArg, budgetArg, assertCurrentArg) => {
|
|
64
|
+
const expected = getExpectedCollectionTopologyForSchema(schemaArg);
|
|
65
|
+
const collection = dbArg.collection(schemaArg.collectionName);
|
|
66
|
+
const check = () => { budgetArg.check(); assertCurrentArg(); };
|
|
67
|
+
const inspect = async () => {
|
|
68
|
+
check();
|
|
69
|
+
const namespaces = await readBoundedInspectionCursor(dbArg.listCollections({ name: schemaArg.collectionName }, { nameOnly: false, batchSize: 1, ...budgetArg.operationOptions(), signal: budgetArg.signal }), 1, budgetArg.signal, () => budgetArg.cleanupOptions());
|
|
70
|
+
check();
|
|
71
|
+
const namespace = namespaces[0];
|
|
72
|
+
const indexes = namespace?.type === 'collection'
|
|
73
|
+
? await readBoundedInspectionCursor(collection.listIndexes({
|
|
74
|
+
batchSize: 1, ...budgetArg.operationOptions(),
|
|
75
|
+
}), 64, budgetArg.signal, () => budgetArg.cleanupOptions())
|
|
76
|
+
: [];
|
|
77
|
+
check();
|
|
78
|
+
return inspectCollectionTopologySnapshot(expected, { namespace: namespace ?? null, indexes });
|
|
79
|
+
};
|
|
80
|
+
const requireAcceptable = (inspectionArg, exactArg) => {
|
|
81
|
+
if (inspectionArg.status === 'divergent' || (exactArg && inspectionArg.status !== 'exact')) {
|
|
82
|
+
throw new SmartdataPersistenceError('invalid_configuration', `Collection "${schemaArg.collectionName}" requires ${exactArg ? 'exact' : 'compatible'} topology: ` +
|
|
83
|
+
`${inspectionArg.status}${inspectionArg.reasonCodes.length ? ` (${inspectionArg.reasonCodes.join(', ')})` : ''}.`);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
let inspection = await inspect();
|
|
87
|
+
requireAcceptable(inspection, budgetArg.mode === 'requireExact');
|
|
88
|
+
if (budgetArg.mode === 'ensureCompatible' && inspection.status !== 'exact') {
|
|
89
|
+
if (inspection.status === 'absent') {
|
|
90
|
+
check();
|
|
91
|
+
try {
|
|
92
|
+
await dbArg.createCollection(schemaArg.collectionName, budgetArg.operationOptions());
|
|
93
|
+
}
|
|
94
|
+
catch (errorArg) {
|
|
95
|
+
if (errorArg?.code !== 48)
|
|
96
|
+
throw errorArg;
|
|
97
|
+
}
|
|
98
|
+
// A competing creator may have installed divergent options or indexes.
|
|
99
|
+
inspection = await inspect();
|
|
100
|
+
requireAcceptable(inspection, false);
|
|
101
|
+
if (inspection.status === 'absent') {
|
|
102
|
+
throw new SmartdataPersistenceError('unsupported_operation', 'Created collection is not observable.');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const existing = new Set(inspection.actualIndexes.map((indexArg) => indexArg.name));
|
|
106
|
+
for (const index of schemaArg.indexes) {
|
|
107
|
+
if (existing.has(index.name))
|
|
108
|
+
continue;
|
|
109
|
+
check();
|
|
110
|
+
try {
|
|
111
|
+
await collection.createIndex(Object.fromEntries(index.key), {
|
|
112
|
+
...index.options, name: index.name, ...budgetArg.operationOptions(),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (errorArg) {
|
|
116
|
+
// A rejected acknowledgement does not prove the index build failed.
|
|
117
|
+
// Continue only from compatible observed topology containing this exact
|
|
118
|
+
// declaration, within the same deadline and connection generation.
|
|
119
|
+
inspection = await inspect();
|
|
120
|
+
requireAcceptable(inspection, false);
|
|
121
|
+
if (!inspection.actualIndexes.some((actualArg) => actualArg.name === index.name)) {
|
|
122
|
+
throw errorArg;
|
|
123
|
+
}
|
|
124
|
+
for (const actual of inspection.actualIndexes)
|
|
125
|
+
existing.add(actual.name);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
inspection = await inspect();
|
|
129
|
+
requireAcceptable(inspection, true);
|
|
130
|
+
}
|
|
131
|
+
check();
|
|
132
|
+
return collection;
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2xsZWN0aW9ucHJlcGFyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2NsYXNzZXMuY29sbGVjdGlvbnByZXBhcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsaUNBQWlDLEdBQ2xDLE1BQU0saUNBQWlDLENBQUM7QUFVekMsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLENBQUMsSUFBNEMsRUFBUSxFQUFFO0lBQ3pHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUztRQUMzRCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUTtZQUMvRCxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxNQUFNLENBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN6RCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTztRQUN2RixDQUFDLElBQUksQ0FBQyxN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
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { INormalizedCollectionModelSchema } from './classes.collection.js';
|
|
2
|
+
import type { SmartdataDb } from './classes.db.js';
|
|
3
|
+
export type TSmartdataCollectionTopologyStatus = 'absent' | 'compatible' | 'exact' | 'divergent';
|
|
4
|
+
export type TSmartdataCollectionTopologyReasonCode = 'namespace_not_collection' | 'collection_options_present' | 'id_index_missing' | 'id_index_changed' | 'expected_index_missing' | 'unexpected_index' | 'index_changed' | 'unsupported_actual_index';
|
|
5
|
+
export type TSmartdataCollectionTopologyIndexDirection = 1 | -1 | 'text';
|
|
6
|
+
export interface ISmartdataCollectionTopologyIndexKey {
|
|
7
|
+
readonly path: string;
|
|
8
|
+
readonly direction: TSmartdataCollectionTopologyIndexDirection;
|
|
9
|
+
readonly weight: number | null;
|
|
10
|
+
}
|
|
11
|
+
export interface ISmartdataCollectionTopologyIndex {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly keys: readonly ISmartdataCollectionTopologyIndexKey[];
|
|
14
|
+
readonly unique: boolean;
|
|
15
|
+
readonly sparse: boolean;
|
|
16
|
+
readonly expireAfterSeconds: number | null;
|
|
17
|
+
}
|
|
18
|
+
export interface ISmartdataExpectedCollectionTopology {
|
|
19
|
+
readonly collectionName: string;
|
|
20
|
+
readonly indexes: readonly ISmartdataCollectionTopologyIndex[];
|
|
21
|
+
}
|
|
22
|
+
export interface ISmartdataCollectionTopologyInspection {
|
|
23
|
+
readonly collectionName: string;
|
|
24
|
+
readonly status: TSmartdataCollectionTopologyStatus;
|
|
25
|
+
readonly reasonCodes: readonly TSmartdataCollectionTopologyReasonCode[];
|
|
26
|
+
readonly expectedIndexes: readonly ISmartdataCollectionTopologyIndex[];
|
|
27
|
+
readonly actualIndexes: readonly ISmartdataCollectionTopologyIndex[];
|
|
28
|
+
}
|
|
29
|
+
type TCollectionModelSchemaResolver = () => INormalizedCollectionModelSchema;
|
|
30
|
+
export declare const collectionModelSchemaResolverSymbol: unique symbol;
|
|
31
|
+
export declare const collectionTopologyDbInspectionSymbol: unique symbol;
|
|
32
|
+
interface ICollectionTopologyModelConstructor {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly [collectionModelSchemaResolverSymbol]?: TCollectionModelSchemaResolver;
|
|
35
|
+
}
|
|
36
|
+
interface ICollectionTopologyRawSnapshot {
|
|
37
|
+
namespace: Record<string, unknown> | null;
|
|
38
|
+
indexes: unknown[];
|
|
39
|
+
}
|
|
40
|
+
export declare const compareSmartdataTopologyStrings: (leftArg: string, rightArg: string) => number;
|
|
41
|
+
export declare const getExpectedCollectionTopologyForModel: (constructorArg: ICollectionTopologyModelConstructor) => ISmartdataExpectedCollectionTopology;
|
|
42
|
+
/** @internal Normalizes the same contract for a bound collection. */
|
|
43
|
+
export declare const getExpectedCollectionTopologyForSchema: (schema: INormalizedCollectionModelSchema) => ISmartdataExpectedCollectionTopology;
|
|
44
|
+
export declare const inspectCollectionTopologyForModel: (constructorArg: ICollectionTopologyModelConstructor, dbArg: SmartdataDb) => Promise<ISmartdataCollectionTopologyInspection>;
|
|
45
|
+
/** @internal Pure normalization shared by model and namespace inspection. */
|
|
46
|
+
export declare const inspectCollectionTopologySnapshot: (expected: ISmartdataExpectedCollectionTopology, rawSnapshot: ICollectionTopologyRawSnapshot) => ISmartdataCollectionTopologyInspection;
|
|
47
|
+
export {};
|