@interop/wallet-core 0.66.0 → 0.68.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.
- package/README.md +12 -8
- package/dist/clientAnnex/credentialAnchoredGenesis.d.ts +6 -10
- package/dist/clientAnnex/credentialAnchoredGenesis.d.ts.map +1 -1
- package/dist/clientAnnex/credentialAnchoredGenesis.js +34 -56
- package/dist/clientAnnex/credentialAnchoredGenesis.js.map +1 -1
- package/dist/clientAnnex/establish.d.ts +46 -29
- package/dist/clientAnnex/establish.d.ts.map +1 -1
- package/dist/clientAnnex/establish.js +111 -86
- package/dist/clientAnnex/establish.js.map +1 -1
- package/dist/clientAnnex/forget.d.ts +7 -16
- package/dist/clientAnnex/forget.d.ts.map +1 -1
- package/dist/clientAnnex/forget.js +13 -24
- package/dist/clientAnnex/forget.js.map +1 -1
- package/dist/clientAnnex/forgetLast.d.ts +33 -129
- package/dist/clientAnnex/forgetLast.d.ts.map +1 -1
- package/dist/clientAnnex/forgetLast.js +43 -182
- package/dist/clientAnnex/forgetLast.js.map +1 -1
- package/dist/clientAnnex/gc.d.ts +26 -12
- package/dist/clientAnnex/gc.d.ts.map +1 -1
- package/dist/clientAnnex/gc.js +60 -57
- package/dist/clientAnnex/gc.js.map +1 -1
- package/dist/clientAnnex/heal.d.ts +75 -18
- package/dist/clientAnnex/heal.d.ts.map +1 -1
- package/dist/clientAnnex/heal.js +79 -147
- package/dist/clientAnnex/heal.js.map +1 -1
- package/dist/clientAnnex/index.d.ts +8 -8
- package/dist/clientAnnex/index.d.ts.map +1 -1
- package/dist/clientAnnex/index.js +5 -5
- package/dist/clientAnnex/index.js.map +1 -1
- package/dist/clientAnnex/ladder.d.ts +51 -4
- package/dist/clientAnnex/ladder.d.ts.map +1 -1
- package/dist/clientAnnex/ladder.js +283 -47
- package/dist/clientAnnex/ladder.js.map +1 -1
- package/dist/clientAnnex/ladderAnchored.d.ts +62 -73
- package/dist/clientAnnex/ladderAnchored.d.ts.map +1 -1
- package/dist/clientAnnex/ladderAnchored.js +103 -117
- package/dist/clientAnnex/ladderAnchored.js.map +1 -1
- package/dist/clientAnnex/log.d.ts +123 -125
- package/dist/clientAnnex/log.d.ts.map +1 -1
- package/dist/clientAnnex/log.js +174 -233
- package/dist/clientAnnex/log.js.map +1 -1
- package/dist/clientAnnex/mend.d.ts +0 -4
- package/dist/clientAnnex/mend.d.ts.map +1 -1
- package/dist/clientAnnex/mend.js +50 -51
- package/dist/clientAnnex/mend.js.map +1 -1
- package/dist/clientAnnex/recoveryLadderAnchored.d.ts +25 -13
- package/dist/clientAnnex/recoveryLadderAnchored.d.ts.map +1 -1
- package/dist/clientAnnex/recoveryLadderAnchored.js +80 -303
- package/dist/clientAnnex/recoveryLadderAnchored.js.map +1 -1
- package/dist/clientAnnex/rosterDeliveredEpochs.d.ts +13 -5
- package/dist/clientAnnex/rosterDeliveredEpochs.d.ts.map +1 -1
- package/dist/clientAnnex/rosterDeliveredEpochs.js +18 -9
- package/dist/clientAnnex/rosterDeliveredEpochs.js.map +1 -1
- package/dist/clientAnnex/selfEnroll.d.ts +6 -10
- package/dist/clientAnnex/selfEnroll.d.ts.map +1 -1
- package/dist/clientAnnex/selfEnroll.js +13 -18
- package/dist/clientAnnex/selfEnroll.js.map +1 -1
- package/dist/clientAnnex/zcap.d.ts +19 -0
- package/dist/clientAnnex/zcap.d.ts.map +1 -1
- package/dist/clientAnnex/zcap.js +80 -12
- package/dist/clientAnnex/zcap.js.map +1 -1
- package/dist/clients/index.d.ts +3 -2
- package/dist/clients/index.d.ts.map +1 -1
- package/dist/clients/index.js +3 -2
- package/dist/clients/index.js.map +1 -1
- package/dist/clients/listing.d.ts.map +1 -1
- package/dist/clients/listing.js +33 -15
- package/dist/clients/listing.js.map +1 -1
- package/dist/clients/policy.d.ts +18 -0
- package/dist/clients/policy.d.ts.map +1 -1
- package/dist/clients/policy.js +22 -8
- package/dist/clients/policy.js.map +1 -1
- package/dist/clients/revocation.d.ts +18 -30
- package/dist/clients/revocation.d.ts.map +1 -1
- package/dist/clients/revocation.js +12 -27
- package/dist/clients/revocation.js.map +1 -1
- package/dist/clients/rosterPolicy.d.ts +6 -1
- package/dist/clients/rosterPolicy.d.ts.map +1 -1
- package/dist/clients/rosterPolicy.js +27 -30
- package/dist/clients/rosterPolicy.js.map +1 -1
- package/dist/descriptors/errors.d.ts +6 -5
- package/dist/descriptors/errors.d.ts.map +1 -1
- package/dist/descriptors/errors.js +6 -5
- package/dist/descriptors/errors.js.map +1 -1
- package/dist/descriptors/index.d.ts +7 -3
- package/dist/descriptors/index.d.ts.map +1 -1
- package/dist/descriptors/index.js +7 -3
- package/dist/descriptors/index.js.map +1 -1
- package/dist/descriptors/logSource.d.ts +28 -6
- package/dist/descriptors/logSource.d.ts.map +1 -1
- package/dist/descriptors/logSource.js +33 -7
- package/dist/descriptors/logSource.js.map +1 -1
- package/dist/enrollment/enrollment.d.ts.map +1 -1
- package/dist/enrollment/enrollment.js +3 -7
- package/dist/enrollment/enrollment.js.map +1 -1
- package/dist/genesis/accountGenesis.d.ts +11 -16
- package/dist/genesis/accountGenesis.d.ts.map +1 -1
- package/dist/genesis/accountGenesis.js +43 -47
- package/dist/genesis/accountGenesis.js.map +1 -1
- package/dist/genesis/kmsAuthentication.d.ts +50 -0
- package/dist/genesis/kmsAuthentication.d.ts.map +1 -0
- package/dist/genesis/kmsAuthentication.js +49 -0
- package/dist/genesis/kmsAuthentication.js.map +1 -0
- package/dist/keyring/kdf.d.ts +16 -20
- package/dist/keyring/kdf.d.ts.map +1 -1
- package/dist/keyring/kdf.js +2 -2
- package/dist/keyring/kdf.js.map +1 -1
- package/dist/keyring/unlockSpace.d.ts +8 -30
- package/dist/keyring/unlockSpace.d.ts.map +1 -1
- package/dist/keyring/unlockSpace.js +8 -31
- package/dist/keyring/unlockSpace.js.map +1 -1
- package/dist/keys/clientKeyRecord.d.ts +2 -1
- package/dist/keys/clientKeyRecord.d.ts.map +1 -1
- package/dist/keys/clientKeyRecord.js +28 -11
- package/dist/keys/clientKeyRecord.js.map +1 -1
- package/dist/keys/index.d.ts +6 -2
- package/dist/keys/index.d.ts.map +1 -1
- package/dist/keys/index.js +5 -1
- package/dist/keys/index.js.map +1 -1
- package/dist/keys/rosterLogStore.d.ts.map +1 -1
- package/dist/keys/rosterLogStore.js +14 -5
- package/dist/keys/rosterLogStore.js.map +1 -1
- package/dist/keys/spaceEpochs.d.ts +92 -3
- package/dist/keys/spaceEpochs.d.ts.map +1 -1
- package/dist/keys/spaceEpochs.js +110 -4
- package/dist/keys/spaceEpochs.js.map +1 -1
- package/dist/keys/userKeyRoster.d.ts +30 -3
- package/dist/keys/userKeyRoster.d.ts.map +1 -1
- package/dist/keys/userKeyRoster.js +90 -15
- package/dist/keys/userKeyRoster.js.map +1 -1
- package/dist/keys/userKeyRosterCascade.d.ts.map +1 -1
- package/dist/keys/userKeyRosterCascade.js +5 -1
- package/dist/keys/userKeyRosterCascade.js.map +1 -1
- package/dist/recovery/continuation.d.ts +250 -0
- package/dist/recovery/continuation.d.ts.map +1 -0
- package/dist/recovery/continuation.js +467 -0
- package/dist/recovery/continuation.js.map +1 -0
- package/dist/recovery/index.d.ts +12 -8
- package/dist/recovery/index.d.ts.map +1 -1
- package/dist/recovery/index.js +11 -7
- package/dist/recovery/index.js.map +1 -1
- package/dist/recovery/recoveryDelegation.d.ts +23 -126
- package/dist/recovery/recoveryDelegation.d.ts.map +1 -1
- package/dist/recovery/recoveryDelegation.js +1 -266
- package/dist/recovery/recoveryDelegation.js.map +1 -1
- package/dist/recovery/recoveryWebvh.d.ts +52 -107
- package/dist/recovery/recoveryWebvh.d.ts.map +1 -1
- package/dist/recovery/recoveryWebvh.js +54 -403
- package/dist/recovery/recoveryWebvh.js.map +1 -1
- package/dist/request/classify.d.ts +3 -14
- package/dist/request/classify.d.ts.map +1 -1
- package/dist/request/classify.js +19 -40
- package/dist/request/classify.js.map +1 -1
- package/dist/request/index.d.ts +1 -0
- package/dist/request/index.d.ts.map +1 -1
- package/dist/request/index.js +1 -0
- package/dist/request/index.js.map +1 -1
- package/dist/request/onboarding.d.ts.map +1 -1
- package/dist/request/onboarding.js +19 -27
- package/dist/request/onboarding.js.map +1 -1
- package/dist/request/parse.d.ts +5 -3
- package/dist/request/parse.d.ts.map +1 -1
- package/dist/request/parse.js +7 -6
- package/dist/request/parse.js.map +1 -1
- package/dist/request/processRequest.d.ts.map +1 -1
- package/dist/request/processRequest.js +2 -1
- package/dist/request/processRequest.js.map +1 -1
- package/dist/request/queryPredicates.d.ts +98 -0
- package/dist/request/queryPredicates.d.ts.map +1 -0
- package/dist/request/queryPredicates.js +107 -0
- package/dist/request/queryPredicates.js.map +1 -0
- package/dist/resourceLog/document.d.ts +39 -0
- package/dist/resourceLog/document.d.ts.map +1 -1
- package/dist/resourceLog/document.js +41 -0
- package/dist/resourceLog/document.js.map +1 -1
- package/dist/resourceLog/index.d.ts +2 -2
- package/dist/resourceLog/index.js +2 -2
- package/dist/resourceLog/ladderRungs.d.ts.map +1 -1
- package/dist/resourceLog/ladderRungs.js +3 -2
- package/dist/resourceLog/ladderRungs.js.map +1 -1
- package/dist/sync/contactsConflict.d.ts.map +1 -1
- package/dist/sync/contactsConflict.js +8 -2
- package/dist/sync/contactsConflict.js.map +1 -1
- package/dist/sync/engine.d.ts +38 -23
- package/dist/sync/engine.d.ts.map +1 -1
- package/dist/sync/engine.js +36 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/index.d.ts +9 -12
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +8 -11
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/push.d.ts.map +1 -1
- package/dist/sync/push.js +1 -2
- package/dist/sync/push.js.map +1 -1
- package/dist/sync/remint.d.ts +0 -31
- package/dist/sync/remint.d.ts.map +1 -1
- package/dist/sync/remint.js +32 -1
- package/dist/sync/remint.js.map +1 -1
- package/dist/sync/types.d.ts +4 -41
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/types.js +4 -47
- package/dist/sync/types.js.map +1 -1
- package/dist/unlock/index.d.ts +1 -1
- package/dist/unlock/index.d.ts.map +1 -1
- package/dist/unlock/index.js +1 -1
- package/dist/unlock/index.js.map +1 -1
- package/dist/unlock/retire.d.ts +16 -64
- package/dist/unlock/retire.d.ts.map +1 -1
- package/dist/unlock/retire.js +7 -86
- package/dist/unlock/retire.js.map +1 -1
- package/dist/unlock/standingWebvh.d.ts +27 -61
- package/dist/unlock/standingWebvh.d.ts.map +1 -1
- package/dist/unlock/standingWebvh.js +40 -92
- package/dist/unlock/standingWebvh.js.map +1 -1
- package/dist/unlock/unlockRecord.d.ts.map +1 -1
- package/dist/unlock/unlockRecord.js +69 -44
- package/dist/unlock/unlockRecord.js.map +1 -1
- package/dist/webvh/accountEntry.d.ts +68 -19
- package/dist/webvh/accountEntry.d.ts.map +1 -1
- package/dist/webvh/accountEntry.js +117 -37
- package/dist/webvh/accountEntry.js.map +1 -1
- package/dist/webvh/delegatedLogStore.d.ts +24 -13
- package/dist/webvh/delegatedLogStore.d.ts.map +1 -1
- package/dist/webvh/delegatedLogStore.js +40 -11
- package/dist/webvh/delegatedLogStore.js.map +1 -1
- package/dist/webvh/didWebvh.d.ts +91 -86
- package/dist/webvh/didWebvh.d.ts.map +1 -1
- package/dist/webvh/didWebvh.js +117 -142
- package/dist/webvh/didWebvh.js.map +1 -1
- package/dist/webvh/enrollClient.d.ts +2 -8
- package/dist/webvh/enrollClient.d.ts.map +1 -1
- package/dist/webvh/enrollClient.js +22 -31
- package/dist/webvh/enrollClient.js.map +1 -1
- package/dist/webvh/index.d.ts +12 -8
- package/dist/webvh/index.d.ts.map +1 -1
- package/dist/webvh/index.js +10 -7
- package/dist/webvh/index.js.map +1 -1
- package/dist/webvh/listClients.d.ts.map +1 -1
- package/dist/webvh/listClients.js +102 -65
- package/dist/webvh/listClients.js.map +1 -1
- package/dist/webvh/mergeMethods.d.ts +84 -0
- package/dist/webvh/mergeMethods.d.ts.map +1 -0
- package/dist/webvh/mergeMethods.js +46 -0
- package/dist/webvh/mergeMethods.js.map +1 -0
- package/dist/webvh/revokeClient.d.ts +15 -11
- package/dist/webvh/revokeClient.d.ts.map +1 -1
- package/dist/webvh/revokeClient.js +130 -57
- package/dist/webvh/revokeClient.js.map +1 -1
- package/dist/webvh/verifyLog.d.ts +45 -4
- package/dist/webvh/verifyLog.d.ts.map +1 -1
- package/dist/webvh/verifyLog.js +62 -21
- package/dist/webvh/verifyLog.js.map +1 -1
- package/dist/webvh/wasIdStore.d.ts +16 -3
- package/dist/webvh/wasIdStore.d.ts.map +1 -1
- package/dist/webvh/wasIdStore.js +18 -3
- package/dist/webvh/wasIdStore.js.map +1 -1
- package/package.json +11 -11
package/dist/sync/remint.js
CHANGED
|
@@ -1,4 +1,35 @@
|
|
|
1
|
-
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* The create-loss re-mint: the eager-minter half of the
|
|
6
|
+
* descriptor-before-first-content-push ordering invariant.
|
|
7
|
+
*
|
|
8
|
+
* The invariant: a collection's encryption descriptor -- its key-epoch
|
|
9
|
+
* roster -- is published before the collection's first content push, so no
|
|
10
|
+
* envelope can reach the feed sealed under an epoch the published descriptor
|
|
11
|
+
* does not carry. The engine enforces it structurally: `ensureProvisioned`
|
|
12
|
+
* (which publishes the descriptor, create-if-absent) runs before every
|
|
13
|
+
* cycle's migration sweep and push, so a lazy minter's envelopes are always
|
|
14
|
+
* minted after the published descriptor has settled.
|
|
15
|
+
*
|
|
16
|
+
* An eager minter -- a replica that mints envelopes at local write time,
|
|
17
|
+
* against a cached descriptor -- has one residual hole: envelopes minted
|
|
18
|
+
* against a locally-minted epoch[0] while ANOTHER provisioner's descriptor
|
|
19
|
+
* create won. At the next sync, provisioning adopts the winner's descriptor
|
|
20
|
+
* (the create is compare-and-swap, never clobbering), leaving the pending
|
|
21
|
+
* envelopes sealed under an epoch the published descriptor does not carry;
|
|
22
|
+
* pushing them would land feed entries no other replica can route. The
|
|
23
|
+
* remedy is {@link remintPendingEnvelopes}, run after adoption and before
|
|
24
|
+
* the next push: each pending row the adopted cipher cannot route is
|
|
25
|
+
* decrypted through the caller's stale-capable seam and re-encrypted under
|
|
26
|
+
* the adopted descriptor's current epoch. This is legal exactly because a
|
|
27
|
+
* pending row (dirty, never server-acked) has no feed existence -- envelope
|
|
28
|
+
* immutability bites only once an envelope is ON the feed -- and the
|
|
29
|
+
* re-encryption may therefore re-key the row (a content-derived id hashes
|
|
30
|
+
* the ciphertext, so a re-mint mints a new id).
|
|
31
|
+
*/
|
|
32
|
+
import { isUnknownEpochError } from '@interop/was-client/sync';
|
|
2
33
|
/**
|
|
3
34
|
* How many full re-mint passes are attempted before giving up. A pass that
|
|
4
35
|
* ends with skipped rows (a local write bumped a row's revision between the
|
package/dist/sync/remint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remint.js","sourceRoot":"","sources":["../../src/sync/remint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"remint.js","sourceRoot":"","sources":["../../src/sync/remint.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/types.d.ts
CHANGED
|
@@ -8,18 +8,10 @@
|
|
|
8
8
|
* `MasterState`, `WasSyncPort`, `DocCipher`, and the `WasSyncConflictError` /
|
|
9
9
|
* `WasSyncNotFoundError` / `UnknownEpochError` signals) come from
|
|
10
10
|
* `@interop/was-client/sync` and are re-exported here so a single import gives
|
|
11
|
-
* a consumer both the wire types and the replica-side seams.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* the port for the two wire signals, the caller's `DocCipher` for the third --
|
|
16
|
-
* which can resolve to a second copy of `@interop/was-client` (a `link:` dev
|
|
17
|
-
* setup, a dedupe miss through a dependency tree), so they are matched on
|
|
18
|
-
* `err.name` and never with `instanceof`. The same rule the resource-log
|
|
19
|
-
* refusal classes follow, and for the same reason: an `instanceof` miss here
|
|
20
|
-
* turns every push 412 into a fatal cycle error and makes the create-loss
|
|
21
|
-
* re-mint rethrow instead of re-minting. Every one of the three classes
|
|
22
|
-
* assigns its `name` explicitly, which is what makes the string a contract.
|
|
11
|
+
* a consumer both the wire types and the replica-side seams. The predicates
|
|
12
|
+
* that CLASSIFY those signals ship from `@interop/was-client/sync` too, beside
|
|
13
|
+
* the classes that assign the names they match; `push.ts` and `remint.ts`
|
|
14
|
+
* import them from there.
|
|
23
15
|
*
|
|
24
16
|
* The local-persistence seam (`SyncStore`, `SyncedRow`, `ProjectionAction`,
|
|
25
17
|
* `ResolveConflict`) is the replica's side of the contract: it stands in for a
|
|
@@ -35,35 +27,6 @@
|
|
|
35
27
|
export { UnknownEpochError, WasSyncConflictError, WasSyncNotFoundError } from '@interop/was-client/sync';
|
|
36
28
|
export type { Json, SyncCheckpoint, WireDoc, MasterState, WasSyncPort, DocCipher } from '@interop/was-client/sync';
|
|
37
29
|
import type { Json, MasterState, SyncCheckpoint, WireDoc } from '@interop/was-client/sync';
|
|
38
|
-
/**
|
|
39
|
-
* Whether an error is the replication port's rejected-conditional-write signal
|
|
40
|
-
* (`WasSyncConflictError`, HTTP 412): a lost-update `If-Match` mismatch, or a
|
|
41
|
-
* create-if-absent whose target already exists. The push loop's one settle-and-
|
|
42
|
-
* reconcile branch; everything else propagates to the engine's backoff.
|
|
43
|
-
*
|
|
44
|
-
* @param err {unknown}
|
|
45
|
-
* @returns {boolean}
|
|
46
|
-
*/
|
|
47
|
-
export declare function isSyncConflictError(err: unknown): boolean;
|
|
48
|
-
/**
|
|
49
|
-
* Whether an error is the replication port's absent-target signal
|
|
50
|
-
* (`WasSyncNotFoundError`, HTTP 404). On a delete that is a settled outcome
|
|
51
|
-
* -- already gone, or the write never reached the server -- not a conflict.
|
|
52
|
-
*
|
|
53
|
-
* @param err {unknown}
|
|
54
|
-
* @returns {boolean}
|
|
55
|
-
*/
|
|
56
|
-
export declare function isSyncNotFoundError(err: unknown): boolean;
|
|
57
|
-
/**
|
|
58
|
-
* Whether an error is the cipher's unknown-epoch signal (`UnknownEpochError`):
|
|
59
|
-
* an envelope naming recipient key ids whose epoch the descriptor this reader
|
|
60
|
-
* holds does not list at all. Distinct from a key the reader simply does not
|
|
61
|
-
* have (`KeyUnwrapError`), which re-reading the descriptor cannot fix.
|
|
62
|
-
*
|
|
63
|
-
* @param err {unknown}
|
|
64
|
-
* @returns {boolean}
|
|
65
|
-
*/
|
|
66
|
-
export declare function isUnknownEpochError(err: unknown): boolean;
|
|
67
30
|
/**
|
|
68
31
|
* A dirty local synced-docs row awaiting push. `data` is the stored body (the
|
|
69
32
|
* EDV envelope on an encrypted collection, or the plaintext JSON on a plaintext
|
package/dist/sync/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,IAAI,EACJ,cAAc,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACX,SAAS,EACV,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EACV,IAAI,EACJ,WAAW,EACX,cAAc,EACd,OAAO,EACR,MAAM,0BAA0B,CAAA;AAEjC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC3B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAC1B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3E;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;CAClB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEnB;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAA;IAEpD;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAEpC;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE;QACvB,SAAS,EAAE,OAAO,EAAE,CAAA;QACpB,UAAU,EAAE,cAAc,CAAA;QAC1B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;KAC3C,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjB;;;;;;;;;OASG;IACH,UAAU,CAAC,OAAO,EAAE;QAClB,EAAE,EAAE,MAAM,CAAA;QACV,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjB;;;;;;OAMG;IACH,iBAAiB,CAAC,OAAO,EAAE;QACzB,EAAE,EAAE,MAAM,CAAA;QACV,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjB;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE;QACnB,EAAE,EAAE,MAAM,CAAA;QACV,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;QAC1B,UAAU,EAAE,gBAAgB,CAAA;KAC7B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,cAAc,CAAC,CAAC,OAAO,EAAE;QACvB,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,IAAI,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAC3B,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAClC"}
|
package/dist/sync/types.js
CHANGED
|
@@ -8,18 +8,10 @@
|
|
|
8
8
|
* `MasterState`, `WasSyncPort`, `DocCipher`, and the `WasSyncConflictError` /
|
|
9
9
|
* `WasSyncNotFoundError` / `UnknownEpochError` signals) come from
|
|
10
10
|
* `@interop/was-client/sync` and are re-exported here so a single import gives
|
|
11
|
-
* a consumer both the wire types and the replica-side seams.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* the port for the two wire signals, the caller's `DocCipher` for the third --
|
|
16
|
-
* which can resolve to a second copy of `@interop/was-client` (a `link:` dev
|
|
17
|
-
* setup, a dedupe miss through a dependency tree), so they are matched on
|
|
18
|
-
* `err.name` and never with `instanceof`. The same rule the resource-log
|
|
19
|
-
* refusal classes follow, and for the same reason: an `instanceof` miss here
|
|
20
|
-
* turns every push 412 into a fatal cycle error and makes the create-loss
|
|
21
|
-
* re-mint rethrow instead of re-minting. Every one of the three classes
|
|
22
|
-
* assigns its `name` explicitly, which is what makes the string a contract.
|
|
11
|
+
* a consumer both the wire types and the replica-side seams. The predicates
|
|
12
|
+
* that CLASSIFY those signals ship from `@interop/was-client/sync` too, beside
|
|
13
|
+
* the classes that assign the names they match; `push.ts` and `remint.ts`
|
|
14
|
+
* import them from there.
|
|
23
15
|
*
|
|
24
16
|
* The local-persistence seam (`SyncStore`, `SyncedRow`, `ProjectionAction`,
|
|
25
17
|
* `ResolveConflict`) is the replica's side of the contract: it stands in for a
|
|
@@ -33,39 +25,4 @@
|
|
|
33
25
|
* Native, against a fake port and an in-memory store.
|
|
34
26
|
*/
|
|
35
27
|
export { UnknownEpochError, WasSyncConflictError, WasSyncNotFoundError } from '@interop/was-client/sync';
|
|
36
|
-
/**
|
|
37
|
-
* Whether an error is the replication port's rejected-conditional-write signal
|
|
38
|
-
* (`WasSyncConflictError`, HTTP 412): a lost-update `If-Match` mismatch, or a
|
|
39
|
-
* create-if-absent whose target already exists. The push loop's one settle-and-
|
|
40
|
-
* reconcile branch; everything else propagates to the engine's backoff.
|
|
41
|
-
*
|
|
42
|
-
* @param err {unknown}
|
|
43
|
-
* @returns {boolean}
|
|
44
|
-
*/
|
|
45
|
-
export function isSyncConflictError(err) {
|
|
46
|
-
return err?.name === 'WasSyncConflictError';
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Whether an error is the replication port's absent-target signal
|
|
50
|
-
* (`WasSyncNotFoundError`, HTTP 404). On a delete that is a settled outcome
|
|
51
|
-
* -- already gone, or the write never reached the server -- not a conflict.
|
|
52
|
-
*
|
|
53
|
-
* @param err {unknown}
|
|
54
|
-
* @returns {boolean}
|
|
55
|
-
*/
|
|
56
|
-
export function isSyncNotFoundError(err) {
|
|
57
|
-
return err?.name === 'WasSyncNotFoundError';
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Whether an error is the cipher's unknown-epoch signal (`UnknownEpochError`):
|
|
61
|
-
* an envelope naming recipient key ids whose epoch the descriptor this reader
|
|
62
|
-
* holds does not list at all. Distinct from a key the reader simply does not
|
|
63
|
-
* have (`KeyUnwrapError`), which re-reading the descriptor cannot fix.
|
|
64
|
-
*
|
|
65
|
-
* @param err {unknown}
|
|
66
|
-
* @returns {boolean}
|
|
67
|
-
*/
|
|
68
|
-
export function isUnknownEpochError(err) {
|
|
69
|
-
return err?.name === 'UnknownEpochError';
|
|
70
|
-
}
|
|
71
28
|
//# sourceMappingURL=types.js.map
|
package/dist/sync/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,0BAA0B,CAAA"}
|
package/dist/unlock/index.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ export { standingClientFromUnlockSeed, STANDING_CLIENT_SALT, unlockClientIdentit
|
|
|
39
39
|
export type { StandingUnlockClient, UnlockClientIdentity } from './standingClient.js';
|
|
40
40
|
export { computeUnlockBinding, LADDER_SEED_BYTES, recordSealedRecipientKeys, remintUnlockRecordDelegations, UnlockBindingError, unlockRecordBinding, unlockRecordSealedTo, unwrapUnlockRecord, wrapUnlockRecord } from './unlockRecord.js';
|
|
41
41
|
export type { SealedRecordMember, SignedUnlockRecord, UnlockRecordContents, UnlockRecordProofState } from './unlockRecord.js';
|
|
42
|
-
export { assertLadderVmClaimed,
|
|
42
|
+
export { assertLadderVmClaimed, ladderVmClaimOf, preflightUnlockCredentialRetirement, publishUnlockKey, removeUnlockKey, UnclaimedLadderVmRetirementError, unlockKeyVerificationMethod, unlockKeyVmId } from './standingWebvh.js';
|
|
43
43
|
export type { LadderVmRemovalReport, StandingUnlockKeys, UnlockKeyAgreementPublication, UnlockLogStore } from './standingWebvh.js';
|
|
44
44
|
export { retireUnlockCredential } from './retire.js';
|
|
45
45
|
export type { ClientAnnexInventoryRetirement, UnlockCredentialRetirementResult } from './retire.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/unlock/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,qBAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/unlock/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,mCAAmC,EACnC,gBAAgB,EAChB,eAAe,EACf,gCAAgC,EAChC,2BAA2B,EAC3B,aAAa,EACd,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,6BAA6B,EAC7B,cAAc,EACf,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EACV,8BAA8B,EAC9B,gCAAgC,EACjC,MAAM,aAAa,CAAA"}
|
package/dist/unlock/index.js
CHANGED
|
@@ -37,6 +37,6 @@
|
|
|
37
37
|
*/
|
|
38
38
|
export { standingClientFromUnlockSeed, STANDING_CLIENT_SALT, unlockClientIdentityFromSeed } from './standingClient.js';
|
|
39
39
|
export { computeUnlockBinding, LADDER_SEED_BYTES, recordSealedRecipientKeys, remintUnlockRecordDelegations, UnlockBindingError, unlockRecordBinding, unlockRecordSealedTo, unwrapUnlockRecord, wrapUnlockRecord } from './unlockRecord.js';
|
|
40
|
-
export { assertLadderVmClaimed,
|
|
40
|
+
export { assertLadderVmClaimed, ladderVmClaimOf, preflightUnlockCredentialRetirement, publishUnlockKey, removeUnlockKey, UnclaimedLadderVmRetirementError, unlockKeyVerificationMethod, unlockKeyVmId } from './standingWebvh.js';
|
|
41
41
|
export { retireUnlockCredential } from './retire.js';
|
|
42
42
|
//# sourceMappingURL=index.js.map
|
package/dist/unlock/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/unlock/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAA;AAM5B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAQ1B,OAAO,EACL,qBAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/unlock/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAA;AAM5B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAQ1B,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,mCAAmC,EACnC,gBAAgB,EAChB,eAAe,EACf,gCAAgC,EAChC,2BAA2B,EAC3B,aAAa,EACd,MAAM,oBAAoB,CAAA;AAQ3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/unlock/retire.d.ts
CHANGED
|
@@ -9,13 +9,6 @@
|
|
|
9
9
|
* inventory in the account's did:webvh document -- so retiring one is a real
|
|
10
10
|
* rotation, on the same stages the client-revocation cascade runs.
|
|
11
11
|
*
|
|
12
|
-
* 0. **The dependent-record re-mint** (the injected `remintDependentRecords`
|
|
13
|
-
* closure), against the PRE-edit document: the credential's ladder VM is
|
|
14
|
-
* about to be struck, and a struck VM rots every record and bridge
|
|
15
|
-
* delegation it signed for OTHER credentials -- the last-client transition
|
|
16
|
-
* signs siblings' records with one, and `currentAccountRecordSigners`
|
|
17
|
-
* accepts it. The stage names the doomed VM ids to the pass, which
|
|
18
|
-
* re-signs those records under a key that outlives the edit.
|
|
19
12
|
* 1. **The document inventory edit** (`removeUnlockKey`): the credential's
|
|
20
13
|
* `keyAgreement` entry (verbatim key or commitment) and its committed
|
|
21
14
|
* update-key hash leave the document in one log entry. That kills the
|
|
@@ -36,21 +29,15 @@
|
|
|
36
29
|
* inventory still standing would simply re-escrow the credential and look
|
|
37
30
|
* healthy.
|
|
38
31
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* retirement before anything is published, unlike the annex closure at 1b.
|
|
49
|
-
*
|
|
50
|
-
* That corrects what this module used to reason. A retired credential's own
|
|
51
|
-
* bridge delegation does die with its unlock Space, which the app deletes as
|
|
52
|
-
* part of the change-method ceremony. Its ladder VM is the part that reaches
|
|
53
|
-
* further: other credentials' records and bridges chain through it.
|
|
32
|
+
* No stage runs before the edit, and no sibling credential's record is
|
|
33
|
+
* touched anywhere in the ceremony. Every unlock record's frame proof is
|
|
34
|
+
* signed by its own credential's unlock identity key, and its bridge and
|
|
35
|
+
* `delegatedClients` sibling delegations by that credential's own ladder VM
|
|
36
|
+
* (`decisions/0019`), so the only record this strike can rot is the retired
|
|
37
|
+
* credential's own -- which dies with the unlock Space the app deletes as
|
|
38
|
+
* part of the change-method ceremony. A sibling credential's bridge is
|
|
39
|
+
* refreshed by that credential's own login, on the three staleness axes
|
|
40
|
+
* (expiry, the renewal window, a signer that left the document).
|
|
54
41
|
*
|
|
55
42
|
* The client annex reach is its own stage (1b, the injected
|
|
56
43
|
* `retireClientAnnexInventory` closure), between the document edit and the
|
|
@@ -71,12 +58,11 @@
|
|
|
71
58
|
* skip, so the roster rotation -- the ceremony's essential remedy -- always
|
|
72
59
|
* runs.
|
|
73
60
|
*
|
|
74
|
-
*
|
|
61
|
+
* The edit carries the retirement gate (`decisions/0015`): a credential
|
|
75
62
|
* retired here carries a ladder, so its ladder VM must be claimed -- by the
|
|
76
63
|
* seed, or by the log's attribution -- before the edit strikes anything. A
|
|
77
64
|
* claim that strikes nothing while ladder VMs stand unclaimed refuses with
|
|
78
|
-
* `UnclaimedLadderVmRetirementError`,
|
|
79
|
-
* writes a sibling record and again inside the edit before its entry
|
|
65
|
+
* `UnclaimedLadderVmRetirementError`, inside the edit before its entry
|
|
80
66
|
* publishes, so the credential still stands and the log is unchanged. The
|
|
81
67
|
* leftover the gate closes is a retired credential's VM standing under
|
|
82
68
|
* `capabilityDelegation`, which could still sign a DELETE-only capability on
|
|
@@ -86,15 +72,6 @@
|
|
|
86
72
|
* removal shares the edit but not the gate: a code carries no ladder VM to
|
|
87
73
|
* claim.
|
|
88
74
|
*
|
|
89
|
-
* Stage 0 and stage 1 each read the log for themselves, and the two reads are
|
|
90
|
-
* tied by a cross-check rather than by luck: stage 0 hands its attributed
|
|
91
|
-
* ladder VM ids to the edit as `expectedLadderVmIds`, and the edit refuses
|
|
92
|
-
* before writing when its own attribution resolves a different set
|
|
93
|
-
* (`LadderInventoryDriftError`). So a concurrent ceremony, or a host serving
|
|
94
|
-
* different log versions to the two reads, cannot leave the strike diverging
|
|
95
|
-
* from what the re-mint pass acted on. Both reads take the caller's
|
|
96
|
-
* `pinStore` and `logId`, so both are checked against the same chain head.
|
|
97
|
-
*
|
|
98
75
|
* Convergence is the design: every stage detects its own completion from
|
|
99
76
|
* durable state alone -- the inventory edit no-ops when the document is already
|
|
100
77
|
* settled, the rotation no-ops once every current-epoch recipient is
|
|
@@ -113,7 +90,6 @@ import type { EncryptionDescriptorStore } from '@interop/was-client/edv';
|
|
|
113
90
|
import { type CascadeCollections, type RosterSealReport, type UserKey, type UserKeyCascadeResult } from '../keys/index.js';
|
|
114
91
|
import type { WebvhIdStore } from '../webvh/index.js';
|
|
115
92
|
import type { AccountLogSigner } from '../webvh/accountEntry.js';
|
|
116
|
-
import type { ResourceLogPinStore } from '@interop/vh-resource-log';
|
|
117
93
|
import { type LadderVmRemovalReport, type StandingUnlockKeys } from './standingWebvh.js';
|
|
118
94
|
/**
|
|
119
95
|
* What a completed retirement reports: whether the roster actually rotated on
|
|
@@ -121,9 +97,7 @@ import { type LadderVmRemovalReport, type StandingUnlockKeys } from './standingW
|
|
|
121
97
|
* roster's seal-backstop report (present when the roster store is sealable and
|
|
122
98
|
* the roster stage ran), the per-collection fan-out result, the document as
|
|
123
99
|
* the inventory edit left it, the rotated key with the roster descriptor it
|
|
124
|
-
* was read from,
|
|
125
|
-
* (`dependentRecords`, absent when no closure was supplied), and the
|
|
126
|
-
* inventory edit's ladder VM report (`ladderVm`: what the edit struck, and
|
|
100
|
+
* was read from, and the inventory edit's ladder VM report (`ladderVm`: what the edit struck, and
|
|
127
101
|
* what stands unclaimed after it -- a seedless strike that claimed nothing
|
|
128
102
|
* reports its credential's VM there rather than reading as clean).
|
|
129
103
|
*/
|
|
@@ -136,7 +110,6 @@ export interface UnlockCredentialRetirementResult {
|
|
|
136
110
|
userKey?: UserKey;
|
|
137
111
|
rosterDescriptor?: CollectionEncryption;
|
|
138
112
|
clientAnnex?: ClientAnnexInventoryRetirement;
|
|
139
|
-
dependentRecords?: unknown;
|
|
140
113
|
}
|
|
141
114
|
/**
|
|
142
115
|
* What the annex-inventory stage reports: `struck` (a strike entry dropped
|
|
@@ -178,15 +151,9 @@ export interface ClientAnnexInventoryRetirement {
|
|
|
178
151
|
* behavior is unchanged (see `removeUnlockKey`)
|
|
179
152
|
* @param [options.expectedDid] {string} the account DID from the caller's
|
|
180
153
|
* stored account pointer; supplied, the inventory edit refuses a `did.jsonl`
|
|
181
|
-
* resolving to any other account
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
* attribution read and the inventory edit's own read inside its
|
|
185
|
-
* conflict-retry loop -- so a served rollback or fork is refused before
|
|
186
|
-
* anything is published
|
|
187
|
-
* @param [options.logId] {string} the account log's pin slot
|
|
188
|
-
* (`accountLogPinId({ spaceId })`); required whenever a `pinStore` is
|
|
189
|
-
* supplied
|
|
154
|
+
* resolving to any other account. The edit's own read inside its
|
|
155
|
+
* conflict-retry loop runs under the store's chain-head pin, so a served
|
|
156
|
+
* rollback or fork is refused before anything is published
|
|
190
157
|
* @param [options.verb] {string} what the caller is doing, for the
|
|
191
158
|
* pending-rotation refusal message (e.g. `'changing your passphrase'`)
|
|
192
159
|
* @param options.rosterStore {EncryptionDescriptorStore} the
|
|
@@ -200,15 +167,6 @@ export interface ClientAnnexInventoryRetirement {
|
|
|
200
167
|
* called with `{ userKey, latestEpochId, descriptor }` after the roster read
|
|
201
168
|
* and BEFORE the fan-out. The key and the epoch pin must persist atomically
|
|
202
169
|
* @param options.collections {CascadeCollections} the fan-out's work
|
|
203
|
-
* @param [options.remintDependentRecords] {Function} `({ document,
|
|
204
|
-
* retiringKeyMultibases }) => Promise<unknown>` -- the dependent-record
|
|
205
|
-
* re-mint (stage 0), run against the PRE-edit document with the ladder VM
|
|
206
|
-
* ids this retirement is about to strike. Fail-closed: a throw aborts the
|
|
207
|
-
* retirement before the document edit. Absent, the stage is skipped and no
|
|
208
|
-
* log read happens for it (the no-WAS path). It is also skipped on the
|
|
209
|
-
* ladder arm: every unlock record is signed by its own credential's ladder
|
|
210
|
-
* VM, so this strike rots no sibling record, and there is nothing to
|
|
211
|
-
* re-mint (`decisions/0019`)
|
|
212
170
|
* @param [options.retireClientAnnexInventory] {Function} `({ document }) =>
|
|
213
171
|
* Promise<ClientAnnexInventoryRetirement>` -- the annex reach (stage 1b in
|
|
214
172
|
* the module doc), run against the post-edit document; a throw is caught
|
|
@@ -218,15 +176,13 @@ export interface ClientAnnexInventoryRetirement {
|
|
|
218
176
|
* the session keeps operating without a re-login
|
|
219
177
|
* @returns {Promise<UnlockCredentialRetirementResult>}
|
|
220
178
|
*/
|
|
221
|
-
export declare function retireUnlockCredential({ idStore, signer, unlockKeys, ladderSeed, projectionStore, expectedDid,
|
|
179
|
+
export declare function retireUnlockCredential({ idStore, signer, unlockKeys, ladderSeed, projectionStore, expectedDid, verb, rosterStore, userKey, clientKeyAgreementKey, pinnedEpochId, onUserKeyAdopted, collections, retireClientAnnexInventory, onRotationAdopted }: {
|
|
222
180
|
idStore: WebvhIdStore;
|
|
223
181
|
signer: AccountLogSigner;
|
|
224
182
|
unlockKeys: StandingUnlockKeys;
|
|
225
183
|
ladderSeed?: Uint8Array;
|
|
226
184
|
projectionStore?: Pick<WebvhIdStore, 'getIdResourceRaw' | 'putIdResource'>;
|
|
227
185
|
expectedDid?: string;
|
|
228
|
-
pinStore?: ResourceLogPinStore;
|
|
229
|
-
logId?: string;
|
|
230
186
|
verb?: string;
|
|
231
187
|
rosterStore: EncryptionDescriptorStore;
|
|
232
188
|
userKey?: UserKey;
|
|
@@ -238,10 +194,6 @@ export declare function retireUnlockCredential({ idStore, signer, unlockKeys, la
|
|
|
238
194
|
descriptor: CollectionEncryption;
|
|
239
195
|
}) => Promise<void>;
|
|
240
196
|
collections: CascadeCollections;
|
|
241
|
-
remintDependentRecords?: (options: {
|
|
242
|
-
document: object;
|
|
243
|
-
retiringKeyMultibases: string[];
|
|
244
|
-
}) => Promise<unknown>;
|
|
245
197
|
retireClientAnnexInventory?: (options: {
|
|
246
198
|
document: object;
|
|
247
199
|
}) => Promise<ClientAnnexInventoryRetirement>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retire.d.ts","sourceRoot":"","sources":["../../src/unlock/retire.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"retire.d.ts","sourceRoot":"","sources":["../../src/unlock/retire.ts"],"names":[],"mappings":"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"}
|
package/dist/unlock/retire.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { rotateRosterToDocumentAndCascade } from '../keys/index.js';
|
|
2
|
-
import {
|
|
3
|
-
import { assertLadderVmClaimed, attributeUnlockLadderInventory, ladderVmClaimOf, removeUnlockKey, unlockKeyVmId } from './standingWebvh.js';
|
|
2
|
+
import { removeUnlockKey } from './standingWebvh.js';
|
|
4
3
|
/**
|
|
5
4
|
* Retires one standing unlock credential from an account. See the module doc
|
|
6
5
|
* for the order and the convergence story. Once the inventory edit lands, a
|
|
@@ -28,15 +27,9 @@ import { assertLadderVmClaimed, attributeUnlockLadderInventory, ladderVmClaimOf,
|
|
|
28
27
|
* behavior is unchanged (see `removeUnlockKey`)
|
|
29
28
|
* @param [options.expectedDid] {string} the account DID from the caller's
|
|
30
29
|
* stored account pointer; supplied, the inventory edit refuses a `did.jsonl`
|
|
31
|
-
* resolving to any other account
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* attribution read and the inventory edit's own read inside its
|
|
35
|
-
* conflict-retry loop -- so a served rollback or fork is refused before
|
|
36
|
-
* anything is published
|
|
37
|
-
* @param [options.logId] {string} the account log's pin slot
|
|
38
|
-
* (`accountLogPinId({ spaceId })`); required whenever a `pinStore` is
|
|
39
|
-
* supplied
|
|
30
|
+
* resolving to any other account. The edit's own read inside its
|
|
31
|
+
* conflict-retry loop runs under the store's chain-head pin, so a served
|
|
32
|
+
* rollback or fork is refused before anything is published
|
|
40
33
|
* @param [options.verb] {string} what the caller is doing, for the
|
|
41
34
|
* pending-rotation refusal message (e.g. `'changing your passphrase'`)
|
|
42
35
|
* @param options.rosterStore {EncryptionDescriptorStore} the
|
|
@@ -50,15 +43,6 @@ import { assertLadderVmClaimed, attributeUnlockLadderInventory, ladderVmClaimOf,
|
|
|
50
43
|
* called with `{ userKey, latestEpochId, descriptor }` after the roster read
|
|
51
44
|
* and BEFORE the fan-out. The key and the epoch pin must persist atomically
|
|
52
45
|
* @param options.collections {CascadeCollections} the fan-out's work
|
|
53
|
-
* @param [options.remintDependentRecords] {Function} `({ document,
|
|
54
|
-
* retiringKeyMultibases }) => Promise<unknown>` -- the dependent-record
|
|
55
|
-
* re-mint (stage 0), run against the PRE-edit document with the ladder VM
|
|
56
|
-
* ids this retirement is about to strike. Fail-closed: a throw aborts the
|
|
57
|
-
* retirement before the document edit. Absent, the stage is skipped and no
|
|
58
|
-
* log read happens for it (the no-WAS path). It is also skipped on the
|
|
59
|
-
* ladder arm: every unlock record is signed by its own credential's ladder
|
|
60
|
-
* VM, so this strike rots no sibling record, and there is nothing to
|
|
61
|
-
* re-mint (`decisions/0019`)
|
|
62
46
|
* @param [options.retireClientAnnexInventory] {Function} `({ document }) =>
|
|
63
47
|
* Promise<ClientAnnexInventoryRetirement>` -- the annex reach (stage 1b in
|
|
64
48
|
* the module doc), run against the post-edit document; a throw is caught
|
|
@@ -68,65 +52,7 @@ import { assertLadderVmClaimed, attributeUnlockLadderInventory, ladderVmClaimOf,
|
|
|
68
52
|
* the session keeps operating without a re-login
|
|
69
53
|
* @returns {Promise<UnlockCredentialRetirementResult>}
|
|
70
54
|
*/
|
|
71
|
-
export async function retireUnlockCredential({ idStore, signer, unlockKeys, ladderSeed, projectionStore, expectedDid,
|
|
72
|
-
// 0. The dependent-record re-mint, against the PRE-edit document: whatever
|
|
73
|
-
// the doomed ladder VM signed for OTHER credentials is re-signed under a
|
|
74
|
-
// key that outlives the edit. The pass is named the VM ids the attribution
|
|
75
|
-
// claims for this credential, and it runs even when that list is empty:
|
|
76
|
-
// the pass has an expiry axis of its own, and a near-lapse sibling bridge
|
|
77
|
-
// is worth refreshing in the same window. Fail-closed -- a throw aborts
|
|
78
|
-
// here, with the credential still standing.
|
|
79
|
-
const pinned = {
|
|
80
|
-
...(pinStore ? { pinStore } : {}),
|
|
81
|
-
...(logId !== undefined ? { logId } : {})
|
|
82
|
-
};
|
|
83
|
-
let dependentRecords;
|
|
84
|
-
let expectedLadderVmIds;
|
|
85
|
-
// The stage is the enrolled branch's alone. On the ladder arm a record's
|
|
86
|
-
// bridge and sibling are signed by its own credential's ladder VM, so this
|
|
87
|
-
// strike reaches no record but the retired credential's own, which the
|
|
88
|
-
// caller deletes with its unlock Space (`decisions/0019`).
|
|
89
|
-
const ranRemint = Boolean(remintDependentRecords) && signer.kind === 'client';
|
|
90
|
-
if (ranRemint && remintDependentRecords) {
|
|
91
|
-
const published = await readPublishedLogOrThrow({
|
|
92
|
-
idStore,
|
|
93
|
-
...(expectedDid !== undefined ? { expectedDid } : {}),
|
|
94
|
-
...pinned,
|
|
95
|
-
missingMessage: 'did:webvh: did.jsonl is missing; nothing to enroll into.'
|
|
96
|
-
});
|
|
97
|
-
const inventory = await attributeUnlockLadderInventory({
|
|
98
|
-
log: published.log,
|
|
99
|
-
did: published.did,
|
|
100
|
-
unlockKeys,
|
|
101
|
-
...(ladderSeed ? { ladderSeed } : {})
|
|
102
|
-
});
|
|
103
|
-
// The gate, before the pass writes anything: a claim that strikes no
|
|
104
|
-
// ladder VM while VMs stand unclaimed refuses here, with the credential
|
|
105
|
-
// still standing and no sibling record touched.
|
|
106
|
-
await assertLadderVmClaimed({
|
|
107
|
-
log: published.log,
|
|
108
|
-
doc: published.doc,
|
|
109
|
-
credentialVmId: unlockKeyVmId({
|
|
110
|
-
did: published.did,
|
|
111
|
-
keyAgreement: unlockKeys.keyAgreement
|
|
112
|
-
}),
|
|
113
|
-
claim: await ladderVmClaimOf({
|
|
114
|
-
doc: published.doc,
|
|
115
|
-
did: published.did,
|
|
116
|
-
inventory,
|
|
117
|
-
...(ladderSeed ? { ladderSeed } : {})
|
|
118
|
-
}),
|
|
119
|
-
anchorKeyMultibase: unlockKeys.updateKeyMultibase
|
|
120
|
-
});
|
|
121
|
-
// What the edit's own attribution must resolve to: the pass below acts on
|
|
122
|
-
// this list, so an edit that resolved a different one would strike
|
|
123
|
-
// something the pass never covered.
|
|
124
|
-
expectedLadderVmIds = inventory.ladderVmIds;
|
|
125
|
-
dependentRecords = await remintDependentRecords({
|
|
126
|
-
document: published.doc,
|
|
127
|
-
retiringKeyMultibases: inventory.ladderVmIds
|
|
128
|
-
});
|
|
129
|
-
}
|
|
55
|
+
export async function retireUnlockCredential({ idStore, signer, unlockKeys, ladderSeed, projectionStore, expectedDid, verb, rosterStore, userKey, clientKeyAgreementKey, pinnedEpochId, onUserKeyAdopted, collections, retireClientAnnexInventory, onRotationAdopted }) {
|
|
130
56
|
// 1. The document inventory edit -- the credential's standing, first. It
|
|
131
57
|
// resolves the document as it now stands, which is what stage 2 resolves
|
|
132
58
|
// its remaining recipients from.
|
|
@@ -136,10 +62,7 @@ export async function retireUnlockCredential({ idStore, signer, unlockKeys, ladd
|
|
|
136
62
|
unlockKeys,
|
|
137
63
|
...(ladderSeed ? { ladderSeed } : {}),
|
|
138
64
|
...(projectionStore ? { projectionStore } : {}),
|
|
139
|
-
...(expectedLadderVmIds !== undefined ? { expectedLadderVmIds } : {}),
|
|
140
|
-
requireLadderVmClaim: true,
|
|
141
65
|
...(expectedDid !== undefined ? { expectedDid } : {}),
|
|
142
|
-
...pinned,
|
|
143
66
|
...(verb !== undefined ? { verb } : {})
|
|
144
67
|
});
|
|
145
68
|
// 1b. The annex reach, against the post-edit document: strike the
|
|
@@ -178,8 +101,7 @@ export async function retireUnlockCredential({ idStore, signer, unlockKeys, ladd
|
|
|
178
101
|
ladderVm,
|
|
179
102
|
collections: tail.collections,
|
|
180
103
|
document: doc,
|
|
181
|
-
...(clientAnnex ? { clientAnnex } : {})
|
|
182
|
-
...(ranRemint ? { dependentRecords } : {})
|
|
104
|
+
...(clientAnnex ? { clientAnnex } : {})
|
|
183
105
|
};
|
|
184
106
|
}
|
|
185
107
|
if (tail.rotated) {
|
|
@@ -193,8 +115,7 @@ export async function retireUnlockCredential({ idStore, signer, unlockKeys, ladd
|
|
|
193
115
|
document: doc,
|
|
194
116
|
userKey: tail.userKey,
|
|
195
117
|
rosterDescriptor: tail.rosterDescriptor,
|
|
196
|
-
...(clientAnnex ? { clientAnnex } : {})
|
|
197
|
-
...(ranRemint ? { dependentRecords } : {})
|
|
118
|
+
...(clientAnnex ? { clientAnnex } : {})
|
|
198
119
|
};
|
|
199
120
|
}
|
|
200
121
|
//# sourceMappingURL=retire.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retire.js","sourceRoot":"","sources":["../../src/unlock/retire.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retire.js","sourceRoot":"","sources":["../../src/unlock/retire.ts"],"names":[],"mappings":"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"}
|