@substrat-run/contract-tests 0.148.0 → 0.149.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 +23 -0
  38. package/dist/orphan-sweep-suite.d.ts.map +1 -0
  39. package/dist/orphan-sweep-suite.js +411 -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 +291 -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,411 @@
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_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
+ /** A pass with the host's clock at `now`, put back to the wall clock afterwards. */
74
+ const sweep = 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
+ });
83
+ }
84
+ finally {
85
+ fixture.clockAhead(0);
86
+ }
87
+ };
88
+ /** Plant an object no row names, minted at `ms`. */
89
+ const plant = async (ms, scope = s1) => {
90
+ const id = idAt(ms);
91
+ await store.put(attachmentBlobKey(scope, id), bytes('orphan'), { contentType: 'text/plain' });
92
+ return id;
93
+ };
94
+ const present = async (key) => (await store.get(key)) !== null;
95
+ /** A scope of its own: a restore fences the scope it lands in, which would hold later cases. */
96
+ const freshScope = async () => {
97
+ const id = scopeId.parse(ulid());
98
+ await host.provisionScope(staff, { tenantId: t1, scopeId: id, vertical: 'osw-vertical' });
99
+ await host.admin.activateScope(staff, t1, id);
100
+ return id;
101
+ };
102
+ beforeAll(async () => {
103
+ fixture = await makeFixture();
104
+ host = fixture.host;
105
+ host.registerModule(uploadLinkMod);
106
+ await host.admin.createTenant(staff, { id: t1, slug: `osw-${t1.toLowerCase()}`, name: 'Orphan sweep' });
107
+ await host.admin.grantEntitlement(staff, t1, 'upl');
108
+ await host.provisionScope(staff, { tenantId: t1, scopeId: s1, vertical: 'osw-vertical' });
109
+ await host.admin.activateScope(staff, t1, s1);
110
+ await host.provisionScope(staff, { tenantId: t1, scopeId: s2, vertical: 'osw-vertical' });
111
+ await host.admin.activateScope(staff, t1, s2);
112
+ await host.provisionBlobStore(staff, { tenantId: t1, vertical: 'osw-vertical', binding: 'ATTACHMENTS' });
113
+ await host.admin.defineRole(staff, t1, { key: 'owner', permissions: [UPL_READ, UPL_WRITE], source: 'vertical' });
114
+ await host.admin.assignRole(staff, { principalId: alice, roleKey: 'owner', node: { tenantId: t1, scopeId: null } });
115
+ await host.admin.createTenant(staff, { id: t2, slug: `osw-${t2.toLowerCase()}`, name: 'Orphan sweep, elsewhere' });
116
+ // Opening the attachment surface opens the tenant's store, which a fixture may need first.
117
+ await files(s1);
118
+ store = await fixture.blobs(t1);
119
+ });
120
+ afterAll(async () => {
121
+ fixture.afterPut(null);
122
+ await fixture.cleanup();
123
+ });
124
+ it('deletes an aged object no row names, and keeps the committed file, the young object and every foreign key', async () => {
125
+ const doc = udoc();
126
+ const kept = await upload(doc, 'committed');
127
+ const now = Date.now();
128
+ const orphan = await plant(now);
129
+ const young = await plant(now + ORPHAN_SWEEP_GRACE_MS + DAY / 2);
130
+ const foreign = [
131
+ attachmentBlobKey(s2, idAt(now)), // another scope of the tenant
132
+ `scope/${s1}/exports/${idAt(now)}`, // another feature's key, same scope
133
+ `scope/${s1}/att/not-a-ulid`,
134
+ `scope/${s1}/att/${idAt(now)}/nested`,
135
+ `elsewhere/${idAt(now)}`,
136
+ ];
137
+ for (const key of foreign)
138
+ await store.put(key, bytes('not mine'));
139
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
140
+ expect(report).toMatchObject({ deleted: 1, orphans: 1, dryRun: false });
141
+ expect(report.keys).toEqual([attachmentBlobKey(s1, orphan)]);
142
+ expect(await present(attachmentBlobKey(s1, orphan))).toBe(false);
143
+ expect(await present(attachmentBlobKey(s1, young))).toBe(true);
144
+ for (const key of foreign)
145
+ expect(await present(key)).toBe(true);
146
+ const opened = await (await files(s1)).open(kept.id);
147
+ expect(text(opened.body)).toBe('committed');
148
+ // Idempotent: a second pass over the same state deletes nothing more.
149
+ const again = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
150
+ expect(again.deleted).toBe(0);
151
+ await store.delete(attachmentBlobKey(s1, young));
152
+ for (const key of foreign)
153
+ await store.delete(key);
154
+ });
155
+ it("records a pass on the admin log as `sweepOrphanAttachments`, with the actor, the scope and the pass's counts", async () => {
156
+ const keys = [attachmentBlobKey(s1, idAt(Date.now()))];
157
+ await host.admin.recordOrphanSweep(staff, { tenantId: t1, scopeId: s1, dryRun: true, listed: 3, candidates: 2, orphans: 1, deleted: 0, keys });
158
+ const [row] = await host.admin.auditLog(staff, { tenantId: t1, scopeId: s1, action: 'sweepOrphanAttachments' });
159
+ expect(row).toMatchObject({
160
+ action: 'sweepOrphanAttachments',
161
+ actor: staff,
162
+ tenantId: t1,
163
+ scopeId: s1,
164
+ after: { dryRun: true, listed: 3, candidates: 2, orphans: 1, deleted: 0, keys },
165
+ });
166
+ await expect(host.admin.recordOrphanSweep(staff, { tenantId: t1, scopeId: s1, dryRun: true, listed: -1, candidates: 0, orphans: 0, deleted: 0, keys: [] })).rejects.toThrow();
167
+ });
168
+ it('a dry run deletes nothing and condemns nothing, and names what a pass would delete', async () => {
169
+ const now = Date.now();
170
+ const orphan = await plant(now);
171
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { dryRun: true });
172
+ expect(report).toMatchObject({ dryRun: true, deleted: 0 });
173
+ expect(report.keys).toContain(attachmentBlobKey(s1, orphan));
174
+ expect(await present(attachmentBlobKey(s1, orphan))).toBe(true);
175
+ // Nothing was condemned: a dump that names the id still loads (the tombstone would refuse it).
176
+ const real = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
177
+ expect(real.keys).toContain(attachmentBlobKey(s1, orphan));
178
+ });
179
+ describe('guard 1, the tombstone: an upload racing a pass never commits without its bytes', () => {
180
+ it('a pass that condemns an in-flight object refuses the row, and the upload fails', async () => {
181
+ const doc = udoc();
182
+ let release;
183
+ const held = new Promise((r) => (release = r));
184
+ let landed;
185
+ const putLanded = new Promise((r) => (landed = r));
186
+ fixture.afterPut(async (key) => {
187
+ if (!key.startsWith(`scope/${s1}/att/`))
188
+ return;
189
+ fixture.afterPut(null);
190
+ landed(key);
191
+ await held;
192
+ });
193
+ const uploading = refusal(upload(doc, 'in flight'));
194
+ const key = await putLanded;
195
+ // A clock far enough ahead that the age floor does not protect it: only the tombstone does.
196
+ const report = await sweep(Date.now() + ORPHAN_SWEEP_GRACE_MS + DAY);
197
+ expect(report.keys).toContain(key);
198
+ expect(await present(key)).toBe(false);
199
+ release();
200
+ const err = await uploading;
201
+ expect(errorCodeOf(err)).toBe('conflict');
202
+ expect(reasonOf(err)).toBe(ATTACHMENT_CONDEMNED);
203
+ // The property: no row names bytes that are gone.
204
+ expect(await (await files(s1)).list(doc)).toEqual([]);
205
+ });
206
+ it('a dump load that would bring back a row for a condemned id is refused, and leaves the scope as it was', async () => {
207
+ const s4 = await freshScope();
208
+ const doc = udoc();
209
+ const record = await upload(doc, 'template', s4);
210
+ const now = Date.now();
211
+ const orphan = await plant(now, s4);
212
+ const swept = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s4 });
213
+ expect(swept.keys).toContain(attachmentBlobKey(s4, orphan));
214
+ // A dump of this scope, with a row for the condemned id written in beside the real one.
215
+ const dump = await host.admin.exportScope(staff, t1, s4);
216
+ const table = dump.tables.find((t) => t.name === '_substrat_attachments');
217
+ const row = table.rows.find((r) => r[table.columns.indexOf('id')] === record.id);
218
+ const forged = [...row];
219
+ forged[table.columns.indexOf('id')] = orphan;
220
+ table.rows.push(forged);
221
+ const err = await refusal(host.restoreScope(staff, t1, s4, dump));
222
+ // The admin restore's refusal reaches the caller as its message on the hosted adapter (a
223
+ // throw over the DO's RPC keeps little else), so the words are what is held here.
224
+ expect(err).toBeInstanceOf(Error);
225
+ expect(err.message).toContain('orphan sweep condemned');
226
+ expect(err.message).toContain(orphan);
227
+ expect((await (await files(s4)).list(doc)).map((r) => r.id)).toEqual([record.id]);
228
+ // The positive twin: the same dump without the forged row loads.
229
+ table.rows.pop();
230
+ await host.restoreScope(staff, t1, s4, dump);
231
+ expect((await (await files(s4)).list(doc)).map((r) => r.id)).toEqual([record.id]);
232
+ });
233
+ });
234
+ describe('guard 2, the age floor: an in-flight upload is never condemned', () => {
235
+ it('a pass whose clock leaves the object young does not touch it, and the upload commits with its bytes', async () => {
236
+ const doc = udoc();
237
+ let release;
238
+ const held = new Promise((r) => (release = r));
239
+ let landed;
240
+ const putLanded = new Promise((r) => (landed = r));
241
+ fixture.afterPut(async (key) => {
242
+ if (!key.startsWith(`scope/${s1}/att/`))
243
+ return;
244
+ fixture.afterPut(null);
245
+ landed(key);
246
+ await held;
247
+ });
248
+ const uploading = upload(doc, 'young and in flight');
249
+ const key = await putLanded;
250
+ const report = await sweep(Date.now() + ORPHAN_SWEEP_GRACE_MS - DAY);
251
+ expect(report.keys).not.toContain(key);
252
+ release();
253
+ const record = await uploading;
254
+ const opened = await (await files(s1)).open(record.id);
255
+ expect(text(opened.body)).toBe('young and in flight');
256
+ });
257
+ });
258
+ describe('guard 3, the restore fence: a row a restore took away keeps its bytes', () => {
259
+ it('inside the fence nothing is deleted, the row comes back with its bytes, and past it the orphan goes', async () => {
260
+ // A scope of its own, so no fence another case wrote is in play.
261
+ const s3 = await freshScope();
262
+ const before = await host.admin.exportScope(staff, t1, s3);
263
+ const doc = udoc();
264
+ const record = await upload(doc, 'restorable', s3);
265
+ const after = await host.admin.exportScope(staff, t1, s3);
266
+ // The restore takes the row away; its bytes stay, now an orphan to any pass.
267
+ await host.restoreScope(staff, t1, s3, before);
268
+ expect(await (await files(s3)).list(doc)).toEqual([]);
269
+ expect(await present(attachmentSweepFenceKey(s3))).toBe(true);
270
+ const key = attachmentBlobKey(s3, record.id);
271
+ const inside = await sweep(Date.now() + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s3 });
272
+ expect(inside.deleted).toBe(0);
273
+ expect(inside.fencedUntil).toEqual(expect.any(String));
274
+ expect(await present(key)).toBe(true);
275
+ // Undo the restore: the row is back, and so are its bytes.
276
+ await host.restoreScope(staff, t1, s3, after);
277
+ const opened = await (await files(s3)).open(record.id);
278
+ expect(text(opened.body)).toBe('restorable');
279
+ // The positive twin: rewound again, a pass past the fence sweeps the orphan.
280
+ await host.restoreScope(staff, t1, s3, before);
281
+ const past = await sweep(Date.now() + ORPHAN_SWEEP_FENCE_MS + DAY, { scope: s3 });
282
+ expect(past.keys).toEqual([key]);
283
+ expect(await present(key)).toBe(false);
284
+ });
285
+ });
286
+ describe('guard 4, the copy: only the scope itself judges its bytes', () => {
287
+ it('a pass for a tenant the scope was not provisioned for is refused and deletes nothing', async () => {
288
+ const now = Date.now();
289
+ const orphan = await plant(now);
290
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { tenant: t2 }));
291
+ expect(err).toBeInstanceOf(Error);
292
+ expect(['conflict', 'not_found']).toContain(errorCodeOf(err));
293
+ expect(await present(attachmentBlobKey(s1, orphan))).toBe(true);
294
+ await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
295
+ });
296
+ it('a pass asked of a fork is refused and deletes nothing, though every object there is rowless to it', async () => {
297
+ const fork = await host.snapshotScope(staff, t1, s1);
298
+ const now = Date.now();
299
+ const orphan = await plant(now, fork);
300
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: fork }));
301
+ expect(errorCodeOf(err)).toBe('conflict');
302
+ expect(await present(attachmentBlobKey(fork, orphan))).toBe(true);
303
+ // The positive twin: the scope it was copied from sweeps its own orphan.
304
+ const mine = await plant(now);
305
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY);
306
+ expect(report.keys).toContain(attachmentBlobKey(s1, mine));
307
+ });
308
+ });
309
+ describe('only an active scope is judged, and only against the host\'s clock', () => {
310
+ it('a pass cannot be handed a later instant: a caller\'s `now` is not read, and the fence holds', async () => {
311
+ const s5 = await freshScope();
312
+ const before = await host.admin.exportScope(staff, t1, s5);
313
+ const record = await upload(udoc(), 'fenced', s5);
314
+ await host.restoreScope(staff, t1, s5, before);
315
+ const key = attachmentBlobKey(s5, record.id);
316
+ // Past the age floor by the host's clock, and a caller asking for a time past the fence.
317
+ fixture.clockAhead(ORPHAN_SWEEP_GRACE_MS + DAY);
318
+ try {
319
+ const report = await host.sweepOrphanAttachments(t1, s5, {
320
+ copiesSettled: true,
321
+ now: new Date(Date.now() + 400 * DAY).toISOString(),
322
+ });
323
+ expect(report.deleted).toBe(0);
324
+ expect(report.fencedUntil).toEqual(expect.any(String));
325
+ }
326
+ finally {
327
+ fixture.clockAhead(0);
328
+ }
329
+ expect(await present(key)).toBe(true);
330
+ });
331
+ it('an archived scope is refused, and the same scope unarchived sweeps', async () => {
332
+ const s6 = await freshScope();
333
+ const now = Date.now();
334
+ const orphan = await plant(now, s6);
335
+ await host.admin.archiveScope(staff, t1, s6);
336
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s6 }));
337
+ expect(errorCodeOf(err)).toBe('conflict');
338
+ expect(await present(attachmentBlobKey(s6, orphan))).toBe(true);
339
+ await host.admin.unarchiveScope(staff, t1, s6);
340
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s6 });
341
+ expect(report.keys).toEqual([attachmentBlobKey(s6, orphan)]);
342
+ });
343
+ it('a scope of a suspended tenant is refused, and sweeps once the tenant is active again', async () => {
344
+ const tenant = tenantId.parse(ulid());
345
+ await host.admin.createTenant(staff, { id: tenant, slug: `osw-${tenant.toLowerCase()}`, name: 'Suspended' });
346
+ await host.admin.grantEntitlement(staff, tenant, 'upl');
347
+ const s = scopeId.parse(ulid());
348
+ await host.provisionScope(staff, { tenantId: tenant, scopeId: s, vertical: 'osw-vertical' });
349
+ await host.admin.activateScope(staff, tenant, s);
350
+ await host.provisionBlobStore(staff, { tenantId: tenant, vertical: 'osw-vertical', binding: 'ATTACHMENTS' });
351
+ // Opening the attachment surface opens the tenant's store, as in the suite's setup.
352
+ await host.attachments(alice, tenant, s);
353
+ const theirs = await fixture.blobs(tenant);
354
+ const now = Date.now();
355
+ const orphan = idAt(now);
356
+ const key = attachmentBlobKey(s, orphan);
357
+ await theirs.put(key, bytes('orphan'), { contentType: 'text/plain' });
358
+ await host.admin.setTenantStatus(staff, tenant, 'suspended');
359
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { tenant, scope: s }));
360
+ expect(errorCodeOf(err)).toBe('conflict');
361
+ expect((await theirs.get(key)) !== null).toBe(true);
362
+ await host.admin.setTenantStatus(staff, tenant, 'active');
363
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { tenant, scope: s });
364
+ expect(report.keys).toEqual([attachmentBlobKey(s, orphan)]);
365
+ });
366
+ it('a reaped scope is refused, and its committed file keeps its bytes for the backup', async () => {
367
+ const s7 = await freshScope();
368
+ const record = await upload(udoc(), 'backed up', s7);
369
+ await host.admin.archiveScope(staff, t1, s7);
370
+ await host.admin.reapScope(staff, t1, s7, { force: true, backupRef: `/backups/${s7}` });
371
+ const err = await refusal(sweep(Date.now() + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s7 }));
372
+ expect(err).toBeInstanceOf(Error);
373
+ expect(await present(attachmentBlobKey(s7, record.id))).toBe(true);
374
+ });
375
+ });
376
+ describe('a copy of the scope in another script holds the pass until it is settled', () => {
377
+ // Every state but `done`, and a state the ledger does not know yet: settled is an allowlist.
378
+ it.each(['pending', 'eligible', 'kept', 'retained', 'some-future-state'])('a %s copy refuses the pass and deletes nothing', async (state) => {
379
+ const s8 = await freshScope();
380
+ const now = Date.now();
381
+ const orphan = await plant(now, s8);
382
+ await fixture.recordCopy(t1, s8, state);
383
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s8 }));
384
+ expect(errorCodeOf(err)).toBe('conflict');
385
+ expect(err.message).toContain(state);
386
+ expect(await present(attachmentBlobKey(s8, orphan))).toBe(true);
387
+ });
388
+ it('an unsettled copy behind a full page of settled ones still refuses the pass', async () => {
389
+ const s10 = await freshScope();
390
+ const now = Date.now();
391
+ const orphan = await plant(now, s10);
392
+ for (let i = 0; i < 101; i++)
393
+ await fixture.recordCopy(t1, s10, 'done');
394
+ await fixture.recordCopy(t1, s10, 'eligible');
395
+ const err = await refusal(sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s10 }));
396
+ expect(errorCodeOf(err)).toBe('conflict');
397
+ expect(err.message).toContain('eligible');
398
+ expect(await present(attachmentBlobKey(s10, orphan))).toBe(true);
399
+ });
400
+ it.each(['done'])('the twin: a %s copy holds nothing more, and the pass sweeps', async (state) => {
401
+ const s9 = await freshScope();
402
+ const now = Date.now();
403
+ const orphan = await plant(now, s9);
404
+ await fixture.recordCopy(t1, s9, state);
405
+ const report = await sweep(now + ORPHAN_SWEEP_GRACE_MS + DAY, { scope: s9 });
406
+ expect(report.keys).toEqual([attachmentBlobKey(s9, orphan)]);
407
+ });
408
+ });
409
+ });
410
+ }
411
+ //# 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"}