@proof-holdings/sdk 0.0.0-stage → 1.2.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 (253) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +239 -2
  4. package/dist/cjs/client.d.ts +48 -0
  5. package/dist/cjs/client.d.ts.map +1 -0
  6. package/dist/cjs/client.js +73 -0
  7. package/dist/cjs/client.js.map +1 -0
  8. package/dist/cjs/credentials.d.ts +46 -0
  9. package/dist/cjs/credentials.d.ts.map +1 -0
  10. package/dist/cjs/credentials.js +137 -0
  11. package/dist/cjs/credentials.js.map +1 -0
  12. package/dist/cjs/crypto/hitl-crypto.d.ts +95 -0
  13. package/dist/cjs/crypto/hitl-crypto.d.ts.map +1 -0
  14. package/dist/cjs/crypto/hitl-crypto.js +338 -0
  15. package/dist/cjs/crypto/hitl-crypto.js.map +1 -0
  16. package/dist/cjs/errors.d.ts +52 -0
  17. package/dist/cjs/errors.d.ts.map +1 -0
  18. package/dist/cjs/errors.js +121 -0
  19. package/dist/cjs/errors.js.map +1 -0
  20. package/dist/cjs/http.d.ts +62 -0
  21. package/dist/cjs/http.d.ts.map +1 -0
  22. package/dist/cjs/http.js +192 -0
  23. package/dist/cjs/http.js.map +1 -0
  24. package/dist/cjs/index.d.ts +26 -0
  25. package/dist/cjs/index.d.ts.map +1 -0
  26. package/dist/cjs/index.js +79 -0
  27. package/dist/cjs/index.js.map +1 -0
  28. package/dist/cjs/jwks/key-set-cache.d.ts +105 -0
  29. package/dist/cjs/jwks/key-set-cache.d.ts.map +1 -0
  30. package/dist/cjs/jwks/key-set-cache.js +277 -0
  31. package/dist/cjs/jwks/key-set-cache.js.map +1 -0
  32. package/dist/cjs/jwks/keyset.d.ts +139 -0
  33. package/dist/cjs/jwks/keyset.d.ts.map +1 -0
  34. package/dist/cjs/jwks/keyset.js +503 -0
  35. package/dist/cjs/jwks/keyset.js.map +1 -0
  36. package/dist/cjs/jwks/support.d.ts +9 -0
  37. package/dist/cjs/jwks/support.d.ts.map +1 -0
  38. package/dist/cjs/jwks/support.js +12 -0
  39. package/dist/cjs/jwks/support.js.map +1 -0
  40. package/dist/cjs/polling.d.ts +10 -0
  41. package/dist/cjs/polling.d.ts.map +1 -0
  42. package/dist/cjs/polling.js +74 -0
  43. package/dist/cjs/polling.js.map +1 -0
  44. package/dist/cjs/resources/auth-sessions.d.ts +41 -0
  45. package/dist/cjs/resources/auth-sessions.d.ts.map +1 -0
  46. package/dist/cjs/resources/auth-sessions.js +34 -0
  47. package/dist/cjs/resources/auth-sessions.js.map +1 -0
  48. package/dist/cjs/resources/authorizations.d.ts +23 -0
  49. package/dist/cjs/resources/authorizations.d.ts.map +1 -0
  50. package/dist/cjs/resources/authorizations.js +29 -0
  51. package/dist/cjs/resources/authorizations.js.map +1 -0
  52. package/dist/cjs/resources/circles.d.ts +38 -0
  53. package/dist/cjs/resources/circles.d.ts.map +1 -0
  54. package/dist/cjs/resources/circles.js +67 -0
  55. package/dist/cjs/resources/circles.js.map +1 -0
  56. package/dist/cjs/resources/confirmations.d.ts +111 -0
  57. package/dist/cjs/resources/confirmations.d.ts.map +1 -0
  58. package/dist/cjs/resources/confirmations.js +86 -0
  59. package/dist/cjs/resources/confirmations.js.map +1 -0
  60. package/dist/cjs/resources/delegations.d.ts +36 -0
  61. package/dist/cjs/resources/delegations.d.ts.map +1 -0
  62. package/dist/cjs/resources/delegations.js +47 -0
  63. package/dist/cjs/resources/delegations.js.map +1 -0
  64. package/dist/cjs/resources/hitl-chat-id.d.ts +42 -0
  65. package/dist/cjs/resources/hitl-chat-id.d.ts.map +1 -0
  66. package/dist/cjs/resources/hitl-chat-id.js +37 -0
  67. package/dist/cjs/resources/hitl-chat-id.js.map +1 -0
  68. package/dist/cjs/resources/hitl-keys.d.ts +13 -0
  69. package/dist/cjs/resources/hitl-keys.d.ts.map +1 -0
  70. package/dist/cjs/resources/hitl-keys.js +22 -0
  71. package/dist/cjs/resources/hitl-keys.js.map +1 -0
  72. package/dist/cjs/resources/hitl.d.ts +39 -0
  73. package/dist/cjs/resources/hitl.d.ts.map +1 -0
  74. package/dist/cjs/resources/hitl.js +58 -0
  75. package/dist/cjs/resources/hitl.js.map +1 -0
  76. package/dist/cjs/resources/me.d.ts +102 -0
  77. package/dist/cjs/resources/me.d.ts.map +1 -0
  78. package/dist/cjs/resources/me.js +85 -0
  79. package/dist/cjs/resources/me.js.map +1 -0
  80. package/dist/cjs/resources/profiles.d.ts +47 -0
  81. package/dist/cjs/resources/profiles.d.ts.map +1 -0
  82. package/dist/cjs/resources/profiles.js +70 -0
  83. package/dist/cjs/resources/profiles.js.map +1 -0
  84. package/dist/cjs/resources/proof-me.d.ts +48 -0
  85. package/dist/cjs/resources/proof-me.d.ts.map +1 -0
  86. package/dist/cjs/resources/proof-me.js +24 -0
  87. package/dist/cjs/resources/proof-me.js.map +1 -0
  88. package/dist/cjs/resources/proofs.d.ts +81 -0
  89. package/dist/cjs/resources/proofs.d.ts.map +1 -0
  90. package/dist/cjs/resources/proofs.js +437 -0
  91. package/dist/cjs/resources/proofs.js.map +1 -0
  92. package/dist/cjs/resources/public-profiles.d.ts +36 -0
  93. package/dist/cjs/resources/public-profiles.d.ts.map +1 -0
  94. package/dist/cjs/resources/public-profiles.js +49 -0
  95. package/dist/cjs/resources/public-profiles.js.map +1 -0
  96. package/dist/cjs/resources/sessions.d.ts +15 -0
  97. package/dist/cjs/resources/sessions.d.ts.map +1 -0
  98. package/dist/cjs/resources/sessions.js +26 -0
  99. package/dist/cjs/resources/sessions.js.map +1 -0
  100. package/dist/cjs/resources/templates.d.ts +25 -0
  101. package/dist/cjs/resources/templates.d.ts.map +1 -0
  102. package/dist/cjs/resources/templates.js +46 -0
  103. package/dist/cjs/resources/templates.js.map +1 -0
  104. package/dist/cjs/resources/verification-requests.d.ts +56 -0
  105. package/dist/cjs/resources/verification-requests.d.ts.map +1 -0
  106. package/dist/cjs/resources/verification-requests.js +61 -0
  107. package/dist/cjs/resources/verification-requests.js.map +1 -0
  108. package/dist/cjs/resources/verifications.d.ts +60 -0
  109. package/dist/cjs/resources/verifications.d.ts.map +1 -0
  110. package/dist/cjs/resources/verifications.js +91 -0
  111. package/dist/cjs/resources/verifications.js.map +1 -0
  112. package/dist/cjs/resources/webhook-deliveries.d.ts +15 -0
  113. package/dist/cjs/resources/webhook-deliveries.d.ts.map +1 -0
  114. package/dist/cjs/resources/webhook-deliveries.js +26 -0
  115. package/dist/cjs/resources/webhook-deliveries.js.map +1 -0
  116. package/dist/cjs/streaming.d.ts +87 -0
  117. package/dist/cjs/streaming.d.ts.map +1 -0
  118. package/dist/cjs/streaming.js +289 -0
  119. package/dist/cjs/streaming.js.map +1 -0
  120. package/dist/cjs/types.d.ts +1483 -0
  121. package/dist/cjs/types.d.ts.map +1 -0
  122. package/dist/cjs/types.js +6 -0
  123. package/dist/cjs/types.js.map +1 -0
  124. package/dist/cjs/version.d.ts +2 -0
  125. package/dist/cjs/version.d.ts.map +1 -0
  126. package/dist/cjs/version.js +5 -0
  127. package/dist/cjs/version.js.map +1 -0
  128. package/dist/esm/client.d.ts +48 -0
  129. package/dist/esm/client.d.ts.map +1 -0
  130. package/dist/esm/client.js +69 -0
  131. package/dist/esm/client.js.map +1 -0
  132. package/dist/esm/credentials.d.ts +46 -0
  133. package/dist/esm/credentials.d.ts.map +1 -0
  134. package/dist/esm/credentials.js +127 -0
  135. package/dist/esm/credentials.js.map +1 -0
  136. package/dist/esm/crypto/hitl-crypto.d.ts +95 -0
  137. package/dist/esm/crypto/hitl-crypto.d.ts.map +1 -0
  138. package/dist/esm/crypto/hitl-crypto.js +321 -0
  139. package/dist/esm/crypto/hitl-crypto.js.map +1 -0
  140. package/dist/esm/errors.d.ts +52 -0
  141. package/dist/esm/errors.d.ts.map +1 -0
  142. package/dist/esm/errors.js +106 -0
  143. package/dist/esm/errors.js.map +1 -0
  144. package/dist/esm/http.d.ts +62 -0
  145. package/dist/esm/http.d.ts.map +1 -0
  146. package/dist/esm/http.js +187 -0
  147. package/dist/esm/http.js.map +1 -0
  148. package/dist/esm/index.d.ts +26 -0
  149. package/dist/esm/index.d.ts.map +1 -0
  150. package/dist/esm/index.js +33 -0
  151. package/dist/esm/index.js.map +1 -0
  152. package/dist/esm/jwks/key-set-cache.d.ts +105 -0
  153. package/dist/esm/jwks/key-set-cache.d.ts.map +1 -0
  154. package/dist/esm/jwks/key-set-cache.js +268 -0
  155. package/dist/esm/jwks/key-set-cache.js.map +1 -0
  156. package/dist/esm/jwks/keyset.d.ts +139 -0
  157. package/dist/esm/jwks/keyset.d.ts.map +1 -0
  158. package/dist/esm/jwks/keyset.js +489 -0
  159. package/dist/esm/jwks/keyset.js.map +1 -0
  160. package/dist/esm/jwks/support.d.ts +9 -0
  161. package/dist/esm/jwks/support.d.ts.map +1 -0
  162. package/dist/esm/jwks/support.js +9 -0
  163. package/dist/esm/jwks/support.js.map +1 -0
  164. package/dist/esm/package.json +1 -0
  165. package/dist/esm/polling.d.ts +10 -0
  166. package/dist/esm/polling.d.ts.map +1 -0
  167. package/dist/esm/polling.js +71 -0
  168. package/dist/esm/polling.js.map +1 -0
  169. package/dist/esm/resources/auth-sessions.d.ts +41 -0
  170. package/dist/esm/resources/auth-sessions.d.ts.map +1 -0
  171. package/dist/esm/resources/auth-sessions.js +30 -0
  172. package/dist/esm/resources/auth-sessions.js.map +1 -0
  173. package/dist/esm/resources/authorizations.d.ts +23 -0
  174. package/dist/esm/resources/authorizations.d.ts.map +1 -0
  175. package/dist/esm/resources/authorizations.js +25 -0
  176. package/dist/esm/resources/authorizations.js.map +1 -0
  177. package/dist/esm/resources/circles.d.ts +38 -0
  178. package/dist/esm/resources/circles.d.ts.map +1 -0
  179. package/dist/esm/resources/circles.js +63 -0
  180. package/dist/esm/resources/circles.js.map +1 -0
  181. package/dist/esm/resources/confirmations.d.ts +111 -0
  182. package/dist/esm/resources/confirmations.d.ts.map +1 -0
  183. package/dist/esm/resources/confirmations.js +82 -0
  184. package/dist/esm/resources/confirmations.js.map +1 -0
  185. package/dist/esm/resources/delegations.d.ts +36 -0
  186. package/dist/esm/resources/delegations.d.ts.map +1 -0
  187. package/dist/esm/resources/delegations.js +43 -0
  188. package/dist/esm/resources/delegations.js.map +1 -0
  189. package/dist/esm/resources/hitl-chat-id.d.ts +42 -0
  190. package/dist/esm/resources/hitl-chat-id.d.ts.map +1 -0
  191. package/dist/esm/resources/hitl-chat-id.js +33 -0
  192. package/dist/esm/resources/hitl-chat-id.js.map +1 -0
  193. package/dist/esm/resources/hitl-keys.d.ts +13 -0
  194. package/dist/esm/resources/hitl-keys.d.ts.map +1 -0
  195. package/dist/esm/resources/hitl-keys.js +18 -0
  196. package/dist/esm/resources/hitl-keys.js.map +1 -0
  197. package/dist/esm/resources/hitl.d.ts +39 -0
  198. package/dist/esm/resources/hitl.d.ts.map +1 -0
  199. package/dist/esm/resources/hitl.js +54 -0
  200. package/dist/esm/resources/hitl.js.map +1 -0
  201. package/dist/esm/resources/me.d.ts +102 -0
  202. package/dist/esm/resources/me.d.ts.map +1 -0
  203. package/dist/esm/resources/me.js +81 -0
  204. package/dist/esm/resources/me.js.map +1 -0
  205. package/dist/esm/resources/profiles.d.ts +47 -0
  206. package/dist/esm/resources/profiles.d.ts.map +1 -0
  207. package/dist/esm/resources/profiles.js +66 -0
  208. package/dist/esm/resources/profiles.js.map +1 -0
  209. package/dist/esm/resources/proof-me.d.ts +48 -0
  210. package/dist/esm/resources/proof-me.d.ts.map +1 -0
  211. package/dist/esm/resources/proof-me.js +20 -0
  212. package/dist/esm/resources/proof-me.js.map +1 -0
  213. package/dist/esm/resources/proofs.d.ts +81 -0
  214. package/dist/esm/resources/proofs.d.ts.map +1 -0
  215. package/dist/esm/resources/proofs.js +433 -0
  216. package/dist/esm/resources/proofs.js.map +1 -0
  217. package/dist/esm/resources/public-profiles.d.ts +36 -0
  218. package/dist/esm/resources/public-profiles.d.ts.map +1 -0
  219. package/dist/esm/resources/public-profiles.js +45 -0
  220. package/dist/esm/resources/public-profiles.js.map +1 -0
  221. package/dist/esm/resources/sessions.d.ts +15 -0
  222. package/dist/esm/resources/sessions.d.ts.map +1 -0
  223. package/dist/esm/resources/sessions.js +22 -0
  224. package/dist/esm/resources/sessions.js.map +1 -0
  225. package/dist/esm/resources/templates.d.ts +25 -0
  226. package/dist/esm/resources/templates.d.ts.map +1 -0
  227. package/dist/esm/resources/templates.js +42 -0
  228. package/dist/esm/resources/templates.js.map +1 -0
  229. package/dist/esm/resources/verification-requests.d.ts +56 -0
  230. package/dist/esm/resources/verification-requests.d.ts.map +1 -0
  231. package/dist/esm/resources/verification-requests.js +57 -0
  232. package/dist/esm/resources/verification-requests.js.map +1 -0
  233. package/dist/esm/resources/verifications.d.ts +60 -0
  234. package/dist/esm/resources/verifications.d.ts.map +1 -0
  235. package/dist/esm/resources/verifications.js +87 -0
  236. package/dist/esm/resources/verifications.js.map +1 -0
  237. package/dist/esm/resources/webhook-deliveries.d.ts +15 -0
  238. package/dist/esm/resources/webhook-deliveries.d.ts.map +1 -0
  239. package/dist/esm/resources/webhook-deliveries.js +22 -0
  240. package/dist/esm/resources/webhook-deliveries.js.map +1 -0
  241. package/dist/esm/streaming.d.ts +87 -0
  242. package/dist/esm/streaming.d.ts.map +1 -0
  243. package/dist/esm/streaming.js +286 -0
  244. package/dist/esm/streaming.js.map +1 -0
  245. package/dist/esm/types.d.ts +1483 -0
  246. package/dist/esm/types.d.ts.map +1 -0
  247. package/dist/esm/types.js +5 -0
  248. package/dist/esm/types.js.map +1 -0
  249. package/dist/esm/version.d.ts +2 -0
  250. package/dist/esm/version.d.ts.map +1 -0
  251. package/dist/esm/version.js +2 -0
  252. package/dist/esm/version.js.map +1 -0
  253. package/package.json +64 -4
@@ -0,0 +1,503 @@
1
+ "use strict";
2
+ /**
3
+ * LOCKSTEP COPY of `packages/delegation-verifier/src/keyset.ts` — the key-rotation rules, free of
4
+ * I/O. Everything below the imports must stay byte-identical to that file:
5
+ * `src/__tests__/drift/jwks-rotation-fixtures.test.ts` in the repository root fails otherwise, and
6
+ * `sdks/shared/fixtures/jwks_rotation/` pins the outcome of each rule across all five verifiers.
7
+ * Change a rule there, then copy it here; do not edit this file on its own.
8
+ *
9
+ * The persistence half (`serializeKeySetState` and friends) is carried along unused: this SDK keeps
10
+ * its key set in memory only, but trimming the copy would turn "identical" into "identical except".
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.TOMBSTONE_RETENTION_SECONDS = exports.CONFIRM_SPACING_MS = exports.KEY_WINDOW_SKEW_SECONDS = exports.KEY_FAMILIES = void 0;
14
+ exports.emptyKeySetState = emptyKeySetState;
15
+ exports.parseKeyRecord = parseKeyRecord;
16
+ exports.isRegistryLive = isRegistryLive;
17
+ exports.mergeFetchedDocument = mergeFetchedDocument;
18
+ exports.selectKeys = selectKeys;
19
+ exports.checkKeyPolicy = checkKeyPolicy;
20
+ exports.withPersistedTombstones = withPersistedTombstones;
21
+ exports.withConfirmedKeysOnly = withConfirmedKeysOnly;
22
+ exports.withoutTombstones = withoutTombstones;
23
+ exports.serializeKeySetState = serializeKeySetState;
24
+ exports.deserializeKeySetState = deserializeKeySetState;
25
+ const support_js_1 = require("./support.js");
26
+ exports.KEY_FAMILIES = ['proof', 'delegation', 'status-list'];
27
+ /** Clock skew tolerated on each edge of a key's `[not_before, not_after]` window. */
28
+ exports.KEY_WINDOW_SKEW_SECONDS = 300;
29
+ /** Minimum spacing between the two fetches that confirm a key, a narrowed window or a tombstone. */
30
+ exports.CONFIRM_SPACING_MS = 5 * 60000;
31
+ /** An applied tombstone is kept until `revoked_at` plus this. */
32
+ exports.TOMBSTONE_RETENTION_SECONDS = 365 * 86400;
33
+ function emptyKeySetState() {
34
+ return {
35
+ keys: new Map(),
36
+ anonymous: [],
37
+ pending: new Map(),
38
+ applied: new Map(),
39
+ fetchedAt: null,
40
+ fetchedAtUntrusted: false,
41
+ };
42
+ }
43
+ function isWholeNumber(value) {
44
+ return typeof value === 'number' && Number.isInteger(value);
45
+ }
46
+ function isKeyFamily(value) {
47
+ return typeof value === 'string' && exports.KEY_FAMILIES.includes(value);
48
+ }
49
+ const MATERIAL_MEMBERS = ['kty', 'crv', 'x', 'y', 'n', 'e'];
50
+ function fingerprintOf(jwk) {
51
+ return JSON.stringify(MATERIAL_MEMBERS.map((member) => jwk[member] ?? null));
52
+ }
53
+ function usageOf(jwk) {
54
+ return JSON.stringify([jwk.alg ?? null, jwk.use ?? null, jwk.key_ops ?? null]);
55
+ }
56
+ function parseKeyRecord(jwk, firstSeen) {
57
+ const record = {
58
+ jwk,
59
+ fingerprint: fingerprintOf(jwk),
60
+ usage: usageOf(jwk),
61
+ hasPurposeMember: jwk.proof_purpose !== undefined,
62
+ legacy: jwk.proof_legacy === true,
63
+ vanished: false,
64
+ firstSeen,
65
+ confirmed: false,
66
+ };
67
+ if (typeof jwk.kid === 'string' && jwk.kid.length > 0)
68
+ record.kid = jwk.kid;
69
+ if (isKeyFamily(jwk.proof_purpose))
70
+ record.purpose = jwk.proof_purpose;
71
+ if (isWholeNumber(jwk.not_before))
72
+ record.notBefore = jwk.not_before;
73
+ if (isWholeNumber(jwk.not_after))
74
+ record.notAfter = jwk.not_after;
75
+ if (isWholeNumber(jwk.max_token_lifetime))
76
+ record.maxTokenLifetime = jwk.max_token_lifetime;
77
+ return record;
78
+ }
79
+ function hasWindow(record) {
80
+ return record.notBefore !== undefined && record.notAfter !== undefined && record.maxTokenLifetime !== undefined;
81
+ }
82
+ /**
83
+ * A key the issuer's registry describes — it carries `proof_purpose` or `proof_legacy` — AND that
84
+ * two fetches at least `CONFIRM_SPACING_MS` apart served unchanged. The ONE predicate behind every
85
+ * rule that outlives a fetch: material lock, no widening, pending narrowing, retained when it
86
+ * vanishes. Window members alone do not make a registry key: without a purpose such a key cannot
87
+ * verify anything once the registry is live, so it keeps tolerant semantics.
88
+ */
89
+ function isProtectedRecord(record) {
90
+ return record.confirmed && (record.hasPurposeMember || record.legacy);
91
+ }
92
+ /**
93
+ * Whether two records describe the same key: material, usage, purpose, legacy marker and window.
94
+ * Usage counts because the record kept is the one first seen: a poisoned first sighting marked
95
+ * `use: "enc"` must be replaced by the honest description, not confirmed by it.
96
+ */
97
+ function describesSameKey(a, b) {
98
+ return (a.fingerprint === b.fingerprint &&
99
+ a.usage === b.usage &&
100
+ a.hasPurposeMember === b.hasPurposeMember &&
101
+ a.purpose === b.purpose &&
102
+ a.legacy === b.legacy &&
103
+ a.notBefore === b.notBefore &&
104
+ a.notAfter === b.notAfter &&
105
+ a.maxTokenLifetime === b.maxTokenLifetime);
106
+ }
107
+ function spacingElapsed(since, now) {
108
+ return now.monotonicMs - since.monotonicMs >= exports.CONFIRM_SPACING_MS;
109
+ }
110
+ function isRegistryLive(state) {
111
+ for (const record of state.keys.values())
112
+ if (record.hasPurposeMember)
113
+ return true;
114
+ return state.anonymous.some((record) => record.hasPurposeMember);
115
+ }
116
+ function wallSeconds(reading) {
117
+ return Math.floor(reading.wallMs / 1000);
118
+ }
119
+ /** Whether a kid may still be signing: legacy, window unknown, or not yet past `not_after`. */
120
+ function isLiveKey(record, nowSeconds) {
121
+ if (record.legacy || !hasWindow(record))
122
+ return true;
123
+ return nowSeconds <= record.notAfter + exports.KEY_WINDOW_SKEW_SECONDS;
124
+ }
125
+ function parseTombstones(value) {
126
+ if (!Array.isArray(value))
127
+ return [];
128
+ const tombstones = [];
129
+ for (const entry of value) {
130
+ if (!(0, support_js_1.isRecord)(entry))
131
+ continue;
132
+ if (typeof entry.kid !== 'string' || entry.kid.length === 0)
133
+ continue;
134
+ if (!isWholeNumber(entry.revoked_at))
135
+ continue;
136
+ tombstones.push({ kid: entry.kid, revokedAt: entry.revoked_at });
137
+ }
138
+ return tombstones;
139
+ }
140
+ function cloneState(state) {
141
+ return {
142
+ keys: new Map([...state.keys].map(([kid, record]) => [kid, { ...record }])),
143
+ anonymous: state.anonymous.map((record) => ({ ...record })),
144
+ pending: new Map(state.pending),
145
+ applied: new Map(state.applied),
146
+ fetchedAt: state.fetchedAt,
147
+ fetchedAtUntrusted: state.fetchedAtUntrusted,
148
+ };
149
+ }
150
+ /**
151
+ * Merge one fetched JWKS body (already known to be an object with a `keys` array) into `state`.
152
+ * Pure: returns a new state and the events the caller should report.
153
+ */
154
+ function mergeFetchedDocument(state, body, now) {
155
+ const nowSeconds = wallSeconds(now);
156
+ const candidates = Array.isArray(body.keys) ? body.keys.filter(support_js_1.isRecord) : [];
157
+ const served = new Map();
158
+ const anonymous = [];
159
+ for (const jwk of candidates) {
160
+ const record = parseKeyRecord(jwk, now);
161
+ if (record.kid)
162
+ served.set(record.kid, record);
163
+ else
164
+ anonymous.push(record);
165
+ }
166
+ // Widening is checked before anything is touched: such a document is refused whole.
167
+ for (const [kid, incoming] of served) {
168
+ const known = state.keys.get(kid);
169
+ if (!known || !isProtectedRecord(known) || !hasWindow(known) || !hasWindow(incoming))
170
+ continue;
171
+ if (incoming.notBefore < known.notBefore || incoming.notAfter > known.notAfter) {
172
+ return {
173
+ state,
174
+ accepted: false,
175
+ events: [
176
+ {
177
+ type: 'window_widening_rejected',
178
+ kid,
179
+ message: `JWKS refused: it widens the window of confirmed key "${kid}"`,
180
+ },
181
+ ],
182
+ };
183
+ }
184
+ }
185
+ const next = cloneState(state);
186
+ const events = [];
187
+ const tombstones = parseTombstones(body.proof_tombstones);
188
+ const tombstonedNow = new Set(tombstones.map((tombstone) => tombstone.kid));
189
+ for (const [kid, incoming] of served) {
190
+ const known = next.keys.get(kid);
191
+ // Not protected yet: the latest document describes the key, exactly as before rotation
192
+ // existed. Serving the same description again, far enough apart, confirms it.
193
+ if (!known || !isProtectedRecord(known)) {
194
+ if (known && describesSameKey(known, incoming)) {
195
+ if (!known.confirmed && spacingElapsed(known.firstSeen, now))
196
+ known.confirmed = true;
197
+ }
198
+ else {
199
+ next.keys.set(kid, incoming);
200
+ }
201
+ continue;
202
+ }
203
+ known.vanished = false;
204
+ if (known.fingerprint !== incoming.fingerprint) {
205
+ delete known.pendingWindow;
206
+ events.push({
207
+ type: 'key_material_changed',
208
+ kid,
209
+ message: `JWKS serves different key material for confirmed key "${kid}"; the first-seen key is kept`,
210
+ });
211
+ continue;
212
+ }
213
+ if (!hasWindow(known) || !hasWindow(incoming))
214
+ continue;
215
+ if (incoming.notBefore === known.notBefore && incoming.notAfter === known.notAfter) {
216
+ delete known.pendingWindow;
217
+ continue;
218
+ }
219
+ const pending = known.pendingWindow;
220
+ if (!pending || pending.notBefore !== incoming.notBefore || pending.notAfter !== incoming.notAfter) {
221
+ known.pendingWindow = { notBefore: incoming.notBefore, notAfter: incoming.notAfter, firstSeen: now };
222
+ events.push({
223
+ type: 'window_narrowing_pending',
224
+ kid,
225
+ message: `JWKS narrows the window of confirmed key "${kid}"; applied only if a fetch at least 5 minutes later serves the same window`,
226
+ });
227
+ continue;
228
+ }
229
+ if (!spacingElapsed(pending.firstSeen, now))
230
+ continue;
231
+ known.notBefore = pending.notBefore;
232
+ known.notAfter = pending.notAfter;
233
+ known.jwk = { ...known.jwk, not_before: pending.notBefore, not_after: pending.notAfter };
234
+ delete known.pendingWindow;
235
+ events.push({
236
+ type: 'window_narrowing_applied',
237
+ kid,
238
+ message: `narrowed window of key "${kid}" confirmed by a second fetch and applied`,
239
+ });
240
+ }
241
+ for (const [kid, known] of [...next.keys]) {
242
+ if (served.has(kid))
243
+ continue;
244
+ if (!isProtectedRecord(known)) {
245
+ next.keys.delete(kid);
246
+ continue;
247
+ }
248
+ if (hasWindow(known)) {
249
+ if (nowSeconds > known.notAfter + known.maxTokenLifetime + exports.KEY_WINDOW_SKEW_SECONDS) {
250
+ next.keys.delete(kid);
251
+ continue;
252
+ }
253
+ }
254
+ else if (!known.legacy) {
255
+ next.keys.delete(kid);
256
+ continue;
257
+ }
258
+ // A narrowing is confirmed by consecutive documents serving it; one that omits the kid breaks the run.
259
+ delete known.pendingWindow;
260
+ if (!known.vanished && !tombstonedNow.has(kid)) {
261
+ known.vanished = true;
262
+ events.push({
263
+ type: 'kid_vanished',
264
+ kid,
265
+ message: `key "${kid}" is no longer served before its retention ended; its last-known state is kept`,
266
+ });
267
+ }
268
+ }
269
+ next.anonymous = anonymous;
270
+ for (const [kid] of next.pending) {
271
+ if (!tombstonedNow.has(kid))
272
+ next.pending.delete(kid);
273
+ }
274
+ for (const tombstone of tombstones) {
275
+ if (next.applied.has(tombstone.kid))
276
+ continue;
277
+ const pending = next.pending.get(tombstone.kid);
278
+ if (pending) {
279
+ if (spacingElapsed(pending.firstSeen, now)) {
280
+ next.pending.delete(tombstone.kid);
281
+ next.applied.set(tombstone.kid, { kid: tombstone.kid, revokedAt: pending.revokedAt });
282
+ events.push({
283
+ type: 'tombstone_applied',
284
+ kid: tombstone.kid,
285
+ message: `tombstone for key "${tombstone.kid}" confirmed by a second fetch and applied`,
286
+ });
287
+ }
288
+ continue;
289
+ }
290
+ next.pending.set(tombstone.kid, { kid: tombstone.kid, revokedAt: tombstone.revokedAt, firstSeen: now });
291
+ events.push({
292
+ type: 'tombstone_pending',
293
+ kid: tombstone.kid,
294
+ message: `tombstone for key "${tombstone.kid}" seen; applied only if a fetch at least 5 minutes later still carries it`,
295
+ });
296
+ // "Last seen live" is read from what the verifier knew BEFORE this document, which may itself
297
+ // have dropped the key.
298
+ const known = state.keys.get(tombstone.kid);
299
+ if (known && isLiveKey(known, nowSeconds)) {
300
+ events.push({
301
+ type: 'tombstone_for_live_key',
302
+ kid: tombstone.kid,
303
+ message: `ANOMALY: tombstone names key "${tombstone.kid}", which was last seen live`,
304
+ });
305
+ }
306
+ }
307
+ for (const [kid, applied] of [...next.applied]) {
308
+ if (nowSeconds > applied.revokedAt + exports.TOMBSTONE_RETENTION_SECONDS)
309
+ next.applied.delete(kid);
310
+ }
311
+ next.fetchedAt = now;
312
+ next.fetchedAtUntrusted = false;
313
+ return { state: next, events, accepted: true };
314
+ }
315
+ /**
316
+ * Which keys may verify a token of `family` carrying `kid`. Checks the applied tombstone and the
317
+ * key's purpose; the signature and the window are the caller's next steps, in that order.
318
+ */
319
+ function selectKeys(state, kid, family) {
320
+ const registryLive = isRegistryLive(state);
321
+ if (kid !== undefined) {
322
+ if (state.applied.has(kid))
323
+ return { kind: 'revoked', kid };
324
+ const record = state.keys.get(kid);
325
+ if (!record)
326
+ return { kind: 'unknown' };
327
+ if (record.legacy || !registryLive)
328
+ return { kind: 'candidates', records: [record] };
329
+ if (record.purpose !== family)
330
+ return { kind: 'wrong_purpose', kid };
331
+ return { kind: 'candidates', records: [record] };
332
+ }
333
+ // No `kid`: once the registry is live only a key marked legacy may answer — trying every key
334
+ // would let a token borrow any family's key and skip the purpose check.
335
+ const all = [...state.anonymous, ...state.keys.values()].filter((record) => !(record.kid && state.applied.has(record.kid)));
336
+ const records = registryLive ? all.filter((record) => record.legacy) : all;
337
+ return records.length > 0 ? { kind: 'candidates', records } : { kind: 'unknown' };
338
+ }
339
+ /** The window and lifetime rules for a key whose signature has verified. */
340
+ function checkKeyPolicy(record, token, registryLive) {
341
+ if (!registryLive || record.legacy)
342
+ return null;
343
+ if (!hasWindow(record))
344
+ return 'outside_key_window';
345
+ if (!isWholeNumber(token.iat))
346
+ return 'outside_key_window';
347
+ if (token.iat < record.notBefore - exports.KEY_WINDOW_SKEW_SECONDS)
348
+ return 'outside_key_window';
349
+ if (token.iat > record.notAfter + exports.KEY_WINDOW_SKEW_SECONDS)
350
+ return 'outside_key_window';
351
+ if (typeof token.exp !== 'number' || token.exp > token.iat + record.maxTokenLifetime) {
352
+ return 'token_lifetime_exceeded';
353
+ }
354
+ return null;
355
+ }
356
+ /**
357
+ * Fold the tombstones of a persisted state into a set this process has already fetched. The
358
+ * fetched keys are newer than disk, but a tombstone is not something a later fetch can restore:
359
+ * dropping the persisted one would silently un-revoke a key until two more fetches agreed again.
360
+ */
361
+ function withPersistedTombstones(state, persisted) {
362
+ const next = cloneState(state);
363
+ for (const [kid, applied] of persisted.applied) {
364
+ if (!next.applied.has(kid))
365
+ next.applied.set(kid, applied);
366
+ }
367
+ for (const [kid, pending] of persisted.pending) {
368
+ if (!next.applied.has(kid) && !next.pending.has(kid))
369
+ next.pending.set(kid, pending);
370
+ }
371
+ return next;
372
+ }
373
+ /**
374
+ * The part of a cached set that may answer after a refetch FAILED: confirmed keys only. An
375
+ * unconfirmed key is trusted until the next document, and a failing fetch must not stretch that to
376
+ * `maxJwksAgeMs` — otherwise one poisoned response followed by an outage would keep its key, and
377
+ * the registry mode it switched on, for a day.
378
+ */
379
+ function withConfirmedKeysOnly(state) {
380
+ const next = cloneState(state);
381
+ for (const [kid, record] of [...next.keys]) {
382
+ if (!record.confirmed)
383
+ next.keys.delete(kid);
384
+ }
385
+ next.anonymous = [];
386
+ return next;
387
+ }
388
+ /** Drop every applied and pending tombstone — the documented manual reset. */
389
+ function withoutTombstones(state) {
390
+ const next = cloneState(state);
391
+ next.applied.clear();
392
+ next.pending.clear();
393
+ return next;
394
+ }
395
+ const PERSISTED_VERSION = 1;
396
+ /**
397
+ * Persisted form. Every timestamp is wall-clock milliseconds: a monotonic reading means nothing
398
+ * to another process.
399
+ */
400
+ function serializeKeySetState(state) {
401
+ return JSON.stringify({
402
+ v: PERSISTED_VERSION,
403
+ fetched_at_wall_ms: state.fetchedAt && !state.fetchedAtUntrusted ? state.fetchedAt.wallMs : null,
404
+ keys: [...state.keys.values()].map((record) => ({
405
+ jwk: record.jwk,
406
+ vanished: record.vanished,
407
+ confirmed: record.confirmed,
408
+ first_seen_wall_ms: record.firstSeen.wallMs,
409
+ ...(record.pendingWindow
410
+ ? {
411
+ pending_window: {
412
+ not_before: record.pendingWindow.notBefore,
413
+ not_after: record.pendingWindow.notAfter,
414
+ first_seen_wall_ms: record.pendingWindow.firstSeen.wallMs,
415
+ },
416
+ }
417
+ : {}),
418
+ })),
419
+ anonymous: state.anonymous.map((record) => record.jwk),
420
+ pending: [...state.pending.values()].map((pending) => ({
421
+ kid: pending.kid,
422
+ revoked_at: pending.revokedAt,
423
+ first_seen_wall_ms: pending.firstSeen.wallMs,
424
+ })),
425
+ applied: [...state.applied.values()].map((applied) => ({ kid: applied.kid, revoked_at: applied.revokedAt })),
426
+ });
427
+ }
428
+ function fromWall(wallMs, now) {
429
+ return { wallMs, monotonicMs: now.monotonicMs - (now.wallMs - wallMs) };
430
+ }
431
+ /**
432
+ * Rebuild a persisted state, or null when the blob is not one. A `fetched_at` in the future marks
433
+ * the set stale; a pending tombstone first seen in the future is dropped.
434
+ */
435
+ function deserializeKeySetState(raw, now) {
436
+ let parsed;
437
+ try {
438
+ parsed = JSON.parse(raw);
439
+ }
440
+ catch {
441
+ return null;
442
+ }
443
+ if (!(0, support_js_1.isRecord)(parsed) || parsed.v !== PERSISTED_VERSION)
444
+ return null;
445
+ const state = emptyKeySetState();
446
+ if (Array.isArray(parsed.keys)) {
447
+ for (const entry of parsed.keys) {
448
+ if (!(0, support_js_1.isRecord)(entry) || !(0, support_js_1.isRecord)(entry.jwk))
449
+ continue;
450
+ // A first sighting persisted in the future cannot be timed: the key starts over as unconfirmed.
451
+ const firstSeenWall = entry.first_seen_wall_ms;
452
+ const firstSeen = isWholeNumber(firstSeenWall) && firstSeenWall <= now.wallMs ? fromWall(firstSeenWall, now) : null;
453
+ const record = parseKeyRecord(entry.jwk, firstSeen ?? now);
454
+ if (!record.kid)
455
+ continue;
456
+ record.vanished = entry.vanished === true;
457
+ record.confirmed = firstSeen !== null && entry.confirmed === true;
458
+ const pendingWindow = entry.pending_window;
459
+ if ((0, support_js_1.isRecord)(pendingWindow) &&
460
+ isWholeNumber(pendingWindow.not_before) &&
461
+ isWholeNumber(pendingWindow.not_after) &&
462
+ isWholeNumber(pendingWindow.first_seen_wall_ms) &&
463
+ pendingWindow.first_seen_wall_ms <= now.wallMs) {
464
+ record.pendingWindow = {
465
+ notBefore: pendingWindow.not_before,
466
+ notAfter: pendingWindow.not_after,
467
+ firstSeen: fromWall(pendingWindow.first_seen_wall_ms, now),
468
+ };
469
+ }
470
+ state.keys.set(record.kid, record);
471
+ }
472
+ }
473
+ if (Array.isArray(parsed.anonymous)) {
474
+ state.anonymous = parsed.anonymous.filter(support_js_1.isRecord).map((jwk) => parseKeyRecord(jwk, now));
475
+ }
476
+ for (const applied of parseTombstones(parsed.applied))
477
+ state.applied.set(applied.kid, applied);
478
+ if (Array.isArray(parsed.pending)) {
479
+ for (const entry of parsed.pending) {
480
+ if (!(0, support_js_1.isRecord)(entry) || typeof entry.kid !== 'string' || !isWholeNumber(entry.revoked_at))
481
+ continue;
482
+ if (!isWholeNumber(entry.first_seen_wall_ms) || entry.first_seen_wall_ms > now.wallMs)
483
+ continue;
484
+ state.pending.set(entry.kid, {
485
+ kid: entry.kid,
486
+ revokedAt: entry.revoked_at,
487
+ firstSeen: fromWall(entry.first_seen_wall_ms, now),
488
+ });
489
+ }
490
+ }
491
+ const fetchedAtWall = parsed.fetched_at_wall_ms;
492
+ if (isWholeNumber(fetchedAtWall)) {
493
+ if (fetchedAtWall > now.wallMs) {
494
+ state.fetchedAt = now;
495
+ state.fetchedAtUntrusted = true;
496
+ }
497
+ else {
498
+ state.fetchedAt = fromWall(fetchedAtWall, now);
499
+ }
500
+ }
501
+ return state;
502
+ }
503
+ //# sourceMappingURL=keyset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyset.js","sourceRoot":"","sources":["../../../src/jwks/keyset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The two helpers `keyset.ts` imports. They live here, not in `types.ts`, because `keyset.ts` is a
3
+ * lockstep copy of `packages/delegation-verifier/src/keyset.ts` and imports them under the same
4
+ * names that package gives them.
5
+ */
6
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
7
+ /** What a key-set merge can report. `store_error` belongs to the verifier's persistence, which this SDK has none of. */
8
+ export type JwksEventType = 'tombstone_pending' | 'tombstone_applied' | 'tombstone_for_live_key' | 'window_narrowing_pending' | 'window_narrowing_applied' | 'window_widening_rejected' | 'key_material_changed' | 'kid_vanished' | 'store_error';
9
+ //# sourceMappingURL=support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../src/jwks/support.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wHAAwH;AACxH,MAAM,MAAM,aAAa,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,0BAA0B,GAC1B,0BAA0B,GAC1B,0BAA0B,GAC1B,sBAAsB,GACtB,cAAc,GACd,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * The two helpers `keyset.ts` imports. They live here, not in `types.ts`, because `keyset.ts` is a
4
+ * lockstep copy of `packages/delegation-verifier/src/keyset.ts` and imports them under the same
5
+ * names that package gives them.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.isRecord = isRecord;
9
+ function isRecord(value) {
10
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
11
+ }
12
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.js","sourceRoot":"","sources":["../../../src/jwks/support.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAEH,4BAEC;AAFD,SAAgB,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { WaitOptions } from './types.js';
2
+ /**
3
+ * Generic polling helper. Calls `retrieve` repeatedly until the returned
4
+ * object's `status` field is in `terminalStates`, or the timeout is reached.
5
+ * Uses exponential backoff with jitter per the standard polling contract.
6
+ */
7
+ export declare function pollUntilComplete<T extends {
8
+ status: string;
9
+ }>(retrieve: () => Promise<T>, terminalStates: readonly string[], label: string, options?: WaitOptions): Promise<T>;
10
+ //# sourceMappingURL=polling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/polling.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6B9C;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAClE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC1B,cAAc,EAAE,SAAS,MAAM,EAAE,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,CAAC,CAAC,CA2BZ"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pollUntilComplete = pollUntilComplete;
4
+ const errors_js_1 = require("./errors.js");
5
+ const DEFAULT_INTERVAL = 2000;
6
+ const DEFAULT_TIMEOUT = 600000;
7
+ const DEFAULT_BACKOFF = 1.5;
8
+ const DEFAULT_MAX_INTERVAL = 30000;
9
+ const DEFAULT_JITTER = 500;
10
+ function requirePositiveFinite(name, value) {
11
+ if (!Number.isFinite(value) || value <= 0) {
12
+ throw new RangeError(`${name} must be a finite positive number, got ${value}`);
13
+ }
14
+ return value;
15
+ }
16
+ function requireBackoff(value) {
17
+ if (!Number.isFinite(value) || value < 1) {
18
+ throw new RangeError(`backoff must be a finite number >= 1, got ${value}`);
19
+ }
20
+ return value;
21
+ }
22
+ function requireJitter(value) {
23
+ if (!Number.isFinite(value) || value < 0) {
24
+ throw new RangeError(`jitter must be a finite non-negative number, got ${value}`);
25
+ }
26
+ return value;
27
+ }
28
+ /**
29
+ * Generic polling helper. Calls `retrieve` repeatedly until the returned
30
+ * object's `status` field is in `terminalStates`, or the timeout is reached.
31
+ * Uses exponential backoff with jitter per the standard polling contract.
32
+ */
33
+ async function pollUntilComplete(retrieve, terminalStates, label, options) {
34
+ let interval = requirePositiveFinite('interval', options?.interval ?? DEFAULT_INTERVAL);
35
+ const timeout = requirePositiveFinite('timeout', options?.timeout ?? DEFAULT_TIMEOUT);
36
+ const backoff = requireBackoff(options?.backoff ?? DEFAULT_BACKOFF);
37
+ const maxInterval = requirePositiveFinite('maxInterval', options?.maxInterval ?? DEFAULT_MAX_INTERVAL);
38
+ const jitterMax = requireJitter(options?.jitter ?? DEFAULT_JITTER);
39
+ const start = performance.now();
40
+ while (true) {
41
+ options?.signal?.throwIfAborted();
42
+ const resource = await retrieve();
43
+ if (terminalStates.includes(resource.status)) {
44
+ return resource;
45
+ }
46
+ if (performance.now() - start >= timeout) {
47
+ throw new errors_js_1.PollingTimeoutError(`${label} did not complete within ${timeout}ms (last status: ${resource.status})`);
48
+ }
49
+ const jitter = Math.random() * jitterMax;
50
+ await sleepWithAbort(interval + jitter, options?.signal);
51
+ interval = Math.min(interval * backoff, maxInterval);
52
+ }
53
+ }
54
+ function sleepWithAbort(ms, signal) {
55
+ if (!signal) {
56
+ return new Promise((resolve) => setTimeout(resolve, ms));
57
+ }
58
+ return new Promise((resolve, reject) => {
59
+ if (signal.aborted) {
60
+ reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
61
+ return;
62
+ }
63
+ const timer = setTimeout(() => {
64
+ signal.removeEventListener('abort', onAbort);
65
+ resolve();
66
+ }, ms);
67
+ const onAbort = () => {
68
+ clearTimeout(timer);
69
+ reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
70
+ };
71
+ signal.addEventListener('abort', onAbort, { once: true });
72
+ });
73
+ }
74
+ //# sourceMappingURL=polling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/polling.ts"],"names":[],"mappings":"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"}