@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/README.md
CHANGED
|
@@ -27,11 +27,12 @@ The subpaths:
|
|
|
27
27
|
|
|
28
28
|
- **`@interop/wallet-core/sync`** -- the Wallet Attached Storage (WAS)
|
|
29
29
|
replication engine core: the `SyncEngine` orchestration (single-flight,
|
|
30
|
-
migrate-once,
|
|
31
|
-
`
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
migrate-once, memoized provisioning invalidated on demand via
|
|
31
|
+
`invalidateProvisioning`, backoff), the `runPull` / `runPush` algorithms, the
|
|
32
|
+
replica-side `SyncStore` seam, and the generic `SyncedCollectionSpec` shape.
|
|
33
|
+
The wire contract and port (`WasSyncPort`, `WireDoc`, `DocCipher`, ...) are
|
|
34
|
+
re-exported from [`@interop/was-client`](https://npm.im/@interop/was-client)
|
|
35
|
+
so an engine consumer imports one package.
|
|
35
36
|
|
|
36
37
|
- **`@interop/wallet-core/space`** -- the wallet Space layout contract: the
|
|
37
38
|
shared collection ids and descriptive specs (`private-credentials`,
|
|
@@ -109,7 +110,9 @@ The subpaths:
|
|
|
109
110
|
the account document no longer keys. Also `ensureWalletSpaceEpochs`, the
|
|
110
111
|
provision-time install of each encrypted wallet collection's key epoch[0] (a
|
|
111
112
|
fresh random epoch key wrapped to the user key) -- the EDV-bearing second step
|
|
112
|
-
of `provisionWalletSpace`. Also
|
|
113
|
+
of `provisionWalletSpace`. Also `walletSpaceProvisioner`, which builds the
|
|
114
|
+
sync engine's `ensureProvisioned` closure over both steps, single-flight
|
|
115
|
+
across concurrent callers. Also the enrolled-client display labels
|
|
113
116
|
(`key-map/client-labels.json`) and their WAS-backed store. Also the client-key
|
|
114
117
|
record codec: the contents and strict validation of the local record each
|
|
115
118
|
wallet client keeps its own key material in (storage and wrapping stay
|
|
@@ -124,8 +127,9 @@ The subpaths:
|
|
|
124
127
|
|
|
125
128
|
- **`@interop/wallet-core/descriptors`** -- collection encryption-descriptor
|
|
126
129
|
acquisition (fetch / cache / offline fallback), the log-governed descriptor
|
|
127
|
-
source (every read re-verifies the governing resource log
|
|
128
|
-
|
|
130
|
+
source (every read re-verifies the governing resource log, keyed per
|
|
131
|
+
collection by `collectionDescriptorLogPinId`), and the unknown-epoch refresh
|
|
132
|
+
policy, including a self-refreshing EDV document cipher.
|
|
129
133
|
|
|
130
134
|
- **`@interop/wallet-core/keyring`** -- the unlock layer: the unlock derivation,
|
|
131
135
|
the signed `{ version, encryption, wrapped, proof }` account-pointer record
|
|
@@ -41,10 +41,11 @@
|
|
|
41
41
|
* installing epoch[0] under it on a collection the earlier run never
|
|
42
42
|
* reached would key that collection to nothing, permanently, since the
|
|
43
43
|
* install is create-if-absent and every later ensure adopts it. So the
|
|
44
|
-
* stage is
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
44
|
+
* stage is refused whole by `ensureWalletSpaceEpochs`'s mint gate (the
|
|
45
|
+
* roster descriptor is handed to it) and reported on `epochsSkipped`;
|
|
46
|
+
* the caller that recovers the roster's real key is the one installer.
|
|
47
|
+
* With both gates the tear heal is always clean: no roster means no
|
|
48
|
+
* epochs, and a fresh user key re-runs both.
|
|
48
49
|
* 6. Space-controller promotion, last -- every earlier stage ran under the
|
|
49
50
|
* bootstrap did:key the Space's stored controller authorizes.
|
|
50
51
|
*
|
|
@@ -59,7 +60,6 @@ import type { DIDLog } from '@interop/did-method-webvh';
|
|
|
59
60
|
import type { KmsAuthenticationBinding, PublishedWebvhLog, WebvhIdStore } from '../webvh/didWebvh.js';
|
|
60
61
|
import type { UnlockKeyAgreementPublication } from '../unlock/standingWebvh.js';
|
|
61
62
|
import { type UserKey } from '../keys/index.js';
|
|
62
|
-
import type { ResourceLogPinStore } from '@interop/vh-resource-log';
|
|
63
63
|
import { type AccountGenesisResult } from '../genesis/accountGenesis.js';
|
|
64
64
|
import { type StageNotifier } from '../log.js';
|
|
65
65
|
/**
|
|
@@ -121,9 +121,6 @@ export declare function mintCredentialAnchoredAccountKeySet(): Promise<{
|
|
|
121
121
|
* @param [options.expectedDid] {string} the account DID, when the caller
|
|
122
122
|
* holds a pointer that already names one (a heal re-run); a fresh signup
|
|
123
123
|
* and a fresh-terminal heal legitimately hold none
|
|
124
|
-
* @param [options.accountLogPinStore] {ResourceLogPinStore} the chain-head
|
|
125
|
-
* pins the genesis read and create ride (a transient signup passes the
|
|
126
|
-
* visit's in-memory store)
|
|
127
124
|
* @param [options.onDidPublished] {Function} `({ did }) => Promise<void>`
|
|
128
125
|
* @param [options.promoteController] {boolean} default `true`; an app whose
|
|
129
126
|
* account pointer must durably name the DID first (freewallet's record
|
|
@@ -139,7 +136,7 @@ export declare function mintCredentialAnchoredAccountKeySet(): Promise<{
|
|
|
139
136
|
* stage adopted or minted, and which of the two it was -- the head is only
|
|
140
137
|
* safely reusable downstream when this run minted it
|
|
141
138
|
*/
|
|
142
|
-
export declare function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl, spaceId, ladderSeed, keyAgreement, standingRecipient, userKey, idStore, rosterStoreFor, provideKmsAuthentication, expectedDid,
|
|
139
|
+
export declare function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl, spaceId, ladderSeed, keyAgreement, standingRecipient, userKey, idStore, rosterStoreFor, provideKmsAuthentication, expectedDid, onDidPublished, promoteController, onStage }: {
|
|
143
140
|
was: WasClient;
|
|
144
141
|
wasServerUrl: string;
|
|
145
142
|
spaceId: string;
|
|
@@ -156,7 +153,6 @@ export declare function ensureCredentialAnchoredAccountGenesis({ was, wasServerU
|
|
|
156
153
|
spaceReady: Promise<unknown>;
|
|
157
154
|
}) => Promise<KmsAuthenticationBinding | undefined>;
|
|
158
155
|
expectedDid?: string;
|
|
159
|
-
accountLogPinStore?: ResourceLogPinStore;
|
|
160
156
|
onDidPublished?: (published: {
|
|
161
157
|
did: string;
|
|
162
158
|
}) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentialAnchoredGenesis.d.ts","sourceRoot":"","sources":["../../src/clientAnnex/credentialAnchoredGenesis.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"credentialAnchoredGenesis.d.ts","sourceRoot":"","sources":["../../src/clientAnnex/credentialAnchoredGenesis.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAwB,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAIxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,YAAY,EACb,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAGL,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AAM7D;;;;;;;;GAQG;AACH,wBAAsB,mCAAmC,IAAI,OAAO,CAAC;IACnE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAC3B,CAAC,CAED;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,wBAAsB,sCAAsC,CAAC,EAC3D,GAAG,EACH,YAAY,EACZ,OAAO,EACP,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,cAAc,EACd,iBAAwB,EACxB,OAAO,EACR,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,6BAA6B,CAAA;IAC3C,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,YAAY,CAAA;IACrB,cAAc,EAAE,CAAC,OAAO,EAAE;QACxB,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;KACZ,KAAK,yBAAyB,CAAA;IAC/B,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE;QACnC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAC7B,KAAK,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAA;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,GAAG,OAAO,CACT,oBAAoB,GAAG;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAC5E,CAqIA"}
|
|
@@ -41,10 +41,11 @@
|
|
|
41
41
|
* installing epoch[0] under it on a collection the earlier run never
|
|
42
42
|
* reached would key that collection to nothing, permanently, since the
|
|
43
43
|
* install is create-if-absent and every later ensure adopts it. So the
|
|
44
|
-
* stage is
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
44
|
+
* stage is refused whole by `ensureWalletSpaceEpochs`'s mint gate (the
|
|
45
|
+
* roster descriptor is handed to it) and reported on `epochsSkipped`;
|
|
46
|
+
* the caller that recovers the roster's real key is the one installer.
|
|
47
|
+
* With both gates the tear heal is always clean: no roster means no
|
|
48
|
+
* epochs, and a fresh user key re-runs both.
|
|
48
49
|
* 6. Space-controller promotion, last -- every earlier stage ran under the
|
|
49
50
|
* bootstrap did:key the Space's stored controller authorizes.
|
|
50
51
|
*
|
|
@@ -58,6 +59,7 @@ import { ladderVmAgent } from './zcap.js';
|
|
|
58
59
|
import { ensureLadderAnchoredDidWebvh } from './ladderAnchored.js';
|
|
59
60
|
import { ensureWalletSpaceEpochs, mintUserKey } from '../keys/index.js';
|
|
60
61
|
import { AccountGenesisSpaceError, ensurePromotedSpaceController, mintSpaceId } from '../genesis/accountGenesis.js';
|
|
62
|
+
import { startKmsAuthentication } from '../genesis/kmsAuthentication.js';
|
|
61
63
|
import { stageNotifier } from '../log.js';
|
|
62
64
|
import { CONTROLLER_PROMOTION_STAGE } from './stages.js';
|
|
63
65
|
/**
|
|
@@ -118,9 +120,6 @@ export async function mintCredentialAnchoredAccountKeySet() {
|
|
|
118
120
|
* @param [options.expectedDid] {string} the account DID, when the caller
|
|
119
121
|
* holds a pointer that already names one (a heal re-run); a fresh signup
|
|
120
122
|
* and a fresh-terminal heal legitimately hold none
|
|
121
|
-
* @param [options.accountLogPinStore] {ResourceLogPinStore} the chain-head
|
|
122
|
-
* pins the genesis read and create ride (a transient signup passes the
|
|
123
|
-
* visit's in-memory store)
|
|
124
123
|
* @param [options.onDidPublished] {Function} `({ did }) => Promise<void>`
|
|
125
124
|
* @param [options.promoteController] {boolean} default `true`; an app whose
|
|
126
125
|
* account pointer must durably name the DID first (freewallet's record
|
|
@@ -136,7 +135,7 @@ export async function mintCredentialAnchoredAccountKeySet() {
|
|
|
136
135
|
* stage adopted or minted, and which of the two it was -- the head is only
|
|
137
136
|
* safely reusable downstream when this run minted it
|
|
138
137
|
*/
|
|
139
|
-
export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl, spaceId, ladderSeed, keyAgreement, standingRecipient, userKey, idStore, rosterStoreFor, provideKmsAuthentication, expectedDid,
|
|
138
|
+
export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl, spaceId, ladderSeed, keyAgreement, standingRecipient, userKey, idStore, rosterStoreFor, provideKmsAuthentication, expectedDid, onDidPublished, promoteController = true, onStage }) {
|
|
140
139
|
const failed = [];
|
|
141
140
|
const stage = stageNotifier(onStage);
|
|
142
141
|
const bootstrap = await ladderVmAgent({ ladderSeed });
|
|
@@ -156,24 +155,10 @@ export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl
|
|
|
156
155
|
// the ladder-and-credential-only genesis rather than aborting: every later
|
|
157
156
|
// ceremony anchors in the ladder, and the document simply publishes no
|
|
158
157
|
// `authentication` relation.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
// a thunk rejecting with `undefined` is still a collected failure.
|
|
164
|
-
let kmsFailed = false;
|
|
165
|
-
let kmsFailure;
|
|
166
|
-
try {
|
|
167
|
-
kmsRun = provideKmsAuthentication?.({ spaceReady });
|
|
168
|
-
}
|
|
169
|
-
catch (err) {
|
|
170
|
-
kmsFailed = true;
|
|
171
|
-
kmsFailure = err;
|
|
172
|
-
}
|
|
173
|
-
// A Space that never came up returns below while the thunk is still in
|
|
174
|
-
// flight, so its rejection is claimed here rather than surfacing as an
|
|
175
|
-
// unhandled one.
|
|
176
|
-
kmsRun?.catch(() => { });
|
|
158
|
+
const kms = startKmsAuthentication({
|
|
159
|
+
...(provideKmsAuthentication ? { provideKmsAuthentication } : {}),
|
|
160
|
+
spaceReady
|
|
161
|
+
});
|
|
177
162
|
try {
|
|
178
163
|
await spaceReady;
|
|
179
164
|
}
|
|
@@ -183,21 +168,12 @@ export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl
|
|
|
183
168
|
stage('space-provisioning');
|
|
184
169
|
// The join: the genesis entry carries the KMS binding, so it waits on the
|
|
185
170
|
// whole stage even though the Space no longer does.
|
|
186
|
-
|
|
187
|
-
if (
|
|
188
|
-
|
|
189
|
-
kmsAuthentication = await kmsRun;
|
|
190
|
-
}
|
|
191
|
-
catch (err) {
|
|
192
|
-
kmsFailed = true;
|
|
193
|
-
kmsFailure = err;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
if (kmsFailed) {
|
|
197
|
-
failed.push({ stage: 'kmsAuthentication', error: kmsFailure });
|
|
171
|
+
const kmsAuthentication = await kms.join();
|
|
172
|
+
if (kmsAuthentication.failed) {
|
|
173
|
+
failed.push({ stage: 'kmsAuthentication', error: kmsAuthentication.error });
|
|
198
174
|
}
|
|
199
175
|
stage('kms-authentication');
|
|
200
|
-
const didWebKeys = kmsAuthentication?.keys;
|
|
176
|
+
const didWebKeys = kmsAuthentication.binding?.keys;
|
|
201
177
|
// 3. The ladder-anchored did:webvh genesis -- probe, adopt
|
|
202
178
|
// (ladder-attributed), or create-and-publish. Fatal on failure, like the
|
|
203
179
|
// enrolled-client stage.
|
|
@@ -206,13 +182,12 @@ export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl
|
|
|
206
182
|
wasServerUrl,
|
|
207
183
|
spaceId,
|
|
208
184
|
...(didWebKeys ? { didWebKeys } : {}),
|
|
209
|
-
...(kmsAuthentication?.etag !== undefined && {
|
|
210
|
-
keysJsonEtag: kmsAuthentication.etag
|
|
185
|
+
...(kmsAuthentication.binding?.etag !== undefined && {
|
|
186
|
+
keysJsonEtag: kmsAuthentication.binding.etag
|
|
211
187
|
}),
|
|
212
188
|
ladderSeed,
|
|
213
189
|
keyAgreement,
|
|
214
|
-
...(expectedDid !== undefined ? { expectedDid } : {})
|
|
215
|
-
...(accountLogPinStore ? { pinStore: accountLogPinStore } : {})
|
|
190
|
+
...(expectedDid !== undefined ? { expectedDid } : {})
|
|
216
191
|
});
|
|
217
192
|
await onDidPublished?.({ did });
|
|
218
193
|
stage('webvh-genesis');
|
|
@@ -237,25 +212,28 @@ export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl
|
|
|
237
212
|
}
|
|
238
213
|
stage('roster-genesis');
|
|
239
214
|
// 5. Epoch[0] on every encrypted roster collection, only behind a landed
|
|
240
|
-
// roster
|
|
241
|
-
//
|
|
242
|
-
//
|
|
215
|
+
// roster and through the fan-out's mint gate: the user key is memory-only
|
|
216
|
+
// here, and an adopted roster keyed to another run's key would otherwise
|
|
217
|
+
// have the collections installed under a throwaway (see the module doc).
|
|
243
218
|
let epochs;
|
|
244
219
|
let epochsSkipped;
|
|
245
220
|
if (rosterDescriptor) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
221
|
+
try {
|
|
222
|
+
const fanOut = await ensureWalletSpaceEpochs({
|
|
223
|
+
was,
|
|
224
|
+
spaceId,
|
|
225
|
+
userKey,
|
|
226
|
+
rosterDescriptor
|
|
227
|
+
});
|
|
228
|
+
if (fanOut.skipped) {
|
|
229
|
+
epochsSkipped = fanOut.skipped;
|
|
249
230
|
}
|
|
250
|
-
|
|
251
|
-
|
|
231
|
+
else {
|
|
232
|
+
epochs = fanOut;
|
|
252
233
|
}
|
|
253
234
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
rosterDescriptor.currentEpoch !== undefined
|
|
257
|
-
? { rosterEpochId: rosterDescriptor.currentEpoch }
|
|
258
|
-
: {};
|
|
235
|
+
catch (err) {
|
|
236
|
+
failed.push({ stage: 'epochs', error: err });
|
|
259
237
|
}
|
|
260
238
|
}
|
|
261
239
|
stage('collection-epochs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentialAnchoredGenesis.js","sourceRoot":"","sources":["../../src/clientAnnex/credentialAnchoredGenesis.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"credentialAnchoredGenesis.js","sourceRoot":"","sources":["../../src/clientAnnex/credentialAnchoredGenesis.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,17 +51,21 @@
|
|
|
51
51
|
* identity, the ladder-VM-signed generation delegation embedded while
|
|
52
52
|
* the auxiliary Space still answers to the bootstrap did:key, the
|
|
53
53
|
* Space's controller flipped to the account DID, and the pointer entry
|
|
54
|
-
* appended --
|
|
55
|
-
*
|
|
54
|
+
* appended -- moved as the ladder (`movePointerAsLadder`): each attempt
|
|
55
|
+
* attributes the ladder's current rung, reveals it when only its hash
|
|
56
|
+
* stands committed, and signs with it, under the caller's chain-head
|
|
57
|
+
* pin, so a sibling self-enrollment that spends the rung mid-run is
|
|
58
|
+
* climbed past rather than refused. Within THIS ceremony the
|
|
56
59
|
* sibling arm never fires: the sibling is only written by stage 4,
|
|
57
60
|
* strictly after the pointer entry, so a stage-3 tear leaves no
|
|
58
61
|
* sibling; the arm serves callers holding a standing invocation
|
|
59
62
|
* authority (the add/change-method fold), and the establishment's own
|
|
60
63
|
* bootstrap authority falls back to a fresh mint when a sibling-named
|
|
61
64
|
* Space refuses it.
|
|
62
|
-
* The
|
|
63
|
-
* before the re-bind: an account whose document no
|
|
64
|
-
* ladder refuses while the record is still in its
|
|
65
|
+
* The primitive's pre-mint rung attribution runs before anything is
|
|
66
|
+
* minted and strictly before the re-bind: an account whose document no
|
|
67
|
+
* longer anchors this ladder refuses while the record is still in its
|
|
68
|
+
* pre-re-bind shape.
|
|
65
69
|
* 4. The re-bind, through the same `bindRecord` hook: the full pointer (DID
|
|
66
70
|
* in), the ladder-VM-signed bridge and annex-Space sibling, and the
|
|
67
71
|
* management delegation to the account DID -- durably written BEFORE
|
|
@@ -91,18 +95,18 @@ import type { DIDLog } from '@interop/did-method-webvh';
|
|
|
91
95
|
import type { IKeyAgreementKey, IZcap } from '@interop/data-integrity-core';
|
|
92
96
|
import type { WasClient } from '@interop/was-client';
|
|
93
97
|
import type { EncryptionDescriptorStore } from '@interop/was-client/edv';
|
|
94
|
-
import type { ResourceLogPinStore } from '@interop/vh-resource-log';
|
|
95
98
|
import type { ZcapClient } from '@interop/ezcap';
|
|
96
99
|
import { type AccountGenesisResult } from '../genesis/accountGenesis.js';
|
|
97
100
|
import type { ClientWebvhUpdateKeys, KmsAuthenticationBinding, PublishedWebvhLog, WebvhIdStore } from '../webvh/didWebvh.js';
|
|
98
101
|
import type { ICapabilityAgent } from '../webvh/zcap.js';
|
|
99
102
|
import type { AccountPointer } from '../keyring/record.js';
|
|
100
103
|
import { type UserKey } from '../keys/index.js';
|
|
104
|
+
import { type LadderRung } from './ladder.js';
|
|
101
105
|
import { type StageNotifier } from '../log.js';
|
|
102
106
|
/**
|
|
103
107
|
* The standing members an unlock-methods registry entry records for the
|
|
104
108
|
* established credential: its roster kid and key-agreement multibase, the
|
|
105
|
-
*
|
|
109
|
+
* ladder's standing rung, the standing client's did:key, the bridge and
|
|
106
110
|
* sibling delegations' signer key ids and expiries, and the unlock
|
|
107
111
|
* key-agreement members the re-bind reported. The member names are the ones
|
|
108
112
|
* the registry already records; nothing here mints a new field.
|
|
@@ -188,9 +192,15 @@ export type CredentialAnchoredBindRecordHook = (options: {
|
|
|
188
192
|
* delegation while the Space still answers to its creation controller, flip
|
|
189
193
|
* the Space's controller to the account DID, then append the pointer entry
|
|
190
194
|
* -- strictly last in the block, so pointer-present implies every prior
|
|
191
|
-
* sub-step landed. The pointer entry signs
|
|
192
|
-
*
|
|
193
|
-
* pin
|
|
195
|
+
* sub-step landed. The pointer entry signs on the arm the caller states: an
|
|
196
|
+
* enrolled client's own update keys, or the ladder (attributed, revealed,
|
|
197
|
+
* and signed per attempt); every log touch rides the caller's chain-head pin
|
|
198
|
+
* store. On the ladder arm the rung is attributed BEFORE anything is minted,
|
|
199
|
+
* the pre-flight every pointer-moving arm runs: a ladder the log carries no
|
|
200
|
+
* rung of, and an ambiguous attribution, throw the ladder's own
|
|
201
|
+
* `LadderAttributionError` with no Space or generation minted, so a torn
|
|
202
|
+
* establishment never orphans an annex Space on an account that no longer
|
|
203
|
+
* anchors this ladder.
|
|
194
204
|
*
|
|
195
205
|
* Two invocation authorities, heal's pattern. A caller holding a standing
|
|
196
206
|
* invocation authority (`invocation`: an enrolled client's storage handle
|
|
@@ -215,8 +225,6 @@ export type CredentialAnchoredBindRecordHook = (options: {
|
|
|
215
225
|
* @param options.account {object} the VERIFIED account log view
|
|
216
226
|
* (`{ did, doc, log }`; never re-fetched here)
|
|
217
227
|
* @param options.wasServerUrl {string} the account pointer's host
|
|
218
|
-
* @param options.accountSpaceId {string} the ACCOUNT Space's id (the
|
|
219
|
-
* generation delegation's target subtree, and the account-log pin slot)
|
|
220
228
|
* @param options.ladderSeed {Uint8Array} the credential's ladder seed
|
|
221
229
|
* @param options.was {WasClient} the bootstrap storage client (the ladder
|
|
222
230
|
* VM's bare did:key), used by the fresh-mint arm
|
|
@@ -226,9 +234,18 @@ export type CredentialAnchoredBindRecordHook = (options: {
|
|
|
226
234
|
* `({ clientAnnexDid }) => Promise<IZcap>` -- the generation-delegation
|
|
227
235
|
* minter (ladder-VM-signed on a ladder-anchored account)
|
|
228
236
|
* @param options.idStore {WebvhIdStore} the ACCOUNT log's store
|
|
229
|
-
* @param
|
|
230
|
-
*
|
|
231
|
-
*
|
|
237
|
+
* @param options.signer {object} who signs the pointer entry:
|
|
238
|
+
* `{ kind: 'client', updateKeys }`, an enrolled client's own update keys
|
|
239
|
+
* (freewallet's remembered-login fold), or `{ kind: 'ladder' }`, under
|
|
240
|
+
* which the entry is moved as the ladder with the supplied `ladderSeed`
|
|
241
|
+
* (`movePointerAsLadder`): every attempt of its conflict retry attributes
|
|
242
|
+
* the ladder's current rung from the head it reads, reveals it when only
|
|
243
|
+
* its hash stands committed, and signs with it -- so a racing ceremony that
|
|
244
|
+
* spends the rung is climbed past. A pair fixed by the caller could not be,
|
|
245
|
+
* since the client arm's not-authorized refusal is not a conflict the retry
|
|
246
|
+
* re-runs on. Stated explicitly rather than read off `updateKeys`'
|
|
247
|
+
* absence, since the ladder arm reveals a rung into the world-readable
|
|
248
|
+
* `updateKeys` and an omission must not select it silently
|
|
232
249
|
* @param [options.delegatedClients] {IZcap} the record's sibling
|
|
233
250
|
* delegation, for the Space resolution's settled order
|
|
234
251
|
* @param [options.invocation] {object} a standing invocation authority for
|
|
@@ -239,8 +256,6 @@ export type CredentialAnchoredBindRecordHook = (options: {
|
|
|
239
256
|
* @param [options.logOnly] {boolean} pointer entries publish the log only
|
|
240
257
|
* (a bridge-delegated writer has no `did.json` projection rights); the
|
|
241
258
|
* establishment's root window omits it
|
|
242
|
-
* @param [options.pinStore] {ResourceLogPinStore} chain-head pins; slot
|
|
243
|
-
* keys are derived here per log
|
|
244
259
|
* @param [options.published] {PublishedWebvhLog} the same account head as
|
|
245
260
|
* `account`, complete with the ETag its read carried, when the caller holds
|
|
246
261
|
* one. The pointer entry's first attempt then builds on it -- one saved
|
|
@@ -248,15 +263,16 @@ export type CredentialAnchoredBindRecordHook = (options: {
|
|
|
248
263
|
* compare-and-swap falls through to a fresh pinned read
|
|
249
264
|
* @param [options.now] {number} epoch milliseconds, for tests
|
|
250
265
|
* @returns {Promise<object>} the pointed (or freshly minted) annex DID,
|
|
251
|
-
* the generation delegation when one was installed here, what ran,
|
|
252
|
-
*
|
|
266
|
+
* the generation delegation when one was installed here, what ran, on
|
|
267
|
+
* `accountLog` the account head this block leaves standing (the
|
|
253
268
|
* post-pointer-entry one when it wrote, the supplied `published` verbatim
|
|
254
|
-
* when the document already pointed at a generation
|
|
269
|
+
* when the document already pointed at a generation), and on the ladder
|
|
270
|
+
* arm `rung`: the rung the pointer entry was signed with when this call
|
|
271
|
+
* wrote one, else the ladder's currently attributed rung
|
|
255
272
|
*/
|
|
256
|
-
export declare function ensurePointedClientAnnexGeneration({ account, wasServerUrl,
|
|
273
|
+
export declare function ensurePointedClientAnnexGeneration({ account, wasServerUrl, ladderSeed, was, mintController, mintGenerationDelegation, idStore, signer, delegatedClients, invocation, logOnly, published, now }: {
|
|
257
274
|
account: Pick<PublishedWebvhLog, 'did' | 'doc' | 'log'>;
|
|
258
275
|
wasServerUrl: string;
|
|
259
|
-
accountSpaceId: string;
|
|
260
276
|
ladderSeed: Uint8Array;
|
|
261
277
|
was: WasClient;
|
|
262
278
|
mintController: string;
|
|
@@ -264,14 +280,18 @@ export declare function ensurePointedClientAnnexGeneration({ account, wasServerU
|
|
|
264
280
|
clientAnnexDid: string;
|
|
265
281
|
}) => Promise<IZcap>;
|
|
266
282
|
idStore: WebvhIdStore;
|
|
267
|
-
|
|
283
|
+
signer: {
|
|
284
|
+
kind: 'client';
|
|
285
|
+
updateKeys: ClientWebvhUpdateKeys;
|
|
286
|
+
} | {
|
|
287
|
+
kind: 'ladder';
|
|
288
|
+
};
|
|
268
289
|
delegatedClients?: IZcap;
|
|
269
290
|
invocation?: {
|
|
270
291
|
was: WasClient;
|
|
271
292
|
capability: IZcap;
|
|
272
293
|
};
|
|
273
294
|
logOnly?: boolean;
|
|
274
|
-
pinStore?: ResourceLogPinStore;
|
|
275
295
|
published?: PublishedWebvhLog;
|
|
276
296
|
now?: number;
|
|
277
297
|
}): Promise<{
|
|
@@ -280,6 +300,7 @@ export declare function ensurePointedClientAnnexGeneration({ account, wasServerU
|
|
|
280
300
|
generationMinted: boolean;
|
|
281
301
|
spaceMinted: boolean;
|
|
282
302
|
accountLog?: PublishedWebvhLog;
|
|
303
|
+
rung?: LadderRung;
|
|
283
304
|
}>;
|
|
284
305
|
/**
|
|
285
306
|
* Runs the whole credential-anchored establishment for one unlock credential
|
|
@@ -349,9 +370,6 @@ export declare function ensurePointedClientAnnexGeneration({ account, wasServerU
|
|
|
349
370
|
* invocation under the bootstrap did:key works (the signup's registry
|
|
350
371
|
* write). NOT swallowed here: a throw fails the establishment, so a hook
|
|
351
372
|
* that must be best-effort swallows its own failures
|
|
352
|
-
* @param [options.pinStore] {ResourceLogPinStore} the chain-head pin store
|
|
353
|
-
* for every log read here (a transient visit's in-memory handle, or a
|
|
354
|
-
* client-local one when a remembered caller seeds its own pin)
|
|
355
373
|
* @param [options.now] {number} epoch milliseconds, for tests
|
|
356
374
|
* @param [options.onStage] {StageNotifier} observational: called as each
|
|
357
375
|
* stage finishes, so a caller can time them, in the order of
|
|
@@ -406,7 +424,6 @@ export declare function establishCredentialAnchoredAccount(options: {
|
|
|
406
424
|
userKey: UserKey;
|
|
407
425
|
establishment: CredentialAnchoredEstablishment;
|
|
408
426
|
}) => Promise<void>;
|
|
409
|
-
pinStore?: ResourceLogPinStore;
|
|
410
427
|
now?: number;
|
|
411
428
|
onStage?: StageNotifier;
|
|
412
429
|
}): Promise<CredentialAnchoredEstablishment>;
|
|
@@ -459,7 +476,7 @@ export declare function rebindCredentialAnchoredRecord({ accountDid, pointer, la
|
|
|
459
476
|
* @param options {object}
|
|
460
477
|
* @param options.standing {object} the credential's standing client:
|
|
461
478
|
* `clientDid`, `keyAgreementKeyMultibase`, `recipientKid`
|
|
462
|
-
* @param options.updateKeyMultibase {string} the attributed
|
|
479
|
+
* @param options.updateKeyMultibase {string} the ladder's attributed rung
|
|
463
480
|
* @param [options.bridge] {IZcap} the record's bridge delegation
|
|
464
481
|
* @param [options.sibling] {IZcap} the record's `delegatedClients` sibling
|
|
465
482
|
* @param [options.unlock] {object} the unlock key-agreement members, from
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"establish.d.ts","sourceRoot":"","sources":["../../src/clientAnnex/establish.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"establish.d.ts","sourceRoot":"","sources":["../../src/clientAnnex/establish.ts"],"names":[],"mappings":"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"}
|