@usearete/automations 0.0.0-stage → 0.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,465 @@
1
+ /**
2
+ * The store conformance suite. Any `AutomationStore` (memory, Postgres, or
3
+ * your own over Redis, DynamoDB, D1 or Durable Objects) must pass it.
4
+ *
5
+ * ```ts
6
+ * import { describe, expect, it } from 'vitest';
7
+ * import { runStoreConformance } from '@usearete/automations/testing';
8
+ *
9
+ * runStoreConformance('my store', async () => myStore(), { describe, it, expect });
10
+ * ```
11
+ */
12
+ const LEASE = 30_000;
13
+ const T0 = 1_700_000_000_000;
14
+ function grantFor(wallet, overrides = {}) {
15
+ return {
16
+ wallet,
17
+ deploymentId: 'dep-1',
18
+ instanceId: null,
19
+ steps: ['deposit', 'withdraw'],
20
+ limits: { perExecution: { SOL: '10000' }, perWindow: { SOL: { amount: '30000', windowMs: 86_400_000 } } },
21
+ params: { amount: '1000', nested: { weekday: 'fri' } },
22
+ expiresAt: T0 + 1000,
23
+ grantedAt: T0,
24
+ revokedAt: null,
25
+ proof: { message: 'm', signature: 's', nonce: 'n', issuedAt: T0 },
26
+ ...overrides,
27
+ };
28
+ }
29
+ function delivery(id, name = 'tick') {
30
+ return { id, name, source: 'dispatch', payload: { n: id }, receivedAt: T0 };
31
+ }
32
+ function step(deliveryId, wallet, name = 'deposit') {
33
+ return {
34
+ id: `${deliveryId}:${name}:${wallet}`,
35
+ deploymentId: 'dep-1',
36
+ request: { step: name, wallet, instance: 'inst-1', args: { amount: '1' } },
37
+ };
38
+ }
39
+ /** Accept a delivery and complete it with `steps`, returning the step job ids. */
40
+ async function seedSteps(store, deliveryId, steps, now = T0) {
41
+ await store.deliveries.accept(delivery(deliveryId), now);
42
+ const claimed = await store.jobs.claimNext({ worker: 'seed', leaseMs: LEASE, now });
43
+ if (claimed?.id !== deliveryId)
44
+ throw new Error(`expected to claim ${deliveryId}, got ${claimed?.id}`);
45
+ await store.jobs.completeDelivery(deliveryId, 'seed', steps, now);
46
+ return steps.map((entry) => entry.id);
47
+ }
48
+ function runStoreConformance(name, createStore, { describe, it, expect }) {
49
+ describe(`${name}: store conformance`, () => {
50
+ it('accepts a delivery once', async () => {
51
+ const store = await createStore();
52
+ expect(await store.deliveries.accept(delivery('d1'), T0)).toBe(true);
53
+ expect(await store.deliveries.accept(delivery('d1'), T0 + 1)).toBe(false);
54
+ const jobs = await store.jobs.list({ kind: 'delivery' });
55
+ expect(jobs.length).toBe(1);
56
+ expect(jobs[0].state).toBe('queued');
57
+ });
58
+ it('claims a job for one worker at a time', async () => {
59
+ const store = await createStore();
60
+ await store.deliveries.accept(delivery('d1'), T0);
61
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
62
+ expect(job?.id).toBe('d1');
63
+ expect(job?.state).toBe('running');
64
+ expect(job?.lease).toEqual({ worker: 'w1', until: T0 + LEASE });
65
+ expect(await store.jobs.claimNext({ worker: 'w2', leaseMs: LEASE, now: T0 + 1 })).toBeNull();
66
+ });
67
+ it('never hands one job to two concurrent claims', async () => {
68
+ const store = await createStore();
69
+ for (let index = 0; index < 5; index += 1)
70
+ await store.deliveries.accept(delivery(`d${index}`), T0);
71
+ const claims = await Promise.all(Array.from({ length: 12 }, (_, index) => store.jobs.claimNext({ worker: `w${index}`, leaseMs: LEASE, now: T0 })));
72
+ const ids = claims.filter((job) => job !== null).map((job) => job.id);
73
+ expect(ids.length).toBe(5);
74
+ expect(new Set(ids).size).toBe(5);
75
+ });
76
+ it('lets another worker take a job over when its lease lapses', async () => {
77
+ const store = await createStore();
78
+ await store.deliveries.accept(delivery('d1'), T0);
79
+ await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
80
+ const taken = await store.jobs.claimNext({ worker: 'w2', leaseMs: LEASE, now: T0 + LEASE + 1 });
81
+ expect(taken?.id).toBe('d1');
82
+ expect(taken?.lease?.worker).toBe('w2');
83
+ expect(await store.jobs.completeDelivery('d1', 'w1', [], T0 + LEASE + 2)).toBe(false);
84
+ expect(await store.jobs.renew('d1', 'w1', T0 + 2 * LEASE)).toBe(false);
85
+ expect(await store.jobs.renew('d1', 'w2', T0 + 2 * LEASE)).toBe(true);
86
+ });
87
+ it('transitions only from the expected state, by the lease holder', async () => {
88
+ const store = await createStore();
89
+ const [id] = await seedSteps(store, 'd1', [step('d1', 'alice')]);
90
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
91
+ expect(job?.id).toBe(id);
92
+ const base = { now: T0 + 1, keepLease: { until: T0 + LEASE } };
93
+ expect(await store.jobs.transition(id, { ...base, worker: 'w1', from: 'queued', to: 'signed' })).toBe(false);
94
+ expect(await store.jobs.transition(id, { ...base, worker: 'w2', from: 'running', to: 'signed' })).toBe(false);
95
+ expect(await store.jobs.transition(id, {
96
+ ...base,
97
+ worker: 'w1',
98
+ from: 'running',
99
+ to: 'signed',
100
+ progress: { signed: ['AAAA'] },
101
+ })).toBe(true);
102
+ const saved = (await store.jobs.get(id));
103
+ expect(saved.state).toBe('signed');
104
+ expect(saved.progress).toEqual({ generation: 0, signed: ['AAAA'] });
105
+ expect(saved.lease?.worker).toBe('w1');
106
+ });
107
+ it('completes a delivery and creates its step jobs in one step', async () => {
108
+ const store = await createStore();
109
+ await store.deliveries.accept(delivery('d1'), T0);
110
+ expect(await store.jobs.completeDelivery('d1', 'w1', [step('d1', 'alice')], T0)).toBe(false);
111
+ expect((await store.jobs.list({ kind: 'step' })).length).toBe(0);
112
+ await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
113
+ expect(await store.jobs.completeDelivery('d1', 'w1', [step('d1', 'alice'), step('d1', 'bob'), step('d1', 'alice')], T0)).toBe(true);
114
+ const steps = await store.jobs.list({ kind: 'step' });
115
+ expect(steps.map((job) => job.id).sort()).toEqual(['d1:deposit:alice', 'd1:deposit:bob']);
116
+ expect(steps.every((job) => job.state === 'queued')).toBe(true);
117
+ expect((await store.jobs.get('d1'))?.state).toBe('done');
118
+ });
119
+ it('leaves an existing step job alone when a delivery is completed again', async () => {
120
+ const store = await createStore();
121
+ await seedSteps(store, 'd1', [step('d1', 'alice')]);
122
+ await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
123
+ // A delivery that lapsed and is completed again by another worker.
124
+ await store.deliveries.accept(delivery('d2'), T0);
125
+ await store.jobs.claimNext({ worker: 'w2', leaseMs: LEASE, now: T0 });
126
+ await store.jobs.completeDelivery('d2', 'w2', [{ ...step('d1', 'alice'), request: { ...step('d1', 'alice').request, args: { amount: '9' } } }], T0);
127
+ const job = (await store.jobs.get('d1:deposit:alice'));
128
+ expect(job.state).toBe('running');
129
+ expect(job.request.args).toEqual({ amount: '1' });
130
+ });
131
+ it('runs at most one step job per wallet', async () => {
132
+ const store = await createStore();
133
+ await seedSteps(store, 'd1', [step('d1', 'alice'), step('d1', 'alice', 'withdraw'), step('d1', 'bob')]);
134
+ const first = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
135
+ const second = await store.jobs.claimNext({ worker: 'w2', leaseMs: LEASE, now: T0 });
136
+ const third = await store.jobs.claimNext({ worker: 'w3', leaseMs: LEASE, now: T0 });
137
+ expect(first?.id).toBe('d1:deposit:alice');
138
+ expect(second?.id).toBe('d1:deposit:bob');
139
+ expect(third).toBeNull();
140
+ await store.jobs.transition(first.id, { worker: 'w1', from: 'running', to: 'completed', now: T0 + 1 });
141
+ expect((await store.jobs.claimNext({ worker: 'w3', leaseMs: LEASE, now: T0 + 2 }))?.id).toBe('d1:withdraw:alice');
142
+ });
143
+ it('never lets concurrent claims start two jobs of one wallet', async () => {
144
+ const store = await createStore();
145
+ await seedSteps(store, 'd1', Array.from({ length: 6 }, (_, index) => step('d1', 'alice', `step${index}`)));
146
+ const claims = await Promise.all(Array.from({ length: 6 }, (_, index) => store.jobs.claimNext({ worker: `w${index}`, leaseMs: LEASE, now: T0 })));
147
+ expect(claims.filter((job) => job !== null).length).toBe(1);
148
+ });
149
+ it('keeps the wallet locked through signed, submitted and submitted_unknown', async () => {
150
+ const store = await createStore();
151
+ await seedSteps(store, 'd1', [step('d1', 'alice'), step('d1', 'alice', 'withdraw')]);
152
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
153
+ let from = 'running';
154
+ for (const to of ['signed', 'submitted', 'submitted_unknown']) {
155
+ expect(await store.jobs.transition(job.id, { worker: 'w1', from, to, now: T0 + 1, keepLease: { until: T0 + LEASE } })).toBe(true);
156
+ from = to;
157
+ }
158
+ // Released and parked for a later reconcile.
159
+ expect(await store.jobs.transition(job.id, {
160
+ worker: 'w1',
161
+ from,
162
+ to: from,
163
+ now: T0 + 2,
164
+ notBefore: T0 + 60_000,
165
+ })).toBe(true);
166
+ expect(await store.jobs.claimNext({ worker: 'w2', leaseMs: LEASE, now: T0 + 3 })).toBeNull();
167
+ const again = await store.jobs.claimNext({ worker: 'w2', leaseMs: LEASE, now: T0 + 60_000 });
168
+ expect(again?.id).toBe(job.id);
169
+ expect(again?.state).toBe('submitted_unknown');
170
+ });
171
+ it('frees the wallet when a job goes back to the queue', async () => {
172
+ const store = await createStore();
173
+ await seedSteps(store, 'd1', [step('d1', 'alice'), step('d1', 'alice', 'withdraw')]);
174
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
175
+ await store.jobs.transition(job.id, {
176
+ worker: 'w1',
177
+ from: 'running',
178
+ to: 'queued',
179
+ now: T0 + 1,
180
+ notBefore: T0 + 10_000,
181
+ attempts: 1,
182
+ });
183
+ const next = await store.jobs.claimNext({ worker: 'w2', leaseMs: LEASE, now: T0 + 2 });
184
+ expect(next?.id).toBe('d1:withdraw:alice');
185
+ expect((await store.jobs.get(job.id))?.attempts).toBe(1);
186
+ });
187
+ it('skips jobs before their notBefore time', async () => {
188
+ const store = await createStore();
189
+ await store.deliveries.accept(delivery('d1'), T0);
190
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
191
+ await store.jobs.transition(job.id, { worker: 'w1', from: 'running', to: 'queued', now: T0, notBefore: T0 + 5_000 });
192
+ expect(await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 + 4_999 })).toBeNull();
193
+ expect((await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 + 5_000 }))?.id).toBe('d1');
194
+ });
195
+ it('reports when a wallet last completed a step', async () => {
196
+ const store = await createStore();
197
+ await seedSteps(store, 'd1', [step('d1', 'alice')]);
198
+ const query = { wallet: 'alice', deploymentId: 'dep-1', step: 'deposit' };
199
+ expect(await store.jobs.lastCompleted(query)).toBeNull();
200
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
201
+ await store.jobs.transition(job.id, { worker: 'w1', from: 'running', to: 'completed', now: T0 + 500 });
202
+ expect(await store.jobs.lastCompleted(query)).toBe(T0 + 500);
203
+ expect(await store.jobs.lastCompleted({ ...query, step: 'withdraw' })).toBeNull();
204
+ });
205
+ it('stores, finds and revokes consent grants', async () => {
206
+ const store = await createStore();
207
+ const grant = grantFor('alice');
208
+ await store.consent.put(grant);
209
+ await store.consent.put({ ...grant, instanceId: 'inst-2', steps: ['claim'] });
210
+ const query = { wallet: 'alice', deploymentId: 'dep-1', step: 'deposit', instanceId: 'inst-1', now: T0 };
211
+ expect((await store.consent.find(query))?.steps).toEqual(['deposit', 'withdraw']);
212
+ expect(await store.consent.find({ ...query, step: 'claim' })).toBeNull();
213
+ expect((await store.consent.find({ ...query, step: 'claim', instanceId: 'inst-2' }))?.instanceId).toBe('inst-2');
214
+ expect(await store.consent.find({ ...query, now: T0 + 1000 })).toBeNull();
215
+ expect(await store.consent.find({ ...query, wallet: 'bob' })).toBeNull();
216
+ expect(await store.consent.revoke({ wallet: 'alice', deploymentId: 'dep-1', steps: ['deposit'], now: T0 + 1 })).toBe(1);
217
+ expect(await store.consent.find(query)).toBeNull();
218
+ expect(await store.consent.find({ ...query, step: 'withdraw' })).not.toBeNull();
219
+ expect(await store.consent.revoke({ wallet: 'alice', deploymentId: 'dep-1', now: T0 + 2 })).toBe(2);
220
+ expect(await store.consent.find({ ...query, step: 'withdraw' })).toBeNull();
221
+ expect((await store.consent.list({ wallet: 'alice' })).length).toBe(2);
222
+ });
223
+ it('keeps every field of a grant and replaces it per deployment and instance', async () => {
224
+ const store = await createStore();
225
+ const grant = grantFor('alice');
226
+ await store.consent.put(grant);
227
+ expect(await store.consent.list({ wallet: 'alice' })).toEqual([grant]);
228
+ const raised = grantFor('alice', { limits: { perExecution: { SOL: '20000' }, perWindow: {} } });
229
+ await store.consent.put(raised);
230
+ expect(await store.consent.list({ wallet: 'alice' })).toEqual([raised]);
231
+ });
232
+ it('prefers the instance grant and revokes by instance', async () => {
233
+ const store = await createStore();
234
+ await store.consent.put(grantFor('alice'));
235
+ await store.consent.put(grantFor('alice', { instanceId: 'inst-1', params: { scoped: true } }));
236
+ const query = { wallet: 'alice', deploymentId: 'dep-1', step: 'deposit', instanceId: 'inst-1', now: T0 };
237
+ expect((await store.consent.find(query))?.params).toEqual({ scoped: true });
238
+ expect(await store.consent.revoke({ wallet: 'alice', deploymentId: 'dep-1', instanceId: 'inst-1', now: T0 + 1 })).toBe(1);
239
+ expect((await store.consent.find(query))?.instanceId).toBeNull();
240
+ });
241
+ it('lists the active grants of a deployment for fan-out', async () => {
242
+ const store = await createStore();
243
+ await store.consent.put(grantFor('alice'));
244
+ await store.consent.put(grantFor('bob', { steps: ['claim'] }));
245
+ await store.consent.put(grantFor('carol', { expiresAt: T0 }));
246
+ await store.consent.put(grantFor('dave', { revokedAt: T0 }));
247
+ await store.consent.put(grantFor('erin', { deploymentId: 'dep-2' }));
248
+ const wallets = async (step) => (await store.consent.active({ deploymentId: 'dep-1', ...(step ? { step } : {}), now: T0 }))
249
+ .map((grant) => grant.wallet)
250
+ .sort();
251
+ expect(await wallets()).toEqual(['alice', 'bob']);
252
+ expect(await wallets('deposit')).toEqual(['alice']);
253
+ });
254
+ it('uses an issued nonce once, before it expires', async () => {
255
+ const store = await createStore();
256
+ expect(await store.consent.useNonce('never-issued', T0)).toBe(false);
257
+ await store.consent.issueNonce('n1', T0 + 100);
258
+ await store.consent.issueNonce('n2', T0 + 100);
259
+ const uses = await Promise.all([store.consent.useNonce('n1', T0), store.consent.useNonce('n1', T0)]);
260
+ expect(uses.filter(Boolean).length).toBe(1);
261
+ expect(await store.consent.useNonce('n1', T0 + 1)).toBe(false);
262
+ expect(await store.consent.useNonce('n2', T0 + 100)).toBe(false);
263
+ });
264
+ it('writes and voids ledger entries with the transition they belong to', async () => {
265
+ const store = await createStore();
266
+ await seedSteps(store, 'd1', [step('d1', 'alice')]);
267
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
268
+ const spent = (since, asset = 'SOL') => store.ledger.spent({ wallet: 'alice', deploymentId: 'dep-1', asset, since });
269
+ const record = { record: [{ wallet: 'alice', deploymentId: 'dep-1', asset: 'SOL', amount: '5000' }] };
270
+ // A transition that fails writes nothing.
271
+ expect(await store.jobs.transition(job.id, { worker: 'w2', from: 'running', to: 'signed', now: T0 + 10, ledger: record })).toBe(false);
272
+ expect(await spent(T0)).toBe(0n);
273
+ expect(await store.jobs.transition(job.id, {
274
+ worker: 'w1',
275
+ from: 'running',
276
+ to: 'signed',
277
+ now: T0 + 10,
278
+ keepLease: { until: T0 + LEASE },
279
+ ledger: record,
280
+ })).toBe(true);
281
+ expect(await spent(T0)).toBe(5000n);
282
+ expect(await spent(T0 + 11)).toBe(0n);
283
+ expect(await spent(T0, 'other')).toBe(0n);
284
+ const [entry] = await store.ledger.list({ wallet: 'alice' });
285
+ expect(entry).toEqual({
286
+ jobId: job.id,
287
+ wallet: 'alice',
288
+ deploymentId: 'dep-1',
289
+ asset: 'SOL',
290
+ amount: '5000',
291
+ recordedAt: T0 + 10,
292
+ voidedAt: null,
293
+ });
294
+ expect(await store.jobs.transition(job.id, { worker: 'w1', from: 'signed', to: 'expired', now: T0 + 20, ledger: { void: true } })).toBe(true);
295
+ expect(await spent(T0)).toBe(0n);
296
+ expect((await store.ledger.list({ wallet: 'alice' }))[0].voidedAt).toBe(T0 + 20);
297
+ });
298
+ it('advances view-source state by compare-and-set', async () => {
299
+ const store = await createStore();
300
+ const advance = (expectedVersion, hash, deliver = false) => store.sources.advance({
301
+ source: 'rates',
302
+ key: 'all',
303
+ expectedVersion,
304
+ next: { hash, value: { best: hash }, pending: null },
305
+ now: T0,
306
+ ...(deliver ? { deliver: { name: 'rates', payload: { best: hash } } } : {}),
307
+ });
308
+ expect(await store.sources.get('rates', 'all')).toBeNull();
309
+ const first = await advance(null, 'a', true);
310
+ expect(first).toEqual({
311
+ source: 'rates',
312
+ key: 'all',
313
+ hash: 'a',
314
+ value: { best: 'a' },
315
+ generation: 1,
316
+ pending: null,
317
+ observed: null,
318
+ version: 1,
319
+ updatedAt: T0,
320
+ });
321
+ expect(await advance(null, 'b')).toBeNull();
322
+ // The same stable hash keeps the generation; a new one moves it on.
323
+ expect((await advance(1, 'a'))?.generation).toBe(1);
324
+ expect((await advance(2, 'b', true))?.generation).toBe(2);
325
+ expect((await advance(3, 'a', true))?.generation).toBe(3);
326
+ const ids = (await store.jobs.list({ kind: 'delivery' })).map((job) => job.id);
327
+ expect(ids).toEqual(['view:rates:all:1', 'view:rates:all:2', 'view:rates:all:3']);
328
+ const [job] = await store.jobs.list({ kind: 'delivery' });
329
+ expect(job.kind === 'delivery' && job.delivery).toEqual({
330
+ id: 'view:rates:all:1',
331
+ name: 'rates',
332
+ source: 'view',
333
+ payload: { best: 'a' },
334
+ receivedAt: T0,
335
+ });
336
+ });
337
+ it('gives different sources and keys different delivery ids', async () => {
338
+ const store = await createStore();
339
+ const deliver = (source, key) => store.sources.advance({
340
+ source,
341
+ key,
342
+ expectedVersion: null,
343
+ next: { hash: 'a', value: 1, pending: null },
344
+ deliver: { name: source, payload: key },
345
+ now: T0,
346
+ });
347
+ await deliver('rates:wallet', 'alice');
348
+ await deliver('rates', 'wallet:alice');
349
+ expect((await store.jobs.list({ kind: 'delivery' })).length).toBe(2);
350
+ });
351
+ it('lets one of several concurrent writers advance a source key', async () => {
352
+ const store = await createStore();
353
+ await store.sources.advance({ source: 's', key: 'k', expectedVersion: null, next: { hash: 'a', value: 1, pending: null }, now: T0 });
354
+ const results = await Promise.all(['b', 'c', 'd', 'e'].map((hash) => store.sources.advance({
355
+ source: 's',
356
+ key: 'k',
357
+ expectedVersion: 1,
358
+ next: { hash, value: hash, pending: null },
359
+ deliver: { name: 's', payload: hash },
360
+ now: T0,
361
+ })));
362
+ expect(results.filter((result) => result !== null).length).toBe(1);
363
+ expect((await store.jobs.list({ kind: 'delivery' })).length).toBe(1);
364
+ });
365
+ it('keeps a pending value and source cursors', async () => {
366
+ const store = await createStore();
367
+ const pending = { hash: 'b', value: 'B', since: T0 + 5 };
368
+ await store.sources.advance({ source: 's', key: 'k', expectedVersion: null, next: { hash: '', value: null, pending }, now: T0 });
369
+ expect((await store.sources.get('s', 'k'))?.pending).toEqual(pending);
370
+ expect(await store.sources.cursor('tape')).toBeNull();
371
+ await store.sources.putCursor('tape', '1:4', T0);
372
+ await store.sources.putCursor('tape', '1:9', T0);
373
+ expect(await store.sources.cursor('tape')).toBe('1:9');
374
+ // A slow replica never moves the cursor back within an epoch.
375
+ await store.sources.putCursor('tape', '1:5', T0);
376
+ expect(await store.sources.cursor('tape')).toBe('1:9');
377
+ await store.sources.putCursor('tape', '1:10', T0);
378
+ expect(await store.sources.cursor('tape')).toBe('1:10');
379
+ // A new epoch is a new tape lifetime: it always moves on.
380
+ await store.sources.putCursor('tape', '2:0', T0);
381
+ expect(await store.sources.cursor('tape')).toBe('2:0');
382
+ // Real epochs are UUIDs; offsets compare within one, and a new epoch moves on.
383
+ const epoch = '0f8c2b31-6a4e-4f0b-9a77-1d2c3e4f5a6b';
384
+ await store.sources.putCursor('uuid-tape', `${epoch}:4210`, T0);
385
+ await store.sources.putCursor('uuid-tape', `${epoch}:4209`, T0);
386
+ expect(await store.sources.cursor('uuid-tape')).toBe(`${epoch}:4210`);
387
+ await store.sources.putCursor('uuid-tape', `${epoch}:4300`, T0);
388
+ await store.sources.putCursor('uuid-tape', '7d1e0b2a-0000-4000-8000-000000000000:0', T0);
389
+ expect(await store.sources.cursor('uuid-tape')).toBe('7d1e0b2a-0000-4000-8000-000000000000:0');
390
+ });
391
+ it('holds a source lease for one holder until it lapses or is released', async () => {
392
+ const store = await createStore();
393
+ expect(await store.sources.acquireLease('s', 'w1', T0 + 100, T0)).toBe(true);
394
+ expect(await store.sources.acquireLease('s', 'w2', T0 + 100, T0 + 50)).toBe(false);
395
+ expect(await store.sources.acquireLease('s', 'w1', T0 + 200, T0 + 50)).toBe(true);
396
+ expect(await store.sources.acquireLease('s', 'w2', T0 + 300, T0 + 150)).toBe(false);
397
+ expect(await store.sources.acquireLease('s', 'w2', T0 + 300, T0 + 201)).toBe(true);
398
+ await store.sources.releaseLease('s', 'w1');
399
+ expect(await store.sources.acquireLease('s', 'w1', T0 + 400, T0 + 202)).toBe(false);
400
+ await store.sources.releaseLease('s', 'w2');
401
+ expect(await store.sources.acquireLease('s', 'w1', T0 + 400, T0 + 203)).toBe(true);
402
+ });
403
+ it('keeps the ledger entries of the assets a void keeps', async () => {
404
+ const store = await createStore();
405
+ await seedSteps(store, 'd1', [step('d1', 'alice')]);
406
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
407
+ await store.jobs.transition(job.id, {
408
+ worker: 'w1',
409
+ from: 'running',
410
+ to: 'signed',
411
+ now: T0,
412
+ keepLease: { until: T0 + LEASE },
413
+ ledger: {
414
+ record: [
415
+ { wallet: 'alice', deploymentId: 'dep-1', asset: 'SOL', amount: '5000' },
416
+ { wallet: 'alice', deploymentId: 'dep-1', asset: 'mint', amount: '7' },
417
+ ],
418
+ },
419
+ });
420
+ await store.jobs.transition(job.id, {
421
+ worker: 'w1',
422
+ from: 'signed',
423
+ to: 'chain_failed',
424
+ now: T0 + 1,
425
+ ledger: { void: true, keepAssets: ['SOL'] },
426
+ });
427
+ const spent = (asset) => store.ledger.spent({ wallet: 'alice', deploymentId: 'dep-1', asset, since: 0 });
428
+ expect(await spent('SOL')).toBe(5000n);
429
+ expect(await spent('mint')).toBe(0n);
430
+ });
431
+ it('belongs to one deployment', async () => {
432
+ const store = await createStore();
433
+ await store.bindDeployment('dep-1');
434
+ await store.bindDeployment('dep-1');
435
+ let refused = false;
436
+ try {
437
+ await store.bindDeployment('dep-2');
438
+ }
439
+ catch {
440
+ refused = true;
441
+ }
442
+ expect(refused).toBe(true);
443
+ });
444
+ it('treats a pruned delivery id whose job remains as a duplicate', async () => {
445
+ const store = await createStore();
446
+ await store.deliveries.accept(delivery('d1'), T0);
447
+ expect(await store.deliveries.prune(T0 + 1)).toBe(1);
448
+ expect(await store.deliveries.accept(delivery('d1'), T0 + 2)).toBe(false);
449
+ expect((await store.jobs.list({ kind: 'delivery' })).length).toBe(1);
450
+ });
451
+ it('prunes old deliveries and finished jobs only', async () => {
452
+ const store = await createStore();
453
+ await seedSteps(store, 'd1', [step('d1', 'alice'), step('d1', 'bob')]);
454
+ const job = await store.jobs.claimNext({ worker: 'w1', leaseMs: LEASE, now: T0 });
455
+ await store.jobs.transition(job.id, { worker: 'w1', from: 'running', to: 'completed', now: T0 + 1 });
456
+ expect(await store.jobs.prune(T0 + 10)).toBe(2); // the delivery job and one finished step job
457
+ expect((await store.jobs.list()).map((entry) => entry.id)).toEqual(['d1:deposit:bob']);
458
+ expect(await store.deliveries.prune(T0 + 10)).toBe(1);
459
+ expect(await store.deliveries.accept(delivery('d1'), T0 + 20)).toBe(true);
460
+ });
461
+ });
462
+ }
463
+
464
+ export { runStoreConformance };
465
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sources":["../src/store/conformance.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}