@x402-hpke/node
Version:
Provider-agnostic HPKE envelope library for x402 (Node) — cross-language interop with Python
106 lines (105 loc) • 4.59 kB
JavaScript
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,
};
}