@interop/wallet-core 0.23.1 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +41 -22
  2. package/dist/clients/index.d.ts +6 -4
  3. package/dist/clients/index.d.ts.map +1 -1
  4. package/dist/clients/index.js +5 -3
  5. package/dist/clients/index.js.map +1 -1
  6. package/dist/clients/policy.d.ts +11 -3
  7. package/dist/clients/policy.d.ts.map +1 -1
  8. package/dist/clients/policy.js +12 -4
  9. package/dist/clients/policy.js.map +1 -1
  10. package/dist/clients/revocation.d.ts +24 -9
  11. package/dist/clients/revocation.d.ts.map +1 -1
  12. package/dist/clients/revocation.js +23 -10
  13. package/dist/clients/revocation.js.map +1 -1
  14. package/dist/clients/rosterPolicy.d.ts +23 -22
  15. package/dist/clients/rosterPolicy.d.ts.map +1 -1
  16. package/dist/clients/rosterPolicy.js +50 -31
  17. package/dist/clients/rosterPolicy.js.map +1 -1
  18. package/dist/descriptors/acquire.d.ts +4 -1
  19. package/dist/descriptors/acquire.d.ts.map +1 -1
  20. package/dist/descriptors/acquire.js +29 -1
  21. package/dist/descriptors/acquire.js.map +1 -1
  22. package/dist/descriptors/index.d.ts +9 -1
  23. package/dist/descriptors/index.d.ts.map +1 -1
  24. package/dist/descriptors/index.js +9 -1
  25. package/dist/descriptors/index.js.map +1 -1
  26. package/dist/descriptors/logSource.d.ts +33 -0
  27. package/dist/descriptors/logSource.d.ts.map +1 -0
  28. package/dist/descriptors/logSource.js +49 -0
  29. package/dist/descriptors/logSource.js.map +1 -0
  30. package/dist/enrollment/enrollment.d.ts +2 -2
  31. package/dist/enrollment/enrollment.d.ts.map +1 -1
  32. package/dist/enrollment/enrollment.js +15 -10
  33. package/dist/enrollment/enrollment.js.map +1 -1
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/keys/index.d.ts +15 -8
  37. package/dist/keys/index.d.ts.map +1 -1
  38. package/dist/keys/index.js +14 -8
  39. package/dist/keys/index.js.map +1 -1
  40. package/dist/keys/rosterLogStore.d.ts +53 -0
  41. package/dist/keys/rosterLogStore.d.ts.map +1 -0
  42. package/dist/keys/rosterLogStore.js +134 -0
  43. package/dist/keys/rosterLogStore.js.map +1 -0
  44. package/dist/keys/rosterStore.d.ts +20 -6
  45. package/dist/keys/rosterStore.d.ts.map +1 -1
  46. package/dist/keys/rosterStore.js +36 -17
  47. package/dist/keys/rosterStore.js.map +1 -1
  48. package/dist/keys/userKeyCascade.d.ts +14 -7
  49. package/dist/keys/userKeyCascade.d.ts.map +1 -1
  50. package/dist/keys/userKeyCascade.js +12 -3
  51. package/dist/keys/userKeyCascade.js.map +1 -1
  52. package/dist/keys/userKeyRoster.d.ts +50 -97
  53. package/dist/keys/userKeyRoster.d.ts.map +1 -1
  54. package/dist/keys/userKeyRoster.js +44 -145
  55. package/dist/keys/userKeyRoster.js.map +1 -1
  56. package/dist/request/appKey.d.ts +255 -0
  57. package/dist/request/appKey.d.ts.map +1 -0
  58. package/dist/request/appKey.js +492 -0
  59. package/dist/request/appKey.js.map +1 -0
  60. package/dist/request/classify.d.ts +54 -3
  61. package/dist/request/classify.d.ts.map +1 -1
  62. package/dist/request/classify.js +106 -0
  63. package/dist/request/classify.js.map +1 -1
  64. package/dist/request/composeVp.d.ts +6 -7
  65. package/dist/request/composeVp.d.ts.map +1 -1
  66. package/dist/request/composeVp.js +44 -55
  67. package/dist/request/composeVp.js.map +1 -1
  68. package/dist/request/index.d.ts +4 -0
  69. package/dist/request/index.d.ts.map +1 -1
  70. package/dist/request/index.js +4 -0
  71. package/dist/request/index.js.map +1 -1
  72. package/dist/request/processRequest.d.ts +1 -4
  73. package/dist/request/processRequest.d.ts.map +1 -1
  74. package/dist/request/processRequest.js +17 -11
  75. package/dist/request/processRequest.js.map +1 -1
  76. package/dist/request/types.d.ts +45 -2
  77. package/dist/request/types.d.ts.map +1 -1
  78. package/dist/resourceLog/append.d.ts +103 -0
  79. package/dist/resourceLog/append.d.ts.map +1 -0
  80. package/dist/resourceLog/append.js +190 -0
  81. package/dist/resourceLog/append.js.map +1 -0
  82. package/dist/resourceLog/controller.d.ts +57 -0
  83. package/dist/resourceLog/controller.d.ts.map +1 -0
  84. package/dist/resourceLog/controller.js +81 -0
  85. package/dist/resourceLog/controller.js.map +1 -0
  86. package/dist/resourceLog/entry.d.ts +68 -0
  87. package/dist/resourceLog/entry.d.ts.map +1 -0
  88. package/dist/resourceLog/entry.js +167 -0
  89. package/dist/resourceLog/entry.js.map +1 -0
  90. package/dist/resourceLog/errors.d.ts +75 -0
  91. package/dist/resourceLog/errors.d.ts.map +1 -0
  92. package/dist/resourceLog/errors.js +76 -0
  93. package/dist/resourceLog/errors.js.map +1 -0
  94. package/dist/resourceLog/index.d.ts +26 -0
  95. package/dist/resourceLog/index.d.ts.map +1 -0
  96. package/dist/resourceLog/index.js +26 -0
  97. package/dist/resourceLog/index.js.map +1 -0
  98. package/dist/resourceLog/pin.d.ts +44 -0
  99. package/dist/resourceLog/pin.d.ts.map +1 -0
  100. package/dist/resourceLog/pin.js +32 -0
  101. package/dist/resourceLog/pin.js.map +1 -0
  102. package/dist/resourceLog/seal.d.ts +86 -0
  103. package/dist/resourceLog/seal.d.ts.map +1 -0
  104. package/dist/resourceLog/seal.js +99 -0
  105. package/dist/resourceLog/seal.js.map +1 -0
  106. package/dist/resourceLog/verify.d.ts +95 -0
  107. package/dist/resourceLog/verify.d.ts.map +1 -0
  108. package/dist/resourceLog/verify.js +435 -0
  109. package/dist/resourceLog/verify.js.map +1 -0
  110. package/dist/space/collections.d.ts +14 -11
  111. package/dist/space/collections.d.ts.map +1 -1
  112. package/dist/space/collections.js +14 -11
  113. package/dist/space/collections.js.map +1 -1
  114. package/dist/space/index.d.ts +2 -2
  115. package/dist/space/index.d.ts.map +1 -1
  116. package/dist/space/index.js +2 -2
  117. package/dist/space/index.js.map +1 -1
  118. package/dist/webvh/didWeb.d.ts +4 -6
  119. package/dist/webvh/didWeb.d.ts.map +1 -1
  120. package/dist/webvh/didWeb.js.map +1 -1
  121. package/dist/webvh/didWebvh.d.ts +1 -2
  122. package/dist/webvh/didWebvh.d.ts.map +1 -1
  123. package/dist/webvh/didWebvh.js +1 -6
  124. package/dist/webvh/didWebvh.js.map +1 -1
  125. package/package.json +11 -4
package/README.md CHANGED
@@ -53,8 +53,10 @@ The subpaths:
53
53
  wallet-api messages and URLs), QueryByExample matching, cryptosuite
54
54
  negotiation, `composeVp` (signer and holder injected), the pure
55
55
  `processRequest` (consent runs in the caller; zcap / App Connect processing
56
- injected), the VC-API exchange client, and VCALM `interaction:` URL handling.
57
- The VPR type vocabulary lives in
56
+ injected), the App Connect app-key credential module (query validation,
57
+ matching, minting, store-time refusal, legacy re-issue), the VC-API exchange
58
+ client, and VCALM `interaction:` URL handling. The VPR type vocabulary lives
59
+ in
58
60
  [`@interop/data-integrity-core`](https://npm.im/@interop/data-integrity-core)
59
61
  and is re-exported here.
60
62
 
@@ -72,32 +74,49 @@ The subpaths:
72
74
  store they write through, and ZCap signing under the did:webvh
73
75
  verification-method id.
74
76
 
75
- - **`@interop/wallet-core/keys`** -- the user key and its
76
- `key-map/user-key.json` wrap-set roster: minting, the roster's
77
- init/read/rotate primitives with their client-side guards (`epochsMac`, the
78
- latest-seen epoch pin, the document-backed recipient resolver), the roster's
79
- compare-and-swap descriptor store, and the user key rotation cascade's
80
- per-collection op (re-epoch a collection onto the roster's current user key,
81
- staleness detected from durable state alone, history escrowed -- also the
82
- completion sweep's building block), plus the detector that converges a roster
83
- left wrapping the current key to a recipient the account document no longer
84
- keys. Also `ensureWalletSpaceEpochs`, the provision-time install of each
85
- encrypted wallet collection's key epoch[0] (a fresh random epoch key wrapped
86
- to the user key) -- the EDV-bearing second step of `provisionWalletSpace`.
87
- Also the enrolled-client display labels (`key-map/client-labels.json`) and
88
- their WAS-backed store. Also the client-key record codec: the contents and
89
- strict validation of the local record each wallet client keeps its own key
90
- material in (storage and wrapping stay app-side).
77
+ - **`@interop/wallet-core/resourceLog`** -- the client side of the Resource Log
78
+ Profile (the hash-linked log format governing key resources co-managed between
79
+ a wallet's clients and the storage server): full chain verification against an
80
+ adversarial host (parse shape, SCID and entry-hash recomputation, entry
81
+ proofs, the external-authorization rule against the independently verified
82
+ did:webvh controller document, terminal handover entries), the chain-head pin
83
+ with its continuity rules, the entry builders, the read/append/create path
84
+ (compare-and-swap with rebase-and-retry, read-back confirmation), and the
85
+ sealing sweep -- the idempotent backstop append that re-anchors a log's head
86
+ past the controller's latest membership change. Transport lives in
87
+ [`@interop/was-client`](https://npm.im/@interop/was-client)'s `/log` subpath;
88
+ the hashing and proof kernel in
89
+ [`@interop/did-method-webvh`](https://npm.im/@interop/did-method-webvh).
90
+
91
+ - **`@interop/wallet-core/keys`** -- the user key and its wrap-set roster,
92
+ governed by the `key-map/user-key.jsonl` resource log: minting, the roster's
93
+ init/read/rotate primitives with their client-side guards (the verified log
94
+ itself, the latest-seen epoch pin, the document-backed recipient resolver),
95
+ the log-governed (and sealable) descriptor store those primitives drive, and
96
+ the user key rotation cascade's per-collection op (re-epoch a collection onto
97
+ the roster's current user key, staleness detected from durable state alone,
98
+ history escrowed -- also the completion sweep's building block), plus the
99
+ detector that converges a roster left wrapping the current key to a recipient
100
+ the account document no longer keys. Also `ensureWalletSpaceEpochs`, the
101
+ provision-time install of each encrypted wallet collection's key epoch[0] (a
102
+ fresh random epoch key wrapped to the user key) -- the EDV-bearing second step
103
+ of `provisionWalletSpace`. Also the enrolled-client display labels
104
+ (`key-map/client-labels.json`) and their WAS-backed store. Also the client-key
105
+ record codec: the contents and strict validation of the local record each
106
+ wallet client keeps its own key material in (storage and wrapping stay
107
+ app-side).
91
108
 
92
109
  - **`@interop/wallet-core/clients`** -- the enrolled-client management surface:
93
110
  the listing over the locally verified did:webvh log with display labels
94
111
  merged, the disconnect-eligibility policy as pure functions, the revocation
95
- cascade orchestrator (document edit, roster rotation, collection fan-out,
96
- optional recovery re-mints), and the login-time roster policy.
112
+ cascade orchestrator (document edit, roster rotation with its seal backstop,
113
+ collection fan-out, optional recovery re-mints), and the login-time roster
114
+ policy (which now also seals a converged roster's governing log).
97
115
 
98
116
  - **`@interop/wallet-core/descriptors`** -- collection encryption-descriptor
99
- acquisition (fetch / cache / offline fallback) and the unknown-epoch refresh
100
- policy, including a self-refreshing EDV document cipher.
117
+ acquisition (fetch / cache / offline fallback), the log-governed descriptor
118
+ source (every read re-verifies the governing resource log), and the
119
+ unknown-epoch refresh policy, including a self-refreshing EDV document cipher.
101
120
 
102
121
  - **`@interop/wallet-core/keyring`** -- the unlock layer: the unlock derivation,
103
122
  the `{ version, wrapped }` account-pointer record codec, and the unlock Space
@@ -15,19 +15,21 @@
15
15
  * surfaces refuse the same rows for the same reasons and report a partial
16
16
  * fan-out as the resumable success it is.
17
17
  * - `revokeAccountClient` -- the revocation cascade in dependency order
18
- * (document edit, roster rotation, collection fan-out, optional recovery
19
- * re-mints), with the app-specific stages injected.
18
+ * (document edit, roster rotation with its seal backstop, collection
19
+ * fan-out, optional recovery re-mints), with the app-specific stages
20
+ * injected.
20
21
  * - `checkUserKeyRosterAtLogin` / `convergeUserKeyRosterToAccount` -- the
21
22
  * login-time
22
23
  * roster policy: which roster failures refuse a session, and the standing
23
- * convergence of the roster onto the account document.
24
+ * convergence of the roster onto the account document (recipients, then
25
+ * the roster log's seal).
24
26
  */
25
27
  export { currentAccountSigningKeys, listAccountClients } from './listing.js';
26
28
  export type { AccountClientView, AccountLogPointer, VerifiedAccountLog } from './listing.js';
27
29
  export { cascadeCompletion, disconnectEligibility, revokedClientKeysFor } from './policy.js';
28
30
  export type { DisconnectRefusal } from './policy.js';
29
31
  export { revokeAccountClient } from './revocation.js';
30
- export type { CascadeCollections, ClientRevocationResult } from './revocation.js';
32
+ export type { CascadeCollections, ClientRevocationResult, RosterSealReport } from './revocation.js';
31
33
  export { checkUserKeyRosterAtLogin, convergeUserKeyRosterToAccount } from './rosterPolicy.js';
32
34
  export type { AdoptedUserKey } from './rosterPolicy.js';
33
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC5E,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC5E,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
@@ -15,12 +15,14 @@
15
15
  * surfaces refuse the same rows for the same reasons and report a partial
16
16
  * fan-out as the resumable success it is.
17
17
  * - `revokeAccountClient` -- the revocation cascade in dependency order
18
- * (document edit, roster rotation, collection fan-out, optional recovery
19
- * re-mints), with the app-specific stages injected.
18
+ * (document edit, roster rotation with its seal backstop, collection
19
+ * fan-out, optional recovery re-mints), with the app-specific stages
20
+ * injected.
20
21
  * - `checkUserKeyRosterAtLogin` / `convergeUserKeyRosterToAccount` -- the
21
22
  * login-time
22
23
  * roster policy: which roster failures refuse a session, and the standing
23
- * convergence of the roster onto the account document.
24
+ * convergence of the roster onto the account document (recipients, then
25
+ * the roster log's seal).
24
26
  */
25
27
  export { currentAccountSigningKeys, listAccountClients } from './listing.js';
26
28
  export { cascadeCompletion, disconnectEligibility, revokedClientKeysFor } from './policy.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAO5E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAMrD,OAAO,EACL,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAO5E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAOrD,OAAO,EACL,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,mBAAmB,CAAA"}
@@ -31,6 +31,7 @@
31
31
  import type { RevokedClientKeys } from '../webvh/index.js';
32
32
  import type { UserKeyCascadeResult } from '../keys/index.js';
33
33
  import type { AccountClientView } from './listing.js';
34
+ import type { RosterSealReport } from './revocation.js';
34
35
  /**
35
36
  * Why a listed row cannot be disconnected. See the module doc.
36
37
  */
@@ -66,14 +67,21 @@ export declare function revokedClientKeysFor({ client }: {
66
67
  }): RevokedClientKeys;
67
68
  /**
68
69
  * How a completed cascade should be reported: `complete` when every encrypted
69
- * collection took the fresh key, `partial` when some did not -- a resumable
70
- * success, never an error (see the module doc).
70
+ * collection took the fresh key AND the roster's seal backstop did not fail,
71
+ * `partial` otherwise -- a resumable success, never an error (see the module
72
+ * doc). An unfinished seal is the same durable-staleness class as a stranded
73
+ * collection: "a governed log's head anchor predates the membership change"
74
+ * is detected from durable state alone, so a re-run (or the login sweep)
75
+ * finishes it.
71
76
  *
72
77
  * @param options {object}
73
78
  * @param options.collections {UserKeyCascadeResult} the collection fan-out result
79
+ * @param [options.rosterSeal] {RosterSealReport} the roster's seal-backstop
80
+ * report, where the cascade ran one
74
81
  * @returns {'complete' | 'partial'}
75
82
  */
76
- export declare function cascadeCompletion({ collections }: {
83
+ export declare function cascadeCompletion({ collections, rosterSeal }: {
77
84
  collections: UserKeyCascadeResult;
85
+ rosterSeal?: RosterSealReport;
78
86
  }): 'complete' | 'partial';
79
87
  //# sourceMappingURL=policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/clients/policy.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAC3B,MAAM,GAAG,aAAa,GAAG,yBAAyB,CAAA;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,OAAO,EACR,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAA;IACzB,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,iBAAiB,CAAA;CAAE,CAWpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACP,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAA;CAC1B,GAAG,iBAAiB,CAYpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACZ,EAAE;IACD,WAAW,EAAE,oBAAoB,CAAA;CAClC,GAAG,UAAU,GAAG,SAAS,CAEzB"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/clients/policy.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAC3B,MAAM,GAAG,aAAa,GAAG,yBAAyB,CAAA;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,OAAO,EACR,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAA;IACzB,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,iBAAiB,CAAA;CAAE,CAWpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACP,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAA;CAC1B,GAAG,iBAAiB,CAYpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,UAAU,EACX,EAAE;IACD,WAAW,EAAE,oBAAoB,CAAA;IACjC,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAC9B,GAAG,UAAU,GAAG,SAAS,CAIzB"}
@@ -42,14 +42,22 @@ export function revokedClientKeysFor({ client }) {
42
42
  }
43
43
  /**
44
44
  * How a completed cascade should be reported: `complete` when every encrypted
45
- * collection took the fresh key, `partial` when some did not -- a resumable
46
- * success, never an error (see the module doc).
45
+ * collection took the fresh key AND the roster's seal backstop did not fail,
46
+ * `partial` otherwise -- a resumable success, never an error (see the module
47
+ * doc). An unfinished seal is the same durable-staleness class as a stranded
48
+ * collection: "a governed log's head anchor predates the membership change"
49
+ * is detected from durable state alone, so a re-run (or the login sweep)
50
+ * finishes it.
47
51
  *
48
52
  * @param options {object}
49
53
  * @param options.collections {UserKeyCascadeResult} the collection fan-out result
54
+ * @param [options.rosterSeal] {RosterSealReport} the roster's seal-backstop
55
+ * report, where the cascade ran one
50
56
  * @returns {'complete' | 'partial'}
51
57
  */
52
- export function cascadeCompletion({ collections }) {
53
- return collections.failed.length > 0 ? 'partial' : 'complete';
58
+ export function cascadeCompletion({ collections, rosterSeal }) {
59
+ return collections.failed.length > 0 || rosterSeal?.outcome === 'failed'
60
+ ? 'partial'
61
+ : 'complete';
54
62
  }
55
63
  //# sourceMappingURL=policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/clients/policy.ts"],"names":[],"mappings":"AAwCA;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,MAAM,EACN,OAAO,EAIR;IACC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;IACnD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAA;IAC/D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAC1B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,MAAM,EAGP;IACC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,oEAAoE;YAClE,8CAA8C,CACjD,CAAA;IACH,CAAC;IACD,OAAO;QACL,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;QACzD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;KAC9C,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,WAAW,EAGZ;IACC,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAA;AAC/D,CAAC"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/clients/policy.ts"],"names":[],"mappings":"AAyCA;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,MAAM,EACN,OAAO,EAIR;IACC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;IACnD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAA;IAC/D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAC1B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,MAAM,EAGP;IACC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,oEAAoE;YAClE,8CAA8C,CACjD,CAAA;IACH,CAAC;IACD,OAAO;QACL,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;QACzD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;KAC9C,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,WAAW,EACX,UAAU,EAIX;IACC,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,EAAE,OAAO,KAAK,QAAQ;QACtE,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,UAAU,CAAA;AAChB,CAAC"}
@@ -21,7 +21,11 @@
21
21
  * log this call just extended). The roster delivers, never sources, so the
22
22
  * revoked client's entry is dropped even before the retire filter. An
23
23
  * account with no roster yet stops here: the client IS disconnected, with
24
- * nothing to rotate.
24
+ * nothing to rotate. On a sealable (log-governed) roster store, the seal
25
+ * backstop follows: a rotation that no-op'd appended nothing, so the
26
+ * roster log may still be anchored before the document edit -- `seal()`
27
+ * re-anchors it with an idempotent no-op entry, best-effort and reported
28
+ * rather than thrown.
25
29
  * 3. **The collection fan-out**: every encrypted collection is re-epoch'd onto
26
30
  * the fresh key in parallel, so writes stop landing under epochs the
27
31
  * revoked client can still decrypt. Failures are collected per collection
@@ -46,9 +50,21 @@
46
50
  */
47
51
  import type { IKeyAgreementKey } from '@interop/data-integrity-core';
48
52
  import type { CollectionEncryption } from '@interop/was-client';
49
- import type { EncryptionDescriptorStore, EpochsSigner } from '@interop/was-client/edv';
53
+ import type { EncryptionDescriptorStore } from '@interop/was-client/edv';
50
54
  import { type ClientWebvhUpdateKeys, type RevokedClientKeys, type WebvhIdStore } from '../webvh/index.js';
51
55
  import { type UserKey, type UserKeyCascadeResult } from '../keys/index.js';
56
+ /**
57
+ * What the roster's seal backstop reported: `sealed` (the roster log's head
58
+ * still anchored before the document edit, and the backstop append landed),
59
+ * `noop` (already sealed -- the rotation itself was the sealing append, or a
60
+ * re-run found nothing to do), or `failed` (the seal could not run; carried
61
+ * in `error`, never thrown -- the cascade stays a resumable success and the
62
+ * login sweep re-seals).
63
+ */
64
+ export interface RosterSealReport {
65
+ outcome: 'sealed' | 'noop' | 'failed';
66
+ error?: unknown;
67
+ }
52
68
  /**
53
69
  * Where the cascade's collection fan-out gets its work: which encrypted
54
70
  * collections exist (only the app knows -- a mobile replica names the
@@ -64,11 +80,13 @@ export interface CascadeCollections {
64
80
  /**
65
81
  * What a completed cascade reports: whether the roster actually rotated on
66
82
  * this run (a re-run of an already-complete revocation reports `false`), the
67
- * per-collection fan-out result, the document as the edit left it, and the
68
- * recovery re-mint counts when that stage ran.
83
+ * roster's seal-backstop report (present when the roster store is sealable
84
+ * and the roster stage ran), the per-collection fan-out result, the document
85
+ * as the edit left it, and the recovery re-mint counts when that stage ran.
69
86
  */
70
87
  export interface ClientRevocationResult {
71
88
  rotated: boolean;
89
+ rosterSeal?: RosterSealReport;
72
90
  collections: UserKeyCascadeResult;
73
91
  document: object;
74
92
  userKey?: UserKey;
@@ -109,12 +127,10 @@ export interface ClientRevocationResult {
109
127
  * key; supplied, self-revocation is refused up front by the rule the surface
110
128
  * should name, rather than by the update-key check inside the edit
111
129
  * @param options.rosterStore {EncryptionDescriptorStore} the
112
- * `key-map/user-key.json` roster store
130
+ * `key-map/user-key.jsonl` roster store
113
131
  * @param [options.userKey] {UserKey} this client's cached user key
114
132
  * @param options.clientKeyAgreementKey {IKeyAgreementKey} this client's own
115
133
  * (identity) key-agreement key -- its roster entry
116
- * @param options.signEpochs {EpochsSigner} this client's epoch-configuration
117
- * signer (`userKeyRosterEpochsSigner`), vouching for the rotated roster epoch
118
134
  * @param [options.pinnedEpochId] {string} the locally pinned latest-seen
119
135
  * roster epoch
120
136
  * @param [options.onUserKeyAdopted] {Function} persists a rotated key: called
@@ -129,7 +145,7 @@ export interface ClientRevocationResult {
129
145
  * keeps operating without a re-login
130
146
  * @returns {Promise<ClientRevocationResult>}
131
147
  */
132
- export declare function revokeAccountClient({ idStore, updateKeys, revokedClient, knownLatentHashes, ownSigningKeyMultibase, rosterStore, userKey, clientKeyAgreementKey, signEpochs, pinnedEpochId, onUserKeyAdopted, collections, remintRecoveryDelegations, onRotationAdopted }: {
148
+ export declare function revokeAccountClient({ idStore, updateKeys, revokedClient, knownLatentHashes, ownSigningKeyMultibase, rosterStore, userKey, clientKeyAgreementKey, pinnedEpochId, onUserKeyAdopted, collections, remintRecoveryDelegations, onRotationAdopted }: {
133
149
  idStore: WebvhIdStore;
134
150
  updateKeys: ClientWebvhUpdateKeys;
135
151
  revokedClient: RevokedClientKeys;
@@ -138,7 +154,6 @@ export declare function revokeAccountClient({ idStore, updateKeys, revokedClient
138
154
  rosterStore: EncryptionDescriptorStore;
139
155
  userKey?: UserKey;
140
156
  clientKeyAgreementKey: IKeyAgreementKey;
141
- signEpochs: EpochsSigner;
142
157
  pinnedEpochId?: string | null;
143
158
  onUserKeyAdopted?: (adopted: {
144
159
  userKey: UserKey;
@@ -1 +1 @@
1
- {"version":3,"file":"revocation.d.ts","sourceRoot":"","sources":["../../src/clients/revocation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EACV,yBAAyB,EACzB,YAAY,EACb,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAKL,KAAK,OAAO,EACZ,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAA;AAEzB;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACnD,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,yBAAyB,CAAA;IAC7D,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACzD;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,oBAAoB,CAAA;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gBAAgB,CAAC,EAAE,oBAAoB,CAAA;IACvC,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CACjD;AAqBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,OAAO,EACP,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,EACX,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,yBAAyB,EACzB,iBAAiB,EAClB,EAAE;IACD,OAAO,EAAE,YAAY,CAAA;IACrB,UAAU,EAAE,qBAAqB,CAAA;IACjC,aAAa,EAAE,iBAAiB,CAAA;IAChC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,WAAW,EAAE,yBAAyB,CAAA;IACtC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qBAAqB,EAAE,gBAAgB,CAAA;IACvC,UAAU,EAAE,YAAY,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC3B,OAAO,EAAE,OAAO,CAAA;QAChB,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,oBAAoB,CAAA;KACjC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnB,WAAW,EAAE,kBAAkB,CAAA;IAC/B,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE;QACpC,QAAQ,EAAE,MAAM,CAAA;KACjB,KAAK,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpD,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAuGlC"}
1
+ {"version":3,"file":"revocation.d.ts","sourceRoot":"","sources":["../../src/clients/revocation.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { revokeWebvhClient } from '../webvh/index.js';
2
- import { cascadeCollectionsToUserKey, readUserKeyRoster, rosterRecipientKid, rotateUserKeyRoster } from '../keys/index.js';
2
+ import { cascadeCollectionsToUserKey, isSealableDescriptorStore, readUserKeyRoster, rosterRecipientKid, rotateUserKeyRoster } from '../keys/index.js';
3
3
  /**
4
4
  * Resolves the collection ids the fan-out covers, whether they are a fixed set
5
5
  * or a listing the app performs.
@@ -45,12 +45,10 @@ async function collectionIdsOf({ collections }) {
45
45
  * key; supplied, self-revocation is refused up front by the rule the surface
46
46
  * should name, rather than by the update-key check inside the edit
47
47
  * @param options.rosterStore {EncryptionDescriptorStore} the
48
- * `key-map/user-key.json` roster store
48
+ * `key-map/user-key.jsonl` roster store
49
49
  * @param [options.userKey] {UserKey} this client's cached user key
50
50
  * @param options.clientKeyAgreementKey {IKeyAgreementKey} this client's own
51
51
  * (identity) key-agreement key -- its roster entry
52
- * @param options.signEpochs {EpochsSigner} this client's epoch-configuration
53
- * signer (`userKeyRosterEpochsSigner`), vouching for the rotated roster epoch
54
52
  * @param [options.pinnedEpochId] {string} the locally pinned latest-seen
55
53
  * roster epoch
56
54
  * @param [options.onUserKeyAdopted] {Function} persists a rotated key: called
@@ -65,7 +63,7 @@ async function collectionIdsOf({ collections }) {
65
63
  * keeps operating without a re-login
66
64
  * @returns {Promise<ClientRevocationResult>}
67
65
  */
68
- export async function revokeAccountClient({ idStore, updateKeys, revokedClient, knownLatentHashes, ownSigningKeyMultibase, rosterStore, userKey, clientKeyAgreementKey, signEpochs, pinnedEpochId, onUserKeyAdopted, collections, remintRecoveryDelegations, onRotationAdopted }) {
66
+ export async function revokeAccountClient({ idStore, updateKeys, revokedClient, knownLatentHashes, ownSigningKeyMultibase, rosterStore, userKey, clientKeyAgreementKey, pinnedEpochId, onUserKeyAdopted, collections, remintRecoveryDelegations, onRotationAdopted }) {
69
67
  if (ownSigningKeyMultibase &&
70
68
  ownSigningKeyMultibase === revokedClient.signingKeyMultibase) {
71
69
  throw new Error('This wallet cannot disconnect itself; use another enrolled wallet ' +
@@ -86,7 +84,7 @@ export async function revokeAccountClient({ idStore, updateKeys, revokedClient,
86
84
  });
87
85
  // 2. The roster rotation, recipients resolved from that same document.
88
86
  // Whether there IS a roster is settled BEFORE the rotation: an account with
89
- // no `key-map/user-key.json` (its collections are not encrypted yet) has nothing
87
+ // no `key-map/user-key.jsonl` (its collections are not encrypted yet) has nothing
90
88
  // to rotate, and the rotation itself refuses an absent descriptor rather
91
89
  // than no-op'ing. The document edit has already landed, so the client IS
92
90
  // disconnected -- a completed cascade with nothing rotated, not a failure.
@@ -101,15 +99,13 @@ export async function revokeAccountClient({ idStore, updateKeys, revokedClient,
101
99
  await rotateUserKeyRoster({
102
100
  store: rosterStore,
103
101
  document: doc,
104
- retireRecipientId: rosterRecipientKid(revokedClient),
105
- signEpochs
102
+ retireRecipientId: rosterRecipientKid(revokedClient)
106
103
  });
107
104
  const read = await readUserKeyRoster({
108
105
  store: rosterStore,
109
106
  ...(userKey ? { userKey } : {}),
110
107
  clientKeyAgreementKey,
111
- pinnedEpochId,
112
- document: doc
108
+ pinnedEpochId
113
109
  });
114
110
  if (!read) {
115
111
  // The roster stood a moment ago and the rotation just wrote it, so its
@@ -127,6 +123,22 @@ export async function revokeAccountClient({ idStore, updateKeys, revokedClient,
127
123
  descriptor: read.descriptor
128
124
  });
129
125
  }
126
+ // 2b. The seal backstop: an ordinary rotation is the sealing append by
127
+ // construction, but a rotation that no-op'd (the revoked client held no
128
+ // current-epoch wrap -- an orphan client, or any re-run) appended nothing,
129
+ // leaving the roster log's head anchored before the document edit. Sealing
130
+ // is best-effort and reported, never thrown: the wallet IS disconnected
131
+ // (stage 1 landed), and an unsealed log is durable state the login sweep
132
+ // re-detects and finishes.
133
+ let rosterSeal;
134
+ if (isSealableDescriptorStore(rosterStore)) {
135
+ try {
136
+ rosterSeal = { outcome: await rosterStore.seal() };
137
+ }
138
+ catch (err) {
139
+ rosterSeal = { outcome: 'failed', error: err };
140
+ }
141
+ }
130
142
  // 3. The collection fan-out, in parallel -- run even when this call found
131
143
  // the roster already rotated (a re-run after a crash), because the staleness
132
144
  // rule finds exactly the stranded collections.
@@ -148,6 +160,7 @@ export async function revokeAccountClient({ idStore, updateKeys, revokedClient,
148
160
  }
149
161
  return {
150
162
  rotated: read.rotated,
163
+ ...(rosterSeal ? { rosterSeal } : {}),
151
164
  collections: cascade,
152
165
  document: doc,
153
166
  userKey: read.userKey,
@@ -1 +1 @@
1
- {"version":3,"file":"revocation.js","sourceRoot":"","sources":["../../src/clients/revocation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"revocation.js","sourceRoot":"","sources":["../../src/clients/revocation.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  /**
5
5
  * The login-time wrap-set roster policy: what a wallet does with
6
- * `key-map/user-key.json` when a session starts, and how it decides between
6
+ * `key-map/user-key.jsonl` when a session starts, and how it decides between
7
7
  * refusing the session and carrying on offline.
8
8
  *
9
9
  * Two steps, in this order:
@@ -28,9 +28,14 @@
28
28
  * revocation torn between its document edit and its roster rotation leaves
29
29
  * the roster wrapping the CURRENT key to a client the document no longer
30
30
  * keys -- durable and silent, since the revoked client's document edit will
31
- * never be re-run -- so it is finished here. Strictly best-effort: a log
32
- * that cannot be fetched or verified (offline, an unpromoted account) leaves
33
- * the start's own roster read in place, and the next start tries again.
31
+ * never be re-run -- so it is finished here. On a sealable (log-governed)
32
+ * store the seal backstop follows: a revocation whose rotation no-op'd
33
+ * leaves nothing for the recipient convergence to find, but the roster
34
+ * log's head still anchors before the membership change, and that unsealed
35
+ * state is detected and closed here, idempotently. Strictly best-effort: a
36
+ * log that cannot be fetched or verified (offline, an unpromoted account)
37
+ * leaves the start's own roster read in place, and the next start tries
38
+ * again.
34
39
  *
35
40
  * **Once per session.** A converged roster stays converged, and the engine
36
41
  * restart (or storage-cipher rebuild) that adopts a rotation must not
@@ -46,7 +51,7 @@
46
51
  */
47
52
  import type { IKeyAgreementKey } from '@interop/data-integrity-core';
48
53
  import type { CollectionEncryption } from '@interop/was-client';
49
- import type { EncryptionDescriptorStore, EpochsSigner } from '@interop/was-client/edv';
54
+ import type { EncryptionDescriptorStore } from '@interop/was-client/edv';
50
55
  import { type UserKey, type UserKeyRosterReadResult } from '../keys/index.js';
51
56
  import type { AccountLogPointer } from './listing.js';
52
57
  /**
@@ -61,19 +66,17 @@ export interface AdoptedUserKey {
61
66
  /**
62
67
  * The login-time roster read. See the module doc for the failure semantics.
63
68
  *
64
- * A read that adopts an epoch from the roster (a rotation by another client,
65
- * or this client's first read) must trace it to the account document, so the
66
- * account log is fetched and verified lazily on exactly that path (via
67
- * `pointer`). A log that cannot be fetched then lands in the
68
- * transport-failure class -- the session carries on under the cached key,
69
- * WITHOUT adopting the unverifiable rotation -- while a roster whose epoch
70
- * configuration no enrolled client signed is a refusal like the other three.
69
+ * Every read traces to the account document through the log-governed store
70
+ * itself: the roster resolves only from the roster log's verified head, whose
71
+ * entry proofs are checked against the locally verified account log. A log
72
+ * that cannot be fetched lands in the transport-failure class -- the session
73
+ * carries on under the cached key, WITHOUT adopting an unverifiable rotation
74
+ * -- while a roster no enrolled client signed onto the log, and a log that
75
+ * conflicts with the chain-head pin, are refusals like the other three.
71
76
  *
72
77
  * @param options {object}
73
78
  * @param options.store {EncryptionDescriptorStore} the roster's descriptor
74
79
  * store
75
- * @param options.pointer {AccountLogPointer} where the account log lives,
76
- * for the lazy document verification above
77
80
  * @param [options.userKey] {UserKey} this client's cached user key; omitted (a
78
81
  * freshly enrolled client's first read) the key is always taken from the
79
82
  * roster
@@ -88,9 +91,8 @@ export interface AdoptedUserKey {
88
91
  * @returns {Promise<UserKeyRosterReadResult | null>} the read, or `null` when
89
92
  * the account has no roster yet or the server could not be reached
90
93
  */
91
- export declare function checkUserKeyRosterAtLogin({ store, pointer, userKey, clientKeyAgreementKey, pinnedEpochId, onRosterRead }: {
94
+ export declare function checkUserKeyRosterAtLogin({ store, userKey, clientKeyAgreementKey, pinnedEpochId, onRosterRead }: {
92
95
  store: EncryptionDescriptorStore;
93
- pointer: AccountLogPointer;
94
96
  userKey?: UserKey;
95
97
  clientKeyAgreementKey: IKeyAgreementKey;
96
98
  pinnedEpochId?: string | null;
@@ -119,26 +121,25 @@ export declare function checkUserKeyRosterAtLogin({ store, pointer, userKey, cli
119
121
  * @param options.descriptor {CollectionEncryption} the start's roster read
120
122
  * @param options.clientKeyAgreementKey {IKeyAgreementKey} this client's own
121
123
  * (identity) key-agreement key
122
- * @param options.signEpochs {EpochsSigner} this client's epoch-configuration
123
- * signer (`userKeyRosterEpochsSigner`), for the rotation this call may perform
124
124
  * @param [options.pinnedEpochId] {string} the locally pinned latest-seen
125
125
  * roster epoch
126
126
  * @param [options.onUserKeyAdopted] {Function} called with the
127
127
  * {@link AdoptedUserKey} of a rotation, before the fan-out runs
128
- * @returns {Promise<object>} whether the roster rotated on this call, the
129
- * stale recipient kids found, and the key + descriptor to fan out with
128
+ * @returns {Promise<object>} whether the roster rotated on this call,
129
+ * whether the seal backstop had to append (`sealed`), the stale recipient
130
+ * kids found, and the key + descriptor to fan out with
130
131
  */
131
- export declare function convergeUserKeyRosterToAccount({ pointer, store, userKey, descriptor, clientKeyAgreementKey, signEpochs, pinnedEpochId, onUserKeyAdopted }: {
132
+ export declare function convergeUserKeyRosterToAccount({ pointer, store, userKey, descriptor, clientKeyAgreementKey, pinnedEpochId, onUserKeyAdopted }: {
132
133
  pointer: AccountLogPointer;
133
134
  store: EncryptionDescriptorStore;
134
135
  userKey: UserKey;
135
136
  descriptor: CollectionEncryption;
136
137
  clientKeyAgreementKey: IKeyAgreementKey;
137
- signEpochs: EpochsSigner;
138
138
  pinnedEpochId?: string | null;
139
139
  onUserKeyAdopted?: (adopted: AdoptedUserKey) => Promise<void>;
140
140
  }): Promise<{
141
141
  rotated: boolean;
142
+ sealed: boolean;
142
143
  staleRecipientIds: string[];
143
144
  userKey: UserKey;
144
145
  descriptor: CollectionEncryption;
@@ -1 +1 @@
1
- {"version":3,"file":"rosterPolicy.d.ts","sourceRoot":"","sources":["../../src/clients/rosterPolicy.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EACV,yBAAyB,EACzB,YAAY,EACb,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,uBAAuB,EAE7B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,oBAAoB,CAAA;CACjC;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,yBAAyB,CAAC,EAC9C,KAAK,EACL,OAAO,EACP,OAAO,EACP,qBAAqB,EACrB,aAAa,EACb,YAAY,EACb,EAAE;IACD,KAAK,EAAE,yBAAyB,CAAA;IAChC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qBAAqB,EAAE,gBAAgB,CAAA;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CA+B1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,8BAA8B,CAAC,EACnD,OAAO,EACP,KAAK,EACL,OAAO,EACP,UAAU,EACV,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,gBAAgB,EACjB,EAAE;IACD,OAAO,EAAE,iBAAiB,CAAA;IAC1B,KAAK,EAAE,yBAAyB,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,oBAAoB,CAAA;IAChC,qBAAqB,EAAE,gBAAgB,CAAA;IACvC,UAAU,EAAE,YAAY,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9D,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,oBAAoB,CAAA;CACjC,CAAC,CAiFD"}
1
+ {"version":3,"file":"rosterPolicy.d.ts","sourceRoot":"","sources":["../../src/clients/rosterPolicy.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAOL,KAAK,OAAO,EACZ,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAA;AAMzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,oBAAoB,CAAA;CACjC;AAuBD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,yBAAyB,CAAC,EAC9C,KAAK,EACL,OAAO,EACP,qBAAqB,EACrB,aAAa,EACb,YAAY,EACb,EAAE;IACD,KAAK,EAAE,yBAAyB,CAAA;IAChC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qBAAqB,EAAE,gBAAgB,CAAA;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CA8B1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,8BAA8B,CAAC,EACnD,OAAO,EACP,KAAK,EACL,OAAO,EACP,UAAU,EACV,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EACjB,EAAE;IACD,OAAO,EAAE,iBAAiB,CAAA;IAC1B,KAAK,EAAE,yBAAyB,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,oBAAoB,CAAA;IAChC,qBAAqB,EAAE,gBAAgB,CAAA;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9D,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,oBAAoB,CAAA;CACjC,CAAC,CAqGD"}