@cryptonly/x402-fastify 0.6.0 → 0.8.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.
package/README.md CHANGED
@@ -12,7 +12,7 @@ Accept x402 payments in Fastify, with Cryptonly as the facilitator.
12
12
 
13
13
  ---
14
14
 
15
- Cryptonly verifies and settles each payment, and pays the network fee. Payments go straight to your wallet. Your prices live in the Cryptonly dashboard, so a price change needs no deploy.
15
+ Cryptonly verifies and settles each payment, and pays the network fee. Payments go straight to your wallet. Your prices live in the Cryptonly dashboard, so a price change needs no deploy. An endpoint can have a price in each currency you accept, such as USDC on Base and on Solana: the `402` offers all of them and the buyer picks one.
16
16
 
17
17
  You need a Cryptonly API key with the `x402.verify` and `x402.settle` scopes. The [quickstart](https://docs.cryptonly.net/guides/x402/quickstart/) covers getting one.
18
18
 
@@ -69,9 +69,26 @@ The buyer is charged only when the handler succeeds. A `4xx`/`5xx` reply or a th
69
69
  | `svmSchemes` | `[new ExactSvmScheme()]` if `@x402/svm` is installed | Schemes for Solana. |
70
70
  | `logger` | `console` | Gets reload failures and skipped routes. |
71
71
  | `paywallConfig` | — | Passed to the stock `@x402/fastify` hooks. |
72
+ | `pathPrefix` | — | Prefix a proxy strips before the request reaches the app. See [Behind a proxy](#behind-a-proxy). |
73
+ | `publicPath` | — | Maps the app's path to the public path, for other rewrites. |
74
+ | `publicBaseUrl` | the request's | Public origin buyers call, for `resource.url` in the `402`. |
72
75
 
73
76
  `app.cryptonlyX402` has `ready()`, `refresh()`, `routes()` and `close()`. `app.close()` stops the refresh.
74
77
 
78
+ ## Behind a proxy
79
+
80
+ Dashboard prices are keyed by the public path. If a reverse proxy rewrites the path, tell the plugin how, or the paths don't match and the routes are served **for free**: the plugin only gates the paths it knows.
81
+
82
+ ```ts
83
+ // The proxy serves /v1/weather from the app's /weather:
84
+ await app.register(cryptonlyPayments, { apiKey, pathPrefix: '/v1', publicBaseUrl: 'https://api.example.com' });
85
+
86
+ // The proxy adds /internal:
87
+ await app.register(cryptonlyPayments, { apiKey, publicPath: (path) => path.replace(/^\/internal/, '') });
88
+ ```
89
+
90
+ `publicBaseUrl` sets the URL buyers see in the `402`. Without it, the URL is built from the request's host and protocol. Behind a proxy, set Fastify `trustProxy` so the protocol is right.
91
+
75
92
  ## Solana
76
93
 
77
94
  Install `@x402/svm` and `@solana/kit`, and add a Solana payout wallet in the dashboard. Solana prices then work with no other change.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { FastifyPluginAsync } from 'fastify';
2
- import { type RoutesConfig } from '@x402/core/server';
2
+ import type { RoutesConfig } from '@x402/core/server';
3
3
  import { type PaywallConfig } from '@x402/fastify';
4
4
  import { type X402RouteSourceOptions } from '@cryptonly/x402';
5
5
  /** Options for {@link cryptonlyPayments}. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAGnB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,iBAAiB,CAAC;AAEzB,6CAA6C;AAC7C,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC9D,yEAAyE;IACzE,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAEF,0FAA0F;AAC1F,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,8EAA8E;IAC9E,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,0EAA0E;IAC1E,MAAM,IAAI,YAAY,GAAG,SAAS,CAAC;IACnC,8EAA8E;IAC9E,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,aAAa,EAAE,aAAa,CAAC;KAC9B;CACF;AAoFD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,iBAAiB,8CAG5B,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAGnB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAOL,KAAK,sBAAsB,EAC5B,MAAM,iBAAiB,CAAC;AAEzB,6CAA6C;AAC7C,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC9D,yEAAyE;IACzE,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAEF,0FAA0F;AAC1F,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,8EAA8E;IAC9E,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,0EAA0E;IAC1E,MAAM,IAAI,YAAY,GAAG,SAAS,CAAC;IACnC,8EAA8E;IAC9E,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,aAAa,EAAE,aAAa,CAAC;KAC9B;CACF;AAsFD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,iBAAiB,8CAG5B,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.routesFromConfig = exports.fetchX402Config = exports.cryptonlyPayments = void 0;
7
7
  const fastify_plugin_1 = __importDefault(require("fastify-plugin"));
8
- const server_1 = require("@x402/core/server");
9
8
  const fastify_1 = require("@x402/fastify");
10
9
  const x402_1 = require("@cryptonly/x402");
11
10
  const HOOKS = Symbol('cryptonlyX402Hooks');
@@ -30,7 +29,8 @@ function stockHooks(httpServer, paywallConfig) {
30
29
  return hooks;
31
30
  }
32
31
  const plugin = async (app, options) => {
33
- const source = (0, x402_1.createX402RouteSource)(options, (routes, config) => stockHooks(new server_1.x402HTTPResourceServer((0, x402_1.createResourceServer)(config, source.facilitator, source.schemes, source.svmSchemes), routes), options.paywallConfig));
32
+ const publicRequest = (0, x402_1.createPublicRequestMapper)(options);
33
+ const source = (0, x402_1.createX402RouteSource)(options, (routes, config) => stockHooks((0, x402_1.createHTTPResourceServer)((0, x402_1.createResourceServer)(config, source.facilitator, source.schemes, source.svmSchemes), routes, publicRequest), options.paywallConfig));
34
34
  // The stock hooks' per-request state, declared once on the real instance.
35
35
  app.decorateRequest('x402Context', undefined);
36
36
  app.decorateRequest('x402RawGuard', undefined);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cryptonly/x402-fastify",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Fastify plugin for x402 payments with Cryptonly as the facilitator; prices come from the Cryptonly dashboard.",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -51,7 +51,7 @@
51
51
  "access": "public"
52
52
  },
53
53
  "dependencies": {
54
- "@cryptonly/x402": "0.6.0",
54
+ "@cryptonly/x402": "0.8.0",
55
55
  "fastify-plugin": "^5.1.0"
56
56
  },
57
57
  "peerDependencies": {