@substrat-run/contract-tests 0.148.0 → 0.150.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 (72) hide show
  1. package/dist/counter-runner.d.ts +3 -3
  2. package/dist/counter-runner.js +4 -4
  3. package/dist/counter-runner.js.map +1 -1
  4. package/dist/directory-restore-suite.d.ts.map +1 -1
  5. package/dist/directory-restore-suite.js +66 -2
  6. package/dist/directory-restore-suite.js.map +1 -1
  7. package/dist/directory-shapes.d.ts +6 -0
  8. package/dist/directory-shapes.d.ts.map +1 -1
  9. package/dist/directory-shapes.js +42 -0
  10. package/dist/directory-shapes.js.map +1 -1
  11. package/dist/entity-state-module.d.ts.map +1 -1
  12. package/dist/entity-state-module.js +3 -0
  13. package/dist/entity-state-module.js.map +1 -1
  14. package/dist/entity-trash-suite.d.ts.map +1 -1
  15. package/dist/entity-trash-suite.js +20 -0
  16. package/dist/entity-trash-suite.js.map +1 -1
  17. package/dist/held-migrations.d.ts +27 -0
  18. package/dist/held-migrations.d.ts.map +1 -0
  19. package/dist/held-migrations.js +39 -0
  20. package/dist/held-migrations.js.map +1 -0
  21. package/dist/index.d.ts +8 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +9 -3
  24. package/dist/index.js.map +1 -1
  25. package/dist/migration-fence-suite.d.ts +3 -0
  26. package/dist/migration-fence-suite.d.ts.map +1 -0
  27. package/dist/migration-fence-suite.js +173 -0
  28. package/dist/migration-fence-suite.js.map +1 -0
  29. package/dist/migration-fence.d.ts +42 -0
  30. package/dist/migration-fence.d.ts.map +1 -0
  31. package/dist/migration-fence.js +66 -0
  32. package/dist/migration-fence.js.map +1 -0
  33. package/dist/modules.d.ts +2 -0
  34. package/dist/modules.d.ts.map +1 -1
  35. package/dist/modules.js +19 -0
  36. package/dist/modules.js.map +1 -1
  37. package/dist/orphan-sweep-suite.d.ts +28 -0
  38. package/dist/orphan-sweep-suite.d.ts.map +1 -0
  39. package/dist/orphan-sweep-suite.js +547 -0
  40. package/dist/orphan-sweep-suite.js.map +1 -0
  41. package/dist/scope-host-suite.d.ts.map +1 -1
  42. package/dist/scope-host-suite.js +357 -20
  43. package/dist/scope-host-suite.js.map +1 -1
  44. package/dist/scope-store-runner-suite.d.ts +7 -7
  45. package/dist/scope-store-runner-suite.d.ts.map +1 -1
  46. package/dist/scope-store-runner-suite.js +7 -7
  47. package/dist/scope-store-runner-suite.js.map +1 -1
  48. package/dist/scope-store-suite.js +11 -11
  49. package/dist/scope-store-suite.js.map +1 -1
  50. package/dist/store-driver-release-suite.d.ts +12 -0
  51. package/dist/store-driver-release-suite.d.ts.map +1 -0
  52. package/dist/store-driver-release-suite.js +561 -0
  53. package/dist/store-driver-release-suite.js.map +1 -0
  54. package/dist/upload-link-module.d.ts +4 -0
  55. package/dist/upload-link-module.d.ts.map +1 -1
  56. package/dist/upload-link-module.js +66 -4
  57. package/dist/upload-link-module.js.map +1 -1
  58. package/dist/upload-link-replay-suite.d.ts +3 -0
  59. package/dist/upload-link-replay-suite.d.ts.map +1 -0
  60. package/dist/upload-link-replay-suite.js +293 -0
  61. package/dist/upload-link-replay-suite.js.map +1 -0
  62. package/dist/upload-link-suite.d.ts.map +1 -1
  63. package/dist/upload-link-suite.js +161 -4
  64. package/dist/upload-link-suite.js.map +1 -1
  65. package/dist/vertical-events-suite.d.ts.map +1 -1
  66. package/dist/vertical-events-suite.js +46 -4
  67. package/dist/vertical-events-suite.js.map +1 -1
  68. package/package.json +3 -3
  69. package/dist/store-kind-release-suite.d.ts +0 -12
  70. package/dist/store-kind-release-suite.d.ts.map +0 -1
  71. package/dist/store-kind-release-suite.js +0 -353
  72. package/dist/store-kind-release-suite.js.map +0 -1
@@ -0,0 +1,547 @@
1
+ /**
2
+ * Contract suite for the orphan-byte sweep (#2314) — `host.sweepOrphanAttachments` over a real
3
+ * scope and a real attachment store, on both adapters.
4
+ *
5
+ * What it pins, in one sentence: **a pass deletes an attachment object only when no row names
6
+ * it, it is older than the grace period and the scope is clear of its restore fence, and a row
7
+ * that commits never loses its bytes — not to a pass racing its upload, not to a pass after a
8
+ * restore took the row away, not to a pass run by a copy of the scope.**
9
+ *
10
+ * Each guard is held by a case where it is the ONLY one that stands between a row and the loss of
11
+ * its bytes, so taking that guard away fails that case:
12
+ *
13
+ * 1. **The tombstone.** An upload is held between its `put` and its row while a pass whose clock
14
+ * makes the object old enough runs: the pass condemns and deletes the object, and the row is
15
+ * then refused (`conflict`, `attachment_condemned`), so the upload fails and nothing commits
16
+ * without its bytes. A dump load that would bring back a row for a condemned id is refused too.
17
+ * 2. **The age floor.** The same held upload, with a pass whose clock leaves the object young: it
18
+ * is never condemned, and the upload commits with its bytes.
19
+ * 3. **The restore fence.** A restore takes a committed row away; a pass inside the fence deletes
20
+ * nothing, and restoring the row back finds its bytes. Past the fence the orphan is swept.
21
+ * 4. **The copy, live.** A pass asked of a fork, or for a tenant the scope was not provisioned for,
22
+ * of an archived or reaped scope, of a suspended tenant's scope, or of a scope with any copy
23
+ * in another script whose ledger state is not `done`, is refused and deletes nothing.
24
+ *
25
+ * And no caller can hand a pass a later instant: a `now` in the request is not read.
26
+ *
27
+ * Plus what every pass must also hold: only this scope's attachment keys are judged (other
28
+ * scopes' keys, other features' keys and malformed keys in the same bucket are untouched), and a
29
+ * dry run deletes and condemns nothing.
30
+ *
31
+ * Time: a pass reads the host's clock, which the fixture sets ahead (`clockAhead`) for the length
32
+ * of one pass, so "eight days later" is the host's clock eight days past the ids the uploads
33
+ * minted. Nothing sleeps.
34
+ */
35
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
36
+ import { errorCodeOf, platformActorId, principalId, scopeId, tenantId, } from '@substrat-run/contracts';
37
+ import { ATTACHMENT_CONDEMNED, ORPHAN_SWEEP_DRY_RUN_WINDOW_MS, ORPHAN_SWEEP_UNLICENSED, ORPHAN_SWEEP_FENCE_MS, ORPHAN_SWEEP_GRACE_MS, attachmentBlobKey, attachmentSweepFenceKey, ulid, } from '@substrat-run/kernel';
38
+ import { UPL_READ, UPL_WRITE, uploadLinkMod } from './upload-link-module.js';
39
+ const DAY = 86_400_000;
40
+ const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
41
+ const bytes = (s) => new TextEncoder().encode(s);
42
+ const text = (b) => new TextDecoder().decode(b);
43
+ /** A ULID minted at `ms`, as an upload at that instant would have minted it. */
44
+ const idAt = (ms) => {
45
+ let t = ms;
46
+ let time = '';
47
+ for (let i = 0; i < 10; i++) {
48
+ time = CROCKFORD[t % 32] + time;
49
+ t = Math.floor(t / 32);
50
+ }
51
+ return time + Array.from({ length: 16 }, () => CROCKFORD[Math.floor(Math.random() * 32)]).join('');
52
+ };
53
+ const refusal = (p) => p.then(() => undefined, (e) => e);
54
+ const reasonOf = (e) => {
55
+ const r = e?.extensions?.reason;
56
+ return typeof r === 'string' ? r : undefined;
57
+ };
58
+ export function orphanSweepContractSuite(adapterName, makeFixture) {
59
+ describe(`orphan attachment sweep: ${adapterName}`, () => {
60
+ let fixture;
61
+ let host;
62
+ let store;
63
+ const t1 = tenantId.parse(ulid());
64
+ const s1 = scopeId.parse(ulid());
65
+ const s2 = scopeId.parse(ulid());
66
+ const t2 = tenantId.parse(ulid());
67
+ const alice = principalId.parse(ulid());
68
+ const staff = platformActorId.parse(ulid());
69
+ let n = 0;
70
+ const udoc = () => ({ entityType: 'udoc', entityId: `doc-${++n}` });
71
+ const files = async (scope) => host.attachments(alice, t1, scope);
72
+ const upload = async (entity, body, scope = s1) => (await files(scope)).upload({ entity, filename: 'a.txt', contentType: 'text/plain', visibility: 'internal', body: bytes(body) });
73
+ /** One pass with the host's clock at `now`, put back to the wall clock afterwards. */
74
+ const pass = async (now, opts = {}) => {
75
+ if (!host.sweepOrphanAttachments)
76
+ throw new Error('host has no sweepOrphanAttachments');
77
+ fixture.clockAhead(now - Date.now());
78
+ try {
79
+ return await host.sweepOrphanAttachments(opts.tenant ?? t1, opts.scope ?? s1, {
80
+ copiesSettled: true,
81
+ ...(opts.dryRun ? { dryRun: true } : {}),
82
+ ...(opts.limit !== undefined ? { limit: opts.limit } : {}),
83
+ });
84
+ }
85
+ finally {
86
+ fixture.clockAhead(0);
87
+ }
88
+ };
89
+ /**
90
+ * A pass at `now`, as the platform's phase runs one: a destructive pass is preceded by the dry
91
+ * run at the same clock that licenses it (#2350), and a dry run that found nothing licenses
92
+ * nothing, so its report is the answer. `pass` is the one pass alone.
93
+ */
94
+ const sweep = async (now, opts = {}) => {
95
+ if (opts.dryRun)
96
+ return pass(now, opts);
97
+ const dry = await pass(now, { ...opts, dryRun: true });
98
+ return dry.keys.length === 0 ? dry : pass(now, opts);
99
+ };
100
+ /** Plant an object no row names, minted at `ms`. */
101
+ const plant = async (ms, scope = s1) => {
102
+ const id = idAt(ms);
103
+ await store.put(attachmentBlobKey(scope, id), bytes('orphan'), { contentType: 'text/plain' });
104
+ return id;
105
+ };
106
+ const present = async (key) => (await store.get(key)) !== null;
107
+ /** A scope of its own: a restore fences the scope it lands in, which would hold later cases. */
108
+ const freshScope = async () => {
109
+ const id = scopeId.parse(ulid());
110
+ await host.provisionScope(staff, { tenantId: t1, scopeId: id, vertical: 'osw-vertical' });
111
+ await host.admin.activateScope(staff, t1, id);
112
+ return id;
113
+ };
114
+ beforeAll(async () => {
115
+ fixture = await makeFixture();
116
+ host = fixture.host;
117
+ host.registerModule(uploadLinkMod);
118
+ await host.admin.createTenant(staff, { id: t1, slug: `osw-${t1.toLowerCase()}`, name: 'Orphan sweep' });
119
+ await host.admin.grantEntitlement(staff, t1, 'upl');
120
+ await host.provisionScope(staff, { tenantId: t1, scopeId: s1, vertical: 'osw-vertical' });
121
+ await host.admin.activateScope(staff, t1, s1);
122
+ await host.provisionScope(staff, { tenantId: t1, scopeId: s2, vertical: 'osw-vertical' });
123
+ await host.admin.activateScope(staff, t1, s2);
124
+ await host.provisionBlobStore(staff, { tenantId: t1, vertical: 'osw-vertical', binding: 'ATTACHMENTS' });
125
+ await host.admin.defineRole(staff, t1, { key: 'owner', permissions: [UPL_READ, UPL_WRITE], source: 'vertical' });
126
+ await host.admin.assignRole(staff, { principalId: alice, roleKey: 'owner', node: { tenantId: t1, scopeId: null } });
127
+ await host.admin.createTenant(staff, { id: t2, slug: `osw-${t2.toLowerCase()}`, name: 'Orphan sweep, elsewhere' });
128
+ // Opening the attachment surface opens the tenant's store, which a fixture may need first.
129
+ await files(s1);
130
+ store = await fixture.blobs(t1);
131
+ });
132
+ afterAll(async () => {
133
+ fixture.afterPut(null);
134
+ await fixture.cleanup();
135
+ });
136
+ it('deletes an aged object no row names, and keeps the committed file, the young object and every foreign key', async () => {
137
+ const doc = udoc();
138
+ const kept = await upload(doc, 'committed');
139
+ const now = Date.now();
140
+ const orphan = await plant(now);
141
+ const young = await plant(now + ORPHAN_SWEEP_GRACE_MS + DAY / 2);
142
+ const foreign = [
143
+ attachmentBlobKey(s2, idAt(now)), // another scope of the tenant
144
+ `scope/${s1}/exports/${idAt(now)}`, // another feature's key, same scope
145
+ `scope/${s1}/att/not-a-ulid`,
146
+ `scope/${s1}/att/${idAt(now)}/nested`,
147
+ `elsewhere/${idAt(now)}`,
148
+ ];
149
+ for (const key of foreign)
150
+ await store.put(key, bytes('not mine'));
151
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
152
+ expect(report).toMatchObject({ deleted: 1, orphans: 1, dryRun: false });
153
+ expect(report.keys).toEqual([attachmentBlobKey(s1, orphan)]);
154
+ expect(await present(attachmentBlobKey(s1, orphan))).toBe(false);
155
+ expect(await present(attachmentBlobKey(s1, young))).toBe(true);
156
+ for (const key of foreign)
157
+ expect(await present(key)).toBe(true);
158
+ const opened = await (await files(s1)).open(kept.id);
159
+ expect(text(opened.body)).toBe('committed');
160
+ // Idempotent: a second pass over the same state deletes nothing more.
161
+ const again = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
162
+ expect(again.deleted).toBe(0);
163
+ await store.delete(attachmentBlobKey(s1, young));
164
+ for (const key of foreign)
165
+ await store.delete(key);
166
+ });
167
+ it("records a pass on the admin log as `sweepOrphanAttachments`, with the actor, the scope and the pass's counts", async () => {
168
+ const keys = [attachmentBlobKey(s1, idAt(Date.now()))];
169
+ await host.admin.recordOrphanSweep(staff, { tenantId: t1, scopeId: s1, dryRun: true, listed: 3, candidates: 2, orphans: 1, deleted: 0, keys });
170
+ const [row] = await host.admin.auditLog(staff, { tenantId: t1, scopeId: s1, action: 'sweepOrphanAttachments' });
171
+ expect(row).toMatchObject({
172
+ action: 'sweepOrphanAttachments',
173
+ actor: staff,
174
+ tenantId: t1,
175
+ scopeId: s1,
176
+ after: { dryRun: true, listed: 3, candidates: 2, orphans: 1, deleted: 0, keys },
177
+ });
178
+ await expect(host.admin.recordOrphanSweep(staff, { tenantId: t1, scopeId: s1, dryRun: true, listed: -1, candidates: 0, orphans: 0, deleted: 0, keys: [] })).rejects.toThrow();
179
+ });
180
+ it('a dry run deletes nothing and condemns nothing, and names what a pass would delete', async () => {
181
+ const now = Date.now();
182
+ const orphan = await plant(now);
183
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { dryRun: true });
184
+ expect(report).toMatchObject({ dryRun: true, deleted: 0 });
185
+ expect(report.keys).toContain(attachmentBlobKey(s1, orphan));
186
+ expect(await present(attachmentBlobKey(s1, orphan))).toBe(true);
187
+ // Nothing was condemned: a dump that names the id still loads (the tombstone would refuse it).
188
+ const real = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
189
+ expect(real.keys).toContain(attachmentBlobKey(s1, orphan));
190
+ });
191
+ describe('guard 1, the tombstone: an upload racing a pass never commits without its bytes', () => {
192
+ it('a pass that condemns an in-flight object refuses the row, and the upload fails', async () => {
193
+ const doc = udoc();
194
+ let release;
195
+ const held = new Promise((r) => (release = r));
196
+ let landed;
197
+ const putLanded = new Promise((r) => (landed = r));
198
+ fixture.afterPut(async (key) => {
199
+ if (!key.startsWith(`scope/${s1}/att/`))
200
+ return;
201
+ fixture.afterPut(null);
202
+ landed(key);
203
+ await held;
204
+ });
205
+ const uploading = refusal(upload(doc, 'in flight'));
206
+ const key = await putLanded;
207
+ // A clock far enough ahead that the age floor does not protect it: only the tombstone does.
208
+ const report = await sweep(Date.now() + ORPHAN_SWEEP_GRACE_MS + DAY);
209
+ expect(report.keys).toContain(key);
210
+ expect(await present(key)).toBe(false);
211
+ release();
212
+ const err = await uploading;
213
+ expect(errorCodeOf(err)).toBe('conflict');
214
+ expect(reasonOf(err)).toBe(ATTACHMENT_CONDEMNED);
215
+ // The property: no row names bytes that are gone.
216
+ expect(await (await files(s1)).list(doc)).toEqual([]);
217
+ });
218
+ it('a dump load that would bring back a row for a condemned id is refused, and leaves the scope as it was', async () => {
219
+ const s4 = await freshScope();
220
+ const doc = udoc();
221
+ const record = await upload(doc, 'template', s4);
222
+ const now = Date.now();
223
+ const orphan = await plant(now, s4);
224
+ const swept = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s4 });
225
+ expect(swept.keys).toContain(attachmentBlobKey(s4, orphan));
226
+ // A dump of this scope, with a row for the condemned id written in beside the real one.
227
+ const dump = await host.admin.exportScope(staff, t1, s4);
228
+ const table = dump.tables.find((t) => t.name === '_substrat_attachments');
229
+ const row = table.rows.find((r) => r[table.columns.indexOf('id')] === record.id);
230
+ const forged = [...row];
231
+ forged[table.columns.indexOf('id')] = orphan;
232
+ table.rows.push(forged);
233
+ const err = await refusal(host.restoreScope(staff, t1, s4, dump));
234
+ // The admin restore's refusal reaches the caller as its message on the hosted adapter (a
235
+ // throw over the DO's RPC keeps little else), so the words are what is held here.
236
+ expect(err).toBeInstanceOf(Error);
237
+ expect(err.message).toContain('orphan sweep condemned');
238
+ expect(err.message).toContain(orphan);
239
+ expect((await (await files(s4)).list(doc)).map((r) => r.id)).toEqual([record.id]);
240
+ // The positive twin: the same dump without the forged row loads.
241
+ table.rows.pop();
242
+ await host.restoreScope(staff, t1, s4, dump);
243
+ expect((await (await files(s4)).list(doc)).map((r) => r.id)).toEqual([record.id]);
244
+ });
245
+ });
246
+ describe('guard 2, the age floor: an in-flight upload is never condemned', () => {
247
+ it('a pass whose clock leaves the object young does not touch it, and the upload commits with its bytes', async () => {
248
+ const doc = udoc();
249
+ let release;
250
+ const held = new Promise((r) => (release = r));
251
+ let landed;
252
+ const putLanded = new Promise((r) => (landed = r));
253
+ fixture.afterPut(async (key) => {
254
+ if (!key.startsWith(`scope/${s1}/att/`))
255
+ return;
256
+ fixture.afterPut(null);
257
+ landed(key);
258
+ await held;
259
+ });
260
+ const uploading = upload(doc, 'young and in flight');
261
+ const key = await putLanded;
262
+ const report = await sweep(Date.now() + ORPHAN_SWEEP_GRACE_MS - DAY);
263
+ expect(report.keys).not.toContain(key);
264
+ release();
265
+ const record = await uploading;
266
+ const opened = await (await files(s1)).open(record.id);
267
+ expect(text(opened.body)).toBe('young and in flight');
268
+ });
269
+ });
270
+ describe('guard 3, the restore fence: a row a restore took away keeps its bytes', () => {
271
+ it('inside the fence nothing is deleted, the row comes back with its bytes, and past it the orphan goes', async () => {
272
+ // A scope of its own, so no fence another case wrote is in play.
273
+ const s3 = await freshScope();
274
+ const before = await host.admin.exportScope(staff, t1, s3);
275
+ const doc = udoc();
276
+ const record = await upload(doc, 'restorable', s3);
277
+ const after = await host.admin.exportScope(staff, t1, s3);
278
+ // The restore takes the row away; its bytes stay, now an orphan to any pass.
279
+ await host.restoreScope(staff, t1, s3, before);
280
+ expect(await (await files(s3)).list(doc)).toEqual([]);
281
+ expect(await present(attachmentSweepFenceKey(s3))).toBe(true);
282
+ const key = attachmentBlobKey(s3, record.id);
283
+ // Inside the fence a dry run lists nothing, so it licenses nothing (#2350), and a
284
+ // destructive pass is refused before it lists anything.
285
+ const inside = await pass(Date.now() + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s3, dryRun: true });
286
+ expect(inside.keys).toEqual([]);
287
+ expect(inside.fencedUntil).toEqual(expect.any(String));
288
+ expect(reasonOf(await refusal(pass(Date.now() + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s3 })))).toBe(ORPHAN_SWEEP_UNLICENSED);
289
+ expect(await present(key)).toBe(true);
290
+ // Undo the restore: the row is back, and so are its bytes.
291
+ await host.restoreScope(staff, t1, s3, after);
292
+ const opened = await (await files(s3)).open(record.id);
293
+ expect(text(opened.body)).toBe('restorable');
294
+ // The positive twin: rewound again, a pass past the fence sweeps the orphan.
295
+ await host.restoreScope(staff, t1, s3, before);
296
+ const past = await sweep(Date.now() + ORPHAN_SWEEP_FENCE_MS + DAY, { scope: s3 });
297
+ expect(past.keys).toEqual([key]);
298
+ expect(await present(key)).toBe(false);
299
+ });
300
+ });
301
+ describe('guard 4, the copy: only the scope itself judges its bytes', () => {
302
+ it('a pass for a tenant the scope was not provisioned for is refused and deletes nothing', async () => {
303
+ const now = Date.now();
304
+ const orphan = await plant(now);
305
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { tenant: t2 }));
306
+ expect(err).toBeInstanceOf(Error);
307
+ expect(['conflict', 'not_found']).toContain(errorCodeOf(err));
308
+ expect(await present(attachmentBlobKey(s1, orphan))).toBe(true);
309
+ await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
310
+ });
311
+ it('a pass asked of a fork is refused and deletes nothing, though every object there is rowless to it', async () => {
312
+ const fork = await host.snapshotScope(staff, t1, s1);
313
+ const now = Date.now();
314
+ const orphan = await plant(now, fork);
315
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: fork }));
316
+ expect(errorCodeOf(err)).toBe('conflict');
317
+ expect(await present(attachmentBlobKey(fork, orphan))).toBe(true);
318
+ // The positive twin: the scope it was copied from sweeps its own orphan.
319
+ const mine = await plant(now);
320
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
321
+ expect(report.keys).toContain(attachmentBlobKey(s1, mine));
322
+ });
323
+ });
324
+ describe('only an active scope is judged, and only against the host\'s clock', () => {
325
+ it('a pass cannot be handed a later instant: a caller\'s `now` is not read, and the fence holds', async () => {
326
+ const s5 = await freshScope();
327
+ const before = await host.admin.exportScope(staff, t1, s5);
328
+ const record = await upload(udoc(), 'fenced', s5);
329
+ await host.restoreScope(staff, t1, s5, before);
330
+ const key = attachmentBlobKey(s5, record.id);
331
+ // Past the age floor by the host's clock, and a caller asking for a time past the fence.
332
+ fixture.clockAhead(ORPHAN_SWEEP_GRACE_MS + DAY);
333
+ try {
334
+ // A dry run, so the fence is what answers: it would list the key past the fence.
335
+ const report = await host.sweepOrphanAttachments(t1, s5, {
336
+ copiesSettled: true,
337
+ dryRun: true,
338
+ now: new Date(Date.now() + 400 * DAY).toISOString(),
339
+ });
340
+ expect(report.keys).toEqual([]);
341
+ expect(report.fencedUntil).toEqual(expect.any(String));
342
+ }
343
+ finally {
344
+ fixture.clockAhead(0);
345
+ }
346
+ expect(await present(key)).toBe(true);
347
+ });
348
+ it('an archived scope is refused, and the same scope unarchived sweeps', async () => {
349
+ const s6 = await freshScope();
350
+ const now = Date.now();
351
+ const orphan = await plant(now, s6);
352
+ await host.admin.archiveScope(staff, t1, s6);
353
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s6 }));
354
+ expect(errorCodeOf(err)).toBe('conflict');
355
+ expect(await present(attachmentBlobKey(s6, orphan))).toBe(true);
356
+ await host.admin.unarchiveScope(staff, t1, s6);
357
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s6 });
358
+ expect(report.keys).toEqual([attachmentBlobKey(s6, orphan)]);
359
+ });
360
+ it('a scope of a suspended tenant is refused, and sweeps once the tenant is active again', async () => {
361
+ const tenant = tenantId.parse(ulid());
362
+ await host.admin.createTenant(staff, { id: tenant, slug: `osw-${tenant.toLowerCase()}`, name: 'Suspended' });
363
+ await host.admin.grantEntitlement(staff, tenant, 'upl');
364
+ const s = scopeId.parse(ulid());
365
+ await host.provisionScope(staff, { tenantId: tenant, scopeId: s, vertical: 'osw-vertical' });
366
+ await host.admin.activateScope(staff, tenant, s);
367
+ await host.provisionBlobStore(staff, { tenantId: tenant, vertical: 'osw-vertical', binding: 'ATTACHMENTS' });
368
+ // Opening the attachment surface opens the tenant's store, as in the suite's setup.
369
+ await host.attachments(alice, tenant, s);
370
+ const theirs = await fixture.blobs(tenant);
371
+ const now = Date.now();
372
+ const orphan = idAt(now);
373
+ const key = attachmentBlobKey(s, orphan);
374
+ await theirs.put(key, bytes('orphan'), { contentType: 'text/plain' });
375
+ await host.admin.setTenantStatus(staff, tenant, 'suspended');
376
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { tenant, scope: s }));
377
+ expect(errorCodeOf(err)).toBe('conflict');
378
+ expect((await theirs.get(key)) !== null).toBe(true);
379
+ await host.admin.setTenantStatus(staff, tenant, 'active');
380
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { tenant, scope: s });
381
+ expect(report.keys).toEqual([attachmentBlobKey(s, orphan)]);
382
+ });
383
+ it('a reaped scope is refused, and its committed file keeps its bytes for the backup', async () => {
384
+ const s7 = await freshScope();
385
+ const record = await upload(udoc(), 'backed up', s7);
386
+ await host.admin.archiveScope(staff, t1, s7);
387
+ await host.admin.reapScope(staff, t1, s7, { force: true, backupRef: `/backups/${s7}` });
388
+ const err = await refusal(sweep(Date.now() + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s7 }));
389
+ expect(err).toBeInstanceOf(Error);
390
+ expect(await present(attachmentBlobKey(s7, record.id))).toBe(true);
391
+ });
392
+ });
393
+ describe('a copy of the scope in another script holds the pass until it is settled', () => {
394
+ // Every state but `done`, and a state the ledger does not know yet: settled is an allowlist.
395
+ it.each(['pending', 'eligible', 'kept', 'retained', 'some-future-state'])('a %s copy refuses the pass and deletes nothing', async (state) => {
396
+ const s8 = await freshScope();
397
+ const now = Date.now();
398
+ const orphan = await plant(now, s8);
399
+ await fixture.recordCopy(t1, s8, state);
400
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s8 }));
401
+ expect(errorCodeOf(err)).toBe('conflict');
402
+ expect(err.message).toContain(state);
403
+ expect(await present(attachmentBlobKey(s8, orphan))).toBe(true);
404
+ });
405
+ it('an unsettled copy behind a full page of settled ones still refuses the pass', async () => {
406
+ const s10 = await freshScope();
407
+ const now = Date.now();
408
+ const orphan = await plant(now, s10);
409
+ for (let i = 0; i < 101; i++)
410
+ await fixture.recordCopy(t1, s10, 'done');
411
+ await fixture.recordCopy(t1, s10, 'eligible');
412
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s10 }));
413
+ expect(errorCodeOf(err)).toBe('conflict');
414
+ expect(err.message).toContain('eligible');
415
+ expect(await present(attachmentBlobKey(s10, orphan))).toBe(true);
416
+ });
417
+ it.each(['done'])('the twin: a %s copy holds nothing more, and the pass sweeps', async (state) => {
418
+ const s9 = await freshScope();
419
+ const now = Date.now();
420
+ const orphan = await plant(now, s9);
421
+ await fixture.recordCopy(t1, s9, state);
422
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s9 });
423
+ expect(report.keys).toEqual([attachmentBlobKey(s9, orphan)]);
424
+ });
425
+ });
426
+ describe("the scope's own dry-run licence (#2350): a destructive pass deletes only what a recent dry run listed", () => {
427
+ const aged = (now) => now + ORPHAN_SWEEP_GRACE_MS + DAY;
428
+ it('a destructive pass with no dry run is refused before it lists anything, and deletes nothing', async () => {
429
+ const s = await freshScope();
430
+ const now = Date.now();
431
+ const orphan = await plant(now, s);
432
+ const err = await refusal(pass(aged(now), { scope: s }));
433
+ expect(errorCodeOf(err)).toBe('conflict');
434
+ expect(reasonOf(err)).toBe(ORPHAN_SWEEP_UNLICENSED);
435
+ expect(await present(attachmentBlobKey(s, orphan))).toBe(true);
436
+ // The positive twin: after a dry run, inside the window, the same pass deletes it.
437
+ expect((await pass(aged(now), { scope: s, dryRun: true })).keys).toEqual([attachmentBlobKey(s, orphan)]);
438
+ const report = await pass(aged(now) + DAY, { scope: s });
439
+ expect(report.keys).toEqual([attachmentBlobKey(s, orphan)]);
440
+ expect(await present(attachmentBlobKey(s, orphan))).toBe(false);
441
+ });
442
+ it('a scope with nothing to condemn is refused all the same, so the refusal does not depend on what is listed', async () => {
443
+ const s = await freshScope();
444
+ expect(reasonOf(await refusal(pass(aged(Date.now()), { scope: s })))).toBe(ORPHAN_SWEEP_UNLICENSED);
445
+ });
446
+ it('a licence past the window is refused, and one at its edge is in force', async () => {
447
+ const s = await freshScope();
448
+ const now = Date.now();
449
+ const orphan = await plant(now, s);
450
+ await pass(aged(now), { scope: s, dryRun: true });
451
+ expect(reasonOf(await refusal(pass(aged(now) + ORPHAN_SWEEP_DRY_RUN_WINDOW_MS + DAY, { scope: s })))).toBe(ORPHAN_SWEEP_UNLICENSED);
452
+ expect(await present(attachmentBlobKey(s, orphan))).toBe(true);
453
+ const edge = await pass(aged(now) + ORPHAN_SWEEP_DRY_RUN_WINDOW_MS - DAY, { scope: s });
454
+ expect(edge.keys).toEqual([attachmentBlobKey(s, orphan)]);
455
+ });
456
+ it('an orphan the dry run did not list is never deleted, though every other guard would let it go', async () => {
457
+ const s = await freshScope();
458
+ const now = Date.now();
459
+ const listed = await plant(now, s);
460
+ await pass(aged(now), { scope: s, dryRun: true });
461
+ // Planted after the dry run, already past the age floor: only the licence holds it.
462
+ const unlisted = await plant(now, s);
463
+ const report = await pass(aged(now) + DAY, { scope: s });
464
+ expect(report.keys).toEqual([attachmentBlobKey(s, listed)]);
465
+ expect(await present(attachmentBlobKey(s, unlisted))).toBe(true);
466
+ // The twin: the next dry run lists it, and the pass after that sweeps it.
467
+ await pass(aged(now) + DAY, { scope: s, dryRun: true });
468
+ expect((await pass(aged(now) + DAY, { scope: s })).keys).toEqual([attachmentBlobKey(s, unlisted)]);
469
+ });
470
+ it('one dry run drains a backlog over consecutive passes, and the emptied licence then refuses', async () => {
471
+ const s = await freshScope();
472
+ const now = Date.now();
473
+ const ids = [];
474
+ for (let i = 0; i < 6; i++)
475
+ ids.push(await plant(now, s));
476
+ ids.sort();
477
+ expect((await pass(aged(now), { scope: s, dryRun: true, limit: 6 })).keys).toHaveLength(6);
478
+ for (let round = 0; round < 3; round++) {
479
+ const report = await pass(aged(now) + DAY, { scope: s, limit: 2 });
480
+ expect(report.keys).toEqual(ids.slice(round * 2, round * 2 + 2).map((id) => attachmentBlobKey(s, id)));
481
+ }
482
+ for (const id of ids)
483
+ expect(await present(attachmentBlobKey(s, id))).toBe(false);
484
+ expect(reasonOf(await refusal(pass(aged(now) + DAY, { scope: s })))).toBe(ORPHAN_SWEEP_UNLICENSED);
485
+ });
486
+ it('a licence whose objects are gone some other way is taken out, so the scope is dry-run again rather than held until it expires', async () => {
487
+ const s = await freshScope();
488
+ const now = Date.now();
489
+ const orphan = await plant(now, s);
490
+ await pass(aged(now), { scope: s, dryRun: true });
491
+ // The listed object disappears without a pass: nothing a pass could delete is left of it.
492
+ await store.delete(attachmentBlobKey(s, orphan));
493
+ const fresh = await plant(now, s);
494
+ const report = await pass(aged(now) + DAY, { scope: s });
495
+ expect(report).toMatchObject({ deleted: 0 });
496
+ expect(report).not.toHaveProperty('consumeFailed');
497
+ // The licence held only that id, so it is empty now: the next destructive pass is refused and
498
+ // the phase dry-runs the scope, which lists the orphan that appeared since.
499
+ expect(reasonOf(await refusal(pass(aged(now) + DAY, { scope: s })))).toBe(ORPHAN_SWEEP_UNLICENSED);
500
+ expect((await pass(aged(now) + DAY, { scope: s, dryRun: true })).keys).toEqual([attachmentBlobKey(s, fresh)]);
501
+ expect((await pass(aged(now) + DAY, { scope: s })).keys).toEqual([attachmentBlobKey(s, fresh)]);
502
+ });
503
+ it('a restore takes the licence away, a forged one in the dump included, so the next destructive pass is refused', async () => {
504
+ const s = await freshScope();
505
+ const now = Date.now();
506
+ const orphan = await plant(now, s);
507
+ await pass(aged(now), { scope: s, dryRun: true });
508
+ const dump = await host.admin.exportScope(staff, t1, s);
509
+ // A dump never carries the licence's rows.
510
+ const table = dump.tables.find((t) => t.name === '_substrat_attachment_sweep_licence');
511
+ expect(table?.rows ?? []).toEqual([]);
512
+ // The restore fences the scope too, so the passes after it run past both the fence and the
513
+ // age floor.
514
+ const later = Date.now() + ORPHAN_SWEEP_FENCE_MS + DAY;
515
+ // A hand-made dump that does, stamped to be in force then, is dropped on load all the same.
516
+ expect(table).toBeDefined();
517
+ const row = table.columns.map(() => null);
518
+ row[table.columns.indexOf('id')] = orphan;
519
+ row[table.columns.indexOf('licensed_at')] = new Date(later).toISOString();
520
+ table.rows.push(row);
521
+ await host.restoreScope(staff, t1, s, dump);
522
+ expect(reasonOf(await refusal(pass(later, { scope: s })))).toBe(ORPHAN_SWEEP_UNLICENSED);
523
+ expect(await present(attachmentBlobKey(s, orphan))).toBe(true);
524
+ // The twin: the dry run it needs, then the delete.
525
+ await pass(later, { scope: s, dryRun: true });
526
+ expect((await pass(later, { scope: s })).keys).toEqual([attachmentBlobKey(s, orphan)]);
527
+ });
528
+ it('a dry run that finds the same orphans again moves no write revision, and one that finds a new one does', async () => {
529
+ // A host that keeps no write revision (the SQLite one) has nothing a carry is fenced on.
530
+ if (!fixture.writeRevision)
531
+ return;
532
+ const s = await freshScope();
533
+ const now = Date.now();
534
+ await plant(now, s);
535
+ await pass(aged(now), { scope: s, dryRun: true });
536
+ const before = await fixture.writeRevision(t1, s);
537
+ await pass(aged(now) + DAY, { scope: s, dryRun: true });
538
+ await pass(aged(now) + 2 * DAY, { scope: s, dryRun: true });
539
+ expect(await fixture.writeRevision(t1, s)).toBe(before);
540
+ await plant(now, s);
541
+ await pass(aged(now) + 2 * DAY, { scope: s, dryRun: true });
542
+ expect(await fixture.writeRevision(t1, s)).not.toBe(before);
543
+ });
544
+ });
545
+ });
546
+ }
547
+ //# sourceMappingURL=orphan-sweep-suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-sweep-suite.js","sourceRoot":"","sources":["../src/orphan-sweep-suite.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scope-host-suite.d.ts","sourceRoot":"","sources":["../src/scope-host-suite.ts"],"names":[],"mappings":"AAEA,OAAO,EAqBL,KAAK,SAAS,EAqBf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAeL,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAa9B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAuCD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa,MACrB,OAAO,CAAC,OAAO,CAAC,QACb,SAAS,YACL,MAAM,KACf,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,iFAAiF;AACjF,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAC5C,IAAI,GAAE,qBAA0B,GAC/B,IAAI,CAu1UN"}
1
+ {"version":3,"file":"scope-host-suite.d.ts","sourceRoot":"","sources":["../src/scope-host-suite.ts"],"names":[],"mappings":"AAEA,OAAO,EAqBL,KAAK,SAAS,EAsBf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAkBL,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAc9B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAuCD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa,MACrB,OAAO,CAAC,OAAO,CAAC,QACb,SAAS,YACL,MAAM,KACf,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,iFAAiF;AACjF,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAC5C,IAAI,GAAE,qBAA0B,GAC/B,IAAI,CA8rVN"}