@lossless.org/client 1.2.0 → 1.3.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.
@@ -18,13 +18,21 @@ export interface ISmartdataCollectionTopologyIndex {
18
18
  export interface ISmartdataExpectedCollectionTopology {
19
19
  readonly collectionName: string;
20
20
  readonly indexes: readonly ISmartdataCollectionTopologyIndex[];
21
+ /** Undeclared installed indexes the model accepts by name, never verifies. */
22
+ readonly toleratedIndexNames: readonly string[];
21
23
  }
22
24
  export interface ISmartdataCollectionTopologyInspection {
23
25
  readonly collectionName: string;
24
26
  readonly status: TSmartdataCollectionTopologyStatus;
25
27
  readonly reasonCodes: readonly TSmartdataCollectionTopologyReasonCode[];
26
28
  readonly expectedIndexes: readonly ISmartdataCollectionTopologyIndex[];
29
+ /** Installed indexes SmartData declares and verifies. */
27
30
  readonly actualIndexes: readonly ISmartdataCollectionTopologyIndex[];
31
+ /**
32
+ * Installed indexes the model tolerates by name. They are observed, never
33
+ * verified, created or dropped, and they never make the topology divergent.
34
+ */
35
+ readonly toleratedIndexes: readonly string[];
28
36
  }
29
37
  type TCollectionModelSchemaResolver = () => INormalizedCollectionModelSchema;
30
38
  export declare const collectionModelSchemaResolverSymbol: unique symbol;
@@ -141,6 +141,7 @@ export const getExpectedCollectionTopologyForSchema = (schema) => {
141
141
  return Object.freeze({
142
142
  collectionName: schema.collectionName,
143
143
  indexes,
144
+ toleratedIndexNames: Object.freeze([...schema.toleratedIndexNames].sort(compareSmartdataTopologyStrings)),
144
145
  });
145
146
  };
146
147
  /**
@@ -289,12 +290,13 @@ const normalizeActualIndex = (rawIndexArg) => {
289
290
  return { index: normalized, name, supported };
290
291
  };
291
292
  const buildReasonCodes = (reasonsArg) => Object.freeze(reasonCodeOrder.filter((reasonCodeArg) => reasonsArg.has(reasonCodeArg)));
292
- const createInspection = (expectedArg, statusArg, reasonsArg, actualIndexesArg) => Object.freeze({
293
+ const createInspection = (expectedArg, statusArg, reasonsArg, actualIndexesArg, toleratedIndexesArg = []) => Object.freeze({
293
294
  collectionName: expectedArg.collectionName,
294
295
  status: statusArg,
295
296
  reasonCodes: buildReasonCodes(reasonsArg),
296
297
  expectedIndexes: expectedArg.indexes,
297
298
  actualIndexes: sortIndexes(actualIndexesArg),
299
+ toleratedIndexes: Object.freeze([...toleratedIndexesArg].sort(compareSmartdataTopologyStrings)),
298
300
  });
299
301
  export const inspectCollectionTopologyForModel = async (constructorArg, dbArg) => {
300
302
  const expected = getExpectedCollectionTopologyForModel(constructorArg);
@@ -341,8 +343,17 @@ export const inspectCollectionTopologySnapshot = (expected, rawSnapshot) => {
341
343
  }
342
344
  const normalizedIndexes = [];
343
345
  const unsupportedNames = new Set();
346
+ const toleratedNames = new Set(expected.toleratedIndexNames);
347
+ const toleratedIndexes = [];
344
348
  for (const rawIndex of rawIndexes) {
345
349
  const normalized = normalizeActualIndex(rawIndex);
350
+ if (normalized.name && toleratedNames.has(normalized.name)) {
351
+ // A tolerated index belongs to whoever created it — a migration, an
352
+ // operator — so it is observed by name and nothing about its keys or
353
+ // options is asserted. SmartData neither creates nor drops it.
354
+ toleratedIndexes.push(normalized.name);
355
+ continue;
356
+ }
346
357
  if (!normalized.supported) {
347
358
  reasons.add('unsupported_actual_index');
348
359
  if (normalized.name) {
@@ -394,10 +405,10 @@ export const inspectCollectionTopologySnapshot = (expected, rawSnapshot) => {
394
405
  : [...reasons].every((reasonArg) => reasonArg === 'expected_index_missing')
395
406
  ? 'compatible'
396
407
  : 'divergent';
397
- return createInspection(expected, status, reasons, normalizedIndexes);
408
+ return createInspection(expected, status, reasons, normalizedIndexes, toleratedIndexes);
398
409
  }
399
410
  catch {
400
411
  throw new SmartdataPersistenceError('unsupported_operation', 'Collection topology inspection returned unreadable metadata.');
401
412
  }
402
413
  };
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2xsZWN0aW9udG9wb2xvZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2NsYXNzZXMuY29sbGVjdGlvbnRvcG9sb2d5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBaURyRSxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLENBQ3ZELHFEQUFxRCxDQUN0RCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUcsTUFBTSxDQUN4RCxzREFBc0QsQ0FDdkQsQ0FBQztBQWtCRixNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUNoQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDL0IsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbkQsTUFBTSxFQUFFLElBQUk7SUFDWixNQUFNLEVBQUUsS0FBSztJQUNiLGtCQUFrQixFQUFFLElBQUk7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxlQUFlLEdBQXNEO0lBQ3pFLDBCQUEwQjtJQUMxQiw0QkFBNEI7SUFDNUIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQix3QkFBd0I7SUFDeEIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZiwwQkFBMEI7Q0FDM0IsQ0FBQztBQUNGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdEMsR0FBRztJQUNILEtBQUs7SUFDTCxNQUFNO0lBQ04sSUFBSTtJQUNKLFlBQVk7SUFDWixRQUFRO0lBQ1IsUUFBUTtJQUNSLG9CQUFvQjtDQUNyQixDQUFDLENBQUM7QUFDSCxNQUFNLG1CQUFtQixHQUFHLElB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
414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2xsZWN0aW9udG9wb2xvZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2NsYXNzZXMuY29sbGVjdGlvbnRvcG9sb2d5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBeURyRSxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLENBQ3ZELHFEQUFxRCxDQUN0RCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUcsTUFBTSxDQUN4RCxzREFBc0QsQ0FDdkQsQ0FBQztBQWtCRixNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUNoQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDL0IsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbkQsTUFBTSxFQUFFLElBQUk7SUFDWixNQUFNLEVBQUUsS0FBSztJQUNiLGtCQUFrQixFQUFFLElBQUk7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxlQUFlLEdBQXNEO0lBQ3pFLDBCQUEwQjtJQUMxQiw0QkFBNEI7SUFDNUIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQix3QkFBd0I7SUFDeEIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZiwwQkFBMEI7Q0FDM0IsQ0FBQztBQUNGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdEMsR0FBRztJQUNILEtBQUs7SUFDTCxNQUFNO0lBQ04sSUFBSTtJQUNKLFlBQVk7SUFDWixRQUFRO0lBQ1IsUUFBUTtJQUNSLG9CQUFvQjtDQUNyQixDQUFDLENBQUM7QUFDSCxNQUFNLG1CQUFtQixHQUFHLElB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
@@ -6,10 +6,21 @@ import * as plugins from './plugins.js';
6
6
  export declare class SmartdataDbCursor<T = any> {
7
7
  mongodbCursor: plugins.mongodb.FindCursor<T>;
8
8
  private smartdataDbDoc;
9
- constructor(cursorArg: plugins.mongodb.FindCursor<T>, dbDocArg: typeof SmartDataDbDoc);
9
+ /**
10
+ * Releases an owned SmartData session lease the cursor holds for its whole
11
+ * lifetime. Supplied by the operation that created the cursor; inert for a
12
+ * raw driver session or no session at all.
13
+ */
14
+ private releaseSession;
15
+ constructor(cursorArg: plugins.mongodb.FindCursor<T>, dbDocArg: typeof SmartDataDbDoc, releaseSessionArg?: () => void);
10
16
  next(closeAtEnd?: boolean): Promise<T | null>;
11
17
  forEach(forEachFuncArg: (itemArg: T) => Promise<any>, closeCursorAtEnd?: boolean): Promise<void>;
12
18
  toArray(): Promise<T[]>;
19
+ /**
20
+ * Closes the driver cursor and releases an owned session lease even when the
21
+ * driver's own cleanup rejects, so a failed close can never strand the
22
+ * session and block every later operation on it.
23
+ */
13
24
  close(): Promise<void>;
14
25
  private closeAfterError;
15
26
  }
@@ -8,9 +8,16 @@ export class SmartdataDbCursor {
8
8
  // INSTANCE
9
9
  mongodbCursor;
10
10
  smartdataDbDoc;
11
- constructor(cursorArg, dbDocArg) {
11
+ /**
12
+ * Releases an owned SmartData session lease the cursor holds for its whole
13
+ * lifetime. Supplied by the operation that created the cursor; inert for a
14
+ * raw driver session or no session at all.
15
+ */
16
+ releaseSession;
17
+ constructor(cursorArg, dbDocArg, releaseSessionArg = () => { }) {
12
18
  this.mongodbCursor = cursorArg;
13
19
  this.smartdataDbDoc = dbDocArg;
20
+ this.releaseSession = releaseSessionArg;
14
21
  }
15
22
  async next(closeAtEnd = true) {
16
23
  let nextDocument;
@@ -66,8 +73,18 @@ export class SmartdataDbCursor {
66
73
  await this.close();
67
74
  return convertedResult;
68
75
  }
76
+ /**
77
+ * Closes the driver cursor and releases an owned session lease even when the
78
+ * driver's own cleanup rejects, so a failed close can never strand the
79
+ * session and block every later operation on it.
80
+ */
69
81
  async close() {
70
- await this.mongodbCursor.close();
82
+ try {
83
+ await this.mongodbCursor.close();
84
+ }
85
+ finally {
86
+ this.releaseSession();
87
+ }
71
88
  }
72
89
  async closeAfterError(errorArg) {
73
90
  try {
@@ -79,4 +96,4 @@ export class SmartdataDbCursor {
79
96
  throw errorArg;
80
97
  }
81
98
  }
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jdXJzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2NsYXNzZXMuY3Vyc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsU0FBUztJQUVULFdBQVc7SUFDSixhQUFhLENBQWdDO0lBQzVDLGNBQWMsQ0FBd0I7SUFDOUMsWUFBWSxTQUF3QyxFQUFFLFFBQStCO1FBQ25GLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJO1FBQ2pDLElBQUksWUFBc0IsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pELENBQUM7UUFBQyxPQUFPLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE9BQU8sTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQixJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsa0NBQWtDLENBQzNELFlBQVksQ0FDUixDQUFDO1FBQ1QsQ0FBQztRQUFDLE9BQU8sZUFBZSxFQUFFLENBQUM7WUFDekIsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQTRDLEVBQUUsZ0JBQWdCLEdBQUcsSUFBSTtRQUN4RixJQUFJLENBQUM7WUFDSCxJQUFJLFlBQWlCLENBQUM7WUFDdEIsR0FBRyxDQUFDO2dCQUNGLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQy9DLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2pCLE1BQU0saUJBQWlCLEdBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsa0NBQWtDLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3ZFLE1BQU0sY0FBYyxDQUFDLGlCQUF3QixDQUFDLENBQUM7Z0JBQ2pELENBQUM7WUFDSCxDQUFDLFFBQVEsWUFBWSxFQUFFO1FBQ3pCLENBQUM7UUFBQyxPQUFPLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxNQUFNLGNBQWMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU87UUFDbEIsSUFBSSxlQUFvQixDQUFDO1FBQ3pCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsRCxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsa0NBQWtDLENBQUMsT0FBTyxDQUFDLENBQ3pELENBQUM7UUFDWCxDQUFDO1FBQUMsT0FBTyxlQUFlLEVBQUUsQ0FBQztZQUN6QixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFpQjtRQUM3QyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsK0RBQStEO1FBQ2pFLENBQUM7UUFDRCxNQUFNLFFBQVEsQ0FBQztJQUNqQixDQUFDO0NBQ0YifQ==
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jdXJzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2NsYXNzZXMuY3Vyc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsU0FBUztJQUVULFdBQVc7SUFDSixhQUFhLENBQWdDO0lBQzVDLGNBQWMsQ0FBd0I7SUFDOUM7Ozs7T0FJRztJQUNLLGNBQWMsQ0FBYTtJQUNuQyxZQUNFLFNBQXdDLEVBQ3hDLFFBQStCLEVBQy9CLG9CQUFnQyxHQUFHLEVBQUUsR0FBRSxDQUFDO1FBRXhDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUM7SUFDMUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUk7UUFDakMsSUFBSSxZQUFzQixDQUFDO1FBQzNCLElBQUksQ0FBQztZQUNILFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakQsQ0FBQztRQUFDLE9BQU8sU0FBUyxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksWUFBWSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzFCLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQ0FBa0MsQ0FDM0QsWUFBWSxDQUNSLENBQUM7UUFDVCxDQUFDO1FBQUMsT0FBTyxlQUFlLEVBQUUsQ0FBQztZQUN6QixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBNEMsRUFBRSxnQkFBZ0IsR0FBRyxJQUFJO1FBQ3hGLElBQUksQ0FBQztZQUNILElBQUksWUFBaUIsQ0FBQztZQUN0QixHQUFHLENBQUM7Z0JBQ0YsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxpQkFBaUIsR0FDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQ0FBa0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDdkUsTUFBTSxjQUFjLENBQUMsaUJBQXdCLENBQUMsQ0FBQztnQkFDakQsQ0FBQztZQUNILENBQUMsUUFBUSxZQUFZLEVBQUU7UUFDekIsQ0FBQztRQUFDLE9BQU8sY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELE1BQU0sY0FBYyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTztRQUNsQixJQUFJLGVBQW9CLENBQUM7UUFDekIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xELGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDdkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLENBQUMsQ0FDekQsQ0FBQztRQUNYLENBQUM7UUFBQyxPQUFPLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQWlCO1FBQzdDLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwrREFBK0Q7UUFDakUsQ0FBQztRQUNELE1BQU0sUUFBUSxDQUFDO0lBQ2pCLENBQUM7Q0FDRiJ9
@@ -66,6 +66,20 @@ export interface SvDbOptions {
66
66
  * expression references.
67
67
  */
68
68
  numeric?: boolean;
69
+ /**
70
+ * Declares a persisted field that only atomic operations may overwrite.
71
+ *
72
+ * The field stays a declared persisted root — atomic filters, updates and
73
+ * `$expr` references, projections, sorts and hydration all accept it. Every
74
+ * operation that creates a document stores it, so a created document is
75
+ * complete: `insert()`, `insertMany()`, `insertManyIfAbsent()`, a `save()`
76
+ * on a new instance, and the upsert branch of a `save()` whose row is gone,
77
+ * which seeds it through `$setOnInsert`. A `save()` that matches a stored
78
+ * document never writes it, so a stale instance can never overwrite a
79
+ * counter, quota or lease that concurrent atomic writers own. Combine with
80
+ * `numeric` for `$expr` references.
81
+ */
82
+ atomicOnly?: boolean;
69
83
  }
70
84
  /**
71
85
  * saveable - saveable decorator to be used on class properties
@@ -94,10 +108,19 @@ export interface IIndexOptions {
94
108
  */
95
109
  export declare function index(options?: IIndexOptions): (value: undefined, context: ClassFieldDecoratorContext) => void;
96
110
  type ElementOf<T> = T extends ReadonlyArray<infer U> ? U : T;
97
- type InValues<T> = ReadonlyArray<ElementOf<T>>;
98
- export type MongoFilterCondition<T> = T | {
99
- $eq?: T;
100
- $ne?: T;
111
+ /**
112
+ * Explicit BSON null is a legitimate predicate for a field the model declares
113
+ * optional. MongoDB answers `{ field: null }` with the documents that store an
114
+ * explicit null *and* the documents where the field is absent, so it is the
115
+ * only predicate that addresses a value an earlier writer stored as null. The
116
+ * runtime filters have always accepted it; the declared type admits it wherever
117
+ * the field type contains `undefined`.
118
+ */
119
+ export type TSmartdataOptionalNullPredicate<TValue> = undefined extends TValue ? null : never;
120
+ type InValues<T> = ReadonlyArray<ElementOf<T> | TSmartdataOptionalNullPredicate<T>>;
121
+ export type MongoFilterCondition<T> = T | TSmartdataOptionalNullPredicate<T> | {
122
+ $eq?: T | TSmartdataOptionalNullPredicate<T>;
123
+ $ne?: T | TSmartdataOptionalNullPredicate<T>;
101
124
  $gt?: T;
102
125
  $gte?: T;
103
126
  $lt?: T;
@@ -141,7 +164,12 @@ export interface ISmartdataCursorOptions<T> {
141
164
  /** Model-declared index name, or MongoDB's built-in `_id_` index. */
142
165
  hint?: string;
143
166
  maxTimeMS?: number;
144
- session?: plugins.mongodb.ClientSession;
167
+ /**
168
+ * An owned session from `db.createSession()` stays leased until the cursor
169
+ * is closed, so the cursor and the session's next operation can never run in
170
+ * parallel. A raw `ClientSession` keeps its unmanaged pass-through behavior.
171
+ */
172
+ session?: TSmartdataOrdinarySession;
145
173
  /**
146
174
  * @deprecated Prefer the structured cursor options. The modifier runs last
147
175
  * for backward compatibility.
@@ -191,7 +219,16 @@ type TSmartdataAtomicMonotonic<T> = Partial<{
191
219
  [TKey in TSmartdataMonotonicDocumentPath<T>]: NonNullable<T[TKey]> extends Date ? Date : number;
192
220
  }> & Partial<Record<TSmartdataAtomicNestedDocumentPath<T>, number | Date>>;
193
221
  export type TSmartdataAtomicNumericFieldReference<T> = `$${TSmartdataNumericDocumentPath<T>}`;
194
- export type TSmartdataAtomicNumericExpressionOperand<T> = number | TSmartdataAtomicNumericFieldReference<T> | {
222
+ /**
223
+ * Reads a declared numeric field, substituting a finite literal when the field
224
+ * is absent or stored as null. A document written before the field existed
225
+ * therefore takes the declared default instead of failing the comparison, while
226
+ * a present non-numeric value still fails closed.
227
+ */
228
+ export interface ISmartdataAtomicNumericIfNull<T> {
229
+ $ifNull: readonly [TSmartdataAtomicNumericFieldReference<T>, number];
230
+ }
231
+ export type TSmartdataAtomicNumericExpressionOperand<T> = number | TSmartdataAtomicNumericFieldReference<T> | ISmartdataAtomicNumericIfNull<T> | {
195
232
  $add: readonly [
196
233
  TSmartdataAtomicNumericExpressionOperand<T>,
197
234
  TSmartdataAtomicNumericExpressionOperand<T>,
@@ -290,15 +327,15 @@ export interface ISmartdataAtomicUpdate<T> {
290
327
  }
291
328
  type TSmartdataAtomicDirectEquality<TValue> = TValue extends ReadonlyArray<infer TEntry> ? ReadonlyArray<TSmartdataAtomicDirectEquality<TEntry>> : TValue extends object ? TValue extends Date | ArrayBufferView | plugins.mongodb.ObjectId | plugins.mongodb.Binary | plugins.mongodb.Decimal128 | plugins.mongodb.Long | plugins.mongodb.Int32 | plugins.mongodb.Double | plugins.mongodb.Timestamp | plugins.mongodb.MinKey | plugins.mongodb.MaxKey ? TValue : never : Exclude<TValue, undefined>;
292
329
  type TSmartdataAtomicInValue<TValue> = TValue extends ReadonlyArray<infer TEntry> ? TSmartdataAtomicDirectEquality<TEntry> : TSmartdataAtomicDirectEquality<TValue>;
293
- export type TSmartdataAtomicFilterCondition<TValue> = TSmartdataAtomicDirectEquality<TValue> | {
294
- $eq?: TValue;
295
- $ne?: TSmartdataAtomicDirectEquality<TValue>;
330
+ export type TSmartdataAtomicFilterCondition<TValue> = TSmartdataAtomicDirectEquality<TValue> | TSmartdataOptionalNullPredicate<TValue> | {
331
+ $eq?: TValue | TSmartdataOptionalNullPredicate<TValue>;
332
+ $ne?: TSmartdataAtomicDirectEquality<TValue> | TSmartdataOptionalNullPredicate<TValue>;
296
333
  $gt?: TSmartdataAtomicDirectEquality<TValue>;
297
334
  $gte?: TSmartdataAtomicDirectEquality<TValue>;
298
335
  $lt?: TSmartdataAtomicDirectEquality<TValue>;
299
336
  $lte?: TSmartdataAtomicDirectEquality<TValue>;
300
- $in?: ReadonlyArray<TSmartdataAtomicInValue<TValue>>;
301
- $nin?: ReadonlyArray<TSmartdataAtomicInValue<TValue>>;
337
+ $in?: ReadonlyArray<TSmartdataAtomicInValue<TValue> | TSmartdataOptionalNullPredicate<TValue>>;
338
+ $nin?: ReadonlyArray<TSmartdataAtomicInValue<TValue> | TSmartdataOptionalNullPredicate<TValue>>;
302
339
  $exists?: boolean;
303
340
  $type?: plugins.mongodb.BSONType | plugins.mongodb.BSONTypeAlias;
304
341
  $regex?: string | RegExp;
@@ -355,6 +392,14 @@ export type TSmartdataAtomicFindOneAndUpdateResult<T, TReturnDocument extends TS
355
392
  status: 'not_matched';
356
393
  document: null;
357
394
  };
395
+ export interface ISmartdataAtomicFindOneAndReplaceOptions {
396
+ /**
397
+ * Which image to return: the stored replacement (`'after'`, the default) or
398
+ * the document it ousted (`'before'`).
399
+ */
400
+ returnDocument?: TSmartdataAtomicReturnDocument;
401
+ session?: TSmartdataOrdinarySession;
402
+ }
358
403
  export interface ISmartdataAtomicDeleteOptions {
359
404
  session?: TSmartdataOrdinarySession;
360
405
  /** Client-side operation deadline, including server selection and pool waits. */
@@ -404,6 +449,25 @@ export interface ISmartdataAtomicUpsertManyResult {
404
449
  modifiedCount: number;
405
450
  upsertedCount: number;
406
451
  }
452
+ /**
453
+ * How a fenced save treats a declared persisted field the instance holds as
454
+ * `undefined`. `'ignore'` leaves whatever the document stores for it, which is
455
+ * what an instance that never loaded the field needs; `'unset'` removes it from
456
+ * the stored document, which is what an instance that deliberately cleared the
457
+ * field needs.
458
+ */
459
+ export type TSmartdataAbsentDeclaredFields = 'ignore' | 'unset';
460
+ export interface ISmartdataSaveIfOptions {
461
+ session?: TSmartdataOrdinarySession;
462
+ /** Defaults to `'ignore'`. */
463
+ absentDeclaredFields?: TSmartdataAbsentDeclaredFields;
464
+ }
465
+ export interface ISmartdataSaveIfResult {
466
+ acknowledged: boolean;
467
+ /** `0` means the fence did not match, so nothing was written. */
468
+ matchedCount: number;
469
+ modifiedCount: number;
470
+ }
407
471
  export declare const convertFilterForMongoDb: (filterArg: {
408
472
  [key: string]: any;
409
473
  }) => {
@@ -519,6 +583,40 @@ export declare class SmartDataDbDoc<T extends TImplements, TImplements, TManager
519
583
  * before or after image with a sanitized persistence outcome.
520
584
  */
521
585
  static atomicFindOneAndUpdate<T, TReturnDocument extends TSmartdataAtomicReturnDocument>(this: plugins.tsclass.typeFest.Class<T>, filterArg: TSmartdataAtomicFilter<T>, updateArg: ISmartdataAtomicUpdate<T>, optionsArg: ISmartdataAtomicFindOneAndUpdateOptions<TReturnDocument, T>): Promise<TSmartdataAtomicFindOneAndUpdateResult<T, TReturnDocument>>;
586
+ /**
587
+ * Atomically replaces one ordinary model document with a new one, including
588
+ * its declared identity.
589
+ *
590
+ * This is the one operation that moves an `@unI()` identity: the matched
591
+ * document ceases to exist and the replacement takes its `_id` slot in a
592
+ * single compare-and-swap, which is what a model whose identity is the
593
+ * additional-authenticated-data of an encrypted field needs when it rotates.
594
+ * Every other write keeps identities immutable.
595
+ *
596
+ * `replacementArg` is a newly constructed instance that was never stored.
597
+ * Its `createSavableObject()` body is written whole, so a field the matched
598
+ * document carried and the replacement does not is gone afterwards — replace
599
+ * semantics, not `$set` — and atomic-only fields are seeded from the
600
+ * instance exactly as `insert()` seeds them. The body never carries an
601
+ * `_id`: keeping the matched document's primary key is the point of the
602
+ * operation, so a model whose declared identity *is* the `_id`
603
+ * (`identityAsDocumentId`) cannot rotate and is refused before any write.
604
+ *
605
+ * The filter follows the singular rule of `atomicUpdate()` and
606
+ * `atomicFindOneAndUpdate()`: declared paths and at least one top-level
607
+ * equality anchor. It does not have to pin a unique index — the caller
608
+ * usually searches by the owning field precisely because it does not know
609
+ * which identity is stored — so a filter matching several documents replaces
610
+ * one of them, as with every singular atomic operation.
611
+ *
612
+ * Like `insert()` and the other static atomic operations, this one runs no
613
+ * instance hooks; `beforeSave()`-style normalization belongs before the
614
+ * call. On a match the replacement becomes a stored instance, exactly as
615
+ * `insert()` marks it, and the returned instance is hydrated from the image
616
+ * named by `returnDocument`. Without a match nothing is written, `null` is
617
+ * returned, and the replacement stays untouched.
618
+ */
619
+ static atomicFindOneAndReplace<T>(this: plugins.tsclass.typeFest.Class<T>, filterArg: TSmartdataAtomicFilter<T>, replacementArg: T, opts?: ISmartdataAtomicFindOneAndReplaceOptions): Promise<T | null>;
522
620
  /**
523
621
  * Atomically deletes one ordinary model document using a strict selector.
524
622
  *
@@ -757,6 +855,27 @@ export declare class SmartDataDbDoc<T extends TImplements, TImplements, TManager
757
855
  save(opts?: {
758
856
  session?: plugins.mongodb.ClientSession;
759
857
  }): Promise<any>;
858
+ /**
859
+ * Saves this instance only while the stored document still matches `fence`.
860
+ *
861
+ * The write is one `updateOne` that never upserts: the instance's identity
862
+ * addresses the document, the fence adds the condition the caller depends on
863
+ * — a status, a revision, a lease owner — and the update applies only if the
864
+ * server still sees that condition. `matchedCount === 0` means another writer
865
+ * moved the document first; nothing was written and this instance is exactly
866
+ * as it was before the call, so the caller can reload and decide.
867
+ *
868
+ * The stored document receives the same fields an ordinary `save()` writes,
869
+ * minus the ones no `save()` may write: declared identities are immutable and
870
+ * already pinned by the filter, and atomic-only fields belong to concurrent
871
+ * atomic writers — a fenced save never creates a document, so it has nothing
872
+ * to seed either. Declared fields this instance holds as `undefined` follow
873
+ * `absentDeclaredFields`.
874
+ *
875
+ * `beforeSave()` runs before the write, as with `save()`; `afterSave()` runs
876
+ * only when the fence matched, because a fence that missed saved nothing.
877
+ */
878
+ saveIf(fenceArg: TSmartdataAtomicFilter<T>, optsArg?: ISmartdataSaveIfOptions): Promise<ISmartdataSaveIfResult>;
760
879
  /**
761
880
  * deletes a document from the database (optionally within a transaction)
762
881
  */