@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 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
@@ -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,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
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,EAAE,gBAAgB,EAAgC,MAAM,yBAAyB,CAAC"}
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;IAuB9E;;;;;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"}
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
- this.db.exec('BEGIN IMMEDIATE');
95
- try {
96
- this.db
97
- .prepare(`INSERT INTO consumed_proofs (key, binding, state, payment_response, created_at, updated_at)
98
- VALUES (?, ?, 'paid_not_served', ?, ?, ?)
99
- ON CONFLICT(key) DO UPDATE SET state = 'paid_not_served', payment_response = excluded.payment_response,
100
- updated_at = excluded.updated_at
101
- WHERE consumed_proofs.state = 'settling'`)
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":"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"}
@@ -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;AAOhF;;;;;;;;;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,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAID,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,+DAA+D;IAC/D,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,cAAc;YAYrD,MAAM;IAmKpB,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"}
1
+ {"version":3,"file":"paywall.d.ts","sourceRoot":"","sources":["../../src/seller/paywall.ts"],"names":[],"mappings":"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"}
@@ -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.setHeader('Access-Control-Expose-Headers', EXPOSE);
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 `exact` for the OFFICIAL x402 resource server (`@x402/core/server`,
6
- * `@x402/express`, `@x402/hono`, …): a SchemeNetworkServer.
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 ObyteExactServerOptions {
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
- export declare class ObyteExactServer implements SchemeNetworkServer {
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 scheme = "exact";
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: ObyteExactServerOptions);
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 for exact; the per-request fields come from the enrich hook. */
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
- private key;
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;AAS1B,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,uBAAuB;IACtC,oGAAoG;IACpG,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAwBD,qBAAa,gBAAiB,YAAW,mBAAmB;IAW9C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,QAAQ,CAAC,MAAM,WAAgB;IAC/B,QAAQ,CAAC,0BAA0B,aAAa;IAChD,QAAQ,CAAC,YAAY;;;;;MAEnB;IACF,QAAQ,CAAC,kBAAkB,WAAwC;IACnE,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEN,OAAO,EAAE,uBAAuB;IA4E7D,6EAA6E;IACvE,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBtE,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,kGAAkG;IAC5F,0BAA0B,CAC9B,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAAC,mBAAmB,CAAC;IAI/B,0FAA0F;IAC1F,6BAA6B,GAC3B,KAAK,4BAA4B,KAChC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAmB/B;IAEF,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,UAAU;IAUlB,6EAA6E;IAC7E,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,GAAG;CAGZ"}
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 ObyteExactServer {
20
+ export class ObyteSchemeServer {
21
21
  options;
22
- scheme = EXACT_SCHEME;
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.log = moduleLogger(options.logger, 'sdk.x402-server', { scheme: EXACT_SCHEME });
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 unit = ctx.paymentPayload.payload.unit?.unit;
40
+ const key = this.keyOf(ctx);
38
41
  const binding = ctx.requirements.extra.binding;
39
- if (typeof unit !== 'string' || typeof binding !== 'string') {
42
+ if (key === undefined || typeof binding !== 'string') {
40
43
  return { abort: true, reason: 'invalid_payload' };
41
44
  }
42
- const { record } = this.options.proofs.begin(this.key(ctx.requirements.network, unit), binding);
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: unit }, 'payment already served a request; refused');
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 for exact; the per-request fields come from the enrich hook. */
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', 'Obyte exact needs the HTTP request context');
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 !== EXACT_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: { ...req.extra, ...quote } };
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: { ...req.extra, binding: this.bindingFor(req, request, fresh), ...fresh },
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 extra = exactExtraSchema.safeParse(decodePaymentSignatureHeader(request.paymentHeader).accepted?.extra);
155
- return extra.success ? extra.data : undefined;
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, EXACT_SCHEME, quote, { method: request.method, url: request.url, bodyHash: bodyHashOf(request.body) }, { network: req.network, asset: req.asset, amount: req.amount, payTo: req.payTo });
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 unit = ctx.paymentPayload.payload.unit?.unit;
167
- return typeof unit === 'string' ? this.key(ctx.requirements.network, unit) : undefined;
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
- key(network, unit) {
170
- return networkKey(getNetwork(network), 'unit', unit);
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":"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"}
1
+ {"version":3,"file":"x402-server.js","sourceRoot":"","sources":["../../src/seller/x402-server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@obbyx/sdk",
3
- "version": "0.1.1",
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.0",
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 { ObyteExactServer, type ObyteExactServerOptions } from './seller/x402-server.js';
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
- this.db.exec('BEGIN IMMEDIATE');
185
- try {
186
- this.db
187
- .prepare(
188
- `INSERT INTO consumed_proofs (key, binding, state, payment_response, created_at, updated_at)
189
- VALUES (?, ?, 'paid_not_served', ?, ?, ?)
190
- ON CONFLICT(key) DO UPDATE SET state = 'paid_not_served', payment_response = excluded.payment_response,
191
- updated_at = excluded.updated_at
192
- WHERE consumed_proofs.state = 'settling'`,
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
+ }
@@ -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.setHeader('Access-Control-Expose-Headers', EXPOSE);
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 { EXACT_SCHEME, bindingsEqual, exactExtraSchema } from '@obbyx/x402-obyte';
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 `exact` for the OFFICIAL x402 resource server (`@x402/core/server`,
27
- * `@x402/express`, `@x402/hono`, …): a SchemeNetworkServer.
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 ObyteExactServerOptions {
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
- export class ObyteExactServer implements SchemeNetworkServer {
76
- readonly scheme = EXACT_SCHEME;
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(private readonly options: ObyteExactServerOptions) {
87
- this.log = moduleLogger(options.logger, 'sdk.x402-server', { scheme: EXACT_SCHEME });
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 unit = (ctx.paymentPayload.payload as { unit?: { unit?: unknown } }).unit?.unit;
130
+ const key = this.keyOf(ctx);
92
131
  const binding = (ctx.requirements.extra as { binding?: unknown }).binding;
93
- if (typeof unit !== 'string' || typeof binding !== 'string') {
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: unit }, 'payment already served a request; refused');
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 for exact; the per-request fields come from the enrich hook. */
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', 'Obyte exact needs the HTTP request context');
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 !== EXACT_SCHEME) return req;
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
- if (quote !== undefined) return { ...req, extra: { ...req.extra, ...quote } };
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: { ...req.extra, binding: this.bindingFor(req, request, fresh), ...fresh },
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 extra = exactExtraSchema.safeParse(
221
- decodePaymentSignatureHeader(request.paymentHeader).accepted?.extra,
222
- );
223
- return extra.success ? extra.data : undefined;
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
- EXACT_SCHEME,
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 unit = (ctx.paymentPayload.payload as { unit?: { unit?: unknown } }).unit?.unit;
245
- return typeof unit === 'string' ? this.key(ctx.requirements.network, unit) : undefined;
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
- private key(network: string, unit: string): string {
249
- return networkKey(getNetwork(network), 'unit', unit);
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
  }