@lossless.org/client 1.19.0 → 1.20.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/nosqldb/classes.atomicdelete.js +12 -4
- package/dist_ts/nosqldb/classes.atomicfindoneandupdate.js +11 -2
- package/dist_ts/nosqldb/classes.atomicupdate.d.ts +2 -0
- package/dist_ts/nosqldb/classes.atomicupdate.js +32 -5
- package/dist_ts/nosqldb/classes.bootstraprecord.js +7 -2
- package/dist_ts/nosqldb/classes.collection.js +52 -7
- package/dist_ts/nosqldb/classes.db.d.ts +19 -0
- package/dist_ts/nosqldb/classes.db.js +21 -1
- package/dist_ts/nosqldb/classes.doc.js +2 -2
- package/dist_ts/nosqldb/classes.exactpersistence.js +17 -2
- package/dist_ts/nosqldb/classes.persistence.d.ts +6 -0
- package/dist_ts/nosqldb/classes.persistence.js +16 -1
- package/dist_ts/nosqldb/classes.session.d.ts +11 -0
- package/dist_ts/nosqldb/classes.session.js +51 -1
- package/dist_ts/nosqldb/classes.writeobserver.d.ts +57 -0
- package/dist_ts/nosqldb/classes.writeobserver.js +139 -0
- package/package.json +3 -3
- package/readme.md +2 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/nosqldb/classes.atomicdelete.ts +11 -2
- package/ts/nosqldb/classes.atomicfindoneandupdate.ts +22 -0
- package/ts/nosqldb/classes.atomicupdate.ts +53 -3
- package/ts/nosqldb/classes.bootstraprecord.ts +7 -1
- package/ts/nosqldb/classes.collection.ts +63 -4
- package/ts/nosqldb/classes.db.ts +31 -0
- package/ts/nosqldb/classes.doc.ts +1 -1
- package/ts/nosqldb/classes.exactpersistence.ts +24 -0
- package/ts/nosqldb/classes.persistence.ts +16 -0
- package/ts/nosqldb/classes.session.ts +73 -0
- package/ts/nosqldb/classes.writeobserver.ts +224 -0
|
@@ -2,6 +2,7 @@ import * as plugins from './plugins.js';
|
|
|
2
2
|
import { SmartdataOperationDeadline, requireOperationSignal, requireOperationTimeoutMS, } from './classes.operationdeadline.js';
|
|
3
3
|
import { assertDataOptions } from './classes.operationbudget.js';
|
|
4
4
|
import { SmartdataPersistenceError, createSmartdataTimeoutError, isMongoDeadlineError, isMongoTransientTransactionError, normalizeDeadlineError, normalizeOrdinaryPersistenceError, } from './classes.persistence.js';
|
|
5
|
+
import { captureSmartdataWrite, hasSmartdataWriteObservers, } from './classes.writeobserver.js';
|
|
5
6
|
/** The commit outcome of every value a `withTransaction()` call rejected with. */
|
|
6
7
|
const transactionCommitOutcomes = new WeakMap();
|
|
7
8
|
/**
|
|
@@ -155,6 +156,7 @@ export class SmartdataSession {
|
|
|
155
156
|
binding.transactionUsesOrdinaryWrite = false;
|
|
156
157
|
binding.transactionFailure = undefined;
|
|
157
158
|
binding.transactionCommitReached = false;
|
|
159
|
+
binding.transactionWrites = [];
|
|
158
160
|
callbackError = undefined;
|
|
159
161
|
attemptInterruption = undefined;
|
|
160
162
|
try {
|
|
@@ -267,11 +269,13 @@ export class SmartdataSession {
|
|
|
267
269
|
};
|
|
268
270
|
let result;
|
|
269
271
|
let transactionEnded;
|
|
272
|
+
let committedWrites = [];
|
|
270
273
|
try {
|
|
271
274
|
result = timeoutMS === undefined
|
|
272
275
|
? await binding.rawSession.withTransaction(runAttempt)
|
|
273
276
|
: await binding.rawSession.withTransaction(runAttempt, { timeoutMS });
|
|
274
277
|
transactionEnded = binding.transactionEnded;
|
|
278
|
+
committedWrites = binding.transactionWrites;
|
|
275
279
|
}
|
|
276
280
|
catch (errorArg) {
|
|
277
281
|
const { error, outcome } = settleTransactionRejection(errorArg);
|
|
@@ -285,10 +289,14 @@ export class SmartdataSession {
|
|
|
285
289
|
binding.transactionFailure = undefined;
|
|
286
290
|
binding.transactionCommitReached = false;
|
|
287
291
|
binding.transactionEnded = undefined;
|
|
292
|
+
binding.transactionWrites = [];
|
|
288
293
|
}
|
|
289
294
|
if (transactionEnded) {
|
|
290
295
|
throw rejectTransaction(createTransactionSessionEndedError(transactionEnded), commitOutcomeOfTransactionEnd(transactionEnded));
|
|
291
296
|
}
|
|
297
|
+
for (const deliverWrite of committedWrites) {
|
|
298
|
+
deliverWrite();
|
|
299
|
+
}
|
|
292
300
|
return result;
|
|
293
301
|
}
|
|
294
302
|
async close() {
|
|
@@ -318,6 +326,7 @@ export const createSmartdataSession = (ownerArg) => {
|
|
|
318
326
|
transactionCallbackOpen: false,
|
|
319
327
|
transactionUsesOrdinaryWrite: false,
|
|
320
328
|
transactionCommitReached: false,
|
|
329
|
+
transactionWrites: [],
|
|
321
330
|
invalidated: false,
|
|
322
331
|
};
|
|
323
332
|
bindings.set(session, binding);
|
|
@@ -421,6 +430,12 @@ export const leaseOrdinarySmartdataSession = (sessionArg, ownerArg, optionsArg)
|
|
|
421
430
|
if (!optionsArg.prepared && sessionArg?.inTransaction()) {
|
|
422
431
|
refuseUnpreparedCollection(optionsArg, 'inside a transaction');
|
|
423
432
|
}
|
|
433
|
+
if (optionsArg.ordinaryWrite
|
|
434
|
+
&& sessionArg?.inTransaction()
|
|
435
|
+
&& hasSmartdataWriteObservers(ownerArg)) {
|
|
436
|
+
// Only an owned transaction tells SmartData whether it committed.
|
|
437
|
+
throw new SmartdataPersistenceError('unsupported_operation', 'Writes of an observed database run in transactions of db.createSession(), not raw driver sessions.');
|
|
438
|
+
}
|
|
424
439
|
return { rawSession: sessionArg, release: () => { } };
|
|
425
440
|
}
|
|
426
441
|
if (!optionsArg.prepared) {
|
|
@@ -496,6 +511,41 @@ export const runWithOrdinarySmartdataSession = async (sessionArg, ownerArg, opti
|
|
|
496
511
|
lease.release();
|
|
497
512
|
}
|
|
498
513
|
};
|
|
514
|
+
/**
|
|
515
|
+
* Reports one acknowledged write to the owner's write observers: at once, or,
|
|
516
|
+
* inside an owned transaction, after it committed. A transaction that rolls
|
|
517
|
+
* back, or whose commit outcome is unknown, reports nothing, and a retried
|
|
518
|
+
* attempt reports only its own writes.
|
|
519
|
+
*/
|
|
520
|
+
export const reportSmartdataWrite = (ownerArg, sessionArg, writeArg) => {
|
|
521
|
+
// A raw driver transaction passed its lease while nobody observed, and
|
|
522
|
+
// whether it commits is never known here.
|
|
523
|
+
if (!isSmartdataSession(sessionArg) && sessionArg?.inTransaction())
|
|
524
|
+
return;
|
|
525
|
+
const deliver = captureSmartdataWrite(ownerArg, writeArg);
|
|
526
|
+
if (!deliver)
|
|
527
|
+
return;
|
|
528
|
+
const binding = isSmartdataSession(sessionArg) ? bindings.get(sessionArg) : undefined;
|
|
529
|
+
if (binding?.transactionActive) {
|
|
530
|
+
// A write that settles after its attempt ended rolls back with that attempt.
|
|
531
|
+
const attempt = transactionContext.getStore()?.attempt;
|
|
532
|
+
if (attempt !== undefined && attempt === binding.transactionAttempt) {
|
|
533
|
+
binding.transactionWrites.push(deliver);
|
|
534
|
+
}
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
deliver();
|
|
538
|
+
};
|
|
539
|
+
/** Reports one acknowledged write of a model collection; see `reportSmartdataWrite`. */
|
|
540
|
+
export const reportSmartdataCollectionWrite = (collectionArg, sessionArg, kindArg, documentsArg, selectorArg) => {
|
|
541
|
+
reportSmartdataWrite(collectionArg.smartdataDb, sessionArg, {
|
|
542
|
+
collection: collectionArg.collectionName,
|
|
543
|
+
kind: kindArg,
|
|
544
|
+
documents: documentsArg,
|
|
545
|
+
selector: selectorArg,
|
|
546
|
+
identityDocumentIdField: collectionArg.getBoundModelSchema()?.identityAsDocumentId,
|
|
547
|
+
});
|
|
548
|
+
};
|
|
499
549
|
/**
|
|
500
550
|
* Ends every session of the owner. `endOptionsArg.timeoutMS` is the driver's
|
|
501
551
|
* deadline for aborting a transaction a session still holds.
|
|
@@ -551,4 +601,4 @@ const closeSessionBinding = async (bindingArg, endOptionsArg) => {
|
|
|
551
601
|
export const unwrapSmartdataSessionInvalidationErrors = (errorArg) => errorArg instanceof SmartdataSessionInvalidationAggregateError
|
|
552
602
|
? errorArg.errors
|
|
553
603
|
: undefined;
|
|
554
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHeEMsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixzQkFBc0IsRUFDdEIseUJBQXlCLEdBQzFCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0Isb0JBQW9CLEVBQ3BCLGdDQUFnQyxFQUNoQyxzQkFBc0IsRUFDdEIsaUNBQWlDLEdBQ2xDLE1BQU0sMEJBQTBCLENBQUM7QUEyQ2xDLGtGQUFrRjtBQUNsRixNQUFNLHlCQUF5QixHQUFHLElBQUksT0FBTyxFQUE4QyxDQUFDO0FBRTVGOzs7OztHQUtHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUN4QixRQUFpQixFQUNqQixVQUE4QyxFQUNyQyxFQUFFO0lBQ1gsSUFDRSxDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLENBQUM7V0FDcEYseUJBQXlCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFDeEQsQ0FBQztRQUNELHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sNkJBQTZCLEdBQUcsQ0FDcEMsTUFBZ0MsRUFDSSxFQUFFLENBQ3RDLE1BQU0sS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO0FBRTNEOzs7O0dBSUc7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
|
|
604
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFJeEMsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixzQkFBc0IsRUFDdEIseUJBQXlCLEdBQzFCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0Isb0JBQW9CLEVBQ3BCLGdDQUFnQyxFQUNoQyxzQkFBc0IsRUFDdEIsaUNBQWlDLEdBQ2xDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQiwwQkFBMEIsR0FHM0IsTUFBTSw0QkFBNEIsQ0FBQztBQTZDcEMsa0ZBQWtGO0FBQ2xGLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxPQUFPLEVBQThDLENBQUM7QUFFNUY7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQ3hCLFFBQWlCLEVBQ2pCLFVBQThDLEVBQ3JDLEVBQUU7SUFDWCxJQUNFLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQztXQUNwRix5QkFBeUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUN4RCxDQUFDO1FBQ0QseUJBQXlCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSw2QkFBNkIsR0FBRyxDQUNwQyxNQUFnQyxFQUNJLEVBQUUsQ0FDdEMsTUFBTSxLQUFLLGVBQWUs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
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { SmartdataDb } from './classes.db.js';
|
|
2
|
+
/** What a write did to its documents. An upsert that inserted is an `insert`. */
|
|
3
|
+
export type TSmartdataWriteKind = 'insert' | 'update' | 'replace' | 'delete';
|
|
4
|
+
/** The values a report carries; any other stored value is left out. */
|
|
5
|
+
export type TSmartdataObservedValue = string | number | boolean | null;
|
|
6
|
+
/** The observed fields of one document or selector, by field name. */
|
|
7
|
+
export type TSmartdataObservedFields = Readonly<Record<string, TSmartdataObservedValue>>;
|
|
8
|
+
/** One acknowledged write, reported to every write observer of its database. */
|
|
9
|
+
export interface ISmartdataWriteReport {
|
|
10
|
+
/** The collection the write went to. */
|
|
11
|
+
readonly collection: string;
|
|
12
|
+
readonly kind: TSmartdataWriteKind;
|
|
13
|
+
/**
|
|
14
|
+
* The observed fields of each document the write named or returned: the
|
|
15
|
+
* inserted documents, a model instance's save or delete, an exact write, the
|
|
16
|
+
* document a find-one-and-modify returned. `null` when the write addressed
|
|
17
|
+
* its documents by selector only; `anchors` then says what it pinned.
|
|
18
|
+
*/
|
|
19
|
+
readonly documents: readonly TSmartdataObservedFields[] | null;
|
|
20
|
+
/**
|
|
21
|
+
* The observed fields the write's selector pinned by top-level equality
|
|
22
|
+
* (`{ field: value }`, `{ field: { $eq: value } }`, or inside `$and`).
|
|
23
|
+
* Empty for an insert, which has no selector.
|
|
24
|
+
*/
|
|
25
|
+
readonly anchors: TSmartdataObservedFields;
|
|
26
|
+
}
|
|
27
|
+
export interface ISmartdataWriteObserverOptions {
|
|
28
|
+
/** Top-level field names the reports carry: 1 to 64 distinct names, no `.` and no leading `$`. */
|
|
29
|
+
fields: readonly string[];
|
|
30
|
+
/**
|
|
31
|
+
* Called synchronously once per write. A listener that throws is logged and
|
|
32
|
+
* never fails the write; one that needs to do async work schedules it.
|
|
33
|
+
*/
|
|
34
|
+
listener: (reportArg: ISmartdataWriteReport) => void;
|
|
35
|
+
}
|
|
36
|
+
/** @internal What a write path states about one acknowledged write. */
|
|
37
|
+
export interface ISmartdataWrite {
|
|
38
|
+
collection: string;
|
|
39
|
+
kind: TSmartdataWriteKind;
|
|
40
|
+
/** The documents as written or returned; `null` for a write by selector only. */
|
|
41
|
+
documents: readonly object[] | null;
|
|
42
|
+
selector?: unknown;
|
|
43
|
+
/** The model's `identityAsDocumentId` field, whose value a selector carries as `_id`. */
|
|
44
|
+
identityDocumentIdField?: string;
|
|
45
|
+
}
|
|
46
|
+
/** @internal Registers a write observer; the returned function removes it. */
|
|
47
|
+
export declare const addSmartdataWriteObserver: (dbArg: SmartdataDb, optionsArg: ISmartdataWriteObserverOptions) => (() => void);
|
|
48
|
+
/** @internal */
|
|
49
|
+
export declare const hasSmartdataWriteObservers: (dbArg: SmartdataDb) => boolean;
|
|
50
|
+
/**
|
|
51
|
+
* @internal Captures one acknowledged write for the observers registered now,
|
|
52
|
+
* and returns the delivery, or `undefined` when nobody observes the database.
|
|
53
|
+
* The observed values are copied at capture, so a delivery deferred to a
|
|
54
|
+
* transaction's commit reports the write as it was made. An observer removed
|
|
55
|
+
* before the delivery receives nothing.
|
|
56
|
+
*/
|
|
57
|
+
export declare const captureSmartdataWrite: (dbArg: SmartdataDb, writeArg: ISmartdataWrite) => (() => void) | undefined;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { assertDataOptions } from './classes.operationbudget.js';
|
|
2
|
+
import { SmartdataPersistenceError } from './classes.persistence.js';
|
|
3
|
+
import { logger } from './logging.js';
|
|
4
|
+
const maximumObservedFields = 64;
|
|
5
|
+
const observersByDb = new WeakMap();
|
|
6
|
+
const normalizeObserverOptions = (optionsArg) => {
|
|
7
|
+
const { fields, listener } = assertDataOptions(optionsArg, ['fields', 'listener']);
|
|
8
|
+
if (typeof listener !== 'function') {
|
|
9
|
+
throw new SmartdataPersistenceError('invalid_argument', 'A SmartData write observer requires a listener function.');
|
|
10
|
+
}
|
|
11
|
+
if (!Array.isArray(fields)
|
|
12
|
+
|| fields.length === 0
|
|
13
|
+
|| fields.length > maximumObservedFields
|
|
14
|
+
|| fields.some((fieldArg) => typeof fieldArg !== 'string'
|
|
15
|
+
|| fieldArg.length === 0
|
|
16
|
+
|| fieldArg.includes('.')
|
|
17
|
+
|| fieldArg.startsWith('$'))
|
|
18
|
+
|| new Set(fields).size !== fields.length) {
|
|
19
|
+
throw new SmartdataPersistenceError('invalid_argument', `A SmartData write observer requires 1 to ${maximumObservedFields} distinct top-level field names.`);
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
fields: Object.freeze([...fields]),
|
|
23
|
+
listener: listener,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/** @internal Registers a write observer; the returned function removes it. */
|
|
27
|
+
export const addSmartdataWriteObserver = (dbArg, optionsArg) => {
|
|
28
|
+
const observer = normalizeObserverOptions(optionsArg);
|
|
29
|
+
let observers = observersByDb.get(dbArg);
|
|
30
|
+
if (!observers) {
|
|
31
|
+
observers = new Set();
|
|
32
|
+
observersByDb.set(dbArg, observers);
|
|
33
|
+
}
|
|
34
|
+
observers.add(observer);
|
|
35
|
+
return () => {
|
|
36
|
+
observersByDb.get(dbArg)?.delete(observer);
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
/** @internal */
|
|
40
|
+
export const hasSmartdataWriteObservers = (dbArg) => (observersByDb.get(dbArg)?.size ?? 0) > 0;
|
|
41
|
+
const observedValueOf = (valueArg) => valueArg === null
|
|
42
|
+
|| typeof valueArg === 'string'
|
|
43
|
+
|| typeof valueArg === 'boolean'
|
|
44
|
+
|| (typeof valueArg === 'number' && Number.isFinite(valueArg))
|
|
45
|
+
? valueArg
|
|
46
|
+
: undefined;
|
|
47
|
+
const isPlainRecord = (valueArg) => {
|
|
48
|
+
if (typeof valueArg !== 'object' || valueArg === null || Array.isArray(valueArg)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const prototype = Object.getPrototypeOf(valueArg);
|
|
52
|
+
return prototype === Object.prototype || prototype === null;
|
|
53
|
+
};
|
|
54
|
+
const pickDocumentFields = (documentArg, fieldsArg) => {
|
|
55
|
+
const picked = {};
|
|
56
|
+
for (const field of fieldsArg) {
|
|
57
|
+
if (!Object.hasOwn(documentArg, field))
|
|
58
|
+
continue;
|
|
59
|
+
const value = observedValueOf(documentArg[field]);
|
|
60
|
+
if (value !== undefined)
|
|
61
|
+
picked[field] = value;
|
|
62
|
+
}
|
|
63
|
+
return picked;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* A `null` condition also matches a missing field, so only concrete values
|
|
67
|
+
* anchor a selector.
|
|
68
|
+
*/
|
|
69
|
+
const collectSelectorAnchors = (selectorArg, fieldsArg, identityDocumentIdFieldArg, anchorsArg) => {
|
|
70
|
+
if (!isPlainRecord(selectorArg))
|
|
71
|
+
return;
|
|
72
|
+
for (const key of Object.keys(selectorArg)) {
|
|
73
|
+
const condition = selectorArg[key];
|
|
74
|
+
if (key === '$and') {
|
|
75
|
+
if (Array.isArray(condition)) {
|
|
76
|
+
for (const conjunct of condition) {
|
|
77
|
+
collectSelectorAnchors(conjunct, fieldsArg, identityDocumentIdFieldArg, anchorsArg);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
let value = observedValueOf(condition);
|
|
83
|
+
if (value === undefined
|
|
84
|
+
&& isPlainRecord(condition)
|
|
85
|
+
&& Object.keys(condition).length === 1
|
|
86
|
+
&& Object.hasOwn(condition, '$eq')) {
|
|
87
|
+
value = observedValueOf(condition.$eq);
|
|
88
|
+
}
|
|
89
|
+
if (value === undefined || value === null)
|
|
90
|
+
continue;
|
|
91
|
+
const fields = key === '_id' && identityDocumentIdFieldArg
|
|
92
|
+
? [key, identityDocumentIdFieldArg]
|
|
93
|
+
: [key];
|
|
94
|
+
for (const field of fields) {
|
|
95
|
+
if (fieldsArg.has(field) && !Object.hasOwn(anchorsArg, field)) {
|
|
96
|
+
anchorsArg[field] = value;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const describeError = (errorArg) => errorArg instanceof Error ? errorArg.message : String(errorArg);
|
|
102
|
+
/**
|
|
103
|
+
* @internal Captures one acknowledged write for the observers registered now,
|
|
104
|
+
* and returns the delivery, or `undefined` when nobody observes the database.
|
|
105
|
+
* The observed values are copied at capture, so a delivery deferred to a
|
|
106
|
+
* transaction's commit reports the write as it was made. An observer removed
|
|
107
|
+
* before the delivery receives nothing.
|
|
108
|
+
*/
|
|
109
|
+
export const captureSmartdataWrite = (dbArg, writeArg) => {
|
|
110
|
+
const registered = observersByDb.get(dbArg);
|
|
111
|
+
if (!registered || registered.size === 0)
|
|
112
|
+
return undefined;
|
|
113
|
+
const observers = [...registered];
|
|
114
|
+
const fields = [...new Set(observers.flatMap((observerArg) => observerArg.fields))];
|
|
115
|
+
const documents = writeArg.documents?.map((documentArg) => pickDocumentFields(documentArg, fields)) ?? null;
|
|
116
|
+
const anchors = {};
|
|
117
|
+
collectSelectorAnchors(writeArg.selector, new Set(fields), writeArg.identityDocumentIdField, anchors);
|
|
118
|
+
return () => {
|
|
119
|
+
for (const observer of observers) {
|
|
120
|
+
if (!observersByDb.get(dbArg)?.has(observer))
|
|
121
|
+
continue;
|
|
122
|
+
const report = Object.freeze({
|
|
123
|
+
collection: writeArg.collection,
|
|
124
|
+
kind: writeArg.kind,
|
|
125
|
+
documents: documents === null
|
|
126
|
+
? null
|
|
127
|
+
: Object.freeze(documents.map((documentArg) => Object.freeze(pickDocumentFields(documentArg, observer.fields)))),
|
|
128
|
+
anchors: Object.freeze(pickDocumentFields(anchors, observer.fields)),
|
|
129
|
+
});
|
|
130
|
+
try {
|
|
131
|
+
observer.listener(report);
|
|
132
|
+
}
|
|
133
|
+
catch (errorArg) {
|
|
134
|
+
logger.log('error', `A SmartData write observer threw on a write to "${writeArg.collection}": ${describeError(errorArg)}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53cml0ZW9ic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLndyaXRlb2JzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXlEdEMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQW9DLENBQUM7QUFFdEUsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFVBQW1CLEVBQWtCLEVBQUU7SUFDdkUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNuRixJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxrQkFBa0IsRUFDcEQsMERBQTBELENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsSUFDRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1dBQ25CLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztXQUNuQixNQUFNLENBQUMsTUFBTSxHQUFHLHFCQUFxQjtXQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDMUIsT0FBTyxRQUFRLEtBQUssUUFBUTtlQUN6QixRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7ZUFDckIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7ZUFDdEIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztXQUMzQixJQUFJ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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lossless.org/client",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "One typed client for NoSQLDB, MongoDB, SQLDB, MariaDB, ClickHouse and S3 object storage.",
|
|
6
6
|
"exports": {
|
|
@@ -81,9 +81,9 @@
|
|
|
81
81
|
"@aws-sdk/client-s3": "^3.1039.0",
|
|
82
82
|
"@clickhouse/client": "1.23.1",
|
|
83
83
|
"@git.zone/tsbuild": "5.1.2",
|
|
84
|
-
"@git.zone/tsbundle": "3.1.
|
|
84
|
+
"@git.zone/tsbundle": "3.1.4",
|
|
85
85
|
"@git.zone/tsrun": "3.0.2",
|
|
86
|
-
"@git.zone/tstest": "7.
|
|
86
|
+
"@git.zone/tstest": "7.2.0",
|
|
87
87
|
"@lossless.org/nosqldb": "8.0.2",
|
|
88
88
|
"@lossless.org/nosqldb-qualified": "npm:@lossless.org/nosqldb@10.7.2",
|
|
89
89
|
"@lossless.org/objectstorage": "10.3.1",
|
package/readme.md
CHANGED
|
@@ -116,6 +116,7 @@ Family imports preserve the established SmartData and SmartBucket names and cons
|
|
|
116
116
|
| Query-plan inspection | `Model.inspectQueryPlan(db, { filter, sort?, projection?, limit?, timeoutMS?, signal? })` — the winning plan's stages (`stage`, `depth`, `indexName`, `direction`) and `nReturned`/`totalKeysExamined`/`totalDocsExamined`, read-only and bounded, so a consumer proves a model query uses its intended index without raw driver access |
|
|
117
117
|
| Per-instance model binding | `bindDocToManager(manager, Model)` returns a subclass of a model declared with `@managed()` and no manager argument, named like the model and bound to that manager, so several databases use the same models at once; any other binding is refused with `invalid_configuration` |
|
|
118
118
|
| Subclasses need their own binding | a subclass of a bound model that declares decorators or a persistence policy of its own and no `@Collection()`, `@managed()` or `defineCollectionModel()` binding is refused with `invalid_configuration` on every read and write, so it never writes through the parent's schema; an undecorated subclass keeps the inherited binding |
|
|
119
|
+
| Observing this process's writes | `db.observeWrites({ fields, listener })` — one frozen report per acknowledged model write, `{ collection, kind, documents, anchors }` with the requested top-level fields of the written documents and of the selector's equality anchors; writes inside a `db.createSession()` transaction are reported after the commit, never after a rollback; works on NoSQLDB, where `watch()` is unsupported |
|
|
119
120
|
| Disposable test databases on a unix socket | `SmartdataTestDatabase.create({ connection: { socketPath } })` from `@lossless.org/client/testsupport` reaches an engine that listens only on a unix-domain socket, fault helpers included; the loopback `host`/`port` form is unchanged |
|
|
120
121
|
|
|
121
122
|
`docs/source/smartdata/readme.md` documents each one with its refusals.
|
|
@@ -146,7 +147,7 @@ The document model runs on both NoSQLDB and MongoDB, but several APIs do not mea
|
|
|
146
147
|
| `getGroupedTotals()` / `getGroupedTotalsPage()` / `iterateGroupedTotals()` with one `groupBy` field | exact, including `sums`, declared nested paths, `unwind` of a declared array and declared fields of its element, `elementFilter`, group key order and `cursor` paging, on 8.0.2 and 10.7.2 alike | exact |
|
|
147
148
|
| the same with **two** `groupBy` fields | exact, `sums`, nested paths, `unwind`, two element fields of one unwound array (`lines.accountNumber` with `lines.side`), `elementFilter` and `cursor` paging included, on an engine that identifies itself as NoSQLDB 10.5.0 or newer: that release evaluates the composite group key per document. Below it the call is refused with `unsupported_operation` naming both fields and the single-field form, because the engine leaves the composite group key unresolved and answers with a single row whose group values are the literal field paths (`'$owner'`) and whose count is the whole filtered collection; the refusal is the guard against that wrong number, not a fix for it | exact; the client wraps each key member in `$ifNull`, because MongoDB leaves a missing member out of the key and would otherwise report it as a second null group |
|
|
148
149
|
| guarded `$expr` atomic filters (`$add`, `$lte`, `$ifNull`) | exact on 10.6.0 and newer: the engine evaluates the client's fail-closed compilation (`$cond`, `$let`, `$isNumber`, `$type`), so the guard admits within the limit, refuses beyond it and never matches a stored value that is not a finite number. 8.0.2 rejects the compilation with `invalid argument: $cond` and leaves the document untouched | exact |
|
|
149
|
-
| `watch()` change streams | unsupported. `NoSqlConnection` refuses with `unsupported_capability`, and so does a plain `SmartdataDb` whose engine identified itself; against an engine that answers no identity the refusal instead arrives from the engine as `CommandNotFound` once the change stream is read | supported on replica sets |
|
|
150
|
+
| `watch()` change streams | unsupported. `NoSqlConnection` refuses with `unsupported_capability`, and so does a plain `SmartdataDb` whose engine identified itself; against an engine that answers no identity the refusal instead arrives from the engine as `CommandNotFound` once the change stream is read. `db.observeWrites()` reports the process's own model writes on both backends | supported on replica sets |
|
|
150
151
|
| model-declared partial indexes (`partialFilterExpression`) | not expressible: the index-option type rejects it and the runtime refuses it with `invalid_configuration`. A client decision, not an engine limit on every release — 10.6.0 and newer create partial indexes, 8.0.2 refuses the option with `InvalidOptions` (72) — because one model declaration has to hold on every qualified backend. A migration may create one on 10.7.2; `toleratedIndexNames` accepts it and inspection reports its filter | not expressible, but a migration may own one; inspection reports its filter |
|
|
151
152
|
| collection validators (`validator`, `validationLevel`, `validationAction`) | no client API; a migration owns a validator through the driver. 10.7.0 and newer create the collection, list the options exactly as given and enforce them on every model write: a violating `insert()` or `atomicUpdate()` rejects with the engine's `DocumentValidationFailure` (121) and its `errInfo`, which the client passes through unchanged rather than mapping to a `SmartdataPersistenceError` code, and stores nothing. Models initialize on a validated collection like on any other. 8.0.2 refuses the option with `InvalidOptions` (72) and creates no collection, so a validator is never silently dropped | enforced; not exercised by the client's MongoDB suite |
|
|
152
153
|
| write conflicts between transactions, and writes outside a transaction to a document a transaction holds | 10.7.2 (since 10.6.1) detects a conflict at the statement, as MongoDB does: the first writer wins, and the later transaction's statement rejects with the engine's `WriteConflict` (112) labelled `TransientTransactionError`, which the client passes through so `session.withTransaction()` re-runs that callback. A write outside a transaction waits until the transaction holding its document ends, then applies on top; the wait is bounded by the write's own `timeoutMS` and by the engine's fixed 60-second transaction lifetime, after which a waiting writer aborts the holder. Awaiting such a write inside the holding transaction's callback therefore stalls that transaction until one of the two expires. 8.0.2 detects the conflict at commit: the first transaction to commit wins, a write outside a transaction applies at once, and the transaction that wrote first re-runs. Both writes land on either engine; a callback must be safe to re-run and must not swallow the statement error | first writer wins at the statement and outside writes wait, MongoDB's documented rule; not exercised by the client's MongoDB suite |
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import type { SmartdataCollection } from './classes.collection.js';
|
|
3
3
|
import {
|
|
4
|
+
reportSmartdataCollectionWrite,
|
|
4
5
|
runWithOrdinarySmartdataSession,
|
|
5
6
|
type TSmartdataOrdinarySession,
|
|
6
7
|
} from './classes.session.js';
|
|
@@ -31,13 +32,17 @@ export const executeAtomicDelete = async <T>(
|
|
|
31
32
|
},
|
|
32
33
|
async (rawSessionArg, deadlineArg) => {
|
|
33
34
|
await deadlineArg.join(collectionArg.init());
|
|
34
|
-
|
|
35
|
+
const result = await collectionArg.mongoDbCollection.deleteOne(
|
|
35
36
|
filterArg,
|
|
36
37
|
{
|
|
37
38
|
session: rawSessionArg,
|
|
38
39
|
...deadlineArg.commandOptions(),
|
|
39
40
|
},
|
|
40
41
|
);
|
|
42
|
+
if (result.deletedCount > 0) {
|
|
43
|
+
reportSmartdataCollectionWrite(collectionArg, optsArg?.session, 'delete', null, filterArg);
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
41
46
|
},
|
|
42
47
|
);
|
|
43
48
|
};
|
|
@@ -71,13 +76,17 @@ export const executeAtomicDeleteMany = async <T>(
|
|
|
71
76
|
},
|
|
72
77
|
async (rawSessionArg, deadlineArg) => {
|
|
73
78
|
await deadlineArg.join(collectionArg.init());
|
|
74
|
-
|
|
79
|
+
const result = await collectionArg.mongoDbCollection.deleteMany(
|
|
75
80
|
filterArg,
|
|
76
81
|
{
|
|
77
82
|
session: rawSessionArg,
|
|
78
83
|
...deadlineArg.commandOptions(),
|
|
79
84
|
},
|
|
80
85
|
);
|
|
86
|
+
if (result.deletedCount > 0) {
|
|
87
|
+
reportSmartdataCollectionWrite(collectionArg, optsArg?.session, 'delete', null, filterArg);
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
81
90
|
},
|
|
82
91
|
);
|
|
83
92
|
};
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
SmartdataPersistenceError,
|
|
6
6
|
} from './classes.persistence.js';
|
|
7
7
|
import {
|
|
8
|
+
reportSmartdataCollectionWrite,
|
|
8
9
|
runWithOrdinarySmartdataSession,
|
|
9
10
|
isSmartdataSession,
|
|
10
11
|
failSmartdataTransaction,
|
|
@@ -138,6 +139,15 @@ export const executeAtomicFindOneAndUpdate = async <T>(
|
|
|
138
139
|
classified.document, policy, collectionArg.getBoundModelSchema()!.persistedFields,
|
|
139
140
|
) as TRawDocument;
|
|
140
141
|
}
|
|
142
|
+
if (classified.status !== 'not_matched') {
|
|
143
|
+
reportSmartdataCollectionWrite(
|
|
144
|
+
collectionArg,
|
|
145
|
+
optionsArg.session,
|
|
146
|
+
classified.status === 'upserted' ? 'insert' : 'update',
|
|
147
|
+
classified.document ? [classified.document] : null,
|
|
148
|
+
filterArg,
|
|
149
|
+
);
|
|
150
|
+
}
|
|
141
151
|
return classified;
|
|
142
152
|
} catch (errorArg) {
|
|
143
153
|
if (policy) {
|
|
@@ -213,6 +223,18 @@ export const executeAtomicFindOneAndReplace = async <T>(
|
|
|
213
223
|
// Unreachable: this operation never requests an upsert.
|
|
214
224
|
return unsupportedResult();
|
|
215
225
|
}
|
|
226
|
+
if (classified.status === 'matched') {
|
|
227
|
+
// A before image leaves the replacement as the only image of the new state.
|
|
228
|
+
reportSmartdataCollectionWrite(
|
|
229
|
+
collectionArg,
|
|
230
|
+
optionsArg.session,
|
|
231
|
+
'replace',
|
|
232
|
+
optionsArg.returnDocument === 'after'
|
|
233
|
+
? [classified.document]
|
|
234
|
+
: [classified.document, replacementArg],
|
|
235
|
+
filterArg,
|
|
236
|
+
);
|
|
237
|
+
}
|
|
216
238
|
return classified;
|
|
217
239
|
} catch (errorArg) {
|
|
218
240
|
return normalizeOrdinaryPersistenceError(
|