@absol-labs/agent 0.10.0 → 0.12.0-rc.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.
Files changed (331) hide show
  1. package/README.md +106 -30
  2. package/dist/capability/invocation-capability.d.ts +20 -8
  3. package/dist/capability/invocation-capability.d.ts.map +1 -1
  4. package/dist/capability/invocation-capability.js.map +1 -1
  5. package/dist/capability/probe-capability.d.ts +225 -0
  6. package/dist/capability/probe-capability.d.ts.map +1 -0
  7. package/dist/capability/probe-capability.js +248 -0
  8. package/dist/capability/probe-capability.js.map +1 -0
  9. package/dist/cli/args.d.ts +11 -0
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js +23 -0
  12. package/dist/cli/args.js.map +1 -1
  13. package/dist/cli/commands/claim.d.ts.map +1 -1
  14. package/dist/cli/commands/claim.js +21 -5
  15. package/dist/cli/commands/claim.js.map +1 -1
  16. package/dist/cli/commands/close.d.ts.map +1 -1
  17. package/dist/cli/commands/close.js +51 -7
  18. package/dist/cli/commands/close.js.map +1 -1
  19. package/dist/cli/commands/invoke.d.ts +2 -0
  20. package/dist/cli/commands/invoke.d.ts.map +1 -1
  21. package/dist/cli/commands/invoke.js +3 -2
  22. package/dist/cli/commands/invoke.js.map +1 -1
  23. package/dist/cli/commands/mcp.d.ts.map +1 -1
  24. package/dist/cli/commands/mcp.js +15 -2
  25. package/dist/cli/commands/mcp.js.map +1 -1
  26. package/dist/cli/commands/open.d.ts.map +1 -1
  27. package/dist/cli/commands/open.js +121 -15
  28. package/dist/cli/commands/open.js.map +1 -1
  29. package/dist/cli/commands/pay.d.ts +19 -0
  30. package/dist/cli/commands/pay.d.ts.map +1 -0
  31. package/dist/cli/commands/pay.js +355 -0
  32. package/dist/cli/commands/pay.js.map +1 -0
  33. package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
  34. package/dist/cli/commands/reclaim-unverified.js +15 -6
  35. package/dist/cli/commands/reclaim-unverified.js.map +1 -1
  36. package/dist/cli/commands/reclaim.d.ts +23 -2
  37. package/dist/cli/commands/reclaim.d.ts.map +1 -1
  38. package/dist/cli/commands/reclaim.js +200 -21
  39. package/dist/cli/commands/reclaim.js.map +1 -1
  40. package/dist/cli/commands/refund.d.ts +13 -0
  41. package/dist/cli/commands/refund.d.ts.map +1 -0
  42. package/dist/cli/commands/refund.js +224 -0
  43. package/dist/cli/commands/refund.js.map +1 -0
  44. package/dist/cli/commands/status.d.ts.map +1 -1
  45. package/dist/cli/commands/status.js +10 -1
  46. package/dist/cli/commands/status.js.map +1 -1
  47. package/dist/cli/commands/streams.js +9 -13
  48. package/dist/cli/commands/streams.js.map +1 -1
  49. package/dist/cli/commands/watch.d.ts.map +1 -1
  50. package/dist/cli/commands/watch.js +2 -1
  51. package/dist/cli/commands/watch.js.map +1 -1
  52. package/dist/cli/config.d.ts +44 -26
  53. package/dist/cli/config.d.ts.map +1 -1
  54. package/dist/cli/config.js +88 -38
  55. package/dist/cli/config.js.map +1 -1
  56. package/dist/cli/deps.d.ts +86 -7
  57. package/dist/cli/deps.d.ts.map +1 -1
  58. package/dist/cli/deps.js +102 -16
  59. package/dist/cli/deps.js.map +1 -1
  60. package/dist/cli/errors.d.ts.map +1 -1
  61. package/dist/cli/errors.js +21 -1
  62. package/dist/cli/errors.js.map +1 -1
  63. package/dist/cli/escape-hatch.d.ts +6 -4
  64. package/dist/cli/escape-hatch.d.ts.map +1 -1
  65. package/dist/cli/escape-hatch.js +6 -2
  66. package/dist/cli/escape-hatch.js.map +1 -1
  67. package/dist/cli/listings.d.ts +18 -0
  68. package/dist/cli/listings.d.ts.map +1 -1
  69. package/dist/cli/listings.js +22 -12
  70. package/dist/cli/listings.js.map +1 -1
  71. package/dist/cli/preflight.d.ts +20 -14
  72. package/dist/cli/preflight.d.ts.map +1 -1
  73. package/dist/cli/preflight.js +34 -20
  74. package/dist/cli/preflight.js.map +1 -1
  75. package/dist/cli/privy.d.ts +83 -0
  76. package/dist/cli/privy.d.ts.map +1 -0
  77. package/dist/cli/privy.js +232 -0
  78. package/dist/cli/privy.js.map +1 -0
  79. package/dist/cli/reclaimability.d.ts +82 -0
  80. package/dist/cli/reclaimability.d.ts.map +1 -0
  81. package/dist/cli/reclaimability.js +80 -0
  82. package/dist/cli/reclaimability.js.map +1 -0
  83. package/dist/cli/run.d.ts +2 -1
  84. package/dist/cli/run.d.ts.map +1 -1
  85. package/dist/cli/run.js +40 -11
  86. package/dist/cli/run.js.map +1 -1
  87. package/dist/cli/scan-range.d.ts +2 -2
  88. package/dist/cli/scan-range.js +2 -2
  89. package/dist/cli/spend-policy.d.ts +60 -0
  90. package/dist/cli/spend-policy.d.ts.map +1 -0
  91. package/dist/cli/spend-policy.js +65 -0
  92. package/dist/cli/spend-policy.js.map +1 -0
  93. package/dist/cli/status.d.ts +3 -1
  94. package/dist/cli/status.d.ts.map +1 -1
  95. package/dist/cli/status.js +15 -3
  96. package/dist/cli/status.js.map +1 -1
  97. package/dist/cli/wallet.d.ts +109 -40
  98. package/dist/cli/wallet.d.ts.map +1 -1
  99. package/dist/cli/wallet.js +109 -44
  100. package/dist/cli/wallet.js.map +1 -1
  101. package/dist/discovery/rate-band.d.ts +74 -0
  102. package/dist/discovery/rate-band.d.ts.map +1 -0
  103. package/dist/discovery/rate-band.js +114 -0
  104. package/dist/discovery/rate-band.js.map +1 -0
  105. package/dist/escrow-generation.d.ts +81 -0
  106. package/dist/escrow-generation.d.ts.map +1 -0
  107. package/dist/escrow-generation.js +76 -0
  108. package/dist/escrow-generation.js.map +1 -0
  109. package/dist/frameworks/agentkit.d.ts +8 -4
  110. package/dist/frameworks/agentkit.d.ts.map +1 -1
  111. package/dist/frameworks/agentkit.js +27 -10
  112. package/dist/frameworks/agentkit.js.map +1 -1
  113. package/dist/frameworks/eliza.d.ts +3 -3
  114. package/dist/frameworks/eliza.d.ts.map +1 -1
  115. package/dist/frameworks/eliza.js +15 -6
  116. package/dist/frameworks/eliza.js.map +1 -1
  117. package/dist/frameworks/langchain.d.ts.map +1 -1
  118. package/dist/frameworks/langchain.js +8 -0
  119. package/dist/frameworks/langchain.js.map +1 -1
  120. package/dist/gateway/caller-auth-gateway.d.ts +91 -4
  121. package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
  122. package/dist/gateway/caller-auth-gateway.js +184 -7
  123. package/dist/gateway/caller-auth-gateway.js.map +1 -1
  124. package/dist/gateway/http-server.d.ts +121 -1
  125. package/dist/gateway/http-server.d.ts.map +1 -1
  126. package/dist/gateway/http-server.js +474 -5
  127. package/dist/gateway/http-server.js.map +1 -1
  128. package/dist/gateway/probe-auth.d.ts +112 -0
  129. package/dist/gateway/probe-auth.d.ts.map +1 -0
  130. package/dist/gateway/probe-auth.js +127 -0
  131. package/dist/gateway/probe-auth.js.map +1 -0
  132. package/dist/gateway/signed-rate-bounds.d.ts +51 -0
  133. package/dist/gateway/signed-rate-bounds.d.ts.map +1 -0
  134. package/dist/gateway/signed-rate-bounds.js +94 -0
  135. package/dist/gateway/signed-rate-bounds.js.map +1 -0
  136. package/dist/gateway/x402-opener-mode.d.ts +215 -0
  137. package/dist/gateway/x402-opener-mode.d.ts.map +1 -0
  138. package/dist/gateway/x402-opener-mode.js +639 -0
  139. package/dist/gateway/x402-opener-mode.js.map +1 -0
  140. package/dist/index.d.ts +11 -5
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +15 -5
  143. package/dist/index.js.map +1 -1
  144. package/dist/mandates/env.d.ts +3 -2
  145. package/dist/mandates/env.d.ts.map +1 -1
  146. package/dist/mandates/env.js +3 -2
  147. package/dist/mandates/env.js.map +1 -1
  148. package/dist/mcp/server.d.ts +100 -0
  149. package/dist/mcp/server.d.ts.map +1 -1
  150. package/dist/mcp/server.js +719 -39
  151. package/dist/mcp/server.js.map +1 -1
  152. package/dist/mcp/service-invoker.d.ts +97 -0
  153. package/dist/mcp/service-invoker.d.ts.map +1 -0
  154. package/dist/mcp/service-invoker.js +167 -0
  155. package/dist/mcp/service-invoker.js.map +1 -0
  156. package/dist/mcp/x402-tools.d.ts +104 -0
  157. package/dist/mcp/x402-tools.d.ts.map +1 -0
  158. package/dist/mcp/x402-tools.js +434 -0
  159. package/dist/mcp/x402-tools.js.map +1 -0
  160. package/dist/network.d.ts +119 -0
  161. package/dist/network.d.ts.map +1 -0
  162. package/dist/network.js +199 -0
  163. package/dist/network.js.map +1 -0
  164. package/dist/sdk/invoke.d.ts +23 -4
  165. package/dist/sdk/invoke.d.ts.map +1 -1
  166. package/dist/sdk/invoke.js +71 -10
  167. package/dist/sdk/invoke.js.map +1 -1
  168. package/dist/wallet/autonomous-wallet-broker.d.ts +3 -0
  169. package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -1
  170. package/dist/wallet/autonomous-wallet-broker.js +27 -23
  171. package/dist/wallet/autonomous-wallet-broker.js.map +1 -1
  172. package/dist/wallet/autonomous-wallet-protocol.d.ts +8 -2
  173. package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -1
  174. package/dist/wallet/autonomous-wallet-protocol.js +9 -2
  175. package/dist/wallet/autonomous-wallet-protocol.js.map +1 -1
  176. package/dist/wallet/autonomous-wallet.d.ts.map +1 -1
  177. package/dist/wallet/autonomous-wallet.js +3 -2
  178. package/dist/wallet/autonomous-wallet.js.map +1 -1
  179. package/dist/wallet/broker-escrows.d.ts +222 -0
  180. package/dist/wallet/broker-escrows.d.ts.map +1 -0
  181. package/dist/wallet/broker-escrows.js +36 -0
  182. package/dist/wallet/broker-escrows.js.map +1 -0
  183. package/dist/wallet/lifecycle.d.ts +21 -5
  184. package/dist/wallet/lifecycle.d.ts.map +1 -1
  185. package/dist/wallet/lifecycle.js +32 -12
  186. package/dist/wallet/lifecycle.js.map +1 -1
  187. package/dist/wallet/privy-broker-server.d.ts.map +1 -1
  188. package/dist/wallet/privy-broker-server.js +31 -26
  189. package/dist/wallet/privy-broker-server.js.map +1 -1
  190. package/dist/wallet/privy-session-broker.d.ts +14 -5
  191. package/dist/wallet/privy-session-broker.d.ts.map +1 -1
  192. package/dist/wallet/privy-session-broker.js +29 -17
  193. package/dist/wallet/privy-session-broker.js.map +1 -1
  194. package/dist/wallet/privy-session-provider.d.ts +3 -1
  195. package/dist/wallet/privy-session-provider.d.ts.map +1 -1
  196. package/dist/wallet/privy-session-provider.js +5 -3
  197. package/dist/wallet/privy-session-provider.js.map +1 -1
  198. package/dist/wallet/provider.d.ts.map +1 -1
  199. package/dist/wallet/provider.js +15 -8
  200. package/dist/wallet/provider.js.map +1 -1
  201. package/dist/x402/facilitator.d.ts +42 -17
  202. package/dist/x402/facilitator.d.ts.map +1 -1
  203. package/dist/x402/facilitator.js +49 -33
  204. package/dist/x402/facilitator.js.map +1 -1
  205. package/dist/x402-buyer/guarded-fetch.d.ts +51 -0
  206. package/dist/x402-buyer/guarded-fetch.d.ts.map +1 -0
  207. package/dist/x402-buyer/guarded-fetch.js +147 -0
  208. package/dist/x402-buyer/guarded-fetch.js.map +1 -0
  209. package/dist/x402-buyer/index.d.ts +10 -0
  210. package/dist/x402-buyer/index.d.ts.map +1 -0
  211. package/dist/x402-buyer/index.js +10 -0
  212. package/dist/x402-buyer/index.js.map +1 -0
  213. package/dist/x402-buyer/pay.d.ts +135 -0
  214. package/dist/x402-buyer/pay.d.ts.map +1 -0
  215. package/dist/x402-buyer/pay.js +336 -0
  216. package/dist/x402-buyer/pay.js.map +1 -0
  217. package/dist/x402-opener/abi.d.ts +684 -0
  218. package/dist/x402-opener/abi.d.ts.map +1 -0
  219. package/dist/x402-opener/abi.js +880 -0
  220. package/dist/x402-opener/abi.js.map +1 -0
  221. package/dist/x402-opener/facilitator-entry.d.ts +3 -0
  222. package/dist/x402-opener/facilitator-entry.d.ts.map +1 -0
  223. package/dist/x402-opener/facilitator-entry.js +37 -0
  224. package/dist/x402-opener/facilitator-entry.js.map +1 -0
  225. package/dist/x402-opener/facilitator-server.d.ts +180 -0
  226. package/dist/x402-opener/facilitator-server.d.ts.map +1 -0
  227. package/dist/x402-opener/facilitator-server.js +696 -0
  228. package/dist/x402-opener/facilitator-server.js.map +1 -0
  229. package/dist/x402-opener/index.d.ts +14 -0
  230. package/dist/x402-opener/index.d.ts.map +1 -0
  231. package/dist/x402-opener/index.js +14 -0
  232. package/dist/x402-opener/index.js.map +1 -0
  233. package/dist/x402-opener/listing-resolver.d.ts +55 -0
  234. package/dist/x402-opener/listing-resolver.d.ts.map +1 -0
  235. package/dist/x402-opener/listing-resolver.js +125 -0
  236. package/dist/x402-opener/listing-resolver.js.map +1 -0
  237. package/dist/x402-opener/refund-relay.d.ts +240 -0
  238. package/dist/x402-opener/refund-relay.d.ts.map +1 -0
  239. package/dist/x402-opener/refund-relay.js +1240 -0
  240. package/dist/x402-opener/refund-relay.js.map +1 -0
  241. package/dist/x402-opener/relayer-queue.d.ts +14 -0
  242. package/dist/x402-opener/relayer-queue.d.ts.map +1 -0
  243. package/dist/x402-opener/relayer-queue.js +18 -0
  244. package/dist/x402-opener/relayer-queue.js.map +1 -0
  245. package/dist/x402-opener/scheme.d.ts +217 -0
  246. package/dist/x402-opener/scheme.d.ts.map +1 -0
  247. package/dist/x402-opener/scheme.js +749 -0
  248. package/dist/x402-opener/scheme.js.map +1 -0
  249. package/dist/x402-opener/terms.d.ts +105 -0
  250. package/dist/x402-opener/terms.d.ts.map +1 -0
  251. package/dist/x402-opener/terms.js +212 -0
  252. package/dist/x402-opener/terms.js.map +1 -0
  253. package/dist/zktls/reclaim.d.ts +2 -2
  254. package/docs/agent-layer.md +13 -8
  255. package/docs/autonomous-privy-wallet.md +188 -0
  256. package/docs/cli.md +342 -53
  257. package/docs/langchain.md +5 -0
  258. package/docs/mcp-hosted.md +4 -3
  259. package/docs/mcp-reference.md +245 -0
  260. package/docs/probe-capability.md +191 -0
  261. package/docs/quickstart.md +54 -5
  262. package/docs/threat-model.md +24 -3
  263. package/docs/x402.md +681 -0
  264. package/package.json +19 -6
  265. package/src/capability/invocation-capability.ts +17 -1
  266. package/src/capability/probe-capability.ts +355 -0
  267. package/src/cli/args.ts +29 -0
  268. package/src/cli/commands/claim.ts +31 -5
  269. package/src/cli/commands/close.ts +56 -7
  270. package/src/cli/commands/invoke.ts +6 -2
  271. package/src/cli/commands/mcp.ts +18 -2
  272. package/src/cli/commands/open.ts +151 -14
  273. package/src/cli/commands/pay.ts +442 -0
  274. package/src/cli/commands/reclaim-unverified.ts +24 -6
  275. package/src/cli/commands/reclaim.ts +274 -19
  276. package/src/cli/commands/refund.ts +277 -0
  277. package/src/cli/commands/status.ts +17 -1
  278. package/src/cli/commands/streams.ts +11 -15
  279. package/src/cli/commands/watch.ts +7 -1
  280. package/src/cli/config.ts +139 -52
  281. package/src/cli/deps.ts +189 -25
  282. package/src/cli/errors.ts +24 -1
  283. package/src/cli/escape-hatch.ts +19 -5
  284. package/src/cli/listings.ts +43 -10
  285. package/src/cli/preflight.ts +36 -21
  286. package/src/cli/privy.ts +398 -0
  287. package/src/cli/reclaimability.ts +154 -0
  288. package/src/cli/run.ts +54 -11
  289. package/src/cli/scan-range.ts +2 -2
  290. package/src/cli/spend-policy.ts +139 -0
  291. package/src/cli/status.ts +14 -1
  292. package/src/cli/wallet.ts +189 -58
  293. package/src/discovery/rate-band.ts +172 -0
  294. package/src/escrow-generation.ts +135 -0
  295. package/src/frameworks/agentkit.ts +45 -11
  296. package/src/frameworks/eliza.ts +27 -5
  297. package/src/frameworks/langchain.ts +14 -0
  298. package/src/gateway/caller-auth-gateway.ts +336 -13
  299. package/src/gateway/http-server.ts +690 -7
  300. package/src/gateway/probe-auth.ts +191 -0
  301. package/src/gateway/signed-rate-bounds.ts +164 -0
  302. package/src/gateway/x402-opener-mode.ts +974 -0
  303. package/src/index.ts +112 -14
  304. package/src/mandates/env.ts +3 -2
  305. package/src/mcp/server.ts +973 -44
  306. package/src/mcp/service-invoker.ts +285 -0
  307. package/src/mcp/x402-tools.ts +621 -0
  308. package/src/network.ts +302 -0
  309. package/src/sdk/invoke.ts +96 -17
  310. package/src/wallet/autonomous-wallet-broker.ts +46 -20
  311. package/src/wallet/autonomous-wallet-protocol.ts +11 -2
  312. package/src/wallet/autonomous-wallet.ts +4 -2
  313. package/src/wallet/broker-escrows.ts +66 -0
  314. package/src/wallet/lifecycle.ts +53 -18
  315. package/src/wallet/privy-broker-server.ts +35 -25
  316. package/src/wallet/privy-session-broker.ts +58 -25
  317. package/src/wallet/privy-session-provider.ts +7 -3
  318. package/src/wallet/provider.ts +20 -15
  319. package/src/x402/facilitator.ts +85 -46
  320. package/src/x402-buyer/guarded-fetch.ts +213 -0
  321. package/src/x402-buyer/index.ts +9 -0
  322. package/src/x402-buyer/pay.ts +517 -0
  323. package/src/x402-opener/abi.ts +881 -0
  324. package/src/x402-opener/facilitator-entry.ts +45 -0
  325. package/src/x402-opener/facilitator-server.ts +1014 -0
  326. package/src/x402-opener/index.ts +13 -0
  327. package/src/x402-opener/listing-resolver.ts +202 -0
  328. package/src/x402-opener/refund-relay.ts +1743 -0
  329. package/src/x402-opener/relayer-queue.ts +18 -0
  330. package/src/x402-opener/scheme.ts +1133 -0
  331. package/src/x402-opener/terms.ts +300 -0
@@ -0,0 +1,639 @@
1
+ import { HTTPFacilitatorClient, SETTLEMENT_OVERRIDES_HEADER, withPrivateCacheControl, x402HTTPResourceServer, x402ResourceServer, } from "@x402/core/server";
2
+ import { decodePaymentSignatureHeader } from "@x402/core/http";
3
+ import { ExactEvmScheme } from "@x402/evm/exact/server";
4
+ import { createPublicClient, formatUnits, getAddress, http, isAddress, } from "viem";
5
+ import { x402StreamOpenerFactoryAbi } from "../x402-opener/abi.js";
6
+ import { RegistryListingResolver, } from "../x402-opener/listing-resolver.js";
7
+ import { readOpenerFacilitatorMarker } from "../x402-opener/scheme.js";
8
+ import { assertValidPrice, assertValidTerms, chainIdFromNetwork, assertSchemaDeclaration, DEFAULT_OPENER_DOCS_URL, isHttpLink, OPENER_EXTRA_KEY, OPENER_SCHEME, termsToExtra, termsTuple, } from "../x402-opener/terms.js";
9
+ /**
10
+ * The gateway's x402 v2 mode (metrik-agent#116): answer an uncapabilitied
11
+ * request with a standard x402 v2 `402` whose `payTo` is the listing's
12
+ * `X402StreamOpener` address, and settle every accepted payment INTO a
13
+ * `StreamEscrowV2` stream through the Metrik opener facilitator.
14
+ *
15
+ * The wire format is the official `@x402/core` resource server's, not a
16
+ * re-implementation: `x402HTTPResourceServer` builds `PAYMENT-REQUIRED`,
17
+ * matches `PAYMENT-SIGNATURE`, verifies and settles through the facilitator and
18
+ * builds `PAYMENT-RESPONSE`.
19
+ *
20
+ * ## The opener payTo must ONLY ever be settled by the Metrik opener facilitator
21
+ *
22
+ * A stock x402 `exact` facilitator settles by calling
23
+ * `USDC.transferWithAuthorization(to = payTo)` directly. Pointed at an opener,
24
+ * that strands 100% of the payer's funds in the opener permanently (there is,
25
+ * deliberately, no sweep). So this mode:
26
+ *
27
+ * - refuses to START unless the configured facilitator's `GET /supported`
28
+ * advertises the opener marker for exactly this factory, escrow, token and
29
+ * chain; and re-checks that marker on a timer, failing CLOSED (503, no
30
+ * `payTo` quoted, nothing verified or settled) whenever it cannot;
31
+ * - uses exactly one facilitator client, never a fallback list;
32
+ * - registers no discovery (Bazaar) extension and never submits the route to
33
+ * any catalog. When (and only when) the operator configures an input/output
34
+ * schema, it is DECLARED in the 402 in the standard `extensions.bazaar`
35
+ * shape so a client can read what to send; only the Metrik opener
36
+ * facilitator ever sees the payment, and it catalogs nothing;
37
+ * - states plainly in the 402 `description` what is bought (the stream
38
+ * window, rate, that the seller earns only verified seconds, and that
39
+ * unearned money is refundable without ETH through the facilitator's
40
+ * refund relay) and refuses to start unless that facilitator advertises
41
+ * the relay (`refundRelay: true` in its marker) — the 402 never promises a
42
+ * refund path that is not there. Refunds are not automatic;
43
+ * - authenticates the opener only as `factory.predict(terms)` — never by code
44
+ * or codehash, which a clone outside the factory can reproduce;
45
+ * - serves one EIP-3009 authorization at most once: a `PAYMENT-SIGNATURE`
46
+ * whose authorization is in flight or already settled gets `409` WITHOUT an
47
+ * upstream call (in-memory, per gateway instance). A retry after
48
+ * `settlement_pending` is let through so it can reconcile;
49
+ * - refuses to start if its price is below the facilitator's advertised
50
+ * minimum, or if its facilitator timeout would not outlast the facilitator's
51
+ * receipt wait.
52
+ */
53
+ /** How long a successful `/supported` marker check is trusted, seconds. */
54
+ export const DEFAULT_FACILITATOR_MARKER_TTL_SECONDS = 300;
55
+ /** Default per-request facilitator HTTP timeout. Must outlast its receipt wait. */
56
+ export const DEFAULT_FACILITATOR_TIMEOUT_MS = 120_000;
57
+ /** Headroom the facilitator timeout must leave over the facilitator's receipt wait. */
58
+ const FACILITATOR_TIMEOUT_HEADROOM_MS = 30_000;
59
+ /**
60
+ * The plain statement of what one payment buys, used as the 402 resource
61
+ * `description`. It names the window, the rate, that the seller earns only for
62
+ * seconds Metrik's verifier confirms, and where unearned money is refundable
63
+ * without ETH. It says that refunds are not automatic, because they are not:
64
+ * someone has to call the refund relay.
65
+ */
66
+ export function describeOpenerPurchase(input) {
67
+ const amount = (value) => `${formatUnits(value, input.assetDecimals)} ${input.assetSymbol}`;
68
+ const { ratePerSecond, maxDuration } = input.terms;
69
+ const cap = input.price < ratePerSecond * maxDuration
70
+ ? ` (the seller can earn at most ${amount(input.price)})`
71
+ : "";
72
+ const prefix = input.serviceDescription === undefined ||
73
+ input.serviceDescription.trim().length === 0
74
+ ? ""
75
+ : `${input.serviceDescription.trim()} `;
76
+ return (`${prefix}Pays for one call. Your payment of ${amount(input.price)} funds a Metrik escrow stream of ` +
77
+ `${maxDuration.toString()} seconds at ${amount(ratePerSecond)}/s${cap}; ` +
78
+ "the seller earns only for seconds Metrik's verifier confirms the service is delivering, " +
79
+ `and anything unearned is refundable to you (no ETH needed) via ${input.refundUrlTemplate}. ` +
80
+ "Refunds are not automatic: close the stream and reclaim there, using the streamId from the PAYMENT-RESPONSE. " +
81
+ `Docs: ${input.docsUrl}`);
82
+ }
83
+ /**
84
+ * The stock `exact` server scheme, plus ONE additive settlement enrichment:
85
+ * the successful `PAYMENT-RESPONSE` gets `extra.metrikStreamOpener.refundUrl`
86
+ * for the opened stream. It never touches the settlement outcome fields
87
+ * (`@x402/core` enforces that the enrichment is additive).
88
+ */
89
+ class OpenerExactServerScheme extends ExactEvmScheme {
90
+ refundBaseUrl;
91
+ constructor(refundBaseUrl) {
92
+ super();
93
+ this.refundBaseUrl = refundBaseUrl;
94
+ }
95
+ enrichSettlementResponse = async (context) => {
96
+ if (!context.result.success)
97
+ return undefined;
98
+ const opened = context.result.extra?.[OPENER_EXTRA_KEY];
99
+ const streamId = opened?.streamId;
100
+ if (typeof streamId !== "string" ||
101
+ !/^0x[0-9a-fA-F]{64}$/.test(streamId) ||
102
+ opened?.refundUrl !== undefined) {
103
+ return undefined;
104
+ }
105
+ return {
106
+ [OPENER_EXTRA_KEY]: {
107
+ refundUrl: `${this.refundBaseUrl}/streams/${streamId.toLowerCase()}`,
108
+ },
109
+ };
110
+ };
111
+ }
112
+ const PAYMENT_SIGNATURE_HEADER = "payment-signature";
113
+ /**
114
+ * Per-gateway, in-memory record of EIP-3009 authorizations (chain + asset +
115
+ * payer + nonce): `in-flight` while a request is being verified/served/
116
+ * settled, `pending` after a `settlement_pending` (a retry may reconcile), and
117
+ * `settled` once a success was delivered. In-flight and settled
118
+ * authorizations are refused before the upstream is ever called. Entries are
119
+ * dropped once the authorization's `validBefore` has passed (plus a grace).
120
+ */
121
+ export class GatewayAuthorizationLedger {
122
+ now;
123
+ maxEntries;
124
+ entries = new Map();
125
+ constructor(now, maxEntries = 100_000) {
126
+ this.now = now;
127
+ this.maxEntries = maxEntries;
128
+ }
129
+ /** Claims the authorization for one request; false if it is in flight or settled. */
130
+ claim(key, validBefore) {
131
+ this.prune();
132
+ const entry = this.entries.get(key);
133
+ if (entry !== undefined && entry.state !== "pending")
134
+ return false;
135
+ if (entry === undefined && this.entries.size >= this.maxEntries)
136
+ return false;
137
+ this.entries.set(key, { state: "in-flight", validBefore });
138
+ return true;
139
+ }
140
+ release(key) {
141
+ this.entries.delete(key);
142
+ }
143
+ markPending(key, validBefore) {
144
+ this.entries.set(key, { state: "pending", validBefore });
145
+ }
146
+ markSettled(key, validBefore) {
147
+ this.entries.set(key, { state: "settled", validBefore });
148
+ }
149
+ prune() {
150
+ const now = BigInt(this.now());
151
+ for (const [key, entry] of this.entries) {
152
+ if (entry.state !== "in-flight" && entry.validBefore + 600n < now) {
153
+ this.entries.delete(key);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ /** Ledger key for a `PAYMENT-SIGNATURE`, or undefined if it does not decode. */
159
+ function authorizationKey(header) {
160
+ try {
161
+ const payload = decodePaymentSignatureHeader(header);
162
+ const authorization = payload.payload.authorization;
163
+ const network = payload.accepted?.network;
164
+ const asset = payload.accepted?.asset;
165
+ if (typeof authorization?.from !== "string" ||
166
+ typeof authorization.nonce !== "string" ||
167
+ typeof authorization.validBefore !== "string" ||
168
+ !/^\d+$/.test(authorization.validBefore) ||
169
+ typeof network !== "string" ||
170
+ typeof asset !== "string") {
171
+ return undefined;
172
+ }
173
+ return {
174
+ key: [
175
+ network,
176
+ asset.toLowerCase(),
177
+ authorization.from.toLowerCase(),
178
+ authorization.nonce.toLowerCase(),
179
+ ].join(":"),
180
+ validBefore: BigInt(authorization.validBefore),
181
+ };
182
+ }
183
+ catch {
184
+ return undefined;
185
+ }
186
+ }
187
+ export class X402OpenerModeConfigError extends Error {
188
+ constructor(message) {
189
+ super(message);
190
+ this.name = "X402OpenerModeConfigError";
191
+ }
192
+ }
193
+ export class X402OpenerFacilitatorUnverifiedError extends Error {
194
+ constructor(message, options) {
195
+ super(message, options);
196
+ this.name = "X402OpenerFacilitatorUnverifiedError";
197
+ }
198
+ }
199
+ /**
200
+ * Builds the x402 mode and proves, before returning, every fact it will quote:
201
+ * valid terms and price, one operator-signed listing for the terms, the
202
+ * factory's escrow and token, the predicted `payTo`, and the facilitator's
203
+ * opener marker. Throws on any doubt; the gateway then refuses to start.
204
+ */
205
+ export async function buildGatewayX402OpenerMode(config, deps = {}) {
206
+ try {
207
+ assertValidTerms(config.terms);
208
+ assertValidPrice(config.price, config.terms);
209
+ }
210
+ catch (error) {
211
+ throw new X402OpenerModeConfigError(error instanceof Error ? error.message : String(error));
212
+ }
213
+ const chainId = chainIdFromNetwork(config.network);
214
+ for (const [name, value] of [
215
+ ["factoryAddress", config.factoryAddress],
216
+ ["escrowAddress", config.escrowAddress],
217
+ ["asset", config.asset],
218
+ ]) {
219
+ if (!isAddress(value)) {
220
+ throw new X402OpenerModeConfigError(`${name} must be an EVM address`);
221
+ }
222
+ }
223
+ const maxTimeoutSeconds = config.maxTimeoutSeconds ?? 300;
224
+ if (!Number.isInteger(maxTimeoutSeconds) || maxTimeoutSeconds < 30) {
225
+ throw new X402OpenerModeConfigError("maxTimeoutSeconds must be an integer >= 30");
226
+ }
227
+ if (config.facilitatorToken.length === 0) {
228
+ throw new X402OpenerModeConfigError("facilitatorToken is required");
229
+ }
230
+ if (config.resourceBaseUrl !== undefined) {
231
+ // eslint-disable-next-line no-new -- validates the URL is well-formed.
232
+ new URL(config.resourceBaseUrl);
233
+ }
234
+ const refundBaseUrl = (config.refundBaseUrl ?? config.facilitatorUrl).replace(/\/+$/, "");
235
+ const docsUrl = config.docsUrl ?? DEFAULT_OPENER_DOCS_URL;
236
+ for (const [name, value] of [
237
+ ["refundBaseUrl", refundBaseUrl],
238
+ ["docsUrl", docsUrl],
239
+ ]) {
240
+ if (!isHttpLink(value)) {
241
+ throw new X402OpenerModeConfigError(`${name} must be an http(s) URL`);
242
+ }
243
+ }
244
+ const assetDecimals = config.assetDecimals ?? 6;
245
+ if (!Number.isInteger(assetDecimals) ||
246
+ assetDecimals < 0 ||
247
+ assetDecimals > 36) {
248
+ throw new X402OpenerModeConfigError("assetDecimals must be an integer in [0, 36]");
249
+ }
250
+ if (config.schemaDeclaration !== undefined) {
251
+ try {
252
+ assertSchemaDeclaration(config.schemaDeclaration);
253
+ }
254
+ catch (error) {
255
+ throw new X402OpenerModeConfigError(error instanceof Error ? error.message : String(error));
256
+ }
257
+ }
258
+ const publicClient = deps.publicClient ??
259
+ (deps.rpcUrl === undefined
260
+ ? undefined
261
+ : createPublicClient({ transport: http(deps.rpcUrl) }));
262
+ if (publicClient === undefined) {
263
+ throw new X402OpenerModeConfigError("an RPC (publicClient or rpcUrl) is required to predict the opener address");
264
+ }
265
+ const rpcChainId = await publicClient.getChainId();
266
+ if (rpcChainId !== chainId) {
267
+ throw new X402OpenerModeConfigError(`RPC chain id ${rpcChainId} does not match network ${config.network}`);
268
+ }
269
+ const factory = getAddress(config.factoryAddress);
270
+ const escrow = getAddress(config.escrowAddress);
271
+ const asset = getAddress(config.asset);
272
+ const [factoryEscrow, factoryUsdc, predicted] = await Promise.all([
273
+ publicClient.readContract({
274
+ address: factory,
275
+ abi: x402StreamOpenerFactoryAbi,
276
+ functionName: "escrow",
277
+ }),
278
+ publicClient.readContract({
279
+ address: factory,
280
+ abi: x402StreamOpenerFactoryAbi,
281
+ functionName: "usdc",
282
+ }),
283
+ publicClient.readContract({
284
+ address: factory,
285
+ abi: x402StreamOpenerFactoryAbi,
286
+ functionName: "predict",
287
+ args: [termsTuple(config.terms)],
288
+ }),
289
+ ]);
290
+ if (getAddress(factoryEscrow) !== escrow) {
291
+ throw new X402OpenerModeConfigError(`factory ${factory} settles into ${factoryEscrow}, not this gateway's escrow ${escrow}`);
292
+ }
293
+ if (getAddress(factoryUsdc) !== asset) {
294
+ throw new X402OpenerModeConfigError(`factory token ${factoryUsdc} is not the configured asset ${asset}`);
295
+ }
296
+ const payTo = getAddress(predicted);
297
+ const resolver = deps.listingResolver ??
298
+ new RegistryListingResolver(config.registryUrl === undefined
299
+ ? {}
300
+ : { registryUrl: config.registryUrl });
301
+ const listing = await resolver.resolve(config.terms);
302
+ if (!listing.ok) {
303
+ throw new X402OpenerModeConfigError(`listing check failed (${listing.reason}): ${listing.message}`);
304
+ }
305
+ const facilitatorTimeoutMs = config.facilitatorTimeoutMs ?? DEFAULT_FACILITATOR_TIMEOUT_MS;
306
+ if (!Number.isInteger(facilitatorTimeoutMs) || facilitatorTimeoutMs <= 0) {
307
+ throw new X402OpenerModeConfigError("facilitatorTimeoutMs must be a positive integer");
308
+ }
309
+ const facilitatorClient = deps.facilitatorClient ??
310
+ new HTTPFacilitatorClient({
311
+ url: config.facilitatorUrl,
312
+ timeoutMs: facilitatorTimeoutMs,
313
+ createAuthHeaders: async () => {
314
+ const headers = { Authorization: `Bearer ${config.facilitatorToken}` };
315
+ return { verify: headers, settle: headers, supported: headers };
316
+ },
317
+ });
318
+ const now = deps.now ?? (() => Math.floor(Date.now() / 1000));
319
+ const markerTtl = config.markerTtlSeconds ?? DEFAULT_FACILITATOR_MARKER_TTL_SECONDS;
320
+ let markerCheckedAt;
321
+ const checkMarker = async () => {
322
+ let supported;
323
+ try {
324
+ supported = await facilitatorClient.getSupported();
325
+ }
326
+ catch (cause) {
327
+ throw new X402OpenerFacilitatorUnverifiedError(`the x402 facilitator at ${config.facilitatorUrl} is unreachable`, { cause });
328
+ }
329
+ const kind = supported.kinds.find((candidate) => candidate.x402Version === 2 &&
330
+ candidate.scheme === OPENER_SCHEME &&
331
+ candidate.network === config.network);
332
+ const marker = readOpenerFacilitatorMarker(kind?.extra);
333
+ if (marker === undefined ||
334
+ marker.factory !== factory ||
335
+ marker.escrow !== escrow ||
336
+ marker.usdc !== asset ||
337
+ marker.chainId !== chainId) {
338
+ throw new X402OpenerFacilitatorUnverifiedError(`the x402 facilitator at ${config.facilitatorUrl} does not advertise Metrik opener settlement for factory ${factory} on ${config.network}. ` +
339
+ "Refusing to quote an opener payTo: a stock exact facilitator would transfer the payment straight to the opener and strand it permanently.");
340
+ }
341
+ if (marker.refundRelay !== true) {
342
+ throw new X402OpenerFacilitatorUnverifiedError(`the x402 facilitator at ${config.facilitatorUrl} does not advertise the gasless refund relay (refundRelay: true). ` +
343
+ "Refusing to quote: the 402 tells payers unearned money is refundable without ETH, which needs that relay.");
344
+ }
345
+ if (config.price < BigInt(marker.minAmount)) {
346
+ throw new X402OpenerModeConfigError(`price ${config.price} is below the facilitator minimum ${marker.minAmount}`);
347
+ }
348
+ if (facilitatorTimeoutMs <
349
+ marker.receiptTimeoutSeconds * 1000 + FACILITATOR_TIMEOUT_HEADROOM_MS) {
350
+ throw new X402OpenerModeConfigError(`the facilitator timeout ${facilitatorTimeoutMs}ms does not outlast the facilitator's ${marker.receiptTimeoutSeconds}s receipt wait by ${FACILITATOR_TIMEOUT_HEADROOM_MS / 1000}s`);
351
+ }
352
+ };
353
+ const resourceServer = new x402ResourceServer(facilitatorClient).register(config.network, new OpenerExactServerScheme(refundBaseUrl));
354
+ const description = describeOpenerPurchase({
355
+ terms: config.terms,
356
+ price: config.price,
357
+ assetDecimals,
358
+ assetSymbol: config.assetName,
359
+ refundUrlTemplate: `${refundBaseUrl}/streams/{streamId}`,
360
+ docsUrl,
361
+ ...(config.description === undefined
362
+ ? {}
363
+ : { serviceDescription: config.description }),
364
+ });
365
+ const route = {
366
+ accepts: {
367
+ scheme: OPENER_SCHEME,
368
+ network: config.network,
369
+ payTo,
370
+ price: {
371
+ asset,
372
+ amount: config.price.toString(),
373
+ extra: {
374
+ name: config.assetName,
375
+ version: config.assetVersion,
376
+ assetTransferMethod: "eip3009",
377
+ [OPENER_EXTRA_KEY]: {
378
+ ...termsToExtra(factory, config.terms),
379
+ refundUrl: `${refundBaseUrl}/streams/{streamId}`,
380
+ docsUrl,
381
+ },
382
+ },
383
+ },
384
+ maxTimeoutSeconds,
385
+ },
386
+ description,
387
+ mimeType: "application/json",
388
+ ...(config.schemaDeclaration === undefined
389
+ ? {}
390
+ : { extensions: { bazaar: config.schemaDeclaration } }),
391
+ unpaidResponseBody: () => ({
392
+ contentType: "application/json",
393
+ body: { authorized: false, reason: "payment-required" },
394
+ }),
395
+ };
396
+ const httpServer = new x402HTTPResourceServer(resourceServer, route);
397
+ let initialized;
398
+ const ready = async () => {
399
+ const nowSeconds = now();
400
+ if (markerCheckedAt === undefined ||
401
+ nowSeconds - markerCheckedAt >= markerTtl) {
402
+ markerCheckedAt = undefined;
403
+ await checkMarker();
404
+ markerCheckedAt = nowSeconds;
405
+ }
406
+ if (initialized === undefined) {
407
+ initialized = httpServer.initialize().catch((error) => {
408
+ initialized = undefined;
409
+ throw new X402OpenerFacilitatorUnverifiedError("the x402 resource server could not initialize against the facilitator", { cause: error });
410
+ });
411
+ }
412
+ await initialized;
413
+ };
414
+ // Prove the facilitator at startup: refuse to start otherwise.
415
+ await ready();
416
+ if (refundBaseUrl !== config.facilitatorUrl.replace(/\/+$/, "")) {
417
+ await checkRefundRelayAt(refundBaseUrl, deps.fetch ?? fetch, {
418
+ factory,
419
+ escrow,
420
+ asset,
421
+ chainId,
422
+ network: config.network,
423
+ });
424
+ }
425
+ const mode = {
426
+ payTo,
427
+ network: config.network,
428
+ terms: config.terms,
429
+ price: config.price,
430
+ resourceBaseUrl: config.resourceBaseUrl,
431
+ description,
432
+ refundBaseUrl,
433
+ httpServer,
434
+ authorizations: new GatewayAuthorizationLedger(now),
435
+ ready,
436
+ handle: (io) => handleX402GatewayRequest(mode, io).catch((error) => {
437
+ io.logError("x402 request failed", error);
438
+ io.writeJson(500, "internal-error");
439
+ }),
440
+ };
441
+ return mode;
442
+ }
443
+ /**
444
+ * A refund base URL other than the facilitator URL (e.g. the public origin of
445
+ * the same service) must serve the same opener marker with the relay on, so
446
+ * the 402 never points payers at a URL that cannot refund them.
447
+ */
448
+ async function checkRefundRelayAt(refundBaseUrl, fetchImpl, expected) {
449
+ let supported;
450
+ try {
451
+ const response = await fetchImpl(`${refundBaseUrl}/supported`, {
452
+ signal: AbortSignal.timeout(10_000),
453
+ });
454
+ if (!response.ok)
455
+ throw new Error(`HTTP ${response.status}`);
456
+ supported = (await response.json());
457
+ }
458
+ catch (cause) {
459
+ throw new X402OpenerFacilitatorUnverifiedError(`the refund relay at ${refundBaseUrl} is unreachable`, { cause });
460
+ }
461
+ const kind = supported.kinds?.find((candidate) => candidate.x402Version === 2 &&
462
+ candidate.scheme === OPENER_SCHEME &&
463
+ candidate.network === expected.network);
464
+ const marker = readOpenerFacilitatorMarker(kind?.extra);
465
+ if (marker === undefined ||
466
+ marker.factory !== expected.factory ||
467
+ marker.escrow !== expected.escrow ||
468
+ marker.usdc !== expected.asset ||
469
+ marker.chainId !== expected.chainId ||
470
+ marker.refundRelay !== true) {
471
+ throw new X402OpenerFacilitatorUnverifiedError(`${refundBaseUrl} does not serve the Metrik opener refund relay for factory ${expected.factory}; refusing to advertise it as the refund URL`);
472
+ }
473
+ }
474
+ /**
475
+ * One x402-mode request, mirroring the reference `@x402/*` middleware: verify
476
+ * via the facilitator, run the upstream, and settle ONLY when the upstream
477
+ * status is < 400 — before any upstream byte is sent. A failed settlement sends
478
+ * no upstream body. Every facilitator error fails closed: never a free call.
479
+ */
480
+ async function handleX402GatewayRequest(mode, io) {
481
+ try {
482
+ await mode.ready();
483
+ }
484
+ catch (error) {
485
+ // The facilitator is not provably the Metrik opener facilitator right now:
486
+ // quote no payTo and verify nothing (a stock facilitator would strand it).
487
+ io.logError("x402 facilitator unverified", error);
488
+ io.writeJson(503, "x402-facilitator-unavailable");
489
+ return;
490
+ }
491
+ const { requestUrl, method, headers } = io;
492
+ const origin = mode.resourceBaseUrl ?? `http://${headers.host ?? "localhost"}`;
493
+ const fullUrl = new URL(requestUrl.pathname + requestUrl.search, origin).toString();
494
+ const adapter = {
495
+ getHeader: (name) => headers[name.toLowerCase()],
496
+ getMethod: () => method,
497
+ getPath: () => requestUrl.pathname,
498
+ getUrl: () => fullUrl,
499
+ getAcceptHeader: () => headers.accept ?? "",
500
+ getUserAgent: () => headers["user-agent"] ?? "",
501
+ };
502
+ const paymentHeader = headers[PAYMENT_SIGNATURE_HEADER]?.trim();
503
+ const context = {
504
+ adapter,
505
+ path: requestUrl.pathname,
506
+ method,
507
+ ...(paymentHeader === undefined || paymentHeader.length === 0
508
+ ? {}
509
+ : { paymentHeader }),
510
+ };
511
+ // One authorization, at most one served response: claim it before verify so
512
+ // a concurrent duplicate never reaches the facilitator or the upstream.
513
+ const claim = paymentHeader === undefined || paymentHeader.length === 0
514
+ ? undefined
515
+ : authorizationKey(paymentHeader);
516
+ if (claim !== undefined &&
517
+ !mode.authorizations.claim(claim.key, claim.validBefore)) {
518
+ io.writeJson(409, "x402-payment-already-used");
519
+ return;
520
+ }
521
+ const release = () => {
522
+ if (claim !== undefined)
523
+ mode.authorizations.release(claim.key);
524
+ };
525
+ let result;
526
+ try {
527
+ result = await mode.httpServer.processHTTPRequest(context);
528
+ }
529
+ catch (error) {
530
+ release();
531
+ io.logError("x402 verification failed", error);
532
+ io.writeJson(402, "x402-facilitator-unavailable");
533
+ return;
534
+ }
535
+ if (result.type === "no-payment-required") {
536
+ // The route covers every path; reaching here is a misconfiguration.
537
+ release();
538
+ io.writeJson(500, "internal-error");
539
+ return;
540
+ }
541
+ if (result.type === "payment-error") {
542
+ release();
543
+ writeInstructions(io, result.response);
544
+ return;
545
+ }
546
+ const { cancellationDispatcher, beforeHandlerSettlement, paymentPayload, paymentRequirements, declaredExtensions, } = result;
547
+ let upstream;
548
+ try {
549
+ upstream = await io.callUpstream();
550
+ }
551
+ catch (error) {
552
+ await cancellationDispatcher
553
+ .cancel({ reason: "handler_threw", error })
554
+ .catch(() => undefined);
555
+ release();
556
+ io.logError("upstream request failed", error);
557
+ io.writeJson(502, "upstream-unavailable");
558
+ return;
559
+ }
560
+ // The seller's upstream must not steer settlement.
561
+ const upstreamHeaders = {};
562
+ for (const [key, value] of Object.entries(upstream.headers)) {
563
+ if (key.toLowerCase() === SETTLEMENT_OVERRIDES_HEADER.toLowerCase())
564
+ continue;
565
+ upstreamHeaders[key] = value;
566
+ }
567
+ if (upstream.status >= 400) {
568
+ // Nothing is settled for a failed upstream: the authorization is never
569
+ // submitted, so no funds move.
570
+ await cancellationDispatcher
571
+ .cancel({ reason: "handler_failed", responseStatus: upstream.status })
572
+ .catch(() => undefined);
573
+ release();
574
+ io.write(upstream.status, upstreamHeaders, upstream.body);
575
+ return;
576
+ }
577
+ let settled;
578
+ try {
579
+ settled = await mode.httpServer.processSettlement(paymentPayload, paymentRequirements, declaredExtensions, {
580
+ request: context,
581
+ responseBody: upstream.body,
582
+ responseHeaders: upstreamHeaders,
583
+ }, undefined, beforeHandlerSettlement);
584
+ }
585
+ catch (error) {
586
+ // Unknown outcome (e.g. the facilitator timed out): let a retry of the same
587
+ // signature through so the facilitator's ledger can reconcile it — that
588
+ // ledger, not this one, guarantees at most one success.
589
+ if (claim !== undefined) {
590
+ mode.authorizations.markPending(claim.key, claim.validBefore);
591
+ }
592
+ io.logError("x402 settlement failed", error);
593
+ io.writeJson(402, "x402-settlement-failed");
594
+ return;
595
+ }
596
+ if (!settled.success) {
597
+ if (claim !== undefined) {
598
+ if (settled.errorReason === "settlement_pending") {
599
+ mode.authorizations.markPending(claim.key, claim.validBefore);
600
+ }
601
+ else if (settled.errorReason === "duplicate_settlement") {
602
+ mode.authorizations.markSettled(claim.key, claim.validBefore);
603
+ }
604
+ else {
605
+ release();
606
+ }
607
+ }
608
+ // No upstream body on a failed settlement.
609
+ writeInstructions(io, settled.response);
610
+ return;
611
+ }
612
+ if (claim !== undefined) {
613
+ mode.authorizations.markSettled(claim.key, claim.validBefore);
614
+ }
615
+ const responseHeaders = {};
616
+ let existingCacheControl = null;
617
+ for (const [key, value] of Object.entries(upstreamHeaders)) {
618
+ if (key.toLowerCase() === "cache-control") {
619
+ existingCacheControl = value;
620
+ continue;
621
+ }
622
+ responseHeaders[key] = value;
623
+ }
624
+ Object.assign(responseHeaders, settled.headers);
625
+ responseHeaders["Cache-Control"] =
626
+ withPrivateCacheControl(existingCacheControl);
627
+ io.write(upstream.status, responseHeaders, upstream.body);
628
+ }
629
+ function writeInstructions(io, response) {
630
+ const headers = { ...response.headers };
631
+ if (response.isHtml === true) {
632
+ headers["Content-Type"] = "text/html; charset=utf-8";
633
+ io.write(response.status, headers, String(response.body ?? ""));
634
+ return;
635
+ }
636
+ headers["Content-Type"] = "application/json";
637
+ io.write(response.status, headers, JSON.stringify(response.body ?? {}));
638
+ }
639
+ //# sourceMappingURL=x402-opener-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-opener-mode.js","sourceRoot":"","sources":["../../src/gateway/x402-opener-mode.ts"],"names":[],"mappings":"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"}