@openvtc/pnm-core 0.1.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 (250) hide show
  1. package/README.md +129 -0
  2. package/dist/did/derive-signing-key.d.ts +19 -0
  3. package/dist/did/derive-signing-key.d.ts.map +1 -0
  4. package/dist/did/derive-signing-key.js +96 -0
  5. package/dist/did/derive-signing-key.js.map +1 -0
  6. package/dist/did/index.d.ts +5 -0
  7. package/dist/did/index.d.ts.map +1 -0
  8. package/dist/did/index.js +5 -0
  9. package/dist/did/index.js.map +1 -0
  10. package/dist/did/peer.d.ts +37 -0
  11. package/dist/did/peer.d.ts.map +1 -0
  12. package/dist/did/peer.js +49 -0
  13. package/dist/did/peer.js.map +1 -0
  14. package/dist/did/verification-method.d.ts +43 -0
  15. package/dist/did/verification-method.d.ts.map +1 -0
  16. package/dist/did/verification-method.js +32 -0
  17. package/dist/did/verification-method.js.map +1 -0
  18. package/dist/did/verify.d.ts +49 -0
  19. package/dist/did/verify.d.ts.map +1 -0
  20. package/dist/did/verify.js +89 -0
  21. package/dist/did/verify.js.map +1 -0
  22. package/dist/didcomm/index.d.ts +235 -0
  23. package/dist/didcomm/index.d.ts.map +1 -0
  24. package/dist/didcomm/index.js +415 -0
  25. package/dist/didcomm/index.js.map +1 -0
  26. package/dist/inbound/confirm.d.ts +50 -0
  27. package/dist/inbound/confirm.d.ts.map +1 -0
  28. package/dist/inbound/confirm.js +64 -0
  29. package/dist/inbound/confirm.js.map +1 -0
  30. package/dist/inbound/dedup.d.ts +9 -0
  31. package/dist/inbound/dedup.d.ts.map +1 -0
  32. package/dist/inbound/dedup.js +31 -0
  33. package/dist/inbound/dedup.js.map +1 -0
  34. package/dist/inbound/index.d.ts +3 -0
  35. package/dist/inbound/index.d.ts.map +1 -0
  36. package/dist/inbound/index.js +3 -0
  37. package/dist/inbound/index.js.map +1 -0
  38. package/dist/index.d.ts +14 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +14 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/onboarding/index.d.ts +2 -0
  43. package/dist/onboarding/index.d.ts.map +1 -0
  44. package/dist/onboarding/index.js +2 -0
  45. package/dist/onboarding/index.js.map +1 -0
  46. package/dist/onboarding/swap.d.ts +60 -0
  47. package/dist/onboarding/swap.d.ts.map +1 -0
  48. package/dist/onboarding/swap.js +148 -0
  49. package/dist/onboarding/swap.js.map +1 -0
  50. package/dist/provision/adopt.d.ts +31 -0
  51. package/dist/provision/adopt.d.ts.map +1 -0
  52. package/dist/provision/adopt.js +114 -0
  53. package/dist/provision/adopt.js.map +1 -0
  54. package/dist/provision/armor.d.ts +19 -0
  55. package/dist/provision/armor.d.ts.map +1 -0
  56. package/dist/provision/armor.js +243 -0
  57. package/dist/provision/armor.js.map +1 -0
  58. package/dist/provision/crc24.d.ts +5 -0
  59. package/dist/provision/crc24.d.ts.map +1 -0
  60. package/dist/provision/crc24.js +30 -0
  61. package/dist/provision/crc24.js.map +1 -0
  62. package/dist/provision/hpke.d.ts +17 -0
  63. package/dist/provision/hpke.d.ts.map +1 -0
  64. package/dist/provision/hpke.js +60 -0
  65. package/dist/provision/hpke.js.map +1 -0
  66. package/dist/provision/index.d.ts +10 -0
  67. package/dist/provision/index.d.ts.map +1 -0
  68. package/dist/provision/index.js +16 -0
  69. package/dist/provision/index.js.map +1 -0
  70. package/dist/provision/open.d.ts +28 -0
  71. package/dist/provision/open.d.ts.map +1 -0
  72. package/dist/provision/open.js +224 -0
  73. package/dist/provision/open.js.map +1 -0
  74. package/dist/provision/request.d.ts +65 -0
  75. package/dist/provision/request.d.ts.map +1 -0
  76. package/dist/provision/request.js +53 -0
  77. package/dist/provision/request.js.map +1 -0
  78. package/dist/provision/run.d.ts +76 -0
  79. package/dist/provision/run.d.ts.map +1 -0
  80. package/dist/provision/run.js +110 -0
  81. package/dist/provision/run.js.map +1 -0
  82. package/dist/provision/send.d.ts +85 -0
  83. package/dist/provision/send.d.ts.map +1 -0
  84. package/dist/provision/send.js +87 -0
  85. package/dist/provision/send.js.map +1 -0
  86. package/dist/provision/types.d.ts +110 -0
  87. package/dist/provision/types.d.ts.map +1 -0
  88. package/dist/provision/types.js +17 -0
  89. package/dist/provision/types.js.map +1 -0
  90. package/dist/rp-login/didcomm.d.ts +34 -0
  91. package/dist/rp-login/didcomm.d.ts.map +1 -0
  92. package/dist/rp-login/didcomm.js +72 -0
  93. package/dist/rp-login/didcomm.js.map +1 -0
  94. package/dist/rp-login/index.d.ts +3 -0
  95. package/dist/rp-login/index.d.ts.map +1 -0
  96. package/dist/rp-login/index.js +3 -0
  97. package/dist/rp-login/index.js.map +1 -0
  98. package/dist/rp-login/step-up.d.ts +43 -0
  99. package/dist/rp-login/step-up.d.ts.map +1 -0
  100. package/dist/rp-login/step-up.js +118 -0
  101. package/dist/rp-login/step-up.js.map +1 -0
  102. package/dist/siop/index.d.ts +3 -0
  103. package/dist/siop/index.d.ts.map +1 -0
  104. package/dist/siop/index.js +3 -0
  105. package/dist/siop/index.js.map +1 -0
  106. package/dist/siop/login-client.d.ts +29 -0
  107. package/dist/siop/login-client.d.ts.map +1 -0
  108. package/dist/siop/login-client.js +79 -0
  109. package/dist/siop/login-client.js.map +1 -0
  110. package/dist/siop/self-issued.d.ts +96 -0
  111. package/dist/siop/self-issued.d.ts.map +1 -0
  112. package/dist/siop/self-issued.js +162 -0
  113. package/dist/siop/self-issued.js.map +1 -0
  114. package/dist/store/holder-identity.d.ts +241 -0
  115. package/dist/store/holder-identity.d.ts.map +1 -0
  116. package/dist/store/holder-identity.js +441 -0
  117. package/dist/store/holder-identity.js.map +1 -0
  118. package/dist/store/index.d.ts +4 -0
  119. package/dist/store/index.d.ts.map +1 -0
  120. package/dist/store/index.js +4 -0
  121. package/dist/store/index.js.map +1 -0
  122. package/dist/store/kv-store.d.ts +51 -0
  123. package/dist/store/kv-store.d.ts.map +1 -0
  124. package/dist/store/kv-store.js +100 -0
  125. package/dist/store/kv-store.js.map +1 -0
  126. package/dist/store/secret-wrap.d.ts +109 -0
  127. package/dist/store/secret-wrap.d.ts.map +1 -0
  128. package/dist/store/secret-wrap.js +85 -0
  129. package/dist/store/secret-wrap.js.map +1 -0
  130. package/dist/trust-tasks/index.d.ts +2 -0
  131. package/dist/trust-tasks/index.d.ts.map +1 -0
  132. package/dist/trust-tasks/index.js +2 -0
  133. package/dist/trust-tasks/index.js.map +1 -0
  134. package/dist/trust-tasks/sign.d.ts +31 -0
  135. package/dist/trust-tasks/sign.d.ts.map +1 -0
  136. package/dist/trust-tasks/sign.js +141 -0
  137. package/dist/trust-tasks/sign.js.map +1 -0
  138. package/dist/util/timing.d.ts +14 -0
  139. package/dist/util/timing.d.ts.map +1 -0
  140. package/dist/util/timing.js +20 -0
  141. package/dist/util/timing.js.map +1 -0
  142. package/dist/vault/delete.d.ts +19 -0
  143. package/dist/vault/delete.d.ts.map +1 -0
  144. package/dist/vault/delete.js +35 -0
  145. package/dist/vault/delete.js.map +1 -0
  146. package/dist/vault/index.d.ts +8 -0
  147. package/dist/vault/index.d.ts.map +1 -0
  148. package/dist/vault/index.js +7 -0
  149. package/dist/vault/index.js.map +1 -0
  150. package/dist/vault/list.d.ts +96 -0
  151. package/dist/vault/list.d.ts.map +1 -0
  152. package/dist/vault/list.js +106 -0
  153. package/dist/vault/list.js.map +1 -0
  154. package/dist/vault/proxy-login.d.ts +100 -0
  155. package/dist/vault/proxy-login.d.ts.map +1 -0
  156. package/dist/vault/proxy-login.js +106 -0
  157. package/dist/vault/proxy-login.js.map +1 -0
  158. package/dist/vault/release.d.ts +33 -0
  159. package/dist/vault/release.d.ts.map +1 -0
  160. package/dist/vault/release.js +83 -0
  161. package/dist/vault/release.js.map +1 -0
  162. package/dist/vault/sign-trust-task.d.ts +26 -0
  163. package/dist/vault/sign-trust-task.d.ts.map +1 -0
  164. package/dist/vault/sign-trust-task.js +53 -0
  165. package/dist/vault/sign-trust-task.js.map +1 -0
  166. package/dist/vault/transport.d.ts +50 -0
  167. package/dist/vault/transport.d.ts.map +1 -0
  168. package/dist/vault/transport.js +118 -0
  169. package/dist/vault/transport.js.map +1 -0
  170. package/dist/vault/upsert.d.ts +102 -0
  171. package/dist/vault/upsert.d.ts.map +1 -0
  172. package/dist/vault/upsert.js +92 -0
  173. package/dist/vault/upsert.js.map +1 -0
  174. package/dist/vta/bridge-mediator-session.d.ts +26 -0
  175. package/dist/vta/bridge-mediator-session.d.ts.map +1 -0
  176. package/dist/vta/bridge-mediator-session.js +37 -0
  177. package/dist/vta/bridge-mediator-session.js.map +1 -0
  178. package/dist/vta/bridge-memory.d.ts +80 -0
  179. package/dist/vta/bridge-memory.d.ts.map +1 -0
  180. package/dist/vta/bridge-memory.js +162 -0
  181. package/dist/vta/bridge-memory.js.map +1 -0
  182. package/dist/vta/client.d.ts +40 -0
  183. package/dist/vta/client.d.ts.map +1 -0
  184. package/dist/vta/client.js +91 -0
  185. package/dist/vta/client.js.map +1 -0
  186. package/dist/vta/contexts.d.ts +60 -0
  187. package/dist/vta/contexts.d.ts.map +1 -0
  188. package/dist/vta/contexts.js +118 -0
  189. package/dist/vta/contexts.js.map +1 -0
  190. package/dist/vta/didcomm.d.ts +57 -0
  191. package/dist/vta/didcomm.d.ts.map +1 -0
  192. package/dist/vta/didcomm.js +138 -0
  193. package/dist/vta/didcomm.js.map +1 -0
  194. package/dist/vta/errors.d.ts +20 -0
  195. package/dist/vta/errors.d.ts.map +1 -0
  196. package/dist/vta/errors.js +64 -0
  197. package/dist/vta/errors.js.map +1 -0
  198. package/dist/vta/index.d.ts +15 -0
  199. package/dist/vta/index.d.ts.map +1 -0
  200. package/dist/vta/index.js +15 -0
  201. package/dist/vta/index.js.map +1 -0
  202. package/dist/vta/mediation.d.ts +80 -0
  203. package/dist/vta/mediation.d.ts.map +1 -0
  204. package/dist/vta/mediation.js +29 -0
  205. package/dist/vta/mediation.js.map +1 -0
  206. package/dist/vta/mediator-client.d.ts +66 -0
  207. package/dist/vta/mediator-client.d.ts.map +1 -0
  208. package/dist/vta/mediator-client.js +139 -0
  209. package/dist/vta/mediator-client.js.map +1 -0
  210. package/dist/vta/pickup.d.ts +81 -0
  211. package/dist/vta/pickup.d.ts.map +1 -0
  212. package/dist/vta/pickup.js +30 -0
  213. package/dist/vta/pickup.js.map +1 -0
  214. package/dist/vta/protocol.d.ts +76 -0
  215. package/dist/vta/protocol.d.ts.map +1 -0
  216. package/dist/vta/protocol.js +30 -0
  217. package/dist/vta/protocol.js.map +1 -0
  218. package/dist/vta/smoke.d.ts +59 -0
  219. package/dist/vta/smoke.d.ts.map +1 -0
  220. package/dist/vta/smoke.js +408 -0
  221. package/dist/vta/smoke.js.map +1 -0
  222. package/dist/vta/transport.d.ts +55 -0
  223. package/dist/vta/transport.d.ts.map +1 -0
  224. package/dist/vta/transport.js +2 -0
  225. package/dist/vta/transport.js.map +1 -0
  226. package/dist/vta/types.d.ts +50 -0
  227. package/dist/vta/types.d.ts.map +1 -0
  228. package/dist/vta/types.js +2 -0
  229. package/dist/vta/types.js.map +1 -0
  230. package/dist/vta/wallet-session.d.ts +87 -0
  231. package/dist/vta/wallet-session.d.ts.map +1 -0
  232. package/dist/vta/wallet-session.js +106 -0
  233. package/dist/vta/wallet-session.js.map +1 -0
  234. package/dist/webauthn/base64url.d.ts +3 -0
  235. package/dist/webauthn/base64url.d.ts.map +1 -0
  236. package/dist/webauthn/base64url.js +17 -0
  237. package/dist/webauthn/base64url.js.map +1 -0
  238. package/dist/webauthn/index.d.ts +4 -0
  239. package/dist/webauthn/index.d.ts.map +1 -0
  240. package/dist/webauthn/index.js +4 -0
  241. package/dist/webauthn/index.js.map +1 -0
  242. package/dist/webauthn/multikey.d.ts +26 -0
  243. package/dist/webauthn/multikey.d.ts.map +1 -0
  244. package/dist/webauthn/multikey.js +91 -0
  245. package/dist/webauthn/multikey.js.map +1 -0
  246. package/dist/webauthn/register.d.ts +36 -0
  247. package/dist/webauthn/register.d.ts.map +1 -0
  248. package/dist/webauthn/register.js +77 -0
  249. package/dist/webauthn/register.js.map +1 -0
  250. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-memory.js","sourceRoot":"","sources":["../../src/vta/bridge-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { PasskeyEnrollmentResult } from "../webauthn/register.js";
2
+ import type { VtaTransport } from "./transport.js";
3
+ import type { EnrollmentChallengeResponse, EnrollmentSubmitRequest, EnrollmentSubmitResponse, PasskeyList } from "./types.js";
4
+ export type { EnrollmentChallengeResponse, EnrollmentSubmitRequest, EnrollmentSubmitResponse, PasskeyList, };
5
+ export interface VtaClientConfig {
6
+ /** Base URL of the VTA, e.g. `https://vta.example.com`. */
7
+ baseUrl: string;
8
+ /** Bearer token. See README — initial enrollment uses a short-lived
9
+ * token minted by the `pnm` CLI; later requests use a passkey-derived JWT. */
10
+ accessToken: string;
11
+ /** Optional override for the global fetch. Useful for tests. */
12
+ fetch?: typeof fetch;
13
+ }
14
+ export declare class VtaClient implements VtaTransport {
15
+ private readonly baseUrl;
16
+ private readonly accessToken;
17
+ private readonly fetchImpl;
18
+ constructor(cfg: VtaClientConfig);
19
+ private request;
20
+ /**
21
+ * Step 1 of the enrollment ceremony: ask the VTA for a challenge.
22
+ * The challenge is stored server-side and verified against the
23
+ * `clientDataJSON.challenge` value the authenticator signs.
24
+ */
25
+ requestEnrollmentChallenge(did: string): Promise<EnrollmentChallengeResponse>;
26
+ /**
27
+ * Step 2: submit the credential. The VTA verifies the
28
+ * attestation, derives the VM `id`, appends a WebVH LogEntry, and
29
+ * returns the canonical VM as published.
30
+ */
31
+ submitPasskeyEnrollment(payload: EnrollmentSubmitRequest): Promise<EnrollmentSubmitResponse>;
32
+ listPasskeys(did: string): Promise<PasskeyList>;
33
+ removePasskey(did: string, fragment: string): Promise<void>;
34
+ }
35
+ /**
36
+ * Convenience: wire a `PasskeyEnrollmentResult` straight into the
37
+ * VTA's submit-enrollment request shape.
38
+ */
39
+ export declare function enrollmentSubmitFromResult(did: string, result: PasskeyEnrollmentResult, ceremonyId: string, label?: string): EnrollmentSubmitRequest;
40
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/vta/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EACV,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,WAAW,GACZ,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB;mFAC+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,qBAAa,SAAU,YAAW,YAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,GAAG,EAAE,eAAe;YAMlB,OAAO;IA0BrB;;;;OAIG;IACH,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAO7E;;;;OAIG;IACH,uBAAuB,CACrB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,wBAAwB,CAAC;IAOpC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAK/C,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO5D;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,uBAAuB,EAC/B,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,uBAAuB,CAczB"}
@@ -0,0 +1,91 @@
1
+ import { errorFromResponse, VtaClientError } from "./errors.js";
2
+ export class VtaClient {
3
+ baseUrl;
4
+ accessToken;
5
+ fetchImpl;
6
+ constructor(cfg) {
7
+ this.baseUrl = cfg.baseUrl.replace(/\/$/, "");
8
+ this.accessToken = cfg.accessToken;
9
+ this.fetchImpl = cfg.fetch ?? fetch.bind(globalThis);
10
+ }
11
+ async request(path, init = {}) {
12
+ let res;
13
+ try {
14
+ res = await this.fetchImpl(`${this.baseUrl}${path}`, {
15
+ ...init,
16
+ headers: {
17
+ accept: "application/json",
18
+ authorization: `Bearer ${this.accessToken}`,
19
+ ...(init.body ? { "content-type": "application/json" } : {}),
20
+ ...(init.headers ?? {}),
21
+ },
22
+ });
23
+ }
24
+ catch (err) {
25
+ throw new VtaClientError("e.client.network", err.message);
26
+ }
27
+ if (!res.ok)
28
+ throw await errorFromResponse(res);
29
+ if (res.status === 204)
30
+ return undefined;
31
+ try {
32
+ return (await res.json());
33
+ }
34
+ catch (err) {
35
+ throw new VtaClientError("e.client.parse", err.message, {
36
+ status: res.status,
37
+ });
38
+ }
39
+ }
40
+ /**
41
+ * Step 1 of the enrollment ceremony: ask the VTA for a challenge.
42
+ * The challenge is stored server-side and verified against the
43
+ * `clientDataJSON.challenge` value the authenticator signs.
44
+ */
45
+ requestEnrollmentChallenge(did) {
46
+ const qs = new URLSearchParams({ did }).toString();
47
+ return this.request(`/did/verification-methods/passkey/challenge?${qs}`, {
48
+ method: "POST",
49
+ });
50
+ }
51
+ /**
52
+ * Step 2: submit the credential. The VTA verifies the
53
+ * attestation, derives the VM `id`, appends a WebVH LogEntry, and
54
+ * returns the canonical VM as published.
55
+ */
56
+ submitPasskeyEnrollment(payload) {
57
+ return this.request("/did/verification-methods/passkey", {
58
+ method: "POST",
59
+ body: JSON.stringify(payload),
60
+ });
61
+ }
62
+ listPasskeys(did) {
63
+ const qs = new URLSearchParams({ did }).toString();
64
+ return this.request(`/did/verification-methods/passkey?${qs}`);
65
+ }
66
+ removePasskey(did, fragment) {
67
+ const qs = new URLSearchParams({ did }).toString();
68
+ return this.request(`/did/verification-methods/passkey/${encodeURIComponent(fragment)}?${qs}`, { method: "DELETE" });
69
+ }
70
+ }
71
+ /**
72
+ * Convenience: wire a `PasskeyEnrollmentResult` straight into the
73
+ * VTA's submit-enrollment request shape.
74
+ */
75
+ export function enrollmentSubmitFromResult(did, result, ceremonyId, label) {
76
+ const req = {
77
+ did,
78
+ ceremonyId,
79
+ credentialId: result.credentialId,
80
+ publicKeyMultibase: result.publicKeyMultikey,
81
+ coseAlgorithm: result.coseAlg,
82
+ attestationObject: result.attestationObjectB64u,
83
+ clientDataJson: result.clientDataJsonB64u,
84
+ authenticatorData: result.authenticatorDataB64u,
85
+ transports: result.transports,
86
+ };
87
+ if (label !== undefined)
88
+ req.label = label;
89
+ return req;
90
+ }
91
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/vta/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { Identity } from "../didcomm/index.js";
2
+ import type { RemoteDidcommEndpoint } from "./didcomm.js";
3
+ /** One context record as returned by `GET /contexts` and `POST /contexts`.
4
+ * Field naming mirrors the VTA's `CreateContextResultBody` exactly. */
5
+ export interface ContextRecord {
6
+ id: string;
7
+ name: string;
8
+ did: string | null;
9
+ description: string | null;
10
+ base_path: string;
11
+ created_at: string;
12
+ updated_at: string;
13
+ }
14
+ export interface VtaListContextsOptions {
15
+ /** VTA REST base URL (from `#vta-rest`, e.g. `http://localhost:8100`). */
16
+ baseUrl: string;
17
+ /** The wallet's holder identity — its DID must be in the VTA's ACL
18
+ * with any role (`/contexts` is `AuthClaims`-gated, not admin-only).
19
+ * The DID is also the authcrypt sender. */
20
+ holder: Identity;
21
+ /** The VTA's DID + keyAgreement key (inner authcrypt recipient). */
22
+ service: RemoteDidcommEndpoint;
23
+ /** fetch impl override (defaults to global). */
24
+ fetch?: typeof fetch;
25
+ }
26
+ /** List the contexts the holder has access to.
27
+ *
28
+ * Super-admins see every context; context-admins see only the contexts
29
+ * they're scoped into. Per-context Reader/Application/Initiator roles
30
+ * also see their own contexts (the `/contexts` route is gated by any
31
+ * authenticated user; the operation filters by `has_context_access`).
32
+ *
33
+ * Same auth shape as `vaultListRest` — challenge → authcrypt → bearer.
34
+ * No token caching: each call does a fresh round-trip. Acceptable for
35
+ * the AddEntryForm's on-mount fetch; can grow a cache layer later. */
36
+ export declare function vtaListContexts(opts: VtaListContextsOptions): Promise<ContextRecord[]>;
37
+ export interface VtaCreateContextOptions extends VtaListContextsOptions {
38
+ /** Context id — the operator-chosen short name (e.g. `work`,
39
+ * `openvtc-glenn`). Must be unique on the VTA; conflict surfaces as
40
+ * HTTP 409 / Conflict. */
41
+ id: string;
42
+ /** Human-readable name; the VTA records this verbatim for audit /
43
+ * display. Defaults to `id` if omitted. */
44
+ name?: string;
45
+ /** Optional free-form description. */
46
+ description?: string;
47
+ }
48
+ /** Create a new context on the VTA.
49
+ *
50
+ * Auth: **super-admin only** (`/contexts` POST is gated by
51
+ * `SuperAdminAuth` server-side). The wallet's holder must be a global
52
+ * admin (Admin role with empty `allowed_contexts`); context-admins
53
+ * surface as `Forbidden` and the popup should refuse to enter this
54
+ * path for them.
55
+ *
56
+ * Returns the freshly-created context record (the VTA echoes back
57
+ * `base_path`, `created_at`, etc.) so the caller can use the new id
58
+ * immediately without a second list call. */
59
+ export declare function vtaCreateContext(opts: VtaCreateContextOptions): Promise<ContextRecord>;
60
+ //# sourceMappingURL=contexts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../src/vta/contexts.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAI1D;wEACwE;AACxE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD,MAAM,WAAW,sBAAsB;IACrC,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB;;gDAE4C;IAC5C,MAAM,EAAE,QAAQ,CAAC;IACjB,oEAAoE;IACpE,OAAO,EAAE,qBAAqB,CAAC;IAC/B,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED;;;;;;;;;uEASuE;AACvE,wBAAsB,eAAe,CACnC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,aAAa,EAAE,CAAC,CAgB1B;AAED,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE;;+BAE2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX;gDAC4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;8CAU8C;AAC9C,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,aAAa,CAAC,CAwBxB"}
@@ -0,0 +1,118 @@
1
+ // REST client for the VTA's contexts API.
2
+ //
3
+ // Used by the popup's AddEntryForm to fetch the operator's accessible
4
+ // contexts (instead of guessing from the contexts already on loaded
5
+ // vault entries) and to create a new context inline when the operator
6
+ // picks "+ New context…" in the picker.
7
+ //
8
+ // Authentication: same primitive every authenticated REST call uses —
9
+ // authcrypted `atm/1.0/authenticate` to the VTA's keyAgreement key,
10
+ // followed by a bearer-token-authed JSON request. The auth round-trip
11
+ // is identical to `vault/list/0.1` (no token cache).
12
+ //
13
+ // Mirrors `vta-sdk::protocols::context_management::{list, create}`
14
+ // wire shapes — snake_case fields, no `data` envelope.
15
+ import { packAuthcrypt } from "../didcomm/index.js";
16
+ const VTA_AUTHENTICATE = "https://affinidi.com/atm/1.0/authenticate";
17
+ /** List the contexts the holder has access to.
18
+ *
19
+ * Super-admins see every context; context-admins see only the contexts
20
+ * they're scoped into. Per-context Reader/Application/Initiator roles
21
+ * also see their own contexts (the `/contexts` route is gated by any
22
+ * authenticated user; the operation filters by `has_context_access`).
23
+ *
24
+ * Same auth shape as `vaultListRest` — challenge → authcrypt → bearer.
25
+ * No token caching: each call does a fresh round-trip. Acceptable for
26
+ * the AddEntryForm's on-mount fetch; can grow a cache layer later. */
27
+ export async function vtaListContexts(opts) {
28
+ const { baseUrl, holder, service } = opts;
29
+ const f = opts.fetch ?? fetch.bind(globalThis);
30
+ const base = baseUrl.replace(/\/+$/, "");
31
+ const accessToken = await authenticate(base, holder, service, f);
32
+ const res = await f(`${base}/contexts`, {
33
+ method: "GET",
34
+ headers: { authorization: `Bearer ${accessToken}` },
35
+ });
36
+ if (!res.ok) {
37
+ throw new Error(`vta /contexts failed (${res.status}): ${await res.text()}`);
38
+ }
39
+ const body = (await res.json());
40
+ return body.contexts ?? [];
41
+ }
42
+ /** Create a new context on the VTA.
43
+ *
44
+ * Auth: **super-admin only** (`/contexts` POST is gated by
45
+ * `SuperAdminAuth` server-side). The wallet's holder must be a global
46
+ * admin (Admin role with empty `allowed_contexts`); context-admins
47
+ * surface as `Forbidden` and the popup should refuse to enter this
48
+ * path for them.
49
+ *
50
+ * Returns the freshly-created context record (the VTA echoes back
51
+ * `base_path`, `created_at`, etc.) so the caller can use the new id
52
+ * immediately without a second list call. */
53
+ export async function vtaCreateContext(opts) {
54
+ const { baseUrl, holder, service, id, name, description } = opts;
55
+ const f = opts.fetch ?? fetch.bind(globalThis);
56
+ const base = baseUrl.replace(/\/+$/, "");
57
+ const accessToken = await authenticate(base, holder, service, f);
58
+ const reqBody = {
59
+ id,
60
+ name: name ?? id,
61
+ ...(description ? { description } : {}),
62
+ };
63
+ const res = await f(`${base}/contexts`, {
64
+ method: "POST",
65
+ headers: {
66
+ "content-type": "application/json",
67
+ authorization: `Bearer ${accessToken}`,
68
+ },
69
+ body: JSON.stringify(reqBody),
70
+ });
71
+ if (!res.ok) {
72
+ throw new Error(`vta /contexts create failed (${res.status}): ${await res.text()}`);
73
+ }
74
+ return (await res.json());
75
+ }
76
+ /** Run the wallet's standard challenge + authcrypt + token round-trip
77
+ * and return the access token. Same primitive every authenticated
78
+ * REST call here uses; not exported because callers should pick a
79
+ * domain-specific helper that runs this internally. */
80
+ async function authenticate(base, holder, service, f) {
81
+ const cRes = await f(`${base}/auth/challenge`, {
82
+ method: "POST",
83
+ headers: { "content-type": "application/json" },
84
+ body: JSON.stringify({ did: holder.did }),
85
+ });
86
+ if (!cRes.ok) {
87
+ throw new Error(`vta /auth/challenge failed (${cRes.status}): ${await cRes.text()}`);
88
+ }
89
+ const cBody = (await cRes.json());
90
+ if (!cBody.sessionId || !cBody.challenge) {
91
+ throw new Error(`vta /auth/challenge: malformed response: ${JSON.stringify(cBody)}`);
92
+ }
93
+ const authMsg = {
94
+ id: globalThis.crypto.randomUUID(),
95
+ type: VTA_AUTHENTICATE,
96
+ from: holder.did,
97
+ to: [service.did],
98
+ body: { challenge: cBody.challenge, session_id: cBody.sessionId },
99
+ };
100
+ const packed = await packAuthcrypt(authMsg, holder, [
101
+ { kid: service.keyAgreementKid, jwk: service.keyAgreementPublicJwk },
102
+ ]);
103
+ const aRes = await f(`${base}/auth/`, {
104
+ method: "POST",
105
+ headers: { "content-type": "application/didcomm-encrypted+json" },
106
+ body: packed,
107
+ });
108
+ if (!aRes.ok) {
109
+ throw new Error(`vta /auth/ failed (${aRes.status}): ${await aRes.text()}`);
110
+ }
111
+ const aBody = (await aRes.json());
112
+ const accessToken = aBody.tokens?.accessToken;
113
+ if (!accessToken) {
114
+ throw new Error(`vta /auth/: malformed response: ${JSON.stringify(aBody)}`);
115
+ }
116
+ return accessToken;
117
+ }
118
+ //# sourceMappingURL=contexts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contexts.js","sourceRoot":"","sources":["../../src/vta/contexts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { Identity, type PublicJwk } from "../didcomm/index.js";
2
+ import type { DidcommMessageBridge, VtaTransport } from "./transport.js";
3
+ import type { EnrollmentChallengeResponse, EnrollmentSubmitRequest, EnrollmentSubmitResponse, PasskeyList } from "./types.js";
4
+ export interface RemoteDidcommEndpoint {
5
+ did: string;
6
+ keyAgreementKid: string;
7
+ keyAgreementPublicJwk: PublicJwk;
8
+ }
9
+ export interface DidcommVtaTransportOptions {
10
+ bridge: DidcommMessageBridge;
11
+ holder: Identity;
12
+ vta: RemoteDidcommEndpoint;
13
+ /** Optional mediator. When set, every outbound message gets wrapped
14
+ * in a routing/2.0/forward envelope and anoncrypt'd to the mediator. */
15
+ mediator?: RemoteDidcommEndpoint;
16
+ /** Per-request timeout (default 30s). */
17
+ timeoutMs?: number;
18
+ }
19
+ /**
20
+ * VTA transport over DIDComm v2. Authcrypts every request from the
21
+ * holder to the VTA, optionally wraps in a `routing/2.0/forward`
22
+ * envelope for a mediator, and dispatches via an injected
23
+ * `DidcommMessageBridge`. The bridge owns the actual network IO
24
+ * (WebSocket, HTTPS, etc.) — keeping this class transport-pure makes
25
+ * it directly testable with an in-memory bridge.
26
+ */
27
+ export declare class DidcommVtaTransport implements VtaTransport {
28
+ private readonly bridge;
29
+ private readonly holder;
30
+ private readonly vta;
31
+ private readonly mediator?;
32
+ private readonly timeoutMs;
33
+ constructor(opts: DidcommVtaTransportOptions);
34
+ requestEnrollmentChallenge(did: string): Promise<EnrollmentChallengeResponse>;
35
+ submitPasskeyEnrollment(req: EnrollmentSubmitRequest): Promise<EnrollmentSubmitResponse>;
36
+ listPasskeys(did: string): Promise<PasskeyList>;
37
+ removePasskey(did: string, fragment: string): Promise<void>;
38
+ /**
39
+ * Build, transmit, and unwrap a Trust-Task request/response exchange.
40
+ * The reply is a binding envelope whose body is a `TrustTask`
41
+ * document — either the operation's success response (return its
42
+ * `payload`) or a `trust-task-error/0.1` (throw a mapped error).
43
+ */
44
+ private exchange;
45
+ /**
46
+ * Build the wire form: a `TrustTask` envelope (the request) carried as
47
+ * the body of a binding-typed DIDComm message, authcrypt'd to the VTA
48
+ * and (when a mediator is configured) wrapped in a routing/2.0/forward.
49
+ * Public-ish so the smoke helper can introspect the envelope.
50
+ */
51
+ buildOutbound<Req extends object>(taskUri: string, payload: Req): Promise<{
52
+ outer: string;
53
+ inner: string;
54
+ requestId: string;
55
+ }>;
56
+ }
57
+ //# sourceMappingURL=didcomm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"didcomm.d.ts","sourceRoot":"","sources":["../../src/vta/didcomm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAIR,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAa7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EACV,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,EAAE,qBAAqB,CAAC;IAC3B;6EACyE;IACzE,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD;;;;;;;GAOG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAwB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,EAAE,0BAA0B;IAQ5C,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAO7E,uBAAuB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAmBxF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIzC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE;;;;;OAKG;YACW,QAAQ;IA4CtB;;;;;OAKG;IACG,aAAa,CAAC,GAAG,SAAS,MAAM,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,GAAG,GACX,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAqChE"}
@@ -0,0 +1,138 @@
1
+ import { Identity, packAuthcrypt, packAuthcryptJson, wrapForward, } from "../didcomm/index.js";
2
+ import { VtaClientError } from "./errors.js";
3
+ import { PasskeyVmTask, TRUST_TASK_ENVELOPE_TYPE, TRUST_TASK_ERROR_TYPE, } from "./protocol.js";
4
+ const DEFAULT_TIMEOUT_MS = 30_000;
5
+ function newMessageId() {
6
+ return globalThis.crypto.randomUUID();
7
+ }
8
+ /**
9
+ * VTA transport over DIDComm v2. Authcrypts every request from the
10
+ * holder to the VTA, optionally wraps in a `routing/2.0/forward`
11
+ * envelope for a mediator, and dispatches via an injected
12
+ * `DidcommMessageBridge`. The bridge owns the actual network IO
13
+ * (WebSocket, HTTPS, etc.) — keeping this class transport-pure makes
14
+ * it directly testable with an in-memory bridge.
15
+ */
16
+ export class DidcommVtaTransport {
17
+ bridge;
18
+ holder;
19
+ vta;
20
+ mediator;
21
+ timeoutMs;
22
+ constructor(opts) {
23
+ this.bridge = opts.bridge;
24
+ this.holder = opts.holder;
25
+ this.vta = opts.vta;
26
+ if (opts.mediator !== undefined)
27
+ this.mediator = opts.mediator;
28
+ this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
29
+ }
30
+ requestEnrollmentChallenge(did) {
31
+ return this.exchange(PasskeyVmTask.enrollChallenge, { did });
32
+ }
33
+ submitPasskeyEnrollment(req) {
34
+ const payload = {
35
+ did: req.did,
36
+ ceremonyId: req.ceremonyId,
37
+ credentialId: req.credentialId,
38
+ publicKeyMultibase: req.publicKeyMultibase,
39
+ coseAlgorithm: req.coseAlgorithm,
40
+ attestationObject: req.attestationObject,
41
+ clientDataJson: req.clientDataJson,
42
+ authenticatorData: req.authenticatorData,
43
+ transports: req.transports,
44
+ ...(req.label !== undefined ? { label: req.label } : {}),
45
+ };
46
+ return this.exchange(PasskeyVmTask.enrollSubmit, payload);
47
+ }
48
+ listPasskeys(did) {
49
+ return this.exchange(PasskeyVmTask.list, { did });
50
+ }
51
+ async removePasskey(did, fragment) {
52
+ await this.exchange(PasskeyVmTask.revoke, {
53
+ did,
54
+ fragment,
55
+ });
56
+ }
57
+ /**
58
+ * Build, transmit, and unwrap a Trust-Task request/response exchange.
59
+ * The reply is a binding envelope whose body is a `TrustTask`
60
+ * document — either the operation's success response (return its
61
+ * `payload`) or a `trust-task-error/0.1` (throw a mapped error).
62
+ */
63
+ async exchange(taskUri, payload) {
64
+ const packed = await this.buildOutbound(taskUri, payload);
65
+ // The bridge returns the decrypted, sender-authenticated reply (it
66
+ // owns unpacking; only authenticated authcrypt frames are surfaced).
67
+ const msg = await this.bridge.sendAndAwaitReply(packed.outer, packed.requestId, { timeoutMs: this.timeoutMs });
68
+ if (msg.type !== TRUST_TASK_ENVELOPE_TYPE) {
69
+ throw new VtaClientError("e.client.parse", `reply type ${msg.type ?? "(none)"} != Trust-Task binding envelope`);
70
+ }
71
+ if (msg.thid !== packed.requestId) {
72
+ throw new VtaClientError("e.client.parse", `reply thid ${msg.thid ?? "(none)"} != request id ${packed.requestId}`);
73
+ }
74
+ if (msg.from !== this.vta.did) {
75
+ throw new VtaClientError("e.p.msg.unauthorized", `reply from ${msg.from ?? "(none)"} != VTA ${this.vta.did}`);
76
+ }
77
+ const doc = (msg.body ?? {});
78
+ if (doc.type === TRUST_TASK_ERROR_TYPE) {
79
+ const err = (doc.payload ?? {});
80
+ throw new VtaClientError(coerceTrustTaskCode(err.code), err.message ?? err.code ?? "trust-task error", { details: err });
81
+ }
82
+ return (doc.payload ?? {});
83
+ }
84
+ /**
85
+ * Build the wire form: a `TrustTask` envelope (the request) carried as
86
+ * the body of a binding-typed DIDComm message, authcrypt'd to the VTA
87
+ * and (when a mediator is configured) wrapped in a routing/2.0/forward.
88
+ * Public-ish so the smoke helper can introspect the envelope.
89
+ */
90
+ async buildOutbound(taskUri, payload) {
91
+ const requestId = newMessageId();
92
+ const envelope = {
93
+ id: requestId,
94
+ type: taskUri,
95
+ issuer: this.holder.did,
96
+ issuedAt: new Date().toISOString(),
97
+ payload,
98
+ };
99
+ const message = {
100
+ id: requestId,
101
+ type: TRUST_TASK_ENVELOPE_TYPE,
102
+ from: this.holder.did,
103
+ to: [this.vta.did],
104
+ body: envelope,
105
+ };
106
+ const inner = await packAuthcrypt(message, this.holder, [
107
+ { kid: this.vta.keyAgreementKid, jwk: this.vta.keyAgreementPublicJwk },
108
+ ]);
109
+ if (!this.mediator)
110
+ return { outer: inner, inner, requestId };
111
+ const forwardJson = wrapForward(this.vta.did, this.holder.did, this.mediator.did, inner);
112
+ const outer = await packAuthcryptJson(forwardJson, this.holder, [
113
+ {
114
+ kid: this.mediator.keyAgreementKid,
115
+ jwk: this.mediator.keyAgreementPublicJwk,
116
+ },
117
+ ]);
118
+ return { outer, inner, requestId };
119
+ }
120
+ }
121
+ /** Map a framework Trust-Task status `code` to a typed `VtaErrorCode`
122
+ * so the CLI/UI layer can give targeted guidance. */
123
+ function coerceTrustTaskCode(code) {
124
+ switch (code) {
125
+ case "permission_denied":
126
+ return "e.p.msg.forbidden";
127
+ case "internal_error":
128
+ case "unavailable":
129
+ return "e.p.msg.internal";
130
+ case "malformed_request":
131
+ case "unsupported_type":
132
+ case "task_failed":
133
+ return "e.p.msg.bad_request";
134
+ default:
135
+ return "e.p.msg.bad_request";
136
+ }
137
+ }
138
+ //# sourceMappingURL=didcomm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"didcomm.js","sourceRoot":"","sources":["../../src/vta/didcomm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Error code namespace mirrors the VTA's typed error variants. The
3
+ * server emits `{ "error": { "code": "e.p.msg.unauthorized", ... } }`
4
+ * and we lift the code into a typed JS error so the UI can switch on
5
+ * it instead of string-matching messages.
6
+ */
7
+ export type VtaErrorCode = "e.p.msg.unauthorized" | "e.p.msg.forbidden" | "e.p.msg.notfound" | "e.p.msg.conflict" | "e.p.msg.rate_limited" | "e.p.msg.bad_request" | "e.p.msg.internal" | "e.client.network" | "e.client.parse" | "e.client.unsupported";
8
+ export declare class VtaClientError extends Error {
9
+ readonly code: VtaErrorCode;
10
+ readonly status?: number;
11
+ readonly details?: unknown;
12
+ readonly suggestion?: string;
13
+ constructor(code: VtaErrorCode, message: string, opts?: {
14
+ status?: number;
15
+ details?: unknown;
16
+ suggestion?: string;
17
+ });
18
+ }
19
+ export declare function errorFromResponse(res: Response): Promise<VtaClientError>;
20
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/vta/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GACpB,sBAAsB,GACtB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,sBAAsB,CAAC;AAE3B,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAG3B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;CASzE;AA6BD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAe9E"}
@@ -0,0 +1,64 @@
1
+ export class VtaClientError extends Error {
2
+ code;
3
+ status;
4
+ details;
5
+ suggestion;
6
+ constructor(code, message, opts = {}) {
7
+ super(message);
8
+ this.name = "VtaClientError";
9
+ this.code = code;
10
+ if (opts.status !== undefined)
11
+ this.status = opts.status;
12
+ if (opts.details !== undefined)
13
+ this.details = opts.details;
14
+ if (opts.suggestion !== undefined)
15
+ this.suggestion = opts.suggestion;
16
+ }
17
+ }
18
+ const KNOWN_CODES = [
19
+ "e.p.msg.unauthorized",
20
+ "e.p.msg.forbidden",
21
+ "e.p.msg.notfound",
22
+ "e.p.msg.conflict",
23
+ "e.p.msg.rate_limited",
24
+ "e.p.msg.bad_request",
25
+ "e.p.msg.internal",
26
+ ];
27
+ function coerceCode(raw, status) {
28
+ if (raw && KNOWN_CODES.includes(raw)) {
29
+ return raw;
30
+ }
31
+ if (status === 401)
32
+ return "e.p.msg.unauthorized";
33
+ if (status === 403)
34
+ return "e.p.msg.forbidden";
35
+ if (status === 404)
36
+ return "e.p.msg.notfound";
37
+ if (status === 409)
38
+ return "e.p.msg.conflict";
39
+ if (status === 429)
40
+ return "e.p.msg.rate_limited";
41
+ if (status >= 500)
42
+ return "e.p.msg.internal";
43
+ return "e.p.msg.bad_request";
44
+ }
45
+ export async function errorFromResponse(res) {
46
+ let body;
47
+ try {
48
+ body = (await res.json());
49
+ }
50
+ catch {
51
+ // fall through with no body
52
+ }
53
+ const code = coerceCode(body?.error?.code, res.status);
54
+ const message = body?.error?.message ?? `${res.status} ${res.statusText}`;
55
+ const opts = {
56
+ status: res.status,
57
+ };
58
+ if (body?.error?.details !== undefined)
59
+ opts.details = body.error.details;
60
+ if (body?.error?.suggestion !== undefined)
61
+ opts.suggestion = body.error.suggestion;
62
+ return new VtaClientError(code, message, opts);
63
+ }
64
+ //# sourceMappingURL=errors.js.map