@lossless.org/client 1.1.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.
Files changed (34) hide show
  1. package/.smartconfig.json +1 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/nosqldb/classes.atomicdelete.js +3 -3
  4. package/dist_ts/nosqldb/classes.atomicfindoneandupdate.d.ts +20 -0
  5. package/dist_ts/nosqldb/classes.atomicfindoneandupdate.js +45 -2
  6. package/dist_ts/nosqldb/classes.atomicupdate.js +4 -4
  7. package/dist_ts/nosqldb/classes.collection.d.ts +37 -1
  8. package/dist_ts/nosqldb/classes.collection.js +235 -30
  9. package/dist_ts/nosqldb/classes.collectiontopology.d.ts +19 -0
  10. package/dist_ts/nosqldb/classes.collectiontopology.js +29 -3
  11. package/dist_ts/nosqldb/classes.cursor.d.ts +12 -1
  12. package/dist_ts/nosqldb/classes.cursor.js +20 -3
  13. package/dist_ts/nosqldb/classes.doc.d.ts +138 -11
  14. package/dist_ts/nosqldb/classes.doc.js +490 -91
  15. package/dist_ts/nosqldb/classes.exactpersistence.js +10 -2
  16. package/dist_ts/nosqldb/classes.namespaceinspection.js +2 -2
  17. package/dist_ts/nosqldb/classes.persistence.d.ts +6 -0
  18. package/dist_ts/nosqldb/classes.persistence.js +13 -1
  19. package/dist_ts/nosqldb/classes.session.d.ts +15 -1
  20. package/dist_ts/nosqldb/classes.session.js +32 -6
  21. package/package.json +4 -1
  22. package/readme.md +38 -2
  23. package/ts/00_commitinfo_data.ts +1 -1
  24. package/ts/nosqldb/classes.atomicdelete.ts +2 -4
  25. package/ts/nosqldb/classes.atomicfindoneandupdate.ts +69 -2
  26. package/ts/nosqldb/classes.atomicupdate.ts +3 -6
  27. package/ts/nosqldb/classes.collection.ts +372 -35
  28. package/ts/nosqldb/classes.collectiontopology.ts +56 -1
  29. package/ts/nosqldb/classes.cursor.ts +22 -2
  30. package/ts/nosqldb/classes.doc.ts +819 -132
  31. package/ts/nosqldb/classes.exactpersistence.ts +9 -1
  32. package/ts/nosqldb/classes.namespaceinspection.ts +1 -1
  33. package/ts/nosqldb/classes.persistence.ts +17 -0
  34. package/ts/nosqldb/classes.session.ts +52 -13
@@ -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;
@@ -41,6 +49,17 @@ export declare const compareSmartdataTopologyStrings: (leftArg: string, rightArg
41
49
  export declare const getExpectedCollectionTopologyForModel: (constructorArg: ICollectionTopologyModelConstructor) => ISmartdataExpectedCollectionTopology;
42
50
  /** @internal Normalizes the same contract for a bound collection. */
43
51
  export declare const getExpectedCollectionTopologyForSchema: (schema: INormalizedCollectionModelSchema) => ISmartdataExpectedCollectionTopology;
52
+ /**
53
+ * @internal A single-field ascending unique index is what makes a declared
54
+ * identity globally constraining, whatever the index is called.
55
+ */
56
+ export declare const isIdentityIndexFor: (indexArg: INormalizedCollectionModelSchema["indexes"][number], fieldArg: string) => boolean;
57
+ /**
58
+ * @internal Name of the unique index that backs an identity field in a bound
59
+ * schema. Index-creation fallbacks resolve it here so that a model naming its
60
+ * own backing index never gets a second unique index over the same key.
61
+ */
62
+ export declare const getIdentityIndexName: (schemaArg: INormalizedCollectionModelSchema | undefined, fieldArg: string) => string | undefined;
44
63
  export declare const inspectCollectionTopologyForModel: (constructorArg: ICollectionTopologyModelConstructor, dbArg: SmartdataDb) => Promise<ISmartdataCollectionTopologyInspection>;
45
64
  /** @internal Pure normalization shared by model and namespace inspection. */
46
65
  export declare const inspectCollectionTopologySnapshot: (expected: ISmartdataExpectedCollectionTopology, rawSnapshot: ICollectionTopologyRawSnapshot) => ISmartdataCollectionTopologyInspection;
@@ -141,8 +141,24 @@ 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
  };
147
+ /**
148
+ * @internal A single-field ascending unique index is what makes a declared
149
+ * identity globally constraining, whatever the index is called.
150
+ */
151
+ export const isIdentityIndexFor = (indexArg, fieldArg) => indexArg.options.unique === true &&
152
+ indexArg.key.length === 1 &&
153
+ indexArg.key[0][0] === fieldArg &&
154
+ indexArg.key[0][1] === 1;
155
+ /**
156
+ * @internal Name of the unique index that backs an identity field in a bound
157
+ * schema. Index-creation fallbacks resolve it here so that a model naming its
158
+ * own backing index never gets a second unique index over the same key.
159
+ */
160
+ export const getIdentityIndexName = (schemaArg, fieldArg) => schemaArg?.indexes.find((indexArg) => isIdentityIndexFor(indexArg, fieldArg))
161
+ ?.name;
146
162
  const normalizeActualIndex = (rawIndexArg) => {
147
163
  if (typeof rawIndexArg !== 'object' ||
148
164
  rawIndexArg === null ||
@@ -274,12 +290,13 @@ const normalizeActualIndex = (rawIndexArg) => {
274
290
  return { index: normalized, name, supported };
275
291
  };
276
292
  const buildReasonCodes = (reasonsArg) => Object.freeze(reasonCodeOrder.filter((reasonCodeArg) => reasonsArg.has(reasonCodeArg)));
277
- const createInspection = (expectedArg, statusArg, reasonsArg, actualIndexesArg) => Object.freeze({
293
+ const createInspection = (expectedArg, statusArg, reasonsArg, actualIndexesArg, toleratedIndexesArg = []) => Object.freeze({
278
294
  collectionName: expectedArg.collectionName,
279
295
  status: statusArg,
280
296
  reasonCodes: buildReasonCodes(reasonsArg),
281
297
  expectedIndexes: expectedArg.indexes,
282
298
  actualIndexes: sortIndexes(actualIndexesArg),
299
+ toleratedIndexes: Object.freeze([...toleratedIndexesArg].sort(compareSmartdataTopologyStrings)),
283
300
  });
284
301
  export const inspectCollectionTopologyForModel = async (constructorArg, dbArg) => {
285
302
  const expected = getExpectedCollectionTopologyForModel(constructorArg);
@@ -326,8 +343,17 @@ export const inspectCollectionTopologySnapshot = (expected, rawSnapshot) => {
326
343
  }
327
344
  const normalizedIndexes = [];
328
345
  const unsupportedNames = new Set();
346
+ const toleratedNames = new Set(expected.toleratedIndexNames);
347
+ const toleratedIndexes = [];
329
348
  for (const rawIndex of rawIndexes) {
330
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
+ }
331
357
  if (!normalized.supported) {
332
358
  reasons.add('unsupported_actual_index');
333
359
  if (normalized.name) {
@@ -379,10 +405,10 @@ export const inspectCollectionTopologySnapshot = (expected, rawSnapshot) => {
379
405
  : [...reasons].every((reasonArg) => reasonArg === 'expected_index_missing')
380
406
  ? 'compatible'
381
407
  : 'divergent';
382
- return createInspection(expected, status, reasons, normalizedIndexes);
408
+ return createInspection(expected, status, reasons, normalizedIndexes, toleratedIndexes);
383
409
  }
384
410
  catch {
385
411
  throw new SmartdataPersistenceError('unsupported_operation', 'Collection topology inspection returned unreadable metadata.');
386
412
  }
387
413
  };
388
- //# 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
@@ -38,6 +38,14 @@ export interface IUnIOptions {
38
38
  * non-empty string. Numeric identities require an explicit opt-in.
39
39
  */
40
40
  valueType?: TSmartdataIdentityValueType;
41
+ /**
42
+ * Name of the single-field ascending unique index that backs this identity.
43
+ * Defaults to `<field>_1`. A collection whose unique index was created by a
44
+ * migration under another name declares that name here: MongoDB refuses a
45
+ * second index over the same key, so without it the identity could not be
46
+ * declared at all.
47
+ */
48
+ indexName?: string;
41
49
  }
42
50
  export declare function globalSvDb(): (value: undefined, context: ClassFieldDecoratorContext) => void;
43
51
  /**
@@ -58,6 +66,20 @@ export interface SvDbOptions {
58
66
  * expression references.
59
67
  */
60
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;
61
83
  }
62
84
  /**
63
85
  * saveable - saveable decorator to be used on class properties
@@ -86,10 +108,19 @@ export interface IIndexOptions {
86
108
  */
87
109
  export declare function index(options?: IIndexOptions): (value: undefined, context: ClassFieldDecoratorContext) => void;
88
110
  type ElementOf<T> = T extends ReadonlyArray<infer U> ? U : T;
89
- type InValues<T> = ReadonlyArray<ElementOf<T>>;
90
- export type MongoFilterCondition<T> = T | {
91
- $eq?: T;
92
- $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>;
93
124
  $gt?: T;
94
125
  $gte?: T;
95
126
  $lt?: T;
@@ -133,7 +164,12 @@ export interface ISmartdataCursorOptions<T> {
133
164
  /** Model-declared index name, or MongoDB's built-in `_id_` index. */
134
165
  hint?: string;
135
166
  maxTimeMS?: number;
136
- 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;
137
173
  /**
138
174
  * @deprecated Prefer the structured cursor options. The modifier runs last
139
175
  * for backward compatibility.
@@ -183,7 +219,16 @@ type TSmartdataAtomicMonotonic<T> = Partial<{
183
219
  [TKey in TSmartdataMonotonicDocumentPath<T>]: NonNullable<T[TKey]> extends Date ? Date : number;
184
220
  }> & Partial<Record<TSmartdataAtomicNestedDocumentPath<T>, number | Date>>;
185
221
  export type TSmartdataAtomicNumericFieldReference<T> = `$${TSmartdataNumericDocumentPath<T>}`;
186
- 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> | {
187
232
  $add: readonly [
188
233
  TSmartdataAtomicNumericExpressionOperand<T>,
189
234
  TSmartdataAtomicNumericExpressionOperand<T>,
@@ -282,15 +327,15 @@ export interface ISmartdataAtomicUpdate<T> {
282
327
  }
283
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>;
284
329
  type TSmartdataAtomicInValue<TValue> = TValue extends ReadonlyArray<infer TEntry> ? TSmartdataAtomicDirectEquality<TEntry> : TSmartdataAtomicDirectEquality<TValue>;
285
- export type TSmartdataAtomicFilterCondition<TValue> = TSmartdataAtomicDirectEquality<TValue> | {
286
- $eq?: TValue;
287
- $ne?: TSmartdataAtomicDirectEquality<TValue>;
330
+ export type TSmartdataAtomicFilterCondition<TValue> = TSmartdataAtomicDirectEquality<TValue> | TSmartdataOptionalNullPredicate<TValue> | {
331
+ $eq?: TValue | TSmartdataOptionalNullPredicate<TValue>;
332
+ $ne?: TSmartdataAtomicDirectEquality<TValue> | TSmartdataOptionalNullPredicate<TValue>;
288
333
  $gt?: TSmartdataAtomicDirectEquality<TValue>;
289
334
  $gte?: TSmartdataAtomicDirectEquality<TValue>;
290
335
  $lt?: TSmartdataAtomicDirectEquality<TValue>;
291
336
  $lte?: TSmartdataAtomicDirectEquality<TValue>;
292
- $in?: ReadonlyArray<TSmartdataAtomicInValue<TValue>>;
293
- $nin?: ReadonlyArray<TSmartdataAtomicInValue<TValue>>;
337
+ $in?: ReadonlyArray<TSmartdataAtomicInValue<TValue> | TSmartdataOptionalNullPredicate<TValue>>;
338
+ $nin?: ReadonlyArray<TSmartdataAtomicInValue<TValue> | TSmartdataOptionalNullPredicate<TValue>>;
294
339
  $exists?: boolean;
295
340
  $type?: plugins.mongodb.BSONType | plugins.mongodb.BSONTypeAlias;
296
341
  $regex?: string | RegExp;
@@ -347,6 +392,14 @@ export type TSmartdataAtomicFindOneAndUpdateResult<T, TReturnDocument extends TS
347
392
  status: 'not_matched';
348
393
  document: null;
349
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
+ }
350
403
  export interface ISmartdataAtomicDeleteOptions {
351
404
  session?: TSmartdataOrdinarySession;
352
405
  /** Client-side operation deadline, including server selection and pool waits. */
@@ -396,6 +449,25 @@ export interface ISmartdataAtomicUpsertManyResult {
396
449
  modifiedCount: number;
397
450
  upsertedCount: number;
398
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
+ }
399
471
  export declare const convertFilterForMongoDb: (filterArg: {
400
472
  [key: string]: any;
401
473
  }) => {
@@ -511,6 +583,40 @@ export declare class SmartDataDbDoc<T extends TImplements, TImplements, TManager
511
583
  * before or after image with a sanitized persistence outcome.
512
584
  */
513
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>;
514
620
  /**
515
621
  * Atomically deletes one ordinary model document using a strict selector.
516
622
  *
@@ -749,6 +855,27 @@ export declare class SmartDataDbDoc<T extends TImplements, TImplements, TManager
749
855
  save(opts?: {
750
856
  session?: plugins.mongodb.ClientSession;
751
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>;
752
879
  /**
753
880
  * deletes a document from the database (optionally within a transaction)
754
881
  */