@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.
- package/README.md +129 -0
- package/dist/did/derive-signing-key.d.ts +19 -0
- package/dist/did/derive-signing-key.d.ts.map +1 -0
- package/dist/did/derive-signing-key.js +96 -0
- package/dist/did/derive-signing-key.js.map +1 -0
- package/dist/did/index.d.ts +5 -0
- package/dist/did/index.d.ts.map +1 -0
- package/dist/did/index.js +5 -0
- package/dist/did/index.js.map +1 -0
- package/dist/did/peer.d.ts +37 -0
- package/dist/did/peer.d.ts.map +1 -0
- package/dist/did/peer.js +49 -0
- package/dist/did/peer.js.map +1 -0
- package/dist/did/verification-method.d.ts +43 -0
- package/dist/did/verification-method.d.ts.map +1 -0
- package/dist/did/verification-method.js +32 -0
- package/dist/did/verification-method.js.map +1 -0
- package/dist/did/verify.d.ts +49 -0
- package/dist/did/verify.d.ts.map +1 -0
- package/dist/did/verify.js +89 -0
- package/dist/did/verify.js.map +1 -0
- package/dist/didcomm/index.d.ts +235 -0
- package/dist/didcomm/index.d.ts.map +1 -0
- package/dist/didcomm/index.js +415 -0
- package/dist/didcomm/index.js.map +1 -0
- package/dist/inbound/confirm.d.ts +50 -0
- package/dist/inbound/confirm.d.ts.map +1 -0
- package/dist/inbound/confirm.js +64 -0
- package/dist/inbound/confirm.js.map +1 -0
- package/dist/inbound/dedup.d.ts +9 -0
- package/dist/inbound/dedup.d.ts.map +1 -0
- package/dist/inbound/dedup.js +31 -0
- package/dist/inbound/dedup.js.map +1 -0
- package/dist/inbound/index.d.ts +3 -0
- package/dist/inbound/index.d.ts.map +1 -0
- package/dist/inbound/index.js +3 -0
- package/dist/inbound/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/onboarding/index.d.ts +2 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +2 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/swap.d.ts +60 -0
- package/dist/onboarding/swap.d.ts.map +1 -0
- package/dist/onboarding/swap.js +148 -0
- package/dist/onboarding/swap.js.map +1 -0
- package/dist/provision/adopt.d.ts +31 -0
- package/dist/provision/adopt.d.ts.map +1 -0
- package/dist/provision/adopt.js +114 -0
- package/dist/provision/adopt.js.map +1 -0
- package/dist/provision/armor.d.ts +19 -0
- package/dist/provision/armor.d.ts.map +1 -0
- package/dist/provision/armor.js +243 -0
- package/dist/provision/armor.js.map +1 -0
- package/dist/provision/crc24.d.ts +5 -0
- package/dist/provision/crc24.d.ts.map +1 -0
- package/dist/provision/crc24.js +30 -0
- package/dist/provision/crc24.js.map +1 -0
- package/dist/provision/hpke.d.ts +17 -0
- package/dist/provision/hpke.d.ts.map +1 -0
- package/dist/provision/hpke.js +60 -0
- package/dist/provision/hpke.js.map +1 -0
- package/dist/provision/index.d.ts +10 -0
- package/dist/provision/index.d.ts.map +1 -0
- package/dist/provision/index.js +16 -0
- package/dist/provision/index.js.map +1 -0
- package/dist/provision/open.d.ts +28 -0
- package/dist/provision/open.d.ts.map +1 -0
- package/dist/provision/open.js +224 -0
- package/dist/provision/open.js.map +1 -0
- package/dist/provision/request.d.ts +65 -0
- package/dist/provision/request.d.ts.map +1 -0
- package/dist/provision/request.js +53 -0
- package/dist/provision/request.js.map +1 -0
- package/dist/provision/run.d.ts +76 -0
- package/dist/provision/run.d.ts.map +1 -0
- package/dist/provision/run.js +110 -0
- package/dist/provision/run.js.map +1 -0
- package/dist/provision/send.d.ts +85 -0
- package/dist/provision/send.d.ts.map +1 -0
- package/dist/provision/send.js +87 -0
- package/dist/provision/send.js.map +1 -0
- package/dist/provision/types.d.ts +110 -0
- package/dist/provision/types.d.ts.map +1 -0
- package/dist/provision/types.js +17 -0
- package/dist/provision/types.js.map +1 -0
- package/dist/rp-login/didcomm.d.ts +34 -0
- package/dist/rp-login/didcomm.d.ts.map +1 -0
- package/dist/rp-login/didcomm.js +72 -0
- package/dist/rp-login/didcomm.js.map +1 -0
- package/dist/rp-login/index.d.ts +3 -0
- package/dist/rp-login/index.d.ts.map +1 -0
- package/dist/rp-login/index.js +3 -0
- package/dist/rp-login/index.js.map +1 -0
- package/dist/rp-login/step-up.d.ts +43 -0
- package/dist/rp-login/step-up.d.ts.map +1 -0
- package/dist/rp-login/step-up.js +118 -0
- package/dist/rp-login/step-up.js.map +1 -0
- package/dist/siop/index.d.ts +3 -0
- package/dist/siop/index.d.ts.map +1 -0
- package/dist/siop/index.js +3 -0
- package/dist/siop/index.js.map +1 -0
- package/dist/siop/login-client.d.ts +29 -0
- package/dist/siop/login-client.d.ts.map +1 -0
- package/dist/siop/login-client.js +79 -0
- package/dist/siop/login-client.js.map +1 -0
- package/dist/siop/self-issued.d.ts +96 -0
- package/dist/siop/self-issued.d.ts.map +1 -0
- package/dist/siop/self-issued.js +162 -0
- package/dist/siop/self-issued.js.map +1 -0
- package/dist/store/holder-identity.d.ts +241 -0
- package/dist/store/holder-identity.d.ts.map +1 -0
- package/dist/store/holder-identity.js +441 -0
- package/dist/store/holder-identity.js.map +1 -0
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +4 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/kv-store.d.ts +51 -0
- package/dist/store/kv-store.d.ts.map +1 -0
- package/dist/store/kv-store.js +100 -0
- package/dist/store/kv-store.js.map +1 -0
- package/dist/store/secret-wrap.d.ts +109 -0
- package/dist/store/secret-wrap.d.ts.map +1 -0
- package/dist/store/secret-wrap.js +85 -0
- package/dist/store/secret-wrap.js.map +1 -0
- package/dist/trust-tasks/index.d.ts +2 -0
- package/dist/trust-tasks/index.d.ts.map +1 -0
- package/dist/trust-tasks/index.js +2 -0
- package/dist/trust-tasks/index.js.map +1 -0
- package/dist/trust-tasks/sign.d.ts +31 -0
- package/dist/trust-tasks/sign.d.ts.map +1 -0
- package/dist/trust-tasks/sign.js +141 -0
- package/dist/trust-tasks/sign.js.map +1 -0
- package/dist/util/timing.d.ts +14 -0
- package/dist/util/timing.d.ts.map +1 -0
- package/dist/util/timing.js +20 -0
- package/dist/util/timing.js.map +1 -0
- package/dist/vault/delete.d.ts +19 -0
- package/dist/vault/delete.d.ts.map +1 -0
- package/dist/vault/delete.js +35 -0
- package/dist/vault/delete.js.map +1 -0
- package/dist/vault/index.d.ts +8 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +7 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/list.d.ts +96 -0
- package/dist/vault/list.d.ts.map +1 -0
- package/dist/vault/list.js +106 -0
- package/dist/vault/list.js.map +1 -0
- package/dist/vault/proxy-login.d.ts +100 -0
- package/dist/vault/proxy-login.d.ts.map +1 -0
- package/dist/vault/proxy-login.js +106 -0
- package/dist/vault/proxy-login.js.map +1 -0
- package/dist/vault/release.d.ts +33 -0
- package/dist/vault/release.d.ts.map +1 -0
- package/dist/vault/release.js +83 -0
- package/dist/vault/release.js.map +1 -0
- package/dist/vault/sign-trust-task.d.ts +26 -0
- package/dist/vault/sign-trust-task.d.ts.map +1 -0
- package/dist/vault/sign-trust-task.js +53 -0
- package/dist/vault/sign-trust-task.js.map +1 -0
- package/dist/vault/transport.d.ts +50 -0
- package/dist/vault/transport.d.ts.map +1 -0
- package/dist/vault/transport.js +118 -0
- package/dist/vault/transport.js.map +1 -0
- package/dist/vault/upsert.d.ts +102 -0
- package/dist/vault/upsert.d.ts.map +1 -0
- package/dist/vault/upsert.js +92 -0
- package/dist/vault/upsert.js.map +1 -0
- package/dist/vta/bridge-mediator-session.d.ts +26 -0
- package/dist/vta/bridge-mediator-session.d.ts.map +1 -0
- package/dist/vta/bridge-mediator-session.js +37 -0
- package/dist/vta/bridge-mediator-session.js.map +1 -0
- package/dist/vta/bridge-memory.d.ts +80 -0
- package/dist/vta/bridge-memory.d.ts.map +1 -0
- package/dist/vta/bridge-memory.js +162 -0
- package/dist/vta/bridge-memory.js.map +1 -0
- package/dist/vta/client.d.ts +40 -0
- package/dist/vta/client.d.ts.map +1 -0
- package/dist/vta/client.js +91 -0
- package/dist/vta/client.js.map +1 -0
- package/dist/vta/contexts.d.ts +60 -0
- package/dist/vta/contexts.d.ts.map +1 -0
- package/dist/vta/contexts.js +118 -0
- package/dist/vta/contexts.js.map +1 -0
- package/dist/vta/didcomm.d.ts +57 -0
- package/dist/vta/didcomm.d.ts.map +1 -0
- package/dist/vta/didcomm.js +138 -0
- package/dist/vta/didcomm.js.map +1 -0
- package/dist/vta/errors.d.ts +20 -0
- package/dist/vta/errors.d.ts.map +1 -0
- package/dist/vta/errors.js +64 -0
- package/dist/vta/errors.js.map +1 -0
- package/dist/vta/index.d.ts +15 -0
- package/dist/vta/index.d.ts.map +1 -0
- package/dist/vta/index.js +15 -0
- package/dist/vta/index.js.map +1 -0
- package/dist/vta/mediation.d.ts +80 -0
- package/dist/vta/mediation.d.ts.map +1 -0
- package/dist/vta/mediation.js +29 -0
- package/dist/vta/mediation.js.map +1 -0
- package/dist/vta/mediator-client.d.ts +66 -0
- package/dist/vta/mediator-client.d.ts.map +1 -0
- package/dist/vta/mediator-client.js +139 -0
- package/dist/vta/mediator-client.js.map +1 -0
- package/dist/vta/pickup.d.ts +81 -0
- package/dist/vta/pickup.d.ts.map +1 -0
- package/dist/vta/pickup.js +30 -0
- package/dist/vta/pickup.js.map +1 -0
- package/dist/vta/protocol.d.ts +76 -0
- package/dist/vta/protocol.d.ts.map +1 -0
- package/dist/vta/protocol.js +30 -0
- package/dist/vta/protocol.js.map +1 -0
- package/dist/vta/smoke.d.ts +59 -0
- package/dist/vta/smoke.d.ts.map +1 -0
- package/dist/vta/smoke.js +408 -0
- package/dist/vta/smoke.js.map +1 -0
- package/dist/vta/transport.d.ts +55 -0
- package/dist/vta/transport.d.ts.map +1 -0
- package/dist/vta/transport.js +2 -0
- package/dist/vta/transport.js.map +1 -0
- package/dist/vta/types.d.ts +50 -0
- package/dist/vta/types.d.ts.map +1 -0
- package/dist/vta/types.js +2 -0
- package/dist/vta/types.js.map +1 -0
- package/dist/vta/wallet-session.d.ts +87 -0
- package/dist/vta/wallet-session.d.ts.map +1 -0
- package/dist/vta/wallet-session.js +106 -0
- package/dist/vta/wallet-session.js.map +1 -0
- package/dist/webauthn/base64url.d.ts +3 -0
- package/dist/webauthn/base64url.d.ts.map +1 -0
- package/dist/webauthn/base64url.js +17 -0
- package/dist/webauthn/base64url.js.map +1 -0
- package/dist/webauthn/index.d.ts +4 -0
- package/dist/webauthn/index.d.ts.map +1 -0
- package/dist/webauthn/index.js +4 -0
- package/dist/webauthn/index.js.map +1 -0
- package/dist/webauthn/multikey.d.ts +26 -0
- package/dist/webauthn/multikey.d.ts.map +1 -0
- package/dist/webauthn/multikey.js +91 -0
- package/dist/webauthn/multikey.js.map +1 -0
- package/dist/webauthn/register.d.ts +36 -0
- package/dist/webauthn/register.d.ts.map +1 -0
- package/dist/webauthn/register.js +77 -0
- package/dist/webauthn/register.js.map +1 -0
- 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
|