@obbyx/sdk 0.1.1 → 0.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.
- package/README.md +14 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/seller/consumed-proofs.d.ts.map +1 -1
- package/dist/seller/consumed-proofs.js +8 -15
- package/dist/seller/consumed-proofs.js.map +1 -1
- package/dist/seller/cors.d.ts +33 -0
- package/dist/seller/cors.d.ts.map +1 -0
- package/dist/seller/cors.js +77 -0
- package/dist/seller/cors.js.map +1 -0
- package/dist/seller/paywall.d.ts +12 -0
- package/dist/seller/paywall.d.ts.map +1 -1
- package/dist/seller/paywall.js +12 -2
- package/dist/seller/paywall.js.map +1 -1
- package/dist/seller/x402-server.d.ts +48 -8
- package/dist/seller/x402-server.d.ts.map +1 -1
- package/dist/seller/x402-server.js +63 -22
- package/dist/seller/x402-server.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +10 -1
- package/src/seller/consumed-proofs.ts +10 -16
- package/src/seller/cors.ts +106 -0
- package/src/seller/paywall.ts +23 -3
- package/src/seller/x402-server.ts +101 -29
package/README.md
CHANGED
|
@@ -65,6 +65,20 @@ app.use(
|
|
|
65
65
|
);
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
+
Channel payments: register `ObyteBatchServer` the same way, with
|
|
69
|
+
`minChannelTimeoutSeconds` equal to the facilitator's
|
|
70
|
+
`MIN_CHANNEL_TIMEOUT_SECONDS`, and accept `scheme: 'batch-settlement'`.
|
|
71
|
+
|
|
72
|
+
## Browser clients (CORS)
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
const paywall = new ObytePaywall({ ...options, cors: { origins: ['https://app.example'] } });
|
|
76
|
+
app.use(paywall.preflight()); // answers OPTIONS without payment
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The 402 then carries `Access-Control-Allow-Origin` and exposes
|
|
80
|
+
`PAYMENT-REQUIRED` / `PAYMENT-RESPONSE`; preflights allow `PAYMENT-SIGNATURE`.
|
|
81
|
+
|
|
68
82
|
## Buy: `payingFetch` with budgets
|
|
69
83
|
|
|
70
84
|
```ts
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,6 @@ export { ConsumedProofsStore, type ProofRecord, type ProofState, type StoredResp
|
|
|
3
3
|
export { ObytePaywall, type ObytePaywallOptions, type PaidHandler, type PaidResult, type PaidRouteOptions, type PaywallScheme, type RoutePrice, } from './seller/paywall.js';
|
|
4
4
|
export { type PaidResponse, PaymentPendingError, type PayingFetchOptions, payingFetch, } from './client/paying-fetch.js';
|
|
5
5
|
export { type BudgetLimits, BudgetExceededError, type BudgetReservation, SpendingBudget, } from './client/budget.js';
|
|
6
|
-
export { ObyteExactServer, type ObyteExactServerOptions } from './seller/x402-server.js';
|
|
6
|
+
export { ObyteBatchServer, type ObyteBatchServerOptions, ObyteExactServer, type ObyteExactServerOptions, ObyteSchemeServer, type ObyteSchemeSpec, type ObyteSchemeServerOptions, } from './seller/x402-server.js';
|
|
7
|
+
export type { PaywallCorsOptions } from './seller/cors.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,aAAa,EACb,cAAc,EACd,UAAU,EACV,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,YAAY,EACjB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,YAAY,EACjB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,aAAa,EACb,cAAc,EACd,UAAU,EACV,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,YAAY,EACjB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,YAAY,EACjB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,wBAAwB,GAC9B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,5 +3,5 @@ export { ConsumedProofsStore, } from './seller/consumed-proofs.js';
|
|
|
3
3
|
export { ObytePaywall, } from './seller/paywall.js';
|
|
4
4
|
export { PaymentPendingError, payingFetch, } from './client/paying-fetch.js';
|
|
5
5
|
export { BudgetExceededError, SpendingBudget, } from './client/budget.js';
|
|
6
|
-
export { ObyteExactServer } from './seller/x402-server.js';
|
|
6
|
+
export { ObyteBatchServer, ObyteExactServer, ObyteSchemeServer, } from './seller/x402-server.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,cAAc,EACd,UAAU,EACV,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,GAIpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,YAAY,GAOb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,mBAAmB,EAEnB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,mBAAmB,EAEnB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,cAAc,EACd,UAAU,EACV,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,GAIpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,YAAY,GAOb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,mBAAmB,EAEnB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,mBAAmB,EAEnB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAEhB,gBAAgB,EAEhB,iBAAiB,GAGlB,MAAM,yBAAyB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumed-proofs.d.ts","sourceRoot":"","sources":["../../src/seller/consumed-proofs.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,iBAAiB,GACjB,SAAS,GACT,QAAQ,GACR,QAAQ;AACV,kFAAkF;GAChF,iBAAiB,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAaD,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;gBAGhC,IAAI,EAAE,MAAM,EACK,GAAG,GAAE,MAAM,MAA4C;IA2B1E;;;OAGG;IACH,aAAa,CACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAmB9D,wFAAwF;IACxF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAO7E,KAAK,IAAI,IAAI;IAIb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAMzC,mFAAmF;IACnF,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE;IAa9E,oEAAoE;IACpE,UAAU,CACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,UAAU,EACd,KAAK,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAO,GAClE,OAAO;IAwBV;;;;OAIG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,UAAU;
|
|
1
|
+
{"version":3,"file":"consumed-proofs.d.ts","sourceRoot":"","sources":["../../src/seller/consumed-proofs.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,iBAAiB,GACjB,SAAS,GACT,QAAQ,GACR,QAAQ;AACV,kFAAkF;GAChF,iBAAiB,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAaD,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;gBAGhC,IAAI,EAAE,MAAM,EACK,GAAG,GAAE,MAAM,MAA4C;IA2B1E;;;OAGG;IACH,aAAa,CACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAmB9D,wFAAwF;IACxF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAO7E,KAAK,IAAI,IAAI;IAIb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAMzC,mFAAmF;IACnF,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE;IAa9E,oEAAoE;IACpE,UAAU,CACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,UAAU,EACd,KAAK,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAO,GAClE,OAAO;IAwBV;;;;OAIG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,UAAU;IAiB9E;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAYxD,sFAAsF;IACtF,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;CAG7C"}
|
|
@@ -91,21 +91,14 @@ export class ConsumedProofsStore {
|
|
|
91
91
|
*/
|
|
92
92
|
markSettled(key, binding, paymentResponse) {
|
|
93
93
|
const ts = this.now();
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
.run(key, binding, paymentResponse, ts, ts);
|
|
103
|
-
this.db.exec('COMMIT');
|
|
104
|
-
}
|
|
105
|
-
catch (err) {
|
|
106
|
-
this.db.exec('ROLLBACK');
|
|
107
|
-
throw err;
|
|
108
|
-
}
|
|
94
|
+
// One UPSERT statement: atomic on its own.
|
|
95
|
+
this.db
|
|
96
|
+
.prepare(`INSERT INTO consumed_proofs (key, binding, state, payment_response, created_at, updated_at)
|
|
97
|
+
VALUES (?, ?, 'paid_not_served', ?, ?, ?)
|
|
98
|
+
ON CONFLICT(key) DO UPDATE SET state = 'paid_not_served', payment_response = excluded.payment_response,
|
|
99
|
+
updated_at = excluded.updated_at
|
|
100
|
+
WHERE consumed_proofs.state = 'settling'`)
|
|
101
|
+
.run(key, binding, paymentResponse, ts, ts);
|
|
109
102
|
const record = this.get(key);
|
|
110
103
|
if (record === undefined)
|
|
111
104
|
throw new Error(`consumed proof ${key} vanished`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumed-proofs.js","sourceRoot":"","sources":["../../src/seller/consumed-proofs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"consumed-proofs.js","sourceRoot":"","sources":["../../src/seller/consumed-proofs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Request, RequestHandler, Response } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* CORS for browser clients of a paid route (x402 `transports-v2/http.md`,
|
|
4
|
+
* "Browser clients"). None of the x402 headers is CORS-safelisted: without
|
|
5
|
+
* these headers a cross-origin page cannot read the price (402) or send the
|
|
6
|
+
* payment. CORS decides who may READ a response; it is not a payment control.
|
|
7
|
+
*/
|
|
8
|
+
export interface PaywallCorsOptions {
|
|
9
|
+
/** Allowed origins (exact `scheme://host[:port]`), or `'*'` for any. */
|
|
10
|
+
readonly origins: readonly string[] | '*';
|
|
11
|
+
/** Whether requests may carry credentials (cookies); origins are then reflected, never `*`. */
|
|
12
|
+
readonly credentials?: boolean;
|
|
13
|
+
/** Preflight cache lifetime (default 600 s). */
|
|
14
|
+
readonly maxAgeSeconds?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Response headers a browser client must read: the price and the settlement. */
|
|
17
|
+
export declare const EXPOSED_HEADERS: readonly ["PAYMENT-REQUIRED", "PAYMENT-RESPONSE"];
|
|
18
|
+
/** Request headers a browser client sends: the payment, and Content-Type for a JSON body. */
|
|
19
|
+
export declare const ALLOWED_HEADERS: readonly ["PAYMENT-SIGNATURE", "Content-Type"];
|
|
20
|
+
/** Merges header names into a comma-separated list, keeping existing ones (case-insensitive). */
|
|
21
|
+
export declare function mergeHeaderList(existing: string | number | readonly string[] | undefined, add: readonly string[]): string;
|
|
22
|
+
/** Always: lets a cross-origin page read the x402 headers (merged with any value already set). */
|
|
23
|
+
export declare function exposePaymentHeaders(res: Response): void;
|
|
24
|
+
/** Sets `Access-Control-Allow-Origin` for an allowed calling origin; false when not allowed. */
|
|
25
|
+
export declare function allowOrigin(req: Request, res: Response, cors: PaywallCorsOptions): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Answers the CORS preflight (`OPTIONS`) of paid routes without requiring
|
|
28
|
+
* payment. Allows the x402 request headers plus whatever else the browser
|
|
29
|
+
* announces: x402 client SDKs have added request headers of their own, and an
|
|
30
|
+
* allow list naming exactly the protocol headers would refuse their retry.
|
|
31
|
+
*/
|
|
32
|
+
export declare function preflightHandler(cors: PaywallCorsOptions): RequestHandler;
|
|
33
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/seller/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC;IAC1C,+FAA+F;IAC/F,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,gDAAgD;IAChD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,iFAAiF;AACjF,eAAO,MAAM,eAAe,mDAAoD,CAAC;AACjF,6FAA6F;AAC7F,eAAO,MAAM,eAAe,gDAAiD,CAAC;AAG9E,iGAAiG;AACjG,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,EACzD,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,MAAM,CAgBR;AAED,kGAAkG;AAClG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAKxD;AAED,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAc1F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CA6BzE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** Response headers a browser client must read: the price and the settlement. */
|
|
2
|
+
export const EXPOSED_HEADERS = ['PAYMENT-REQUIRED', 'PAYMENT-RESPONSE'];
|
|
3
|
+
/** Request headers a browser client sends: the payment, and Content-Type for a JSON body. */
|
|
4
|
+
export const ALLOWED_HEADERS = ['PAYMENT-SIGNATURE', 'Content-Type'];
|
|
5
|
+
const DEFAULT_MAX_AGE_SECONDS = 600;
|
|
6
|
+
/** Merges header names into a comma-separated list, keeping existing ones (case-insensitive). */
|
|
7
|
+
export function mergeHeaderList(existing, add) {
|
|
8
|
+
const current = existing === undefined
|
|
9
|
+
? []
|
|
10
|
+
: (Array.isArray(existing) ? existing.join(',') : String(existing))
|
|
11
|
+
.split(',')
|
|
12
|
+
.map((h) => h.trim())
|
|
13
|
+
.filter((h) => h.length > 0);
|
|
14
|
+
const seen = new Set(current.map((h) => h.toLowerCase()));
|
|
15
|
+
for (const h of add) {
|
|
16
|
+
if (!seen.has(h.toLowerCase())) {
|
|
17
|
+
current.push(h);
|
|
18
|
+
seen.add(h.toLowerCase());
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return current.join(', ');
|
|
22
|
+
}
|
|
23
|
+
/** Always: lets a cross-origin page read the x402 headers (merged with any value already set). */
|
|
24
|
+
export function exposePaymentHeaders(res) {
|
|
25
|
+
res.setHeader('Access-Control-Expose-Headers', mergeHeaderList(res.getHeader('Access-Control-Expose-Headers'), EXPOSED_HEADERS));
|
|
26
|
+
}
|
|
27
|
+
/** Sets `Access-Control-Allow-Origin` for an allowed calling origin; false when not allowed. */
|
|
28
|
+
export function allowOrigin(req, res, cors) {
|
|
29
|
+
const origin = req.get('origin');
|
|
30
|
+
if (origin === undefined)
|
|
31
|
+
return false;
|
|
32
|
+
const anyOrigin = cors.origins === '*';
|
|
33
|
+
if (!anyOrigin && !cors.origins.includes(origin))
|
|
34
|
+
return false;
|
|
35
|
+
if (anyOrigin && cors.credentials !== true) {
|
|
36
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// A reflected origin varies per request: shared caches must key on it.
|
|
40
|
+
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
41
|
+
res.setHeader('Vary', mergeHeaderList(res.getHeader('Vary'), ['Origin']));
|
|
42
|
+
}
|
|
43
|
+
if (cors.credentials === true)
|
|
44
|
+
res.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Answers the CORS preflight (`OPTIONS`) of paid routes without requiring
|
|
49
|
+
* payment. Allows the x402 request headers plus whatever else the browser
|
|
50
|
+
* announces: x402 client SDKs have added request headers of their own, and an
|
|
51
|
+
* allow list naming exactly the protocol headers would refuse their retry.
|
|
52
|
+
*/
|
|
53
|
+
export function preflightHandler(cors) {
|
|
54
|
+
return (req, res, next) => {
|
|
55
|
+
if (req.method !== 'OPTIONS' || req.get('access-control-request-method') === undefined) {
|
|
56
|
+
next();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!allowOrigin(req, res, cors)) {
|
|
60
|
+
res.status(204).end(); // no CORS headers: the browser refuses the call
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const requested = (req.get('access-control-request-headers') ?? '')
|
|
64
|
+
.split(',')
|
|
65
|
+
.map((h) => h.trim())
|
|
66
|
+
.filter((h) => h.length > 0);
|
|
67
|
+
res.setHeader('Access-Control-Allow-Headers', mergeHeaderList(undefined, [...ALLOWED_HEADERS, ...requested]));
|
|
68
|
+
res.setHeader('Access-Control-Allow-Methods', mergeHeaderList(undefined, [
|
|
69
|
+
req.get('access-control-request-method') ?? 'POST',
|
|
70
|
+
'GET',
|
|
71
|
+
'POST',
|
|
72
|
+
]));
|
|
73
|
+
res.setHeader('Access-Control-Max-Age', String(cors.maxAgeSeconds ?? DEFAULT_MAX_AGE_SECONDS));
|
|
74
|
+
res.status(204).end();
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/seller/cors.ts"],"names":[],"mappings":"AAiBA,iFAAiF;AACjF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,CAAU,CAAC;AACjF,6FAA6F;AAC7F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAU,CAAC;AAC9E,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,iGAAiG;AACjG,MAAM,UAAU,eAAe,CAC7B,QAAyD,EACzD,GAAsB;IAEtB,MAAM,OAAO,GACX,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aAC9D,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,oBAAoB,CAAC,GAAa;IAChD,GAAG,CAAC,SAAS,CACX,+BAA+B,EAC/B,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,+BAA+B,CAAC,EAAE,eAAe,CAAC,CACjF,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,WAAW,CAAC,GAAY,EAAE,GAAa,EAAE,IAAwB;IAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC;IACvC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC3C,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,uEAAuE;QACvE,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;QACrD,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;QAAE,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;IACzF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAwB;IACvD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,+BAA+B,CAAC,KAAK,SAAS,EAAE,CAAC;YACvF,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,gDAAgD;YACvE,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,gCAAgC,CAAC,IAAI,EAAE,CAAC;aAChE,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/B,GAAG,CAAC,SAAS,CACX,8BAA8B,EAC9B,eAAe,CAAC,SAAS,EAAE,CAAC,GAAG,eAAe,EAAE,GAAG,SAAS,CAAC,CAAC,CAC/D,CAAC;QACF,GAAG,CAAC,SAAS,CACX,8BAA8B,EAC9B,eAAe,CAAC,SAAS,EAAE;YACzB,GAAG,CAAC,GAAG,CAAC,+BAA+B,CAAC,IAAI,MAAM;YAClD,KAAK;YACL,MAAM;SACP,CAAC,CACH,CAAC;QACF,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,uBAAuB,CAAC,CAAC,CAAC;QAC/F,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/seller/paywall.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { type FacilitatorClient } from '@x402/core/http';
|
|
|
3
3
|
import { type Logger } from '@obbyx/obyte/logger';
|
|
4
4
|
import { BATCH_SCHEME, EXACT_SCHEME } from '@obbyx/x402-obyte';
|
|
5
5
|
import type { ConsumedProofsStore } from './consumed-proofs.js';
|
|
6
|
+
import { type PaywallCorsOptions } from './cors.js';
|
|
6
7
|
/**
|
|
7
8
|
* Express paywall for x402 `exact` payments on Obyte (seller side).
|
|
8
9
|
*
|
|
@@ -75,6 +76,12 @@ export interface ObytePaywallOptions {
|
|
|
75
76
|
readonly batch?: {
|
|
76
77
|
readonly minChannelTimeoutSeconds: number;
|
|
77
78
|
};
|
|
79
|
+
/**
|
|
80
|
+
* CORS for browser clients on another origin (x402 HTTP transport, "Browser
|
|
81
|
+
* clients"). Also mount {@link ObytePaywall.preflight} before the routes.
|
|
82
|
+
* Without it, same-origin pages and non-browser clients work as before.
|
|
83
|
+
*/
|
|
84
|
+
readonly cors?: PaywallCorsOptions;
|
|
78
85
|
readonly now?: () => number;
|
|
79
86
|
}
|
|
80
87
|
export declare class ObytePaywall {
|
|
@@ -82,6 +89,11 @@ export declare class ObytePaywall {
|
|
|
82
89
|
private readonly log;
|
|
83
90
|
private readonly now;
|
|
84
91
|
constructor(options: ObytePaywallOptions);
|
|
92
|
+
/**
|
|
93
|
+
* Answers CORS preflight requests (`app.use(paywall.preflight())`); a no-op
|
|
94
|
+
* without the `cors` option. Preflights never require payment.
|
|
95
|
+
*/
|
|
96
|
+
preflight(): RequestHandler;
|
|
85
97
|
/** Wraps a handler so it only runs after a settled payment. */
|
|
86
98
|
paid(route: PaidRouteOptions, handler: PaidHandler): RequestHandler;
|
|
87
99
|
private handle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paywall.d.ts","sourceRoot":"","sources":["../../src/seller/paywall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;AAC/E,OAAO,EACL,KAAK,iBAAiB,EAIvB,MAAM,iBAAiB,CAAC;AAezB,OAAO,EAAE,KAAK,MAAM,EAAgC,MAAM,qBAAqB,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,YAAY,EAIb,MAAM,mBAAmB,CAAC;AAgB3B,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"paywall.d.ts","sourceRoot":"","sources":["../../src/seller/paywall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;AAC/E,OAAO,EACL,KAAK,iBAAiB,EAIvB,MAAM,iBAAiB,CAAC;AAezB,OAAO,EAAE,KAAK,MAAM,EAAgC,MAAM,qBAAqB,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,YAAY,EAIb,MAAM,mBAAmB,CAAC;AAgB3B,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,sBAAsB,CAAC;AAChF,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,WAAW,CAAC;AAOnB;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAChD,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,eAAe,CAAC;CAC7C;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,YAAY,GAAG,OAAO,YAAY,CAAC;AAEtE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5D,gGAAgG;IAChG,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,qBAAa,YAAY;IAIX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEN,OAAO,EAAE,mBAAmB;IAczD;;;OAGG;IACH,SAAS,IAAI,cAAc;IAK3B,+DAA+D;IAC/D,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,cAAc;YAYrD,MAAM;IAoKpB,8EAA8E;YAChE,SAAS;YA+CT,YAAY;YAmCZ,KAAK;IAkCnB,OAAO,CAAC,IAAI;IAcZ,OAAO,CAAC,eAAe;IA4DvB,2FAA2F;IAC3F,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,UAAU;YAMJ,cAAc;CA0B7B"}
|
package/dist/seller/paywall.js
CHANGED
|
@@ -5,8 +5,8 @@ import { BATCH_SCHEME, EXACT_SCHEME, batchExtraSchema, canonical, exactExtraSche
|
|
|
5
5
|
import { bindingsEqual, sha256Hex } from './binding.js';
|
|
6
6
|
import { PAYMENT_IDENTIFIER, decidePaymentId, paymentIdOf, paymentIdentifierDeclaration, } from './payment-identifier.js';
|
|
7
7
|
import { bodyHashOf, newQuote, offerBinding, operationFingerprint, } from './quote.js';
|
|
8
|
+
import { allowOrigin, exposePaymentHeaders, preflightHandler, } from './cors.js';
|
|
8
9
|
import { DEFAULT_MAX_TIMEOUT_SECONDS, DEFAULT_QUOTE_TTL_SECONDS, DEFAULT_SERVING_LEASE_SECONDS, } from './defaults.js';
|
|
9
|
-
const EXPOSE = 'PAYMENT-REQUIRED, PAYMENT-RESPONSE';
|
|
10
10
|
export class ObytePaywall {
|
|
11
11
|
options;
|
|
12
12
|
log;
|
|
@@ -24,6 +24,14 @@ export class ObytePaywall {
|
|
|
24
24
|
this.log = moduleLogger(options.logger, 'sdk.paywall', { network: options.network });
|
|
25
25
|
this.now = options.now ?? (() => Math.floor(Date.now() / 1000));
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Answers CORS preflight requests (`app.use(paywall.preflight())`); a no-op
|
|
29
|
+
* without the `cors` option. Preflights never require payment.
|
|
30
|
+
*/
|
|
31
|
+
preflight() {
|
|
32
|
+
const cors = this.options.cors;
|
|
33
|
+
return cors === undefined ? (_req, _res, next) => next() : preflightHandler(cors);
|
|
34
|
+
}
|
|
27
35
|
/** Wraps a handler so it only runs after a settled payment. */
|
|
28
36
|
paid(route, handler) {
|
|
29
37
|
const asset = route.price.asset ?? 'base';
|
|
@@ -36,7 +44,9 @@ export class ObytePaywall {
|
|
|
36
44
|
};
|
|
37
45
|
}
|
|
38
46
|
async handle(req, res, route, price, handler) {
|
|
39
|
-
res
|
|
47
|
+
exposePaymentHeaders(res);
|
|
48
|
+
if (this.options.cors !== undefined)
|
|
49
|
+
allowOrigin(req, res, this.options.cors);
|
|
40
50
|
res.setHeader('Cache-Control', 'private, no-store');
|
|
41
51
|
const header = req.get('payment-signature');
|
|
42
52
|
if (header === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paywall.js","sourceRoot":"","sources":["../../src/seller/paywall.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paywall.js","sourceRoot":"","sources":["../../src/seller/paywall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { AssetAmount, Network, PaymentRequirements, Price, SchemeNetworkServer, SchemePaymentRequiredContext, SchemeServerHooks } from '@x402/core/types';
|
|
2
2
|
import { type Logger } from '@obbyx/obyte/logger';
|
|
3
|
+
import { BATCH_SCHEME, EXACT_SCHEME } from '@obbyx/x402-obyte';
|
|
3
4
|
import type { ConsumedProofsStore } from './consumed-proofs.js';
|
|
4
5
|
/**
|
|
5
|
-
* Obyte
|
|
6
|
-
* `@x402/express`, `@x402/hono`, …):
|
|
6
|
+
* Obyte schemes for the OFFICIAL x402 resource server (`@x402/core/server`,
|
|
7
|
+
* `@x402/express`, `@x402/hono`, …): SchemeNetworkServer implementations for
|
|
8
|
+
* `exact` ({@link ObyteExactServer}) and `batch-settlement`
|
|
9
|
+
* ({@link ObyteBatchServer}), sharing {@link ObyteSchemeServer}.
|
|
7
10
|
*
|
|
8
11
|
* - Binding (I1/I2): `enrichPaymentRequiredResponse` adds a per-request HMAC
|
|
9
12
|
* binding + quote to every offer. On a paid request it recomputes the HMAC
|
|
@@ -17,7 +20,7 @@ import type { ConsumedProofsStore } from './consumed-proofs.js';
|
|
|
17
20
|
* Unlike `@obbyx/sdk`'s ObytePaywall, a repeated request gets a 402 instead
|
|
18
21
|
* of the stored response (the official middleware cannot replay responses).
|
|
19
22
|
*/
|
|
20
|
-
export interface
|
|
23
|
+
export interface ObyteSchemeServerOptions {
|
|
21
24
|
/** How long a request may hold a payment in `serving` before a retry takes over (default 300 s). */
|
|
22
25
|
readonly servingLeaseSeconds?: number;
|
|
23
26
|
readonly sellerId: string;
|
|
@@ -28,9 +31,34 @@ export interface ObyteExactServerOptions {
|
|
|
28
31
|
readonly quoteTtlSeconds?: number;
|
|
29
32
|
readonly now?: () => number;
|
|
30
33
|
}
|
|
31
|
-
|
|
34
|
+
/** @deprecated Use {@link ObyteSchemeServerOptions}. */
|
|
35
|
+
export type ObyteExactServerOptions = ObyteSchemeServerOptions;
|
|
36
|
+
/** Options of {@link ObyteBatchServer}. */
|
|
37
|
+
export interface ObyteBatchServerOptions extends ObyteSchemeServerOptions {
|
|
38
|
+
/** Minimum channel dispute window the seller accepts (seconds); must match the facilitator's. */
|
|
39
|
+
readonly minChannelTimeoutSeconds: number;
|
|
40
|
+
}
|
|
41
|
+
/** Per-scheme parts of an Obyte resource-server scheme. */
|
|
42
|
+
export interface ObyteSchemeSpec {
|
|
43
|
+
readonly scheme: typeof EXACT_SCHEME | typeof BATCH_SCHEME;
|
|
44
|
+
/** `extra` fields the scheme adds to every offer besides binding and quote. */
|
|
45
|
+
readonly staticExtra: Record<string, unknown>;
|
|
46
|
+
/** Parses the quote fields of the accepted offer. */
|
|
47
|
+
readonly acceptedExtra: (extra: unknown) => {
|
|
48
|
+
readonly binding: string;
|
|
49
|
+
readonly quoteId: string;
|
|
50
|
+
readonly validUntil: number;
|
|
51
|
+
};
|
|
52
|
+
/** Proof id and key kind of a payment payload (undefined when malformed). */
|
|
53
|
+
readonly proofOf: (payload: Record<string, unknown>) => {
|
|
54
|
+
kind: string;
|
|
55
|
+
id: string;
|
|
56
|
+
} | undefined;
|
|
57
|
+
}
|
|
58
|
+
export declare abstract class ObyteSchemeServer implements SchemeNetworkServer {
|
|
32
59
|
private readonly options;
|
|
33
|
-
readonly
|
|
60
|
+
private readonly spec;
|
|
61
|
+
readonly scheme: string;
|
|
34
62
|
readonly defaultAssetTransferMethod = "default";
|
|
35
63
|
readonly paymentFlows: {
|
|
36
64
|
default: {
|
|
@@ -42,11 +70,11 @@ export declare class ObyteExactServer implements SchemeNetworkServer {
|
|
|
42
70
|
readonly schemeHooks: SchemeServerHooks;
|
|
43
71
|
private readonly log;
|
|
44
72
|
private readonly now;
|
|
45
|
-
constructor(options:
|
|
73
|
+
protected constructor(options: ObyteSchemeServerOptions, spec: ObyteSchemeSpec);
|
|
46
74
|
/** `{asset, amount}` in atomic units, or "20000 bytes" / "0.00002 GBYTE". */
|
|
47
75
|
parsePrice(price: Price, network: Network): Promise<AssetAmount>;
|
|
48
76
|
getAssetDecimals(asset: string): number | undefined;
|
|
49
|
-
/** Nothing to add from /supported
|
|
77
|
+
/** Nothing to add from /supported; the per-request fields come from the enrich hook. */
|
|
50
78
|
enhancePaymentRequirements(requirements: PaymentRequirements): Promise<PaymentRequirements>;
|
|
51
79
|
/** Adds (or, for a valid paid request, re-confirms) the per-request binding and quote. */
|
|
52
80
|
enrichPaymentRequiredResponse: (ctx: SchemePaymentRequiredContext) => Promise<PaymentRequirements[]>;
|
|
@@ -54,6 +82,18 @@ export declare class ObyteExactServer implements SchemeNetworkServer {
|
|
|
54
82
|
private bindingFor;
|
|
55
83
|
/** Proof key of the payment in a hook context (undefined when malformed). */
|
|
56
84
|
private keyOf;
|
|
57
|
-
|
|
85
|
+
}
|
|
86
|
+
/** `exact`: the proof is the unit (key `<network>:unit:<hash>`, as ObytePaywall). */
|
|
87
|
+
export declare class ObyteExactServer extends ObyteSchemeServer {
|
|
88
|
+
constructor(options: ObyteSchemeServerOptions);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `batch-settlement` (AA payment channels): the proof is the voucher (key
|
|
92
|
+
* `<network>:voucher:<sha256 of the canonical signed package>`, as
|
|
93
|
+
* ObytePaywall). Offers carry the channel base AA and the minimum dispute
|
|
94
|
+
* window. Needs a facilitator with batch-settlement and the seller's watcher.
|
|
95
|
+
*/
|
|
96
|
+
export declare class ObyteBatchServer extends ObyteSchemeServer {
|
|
97
|
+
constructor(options: ObyteBatchServerOptions);
|
|
58
98
|
}
|
|
59
99
|
//# sourceMappingURL=x402-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x402-server.d.ts","sourceRoot":"","sources":["../../src/seller/x402-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,OAAO,EACP,mBAAmB,EACnB,KAAK,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"x402-server.d.ts","sourceRoot":"","sources":["../../src/seller/x402-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { decodePaymentSignatureHeader } from '@x402/core/http';
|
|
2
|
-
import { ObbyxError, fromDisplay, getNetwork, isAssetId, networkKey, parseAmount, } from '@obbyx/obyte';
|
|
2
|
+
import { CHANNEL_BASE_AA, ObbyxError, fromDisplay, getNetwork, isAssetId, networkKey, parseAmount, } from '@obbyx/obyte';
|
|
3
3
|
import { moduleLogger } from '@obbyx/obyte/logger';
|
|
4
|
-
import { EXACT_SCHEME, bindingsEqual, exactExtraSchema } from '@obbyx/x402-obyte';
|
|
4
|
+
import { BATCH_SCHEME, EXACT_SCHEME, batchExtraSchema, bindingsEqual, canonical, exactExtraSchema, sha256Hex, } from '@obbyx/x402-obyte';
|
|
5
5
|
import { DEFAULT_QUOTE_TTL_SECONDS, DEFAULT_SERVING_LEASE_SECONDS } from './defaults.js';
|
|
6
6
|
import { bodyHashOf, newQuote, offerBinding } from './quote.js';
|
|
7
7
|
function requestOf(transportContext) {
|
|
@@ -17,9 +17,10 @@ function requestOf(transportContext) {
|
|
|
17
17
|
paymentHeader: typeof request?.['paymentHeader'] === 'string' ? request['paymentHeader'] : undefined,
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
export class
|
|
20
|
+
export class ObyteSchemeServer {
|
|
21
21
|
options;
|
|
22
|
-
|
|
22
|
+
spec;
|
|
23
|
+
scheme;
|
|
23
24
|
defaultAssetTransferMethod = 'default';
|
|
24
25
|
paymentFlows = {
|
|
25
26
|
default: { supported: ['upfront'], default: 'upfront' },
|
|
@@ -28,22 +29,24 @@ export class ObyteExactServer {
|
|
|
28
29
|
schemeHooks;
|
|
29
30
|
log;
|
|
30
31
|
now;
|
|
31
|
-
constructor(options) {
|
|
32
|
+
constructor(options, spec) {
|
|
32
33
|
this.options = options;
|
|
33
|
-
this.
|
|
34
|
+
this.spec = spec;
|
|
35
|
+
this.scheme = spec.scheme;
|
|
36
|
+
this.log = moduleLogger(options.logger, 'sdk.x402-server', { scheme: spec.scheme });
|
|
34
37
|
this.now = options.now ?? (() => Math.floor(Date.now() / 1000));
|
|
35
38
|
this.schemeHooks = {
|
|
36
39
|
onBeforeVerify: async (ctx) => {
|
|
37
|
-
const
|
|
40
|
+
const key = this.keyOf(ctx);
|
|
38
41
|
const binding = ctx.requirements.extra.binding;
|
|
39
|
-
if (
|
|
42
|
+
if (key === undefined || typeof binding !== 'string') {
|
|
40
43
|
return { abort: true, reason: 'invalid_payload' };
|
|
41
44
|
}
|
|
42
|
-
const { record } = this.options.proofs.begin(
|
|
45
|
+
const { record } = this.options.proofs.begin(key, binding);
|
|
43
46
|
if (!bindingsEqual(record.binding, binding))
|
|
44
47
|
return { abort: true, reason: 'invalid_payment_reused' };
|
|
45
48
|
if (record.state === 'served') {
|
|
46
|
-
this.log.warn({ proofId:
|
|
49
|
+
this.log.warn({ proofId: key }, 'payment already served a request; refused');
|
|
47
50
|
return { abort: true, reason: 'payment_already_used' };
|
|
48
51
|
}
|
|
49
52
|
return undefined;
|
|
@@ -121,7 +124,7 @@ export class ObyteExactServer {
|
|
|
121
124
|
getAssetDecimals(asset) {
|
|
122
125
|
return asset === 'base' ? 9 : undefined;
|
|
123
126
|
}
|
|
124
|
-
/** Nothing to add from /supported
|
|
127
|
+
/** Nothing to add from /supported; the per-request fields come from the enrich hook. */
|
|
125
128
|
async enhancePaymentRequirements(requirements) {
|
|
126
129
|
return requirements;
|
|
127
130
|
}
|
|
@@ -129,21 +132,22 @@ export class ObyteExactServer {
|
|
|
129
132
|
enrichPaymentRequiredResponse = async (ctx) => {
|
|
130
133
|
const request = requestOf(ctx.transportContext);
|
|
131
134
|
if (request === undefined)
|
|
132
|
-
throw new ObbyxError('no_request',
|
|
135
|
+
throw new ObbyxError('no_request', `Obyte ${this.scheme} needs the HTTP request context`);
|
|
133
136
|
const accepted = this.acceptedQuote(request);
|
|
134
137
|
return ctx.requirements.map((req) => {
|
|
135
|
-
if (req.scheme !==
|
|
138
|
+
if (req.scheme !== this.spec.scheme)
|
|
136
139
|
return req;
|
|
137
140
|
const quote = accepted !== undefined &&
|
|
138
141
|
bindingsEqual(this.bindingFor(req, request, accepted), accepted.binding)
|
|
139
142
|
? accepted
|
|
140
143
|
: undefined;
|
|
144
|
+
const extra = { ...req.extra, ...this.spec.staticExtra };
|
|
141
145
|
if (quote !== undefined)
|
|
142
|
-
return { ...req, extra: { ...
|
|
146
|
+
return { ...req, extra: { ...extra, ...quote } };
|
|
143
147
|
const fresh = newQuote(this.now(), this.options.quoteTtlSeconds ?? DEFAULT_QUOTE_TTL_SECONDS);
|
|
144
148
|
return {
|
|
145
149
|
...req,
|
|
146
|
-
extra: { ...
|
|
150
|
+
extra: { ...extra, binding: this.bindingFor(req, request, fresh), ...fresh },
|
|
147
151
|
};
|
|
148
152
|
});
|
|
149
153
|
};
|
|
@@ -151,23 +155,60 @@ export class ObyteExactServer {
|
|
|
151
155
|
if (request.paymentHeader === undefined)
|
|
152
156
|
return undefined;
|
|
153
157
|
try {
|
|
154
|
-
const
|
|
155
|
-
|
|
158
|
+
const accepted = decodePaymentSignatureHeader(request.paymentHeader).accepted;
|
|
159
|
+
if (accepted?.scheme !== this.spec.scheme)
|
|
160
|
+
return undefined;
|
|
161
|
+
const extra = this.spec.acceptedExtra(accepted.extra);
|
|
162
|
+
return { quoteId: extra.quoteId, validUntil: extra.validUntil, binding: extra.binding };
|
|
156
163
|
}
|
|
157
164
|
catch {
|
|
158
165
|
return undefined;
|
|
159
166
|
}
|
|
160
167
|
}
|
|
161
168
|
bindingFor(req, request, quote) {
|
|
162
|
-
return offerBinding(this.options,
|
|
169
|
+
return offerBinding(this.options, this.spec.scheme, quote, { method: request.method, url: request.url, bodyHash: bodyHashOf(request.body) }, { network: req.network, asset: req.asset, amount: req.amount, payTo: req.payTo });
|
|
163
170
|
}
|
|
164
171
|
/** Proof key of the payment in a hook context (undefined when malformed). */
|
|
165
172
|
keyOf(ctx) {
|
|
166
|
-
const
|
|
167
|
-
return
|
|
173
|
+
const proof = this.spec.proofOf(ctx.paymentPayload.payload);
|
|
174
|
+
return proof === undefined
|
|
175
|
+
? undefined
|
|
176
|
+
: networkKey(getNetwork(ctx.requirements.network), proof.kind, proof.id);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** `exact`: the proof is the unit (key `<network>:unit:<hash>`, as ObytePaywall). */
|
|
180
|
+
export class ObyteExactServer extends ObyteSchemeServer {
|
|
181
|
+
constructor(options) {
|
|
182
|
+
super(options, {
|
|
183
|
+
scheme: EXACT_SCHEME,
|
|
184
|
+
staticExtra: {},
|
|
185
|
+
acceptedExtra: (extra) => exactExtraSchema.parse(extra),
|
|
186
|
+
proofOf: (payload) => {
|
|
187
|
+
const unit = payload.unit?.unit;
|
|
188
|
+
return typeof unit === 'string' ? { kind: 'unit', id: unit } : undefined;
|
|
189
|
+
},
|
|
190
|
+
});
|
|
168
191
|
}
|
|
169
|
-
|
|
170
|
-
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* `batch-settlement` (AA payment channels): the proof is the voucher (key
|
|
195
|
+
* `<network>:voucher:<sha256 of the canonical signed package>`, as
|
|
196
|
+
* ObytePaywall). Offers carry the channel base AA and the minimum dispute
|
|
197
|
+
* window. Needs a facilitator with batch-settlement and the seller's watcher.
|
|
198
|
+
*/
|
|
199
|
+
export class ObyteBatchServer extends ObyteSchemeServer {
|
|
200
|
+
constructor(options) {
|
|
201
|
+
super(options, {
|
|
202
|
+
scheme: BATCH_SCHEME,
|
|
203
|
+
staticExtra: { baseAa: CHANNEL_BASE_AA, minTimeout: options.minChannelTimeoutSeconds },
|
|
204
|
+
acceptedExtra: (extra) => batchExtraSchema.parse(extra),
|
|
205
|
+
proofOf: (payload) => {
|
|
206
|
+
const pkg = payload['signedPackage'];
|
|
207
|
+
return pkg !== null && typeof pkg === 'object'
|
|
208
|
+
? { kind: 'voucher', id: sha256Hex(canonical(pkg)) }
|
|
209
|
+
: undefined;
|
|
210
|
+
},
|
|
211
|
+
});
|
|
171
212
|
}
|
|
172
213
|
}
|
|
173
214
|
//# sourceMappingURL=x402-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x402-server.js","sourceRoot":"","sources":["../../src/seller/x402-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAU/D,OAAO,EACL,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"x402-server.js","sourceRoot":"","sources":["../../src/seller/x402-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAU/D,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAc,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAuC5E,SAAS,SAAS,CAAC,gBAAyB;IAC1C,MAAM,OAAO,GAAI,gBAAsE,EAAE,OAAO,CAAC;IACjG,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC,SAAS,CACyC,CAAC;IAC7E,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC1D,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;QAC3B,GAAG,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM;QAC9B,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE;QACzB,aAAa,EACX,OAAO,OAAO,EAAE,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;KACxF,CAAC;AACJ,CAAC;AA0BD,MAAM,OAAgB,iBAAiB;IAYlB;IACA;IAZV,MAAM,CAAS;IACf,0BAA0B,GAAG,SAAS,CAAC;IACvC,YAAY,GAAG;QACtB,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,SAAS,CAAU,EAAE,OAAO,EAAE,SAAkB,EAAE;KAC1E,CAAC;IACO,kBAAkB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC1D,WAAW,CAAoB;IACvB,GAAG,CAAS;IACZ,GAAG,CAAe;IAEnC,YACmB,OAAiC,EACjC,IAAqB;QADrB,YAAO,GAAP,OAAO,CAA0B;QACjC,SAAI,GAAJ,IAAI,CAAiB;QAEtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,GAAG;YACjB,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM,OAAO,GAAI,GAAG,CAAC,YAAY,CAAC,KAA+B,CAAC,OAAO,CAAC;gBAC1E,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACrD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;gBACpD,CAAC;gBACD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC3D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;oBACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;gBAC3D,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,2CAA2C,CAAC,CAAC;oBAC7E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;gBACzD,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,0EAA0E;YAC1E,qEAAqE;YACrE,uEAAuE;YACvE,qEAAqE;YACrE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;gBACzE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBACnC,0EAA0E;gBAC1E,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,6BAA6B,CAAC,CAAC;gBAC5F,IACE,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,CAAC;oBAC7C,+EAA+E;oBAC/E,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,SAAS,CAAC,EACpD,CAAC;oBACD,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;gBAClD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,oDAAoD,CAAC,CAAC;gBAC/E,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,qBAAqB;iBAC5E,CAAC;YACJ,CAAC;YACD,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAO;gBAC9B,0EAA0E;gBAC1E,wDAAwD;gBACxD,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;oBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;;oBAC5E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAClE,CAAC;YACD,uEAAuE;YACvE,6EAA6E;YAC7E,yBAAyB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAO;gBAC9B,IAAI,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACjD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBAC7D,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EACtB,qDAAqD,CACtD,CAAC;YACJ,CAAC;YACD,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,GAAG,KAAK,SAAS;oBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACpF,CAAC;SACF,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,UAAU,CAAC,KAAY,EAAE,OAAgB;QAC7C,UAAU,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;gBACzB,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,iBAAiB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC9E,CAAC;QACD,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GACnB,gDAAgD,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7E,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,IAAI,UAAU,CAClB,eAAe,EACf,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IACtD,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1C,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,0BAA0B,CAC9B,YAAiC;QAEjC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,0FAA0F;IAC1F,6BAA6B,GAAG,KAAK,EACnC,GAAiC,EACD,EAAE;QAClC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,SAAS;YACvB,MAAM,IAAI,UAAU,CAAC,YAAY,EAAE,SAAS,IAAI,CAAC,MAAM,iCAAiC,CAAC,CAAC;QAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAClC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,GAAG,CAAC;YAChD,MAAM,KAAK,GACT,QAAQ,KAAK,SAAS;gBACtB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;gBACtE,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACzD,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;YAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,yBAAyB,CAAC,CAAC;YAC9F,OAAO;gBACL,GAAG,GAAG;gBACN,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE;aAC7E,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEM,aAAa,CAAC,OAAoB;QACxC,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,4BAA4B,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC;YAC9E,IAAI,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,GAAwB,EAAE,OAAoB,EAAE,KAAY;QAC7E,OAAO,YAAY,CACjB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,IAAI,CAAC,MAAM,EAChB,KAAK,EACL,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAChF,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CACjF,CAAC;IACJ,CAAC;IAED,6EAA6E;IACrE,KAAK,CAAC,GAGb;QACC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC5D,OAAO,KAAK,KAAK,SAAS;YACxB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,OAAO,gBAAiB,SAAQ,iBAAiB;IACrD,YAAY,OAAiC;QAC3C,KAAK,CAAC,OAAO,EAAE;YACb,MAAM,EAAE,YAAY;YACpB,WAAW,EAAE,EAAE;YACf,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YACvD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;gBACnB,MAAM,IAAI,GAAI,OAAyC,CAAC,IAAI,EAAE,IAAI,CAAC;gBACnE,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3E,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,gBAAiB,SAAQ,iBAAiB;IACrD,YAAY,OAAgC;QAC1C,KAAK,CAAC,OAAO,EAAE;YACb,MAAM,EAAE,YAAY;YACpB,WAAW,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,wBAAwB,EAAE;YACtF,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YACvD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;gBACnB,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;gBACrC,OAAO,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAC5C,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;oBACpD,CAAC,CAAC,SAAS,CAAC;YAChB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@obbyx/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Accept and make x402 payments on Obyte: Express paywall, adapter for the official @x402 servers, paying fetch with spending budgets",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"x402",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@obbyx/obyte": "^0.1.0",
|
|
47
|
-
"@obbyx/x402-obyte": "^0.2.
|
|
47
|
+
"@obbyx/x402-obyte": "^0.2.1",
|
|
48
48
|
"@x402/core": "^2.29.0",
|
|
49
49
|
"obyte": "0.2.1",
|
|
50
50
|
"zod": "^4.6.7"
|
package/src/index.ts
CHANGED
|
@@ -32,4 +32,13 @@ export {
|
|
|
32
32
|
type BudgetReservation,
|
|
33
33
|
SpendingBudget,
|
|
34
34
|
} from './client/budget.js';
|
|
35
|
-
export {
|
|
35
|
+
export {
|
|
36
|
+
ObyteBatchServer,
|
|
37
|
+
type ObyteBatchServerOptions,
|
|
38
|
+
ObyteExactServer,
|
|
39
|
+
type ObyteExactServerOptions,
|
|
40
|
+
ObyteSchemeServer,
|
|
41
|
+
type ObyteSchemeSpec,
|
|
42
|
+
type ObyteSchemeServerOptions,
|
|
43
|
+
} from './seller/x402-server.js';
|
|
44
|
+
export type { PaywallCorsOptions } from './seller/cors.js';
|
|
@@ -181,22 +181,16 @@ export class ConsumedProofsStore {
|
|
|
181
181
|
*/
|
|
182
182
|
markSettled(key: string, binding: string, paymentResponse: string): ProofState {
|
|
183
183
|
const ts = this.now();
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
.run(key, binding, paymentResponse, ts, ts);
|
|
195
|
-
this.db.exec('COMMIT');
|
|
196
|
-
} catch (err) {
|
|
197
|
-
this.db.exec('ROLLBACK');
|
|
198
|
-
throw err;
|
|
199
|
-
}
|
|
184
|
+
// One UPSERT statement: atomic on its own.
|
|
185
|
+
this.db
|
|
186
|
+
.prepare(
|
|
187
|
+
`INSERT INTO consumed_proofs (key, binding, state, payment_response, created_at, updated_at)
|
|
188
|
+
VALUES (?, ?, 'paid_not_served', ?, ?, ?)
|
|
189
|
+
ON CONFLICT(key) DO UPDATE SET state = 'paid_not_served', payment_response = excluded.payment_response,
|
|
190
|
+
updated_at = excluded.updated_at
|
|
191
|
+
WHERE consumed_proofs.state = 'settling'`,
|
|
192
|
+
)
|
|
193
|
+
.run(key, binding, paymentResponse, ts, ts);
|
|
200
194
|
const record = this.get(key);
|
|
201
195
|
if (record === undefined) throw new Error(`consumed proof ${key} vanished`);
|
|
202
196
|
return record.state;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { Request, RequestHandler, Response } from 'express';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CORS for browser clients of a paid route (x402 `transports-v2/http.md`,
|
|
5
|
+
* "Browser clients"). None of the x402 headers is CORS-safelisted: without
|
|
6
|
+
* these headers a cross-origin page cannot read the price (402) or send the
|
|
7
|
+
* payment. CORS decides who may READ a response; it is not a payment control.
|
|
8
|
+
*/
|
|
9
|
+
export interface PaywallCorsOptions {
|
|
10
|
+
/** Allowed origins (exact `scheme://host[:port]`), or `'*'` for any. */
|
|
11
|
+
readonly origins: readonly string[] | '*';
|
|
12
|
+
/** Whether requests may carry credentials (cookies); origins are then reflected, never `*`. */
|
|
13
|
+
readonly credentials?: boolean;
|
|
14
|
+
/** Preflight cache lifetime (default 600 s). */
|
|
15
|
+
readonly maxAgeSeconds?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Response headers a browser client must read: the price and the settlement. */
|
|
19
|
+
export const EXPOSED_HEADERS = ['PAYMENT-REQUIRED', 'PAYMENT-RESPONSE'] as const;
|
|
20
|
+
/** Request headers a browser client sends: the payment, and Content-Type for a JSON body. */
|
|
21
|
+
export const ALLOWED_HEADERS = ['PAYMENT-SIGNATURE', 'Content-Type'] as const;
|
|
22
|
+
const DEFAULT_MAX_AGE_SECONDS = 600;
|
|
23
|
+
|
|
24
|
+
/** Merges header names into a comma-separated list, keeping existing ones (case-insensitive). */
|
|
25
|
+
export function mergeHeaderList(
|
|
26
|
+
existing: string | number | readonly string[] | undefined,
|
|
27
|
+
add: readonly string[],
|
|
28
|
+
): string {
|
|
29
|
+
const current =
|
|
30
|
+
existing === undefined
|
|
31
|
+
? []
|
|
32
|
+
: (Array.isArray(existing) ? existing.join(',') : String(existing))
|
|
33
|
+
.split(',')
|
|
34
|
+
.map((h) => h.trim())
|
|
35
|
+
.filter((h) => h.length > 0);
|
|
36
|
+
const seen = new Set(current.map((h) => h.toLowerCase()));
|
|
37
|
+
for (const h of add) {
|
|
38
|
+
if (!seen.has(h.toLowerCase())) {
|
|
39
|
+
current.push(h);
|
|
40
|
+
seen.add(h.toLowerCase());
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return current.join(', ');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Always: lets a cross-origin page read the x402 headers (merged with any value already set). */
|
|
47
|
+
export function exposePaymentHeaders(res: Response): void {
|
|
48
|
+
res.setHeader(
|
|
49
|
+
'Access-Control-Expose-Headers',
|
|
50
|
+
mergeHeaderList(res.getHeader('Access-Control-Expose-Headers'), EXPOSED_HEADERS),
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Sets `Access-Control-Allow-Origin` for an allowed calling origin; false when not allowed. */
|
|
55
|
+
export function allowOrigin(req: Request, res: Response, cors: PaywallCorsOptions): boolean {
|
|
56
|
+
const origin = req.get('origin');
|
|
57
|
+
if (origin === undefined) return false;
|
|
58
|
+
const anyOrigin = cors.origins === '*';
|
|
59
|
+
if (!anyOrigin && !cors.origins.includes(origin)) return false;
|
|
60
|
+
if (anyOrigin && cors.credentials !== true) {
|
|
61
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
62
|
+
} else {
|
|
63
|
+
// A reflected origin varies per request: shared caches must key on it.
|
|
64
|
+
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
65
|
+
res.setHeader('Vary', mergeHeaderList(res.getHeader('Vary'), ['Origin']));
|
|
66
|
+
}
|
|
67
|
+
if (cors.credentials === true) res.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Answers the CORS preflight (`OPTIONS`) of paid routes without requiring
|
|
73
|
+
* payment. Allows the x402 request headers plus whatever else the browser
|
|
74
|
+
* announces: x402 client SDKs have added request headers of their own, and an
|
|
75
|
+
* allow list naming exactly the protocol headers would refuse their retry.
|
|
76
|
+
*/
|
|
77
|
+
export function preflightHandler(cors: PaywallCorsOptions): RequestHandler {
|
|
78
|
+
return (req, res, next) => {
|
|
79
|
+
if (req.method !== 'OPTIONS' || req.get('access-control-request-method') === undefined) {
|
|
80
|
+
next();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!allowOrigin(req, res, cors)) {
|
|
84
|
+
res.status(204).end(); // no CORS headers: the browser refuses the call
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const requested = (req.get('access-control-request-headers') ?? '')
|
|
88
|
+
.split(',')
|
|
89
|
+
.map((h) => h.trim())
|
|
90
|
+
.filter((h) => h.length > 0);
|
|
91
|
+
res.setHeader(
|
|
92
|
+
'Access-Control-Allow-Headers',
|
|
93
|
+
mergeHeaderList(undefined, [...ALLOWED_HEADERS, ...requested]),
|
|
94
|
+
);
|
|
95
|
+
res.setHeader(
|
|
96
|
+
'Access-Control-Allow-Methods',
|
|
97
|
+
mergeHeaderList(undefined, [
|
|
98
|
+
req.get('access-control-request-method') ?? 'POST',
|
|
99
|
+
'GET',
|
|
100
|
+
'POST',
|
|
101
|
+
]),
|
|
102
|
+
);
|
|
103
|
+
res.setHeader('Access-Control-Max-Age', String(cors.maxAgeSeconds ?? DEFAULT_MAX_AGE_SECONDS));
|
|
104
|
+
res.status(204).end();
|
|
105
|
+
};
|
|
106
|
+
}
|
package/src/seller/paywall.ts
CHANGED
|
@@ -43,6 +43,12 @@ import {
|
|
|
43
43
|
operationFingerprint,
|
|
44
44
|
} from './quote.js';
|
|
45
45
|
import type { ConsumedProofsStore, StoredResponse } from './consumed-proofs.js';
|
|
46
|
+
import {
|
|
47
|
+
type PaywallCorsOptions,
|
|
48
|
+
allowOrigin,
|
|
49
|
+
exposePaymentHeaders,
|
|
50
|
+
preflightHandler,
|
|
51
|
+
} from './cors.js';
|
|
46
52
|
import {
|
|
47
53
|
DEFAULT_MAX_TIMEOUT_SECONDS,
|
|
48
54
|
DEFAULT_QUOTE_TTL_SECONDS,
|
|
@@ -122,11 +128,15 @@ export interface ObytePaywallOptions {
|
|
|
122
128
|
readonly paymentIdentifier?: { readonly required: boolean };
|
|
123
129
|
/** Enables batch-settlement (AA payment channels) offers; requires a running seller watcher. */
|
|
124
130
|
readonly batch?: { readonly minChannelTimeoutSeconds: number };
|
|
131
|
+
/**
|
|
132
|
+
* CORS for browser clients on another origin (x402 HTTP transport, "Browser
|
|
133
|
+
* clients"). Also mount {@link ObytePaywall.preflight} before the routes.
|
|
134
|
+
* Without it, same-origin pages and non-browser clients work as before.
|
|
135
|
+
*/
|
|
136
|
+
readonly cors?: PaywallCorsOptions;
|
|
125
137
|
readonly now?: () => number;
|
|
126
138
|
}
|
|
127
139
|
|
|
128
|
-
const EXPOSE = 'PAYMENT-REQUIRED, PAYMENT-RESPONSE';
|
|
129
|
-
|
|
130
140
|
export class ObytePaywall {
|
|
131
141
|
private readonly log: Logger;
|
|
132
142
|
private readonly now: () => number;
|
|
@@ -145,6 +155,15 @@ export class ObytePaywall {
|
|
|
145
155
|
this.now = options.now ?? (() => Math.floor(Date.now() / 1000));
|
|
146
156
|
}
|
|
147
157
|
|
|
158
|
+
/**
|
|
159
|
+
* Answers CORS preflight requests (`app.use(paywall.preflight())`); a no-op
|
|
160
|
+
* without the `cors` option. Preflights never require payment.
|
|
161
|
+
*/
|
|
162
|
+
preflight(): RequestHandler {
|
|
163
|
+
const cors = this.options.cors;
|
|
164
|
+
return cors === undefined ? (_req, _res, next) => next() : preflightHandler(cors);
|
|
165
|
+
}
|
|
166
|
+
|
|
148
167
|
/** Wraps a handler so it only runs after a settled payment. */
|
|
149
168
|
paid(route: PaidRouteOptions, handler: PaidHandler): RequestHandler {
|
|
150
169
|
const asset = route.price.asset ?? 'base';
|
|
@@ -165,7 +184,8 @@ export class ObytePaywall {
|
|
|
165
184
|
price: { asset: string; amount: string },
|
|
166
185
|
handler: PaidHandler,
|
|
167
186
|
): Promise<void> {
|
|
168
|
-
res
|
|
187
|
+
exposePaymentHeaders(res);
|
|
188
|
+
if (this.options.cors !== undefined) allowOrigin(req, res, this.options.cors);
|
|
169
189
|
res.setHeader('Cache-Control', 'private, no-store');
|
|
170
190
|
const header = req.get('payment-signature');
|
|
171
191
|
if (header === undefined) return this.paymentRequired(req, res, route, price);
|
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
SchemeServerHooks,
|
|
10
10
|
} from '@x402/core/types';
|
|
11
11
|
import {
|
|
12
|
+
CHANNEL_BASE_AA,
|
|
12
13
|
ObbyxError,
|
|
13
14
|
fromDisplay,
|
|
14
15
|
getNetwork,
|
|
@@ -17,14 +18,24 @@ import {
|
|
|
17
18
|
parseAmount,
|
|
18
19
|
} from '@obbyx/obyte';
|
|
19
20
|
import { type Logger, moduleLogger } from '@obbyx/obyte/logger';
|
|
20
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
BATCH_SCHEME,
|
|
23
|
+
EXACT_SCHEME,
|
|
24
|
+
batchExtraSchema,
|
|
25
|
+
bindingsEqual,
|
|
26
|
+
canonical,
|
|
27
|
+
exactExtraSchema,
|
|
28
|
+
sha256Hex,
|
|
29
|
+
} from '@obbyx/x402-obyte';
|
|
21
30
|
import type { ConsumedProofsStore } from './consumed-proofs.js';
|
|
22
31
|
import { DEFAULT_QUOTE_TTL_SECONDS, DEFAULT_SERVING_LEASE_SECONDS } from './defaults.js';
|
|
23
32
|
import { type Quote, bodyHashOf, newQuote, offerBinding } from './quote.js';
|
|
24
33
|
|
|
25
34
|
/**
|
|
26
|
-
* Obyte
|
|
27
|
-
* `@x402/express`, `@x402/hono`, …):
|
|
35
|
+
* Obyte schemes for the OFFICIAL x402 resource server (`@x402/core/server`,
|
|
36
|
+
* `@x402/express`, `@x402/hono`, …): SchemeNetworkServer implementations for
|
|
37
|
+
* `exact` ({@link ObyteExactServer}) and `batch-settlement`
|
|
38
|
+
* ({@link ObyteBatchServer}), sharing {@link ObyteSchemeServer}.
|
|
28
39
|
*
|
|
29
40
|
* - Binding (I1/I2): `enrichPaymentRequiredResponse` adds a per-request HMAC
|
|
30
41
|
* binding + quote to every offer. On a paid request it recomputes the HMAC
|
|
@@ -38,7 +49,7 @@ import { type Quote, bodyHashOf, newQuote, offerBinding } from './quote.js';
|
|
|
38
49
|
* Unlike `@obbyx/sdk`'s ObytePaywall, a repeated request gets a 402 instead
|
|
39
50
|
* of the stored response (the official middleware cannot replay responses).
|
|
40
51
|
*/
|
|
41
|
-
export interface
|
|
52
|
+
export interface ObyteSchemeServerOptions {
|
|
42
53
|
/** How long a request may hold a payment in `serving` before a retry takes over (default 300 s). */
|
|
43
54
|
readonly servingLeaseSeconds?: number;
|
|
44
55
|
readonly sellerId: string;
|
|
@@ -72,8 +83,32 @@ function requestOf(transportContext: unknown): RequestLike | undefined {
|
|
|
72
83
|
};
|
|
73
84
|
}
|
|
74
85
|
|
|
75
|
-
|
|
76
|
-
|
|
86
|
+
/** @deprecated Use {@link ObyteSchemeServerOptions}. */
|
|
87
|
+
export type ObyteExactServerOptions = ObyteSchemeServerOptions;
|
|
88
|
+
|
|
89
|
+
/** Options of {@link ObyteBatchServer}. */
|
|
90
|
+
export interface ObyteBatchServerOptions extends ObyteSchemeServerOptions {
|
|
91
|
+
/** Minimum channel dispute window the seller accepts (seconds); must match the facilitator's. */
|
|
92
|
+
readonly minChannelTimeoutSeconds: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Per-scheme parts of an Obyte resource-server scheme. */
|
|
96
|
+
export interface ObyteSchemeSpec {
|
|
97
|
+
readonly scheme: typeof EXACT_SCHEME | typeof BATCH_SCHEME;
|
|
98
|
+
/** `extra` fields the scheme adds to every offer besides binding and quote. */
|
|
99
|
+
readonly staticExtra: Record<string, unknown>;
|
|
100
|
+
/** Parses the quote fields of the accepted offer. */
|
|
101
|
+
readonly acceptedExtra: (extra: unknown) => {
|
|
102
|
+
readonly binding: string;
|
|
103
|
+
readonly quoteId: string;
|
|
104
|
+
readonly validUntil: number;
|
|
105
|
+
};
|
|
106
|
+
/** Proof id and key kind of a payment payload (undefined when malformed). */
|
|
107
|
+
readonly proofOf: (payload: Record<string, unknown>) => { kind: string; id: string } | undefined;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export abstract class ObyteSchemeServer implements SchemeNetworkServer {
|
|
111
|
+
readonly scheme: string;
|
|
77
112
|
readonly defaultAssetTransferMethod = 'default';
|
|
78
113
|
readonly paymentFlows = {
|
|
79
114
|
default: { supported: ['upfront'] as const, default: 'upfront' as const },
|
|
@@ -83,24 +118,25 @@ export class ObyteExactServer implements SchemeNetworkServer {
|
|
|
83
118
|
private readonly log: Logger;
|
|
84
119
|
private readonly now: () => number;
|
|
85
120
|
|
|
86
|
-
constructor(
|
|
87
|
-
|
|
121
|
+
protected constructor(
|
|
122
|
+
private readonly options: ObyteSchemeServerOptions,
|
|
123
|
+
private readonly spec: ObyteSchemeSpec,
|
|
124
|
+
) {
|
|
125
|
+
this.scheme = spec.scheme;
|
|
126
|
+
this.log = moduleLogger(options.logger, 'sdk.x402-server', { scheme: spec.scheme });
|
|
88
127
|
this.now = options.now ?? (() => Math.floor(Date.now() / 1000));
|
|
89
128
|
this.schemeHooks = {
|
|
90
129
|
onBeforeVerify: async (ctx) => {
|
|
91
|
-
const
|
|
130
|
+
const key = this.keyOf(ctx);
|
|
92
131
|
const binding = (ctx.requirements.extra as { binding?: unknown }).binding;
|
|
93
|
-
if (
|
|
132
|
+
if (key === undefined || typeof binding !== 'string') {
|
|
94
133
|
return { abort: true, reason: 'invalid_payload' };
|
|
95
134
|
}
|
|
96
|
-
const { record } = this.options.proofs.begin(
|
|
97
|
-
this.key(ctx.requirements.network, unit),
|
|
98
|
-
binding,
|
|
99
|
-
);
|
|
135
|
+
const { record } = this.options.proofs.begin(key, binding);
|
|
100
136
|
if (!bindingsEqual(record.binding, binding))
|
|
101
137
|
return { abort: true, reason: 'invalid_payment_reused' };
|
|
102
138
|
if (record.state === 'served') {
|
|
103
|
-
this.log.warn({ proofId:
|
|
139
|
+
this.log.warn({ proofId: key }, 'payment already served a request; refused');
|
|
104
140
|
return { abort: true, reason: 'payment_already_used' };
|
|
105
141
|
}
|
|
106
142
|
return undefined;
|
|
@@ -183,7 +219,7 @@ export class ObyteExactServer implements SchemeNetworkServer {
|
|
|
183
219
|
return asset === 'base' ? 9 : undefined;
|
|
184
220
|
}
|
|
185
221
|
|
|
186
|
-
/** Nothing to add from /supported
|
|
222
|
+
/** Nothing to add from /supported; the per-request fields come from the enrich hook. */
|
|
187
223
|
async enhancePaymentRequirements(
|
|
188
224
|
requirements: PaymentRequirements,
|
|
189
225
|
): Promise<PaymentRequirements> {
|
|
@@ -196,20 +232,21 @@ export class ObyteExactServer implements SchemeNetworkServer {
|
|
|
196
232
|
): Promise<PaymentRequirements[]> => {
|
|
197
233
|
const request = requestOf(ctx.transportContext);
|
|
198
234
|
if (request === undefined)
|
|
199
|
-
throw new ObbyxError('no_request',
|
|
235
|
+
throw new ObbyxError('no_request', `Obyte ${this.scheme} needs the HTTP request context`);
|
|
200
236
|
const accepted = this.acceptedQuote(request);
|
|
201
237
|
return ctx.requirements.map((req) => {
|
|
202
|
-
if (req.scheme !==
|
|
238
|
+
if (req.scheme !== this.spec.scheme) return req;
|
|
203
239
|
const quote =
|
|
204
240
|
accepted !== undefined &&
|
|
205
241
|
bindingsEqual(this.bindingFor(req, request, accepted), accepted.binding)
|
|
206
242
|
? accepted
|
|
207
243
|
: undefined;
|
|
208
|
-
|
|
244
|
+
const extra = { ...req.extra, ...this.spec.staticExtra };
|
|
245
|
+
if (quote !== undefined) return { ...req, extra: { ...extra, ...quote } };
|
|
209
246
|
const fresh = newQuote(this.now(), this.options.quoteTtlSeconds ?? DEFAULT_QUOTE_TTL_SECONDS);
|
|
210
247
|
return {
|
|
211
248
|
...req,
|
|
212
|
-
extra: { ...
|
|
249
|
+
extra: { ...extra, binding: this.bindingFor(req, request, fresh), ...fresh },
|
|
213
250
|
};
|
|
214
251
|
});
|
|
215
252
|
};
|
|
@@ -217,10 +254,10 @@ export class ObyteExactServer implements SchemeNetworkServer {
|
|
|
217
254
|
private acceptedQuote(request: RequestLike) {
|
|
218
255
|
if (request.paymentHeader === undefined) return undefined;
|
|
219
256
|
try {
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
);
|
|
223
|
-
return extra.
|
|
257
|
+
const accepted = decodePaymentSignatureHeader(request.paymentHeader).accepted;
|
|
258
|
+
if (accepted?.scheme !== this.spec.scheme) return undefined;
|
|
259
|
+
const extra = this.spec.acceptedExtra(accepted.extra);
|
|
260
|
+
return { quoteId: extra.quoteId, validUntil: extra.validUntil, binding: extra.binding };
|
|
224
261
|
} catch {
|
|
225
262
|
return undefined;
|
|
226
263
|
}
|
|
@@ -229,7 +266,7 @@ export class ObyteExactServer implements SchemeNetworkServer {
|
|
|
229
266
|
private bindingFor(req: PaymentRequirements, request: RequestLike, quote: Quote): string {
|
|
230
267
|
return offerBinding(
|
|
231
268
|
this.options,
|
|
232
|
-
|
|
269
|
+
this.spec.scheme,
|
|
233
270
|
quote,
|
|
234
271
|
{ method: request.method, url: request.url, bodyHash: bodyHashOf(request.body) },
|
|
235
272
|
{ network: req.network, asset: req.asset, amount: req.amount, payTo: req.payTo },
|
|
@@ -241,11 +278,46 @@ export class ObyteExactServer implements SchemeNetworkServer {
|
|
|
241
278
|
paymentPayload: { payload: Record<string, unknown> };
|
|
242
279
|
requirements: { network: string };
|
|
243
280
|
}): string | undefined {
|
|
244
|
-
const
|
|
245
|
-
return
|
|
281
|
+
const proof = this.spec.proofOf(ctx.paymentPayload.payload);
|
|
282
|
+
return proof === undefined
|
|
283
|
+
? undefined
|
|
284
|
+
: networkKey(getNetwork(ctx.requirements.network), proof.kind, proof.id);
|
|
246
285
|
}
|
|
286
|
+
}
|
|
247
287
|
|
|
248
|
-
|
|
249
|
-
|
|
288
|
+
/** `exact`: the proof is the unit (key `<network>:unit:<hash>`, as ObytePaywall). */
|
|
289
|
+
export class ObyteExactServer extends ObyteSchemeServer {
|
|
290
|
+
constructor(options: ObyteSchemeServerOptions) {
|
|
291
|
+
super(options, {
|
|
292
|
+
scheme: EXACT_SCHEME,
|
|
293
|
+
staticExtra: {},
|
|
294
|
+
acceptedExtra: (extra) => exactExtraSchema.parse(extra),
|
|
295
|
+
proofOf: (payload) => {
|
|
296
|
+
const unit = (payload as { unit?: { unit?: unknown } }).unit?.unit;
|
|
297
|
+
return typeof unit === 'string' ? { kind: 'unit', id: unit } : undefined;
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* `batch-settlement` (AA payment channels): the proof is the voucher (key
|
|
305
|
+
* `<network>:voucher:<sha256 of the canonical signed package>`, as
|
|
306
|
+
* ObytePaywall). Offers carry the channel base AA and the minimum dispute
|
|
307
|
+
* window. Needs a facilitator with batch-settlement and the seller's watcher.
|
|
308
|
+
*/
|
|
309
|
+
export class ObyteBatchServer extends ObyteSchemeServer {
|
|
310
|
+
constructor(options: ObyteBatchServerOptions) {
|
|
311
|
+
super(options, {
|
|
312
|
+
scheme: BATCH_SCHEME,
|
|
313
|
+
staticExtra: { baseAa: CHANNEL_BASE_AA, minTimeout: options.minChannelTimeoutSeconds },
|
|
314
|
+
acceptedExtra: (extra) => batchExtraSchema.parse(extra),
|
|
315
|
+
proofOf: (payload) => {
|
|
316
|
+
const pkg = payload['signedPackage'];
|
|
317
|
+
return pkg !== null && typeof pkg === 'object'
|
|
318
|
+
? { kind: 'voucher', id: sha256Hex(canonical(pkg)) }
|
|
319
|
+
: undefined;
|
|
320
|
+
},
|
|
321
|
+
});
|
|
250
322
|
}
|
|
251
323
|
}
|