@obbyx/sdk 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/client/paying-fetch.d.ts.map +1 -1
- package/dist/client/paying-fetch.js +68 -61
- package/dist/client/paying-fetch.js.map +1 -1
- 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 +32 -0
- package/dist/seller/paywall.d.ts.map +1 -1
- package/dist/seller/paywall.js +183 -127
- 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 +3 -3
- package/src/client/paying-fetch.ts +96 -64
- 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 +237 -177
- 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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paying-fetch.d.ts","sourceRoot":"","sources":["../../src/client/paying-fetch.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"paying-fetch.d.ts","sourceRoot":"","sources":["../../src/client/paying-fetch.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAKV,cAAc,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAEL,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAC9F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,mBAAoB,SAAQ,UAAU;IAE/C,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM;gBADnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM;CAO/B;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,GAAG;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,EACD,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA+CvB"}
|
|
@@ -29,73 +29,14 @@ export async function payingFetch(url, init, options) {
|
|
|
29
29
|
const required = response.headers.get('PAYMENT-REQUIRED');
|
|
30
30
|
if (required === null)
|
|
31
31
|
throw new ObbyxError('invalid_402', '402 without PAYMENT-REQUIRED header');
|
|
32
|
-
|
|
33
|
-
// Offers in preference order (channel first). A channel that turns out to
|
|
34
|
-
// be unusable before anything is signed (not funded, closing, exhausted,
|
|
35
|
-
// busy) falls through to the next offer, normally `exact`.
|
|
36
|
-
let accepted;
|
|
37
|
-
let result;
|
|
38
|
-
let lastChannelError;
|
|
39
|
-
for (const candidate of chooseOffers(offer.accepts, options)) {
|
|
40
|
-
const mechanism = candidate.scheme === BATCH_SCHEME ? options.mechanisms.batch : options.mechanisms.exact;
|
|
41
|
-
if (mechanism === undefined)
|
|
42
|
-
continue;
|
|
43
|
-
log.info({
|
|
44
|
-
url,
|
|
45
|
-
scheme: candidate.scheme,
|
|
46
|
-
payTo: candidate.payTo,
|
|
47
|
-
asset: candidate.asset,
|
|
48
|
-
amount: candidate.amount,
|
|
49
|
-
}, 'paying for request');
|
|
50
|
-
// Reserve the price BEFORE signing: concurrent calls cannot overshoot the budget.
|
|
51
|
-
reservation = options.budget?.reserve(candidate.asset, BigInt(candidate.amount));
|
|
52
|
-
try {
|
|
53
|
-
result = await mechanism.createPaymentPayload(2, candidate);
|
|
54
|
-
accepted = candidate;
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
if (reservation)
|
|
59
|
-
options.budget?.release(reservation); // nothing was signed or sent
|
|
60
|
-
reservation = undefined;
|
|
61
|
-
if (err instanceof ObbyxError && CHANNEL_UNUSABLE.has(err.code)) {
|
|
62
|
-
lastChannelError = err;
|
|
63
|
-
log.info({ reason: err.code, detail: err.message }, 'channel unusable; trying the next offer');
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
throw err;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (accepted === undefined || result === undefined) {
|
|
70
|
-
// Nothing else to pay with: report why the channel could not (e.g. payment_pending).
|
|
71
|
-
throw lastChannelError ?? new ObbyxError('no_acceptable_offer', 'No offer could be paid');
|
|
72
|
-
}
|
|
73
|
-
const payload = {
|
|
74
|
-
x402Version: 2,
|
|
75
|
-
resource: offer.resource,
|
|
76
|
-
accepted,
|
|
77
|
-
payload: result.payload,
|
|
78
|
-
...(offer.extensions ? { extensions: withPaymentId(offer.extensions, init.paymentId) } : {}),
|
|
79
|
-
};
|
|
80
|
-
header = encodePaymentSignatureHeader(payload);
|
|
32
|
+
({ header, reservation } = await signPayment(decodePaymentRequiredHeader(required), init.paymentId, url, options, log));
|
|
81
33
|
response = await request(header);
|
|
82
34
|
}
|
|
83
35
|
const deadline = Date.now() + (options.pendingTimeoutMs ?? 120_000);
|
|
84
36
|
for (;;) {
|
|
85
37
|
const settle = readSettle(response);
|
|
86
38
|
if (response.status !== 402 || settle?.errorReason !== 'settlement_pending') {
|
|
87
|
-
|
|
88
|
-
if (accepted?.scheme === BATCH_SCHEME)
|
|
89
|
-
options.mechanisms.batch?.onSettled(accepted, settle);
|
|
90
|
-
if (reservation !== undefined && options.budget !== undefined) {
|
|
91
|
-
// I7: spend on success; release ONLY on a definite refusal (402: the
|
|
92
|
-
// payment was not used). Anything else (5xx, 409, no settlement info)
|
|
93
|
-
// is an unknown outcome: the reservation stays counted.
|
|
94
|
-
if (settle?.success === true || (response.ok && settle === undefined))
|
|
95
|
-
options.budget.spend(reservation);
|
|
96
|
-
else if (response.status === 402)
|
|
97
|
-
options.budget.release(reservation);
|
|
98
|
-
}
|
|
39
|
+
recordOutcome(response, settle, header, reservation, options);
|
|
99
40
|
return { response, ...(settle ? { payment: settle } : {}), paymentHeader: header };
|
|
100
41
|
}
|
|
101
42
|
if (Date.now() > deadline)
|
|
@@ -108,6 +49,72 @@ export async function payingFetch(url, init, options) {
|
|
|
108
49
|
response = await request(header);
|
|
109
50
|
}
|
|
110
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Signs a payment for the first usable offer, in preference order (channel
|
|
54
|
+
* first). A channel that turns out to be unusable before anything is signed
|
|
55
|
+
* (not funded, closing, exhausted, busy) falls through to the next offer,
|
|
56
|
+
* normally `exact`. The price is reserved in the budget BEFORE signing, so
|
|
57
|
+
* concurrent calls cannot overshoot it.
|
|
58
|
+
*/
|
|
59
|
+
async function signPayment(offer, paymentId, url, options, log) {
|
|
60
|
+
let lastChannelError;
|
|
61
|
+
for (const candidate of chooseOffers(offer.accepts, options)) {
|
|
62
|
+
const mechanism = candidate.scheme === BATCH_SCHEME ? options.mechanisms.batch : options.mechanisms.exact;
|
|
63
|
+
if (mechanism === undefined)
|
|
64
|
+
continue;
|
|
65
|
+
log.info({
|
|
66
|
+
url,
|
|
67
|
+
scheme: candidate.scheme,
|
|
68
|
+
payTo: candidate.payTo,
|
|
69
|
+
asset: candidate.asset,
|
|
70
|
+
amount: candidate.amount,
|
|
71
|
+
}, 'paying for request');
|
|
72
|
+
const reservation = options.budget?.reserve(candidate.asset, BigInt(candidate.amount));
|
|
73
|
+
let result;
|
|
74
|
+
try {
|
|
75
|
+
result = await mechanism.createPaymentPayload(2, candidate);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
if (reservation)
|
|
79
|
+
options.budget?.release(reservation); // nothing was signed or sent
|
|
80
|
+
if (err instanceof ObbyxError && CHANNEL_UNUSABLE.has(err.code)) {
|
|
81
|
+
lastChannelError = err;
|
|
82
|
+
log.info({ reason: err.code, detail: err.message }, 'channel unusable; trying the next offer');
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
const payload = {
|
|
88
|
+
x402Version: 2,
|
|
89
|
+
resource: offer.resource,
|
|
90
|
+
accepted: candidate,
|
|
91
|
+
payload: result.payload,
|
|
92
|
+
...(offer.extensions ? { extensions: withPaymentId(offer.extensions, paymentId) } : {}),
|
|
93
|
+
};
|
|
94
|
+
return { header: encodePaymentSignatureHeader(payload), reservation };
|
|
95
|
+
}
|
|
96
|
+
// Nothing else to pay with: report why the channel could not (e.g. payment_pending).
|
|
97
|
+
throw lastChannelError ?? new ObbyxError('no_acceptable_offer', 'No offer could be paid');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Applies the final answer: the channel voucher is confirmed or released, and
|
|
101
|
+
* the budget reservation is spent on success and released ONLY on a definite
|
|
102
|
+
* refusal (402: the payment was not used). Anything else (5xx, 409, no
|
|
103
|
+
* settlement info) is an unknown outcome: the reservation stays counted (I7).
|
|
104
|
+
*/
|
|
105
|
+
function recordOutcome(response, settle, header, reservation, options) {
|
|
106
|
+
const accepted = acceptedOf(header);
|
|
107
|
+
if (accepted?.scheme === BATCH_SCHEME)
|
|
108
|
+
options.mechanisms.batch?.onSettled(accepted, settle);
|
|
109
|
+
if (reservation === undefined || options.budget === undefined)
|
|
110
|
+
return;
|
|
111
|
+
if (settle?.success === true || (response.ok && settle === undefined)) {
|
|
112
|
+
options.budget.spend(reservation);
|
|
113
|
+
}
|
|
114
|
+
else if (response.status === 402) {
|
|
115
|
+
options.budget.release(reservation);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
111
118
|
/** An offer from an untrusted seller: integer amount in smallest units, strings elsewhere. */
|
|
112
119
|
const offerShape = z
|
|
113
120
|
.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paying-fetch.js","sourceRoot":"","sources":["../../src/client/paying-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"paying-fetch.js","sourceRoot":"","sources":["../../src/client/paying-fetch.ts"],"names":[],"mappings":"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"}
|
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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuD3C,MAAM,OAAO,mBAAmB;IAKX;IAJF,EAAE,CAAe;IAElC,YACE,IAAY,EACK,MAAoB,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAAvD,QAAG,GAAH,GAAG,CAAoD;QAExE,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;KAqBZ,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,aAAa,CACX,OAAe,EACf,WAAmB,EACnB,QAAgB;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN,6HAA6H,CAC9H;aACA,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,mEAAmE,CAAC;aAC5E,GAAG,CAAC,OAAO,CAGb,CAAC;QACF,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,wFAAwF;IACxF,eAAe,CAAC,OAAe,EAAE,QAAgB,EAAE,QAAgB;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,2EAA2E,CAAC;aACpF,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,GAAG,CACjE,CAAC;QAClB,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,GAAW,EAAE,OAAe;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;qEAC6D,CAC9D;aACA,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,WAAW,CAAC,CAAC;QAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACxD,CAAC;IAED,oEAAoE;IACpE,UAAU,CACR,GAAW,EACX,IAAgB,EAChB,EAAc,EACd,QAAiE,EAAE;QAEnE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;;;sCAM8B,CAC/B;aACA,GAAG,CACF,EAAE,EACF,IAAI,CAAC,GAAG,EAAE,EACV,KAAK,CAAC,eAAe,IAAI,IAAI,EAC7B,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,IAAI,EAC9B,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC5E,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,EAC5B,GAAG,EACH,IAAI,CACL,CAAC;QACJ,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,GAAW,EAAE,OAAe,EAAE,eAAuB;QAC/D,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,
|
|
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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"}
|
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,12 +89,37 @@ 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;
|
|
100
|
+
/**
|
|
101
|
+
* Decodes the payment and checks it against THIS offer: our scheme, network,
|
|
102
|
+
* price and payee, and a binding we issued for this very request.
|
|
103
|
+
*/
|
|
104
|
+
private parsePayment;
|
|
105
|
+
/** Registers the proof, then continues from its state: one payment, one operation. */
|
|
106
|
+
private process;
|
|
107
|
+
/**
|
|
108
|
+
* x402 payment-identifier: one client id = one operation. Decided AFTER the
|
|
109
|
+
* proof row exists, so a concurrent request always sees this proof as in
|
|
110
|
+
* progress (never as "absent") and cannot take the id over. True when the
|
|
111
|
+
* response was already sent (refused, or the stored response replayed).
|
|
112
|
+
*/
|
|
113
|
+
private paymentIdentifierAnswered;
|
|
114
|
+
/** upfront flow: settle to finality, then run the handler once. */
|
|
115
|
+
private settleUpfront;
|
|
88
116
|
/** authorization flow: verify → handler (response stored) → settle → send. */
|
|
89
117
|
private authorize;
|
|
118
|
+
/** authorization flow, after the handler: settle, then send the stored response. */
|
|
90
119
|
private settleServed;
|
|
120
|
+
/** Not final yet: the client retries with the same payment. */
|
|
121
|
+
private answerPending;
|
|
122
|
+
/** Runs the handler once for a settled payment and stores its response. */
|
|
91
123
|
private serve;
|
|
92
124
|
private send;
|
|
93
125
|
private paymentRequired;
|
|
@@ -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":"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"}
|