@agirails/sdk 3.2.0 → 3.4.1
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/LICENSE +1 -1
- package/README.md +12 -14
- package/dist/ACTPClient.d.ts +8 -11
- package/dist/ACTPClient.d.ts.map +1 -1
- package/dist/ACTPClient.js +79 -20
- package/dist/ACTPClient.js.map +1 -1
- package/dist/__tests__/helpers/mockX402Server.d.ts +67 -0
- package/dist/__tests__/helpers/mockX402Server.d.ts.map +1 -0
- package/dist/__tests__/helpers/mockX402Server.js +121 -0
- package/dist/__tests__/helpers/mockX402Server.js.map +1 -0
- package/dist/adapters/BaseAdapter.d.ts +7 -1
- package/dist/adapters/BaseAdapter.d.ts.map +1 -1
- package/dist/adapters/BaseAdapter.js +11 -6
- package/dist/adapters/BaseAdapter.js.map +1 -1
- package/dist/adapters/BasicAdapter.d.ts.map +1 -1
- package/dist/adapters/BasicAdapter.js +12 -2
- package/dist/adapters/BasicAdapter.js.map +1 -1
- package/dist/adapters/StandardAdapter.d.ts.map +1 -1
- package/dist/adapters/StandardAdapter.js +12 -2
- package/dist/adapters/StandardAdapter.js.map +1 -1
- package/dist/adapters/X402Adapter.d.ts +161 -199
- package/dist/adapters/X402Adapter.d.ts.map +1 -1
- package/dist/adapters/X402Adapter.js +603 -414
- package/dist/adapters/X402Adapter.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/api/agirailsApp.d.ts +21 -1
- package/dist/api/agirailsApp.d.ts.map +1 -1
- package/dist/api/agirailsApp.js.map +1 -1
- package/dist/builders/CounterAcceptBuilder.d.ts +96 -0
- package/dist/builders/CounterAcceptBuilder.d.ts.map +1 -0
- package/dist/builders/CounterAcceptBuilder.js +226 -0
- package/dist/builders/CounterAcceptBuilder.js.map +1 -0
- package/dist/builders/CounterOfferBuilder.d.ts +143 -0
- package/dist/builders/CounterOfferBuilder.d.ts.map +1 -0
- package/dist/builders/CounterOfferBuilder.js +329 -0
- package/dist/builders/CounterOfferBuilder.js.map +1 -0
- package/dist/builders/DeliveryProofBuilder.d.ts.map +1 -1
- package/dist/builders/DeliveryProofBuilder.js +3 -2
- package/dist/builders/DeliveryProofBuilder.js.map +1 -1
- package/dist/builders/QuoteBuilder.d.ts.map +1 -1
- package/dist/builders/QuoteBuilder.js +8 -3
- package/dist/builders/QuoteBuilder.js.map +1 -1
- package/dist/builders/index.d.ts +2 -0
- package/dist/builders/index.d.ts.map +1 -1
- package/dist/builders/index.js +7 -1
- package/dist/builders/index.js.map +1 -1
- package/dist/cli/agirails.js +34 -6
- package/dist/cli/agirails.js.map +1 -1
- package/dist/cli/commands/autopublish.js +9 -1
- package/dist/cli/commands/autopublish.js.map +1 -1
- package/dist/cli/commands/config.js +1 -12
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/deploy-env.js +1 -1
- package/dist/cli/commands/deploy-env.js.map +1 -1
- package/dist/cli/commands/diff.js +38 -4
- package/dist/cli/commands/diff.js.map +1 -1
- package/dist/cli/commands/health.js +24 -6
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +100 -7
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/pay.d.ts.map +1 -1
- package/dist/cli/commands/pay.js +23 -0
- package/dist/cli/commands/pay.js.map +1 -1
- package/dist/cli/commands/publish.d.ts +34 -0
- package/dist/cli/commands/publish.d.ts.map +1 -1
- package/dist/cli/commands/publish.js +266 -83
- package/dist/cli/commands/publish.js.map +1 -1
- package/dist/cli/commands/pull.js +3 -1
- package/dist/cli/commands/pull.js.map +1 -1
- package/dist/cli/commands/receipt.d.ts +17 -3
- package/dist/cli/commands/receipt.d.ts.map +1 -1
- package/dist/cli/commands/receipt.js +95 -33
- package/dist/cli/commands/receipt.js.map +1 -1
- package/dist/cli/commands/repair.d.ts +23 -0
- package/dist/cli/commands/repair.d.ts.map +1 -0
- package/dist/cli/commands/repair.js +210 -0
- package/dist/cli/commands/repair.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +38 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +308 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/test.d.ts.map +1 -1
- package/dist/cli/commands/test.js +222 -60
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/tx.js +13 -0
- package/dist/cli/commands/tx.js.map +1 -1
- package/dist/cli/index.js +9 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/receiptUpload.d.ts +52 -0
- package/dist/cli/receiptUpload.d.ts.map +1 -0
- package/dist/cli/receiptUpload.js +134 -0
- package/dist/cli/receiptUpload.js.map +1 -0
- package/dist/cli/utils/banner.d.ts +31 -0
- package/dist/cli/utils/banner.d.ts.map +1 -0
- package/dist/cli/utils/banner.js +92 -0
- package/dist/cli/utils/banner.js.map +1 -0
- package/dist/cli/utils/config.d.ts +0 -2
- package/dist/cli/utils/config.d.ts.map +1 -1
- package/dist/cli/utils/config.js +40 -25
- package/dist/cli/utils/config.js.map +1 -1
- package/dist/cli/utils/output.d.ts +2 -0
- package/dist/cli/utils/output.d.ts.map +1 -1
- package/dist/cli/utils/output.js +7 -1
- package/dist/cli/utils/output.js.map +1 -1
- package/dist/cli/utils/share.d.ts +51 -0
- package/dist/cli/utils/share.d.ts.map +1 -0
- package/dist/cli/utils/share.js +133 -0
- package/dist/cli/utils/share.js.map +1 -0
- package/dist/config/agirailsmd.d.ts.map +1 -1
- package/dist/config/agirailsmd.js +2 -1
- package/dist/config/agirailsmd.js.map +1 -1
- package/dist/config/agirailsmdV4.d.ts +46 -1
- package/dist/config/agirailsmdV4.d.ts.map +1 -1
- package/dist/config/agirailsmdV4.js +65 -8
- package/dist/config/agirailsmdV4.js.map +1 -1
- package/dist/config/defaults.d.ts +12 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +19 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/networks.d.ts +7 -0
- package/dist/config/networks.d.ts.map +1 -1
- package/dist/config/networks.js +20 -11
- package/dist/config/networks.js.map +1 -1
- package/dist/config/pendingPublish.d.ts.map +1 -1
- package/dist/config/pendingPublish.js +10 -3
- package/dist/config/pendingPublish.js.map +1 -1
- package/dist/config/publishPipeline.d.ts +23 -1
- package/dist/config/publishPipeline.d.ts.map +1 -1
- package/dist/config/publishPipeline.js +70 -15
- package/dist/config/publishPipeline.js.map +1 -1
- package/dist/config/syncOperations.d.ts.map +1 -1
- package/dist/config/syncOperations.js +4 -2
- package/dist/config/syncOperations.js.map +1 -1
- package/dist/erc8004/ERC8004Bridge.d.ts.map +1 -1
- package/dist/erc8004/ERC8004Bridge.js +0 -1
- package/dist/erc8004/ERC8004Bridge.js.map +1 -1
- package/dist/errors/ACTPError.d.ts +24 -0
- package/dist/errors/ACTPError.d.ts.map +1 -0
- package/dist/errors/ACTPError.js +35 -0
- package/dist/errors/ACTPError.js.map +1 -0
- package/dist/errors/X402Errors.d.ts +106 -0
- package/dist/errors/X402Errors.d.ts.map +1 -0
- package/dist/errors/X402Errors.js +160 -0
- package/dist/errors/X402Errors.js.map +1 -0
- package/dist/errors/index.d.ts +3 -9
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +38 -33
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +22 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -3
- package/dist/index.js.map +1 -1
- package/dist/level0/Provider.d.ts +5 -0
- package/dist/level0/Provider.d.ts.map +1 -1
- package/dist/level0/ServiceDirectory.d.ts.map +1 -1
- package/dist/level0/ServiceDirectory.js +3 -2
- package/dist/level0/ServiceDirectory.js.map +1 -1
- package/dist/level0/provide.d.ts.map +1 -1
- package/dist/level0/provide.js +11 -8
- package/dist/level0/provide.js.map +1 -1
- package/dist/level0/request.d.ts.map +1 -1
- package/dist/level0/request.js +14 -6
- package/dist/level0/request.js.map +1 -1
- package/dist/level1/Agent.d.ts +28 -1
- package/dist/level1/Agent.d.ts.map +1 -1
- package/dist/level1/Agent.js +89 -12
- package/dist/level1/Agent.js.map +1 -1
- package/dist/level1/pricing/PriceCalculator.d.ts.map +1 -1
- package/dist/level1/pricing/PriceCalculator.js +4 -12
- package/dist/level1/pricing/PriceCalculator.js.map +1 -1
- package/dist/negotiation/BuyerOrchestrator.d.ts +103 -1
- package/dist/negotiation/BuyerOrchestrator.d.ts.map +1 -1
- package/dist/negotiation/BuyerOrchestrator.js +499 -4
- package/dist/negotiation/BuyerOrchestrator.js.map +1 -1
- package/dist/negotiation/DecisionEngine.d.ts +69 -1
- package/dist/negotiation/DecisionEngine.d.ts.map +1 -1
- package/dist/negotiation/DecisionEngine.js +140 -1
- package/dist/negotiation/DecisionEngine.js.map +1 -1
- package/dist/negotiation/PolicyEngine.d.ts +32 -0
- package/dist/negotiation/PolicyEngine.d.ts.map +1 -1
- package/dist/negotiation/PolicyEngine.js.map +1 -1
- package/dist/negotiation/ProviderOrchestrator.d.ts +108 -0
- package/dist/negotiation/ProviderOrchestrator.d.ts.map +1 -0
- package/dist/negotiation/ProviderOrchestrator.js +136 -0
- package/dist/negotiation/ProviderOrchestrator.js.map +1 -0
- package/dist/negotiation/ProviderPolicy.d.ts +143 -0
- package/dist/negotiation/ProviderPolicy.d.ts.map +1 -0
- package/dist/negotiation/ProviderPolicy.js +207 -0
- package/dist/negotiation/ProviderPolicy.js.map +1 -0
- package/dist/negotiation/index.d.ts +8 -1
- package/dist/negotiation/index.d.ts.map +1 -1
- package/dist/negotiation/index.js +8 -1
- package/dist/negotiation/index.js.map +1 -1
- package/dist/negotiation/verifyQuoteOnChain.d.ts +58 -0
- package/dist/negotiation/verifyQuoteOnChain.d.ts.map +1 -0
- package/dist/negotiation/verifyQuoteOnChain.js +83 -0
- package/dist/negotiation/verifyQuoteOnChain.js.map +1 -0
- package/dist/protocol/ACTPKernel.d.ts +4 -1
- package/dist/protocol/ACTPKernel.d.ts.map +1 -1
- package/dist/protocol/ACTPKernel.js +2 -1
- package/dist/protocol/ACTPKernel.js.map +1 -1
- package/dist/protocol/EventMonitor.d.ts +27 -1
- package/dist/protocol/EventMonitor.d.ts.map +1 -1
- package/dist/protocol/EventMonitor.js +11 -9
- package/dist/protocol/EventMonitor.js.map +1 -1
- package/dist/protocol/ProofGenerator.d.ts.map +1 -1
- package/dist/protocol/ProofGenerator.js +3 -2
- package/dist/protocol/ProofGenerator.js.map +1 -1
- package/dist/runtime/BlockchainRuntime.d.ts +15 -0
- package/dist/runtime/BlockchainRuntime.d.ts.map +1 -1
- package/dist/runtime/BlockchainRuntime.js +42 -6
- package/dist/runtime/BlockchainRuntime.js.map +1 -1
- package/dist/runtime/IACTPRuntime.d.ts +35 -0
- package/dist/runtime/IACTPRuntime.d.ts.map +1 -1
- package/dist/runtime/MockRuntime.d.ts +14 -2
- package/dist/runtime/MockRuntime.d.ts.map +1 -1
- package/dist/runtime/MockRuntime.js +55 -22
- package/dist/runtime/MockRuntime.js.map +1 -1
- package/dist/runtime/types/MockState.d.ts +14 -0
- package/dist/runtime/types/MockState.d.ts.map +1 -1
- package/dist/runtime/types/MockState.js.map +1 -1
- package/dist/server/buildX402Server.d.ts +131 -0
- package/dist/server/buildX402Server.d.ts.map +1 -0
- package/dist/server/buildX402Server.js +151 -0
- package/dist/server/buildX402Server.js.map +1 -0
- package/dist/server/index.d.ts +33 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +36 -0
- package/dist/server/index.js.map +1 -0
- package/dist/transport/QuoteChannel.d.ts +201 -0
- package/dist/transport/QuoteChannel.d.ts.map +1 -0
- package/dist/transport/QuoteChannel.js +358 -0
- package/dist/transport/QuoteChannel.js.map +1 -0
- package/dist/types/adapter.d.ts +64 -34
- package/dist/types/adapter.d.ts.map +1 -1
- package/dist/types/adapter.js +6 -1
- package/dist/types/adapter.js.map +1 -1
- package/dist/types/eip712.d.ts +20 -0
- package/dist/types/eip712.d.ts.map +1 -1
- package/dist/types/x402.d.ts +8 -8
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/utils/security.js +4 -6
- package/dist/utils/security.js.map +1 -1
- package/dist/wallet/AutoWalletProvider.d.ts +45 -1
- package/dist/wallet/AutoWalletProvider.d.ts.map +1 -1
- package/dist/wallet/AutoWalletProvider.js +154 -1
- package/dist/wallet/AutoWalletProvider.js.map +1 -1
- package/dist/wallet/EOAWalletProvider.d.ts +13 -1
- package/dist/wallet/EOAWalletProvider.d.ts.map +1 -1
- package/dist/wallet/EOAWalletProvider.js +24 -0
- package/dist/wallet/EOAWalletProvider.js.map +1 -1
- package/dist/wallet/IWalletProvider.d.ts +34 -0
- package/dist/wallet/IWalletProvider.d.ts.map +1 -1
- package/dist/wallet/SmartWalletRouter.d.ts.map +1 -1
- package/dist/wallet/SmartWalletRouter.js +3 -1
- package/dist/wallet/SmartWalletRouter.js.map +1 -1
- package/dist/wallet/aa/BundlerClient.js +8 -4
- package/dist/wallet/aa/BundlerClient.js.map +1 -1
- package/dist/wallet/aa/DualNonceManager.d.ts +4 -1
- package/dist/wallet/aa/DualNonceManager.d.ts.map +1 -1
- package/dist/wallet/aa/DualNonceManager.js +3 -0
- package/dist/wallet/aa/DualNonceManager.js.map +1 -1
- package/dist/wallet/keystore.d.ts.map +1 -1
- package/dist/wallet/keystore.js +6 -4
- package/dist/wallet/keystore.js.map +1 -1
- package/package.json +31 -3
- package/dist/adapters/BeginnerAdapter.d.ts +0 -152
- package/dist/adapters/BeginnerAdapter.d.ts.map +0 -1
- package/dist/adapters/BeginnerAdapter.js +0 -168
- package/dist/adapters/BeginnerAdapter.js.map +0 -1
- package/dist/adapters/IntermediateAdapter.d.ts +0 -211
- package/dist/adapters/IntermediateAdapter.d.ts.map +0 -1
- package/dist/adapters/IntermediateAdapter.js +0 -260
- package/dist/adapters/IntermediateAdapter.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildX402Server.d.ts","sourceRoot":"","sources":["../../src/server/buildX402Server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;;AAEH,OAAO,EAAE,kBAAkB,EAAyB,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,KAAK,YAAY,EAAsB,MAAM,iBAAiB,CAAC;AAOhG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IAEd,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB,8BAA8B;IAC9B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAE9B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,UAAU,EAAE,sBAAsB,CAAC;IAEnC;;;OAGG;IACH,MAAM,EAAE,YAAY,CAAC;IAErB,0EAA0E;IAC1E,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAyH3B"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* buildX402Server — factory that maps AGIRAILS agent config into
|
|
4
|
+
* a ready-to-use x402 v2 resource server + route definitions.
|
|
5
|
+
*
|
|
6
|
+
* Design: we never wrap or re-export framework middleware. The output
|
|
7
|
+
* plugs directly into @x402/express, @x402/hono, @x402/next, or raw
|
|
8
|
+
* @x402/core processHTTPRequest for any framework.
|
|
9
|
+
*
|
|
10
|
+
* @module server/buildX402Server
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.buildX402Server = void 0;
|
|
14
|
+
const server_1 = require("@x402/core/server");
|
|
15
|
+
const http_1 = require("@x402/core/http");
|
|
16
|
+
const server_2 = require("@x402/evm/exact/server");
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Factory
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Build a configured x402 v2 resource server from simple route definitions.
|
|
22
|
+
*
|
|
23
|
+
* Async because it calls `httpServer.initialize()` which fetches facilitator
|
|
24
|
+
* capabilities and validates that all route schemes are supported.
|
|
25
|
+
*
|
|
26
|
+
* @param config - Server configuration
|
|
27
|
+
* @returns Ready-to-use server + routes
|
|
28
|
+
* @throws {Error} If facilitator is unreachable or route schemes unsupported
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Express
|
|
33
|
+
* import { buildX402Server } from '@agirails/sdk/server';
|
|
34
|
+
* import { paymentMiddleware } from '@x402/express';
|
|
35
|
+
* import express from 'express';
|
|
36
|
+
*
|
|
37
|
+
* const { httpServer, routes } = await buildX402Server({
|
|
38
|
+
* payTo: client.getAddress(),
|
|
39
|
+
* network: 'eip155:84532',
|
|
40
|
+
* routes: [{ route: 'GET /api/data', price: '$0.01' }],
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* const app = express();
|
|
44
|
+
* app.use(paymentMiddleware(routes, httpServer));
|
|
45
|
+
* app.get('/api/data', (req, res) => res.json({ data: 42 }));
|
|
46
|
+
* app.listen(3000);
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* // Hono
|
|
52
|
+
* import { buildX402Server } from '@agirails/sdk/server';
|
|
53
|
+
* import { paymentMiddleware } from '@x402/hono';
|
|
54
|
+
* import { Hono } from 'hono';
|
|
55
|
+
*
|
|
56
|
+
* const { httpServer, routes } = await buildX402Server({
|
|
57
|
+
* payTo: '0xYourAddress',
|
|
58
|
+
* network: 'eip155:8453',
|
|
59
|
+
* routes: [{ route: 'GET /api/premium', price: '$0.10' }],
|
|
60
|
+
* });
|
|
61
|
+
*
|
|
62
|
+
* const app = new Hono();
|
|
63
|
+
* app.use('*', paymentMiddleware(routes, httpServer));
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
async function buildX402Server(config) {
|
|
67
|
+
if (!config.payTo || !/^0x[0-9a-f]{40}$/i.test(config.payTo)) {
|
|
68
|
+
throw new Error(`buildX402Server: payTo must be a valid Ethereum address, got "${config.payTo}"`);
|
|
69
|
+
}
|
|
70
|
+
if (!config.network || !config.network.includes(':')) {
|
|
71
|
+
throw new Error(`buildX402Server: network must be a CAIP-2 identifier (e.g. "eip155:8453"), got "${config.network}"`);
|
|
72
|
+
}
|
|
73
|
+
if (!config.routes || config.routes.length === 0) {
|
|
74
|
+
throw new Error('buildX402Server: at least one route is required');
|
|
75
|
+
}
|
|
76
|
+
// 1. Facilitator client
|
|
77
|
+
const facilitator = new server_1.HTTPFacilitatorClient({
|
|
78
|
+
url: config.facilitatorUrl ?? 'https://x402.org/facilitator',
|
|
79
|
+
});
|
|
80
|
+
// 2. Resource server with EVM exact scheme
|
|
81
|
+
const resourceServer = new server_1.x402ResourceServer(facilitator);
|
|
82
|
+
(0, server_2.registerExactEvmScheme)(resourceServer);
|
|
83
|
+
// 3. Build route config
|
|
84
|
+
const routesConfig = {};
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
for (const def of config.routes) {
|
|
87
|
+
if (!def.route || !/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+\/\S*$/.test(def.route)) {
|
|
88
|
+
throw new Error(`buildX402Server: route must be "METHOD /path" format (e.g. "GET /api/data"), got "${def.route}"`);
|
|
89
|
+
}
|
|
90
|
+
if (seen.has(def.route)) {
|
|
91
|
+
throw new Error(`buildX402Server: duplicate route "${def.route}". Each route must be unique.`);
|
|
92
|
+
}
|
|
93
|
+
seen.add(def.route);
|
|
94
|
+
const routePayTo = def.payTo ?? config.payTo;
|
|
95
|
+
if (!/^0x[0-9a-f]{40}$/i.test(routePayTo)) {
|
|
96
|
+
throw new Error(`buildX402Server: route "${def.route}" has invalid payTo "${routePayTo}"`);
|
|
97
|
+
}
|
|
98
|
+
const routeNetwork = def.network ?? config.network;
|
|
99
|
+
if (!routeNetwork.includes(':')) {
|
|
100
|
+
throw new Error(`buildX402Server: route "${def.route}" has invalid network "${routeNetwork}" (must be CAIP-2)`);
|
|
101
|
+
}
|
|
102
|
+
if (!def.price || (typeof def.price === 'string' && def.price.trim() === '')) {
|
|
103
|
+
throw new Error(`buildX402Server: route "${def.route}" has empty or missing price`);
|
|
104
|
+
}
|
|
105
|
+
if (typeof def.price === 'string') {
|
|
106
|
+
const trimmed = def.price.trim();
|
|
107
|
+
if (!/^\$?\d+(\.\d+)?$/.test(trimmed)) {
|
|
108
|
+
throw new Error(`buildX402Server: route "${def.route}" has invalid price "${def.price}" (expected format: "$0.10" or "0.50")`);
|
|
109
|
+
}
|
|
110
|
+
if (parseFloat(trimmed.replace('$', '')) <= 0) {
|
|
111
|
+
throw new Error(`buildX402Server: route "${def.route}" price must be > 0, got "${def.price}"`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const timeout = def.maxTimeoutSeconds ?? 300;
|
|
115
|
+
if (!Number.isFinite(timeout) || timeout <= 0) {
|
|
116
|
+
throw new Error(`buildX402Server: route "${def.route}" has invalid maxTimeoutSeconds ${def.maxTimeoutSeconds} (must be > 0)`);
|
|
117
|
+
}
|
|
118
|
+
const paymentOption = {
|
|
119
|
+
scheme: 'exact',
|
|
120
|
+
network: routeNetwork,
|
|
121
|
+
payTo: routePayTo,
|
|
122
|
+
price: def.price,
|
|
123
|
+
maxTimeoutSeconds: timeout,
|
|
124
|
+
};
|
|
125
|
+
// Advertise Permit2 so Smart Wallet buyers work out of the box
|
|
126
|
+
if (config.preferPermit2 !== false) {
|
|
127
|
+
paymentOption.extra = { assetTransferMethod: 'permit2' };
|
|
128
|
+
}
|
|
129
|
+
routesConfig[def.route] = {
|
|
130
|
+
accepts: [paymentOption],
|
|
131
|
+
description: def.description,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// 4. HTTP resource server
|
|
135
|
+
const httpServer = new http_1.x402HTTPResourceServer(resourceServer, routesConfig);
|
|
136
|
+
// 5. Initialize (fetches facilitator capabilities, validates routes)
|
|
137
|
+
try {
|
|
138
|
+
await httpServer.initialize();
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
142
|
+
throw new Error(`buildX402Server: failed to initialize — ${msg}`);
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
httpServer,
|
|
146
|
+
routes: routesConfig,
|
|
147
|
+
resourceServer,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
exports.buildX402Server = buildX402Server;
|
|
151
|
+
//# sourceMappingURL=buildX402Server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildX402Server.js","sourceRoot":"","sources":["../../src/server/buildX402Server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Module — x402 v2 seller-side helpers.
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic: builds a configured `x402HTTPResourceServer` + routes
|
|
5
|
+
* object that plugs directly into upstream middleware (`@x402/express`,
|
|
6
|
+
* `@x402/hono`, `@x402/next`) or any framework via the raw processHTTPRequest
|
|
7
|
+
* API from `@x402/core`.
|
|
8
|
+
*
|
|
9
|
+
* @module server
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { buildX402Server } from '@agirails/sdk/server';
|
|
14
|
+
* import { paymentMiddleware } from '@x402/express';
|
|
15
|
+
* import express from 'express';
|
|
16
|
+
*
|
|
17
|
+
* const { httpServer, routes } = await buildX402Server({
|
|
18
|
+
* payTo: '0xYourAddress',
|
|
19
|
+
* network: 'eip155:84532',
|
|
20
|
+
* routes: [
|
|
21
|
+
* { route: 'GET /api/premium', price: '$0.10', description: 'Premium content' },
|
|
22
|
+
* ],
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* const app = express();
|
|
26
|
+
* app.use(paymentMiddleware(routes, httpServer));
|
|
27
|
+
* app.get('/api/premium', (req, res) => res.json({ secret: '...' }));
|
|
28
|
+
* app.listen(3000);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export { buildX402Server } from './buildX402Server';
|
|
32
|
+
export type { X402ServerConfig, X402RouteDefinition, X402ServerResult, } from './buildX402Server';
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Server Module — x402 v2 seller-side helpers.
|
|
4
|
+
*
|
|
5
|
+
* Framework-agnostic: builds a configured `x402HTTPResourceServer` + routes
|
|
6
|
+
* object that plugs directly into upstream middleware (`@x402/express`,
|
|
7
|
+
* `@x402/hono`, `@x402/next`) or any framework via the raw processHTTPRequest
|
|
8
|
+
* API from `@x402/core`.
|
|
9
|
+
*
|
|
10
|
+
* @module server
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { buildX402Server } from '@agirails/sdk/server';
|
|
15
|
+
* import { paymentMiddleware } from '@x402/express';
|
|
16
|
+
* import express from 'express';
|
|
17
|
+
*
|
|
18
|
+
* const { httpServer, routes } = await buildX402Server({
|
|
19
|
+
* payTo: '0xYourAddress',
|
|
20
|
+
* network: 'eip155:84532',
|
|
21
|
+
* routes: [
|
|
22
|
+
* { route: 'GET /api/premium', price: '$0.10', description: 'Premium content' },
|
|
23
|
+
* ],
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* const app = express();
|
|
27
|
+
* app.use(paymentMiddleware(routes, httpServer));
|
|
28
|
+
* app.get('/api/premium', (req, res) => res.json({ secret: '...' }));
|
|
29
|
+
* app.listen(3000);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.buildX402Server = void 0;
|
|
34
|
+
var buildX402Server_1 = require("./buildX402Server");
|
|
35
|
+
Object.defineProperty(exports, "buildX402Server", { enumerable: true, get: function () { return buildX402Server_1.buildX402Server; } });
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AAEH,qDAAoD;AAA3C,kHAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QuoteChannel — HTTPS transport for AIP-2.1 quote + counter-offer messages.
|
|
3
|
+
*
|
|
4
|
+
* Split into three responsibilities so the SDK is framework-agnostic:
|
|
5
|
+
*
|
|
6
|
+
* 1. `QuoteChannelClient` — sends a signed message to a peer's endpoint.
|
|
7
|
+
* Used by buyers (posting counter-offers to the provider) and by
|
|
8
|
+
* providers (posting quotes to the buyer). Plain fetch + timeout.
|
|
9
|
+
*
|
|
10
|
+
* 2. `QuoteChannelHandler` — framework-agnostic receive-side handler.
|
|
11
|
+
* Callers wire it into whatever HTTP framework they use (Express,
|
|
12
|
+
* Next.js route handler, Fastify, etc). Enforces the security model
|
|
13
|
+
* from AIP-2.1-DRAFT §8:
|
|
14
|
+
* - URL path binding: `/quote-channel/{chainId}/{txId}` must
|
|
15
|
+
* match message.chainId / message.txId (closes T2 + T5).
|
|
16
|
+
* - EIP-712 signature verification (closes "anyone can POST").
|
|
17
|
+
* - TTL + grace window (closes T3).
|
|
18
|
+
* - Nonce LRU dedup (closes T1, idempotent replay).
|
|
19
|
+
* Rate limiting is intentionally out of scope — framework-level
|
|
20
|
+
* concern (Next.js middleware, Express rate-limit, nginx, etc).
|
|
21
|
+
*
|
|
22
|
+
* 3. `DedupStore` — swappable backing for the nonce LRU. In-memory
|
|
23
|
+
* default for single-process use; callers can plug Redis etc. for
|
|
24
|
+
* multi-worker production.
|
|
25
|
+
*
|
|
26
|
+
* @module transport/QuoteChannel
|
|
27
|
+
* @see Protocol/aips/AIP-2.1-DRAFT.md §8 (threat model + mitigations)
|
|
28
|
+
*/
|
|
29
|
+
import { QuoteMessage } from '../builders/QuoteBuilder';
|
|
30
|
+
import { CounterOfferMessage } from '../builders/CounterOfferBuilder';
|
|
31
|
+
/** Path pattern builders use / handlers expect. */
|
|
32
|
+
export declare function buildChannelPath(chainId: number, txId: string): string;
|
|
33
|
+
export declare const TTL_GRACE_SECONDS = 30;
|
|
34
|
+
export declare const DEDUP_TTL_SECONDS = 90000;
|
|
35
|
+
/**
|
|
36
|
+
* Wire payload posted by the client and parsed by the handler.
|
|
37
|
+
* Discriminated by `type` so the same endpoint serves both directions.
|
|
38
|
+
*/
|
|
39
|
+
export type ChannelPayload = {
|
|
40
|
+
type: 'agirails.quote.v1';
|
|
41
|
+
message: QuoteMessage;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'agirails.counteroffer.v1';
|
|
44
|
+
message: CounterOfferMessage;
|
|
45
|
+
};
|
|
46
|
+
export interface DedupStore {
|
|
47
|
+
/**
|
|
48
|
+
* Atomic "record if absent". Returns:
|
|
49
|
+
* 'recorded' — the key was not present (or had expired) and has now
|
|
50
|
+
* been recorded with the given TTL. Caller treats this
|
|
51
|
+
* POST as fresh and performs side effects.
|
|
52
|
+
* 'duplicate' — the key was already present and unexpired. Caller
|
|
53
|
+
* must return an idempotent cached response without
|
|
54
|
+
* performing side effects.
|
|
55
|
+
*
|
|
56
|
+
* MUST be atomic at the backend level. Single-process JS gets this
|
|
57
|
+
* trivially (no real concurrency); Redis implementations use
|
|
58
|
+
* `SET key 1 NX PX ttlMs` which is natively atomic and correctly
|
|
59
|
+
* handles multiple concurrent workers competing on the same key.
|
|
60
|
+
*
|
|
61
|
+
* Separate check+record would open a TOCTOU window where two
|
|
62
|
+
* workers both observe 'fresh' and both commit — that's the P2
|
|
63
|
+
* audit finding this interface closes.
|
|
64
|
+
*/
|
|
65
|
+
recordOnce(key: string, ttlMs: number): Promise<'recorded' | 'duplicate'>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Single-process in-memory LRU. Callers replace this in production
|
|
69
|
+
* with a distributed store (Redis SET NX EX, DynamoDB conditional put,
|
|
70
|
+
* Postgres INSERT ... ON CONFLICT DO NOTHING, etc).
|
|
71
|
+
*
|
|
72
|
+
* Atomicity here is free because JavaScript event-loop execution is
|
|
73
|
+
* single-threaded — a `recordOnce` call cannot be interrupted mid-way.
|
|
74
|
+
* Multi-worker deployments MUST use a real distributed store or will
|
|
75
|
+
* see duplicate 'recorded' returns across workers.
|
|
76
|
+
*/
|
|
77
|
+
export declare class InMemoryDedupStore implements DedupStore {
|
|
78
|
+
private readonly entries;
|
|
79
|
+
private readonly maxSize;
|
|
80
|
+
constructor(maxSize?: number);
|
|
81
|
+
recordOnce(key: string, ttlMs: number): Promise<'recorded' | 'duplicate'>;
|
|
82
|
+
/** Drop entries whose TTL has elapsed. O(n) — fine for our sizes. */
|
|
83
|
+
private dropExpired;
|
|
84
|
+
/** Bound the map at `maxSize` by evicting oldest-inserted keys. */
|
|
85
|
+
private trimToSize;
|
|
86
|
+
}
|
|
87
|
+
export interface QuoteChannelClientConfig {
|
|
88
|
+
/** Per-request timeout in ms. Default 10s. */
|
|
89
|
+
timeoutMs?: number;
|
|
90
|
+
/** Override fetch for tests. Defaults to global fetch. */
|
|
91
|
+
fetchImpl?: typeof fetch;
|
|
92
|
+
/**
|
|
93
|
+
* Allow insecure targets (http://, localhost, RFC1918, link-local).
|
|
94
|
+
* Default false (production hardening). Set to true ONLY for local
|
|
95
|
+
* dev or integration tests running against a mock server.
|
|
96
|
+
*
|
|
97
|
+
* Note: this is a URL-string check only. DNS rebinding can still bypass
|
|
98
|
+
* it — production deployments that are extra paranoid should put the
|
|
99
|
+
* client behind an HTTP proxy that enforces the same rules against the
|
|
100
|
+
* resolved IP at request time.
|
|
101
|
+
*/
|
|
102
|
+
allowInsecureTargets?: boolean;
|
|
103
|
+
}
|
|
104
|
+
export declare class QuoteChannelClient {
|
|
105
|
+
private readonly timeoutMs;
|
|
106
|
+
private readonly fetchImpl;
|
|
107
|
+
private readonly allowInsecureTargets;
|
|
108
|
+
constructor(cfg?: QuoteChannelClientConfig);
|
|
109
|
+
/** POST a provider quote to the buyer's endpoint. */
|
|
110
|
+
sendQuote(peerEndpoint: string, quote: QuoteMessage): Promise<void>;
|
|
111
|
+
/** POST a buyer counter-offer to the provider's endpoint. */
|
|
112
|
+
sendCounter(peerEndpoint: string, counter: CounterOfferMessage): Promise<void>;
|
|
113
|
+
private post;
|
|
114
|
+
}
|
|
115
|
+
export interface QuoteChannelHandlerConfig {
|
|
116
|
+
/** Kernel address per chainId — used for EIP-712 domain when verifying. */
|
|
117
|
+
kernelAddressByChainId: Record<number, string>;
|
|
118
|
+
/** Dedup store. Defaults to in-memory (single process). */
|
|
119
|
+
dedupStore?: DedupStore;
|
|
120
|
+
/** TTL grace window in seconds for `expiresAt` check. Defaults to 30s. */
|
|
121
|
+
ttlGraceSeconds?: number;
|
|
122
|
+
}
|
|
123
|
+
export interface HandlerContext {
|
|
124
|
+
/** Chain ID parsed from the URL path. */
|
|
125
|
+
pathChainId: number;
|
|
126
|
+
/** txId parsed from the URL path (0x-prefixed 64-hex). */
|
|
127
|
+
pathTxId: string;
|
|
128
|
+
}
|
|
129
|
+
export type HandlerResult = {
|
|
130
|
+
status: 201;
|
|
131
|
+
body: {
|
|
132
|
+
accepted: true;
|
|
133
|
+
duplicate: false;
|
|
134
|
+
};
|
|
135
|
+
} | {
|
|
136
|
+
status: 200;
|
|
137
|
+
body: {
|
|
138
|
+
accepted: true;
|
|
139
|
+
duplicate: true;
|
|
140
|
+
};
|
|
141
|
+
} | {
|
|
142
|
+
status: 400;
|
|
143
|
+
body: {
|
|
144
|
+
accepted: false;
|
|
145
|
+
reason: string;
|
|
146
|
+
};
|
|
147
|
+
} | {
|
|
148
|
+
status: 401;
|
|
149
|
+
body: {
|
|
150
|
+
accepted: false;
|
|
151
|
+
reason: string;
|
|
152
|
+
};
|
|
153
|
+
} | {
|
|
154
|
+
status: 410;
|
|
155
|
+
body: {
|
|
156
|
+
accepted: false;
|
|
157
|
+
reason: string;
|
|
158
|
+
};
|
|
159
|
+
} | {
|
|
160
|
+
status: 422;
|
|
161
|
+
body: {
|
|
162
|
+
accepted: false;
|
|
163
|
+
reason: string;
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
export declare class QuoteChannelHandler {
|
|
167
|
+
private readonly kernelAddressByChainId;
|
|
168
|
+
private readonly dedupStore;
|
|
169
|
+
private readonly ttlGraceSeconds;
|
|
170
|
+
private readonly quoteVerifier;
|
|
171
|
+
private readonly counterVerifier;
|
|
172
|
+
constructor(cfg: QuoteChannelHandlerConfig);
|
|
173
|
+
/**
|
|
174
|
+
* Validate + dedup an incoming POST.
|
|
175
|
+
* Caller is responsible for: parsing URL path into `pathChainId` /
|
|
176
|
+
* `pathTxId`, parsing request body into `ChannelPayload`, and rate
|
|
177
|
+
* limiting the endpoint at the framework level.
|
|
178
|
+
*/
|
|
179
|
+
handle(payload: unknown, ctx: HandlerContext): Promise<HandlerResult>;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Reject peer URLs that could SSRF into local / internal infrastructure.
|
|
183
|
+
*
|
|
184
|
+
* Rules (default, `allowInsecureTargets=false`):
|
|
185
|
+
* - scheme MUST be https
|
|
186
|
+
* - hostname MUST NOT be `localhost`
|
|
187
|
+
* - hostname MUST NOT be a literal loopback IP (127.x.x.x, ::1)
|
|
188
|
+
* - hostname MUST NOT be a literal link-local IP (169.254.x.x, fe80::/10)
|
|
189
|
+
* — this also covers AWS metadata at 169.254.169.254
|
|
190
|
+
* - hostname MUST NOT be a literal RFC1918 private IP (10.x, 172.16-31.x,
|
|
191
|
+
* 192.168.x) or IPv6 ULA (fc00::/7)
|
|
192
|
+
*
|
|
193
|
+
* Dev mode (`allowInsecureTargets=true`): no restrictions, callers
|
|
194
|
+
* opting in are responsible for their own network security.
|
|
195
|
+
*
|
|
196
|
+
* @throws Error if the URL fails the checks. Error message is deliberately
|
|
197
|
+
* specific so test fixtures and diagnostics can assert on it.
|
|
198
|
+
* @internal Exported for unit tests.
|
|
199
|
+
*/
|
|
200
|
+
export declare function assertSafePeerUrl(url: string, allowInsecureTargets: boolean): void;
|
|
201
|
+
//# sourceMappingURL=QuoteChannel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuoteChannel.d.ts","sourceRoot":"","sources":["../../src/transport/QuoteChannel.ts"],"names":[],"mappings":"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"}
|