@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,138 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { SmartdataPersistenceError } from './classes.persistence.js';
|
|
3
|
+
import { SmartdataSession, acquireSmartdataSession, isSmartdataSession } from './classes.session.js';
|
|
4
|
+
import { runCursorOperation } from './classes.cursoroperation.js';
|
|
5
|
+
import { collectionTopologyDbInspectionSymbol, compareSmartdataTopologyStrings, inspectCollectionTopologySnapshot, } from './classes.collectiontopology.js';
|
|
6
|
+
const requireBound = (valueArg, defaultArg, minimumArg, maximumArg, labelArg) => {
|
|
7
|
+
const value = valueArg === undefined ? defaultArg : valueArg;
|
|
8
|
+
if (!Number.isSafeInteger(value) || value < minimumArg || value > maximumArg) {
|
|
9
|
+
throw new SmartdataPersistenceError('invalid_argument', `${labelArg} must be an integer from ${minimumArg} through ${maximumArg}.`);
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
};
|
|
13
|
+
/** @internal Bounded catalog reading shared with collection preparation. */
|
|
14
|
+
export const readBoundedInspectionCursor = async (cursorArg, maximumArg, signalArg, closeOptionsArg) => runCursorOperation(cursorArg, async (cursor) => {
|
|
15
|
+
const result = [];
|
|
16
|
+
while (true) {
|
|
17
|
+
signalArg.throwIfAborted();
|
|
18
|
+
const next = await cursor.next();
|
|
19
|
+
if (next === null)
|
|
20
|
+
return result;
|
|
21
|
+
if (result.length === maximumArg) {
|
|
22
|
+
throw new SmartdataPersistenceError('unsupported_operation', 'Namespace inspection exceeded its metadata bound.');
|
|
23
|
+
}
|
|
24
|
+
if (plugins.mongodb.BSON.calculateObjectSize(next) > 65_536) {
|
|
25
|
+
throw new SmartdataPersistenceError('unsupported_operation', 'Namespace inspection metadata exceeds 64 KiB per document.');
|
|
26
|
+
}
|
|
27
|
+
result.push(next);
|
|
28
|
+
}
|
|
29
|
+
}, signalArg, closeOptionsArg ? () => [closeOptionsArg()] : undefined);
|
|
30
|
+
/** @internal Entry point exposed through SmartdataDb.inspectNamespace(). */
|
|
31
|
+
export const inspectSmartdataNamespace = async (dbArg, opts = {}) => {
|
|
32
|
+
if (!opts || Object.getPrototypeOf(opts) !== Object.prototype ||
|
|
33
|
+
Reflect.ownKeys(opts).some((keyArg) => typeof keyArg !== 'string' ||
|
|
34
|
+
!['maxCollections', 'documentCountMode', 'documentCountUpTo', 'timeoutMs', 'signal', 'session'].includes(keyArg) ||
|
|
35
|
+
!('value' in Object.getOwnPropertyDescriptor(opts, keyArg)))) {
|
|
36
|
+
throw new SmartdataPersistenceError('invalid_argument', 'Invalid namespace inspection options.');
|
|
37
|
+
}
|
|
38
|
+
const maxCollections = requireBound(opts.maxCollections, 256, 1, 1024, 'maxCollections');
|
|
39
|
+
const documentCountMode = opts.documentCountMode === undefined ? 'bounded' : opts.documentCountMode;
|
|
40
|
+
if (!['bounded', 'exact'].includes(documentCountMode) ||
|
|
41
|
+
(documentCountMode === 'exact' && opts.documentCountUpTo !== undefined)) {
|
|
42
|
+
throw new SmartdataPersistenceError('invalid_argument', 'Invalid namespace document count mode.');
|
|
43
|
+
}
|
|
44
|
+
const documentCountUpTo = requireBound(opts.documentCountUpTo, 1, 0, 10_000, 'documentCountUpTo');
|
|
45
|
+
const timeoutMs = requireBound(opts.timeoutMs, 5_000, 1, 120_000, 'timeoutMs');
|
|
46
|
+
if (opts.signal !== undefined && !(opts.signal instanceof AbortSignal)) {
|
|
47
|
+
throw new SmartdataPersistenceError('invalid_argument', 'signal must be an AbortSignal.');
|
|
48
|
+
}
|
|
49
|
+
opts.signal?.throwIfAborted();
|
|
50
|
+
if (opts.session !== undefined && !isSmartdataSession(opts.session)) {
|
|
51
|
+
throw new SmartdataPersistenceError('invalid_argument', 'Namespace inspection requires an owned session.');
|
|
52
|
+
}
|
|
53
|
+
const deadline = new AbortController();
|
|
54
|
+
const timer = setTimeout(() => deadline.abort(new SmartdataPersistenceError('unsupported_operation', 'Namespace inspection deadline exceeded.')), timeoutMs);
|
|
55
|
+
const signal = opts.signal ? AbortSignal.any([opts.signal, deadline.signal]) : deadline.signal;
|
|
56
|
+
const expiresAt = performance.now() + timeoutMs;
|
|
57
|
+
const cleanupOptions = () => ({ timeoutMS: Math.max(1, Math.ceil(expiresAt - performance.now())) });
|
|
58
|
+
const operationOptions = () => {
|
|
59
|
+
signal.throwIfAborted();
|
|
60
|
+
return cleanupOptions();
|
|
61
|
+
};
|
|
62
|
+
let lease;
|
|
63
|
+
try {
|
|
64
|
+
if (opts.session) {
|
|
65
|
+
lease = acquireSmartdataSession(opts.session, dbArg);
|
|
66
|
+
if (lease.rawSession.inTransaction()) {
|
|
67
|
+
throw new SmartdataPersistenceError('unsupported_operation', 'Namespace inspection cannot run in a transaction.');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const result = await dbArg[collectionTopologyDbInspectionSymbol](async (mongoDbArg) => {
|
|
71
|
+
const session = lease?.rawSession;
|
|
72
|
+
const namespaces = await readBoundedInspectionCursor(mongoDbArg.listCollections({}, {
|
|
73
|
+
nameOnly: false, batchSize: 1,
|
|
74
|
+
...operationOptions(), signal, session,
|
|
75
|
+
}), maxCollections, signal, cleanupOptions);
|
|
76
|
+
const collections = [];
|
|
77
|
+
const names = new Set();
|
|
78
|
+
for (const namespace of namespaces) {
|
|
79
|
+
if (typeof namespace.name !== 'string' || namespace.name.length === 0 ||
|
|
80
|
+
namespace.name.length > 255 || names.has(namespace.name)) {
|
|
81
|
+
throw new SmartdataPersistenceError('unsupported_operation', 'Unreadable namespace metadata.');
|
|
82
|
+
}
|
|
83
|
+
names.add(namespace.name);
|
|
84
|
+
const namespaceType = namespace.type === 'collection' || namespace.type === 'view'
|
|
85
|
+
? namespace.type : 'other';
|
|
86
|
+
let indexes = [];
|
|
87
|
+
let documentCount = null;
|
|
88
|
+
if (namespaceType === 'collection') {
|
|
89
|
+
const collection = mongoDbArg.collection(namespace.name);
|
|
90
|
+
indexes = await readBoundedInspectionCursor(collection.listIndexes({
|
|
91
|
+
batchSize: 1, ...operationOptions(), session,
|
|
92
|
+
}), 64, signal, cleanupOptions);
|
|
93
|
+
// Both modes reduce on the server; no document bodies enter the
|
|
94
|
+
// observation. Exact mode retains the cumulative operation deadline.
|
|
95
|
+
const pipeline = documentCountMode === 'exact'
|
|
96
|
+
? [{ $count: 'count' }]
|
|
97
|
+
: [{ $limit: documentCountUpTo + 1 }, { $count: 'count' }];
|
|
98
|
+
const countCursor = collection.aggregate(pipeline, {
|
|
99
|
+
...operationOptions(), session, signal,
|
|
100
|
+
});
|
|
101
|
+
const count = await runCursorOperation(countCursor, async (cursorArg) => {
|
|
102
|
+
const reduction = await cursorArg.next();
|
|
103
|
+
return reduction === null ? 0 : reduction.count;
|
|
104
|
+
}, signal, () => [cleanupOptions()]);
|
|
105
|
+
if (!Number.isSafeInteger(count) || count < 0 ||
|
|
106
|
+
(documentCountMode === 'bounded' && count > documentCountUpTo + 1)) {
|
|
107
|
+
throw new SmartdataPersistenceError('unsupported_operation', 'Unreadable namespace count.');
|
|
108
|
+
}
|
|
109
|
+
documentCount = Object.freeze({
|
|
110
|
+
kind: documentCountMode === 'bounded' && count > documentCountUpTo ? 'at_least' : 'exact',
|
|
111
|
+
value: count,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const topology = inspectCollectionTopologySnapshot({
|
|
115
|
+
collectionName: namespace.name, indexes: [],
|
|
116
|
+
}, { namespace: namespace, indexes });
|
|
117
|
+
collections.push(Object.freeze({
|
|
118
|
+
collectionName: namespace.name, namespaceType, documentCount,
|
|
119
|
+
actualIndexes: topology.actualIndexes,
|
|
120
|
+
reasonCodes: Object.freeze(topology.reasonCodes.filter((reasonArg) => reasonArg !== 'unexpected_index')),
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
signal.throwIfAborted();
|
|
124
|
+
collections.sort((leftArg, rightArg) => compareSmartdataTopologyStrings(leftArg.collectionName, rightArg.collectionName));
|
|
125
|
+
return Object.freeze({ consistency: 'observational', collections: Object.freeze(collections) });
|
|
126
|
+
});
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
catch (errorArg) {
|
|
130
|
+
signal.throwIfAborted();
|
|
131
|
+
throw errorArg;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
lease?.release();
|
|
135
|
+
clearTimeout(timer);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5uYW1lc3BhY2VpbnNwZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLm5hbWVzcGFjZWluc3BlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUNMLG9DQUFvQyxFQUNwQywrQkFBK0IsRUFDL0IsaUNBQWlDLEdBR2xDLE1BQU0saUNBQWlDLENBQUM7QUFrQ3pDLE1BQU0sWUFBWSxHQUFHLENBQ25CLFFBQTRCLEVBQzVCLFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ2xCLFFBQWdCLEVBQ1IsRUFBRTtJQUNWLE1BQU0sS0FBSyxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzdELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxVQUFVLElBQUksS0FBSyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdFLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxrQkFBa0IsRUFDcEQsR0FBRyxRQUFRLDRCQUE0QixVQUFVLFlBQVksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRiw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxFQUM5QyxTQUE0QyxFQUM1QyxVQUFrQixFQUNs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
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** @internal Options must not execute accessors or accept inherited configuration. */
|
|
2
|
+
export declare const assertDataOptions: (valueArg: unknown, keysArg: readonly string[]) => Record<string, unknown>;
|
|
3
|
+
/** @internal One deadline for an operation and all of its phases. Never exposes abort reasons. */
|
|
4
|
+
export declare class SmartdataOperationBudget {
|
|
5
|
+
readonly signal: AbortSignal;
|
|
6
|
+
private readonly controller;
|
|
7
|
+
private readonly expiresAt;
|
|
8
|
+
private readonly timer;
|
|
9
|
+
constructor(timeoutMsArg: unknown, signalArg?: unknown);
|
|
10
|
+
check(): void;
|
|
11
|
+
remainingMs(): number;
|
|
12
|
+
operationOptions(): {
|
|
13
|
+
timeoutMS: number;
|
|
14
|
+
signal: AbortSignal;
|
|
15
|
+
};
|
|
16
|
+
cleanupOptions(): {
|
|
17
|
+
timeoutMS: number;
|
|
18
|
+
};
|
|
19
|
+
/** Waiting does not cancel or abandon the owner of the pending operation. */
|
|
20
|
+
waitFor(operationArg: Promise<unknown>): Promise<void>;
|
|
21
|
+
close(): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SmartdataPersistenceError } from './classes.persistence.js';
|
|
2
|
+
import * as plugins from './plugins.js';
|
|
3
|
+
/** @internal Options must not execute accessors or accept inherited configuration. */
|
|
4
|
+
export const assertDataOptions = (valueArg, keysArg) => {
|
|
5
|
+
if (!valueArg || plugins.nodeUtil.types.isProxy(valueArg) || Object.getPrototypeOf(valueArg) !== Object.prototype ||
|
|
6
|
+
Reflect.ownKeys(valueArg).some((keyArg) => typeof keyArg !== 'string' ||
|
|
7
|
+
!keysArg.includes(keyArg) ||
|
|
8
|
+
!('value' in Object.getOwnPropertyDescriptor(valueArg, keyArg)))) {
|
|
9
|
+
throw new SmartdataPersistenceError('invalid_argument', 'Invalid SmartData operation options.');
|
|
10
|
+
}
|
|
11
|
+
const snapshot = Object.create(null);
|
|
12
|
+
for (const key of Reflect.ownKeys(valueArg)) {
|
|
13
|
+
snapshot[key] = Object.getOwnPropertyDescriptor(valueArg, key).value;
|
|
14
|
+
}
|
|
15
|
+
return snapshot;
|
|
16
|
+
};
|
|
17
|
+
/** @internal One deadline for an operation and all of its phases. Never exposes abort reasons. */
|
|
18
|
+
export class SmartdataOperationBudget {
|
|
19
|
+
signal;
|
|
20
|
+
controller = new AbortController();
|
|
21
|
+
expiresAt;
|
|
22
|
+
timer;
|
|
23
|
+
constructor(timeoutMsArg, signalArg) {
|
|
24
|
+
if (!Number.isSafeInteger(timeoutMsArg) || timeoutMsArg < 1 ||
|
|
25
|
+
timeoutMsArg > 120_000 ||
|
|
26
|
+
(signalArg !== undefined && (plugins.nodeUtil.types.isProxy(signalArg) || !(signalArg instanceof AbortSignal)))) {
|
|
27
|
+
throw new SmartdataPersistenceError('invalid_argument', 'Invalid SmartData timeout or cancellation signal.');
|
|
28
|
+
}
|
|
29
|
+
this.expiresAt = performance.now() + timeoutMsArg;
|
|
30
|
+
this.signal = signalArg instanceof AbortSignal
|
|
31
|
+
? AbortSignal.any([signalArg, this.controller.signal]) : this.controller.signal;
|
|
32
|
+
this.timer = setTimeout(() => this.controller.abort(), timeoutMsArg);
|
|
33
|
+
}
|
|
34
|
+
check() {
|
|
35
|
+
if (performance.now() >= this.expiresAt)
|
|
36
|
+
this.controller.abort();
|
|
37
|
+
if (this.signal.aborted) {
|
|
38
|
+
throw new SmartdataPersistenceError('unsupported_operation', 'SmartData operation was cancelled or exceeded its deadline.');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
remainingMs() {
|
|
42
|
+
this.check();
|
|
43
|
+
return this.cleanupOptions().timeoutMS;
|
|
44
|
+
}
|
|
45
|
+
operationOptions() {
|
|
46
|
+
return { timeoutMS: this.remainingMs(), signal: this.signal };
|
|
47
|
+
}
|
|
48
|
+
cleanupOptions() {
|
|
49
|
+
return { timeoutMS: Math.max(1, Math.ceil(this.expiresAt - performance.now())) };
|
|
50
|
+
}
|
|
51
|
+
/** Waiting does not cancel or abandon the owner of the pending operation. */
|
|
52
|
+
async waitFor(operationArg) {
|
|
53
|
+
this.check();
|
|
54
|
+
await new Promise((resolveArg) => {
|
|
55
|
+
const finish = () => { this.signal.removeEventListener('abort', finish); resolveArg(); };
|
|
56
|
+
this.signal.addEventListener('abort', finish, { once: true });
|
|
57
|
+
operationArg.then(finish, finish);
|
|
58
|
+
if (this.signal.aborted)
|
|
59
|
+
finish();
|
|
60
|
+
});
|
|
61
|
+
this.check();
|
|
62
|
+
}
|
|
63
|
+
close() { clearTimeout(this.timer); }
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcGVyYXRpb25idWRnZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2NsYXNzZXMub3BlcmF0aW9uYnVkZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JFLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixRQUFpQixFQUNqQixPQUEwQixFQUNELEVBQUU7SUFDM0IsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUztRQUMvRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUTtZQUNuRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUkseUJBQXlCLENBQUMsa0JBQWtCLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQTRCLENBQUM7SUFDaEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBYSxFQUFFLENBQUM7UUFDeEQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0Is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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface IOrdinaryPersistenceOptions {
|
|
2
|
+
/** Defaults to ObjectId. String IDs are caller-owned and immutable. */
|
|
3
|
+
idType?: 'objectId' | 'string';
|
|
4
|
+
/** Defaults to managed. `none` forbids SmartData timestamp fields in storage. */
|
|
5
|
+
timestamps?: 'managed' | 'none';
|
|
6
|
+
/** Validates the complete BSON envelope before model hydration. */
|
|
7
|
+
assertStoredDocument: (valueArg: unknown) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface IOrdinaryPersistencePolicy {
|
|
10
|
+
readonly idType: 'objectId' | 'string';
|
|
11
|
+
readonly timestamps: 'managed' | 'none';
|
|
12
|
+
readonly assertStoredDocument: (valueArg: unknown) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare const getOrdinaryPersistencePolicy: (modelArg: any) => IOrdinaryPersistencePolicy | undefined;
|
|
15
|
+
/** Opt into immutable whole-stored-document validation for an ordinary model. */
|
|
16
|
+
export declare const ordinaryPersistence: (opts: IOrdinaryPersistenceOptions) => <T extends new (...args: any[]) => any>(modelArg: T, _contextArg?: ClassDecoratorContext<T>) => T;
|
|
17
|
+
/** @internal Returns an isolated validated BSON document, never a hydrated model. */
|
|
18
|
+
export declare const validateOrdinaryStoredDocument: (documentArg: unknown, policyArg: IOrdinaryPersistencePolicy, persistedFieldsArg: readonly string[]) => Record<string, any>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { SmartdataPersistenceError } from './classes.persistence.js';
|
|
3
|
+
import { assertBsonWithoutMutation } from './classes.bsonassertion.js';
|
|
4
|
+
const policySymbol = Symbol.for('@push.rocks/smartdata.ordinaryPersistencePolicy');
|
|
5
|
+
const exactSymbol = Symbol.for('@push.rocks/smartdata.exactPersistencePolicy');
|
|
6
|
+
export const getOrdinaryPersistencePolicy = (modelArg) => {
|
|
7
|
+
const policy = modelArg?.[policySymbol];
|
|
8
|
+
if (policy && modelArg[exactSymbol]) {
|
|
9
|
+
throw new SmartdataPersistenceError('invalid_configuration', 'Ordinary and exact persistence policies cannot be combined.');
|
|
10
|
+
}
|
|
11
|
+
return policy;
|
|
12
|
+
};
|
|
13
|
+
/** Opt into immutable whole-stored-document validation for an ordinary model. */
|
|
14
|
+
export const ordinaryPersistence = (opts) => {
|
|
15
|
+
if (!opts || Object.getPrototypeOf(opts) !== Object.prototype ||
|
|
16
|
+
Reflect.ownKeys(opts).some((keyArg) => typeof keyArg !== 'string' ||
|
|
17
|
+
!['idType', 'timestamps', 'assertStoredDocument'].includes(keyArg) ||
|
|
18
|
+
!('value' in Object.getOwnPropertyDescriptor(opts, keyArg))) ||
|
|
19
|
+
typeof opts.assertStoredDocument !== 'function' ||
|
|
20
|
+
(opts.idType !== undefined && !['objectId', 'string'].includes(opts.idType)) ||
|
|
21
|
+
(opts.timestamps !== undefined && !['managed', 'none'].includes(opts.timestamps))) {
|
|
22
|
+
throw new SmartdataPersistenceError('invalid_configuration', 'Invalid ordinary persistence policy.');
|
|
23
|
+
}
|
|
24
|
+
const policy = Object.freeze({
|
|
25
|
+
idType: opts.idType ?? 'objectId', timestamps: opts.timestamps ?? 'managed',
|
|
26
|
+
assertStoredDocument: opts.assertStoredDocument,
|
|
27
|
+
});
|
|
28
|
+
return (modelArg, _contextArg) => {
|
|
29
|
+
if (modelArg[policySymbol] || modelArg[exactSymbol]) {
|
|
30
|
+
throw new SmartdataPersistenceError('invalid_configuration', 'A persistence policy cannot be overridden.');
|
|
31
|
+
}
|
|
32
|
+
Object.defineProperty(modelArg, policySymbol, { value: policy });
|
|
33
|
+
return modelArg;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
/** @internal Returns an isolated validated BSON document, never a hydrated model. */
|
|
37
|
+
export const validateOrdinaryStoredDocument = (documentArg, policyArg, persistedFieldsArg) => {
|
|
38
|
+
const invalid = () => new SmartdataPersistenceError('invalid_document', 'Stored document does not satisfy its ordinary persistence policy.');
|
|
39
|
+
if (!documentArg || typeof documentArg !== 'object' ||
|
|
40
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(documentArg)))
|
|
41
|
+
throw invalid();
|
|
42
|
+
const allowed = new Set([...persistedFieldsArg, '_id']);
|
|
43
|
+
if (policyArg.timestamps === 'managed') {
|
|
44
|
+
allowed.add('_createdAt');
|
|
45
|
+
allowed.add('_updatedAt');
|
|
46
|
+
}
|
|
47
|
+
for (const key of Reflect.ownKeys(documentArg)) {
|
|
48
|
+
if (typeof key !== 'string' || !allowed.has(key) ||
|
|
49
|
+
(policyArg.timestamps === 'none' && ['_createdAt', '_updatedAt'].includes(key)) ||
|
|
50
|
+
key === '_smartdataRevision' || !('value' in Object.getOwnPropertyDescriptor(documentArg, key)))
|
|
51
|
+
throw invalid();
|
|
52
|
+
}
|
|
53
|
+
let clone;
|
|
54
|
+
try {
|
|
55
|
+
clone = plugins.mongodb.BSON.deserialize(plugins.mongodb.BSON.serialize(documentArg));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
throw invalid();
|
|
59
|
+
}
|
|
60
|
+
if (policyArg.idType === 'string'
|
|
61
|
+
? typeof clone._id !== 'string' || clone._id.trim().length === 0
|
|
62
|
+
: !(clone._id instanceof plugins.mongodb.ObjectId))
|
|
63
|
+
throw invalid();
|
|
64
|
+
if (policyArg.timestamps === 'managed' &&
|
|
65
|
+
(typeof clone._createdAt !== 'string' || typeof clone._updatedAt !== 'string'))
|
|
66
|
+
throw invalid();
|
|
67
|
+
assertBsonWithoutMutation(clone, policyArg.assertStoredDocument, invalid);
|
|
68
|
+
// The assertion must not retain authority to mutate the returned document.
|
|
69
|
+
return plugins.mongodb.BSON.deserialize(plugins.mongodb.BSON.serialize(clone));
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcmRpbmFyeXBlcnNpc3RlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLm9yZGluYXJ5cGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFpQnZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztBQUNuRixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7QUFFL0UsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxRQUFhLEVBQTBDLEVBQUU7SUFDcEcsTUFBTSxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUEyQyxDQUFDO0lBQ2xGLElBQUksTUFBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyx1QkFBdUIsRUFDekQsNkRBQTZELENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsaUZBQWlGO0FBQ2pGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsSUFBaUMsRUFBRSxFQUFFO0lBQ3ZFLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUztRQUMzRCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUTtZQUMv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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export type TSmartdataPersistenceErrorCode = 'invalid_argument' | 'invalid_configuration' | 'invalid_document' | 'unique_conflict' | 'ambiguous_write' | 'unsupported_operation';
|
|
3
|
+
/**
|
|
4
|
+
* Stable errors for ordinary SmartData model configuration and persistence.
|
|
5
|
+
*
|
|
6
|
+
* Exact-persistence models keep using SmartdataExactPersistenceError.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SmartdataPersistenceError extends Error {
|
|
9
|
+
readonly code: TSmartdataPersistenceErrorCode;
|
|
10
|
+
constructor(codeArg: TSmartdataPersistenceErrorCode, messageArg: string, optionsArg?: ErrorOptions);
|
|
11
|
+
}
|
|
12
|
+
export declare const isMongoTransactionRetryError: (errorArg: unknown) => boolean;
|
|
13
|
+
export declare const isMongoDuplicateKeyError: (errorArg: unknown) => errorArg is plugins.mongodb.MongoServerError;
|
|
14
|
+
export declare const normalizeOrdinaryPersistenceError: (errorArg: unknown, messageArg: string) => never;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Stable errors for ordinary SmartData model configuration and persistence.
|
|
4
|
+
*
|
|
5
|
+
* Exact-persistence models keep using SmartdataExactPersistenceError.
|
|
6
|
+
*/
|
|
7
|
+
export class SmartdataPersistenceError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
constructor(codeArg, messageArg, optionsArg) {
|
|
10
|
+
super(messageArg, optionsArg);
|
|
11
|
+
this.name = 'SmartdataPersistenceError';
|
|
12
|
+
this.code = codeArg;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const isMongoTransactionRetryError = (errorArg) => errorArg instanceof plugins.mongodb.MongoServerError &&
|
|
16
|
+
(errorArg.hasErrorLabel('TransientTransactionError') ||
|
|
17
|
+
errorArg.hasErrorLabel('UnknownTransactionCommitResult'));
|
|
18
|
+
export const isMongoDuplicateKeyError = (errorArg) => {
|
|
19
|
+
return (errorArg instanceof plugins.mongodb.MongoServerError &&
|
|
20
|
+
(errorArg.code === 11000 || errorArg.codeName === 'DuplicateKey'));
|
|
21
|
+
};
|
|
22
|
+
export const normalizeOrdinaryPersistenceError = (errorArg, messageArg) => {
|
|
23
|
+
if (errorArg instanceof SmartdataPersistenceError ||
|
|
24
|
+
isMongoTransactionRetryError(errorArg)) {
|
|
25
|
+
throw errorArg;
|
|
26
|
+
}
|
|
27
|
+
if (isMongoDuplicateKeyError(errorArg)) {
|
|
28
|
+
throw new SmartdataPersistenceError('unique_conflict', messageArg, {
|
|
29
|
+
cause: errorArg,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
throw errorArg;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wZXJzaXN0ZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvY2xhc3Nlcy5wZXJzaXN0ZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQVV4Qzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLEtBQUs7SUFDbEMsSUFBSSxDQUFpQztJQUVyRCxZQUNFLE9BQXVDLEVBQ3ZDLFVBQWtCLEVBQ2xCLFVBQXlCO1FBRXpCLEtBQUssQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFFBQWlCLEVBQVcsRUFBRSxDQUN6RSxRQUFRLFlBQVksT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0I7SUFDcEQsQ0FDRSxRQUFRLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDO1FBQ25ELFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsQ0FDekQsQ0FBQztBQUVKLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQ3RDLFFBQWlCLEVBQzZCLEVBQUU7SUFDaEQsT0FBTyxDQUNMLFFBQVEsWUFBWSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQjtRQUNwRCxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssY0FBYyxDQUFDLENBQ2xFLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUMvQyxRQUFpQixFQUNqQixVQUFrQixFQUNYLEVBQUU7SUFDVCxJQUNFLFFBQVEsWUFBWSx5QkFBeUI7UUFDN0MsNEJBQTRCLENBQUMsUUFBUSxDQUFDLEVBQ3RDLENBQUM7UUFDRCxNQUFNLFFBQVEsQ0FBQztJQUNqQixDQUFDO0lBQ0QsSUFBSSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUU7WUFDakUsS0FBSyxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE1BQU0sUUFBUSxDQUFDO0FBQ2pCLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type { SmartdataDb } from './classes.db.js';
|
|
3
|
+
interface ISmartdataSessionAcquireOptions {
|
|
4
|
+
ordinaryWrite?: boolean;
|
|
5
|
+
}
|
|
6
|
+
interface IOrdinarySessionOperationOptions {
|
|
7
|
+
ordinaryWrite?: boolean;
|
|
8
|
+
prepared?: boolean;
|
|
9
|
+
preparationMessage?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class SmartdataSession {
|
|
12
|
+
withTransaction<TResult>(callbackArg: (sessionArg: SmartdataSession) => Promise<TResult>): Promise<TResult | undefined>;
|
|
13
|
+
close(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare const createSmartdataSession: (ownerArg: SmartdataDb) => SmartdataSession;
|
|
16
|
+
export declare const acquireSmartdataSession: (sessionArg: SmartdataSession, ownerArg: SmartdataDb, optionsArg?: ISmartdataSessionAcquireOptions) => {
|
|
17
|
+
rawSession: plugins.mongodb.ClientSession;
|
|
18
|
+
release: () => void;
|
|
19
|
+
};
|
|
20
|
+
/** Marks the current owned attempt for rollback by withTransaction. */
|
|
21
|
+
export declare const failSmartdataTransaction: (sessionArg: SmartdataSession, ownerArg: SmartdataDb, errorArg: unknown) => never;
|
|
22
|
+
export type TSmartdataOrdinarySession = plugins.mongodb.ClientSession | SmartdataSession;
|
|
23
|
+
export declare const isSmartdataSession: (sessionArg: TSmartdataOrdinarySession | undefined) => sessionArg is SmartdataSession;
|
|
24
|
+
export declare const isOrdinarySessionInTransaction: (sessionArg: TSmartdataOrdinarySession | undefined) => boolean;
|
|
25
|
+
export declare const runWithOrdinarySmartdataSession: <TResult>(sessionArg: TSmartdataOrdinarySession | undefined, ownerArg: SmartdataDb, optionsArg: IOrdinarySessionOperationOptions, operationArg: (rawSessionArg: plugins.mongodb.ClientSession | undefined) => Promise<TResult>) => Promise<TResult>;
|
|
26
|
+
export declare const invalidateSmartdataSessions: (ownerArg: SmartdataDb) => Promise<void>;
|
|
27
|
+
export declare const unwrapSmartdataSessionInvalidationErrors: (errorArg: unknown) => readonly unknown[] | undefined;
|
|
28
|
+
export {};
|