@t402/core 2.0.0

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.
Files changed (66) hide show
  1. package/README.md +293 -0
  2. package/dist/cjs/client/index.d.ts +103 -0
  3. package/dist/cjs/client/index.js +510 -0
  4. package/dist/cjs/client/index.js.map +1 -0
  5. package/dist/cjs/facilitator/index.d.ts +192 -0
  6. package/dist/cjs/facilitator/index.js +398 -0
  7. package/dist/cjs/facilitator/index.js.map +1 -0
  8. package/dist/cjs/http/index.d.ts +52 -0
  9. package/dist/cjs/http/index.js +763 -0
  10. package/dist/cjs/http/index.js.map +1 -0
  11. package/dist/cjs/index.d.ts +3 -0
  12. package/dist/cjs/index.js +31 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/mechanisms-CmrqNl1M.d.ts +238 -0
  15. package/dist/cjs/mechanisms-DsJn3ZiM.d.ts +238 -0
  16. package/dist/cjs/server/index.d.ts +2 -0
  17. package/dist/cjs/server/index.js +1241 -0
  18. package/dist/cjs/server/index.js.map +1 -0
  19. package/dist/cjs/t402HTTPClient-m6cjzTek.d.ts +243 -0
  20. package/dist/cjs/t402HTTPResourceServer-B-xmYMwj.d.ts +719 -0
  21. package/dist/cjs/t402HTTPResourceServer-Bcfxp2UO.d.ts +719 -0
  22. package/dist/cjs/types/index.d.ts +1 -0
  23. package/dist/cjs/types/index.js +19 -0
  24. package/dist/cjs/types/index.js.map +1 -0
  25. package/dist/cjs/types/v1/index.d.ts +1 -0
  26. package/dist/cjs/types/v1/index.js +19 -0
  27. package/dist/cjs/types/v1/index.js.map +1 -0
  28. package/dist/cjs/utils/index.d.ts +48 -0
  29. package/dist/cjs/utils/index.js +108 -0
  30. package/dist/cjs/utils/index.js.map +1 -0
  31. package/dist/esm/chunk-3IUBYRYG.mjs +78 -0
  32. package/dist/esm/chunk-3IUBYRYG.mjs.map +1 -0
  33. package/dist/esm/chunk-3VTYR43U.mjs +7 -0
  34. package/dist/esm/chunk-3VTYR43U.mjs.map +1 -0
  35. package/dist/esm/chunk-BJTO5JO5.mjs +11 -0
  36. package/dist/esm/chunk-BJTO5JO5.mjs.map +1 -0
  37. package/dist/esm/chunk-D5DYKKCZ.mjs +722 -0
  38. package/dist/esm/chunk-D5DYKKCZ.mjs.map +1 -0
  39. package/dist/esm/client/index.d.mts +103 -0
  40. package/dist/esm/client/index.mjs +356 -0
  41. package/dist/esm/client/index.mjs.map +1 -0
  42. package/dist/esm/facilitator/index.d.mts +192 -0
  43. package/dist/esm/facilitator/index.mjs +373 -0
  44. package/dist/esm/facilitator/index.mjs.map +1 -0
  45. package/dist/esm/http/index.d.mts +52 -0
  46. package/dist/esm/http/index.mjs +28 -0
  47. package/dist/esm/http/index.mjs.map +1 -0
  48. package/dist/esm/index.d.mts +3 -0
  49. package/dist/esm/index.mjs +8 -0
  50. package/dist/esm/index.mjs.map +1 -0
  51. package/dist/esm/mechanisms-CmrqNl1M.d.mts +238 -0
  52. package/dist/esm/server/index.d.mts +2 -0
  53. package/dist/esm/server/index.mjs +562 -0
  54. package/dist/esm/server/index.mjs.map +1 -0
  55. package/dist/esm/t402HTTPClient-C285YGCp.d.mts +243 -0
  56. package/dist/esm/t402HTTPResourceServer-k_l3d8ua.d.mts +719 -0
  57. package/dist/esm/types/index.d.mts +1 -0
  58. package/dist/esm/types/index.mjs +1 -0
  59. package/dist/esm/types/index.mjs.map +1 -0
  60. package/dist/esm/types/v1/index.d.mts +1 -0
  61. package/dist/esm/types/v1/index.mjs +1 -0
  62. package/dist/esm/types/v1/index.mjs.map +1 -0
  63. package/dist/esm/utils/index.d.mts +48 -0
  64. package/dist/esm/utils/index.mjs +20 -0
  65. package/dist/esm/utils/index.mjs.map +1 -0
  66. package/package.json +129 -0
@@ -0,0 +1,562 @@
1
+ import {
2
+ HTTPFacilitatorClient,
3
+ RouteConfigurationError,
4
+ t402HTTPResourceServer
5
+ } from "../chunk-D5DYKKCZ.mjs";
6
+ import {
7
+ t402Version
8
+ } from "../chunk-3VTYR43U.mjs";
9
+ import {
10
+ deepEqual,
11
+ findByNetworkAndScheme
12
+ } from "../chunk-3IUBYRYG.mjs";
13
+ import "../chunk-BJTO5JO5.mjs";
14
+
15
+ // src/server/t402ResourceServer.ts
16
+ var t402ResourceServer = class {
17
+ /**
18
+ * Creates a new t402ResourceServer instance.
19
+ *
20
+ * @param facilitatorClients - Optional facilitator client(s) for payment processing
21
+ */
22
+ constructor(facilitatorClients) {
23
+ this.registeredServerSchemes = /* @__PURE__ */ new Map();
24
+ this.supportedResponsesMap = /* @__PURE__ */ new Map();
25
+ this.facilitatorClientsMap = /* @__PURE__ */ new Map();
26
+ this.registeredExtensions = /* @__PURE__ */ new Map();
27
+ this.beforeVerifyHooks = [];
28
+ this.afterVerifyHooks = [];
29
+ this.onVerifyFailureHooks = [];
30
+ this.beforeSettleHooks = [];
31
+ this.afterSettleHooks = [];
32
+ this.onSettleFailureHooks = [];
33
+ if (!facilitatorClients) {
34
+ this.facilitatorClients = [new HTTPFacilitatorClient()];
35
+ } else if (Array.isArray(facilitatorClients)) {
36
+ this.facilitatorClients = facilitatorClients.length > 0 ? facilitatorClients : [new HTTPFacilitatorClient()];
37
+ } else {
38
+ this.facilitatorClients = [facilitatorClients];
39
+ }
40
+ }
41
+ /**
42
+ * Register a scheme/network server implementation.
43
+ *
44
+ * @param network - The network identifier
45
+ * @param server - The scheme/network server implementation
46
+ * @returns The t402ResourceServer instance for chaining
47
+ */
48
+ register(network, server) {
49
+ if (!this.registeredServerSchemes.has(network)) {
50
+ this.registeredServerSchemes.set(network, /* @__PURE__ */ new Map());
51
+ }
52
+ const serverByScheme = this.registeredServerSchemes.get(network);
53
+ if (!serverByScheme.has(server.scheme)) {
54
+ serverByScheme.set(server.scheme, server);
55
+ }
56
+ return this;
57
+ }
58
+ /**
59
+ * Check if a scheme is registered for a given network.
60
+ *
61
+ * @param network - The network identifier
62
+ * @param scheme - The payment scheme name
63
+ * @returns True if the scheme is registered for the network, false otherwise
64
+ */
65
+ hasRegisteredScheme(network, scheme) {
66
+ return !!findByNetworkAndScheme(this.registeredServerSchemes, scheme, network);
67
+ }
68
+ /**
69
+ * Registers a resource service extension that can enrich extension declarations.
70
+ *
71
+ * @param extension - The extension to register
72
+ * @returns The t402ResourceServer instance for chaining
73
+ */
74
+ registerExtension(extension) {
75
+ this.registeredExtensions.set(extension.key, extension);
76
+ return this;
77
+ }
78
+ /**
79
+ * Enriches declared extensions using registered extension hooks.
80
+ *
81
+ * @param declaredExtensions - Extensions declared on the route
82
+ * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.)
83
+ * @returns Enriched extensions map
84
+ */
85
+ enrichExtensions(declaredExtensions, transportContext) {
86
+ const enriched = {};
87
+ for (const [key, declaration] of Object.entries(declaredExtensions)) {
88
+ const extension = this.registeredExtensions.get(key);
89
+ if (extension?.enrichDeclaration) {
90
+ enriched[key] = extension.enrichDeclaration(declaration, transportContext);
91
+ } else {
92
+ enriched[key] = declaration;
93
+ }
94
+ }
95
+ return enriched;
96
+ }
97
+ /**
98
+ * Register a hook to execute before payment verification.
99
+ * Can abort verification by returning { abort: true, reason: string }
100
+ *
101
+ * @param hook - The hook function to register
102
+ * @returns The t402ResourceServer instance for chaining
103
+ */
104
+ onBeforeVerify(hook) {
105
+ this.beforeVerifyHooks.push(hook);
106
+ return this;
107
+ }
108
+ /**
109
+ * Register a hook to execute after successful payment verification.
110
+ *
111
+ * @param hook - The hook function to register
112
+ * @returns The t402ResourceServer instance for chaining
113
+ */
114
+ onAfterVerify(hook) {
115
+ this.afterVerifyHooks.push(hook);
116
+ return this;
117
+ }
118
+ /**
119
+ * Register a hook to execute when payment verification fails.
120
+ * Can recover from failure by returning { recovered: true, result: VerifyResponse }
121
+ *
122
+ * @param hook - The hook function to register
123
+ * @returns The t402ResourceServer instance for chaining
124
+ */
125
+ onVerifyFailure(hook) {
126
+ this.onVerifyFailureHooks.push(hook);
127
+ return this;
128
+ }
129
+ /**
130
+ * Register a hook to execute before payment settlement.
131
+ * Can abort settlement by returning { abort: true, reason: string }
132
+ *
133
+ * @param hook - The hook function to register
134
+ * @returns The t402ResourceServer instance for chaining
135
+ */
136
+ onBeforeSettle(hook) {
137
+ this.beforeSettleHooks.push(hook);
138
+ return this;
139
+ }
140
+ /**
141
+ * Register a hook to execute after successful payment settlement.
142
+ *
143
+ * @param hook - The hook function to register
144
+ * @returns The t402ResourceServer instance for chaining
145
+ */
146
+ onAfterSettle(hook) {
147
+ this.afterSettleHooks.push(hook);
148
+ return this;
149
+ }
150
+ /**
151
+ * Register a hook to execute when payment settlement fails.
152
+ * Can recover from failure by returning { recovered: true, result: SettleResponse }
153
+ *
154
+ * @param hook - The hook function to register
155
+ * @returns The t402ResourceServer instance for chaining
156
+ */
157
+ onSettleFailure(hook) {
158
+ this.onSettleFailureHooks.push(hook);
159
+ return this;
160
+ }
161
+ /**
162
+ * Initialize by fetching supported kinds from all facilitators
163
+ * Creates mappings for supported responses and facilitator clients
164
+ * Earlier facilitators in the array get precedence
165
+ */
166
+ async initialize() {
167
+ this.supportedResponsesMap.clear();
168
+ this.facilitatorClientsMap.clear();
169
+ for (const facilitatorClient of this.facilitatorClients) {
170
+ try {
171
+ const supported = await facilitatorClient.getSupported();
172
+ for (const kind of supported.kinds) {
173
+ const t402Version2 = kind.t402Version;
174
+ if (!this.supportedResponsesMap.has(t402Version2)) {
175
+ this.supportedResponsesMap.set(t402Version2, /* @__PURE__ */ new Map());
176
+ }
177
+ const responseVersionMap = this.supportedResponsesMap.get(t402Version2);
178
+ if (!this.facilitatorClientsMap.has(t402Version2)) {
179
+ this.facilitatorClientsMap.set(t402Version2, /* @__PURE__ */ new Map());
180
+ }
181
+ const clientVersionMap = this.facilitatorClientsMap.get(t402Version2);
182
+ if (!responseVersionMap.has(kind.network)) {
183
+ responseVersionMap.set(kind.network, /* @__PURE__ */ new Map());
184
+ }
185
+ const responseNetworkMap = responseVersionMap.get(kind.network);
186
+ if (!clientVersionMap.has(kind.network)) {
187
+ clientVersionMap.set(kind.network, /* @__PURE__ */ new Map());
188
+ }
189
+ const clientNetworkMap = clientVersionMap.get(kind.network);
190
+ if (!responseNetworkMap.has(kind.scheme)) {
191
+ responseNetworkMap.set(kind.scheme, supported);
192
+ clientNetworkMap.set(kind.scheme, facilitatorClient);
193
+ }
194
+ }
195
+ } catch (error) {
196
+ console.warn(`Failed to fetch supported kinds from facilitator: ${error}`);
197
+ }
198
+ }
199
+ }
200
+ /**
201
+ * Get supported kind for a specific version, network, and scheme
202
+ *
203
+ * @param t402Version - The t402 version
204
+ * @param network - The network identifier
205
+ * @param scheme - The payment scheme
206
+ * @returns The supported kind or undefined if not found
207
+ */
208
+ getSupportedKind(t402Version2, network, scheme) {
209
+ const versionMap = this.supportedResponsesMap.get(t402Version2);
210
+ if (!versionMap) return void 0;
211
+ const supportedResponse = findByNetworkAndScheme(versionMap, scheme, network);
212
+ if (!supportedResponse) return void 0;
213
+ return supportedResponse.kinds.find(
214
+ (kind) => kind.t402Version === t402Version2 && kind.network === network && kind.scheme === scheme
215
+ );
216
+ }
217
+ /**
218
+ * Get facilitator extensions for a specific version, network, and scheme
219
+ *
220
+ * @param t402Version - The t402 version
221
+ * @param network - The network identifier
222
+ * @param scheme - The payment scheme
223
+ * @returns The facilitator extensions or empty array if not found
224
+ */
225
+ getFacilitatorExtensions(t402Version2, network, scheme) {
226
+ const versionMap = this.supportedResponsesMap.get(t402Version2);
227
+ if (!versionMap) return [];
228
+ const supportedResponse = findByNetworkAndScheme(versionMap, scheme, network);
229
+ return supportedResponse?.extensions || [];
230
+ }
231
+ /**
232
+ * Build payment requirements for a protected resource
233
+ *
234
+ * @param resourceConfig - Configuration for the protected resource
235
+ * @returns Array of payment requirements
236
+ */
237
+ async buildPaymentRequirements(resourceConfig) {
238
+ const requirements = [];
239
+ const scheme = resourceConfig.scheme;
240
+ const SchemeNetworkServer = findByNetworkAndScheme(
241
+ this.registeredServerSchemes,
242
+ scheme,
243
+ resourceConfig.network
244
+ );
245
+ if (!SchemeNetworkServer) {
246
+ console.warn(
247
+ `No server implementation registered for scheme: ${scheme}, network: ${resourceConfig.network}`
248
+ );
249
+ return requirements;
250
+ }
251
+ const supportedKind = this.getSupportedKind(
252
+ t402Version,
253
+ resourceConfig.network,
254
+ SchemeNetworkServer.scheme
255
+ );
256
+ if (!supportedKind) {
257
+ throw new Error(
258
+ `Facilitator does not support ${SchemeNetworkServer.scheme} on ${resourceConfig.network}. Make sure to call initialize() to fetch supported kinds from facilitators.`
259
+ );
260
+ }
261
+ const facilitatorExtensions = this.getFacilitatorExtensions(
262
+ t402Version,
263
+ resourceConfig.network,
264
+ SchemeNetworkServer.scheme
265
+ );
266
+ const parsedPrice = await SchemeNetworkServer.parsePrice(
267
+ resourceConfig.price,
268
+ resourceConfig.network
269
+ );
270
+ const baseRequirements = {
271
+ scheme: SchemeNetworkServer.scheme,
272
+ network: resourceConfig.network,
273
+ amount: parsedPrice.amount,
274
+ asset: parsedPrice.asset,
275
+ payTo: resourceConfig.payTo,
276
+ maxTimeoutSeconds: resourceConfig.maxTimeoutSeconds || 300,
277
+ // Default 5 minutes
278
+ extra: {
279
+ ...parsedPrice.extra
280
+ }
281
+ };
282
+ const requirement = await SchemeNetworkServer.enhancePaymentRequirements(
283
+ baseRequirements,
284
+ {
285
+ ...supportedKind,
286
+ t402Version
287
+ },
288
+ facilitatorExtensions
289
+ );
290
+ requirements.push(requirement);
291
+ return requirements;
292
+ }
293
+ /**
294
+ * Build payment requirements from multiple payment options
295
+ * This method handles resolving dynamic payTo/price functions and builds requirements for each option
296
+ *
297
+ * @param paymentOptions - Array of payment options to convert
298
+ * @param context - HTTP request context for resolving dynamic functions
299
+ * @returns Array of payment requirements (one per option)
300
+ */
301
+ async buildPaymentRequirementsFromOptions(paymentOptions, context) {
302
+ const allRequirements = [];
303
+ for (const option of paymentOptions) {
304
+ const resolvedPayTo = typeof option.payTo === "function" ? await option.payTo(context) : option.payTo;
305
+ const resolvedPrice = typeof option.price === "function" ? await option.price(context) : option.price;
306
+ const resourceConfig = {
307
+ scheme: option.scheme,
308
+ payTo: resolvedPayTo,
309
+ price: resolvedPrice,
310
+ network: option.network,
311
+ maxTimeoutSeconds: option.maxTimeoutSeconds
312
+ };
313
+ const requirements = await this.buildPaymentRequirements(resourceConfig);
314
+ allRequirements.push(...requirements);
315
+ }
316
+ return allRequirements;
317
+ }
318
+ /**
319
+ * Create a payment required response
320
+ *
321
+ * @param requirements - Payment requirements
322
+ * @param resourceInfo - Resource information
323
+ * @param error - Error message
324
+ * @param extensions - Optional extensions
325
+ * @returns Payment required response object
326
+ */
327
+ createPaymentRequiredResponse(requirements, resourceInfo, error, extensions) {
328
+ const response = {
329
+ t402Version: 2,
330
+ error,
331
+ resource: resourceInfo,
332
+ accepts: requirements
333
+ };
334
+ if (extensions && Object.keys(extensions).length > 0) {
335
+ response.extensions = extensions;
336
+ }
337
+ return response;
338
+ }
339
+ /**
340
+ * Verify a payment against requirements
341
+ *
342
+ * @param paymentPayload - The payment payload to verify
343
+ * @param requirements - The payment requirements
344
+ * @returns Verification response
345
+ */
346
+ async verifyPayment(paymentPayload, requirements) {
347
+ const context = {
348
+ paymentPayload,
349
+ requirements
350
+ };
351
+ for (const hook of this.beforeVerifyHooks) {
352
+ const result = await hook(context);
353
+ if (result && "abort" in result && result.abort) {
354
+ return {
355
+ isValid: false,
356
+ invalidReason: result.reason
357
+ };
358
+ }
359
+ }
360
+ try {
361
+ const facilitatorClient = this.getFacilitatorClient(
362
+ paymentPayload.t402Version,
363
+ requirements.network,
364
+ requirements.scheme
365
+ );
366
+ let verifyResult;
367
+ if (!facilitatorClient) {
368
+ let lastError;
369
+ for (const client of this.facilitatorClients) {
370
+ try {
371
+ verifyResult = await client.verify(paymentPayload, requirements);
372
+ break;
373
+ } catch (error) {
374
+ lastError = error;
375
+ }
376
+ }
377
+ if (!verifyResult) {
378
+ throw lastError || new Error(
379
+ `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.t402Version}`
380
+ );
381
+ }
382
+ } else {
383
+ verifyResult = await facilitatorClient.verify(paymentPayload, requirements);
384
+ }
385
+ const resultContext = {
386
+ ...context,
387
+ result: verifyResult
388
+ };
389
+ for (const hook of this.afterVerifyHooks) {
390
+ await hook(resultContext);
391
+ }
392
+ return verifyResult;
393
+ } catch (error) {
394
+ const failureContext = {
395
+ ...context,
396
+ error
397
+ };
398
+ for (const hook of this.onVerifyFailureHooks) {
399
+ const result = await hook(failureContext);
400
+ if (result && "recovered" in result && result.recovered) {
401
+ return result.result;
402
+ }
403
+ }
404
+ throw error;
405
+ }
406
+ }
407
+ /**
408
+ * Settle a verified payment
409
+ *
410
+ * @param paymentPayload - The payment payload to settle
411
+ * @param requirements - The payment requirements
412
+ * @returns Settlement response
413
+ */
414
+ async settlePayment(paymentPayload, requirements) {
415
+ const context = {
416
+ paymentPayload,
417
+ requirements
418
+ };
419
+ for (const hook of this.beforeSettleHooks) {
420
+ const result = await hook(context);
421
+ if (result && "abort" in result && result.abort) {
422
+ throw new Error(`Settlement aborted: ${result.reason}`);
423
+ }
424
+ }
425
+ try {
426
+ const facilitatorClient = this.getFacilitatorClient(
427
+ paymentPayload.t402Version,
428
+ requirements.network,
429
+ requirements.scheme
430
+ );
431
+ let settleResult;
432
+ if (!facilitatorClient) {
433
+ let lastError;
434
+ for (const client of this.facilitatorClients) {
435
+ try {
436
+ settleResult = await client.settle(paymentPayload, requirements);
437
+ break;
438
+ } catch (error) {
439
+ lastError = error;
440
+ }
441
+ }
442
+ if (!settleResult) {
443
+ throw lastError || new Error(
444
+ `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.t402Version}`
445
+ );
446
+ }
447
+ } else {
448
+ settleResult = await facilitatorClient.settle(paymentPayload, requirements);
449
+ }
450
+ const resultContext = {
451
+ ...context,
452
+ result: settleResult
453
+ };
454
+ for (const hook of this.afterSettleHooks) {
455
+ await hook(resultContext);
456
+ }
457
+ return settleResult;
458
+ } catch (error) {
459
+ const failureContext = {
460
+ ...context,
461
+ error
462
+ };
463
+ for (const hook of this.onSettleFailureHooks) {
464
+ const result = await hook(failureContext);
465
+ if (result && "recovered" in result && result.recovered) {
466
+ return result.result;
467
+ }
468
+ }
469
+ throw error;
470
+ }
471
+ }
472
+ /**
473
+ * Find matching payment requirements for a payment
474
+ *
475
+ * @param availableRequirements - Array of available payment requirements
476
+ * @param paymentPayload - The payment payload
477
+ * @returns Matching payment requirements or undefined
478
+ */
479
+ findMatchingRequirements(availableRequirements, paymentPayload) {
480
+ switch (paymentPayload.t402Version) {
481
+ case 2:
482
+ return availableRequirements.find(
483
+ (paymentRequirements) => deepEqual(paymentRequirements, paymentPayload.accepted)
484
+ );
485
+ case 1:
486
+ return availableRequirements.find(
487
+ (req) => req.scheme === paymentPayload.accepted.scheme && req.network === paymentPayload.accepted.network
488
+ );
489
+ default:
490
+ throw new Error(
491
+ `Unsupported t402 version: ${paymentPayload.t402Version}`
492
+ );
493
+ }
494
+ }
495
+ /**
496
+ * Process a payment request
497
+ *
498
+ * @param paymentPayload - Optional payment payload if provided
499
+ * @param resourceConfig - Configuration for the protected resource
500
+ * @param resourceInfo - Information about the resource being accessed
501
+ * @param extensions - Optional extensions to include in the response
502
+ * @returns Processing result
503
+ */
504
+ async processPaymentRequest(paymentPayload, resourceConfig, resourceInfo, extensions) {
505
+ const requirements = await this.buildPaymentRequirements(resourceConfig);
506
+ if (!paymentPayload) {
507
+ return {
508
+ success: false,
509
+ requiresPayment: this.createPaymentRequiredResponse(
510
+ requirements,
511
+ resourceInfo,
512
+ "Payment required",
513
+ extensions
514
+ )
515
+ };
516
+ }
517
+ const matchingRequirements = this.findMatchingRequirements(requirements, paymentPayload);
518
+ if (!matchingRequirements) {
519
+ return {
520
+ success: false,
521
+ requiresPayment: this.createPaymentRequiredResponse(
522
+ requirements,
523
+ resourceInfo,
524
+ "No matching payment requirements found",
525
+ extensions
526
+ )
527
+ };
528
+ }
529
+ const verificationResult = await this.verifyPayment(paymentPayload, matchingRequirements);
530
+ if (!verificationResult.isValid) {
531
+ return {
532
+ success: false,
533
+ error: verificationResult.invalidReason,
534
+ verificationResult
535
+ };
536
+ }
537
+ return {
538
+ success: true,
539
+ verificationResult
540
+ };
541
+ }
542
+ /**
543
+ * Get facilitator client for a specific version, network, and scheme
544
+ *
545
+ * @param t402Version - The t402 version
546
+ * @param network - The network identifier
547
+ * @param scheme - The payment scheme
548
+ * @returns The facilitator client or undefined if not found
549
+ */
550
+ getFacilitatorClient(t402Version2, network, scheme) {
551
+ const versionMap = this.facilitatorClientsMap.get(t402Version2);
552
+ if (!versionMap) return void 0;
553
+ return findByNetworkAndScheme(versionMap, scheme, network);
554
+ }
555
+ };
556
+ export {
557
+ HTTPFacilitatorClient,
558
+ RouteConfigurationError,
559
+ t402HTTPResourceServer,
560
+ t402ResourceServer
561
+ };
562
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/t402ResourceServer.ts"],"sourcesContent":["import {\n SettleResponse,\n VerifyResponse,\n SupportedResponse,\n SupportedKind,\n} from \"../types/facilitator\";\nimport { PaymentPayload, PaymentRequirements, PaymentRequired } from \"../types/payments\";\nimport { SchemeNetworkServer } from \"../types/mechanisms\";\nimport { Price, Network, ResourceServerExtension } from \"../types\";\nimport { deepEqual, findByNetworkAndScheme } from \"../utils\";\nimport { FacilitatorClient, HTTPFacilitatorClient } from \"../http/httpFacilitatorClient\";\nimport { t402Version } from \"..\";\n\n/**\n * Configuration for a protected resource\n * Only contains payment-specific configuration, not resource metadata\n */\nexport interface ResourceConfig {\n scheme: string;\n payTo: string; // Payment recipient address\n price: Price;\n network: Network;\n maxTimeoutSeconds?: number;\n}\n\n/**\n * Resource information for PaymentRequired response\n */\nexport interface ResourceInfo {\n url: string;\n description: string;\n mimeType: string;\n}\n\n/**\n * Lifecycle Hook Context Interfaces\n */\n\nexport interface VerifyContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface VerifyResultContext extends VerifyContext {\n result: VerifyResponse;\n}\n\nexport interface VerifyFailureContext extends VerifyContext {\n error: Error;\n}\n\nexport interface SettleContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface SettleResultContext extends SettleContext {\n result: SettleResponse;\n}\n\nexport interface SettleFailureContext extends SettleContext {\n error: Error;\n}\n\n/**\n * Lifecycle Hook Type Definitions\n */\n\nexport type BeforeVerifyHook = (\n context: VerifyContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterVerifyHook = (context: VerifyResultContext) => Promise<void>;\n\nexport type OnVerifyFailureHook = (\n context: VerifyFailureContext,\n) => Promise<void | { recovered: true; result: VerifyResponse }>;\n\nexport type BeforeSettleHook = (\n context: SettleContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterSettleHook = (context: SettleResultContext) => Promise<void>;\n\nexport type OnSettleFailureHook = (\n context: SettleFailureContext,\n) => Promise<void | { recovered: true; result: SettleResponse }>;\n\n/**\n * Core t402 protocol server for resource protection\n * Transport-agnostic implementation of the t402 payment protocol\n */\nexport class t402ResourceServer {\n private facilitatorClients: FacilitatorClient[];\n private registeredServerSchemes: Map<string, Map<string, SchemeNetworkServer>> = new Map();\n private supportedResponsesMap: Map<number, Map<string, Map<string, SupportedResponse>>> =\n new Map();\n private facilitatorClientsMap: Map<number, Map<string, Map<string, FacilitatorClient>>> =\n new Map();\n private registeredExtensions: Map<string, ResourceServerExtension> = new Map();\n\n private beforeVerifyHooks: BeforeVerifyHook[] = [];\n private afterVerifyHooks: AfterVerifyHook[] = [];\n private onVerifyFailureHooks: OnVerifyFailureHook[] = [];\n private beforeSettleHooks: BeforeSettleHook[] = [];\n private afterSettleHooks: AfterSettleHook[] = [];\n private onSettleFailureHooks: OnSettleFailureHook[] = [];\n\n /**\n * Creates a new t402ResourceServer instance.\n *\n * @param facilitatorClients - Optional facilitator client(s) for payment processing\n */\n constructor(facilitatorClients?: FacilitatorClient | FacilitatorClient[]) {\n // Normalize facilitator clients to array\n if (!facilitatorClients) {\n // No clients provided, create a default HTTP client\n this.facilitatorClients = [new HTTPFacilitatorClient()];\n } else if (Array.isArray(facilitatorClients)) {\n // Array of clients provided\n this.facilitatorClients =\n facilitatorClients.length > 0 ? facilitatorClients : [new HTTPFacilitatorClient()];\n } else {\n // Single client provided\n this.facilitatorClients = [facilitatorClients];\n }\n }\n\n /**\n * Register a scheme/network server implementation.\n *\n * @param network - The network identifier\n * @param server - The scheme/network server implementation\n * @returns The t402ResourceServer instance for chaining\n */\n register(network: Network, server: SchemeNetworkServer): t402ResourceServer {\n if (!this.registeredServerSchemes.has(network)) {\n this.registeredServerSchemes.set(network, new Map());\n }\n\n const serverByScheme = this.registeredServerSchemes.get(network)!;\n if (!serverByScheme.has(server.scheme)) {\n serverByScheme.set(server.scheme, server);\n }\n\n return this;\n }\n\n /**\n * Check if a scheme is registered for a given network.\n *\n * @param network - The network identifier\n * @param scheme - The payment scheme name\n * @returns True if the scheme is registered for the network, false otherwise\n */\n hasRegisteredScheme(network: Network, scheme: string): boolean {\n return !!findByNetworkAndScheme(this.registeredServerSchemes, scheme, network);\n }\n\n /**\n * Registers a resource service extension that can enrich extension declarations.\n *\n * @param extension - The extension to register\n * @returns The t402ResourceServer instance for chaining\n */\n registerExtension(extension: ResourceServerExtension): this {\n this.registeredExtensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Enriches declared extensions using registered extension hooks.\n *\n * @param declaredExtensions - Extensions declared on the route\n * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.)\n * @returns Enriched extensions map\n */\n enrichExtensions(\n declaredExtensions: Record<string, unknown>,\n transportContext: unknown,\n ): Record<string, unknown> {\n const enriched: Record<string, unknown> = {};\n\n for (const [key, declaration] of Object.entries(declaredExtensions)) {\n const extension = this.registeredExtensions.get(key);\n\n if (extension?.enrichDeclaration) {\n enriched[key] = extension.enrichDeclaration(declaration, transportContext);\n } else {\n enriched[key] = declaration;\n }\n }\n\n return enriched;\n }\n\n /**\n * Register a hook to execute before payment verification.\n * Can abort verification by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The t402ResourceServer instance for chaining\n */\n onBeforeVerify(hook: BeforeVerifyHook): t402ResourceServer {\n this.beforeVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment verification.\n *\n * @param hook - The hook function to register\n * @returns The t402ResourceServer instance for chaining\n */\n onAfterVerify(hook: AfterVerifyHook): t402ResourceServer {\n this.afterVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment verification fails.\n * Can recover from failure by returning { recovered: true, result: VerifyResponse }\n *\n * @param hook - The hook function to register\n * @returns The t402ResourceServer instance for chaining\n */\n onVerifyFailure(hook: OnVerifyFailureHook): t402ResourceServer {\n this.onVerifyFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute before payment settlement.\n * Can abort settlement by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The t402ResourceServer instance for chaining\n */\n onBeforeSettle(hook: BeforeSettleHook): t402ResourceServer {\n this.beforeSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment settlement.\n *\n * @param hook - The hook function to register\n * @returns The t402ResourceServer instance for chaining\n */\n onAfterSettle(hook: AfterSettleHook): t402ResourceServer {\n this.afterSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment settlement fails.\n * Can recover from failure by returning { recovered: true, result: SettleResponse }\n *\n * @param hook - The hook function to register\n * @returns The t402ResourceServer instance for chaining\n */\n onSettleFailure(hook: OnSettleFailureHook): t402ResourceServer {\n this.onSettleFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Initialize by fetching supported kinds from all facilitators\n * Creates mappings for supported responses and facilitator clients\n * Earlier facilitators in the array get precedence\n */\n async initialize(): Promise<void> {\n // Clear existing mappings\n this.supportedResponsesMap.clear();\n this.facilitatorClientsMap.clear();\n\n // Fetch supported kinds from all facilitator clients\n // Process in order to give precedence to earlier facilitators\n for (const facilitatorClient of this.facilitatorClients) {\n try {\n const supported = await facilitatorClient.getSupported();\n\n // Process each supported kind (now flat array with version in each element)\n for (const kind of supported.kinds) {\n const t402Version = kind.t402Version;\n\n // Get or create version map for supported responses\n if (!this.supportedResponsesMap.has(t402Version)) {\n this.supportedResponsesMap.set(t402Version, new Map());\n }\n const responseVersionMap = this.supportedResponsesMap.get(t402Version)!;\n\n // Get or create version map for facilitator clients\n if (!this.facilitatorClientsMap.has(t402Version)) {\n this.facilitatorClientsMap.set(t402Version, new Map());\n }\n const clientVersionMap = this.facilitatorClientsMap.get(t402Version)!;\n\n // Get or create network map for responses\n if (!responseVersionMap.has(kind.network)) {\n responseVersionMap.set(kind.network, new Map());\n }\n const responseNetworkMap = responseVersionMap.get(kind.network)!;\n\n // Get or create network map for clients\n if (!clientVersionMap.has(kind.network)) {\n clientVersionMap.set(kind.network, new Map());\n }\n const clientNetworkMap = clientVersionMap.get(kind.network)!;\n\n // Only store if not already present (gives precedence to earlier facilitators)\n if (!responseNetworkMap.has(kind.scheme)) {\n responseNetworkMap.set(kind.scheme, supported);\n clientNetworkMap.set(kind.scheme, facilitatorClient);\n }\n }\n } catch (error) {\n // Log error but continue with other facilitators\n console.warn(`Failed to fetch supported kinds from facilitator: ${error}`);\n }\n }\n }\n\n /**\n * Get supported kind for a specific version, network, and scheme\n *\n * @param t402Version - The t402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The supported kind or undefined if not found\n */\n getSupportedKind(\n t402Version: number,\n network: Network,\n scheme: string,\n ): SupportedKind | undefined {\n const versionMap = this.supportedResponsesMap.get(t402Version);\n if (!versionMap) return undefined;\n\n const supportedResponse = findByNetworkAndScheme(versionMap, scheme, network);\n if (!supportedResponse) return undefined;\n\n // Find the specific kind from the response (kinds are flat array with version in each element)\n return supportedResponse.kinds.find(\n kind =>\n kind.t402Version === t402Version && kind.network === network && kind.scheme === scheme,\n );\n }\n\n /**\n * Get facilitator extensions for a specific version, network, and scheme\n *\n * @param t402Version - The t402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The facilitator extensions or empty array if not found\n */\n getFacilitatorExtensions(t402Version: number, network: Network, scheme: string): string[] {\n const versionMap = this.supportedResponsesMap.get(t402Version);\n if (!versionMap) return [];\n\n const supportedResponse = findByNetworkAndScheme(versionMap, scheme, network);\n return supportedResponse?.extensions || [];\n }\n\n /**\n * Build payment requirements for a protected resource\n *\n * @param resourceConfig - Configuration for the protected resource\n * @returns Array of payment requirements\n */\n async buildPaymentRequirements(resourceConfig: ResourceConfig): Promise<PaymentRequirements[]> {\n const requirements: PaymentRequirements[] = [];\n\n // Find the matching server implementation\n const scheme = resourceConfig.scheme;\n const SchemeNetworkServer = findByNetworkAndScheme(\n this.registeredServerSchemes,\n scheme,\n resourceConfig.network,\n );\n\n if (!SchemeNetworkServer) {\n // Fallback to placeholder implementation if no server registered\n // TODO: Remove this fallback once implementations are registered\n console.warn(\n `No server implementation registered for scheme: ${scheme}, network: ${resourceConfig.network}`,\n );\n return requirements;\n }\n\n // Find the matching supported kind from facilitator\n const supportedKind = this.getSupportedKind(\n t402Version,\n resourceConfig.network,\n SchemeNetworkServer.scheme,\n );\n\n if (!supportedKind) {\n throw new Error(\n `Facilitator does not support ${SchemeNetworkServer.scheme} on ${resourceConfig.network}. ` +\n `Make sure to call initialize() to fetch supported kinds from facilitators.`,\n );\n }\n\n // Get facilitator extensions for this combination\n const facilitatorExtensions = this.getFacilitatorExtensions(\n t402Version,\n resourceConfig.network,\n SchemeNetworkServer.scheme,\n );\n\n // Parse the price using the scheme's price parser\n const parsedPrice = await SchemeNetworkServer.parsePrice(\n resourceConfig.price,\n resourceConfig.network,\n );\n\n // Build base payment requirements from resource config\n const baseRequirements: PaymentRequirements = {\n scheme: SchemeNetworkServer.scheme,\n network: resourceConfig.network,\n amount: parsedPrice.amount,\n asset: parsedPrice.asset,\n payTo: resourceConfig.payTo,\n maxTimeoutSeconds: resourceConfig.maxTimeoutSeconds || 300, // Default 5 minutes\n extra: {\n ...parsedPrice.extra,\n },\n };\n\n // Delegate to the implementation for scheme-specific enhancements\n // Note: enhancePaymentRequirements expects t402Version in the kind, so we add it back\n const requirement = await SchemeNetworkServer.enhancePaymentRequirements(\n baseRequirements,\n {\n ...supportedKind,\n t402Version,\n },\n facilitatorExtensions,\n );\n\n requirements.push(requirement);\n return requirements;\n }\n\n /**\n * Build payment requirements from multiple payment options\n * This method handles resolving dynamic payTo/price functions and builds requirements for each option\n *\n * @param paymentOptions - Array of payment options to convert\n * @param context - HTTP request context for resolving dynamic functions\n * @returns Array of payment requirements (one per option)\n */\n async buildPaymentRequirementsFromOptions<TContext = unknown>(\n paymentOptions: Array<{\n scheme: string;\n payTo: string | ((context: TContext) => string | Promise<string>);\n price: Price | ((context: TContext) => Price | Promise<Price>);\n network: Network;\n maxTimeoutSeconds?: number;\n }>,\n context: TContext,\n ): Promise<PaymentRequirements[]> {\n const allRequirements: PaymentRequirements[] = [];\n\n for (const option of paymentOptions) {\n // Resolve dynamic payTo and price if they are functions\n const resolvedPayTo =\n typeof option.payTo === \"function\" ? await option.payTo(context) : option.payTo;\n const resolvedPrice =\n typeof option.price === \"function\" ? await option.price(context) : option.price;\n\n const resourceConfig: ResourceConfig = {\n scheme: option.scheme,\n payTo: resolvedPayTo,\n price: resolvedPrice,\n network: option.network,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n };\n\n // Use existing buildPaymentRequirements for each option\n const requirements = await this.buildPaymentRequirements(resourceConfig);\n allRequirements.push(...requirements);\n }\n\n return allRequirements;\n }\n\n /**\n * Create a payment required response\n *\n * @param requirements - Payment requirements\n * @param resourceInfo - Resource information\n * @param error - Error message\n * @param extensions - Optional extensions\n * @returns Payment required response object\n */\n createPaymentRequiredResponse(\n requirements: PaymentRequirements[],\n resourceInfo: ResourceInfo,\n error?: string,\n extensions?: Record<string, unknown>,\n ): PaymentRequired {\n // V2 response with resource at top level\n const response: PaymentRequired = {\n t402Version: 2,\n error,\n resource: resourceInfo,\n accepts: requirements as PaymentRequirements[],\n };\n\n // Add extensions if provided\n if (extensions && Object.keys(extensions).length > 0) {\n response.extensions = extensions;\n }\n\n return response;\n }\n\n /**\n * Verify a payment against requirements\n *\n * @param paymentPayload - The payment payload to verify\n * @param requirements - The payment requirements\n * @returns Verification response\n */\n async verifyPayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const context: VerifyContext = {\n paymentPayload,\n requirements,\n };\n\n // Execute beforeVerify hooks\n for (const hook of this.beforeVerifyHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n return {\n isValid: false,\n invalidReason: result.reason,\n };\n }\n }\n\n try {\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.t402Version,\n requirements.network,\n requirements.scheme,\n );\n\n let verifyResult: VerifyResponse;\n\n if (!facilitatorClient) {\n // Fallback: try all facilitators if no specific support found\n let lastError: Error | undefined;\n\n for (const client of this.facilitatorClients) {\n try {\n verifyResult = await client.verify(paymentPayload, requirements);\n break;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (!verifyResult!) {\n throw (\n lastError ||\n new Error(\n `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.t402Version}`,\n )\n );\n }\n } else {\n // Use the specific facilitator that supports this payment\n verifyResult = await facilitatorClient.verify(paymentPayload, requirements);\n }\n\n // Execute afterVerify hooks\n const resultContext: VerifyResultContext = {\n ...context,\n result: verifyResult,\n };\n\n for (const hook of this.afterVerifyHooks) {\n await hook(resultContext);\n }\n\n return verifyResult;\n } catch (error) {\n const failureContext: VerifyFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onVerifyFailure hooks\n for (const hook of this.onVerifyFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Settle a verified payment\n *\n * @param paymentPayload - The payment payload to settle\n * @param requirements - The payment requirements\n * @returns Settlement response\n */\n async settlePayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const context: SettleContext = {\n paymentPayload,\n requirements,\n };\n\n // Execute beforeSettle hooks\n for (const hook of this.beforeSettleHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Settlement aborted: ${result.reason}`);\n }\n }\n\n try {\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.t402Version,\n requirements.network,\n requirements.scheme,\n );\n\n let settleResult: SettleResponse;\n\n if (!facilitatorClient) {\n // Fallback: try all facilitators if no specific support found\n let lastError: Error | undefined;\n\n for (const client of this.facilitatorClients) {\n try {\n settleResult = await client.settle(paymentPayload, requirements);\n break;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (!settleResult!) {\n throw (\n lastError ||\n new Error(\n `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.t402Version}`,\n )\n );\n }\n } else {\n // Use the specific facilitator that supports this payment\n settleResult = await facilitatorClient.settle(paymentPayload, requirements);\n }\n\n // Execute afterSettle hooks\n const resultContext: SettleResultContext = {\n ...context,\n result: settleResult,\n };\n\n for (const hook of this.afterSettleHooks) {\n await hook(resultContext);\n }\n\n return settleResult;\n } catch (error) {\n const failureContext: SettleFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onSettleFailure hooks\n for (const hook of this.onSettleFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Find matching payment requirements for a payment\n *\n * @param availableRequirements - Array of available payment requirements\n * @param paymentPayload - The payment payload\n * @returns Matching payment requirements or undefined\n */\n findMatchingRequirements(\n availableRequirements: PaymentRequirements[],\n paymentPayload: PaymentPayload,\n ): PaymentRequirements | undefined {\n switch (paymentPayload.t402Version) {\n case 2:\n // For v2, match by accepted requirements\n return availableRequirements.find(paymentRequirements =>\n deepEqual(paymentRequirements, paymentPayload.accepted),\n );\n case 1:\n // For v1, match by scheme and network\n return availableRequirements.find(\n req =>\n req.scheme === paymentPayload.accepted.scheme &&\n req.network === paymentPayload.accepted.network,\n );\n default:\n throw new Error(\n `Unsupported t402 version: ${(paymentPayload as PaymentPayload).t402Version}`,\n );\n }\n }\n\n /**\n * Process a payment request\n *\n * @param paymentPayload - Optional payment payload if provided\n * @param resourceConfig - Configuration for the protected resource\n * @param resourceInfo - Information about the resource being accessed\n * @param extensions - Optional extensions to include in the response\n * @returns Processing result\n */\n async processPaymentRequest(\n paymentPayload: PaymentPayload | null,\n resourceConfig: ResourceConfig,\n resourceInfo: ResourceInfo,\n extensions?: Record<string, unknown>,\n ): Promise<{\n success: boolean;\n requiresPayment?: PaymentRequired;\n verificationResult?: VerifyResponse;\n settlementResult?: SettleResponse;\n error?: string;\n }> {\n const requirements = await this.buildPaymentRequirements(resourceConfig);\n\n if (!paymentPayload) {\n return {\n success: false,\n requiresPayment: this.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"Payment required\",\n extensions,\n ),\n };\n }\n\n // Find matching requirements\n const matchingRequirements = this.findMatchingRequirements(requirements, paymentPayload);\n if (!matchingRequirements) {\n return {\n success: false,\n requiresPayment: this.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"No matching payment requirements found\",\n extensions,\n ),\n };\n }\n\n // Verify payment\n const verificationResult = await this.verifyPayment(paymentPayload, matchingRequirements);\n if (!verificationResult.isValid) {\n return {\n success: false,\n error: verificationResult.invalidReason,\n verificationResult,\n };\n }\n\n // Payment verified, ready for settlement\n return {\n success: true,\n verificationResult,\n };\n }\n\n /**\n * Get facilitator client for a specific version, network, and scheme\n *\n * @param t402Version - The t402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The facilitator client or undefined if not found\n */\n private getFacilitatorClient(\n t402Version: number,\n network: Network,\n scheme: string,\n ): FacilitatorClient | undefined {\n const versionMap = this.facilitatorClientsMap.get(t402Version);\n if (!versionMap) return undefined;\n\n // Use findByNetworkAndScheme for pattern matching\n return findByNetworkAndScheme(versionMap, scheme, network);\n }\n}\n\nexport default t402ResourceServer;\n"],"mappings":"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","names":["t402Version"]}