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