@interop/wallet-core 0.101.0 → 0.101.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.
package/README.md CHANGED
@@ -36,8 +36,8 @@ The subpaths:
36
36
 
37
37
  - **`@interop/wallet-core/space`** -- the wallet Space layout contract: the
38
38
  shared collection ids and descriptive specs (`private-credentials`,
39
- `public-credentials`, `wallet-activity`, `app-connections`), the
40
- `wallet-activity` wire shape with its pure `addHistory*` payload builders, the
39
+ `public-credentials`, `wallet-activity`, `app-keys`), the `wallet-activity`
40
+ wire shape with its pure `addHistory*` payload builders, the
41
41
  `publicCredentialUrl` derivation, and the `was-link` QR hand-off contract
42
42
  (`buildWasLinkPayload` / `parseWasLinkPayload` / `encodeWasLinkSecret`) with
43
43
  its structural recognizer, `isWasLinkPayload`. Contacts collection specs live
@@ -29,8 +29,37 @@
29
29
  * delegation blind, reading was-client's genuine `AlreadyRevokedError` as
30
30
  * success and an already-expired delegation as needing no POST at all;
31
31
  * write the digest; delete), so a GC torn anywhere resumes at the next
32
- * login instead of waiting a quarter. Failures are collected per generation
33
- * and never abort the fan-out: a partial pass is a resumable success.
32
+ * login instead of waiting a quarter. The pointer it compares against is
33
+ * re-read from the account log under this client's pin right before the
34
+ * fan-out, and a generation that log never pointed at is collected only
35
+ * once it is GC-quiet (the same quiet bound the swap defers on), so a
36
+ * sibling client's swap -- landed, or still between its mint and its
37
+ * re-point -- never loses the generation the account points at. A
38
+ * generation the log once pointed at is collected at once: it cannot be a
39
+ * sibling's unpointed fresh generation, and a retire swap's refused revoke
40
+ * is retried on it without waiting a day. Failures are collected per
41
+ * generation and never abort the fan-out: a partial pass is a resumable
42
+ * success. The re-read itself and the collection listing sit outside that
43
+ * isolation: either failing rejects the pass, since there is nothing safe
44
+ * to collect against.
45
+ *
46
+ * - The REPAIR is the swap off its cadence: when the pointed generation's
47
+ * log does not exist (the pointer names a generation a stale pass
48
+ * collected, or one never minted), every transient visit is shut out until
49
+ * the pointer moves, so the pass mints a fresh generation and re-points at
50
+ * once, with nothing to revoke. The pointed log is read on every pass for
51
+ * this reason. The repair covers a dead generation inside a live Space
52
+ * only: when the auxiliary Space itself is gone, or its metadata read
53
+ * answers anything but 2xx, it refuses (`failed`), and the transient
54
+ * readiness ensure, whose two-probe rule tells a gone Space from a masked
55
+ * read, is the one that replaces a Space.
56
+ *
57
+ * Both the swap and the repair decide on the account log re-read under this
58
+ * client's pin at the start of the pass, not on the caller's view, and
59
+ * their re-point lands only while the account still points at the
60
+ * generation they replace. A sibling client's swap that landed since the
61
+ * caller's read, or while this pass minted, stands, and the pass reports
62
+ * `not-due`.
34
63
  *
35
64
  * The completion predicate is durable state alone (exactly one `gen-`
36
65
  * collection exists in the auxiliary Space and it is the one the pointer
@@ -114,14 +143,17 @@ export declare function clientAnnexGcDue({ log, now }: {
114
143
  /**
115
144
  * The live-entry guard: whether a generation is GC-quiet -- its newest
116
145
  * entry's `versionTime` is older than the quiet bound plus the skew grace
117
- * margin. Applies to the POINTED generation only (an unpointed generation
118
- * authorizes nothing under pointer equality, so nothing inside it ever
119
- * defers deletion). An unparseable `versionTime` reads as not quiet: the
120
- * swap defers rather than abandoning a possibly-live visit.
146
+ * margin. On the POINTED generation it defers the swap, so a possibly-live
147
+ * visit is not abandoned. On an unpointed generation the account log NEVER
148
+ * pointed at it defers the collect: such a generation authorizes nothing
149
+ * under pointer equality, but one written moments ago may be a sibling
150
+ * client's fresh generation whose re-point has not landed yet, and collecting
151
+ * it would leave the account pointing at a deleted generation. An
152
+ * unparseable `versionTime` reads as not quiet, so both arms defer rather
153
+ * than act.
121
154
  *
122
155
  * @param options {object}
123
- * @param options.log {DIDLog} the pointed generation's VERIFIED annex
124
- * log
156
+ * @param options.log {DIDLog} the generation's VERIFIED annex log
125
157
  * @param [options.now] {number} epoch milliseconds, for tests
126
158
  * @returns {boolean}
127
159
  */
@@ -130,27 +162,38 @@ export declare function generationQuiet({ log, now }: {
130
162
  now?: number;
131
163
  }): boolean;
132
164
  /**
133
- * What the swap half of one GC pass did. `replaced` is the successful swap;
134
- * `not-due` and `deferred-live` are the two healthy skips (cadence and quiet
135
- * bound); `no-pointer` means the account has no annex inventory (the whole
136
- * pass no-ops -- without a pointer there is no auxiliary Space to list);
137
- * `no-ladder-seed` means the swap was due but the login held no ladder seed
138
- * to mint with (a non-standing record); `failed` means a swap stage threw --
139
- * reported in `failed` under the pointed generation's id, with the collect
140
- * fan-out still run.
165
+ * What the swap half of one GC pass did. `replaced` is the successful
166
+ * quarterly swap; `repaired` is the off-cadence swap the pass runs when the
167
+ * pointed generation's log does not exist (the account was left pointing at
168
+ * a collected or never-minted generation, and no transient visit could
169
+ * enroll), so the pointer names a live generation again; `not-due` and
170
+ * `deferred-live` are the two healthy skips (cadence and quiet bound), and
171
+ * `not-due` also covers a caller's dead pointer the account log has since
172
+ * moved off; `no-pointer` means the account has no annex inventory (the
173
+ * whole pass no-ops -- without a pointer there is no auxiliary Space to
174
+ * list), or that the re-read ahead of a repair found the pointer removed;
175
+ * `no-ladder-seed` means a swap was due, or a repair needed, but the login
176
+ * held no ladder seed to mint with (a non-standing record); `failed` means
177
+ * the pointed generation's read or a swap stage threw -- reported in
178
+ * `failed` under the pointed generation's id, with the collect fan-out
179
+ * still run.
141
180
  */
142
- export type ClientAnnexGcSwapOutcome = 'replaced' | 'not-due' | 'deferred-live' | 'no-pointer' | 'no-ladder-seed' | 'failed';
181
+ export type ClientAnnexGcSwapOutcome = 'replaced' | 'repaired' | 'not-due' | 'deferred-live' | 'no-pointer' | 'no-ladder-seed' | 'failed';
143
182
  /**
144
- * One GC pass's report: the swap outcome, the annex DID the account
145
- * points at after the pass, the generation ids collected (revoked, digested,
146
- * deleted), and the per-generation failures. A report with `failed` entries
147
- * is a resumable success -- the next remembered login's pass picks up exactly
148
- * the generations still listed.
183
+ * One GC pass's report: the swap outcome, the annex DID the account points
184
+ * at after the pass (read back from the account log under this client's
185
+ * pin, so it is what the host serves and not what this pass believes), the
186
+ * generation ids collected (revoked, digested, deleted), the ids deferred
187
+ * (unpointed but not yet GC-quiet, kept for a later pass), and the
188
+ * per-generation failures. A report with `failed` or `deferred` entries is a
189
+ * resumable success -- the next remembered login's pass picks up exactly the
190
+ * generations still listed.
149
191
  */
150
192
  export interface ClientAnnexGcReport {
151
193
  swap: ClientAnnexGcSwapOutcome;
152
194
  pointedDid?: string;
153
195
  collected: string[];
196
+ deferred: string[];
154
197
  failed: Array<{
155
198
  generationId: string;
156
199
  error: unknown;
@@ -202,7 +245,38 @@ export interface ClientAnnexGenerationSwap {
202
245
  * a chain whose signer has left the document is read as that), re-writes
203
246
  * the digest (the deterministic payload id collapses the second row at read
204
247
  * time), and re-runs the idempotent delete; a swap torn before its re-point
205
- * leaves an unpointed fresh generation the same fan-out collects.
248
+ * leaves an unpointed fresh generation the same fan-out collects once it is
249
+ * GC-quiet.
250
+ *
251
+ * Two guards keep the fan-out off the pointed generation. The pointer the
252
+ * fan-out compares against is re-read from the account log under this
253
+ * client's pin immediately before the fan-out, so a sibling client's swap,
254
+ * or this pass's own re-point whose response was lost, is seen rather than
255
+ * the caller's pre-pass view. And an unpointed generation the fresh log
256
+ * never pointed at is collected only when GC-quiet, so a sibling mid-swap
257
+ * (minted, not yet pointed) keeps its fresh generation; one the log once
258
+ * pointed at is collected at once. A generation whose log does not exist
259
+ * carries no timestamp and is deleted at once. A sibling whose genesis and
260
+ * install both land in the gap between that read and the delete goes on to
261
+ * re-point at the deleted generation; the next remembered login's repair,
262
+ * or the next transient visit's readiness ensure, mends that.
263
+ *
264
+ * The pointed generation's log is read on every pass: when the swap is due
265
+ * it is the quiet gate, and on every pass it is the detector of a dead
266
+ * pointed generation (a collected or never-minted one the pointer still
267
+ * names), which the pass repairs with an off-cadence swap so the next
268
+ * transient visit can enroll. Before the repair the account log is re-read
269
+ * under this client's pin: when the pointer has moved off the one the caller
270
+ * passed, a sibling client swapped since the caller's read, and the pass
271
+ * reports `not-due` and repairs nothing (`no-pointer` when the re-read
272
+ * document carries none). The repair's own re-point is conditional on the
273
+ * same pointer, so a sibling's re-point landing while the repair mints also
274
+ * stands, and the pass reports `not-due`. The repair then confirms the
275
+ * auxiliary Space
276
+ * itself still answers, and refuses when it does not: replacing a gone Space
277
+ * is the transient readiness ensure's, whose two-probe rule tells absence
278
+ * from a masked read, and a repair racing it across two Spaces would strand
279
+ * whichever Space lost the re-point.
206
280
  *
207
281
  * @param options {object}
208
282
  * @param options.was {WasClient} the storage client, signing as an
@@ -219,8 +293,8 @@ export interface ClientAnnexGenerationSwap {
219
293
  * @param options.zcapClient {ZcapClient} signs the fresh generation
220
294
  * delegation (the promoted account keyId)
221
295
  * @param [options.ladderSeed] {Uint8Array} the login credential's ladder
222
- * seed; absent, a due swap reports `no-ladder-seed` and only the collect
223
- * fan-out runs
296
+ * seed; absent, a due swap or a needed repair reports `no-ladder-seed` and
297
+ * only the collect fan-out runs
224
298
  * @param options.recordDigest {Function}
225
299
  * `({ generationId, firstEntry, lastEntry, entryCount }) => Promise<void>`
226
300
  * -- writes the GenerationCollect wallet-activity row; called before the
@@ -277,6 +351,12 @@ export declare function runClientAnnexGc({ was, wasServerUrl, accountSpaceId, ac
277
351
  * refuses that chain, and the revoke stage reads the refusal against the
278
352
  * caller's `account.doc` and reports `signer-gone`.
279
353
  *
354
+ * The re-point lands only while the account log, re-read under this
355
+ * client's pin before the mint, still points at the generation the caller's
356
+ * `account.doc` names. A sibling's re-point that lands first stands, and the
357
+ * swap throws rather than move the account off it; the caller re-runs its
358
+ * ceremony over a fresh read.
359
+ *
280
360
  * @param options {object} see {@link runClientAnnexGc} for the shared
281
361
  * members ({ was, wasServerUrl, accountSpaceId, account, idStore,
282
362
  * updateKeys, zcapClient }); `ladderSeed` here is the SURVIVING
@@ -284,6 +364,8 @@ export declare function runClientAnnexGc({ was, wasServerUrl, accountSpaceId, ac
284
364
  * @param [options.now] {number} epoch milliseconds, for tests
285
365
  * @returns {Promise<ClientAnnexGenerationSwap>} the fresh annex DID and
286
366
  * what the revoke stage did
367
+ * @throws {Error} `DelegatedClientsPointerMovedError` when the account log
368
+ * no longer points at the generation `account.doc` names
287
369
  */
288
370
  export declare function swapClientAnnexGeneration({ was, wasServerUrl, accountSpaceId, account, idStore, signer, zcapClient, ladderSeed, now }: {
289
371
  was: WasClient;
@@ -1 +1 @@
1
- {"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../../src/clientAnnex/gc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../../src/clientAnnex/gc.ts"],"names":[],"mappings":"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"}