@nevermined-io/payments 1.0.8 → 1.0.10
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 +7 -14
- package/dist/a2a/paymentsClient.d.ts +2 -2
- package/dist/a2a/paymentsClient.d.ts.map +1 -1
- package/dist/a2a/paymentsClient.js +7 -7
- package/dist/a2a/paymentsClient.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +45 -26
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/types.d.ts +6 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/api/base-payments.d.ts +2 -1
- package/dist/api/base-payments.d.ts.map +1 -1
- package/dist/api/base-payments.js +11 -3
- package/dist/api/base-payments.js.map +1 -1
- package/dist/common/types.d.ts +13 -0
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/types.js.map +1 -1
- package/dist/environments.d.ts +7 -0
- package/dist/environments.d.ts.map +1 -1
- package/dist/environments.js +13 -0
- package/dist/environments.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/payments.d.ts.map +1 -1
- package/dist/payments.js +10 -2
- package/dist/payments.js.map +1 -1
- package/dist/x402/express/middleware.d.ts.map +1 -1
- package/dist/x402/express/middleware.js +28 -19
- package/dist/x402/express/middleware.js.map +1 -1
- package/dist/x402/facilitator-api.d.ts +5 -4
- package/dist/x402/facilitator-api.d.ts.map +1 -1
- package/dist/x402/facilitator-api.js.map +1 -1
- package/dist/x402/index.d.ts +4 -0
- package/dist/x402/index.d.ts.map +1 -1
- package/dist/x402/index.js +3 -0
- package/dist/x402/index.js.map +1 -1
- package/dist/x402/visa-facilitator-api.d.ts +150 -0
- package/dist/x402/visa-facilitator-api.d.ts.map +1 -0
- package/dist/x402/visa-facilitator-api.js +206 -0
- package/dist/x402/visa-facilitator-api.js.map +1 -0
- package/dist/x402/visa-token-api.d.ts +53 -0
- package/dist/x402/visa-token-api.d.ts.map +1 -0
- package/dist/x402/visa-token-api.js +88 -0
- package/dist/x402/visa-token-api.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visa-facilitator-api.js","sourceRoot":"","sources":["../../src/x402/visa-facilitator-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAQrD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAqEpD,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,gBAAgB,EAAE,kBAAkB;IACpC,iBAAiB,EAAE,mBAAmB;IACtC,gBAAgB,EAAE,kBAAkB;CAC5B,CAAA;AAEV,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAUxC;IACC,MAAM,EACJ,MAAM,EACN,KAAK,GAAG,KAAK,EACb,KAAK,EACL,QAAQ,GAAG,EAAE,EACb,WAAW,EACX,iBAAiB,GAAG,IAAI,EACxB,YAAY,EACZ,WAAW,EACX,mBAAmB,GACpB,GAAG,OAAO,CAAA;IAEX,OAAO;QACL,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE;YACR,GAAG,EAAE,QAAQ;YACb,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;SACpC;QACD,OAAO,EAAE;YACP;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,UAAU;gBACnB,MAAM;gBACN,KAAK;gBACL,KAAK;gBACL,iBAAiB;gBACjB,KAAK,EAAE;oBACL,mBAAmB,EAAE,EAAE;oBACvB,aAAa,EAAE,EAAE;oBACjB,QAAQ,EAAE,CAAC;oBACX,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;oBACrC,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;oBACnC,GAAG,CAAC,mBAAmB,IAAI,EAAE,mBAAmB,EAAE,CAAC;iBACpD;aACF;SACF;KACF,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IAGpD,YAAY,OAAuB;QACjC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,CAAU,WAAW,CAAC,OAAuB;QACjD,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC;IAED;;;;;;;OAOG;IACM,KAAK,CAAC,iBAAiB,CAC9B,MAA+B;QAE/B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAA;QAClC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;QAElD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,eAAe;iBACvD;aACF,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,YAAY,GAAG,kCAAkC,CAAA;gBACrD,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;oBACvC,YAAY,GAAG,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,OAAO,IAAI,YAAY,CAAA;gBAC7E,CAAC;gBAAC,MAAM,CAAC;oBACP,4BAA4B;gBAC9B,CAAC;gBACD,MAAM,aAAa,CAAC,WAAW,CAAC,YAAY,EAAE;oBAC5C,OAAO,EAAE,YAAY;oBACrB,IAAI,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE;iBAChC,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,UAAU,GAAuB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAE5D,kEAAkE;YAClE,OAAO;gBACL,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,aAAa,EAAE,UAAU,CAAC,aAAa;aACxC,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBACnC,MAAM,KAAK,CAAA;YACb,CAAC;YACD,MAAM,aAAa,CAAC,WAAW,CAAC,gDAAgD,EAAE;gBAChF,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/D,IAAI,EAAE,eAAe;aACtB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACM,KAAK,CAAC,iBAAiB,CAC9B,MAA+B;QAE/B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAA;QAClC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;QAElD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,eAAe;iBACvD;aACF,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,YAAY,GAAG,gCAAgC,CAAA;gBACnD,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;oBACvC,YAAY,GAAG,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,OAAO,IAAI,YAAY,CAAA;gBAC3E,CAAC;gBAAC,MAAM,CAAC;oBACP,4BAA4B;gBAC9B,CAAC;gBACD,MAAM,aAAa,CAAC,WAAW,CAAC,YAAY,EAAE;oBAC5C,OAAO,EAAE,YAAY;oBACrB,IAAI,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE;iBAChC,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,UAAU,GAA2B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAEhE,kEAAkE;YAClE,OAAO;gBACL,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,WAAW,EAAE,UAAU,CAAC,WAAW;gBACnC,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,WAAW,EAAE,UAAU,CAAC,WAAW;aACpC,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBACnC,MAAM,KAAK,CAAA;YACb,CAAC;YACD,MAAM,aAAa,CAAC,WAAW,CAAC,8CAA8C,EAAE;gBAC9E,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/D,IAAI,EAAE,eAAe;aACtB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * Visa Facilitator API — verifies and settles payments via the Visa x402 backend.\n *\n * Unlike the base FacilitatorAPI (which sends JSON bodies to the NVM backend),\n * the Visa flow uses the PAYMENT-SIGNATURE HTTP header to transport a base64-encoded\n * PaymentPayload to the Visa backend's /verify and /settle endpoints.\n *\n * @example\n * ```typescript\n * import { Payments } from '@nevermined-io/payments'\n *\n * const payments = Payments.getInstance({\n * nvmApiKey: 'your-nvm-api-key',\n * environment: 'sandbox',\n * scheme: 'visa',\n * })\n *\n * const paymentRequired = buildVisaPaymentRequired({\n * amount: '2.00',\n * asset: 'USD',\n * payTo: 'merchant-id',\n * endpoint: '/tools/random-article',\n * })\n *\n * // The PAYMENT-SIGNATURE header from the client request\n * const paymentSignature = req.headers['payment-signature'] as string\n *\n * const verification = await payments.facilitator.verifyPermissions({\n * paymentRequired,\n * x402AccessToken: paymentSignature,\n * })\n *\n * if (verification.isValid) {\n * const settlement = await payments.facilitator.settlePermissions({\n * paymentRequired,\n * x402AccessToken: paymentSignature,\n * })\n * }\n * ```\n */\n\nimport { FacilitatorAPI } from './facilitator-api.js'\nimport type {\n VerifyPermissionsParams,\n VerifyPermissionsResult,\n SettlePermissionsParams,\n SettlePermissionsResult,\n X402Resource,\n} from './facilitator-api.js'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { PaymentOptions } from '../common/types.js'\nimport { VisaBackendUrls } from '../environments.js'\n\n// ---------------------------------------------------------------------------\n// Visa-specific x402 types\n// ---------------------------------------------------------------------------\n\n/**\n * Visa-specific extra fields in PaymentRequirements\n */\nexport interface VisaPaymentExtra {\n /** Visa Token Service provisioned token ID */\n vProvisionedTokenID: string\n /** VIC instruction ID from mandate creation */\n instructionId: string\n /** Maximum number of times this payment can be used */\n maxUsage: number\n /** Merchant name */\n merchantName?: string\n /** Merchant URL */\n merchantUrl?: string\n /** Merchant country code */\n merchantCountryCode?: string\n}\n\n/**\n * Visa payment requirements (x402 v2 with scheme: \"visa\")\n */\nexport interface VisaPaymentRequirements {\n scheme: 'visa'\n network: 'visa:vts'\n amount: string\n asset: string\n payTo: string\n maxTimeoutSeconds: number\n extra: VisaPaymentExtra\n}\n\n/**\n * Visa-specific PaymentRequired response\n */\nexport interface VisaPaymentRequired {\n x402Version: 2\n error?: string\n resource: X402Resource\n accepts: VisaPaymentRequirements[]\n extensions?: Record<string, unknown>\n}\n\n/**\n * Visa verify response\n */\nexport interface VisaVerifyResponse {\n isValid: boolean\n payer?: string\n invalidReason?: string\n remainingUsage?: number\n}\n\n/**\n * Visa settlement response\n */\nexport interface VisaSettlementResponse {\n success: boolean\n transaction: string\n network: 'visa:vts'\n payer?: string\n errorReason?: string\n}\n\n// ---------------------------------------------------------------------------\n// Visa x402 header names\n// ---------------------------------------------------------------------------\n\nexport const VISA_X402_HEADERS = {\n PAYMENT_REQUIRED: 'PAYMENT-REQUIRED',\n PAYMENT_SIGNATURE: 'PAYMENT-SIGNATURE',\n PAYMENT_RESPONSE: 'PAYMENT-RESPONSE',\n} as const\n\n// ---------------------------------------------------------------------------\n// Helper: build a Visa PaymentRequired\n// ---------------------------------------------------------------------------\n\n/**\n * Build a Visa-flavored X402PaymentRequired object.\n *\n * This is the Visa counterpart of `buildPaymentRequired` (which builds NVM-flavored ones).\n */\nexport function buildVisaPaymentRequired(options: {\n amount: string\n asset?: string\n payTo: string\n endpoint?: string\n description?: string\n maxTimeoutSeconds?: number\n merchantName?: string\n merchantUrl?: string\n merchantCountryCode?: string\n}): VisaPaymentRequired {\n const {\n amount,\n asset = 'USD',\n payTo,\n endpoint = '',\n description,\n maxTimeoutSeconds = 3600,\n merchantName,\n merchantUrl,\n merchantCountryCode,\n } = options\n\n return {\n x402Version: 2,\n resource: {\n url: endpoint,\n ...(description && { description }),\n },\n accepts: [\n {\n scheme: 'visa',\n network: 'visa:vts',\n amount,\n asset,\n payTo,\n maxTimeoutSeconds,\n extra: {\n vProvisionedTokenID: '',\n instructionId: '',\n maxUsage: 1,\n ...(merchantName && { merchantName }),\n ...(merchantUrl && { merchantUrl }),\n ...(merchantCountryCode && { merchantCountryCode }),\n },\n },\n ],\n }\n}\n\n// ---------------------------------------------------------------------------\n// VisaFacilitatorAPI\n// ---------------------------------------------------------------------------\n\n/**\n * Visa Facilitator API — sends PAYMENT-SIGNATURE header to the Visa backend\n * for verify and settle operations.\n */\nexport class VisaFacilitatorAPI extends FacilitatorAPI {\n protected visaBackendUrl: string\n\n constructor(options: PaymentOptions) {\n super(options)\n this.visaBackendUrl = VisaBackendUrls[this.environmentName]\n }\n\n static override getInstance(options: PaymentOptions): VisaFacilitatorAPI {\n return new VisaFacilitatorAPI(options)\n }\n\n /**\n * Verify a Visa payment authorization.\n *\n * Sends the base64-encoded PaymentPayload as a PAYMENT-SIGNATURE header\n * to the Visa backend's POST /verify endpoint.\n *\n * @param params - contains x402AccessToken, the base64-encoded PaymentPayload from the client\n */\n override async verifyPermissions(\n params: VerifyPermissionsParams,\n ): Promise<VerifyPermissionsResult> {\n const { x402AccessToken } = params\n const url = new URL('verify', this.visaBackendUrl)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n [VISA_X402_HEADERS.PAYMENT_SIGNATURE]: x402AccessToken,\n },\n })\n\n if (!response.ok) {\n let errorMessage = 'Visa payment verification failed'\n try {\n const errorData = await response.json()\n errorMessage = errorData.invalidReason || errorData.message || errorMessage\n } catch {\n // Use default error message\n }\n throw PaymentsError.fromBackend(errorMessage, {\n message: errorMessage,\n code: `HTTP ${response.status}`,\n })\n }\n\n const visaResult: VisaVerifyResponse = await response.json()\n\n // Map Visa response to the standard VerifyPermissionsResult shape\n return {\n isValid: visaResult.isValid,\n payer: visaResult.payer,\n invalidReason: visaResult.invalidReason,\n }\n } catch (error) {\n if (error instanceof PaymentsError) {\n throw error\n }\n throw PaymentsError.fromBackend('Network error during Visa payment verification', {\n message: error instanceof Error ? error.message : String(error),\n code: 'network_error',\n })\n }\n }\n\n /**\n * Settle a Visa payment transaction.\n *\n * Sends the base64-encoded PaymentPayload as a PAYMENT-SIGNATURE header\n * to the Visa backend's POST /settle endpoint.\n *\n * @param params - contains x402AccessToken, the base64-encoded PaymentPayload from the client\n */\n override async settlePermissions(\n params: SettlePermissionsParams,\n ): Promise<SettlePermissionsResult> {\n const { x402AccessToken } = params\n const url = new URL('settle', this.visaBackendUrl)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n [VISA_X402_HEADERS.PAYMENT_SIGNATURE]: x402AccessToken,\n },\n })\n\n if (!response.ok) {\n let errorMessage = 'Visa payment settlement failed'\n try {\n const errorData = await response.json()\n errorMessage = errorData.errorReason || errorData.message || errorMessage\n } catch {\n // Use default error message\n }\n throw PaymentsError.fromBackend(errorMessage, {\n message: errorMessage,\n code: `HTTP ${response.status}`,\n })\n }\n\n const visaResult: VisaSettlementResponse = await response.json()\n\n // Map Visa response to the standard SettlePermissionsResult shape\n return {\n success: visaResult.success,\n transaction: visaResult.transaction,\n network: visaResult.network,\n payer: visaResult.payer,\n errorReason: visaResult.errorReason,\n }\n } catch (error) {\n if (error instanceof PaymentsError) {\n throw error\n }\n throw PaymentsError.fromBackend('Network error during Visa payment settlement', {\n message: error instanceof Error ? error.message : String(error),\n code: 'network_error',\n })\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visa Token API — generates x402 payment payloads via the Visa backend.
|
|
3
|
+
*
|
|
4
|
+
* Instead of generating a cryptographic NVM access token (which requires session keys
|
|
5
|
+
* and smart accounts), this API calls the Visa backend's /access-token endpoint
|
|
6
|
+
* with a vProvisionedTokenID + instructionId + amount to get a base64-encoded
|
|
7
|
+
* PaymentPayload suitable for the PAYMENT-SIGNATURE header.
|
|
8
|
+
*/
|
|
9
|
+
import { X402TokenAPI } from './token.js';
|
|
10
|
+
import { PaymentOptions } from '../common/types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Response from the Visa backend's /access-token endpoint
|
|
13
|
+
*/
|
|
14
|
+
export interface VisaPaymentPayloadResponse {
|
|
15
|
+
success: boolean;
|
|
16
|
+
payload?: unknown;
|
|
17
|
+
payloadEncoded?: string;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Visa Token API — generates payment payloads for Visa x402 flow.
|
|
22
|
+
*/
|
|
23
|
+
export declare class VisaTokenAPI extends X402TokenAPI {
|
|
24
|
+
protected visaBackendUrl: string;
|
|
25
|
+
constructor(options: PaymentOptions);
|
|
26
|
+
static getInstance(options: PaymentOptions): VisaTokenAPI;
|
|
27
|
+
/**
|
|
28
|
+
* Generate a Visa x402 payment payload.
|
|
29
|
+
*
|
|
30
|
+
* Calls the Visa backend's POST /access-token endpoint with the consumer's
|
|
31
|
+
* Visa credentials (vProvisionedTokenID + instructionId) and the required amount.
|
|
32
|
+
*
|
|
33
|
+
* @param vProvisionedTokenID - The Visa Token Service provisioned token ID
|
|
34
|
+
* @param instructionId - The VIC mandate instruction ID
|
|
35
|
+
* @param amount - The payment amount (e.g. "2.00")
|
|
36
|
+
* @returns A promise resolving to an object with `accessToken` (the base64-encoded PaymentPayload)
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const result = await payments.x402.getVisaAccessToken(
|
|
41
|
+
* 'token-id-from-visa',
|
|
42
|
+
* 'instruction-id-from-mandate',
|
|
43
|
+
* '2.00'
|
|
44
|
+
* )
|
|
45
|
+
* // Use result.accessToken as the PAYMENT-SIGNATURE header value
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
getVisaAccessToken(vProvisionedTokenID: string, instructionId: string, amount: string): Promise<{
|
|
49
|
+
accessToken: string;
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
}>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=visa-token-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visa-token-api.d.ts","sourceRoot":"","sources":["../../src/x402/visa-token-api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,SAAS,CAAC,cAAc,EAAE,MAAM,CAAA;gBAEpB,OAAO,EAAE,cAAc;WAKnB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY;IAIlE;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,kBAAkB,CACtB,mBAAmB,EAAE,MAAM,EAC3B,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAiDxD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visa Token API — generates x402 payment payloads via the Visa backend.
|
|
3
|
+
*
|
|
4
|
+
* Instead of generating a cryptographic NVM access token (which requires session keys
|
|
5
|
+
* and smart accounts), this API calls the Visa backend's /access-token endpoint
|
|
6
|
+
* with a vProvisionedTokenID + instructionId + amount to get a base64-encoded
|
|
7
|
+
* PaymentPayload suitable for the PAYMENT-SIGNATURE header.
|
|
8
|
+
*/
|
|
9
|
+
import { X402TokenAPI } from './token.js';
|
|
10
|
+
import { PaymentsError } from '../common/payments.error.js';
|
|
11
|
+
import { VisaBackendUrls } from '../environments.js';
|
|
12
|
+
/**
|
|
13
|
+
* Visa Token API — generates payment payloads for Visa x402 flow.
|
|
14
|
+
*/
|
|
15
|
+
export class VisaTokenAPI extends X402TokenAPI {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super(options);
|
|
18
|
+
this.visaBackendUrl = VisaBackendUrls[this.environmentName];
|
|
19
|
+
}
|
|
20
|
+
static getInstance(options) {
|
|
21
|
+
return new VisaTokenAPI(options);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate a Visa x402 payment payload.
|
|
25
|
+
*
|
|
26
|
+
* Calls the Visa backend's POST /access-token endpoint with the consumer's
|
|
27
|
+
* Visa credentials (vProvisionedTokenID + instructionId) and the required amount.
|
|
28
|
+
*
|
|
29
|
+
* @param vProvisionedTokenID - The Visa Token Service provisioned token ID
|
|
30
|
+
* @param instructionId - The VIC mandate instruction ID
|
|
31
|
+
* @param amount - The payment amount (e.g. "2.00")
|
|
32
|
+
* @returns A promise resolving to an object with `accessToken` (the base64-encoded PaymentPayload)
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const result = await payments.x402.getVisaAccessToken(
|
|
37
|
+
* 'token-id-from-visa',
|
|
38
|
+
* 'instruction-id-from-mandate',
|
|
39
|
+
* '2.00'
|
|
40
|
+
* )
|
|
41
|
+
* // Use result.accessToken as the PAYMENT-SIGNATURE header value
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
async getVisaAccessToken(vProvisionedTokenID, instructionId, amount) {
|
|
45
|
+
const url = new URL('access-token', this.visaBackendUrl);
|
|
46
|
+
const body = {
|
|
47
|
+
vProvisionedTokenID,
|
|
48
|
+
instructionId,
|
|
49
|
+
amount,
|
|
50
|
+
};
|
|
51
|
+
try {
|
|
52
|
+
const response = await fetch(url, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: {
|
|
55
|
+
Accept: 'application/json',
|
|
56
|
+
'Content-Type': 'application/json',
|
|
57
|
+
},
|
|
58
|
+
body: JSON.stringify(body),
|
|
59
|
+
});
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
let errorMessage = 'Failed to generate Visa payment payload';
|
|
62
|
+
try {
|
|
63
|
+
const errorData = await response.json();
|
|
64
|
+
errorMessage = errorData.error || errorData.message || errorMessage;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Use default error message
|
|
68
|
+
}
|
|
69
|
+
throw PaymentsError.internal(`${errorMessage} (HTTP ${response.status})`);
|
|
70
|
+
}
|
|
71
|
+
const result = await response.json();
|
|
72
|
+
if (!result.success || !result.payloadEncoded) {
|
|
73
|
+
throw PaymentsError.internal(result.error || 'Failed to generate Visa payment payload');
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
accessToken: result.payloadEncoded,
|
|
77
|
+
payload: result.payload,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error instanceof PaymentsError) {
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
throw PaymentsError.internal(`Network error while generating Visa payment payload: ${error instanceof Error ? error.message : String(error)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=visa-token-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visa-token-api.js","sourceRoot":"","sources":["../../src/x402/visa-token-api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAYpD;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,YAAY;IAG5C,YAAY,OAAuB;QACjC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,CAAU,WAAW,CAAC,OAAuB;QACjD,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,KAAK,CAAC,kBAAkB,CACtB,mBAA2B,EAC3B,aAAqB,EACrB,MAAc;QAEd,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;QAExD,MAAM,IAAI,GAAG;YACX,mBAAmB;YACnB,aAAa;YACb,MAAM;SACP,CAAA;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,MAAM,EAAE,kBAAkB;oBAC1B,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,YAAY,GAAG,yCAAyC,CAAA;gBAC5D,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;oBACvC,YAAY,GAAG,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,OAAO,IAAI,YAAY,CAAA;gBACrE,CAAC;gBAAC,MAAM,CAAC;oBACP,4BAA4B;gBAC9B,CAAC;gBACD,MAAM,aAAa,CAAC,QAAQ,CAAC,GAAG,YAAY,UAAU,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;YAC3E,CAAC;YAED,MAAM,MAAM,GAA+B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAEhE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC9C,MAAM,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,yCAAyC,CAAC,CAAA;YACzF,CAAC;YAED,OAAO;gBACL,WAAW,EAAE,MAAM,CAAC,cAAc;gBAClC,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBACnC,MAAM,KAAK,CAAA;YACb,CAAC;YACD,MAAM,aAAa,CAAC,QAAQ,CAC1B,wDAAwD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjH,CAAA;QACH,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * Visa Token API — generates x402 payment payloads via the Visa backend.\n *\n * Instead of generating a cryptographic NVM access token (which requires session keys\n * and smart accounts), this API calls the Visa backend's /access-token endpoint\n * with a vProvisionedTokenID + instructionId + amount to get a base64-encoded\n * PaymentPayload suitable for the PAYMENT-SIGNATURE header.\n */\n\nimport { X402TokenAPI } from './token.js'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { PaymentOptions } from '../common/types.js'\nimport { VisaBackendUrls } from '../environments.js'\n\n/**\n * Response from the Visa backend's /access-token endpoint\n */\nexport interface VisaPaymentPayloadResponse {\n success: boolean\n payload?: unknown\n payloadEncoded?: string\n error?: string\n}\n\n/**\n * Visa Token API — generates payment payloads for Visa x402 flow.\n */\nexport class VisaTokenAPI extends X402TokenAPI {\n protected visaBackendUrl: string\n\n constructor(options: PaymentOptions) {\n super(options)\n this.visaBackendUrl = VisaBackendUrls[this.environmentName]\n }\n\n static override getInstance(options: PaymentOptions): VisaTokenAPI {\n return new VisaTokenAPI(options)\n }\n\n /**\n * Generate a Visa x402 payment payload.\n *\n * Calls the Visa backend's POST /access-token endpoint with the consumer's\n * Visa credentials (vProvisionedTokenID + instructionId) and the required amount.\n *\n * @param vProvisionedTokenID - The Visa Token Service provisioned token ID\n * @param instructionId - The VIC mandate instruction ID\n * @param amount - The payment amount (e.g. \"2.00\")\n * @returns A promise resolving to an object with `accessToken` (the base64-encoded PaymentPayload)\n *\n * @example\n * ```typescript\n * const result = await payments.x402.getVisaAccessToken(\n * 'token-id-from-visa',\n * 'instruction-id-from-mandate',\n * '2.00'\n * )\n * // Use result.accessToken as the PAYMENT-SIGNATURE header value\n * ```\n */\n async getVisaAccessToken(\n vProvisionedTokenID: string,\n instructionId: string,\n amount: string,\n ): Promise<{ accessToken: string; [key: string]: any }> {\n const url = new URL('access-token', this.visaBackendUrl)\n\n const body = {\n vProvisionedTokenID,\n instructionId,\n amount,\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n let errorMessage = 'Failed to generate Visa payment payload'\n try {\n const errorData = await response.json()\n errorMessage = errorData.error || errorData.message || errorMessage\n } catch {\n // Use default error message\n }\n throw PaymentsError.internal(`${errorMessage} (HTTP ${response.status})`)\n }\n\n const result: VisaPaymentPayloadResponse = await response.json()\n\n if (!result.success || !result.payloadEncoded) {\n throw PaymentsError.internal(result.error || 'Failed to generate Visa payment payload')\n }\n\n return {\n accessToken: result.payloadEncoded,\n payload: result.payload,\n }\n } catch (error) {\n if (error instanceof PaymentsError) {\n throw error\n }\n throw PaymentsError.internal(\n `Network error while generating Visa payment payload: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n}\n"]}
|