@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,433 @@
1
+ import { inflateSync } from 'node:zlib';
2
+ import { compactVerify, decodeJwt, decodeProtectedHeader, jwtVerify, errors as joseErrors, } from 'jose';
3
+ import { readCapped } from '../http.js';
4
+ import { DEFAULT_MAX_JWKS_AGE_MS, KeySetCache, assertMaxJwksAgeMs, isSupportedAlgorithm, nowWallMs, } from '../jwks/key-set-cache.js';
5
+ import { checkKeyPolicy } from '../jwks/keyset.js';
6
+ /** Clock skew tolerated on both the proof token and the status list, in seconds. */
7
+ const CLOCK_TOLERANCE_SECONDS = 5;
8
+ /** The only `iss` a proof token may carry. */
9
+ const PROOF_TOKEN_ISSUER = 'proof.holdings';
10
+ /** Ceiling on a fetched status list, mirroring `@proof-holdings/delegation-verifier`. */
11
+ const MAX_STATUS_LIST_BYTES = 512 * 1024;
12
+ const STATUS_LIST_TIMEOUT_MS = 5000;
13
+ /** The draft's 2-bit slot values (draft-ietf-oauth-status-list). */
14
+ const SLOT_VALID = 0b00;
15
+ const SLOT_REVOKED = 0b01;
16
+ const SLOT_SUSPENDED = 0b10;
17
+ function isRecord(value) {
18
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
19
+ }
20
+ /** The token's own slot reference, or null when it carries none. */
21
+ function readStatusListClaim(claims) {
22
+ const status = claims.status;
23
+ if (!isRecord(status))
24
+ return null;
25
+ const statusList = status.status_list;
26
+ if (!isRecord(statusList))
27
+ return null;
28
+ const { idx, uri } = statusList;
29
+ if (typeof idx !== 'number' || !Number.isInteger(idx) || idx < 0)
30
+ return null;
31
+ if (typeof uri !== 'string' || uri.length === 0)
32
+ return null;
33
+ return { idx, uri };
34
+ }
35
+ /**
36
+ * Read one slot out of a decoded list: lowest index in the least significant bits, `bits`
37
+ * statuses per byte — the draft's byte order, pinned across the four SDKs and the issuer by
38
+ * `sdks/shared/fixtures/status_list_slots.json`.
39
+ *
40
+ * `null` means the array does not reach that index, which is "no answer", never "valid".
41
+ */
42
+ function readStatusSlot(bytes, index, bits) {
43
+ if (!Number.isInteger(index) || index < 0)
44
+ return null;
45
+ if (bits !== 1 && bits !== 2 && bits !== 4 && bits !== 8)
46
+ return null;
47
+ const perByte = 8 / bits;
48
+ const byteIndex = Math.floor(index / perByte);
49
+ if (byteIndex >= bytes.length)
50
+ return null;
51
+ return (bytes[byteIndex] >> ((index % perByte) * bits)) & ((1 << bits) - 1);
52
+ }
53
+ /**
54
+ * Inflate the zlib-wrapped DEFLATE payload the issuer publishes.
55
+ *
56
+ * `node:zlib` rather than the web `DecompressionStream`: this SDK already targets Node (it uses
57
+ * the `crypto` module and `Buffer` for the HITL envelope, and its tsconfig carries no DOM lib),
58
+ * so a web-stream version would buy no portability and cost a type it cannot name.
59
+ */
60
+ function inflate(bytes) {
61
+ return inflateSync(bytes);
62
+ }
63
+ /**
64
+ * Why a token whose signature verified failed its own claims: `expired`, or `invalid` for every
65
+ * other claim (`iss`, `typ`, `sub`, a missing `exp`).
66
+ */
67
+ function claimFailureReason(error) {
68
+ return error instanceof joseErrors.JWTExpired ? 'expired' : 'invalid';
69
+ }
70
+ function errorMessage(error) {
71
+ return error instanceof Error ? error.message : String(error);
72
+ }
73
+ export class Proofs {
74
+ constructor(http, options = {}) {
75
+ this.http = http;
76
+ /** The last status list read, reusable until the issuer's own `ttl`/`exp` runs out. */
77
+ this.statusListCache = null;
78
+ const maxJwksAgeMs = options.maxJwksAgeMs ?? DEFAULT_MAX_JWKS_AGE_MS;
79
+ assertMaxJwksAgeMs(maxJwksAgeMs);
80
+ this.keySet = new KeySetCache(http, `${http.baseUrl}/.well-known/jwks.json`, maxJwksAgeMs);
81
+ }
82
+ /**
83
+ * Validate a proof token online (checks revocation status).
84
+ *
85
+ * Pass `identifier` to also bind the proof to the identifier you expect it to be about: a
86
+ * proof about anything else answers `valid: false` with reason `identifier_mismatch`, and a
87
+ * proof of an encrypted decision — whose hash is over ciphertext — answers
88
+ * `identifier_unverifiable`. For a proof about a verified identifier any format is accepted
89
+ * and canonicalized as it was at issuance; a proof of an approval decision binds only on the
90
+ * exact recipient value it was issued for.
91
+ */
92
+ validate(proofToken, identifier) {
93
+ return this.http.post('/api/v1/proofs/validate', {
94
+ proof_token: proofToken,
95
+ ...(identifier ? { identifier } : {}),
96
+ });
97
+ }
98
+ /**
99
+ * Revoke a proof by public handle (`ph_ctl_*`/`ph_dlg_*`) or verification id.
100
+ *
101
+ * Revoking a PROOF does not withdraw the asset, consent or delegation it is about — those have
102
+ * their own surfaces.
103
+ */
104
+ revoke(id, reason) {
105
+ return this.http.post(`/api/v1/proofs/${encodeURIComponent(id)}/revoke`, {
106
+ ...(reason ? { reason } : {}),
107
+ });
108
+ }
109
+ /** Get the status of a proof by public handle (`ph_ctl_*`/`ph_dlg_*`) or verification id. A live proof reads `active`. */
110
+ status(id) {
111
+ return this.http.get(`/api/v1/proofs/${encodeURIComponent(id)}/status`);
112
+ }
113
+ /** Get the revocation list */
114
+ listRevoked() {
115
+ return this.http.get('/api/v1/proofs/revoked');
116
+ }
117
+ /**
118
+ * Verify a proof token without calling the Proof API with your key.
119
+ *
120
+ * Two public documents are read, both cacheable and neither revealing which proof you are
121
+ * checking: the JWKS (for the signature) and the issuer's Token Status List (for revocation).
122
+ *
123
+ * By default the proof's status-list slot IS checked, so a revoked or suspended proof answers
124
+ * `valid: false` with `reason` `revoked`/`suspended`. A list that cannot be read — unreachable,
125
+ * failing its own checks, or not covering this slot — answers `status_unavailable`: the refusal
126
+ * to guess, not a claim that the proof is withdrawn. A token carrying no slot at all stays
127
+ * valid with `revocation_checked: false`, which is exactly what the issuer's own
128
+ * `POST /proofs/validate` answers for it.
129
+ *
130
+ * Pass `{ checkRevocation: false }` to check the signature alone; the result then reports
131
+ * `revocation_checked: false`.
132
+ *
133
+ * The key set follows the issuer's key-rotation rules (`sdks/shared/fixtures/jwks_rotation/`): a
134
+ * key the issuer revoked answers `key_revoked` with a `pull_hint` naming where a re-issued token
135
+ * can be fetched; a key set that could not be refreshed for longer than `maxJwksAgeMs` answers
136
+ * `jwks_stale` with its `cache_age_seconds`; a key of another family, a token signed outside its
137
+ * key's window or living longer than the key allows answer `wrong_key_purpose`,
138
+ * `outside_key_window` and `token_lifetime_exceeded`; a `kid` the issuer does not publish answers
139
+ * `unknown_key`. A key set that could not be read at all answers `status_unavailable`.
140
+ */
141
+ async verifyOffline(token, options) {
142
+ let unverified;
143
+ try {
144
+ unverified = decodeJwt(token);
145
+ }
146
+ catch (error) {
147
+ return { valid: false, error: errorMessage(error), reason: 'invalid', revocation_checked: false };
148
+ }
149
+ // The family only selects which key may answer; the signature still has to match that key.
150
+ const family = unverified.token_type === 'delegation' ? 'delegation' : 'proof';
151
+ let checked;
152
+ try {
153
+ checked = await this.verifyAgainstKeySet(token, family, { issuer: PROOF_TOKEN_ISSUER });
154
+ }
155
+ catch (error) {
156
+ checked = { ok: false, reason: 'invalid', message: errorMessage(error) };
157
+ }
158
+ if (!checked.ok) {
159
+ const handle = family === 'delegation' ? unverified.sub : unverified.proof_id;
160
+ return {
161
+ valid: false,
162
+ error: checked.message,
163
+ reason: checked.reason,
164
+ revocation_checked: false,
165
+ ...(checked.reason === 'key_revoked'
166
+ ? {
167
+ pull_hint: {
168
+ issuer_origin: new URL(this.http.baseUrl).origin,
169
+ handle: typeof handle === 'string' ? handle : null,
170
+ },
171
+ }
172
+ : {}),
173
+ ...(checked.reason === 'jwks_stale' ? { cache_age_seconds: checked.cacheAgeSeconds ?? null } : {}),
174
+ };
175
+ }
176
+ const claims = checked.payload;
177
+ const verified = {
178
+ valid: true,
179
+ payload: {
180
+ iss: claims.iss,
181
+ sub: claims.sub,
182
+ iat: claims.iat,
183
+ exp: claims.exp,
184
+ type: claims.type,
185
+ channel: claims.channel,
186
+ identifier_hash: claims.identifier_hash,
187
+ verified_at: claims.verified_at,
188
+ user_id: claims.user_id,
189
+ decision: claims.decision,
190
+ },
191
+ revocation_checked: false,
192
+ };
193
+ if (options?.checkRevocation === false)
194
+ return verified;
195
+ const claim = readStatusListClaim(claims);
196
+ if (!claim)
197
+ return verified;
198
+ const outcome = await this.checkStatusList(claim);
199
+ switch (outcome.state) {
200
+ case 'valid':
201
+ return { ...verified, revocation_checked: true };
202
+ case 'revoked':
203
+ case 'suspended':
204
+ return {
205
+ valid: false,
206
+ payload: verified.payload,
207
+ reason: outcome.state,
208
+ error: `This proof is ${outcome.state}`,
209
+ revocation_checked: true,
210
+ };
211
+ case 'unavailable':
212
+ return {
213
+ valid: false,
214
+ payload: verified.payload,
215
+ reason: 'status_unavailable',
216
+ error: outcome.message,
217
+ revocation_checked: false,
218
+ };
219
+ }
220
+ }
221
+ /**
222
+ * Make the next verification refetch the key set, ignoring its 10-minute reuse window and the
223
+ * 30-second cooldowns, and drop the cached status list. A successful refetch resets the key
224
+ * set's age — the remedy a `jwks_stale` answer names. What the verifier knows is kept: key
225
+ * confirmations and tombstones survive (`clearTombstones()` is the separate, deliberate reset).
226
+ */
227
+ refreshJWKS() {
228
+ this.keySet.forceRefresh();
229
+ this.statusListCache = null;
230
+ }
231
+ /**
232
+ * Forget every revoked-key tombstone this client has applied or is waiting to confirm. They are
233
+ * held in memory only — a restart forgets them too — and otherwise kept until a year after the
234
+ * revocation, whatever later key sets say.
235
+ */
236
+ clearTombstones() {
237
+ this.keySet.clearTombstones();
238
+ }
239
+ /**
240
+ * The signature against the issuer's key set, then the window and lifetime of the key that made
241
+ * it, then the token's own claims — so a forgery reads as a bad signature, never as a policy
242
+ * violation of a key it did not come from, and a policy violation outranks an expired token.
243
+ */
244
+ async verifyAgainstKeySet(token, family, claimOptions) {
245
+ let alg;
246
+ let kid;
247
+ try {
248
+ const header = decodeProtectedHeader(token);
249
+ alg = header.alg;
250
+ kid = typeof header.kid === 'string' ? header.kid : undefined;
251
+ }
252
+ catch (error) {
253
+ return { ok: false, reason: 'invalid', message: errorMessage(error) };
254
+ }
255
+ // Chosen from the allow-list, never trusted from the header: `none` and HMAC die here.
256
+ if (!isSupportedAlgorithm(alg)) {
257
+ return { ok: false, reason: 'invalid', message: `token algorithm ${String(alg)} is not accepted` };
258
+ }
259
+ const resolution = await this.keySet.resolve(kid, alg, family);
260
+ switch (resolution.kind) {
261
+ case 'unavailable':
262
+ return { ok: false, reason: 'status_unavailable', message: resolution.message };
263
+ case 'stale':
264
+ return {
265
+ ok: false,
266
+ reason: 'jwks_stale',
267
+ message: 'the issuer key set could not be refreshed and the cached copy is older than maxJwksAgeMs; call refreshJWKS() once the issuer is reachable',
268
+ cacheAgeSeconds: resolution.cacheAgeSeconds,
269
+ };
270
+ case 'revoked':
271
+ return { ok: false, reason: 'key_revoked', message: `the issuer revoked signing key "${resolution.kid}"` };
272
+ case 'wrong_purpose':
273
+ return {
274
+ ok: false,
275
+ reason: 'wrong_key_purpose',
276
+ message: `signing key "${resolution.kid}" is not a ${family} key`,
277
+ };
278
+ case 'unknown':
279
+ return { ok: false, reason: 'unknown_key', message: 'no key in the issuer key set matches this token' };
280
+ case 'keys':
281
+ break;
282
+ }
283
+ let matched = null;
284
+ for (const candidate of resolution.candidates) {
285
+ try {
286
+ await compactVerify(token, candidate.key, { algorithms: [alg] });
287
+ matched = candidate;
288
+ break;
289
+ }
290
+ catch {
291
+ // Not this key; a token matching none of them is a bad signature.
292
+ }
293
+ }
294
+ if (!matched)
295
+ return { ok: false, reason: 'invalid', message: 'signature verification failed' };
296
+ const signed = decodeJwt(token);
297
+ const violation = checkKeyPolicy(matched.record, { iat: signed.iat, exp: signed.exp }, resolution.registryLive);
298
+ if (violation === 'outside_key_window') {
299
+ return { ok: false, reason: violation, message: "token iat lies outside the signing key's window" };
300
+ }
301
+ if (violation === 'token_lifetime_exceeded') {
302
+ return {
303
+ ok: false,
304
+ reason: violation,
305
+ message: "token exp lies beyond iat plus the signing key's max_token_lifetime",
306
+ };
307
+ }
308
+ try {
309
+ const { payload } = await jwtVerify(token, matched.key, {
310
+ ...claimOptions,
311
+ algorithms: [alg],
312
+ clockTolerance: CLOCK_TOLERANCE_SECONDS,
313
+ currentDate: new Date(nowWallMs()),
314
+ });
315
+ return { ok: true, payload: payload };
316
+ }
317
+ catch (error) {
318
+ return { ok: false, reason: claimFailureReason(error), message: errorMessage(error) };
319
+ }
320
+ }
321
+ /** Resolve one token's slot against the issuer's signed status list. */
322
+ async checkStatusList(claim) {
323
+ let uri;
324
+ try {
325
+ uri = new URL(claim.uri);
326
+ }
327
+ catch {
328
+ return { state: 'unavailable', message: 'status list uri is not a valid URL' };
329
+ }
330
+ // The uri arrives INSIDE the artifact being verified, so fetching whatever it names would
331
+ // hand a forged token both the status authority and a request from your network. Only the
332
+ // origin this client is configured against is honoured.
333
+ const configuredOrigin = new URL(this.http.baseUrl).origin;
334
+ if (uri.origin !== configuredOrigin) {
335
+ return {
336
+ state: 'unavailable',
337
+ message: `status list uri origin ${uri.origin} is not the configured issuer origin ${configuredOrigin}`,
338
+ };
339
+ }
340
+ const list = await this.loadStatusList(uri.toString());
341
+ if ('message' in list)
342
+ return { state: 'unavailable', message: list.message };
343
+ const slot = readStatusSlot(list.bytes, claim.idx, list.bits);
344
+ if (slot === null) {
345
+ return { state: 'unavailable', message: `status list has no slot ${claim.idx}` };
346
+ }
347
+ if (slot === SLOT_REVOKED)
348
+ return { state: 'revoked' };
349
+ if (slot === SLOT_SUSPENDED)
350
+ return { state: 'suspended' };
351
+ if (slot === SLOT_VALID)
352
+ return { state: 'valid' };
353
+ // `0b11` is reserved for application-specific use by the draft; the issuer packs it when it
354
+ // could not resolve a delegation's control proof. It is an absence of an answer.
355
+ return { state: 'unavailable', message: `status list slot carries unknown status ${slot}` };
356
+ }
357
+ async loadStatusList(uri) {
358
+ const cached = this.statusListCache;
359
+ if (cached && cached.uri === uri && cached.expiresAtMs > nowWallMs()) {
360
+ return { bytes: cached.bytes, bits: cached.bits };
361
+ }
362
+ let response;
363
+ let read;
364
+ try {
365
+ response = await this.http.fetchPublic(uri, {
366
+ timeoutMs: STATUS_LIST_TIMEOUT_MS,
367
+ headers: { accept: 'application/statuslist+jwt, application/jwt, text/plain' },
368
+ });
369
+ if (response.status !== 200) {
370
+ return { message: `status list fetch failed with HTTP ${response.status}` };
371
+ }
372
+ const declaredLength = Number(response.headers.get('content-length'));
373
+ if (Number.isFinite(declaredLength) && declaredLength > MAX_STATUS_LIST_BYTES) {
374
+ return { message: 'status list response is too large' };
375
+ }
376
+ // Inside the SAME try as the fetch: a body that breaks AFTER the headers, or a deadline
377
+ // that lands mid-read, rejects here — and the other three SDKs answer that with
378
+ // `status_unavailable` rather than throwing out of verifyOffline.
379
+ read = await readCapped(response, MAX_STATUS_LIST_BYTES);
380
+ }
381
+ catch (error) {
382
+ return {
383
+ message: `status list fetch failed: ${error instanceof Error ? error.message : String(error)}`,
384
+ };
385
+ }
386
+ if (read === null) {
387
+ return { message: 'status list response is too large' };
388
+ }
389
+ const listToken = read.trim();
390
+ // The list is held to its own key family (`status-list`) and that key's window. `typ` separates
391
+ // a status list from every other token this issuer signs; `subject` is what stops a valid list
392
+ // being replayed in place of another one; `exp` is REQUIRED because a freshness channel without
393
+ // one would be honoured forever. `iss` is deliberately not required — the issuer does not put
394
+ // one in the list.
395
+ let checked;
396
+ try {
397
+ checked = await this.verifyAgainstKeySet(listToken, 'status-list', {
398
+ typ: 'statuslist+jwt',
399
+ subject: uri,
400
+ requiredClaims: ['exp'],
401
+ });
402
+ }
403
+ catch (error) {
404
+ checked = { ok: false, reason: 'invalid', message: errorMessage(error) };
405
+ }
406
+ if (!checked.ok)
407
+ return { message: `status list did not verify: ${checked.message}` };
408
+ const payload = checked.payload;
409
+ const statusList = payload.status_list;
410
+ if (!isRecord(statusList) || typeof statusList.lst !== 'string') {
411
+ return { message: 'status list payload has no `lst`' };
412
+ }
413
+ const bits = typeof statusList.bits === 'number' ? statusList.bits : 2;
414
+ let bytes;
415
+ try {
416
+ bytes = inflate(Buffer.from(statusList.lst, 'base64url'));
417
+ }
418
+ catch (error) {
419
+ return {
420
+ message: `status list payload could not be decompressed: ${error instanceof Error ? error.message : String(error)}`,
421
+ };
422
+ }
423
+ // Honour the shorter of the issuer's published `ttl` and the token's own `exp`: `ttl` is the
424
+ // window it asks consumers to cache for (55s today), `exp` the point past which the list must
425
+ // not be used at all.
426
+ const expSeconds = typeof payload.exp === 'number' ? payload.exp : 0;
427
+ const ttlSeconds = typeof payload.ttl === 'number' ? payload.ttl : 0;
428
+ const expiresAtMs = Math.min(expSeconds * 1000, ttlSeconds > 0 ? nowWallMs() + ttlSeconds * 1000 : Number.POSITIVE_INFINITY);
429
+ this.statusListCache = { uri, bytes, bits, expiresAtMs };
430
+ return { bytes, bits };
431
+ }
432
+ }
433
+ //# sourceMappingURL=proofs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proofs.js","sourceRoot":"","sources":["../../../src/resources/proofs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { HttpClient } from '../http.js';
2
+ import type { ProfileBadge, PublicProfileView, UsernameAvailabilityResponse, AvatarResponse } from '../types.js';
3
+ /**
4
+ * Public profile reads — unauthenticated endpoints; the client's
5
+ * Authorization header is sent but ignored by the server.
6
+ */
7
+ export declare class PublicProfiles {
8
+ private readonly http;
9
+ constructor(http: HttpClient);
10
+ /**
11
+ * Get a public profile by its PUBLIC `profile_id` (the `profile_id` field
12
+ * on `/me/profiles` responses) — the internal `id` is NOT accepted by this
13
+ * endpoint and will 404.
14
+ */
15
+ getById(profileId: string): Promise<PublicProfileView>;
16
+ /**
17
+ * Get a profile's avatar image. Accepts either the public `profile_id` or
18
+ * the internal `id`. Returns raw bytes plus the content type; https-hosted
19
+ * avatars are followed through the server's 301 redirect.
20
+ */
21
+ getAvatar(profileId: string): Promise<AvatarResponse>;
22
+ /** Get a public profile by username */
23
+ getByUsername(username: string): Promise<PublicProfileView>;
24
+ /**
25
+ * Get the embeddable badge descriptor for a username.
26
+ *
27
+ * Everything needed to embed the verification badge in one call: the subject it asserts, the
28
+ * live verified count, the badge image URL for each style, and ready-to-paste snippets. A
29
+ * username with no public record answers 200 with `state: 'no_public_record'` rather than a
30
+ * 404, so a caller never has to treat "nothing to show" as an error.
31
+ */
32
+ getBadge(username: string): Promise<ProfileBadge>;
33
+ /** Check username availability */
34
+ checkUsername(username: string): Promise<UsernameAvailabilityResponse>;
35
+ }
36
+ //# sourceMappingURL=public-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-profiles.d.ts","sourceRoot":"","sources":["../../../src/resources/public-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,4BAA4B,EAC5B,cAAc,EACf,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C;;;;OAIG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAItD;;;;OAIG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAIrD,uCAAuC;IACvC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3D;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIjD,kCAAkC;IAClC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,CAAC;CAKvE"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Public profile reads — unauthenticated endpoints; the client's
3
+ * Authorization header is sent but ignored by the server.
4
+ */
5
+ export class PublicProfiles {
6
+ constructor(http) {
7
+ this.http = http;
8
+ }
9
+ /**
10
+ * Get a public profile by its PUBLIC `profile_id` (the `profile_id` field
11
+ * on `/me/profiles` responses) — the internal `id` is NOT accepted by this
12
+ * endpoint and will 404.
13
+ */
14
+ getById(profileId) {
15
+ return this.http.get(`/api/v1/profiles/p/${encodeURIComponent(profileId)}`);
16
+ }
17
+ /**
18
+ * Get a profile's avatar image. Accepts either the public `profile_id` or
19
+ * the internal `id`. Returns raw bytes plus the content type; https-hosted
20
+ * avatars are followed through the server's 301 redirect.
21
+ */
22
+ getAvatar(profileId) {
23
+ return this.http.get(`/api/v1/profiles/p/${encodeURIComponent(profileId)}/avatar`);
24
+ }
25
+ /** Get a public profile by username */
26
+ getByUsername(username) {
27
+ return this.http.get(`/api/v1/profiles/u/${encodeURIComponent(username)}`);
28
+ }
29
+ /**
30
+ * Get the embeddable badge descriptor for a username.
31
+ *
32
+ * Everything needed to embed the verification badge in one call: the subject it asserts, the
33
+ * live verified count, the badge image URL for each style, and ready-to-paste snippets. A
34
+ * username with no public record answers 200 with `state: 'no_public_record'` rather than a
35
+ * 404, so a caller never has to treat "nothing to show" as an error.
36
+ */
37
+ getBadge(username) {
38
+ return this.http.get(`/api/v1/profiles/badge/${encodeURIComponent(username)}`);
39
+ }
40
+ /** Check username availability */
41
+ checkUsername(username) {
42
+ return this.http.get(`/api/v1/profiles/check-username/${encodeURIComponent(username)}`);
43
+ }
44
+ }
45
+ //# sourceMappingURL=public-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-profiles.js","sourceRoot":"","sources":["../../../src/resources/public-profiles.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,OAAO,cAAc;IACzB,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD;;;;OAIG;IACH,OAAO,CAAC,SAAiB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoB,sBAAsB,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiB,sBAAsB,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACrG,CAAC;IAED,uCAAuC;IACvC,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoB,sBAAsB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAgB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,0BAA0B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,kCAAkC;IAClC,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,mCAAmC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAClE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { HttpClient } from '../http.js';
2
+ import type { Session, CreateSessionParams, WaitOptions } from '../types.js';
3
+ export declare class Sessions {
4
+ private readonly http;
5
+ constructor(http: HttpClient);
6
+ /** Create a new phone verification session */
7
+ create(params: CreateSessionParams): Promise<Session>;
8
+ /** Get session status by ID */
9
+ retrieve(id: string): Promise<Session>;
10
+ /**
11
+ * Poll until session reaches a terminal state (verified/failed/expired).
12
+ */
13
+ waitForCompletion(id: string, options?: WaitOptions): Promise<Session>;
14
+ }
15
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/resources/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI7E,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,8CAA8C;IAC9C,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrD,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;CAQvE"}
@@ -0,0 +1,22 @@
1
+ import { pollUntilComplete } from '../polling.js';
2
+ const TERMINAL_STATES = ['verified', 'failed', 'expired'];
3
+ export class Sessions {
4
+ constructor(http) {
5
+ this.http = http;
6
+ }
7
+ /** Create a new phone verification session */
8
+ create(params) {
9
+ return this.http.post('/api/v1/sessions', params);
10
+ }
11
+ /** Get session status by ID */
12
+ retrieve(id) {
13
+ return this.http.get(`/api/v1/sessions/${encodeURIComponent(id)}`);
14
+ }
15
+ /**
16
+ * Poll until session reaches a terminal state (verified/failed/expired).
17
+ */
18
+ waitForCompletion(id, options) {
19
+ return pollUntilComplete(() => this.retrieve(id), TERMINAL_STATES, `Session ${id}`, options);
20
+ }
21
+ }
22
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/resources/sessions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAEnE,MAAM,OAAO,QAAQ;IACnB,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD,8CAA8C;IAC9C,MAAM,CAAC,MAA2B;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAU,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,+BAA+B;IAC/B,QAAQ,CAAC,EAAU;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAU,oBAAoB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,EAAU,EAAE,OAAqB;QACjD,OAAO,iBAAiB,CACtB,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EACvB,eAAe,EACf,WAAW,EAAE,EAAE,EACf,OAAO,CACR,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { HttpClient } from '../http.js';
2
+ import type { TemplateChannel, TemplateMessageType, TemplateContent, TemplateProjectOptions, TemplateListResponse, TemplateDefaultsResponse, TemplateGetResponse, TemplateUpsertResponse, TemplateDeleteResponse, TemplatePreviewParams, TemplatePreviewResponse, TemplateRenderParams, TemplateRenderResponse } from '../types.js';
3
+ /**
4
+ * Message templates. Templates exist per project (sub-account) only: every method but
5
+ * `getDefaults` takes an optional `{ profileId }` naming the project, sent as `profile_id`.
6
+ */
7
+ export declare class Templates {
8
+ private readonly http;
9
+ constructor(http: HttpClient);
10
+ /** List the project's custom templates plus available channels, message types, and variables */
11
+ list(options?: TemplateProjectOptions): Promise<TemplateListResponse>;
12
+ /** Get all default templates (for reference) */
13
+ getDefaults(): Promise<TemplateDefaultsResponse>;
14
+ /** Get a specific template (the project's own if set, default otherwise) */
15
+ retrieve(channel: TemplateChannel, messageType: TemplateMessageType, options?: TemplateProjectOptions): Promise<TemplateGetResponse>;
16
+ /** Create or update the project's custom template */
17
+ upsert(channel: TemplateChannel, messageType: TemplateMessageType, content: TemplateContent, options?: TemplateProjectOptions): Promise<TemplateUpsertResponse>;
18
+ /** Delete the project's custom template (resets to default; 404 if no custom template exists) */
19
+ delete(channel: TemplateChannel, messageType: TemplateMessageType, options?: TemplateProjectOptions): Promise<TemplateDeleteResponse>;
20
+ /** Preview a template with sample data and the project's branding */
21
+ preview(params: TemplatePreviewParams, options?: TemplateProjectOptions): Promise<TemplatePreviewResponse>;
22
+ /** Render the project's template with provided variables (for testing) */
23
+ render(params: TemplateRenderParams, options?: TemplateProjectOptions): Promise<TemplateRenderResponse>;
24
+ }
25
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/resources/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAOrB;;;GAGG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,gGAAgG;IAChG,IAAI,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIrE,gDAAgD;IAChD,WAAW,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAIhD,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOpI,qDAAqD;IACrD,MAAM,CACJ,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,mBAAmB,EAChC,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,sBAAsB,CAAC;IAQlC,iGAAiG;IACjG,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAQrI,qEAAqE;IACrE,OAAO,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAQ1G,0EAA0E;IAC1E,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAOxG"}