@thecryptodonkey/toll-booth 1.1.2 → 1.2.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 (96) hide show
  1. package/README.md +71 -23
  2. package/dist/adapters/express.d.ts +15 -2
  3. package/dist/adapters/express.d.ts.map +1 -1
  4. package/dist/adapters/express.js +62 -16
  5. package/dist/adapters/express.js.map +1 -1
  6. package/dist/adapters/hono.d.ts +62 -0
  7. package/dist/adapters/hono.d.ts.map +1 -0
  8. package/dist/adapters/hono.js +202 -0
  9. package/dist/adapters/hono.js.map +1 -0
  10. package/dist/adapters/proxy-headers.d.ts.map +1 -1
  11. package/dist/adapters/proxy-headers.js +1 -0
  12. package/dist/adapters/proxy-headers.js.map +1 -1
  13. package/dist/adapters/web-standard.d.ts +9 -1
  14. package/dist/adapters/web-standard.d.ts.map +1 -1
  15. package/dist/adapters/web-standard.js +44 -9
  16. package/dist/adapters/web-standard.js.map +1 -1
  17. package/dist/backends/cln.d.ts.map +1 -1
  18. package/dist/backends/cln.js +5 -2
  19. package/dist/backends/cln.js.map +1 -1
  20. package/dist/backends/lnbits.d.ts.map +1 -1
  21. package/dist/backends/lnbits.js +5 -2
  22. package/dist/backends/lnbits.js.map +1 -1
  23. package/dist/backends/lnd.d.ts.map +1 -1
  24. package/dist/backends/lnd.js +4 -1
  25. package/dist/backends/lnd.js.map +1 -1
  26. package/dist/backends/phoenixd.d.ts.map +1 -1
  27. package/dist/backends/phoenixd.js +5 -2
  28. package/dist/backends/phoenixd.js.map +1 -1
  29. package/dist/booth.d.ts.map +1 -1
  30. package/dist/booth.js +36 -6
  31. package/dist/booth.js.map +1 -1
  32. package/dist/core/cashu-redeem.d.ts.map +1 -1
  33. package/dist/core/cashu-redeem.js +15 -5
  34. package/dist/core/cashu-redeem.js.map +1 -1
  35. package/dist/core/create-invoice.d.ts +1 -0
  36. package/dist/core/create-invoice.d.ts.map +1 -1
  37. package/dist/core/create-invoice.js +29 -3
  38. package/dist/core/create-invoice.js.map +1 -1
  39. package/dist/core/invoice-status.d.ts.map +1 -1
  40. package/dist/core/invoice-status.js +24 -11
  41. package/dist/core/invoice-status.js.map +1 -1
  42. package/dist/core/l402-rail.d.ts +11 -0
  43. package/dist/core/l402-rail.d.ts.map +1 -0
  44. package/dist/core/l402-rail.js +94 -0
  45. package/dist/core/l402-rail.js.map +1 -0
  46. package/dist/core/nwc-pay.d.ts.map +1 -1
  47. package/dist/core/nwc-pay.js +8 -4
  48. package/dist/core/nwc-pay.js.map +1 -1
  49. package/dist/core/payment-rail.d.ts +40 -0
  50. package/dist/core/payment-rail.d.ts.map +1 -0
  51. package/dist/core/payment-rail.js +13 -0
  52. package/dist/core/payment-rail.js.map +1 -0
  53. package/dist/core/toll-booth.d.ts +2 -1
  54. package/dist/core/toll-booth.d.ts.map +1 -1
  55. package/dist/core/toll-booth.js +143 -120
  56. package/dist/core/toll-booth.js.map +1 -1
  57. package/dist/core/types.d.ts +17 -2
  58. package/dist/core/types.d.ts.map +1 -1
  59. package/dist/core/types.js.map +1 -1
  60. package/dist/core/x402-rail.d.ts +4 -0
  61. package/dist/core/x402-rail.d.ts.map +1 -0
  62. package/dist/core/x402-rail.js +65 -0
  63. package/dist/core/x402-rail.js.map +1 -0
  64. package/dist/core/x402-types.d.ts +29 -0
  65. package/dist/core/x402-types.d.ts.map +1 -0
  66. package/dist/core/x402-types.js +7 -0
  67. package/dist/core/x402-types.js.map +1 -0
  68. package/dist/demo.js +6 -6
  69. package/dist/demo.js.map +1 -1
  70. package/dist/index.d.ts +10 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +4 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/macaroon.d.ts +18 -2
  75. package/dist/macaroon.d.ts.map +1 -1
  76. package/dist/macaroon.js +61 -8
  77. package/dist/macaroon.js.map +1 -1
  78. package/dist/payment-page.d.ts.map +1 -1
  79. package/dist/payment-page.js +8 -1
  80. package/dist/payment-page.js.map +1 -1
  81. package/dist/stats.d.ts.map +1 -1
  82. package/dist/stats.js +4 -2
  83. package/dist/stats.js.map +1 -1
  84. package/dist/storage/interface.d.ts +10 -5
  85. package/dist/storage/interface.d.ts.map +1 -1
  86. package/dist/storage/interface.js +0 -1
  87. package/dist/storage/interface.js.map +1 -1
  88. package/dist/storage/memory.d.ts.map +1 -1
  89. package/dist/storage/memory.js +52 -15
  90. package/dist/storage/memory.js.map +1 -1
  91. package/dist/storage/sqlite.d.ts.map +1 -1
  92. package/dist/storage/sqlite.js +138 -28
  93. package/dist/storage/sqlite.js.map +1 -1
  94. package/dist/types.d.ts +23 -4
  95. package/dist/types.d.ts.map +1 -1
  96. package/package.json +22 -5
package/README.md CHANGED
@@ -2,12 +2,15 @@
2
2
 
3
3
  [![MIT licence](https://img.shields.io/badge/licence-MIT-blue.svg)](./LICENSE)
4
4
  [![Nostr](https://img.shields.io/badge/Nostr-Zap%20me-purple)](https://primal.net/p/npub1mgvlrnf5hm9yf0n5mf9nqmvarhvxkc6remu5ec3vf8r0txqkuk7su0e7q2)
5
+ [![npm](https://img.shields.io/npm/v/@thecryptodonkey/toll-booth)](https://www.npmjs.com/package/@thecryptodonkey/toll-booth)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.8-blue)](https://www.typescriptlang.org/)
7
+ [![Node](https://img.shields.io/badge/Node-%3E%3D18-green)](https://nodejs.org/)
5
8
 
6
- **Any API becomes a Lightning toll booth in one line.**
9
+ **Monetise any API with one line of code.**
7
10
 
8
11
  ![toll-booth demo](demo/toll-booth-demo.gif)
9
12
 
10
- [Live demo](https://jokes.trotters.dev/api/joke) - pay 10 sats, get a joke. No account. No sign-up.
13
+ [Live demo](https://jokes.trotters.dev/) - pay 21 sats, get a joke. No account. No sign-up. ([API](https://jokes.trotters.dev/api/joke))
11
14
 
12
15
  ### Try it now
13
16
 
@@ -59,11 +62,11 @@ app.listen(3000)
59
62
 
60
63
  Zero accounts. Zero API keys. Zero chargebacks. Zero KYC. Zero vendor lock-in.
61
64
 
62
- Your API earns sats the moment it receives a request. Clients pay with any Lightning wallet, no relationship with you required. Payments settle instantly and are cryptographically final - no disputes, no reversals, no Stripe risk reviews.
65
+ Your API earns money the moment it receives a request. Clients pay with Lightning, Cashu ecash, or NWC — no relationship with you required. Payments settle instantly and are cryptographically final no disputes, no reversals, no Stripe risk reviews.
63
66
 
64
67
  ---
65
68
 
66
- ## Let AI agents pay for your API with Lightning
69
+ ## Let AI agents pay for your API
67
70
 
68
71
  toll-booth is the **server side** of a two-part stack for machine-to-machine payments.
69
72
  [l402-mcp](https://github.com/TheCryptoDonkey/l402-mcp) is the **client side** - an MCP server that gives AI agents the ability to discover, pay, and consume L402-gated APIs autonomously.
@@ -78,11 +81,15 @@ An agent using Claude, GPT, or any MCP-capable model can call your API, receive
78
81
 
79
82
  ## Live demo
80
83
 
84
+ Visit [jokes.trotters.dev](https://jokes.trotters.dev/) in a browser to try it - get a free joke, hit the paywall, scan the QR code or pay with a browser wallet extension.
85
+
86
+ Or use the API directly:
87
+
81
88
  ```bash
82
89
  # Get a free joke (1 free per day per IP)
83
90
  curl https://jokes.trotters.dev/api/joke
84
91
 
85
- # Free tier exhausted - request a Lightning invoice for 10 sats
92
+ # Free tier exhausted - request a Lightning invoice for 21 sats
86
93
  curl -X POST https://jokes.trotters.dev/create-invoice
87
94
 
88
95
  # Pay the invoice with any Lightning wallet, then authenticate
@@ -101,6 +108,7 @@ curl -H "Authorization: L402 <macaroon>:<preimage>" https://jokes.trotters.dev/a
101
108
  - **Free tier** - configurable daily allowance per IP
102
109
  - **Self-service payment page** - QR codes, tier selector, wallet adapter buttons
103
110
  - **SQLite persistence** - WAL mode, automatic invoice expiry pruning
111
+ - **Three framework adapters** - Express, Web Standard (Deno/Bun/Workers), and Hono
104
112
  - **Framework-agnostic core** - use the `Booth` facade or wire handlers directly
105
113
 
106
114
  ---
@@ -166,6 +174,45 @@ Deno.serve({ port: 3000 }, async (req: Request) => {
166
174
  })
167
175
  ```
168
176
 
177
+ ### Hono
178
+
179
+ ```typescript
180
+ import { Hono } from 'hono'
181
+ import { createHonoTollBooth, type TollBoothEnv } from '@thecryptodonkey/toll-booth/hono'
182
+ import { phoenixdBackend } from '@thecryptodonkey/toll-booth/backends/phoenixd'
183
+ import { createTollBooth } from '@thecryptodonkey/toll-booth'
184
+ import { sqliteStorage } from '@thecryptodonkey/toll-booth/storage/sqlite'
185
+
186
+ const storage = sqliteStorage({ path: './toll-booth.db' })
187
+ const engine = createTollBooth({
188
+ backend: phoenixdBackend({ url: 'http://localhost:9740', password: process.env.PHOENIXD_PASSWORD! }),
189
+ storage,
190
+ pricing: { '/api': 10 },
191
+ upstream: 'http://localhost:8080',
192
+ rootKey: process.env.ROOT_KEY!,
193
+ })
194
+
195
+ const tollBooth = createHonoTollBooth({ engine })
196
+ const app = new Hono<TollBoothEnv>()
197
+
198
+ // Mount payment routes
199
+ app.route('/', tollBooth.createPaymentApp({
200
+ storage,
201
+ rootKey: process.env.ROOT_KEY!,
202
+ tiers: [],
203
+ defaultAmount: 1000,
204
+ }))
205
+
206
+ // Gate your API
207
+ app.use('/api/*', tollBooth.authMiddleware)
208
+ app.get('/api/resource', (c) => {
209
+ const balance = c.get('tollBoothCreditBalance')
210
+ return c.json({ message: 'Paid content', balance })
211
+ })
212
+
213
+ export default app
214
+ ```
215
+
169
216
  ### Cashu-only (no Lightning node)
170
217
 
171
218
  ```typescript
@@ -223,24 +270,13 @@ Each backend implements the `LightningBackend` interface (`createInvoice` + `che
223
270
 
224
271
  ---
225
272
 
226
- ## Why not x402?
273
+ ## What about x402?
227
274
 
228
- [x402](https://x402.org) is Coinbase's HTTP 402 payment protocol for on-chain stablecoins. It validates the same idea - machines paying for APIs - but makes different trade-offs.
229
-
230
- | | x402 | toll-booth |
231
- |---|---|---|
232
- | **Settlement** | On-chain (Base, Ethereum) | Lightning Network - sub-second, final |
233
- | **Settlement time** | Block confirmations (seconds to minutes) | Milliseconds |
234
- | **Transaction fees** | Gas fees (variable) | Routing fees (fractions of a sat) |
235
- | **Currency** | USDC on Base | Bitcoin (sats), with stablecoin compatibility via USDT-over-LN bridges |
236
- | **Infrastructure** | Requires Coinbase Commerce or on-chain wallet | Any of 5 Lightning backends, Cashu ecash, or NWC - self-hosted or hosted |
237
- | **Vendor lock-in** | Coinbase ecosystem | None - open protocol, open source, any Lightning wallet |
238
- | **Serverless** | Yes | Yes - Web Standard adapter for Workers, Deno, Bun |
239
- | **Offline/edge** | No - requires chain access | Yes - Cashu-only mode needs no node at all |
275
+ [x402](https://x402.org) is Coinbase's HTTP 402 payment protocol for on-chain stablecoins. Great the more protocols normalising HTTP 402 as a payment primitive, the better for everyone.
240
276
 
241
- x402 is doing valuable work normalising HTTP 402 as a payment primitive. If your clients already hold USDC on Base, it's a reasonable choice. If you want sub-second settlement, self-sovereign infrastructure, and a protocol that works with any Lightning wallet on earth, toll-booth is the answer.
277
+ toll-booth is **payment-rail agnostic**. It already supports Lightning (five backends), Cashu ecash, and Nostr Wallet Connect. x402 is on the roadmap as another pluggable backend. When it lands, a single toll-booth deployment will accept Lightning **and** x402 stablecoins **and** Cashu simultaneously. The seller doesn't care how they get paid. They just want paid.
242
278
 
243
- **Stablecoin compatibility:** toll-booth doesn't care how an invoice gets paid. As USDT-over-Lightning bridges (UTEXO and others) go live, your gated APIs automatically accept stablecoins with zero code changes. The best of both worlds: stablecoin UX on Bitcoin rails.
279
+ The unique value of toll-booth isn't any single payment rail. It's the **middleware layer**: gating, credit accounting, free tiers, volume discounts, upstream proxying, and macaroon credentials all framework-agnostic, all runtime-agnostic, all payment-rail agnostic. Payment protocols are pluggable backends. toll-booth is the booth.
244
280
 
245
281
  ---
246
282
 
@@ -272,7 +308,7 @@ Deploy toll-booth as a sidecar (Docker Compose, Kubernetes) or as a standalone g
272
308
 
273
309
  ## Production checklist
274
310
 
275
- - Set a persistent `rootKey` (64 hex chars / 32 bytes), otherwise tokens are invalidated on restart.
311
+ - **Set a persistent `rootKey`** (64 hex chars / 32 bytes). Without it, a random key is generated per restart and all existing macaroons become invalid. Generate one with: `node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"`
276
312
  - Use a persistent `dbPath` (default: `./toll-booth.db`).
277
313
  - Enable `strictPricing: true` to prevent unpriced routes from bypassing billing.
278
314
  - Ensure your `pricing` keys match the paths the middleware actually sees (after mounting).
@@ -286,7 +322,7 @@ Deploy toll-booth as a sidecar (Docker Compose, Kubernetes) or as a standalone g
286
322
 
287
323
  ### sats-for-laughs - build your own paid API
288
324
 
289
- [`examples/sats-for-laughs/`](examples/sats-for-laughs/) is the fastest path from "I have an API" to "my API earns sats". It's the same code that runs the [live demo](https://jokes.trotters.dev/api/joke). Clone it, change three env vars, deploy.
325
+ [`examples/sats-for-laughs/`](examples/sats-for-laughs/) is the fastest path from "I have an API" to "my API earns sats". It's the same code that runs the [live demo](https://jokes.trotters.dev/). Includes a web frontend with QR codes and wallet adapter buttons, plus a JSON API for programmatic access. Clone it, change three env vars, deploy.
290
326
 
291
327
  ```bash
292
328
  cd examples/sats-for-laughs
@@ -343,7 +379,7 @@ The five most common options:
343
379
 
344
380
  | Option | Type | Description |
345
381
  |--------|------|-------------|
346
- | `adapter` | `'express' \| 'web-standard'` | Framework integration to use |
382
+ | `adapter` | `'express' \| 'web-standard' \| 'hono'` | Framework integration to use |
347
383
  | `backend` | `LightningBackend` | Lightning node (optional if using Cashu-only) |
348
384
  | `pricing` | `Record<string, number>` | Route pattern to cost in sats |
349
385
  | `upstream` | `string` | URL to proxy authorised requests to |
@@ -357,6 +393,18 @@ See [docs/configuration.md](docs/configuration.md) for the full reference includ
357
393
 
358
394
  **[Why L402?](docs/vision.md)** - the case for permissionless, machine-to-machine payments on the web.
359
395
 
396
+ **[Architecture](docs/architecture.md)** - how toll-booth, token-toll, and l402-mcp fit together.
397
+
398
+ ---
399
+
400
+ ## Ecosystem
401
+
402
+ | Project | Role |
403
+ |---------|------|
404
+ | **[toll-booth](https://github.com/TheCryptoDonkey/toll-booth)** | **Payment-rail agnostic HTTP 402 middleware** |
405
+ | [token-toll](https://github.com/TheCryptoDonkey/token-toll) | Pay-per-token AI inference proxy (built on toll-booth) |
406
+ | [l402-mcp](https://github.com/TheCryptoDonkey/l402-mcp) | MCP client — AI agents discover, pay, and consume L402 APIs |
407
+
360
408
  ---
361
409
 
362
410
  ## Support
@@ -1,4 +1,4 @@
1
- import type { RequestHandler } from 'express';
1
+ import type { Request, RequestHandler } from 'express';
2
2
  import type { TollBoothEngine } from '../core/toll-booth.js';
3
3
  import type { CreateInvoiceDeps } from '../core/create-invoice.js';
4
4
  import type { InvoiceStatusDeps } from '../core/invoice-status.js';
@@ -17,6 +17,12 @@ export interface ExpressMiddlewareConfig {
17
17
  responseHeaders?: Record<string, string>;
18
18
  /** Timeout in milliseconds for upstream proxy requests (default: 30000). */
19
19
  upstreamTimeout?: number;
20
+ /**
21
+ * Custom callback to extract client IP from the request.
22
+ * Use this for platform-specific IP resolution.
23
+ * Takes precedence over trustProxy when provided.
24
+ */
25
+ getClientIp?: (req: Request) => string;
20
26
  }
21
27
  export declare function createExpressMiddleware(engineOrConfig: TollBoothEngine | ExpressMiddlewareConfig, upstreamArg?: string): RequestHandler;
22
28
  /**
@@ -27,13 +33,20 @@ export declare function createExpressMiddleware(engineOrConfig: TollBoothEngine
27
33
  * otherwise returns JSON with `{ paid, preimage }`.
28
34
  */
29
35
  export declare function createExpressInvoiceStatusHandler(deps: InvoiceStatusDeps): RequestHandler;
36
+ export interface CreateInvoiceHandlerConfig {
37
+ deps: CreateInvoiceDeps;
38
+ trustProxy?: boolean;
39
+ }
30
40
  /**
31
41
  * Returns an Express `RequestHandler` that creates a new Lightning invoice.
32
42
  *
33
43
  * Assumes `express.json()` middleware is already mounted. Delegates to the
34
44
  * core `handleCreateInvoice` and returns the result.
45
+ *
46
+ * Accepts either a bare `CreateInvoiceDeps` object (backwards-compatible) or
47
+ * a `CreateInvoiceHandlerConfig` for IP-aware rate limiting.
35
48
  */
36
- export declare function createExpressCreateInvoiceHandler(deps: CreateInvoiceDeps): RequestHandler;
49
+ export declare function createExpressCreateInvoiceHandler(depsOrConfig: CreateInvoiceDeps | CreateInvoiceHandlerConfig): RequestHandler;
37
50
  /**
38
51
  * Returns an Express `RequestHandler` that pays a Lightning invoice via NWC.
39
52
  *
@@ -1 +1 @@
1
- {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/adapters/express.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmC,cAAc,EAAE,MAAM,SAAS,CAAA;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAIlE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAW9D;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AA6CD,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,eAAe,GAAG,uBAAuB,EACzD,WAAW,CAAC,EAAE,MAAM,GACnB,cAAc,CA0GhB;AAID;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,iBAAiB,GACtB,cAAc,CA4ChB;AAID;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,iBAAiB,GACtB,cAAc,CAqBhB;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAUxE;AAID;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAY/E"}
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/adapters/express.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA0B,cAAc,EAAE,MAAM,SAAS,CAAA;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAIlE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAW9D;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;CACvC;AA6CD,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,eAAe,GAAG,uBAAuB,EACzD,WAAW,CAAC,EAAE,MAAM,GACnB,cAAc,CAwIhB;AAID;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,iBAAiB,GACtB,cAAc,CA6ChB;AAID,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,iBAAiB,CAAA;IACvB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,iBAAiB,GAAG,0BAA0B,GAC3D,cAAc,CAkChB;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAUxE;AAID;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAY/E"}
@@ -49,16 +49,18 @@ export function createExpressMiddleware(engineOrConfig, upstreamArg) {
49
49
  const extraHeaders = config.responseHeaders ?? {};
50
50
  const upstreamTimeout = config.upstreamTimeout ?? 30_000;
51
51
  return async (req, res, _next) => {
52
- const ip = config.trustProxy
53
- ? (typeof req.headers['x-forwarded-for'] === 'string'
54
- ? req.headers['x-forwarded-for'].split(',')[0]?.trim()
55
- : undefined) ??
56
- (typeof req.headers['x-real-ip'] === 'string'
57
- ? req.headers['x-real-ip'].trim()
52
+ const ip = config.getClientIp
53
+ ? config.getClientIp(req)
54
+ : config.trustProxy
55
+ ? (typeof req.headers['x-forwarded-for'] === 'string'
56
+ ? req.headers['x-forwarded-for'].split(',')[0]?.trim()
58
57
  : undefined) ??
59
- req.socket.remoteAddress ??
60
- '127.0.0.1'
61
- : req.socket.remoteAddress ?? '127.0.0.1';
58
+ (typeof req.headers['x-real-ip'] === 'string'
59
+ ? req.headers['x-real-ip'].trim()
60
+ : undefined) ??
61
+ req.socket.remoteAddress ??
62
+ '127.0.0.1'
63
+ : req.socket.remoteAddress ?? '127.0.0.1';
62
64
  const headers = {};
63
65
  for (const [key, value] of Object.entries(req.headers)) {
64
66
  headers[key] = Array.isArray(value) ? value.join(', ') : value;
@@ -111,6 +113,23 @@ export function createExpressMiddleware(engineOrConfig, upstreamArg) {
111
113
  res.setHeader(key, value);
112
114
  }
113
115
  const buf = Buffer.from(await upstream_res.arrayBuffer());
116
+ // Reconcile estimated cost against actual cost reported by the upstream.
117
+ // Only applies to L402-authenticated requests (result has paymentHash).
118
+ if (result.action === 'proxy' && result.paymentHash) {
119
+ const tollCostHeader = upstream_res.headers.get('x-toll-cost');
120
+ if (tollCostHeader !== null && /^\d+$/.test(tollCostHeader)) {
121
+ const actualCost = parseInt(tollCostHeader, 10);
122
+ if (Number.isSafeInteger(actualCost) && actualCost >= 0) {
123
+ const reconciled = engine.reconcile(result.paymentHash, actualCost);
124
+ if (reconciled.adjusted) {
125
+ res.setHeader('X-Credit-Balance', String(reconciled.newBalance));
126
+ }
127
+ }
128
+ else {
129
+ console.warn('[toll-booth] Invalid X-Toll-Cost value:', tollCostHeader?.slice(0, 32));
130
+ }
131
+ }
132
+ }
114
133
  res.status(upstream_res.status).send(buf);
115
134
  return;
116
135
  }
@@ -124,8 +143,21 @@ export function createExpressMiddleware(engineOrConfig, upstreamArg) {
124
143
  }
125
144
  jsonWithSensitiveHeaders(res, result.body, 402, challengeHeaders);
126
145
  }
127
- catch {
128
- res.status(502).json({ error: 'Upstream routing engine unavailable' });
146
+ catch (err) {
147
+ // Distinguish upstream network errors from programming errors
148
+ if (err instanceof TypeError && (err.message.includes('fetch') || err.message.includes('network'))) {
149
+ res.status(502).json({ error: 'Upstream unavailable' });
150
+ }
151
+ else if (err instanceof DOMException && err.name === 'TimeoutError') {
152
+ res.status(504).json({ error: 'Upstream timeout' });
153
+ }
154
+ else if (err instanceof DOMException && err.name === 'AbortError') {
155
+ res.status(504).json({ error: 'Upstream request aborted' });
156
+ }
157
+ else {
158
+ console.error('[toll-booth] Unexpected error in middleware:', err instanceof Error ? err.message : err);
159
+ res.status(502).json({ error: 'Upstream unavailable' });
160
+ }
129
161
  }
130
162
  };
131
163
  }
@@ -146,7 +178,8 @@ export function createExpressInvoiceStatusHandler(deps) {
146
178
  res.status(400).json({ error: 'Invalid payment hash' });
147
179
  return;
148
180
  }
149
- const statusToken = typeof req.query.token === 'string' ? req.query.token : undefined;
181
+ const rawToken = typeof req.query.token === 'string' ? req.query.token : undefined;
182
+ const statusToken = rawToken && rawToken.length <= 128 ? rawToken : undefined;
150
183
  const accept = req.headers.accept ?? '';
151
184
  try {
152
185
  if (accept.includes('text/html')) {
@@ -166,19 +199,32 @@ export function createExpressInvoiceStatusHandler(deps) {
166
199
  }
167
200
  };
168
201
  }
169
- // -- Create invoice handler ---------------------------------------------------
170
202
  /**
171
203
  * Returns an Express `RequestHandler` that creates a new Lightning invoice.
172
204
  *
173
205
  * Assumes `express.json()` middleware is already mounted. Delegates to the
174
206
  * core `handleCreateInvoice` and returns the result.
207
+ *
208
+ * Accepts either a bare `CreateInvoiceDeps` object (backwards-compatible) or
209
+ * a `CreateInvoiceHandlerConfig` for IP-aware rate limiting.
175
210
  */
176
- export function createExpressCreateInvoiceHandler(deps) {
211
+ export function createExpressCreateInvoiceHandler(depsOrConfig) {
212
+ const config = 'deps' in depsOrConfig ? depsOrConfig : { deps: depsOrConfig };
213
+ const deps = config.deps;
177
214
  return async (req, res, _next) => {
178
215
  const body = req.body ?? {};
179
- const result = await handleCreateInvoice(deps, body);
216
+ const ip = config.trustProxy
217
+ ? (typeof req.headers['x-forwarded-for'] === 'string'
218
+ ? req.headers['x-forwarded-for'].split(',')[0]?.trim()
219
+ : undefined) ??
220
+ (typeof req.headers['x-real-ip'] === 'string'
221
+ ? req.headers['x-real-ip'].trim()
222
+ : undefined) ??
223
+ req.socket.remoteAddress ?? '127.0.0.1'
224
+ : req.socket.remoteAddress ?? '127.0.0.1';
225
+ const result = await handleCreateInvoice(deps, { ...body, clientIp: ip });
180
226
  if (!result.success) {
181
- jsonWithSensitiveHeaders(res, { error: result.error, tiers: result.tiers }, 400);
227
+ jsonWithSensitiveHeaders(res, { error: result.error, tiers: result.tiers }, result.status ?? 400);
182
228
  return;
183
229
  }
184
230
  const d = result.data;
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/adapters/express.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/adapters/express.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAA;AAyB3B,SAAS,mBAAmB,CAAC,GAAa,EAAE,OAAiB;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAA;IAC7D,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,GAAa,EACb,IAAa,EACb,MAAM,GAAG,GAAG,EACZ,OAAiB;IAEjB,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACjC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,SAAS,wBAAwB,CAC/B,GAAa,EACb,IAAY,EACZ,MAAM,GAAG,GAAG,EACZ,OAAiB;IAEjB,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACjC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC5C,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAoB,EAAE,WAAmB;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClD,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAA;IACrB,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QACpD,CAAC,CAAC,QAAQ,CAAC,QAAQ;QACnB,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAA;IAE3B,QAAQ,CAAC,QAAQ,GAAG,GAAG,YAAY,GAAG,YAAY,EAAE,IAAI,GAAG,CAAA;IAC3D,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;IACjC,OAAO,QAAQ,CAAC,IAAI,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,cAAyD,EACzD,WAAoB;IAEpB,kEAAkE;IAClE,MAAM,MAAM,GAA4B,OAAO,WAAW,KAAK,QAAQ;QACrE,CAAC,CAAC,EAAE,MAAM,EAAE,cAAiC,EAAE,QAAQ,EAAE,WAAW,EAAE;QACtE,CAAC,CAAC,cAAyC,CAAA;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAE5B,wEAAwE;IACxE,mEAAmE;IACnE,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CACX,gFAAgF;YAChF,+DAA+D;YAC/D,yDAAyD,CAC1D,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAA;IACjD,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,MAAM,CAAA;IAExD,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB,EAAE,EAAE;QAChE,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW;YAC3B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;YACzB,CAAC,CAAC,MAAM,CAAC,UAAU;gBACjB,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,QAAQ;oBACjD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;oBACtD,CAAC,CAAC,SAAS,CAAC;oBACd,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,QAAQ;wBAC3C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE;wBACjC,CAAC,CAAC,SAAS,CAAC;oBACd,GAAG,CAAC,MAAM,CAAC,aAAa;oBACxB,WAAW;gBACb,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,WAAW,CAAA;QAE7C,MAAM,OAAO,GAAuC,EAAE,CAAA;QACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAChE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAA;YAEnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;gBACjC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,QAAQ;gBACd,OAAO;gBACP,EAAE;aACH,CAAC,CAAA;YAEF,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC1D,oBAAoB;gBACpB,MAAM,MAAM,GAAG,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;gBACjE,MAAM,eAAe,GAAG,IAAI,OAAO,EAAE,CAAA;gBACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvD,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;oBACzD,IAAI,CAAC;wBAAE,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;gBACpC,CAAC;gBACD,MAAM,UAAU,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAA;gBAE5D,MAAM,IAAI,GAAsC;oBAC9C,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,OAAO,EAAE,UAAU;oBACnB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;oBAC5C,MAAM,EAAE,MAAM;iBACf,CAAA;gBAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAClD,uEAAuE;oBACvE,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACpH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;wBACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;wBAChB,UAAU,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;oBACtE,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,IAAI,GAAG,GAAgC,CAAA;oBAC9C,CAAC;gBACH,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,IAAmB,CAAC,CAAA;gBAC7D,MAAM,eAAe,GAAG,yBAAyB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;gBACvE,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;oBACrC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;gBAC3B,CAAC,CAAC,CAAA;gBACF,uCAAuC;gBACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;gBAC3B,CAAC;gBACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;oBACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;gBAC3B,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC,CAAA;gBAEzD,yEAAyE;gBACzE,wEAAwE;gBACxE,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACpD,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;oBAC9D,IAAI,cAAc,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;wBAC5D,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;wBAC/C,IAAI,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;4BACxD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;4BACnE,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gCACxB,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;4BAClE,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;wBACvF,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACzC,OAAM;YACR,CAAC;YAED,mBAAmB;YACnB,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAAE,CAAA;YACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAClC,CAAC;YACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;gBACxD,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAClC,CAAC;YACD,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAA;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,8DAA8D;YAC9D,IAAI,GAAG,YAAY,SAAS,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;gBACnG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAA;YACzD,CAAC;iBAAM,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACtE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAA;YACrD,CAAC;iBAAM,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAA;YAC7D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gBACvG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAA;YACzD,CAAC;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,iCAAiC,CAC/C,IAAuB;IAEvB,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB,EAAE,EAAE;QAChE,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;YACvD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;YAC3B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAA;QAC1B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAA;YACvD,OAAM;QACR,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;QAClF,MAAM,WAAW,GAAG,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAA;QAEvC,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;gBACtF,wBAAwB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAA;gBAChF,OAAM;YACR,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;YACxE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,wBAAwB,CACtB,GAAG,EACH,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAC9B,GAAG,EACH,UAAU,CAAC,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,CACpC,CAAA;gBACD,OAAM;YACR,CAAC;YACD,wBAAwB,CACtB,GAAG,EACH,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,EAClF,GAAG,EACH,UAAU,CAAC,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,CACpC,CAAA;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB,CACtB,GAAG,EACH,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAC3C,GAAG,EACH,UAAU,CAAC,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,CACpC,CAAA;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AASD;;;;;;;;GAQG;AACH,MAAM,UAAU,iCAAiC,CAC/C,YAA4D;IAE5D,MAAM,MAAM,GAAG,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IAExB,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB,EAAE,EAAE;QAChE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU;YAC1B,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,QAAQ;gBACjD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;gBACtD,CAAC,CAAC,SAAS,CAAC;gBACd,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,QAAQ;oBAC3C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE;oBACjC,CAAC,CAAC,SAAS,CAAC;gBACd,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,WAAW;YACzC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,WAAW,CAAA;QAE3C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAEzE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,wBAAwB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAA;YACjG,OAAM;QACR,CAAC;QAED,MAAM,CAAC,GAAG,MAAM,CAAC,IAAK,CAAA;QACtB,wBAAwB,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,KAAK;SAChB,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAgB;IACtD,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB,EAAE,EAAE;QAChE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC7C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,wBAAwB,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC9D,CAAC;aAAM,CAAC;YACN,wBAAwB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QACvE,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAqB;IAC7D,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB,EAAE,EAAE;QAChE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAClD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,wBAAwB,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QAChG,CAAC;aAAM,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YAC7B,wBAAwB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,CAAA;QAChG,CAAC;aAAM,CAAC;YACN,wBAAwB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QACvE,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { Hono } from 'hono';
2
+ import type { Context, MiddlewareHandler } from 'hono';
3
+ import type { TollBoothEngine } from '../core/toll-booth.js';
4
+ import type { LightningBackend, CreditTier } from '../types.js';
5
+ import type { StorageBackend } from '../storage/interface.js';
6
+ import type { NwcPayDeps } from '../core/nwc-pay.js';
7
+ import type { CashuRedeemDeps } from '../core/cashu-redeem.js';
8
+ /**
9
+ * Hono context variables set by the toll-booth auth middleware.
10
+ *
11
+ * Consumers should declare `Hono<TollBoothEnv>` to get typed access
12
+ * to these variables via `c.get()`.
13
+ */
14
+ export type TollBoothEnv = {
15
+ Variables: {
16
+ tollBoothAction: 'proxy' | 'pass';
17
+ tollBoothPaymentHash: string | undefined;
18
+ tollBoothEstimatedCost: number | undefined;
19
+ tollBoothCreditBalance: number | undefined;
20
+ tollBoothFreeRemaining: number | undefined;
21
+ };
22
+ };
23
+ export interface HonoTollBoothConfig {
24
+ engine: TollBoothEngine;
25
+ /**
26
+ * Custom callback to extract client IP from the Hono context.
27
+ * Use this for platform-specific IP resolution (e.g. Cloudflare's
28
+ * `CF-Connecting-IP`, or `X-Real-IP` behind a trusted reverse proxy).
29
+ * Falls back to `X-Forwarded-For` header if not provided.
30
+ */
31
+ getClientIp?: (c: Context) => string;
32
+ }
33
+ export interface PaymentAppConfig {
34
+ storage: StorageBackend;
35
+ rootKey: string;
36
+ tiers: CreditTier[];
37
+ defaultAmount: number;
38
+ backend?: LightningBackend;
39
+ maxPendingPerIp?: number;
40
+ nwcPay?: NwcPayDeps['nwcPay'];
41
+ cashuRedeem?: CashuRedeemDeps['redeem'];
42
+ getClientIp?: (c: Context) => string;
43
+ }
44
+ export interface HonoTollBooth {
45
+ authMiddleware: MiddlewareHandler<TollBoothEnv>;
46
+ engine: TollBoothEngine;
47
+ createPaymentApp: (paymentConfig: PaymentAppConfig) => Hono;
48
+ }
49
+ /**
50
+ * Creates a Hono middleware that enforces L402 payment gating.
51
+ *
52
+ * On `challenge` results a 402 response is returned with invoice details.
53
+ * On `pass` or `proxy` results, context variables are set and the next
54
+ * handler is called:
55
+ * - `tollBoothAction`: `'proxy'` or `'pass'`
56
+ * - `tollBoothPaymentHash`: payment hash (proxy only)
57
+ * - `tollBoothEstimatedCost`: estimated cost in credits (proxy only)
58
+ * - `tollBoothCreditBalance`: remaining balance (proxy only)
59
+ * - `tollBoothFreeRemaining`: remaining free-tier requests (proxy only)
60
+ */
61
+ export declare function createHonoTollBooth(config: HonoTollBoothConfig): HonoTollBooth;
62
+ //# sourceMappingURL=hono.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/adapters/hono.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAG5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAM7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAyB9D;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE;QACT,eAAe,EAAE,OAAO,GAAG,MAAM,CAAA;QACjC,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAA;QACxC,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1C,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1C,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAA;KAC3C,CAAA;CACF,CAAA;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAA;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,cAAc,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC7B,WAAW,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACvC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAC/C,MAAM,EAAE,eAAe,CAAA;IACvB,gBAAgB,EAAE,CAAC,aAAa,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAC5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAqL9E"}