@nevermined-io/payments 1.1.2 → 1.1.4
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/dist/a2a/paymentsRequestHandler.d.ts.map +1 -1
- package/dist/a2a/paymentsRequestHandler.js +2 -0
- package/dist/a2a/paymentsRequestHandler.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +1 -0
- package/dist/a2a/server.js.map +1 -1
- package/dist/api/base-payments.d.ts +5 -0
- package/dist/api/base-payments.d.ts.map +1 -1
- package/dist/api/base-payments.js +7 -0
- package/dist/api/base-payments.js.map +1 -1
- package/dist/common/types.d.ts +11 -1
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/types.js +25 -1
- package/dist/common/types.js.map +1 -1
- package/dist/mcp/core/auth.d.ts.map +1 -1
- package/dist/mcp/core/auth.js +1 -0
- package/dist/mcp/core/auth.js.map +1 -1
- package/dist/mcp/core/paywall.d.ts.map +1 -1
- package/dist/mcp/core/paywall.js +2 -0
- package/dist/mcp/core/paywall.js.map +1 -1
- package/dist/x402/express/middleware.d.ts.map +1 -1
- package/dist/x402/express/middleware.js +1 -0
- package/dist/x402/express/middleware.js.map +1 -1
- package/dist/x402/facilitator-api.d.ts +2 -0
- package/dist/x402/facilitator-api.d.ts.map +1 -1
- package/dist/x402/facilitator-api.js +3 -3
- package/dist/x402/facilitator-api.js.map +1 -1
- package/dist/x402/index.d.ts +1 -1
- package/dist/x402/index.d.ts.map +1 -1
- package/dist/x402/index.js +1 -1
- package/dist/x402/index.js.map +1 -1
- package/dist/x402/token.d.ts.map +1 -1
- package/dist/x402/token.js +2 -2
- package/dist/x402/token.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paymentsRequestHandler.d.ts","sourceRoot":"","sources":["../../src/a2a/paymentsRequestHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,iBAAiB,EAEjB,IAAI,EACJ,uBAAuB,EACvB,YAAY,EAEZ,qBAAqB,EACtB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC7E,OAAO,EAEL,aAAa,EACb,qBAAqB,EAErB,mBAAmB,EACnB,aAAa,EACd,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,iBAAiB,EAAiB,MAAM,oBAAoB,CAAA;AAIrE,OAAO,KAAK,EAEV,cAAc,EAEd,kBAAkB,EAGnB,MAAM,YAAY,CAAA;AAInB;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,8CAA8C;IAC9C,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iFAAiF;IACjF,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,qBAAqB;IAC/D,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,mBAAmB,CAA6C;IACxE,OAAO,CAAC,sBAAsB,CAA6C;IAC3E,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,oBAAoB,CAAC,CAAQ;IAErC;;;;OAIG;IACI,+BAA+B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB;IAIjF;;;;OAIG;IACI,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB;IAI3E;;;;;;;OAOG;gBAED,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,GAAG,EACpB,eAAe,CAAC,EAAE,wBAAwB,EAC1C,OAAO,CAAC,EAAE,6BAA6B;IASzC;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAIpC;;;;OAIG;IACH,OAAO,CAAC,+BAA+B;IAIvC;;;OAGG;IACI,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5D;;;;OAIG;IACI,iBAAiB,IAAI,6BAA6B;IAQzD;;;;;;;;OAQG;IACU,eAAe,CAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"paymentsRequestHandler.d.ts","sourceRoot":"","sources":["../../src/a2a/paymentsRequestHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,iBAAiB,EAEjB,IAAI,EACJ,uBAAuB,EACvB,YAAY,EAEZ,qBAAqB,EACtB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC7E,OAAO,EAEL,aAAa,EACb,qBAAqB,EAErB,mBAAmB,EACnB,aAAa,EACd,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,iBAAiB,EAAiB,MAAM,oBAAoB,CAAA;AAIrE,OAAO,KAAK,EAEV,cAAc,EAEd,kBAAkB,EAGnB,MAAM,YAAY,CAAA;AAInB;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,8CAA8C;IAC9C,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iFAAiF;IACjF,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,qBAAqB;IAC/D,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,mBAAmB,CAA6C;IACxE,OAAO,CAAC,sBAAsB,CAA6C;IAC3E,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,oBAAoB,CAAC,CAAQ;IAErC;;;;OAIG;IACI,+BAA+B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB;IAIjF;;;;OAIG;IACI,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB;IAI3E;;;;;;;OAOG;gBAED,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,GAAG,EACpB,eAAe,CAAC,EAAE,wBAAwB,EAC1C,OAAO,CAAC,EAAE,6BAA6B;IASzC;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAIpC;;;;OAIG;IACH,OAAO,CAAC,+BAA+B;IAIvC;;;OAGG;IACI,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5D;;;;OAIG;IACI,iBAAiB,IAAI,6BAA6B;IAQzD;;;;;;;;OAQG;IACU,eAAe,CAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC;IAwDf;;;;;OAKG;YACW,mBAAmB;IAgBjC;;;;;;;OAOG;YACW,iBAAiB;IA2C/B;;;;;;OAMG;YACW,4BAA4B;IAuG1C;;;;;;;;;OASG;cACc,sCAAsC,CACrD,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,mBAAmB,EAC/B,WAAW,EAAE,MAAM,GAClB,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC;IA2ElD;;;OAGG;cACa,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,mBAAmB,EAC/B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,iBAAiB,EAC7B,OAAO,CAAC,EAAE;QACR,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;QAC1C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;KACzC;IAuCH;;;;;;OAMG;IACG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA+FrE;;;;;;;;OAQG;YACW,sBAAsB;IAwEpC;;;;;OAKG;IACI,iBAAiB,CACtB,MAAM,EAAE,iBAAiB,GACxB,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC;IAoDlD;;;;;;OAMG;YACW,oBAAoB;IAoClC;;;;OAIG;IACI,0CAA0C,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ1F;;;OAGG;IACI,kCAAkC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIlE;;;OAGG;IACH,SAAS,CAAC,YAAY,IAAI,SAAS;IAInC;;;OAGG;IACH,SAAS,CAAC,kBAAkB,IAAI,wBAAwB;IAIxD;;;OAGG;cACa,wBAAwB,CACtC,eAAe,EAAE,GAAG,EACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,GAAG,CAAC;IAIf;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG;IAIhD;;;;;OAKG;IACI,WAAW,CAChB,MAAM,EAAE,YAAY,GACnB,cAAc,CAAC,IAAI,GAAG,qBAAqB,GAAG,uBAAuB,EAAE,IAAI,EAAE,SAAS,CAAC;CA8D3F"}
|
|
@@ -115,6 +115,7 @@ export class PaymentsRequestHandler extends DefaultRequestHandler {
|
|
|
115
115
|
agentId,
|
|
116
116
|
httpVerb,
|
|
117
117
|
scheme,
|
|
118
|
+
environment: this.paymentsService.getEnvironmentName(),
|
|
118
119
|
});
|
|
119
120
|
const result = await this.paymentsService.facilitator.verifyPermissions({
|
|
120
121
|
paymentRequired,
|
|
@@ -178,6 +179,7 @@ export class PaymentsRequestHandler extends DefaultRequestHandler {
|
|
|
178
179
|
agentId,
|
|
179
180
|
httpVerb: httpContext?.httpMethodRequested,
|
|
180
181
|
scheme,
|
|
182
|
+
environment: this.paymentsService.getEnvironmentName(),
|
|
181
183
|
});
|
|
182
184
|
return await this.paymentsService.facilitator.settlePermissions({
|
|
183
185
|
paymentRequired,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paymentsRequestHandler.js","sourceRoot":"","sources":["../../src/a2a/paymentsRequestHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AgentCard,\n Message,\n MessageSendParams,\n PushNotificationConfig,\n Task,\n TaskArtifactUpdateEvent,\n TaskIdParams,\n TaskState,\n TaskStatusUpdateEvent,\n} from '@a2a-js/sdk'\nimport type { ExecutionEventBusManager, TaskStore } from '@a2a-js/sdk/server'\nimport {\n A2AError,\n AgentExecutor,\n DefaultRequestHandler,\n ExecutionEventBus,\n ExecutionEventQueue,\n ResultManager,\n} from '@a2a-js/sdk/server'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { StartAgentRequest, isValidScheme } from '../common/types.js'\nimport { Payments } from '../payments.js'\nimport { decodeAccessToken } from '../utils.js'\nimport { buildPaymentRequired, type X402PaymentRequired } from '../x402/facilitator-api.js'\nimport type {\n A2AAuthResult,\n A2AStreamEvent,\n AgentRequestContext,\n HttpRequestContext,\n PaymentRedemptionConfig,\n PaymentsRequestContext,\n} from './types.js'\n\nconst terminalStates: TaskState[] = ['completed', 'failed', 'canceled', 'rejected']\n\n/**\n * Options for configuring the PaymentsRequestHandler\n */\nexport interface PaymentsRequestHandlerOptions {\n /** Whether to execute tasks asynchronously */\n asyncExecution?: boolean\n /** Default batch mode for all requests (can be overridden per-request) */\n defaultBatch?: boolean\n /** Default margin percentage for all requests (can be overridden per-request) */\n defaultMarginPercent?: number\n}\n\n/**\n * PaymentsRequestHandler extends DefaultRequestHandler to add payments validation and burning.\n * It validates credits before executing a task and burns credits after successful execution.\n * It also sends push notifications when a task reaches a terminal state.\n * @param options - Handler options, including asyncExecution, defaultBatch, and defaultMarginPercent\n */\nexport class PaymentsRequestHandler extends DefaultRequestHandler {\n private paymentsService: Payments\n private httpContextByTaskId: Map<string, HttpRequestContext> = new Map()\n private httpContextByMessageId: Map<string, HttpRequestContext> = new Map()\n private asyncExecution: boolean\n private defaultBatch: boolean\n private defaultMarginPercent?: number\n\n /**\n * Store HTTP context temporarily by messageId (used in middleware when taskId is not yet available).\n * @param messageId - The messageId from the incoming message\n * @param ctx - The HTTP context (bearerToken, url, method)\n */\n public setHttpRequestContextForMessage(messageId: string, ctx: HttpRequestContext) {\n this.httpContextByMessageId.set(messageId, ctx)\n }\n\n /**\n * Store HTTP context by taskId (used in middleware when taskId is available).\n * @param taskId - The taskId of the task\n * @param ctx - The HTTP context (bearerToken, url, method)\n */\n public setHttpRequestContextForTask(taskId: string, ctx: HttpRequestContext) {\n this.httpContextByTaskId.set(taskId, ctx)\n }\n\n /**\n * @param agentCard - The agent card\n * @param taskStore - The task store\n * @param agentExecutor - The business logic executor\n * @param paymentsService - The payments service for validation and burning\n * @param eventBusManager - The event bus manager (optional)\n * @param options - Handler options (asyncExecution, defaultBatch, defaultMarginPercent)\n */\n constructor(\n agentCard: AgentCard,\n taskStore: TaskStore,\n agentExecutor: AgentExecutor,\n paymentsService: any,\n eventBusManager?: ExecutionEventBusManager,\n options?: PaymentsRequestHandlerOptions,\n ) {\n super(agentCard, taskStore, agentExecutor, eventBusManager)\n this.paymentsService = paymentsService\n this.asyncExecution = options?.asyncExecution ?? false\n this.defaultBatch = options?.defaultBatch ?? false\n this.defaultMarginPercent = options?.defaultMarginPercent\n }\n\n /**\n * Retrieve the HTTP context for a given taskId.\n * @param taskId - The taskId of the task\n * @returns The HTTP context (bearerToken, url, method) or undefined\n */\n private getHttpRequestContextForTask(taskId: string): HttpRequestContext | undefined {\n return this.httpContextByTaskId.get(taskId)\n }\n\n /**\n * Retrieve the HTTP context for a given messageId.\n * @param messageId - The messageId of the message\n * @returns The HTTP context (bearerToken, url, method) or undefined\n */\n private getHttpRequestContextForMessage(messageId: string): HttpRequestContext | undefined {\n return this.httpContextByMessageId.get(messageId)\n }\n\n /**\n * Deletes the HTTP context associated with a taskId.\n * @param taskId - The taskId to delete context for\n */\n public deleteHttpRequestContextForTask(taskId: string): void {\n this.httpContextByTaskId.delete(taskId)\n }\n\n /**\n * Get the handler options (defaultBatch, defaultMarginPercent).\n * Used by middleware to determine default redemption behavior.\n * @returns The handler options\n */\n public getHandlerOptions(): PaymentsRequestHandlerOptions {\n return {\n asyncExecution: this.asyncExecution,\n defaultBatch: this.defaultBatch,\n defaultMarginPercent: this.defaultMarginPercent,\n }\n }\n\n /**\n * Validates a request using the x402 payments service.\n * This method is used by the middleware to validate credits before processing requests.\n *\n * @param bearerToken - The bearer token for authentication\n * @param endpoint - Optional endpoint URL being requested\n * @param httpVerb - Optional HTTP method being used\n * @returns Promise resolving to the validation result\n */\n public async validateRequest(\n bearerToken: string,\n endpoint?: string,\n httpVerb?: string,\n ): Promise<any> {\n let planId: string | undefined\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n if (paymentExtension) {\n planId = paymentExtension.params?.planId as string\n }\n\n const decodedAccessToken = decodeAccessToken(bearerToken)\n\n if (!decodedAccessToken) {\n throw PaymentsError.unauthorized('Invalid access token.')\n }\n\n if (!planId) {\n throw PaymentsError.unauthorized('Plan ID not found in agent card.')\n }\n\n // Extract subscriberAddress from token (payload.authorization.from per x402 spec)\n const subscriberAddress = decodedAccessToken.payload?.authorization?.from\n\n if (!subscriberAddress) {\n throw PaymentsError.unauthorized(\n 'Cannot determine subscriberAddress from token (expected payload.authorization.from)',\n )\n }\n\n const agentId = paymentExtension?.params?.agentId as string | undefined\n const scheme = isValidScheme(decodedAccessToken.accepted?.scheme) ? decodedAccessToken.accepted.scheme : 'nvm:erc4337'\n\n const paymentRequired: X402PaymentRequired = buildPaymentRequired(planId, {\n endpoint: endpoint || '',\n agentId,\n httpVerb,\n scheme,\n })\n\n const result = await this.paymentsService.facilitator.verifyPermissions({\n paymentRequired,\n x402AccessToken: bearerToken,\n maxAmount: 1n,\n })\n if (!result.isValid) {\n throw PaymentsError.unauthorized('Permission verification failed.')\n }\n return {\n success: true,\n planId,\n subscriberAddress,\n balance: { isSubscriber: true },\n }\n }\n\n /**\n * Gets redemption configuration for a task based on AgentCard and handler defaults.\n * The configuration is determined by the server, not by client metadata.\n *\n * @returns The redemption configuration\n */\n private async getRedemptionConfig(): Promise<PaymentRedemptionConfig> {\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n\n const agentConfig =\n (paymentExtension?.params?.redemptionConfig as PaymentRedemptionConfig) || {}\n\n return {\n useBatch: agentConfig.useBatch ?? this.defaultBatch ?? false,\n useMargin: agentConfig.useMargin ?? false,\n marginPercent: agentConfig.marginPercent ?? this.defaultMarginPercent,\n }\n }\n\n /**\n * Determines the appropriate redemption method based on server configuration.\n *\n * @param bearerToken - The bearer token for authentication\n * @param creditsUsed - The number of credits to burn\n * @param httpContext - Optional HTTP context with endpoint and method information\n * @returns Promise resolving to the redemption result\n */\n private async executeRedemption(\n bearerToken: string,\n creditsUsed: bigint | number,\n httpContext?: HttpRequestContext,\n ): Promise<any> {\n const decodedAccessToken = decodeAccessToken(bearerToken)\n if (!decodedAccessToken) {\n throw PaymentsError.unauthorized('Invalid access token.')\n }\n\n let planId: string | undefined\n let agentId: string | undefined\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n if (paymentExtension) {\n planId = paymentExtension.params?.planId as string | undefined\n agentId = paymentExtension.params?.agentId as string | undefined\n }\n\n if (!planId) {\n throw PaymentsError.unauthorized('Plan ID not found in agent card.')\n }\n\n const scheme = isValidScheme(decodedAccessToken.accepted?.scheme) ? decodedAccessToken.accepted.scheme : 'nvm:erc4337'\n\n // Build paymentRequired using the helper\n const paymentRequired = buildPaymentRequired(planId, {\n endpoint: httpContext?.urlRequested,\n agentId,\n httpVerb: httpContext?.httpMethodRequested,\n scheme,\n })\n\n return await this.paymentsService.facilitator.settlePermissions({\n paymentRequired,\n x402AccessToken: bearerToken,\n maxAmount: BigInt(creditsUsed),\n })\n }\n\n /**\n * Creates PaymentsRequestContext from message parameters.\n * This method handles HTTP context retrieval, validation, and context creation.\n * @param params - Message send parameters\n * @param isStreaming - Whether this is for streaming (affects createRequestContext call)\n * @returns Object containing PaymentsRequestContext and related data\n */\n private async createPaymentsRequestContext(\n params: MessageSendParams,\n isStreaming = false,\n ): Promise<{\n paymentsRequestContext: PaymentsRequestContext\n taskId: string\n httpContext: HttpRequestContext\n bearerToken: string\n validation: StartAgentRequest\n requestContext: any\n finalMessageForAgent: Message\n eventBus: ExecutionEventBus\n eventQueue: ExecutionEventQueue\n resultManager: ResultManager\n }> {\n // Validate required parameters before any processing\n const missingParam = !params.message\n ? 'message'\n : !params.message.messageId\n ? 'message.messageId'\n : null\n if (missingParam) {\n throw A2AError.invalidParams(`${missingParam} is required.`)\n }\n\n // 1. Get HTTP context for the task or message\n let taskId = params.message.taskId\n let httpContext: HttpRequestContext | undefined\n if (taskId) {\n httpContext = this.getHttpRequestContextForTask(taskId)\n } else {\n const messageId = params.message.messageId\n httpContext = this.getHttpRequestContextForMessage(messageId)\n }\n\n if (!httpContext) {\n throw A2AError.internalError('HTTP context not found for task or message.')\n }\n\n // 2. Extract bearer token and validate presence of required fields\n const { bearerToken, validation } = httpContext\n if (!bearerToken) {\n throw PaymentsError.unauthorized('Missing bearer token for payment validation.')\n }\n\n // 3. Validate credits before executing the task\n const agentCard = await this.getAgentCard()\n const agentId = agentCard.capabilities?.extensions?.find(\n (ext) => ext.uri === 'urn:nevermined:payment',\n )?.params?.agentId\n if (!agentId) {\n throw A2AError.internalError('Agent ID not found in payment extension.')\n }\n\n // 4. Generate taskId if not present and migrate HTTP context\n const incomingMessage = params.message\n if (!taskId) {\n taskId = uuidv4()\n this.migrateHttpRequestContextFromMessageToTask(params.message.messageId, taskId)\n }\n\n // 5. Instantiate ResultManager and eventBus\n const resultManager = new ResultManager(this.getTaskStore())\n resultManager.setContext(incomingMessage)\n const requestContext = await this.callCreateRequestContext(incomingMessage, taskId, isStreaming)\n const finalMessageForAgent = requestContext.userMessage\n const eventBus = this.getEventBusManager().createOrGetByTaskId(taskId)\n const eventQueue = new ExecutionEventQueue(eventBus)\n\n // 6. Create PaymentsRequestContext\n const authResult: A2AAuthResult = {\n requestId: validation.agentRequestId,\n token: bearerToken,\n agentId: validation.agentId,\n agentRequest: validation,\n }\n\n const agentRequestContext: AgentRequestContext = {\n authResult,\n httpContext,\n paymentsService: this.paymentsService,\n }\n\n // 7. Create extended request context with agent request data\n const paymentsRequestContext: PaymentsRequestContext = {\n ...requestContext,\n payments: agentRequestContext,\n }\n\n return {\n paymentsRequestContext,\n taskId,\n httpContext,\n bearerToken,\n validation,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n }\n }\n\n /**\n * Processes streaming events with finalization (credits burning and push notifications).\n * Similar to processEventsWithFinalization but yields events for streaming.\n * @param taskId - The task ID\n * @param resultManager - The result manager\n * @param eventQueue - The event queue\n * @param bearerToken - The bearer token\n * @param validation - The validation result\n * @returns Async generator yielding processed events\n */\n protected async *processStreamingEventsWithFinalization(\n taskId: string,\n resultManager: ResultManager,\n eventQueue: ExecutionEventQueue,\n bearerToken: string,\n ): AsyncGenerator<A2AStreamEvent, void, undefined> {\n try {\n for await (const event of eventQueue.events()) {\n await resultManager.processEvent(event)\n yield event\n\n if (\n event.kind === 'status-update' &&\n event.final &&\n event?.metadata?.creditsUsed !== undefined &&\n event?.metadata?.creditsUsed !== null &&\n bearerToken &&\n (typeof event.metadata.creditsUsed === 'string' ||\n typeof event.metadata.creditsUsed === 'number' ||\n typeof event.metadata.creditsUsed === 'bigint')\n ) {\n try {\n // Get redemption configuration from server (not from client metadata)\n const redemptionConfig = await this.getRedemptionConfig()\n\n if (!redemptionConfig.useBatch) {\n // Get HTTP context if available\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n // Execute redemption with server configuration for non-batch requests\n const response = await this.executeRedemption(\n bearerToken,\n BigInt(event.metadata.creditsUsed),\n httpContext,\n )\n\n // Update event metadata with response data\n if (response && event.metadata) {\n event.metadata.txHash = response.txHash\n event.metadata.creditsCharged = response.amountOfCredits\n ? Number(response.amountOfCredits)\n : event.metadata.creditsUsed\n }\n }\n } catch (err) {\n // Do nothing\n }\n }\n\n // Handle push notification\n if (\n event.kind === 'status-update' &&\n event.final &&\n event.status?.state &&\n terminalStates.includes(event.status.state)\n ) {\n try {\n const taskPushNotificationConfig = await this.getTaskPushNotificationConfig({\n id: event.taskId,\n })\n if (taskPushNotificationConfig) {\n await this.sendPushNotification(\n event.taskId,\n event.status.state,\n taskPushNotificationConfig.pushNotificationConfig,\n {\n contextId: event.contextId,\n },\n )\n }\n } catch (err) {\n // Do nothing\n }\n }\n }\n } finally {\n // Cleanup when the stream is fully consumed or breaks\n //this.getEventBusManager().cleanupByTaskId(taskId)\n }\n }\n\n /**\n * Processes all events, calling handleTaskFinalization when a terminal status-update event is received.\n * In async mode, it can be launched in background.\n */\n protected async processEventsWithFinalization(\n taskId: string,\n resultManager: ResultManager,\n eventQueue: ExecutionEventQueue,\n bearerToken: string,\n validation: StartAgentRequest,\n options?: {\n firstResultResolver?: (event: any) => void\n firstResultRejector?: (err: any) => void\n },\n ) {\n let firstResultSent = false\n try {\n for await (const event of eventQueue.events()) {\n // Handle redemption before processing the event\n if (\n event.kind === 'status-update' &&\n event.final &&\n terminalStates.includes(event.status?.state)\n ) {\n // Get HTTP context if available\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n await this.handleTaskFinalization(resultManager, event, bearerToken, httpContext)\n }\n\n await resultManager.processEvent(event)\n if (options?.firstResultResolver && !firstResultSent) {\n if (event.kind === 'message' || event.kind === 'task') {\n options.firstResultResolver(event)\n firstResultSent = true\n }\n }\n }\n if (options?.firstResultRejector && !firstResultSent) {\n options.firstResultRejector(\n A2AError.internalError('Execution finished before a message or task was produced.'),\n )\n }\n } catch (error) {\n if (options?.firstResultRejector && !firstResultSent) {\n options.firstResultRejector(error)\n }\n throw error\n } finally {\n this.getEventBusManager().cleanupByTaskId(taskId)\n }\n }\n\n /**\n * Sends a message, validating credits before execution and burning credits after.\n * Also sends a push notification if the task reaches a terminal state.\n * This method overrides the parent implementation to allow eventBus subscription before agent execution.\n * @param params - Message send parameters\n * @returns The resulting message or task\n */\n async sendMessage(params: MessageSendParams): Promise<Message | Task> {\n // Create PaymentsRequestContext and related data\n const {\n paymentsRequestContext,\n taskId,\n bearerToken,\n validation,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n } = await this.createPaymentsRequestContext(params, false)\n\n // Execute agent with extended context\n ;(this as any).agentExecutor\n .execute(paymentsRequestContext as any, eventBus)\n .catch((err: any) => {\n const errorTask: Task = {\n id: requestContext.task?.id || uuidv4(),\n contextId: finalMessageForAgent.contextId || uuidv4(),\n status: {\n state: 'failed',\n message: {\n kind: 'message',\n role: 'agent',\n messageId: uuidv4(),\n parts: [{ kind: 'text', text: `Agent execution error: ${err.message}` }],\n taskId: requestContext.task?.id,\n contextId: finalMessageForAgent.contextId,\n },\n timestamp: new Date().toISOString(),\n },\n history: requestContext.task?.history ? [...requestContext.task.history] : [],\n kind: 'task',\n }\n if (finalMessageForAgent) {\n if (\n !errorTask.history?.find((m: any) => m.messageId === finalMessageForAgent.messageId)\n ) {\n errorTask.history?.push(finalMessageForAgent)\n }\n }\n eventBus.publish(errorTask)\n eventBus.publish({\n kind: 'status-update',\n taskId: errorTask.id,\n contextId: errorTask.contextId,\n status: errorTask.status,\n final: true,\n })\n eventBus.finished()\n })\n\n // Determine if execution should be blocking based on client request\n // The blocking parameter comes from params.configuration.blocking\n const isBlocking = params.configuration?.blocking !== false // Default to blocking if not specified\n\n if (isBlocking) {\n await this.processEventsWithFinalization(\n taskId,\n resultManager,\n eventQueue,\n bearerToken,\n validation,\n )\n const finalResult = resultManager.getFinalResult()\n if (!finalResult) {\n throw A2AError.internalError(\n 'Agent execution finished without a result, and no task context found.',\n )\n }\n return finalResult\n } else {\n // Non-blocking execution - return immediately with first result\n if (!taskId) {\n throw A2AError.internalError('Task ID is required for non-blocking execution.')\n }\n const validTaskId = taskId\n return new Promise((resolve, reject) => {\n this.processEventsWithFinalization(\n validTaskId,\n resultManager,\n eventQueue,\n bearerToken,\n validation,\n {\n firstResultResolver: resolve,\n firstResultRejector: reject,\n },\n )\n })\n }\n }\n\n /**\n * Handles credits burning and push notification when a task reaches a terminal state.\n * This is called asynchronously from the eventBus listener.\n * Supports batch and margin-based redemptions based on server configuration.\n * @param resultManager - The result manager\n * @param event - The status-update event with final state\n * @param bearerToken - The bearer token for payment validation\n * @param validation - The validation result from the request\n */\n private async handleTaskFinalization(\n resultManager: ResultManager,\n event: TaskStatusUpdateEvent,\n bearerToken: string,\n httpContext?: HttpRequestContext,\n ) {\n const creditsToBurn = event.metadata?.creditsUsed\n if (\n creditsToBurn !== undefined &&\n creditsToBurn !== null &&\n bearerToken &&\n (typeof creditsToBurn === 'string' ||\n typeof creditsToBurn === 'number' ||\n typeof creditsToBurn === 'bigint')\n ) {\n try {\n // Get redemption configuration from server (not from client metadata)\n const redemptionConfig = await this.getRedemptionConfig()\n\n if (!redemptionConfig.useBatch) {\n // Execute redemption with server configuration for non-batch requests\n const response = await this.executeRedemption(\n bearerToken,\n BigInt(creditsToBurn),\n httpContext,\n )\n\n // Update event metadata with redemption results\n event.metadata = {\n ...event.metadata,\n txHash: response.txHash,\n // Store the actual credits charged (especially important for margin-based)\n creditsCharged: response.amountOfCredits\n ? Number(response.amountOfCredits)\n : creditsToBurn,\n }\n }\n\n // Always update task metadata and process the task\n const task = resultManager.getCurrentTask()\n if (task) {\n // Update task metadata with current event metadata (from executor or redemption)\n task.metadata = {\n ...task.metadata,\n ...event.metadata,\n }\n\n await resultManager.processEvent(task)\n // Delete http context associated with the task\n this.deleteHttpRequestContextForTask(event.taskId)\n }\n } catch (err) {\n // Do nothing\n }\n }\n try {\n const taskPushNotificationConfig = await this.getTaskPushNotificationConfig({\n id: event.taskId,\n })\n if (taskPushNotificationConfig) {\n await this.sendPushNotification(\n event.taskId,\n event.status.state,\n taskPushNotificationConfig.pushNotificationConfig,\n { contextId: event.contextId },\n )\n }\n } catch (err) {\n // Do nothing\n }\n }\n\n /**\n * Streams messages and events for a task, with payments validation.\n * Also sends a push notification if a terminal status-update event is emitted.\n * @param params - Message send parameters\n * @returns Async generator of events\n */\n async *sendMessageStream(\n params: MessageSendParams,\n ): AsyncGenerator<A2AStreamEvent, void, undefined> {\n // Create PaymentsRequestContext and related data\n const {\n paymentsRequestContext,\n taskId,\n bearerToken,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n } = await this.createPaymentsRequestContext(params, true)\n\n // Execute agent with extended context\n ;(this as any).agentExecutor\n .execute(paymentsRequestContext as any, eventBus)\n .catch((err: any) => {\n console.error(\n `Agent execution failed for stream message ${finalMessageForAgent.messageId}:`,\n err,\n )\n const contextId = finalMessageForAgent.contextId || uuidv4()\n const errorTaskStatus: TaskStatusUpdateEvent = {\n kind: 'status-update',\n taskId: requestContext.task?.id || uuidv4(),\n contextId,\n status: {\n state: 'failed',\n message: {\n kind: 'message',\n role: 'agent',\n messageId: uuidv4(),\n parts: [{ kind: 'text', text: `Agent execution error: ${err.message}` }],\n taskId: requestContext.task?.id,\n contextId,\n },\n timestamp: new Date().toISOString(),\n },\n final: true,\n }\n eventBus.publish(errorTaskStatus)\n })\n\n // Process streaming events with finalization\n yield* this.processStreamingEventsWithFinalization(\n taskId,\n resultManager,\n eventQueue,\n bearerToken,\n )\n }\n\n /**\n * Sends a push notification when a task reaches a terminal state.\n * @param taskId - The task ID\n * @param state - The terminal state\n * @param pushNotificationConfig - The push notification configuration\n * @param payload - Additional payload to include in the notification\n */\n private async sendPushNotification(\n taskId: string,\n state: TaskState,\n pushNotificationConfig: PushNotificationConfig,\n payload: Record<string, any> = {},\n ) {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n if (pushNotificationConfig.authentication) {\n if (pushNotificationConfig.authentication.schemes.includes('basic')) {\n const basic = Buffer.from(`${pushNotificationConfig.authentication.credentials}`).toString(\n 'base64',\n )\n headers['Authorization'] = `Basic ${basic}`\n } else if (pushNotificationConfig.authentication.schemes.includes('bearer')) {\n headers['Authorization'] = `Bearer ${pushNotificationConfig.authentication.credentials}`\n } else if (pushNotificationConfig.authentication.schemes.includes('custom')) {\n Object.assign(headers, pushNotificationConfig.authentication.credentials)\n }\n }\n const body = JSON.stringify({\n taskId,\n state,\n payload,\n })\n const response = await fetch(pushNotificationConfig.url, {\n method: 'POST',\n headers,\n body,\n })\n if (!response.ok) {\n throw A2AError.internalError('Failed to send push notification.')\n }\n }\n\n /**\n * Migrates the HTTP context from a messageId to a taskId and deletes the temporary messageId context.\n * @param messageId - The messageId to migrate from\n * @param taskId - The taskId to migrate to\n */\n public migrateHttpRequestContextFromMessageToTask(messageId: string, taskId: string): void {\n const ctx = this.getHttpRequestContextForMessage(messageId)\n if (ctx) {\n this.setHttpRequestContextForTask(taskId, ctx)\n this.deleteHttpRequestContextForMessage(messageId)\n }\n }\n\n /**\n * Deletes the HTTP context associated with a messageId.\n * @param messageId - The messageId to delete context for\n */\n public deleteHttpRequestContextForMessage(messageId: string): void {\n this.httpContextByMessageId.delete(messageId)\n }\n\n /**\n * Protected getter to access the private taskStore property from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected getTaskStore(): TaskStore {\n return (this as any).taskStore as TaskStore\n }\n\n /**\n * Protected getter to access the private eventBusManager property from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected getEventBusManager(): ExecutionEventBusManager {\n return (this as any).eventBusManager as ExecutionEventBusManager\n }\n\n /**\n * Protected getter to access the private _createRequestContext method from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected async callCreateRequestContext(\n incomingMessage: any,\n taskId: string,\n isStream: boolean,\n ): Promise<any> {\n return await (this as any)._createRequestContext(incomingMessage, taskId, isStream)\n }\n\n /**\n * Protected getter to access the private _processEvents method from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected callProcessEvents(...args: any[]): any {\n return (this as any)._processEvents.apply(this, args)\n }\n\n /**\n * Resubscribes to a task's event stream, ensuring the task has updated metadata before yielding.\n * This method overrides the parent implementation to ensure metadata is updated before yielding.\n * @param params - Parameters containing the taskId\n * @returns Async generator of events\n */\n async *resubscribe(\n params: TaskIdParams,\n ): AsyncGenerator<Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent, void, undefined> {\n const task = await this.getTaskStore().load(params.id)\n if (!task) {\n throw A2AError.taskNotFound(params.id)\n }\n\n // Yield task immediately (with current metadata)\n yield task\n\n const finalStates: TaskState[] = ['completed', 'failed', 'canceled', 'rejected']\n if (finalStates.includes(task.status.state)) {\n return\n }\n\n const eventBus = this.getEventBusManager().getByTaskId(params.id)\n if (!eventBus) {\n console.warn(`Resubscribe: No active event bus for task ${params.id}.`)\n return\n }\n\n const eventQueue = new ExecutionEventQueue(eventBus)\n try {\n for await (const event of eventQueue.events()) {\n // Process event with ResultManager to ensure task is saved\n const resultManager = new ResultManager(this.getTaskStore())\n // Set context from task history if available\n if (task.history && task.history.length > 0) {\n resultManager.setContext(task.history[0])\n }\n await resultManager.processEvent(event)\n\n // Handle redemption and push notification for final status-update events\n if (\n event.kind === 'status-update' &&\n event.final &&\n event.taskId === params.id &&\n terminalStates.includes(event.status?.state)\n ) {\n // Get HTTP context for this task\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n if (httpContext) {\n const { bearerToken, validation } = httpContext\n if (bearerToken && validation) {\n // Handle task finalization (redemption and push notification)\n await this.handleTaskFinalization(resultManager, event, bearerToken, httpContext)\n }\n }\n }\n\n // Yield event after processing (so metadata is updated)\n if (event.kind === 'status-update' && event.taskId === params.id) {\n yield event\n } else if (event.kind === 'artifact-update' && event.taskId === params.id) {\n yield event\n } else if (event.kind === 'task' && event.id === params.id) {\n yield event\n }\n }\n } finally {\n eventQueue.stop()\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"paymentsRequestHandler.js","sourceRoot":"","sources":["../../src/a2a/paymentsRequestHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AgentCard,\n Message,\n MessageSendParams,\n PushNotificationConfig,\n Task,\n TaskArtifactUpdateEvent,\n TaskIdParams,\n TaskState,\n TaskStatusUpdateEvent,\n} from '@a2a-js/sdk'\nimport type { ExecutionEventBusManager, TaskStore } from '@a2a-js/sdk/server'\nimport {\n A2AError,\n AgentExecutor,\n DefaultRequestHandler,\n ExecutionEventBus,\n ExecutionEventQueue,\n ResultManager,\n} from '@a2a-js/sdk/server'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { StartAgentRequest, isValidScheme } from '../common/types.js'\nimport { Payments } from '../payments.js'\nimport { decodeAccessToken } from '../utils.js'\nimport { buildPaymentRequired, type X402PaymentRequired } from '../x402/facilitator-api.js'\nimport type {\n A2AAuthResult,\n A2AStreamEvent,\n AgentRequestContext,\n HttpRequestContext,\n PaymentRedemptionConfig,\n PaymentsRequestContext,\n} from './types.js'\n\nconst terminalStates: TaskState[] = ['completed', 'failed', 'canceled', 'rejected']\n\n/**\n * Options for configuring the PaymentsRequestHandler\n */\nexport interface PaymentsRequestHandlerOptions {\n /** Whether to execute tasks asynchronously */\n asyncExecution?: boolean\n /** Default batch mode for all requests (can be overridden per-request) */\n defaultBatch?: boolean\n /** Default margin percentage for all requests (can be overridden per-request) */\n defaultMarginPercent?: number\n}\n\n/**\n * PaymentsRequestHandler extends DefaultRequestHandler to add payments validation and burning.\n * It validates credits before executing a task and burns credits after successful execution.\n * It also sends push notifications when a task reaches a terminal state.\n * @param options - Handler options, including asyncExecution, defaultBatch, and defaultMarginPercent\n */\nexport class PaymentsRequestHandler extends DefaultRequestHandler {\n private paymentsService: Payments\n private httpContextByTaskId: Map<string, HttpRequestContext> = new Map()\n private httpContextByMessageId: Map<string, HttpRequestContext> = new Map()\n private asyncExecution: boolean\n private defaultBatch: boolean\n private defaultMarginPercent?: number\n\n /**\n * Store HTTP context temporarily by messageId (used in middleware when taskId is not yet available).\n * @param messageId - The messageId from the incoming message\n * @param ctx - The HTTP context (bearerToken, url, method)\n */\n public setHttpRequestContextForMessage(messageId: string, ctx: HttpRequestContext) {\n this.httpContextByMessageId.set(messageId, ctx)\n }\n\n /**\n * Store HTTP context by taskId (used in middleware when taskId is available).\n * @param taskId - The taskId of the task\n * @param ctx - The HTTP context (bearerToken, url, method)\n */\n public setHttpRequestContextForTask(taskId: string, ctx: HttpRequestContext) {\n this.httpContextByTaskId.set(taskId, ctx)\n }\n\n /**\n * @param agentCard - The agent card\n * @param taskStore - The task store\n * @param agentExecutor - The business logic executor\n * @param paymentsService - The payments service for validation and burning\n * @param eventBusManager - The event bus manager (optional)\n * @param options - Handler options (asyncExecution, defaultBatch, defaultMarginPercent)\n */\n constructor(\n agentCard: AgentCard,\n taskStore: TaskStore,\n agentExecutor: AgentExecutor,\n paymentsService: any,\n eventBusManager?: ExecutionEventBusManager,\n options?: PaymentsRequestHandlerOptions,\n ) {\n super(agentCard, taskStore, agentExecutor, eventBusManager)\n this.paymentsService = paymentsService\n this.asyncExecution = options?.asyncExecution ?? false\n this.defaultBatch = options?.defaultBatch ?? false\n this.defaultMarginPercent = options?.defaultMarginPercent\n }\n\n /**\n * Retrieve the HTTP context for a given taskId.\n * @param taskId - The taskId of the task\n * @returns The HTTP context (bearerToken, url, method) or undefined\n */\n private getHttpRequestContextForTask(taskId: string): HttpRequestContext | undefined {\n return this.httpContextByTaskId.get(taskId)\n }\n\n /**\n * Retrieve the HTTP context for a given messageId.\n * @param messageId - The messageId of the message\n * @returns The HTTP context (bearerToken, url, method) or undefined\n */\n private getHttpRequestContextForMessage(messageId: string): HttpRequestContext | undefined {\n return this.httpContextByMessageId.get(messageId)\n }\n\n /**\n * Deletes the HTTP context associated with a taskId.\n * @param taskId - The taskId to delete context for\n */\n public deleteHttpRequestContextForTask(taskId: string): void {\n this.httpContextByTaskId.delete(taskId)\n }\n\n /**\n * Get the handler options (defaultBatch, defaultMarginPercent).\n * Used by middleware to determine default redemption behavior.\n * @returns The handler options\n */\n public getHandlerOptions(): PaymentsRequestHandlerOptions {\n return {\n asyncExecution: this.asyncExecution,\n defaultBatch: this.defaultBatch,\n defaultMarginPercent: this.defaultMarginPercent,\n }\n }\n\n /**\n * Validates a request using the x402 payments service.\n * This method is used by the middleware to validate credits before processing requests.\n *\n * @param bearerToken - The bearer token for authentication\n * @param endpoint - Optional endpoint URL being requested\n * @param httpVerb - Optional HTTP method being used\n * @returns Promise resolving to the validation result\n */\n public async validateRequest(\n bearerToken: string,\n endpoint?: string,\n httpVerb?: string,\n ): Promise<any> {\n let planId: string | undefined\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n if (paymentExtension) {\n planId = paymentExtension.params?.planId as string\n }\n\n const decodedAccessToken = decodeAccessToken(bearerToken)\n\n if (!decodedAccessToken) {\n throw PaymentsError.unauthorized('Invalid access token.')\n }\n\n if (!planId) {\n throw PaymentsError.unauthorized('Plan ID not found in agent card.')\n }\n\n // Extract subscriberAddress from token (payload.authorization.from per x402 spec)\n const subscriberAddress = decodedAccessToken.payload?.authorization?.from\n\n if (!subscriberAddress) {\n throw PaymentsError.unauthorized(\n 'Cannot determine subscriberAddress from token (expected payload.authorization.from)',\n )\n }\n\n const agentId = paymentExtension?.params?.agentId as string | undefined\n const scheme = isValidScheme(decodedAccessToken.accepted?.scheme) ? decodedAccessToken.accepted.scheme : 'nvm:erc4337'\n\n const paymentRequired: X402PaymentRequired = buildPaymentRequired(planId, {\n endpoint: endpoint || '',\n agentId,\n httpVerb,\n scheme,\n environment: this.paymentsService.getEnvironmentName(),\n })\n\n const result = await this.paymentsService.facilitator.verifyPermissions({\n paymentRequired,\n x402AccessToken: bearerToken,\n maxAmount: 1n,\n })\n if (!result.isValid) {\n throw PaymentsError.unauthorized('Permission verification failed.')\n }\n return {\n success: true,\n planId,\n subscriberAddress,\n balance: { isSubscriber: true },\n }\n }\n\n /**\n * Gets redemption configuration for a task based on AgentCard and handler defaults.\n * The configuration is determined by the server, not by client metadata.\n *\n * @returns The redemption configuration\n */\n private async getRedemptionConfig(): Promise<PaymentRedemptionConfig> {\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n\n const agentConfig =\n (paymentExtension?.params?.redemptionConfig as PaymentRedemptionConfig) || {}\n\n return {\n useBatch: agentConfig.useBatch ?? this.defaultBatch ?? false,\n useMargin: agentConfig.useMargin ?? false,\n marginPercent: agentConfig.marginPercent ?? this.defaultMarginPercent,\n }\n }\n\n /**\n * Determines the appropriate redemption method based on server configuration.\n *\n * @param bearerToken - The bearer token for authentication\n * @param creditsUsed - The number of credits to burn\n * @param httpContext - Optional HTTP context with endpoint and method information\n * @returns Promise resolving to the redemption result\n */\n private async executeRedemption(\n bearerToken: string,\n creditsUsed: bigint | number,\n httpContext?: HttpRequestContext,\n ): Promise<any> {\n const decodedAccessToken = decodeAccessToken(bearerToken)\n if (!decodedAccessToken) {\n throw PaymentsError.unauthorized('Invalid access token.')\n }\n\n let planId: string | undefined\n let agentId: string | undefined\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n if (paymentExtension) {\n planId = paymentExtension.params?.planId as string | undefined\n agentId = paymentExtension.params?.agentId as string | undefined\n }\n\n if (!planId) {\n throw PaymentsError.unauthorized('Plan ID not found in agent card.')\n }\n\n const scheme = isValidScheme(decodedAccessToken.accepted?.scheme) ? decodedAccessToken.accepted.scheme : 'nvm:erc4337'\n\n // Build paymentRequired using the helper\n const paymentRequired = buildPaymentRequired(planId, {\n endpoint: httpContext?.urlRequested,\n agentId,\n httpVerb: httpContext?.httpMethodRequested,\n scheme,\n environment: this.paymentsService.getEnvironmentName(),\n })\n\n return await this.paymentsService.facilitator.settlePermissions({\n paymentRequired,\n x402AccessToken: bearerToken,\n maxAmount: BigInt(creditsUsed),\n })\n }\n\n /**\n * Creates PaymentsRequestContext from message parameters.\n * This method handles HTTP context retrieval, validation, and context creation.\n * @param params - Message send parameters\n * @param isStreaming - Whether this is for streaming (affects createRequestContext call)\n * @returns Object containing PaymentsRequestContext and related data\n */\n private async createPaymentsRequestContext(\n params: MessageSendParams,\n isStreaming = false,\n ): Promise<{\n paymentsRequestContext: PaymentsRequestContext\n taskId: string\n httpContext: HttpRequestContext\n bearerToken: string\n validation: StartAgentRequest\n requestContext: any\n finalMessageForAgent: Message\n eventBus: ExecutionEventBus\n eventQueue: ExecutionEventQueue\n resultManager: ResultManager\n }> {\n // Validate required parameters before any processing\n const missingParam = !params.message\n ? 'message'\n : !params.message.messageId\n ? 'message.messageId'\n : null\n if (missingParam) {\n throw A2AError.invalidParams(`${missingParam} is required.`)\n }\n\n // 1. Get HTTP context for the task or message\n let taskId = params.message.taskId\n let httpContext: HttpRequestContext | undefined\n if (taskId) {\n httpContext = this.getHttpRequestContextForTask(taskId)\n } else {\n const messageId = params.message.messageId\n httpContext = this.getHttpRequestContextForMessage(messageId)\n }\n\n if (!httpContext) {\n throw A2AError.internalError('HTTP context not found for task or message.')\n }\n\n // 2. Extract bearer token and validate presence of required fields\n const { bearerToken, validation } = httpContext\n if (!bearerToken) {\n throw PaymentsError.unauthorized('Missing bearer token for payment validation.')\n }\n\n // 3. Validate credits before executing the task\n const agentCard = await this.getAgentCard()\n const agentId = agentCard.capabilities?.extensions?.find(\n (ext) => ext.uri === 'urn:nevermined:payment',\n )?.params?.agentId\n if (!agentId) {\n throw A2AError.internalError('Agent ID not found in payment extension.')\n }\n\n // 4. Generate taskId if not present and migrate HTTP context\n const incomingMessage = params.message\n if (!taskId) {\n taskId = uuidv4()\n this.migrateHttpRequestContextFromMessageToTask(params.message.messageId, taskId)\n }\n\n // 5. Instantiate ResultManager and eventBus\n const resultManager = new ResultManager(this.getTaskStore())\n resultManager.setContext(incomingMessage)\n const requestContext = await this.callCreateRequestContext(incomingMessage, taskId, isStreaming)\n const finalMessageForAgent = requestContext.userMessage\n const eventBus = this.getEventBusManager().createOrGetByTaskId(taskId)\n const eventQueue = new ExecutionEventQueue(eventBus)\n\n // 6. Create PaymentsRequestContext\n const authResult: A2AAuthResult = {\n requestId: validation.agentRequestId,\n token: bearerToken,\n agentId: validation.agentId,\n agentRequest: validation,\n }\n\n const agentRequestContext: AgentRequestContext = {\n authResult,\n httpContext,\n paymentsService: this.paymentsService,\n }\n\n // 7. Create extended request context with agent request data\n const paymentsRequestContext: PaymentsRequestContext = {\n ...requestContext,\n payments: agentRequestContext,\n }\n\n return {\n paymentsRequestContext,\n taskId,\n httpContext,\n bearerToken,\n validation,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n }\n }\n\n /**\n * Processes streaming events with finalization (credits burning and push notifications).\n * Similar to processEventsWithFinalization but yields events for streaming.\n * @param taskId - The task ID\n * @param resultManager - The result manager\n * @param eventQueue - The event queue\n * @param bearerToken - The bearer token\n * @param validation - The validation result\n * @returns Async generator yielding processed events\n */\n protected async *processStreamingEventsWithFinalization(\n taskId: string,\n resultManager: ResultManager,\n eventQueue: ExecutionEventQueue,\n bearerToken: string,\n ): AsyncGenerator<A2AStreamEvent, void, undefined> {\n try {\n for await (const event of eventQueue.events()) {\n await resultManager.processEvent(event)\n yield event\n\n if (\n event.kind === 'status-update' &&\n event.final &&\n event?.metadata?.creditsUsed !== undefined &&\n event?.metadata?.creditsUsed !== null &&\n bearerToken &&\n (typeof event.metadata.creditsUsed === 'string' ||\n typeof event.metadata.creditsUsed === 'number' ||\n typeof event.metadata.creditsUsed === 'bigint')\n ) {\n try {\n // Get redemption configuration from server (not from client metadata)\n const redemptionConfig = await this.getRedemptionConfig()\n\n if (!redemptionConfig.useBatch) {\n // Get HTTP context if available\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n // Execute redemption with server configuration for non-batch requests\n const response = await this.executeRedemption(\n bearerToken,\n BigInt(event.metadata.creditsUsed),\n httpContext,\n )\n\n // Update event metadata with response data\n if (response && event.metadata) {\n event.metadata.txHash = response.txHash\n event.metadata.creditsCharged = response.amountOfCredits\n ? Number(response.amountOfCredits)\n : event.metadata.creditsUsed\n }\n }\n } catch (err) {\n // Do nothing\n }\n }\n\n // Handle push notification\n if (\n event.kind === 'status-update' &&\n event.final &&\n event.status?.state &&\n terminalStates.includes(event.status.state)\n ) {\n try {\n const taskPushNotificationConfig = await this.getTaskPushNotificationConfig({\n id: event.taskId,\n })\n if (taskPushNotificationConfig) {\n await this.sendPushNotification(\n event.taskId,\n event.status.state,\n taskPushNotificationConfig.pushNotificationConfig,\n {\n contextId: event.contextId,\n },\n )\n }\n } catch (err) {\n // Do nothing\n }\n }\n }\n } finally {\n // Cleanup when the stream is fully consumed or breaks\n //this.getEventBusManager().cleanupByTaskId(taskId)\n }\n }\n\n /**\n * Processes all events, calling handleTaskFinalization when a terminal status-update event is received.\n * In async mode, it can be launched in background.\n */\n protected async processEventsWithFinalization(\n taskId: string,\n resultManager: ResultManager,\n eventQueue: ExecutionEventQueue,\n bearerToken: string,\n validation: StartAgentRequest,\n options?: {\n firstResultResolver?: (event: any) => void\n firstResultRejector?: (err: any) => void\n },\n ) {\n let firstResultSent = false\n try {\n for await (const event of eventQueue.events()) {\n // Handle redemption before processing the event\n if (\n event.kind === 'status-update' &&\n event.final &&\n terminalStates.includes(event.status?.state)\n ) {\n // Get HTTP context if available\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n await this.handleTaskFinalization(resultManager, event, bearerToken, httpContext)\n }\n\n await resultManager.processEvent(event)\n if (options?.firstResultResolver && !firstResultSent) {\n if (event.kind === 'message' || event.kind === 'task') {\n options.firstResultResolver(event)\n firstResultSent = true\n }\n }\n }\n if (options?.firstResultRejector && !firstResultSent) {\n options.firstResultRejector(\n A2AError.internalError('Execution finished before a message or task was produced.'),\n )\n }\n } catch (error) {\n if (options?.firstResultRejector && !firstResultSent) {\n options.firstResultRejector(error)\n }\n throw error\n } finally {\n this.getEventBusManager().cleanupByTaskId(taskId)\n }\n }\n\n /**\n * Sends a message, validating credits before execution and burning credits after.\n * Also sends a push notification if the task reaches a terminal state.\n * This method overrides the parent implementation to allow eventBus subscription before agent execution.\n * @param params - Message send parameters\n * @returns The resulting message or task\n */\n async sendMessage(params: MessageSendParams): Promise<Message | Task> {\n // Create PaymentsRequestContext and related data\n const {\n paymentsRequestContext,\n taskId,\n bearerToken,\n validation,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n } = await this.createPaymentsRequestContext(params, false)\n\n // Execute agent with extended context\n ;(this as any).agentExecutor\n .execute(paymentsRequestContext as any, eventBus)\n .catch((err: any) => {\n const errorTask: Task = {\n id: requestContext.task?.id || uuidv4(),\n contextId: finalMessageForAgent.contextId || uuidv4(),\n status: {\n state: 'failed',\n message: {\n kind: 'message',\n role: 'agent',\n messageId: uuidv4(),\n parts: [{ kind: 'text', text: `Agent execution error: ${err.message}` }],\n taskId: requestContext.task?.id,\n contextId: finalMessageForAgent.contextId,\n },\n timestamp: new Date().toISOString(),\n },\n history: requestContext.task?.history ? [...requestContext.task.history] : [],\n kind: 'task',\n }\n if (finalMessageForAgent) {\n if (\n !errorTask.history?.find((m: any) => m.messageId === finalMessageForAgent.messageId)\n ) {\n errorTask.history?.push(finalMessageForAgent)\n }\n }\n eventBus.publish(errorTask)\n eventBus.publish({\n kind: 'status-update',\n taskId: errorTask.id,\n contextId: errorTask.contextId,\n status: errorTask.status,\n final: true,\n })\n eventBus.finished()\n })\n\n // Determine if execution should be blocking based on client request\n // The blocking parameter comes from params.configuration.blocking\n const isBlocking = params.configuration?.blocking !== false // Default to blocking if not specified\n\n if (isBlocking) {\n await this.processEventsWithFinalization(\n taskId,\n resultManager,\n eventQueue,\n bearerToken,\n validation,\n )\n const finalResult = resultManager.getFinalResult()\n if (!finalResult) {\n throw A2AError.internalError(\n 'Agent execution finished without a result, and no task context found.',\n )\n }\n return finalResult\n } else {\n // Non-blocking execution - return immediately with first result\n if (!taskId) {\n throw A2AError.internalError('Task ID is required for non-blocking execution.')\n }\n const validTaskId = taskId\n return new Promise((resolve, reject) => {\n this.processEventsWithFinalization(\n validTaskId,\n resultManager,\n eventQueue,\n bearerToken,\n validation,\n {\n firstResultResolver: resolve,\n firstResultRejector: reject,\n },\n )\n })\n }\n }\n\n /**\n * Handles credits burning and push notification when a task reaches a terminal state.\n * This is called asynchronously from the eventBus listener.\n * Supports batch and margin-based redemptions based on server configuration.\n * @param resultManager - The result manager\n * @param event - The status-update event with final state\n * @param bearerToken - The bearer token for payment validation\n * @param validation - The validation result from the request\n */\n private async handleTaskFinalization(\n resultManager: ResultManager,\n event: TaskStatusUpdateEvent,\n bearerToken: string,\n httpContext?: HttpRequestContext,\n ) {\n const creditsToBurn = event.metadata?.creditsUsed\n if (\n creditsToBurn !== undefined &&\n creditsToBurn !== null &&\n bearerToken &&\n (typeof creditsToBurn === 'string' ||\n typeof creditsToBurn === 'number' ||\n typeof creditsToBurn === 'bigint')\n ) {\n try {\n // Get redemption configuration from server (not from client metadata)\n const redemptionConfig = await this.getRedemptionConfig()\n\n if (!redemptionConfig.useBatch) {\n // Execute redemption with server configuration for non-batch requests\n const response = await this.executeRedemption(\n bearerToken,\n BigInt(creditsToBurn),\n httpContext,\n )\n\n // Update event metadata with redemption results\n event.metadata = {\n ...event.metadata,\n txHash: response.txHash,\n // Store the actual credits charged (especially important for margin-based)\n creditsCharged: response.amountOfCredits\n ? Number(response.amountOfCredits)\n : creditsToBurn,\n }\n }\n\n // Always update task metadata and process the task\n const task = resultManager.getCurrentTask()\n if (task) {\n // Update task metadata with current event metadata (from executor or redemption)\n task.metadata = {\n ...task.metadata,\n ...event.metadata,\n }\n\n await resultManager.processEvent(task)\n // Delete http context associated with the task\n this.deleteHttpRequestContextForTask(event.taskId)\n }\n } catch (err) {\n // Do nothing\n }\n }\n try {\n const taskPushNotificationConfig = await this.getTaskPushNotificationConfig({\n id: event.taskId,\n })\n if (taskPushNotificationConfig) {\n await this.sendPushNotification(\n event.taskId,\n event.status.state,\n taskPushNotificationConfig.pushNotificationConfig,\n { contextId: event.contextId },\n )\n }\n } catch (err) {\n // Do nothing\n }\n }\n\n /**\n * Streams messages and events for a task, with payments validation.\n * Also sends a push notification if a terminal status-update event is emitted.\n * @param params - Message send parameters\n * @returns Async generator of events\n */\n async *sendMessageStream(\n params: MessageSendParams,\n ): AsyncGenerator<A2AStreamEvent, void, undefined> {\n // Create PaymentsRequestContext and related data\n const {\n paymentsRequestContext,\n taskId,\n bearerToken,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n } = await this.createPaymentsRequestContext(params, true)\n\n // Execute agent with extended context\n ;(this as any).agentExecutor\n .execute(paymentsRequestContext as any, eventBus)\n .catch((err: any) => {\n console.error(\n `Agent execution failed for stream message ${finalMessageForAgent.messageId}:`,\n err,\n )\n const contextId = finalMessageForAgent.contextId || uuidv4()\n const errorTaskStatus: TaskStatusUpdateEvent = {\n kind: 'status-update',\n taskId: requestContext.task?.id || uuidv4(),\n contextId,\n status: {\n state: 'failed',\n message: {\n kind: 'message',\n role: 'agent',\n messageId: uuidv4(),\n parts: [{ kind: 'text', text: `Agent execution error: ${err.message}` }],\n taskId: requestContext.task?.id,\n contextId,\n },\n timestamp: new Date().toISOString(),\n },\n final: true,\n }\n eventBus.publish(errorTaskStatus)\n })\n\n // Process streaming events with finalization\n yield* this.processStreamingEventsWithFinalization(\n taskId,\n resultManager,\n eventQueue,\n bearerToken,\n )\n }\n\n /**\n * Sends a push notification when a task reaches a terminal state.\n * @param taskId - The task ID\n * @param state - The terminal state\n * @param pushNotificationConfig - The push notification configuration\n * @param payload - Additional payload to include in the notification\n */\n private async sendPushNotification(\n taskId: string,\n state: TaskState,\n pushNotificationConfig: PushNotificationConfig,\n payload: Record<string, any> = {},\n ) {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n if (pushNotificationConfig.authentication) {\n if (pushNotificationConfig.authentication.schemes.includes('basic')) {\n const basic = Buffer.from(`${pushNotificationConfig.authentication.credentials}`).toString(\n 'base64',\n )\n headers['Authorization'] = `Basic ${basic}`\n } else if (pushNotificationConfig.authentication.schemes.includes('bearer')) {\n headers['Authorization'] = `Bearer ${pushNotificationConfig.authentication.credentials}`\n } else if (pushNotificationConfig.authentication.schemes.includes('custom')) {\n Object.assign(headers, pushNotificationConfig.authentication.credentials)\n }\n }\n const body = JSON.stringify({\n taskId,\n state,\n payload,\n })\n const response = await fetch(pushNotificationConfig.url, {\n method: 'POST',\n headers,\n body,\n })\n if (!response.ok) {\n throw A2AError.internalError('Failed to send push notification.')\n }\n }\n\n /**\n * Migrates the HTTP context from a messageId to a taskId and deletes the temporary messageId context.\n * @param messageId - The messageId to migrate from\n * @param taskId - The taskId to migrate to\n */\n public migrateHttpRequestContextFromMessageToTask(messageId: string, taskId: string): void {\n const ctx = this.getHttpRequestContextForMessage(messageId)\n if (ctx) {\n this.setHttpRequestContextForTask(taskId, ctx)\n this.deleteHttpRequestContextForMessage(messageId)\n }\n }\n\n /**\n * Deletes the HTTP context associated with a messageId.\n * @param messageId - The messageId to delete context for\n */\n public deleteHttpRequestContextForMessage(messageId: string): void {\n this.httpContextByMessageId.delete(messageId)\n }\n\n /**\n * Protected getter to access the private taskStore property from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected getTaskStore(): TaskStore {\n return (this as any).taskStore as TaskStore\n }\n\n /**\n * Protected getter to access the private eventBusManager property from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected getEventBusManager(): ExecutionEventBusManager {\n return (this as any).eventBusManager as ExecutionEventBusManager\n }\n\n /**\n * Protected getter to access the private _createRequestContext method from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected async callCreateRequestContext(\n incomingMessage: any,\n taskId: string,\n isStream: boolean,\n ): Promise<any> {\n return await (this as any)._createRequestContext(incomingMessage, taskId, isStream)\n }\n\n /**\n * Protected getter to access the private _processEvents method from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected callProcessEvents(...args: any[]): any {\n return (this as any)._processEvents.apply(this, args)\n }\n\n /**\n * Resubscribes to a task's event stream, ensuring the task has updated metadata before yielding.\n * This method overrides the parent implementation to ensure metadata is updated before yielding.\n * @param params - Parameters containing the taskId\n * @returns Async generator of events\n */\n async *resubscribe(\n params: TaskIdParams,\n ): AsyncGenerator<Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent, void, undefined> {\n const task = await this.getTaskStore().load(params.id)\n if (!task) {\n throw A2AError.taskNotFound(params.id)\n }\n\n // Yield task immediately (with current metadata)\n yield task\n\n const finalStates: TaskState[] = ['completed', 'failed', 'canceled', 'rejected']\n if (finalStates.includes(task.status.state)) {\n return\n }\n\n const eventBus = this.getEventBusManager().getByTaskId(params.id)\n if (!eventBus) {\n console.warn(`Resubscribe: No active event bus for task ${params.id}.`)\n return\n }\n\n const eventQueue = new ExecutionEventQueue(eventBus)\n try {\n for await (const event of eventQueue.events()) {\n // Process event with ResultManager to ensure task is saved\n const resultManager = new ResultManager(this.getTaskStore())\n // Set context from task history if available\n if (task.history && task.history.length > 0) {\n resultManager.setContext(task.history[0])\n }\n await resultManager.processEvent(event)\n\n // Handle redemption and push notification for final status-update events\n if (\n event.kind === 'status-update' &&\n event.final &&\n event.taskId === params.id &&\n terminalStates.includes(event.status?.state)\n ) {\n // Get HTTP context for this task\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n if (httpContext) {\n const { bearerToken, validation } = httpContext\n if (bearerToken && validation) {\n // Handle task finalization (redemption and push notification)\n await this.handleTaskFinalization(resultManager, event, bearerToken, httpContext)\n }\n }\n }\n\n // Yield event after processing (so metadata is updated)\n if (event.kind === 'status-update' && event.taskId === params.id) {\n yield event\n } else if (event.kind === 'artifact-update' && event.taskId === params.id) {\n yield event\n } else if (event.kind === 'task' && event.id === params.id) {\n yield event\n }\n }\n } finally {\n eventQueue.stop()\n }\n }\n}\n"]}
|
package/dist/a2a/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAA8C,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAuCpE;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,oEAAoE;IACpE,SAAS,EAAE,SAAS,CAAA;IACpB,uDAAuD;IACvD,QAAQ,EAAE,aAAa,CAAA;IACvB,kEAAkE;IAClE,eAAe,EAAE,GAAG,CAAA;IACpB,wCAAwC;IACxC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;IAC5B,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,GAAG,CAAA;IAC1B,kEAAkE;IAClE,cAAc,CAAC,EAAE;QACf,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAC9B,CAAA;IACD,8DAA8D;IAC9D,KAAK,CAAC,EAAE;QACN,oDAAoD;QACpD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACpF,mDAAmD;QACnD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACnF,2CAA2C;QAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAChF,CAAA;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IACpB,+BAA+B;IAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;IACnB,+DAA+D;IAC/D,OAAO,EAAE,sBAAsB,CAAA;IAC/B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAA8C,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAuCpE;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,oEAAoE;IACpE,SAAS,EAAE,SAAS,CAAA;IACpB,uDAAuD;IACvD,QAAQ,EAAE,aAAa,CAAA;IACvB,kEAAkE;IAClE,eAAe,EAAE,GAAG,CAAA;IACpB,wCAAwC;IACxC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;IAC5B,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,GAAG,CAAA;IAC1B,kEAAkE;IAClE,cAAc,CAAC,EAAE;QACf,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAC9B,CAAA;IACD,8DAA8D;IAC9D,KAAK,CAAC,EAAE;QACN,oDAAoD;QACpD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACpF,mDAAmD;QACnD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACnF,2CAA2C;QAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAChF,CAAA;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IACpB,+BAA+B;IAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;IACnB,+DAA+D;IAC/D,OAAO,EAAE,sBAAsB,CAAA;IAC/B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAkHD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,GAAG,uBAAuB;CA0KzE"}
|
package/dist/a2a/server.js
CHANGED
|
@@ -89,6 +89,7 @@ async function bearerTokenMiddleware(handler, paymentsService, req, res, next) {
|
|
|
89
89
|
agentId,
|
|
90
90
|
httpVerb: 'POST',
|
|
91
91
|
scheme,
|
|
92
|
+
environment: paymentsService.getEnvironmentName(),
|
|
92
93
|
});
|
|
93
94
|
const paymentRequiredHeader = Buffer.from(JSON.stringify(paymentRequired)).toString('base64');
|
|
94
95
|
// x402 HTTP spec v2: payment-signature header
|
package/dist/a2a/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PaymentsA2AServer sets up and starts the A2A server for payments agents.\n * Handles A2A protocol endpoints and allows optional custom endpoints.\n *\n * The server provides a complete A2A protocol implementation with:\n * - JSON-RPC endpoint for A2A messages\n * - Agent Card endpoint (.well-known/agent.json)\n * - Bearer token extraction and validation\n * - Credit validation and burning\n * - Task execution and streaming\n * - Customizable routes and handlers\n */\nimport express from 'express'\nimport http from 'http'\nimport { InMemoryTaskStore, JsonRpcTransportHandler, AgentExecutor } from '@a2a-js/sdk/server'\nimport type { AgentCard, HttpRequestContext } from './types.js'\nimport { PaymentsRequestHandler } from './paymentsRequestHandler.js'\nimport type { Payments } from '../payments.js'\nimport { buildPaymentRequired, resolveScheme } from '../x402/facilitator-api.js'\nimport { X402_HEADERS } from '../x402/express/middleware.js'\n\n/**\n * Checks if a value is an AsyncIterable (used to detect streaming responses)\n */\nfunction isAsyncIterable<T>(value: any): value is AsyncIterable<T> {\n return value && typeof value[Symbol.asyncIterator] === 'function'\n}\n\n/**\n * Sends a JSON-RPC result. If it's an async iterator, streams as SSE; otherwise returns JSON.\n */\nasync function sendRpcResult(res: express.Response, result: any): Promise<void> {\n if (isAsyncIterable(result)) {\n res.setHeader('Content-Type', 'text/event-stream')\n res.setHeader('Cache-Control', 'no-cache')\n res.setHeader('Connection', 'keep-alive')\n const anyRes = res as any\n if (typeof anyRes.flushHeaders === 'function') anyRes.flushHeaders()\n try {\n for await (const chunk of result as AsyncGenerator<any, void, undefined>) {\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`)\n }\n } catch (err: any) {\n const errorEvent = {\n jsonrpc: '2.0',\n error: { code: err?.code || -32603, message: err?.message || 'Internal streaming error' },\n }\n res.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`)\n }\n res.end()\n return\n }\n res.json(result)\n}\n\n/**\n * Options for starting the PaymentsA2AServer.\n * Provides comprehensive configuration for A2A server setup.\n */\nexport interface PaymentsA2AServerOptions {\n /** The agent card defining the agent's capabilities and metadata */\n agentCard: AgentCard\n /** User-implemented executor for handling A2A tasks */\n executor: AgentExecutor\n /** Payments service instance for credit validation and burning */\n paymentsService: any\n /** Port number to bind the server to */\n /** Port number to listen on. Use 0 for automatic port assignment. */\n port: number\n /** Custom task store implementation (defaults to InMemoryTaskStore) */\n taskStore?: any\n /** Base path for all A2A routes (defaults to '/') */\n basePath?: string\n /** Whether to expose the agent card at .well-known/agent.json */\n exposeAgentCard?: boolean\n /** Whether to expose default A2A JSON-RPC routes */\n exposeDefaultRoutes?: boolean\n /** Custom Express app instance (defaults to new express()) */\n expressApp?: express.Express\n /** Custom request handler to override JSON-RPC method handling */\n customRequestHandler?: any\n /** Options for configuring the PaymentsRequestHandler behavior */\n handlerOptions?: {\n asyncExecution?: boolean\n defaultBatch?: boolean\n defaultMarginPercent?: number\n }\n /** Hooks for intercepting requests before/after processing */\n hooks?: {\n /** Called before processing any JSON-RPC request */\n beforeRequest?: (method: string, params: any, req: express.Request) => Promise<void>\n /** Called after processing any JSON-RPC request */\n afterRequest?: (method: string, result: any, req: express.Request) => Promise<void>\n /** Called when a JSON-RPC request fails */\n onError?: (method: string, error: Error, req: express.Request) => Promise<void>\n }\n}\n\n/**\n * Result returned by the server start method.\n * Contains the Express app and HTTP server instances for further customization.\n */\nexport interface PaymentsA2AServerResult {\n /** The configured Express application */\n app: express.Express\n /** The HTTP server instance */\n server: http.Server\n /** The request handler instance for direct access if needed */\n handler: PaymentsRequestHandler\n /** The actual port the server is listening on */\n port: number\n /**\n * Closes the server and all active connections.\n * @returns Promise that resolves when the server is fully closed\n */\n close: () => Promise<void>\n}\n\n/**\n * Middleware to extract payment token from HTTP headers and store it in the global context.\n * This middleware is applied after A2A routes are set up and extracts authentication\n * information for credit validation.\n *\n * Accepts tokens from:\n * - payment-signature header (x402 HTTP transport spec v2)\n *\n * @param req - Express request object\n * @param res - Express response object\n * @param next - Express next function\n */\nasync function bearerTokenMiddleware(\n handler: PaymentsRequestHandler,\n paymentsService: Payments,\n req: express.Request,\n res: express.Response,\n next: express.NextFunction,\n) {\n // Only process POST requests (A2A uses POST for all operations)\n if (req.method !== 'POST') {\n return next()\n }\n\n // Transform relative URL to absolute URL\n const absoluteUrl = new URL(req.originalUrl, req.protocol + '://' + req.get('host')).toString()\n\n const agentCard = await handler.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext) => ext.uri === 'urn:nevermined:payment',\n )\n\n if (!paymentExtension?.params?.agentId) {\n res.status(402).json({\n error: {\n code: -32001,\n message: 'Agent ID not found in agent card payment extension.',\n },\n })\n return\n }\n\n // Build paymentRequired for 402 responses\n const planId = (paymentExtension.params?.planId as string) || ''\n const agentId = paymentExtension.params?.agentId as string\n const scheme = await resolveScheme(paymentsService, planId)\n const paymentRequired = buildPaymentRequired(planId, {\n endpoint: absoluteUrl,\n agentId,\n httpVerb: 'POST',\n scheme,\n })\n const paymentRequiredHeader = Buffer.from(JSON.stringify(paymentRequired)).toString('base64')\n\n // x402 HTTP spec v2: payment-signature header\n const bearerToken = req.headers['payment-signature'] as string | undefined\n\n if (!bearerToken) {\n res\n .status(402)\n .set(X402_HEADERS.PAYMENT_REQUIRED, paymentRequiredHeader)\n .json({\n error: {\n code: -32001,\n message: 'Missing payment-signature header.',\n },\n })\n return\n }\n\n let validation: any\n try {\n validation = await handler.validateRequest(bearerToken, absoluteUrl, req.method)\n if (!validation?.balance?.isSubscriber) {\n res.status(402).json({\n error: {\n code: -32001,\n message: 'Insufficient credits or invalid request.',\n },\n })\n return\n }\n } catch (err) {\n res.status(402).json({\n error: {\n code: -32001,\n message: 'Payment validation failed: ' + (err instanceof Error ? err.message : String(err)),\n },\n })\n return\n }\n\n const context: HttpRequestContext = {\n bearerToken,\n urlRequested: absoluteUrl,\n httpMethodRequested: req.method,\n validation,\n }\n // Try to associate context with taskId or messageId\n const taskId = req.body?.taskId\n const messageId = req.body?.params?.message?.messageId\n\n if (taskId) {\n handler.setHttpRequestContextForTask(taskId, context)\n } else if (messageId) {\n handler.setHttpRequestContextForMessage(messageId, context)\n }\n\n next()\n}\n\n/**\n * PaymentsA2AServer sets up the A2A endpoints and starts the server.\n *\n * This class provides a complete A2A protocol implementation with payment integration.\n * It handles:\n * - JSON-RPC message routing\n * - Agent card exposure\n * - Bearer token extraction\n * - Credit validation and burning\n * - Task execution and streaming\n * - Customizable routes and handlers\n *\n * @example\n * ```typescript\n * const server = PaymentsA2AServer.start({\n * agentCard: myAgentCard,\n * executor: new MyExecutor(),\n * paymentsService: payments,\n * port: 41242,\n * basePath: '/a2a/',\n * hooks: {\n * beforeRequest: async (method, params, req) => {\n * console.log(`Processing ${method} request`)\n * }\n * }\n * })\n * ```\n */\nexport class PaymentsA2AServer {\n /**\n * Starts the A2A server with the given options.\n *\n * This method sets up the complete A2A server infrastructure including:\n * - Express app configuration\n * - A2A route setup\n * - Middleware for bearer token extraction\n * - Agent card endpoint\n * - HTTP server creation and binding\n *\n * @param options - Server configuration options\n * @returns Server result containing app, server, adapter, and handler instances\n *\n * @example\n * ```typescript\n * const result = PaymentsA2AServer.start({\n * agentCard: buildPaymentAgentCard(baseCard, paymentMetadata),\n * executor: new MyPaymentsExecutor(),\n * paymentsService: payments,\n * port: 41242,\n * basePath: '/a2a/',\n * exposeAgentCard: true,\n * exposeDefaultRoutes: true\n * })\n *\n * // Access the Express app for additional routes\n * result.app.get('/health', (req, res) => res.json({ status: 'ok' }))\n * ```\n */\n static start(options: PaymentsA2AServerOptions): PaymentsA2AServerResult {\n const {\n agentCard,\n executor,\n paymentsService,\n port,\n taskStore,\n basePath = '/',\n exposeAgentCard = true,\n exposeDefaultRoutes = true,\n expressApp,\n customRequestHandler,\n handlerOptions,\n hooks,\n } = options\n\n // Initialize components\n const store = taskStore || new InMemoryTaskStore()\n const handler =\n customRequestHandler ||\n new PaymentsRequestHandler(\n agentCard,\n store,\n executor,\n paymentsService,\n undefined,\n handlerOptions,\n )\n const transport = new JsonRpcTransportHandler(handler)\n\n const app = expressApp || express()\n\n if (exposeAgentCard) {\n const agentCardPath =\n basePath === '/'\n ? '/.well-known/agent.json'\n : `${basePath.replace(/\\/$/, '')}/.well-known/agent.json`\n app.get(agentCardPath, (req, res) => {\n res.json(agentCard)\n })\n }\n\n if (exposeDefaultRoutes) {\n // Apply bearer token middleware for all requests under basePath\n app.use(basePath, express.json(), (req, res, next) => {\n bearerTokenMiddleware(handler, paymentsService, req, res, next).catch(next)\n })\n\n // Apply hooks middleware after body parsing and validation\n if (hooks) {\n app.use(basePath, (req, res, next) => {\n if (req.method === 'POST' && req.body?.method) {\n const { method, params } = req.body\n\n // Apply beforeRequest hook\n if (hooks.beforeRequest) {\n hooks.beforeRequest(method, params, req).catch((err) => {\n console.error('[HOOKS] beforeRequest error:', err)\n })\n }\n\n // Apply afterRequest hook by intercepting res.json\n const originalJson = res.json\n res.json = function (data) {\n if (hooks.afterRequest) {\n hooks.afterRequest(method, data, req).catch((err) => {\n console.error('[HOOKS] afterRequest error:', err)\n })\n }\n return originalJson.call(this, data)\n }\n\n // Apply onError hook by catching errors\n const originalSend = res.send\n res.send = function (data) {\n if (data?.error && hooks.onError) {\n hooks\n .onError(method, new Error(data.error.message || 'Unknown error'), req)\n .catch((err) => {\n console.error('[HOOKS] onError error:', err)\n })\n }\n return originalSend.call(this, data)\n }\n }\n next()\n })\n }\n\n app.post(basePath, async (req, res) => {\n try {\n const result = await transport.handle(req.body)\n await sendRpcResult(res, result)\n } catch (err: any) {\n if (res.headersSent) {\n console.error('[PaymentsA2A] Error after headers sent:', err?.message)\n res.end()\n return\n }\n res.status(500).json({\n error: { code: -32603, message: err?.message || 'Internal server error' },\n })\n }\n })\n }\n\n const server = http.createServer(app)\n\n // Add error handling for server startup\n server.on('error', (error: any) => {\n console.error(`[PaymentsA2A] Server error:`, error)\n if (error.code === 'EADDRINUSE') {\n console.error(`[PaymentsA2A] Port ${port} is already in use`)\n }\n })\n\n // If port is 0, the OS will assign a free port automatically\n let actualPort = port\n let isListening = false\n\n // Only start listening if port is not 0 (0 is used with supertest which doesn't need listening)\n if (port !== 0) {\n server.listen(port, () => {\n const address = server.address()\n if (address && typeof address === 'object') {\n actualPort = address.port\n }\n isListening = true\n })\n }\n\n /**\n * Closes the server and all active connections.\n */\n const close = async (): Promise<void> => {\n if (!isListening && port === 0) {\n return\n }\n\n return new Promise<void>((resolve) => {\n // Close all active connections first\n if (server.listening) {\n server.closeAllConnections()\n }\n\n const timeout = setTimeout(() => {\n // Force close on timeout\n if (server.listening) {\n server.closeAllConnections()\n }\n server.close(() => {\n resolve()\n })\n }, 5000)\n\n if (server.listening) {\n server.close(() => {\n clearTimeout(timeout)\n // Give a moment for all connections to close\n setTimeout(resolve, 100)\n })\n } else {\n clearTimeout(timeout)\n resolve()\n }\n })\n }\n\n return { app, server, handler, port: actualPort, close }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PaymentsA2AServer sets up and starts the A2A server for payments agents.\n * Handles A2A protocol endpoints and allows optional custom endpoints.\n *\n * The server provides a complete A2A protocol implementation with:\n * - JSON-RPC endpoint for A2A messages\n * - Agent Card endpoint (.well-known/agent.json)\n * - Bearer token extraction and validation\n * - Credit validation and burning\n * - Task execution and streaming\n * - Customizable routes and handlers\n */\nimport express from 'express'\nimport http from 'http'\nimport { InMemoryTaskStore, JsonRpcTransportHandler, AgentExecutor } from '@a2a-js/sdk/server'\nimport type { AgentCard, HttpRequestContext } from './types.js'\nimport { PaymentsRequestHandler } from './paymentsRequestHandler.js'\nimport type { Payments } from '../payments.js'\nimport { buildPaymentRequired, resolveScheme } from '../x402/facilitator-api.js'\nimport { X402_HEADERS } from '../x402/express/middleware.js'\n\n/**\n * Checks if a value is an AsyncIterable (used to detect streaming responses)\n */\nfunction isAsyncIterable<T>(value: any): value is AsyncIterable<T> {\n return value && typeof value[Symbol.asyncIterator] === 'function'\n}\n\n/**\n * Sends a JSON-RPC result. If it's an async iterator, streams as SSE; otherwise returns JSON.\n */\nasync function sendRpcResult(res: express.Response, result: any): Promise<void> {\n if (isAsyncIterable(result)) {\n res.setHeader('Content-Type', 'text/event-stream')\n res.setHeader('Cache-Control', 'no-cache')\n res.setHeader('Connection', 'keep-alive')\n const anyRes = res as any\n if (typeof anyRes.flushHeaders === 'function') anyRes.flushHeaders()\n try {\n for await (const chunk of result as AsyncGenerator<any, void, undefined>) {\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`)\n }\n } catch (err: any) {\n const errorEvent = {\n jsonrpc: '2.0',\n error: { code: err?.code || -32603, message: err?.message || 'Internal streaming error' },\n }\n res.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`)\n }\n res.end()\n return\n }\n res.json(result)\n}\n\n/**\n * Options for starting the PaymentsA2AServer.\n * Provides comprehensive configuration for A2A server setup.\n */\nexport interface PaymentsA2AServerOptions {\n /** The agent card defining the agent's capabilities and metadata */\n agentCard: AgentCard\n /** User-implemented executor for handling A2A tasks */\n executor: AgentExecutor\n /** Payments service instance for credit validation and burning */\n paymentsService: any\n /** Port number to bind the server to */\n /** Port number to listen on. Use 0 for automatic port assignment. */\n port: number\n /** Custom task store implementation (defaults to InMemoryTaskStore) */\n taskStore?: any\n /** Base path for all A2A routes (defaults to '/') */\n basePath?: string\n /** Whether to expose the agent card at .well-known/agent.json */\n exposeAgentCard?: boolean\n /** Whether to expose default A2A JSON-RPC routes */\n exposeDefaultRoutes?: boolean\n /** Custom Express app instance (defaults to new express()) */\n expressApp?: express.Express\n /** Custom request handler to override JSON-RPC method handling */\n customRequestHandler?: any\n /** Options for configuring the PaymentsRequestHandler behavior */\n handlerOptions?: {\n asyncExecution?: boolean\n defaultBatch?: boolean\n defaultMarginPercent?: number\n }\n /** Hooks for intercepting requests before/after processing */\n hooks?: {\n /** Called before processing any JSON-RPC request */\n beforeRequest?: (method: string, params: any, req: express.Request) => Promise<void>\n /** Called after processing any JSON-RPC request */\n afterRequest?: (method: string, result: any, req: express.Request) => Promise<void>\n /** Called when a JSON-RPC request fails */\n onError?: (method: string, error: Error, req: express.Request) => Promise<void>\n }\n}\n\n/**\n * Result returned by the server start method.\n * Contains the Express app and HTTP server instances for further customization.\n */\nexport interface PaymentsA2AServerResult {\n /** The configured Express application */\n app: express.Express\n /** The HTTP server instance */\n server: http.Server\n /** The request handler instance for direct access if needed */\n handler: PaymentsRequestHandler\n /** The actual port the server is listening on */\n port: number\n /**\n * Closes the server and all active connections.\n * @returns Promise that resolves when the server is fully closed\n */\n close: () => Promise<void>\n}\n\n/**\n * Middleware to extract payment token from HTTP headers and store it in the global context.\n * This middleware is applied after A2A routes are set up and extracts authentication\n * information for credit validation.\n *\n * Accepts tokens from:\n * - payment-signature header (x402 HTTP transport spec v2)\n *\n * @param req - Express request object\n * @param res - Express response object\n * @param next - Express next function\n */\nasync function bearerTokenMiddleware(\n handler: PaymentsRequestHandler,\n paymentsService: Payments,\n req: express.Request,\n res: express.Response,\n next: express.NextFunction,\n) {\n // Only process POST requests (A2A uses POST for all operations)\n if (req.method !== 'POST') {\n return next()\n }\n\n // Transform relative URL to absolute URL\n const absoluteUrl = new URL(req.originalUrl, req.protocol + '://' + req.get('host')).toString()\n\n const agentCard = await handler.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext) => ext.uri === 'urn:nevermined:payment',\n )\n\n if (!paymentExtension?.params?.agentId) {\n res.status(402).json({\n error: {\n code: -32001,\n message: 'Agent ID not found in agent card payment extension.',\n },\n })\n return\n }\n\n // Build paymentRequired for 402 responses\n const planId = (paymentExtension.params?.planId as string) || ''\n const agentId = paymentExtension.params?.agentId as string\n const scheme = await resolveScheme(paymentsService, planId)\n const paymentRequired = buildPaymentRequired(planId, {\n endpoint: absoluteUrl,\n agentId,\n httpVerb: 'POST',\n scheme,\n environment: paymentsService.getEnvironmentName(),\n })\n const paymentRequiredHeader = Buffer.from(JSON.stringify(paymentRequired)).toString('base64')\n\n // x402 HTTP spec v2: payment-signature header\n const bearerToken = req.headers['payment-signature'] as string | undefined\n\n if (!bearerToken) {\n res\n .status(402)\n .set(X402_HEADERS.PAYMENT_REQUIRED, paymentRequiredHeader)\n .json({\n error: {\n code: -32001,\n message: 'Missing payment-signature header.',\n },\n })\n return\n }\n\n let validation: any\n try {\n validation = await handler.validateRequest(bearerToken, absoluteUrl, req.method)\n if (!validation?.balance?.isSubscriber) {\n res.status(402).json({\n error: {\n code: -32001,\n message: 'Insufficient credits or invalid request.',\n },\n })\n return\n }\n } catch (err) {\n res.status(402).json({\n error: {\n code: -32001,\n message: 'Payment validation failed: ' + (err instanceof Error ? err.message : String(err)),\n },\n })\n return\n }\n\n const context: HttpRequestContext = {\n bearerToken,\n urlRequested: absoluteUrl,\n httpMethodRequested: req.method,\n validation,\n }\n // Try to associate context with taskId or messageId\n const taskId = req.body?.taskId\n const messageId = req.body?.params?.message?.messageId\n\n if (taskId) {\n handler.setHttpRequestContextForTask(taskId, context)\n } else if (messageId) {\n handler.setHttpRequestContextForMessage(messageId, context)\n }\n\n next()\n}\n\n/**\n * PaymentsA2AServer sets up the A2A endpoints and starts the server.\n *\n * This class provides a complete A2A protocol implementation with payment integration.\n * It handles:\n * - JSON-RPC message routing\n * - Agent card exposure\n * - Bearer token extraction\n * - Credit validation and burning\n * - Task execution and streaming\n * - Customizable routes and handlers\n *\n * @example\n * ```typescript\n * const server = PaymentsA2AServer.start({\n * agentCard: myAgentCard,\n * executor: new MyExecutor(),\n * paymentsService: payments,\n * port: 41242,\n * basePath: '/a2a/',\n * hooks: {\n * beforeRequest: async (method, params, req) => {\n * console.log(`Processing ${method} request`)\n * }\n * }\n * })\n * ```\n */\nexport class PaymentsA2AServer {\n /**\n * Starts the A2A server with the given options.\n *\n * This method sets up the complete A2A server infrastructure including:\n * - Express app configuration\n * - A2A route setup\n * - Middleware for bearer token extraction\n * - Agent card endpoint\n * - HTTP server creation and binding\n *\n * @param options - Server configuration options\n * @returns Server result containing app, server, adapter, and handler instances\n *\n * @example\n * ```typescript\n * const result = PaymentsA2AServer.start({\n * agentCard: buildPaymentAgentCard(baseCard, paymentMetadata),\n * executor: new MyPaymentsExecutor(),\n * paymentsService: payments,\n * port: 41242,\n * basePath: '/a2a/',\n * exposeAgentCard: true,\n * exposeDefaultRoutes: true\n * })\n *\n * // Access the Express app for additional routes\n * result.app.get('/health', (req, res) => res.json({ status: 'ok' }))\n * ```\n */\n static start(options: PaymentsA2AServerOptions): PaymentsA2AServerResult {\n const {\n agentCard,\n executor,\n paymentsService,\n port,\n taskStore,\n basePath = '/',\n exposeAgentCard = true,\n exposeDefaultRoutes = true,\n expressApp,\n customRequestHandler,\n handlerOptions,\n hooks,\n } = options\n\n // Initialize components\n const store = taskStore || new InMemoryTaskStore()\n const handler =\n customRequestHandler ||\n new PaymentsRequestHandler(\n agentCard,\n store,\n executor,\n paymentsService,\n undefined,\n handlerOptions,\n )\n const transport = new JsonRpcTransportHandler(handler)\n\n const app = expressApp || express()\n\n if (exposeAgentCard) {\n const agentCardPath =\n basePath === '/'\n ? '/.well-known/agent.json'\n : `${basePath.replace(/\\/$/, '')}/.well-known/agent.json`\n app.get(agentCardPath, (req, res) => {\n res.json(agentCard)\n })\n }\n\n if (exposeDefaultRoutes) {\n // Apply bearer token middleware for all requests under basePath\n app.use(basePath, express.json(), (req, res, next) => {\n bearerTokenMiddleware(handler, paymentsService, req, res, next).catch(next)\n })\n\n // Apply hooks middleware after body parsing and validation\n if (hooks) {\n app.use(basePath, (req, res, next) => {\n if (req.method === 'POST' && req.body?.method) {\n const { method, params } = req.body\n\n // Apply beforeRequest hook\n if (hooks.beforeRequest) {\n hooks.beforeRequest(method, params, req).catch((err) => {\n console.error('[HOOKS] beforeRequest error:', err)\n })\n }\n\n // Apply afterRequest hook by intercepting res.json\n const originalJson = res.json\n res.json = function (data) {\n if (hooks.afterRequest) {\n hooks.afterRequest(method, data, req).catch((err) => {\n console.error('[HOOKS] afterRequest error:', err)\n })\n }\n return originalJson.call(this, data)\n }\n\n // Apply onError hook by catching errors\n const originalSend = res.send\n res.send = function (data) {\n if (data?.error && hooks.onError) {\n hooks\n .onError(method, new Error(data.error.message || 'Unknown error'), req)\n .catch((err) => {\n console.error('[HOOKS] onError error:', err)\n })\n }\n return originalSend.call(this, data)\n }\n }\n next()\n })\n }\n\n app.post(basePath, async (req, res) => {\n try {\n const result = await transport.handle(req.body)\n await sendRpcResult(res, result)\n } catch (err: any) {\n if (res.headersSent) {\n console.error('[PaymentsA2A] Error after headers sent:', err?.message)\n res.end()\n return\n }\n res.status(500).json({\n error: { code: -32603, message: err?.message || 'Internal server error' },\n })\n }\n })\n }\n\n const server = http.createServer(app)\n\n // Add error handling for server startup\n server.on('error', (error: any) => {\n console.error(`[PaymentsA2A] Server error:`, error)\n if (error.code === 'EADDRINUSE') {\n console.error(`[PaymentsA2A] Port ${port} is already in use`)\n }\n })\n\n // If port is 0, the OS will assign a free port automatically\n let actualPort = port\n let isListening = false\n\n // Only start listening if port is not 0 (0 is used with supertest which doesn't need listening)\n if (port !== 0) {\n server.listen(port, () => {\n const address = server.address()\n if (address && typeof address === 'object') {\n actualPort = address.port\n }\n isListening = true\n })\n }\n\n /**\n * Closes the server and all active connections.\n */\n const close = async (): Promise<void> => {\n if (!isListening && port === 0) {\n return\n }\n\n return new Promise<void>((resolve) => {\n // Close all active connections first\n if (server.listening) {\n server.closeAllConnections()\n }\n\n const timeout = setTimeout(() => {\n // Force close on timeout\n if (server.listening) {\n server.closeAllConnections()\n }\n server.close(() => {\n resolve()\n })\n }, 5000)\n\n if (server.listening) {\n server.close(() => {\n clearTimeout(timeout)\n // Give a moment for all connections to close\n setTimeout(resolve, 100)\n })\n } else {\n clearTimeout(timeout)\n resolve()\n }\n })\n }\n\n return { app, server, handler, port: actualPort, close }\n }\n}\n"]}
|
|
@@ -24,6 +24,11 @@ export declare abstract class BasePaymentsAPI {
|
|
|
24
24
|
accountAddress: string;
|
|
25
25
|
heliconeApiKey: string;
|
|
26
26
|
};
|
|
27
|
+
/**
|
|
28
|
+
* Returns the environment name used to initialize the Payments instance.
|
|
29
|
+
* @returns The environment name (e.g. 'sandbox', 'live')
|
|
30
|
+
*/
|
|
31
|
+
getEnvironmentName(): EnvironmentName;
|
|
27
32
|
/**
|
|
28
33
|
* It returns the account address associated with the NVM API Key used to initialize the Payments Library instance.
|
|
29
34
|
* @returns The account address extracted from the NVM API Key
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-payments.d.ts","sourceRoot":"","sources":["../../src/api/base-payments.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAgB,MAAM,oBAAoB,CAAA;AAEnF;;;GAGG;AACH,8BAAsB,eAAe;IACnC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAA;IAC3B,SAAS,CAAC,MAAM,EAAE,aAAa,CAAA;IAC/B,SAAS,CAAC,WAAW,EAAE,eAAe,CAAA;IACtC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAA;IAC1C,SAAS,CAAC,SAAS,EAAE,MAAM,CAAA;IAC3B,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,cAAc,EAAE,MAAM,CAAA;IAChC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAA;IACzB,iBAAiB,UAAO;gBAEnB,OAAO,EAAE,cAAc;IAoBnC;;;OAGG;IACH,SAAS,CAAC,cAAc,IAAI;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE;IAc9E;;;OAGG;IACI,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAI9C;;;;;;OAMG;IACH,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAY1D;;;;;;;;OAQG;IACH,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;gBAE7C,MAAM;iBACL;YACP,MAAM,EAAE,MAAM,CAAA;YACd,cAAc,EAAE,MAAM,CAAA;SACvB;eACM,MAAM;;CAelB"}
|
|
1
|
+
{"version":3,"file":"base-payments.d.ts","sourceRoot":"","sources":["../../src/api/base-payments.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAgB,MAAM,oBAAoB,CAAA;AAEnF;;;GAGG;AACH,8BAAsB,eAAe;IACnC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAA;IAC3B,SAAS,CAAC,MAAM,EAAE,aAAa,CAAA;IAC/B,SAAS,CAAC,WAAW,EAAE,eAAe,CAAA;IACtC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAA;IAC1C,SAAS,CAAC,SAAS,EAAE,MAAM,CAAA;IAC3B,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,cAAc,EAAE,MAAM,CAAA;IAChC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAA;IACzB,iBAAiB,UAAO;gBAEnB,OAAO,EAAE,cAAc;IAoBnC;;;OAGG;IACH,SAAS,CAAC,cAAc,IAAI;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE;IAc9E;;;OAGG;IACI,kBAAkB,IAAI,eAAe;IAI5C;;;OAGG;IACI,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAI9C;;;;;;OAMG;IACH,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAY1D;;;;;;;;OAQG;IACH,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;gBAE7C,MAAM;iBACL;YACP,MAAM,EAAE,MAAM,CAAA;YACd,cAAc,EAAE,MAAM,CAAA;SACvB;eACM,MAAM;;CAelB"}
|
|
@@ -45,6 +45,13 @@ export class BasePaymentsAPI {
|
|
|
45
45
|
throw new PaymentsError('Invalid NVM API Key');
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns the environment name used to initialize the Payments instance.
|
|
50
|
+
* @returns The environment name (e.g. 'sandbox', 'live')
|
|
51
|
+
*/
|
|
52
|
+
getEnvironmentName() {
|
|
53
|
+
return this.environmentName;
|
|
54
|
+
}
|
|
48
55
|
/**
|
|
49
56
|
* It returns the account address associated with the NVM API Key used to initialize the Payments Library instance.
|
|
50
57
|
* @returns The account address extracted from the NVM API Key
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-payments.js","sourceRoot":"","sources":["../../src/api/base-payments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,EAAoC,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEnF;;;GAGG;AACH,MAAM,OAAgB,eAAe;IAYnC,YAAY,OAAuB;QAF5B,sBAAiB,GAAG,IAAI,CAAA;QAG7B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;QAClC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAA;QACxC,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,WAA8B,CAAC,CAAA;QACvE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,WAAW,CAAA;QAC1C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAE9B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,kDAAkD;YAClD,IAAI,CAAC,cAAc,GAAG,EAAE,CAAA;YACxB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;YAChE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;YACpC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACtC,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,cAAc;QACtB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,aAAa,CAAC,yBAAyB,CAAC,CAAA;YACpD,CAAC;YACD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrC,MAAM,cAAc,GAAG,GAAG,CAAC,GAAa,CAAA;YACxC,MAAM,cAAc,GAAG,GAAG,CAAC,IAAc,CAAA;YACzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAA;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,aAAa,CAAC,qBAAqB,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,iBAAiB;QACtB,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED;;;;;;OAMG;IACO,qBAAqB,CAAC,MAAc,EAAE,IAAU;QACxD,OAAO;YACL,MAAM;YACN,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;aAC1C;YACD,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;SAC1D,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACO,oBAAoB,CAAC,MAAc,EAAE,IAAU;QACvD,MAAM,OAAO,GAOT;YACF,MAAM;YACN,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAA;QAED,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;CACF","sourcesContent":["import { decodeJwt } from 'jose'\nimport { jsonReplacer } from '../common/helper.js'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { PaymentOptions, PaymentScheme } from '../common/types.js'\nimport { EnvironmentInfo, EnvironmentName, Environments } from '../environments.js'\n\n/**\n * Base class extended by all Payments API classes.\n * It provides common functionality such as parsing the NVM API Key and getting the account address.\n */\nexport abstract class BasePaymentsAPI {\n protected nvmApiKey: string\n protected scheme: PaymentScheme\n protected environment: EnvironmentInfo\n protected environmentName: EnvironmentName\n protected returnUrl: string\n protected appId?: string\n protected version?: string\n protected accountAddress: string\n protected heliconeApiKey: string\n public isBrowserInstance = true\n\n constructor(options: PaymentOptions) {\n this.nvmApiKey = options.nvmApiKey\n this.scheme = options.scheme || 'nvm'\n this.returnUrl = options.returnUrl || ''\n this.environment = Environments[options.environment as EnvironmentName]\n this.environmentName = options.environment\n this.appId = options.appId\n this.version = options.version\n\n if (this.scheme === 'visa') {\n // Visa scheme does not use JWT-based NVM API keys\n this.accountAddress = ''\n this.heliconeApiKey = ''\n } else {\n const { accountAddress, heliconeApiKey } = this.parseNvmApiKey()\n this.accountAddress = accountAddress\n this.heliconeApiKey = heliconeApiKey\n }\n }\n\n /**\n * Parses the NVM API Key to extract the account address.\n * @throws PaymentsError if the API key is invalid.\n */\n protected parseNvmApiKey(): { accountAddress: string; heliconeApiKey: string } {\n try {\n if (!this.nvmApiKey) {\n throw new PaymentsError('NVM API Key is required')\n }\n const jwt = decodeJwt(this.nvmApiKey)\n const accountAddress = jwt.sub as string\n const heliconeApiKey = jwt.o11y as string\n return { accountAddress, heliconeApiKey }\n } catch (error) {\n throw new PaymentsError('Invalid NVM API Key')\n }\n }\n\n /**\n * It returns the account address associated with the NVM API Key used to initialize the Payments Library instance.\n * @returns The account address extracted from the NVM API Key\n */\n public getAccountAddress(): string | undefined {\n return this.accountAddress\n }\n\n /**\n * Returns the HTTP options required to query the backend.\n * @param method - HTTP method.\n * @param body - Optional request body.\n * @returns HTTP options object.\n * @internal\n */\n protected getBackendHTTPOptions(method: string, body?: any) {\n return {\n method,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.nvmApiKey}`,\n },\n ...(body && { body: JSON.stringify(body, jsonReplacer) }),\n }\n }\n\n /**\n * Get HTTP options for public backend requests (no authorization header).\n * Converts body keys from snake_case to camelCase for consistency.\n *\n * @param method - HTTP method\n * @param body - Optional request body (keys will be converted to camelCase)\n * @returns HTTP options object\n * @internal\n */\n protected getPublicHTTPOptions(method: string, body?: any) {\n const options: {\n method: string\n headers: {\n Accept: string\n 'Content-Type': string\n }\n body?: string\n } = {\n method,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n }\n\n if (body) {\n options.body = JSON.stringify(body, jsonReplacer)\n }\n\n return options\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base-payments.js","sourceRoot":"","sources":["../../src/api/base-payments.ts"],"names":[],"mappings":"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","sourcesContent":["import { decodeJwt } from 'jose'\nimport { jsonReplacer } from '../common/helper.js'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { PaymentOptions, PaymentScheme } from '../common/types.js'\nimport { EnvironmentInfo, EnvironmentName, Environments } from '../environments.js'\n\n/**\n * Base class extended by all Payments API classes.\n * It provides common functionality such as parsing the NVM API Key and getting the account address.\n */\nexport abstract class BasePaymentsAPI {\n protected nvmApiKey: string\n protected scheme: PaymentScheme\n protected environment: EnvironmentInfo\n protected environmentName: EnvironmentName\n protected returnUrl: string\n protected appId?: string\n protected version?: string\n protected accountAddress: string\n protected heliconeApiKey: string\n public isBrowserInstance = true\n\n constructor(options: PaymentOptions) {\n this.nvmApiKey = options.nvmApiKey\n this.scheme = options.scheme || 'nvm'\n this.returnUrl = options.returnUrl || ''\n this.environment = Environments[options.environment as EnvironmentName]\n this.environmentName = options.environment\n this.appId = options.appId\n this.version = options.version\n\n if (this.scheme === 'visa') {\n // Visa scheme does not use JWT-based NVM API keys\n this.accountAddress = ''\n this.heliconeApiKey = ''\n } else {\n const { accountAddress, heliconeApiKey } = this.parseNvmApiKey()\n this.accountAddress = accountAddress\n this.heliconeApiKey = heliconeApiKey\n }\n }\n\n /**\n * Parses the NVM API Key to extract the account address.\n * @throws PaymentsError if the API key is invalid.\n */\n protected parseNvmApiKey(): { accountAddress: string; heliconeApiKey: string } {\n try {\n if (!this.nvmApiKey) {\n throw new PaymentsError('NVM API Key is required')\n }\n const jwt = decodeJwt(this.nvmApiKey)\n const accountAddress = jwt.sub as string\n const heliconeApiKey = jwt.o11y as string\n return { accountAddress, heliconeApiKey }\n } catch (error) {\n throw new PaymentsError('Invalid NVM API Key')\n }\n }\n\n /**\n * Returns the environment name used to initialize the Payments instance.\n * @returns The environment name (e.g. 'sandbox', 'live')\n */\n public getEnvironmentName(): EnvironmentName {\n return this.environmentName\n }\n\n /**\n * It returns the account address associated with the NVM API Key used to initialize the Payments Library instance.\n * @returns The account address extracted from the NVM API Key\n */\n public getAccountAddress(): string | undefined {\n return this.accountAddress\n }\n\n /**\n * Returns the HTTP options required to query the backend.\n * @param method - HTTP method.\n * @param body - Optional request body.\n * @returns HTTP options object.\n * @internal\n */\n protected getBackendHTTPOptions(method: string, body?: any) {\n return {\n method,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.nvmApiKey}`,\n },\n ...(body && { body: JSON.stringify(body, jsonReplacer) }),\n }\n }\n\n /**\n * Get HTTP options for public backend requests (no authorization header).\n * Converts body keys from snake_case to camelCase for consistency.\n *\n * @param method - HTTP method\n * @param body - Optional request body (keys will be converted to camelCase)\n * @returns HTTP options object\n * @internal\n */\n protected getPublicHTTPOptions(method: string, body?: any) {\n const options: {\n method: string\n headers: {\n Accept: string\n 'Content-Type': string\n }\n body?: string\n } = {\n method,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n }\n\n if (body) {\n options.body = JSON.stringify(body, jsonReplacer)\n }\n\n return options\n }\n}\n"]}
|
package/dist/common/types.d.ts
CHANGED
|
@@ -390,9 +390,19 @@ export type SimulationRequestOptions = {
|
|
|
390
390
|
*/
|
|
391
391
|
export type X402SchemeType = 'nvm:erc4337' | 'nvm:card-delegation';
|
|
392
392
|
/**
|
|
393
|
-
* Default network for each x402 scheme.
|
|
393
|
+
* Default network for each x402 scheme (backward-compat: defaults to Base Sepolia).
|
|
394
394
|
*/
|
|
395
395
|
export declare const X402_SCHEME_NETWORKS: Record<X402SchemeType, string>;
|
|
396
|
+
/**
|
|
397
|
+
* Return the default network for a scheme, accounting for the environment.
|
|
398
|
+
*
|
|
399
|
+
* For `nvm:erc4337`, the network depends on the environment:
|
|
400
|
+
* - sandbox / staging_sandbox → `eip155:84532` (Base Sepolia)
|
|
401
|
+
* - live / staging_live → `eip155:8453` (Base Mainnet)
|
|
402
|
+
*
|
|
403
|
+
* Falls back to `X402_SCHEME_NETWORKS` when no environment is given.
|
|
404
|
+
*/
|
|
405
|
+
export declare function getDefaultNetwork(scheme: X402SchemeType, environment?: EnvironmentName): string;
|
|
396
406
|
/**
|
|
397
407
|
* Type guard to check if a value is a valid x402 scheme type.
|
|
398
408
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"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"}
|
package/dist/common/types.js
CHANGED
|
@@ -96,12 +96,36 @@ export var AgentTaskStatus;
|
|
|
96
96
|
AgentTaskStatus["PENDING"] = "PENDING";
|
|
97
97
|
})(AgentTaskStatus || (AgentTaskStatus = {}));
|
|
98
98
|
/**
|
|
99
|
-
* Default network for each x402 scheme.
|
|
99
|
+
* Default network for each x402 scheme (backward-compat: defaults to Base Sepolia).
|
|
100
100
|
*/
|
|
101
101
|
export const X402_SCHEME_NETWORKS = {
|
|
102
102
|
'nvm:erc4337': 'eip155:84532',
|
|
103
103
|
'nvm:card-delegation': 'stripe',
|
|
104
104
|
};
|
|
105
|
+
/**
|
|
106
|
+
* Environment-specific network for the erc4337 scheme.
|
|
107
|
+
*/
|
|
108
|
+
const ERC4337_NETWORK_BY_ENV = {
|
|
109
|
+
sandbox: 'eip155:84532', // Base Sepolia
|
|
110
|
+
staging_sandbox: 'eip155:84532', // Base Sepolia
|
|
111
|
+
live: 'eip155:8453', // Base Mainnet
|
|
112
|
+
staging_live: 'eip155:8453', // Base Mainnet
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Return the default network for a scheme, accounting for the environment.
|
|
116
|
+
*
|
|
117
|
+
* For `nvm:erc4337`, the network depends on the environment:
|
|
118
|
+
* - sandbox / staging_sandbox → `eip155:84532` (Base Sepolia)
|
|
119
|
+
* - live / staging_live → `eip155:8453` (Base Mainnet)
|
|
120
|
+
*
|
|
121
|
+
* Falls back to `X402_SCHEME_NETWORKS` when no environment is given.
|
|
122
|
+
*/
|
|
123
|
+
export function getDefaultNetwork(scheme, environment) {
|
|
124
|
+
if (scheme === 'nvm:erc4337' && environment) {
|
|
125
|
+
return ERC4337_NETWORK_BY_ENV[environment] ?? 'eip155:84532';
|
|
126
|
+
}
|
|
127
|
+
return X402_SCHEME_NETWORKS[scheme];
|
|
128
|
+
}
|
|
105
129
|
/**
|
|
106
130
|
* Type guard to check if a value is a valid x402 scheme type.
|
|
107
131
|
*/
|