From 07adfb872275a227a804a3ee7508d5d9109bd577 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Wed, 22 Apr 2026 08:08:51 -0700 Subject: [PATCH] Logging which faciliator was used --- src/lib/x402/facilitator-client-factory.js | 19 ++++++++++++++++++- .../x402/round-robin-facilitator-client.js | 2 ++ .../x402/facilitator-client-factory-unit.js | 5 +++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/lib/x402/facilitator-client-factory.js b/src/lib/x402/facilitator-client-factory.js index 67fe713..d07c790 100644 --- a/src/lib/x402/facilitator-client-factory.js +++ b/src/lib/x402/facilitator-client-factory.js @@ -1,6 +1,23 @@ import { HTTPFacilitatorClient } from '@x402/core/server' import { RoundRobinFacilitatorClient } from './round-robin-facilitator-client.js' +function withSettleLogging (entry) { + return { + async getSupported () { + return entry.client.getSupported() + }, + async verify (paymentPayload, paymentRequirements) { + return entry.client.verify(paymentPayload, paymentRequirements) + }, + async settle (paymentPayload, paymentRequirements) { + const result = await entry.client.settle(paymentPayload, paymentRequirements) + const tx = result?.transaction || 'n/a' + console.log(`[x402] payment settled via ${entry.name || entry.key || 'facilitator'} (${entry.url || 'no-url'}) tx=${tx}`) + return result + } + } +} + export function createFacilitatorClient (connectionOpts = [], createAuthHeaders, ClientClass = HTTPFacilitatorClient) { const entries = connectionOpts.map(o => ({ key: o.key, @@ -18,7 +35,7 @@ export function createFacilitatorClient (connectionOpts = [], createAuthHeaders, if (entries.length === 1) { return { - client: entries[0].client, + client: withSettleLogging(entries[0]), strategy: 'single' } } diff --git a/src/lib/x402/round-robin-facilitator-client.js b/src/lib/x402/round-robin-facilitator-client.js index 2d2f10d..88944dc 100644 --- a/src/lib/x402/round-robin-facilitator-client.js +++ b/src/lib/x402/round-robin-facilitator-client.js @@ -82,6 +82,8 @@ export class RoundRobinFacilitatorClient { try { const result = await entry.client.settle(paymentPayload, paymentRequirements) this.cursorByKey.set(key, (idx + 1) % length) + const tx = result?.transaction || 'n/a' + console.log(`[x402] payment settled via ${entry.name || entry.key || `facilitator-${idx}`} (${entry.url || 'no-url'}) tx=${tx}`) return result } catch (err) { attempts.push({ diff --git a/test/unit/lib/x402/facilitator-client-factory-unit.js b/test/unit/lib/x402/facilitator-client-factory-unit.js index ff801a0..592d488 100644 --- a/test/unit/lib/x402/facilitator-client-factory-unit.js +++ b/test/unit/lib/x402/facilitator-client-factory-unit.js @@ -17,8 +17,9 @@ describe('#facilitator-client-factory', () => { const result = createFacilitatorClient(connectionOpts, async () => ({}), FakeFacilitatorClient) assert.equal(result.strategy, 'single') - assert.instanceOf(result.client, FakeFacilitatorClient) - assert.equal(result.client.opts.url, 'https://cdp.example.com') + assert.isFunction(result.client.verify) + assert.isFunction(result.client.settle) + assert.isFunction(result.client.getSupported) }) it('returns round-robin strategy when multiple facilitators are configured', () => {