UNPKG

@x402-hpke/node

Version:

Provider-agnostic HPKE envelope library for x402 (Node) — cross-language interop with Python

106 lines (105 loc) 4.59 kB
import { x402SecureTransport, CanonicalHeaders } from "./index.js"; /** * A helper to create a 402 Payment Required response. * @param hpke The configured hpke instance. * @param args The arguments for the payment required response. * @param isPublic If true, the entire response data is exposed in the public sidecar. * @returns The sealed envelope and an optional publicJsonBody. */ export async function createPaymentRequired(hpke, args, isPublic = false) { const transport = new x402SecureTransport("PAYMENT_REQUIRED", args.paymentRequiredData); const result = await hpke.seal({ transport, makeEntitiesPublic: isPublic ? "all" : undefined, recipientPublicJwk: args.recipientPublicJwk, kid: args.kid, }); return { envelope: result.envelope, publicJsonBody: result.publicBody, }; } /** * A helper to create a client-side X-Payment request. * @param hpke The configured hpke instance. * @param args The arguments for the payment request. * @param isPublic If true, exposes the payment data in a public X-Payment header. * @returns The sealed envelope and an optional publicHeaders sidecar. */ export async function createPayment(hpke, args, isPublic = false) { const header = { header: CanonicalHeaders.X_PAYMENT, value: { payload: args.paymentData } }; const extensions = (args.extensions || []).map((e) => ({ header: e.header, value: e.payload })); const transport = new x402SecureTransport("PAYMENT", header.value, undefined, extensions); const result = await hpke.seal({ transport, makeEntitiesPublic: isPublic ? [CanonicalHeaders.X_PAYMENT] : undefined, recipientPublicJwk: args.recipientPublicJwk, kid: args.kid, }); return { envelope: result.envelope, publicHeaders: result.publicHeaders, }; } /** * A helper to create a server-side X-Payment-Response. * @param hpke The configured hpke instance. * @param args The arguments for the payment response. * @param isPublic If true, exposes the settlement data in a public X-Payment-Response header. * @returns The sealed envelope and an optional publicHeaders sidecar. */ export async function createPaymentResponse(hpke, args, isPublic = false) { const header = { header: CanonicalHeaders.X_PAYMENT_RESPONSE, value: args.settlementData }; const extensions = (args.extensions || []).map((e) => ({ header: e.header, value: e.payload })); const transport = new x402SecureTransport("PAYMENT_RESPONSE", header.value, 200, extensions); const result = await hpke.seal({ transport, makeEntitiesPublic: isPublic ? [CanonicalHeaders.X_PAYMENT_RESPONSE] : undefined, recipientPublicJwk: args.recipientPublicJwk, kid: args.kid, }); return { envelope: result.envelope, publicHeaders: result.publicHeaders, }; } /** * A helper to create a general-purpose request envelope. * @param hpke The configured hpke instance. * @param args The arguments for the request. * @param isPublic If true, exposes the request data in a public header. * @returns The sealed envelope and an optional publicHeaders sidecar. */ export async function createRequest(hpke, args, isPublic = false) { const transport = new x402SecureTransport("OTHER_REQUEST", args.requestData, undefined, (args.extensions || []).map((e) => ({ header: e.header, value: e.payload }))); const result = await hpke.seal({ transport, makeEntitiesPublic: isPublic ? "all" : undefined, recipientPublicJwk: args.recipientPublicJwk, kid: args.kid, }); return { envelope: result.envelope, publicHeaders: result.publicHeaders, }; } /** * A helper to create a general-purpose response envelope. * @param hpke The configured hpke instance. * @param args The arguments for the response. * @param isPublic If true, exposes the response data in a public header. * @returns The sealed envelope and an optional publicHeaders sidecar. */ export async function createResponse(hpke, args, isPublic = false) { const transport = new x402SecureTransport("OTHER_RESPONSE", args.responseData, args.httpResponseCode, (args.extensions || []).map((e) => ({ header: e.header, value: e.payload }))); const result = await hpke.seal({ transport, makeEntitiesPublic: isPublic ? "all" : undefined, recipientPublicJwk: args.recipientPublicJwk, kid: args.kid, }); return { envelope: result.envelope, publicHeaders: result.publicHeaders, }; }