@lossless.org/client 1.20.2 → 1.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/nosqldb/classes.atomicdelete.js +3 -3
  3. package/dist_ts/nosqldb/classes.atomicfindoneandupdate.js +6 -3
  4. package/dist_ts/nosqldb/classes.atomicupdate.js +4 -4
  5. package/dist_ts/nosqldb/classes.bootstraprecord.js +10 -5
  6. package/dist_ts/nosqldb/classes.collection.js +53 -16
  7. package/dist_ts/nosqldb/classes.collectiontopology.d.ts +8 -1
  8. package/dist_ts/nosqldb/classes.collectiontopology.js +10 -2
  9. package/dist_ts/nosqldb/classes.cursor.d.ts +4 -1
  10. package/dist_ts/nosqldb/classes.cursor.js +14 -3
  11. package/dist_ts/nosqldb/classes.db.d.ts +22 -0
  12. package/dist_ts/nosqldb/classes.db.js +25 -1
  13. package/dist_ts/nosqldb/classes.doc.js +35 -5
  14. package/dist_ts/nosqldb/classes.exactpersistence.d.ts +6 -0
  15. package/dist_ts/nosqldb/classes.exactpersistence.js +70 -13
  16. package/dist_ts/nosqldb/classes.readtracker.d.ts +89 -0
  17. package/dist_ts/nosqldb/classes.readtracker.js +876 -0
  18. package/dist_ts/nosqldb/classes.session.d.ts +30 -7
  19. package/dist_ts/nosqldb/classes.session.js +119 -26
  20. package/dist_ts/nosqldb/classes.storedinspection.js +12 -4
  21. package/dist_ts/nosqldb/classes.testdatabase.js +16 -9
  22. package/dist_ts/nosqldb/classes.writeobserver.d.ts +11 -0
  23. package/dist_ts/nosqldb/classes.writeobserver.js +1 -1
  24. package/package.json +1 -1
  25. package/readme.md +1 -0
  26. package/ts/00_commitinfo_data.ts +1 -1
  27. package/ts/nosqldb/classes.atomicdelete.ts +16 -2
  28. package/ts/nosqldb/classes.atomicfindoneandupdate.ts +5 -0
  29. package/ts/nosqldb/classes.atomicupdate.ts +10 -1
  30. package/ts/nosqldb/classes.bootstraprecord.ts +7 -4
  31. package/ts/nosqldb/classes.collection.ts +56 -12
  32. package/ts/nosqldb/classes.collectiontopology.ts +15 -1
  33. package/ts/nosqldb/classes.cursor.ts +14 -1
  34. package/ts/nosqldb/classes.db.ts +32 -0
  35. package/ts/nosqldb/classes.doc.ts +32 -2
  36. package/ts/nosqldb/classes.exactpersistence.ts +93 -19
  37. package/ts/nosqldb/classes.readtracker.ts +1031 -0
  38. package/ts/nosqldb/classes.session.ts +166 -30
  39. package/ts/nosqldb/classes.storedinspection.ts +15 -3
  40. package/ts/nosqldb/classes.testdatabase.ts +14 -8
  41. package/ts/nosqldb/classes.writeobserver.ts +11 -0
@@ -0,0 +1,876 @@
1
+ import * as plugins from './plugins.js';
2
+ import { collectionTopologyDbInspectionSymbol } from './classes.collectiontopology.js';
3
+ import { readBoundedInspectionCursor } from './classes.namespaceinspection.js';
4
+ import { SmartdataPersistenceError } from './classes.persistence.js';
5
+ /**
6
+ * The reads one `db.trackReads()` call made. `changed` turns true once a write
7
+ * of this process may have changed what any of them returned, and stays true.
8
+ */
9
+ export class SmartdataReadSet {
10
+ /**
11
+ * Whether a write this process made through the database's models since the
12
+ * reads ran could have changed any of their results. Also true after
13
+ * `close()`, after the database closed, and for a set that tracked a read
14
+ * it cannot follow.
15
+ */
16
+ get changed() {
17
+ const state = readSetStates.get(this);
18
+ return !state || state.changed;
19
+ }
20
+ /** Stops following writes and frees the recorded reads; `changed` is true from then on. */
21
+ close() {
22
+ const state = readSetStates.get(this);
23
+ if (state)
24
+ changeReadSet(state);
25
+ }
26
+ }
27
+ // Values an image or a stored path can hold beside real values.
28
+ const MISSING = Symbol('missing');
29
+ const UNKNOWN = Symbol('unknown');
30
+ const readSetStates = new WeakMap();
31
+ const readSetsByDb = new WeakMap();
32
+ /** Databases a read set was ever opened on; writes to others skip all capture work. */
33
+ const trackedDbs = new WeakSet();
34
+ const droppedReadSets = new FinalizationRegistry((stateArg) => {
35
+ changeReadSet(stateArg);
36
+ });
37
+ const readScope = new plugins.nodeAsyncHooks.AsyncLocalStorage();
38
+ /**
39
+ * Per database, whether the predicates can follow a collection's reads: only a
40
+ * plain collection without a default collation compares like they do.
41
+ */
42
+ const followableCollections = new WeakMap();
43
+ const writeScope = new plugins.nodeAsyncHooks.AsyncLocalStorage();
44
+ /** Orders read settling against write starts. */
45
+ let sequence = 0;
46
+ const changeReadSet = (stateArg) => {
47
+ if (stateArg.changed)
48
+ return;
49
+ stateArg.changed = true;
50
+ stateArg.reads.clear();
51
+ readSetsByDb.get(stateArg.db)?.delete(stateArg);
52
+ };
53
+ const isPlainRecord = (valueArg) => {
54
+ if (typeof valueArg !== 'object' || valueArg === null || Array.isArray(valueArg)) {
55
+ return false;
56
+ }
57
+ const prototype = Object.getPrototypeOf(valueArg);
58
+ return prototype === Object.prototype || prototype === null;
59
+ };
60
+ const isObjectIdLike = (valueArg) => typeof valueArg === 'object'
61
+ && valueArg !== null
62
+ && valueArg._bsontype === 'ObjectId'
63
+ && typeof valueArg.toHexString === 'function';
64
+ const isFilterPrimitive = (valueArg) => valueArg === null
65
+ || typeof valueArg === 'boolean'
66
+ || (typeof valueArg === 'number' && Number.isFinite(valueArg))
67
+ || (typeof valueArg === 'string' && valueArg.isWellFormed());
68
+ /** A stable key for an `_id`, or `undefined` for a value that has none. */
69
+ const documentIdKeyOf = (valueArg) => {
70
+ if (typeof valueArg === 'string')
71
+ return `s${valueArg}`;
72
+ if (typeof valueArg === 'number' && Number.isFinite(valueArg))
73
+ return `n${valueArg}`;
74
+ if (typeof valueArg === 'boolean')
75
+ return `b${valueArg}`;
76
+ if (isObjectIdLike(valueArg))
77
+ return `o${valueArg.toHexString()}`;
78
+ return undefined;
79
+ };
80
+ /** A stable key for a document's identity values, or `undefined` unless all are concrete primitives. */
81
+ const identityKeyOf = (valuesArg) => valuesArg.every((valueArg) => valueArg !== null && isFilterPrimitive(valueArg))
82
+ ? JSON.stringify(valuesArg)
83
+ : undefined;
84
+ // --- Document images --------------------------------------------------------
85
+ /** The image of a whole stored document, or `undefined` when its shape cannot be followed. */
86
+ const completeImage = (documentArg) => {
87
+ if (!isPlainRecord(documentArg) || 'toBSON' in documentArg)
88
+ return undefined;
89
+ const values = new Map();
90
+ for (const key of Object.keys(documentArg)) {
91
+ if (key.length === 0 || key.includes('.') || key.startsWith('$'))
92
+ return undefined;
93
+ values.set(key, documentArg[key]);
94
+ }
95
+ return { values, complete: true };
96
+ };
97
+ /** Follows `segmentsArg` below a value; arrays and foreign objects are not followed. */
98
+ const descendValue = (valueArg, segmentsArg) => {
99
+ let value = valueArg;
100
+ for (const segment of segmentsArg) {
101
+ if (value === MISSING || value === UNKNOWN)
102
+ return value;
103
+ if (value === undefined)
104
+ return UNKNOWN;
105
+ if (typeof value !== 'object' || value === null)
106
+ return MISSING;
107
+ if (!isPlainRecord(value) || 'toBSON' in value)
108
+ return UNKNOWN;
109
+ value = Object.hasOwn(value, segment) ? value[segment] : MISSING;
110
+ }
111
+ if (value === undefined)
112
+ return UNKNOWN;
113
+ if (isPlainRecord(value) && 'toBSON' in value)
114
+ return UNKNOWN;
115
+ return value;
116
+ };
117
+ /** The value at a dotted path of an image: a value, `MISSING`, or `UNKNOWN`. */
118
+ const lookupPath = (imageArg, pathArg) => {
119
+ if (!imageArg)
120
+ return UNKNOWN;
121
+ const segments = pathArg.split('.');
122
+ for (let length = segments.length; length > 0; length--) {
123
+ const key = length === segments.length ? pathArg : segments.slice(0, length).join('.');
124
+ if (imageArg.values.has(key)) {
125
+ return descendValue(imageArg.values.get(key), segments.slice(length));
126
+ }
127
+ }
128
+ const prefix = `${pathArg}.`;
129
+ for (const key of imageArg.values.keys()) {
130
+ // The image changed part of the value, so the rest of it is not known here.
131
+ if (key.startsWith(prefix))
132
+ return UNKNOWN;
133
+ }
134
+ if (imageArg.base)
135
+ return lookupPath(imageArg.base, pathArg);
136
+ if (imageArg.complete)
137
+ return pathArg === '_id' ? UNKNOWN : MISSING;
138
+ return UNKNOWN;
139
+ };
140
+ /** A deep copy of plain records and arrays, so a buffered change keeps the values of its write. */
141
+ const snapshotValue = (valueArg) => {
142
+ if (Array.isArray(valueArg))
143
+ return valueArg.map(snapshotValue);
144
+ if (isPlainRecord(valueArg) && !('toBSON' in valueArg)) {
145
+ const copy = {};
146
+ for (const key of Object.keys(valueArg))
147
+ copy[key] = snapshotValue(valueArg[key]);
148
+ return copy;
149
+ }
150
+ return valueArg;
151
+ };
152
+ const unknownPredicate = () => undefined;
153
+ const unknownCondition = () => undefined;
154
+ const allOf = (partsArg) => (arg) => {
155
+ let result = true;
156
+ for (const part of partsArg) {
157
+ const match = part(arg);
158
+ if (match === false)
159
+ return false;
160
+ if (match === undefined)
161
+ result = undefined;
162
+ }
163
+ return result;
164
+ };
165
+ const anyOf = (partsArg) => (arg) => {
166
+ let result = false;
167
+ for (const part of partsArg) {
168
+ const match = part(arg);
169
+ if (match === true)
170
+ return true;
171
+ if (match === undefined)
172
+ result = undefined;
173
+ }
174
+ return result;
175
+ };
176
+ const negate = (partArg) => (arg) => {
177
+ const match = partArg(arg);
178
+ return match === undefined ? undefined : !match;
179
+ };
180
+ /**
181
+ * Whether a stored value is one the supported operators decide on. Arrays
182
+ * match element-wise, and other BSON types compare across numeric types, so
183
+ * both stay undecided.
184
+ */
185
+ const isDecidableValue = (valueArg) => valueArg === MISSING
186
+ || isFilterPrimitive(valueArg)
187
+ || isObjectIdLike(valueArg)
188
+ || isPlainRecord(valueArg);
189
+ const decided = (conditionArg) => (valueArg) => isDecidableValue(valueArg) ? conditionArg(valueArg) : undefined;
190
+ /** Equality with a filter primitive or ObjectId; `null` also matches a missing field. */
191
+ const equals = (operandArg) => decided((valueArg) => {
192
+ if (valueArg === MISSING || valueArg === null)
193
+ return operandArg === null;
194
+ if (isObjectIdLike(operandArg)) {
195
+ return isObjectIdLike(valueArg) && valueArg.toHexString() === operandArg.toHexString();
196
+ }
197
+ if (isObjectIdLike(valueArg))
198
+ return false;
199
+ if (isPlainRecord(valueArg))
200
+ return false;
201
+ return valueArg === operandArg;
202
+ });
203
+ const isEqualityOperand = (valueArg) => isFilterPrimitive(valueArg) || isObjectIdLike(valueArg);
204
+ /** Strings without surrogates order the same by UTF-16 units and by UTF-8 bytes. */
205
+ const isPlainOrderString = (valueArg) => !/[\uD800-￿]/.test(valueArg);
206
+ const compares = (operatorArg, operandArg) => {
207
+ if (!(typeof operandArg === 'number' && Number.isFinite(operandArg))
208
+ && !(typeof operandArg === 'string' && isPlainOrderString(operandArg))) {
209
+ return unknownCondition;
210
+ }
211
+ return decided((valueArg) => {
212
+ if (valueArg === MISSING)
213
+ return false;
214
+ // A range only matches values of its operand's BSON type.
215
+ if (typeof valueArg !== typeof operandArg)
216
+ return false;
217
+ if (typeof valueArg === 'string' && !isPlainOrderString(valueArg))
218
+ return undefined;
219
+ const value = valueArg;
220
+ const operand = operandArg;
221
+ switch (operatorArg) {
222
+ case '$gt': return value > operand;
223
+ case '$gte': return value >= operand;
224
+ case '$lt': return value < operand;
225
+ case '$lte': return value <= operand;
226
+ }
227
+ });
228
+ };
229
+ const isOperatorObject = (valueArg) => isPlainRecord(valueArg)
230
+ && Object.keys(valueArg).length > 0
231
+ && Object.keys(valueArg).every((keyArg) => keyArg.startsWith('$'));
232
+ const compileCondition = (conditionArg) => {
233
+ if (isEqualityOperand(conditionArg))
234
+ return equals(conditionArg);
235
+ if (!isOperatorObject(conditionArg))
236
+ return unknownCondition;
237
+ const parts = [];
238
+ for (const operator of Object.keys(conditionArg)) {
239
+ const operand = conditionArg[operator];
240
+ switch (operator) {
241
+ case '$eq':
242
+ parts.push(isEqualityOperand(operand) ? equals(operand) : unknownCondition);
243
+ break;
244
+ case '$ne':
245
+ parts.push(isEqualityOperand(operand) ? negate(equals(operand)) : unknownCondition);
246
+ break;
247
+ case '$in':
248
+ case '$nin': {
249
+ const listed = Array.isArray(operand) && operand.every(isEqualityOperand)
250
+ ? anyOf(operand.map(equals))
251
+ : unknownCondition;
252
+ parts.push(operator === '$in' ? listed : negate(listed));
253
+ break;
254
+ }
255
+ case '$gt':
256
+ case '$gte':
257
+ case '$lt':
258
+ case '$lte':
259
+ parts.push(compares(operator, operand));
260
+ break;
261
+ case '$exists':
262
+ parts.push(typeof operand === 'boolean'
263
+ ? (valueArg) => valueArg === UNKNOWN
264
+ ? undefined
265
+ : (valueArg !== MISSING) === operand
266
+ : unknownCondition);
267
+ break;
268
+ case '$not':
269
+ parts.push(isOperatorObject(operand) ? negate(compileCondition(operand)) : unknownCondition);
270
+ break;
271
+ default:
272
+ parts.push(unknownCondition);
273
+ }
274
+ }
275
+ return allOf(parts);
276
+ };
277
+ /**
278
+ * The part of a path a write or filter can be followed on: up to the first
279
+ * positional or numeric segment, which may address array elements.
280
+ */
281
+ const followablePath = (pathArg) => {
282
+ const segments = pathArg.split('.');
283
+ if (segments.some((segmentArg) => segmentArg.length === 0))
284
+ return undefined;
285
+ const cut = segments.findIndex((segmentArg) => segmentArg.startsWith('$') || /^\d+$/.test(segmentArg));
286
+ if (cut === 0)
287
+ return undefined;
288
+ return cut === -1
289
+ ? { path: pathArg, whole: true }
290
+ : { path: segments.slice(0, cut).join('.'), whole: false };
291
+ };
292
+ const compileFilter = (filterArg, refsArg) => {
293
+ if (!isPlainRecord(filterArg)) {
294
+ refsArg.all = true;
295
+ return unknownPredicate;
296
+ }
297
+ const parts = [];
298
+ for (const key of Object.keys(filterArg)) {
299
+ const value = filterArg[key];
300
+ if (key === '$and' || key === '$or' || key === '$nor') {
301
+ if (!Array.isArray(value) || value.length === 0 || !value.every(isPlainRecord)) {
302
+ refsArg.all = true;
303
+ parts.push(unknownPredicate);
304
+ continue;
305
+ }
306
+ const branches = value.map((branchArg) => compileFilter(branchArg, refsArg));
307
+ parts.push(key === '$and'
308
+ ? allOf(branches)
309
+ : key === '$or' ? anyOf(branches) : negate(anyOf(branches)));
310
+ continue;
311
+ }
312
+ if (key === '$comment')
313
+ continue;
314
+ const followable = key.startsWith('$') ? undefined : followablePath(key);
315
+ if (!followable) {
316
+ refsArg.all = true;
317
+ parts.push(unknownPredicate);
318
+ continue;
319
+ }
320
+ refsArg.paths.add(followable.path);
321
+ if (!followable.whole) {
322
+ parts.push(unknownPredicate);
323
+ continue;
324
+ }
325
+ const condition = compileCondition(value);
326
+ parts.push((imageArg) => condition(lookupPath(imageArg, key)));
327
+ }
328
+ return allOf(parts);
329
+ };
330
+ const addSortRefs = (sortArg, refsArg) => {
331
+ if (sortArg === undefined)
332
+ return;
333
+ if (!isPlainRecord(sortArg)) {
334
+ refsArg.all = true;
335
+ return;
336
+ }
337
+ for (const key of Object.keys(sortArg)) {
338
+ const followable = key.startsWith('$') ? undefined : followablePath(key);
339
+ const direction = sortArg[key];
340
+ if (!followable || (direction !== 1 && direction !== -1)) {
341
+ refsArg.all = true;
342
+ return;
343
+ }
344
+ refsArg.paths.add(followable.path);
345
+ }
346
+ };
347
+ const updatesWithUnknownResult = new Set([
348
+ '$inc', '$mul', '$min', '$max', '$currentDate',
349
+ '$push', '$pull', '$pullAll', '$addToSet', '$pop', '$bit',
350
+ ]);
351
+ const analyzeUpdate = (updateArg, insertedArg) => {
352
+ const everything = { touched: 'all', sets: new Map() };
353
+ if (!isPlainRecord(updateArg))
354
+ return everything;
355
+ const operators = Object.keys(updateArg);
356
+ if (operators.length === 0 || operators.some((operatorArg) => !operatorArg.startsWith('$'))) {
357
+ return everything;
358
+ }
359
+ const touched = new Set();
360
+ const sets = new Map();
361
+ const touch = (pathArg, valueArg) => {
362
+ const followable = followablePath(pathArg);
363
+ if (!followable)
364
+ return false;
365
+ const value = !followable.whole || sets.has(followable.path) ? UNKNOWN : valueArg;
366
+ touched.add(followable.path);
367
+ sets.set(followable.path, value);
368
+ return true;
369
+ };
370
+ for (const operator of operators) {
371
+ const fields = updateArg[operator];
372
+ if (!isPlainRecord(fields))
373
+ return everything;
374
+ for (const path of Object.keys(fields)) {
375
+ let followed = true;
376
+ switch (operator) {
377
+ case '$set':
378
+ followed = touch(path, fields[path]);
379
+ break;
380
+ case '$setOnInsert':
381
+ if (insertedArg)
382
+ followed = touch(path, fields[path]);
383
+ break;
384
+ case '$unset':
385
+ followed = touch(path, MISSING);
386
+ break;
387
+ case '$rename':
388
+ followed = typeof fields[path] === 'string'
389
+ && touch(path, UNKNOWN)
390
+ && touch(fields[path], UNKNOWN);
391
+ break;
392
+ default:
393
+ if (!updatesWithUnknownResult.has(operator))
394
+ return everything;
395
+ followed = touch(path, UNKNOWN);
396
+ }
397
+ if (!followed)
398
+ return everything;
399
+ }
400
+ }
401
+ return { touched, sets };
402
+ };
403
+ /**
404
+ * The top-level equality conditions of a selector, including inside `$and`.
405
+ * `null` also matches a missing field, and a non-null value also matches an
406
+ * array holding it, so only an `_id` (never an array) states a stored value.
407
+ */
408
+ const collectEqualities = (selectorArg, equalitiesArg) => {
409
+ if (!isPlainRecord(selectorArg))
410
+ return;
411
+ for (const key of Object.keys(selectorArg)) {
412
+ const condition = selectorArg[key];
413
+ if (key === '$and') {
414
+ if (Array.isArray(condition)) {
415
+ for (const conjunct of condition)
416
+ collectEqualities(conjunct, equalitiesArg);
417
+ }
418
+ continue;
419
+ }
420
+ if (key.startsWith('$') || key.includes('.'))
421
+ continue;
422
+ let value = UNKNOWN;
423
+ if (isEqualityOperand(condition)) {
424
+ value = condition;
425
+ }
426
+ else if (isPlainRecord(condition)
427
+ && Object.keys(condition).length === 1
428
+ && Object.hasOwn(condition, '$eq')
429
+ && isEqualityOperand(condition.$eq)) {
430
+ value = condition.$eq;
431
+ }
432
+ if (value === UNKNOWN || value === null)
433
+ continue;
434
+ if (!equalitiesArg.has(key))
435
+ equalitiesArg.set(key, value);
436
+ }
437
+ };
438
+ const documentIdImage = (selectorArg) => {
439
+ const equalities = new Map();
440
+ collectEqualities(selectorArg, equalities);
441
+ const values = new Map();
442
+ if (documentIdKeyOf(equalities.get('_id')) !== undefined)
443
+ values.set('_id', equalities.get('_id'));
444
+ return { values, complete: false };
445
+ };
446
+ const selectorIdentityKey = (selectorArg, identityFieldsArg) => {
447
+ if (!identityFieldsArg?.length)
448
+ return undefined;
449
+ const equalities = new Map();
450
+ collectEqualities(selectorArg, equalities);
451
+ if (!identityFieldsArg.every((fieldArg) => equalities.has(fieldArg)))
452
+ return undefined;
453
+ return identityKeyOf(identityFieldsArg.map((fieldArg) => equalities.get(fieldArg)));
454
+ };
455
+ const imageIdentityKey = (imageArg, identityFieldsArg) => {
456
+ if (!imageArg || !identityFieldsArg?.length)
457
+ return undefined;
458
+ return identityKeyOf(identityFieldsArg.map((fieldArg) => lookupPath(imageArg, fieldArg)));
459
+ };
460
+ /**
461
+ * The document an upsert inserted: the selector's plain top-level equalities
462
+ * under the update's values. A selector of only such equalities states every
463
+ * field; any other condition leaves its field unknown.
464
+ */
465
+ const upsertedImage = (selectorArg, effectArg) => {
466
+ if (effectArg.touched === 'all' || !isPlainRecord(selectorArg))
467
+ return undefined;
468
+ const values = new Map();
469
+ let complete = true;
470
+ for (const key of Object.keys(selectorArg)) {
471
+ const condition = selectorArg[key];
472
+ if (key.startsWith('$') || key.includes('.')) {
473
+ complete = false;
474
+ continue;
475
+ }
476
+ values.set(key, isEqualityOperand(condition) && condition !== null ? condition : UNKNOWN);
477
+ }
478
+ return { values: effectArg.sets, complete: false, base: { values, complete } };
479
+ };
480
+ const withDocumentKeys = (changeArg, writeArg) => {
481
+ changeArg.idKey = documentIdKeyOf(lookupPath(changeArg.before, '_id'))
482
+ ?? documentIdKeyOf(lookupPath(changeArg.after, '_id'));
483
+ changeArg.identityKey = imageIdentityKey(changeArg.before, writeArg.identityFields)
484
+ ?? selectorIdentityKey(writeArg.selector, writeArg.identityFields);
485
+ return changeArg;
486
+ };
487
+ /** What one acknowledged write did to each document it wrote, as far as its report tells. */
488
+ const describeWrite = (writeArg, startedAtArg) => {
489
+ const { kind, images, documents } = writeArg;
490
+ const unknown = [{ kind: 'unknown', touched: 'all', startedAt: startedAtArg }];
491
+ const change = (fieldsArg) => withDocumentKeys({ kind, startedAt: startedAtArg, ...fieldsArg }, writeArg);
492
+ const documentIdOf = (imageArg) => {
493
+ const id = lookupPath(imageArg, '_id');
494
+ return documentIdKeyOf(id) === undefined
495
+ ? undefined
496
+ : { values: new Map([['_id', id]]), complete: false };
497
+ };
498
+ switch (kind) {
499
+ case 'insert':
500
+ if (images === 'after' && documents) {
501
+ return documents.map((documentArg) => change({ after: completeImage(documentArg), touched: 'all' }));
502
+ }
503
+ if (images === 'none' && writeArg.update !== undefined) {
504
+ return [change({
505
+ after: upsertedImage(writeArg.selector, analyzeUpdate(writeArg.update, true)),
506
+ touched: 'all',
507
+ })];
508
+ }
509
+ return images === undefined ? unknown : [change({ touched: 'all' })];
510
+ case 'update': {
511
+ const effect = analyzeUpdate(writeArg.update, false);
512
+ if (images === 'after' && documents?.length === 1) {
513
+ const after = completeImage(documents[0]);
514
+ return [change({ before: documentIdOf(after), after, touched: effect.touched })];
515
+ }
516
+ if (images === 'before' && documents?.length === 1) {
517
+ const before = completeImage(documents[0]);
518
+ return [change({
519
+ before,
520
+ after: effect.touched === 'all' || !before
521
+ ? undefined
522
+ : { values: effect.sets, complete: false, base: before },
523
+ touched: effect.touched,
524
+ })];
525
+ }
526
+ if (images === 'none') {
527
+ const before = documentIdImage(writeArg.selector);
528
+ return [change({
529
+ before,
530
+ after: effect.touched === 'all'
531
+ ? undefined
532
+ : { values: effect.sets, complete: false, base: before },
533
+ touched: effect.touched,
534
+ })];
535
+ }
536
+ return unknown;
537
+ }
538
+ case 'replace': {
539
+ if (images === 'beforeAndAfter' && documents?.length === 2) {
540
+ const before = completeImage(documents[0]);
541
+ let after = completeImage(documents[1]);
542
+ if (after && !after.values.has('_id') && before?.values.has('_id')) {
543
+ after = { ...after, values: new Map([...after.values, ['_id', before.values.get('_id')]]) };
544
+ }
545
+ return [change({ before, after, touched: 'all' })];
546
+ }
547
+ if (images === 'after' && documents?.length) {
548
+ // Documents before the last are what the caller expected, not what was stored.
549
+ const after = completeImage(documents[documents.length - 1]);
550
+ return [change({ before: documentIdOf(after), after, touched: 'all' })];
551
+ }
552
+ return unknown;
553
+ }
554
+ case 'delete':
555
+ if (images === 'before' && documents) {
556
+ return documents.map((documentArg) => change({ before: completeImage(documentArg), touched: 'all' }));
557
+ }
558
+ if (images === 'none') {
559
+ return [change({ before: documentIdImage(writeArg.selector), touched: 'all' })];
560
+ }
561
+ return unknown;
562
+ }
563
+ return unknown;
564
+ };
565
+ // --- Evaluation -------------------------------------------------------------
566
+ const pathsOverlap = (leftArg, rightArg) => leftArg === rightArg
567
+ || leftArg.startsWith(`${rightArg}.`)
568
+ || rightArg.startsWith(`${leftArg}.`);
569
+ const refsOverlap = (refsArg, touchedArg) => {
570
+ if (refsArg === 'all' || touchedArg === 'all')
571
+ return true;
572
+ for (const ref of refsArg) {
573
+ for (const path of touchedArg) {
574
+ if (pathsOverlap(ref, path))
575
+ return true;
576
+ }
577
+ }
578
+ return false;
579
+ };
580
+ /**
581
+ * Whether the change could alter what the read returned. Anything that is not
582
+ * known to leave the result alone counts as a change.
583
+ */
584
+ const changeAffectsRead = (readArg, changeArg) => {
585
+ if (changeArg.kind === 'unknown' || readArg.kind === 'collection')
586
+ return true;
587
+ const matchesBefore = () => readArg.predicate(changeArg.before);
588
+ const matchesAfter = () => readArg.predicate(changeArg.after);
589
+ // A write that started before the read settled may be part of what it returned.
590
+ const concurrent = !readArg.settled || readArg.settledAt > changeArg.startedAt;
591
+ if (readArg.kind === 'count') {
592
+ if (changeArg.kind === 'insert')
593
+ return matchesAfter() !== false;
594
+ if (changeArg.kind === 'delete')
595
+ return matchesBefore() !== false;
596
+ if (!refsOverlap(readArg.refs, changeArg.touched))
597
+ return false;
598
+ const before = matchesBefore();
599
+ const after = matchesAfter();
600
+ if (concurrent)
601
+ return !(before === false && after === false);
602
+ return before === undefined || after === undefined || before !== after;
603
+ }
604
+ if (changeArg.kind === 'insert')
605
+ return matchesAfter() !== false;
606
+ let returned;
607
+ if (readArg.settled && !concurrent) {
608
+ if (changeArg.idKey !== undefined && readArg.byId) {
609
+ returned = readArg.byId.has(changeArg.idKey);
610
+ }
611
+ else if (changeArg.identityKey !== undefined && readArg.byIdentity) {
612
+ returned = readArg.byIdentity.has(changeArg.identityKey);
613
+ }
614
+ }
615
+ if (returned === true)
616
+ return true;
617
+ if (returned === undefined && matchesBefore() !== false)
618
+ return true;
619
+ // The document was not returned: only one that matches afterwards can enter.
620
+ if (changeArg.kind === 'delete')
621
+ return false;
622
+ if (matchesAfter() === false)
623
+ return false;
624
+ return refsOverlap(readArg.refs, changeArg.touched);
625
+ };
626
+ const applyChanges = (dbArg, collectionArg, changesArg) => {
627
+ const states = readSetsByDb.get(dbArg);
628
+ if (!states)
629
+ return;
630
+ for (const state of [...states]) {
631
+ const reads = state.reads.get(collectionArg);
632
+ if (!reads)
633
+ continue;
634
+ if (reads.some((readArg) => changesArg.some((changeArg) => changeAffectsRead(readArg, changeArg)))) {
635
+ changeReadSet(state);
636
+ }
637
+ }
638
+ };
639
+ /** How long the check of one read collection may take. */
640
+ const collectionCheckTimeoutMs = 5_000;
641
+ /**
642
+ * Whether the reads of a collection can be followed, or `undefined` when it
643
+ * does not exist: a view, another namespace type and a collection with a
644
+ * default collation compare in ways the predicates do not.
645
+ */
646
+ const isFollowableCollection = async (dbArg, collectionArg) => {
647
+ const signal = AbortSignal.timeout(collectionCheckTimeoutMs);
648
+ const expiresAt = performance.now() + collectionCheckTimeoutMs;
649
+ const cleanupOptions = () => ({ timeoutMS: Math.max(1, Math.ceil(expiresAt - performance.now())) });
650
+ const [namespace] = await dbArg[collectionTopologyDbInspectionSymbol]((mongoDbArg) => readBoundedInspectionCursor(mongoDbArg.listCollections({ name: collectionArg }, { nameOnly: false, batchSize: 1, ...cleanupOptions(), signal }), 1, signal, cleanupOptions));
651
+ if (!namespace)
652
+ return undefined;
653
+ const options = namespace.options;
654
+ return namespace.type === 'collection'
655
+ && (options === undefined || (isPlainRecord(options) && options.collation === undefined));
656
+ };
657
+ /**
658
+ * Checks each collection the set read, once per database. A collection that
659
+ * cannot be followed, does not exist or cannot be checked changes the set.
660
+ */
661
+ const checkReadCollections = async (stateArg) => {
662
+ let known = followableCollections.get(stateArg.db);
663
+ if (!known) {
664
+ known = new Map();
665
+ followableCollections.set(stateArg.db, known);
666
+ }
667
+ const collections = [...stateArg.reads.keys()];
668
+ try {
669
+ await Promise.all(collections.filter((collectionArg) => !known.has(collectionArg))
670
+ .map(async (collectionArg) => {
671
+ const followable = await isFollowableCollection(stateArg.db, collectionArg);
672
+ if (followable !== undefined)
673
+ known.set(collectionArg, followable);
674
+ }));
675
+ }
676
+ catch {
677
+ changeReadSet(stateArg);
678
+ return;
679
+ }
680
+ if (collections.some((collectionArg) => known.get(collectionArg) !== true))
681
+ changeReadSet(stateArg);
682
+ };
683
+ // --- Internal API -----------------------------------------------------------
684
+ /** @internal Runs `fnArg` with a new read set open; see `SmartdataDb.trackReads`. */
685
+ export const trackSmartdataReads = async (dbArg, fnArg) => {
686
+ if (typeof fnArg !== 'function') {
687
+ throw new SmartdataPersistenceError('invalid_argument', 'db.trackReads() requires a callback function.');
688
+ }
689
+ const reads = new SmartdataReadSet();
690
+ const state = { db: dbArg, changed: false, finished: false, reads: new Map() };
691
+ readSetStates.set(reads, state);
692
+ let states = readSetsByDb.get(dbArg);
693
+ if (!states) {
694
+ states = new Set();
695
+ readSetsByDb.set(dbArg, states);
696
+ }
697
+ states.add(state);
698
+ trackedDbs.add(dbArg);
699
+ droppedReadSets.register(reads, state);
700
+ try {
701
+ const result = await readScope.run([...(readScope.getStore() ?? []), state], fnArg);
702
+ state.finished = true;
703
+ if (!state.changed)
704
+ await checkReadCollections(state);
705
+ return { result, reads };
706
+ }
707
+ catch (errorArg) {
708
+ reads.close();
709
+ throw errorArg;
710
+ }
711
+ };
712
+ /** @internal Whether a read of the current async context is tracked. */
713
+ export const hasSmartdataReadScope = () => readScope.getStore() !== undefined;
714
+ /** @internal Whether any read set of the database is open. */
715
+ export const hasSmartdataReadSets = (dbArg) => (readSetsByDb.get(dbArg)?.size ?? 0) > 0;
716
+ /** @internal Marks every open read set of the database changed, as its `close()` does. */
717
+ export const changeSmartdataReadSetsOfDb = (dbArg) => {
718
+ // A reconnected database may hold recreated collections.
719
+ followableCollections.delete(dbArg);
720
+ for (const state of [...(readSetsByDb.get(dbArg) ?? [])])
721
+ changeReadSet(state);
722
+ };
723
+ /**
724
+ * Whether a limited read keeps the documents its filter and sort decide: at
725
+ * most one document matches an equality on `_id` or an identity field, and a
726
+ * sort by `_id` or by an identity field whose index holds every document
727
+ * orders them all.
728
+ */
729
+ const limitFollowsQuery = (specArg) => {
730
+ const filter = specArg.filter;
731
+ const sort = specArg.sort;
732
+ const pins = (valueArg) => (isFilterPrimitive(valueArg) && valueArg !== null)
733
+ || isObjectIdLike(valueArg)
734
+ || (isPlainRecord(valueArg) && Object.keys(valueArg).length === 1 && Object.hasOwn(valueArg, '$eq') && pins(valueArg.$eq));
735
+ return ['_id', ...(specArg.identityFields ?? [])].some((fieldArg) => isPlainRecord(filter) && Object.hasOwn(filter, fieldArg) && pins(filter[fieldArg]))
736
+ || ['_id', ...(specArg.orderingIdentityFields ?? [])].some((fieldArg) => isPlainRecord(sort) && Object.hasOwn(sort, fieldArg));
737
+ };
738
+ /**
739
+ * @internal Registers one read with every open read set of the current async
740
+ * context, before the read is issued. A read inside a transaction sees writes
741
+ * that may never commit, and a read of another database or of a collection the
742
+ * predicates cannot follow is not followed, so each marks the sets changed
743
+ * instead.
744
+ */
745
+ export const observeSmartdataRead = (dbArg, specArg, inTransactionArg) => {
746
+ const states = readScope.getStore()?.filter((stateArg) => !stateArg.changed);
747
+ if (!states?.length)
748
+ return undefined;
749
+ const followed = [];
750
+ const followable = followableCollections.get(dbArg)?.get(specArg.collection);
751
+ for (const state of states) {
752
+ // A read after the callback returned was never checked with the others.
753
+ if (inTransactionArg
754
+ || state.db !== dbArg
755
+ || followable === false
756
+ || (state.finished && followable !== true)) {
757
+ changeReadSet(state);
758
+ }
759
+ else {
760
+ followed.push(state);
761
+ }
762
+ }
763
+ if (followed.length === 0)
764
+ return undefined;
765
+ const refs = { paths: new Set(), all: false };
766
+ let predicate = specArg.kind === 'collection'
767
+ ? unknownPredicate
768
+ : compileFilter(specArg.filter ?? {}, refs);
769
+ addSortRefs(specArg.sort, refs);
770
+ if (specArg.limited && !limitFollowsQuery(specArg)) {
771
+ // Which matching documents the limit keeps follows the query plan, which a write to any field can reorder.
772
+ refs.all = true;
773
+ }
774
+ if (specArg.hint !== undefined) {
775
+ // A hinted sparse or partial index can leave out matching documents.
776
+ const filterPredicate = predicate;
777
+ predicate = (imageArg) => filterPredicate(imageArg) === false ? false : undefined;
778
+ refs.all = true;
779
+ }
780
+ const observation = {
781
+ kind: specArg.kind,
782
+ predicate,
783
+ refs: refs.all ? 'all' : refs.paths,
784
+ identityFields: specArg.identityFields?.length ? [...specArg.identityFields] : undefined,
785
+ settles: specArg.matches !== true,
786
+ settled: false,
787
+ settledAt: 0,
788
+ byId: new Set(),
789
+ byIdentity: specArg.identityFields?.length ? new Set() : null,
790
+ };
791
+ for (const state of followed) {
792
+ let reads = state.reads.get(specArg.collection);
793
+ if (!reads) {
794
+ reads = [];
795
+ state.reads.set(specArg.collection, reads);
796
+ }
797
+ reads.push(observation);
798
+ }
799
+ return {
800
+ record: (documentArg) => {
801
+ if (observation.settled)
802
+ return;
803
+ if (!isPlainRecord(documentArg)) {
804
+ observation.byId = null;
805
+ observation.byIdentity = null;
806
+ return;
807
+ }
808
+ const idKey = documentIdKeyOf(documentArg._id);
809
+ if (idKey === undefined)
810
+ observation.byId = null;
811
+ else
812
+ observation.byId?.add(idKey);
813
+ if (observation.byIdentity && observation.identityFields) {
814
+ const identityKey = identityKeyOf(observation.identityFields.map((fieldArg) => Object.hasOwn(documentArg, fieldArg) ? documentArg[fieldArg] : undefined));
815
+ if (identityKey === undefined)
816
+ observation.byIdentity = null;
817
+ else
818
+ observation.byIdentity.add(identityKey);
819
+ }
820
+ },
821
+ settle: () => {
822
+ if (!observation.settles || observation.settled)
823
+ return;
824
+ observation.settled = true;
825
+ observation.settledAt = ++sequence;
826
+ },
827
+ };
828
+ };
829
+ /**
830
+ * @internal Runs one model write. A write inside a read scope marks its sets
831
+ * changed; any other write records when it started, so its report can tell
832
+ * which reads ran concurrently with it.
833
+ */
834
+ export const runSmartdataWrite = (dbArg, operationArg) => {
835
+ for (const state of readScope.getStore() ?? [])
836
+ changeReadSet(state);
837
+ if (!trackedDbs.has(dbArg))
838
+ return operationArg();
839
+ return writeScope.run({ db: dbArg, startedAt: ++sequence }, operationArg);
840
+ };
841
+ /**
842
+ * @internal Captures how one acknowledged write changes the open read sets of
843
+ * its database, and returns the change to apply, or `undefined` when no set
844
+ * can be affected. A `deferred` change is applied after a transaction
845
+ * commits; it copies the written values now and also reaches sets opened in
846
+ * the meantime.
847
+ */
848
+ export const captureSmartdataReadChange = (dbArg, writeArg, deferredArg) => {
849
+ if (!trackedDbs.has(dbArg)) {
850
+ return deferredArg ? captureSmartdataCollectionChange(dbArg, writeArg.collection, true) : undefined;
851
+ }
852
+ if (!deferredArg && !hasSmartdataReadSets(dbArg))
853
+ return undefined;
854
+ const scope = writeScope.getStore();
855
+ const startedAt = scope?.db === dbArg ? scope.startedAt : 0;
856
+ const write = deferredArg
857
+ ? {
858
+ ...writeArg,
859
+ documents: writeArg.documents?.map((documentArg) => snapshotValue(documentArg)) ?? null,
860
+ selector: snapshotValue(writeArg.selector),
861
+ update: snapshotValue(writeArg.update),
862
+ }
863
+ : writeArg;
864
+ const changes = describeWrite(write, startedAt);
865
+ return () => applyChanges(dbArg, writeArg.collection, changes);
866
+ };
867
+ /**
868
+ * @internal Captures a write to the collection whose effect is not known — a
869
+ * failed write may still have applied — so every read of it counts as changed.
870
+ */
871
+ export const captureSmartdataCollectionChange = (dbArg, collectionArg, deferredArg) => {
872
+ if (!deferredArg && !hasSmartdataReadSets(dbArg))
873
+ return undefined;
874
+ return () => applyChanges(dbArg, collectionArg, [{ kind: 'unknown', touched: 'all', startedAt: 0 }]);
875
+ };
876
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWFkdHJhY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvY2xhc3Nlcy5yZWFkdHJhY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV2RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdyRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCOzs7OztPQUtHO0lBQ0gsSUFBVyxPQUFPO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFFRCwyRkFBMkY7SUFDcEYsS0FBSztRQUNWLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxLQUFLO1lBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRjtBQTBDRCxnRUFBZ0U7QUFDaEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQW9EbEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQW1DLENBQUM7QUFDckUsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQW1DLENBQUM7QUFDcEUsdUZBQXVGO0FBQ3ZGLE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7QUFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxvQkFB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