@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.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +239 -2
- package/dist/cjs/client.d.ts +48 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +73 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/credentials.d.ts +46 -0
- package/dist/cjs/credentials.d.ts.map +1 -0
- package/dist/cjs/credentials.js +137 -0
- package/dist/cjs/credentials.js.map +1 -0
- package/dist/cjs/crypto/hitl-crypto.d.ts +95 -0
- package/dist/cjs/crypto/hitl-crypto.d.ts.map +1 -0
- package/dist/cjs/crypto/hitl-crypto.js +338 -0
- package/dist/cjs/crypto/hitl-crypto.js.map +1 -0
- package/dist/cjs/errors.d.ts +52 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +121 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/http.d.ts +62 -0
- package/dist/cjs/http.d.ts.map +1 -0
- package/dist/cjs/http.js +192 -0
- package/dist/cjs/http.js.map +1 -0
- package/dist/cjs/index.d.ts +26 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +79 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/jwks/key-set-cache.d.ts +105 -0
- package/dist/cjs/jwks/key-set-cache.d.ts.map +1 -0
- package/dist/cjs/jwks/key-set-cache.js +277 -0
- package/dist/cjs/jwks/key-set-cache.js.map +1 -0
- package/dist/cjs/jwks/keyset.d.ts +139 -0
- package/dist/cjs/jwks/keyset.d.ts.map +1 -0
- package/dist/cjs/jwks/keyset.js +503 -0
- package/dist/cjs/jwks/keyset.js.map +1 -0
- package/dist/cjs/jwks/support.d.ts +9 -0
- package/dist/cjs/jwks/support.d.ts.map +1 -0
- package/dist/cjs/jwks/support.js +12 -0
- package/dist/cjs/jwks/support.js.map +1 -0
- package/dist/cjs/polling.d.ts +10 -0
- package/dist/cjs/polling.d.ts.map +1 -0
- package/dist/cjs/polling.js +74 -0
- package/dist/cjs/polling.js.map +1 -0
- package/dist/cjs/resources/auth-sessions.d.ts +41 -0
- package/dist/cjs/resources/auth-sessions.d.ts.map +1 -0
- package/dist/cjs/resources/auth-sessions.js +34 -0
- package/dist/cjs/resources/auth-sessions.js.map +1 -0
- package/dist/cjs/resources/authorizations.d.ts +23 -0
- package/dist/cjs/resources/authorizations.d.ts.map +1 -0
- package/dist/cjs/resources/authorizations.js +29 -0
- package/dist/cjs/resources/authorizations.js.map +1 -0
- package/dist/cjs/resources/circles.d.ts +38 -0
- package/dist/cjs/resources/circles.d.ts.map +1 -0
- package/dist/cjs/resources/circles.js +67 -0
- package/dist/cjs/resources/circles.js.map +1 -0
- package/dist/cjs/resources/confirmations.d.ts +111 -0
- package/dist/cjs/resources/confirmations.d.ts.map +1 -0
- package/dist/cjs/resources/confirmations.js +86 -0
- package/dist/cjs/resources/confirmations.js.map +1 -0
- package/dist/cjs/resources/delegations.d.ts +36 -0
- package/dist/cjs/resources/delegations.d.ts.map +1 -0
- package/dist/cjs/resources/delegations.js +47 -0
- package/dist/cjs/resources/delegations.js.map +1 -0
- package/dist/cjs/resources/hitl-chat-id.d.ts +42 -0
- package/dist/cjs/resources/hitl-chat-id.d.ts.map +1 -0
- package/dist/cjs/resources/hitl-chat-id.js +37 -0
- package/dist/cjs/resources/hitl-chat-id.js.map +1 -0
- package/dist/cjs/resources/hitl-keys.d.ts +13 -0
- package/dist/cjs/resources/hitl-keys.d.ts.map +1 -0
- package/dist/cjs/resources/hitl-keys.js +22 -0
- package/dist/cjs/resources/hitl-keys.js.map +1 -0
- package/dist/cjs/resources/hitl.d.ts +39 -0
- package/dist/cjs/resources/hitl.d.ts.map +1 -0
- package/dist/cjs/resources/hitl.js +58 -0
- package/dist/cjs/resources/hitl.js.map +1 -0
- package/dist/cjs/resources/me.d.ts +102 -0
- package/dist/cjs/resources/me.d.ts.map +1 -0
- package/dist/cjs/resources/me.js +85 -0
- package/dist/cjs/resources/me.js.map +1 -0
- package/dist/cjs/resources/profiles.d.ts +47 -0
- package/dist/cjs/resources/profiles.d.ts.map +1 -0
- package/dist/cjs/resources/profiles.js +70 -0
- package/dist/cjs/resources/profiles.js.map +1 -0
- package/dist/cjs/resources/proof-me.d.ts +48 -0
- package/dist/cjs/resources/proof-me.d.ts.map +1 -0
- package/dist/cjs/resources/proof-me.js +24 -0
- package/dist/cjs/resources/proof-me.js.map +1 -0
- package/dist/cjs/resources/proofs.d.ts +81 -0
- package/dist/cjs/resources/proofs.d.ts.map +1 -0
- package/dist/cjs/resources/proofs.js +437 -0
- package/dist/cjs/resources/proofs.js.map +1 -0
- package/dist/cjs/resources/public-profiles.d.ts +36 -0
- package/dist/cjs/resources/public-profiles.d.ts.map +1 -0
- package/dist/cjs/resources/public-profiles.js +49 -0
- package/dist/cjs/resources/public-profiles.js.map +1 -0
- package/dist/cjs/resources/sessions.d.ts +15 -0
- package/dist/cjs/resources/sessions.d.ts.map +1 -0
- package/dist/cjs/resources/sessions.js +26 -0
- package/dist/cjs/resources/sessions.js.map +1 -0
- package/dist/cjs/resources/templates.d.ts +25 -0
- package/dist/cjs/resources/templates.d.ts.map +1 -0
- package/dist/cjs/resources/templates.js +46 -0
- package/dist/cjs/resources/templates.js.map +1 -0
- package/dist/cjs/resources/verification-requests.d.ts +56 -0
- package/dist/cjs/resources/verification-requests.d.ts.map +1 -0
- package/dist/cjs/resources/verification-requests.js +61 -0
- package/dist/cjs/resources/verification-requests.js.map +1 -0
- package/dist/cjs/resources/verifications.d.ts +60 -0
- package/dist/cjs/resources/verifications.d.ts.map +1 -0
- package/dist/cjs/resources/verifications.js +91 -0
- package/dist/cjs/resources/verifications.js.map +1 -0
- package/dist/cjs/resources/webhook-deliveries.d.ts +15 -0
- package/dist/cjs/resources/webhook-deliveries.d.ts.map +1 -0
- package/dist/cjs/resources/webhook-deliveries.js +26 -0
- package/dist/cjs/resources/webhook-deliveries.js.map +1 -0
- package/dist/cjs/streaming.d.ts +87 -0
- package/dist/cjs/streaming.d.ts.map +1 -0
- package/dist/cjs/streaming.js +289 -0
- package/dist/cjs/streaming.js.map +1 -0
- package/dist/cjs/types.d.ts +1483 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/version.d.ts +2 -0
- package/dist/cjs/version.d.ts.map +1 -0
- package/dist/cjs/version.js +5 -0
- package/dist/cjs/version.js.map +1 -0
- package/dist/esm/client.d.ts +48 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +69 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/credentials.d.ts +46 -0
- package/dist/esm/credentials.d.ts.map +1 -0
- package/dist/esm/credentials.js +127 -0
- package/dist/esm/credentials.js.map +1 -0
- package/dist/esm/crypto/hitl-crypto.d.ts +95 -0
- package/dist/esm/crypto/hitl-crypto.d.ts.map +1 -0
- package/dist/esm/crypto/hitl-crypto.js +321 -0
- package/dist/esm/crypto/hitl-crypto.js.map +1 -0
- package/dist/esm/errors.d.ts +52 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +106 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/http.d.ts +62 -0
- package/dist/esm/http.d.ts.map +1 -0
- package/dist/esm/http.js +187 -0
- package/dist/esm/http.js.map +1 -0
- package/dist/esm/index.d.ts +26 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +33 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/jwks/key-set-cache.d.ts +105 -0
- package/dist/esm/jwks/key-set-cache.d.ts.map +1 -0
- package/dist/esm/jwks/key-set-cache.js +268 -0
- package/dist/esm/jwks/key-set-cache.js.map +1 -0
- package/dist/esm/jwks/keyset.d.ts +139 -0
- package/dist/esm/jwks/keyset.d.ts.map +1 -0
- package/dist/esm/jwks/keyset.js +489 -0
- package/dist/esm/jwks/keyset.js.map +1 -0
- package/dist/esm/jwks/support.d.ts +9 -0
- package/dist/esm/jwks/support.d.ts.map +1 -0
- package/dist/esm/jwks/support.js +9 -0
- package/dist/esm/jwks/support.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/polling.d.ts +10 -0
- package/dist/esm/polling.d.ts.map +1 -0
- package/dist/esm/polling.js +71 -0
- package/dist/esm/polling.js.map +1 -0
- package/dist/esm/resources/auth-sessions.d.ts +41 -0
- package/dist/esm/resources/auth-sessions.d.ts.map +1 -0
- package/dist/esm/resources/auth-sessions.js +30 -0
- package/dist/esm/resources/auth-sessions.js.map +1 -0
- package/dist/esm/resources/authorizations.d.ts +23 -0
- package/dist/esm/resources/authorizations.d.ts.map +1 -0
- package/dist/esm/resources/authorizations.js +25 -0
- package/dist/esm/resources/authorizations.js.map +1 -0
- package/dist/esm/resources/circles.d.ts +38 -0
- package/dist/esm/resources/circles.d.ts.map +1 -0
- package/dist/esm/resources/circles.js +63 -0
- package/dist/esm/resources/circles.js.map +1 -0
- package/dist/esm/resources/confirmations.d.ts +111 -0
- package/dist/esm/resources/confirmations.d.ts.map +1 -0
- package/dist/esm/resources/confirmations.js +82 -0
- package/dist/esm/resources/confirmations.js.map +1 -0
- package/dist/esm/resources/delegations.d.ts +36 -0
- package/dist/esm/resources/delegations.d.ts.map +1 -0
- package/dist/esm/resources/delegations.js +43 -0
- package/dist/esm/resources/delegations.js.map +1 -0
- package/dist/esm/resources/hitl-chat-id.d.ts +42 -0
- package/dist/esm/resources/hitl-chat-id.d.ts.map +1 -0
- package/dist/esm/resources/hitl-chat-id.js +33 -0
- package/dist/esm/resources/hitl-chat-id.js.map +1 -0
- package/dist/esm/resources/hitl-keys.d.ts +13 -0
- package/dist/esm/resources/hitl-keys.d.ts.map +1 -0
- package/dist/esm/resources/hitl-keys.js +18 -0
- package/dist/esm/resources/hitl-keys.js.map +1 -0
- package/dist/esm/resources/hitl.d.ts +39 -0
- package/dist/esm/resources/hitl.d.ts.map +1 -0
- package/dist/esm/resources/hitl.js +54 -0
- package/dist/esm/resources/hitl.js.map +1 -0
- package/dist/esm/resources/me.d.ts +102 -0
- package/dist/esm/resources/me.d.ts.map +1 -0
- package/dist/esm/resources/me.js +81 -0
- package/dist/esm/resources/me.js.map +1 -0
- package/dist/esm/resources/profiles.d.ts +47 -0
- package/dist/esm/resources/profiles.d.ts.map +1 -0
- package/dist/esm/resources/profiles.js +66 -0
- package/dist/esm/resources/profiles.js.map +1 -0
- package/dist/esm/resources/proof-me.d.ts +48 -0
- package/dist/esm/resources/proof-me.d.ts.map +1 -0
- package/dist/esm/resources/proof-me.js +20 -0
- package/dist/esm/resources/proof-me.js.map +1 -0
- package/dist/esm/resources/proofs.d.ts +81 -0
- package/dist/esm/resources/proofs.d.ts.map +1 -0
- package/dist/esm/resources/proofs.js +433 -0
- package/dist/esm/resources/proofs.js.map +1 -0
- package/dist/esm/resources/public-profiles.d.ts +36 -0
- package/dist/esm/resources/public-profiles.d.ts.map +1 -0
- package/dist/esm/resources/public-profiles.js +45 -0
- package/dist/esm/resources/public-profiles.js.map +1 -0
- package/dist/esm/resources/sessions.d.ts +15 -0
- package/dist/esm/resources/sessions.d.ts.map +1 -0
- package/dist/esm/resources/sessions.js +22 -0
- package/dist/esm/resources/sessions.js.map +1 -0
- package/dist/esm/resources/templates.d.ts +25 -0
- package/dist/esm/resources/templates.d.ts.map +1 -0
- package/dist/esm/resources/templates.js +42 -0
- package/dist/esm/resources/templates.js.map +1 -0
- package/dist/esm/resources/verification-requests.d.ts +56 -0
- package/dist/esm/resources/verification-requests.d.ts.map +1 -0
- package/dist/esm/resources/verification-requests.js +57 -0
- package/dist/esm/resources/verification-requests.js.map +1 -0
- package/dist/esm/resources/verifications.d.ts +60 -0
- package/dist/esm/resources/verifications.d.ts.map +1 -0
- package/dist/esm/resources/verifications.js +87 -0
- package/dist/esm/resources/verifications.js.map +1 -0
- package/dist/esm/resources/webhook-deliveries.d.ts +15 -0
- package/dist/esm/resources/webhook-deliveries.d.ts.map +1 -0
- package/dist/esm/resources/webhook-deliveries.js +22 -0
- package/dist/esm/resources/webhook-deliveries.js.map +1 -0
- package/dist/esm/streaming.d.ts +87 -0
- package/dist/esm/streaming.d.ts.map +1 -0
- package/dist/esm/streaming.js +286 -0
- package/dist/esm/streaming.js.map +1 -0
- package/dist/esm/types.d.ts +1483 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +5 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/version.d.ts +2 -0
- package/dist/esm/version.d.ts.map +1 -0
- package/dist/esm/version.js +2 -0
- package/dist/esm/version.js.map +1 -0
- 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"}
|