@modelprofile.com/flexharness 11.3.1 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.flexharness.core.d.ts +4 -0
  3. package/dist_ts/classes.flexharness.core.js +69 -25
  4. package/dist_ts/classes.flexharness.imports.js +4 -3
  5. package/dist_ts/classes.flexharness.reversions.d.ts +7 -1
  6. package/dist_ts/classes.flexharness.reversions.js +43 -29
  7. package/dist_ts/classes.flexharness.sessions.js +2 -6
  8. package/dist_ts/classes.stores.js +20 -18
  9. package/dist_ts/index.d.ts +1 -0
  10. package/dist_ts/index.js +2 -1
  11. package/dist_ts/interfaces.d.ts +24 -2
  12. package/dist_ts/interfaces.flexharness.d.ts +8 -1
  13. package/dist_ts/interfaces.js +1 -1
  14. package/dist_ts/plugins.d.ts +3 -3
  15. package/dist_ts/plugins.js +3 -3
  16. package/dist_ts/utils.projectionchange.d.ts +34 -0
  17. package/dist_ts/utils.projectionchange.js +135 -0
  18. package/dist_ts/utils.storecodecs.d.ts +10 -3
  19. package/dist_ts/utils.storecodecs.js +29 -4
  20. package/dist_ts/utils.storerules.d.ts +1 -1
  21. package/dist_ts/utils.storerules.js +1 -1
  22. package/dist_ts_migration/v3_legacyflexharness.js +6 -5
  23. package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +5 -4
  24. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +44 -25
  25. package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +152 -20
  26. package/dist_ts_stores_nosqldb/classes.recordstore.js +369 -66
  27. package/dist_ts_stores_nosqldb/index.d.ts +1 -1
  28. package/dist_ts_stores_nosqldb/index.js +2 -2
  29. package/dist_ts_stores_nosqldb/plugins.d.ts +1 -1
  30. package/dist_ts_stores_nosqldb/plugins.js +1 -1
  31. package/dist_ts_stores_testing/contract.d.ts +33 -0
  32. package/dist_ts_stores_testing/contract.js +566 -0
  33. package/dist_ts_stores_testing/fixtures.d.ts +20 -0
  34. package/dist_ts_stores_testing/fixtures.js +112 -0
  35. package/dist_ts_stores_testing/index.d.ts +2 -0
  36. package/dist_ts_stores_testing/index.js +3 -0
  37. package/dist_ts_stores_testing/plugins.d.ts +5 -0
  38. package/dist_ts_stores_testing/plugins.js +7 -0
  39. package/dist_ts_typedrequest/catalog.d.ts +4 -4
  40. package/dist_ts_typedrequest/catalog.js +25 -7
  41. package/dist_ts_typedrequest/describe.js +23 -11
  42. package/dist_ts_typedrequest/interfaces.d.ts +17 -1
  43. package/package.json +9 -3
  44. package/readme.md +6 -3
  45. package/ts/00_commitinfo_data.ts +1 -1
  46. package/ts/classes.flexharness.core.ts +74 -24
  47. package/ts/classes.flexharness.imports.ts +3 -2
  48. package/ts/classes.flexharness.reversions.ts +53 -28
  49. package/ts/classes.flexharness.sessions.ts +2 -5
  50. package/ts/classes.stores.ts +40 -37
  51. package/ts/index.ts +5 -0
  52. package/ts/interfaces.flexharness.ts +8 -1
  53. package/ts/interfaces.ts +27 -2
  54. package/ts/plugins.ts +12 -7
  55. package/ts/readme.md +6 -3
  56. package/ts/utils.projectionchange.ts +190 -0
  57. package/ts/utils.storecodecs.ts +42 -7
  58. package/ts/utils.storerules.ts +2 -2
  59. package/ts_migration/v3_legacyflexharness.ts +11 -6
  60. package/ts_stores_nosqldb/classes.nosqldbstores.ts +59 -46
  61. package/ts_stores_nosqldb/classes.recordstore.ts +445 -64
  62. package/ts_stores_nosqldb/index.ts +1 -0
  63. package/ts_stores_nosqldb/plugins.ts +4 -3
  64. package/ts_stores_nosqldb/readme.md +6 -2
  65. package/ts_stores_testing/contract.ts +776 -0
  66. package/ts_stores_testing/fixtures.ts +127 -0
  67. package/ts_stores_testing/index.ts +17 -0
  68. package/ts_stores_testing/plugins.ts +20 -0
  69. package/ts_stores_testing/readme.md +62 -0
  70. package/ts_typedrequest/catalog.ts +24 -6
  71. package/ts_typedrequest/describe.ts +19 -10
  72. package/ts_typedrequest/interfaces.ts +21 -1
  73. package/ts_typedrequest/readme.md +5 -3
@@ -2,9 +2,10 @@ import * as plugins from './plugins.js';
2
2
  import { FlexHarnessStoreConflictError, FlexHarnessValidationError } from '../dist_ts/errors.js';
3
3
  import { assertFlexPermissionSnapshot, assertFlexProjectionSnapshot, assertFlexScopeSnapshot, assertJsonSerializable, } from '../dist_ts/utils.json.js';
4
4
  import { assertFlexProjectManagementRecord, assertFlexProjectManagementSnapshot, assertFlexProjectManagementTombstone, } from '../dist_ts/utils.projectmanagement.js';
5
- import { assertFlexToolJobSnapshot, createAgentEventSnapshot, createToolJobSnapshot, normalizeJsonObjectUndefined, validateAgentEventArchive, validateAgentEventSnapshot, } from '../dist_ts/utils.storecodecs.js';
5
+ import { applyFlexProjectionChange, assertFlexProjectionChange, validateProjectionChangeSave, } from '../dist_ts/utils.projectionchange.js';
6
+ import { assertFlexToolJobSnapshot, createChangedAgentEventSnapshot, createToolJobSnapshot, normalizeAgentEventChange, normalizeJsonObjectUndefined, validateAgentEventArchive, validateAgentEventSnapshot, } from '../dist_ts/utils.storecodecs.js';
6
7
  import { assertProjectManagementSaveAdmitted, assertSameArchiveEvents, isProjectManagementTombstoneAdmitted, providerKey, validateExpectedRevision, validateIdentifier, validateProjectManagementWriteContext, validateResultIndex, validateSnapshotSave, } from '../dist_ts/utils.storerules.js';
7
- import { FlexRecordStore } from './classes.recordstore.js';
8
+ import { FlexRecordStore, } from './classes.recordstore.js';
8
9
  /** Replaces a record with a snapshot while the record's revision is the expected one. */
9
10
  function revisionReplacement(snapshot, expectedRevision, conflict, abortSignal) {
10
11
  return {
@@ -49,26 +50,37 @@ class NoSqlScopeStore {
49
50
  await this.records.replace({ domain: 'scope', storageKey }, revisionReplacement(validated, expectedRevision, conflict));
50
51
  }
51
52
  }
53
+ /** A projection is a log record: a save writes its change, checked in form. */
52
54
  class NoSqlProjectionStore {
53
55
  records;
54
56
  constructor(records) {
55
57
  this.records = records;
56
58
  }
57
- validator(sessionId) {
58
- return (value) => {
59
- assertFlexProjectionSnapshot(value, sessionId);
60
- return value;
59
+ log(sessionId) {
60
+ return {
61
+ validate: (value) => {
62
+ assertFlexProjectionSnapshot(value, sessionId);
63
+ return value;
64
+ },
65
+ validateChange: (value) => {
66
+ assertFlexProjectionChange(value);
67
+ return value;
68
+ },
69
+ apply: applyFlexProjectionChange,
61
70
  };
62
71
  }
63
72
  load(storageKey, sessionId) {
64
73
  providerKey(storageKey, sessionId);
65
- return this.records.read({ domain: 'projection', storageKey, sessionId }, this.validator(sessionId));
74
+ return this.records.readLog({ domain: 'projection', storageKey, sessionId }, this.log(sessionId));
66
75
  }
67
- async save(storageKey, sessionId, snapshot, expectedRevision) {
76
+ async save(storageKey, sessionId, change, expectedRevision) {
68
77
  const key = providerKey(storageKey, sessionId);
69
- const validated = validateSnapshotSave(snapshot, expectedRevision, (value) => assertFlexProjectionSnapshot(value, sessionId));
70
- const conflict = (actualRevision) => new FlexHarnessStoreConflictError(key, expectedRevision, actualRevision);
71
- await this.records.replace({ domain: 'projection', storageKey, sessionId }, revisionReplacement(validated, expectedRevision, conflict));
78
+ const validated = validateProjectionChangeSave(change, expectedRevision);
79
+ await this.records.append({ domain: 'projection', storageKey, sessionId }, this.log(sessionId), {
80
+ expectedRevision,
81
+ value: validated,
82
+ conflict: (actualRevision) => new FlexHarnessStoreConflictError(key, expectedRevision, actualRevision),
83
+ });
72
84
  }
73
85
  deleteSession(storageKey, sessionId) {
74
86
  providerKey(storageKey, sessionId);
@@ -133,11 +145,11 @@ class NoSqlProjectManagementStore {
133
145
  return this.records.purgeNamespace(storageKey, 'projectManagement');
134
146
  }
135
147
  }
148
+ /** A session's event log is a log record: a save writes its change, checked in form. */
136
149
  class NoSqlAgentEventStore {
137
150
  records;
138
151
  storageKey;
139
152
  sessionId;
140
- eventSchemaVersion = 2;
141
153
  constructor(records, storageKey, sessionId) {
142
154
  this.records = records;
143
155
  this.storageKey = storageKey;
@@ -148,19 +160,25 @@ class NoSqlAgentEventStore {
148
160
  throw new FlexHarnessValidationError(`Agent event store is bound to session "${this.sessionId}", not "${sessionId}".`);
149
161
  }
150
162
  }
151
- validateSnapshot = (value) => validateAgentEventSnapshot(value, this.sessionId);
163
+ log = {
164
+ validate: (value) => validateAgentEventSnapshot(value, this.sessionId),
165
+ validateChange: normalizeAgentEventChange,
166
+ apply: (current, change) => createChangedAgentEventSnapshot(this.sessionId, current, change),
167
+ };
152
168
  load(sessionId) {
153
169
  this.assertSession(sessionId);
154
- return this.records.read({ domain: 'agentEvents', storageKey: this.storageKey, sessionId }, this.validateSnapshot);
170
+ return this.records.readLog({ domain: 'agentEvents', storageKey: this.storageKey, sessionId }, this.log);
155
171
  }
156
- async save(sessionId, events, expectedRevision) {
172
+ async save(sessionId, change, expectedRevision) {
157
173
  this.assertSession(sessionId);
158
174
  validateExpectedRevision(expectedRevision);
159
- const snapshot = createAgentEventSnapshot(sessionId, events, expectedRevision + 1);
160
- validateAgentEventSnapshot(snapshot, sessionId);
161
- const conflict = (actualRevision) => new plugins.AgentEventStoreConflictError(sessionId, expectedRevision, actualRevision);
162
- await this.records.replace({ domain: 'agentEvents', storageKey: this.storageKey, sessionId }, revisionReplacement(snapshot, expectedRevision, conflict));
163
- return snapshot.revision;
175
+ const normalized = normalizeAgentEventChange(change);
176
+ await this.records.append({ domain: 'agentEvents', storageKey: this.storageKey, sessionId }, this.log, {
177
+ expectedRevision,
178
+ value: normalized,
179
+ conflict: (actualRevision) => new plugins.AgentEventStoreConflictError(sessionId, expectedRevision, actualRevision),
180
+ });
181
+ return expectedRevision + 1;
164
182
  }
165
183
  async archive(archive) {
166
184
  this.assertSession(archive.sessionId);
@@ -320,8 +338,9 @@ function validateResult(value) {
320
338
  /**
321
339
  * Every FlexHarness persistence domain on `@lossless.org/client/nosqldb`, with compare-and-swap
322
340
  * that holds across processes. Records live in `flexharness_records`; payloads longer than one
323
- * chunk live in `flexharness_chunks`; `flexharness_namespaces` holds each storage namespace's
324
- * fence.
341
+ * chunk live in `flexharness_chunks`; the changes saved to a projection or an Agent event log
342
+ * since its last compaction live in its head and, beyond the head's inline room, in pages in
343
+ * `flexharness_changes`; `flexharness_namespaces` holds each storage namespace's fence.
325
344
  */
326
345
  export class NoSqlFlexHarnessStores {
327
346
  scopes;
@@ -346,14 +365,14 @@ export class NoSqlFlexHarnessStores {
346
365
  this.results = new NoSqlResultStore(this.records);
347
366
  }
348
367
  /**
349
- * Creates or verifies the three collections and their indexes. Every store operation awaits the
368
+ * Creates or verifies the four collections and their indexes. Every store operation awaits the
350
369
  * same preparation, so calling it at startup only moves that work, and its failure, forward.
351
370
  */
352
371
  prepare() {
353
372
  return this.records.prepare();
354
373
  }
355
374
  /**
356
- * Physically removes every record and chunk of one storage namespace in every domain: the
375
+ * Physically removes every record, chunk and change of one storage namespace in every domain: the
357
376
  * scope snapshot, each session's projection, permissions, Agent events and archives, jobs and
358
377
  * results, and the project-management records and tombstones. This is the host's durable
359
378
  * deletion of a scope. Stop new admission for every alias of the scope first. Without `fence`,
@@ -373,4 +392,4 @@ export class NoSqlFlexHarnessStores {
373
392
  : this.records.purgeNamespace(storageKey);
374
393
  }
375
394
  }
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ub3NxbGRic3RvcmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfc3RvcmVzX25vc3FsZGIvY2xhc3Nlcy5ub3NxbGRic3RvcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBb0I1RixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGlDQUFpQyxFQUNqQyxtQ0FBbUMsRUFDbkMsb0NBQW9DLEdBQ3JDLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLDRCQUE0QixFQUM1Qix5QkFBeUIsRUFDekIsMEJBQTBCLEdBQzNCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyx1QkFBdUIsRUFDdkIsb0NBQW9DLEVBQ3BDLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLHFDQUFxQyxFQUNyQyxtQkFBbUIsRUFDbkIsb0JBQW9CLEdBQ3JCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBK0IsTUFBTSwwQkFBMEIsQ0FBQztBQUV4Rix5RkFBeUY7QUFDekYsU0FBUyxtQkFBbUIsQ0FDMUIsUUFBbUIsRUFDbkIsZ0JBQXdCLEVBQ3hCLFFBQTJDLEVBQzNDLFdBQXlCO0lBRXpCLE9BQU87UUFDTCxNQUFNLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUN6QixXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDOUIsSUFBSSxjQUFjLEtBQUssZ0JBQWdCO2dCQUFFLE1BQU0sUUFB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
395
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ub3NxbGRic3RvcmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfc3RvcmVzX25vc3FsZGIvY2xhc3Nlcy5ub3NxbGRic3RvcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBb0I1RixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGlDQUFpQyxFQUNqQyxtQ0FBbUMsRUFDbkMsb0NBQW9DLEdBQ3JDLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsNEJBQTRCLEdBQzdCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDBCQUEwQixHQUMzQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMsdUJBQXVCLEVBQ3ZCLG9DQUFvQyxFQUNwQyxXQUFXLEVBQ1gsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixxQ0FBcUMsRUFDckMsbUJBQW1CLEVBQ25CLG9CQUFvQixHQUNyQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxlQUFlLEdBR2hCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMseUZBQXlGO0FBQ3pGLFNBQVMsbUJBQW1CLENBQzFCLFFBQW1CLEVBQ25CLGdCQUF3QixFQUN4QixRQUEyQyxFQUMzQyxXQUF5QjtJQUV6QixPQUFPO1FBQ0wsTUFBTSxFQUFFLENBQUMsY0FB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
@@ -27,20 +27,59 @@ export interface IFlexRecordReplacement {
27
27
  /** The conflict to report when concurrent writers keep winning the compare-and-swap. */
28
28
  contention: (actualRevision: number) => Error;
29
29
  }
30
+ /**
31
+ * How a record holds a snapshot as a base plus the changes saved since. Every function throws a
32
+ * `FlexHarnessStoreFormatError` for a value it rejects.
33
+ */
34
+ export interface IFlexRecordLog<TSnapshot extends {
35
+ revision: number;
36
+ }, TChange> {
37
+ /** Checks a snapshot in full. */
38
+ validate: (value: unknown) => TSnapshot;
39
+ /** Checks the form of a change. */
40
+ validateChange: (value: unknown) => TChange;
41
+ /** The snapshot `change` makes of `current`, before `validate` checks it. */
42
+ apply: (current: TSnapshot | undefined, change: TChange) => TSnapshot;
43
+ }
44
+ /** A change to save while the record's head holds `expectedRevision`; it makes the next one. */
45
+ export interface IFlexRecordChange<TChange> {
46
+ expectedRevision: number;
47
+ /** The change, already checked by the log's `validateChange`. */
48
+ value: TChange;
49
+ /** The conflict to report when the head holds another revision. */
50
+ conflict: (actualRevision: number) => Error;
51
+ }
30
52
  export declare const FLEX_RECORD_COLLECTION = "flexharness_records";
31
53
  export declare const FLEX_CHUNK_COLLECTION = "flexharness_chunks";
32
54
  export declare const FLEX_NAMESPACE_COLLECTION = "flexharness_namespaces";
55
+ export declare const FLEX_CHANGE_COLLECTION = "flexharness_changes";
33
56
  /**
34
57
  * UTF-16 code units a record holds inline, and the size of each chunk of a longer payload. A
35
58
  * chunk stays below 3 MiB of UTF-8, far under the 16 MiB document limit NoSQLDB and MongoDB
36
59
  * enforce, so a record and each of its chunks always fit one document.
37
60
  */
38
61
  export declare const FLEX_RECORD_CHUNK_CODE_UNITS: number;
62
+ /**
63
+ * UTF-16 code units the changes of a log may reach however short its base, so a young record
64
+ * keeps its changes instead of compacting on nearly every save.
65
+ */
66
+ export declare const FLEX_RECORD_MIN_LOG_CODE_UNITS: number;
67
+ /**
68
+ * UTF-16 code units of changes a log record's head holds inline. The save that would exceed it
69
+ * moves them, with its own change, into one change page.
70
+ */
71
+ export declare const FLEX_RECORD_INLINE_CHANGE_CODE_UNITS: number;
39
72
  /**
40
73
  * The head of one record. A payload up to one chunk is stored inline; a longer one lives in
41
74
  * immutable chunks named by `blobId`. `writeToken` changes on every committed write and is the
42
75
  * compare-and-swap fence. A head without payload or blob is a placeholder that reserves the
43
- * record for a chunked first write; it reads as absent.
76
+ * record for a first write longer than one chunk; it reads as absent.
77
+ *
78
+ * A log record's payload is a base, `{ base }`, always in chunks, and its head names a log,
79
+ * `logId`: the `changeCount` changes saved since the base. The head holds the latest of them in
80
+ * `recentChanges`; the earlier ones fill change pages, chained from `lastPageId` back to the log.
81
+ * A head without `logId`, also one an earlier version wrote, holds its value whole. A write that
82
+ * replaces a log names it `retiredLogId`, and the next write deletes its pages.
44
83
  */
45
84
  export declare class FlexRecordDocument extends plugins.SmartDataDbDoc<FlexRecordDocument, FlexRecordDocument> {
46
85
  recordId: string;
@@ -56,6 +95,21 @@ export declare class FlexRecordDocument extends plugins.SmartDataDbDoc<FlexRecor
56
95
  /** Set before the first chunk of this record is written; the record's writes then sweep. */
57
96
  chunked: boolean;
58
97
  sweepCount: number;
98
+ /** The write token of the base's commit, which names the log; null without a log. */
99
+ logId: string | null;
100
+ changeCount: number;
101
+ /** The log's changes saved since its last page, oldest first; empty without a log. */
102
+ recentChanges: string[];
103
+ /** The log's latest change page; null while the log has none. */
104
+ lastPageId: string | null;
105
+ /**
106
+ * UTF-16 code units of the log's changes and of its base; a log outgrows neither its base nor,
107
+ * for a shorter base, `FLEX_RECORD_MIN_LOG_CODE_UNITS`.
108
+ */
109
+ changeLength: number;
110
+ baseLength: number;
111
+ /** The log the last write replaced, whose pages the next write deletes; null without one. */
112
+ retiredLogId: string | null;
59
113
  }
60
114
  /** One immutable piece of a chunked payload, written against the head token it will replace. */
61
115
  export declare class FlexChunkDocument extends plugins.SmartDataDbDoc<FlexChunkDocument, FlexChunkDocument> {
@@ -69,6 +123,20 @@ export declare class FlexChunkDocument extends plugins.SmartDataDbDoc<FlexChunkD
69
123
  index: number;
70
124
  data: string;
71
125
  }
126
+ /**
127
+ * One immutable page of a log record's changes, oldest first, written before the head swap that
128
+ * commits it. `previousId` names the log's previous page, or the log itself for its first page.
129
+ */
130
+ export declare class FlexChangePageDocument extends plugins.SmartDataDbDoc<FlexChangePageDocument, FlexChangePageDocument> {
131
+ pageId: string;
132
+ recordId: string;
133
+ domain: TFlexRecordDomain;
134
+ ownerKey: string;
135
+ namespaceKey: string;
136
+ logId: string;
137
+ previousId: string;
138
+ changes: string[];
139
+ }
72
140
  /**
73
141
  * One storage namespace. Every record creation in the namespace increments `creationCount` in
74
142
  * its transaction, so a concurrent fenced purge, which sets `fenced`, conflicts with it. A fenced
@@ -81,13 +149,15 @@ export declare class FlexNamespaceDocument extends plugins.SmartDataDbDoc<FlexNa
81
149
  }
82
150
  type TRecordModel = typeof FlexRecordDocument;
83
151
  type TChunkModel = typeof FlexChunkDocument;
152
+ type TChangePageModel = typeof FlexChangePageDocument;
84
153
  type TNamespaceModel = typeof FlexNamespaceDocument;
85
154
  export interface IFlexRecordModels {
86
155
  records: TRecordModel;
87
156
  chunks: TChunkModel;
157
+ changes: TChangePageModel;
88
158
  namespaces: TNamespaceModel;
89
159
  }
90
- /** Binds the record, chunk and namespace models to a database. */
160
+ /** Binds the record, chunk, change page and namespace models to a database. */
91
161
  export declare function bindFlexRecordModels(db: plugins.SmartdataDb): IFlexRecordModels;
92
162
  export interface IFlexRecordStoreOptions {
93
163
  db: plugins.SmartdataDb;
@@ -99,12 +169,22 @@ export interface IFlexRecordStoreOptions {
99
169
  * replaced or abandoned payload are swept in a transaction that also touches the head, so a
100
170
  * concurrent deletion or writer can never lose chunks its head references. A head is created in
101
171
  * a transaction that checks its namespace document, so a fenced namespace gains no record.
172
+ *
173
+ * A log record takes a change in the head swap itself, which appends it to the head's recent
174
+ * changes, so a save costs the change rather than the record and reads and writes only the head.
175
+ * The save that would grow the recent changes past `FLEX_RECORD_INLINE_CHANGE_CODE_UNITS` writes
176
+ * them, with its own change, as one change page first and empties them in its swap. The base lives
177
+ * in chunks whatever its length, so the head the swap rewrites holds no payload. Once the changes
178
+ * would outgrow the base, or a shorter base's minimum room, a save compacts the record instead: it
179
+ * writes the base with every change applied, checked in full.
180
+ * The change pages of earlier logs are swept like chunks.
102
181
  */
103
182
  export declare class FlexRecordStore {
104
183
  private readonly db;
105
184
  private readonly timeoutMs;
106
185
  private readonly records;
107
186
  private readonly chunks;
187
+ private readonly changes;
108
188
  private readonly namespaces;
109
189
  private preparation?;
110
190
  constructor(options: IFlexRecordStoreOptions);
@@ -113,6 +193,19 @@ export declare class FlexRecordStore {
113
193
  private prepareCollections;
114
194
  private resolve;
115
195
  read<TValue>(address: IFlexRecordAddress, validate: (value: unknown) => TValue): Promise<TValue | undefined>;
196
+ /** Reads a log record: its base with every change applied, checked in full. */
197
+ readLog<TSnapshot extends {
198
+ revision: number;
199
+ }, TChange>(address: IFlexRecordAddress, log: IFlexRecordLog<TSnapshot, TChange>): Promise<TSnapshot | undefined>;
200
+ /**
201
+ * Saves a change to a log record while its head holds the expected revision. Only the head is
202
+ * read when the record takes the change; a compaction loads the record and checks the result in
203
+ * full. A change the record takes is checked in form only, by the caller; its content is checked
204
+ * once a compaction or a read applies it.
205
+ */
206
+ append<TSnapshot extends {
207
+ revision: number;
208
+ }, TChange>(address: IFlexRecordAddress, log: IFlexRecordLog<TSnapshot, TChange>, change: IFlexRecordChange<TChange>): Promise<void>;
116
209
  mutate<TValue>(address: IFlexRecordAddress, mutation: IFlexRecordMutation<TValue>): Promise<void>;
117
210
  /**
118
211
  * Replaces a record's value on a decision from its revision alone. Only the head is read: the
@@ -121,47 +214,86 @@ export declare class FlexRecordStore {
121
214
  replace(address: IFlexRecordAddress, replacement: IFlexRecordReplacement): Promise<void>;
122
215
  /** Decides and commits until a head swap wins or a decision writes nothing. */
123
216
  private swap;
124
- /** Deletes one record and its chunks. */
217
+ /** Deletes one record with its chunks and change pages. */
125
218
  delete(address: IFlexRecordAddress): Promise<void>;
126
- /** Deletes every record and chunk one session owns in the given domains. */
219
+ /** Deletes every record, chunk and change page one session owns in the given domains. */
127
220
  deleteOwner(storageKey: string, sessionId: string, domains: readonly TFlexRecordDomain[]): Promise<void>;
128
221
  /**
129
- * Deletes every record and chunk of a storage namespace in one domain, or in every domain
130
- * together with its namespace document unless a fence holds it.
222
+ * Deletes every record, chunk and change page of a storage namespace in one domain, or in every
223
+ * domain together with its namespace document unless a fence holds it.
131
224
  */
132
225
  purgeNamespace(storageKey: string, domain?: TFlexRecordDomain): Promise<void>;
133
226
  /**
134
- * Fences a storage namespace and deletes every record and chunk of it in one transaction. The
135
- * fence is permanent: every later record creation in the namespace is refused, and a creation
136
- * that runs concurrently either commits first and is deleted, or conflicts and is refused.
227
+ * Fences a storage namespace and deletes every record, chunk and change page of it in one
228
+ * transaction. The fence is permanent: every later record creation in the namespace is refused,
229
+ * and a creation that runs concurrently either commits first and is deleted, or conflicts and is
230
+ * refused.
137
231
  */
138
232
  fenceNamespace(storageKey: string): Promise<void>;
139
- /** Deletes the selected records and chunks, after `namespace` changes the namespace document. */
233
+ /** Deletes the selected records, chunks and change pages, after `namespace` changes the namespace document. */
140
234
  private deleteInTransaction;
141
235
  private parse;
236
+ /** Runs a check of stored data and names the record in a format error it throws. */
237
+ private check;
142
238
  private findHead;
143
239
  private readHead;
240
+ /**
241
+ * Loads a log record with the head it was read at. A head without a log holds its value whole;
242
+ * a base must be wrapped, so a version that reads values whole fails on it.
243
+ */
244
+ private loadLog;
245
+ /**
246
+ * The data of the head's changes, oldest first: its pages, found by walking back from its last
247
+ * page to its log, then its recent changes. Undefined when the pages are incomplete.
248
+ */
249
+ private readChanges;
250
+ /** The base with every change applied, checked in full and at the head's revision. */
251
+ private fold;
144
252
  private readBlob;
145
- /** Returns false when another writer swapped the head first; nothing of this write remains. */
253
+ /**
254
+ * Writes the value whole, or as the base of a new log, empty, when `log` is set; a base always
255
+ * goes into chunks. Returns false when another writer swapped the head first; nothing of this
256
+ * write remains.
257
+ */
146
258
  private commit;
259
+ /**
260
+ * Whether the record takes a change: a log that stays no longer than its base, or than the
261
+ * minimum room of a shorter base. A head whose recent changes are no list takes none, so the
262
+ * compaction's read refuses it.
263
+ */
264
+ private takesChange;
265
+ /**
266
+ * Appends a change to the head's recent changes in the head swap, or, when they would grow past
267
+ * their inline room, writes them with the change as a new page and empties them in the swap.
268
+ * Returns false when another writer swapped the head first; nothing of this write remains.
269
+ */
270
+ private commitChange;
147
271
  private newHead;
272
+ /**
273
+ * Creates the record with a first payload of up to one chunk in one transaction: inline, or as
274
+ * the single chunk of a log's base. The creation never touches the head again, so a concurrent
275
+ * fenced purge conflicts with it at most once.
276
+ */
148
277
  private insertHead;
149
- /** Reserves the record for a chunked first write, so its chunks have a head token to replace. */
278
+ /** Reserves the record for a first write longer than one chunk, so its chunks have a head token to replace. */
150
279
  private insertPlaceholder;
151
280
  /**
152
- * Inserts a new head unless a fence holds its namespace. The transaction also increments the
153
- * namespace document, so it conflicts with a concurrent fenced purge: whichever commits second
154
- * retries on a snapshot that holds the other. Returns false when another writer created the
155
- * record first.
281
+ * Inserts a new head, and the chunk it references if any, unless a fence holds its namespace.
282
+ * The transaction also increments the namespace document, so it conflicts with a concurrent
283
+ * fenced purge: whichever commits second retries on a snapshot that holds the other. Returns
284
+ * false when another writer created the record first.
156
285
  */
157
286
  private create;
158
287
  private markChunked;
159
288
  private writeBlob;
289
+ private newChunk;
160
290
  /**
161
- * Deletes the record's chunks that no head can reference any more: every blob but the current
162
- * one that was written against another head token. A writer that read the current token keeps
163
- * its chunks. Touching the head in the same transaction makes a concurrent deletion conflict,
164
- * so chunks written after a deletion are never swept by a transaction that predates it.
291
+ * Deletes the record's chunks and change pages that no head can reference any more: every blob
292
+ * but the current one that was written against another head token, and every page of the log the
293
+ * last write retired, found by its index rather than by scanning the current log's pages. A
294
+ * writer that read the current token keeps its chunks.
295
+ * Touching the head in the same transaction makes a concurrent deletion conflict, so chunks and
296
+ * pages written after a deletion are never swept by a transaction that predates it.
165
297
  */
166
298
  private sweep;
167
299
  }