@microdelta/history 0.0.0 → 0.2.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 (79) hide show
  1. package/README.md +30 -4
  2. package/dist/api/history.alpha.d.ts +3 -0
  3. package/dist/api/history.beta.d.ts +3 -0
  4. package/dist/api/history.conformance.store.alpha.d.ts +3 -0
  5. package/dist/api/history.conformance.store.beta.d.ts +3 -0
  6. package/dist/api/history.conformance.store.public.d.ts +3 -0
  7. package/dist/api/history.conformance.store.raw.alpha.d.ts +215 -0
  8. package/dist/api/history.conformance.store.raw.beta.d.ts +215 -0
  9. package/dist/api/history.conformance.store.raw.public.d.ts +215 -0
  10. package/dist/api/history.conformance.store.raw.untrimmed.d.ts +215 -0
  11. package/dist/api/history.conformance.store.untrimmed.d.ts +3 -0
  12. package/dist/api/history.public.d.ts +3 -0
  13. package/dist/api/history.root.raw.alpha.d.ts +1371 -0
  14. package/dist/api/history.root.raw.beta.d.ts +425 -0
  15. package/dist/api/history.root.raw.public.d.ts +425 -0
  16. package/dist/api/history.root.raw.untrimmed.d.ts +1372 -0
  17. package/dist/api/history.shared.alpha.d.ts +1402 -0
  18. package/dist/api/history.shared.beta.d.ts +456 -0
  19. package/dist/api/history.shared.public.d.ts +456 -0
  20. package/dist/api/history.shared.untrimmed.d.ts +1403 -0
  21. package/dist/api/history.untrimmed.d.ts +3 -0
  22. package/dist/api/tsdoc-metadata.json +11 -0
  23. package/dist/src/completed-results.d.ts +99 -0
  24. package/dist/src/completed-results.d.ts.map +1 -0
  25. package/dist/src/completed-results.js +2 -0
  26. package/dist/src/completed-results.js.map +1 -0
  27. package/dist/src/durable/contracts.d.ts +612 -0
  28. package/dist/src/durable/contracts.d.ts.map +1 -0
  29. package/dist/src/durable/contracts.js +2 -0
  30. package/dist/src/durable/contracts.js.map +1 -0
  31. package/dist/src/durable/errors.d.ts +94 -0
  32. package/dist/src/durable/errors.d.ts.map +1 -0
  33. package/dist/src/durable/errors.js +118 -0
  34. package/dist/src/durable/errors.js.map +1 -0
  35. package/dist/src/durable/index.d.ts +9 -0
  36. package/dist/src/durable/index.d.ts.map +1 -0
  37. package/dist/src/durable/index.js +770 -0
  38. package/dist/src/durable/index.js.map +1 -0
  39. package/dist/src/durable/journal.d.ts +53 -0
  40. package/dist/src/durable/journal.d.ts.map +1 -0
  41. package/dist/src/durable/journal.js +174 -0
  42. package/dist/src/durable/journal.js.map +1 -0
  43. package/dist/src/durable/locator.d.ts +31 -0
  44. package/dist/src/durable/locator.d.ts.map +1 -0
  45. package/dist/src/durable/locator.js +50 -0
  46. package/dist/src/durable/locator.js.map +1 -0
  47. package/dist/src/durable/records.d.ts +40 -0
  48. package/dist/src/durable/records.d.ts.map +1 -0
  49. package/dist/src/durable/records.js +74 -0
  50. package/dist/src/durable/records.js.map +1 -0
  51. package/dist/src/durable/schema.d.ts +37 -0
  52. package/dist/src/durable/schema.d.ts.map +1 -0
  53. package/dist/src/durable/schema.js +335 -0
  54. package/dist/src/durable/schema.js.map +1 -0
  55. package/dist/src/durable/selected-index.d.ts +94 -0
  56. package/dist/src/durable/selected-index.d.ts.map +1 -0
  57. package/dist/src/durable/selected-index.js +594 -0
  58. package/dist/src/durable/selected-index.js.map +1 -0
  59. package/dist/src/index.d.ts +28 -0
  60. package/dist/src/index.d.ts.map +1 -0
  61. package/dist/src/index.js +15 -0
  62. package/dist/src/index.js.map +1 -0
  63. package/dist/src/store/index.d.ts +128 -0
  64. package/dist/src/store/index.d.ts.map +1 -0
  65. package/dist/src/store/index.js +33 -0
  66. package/dist/src/store/index.js.map +1 -0
  67. package/dist/src/store/memory/index.d.ts +24 -0
  68. package/dist/src/store/memory/index.d.ts.map +1 -0
  69. package/dist/src/store/memory/index.js +162 -0
  70. package/dist/src/store/memory/index.js.map +1 -0
  71. package/dist/src/types.d.ts +100 -0
  72. package/dist/src/types.d.ts.map +1 -0
  73. package/dist/src/types.js +2 -0
  74. package/dist/src/types.js.map +1 -0
  75. package/dist/test/conformance/store/index.d.ts +34 -0
  76. package/dist/test/conformance/store/index.d.ts.map +1 -0
  77. package/dist/test/conformance/store/index.js +368 -0
  78. package/dist/test/conformance/store/index.js.map +1 -0
  79. package/package.json +48 -8
@@ -0,0 +1,368 @@
1
+ import { afterEach, beforeEach, describe, expect, test } from '@jest/globals';
2
+ /** Fixtures use distinct opaque fingerprints; hashing belongs to another component. */
3
+ function fingerprint(value) {
4
+ return value;
5
+ }
6
+ /** Construct a caller-owned tuple, deliberately independent of identity hashing. */
7
+ function key(step = 'summarize', revision = 1, subjectHash = 'subject') {
8
+ return { step, revision, subjectHash };
9
+ }
10
+ /** Construct a structurally complete subject without performing lifecycle transitions. */
11
+ function subject(resultKey = key()) {
12
+ return {
13
+ key: resultKey,
14
+ subject: { kind: 'step', name: resultKey.step, inputs: [{ kind: 'type', type: 'PR', key: '4521' }] },
15
+ version: 0,
16
+ currentGeneration: null,
17
+ claim: null,
18
+ durations: [],
19
+ };
20
+ }
21
+ /** Generations are caller-allocated rows; the fixture intentionally uses arbitrary numbers. */
22
+ function generation(resultKey = key(), number = 7) {
23
+ return {
24
+ key: resultKey,
25
+ generation: number,
26
+ state: 'claimed',
27
+ reads: [{ kind: 'field', arg: 0, path: 'title', fingerprint: fingerprint('title-fp') }],
28
+ identity: { kind: 'type', type: 'PR', key: '4521' },
29
+ startedAt: 100,
30
+ endedAt: null,
31
+ cost: { usd: 2 },
32
+ arrival: 'batch',
33
+ };
34
+ }
35
+ /** A value-bearing field row whose fingerprint is supplied, never recomputed by storage. */
36
+ function field(resultKey = key(), path = 'title', number = 7) {
37
+ return { key: resultKey, generation: number, path, fingerprint: fingerprint(`${path}-fp`), value: { title: 'before' } };
38
+ }
39
+ /** Narrow a value-bearing field without asserting away the backend's runtime shape. */
40
+ function hasTitle(value) {
41
+ return typeof value === 'object' && value !== null && 'title' in value && typeof value.title === 'string';
42
+ }
43
+ /** Assert fixture data before mutation so malformed backend output fails clearly. */
44
+ function titleValue(value) {
45
+ if (!hasTitle(value)) {
46
+ throw new Error('Expected an object with a string title');
47
+ }
48
+ return value;
49
+ }
50
+ /**
51
+ * Register reusable backend qualification tests for SA-1 through SA-7.
52
+ * Register this from a Jest test module; the suite imports no concrete backend.
53
+ * Mutation tests enforce rev 9's retained-value isolation at the storage seam.
54
+ * This suite does not assert atomicity across subject, generation, and field rows:
55
+ * the supplied Store contract does not provide that operation.
56
+ * @public
57
+ */
58
+ export function storeConformance(name, options) {
59
+ describe(`Store conformance: ${name}`, () => {
60
+ let store;
61
+ beforeEach(async () => {
62
+ store = await options.create();
63
+ });
64
+ afterEach(async () => {
65
+ await store.close();
66
+ });
67
+ test('SA-1: exactly one of 64 same-version CAS contenders wins', async () => {
68
+ await store.putSubject(subject());
69
+ const contenders = Array.from({ length: 64 }, (_, index) => store.casSubject(key(), 0, {
70
+ claim: { generation: 7, holder: `holder-${index}`, leaseUntil: 1_000, progress: null },
71
+ }));
72
+ const won = await Promise.all(contenders);
73
+ expect(won.filter(Boolean)).toHaveLength(1);
74
+ const row = await store.getSubject(key());
75
+ expect(row?.version).toBe(1);
76
+ expect(row?.claim?.holder).toBe(`holder-${won.indexOf(true)}`);
77
+ });
78
+ test('SA-1: stale and missing CAS return false without applying any patch', async () => {
79
+ await store.putSubject(subject());
80
+ expect(await store.casSubject(key(), 0, { durations: [10], currentGeneration: 7 })).toBe(true);
81
+ const before = await store.getSubject(key());
82
+ expect(await store.casSubject(key(), 0, { durations: [99], currentGeneration: 99 })).toBe(false);
83
+ expect(await store.getSubject(key())).toEqual(before);
84
+ expect(await store.casSubject(key('missing'), 0, { durations: [99] })).toBe(false);
85
+ expect(await store.getSubject(key('missing'))).toBeUndefined();
86
+ });
87
+ test('SA-1: successful writes increment the stored version once, including empty patches', async () => {
88
+ await store.putSubject({ ...subject(), version: 19 });
89
+ expect(await store.casSubject(key(), 19, {})).toBe(true);
90
+ expect((await store.getSubject(key()))?.version).toBe(20);
91
+ expect(await store.casSubject(key(), 20, { currentGeneration: 88 })).toBe(true);
92
+ expect((await store.getSubject(key()))?.version).toBe(21);
93
+ });
94
+ test.each([NaN, Infinity, -Infinity, -1, 0.5, Number.MAX_SAFE_INTEGER + 1])('SA-1: subject insertion rejects invalid CAS version %s without inserting', async (version) => {
95
+ await expect(store.putSubject({ ...subject(), version })).rejects.toBeInstanceOf(RangeError);
96
+ expect(await store.getSubject(key())).toBeUndefined();
97
+ });
98
+ test('SA-1: exhausted CAS versions reject instead of letting multiple contenders win', async () => {
99
+ const exhausted = { ...subject(), version: Number.MAX_SAFE_INTEGER };
100
+ await store.putSubject(exhausted);
101
+ await expect(store.casSubject(key(), Number.MAX_SAFE_INTEGER, { durations: [99] })).rejects.toBeInstanceOf(RangeError);
102
+ expect(await store.getSubject(key())).toEqual(exhausted);
103
+ // A stale token remains an ordinary lost race, even when the stored token is exhausted.
104
+ expect(await store.casSubject(key(), Number.MAX_SAFE_INTEGER - 1, { durations: [88] })).toBe(false);
105
+ expect(await store.getSubject(key())).toEqual(exhausted);
106
+ });
107
+ test('SA-1/SA-2: concurrent inserts produce one row; losers cannot overwrite the winner', async () => {
108
+ const attempts = await Promise.allSettled(Array.from({ length: 64 }, (_, index) => store.putSubject({ ...subject(), durations: [index] })));
109
+ expect(attempts.filter((attempt) => attempt.status === 'fulfilled')).toHaveLength(1);
110
+ for (const attempt of attempts) {
111
+ if (attempt.status === 'rejected') {
112
+ expect(attempt.reason).toMatchObject({ name: 'DuplicateRowError' });
113
+ }
114
+ }
115
+ const winner = attempts.findIndex((attempt) => attempt.status === 'fulfilled');
116
+ expect((await store.getSubject(key()))?.durations).toEqual([winner]);
117
+ });
118
+ test('SA-2: subject and generation inserts never replace existing rows', async () => {
119
+ const originalSubject = subject();
120
+ const originalGeneration = generation();
121
+ await store.putSubject(originalSubject);
122
+ await store.putGeneration(originalGeneration);
123
+ await expect(store.putSubject({ ...originalSubject, currentGeneration: 99 })).rejects.toMatchObject({ name: 'DuplicateRowError' });
124
+ await expect(store.putGeneration({ ...originalGeneration, state: 'abandoned' })).rejects.toMatchObject({ name: 'DuplicateRowError' });
125
+ expect(await store.getSubject(key())).toEqual(originalSubject);
126
+ expect(await store.getGeneration(key(), 7)).toEqual(originalGeneration);
127
+ });
128
+ test('SA-2: concurrent generation inserts have one winner', async () => {
129
+ const attempts = await Promise.allSettled(Array.from({ length: 16 }, (_, index) => store.putGeneration({ ...generation(), cost: { tokens: index } })));
130
+ expect(attempts.filter((attempt) => attempt.status === 'fulfilled')).toHaveLength(1);
131
+ for (const attempt of attempts) {
132
+ if (attempt.status === 'rejected') {
133
+ expect(attempt.reason).toMatchObject({ name: 'DuplicateRowError' });
134
+ }
135
+ }
136
+ expect((await store.getGeneration(key(), 7))?.cost).toEqual({ tokens: attempts.findIndex((attempt) => attempt.status === 'fulfilled') });
137
+ });
138
+ test('tuple addressing isolates separator, Unicode, revision, generation, and path collisions', async () => {
139
+ const keys = [key('a|1', 2, 'b'), key('a', 1, '2|b'), key('a:1', 2, 'b'), key('a', 1, '2:b'), key('a\u00001', 2, 'b'), key('a', 1, '2\u0000b'), key('😀', 1, '雪'), key('😀', 2, '雪')];
140
+ for (const [index, resultKey] of keys.entries()) {
141
+ await store.putSubject({ ...subject(resultKey), durations: [index] });
142
+ await store.putGeneration({ ...generation(resultKey), cost: { index } });
143
+ await store.putFields([{ ...field(resultKey), value: index }, { ...field(resultKey, 'title', 8), value: index + 100 }, { ...field(resultKey, 'title|8'), value: index + 200 }]);
144
+ }
145
+ for (const [index, resultKey] of keys.entries()) {
146
+ expect((await store.getSubject(resultKey))?.durations).toEqual([index]);
147
+ expect((await store.getGeneration(resultKey, 7))?.cost).toEqual({ index });
148
+ expect((await store.getFields(resultKey, 7, ['title']))[0]?.value).toBe(index);
149
+ expect((await store.getFields(resultKey, 8, ['title']))[0]?.value).toBe(index + 100);
150
+ expect((await store.getFields(resultKey, 7, ['title|8']))[0]?.value).toBe(index + 200);
151
+ }
152
+ });
153
+ test('tuple addressing distinguishes nonfinite numeric revisions and generations', async () => {
154
+ const numbers = [NaN, Infinity, -Infinity, 0];
155
+ for (const [revisionIndex, revision] of numbers.entries()) {
156
+ const resultKey = key('numeric', revision);
157
+ await store.putSubject({ ...subject(resultKey), durations: [revisionIndex] });
158
+ for (const [generationIndex, number] of numbers.entries()) {
159
+ await store.putGeneration({ ...generation(resultKey, number), cost: { revisionIndex, generationIndex } });
160
+ await store.putFields([{ ...field(resultKey, 'payload', number), value: { revisionIndex, generationIndex } }]);
161
+ }
162
+ }
163
+ for (const [revisionIndex, revision] of numbers.entries()) {
164
+ const resultKey = key('numeric', revision);
165
+ expect((await store.getSubject(resultKey))?.durations).toEqual([revisionIndex]);
166
+ for (const [generationIndex, number] of numbers.entries()) {
167
+ expect((await store.getGeneration(resultKey, number))?.cost).toEqual({ revisionIndex, generationIndex });
168
+ expect((await store.getFields(resultKey, number, ['payload']))[0]?.value).toEqual({ revisionIndex, generationIndex });
169
+ }
170
+ }
171
+ });
172
+ test('retained rows are isolated from caller mutations after insertion', async () => {
173
+ const inputSubject = subject();
174
+ const inputGeneration = generation();
175
+ const inputField = field();
176
+ await store.putSubject(inputSubject);
177
+ await store.putGeneration(inputGeneration);
178
+ await store.putFields([inputField]);
179
+ inputSubject.key.step = 'changed';
180
+ inputSubject.subject.inputs = [];
181
+ inputSubject.durations.push(55);
182
+ inputGeneration.cost.usd = 999;
183
+ inputGeneration.reads.length = 0;
184
+ titleValue(inputField.value).title = 'changed';
185
+ inputField.fingerprint = fingerprint('changed');
186
+ expect(await store.getSubject(key())).toEqual(subject());
187
+ expect(await store.getGeneration(key(), 7)).toEqual(generation());
188
+ expect(await store.getFields(key(), 7, ['title'])).toEqual([field()]);
189
+ });
190
+ test('retained rows are isolated from caller mutations after reading', async () => {
191
+ await store.putSubject(subject());
192
+ await store.putGeneration(generation());
193
+ await store.putFields([field()]);
194
+ const readSubject = await store.getSubject(key());
195
+ const readGeneration = await store.getGeneration(key(), 7);
196
+ const readFields = await store.getFields(key(), 7, ['title']);
197
+ expect(readSubject).toBeDefined();
198
+ expect(readGeneration).toBeDefined();
199
+ if (readSubject !== undefined) {
200
+ readSubject.durations.push(777);
201
+ readSubject.subject.inputs = [];
202
+ }
203
+ if (readGeneration !== undefined) {
204
+ readGeneration.reads.length = 0;
205
+ readGeneration.cost.usd = 999;
206
+ }
207
+ for (const readField of readFields) {
208
+ titleValue(readField.value).title = 'changed';
209
+ }
210
+ expect(await store.getSubject(key())).toEqual(subject());
211
+ expect(await store.getGeneration(key(), 7)).toEqual(generation());
212
+ expect(await store.getFields(key(), 7, ['title'])).toEqual([field()]);
213
+ });
214
+ test('CAS copies nested patches and returns isolated progress data', async () => {
215
+ await store.putSubject(subject());
216
+ const progress = { title: 'page 1' };
217
+ const patch = { claim: { generation: 7, holder: 'worker', leaseUntil: 1_000, progress: { fingerprint: fingerprint('progress'), value: progress } }, durations: [123] };
218
+ expect(await store.casSubject(key(), 0, patch)).toBe(true);
219
+ progress.title = 'changed';
220
+ patch.claim.holder = 'changed';
221
+ patch.durations.push(999);
222
+ const row = await store.getSubject(key());
223
+ expect(row?.claim?.holder).toBe('worker');
224
+ expect(row?.claim?.progress?.value).toEqual({ title: 'page 1' });
225
+ expect(row?.durations).toEqual([123]);
226
+ if (row?.claim?.progress !== null && row?.claim?.progress !== undefined) {
227
+ titleValue(row.claim.progress.value).title = 'read mutation';
228
+ }
229
+ expect((await store.getSubject(key()))?.claim?.progress?.value).toEqual({ title: 'page 1' });
230
+ });
231
+ test('generation patches copy nested data and preserve omitted columns', async () => {
232
+ await store.putGeneration(generation());
233
+ const patch = { cost: { usd: 9 }, error: { message: 'provider failed' } };
234
+ await store.updateGeneration(key(), 7, patch);
235
+ patch.cost.usd = 99;
236
+ patch.error.message = 'changed';
237
+ expect(await store.getGeneration(key(), 7)).toEqual({ ...generation(), cost: { usd: 9 }, error: { message: 'provider failed' } });
238
+ });
239
+ test('generation updates reject missing rows and cannot alter tuple identity', async () => {
240
+ await expect(store.updateGeneration(key(), 404, { state: 'current' })).rejects.toMatchObject({ name: 'MissingRowError' });
241
+ await store.putGeneration(generation());
242
+ const movedKey = { state: 'current', key: key('other') };
243
+ const movedGeneration = { state: 'current', generation: 8 };
244
+ await expect(store.updateGeneration(key(), 7, movedKey)).rejects.toMatchObject({ name: 'InvalidStorePatchError' });
245
+ await expect(store.updateGeneration(key(), 7, movedGeneration)).rejects.toMatchObject({ name: 'InvalidStorePatchError' });
246
+ expect(await store.getGeneration(key(), 7)).toEqual(generation());
247
+ expect(await store.getGeneration(key('other'), 7)).toBeUndefined();
248
+ expect(await store.getGeneration(key(), 8)).toBeUndefined();
249
+ });
250
+ test('CAS guards key and version even for structurally assignable extra properties', async () => {
251
+ await store.putSubject(subject());
252
+ // Structural assignment permits extra columns even without an unsafe cast.
253
+ const movedKey = { durations: [], key: key('other') };
254
+ const movedVersion = { durations: [], version: 99 };
255
+ await expect(store.casSubject(key(), 0, movedKey)).rejects.toMatchObject({ name: 'InvalidStorePatchError' });
256
+ await expect(store.casSubject(key(), 0, movedVersion)).rejects.toMatchObject({ name: 'InvalidStorePatchError' });
257
+ expect(await store.getSubject(key())).toEqual(subject());
258
+ });
259
+ test('field batches are insert-only and a duplicate leaves the entire batch untouched', async () => {
260
+ await store.putFields([field()]);
261
+ await expect(store.putFields([field(key(), 'new'), { ...field(), value: 'overwrite' }])).rejects.toMatchObject({ name: 'DuplicateRowError' });
262
+ expect(await store.getFields(key(), 7, ['new', 'title'])).toEqual([field()]);
263
+ await expect(store.putFields([field(key(), 'new'), field(key(), 'new')])).rejects.toMatchObject({ name: 'DuplicateRowError' });
264
+ expect(await store.getFields(key(), 7, ['new'])).toEqual([]);
265
+ });
266
+ test('concurrent field batches with an overlapping address have one complete winner', async () => {
267
+ const attempts = await Promise.allSettled([
268
+ store.putFields([{ ...field(), value: 'first' }, field(key(), 'first-only')]),
269
+ store.putFields([{ ...field(), value: 'second' }, field(key(), 'second-only')]),
270
+ ]);
271
+ expect(attempts.filter((attempt) => attempt.status === 'fulfilled')).toHaveLength(1);
272
+ const firstWon = attempts[0]?.status === 'fulfilled';
273
+ expect((await store.getFields(key(), 7, ['title']))[0]?.value).toBe(firstWon ? 'first' : 'second');
274
+ expect(await store.getFields(key(), 7, [firstWon ? 'second-only' : 'first-only'])).toEqual([]);
275
+ });
276
+ test('SA-3: fingerprint queries return supplied fingerprints and omit missing paths', async () => {
277
+ await store.putFields([field(key(), ''), field()]);
278
+ expect(await store.getFingerprints(key(), 7, ['title', 'missing', ''])).toEqual(new Map([
279
+ ['title', fingerprint('title-fp')], ['', fingerprint('-fp')],
280
+ ]));
281
+ expect(await store.getFingerprints(key('missing'), 7, ['title'])).toEqual(new Map());
282
+ expect(await store.getFields(key(), 7, ['missing'])).toEqual([]);
283
+ expect(await store.getFields(key(), 7, [])).toEqual([]);
284
+ const fingerprints = await store.getFingerprints(key(), 7, ['title']);
285
+ fingerprints.set('title', fingerprint('changed'));
286
+ expect((await store.getFingerprints(key(), 7, ['title'])).get('title')).toBe(fingerprint('title-fp'));
287
+ });
288
+ const probeTest = options.probeValueReads === undefined ? test.skip : test;
289
+ probeTest('SA-3: fingerprint reads load zero values, independent of payload size', async () => {
290
+ const probe = options.probeValueReads?.(store);
291
+ expect(probe).toBeDefined();
292
+ if (probe === undefined) {
293
+ return;
294
+ }
295
+ for (const size of [16, 1_048_576]) {
296
+ const path = `payload-${size}`;
297
+ await store.putFields([{ ...field(key(), path), value: 'x'.repeat(size) }]);
298
+ probe.reset();
299
+ expect((await store.getFingerprints(key(), 7, [path])).get(path)).toBe(fingerprint(`${path}-fp`));
300
+ expect(probe.count()).toBe(0);
301
+ await store.getFields(key(), 7, [path]);
302
+ expect(probe.count()).toBeGreaterThan(0);
303
+ }
304
+ });
305
+ test('SA-4: expiry uses strict less-than, oldest-first ordering, and the requested limit', async () => {
306
+ for (const [index, leaseUntil] of [300, 100, 200, 400].entries()) {
307
+ await store.putSubject({ ...subject(key(`claim-${index}`)), claim: { generation: index, holder: 'holder', leaseUntil, progress: null } });
308
+ }
309
+ await store.putSubject(subject(key('unclaimed')));
310
+ const rows = await store.expiredClaims(300, 1);
311
+ expect(rows.map((row) => row.claim?.leaseUntil)).toEqual([100]);
312
+ expect((await store.expiredClaims(300, 10)).map((row) => row.claim?.leaseUntil)).toEqual([100, 200]);
313
+ expect(await store.expiredClaims(300, 0)).toEqual([]);
314
+ expect(await store.expiredClaims(100, 10)).toEqual([]);
315
+ });
316
+ test('SA-4: expiry reads neither sweep nor mutate claims and return isolated rows', async () => {
317
+ const original = { ...subject(), claim: { generation: 7, holder: 'holder', leaseUntil: 100, progress: null } };
318
+ await store.putSubject(original);
319
+ const expired = await store.expiredClaims(101, 10);
320
+ expect(expired).toEqual([original]);
321
+ expect(await store.getSubject(key())).toEqual(original);
322
+ for (const row of expired) {
323
+ row.claim = null;
324
+ row.durations.push(88);
325
+ }
326
+ expect(await store.expiredClaims(101, 10)).toEqual([original]);
327
+ });
328
+ test('SA-5: metadata reports schema and the runtime algorithm, with isolated reads', async () => {
329
+ const metadata = await store.meta();
330
+ expect(metadata).toEqual({ schemaVersion: 1, fingerprintAlgorithm: options.fingerprintAlgorithm });
331
+ metadata.schemaVersion = 999;
332
+ metadata.fingerprintAlgorithm = 'changed';
333
+ expect(await store.meta()).toEqual({ schemaVersion: 1, fingerprintAlgorithm: options.fingerprintAlgorithm });
334
+ });
335
+ test('SA-5: opening incompatible persisted fingerprint metadata rejects explicitly', async () => {
336
+ // The factory models an existing store, not a request to switch algorithms.
337
+ await expect(Promise.resolve().then(() => options.create({ fingerprintAlgorithm: `incompatible-with-${options.fingerprintAlgorithm}` })))
338
+ .rejects.toMatchObject({ name: 'FingerprintAlgorithmMismatchError' });
339
+ });
340
+ test('SA-7: storing arbitrary generation numbers and states performs no lifecycle work', async () => {
341
+ await store.putSubject(subject());
342
+ await store.putGeneration({ ...generation(key(), 19), state: 'current' });
343
+ await store.putGeneration({ ...generation(key(), 3), state: 'current' });
344
+ await store.putFields([field()]);
345
+ expect(await store.getSubject(key())).toEqual(subject());
346
+ expect((await store.listGenerations(key())).map((row) => [row.generation, row.state]).sort((a, b) => Number(a[0]) - Number(b[0])))
347
+ .toEqual([[3, 'current'], [19, 'current']]);
348
+ expect(await store.getGeneration(key(), 7)).toBeUndefined();
349
+ await store.updateGeneration(key(), 19, { state: 'abandoned' });
350
+ expect((await store.getGeneration(key(), 3))?.state).toBe('current');
351
+ expect(await store.getSubject(key())).toEqual(subject());
352
+ });
353
+ test('generation listings are isolated and restricted to the complete subject tuple', async () => {
354
+ await store.putGeneration(generation());
355
+ await store.putGeneration(generation(key('other')));
356
+ const rows = await store.listGenerations(key());
357
+ expect(rows).toEqual([generation()]);
358
+ for (const row of rows) {
359
+ row.cost.usd = 999;
360
+ row.reads.length = 0;
361
+ }
362
+ rows.length = 0;
363
+ expect(await store.listGenerations(key())).toEqual([generation()]);
364
+ expect(await store.listGenerations(key('missing'))).toEqual([]);
365
+ });
366
+ });
367
+ }
368
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../test/conformance/store/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,18 +1,58 @@
1
1
  {
2
2
  "name": "@microdelta/history",
3
- "version": "0.0.0",
4
- "description": "Reserved package name for microdelta; bootstrap only, no runtime implementation.",
5
- "type": "module",
6
- "files": [
7
- "README.md"
8
- ],
3
+ "version": "0.2.0",
4
+ "description": "Existing history context capability; implementation incomplete",
5
+ "license": "UNLICENSED",
9
6
  "repository": {
10
7
  "type": "git",
11
8
  "url": "git+https://github.com/mike-north/microdelta.git",
12
9
  "directory": "packages/history"
13
10
  },
11
+ "type": "module",
12
+ "engines": {
13
+ "node": ">=20"
14
+ },
15
+ "main": "./dist/src/index.js",
16
+ "types": "./dist/api/history.public.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/api/history.public.d.ts",
20
+ "import": "./dist/src/index.js"
21
+ },
22
+ "./conformance/store": {
23
+ "types": "./dist/api/history.conformance.store.public.d.ts",
24
+ "import": "./dist/test/conformance/store/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "!dist/api-temp"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsc -p tsconfig.build.json && api-extractor run --config api-extractor.json && api-extractor run --config api-extractor-conformance.json && api-extractor run --config api-extractor-shared.json && node ../../tooling/history-declaration-shims.mjs",
33
+ "check": "concurrently --success all --names types,lint \"npm run check:types\" \"npm run check:lint\"",
34
+ "check:types": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.portable.json",
35
+ "check:lint": "eslint .",
36
+ "test": "npm run test:unit && npm run test:types",
37
+ "test:unit": "tsc -p tsconfig.test.json && node --experimental-vm-modules ../../node_modules/jest/bin/jest.js --runInBand",
38
+ "test:types": "tsd"
39
+ },
40
+ "tsd": {
41
+ "directory": "test-d"
42
+ },
43
+ "peerDependencies": {
44
+ "@jest/globals": "^30.5.1"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "@jest/globals": {
48
+ "optional": true
49
+ }
50
+ },
51
+ "dependencies": {
52
+ "@microdelta/machine": "0.2.0",
53
+ "@microdelta/value": "0.1.1"
54
+ },
14
55
  "publishConfig": {
15
- "access": "public",
16
- "tag": "latest"
56
+ "access": "public"
17
57
  }
18
58
  }