madeonsol-x402 2.6.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +8 -2
- package/dist/index.d.ts +50 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +82 -9
- package/dist/index.js.map +1 -1
- package/dist/solana-payment.d.ts +8 -2
- package/dist/solana-payment.d.ts.map +1 -1
- package/dist/solana-payment.js +18 -3
- package/dist/solana-payment.js.map +1 -1
- package/dist/types.d.ts +5 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/x402-recovery.d.ts +104 -0
- package/dist/x402-recovery.d.ts.map +1 -0
- package/dist/x402-recovery.js +379 -0
- package/dist/x402-recovery.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
// Canonical source. Mirrored into the other x402 clients by
|
|
2
|
+
// packages/sync-solana-payment.mjs; CI rejects drift between published copies.
|
|
3
|
+
//
|
|
4
|
+
// PAY-05 — recovery of paid-but-lost x402 results (server contract:
|
|
5
|
+
// docs/audit/PAY05_PAID_RESULT_RECOVERY.md). Dependency-free: WebCrypto,
|
|
6
|
+
// fetch and TextEncoder only, so API-key consumers never load a signer.
|
|
7
|
+
//
|
|
8
|
+
// Rules this module enforces for a paid GET (a request that carries a
|
|
9
|
+
// PAYMENT-SIGNATURE / X-PAYMENT proof):
|
|
10
|
+
// - the exact proof and the exact URL are re-sent until a final answer; a new
|
|
11
|
+
// payment is NEVER created here (payment creation lives in the callers);
|
|
12
|
+
// - the original submission carries no PAYMENT-RECOVERY header; a retry does,
|
|
13
|
+
// signed by the payer with a fresh issuedAt;
|
|
14
|
+
// - every wait is bounded (attempt count and wall time); when the bound is
|
|
15
|
+
// reached the last answer is returned with a `resume()` handle instead of
|
|
16
|
+
// silently dropping the proof;
|
|
17
|
+
// - POST/PATCH/DELETE are sent exactly once (SDK-02);
|
|
18
|
+
// - recovery never touches a payment budget: it re-sends a proof that was
|
|
19
|
+
// already authorised and reserved, it never signs a new payment;
|
|
20
|
+
// - the payment id and request hash are computed LOCALLY from the proof and
|
|
21
|
+
// the URL (shared vectors: packages/x402-recovery-vectors.json); a value
|
|
22
|
+
// echoed by the server is used only when the local one cannot be derived,
|
|
23
|
+
// so a server can never make the payer sign for another payment.
|
|
24
|
+
export const PAYMENT_RECOVERY_HEADER = "PAYMENT-RECOVERY";
|
|
25
|
+
export const X402_RECOVERY_VERSION = 1;
|
|
26
|
+
const RHC_NETWORK = "eip155:4663";
|
|
27
|
+
const RHC_ASSET = "0x5fc5360d0400a0fd4f2af552add042d716f1d168";
|
|
28
|
+
const HEX64 = /^[0-9a-f]{64}$/;
|
|
29
|
+
const utf8 = new TextEncoder();
|
|
30
|
+
async function sha256Hex(data) {
|
|
31
|
+
const bytes = typeof data === "string" ? utf8.encode(data) : data;
|
|
32
|
+
const digest = new Uint8Array(await globalThis.crypto.subtle.digest("SHA-256", bytes));
|
|
33
|
+
let out = "";
|
|
34
|
+
for (const b of digest)
|
|
35
|
+
out += b.toString(16).padStart(2, "0");
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
function base64ToBytes(value) {
|
|
39
|
+
const binary = atob(value);
|
|
40
|
+
const bytes = new Uint8Array(binary.length);
|
|
41
|
+
for (let i = 0; i < binary.length; i++)
|
|
42
|
+
bytes[i] = binary.charCodeAt(i);
|
|
43
|
+
return bytes;
|
|
44
|
+
}
|
|
45
|
+
function bytesToBase64(bytes) {
|
|
46
|
+
let binary = "";
|
|
47
|
+
for (const b of bytes)
|
|
48
|
+
binary += String.fromCharCode(b);
|
|
49
|
+
return btoa(binary);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Canonical request identity (server: x402RequestHash). sha256 of
|
|
53
|
+
* JSON ["madeonsol-x402-request-v1", METHOD, pathname, sorted query pairs];
|
|
54
|
+
* pairs are URLSearchParams entries sorted by key, then value (UTF-16 order).
|
|
55
|
+
*/
|
|
56
|
+
export async function x402RequestHash(method, url) {
|
|
57
|
+
const parsed = new URL(String(url));
|
|
58
|
+
const pairs = [...new URLSearchParams(parsed.search).entries()]
|
|
59
|
+
.sort(([ak, av], [bk, bv]) => (ak < bk ? -1 : ak > bk ? 1 : av < bv ? -1 : av > bv ? 1 : 0));
|
|
60
|
+
return sha256Hex(JSON.stringify(["madeonsol-x402-request-v1", method.toUpperCase(), parsed.pathname, pairs]));
|
|
61
|
+
}
|
|
62
|
+
/** The exact 5-line UTF-8 message the payer signs (no trailing newline). */
|
|
63
|
+
export function recoveryMessage(paymentId, requestHash, issuedAt) {
|
|
64
|
+
return [
|
|
65
|
+
"MadeOnSol x402 payment recovery",
|
|
66
|
+
`version: ${X402_RECOVERY_VERSION}`,
|
|
67
|
+
`payment_id: ${paymentId}`,
|
|
68
|
+
`request_hash: ${requestHash}`,
|
|
69
|
+
`issued_at: ${issuedAt}`,
|
|
70
|
+
].join("\n");
|
|
71
|
+
}
|
|
72
|
+
/** base64(JSON {version, paymentId, requestHash, issuedAt, signature}) — exactly these keys. */
|
|
73
|
+
export function encodeRecoveryHeader(proof) {
|
|
74
|
+
return bytesToBase64(utf8.encode(JSON.stringify({
|
|
75
|
+
version: X402_RECOVERY_VERSION, paymentId: proof.paymentId, requestHash: proof.requestHash,
|
|
76
|
+
issuedAt: proof.issuedAt, signature: proof.signature,
|
|
77
|
+
})));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Local payment identity from the proof header the client sent.
|
|
81
|
+
* Solana: sha256 of the base64-decoded payload.transaction bytes.
|
|
82
|
+
* RHC: sha256(JSON ["rhc-x402-eip3009-v1", "eip155:4663", USDG, from, nonce]) (lower-case).
|
|
83
|
+
*/
|
|
84
|
+
export async function paymentIdFromProof(rail, proofHeader) {
|
|
85
|
+
try {
|
|
86
|
+
const proof = JSON.parse(new TextDecoder().decode(base64ToBytes(proofHeader)));
|
|
87
|
+
if (rail === "solana") {
|
|
88
|
+
const tx = proof?.payload?.transaction;
|
|
89
|
+
return typeof tx === "string" && tx ? await sha256Hex(base64ToBytes(tx)) : null;
|
|
90
|
+
}
|
|
91
|
+
const auth = proof?.payload?.authorization ?? proof?.authorization;
|
|
92
|
+
if (typeof auth?.from !== "string" || typeof auth?.nonce !== "string")
|
|
93
|
+
return null;
|
|
94
|
+
return await sha256Hex(JSON.stringify(["rhc-x402-eip3009-v1", RHC_NETWORK, RHC_ASSET, auth.from.toLowerCase(), auth.nonce.toLowerCase()]));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const responseMeta = new WeakMap();
|
|
101
|
+
/** Provenance headers of a paid answer, or null when the server sent none (pre-PAY-05). */
|
|
102
|
+
export function readPaidResult(res) {
|
|
103
|
+
const h = (name) => res.headers.get(name);
|
|
104
|
+
const meta = responseMeta.get(res);
|
|
105
|
+
if (!h("X-Payment-Id") && !h("X-Paid-Result-Status"))
|
|
106
|
+
return null;
|
|
107
|
+
const paymentId = h("X-Payment-Id") ?? meta?.paymentId ?? null;
|
|
108
|
+
const stored = h("X-Paid-Result-Stored");
|
|
109
|
+
const origin = h("X-Paid-Result-Origin");
|
|
110
|
+
return {
|
|
111
|
+
paymentId, requestHash: h("X-Request-Hash") ?? meta?.requestHash ?? null,
|
|
112
|
+
status: h("X-Paid-Result-Status"), source: h("X-Paid-Result-Source"), origin,
|
|
113
|
+
deferred: origin === "deferred",
|
|
114
|
+
stored: stored === null ? null : stored === "true",
|
|
115
|
+
paidAt: h("X-Paid-At"), generatedAt: h("X-Paid-Result-Generated-At"), sha256: h("X-Paid-Result-Sha256"),
|
|
116
|
+
attempts: meta?.attempts ?? 1,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** Additive: `{...data, _x402_payment}` for objects, `{data, _x402_payment}` otherwise. */
|
|
120
|
+
export function withPaidResult(data, provenance) {
|
|
121
|
+
if (!provenance)
|
|
122
|
+
return data;
|
|
123
|
+
if (data && typeof data === "object" && !Array.isArray(data))
|
|
124
|
+
return { ...data, _x402_payment: provenance };
|
|
125
|
+
return { data, _x402_payment: provenance };
|
|
126
|
+
}
|
|
127
|
+
// ── Coded errors ────────────────────────────────────────────────────────────
|
|
128
|
+
const PENDING_CODES = new Set(["payment_uncertain", "payment_state_unavailable", "paid_result_in_progress", "paid_result_missing", "payment_transport_error"]);
|
|
129
|
+
export class X402PaymentError extends Error {
|
|
130
|
+
status;
|
|
131
|
+
code;
|
|
132
|
+
reason;
|
|
133
|
+
paymentStatus;
|
|
134
|
+
paymentId;
|
|
135
|
+
requestHash;
|
|
136
|
+
retryAfterSeconds;
|
|
137
|
+
body;
|
|
138
|
+
/** Still recoverable with the SAME proof (never by a new payment). */
|
|
139
|
+
retryable;
|
|
140
|
+
/** Only a proven `not_paid` (HTTP 402) allows a new payment for this request. */
|
|
141
|
+
newPaymentAllowed;
|
|
142
|
+
/** Continue recovery with the same proof and URL (present when `retryable`). */
|
|
143
|
+
resume;
|
|
144
|
+
constructor(message, fields) {
|
|
145
|
+
super(message, fields.cause === undefined ? undefined : { cause: fields.cause });
|
|
146
|
+
this.name = "X402PaymentError";
|
|
147
|
+
this.status = fields.status;
|
|
148
|
+
this.code = fields.code ?? null;
|
|
149
|
+
this.reason = fields.reason ?? null;
|
|
150
|
+
this.paymentStatus = fields.paymentStatus ?? null;
|
|
151
|
+
this.paymentId = fields.paymentId ?? null;
|
|
152
|
+
this.requestHash = fields.requestHash ?? null;
|
|
153
|
+
this.retryAfterSeconds = fields.retryAfterSeconds ?? null;
|
|
154
|
+
this.body = fields.body;
|
|
155
|
+
const pendingCode = PENDING_CODES.has(this.code ?? "") || (this.paymentStatus === "paid_result_missing" && this.status >= 500);
|
|
156
|
+
this.retryable = pendingCode && this.status !== 410;
|
|
157
|
+
this.newPaymentAllowed = this.status === 402 && (this.code === "not_paid" || this.paymentStatus === "not_paid");
|
|
158
|
+
if (fields.resume && this.retryable)
|
|
159
|
+
this.resume = fields.resume;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function parseJson(text) {
|
|
163
|
+
try {
|
|
164
|
+
const v = JSON.parse(text);
|
|
165
|
+
return v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function retryAfterMs(res, body, now) {
|
|
172
|
+
const raw = res.headers.get("Retry-After");
|
|
173
|
+
if (raw !== null) {
|
|
174
|
+
if (/^\s*\d+\s*$/.test(raw))
|
|
175
|
+
return Number(raw) * 1000;
|
|
176
|
+
const at = Date.parse(raw);
|
|
177
|
+
if (!Number.isNaN(at))
|
|
178
|
+
return Math.max(0, at - now);
|
|
179
|
+
}
|
|
180
|
+
const s = body?.retry_after_seconds ?? body?.paid_result?.retry_after_seconds;
|
|
181
|
+
return typeof s === "number" && Number.isFinite(s) && s >= 0 ? s * 1000 : null;
|
|
182
|
+
}
|
|
183
|
+
/** Build a coded error from a non-2xx paid response; `message` keeps each SDK's historic prefix. */
|
|
184
|
+
export async function x402PaymentErrorFrom(res, message) {
|
|
185
|
+
const text = await res.text().catch(() => "");
|
|
186
|
+
const body = parseJson(text);
|
|
187
|
+
const meta = responseMeta.get(res);
|
|
188
|
+
// A failed paid run keeps the handler's own `code`; the recovery state is in paid_result.code.
|
|
189
|
+
const code = body?.paid_result?.code === "paid_result_missing" ? "paid_result_missing"
|
|
190
|
+
: typeof body?.code === "string" ? body.code
|
|
191
|
+
: res.status === 409 && body?.reason === "replay_detected" ? "payment_recovery_signature_required" : null;
|
|
192
|
+
const reason = typeof body?.reason === "string" ? body.reason
|
|
193
|
+
: code === "paid_result_missing" && typeof body?.code === "string" ? body.code : null;
|
|
194
|
+
const ra = retryAfterMs(res, body, Date.now());
|
|
195
|
+
const paymentId = res.headers.get("X-Payment-Id") ?? (typeof body?.paymentId === "string" ? body.paymentId : null) ?? meta?.paymentId ?? null;
|
|
196
|
+
return new X402PaymentError(message(text), {
|
|
197
|
+
status: res.status, code, reason,
|
|
198
|
+
paymentStatus: typeof body?.payment_status === "string" ? body.payment_status : null,
|
|
199
|
+
paymentId, requestHash: res.headers.get("X-Request-Hash") ?? body?.recovery?.request_hash ?? meta?.requestHash ?? null,
|
|
200
|
+
retryAfterSeconds: ra === null ? null : Math.ceil(ra / 1000), body: body ?? text, resume: meta?.resume,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/** Classify one answer to a paid GET (server contract § 2.3 + § 9.3). */
|
|
204
|
+
export function classifyPaidResponse(status, body) {
|
|
205
|
+
if (status < 300)
|
|
206
|
+
return "final";
|
|
207
|
+
const code = typeof body?.code === "string" ? body.code : null;
|
|
208
|
+
const paymentStatus = typeof body?.payment_status === "string" ? body.payment_status : null;
|
|
209
|
+
if (status === 409 && (code === "payment_recovery_signature_required" || (!code && body?.reason === "replay_detected")))
|
|
210
|
+
return "signature_required";
|
|
211
|
+
if (status === 409 && code === "paid_result_in_progress")
|
|
212
|
+
return "in_progress";
|
|
213
|
+
if (status >= 500 && paymentStatus === "paid_result_missing")
|
|
214
|
+
return "result_missing";
|
|
215
|
+
if (status === 503 && paymentStatus === "payment_uncertain")
|
|
216
|
+
return "uncertain";
|
|
217
|
+
// A proxy/gateway failure after the proof was sent: the outcome is unknown, like a lost response.
|
|
218
|
+
if ((status === 502 || status === 503 || status === 504) && !paymentStatus)
|
|
219
|
+
return "gateway";
|
|
220
|
+
// The per-IP burst cap answers BEFORE any payment state is read, so a 429 says
|
|
221
|
+
// nothing about the payment: an earlier send of this proof may have settled.
|
|
222
|
+
// Wait (Retry-After) and resend the same proof; never treat it as final.
|
|
223
|
+
if (status === 429)
|
|
224
|
+
return "rate_limited";
|
|
225
|
+
return "final"; // 2xx/4xx answers, 401 recovery_invalid, 402, 410, context mismatch, other 5xx
|
|
226
|
+
}
|
|
227
|
+
const defaultSleep = (ms, signal) => new Promise((resolve, reject) => {
|
|
228
|
+
if (signal?.aborted)
|
|
229
|
+
return reject(signal.reason);
|
|
230
|
+
const timer = setTimeout(() => { signal?.removeEventListener("abort", onAbort); resolve(); }, ms);
|
|
231
|
+
const onAbort = () => { clearTimeout(timer); reject(signal.reason); };
|
|
232
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
233
|
+
});
|
|
234
|
+
function headerRecord(headers) {
|
|
235
|
+
if (!headers)
|
|
236
|
+
return {};
|
|
237
|
+
if (headers instanceof Headers)
|
|
238
|
+
return Object.fromEntries(headers.entries());
|
|
239
|
+
if (Array.isArray(headers))
|
|
240
|
+
return Object.fromEntries(headers);
|
|
241
|
+
return { ...headers };
|
|
242
|
+
}
|
|
243
|
+
function getHeader(headers, name) {
|
|
244
|
+
const lower = name.toLowerCase();
|
|
245
|
+
for (const [k, v] of Object.entries(headers))
|
|
246
|
+
if (k.toLowerCase() === lower)
|
|
247
|
+
return v;
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Wrap a transport so a paid GET survives a lost response. Requests without a
|
|
252
|
+
* payment proof, and non-GET requests, are passed through exactly once.
|
|
253
|
+
*/
|
|
254
|
+
export function createRecoveringFetch(transport, options) {
|
|
255
|
+
const maxAttempts = Math.max(1, options.maxAttempts ?? 8);
|
|
256
|
+
const maxElapsedMs = options.maxElapsedMs ?? 600_000;
|
|
257
|
+
const maxMissing = options.maxResultMissingRetries ?? 2;
|
|
258
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
259
|
+
const now = options.now ?? (() => Date.now());
|
|
260
|
+
return (async (input, init) => {
|
|
261
|
+
const isRequest = typeof Request !== "undefined" && input instanceof Request;
|
|
262
|
+
const url = isRequest ? input.url : String(input);
|
|
263
|
+
const method = (init?.method ?? (isRequest ? input.method : "GET")).toUpperCase();
|
|
264
|
+
const headers = headerRecord(init?.headers ?? (isRequest ? input.headers : undefined));
|
|
265
|
+
const proof = getHeader(headers, "PAYMENT-SIGNATURE") ?? getHeader(headers, "X-PAYMENT");
|
|
266
|
+
if (!proof || method !== "GET")
|
|
267
|
+
return transport(input, init);
|
|
268
|
+
const signal = init?.signal ?? (isRequest ? input.signal : undefined) ?? undefined;
|
|
269
|
+
const redirect = init?.redirect ?? (isRequest ? input.redirect : undefined);
|
|
270
|
+
for (const k of Object.keys(headers))
|
|
271
|
+
if (k.toLowerCase() === "payment-recovery")
|
|
272
|
+
delete headers[k];
|
|
273
|
+
const localPaymentId = await paymentIdFromProof(options.rail, proof);
|
|
274
|
+
const localRequestHash = await x402RequestHash("GET", url);
|
|
275
|
+
const run = async (startWithHeader, totalSends) => {
|
|
276
|
+
const started = now();
|
|
277
|
+
let attempts = 0, missingRetries = 0, gatewayRetries = 0, signatureRetried = false;
|
|
278
|
+
let sendHeader = startWithHeader;
|
|
279
|
+
let ids = { paymentId: localPaymentId, requestHash: localRequestHash };
|
|
280
|
+
// Local identity wins; a server echo only fills a value we could not derive.
|
|
281
|
+
const remember = (res, body) => {
|
|
282
|
+
const pid = res.headers.get("X-Payment-Id") ?? body?.recovery?.payment_id ?? body?.paymentId;
|
|
283
|
+
const rh = res.headers.get("X-Request-Hash") ?? body?.recovery?.request_hash;
|
|
284
|
+
if (!localPaymentId && typeof pid === "string" && HEX64.test(pid))
|
|
285
|
+
ids = { ...ids, paymentId: pid };
|
|
286
|
+
if (!localRequestHash && typeof rh === "string" && HEX64.test(rh))
|
|
287
|
+
ids = { ...ids, requestHash: rh };
|
|
288
|
+
};
|
|
289
|
+
const finish = (res, pending) => {
|
|
290
|
+
responseMeta.set(res, {
|
|
291
|
+
attempts: totalSends.n, paymentId: ids.paymentId, requestHash: ids.requestHash,
|
|
292
|
+
resume: pending ? () => run(true, totalSends) : undefined,
|
|
293
|
+
});
|
|
294
|
+
return res;
|
|
295
|
+
};
|
|
296
|
+
while (true) {
|
|
297
|
+
attempts++;
|
|
298
|
+
totalSends.n++;
|
|
299
|
+
const sendHeaders = { ...headers };
|
|
300
|
+
if (sendHeader && ids.paymentId && ids.requestHash) {
|
|
301
|
+
const issuedAt = Math.floor(now() / 1000);
|
|
302
|
+
const signature = await options.sign(recoveryMessage(ids.paymentId, ids.requestHash, issuedAt));
|
|
303
|
+
sendHeaders[PAYMENT_RECOVERY_HEADER] = encodeRecoveryHeader({ paymentId: ids.paymentId, requestHash: ids.requestHash, issuedAt, signature });
|
|
304
|
+
}
|
|
305
|
+
const sentHeader = PAYMENT_RECOVERY_HEADER in sendHeaders;
|
|
306
|
+
const controller = new AbortController();
|
|
307
|
+
const onAbort = () => controller.abort(signal.reason);
|
|
308
|
+
if (signal?.aborted)
|
|
309
|
+
onAbort();
|
|
310
|
+
else
|
|
311
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
312
|
+
const timer = options.attemptTimeoutMs
|
|
313
|
+
? setTimeout(() => controller.abort(new Error("x402 paid request attempt timed out")), options.attemptTimeoutMs) : undefined;
|
|
314
|
+
let res;
|
|
315
|
+
try {
|
|
316
|
+
res = await transport(url, { method: "GET", headers: sendHeaders, signal: controller.signal, ...(redirect ? { redirect } : {}) });
|
|
317
|
+
}
|
|
318
|
+
catch (err) {
|
|
319
|
+
if (signal?.aborted)
|
|
320
|
+
throw err; // the caller gave up: never retry behind its back
|
|
321
|
+
const wait = Math.min(30_000, 1000 * 2 ** gatewayRetries++);
|
|
322
|
+
if (attempts >= maxAttempts || now() - started + wait > maxElapsedMs) {
|
|
323
|
+
throw new X402PaymentError(`x402 paid request outcome unknown after ${totalSends.n} send(s): ${err?.message ?? err}`, {
|
|
324
|
+
status: 0, code: "payment_transport_error", paymentStatus: "payment_uncertain",
|
|
325
|
+
paymentId: ids.paymentId, requestHash: ids.requestHash, cause: err, resume: () => run(true, totalSends),
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
await sleep(wait, signal);
|
|
329
|
+
sendHeader = true;
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
finally {
|
|
333
|
+
if (timer)
|
|
334
|
+
clearTimeout(timer);
|
|
335
|
+
signal?.removeEventListener("abort", onAbort);
|
|
336
|
+
}
|
|
337
|
+
let body = null;
|
|
338
|
+
if (res.status >= 300)
|
|
339
|
+
body = parseJson(await res.clone().text().catch(() => ""));
|
|
340
|
+
remember(res, body);
|
|
341
|
+
const kind = classifyPaidResponse(res.status, body);
|
|
342
|
+
if (kind === "final")
|
|
343
|
+
return finish(res, false);
|
|
344
|
+
let wait;
|
|
345
|
+
const hinted = retryAfterMs(res, body, now());
|
|
346
|
+
if (kind === "signature_required") {
|
|
347
|
+
// Only when the server did not see a header from us (an old server ignores it).
|
|
348
|
+
if (sentHeader || signatureRetried)
|
|
349
|
+
return finish(res, false);
|
|
350
|
+
signatureRetried = true;
|
|
351
|
+
wait = 0;
|
|
352
|
+
}
|
|
353
|
+
else if (kind === "result_missing") {
|
|
354
|
+
if (missingRetries >= maxMissing)
|
|
355
|
+
return finish(res, true);
|
|
356
|
+
missingRetries++;
|
|
357
|
+
wait = hinted ?? 30_000;
|
|
358
|
+
}
|
|
359
|
+
else if (kind === "gateway") {
|
|
360
|
+
wait = hinted ?? Math.min(30_000, 1000 * 2 ** gatewayRetries++);
|
|
361
|
+
}
|
|
362
|
+
else if (kind === "rate_limited") {
|
|
363
|
+
wait = hinted ?? 60_000;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
wait = hinted ?? 5_000; // in_progress, uncertain
|
|
367
|
+
}
|
|
368
|
+
if (attempts >= maxAttempts || now() - started + wait > maxElapsedMs)
|
|
369
|
+
return finish(res, true);
|
|
370
|
+
void res.body?.cancel().catch(() => { });
|
|
371
|
+
if (wait > 0)
|
|
372
|
+
await sleep(wait, signal);
|
|
373
|
+
sendHeader = true;
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
return run(false, { n: 0 });
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=x402-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-recovery.js","sourceRoot":"","sources":["../src/x402-recovery.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,+EAA+E;AAC/E,EAAE;AACF,oEAAoE;AACpE,yEAAyE;AACzE,wEAAwE;AACxE,EAAE;AACF,sEAAsE;AACtE,wCAAwC;AACxC,gFAAgF;AAChF,6EAA6E;AAC7E,gFAAgF;AAChF,iDAAiD;AACjD,6EAA6E;AAC7E,8EAA8E;AAC9E,mCAAmC;AACnC,wDAAwD;AACxD,4EAA4E;AAC5E,qEAAqE;AACrE,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,qEAAqE;AAErE,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAAkB,CAAC;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,SAAS,GAAG,4CAA4C,CAAC;AAC/D,MAAM,KAAK,GAAG,gBAAgB,CAAC;AAI/B,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAE/B,KAAK,UAAU,SAAS,CAAC,IAAyB;IAChD,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAqB,CAAC,CAAC,CAAC;IACvG,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAiB;IACtC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,GAAiB;IACrE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;SAC5D,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,2BAA2B,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,WAAmB,EAAE,QAAgB;IACtF,OAAO;QACL,iCAAiC;QACjC,YAAY,qBAAqB,EAAE;QACnC,eAAe,SAAS,EAAE;QAC1B,iBAAiB,WAAW,EAAE;QAC9B,cAAc,QAAQ,EAAE;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,oBAAoB,CAAC,KAAsF;IACzH,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9C,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW;QAC1F,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;KACrD,CAAC,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAiB,EAAE,WAAmB;IAC7E,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAwB,CAAC;QACtG,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;YACvC,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClF,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,EAAE,OAAO,EAAE,aAAa,IAAI,KAAK,EAAE,aAAa,CAAC;QACnE,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnF,OAAO,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,qBAAqB,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7I,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AA8BD,MAAM,YAAY,GAAG,IAAI,OAAO,EAA0B,CAAC;AAE3D,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAC,GAAa;IAC1C,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC;IAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACzC,OAAO;QACL,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,WAAW,IAAI,IAAI;QACxE,MAAM,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,MAAM;QAC5E,QAAQ,EAAE,MAAM,KAAK,UAAU;QAC/B,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM;QAClD,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,sBAAsB,CAAC;QACvG,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAI,IAAO,EAAE,UAAuC;IAChF,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,GAAI,IAAgC,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;IACzI,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAC7C,CAAC;AAED,+EAA+E;AAE/E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAE/J,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,MAAM,CAAS;IACf,IAAI,CAAgB;IACpB,MAAM,CAAgB;IACtB,aAAa,CAAgB;IAC7B,SAAS,CAAgB;IACzB,WAAW,CAAgB;IAC3B,iBAAiB,CAAgB;IACjC,IAAI,CAAU;IACvB,sEAAsE;IAC7D,SAAS,CAAU;IAC5B,iFAAiF;IACxE,iBAAiB,CAAU;IACpC,gFAAgF;IACvE,MAAM,CAA2B;IAE1C,YAAY,OAAe,EAAE,MAI5B;QACC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,qBAAqB,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;QAC/H,IAAI,CAAC,SAAS,GAAG,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC;QACpD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC;QAChH,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACnE,CAAC;CACF;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC;QAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC/H,CAAC;AAED,SAAS,YAAY,CAAC,GAAa,EAAE,IAAgC,EAAE,GAAW;IAChF,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACvD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,EAAE,mBAAmB,IAAI,IAAI,EAAE,WAAW,EAAE,mBAAmB,CAAC;IAC9E,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACjF,CAAC;AAED,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAa,EAAE,OAAqC;IAC7F,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,+FAA+F;IAC/F,MAAM,IAAI,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAC,qBAAqB;QACpF,CAAC,CAAC,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;YAC5C,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5G,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;QAC3D,CAAC,CAAC,IAAI,KAAK,qBAAqB,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC;IAC9I,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACzC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;QAChC,aAAa,EAAE,OAAO,IAAI,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI;QACpF,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,QAAQ,EAAE,YAAY,IAAI,IAAI,EAAE,WAAW,IAAI,IAAI;QACtH,iBAAiB,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;KACvG,CAAC,CAAC;AACL,CAAC;AAMD,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,IAAgC;IACnF,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,OAAO,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,MAAM,aAAa,GAAG,OAAO,IAAI,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5F,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,qCAAqC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,MAAM,KAAK,iBAAiB,CAAC,CAAC;QAAE,OAAO,oBAAoB,CAAC;IACrJ,IAAI,MAAM,KAAK,GAAG,IAAI,IAAI,KAAK,yBAAyB;QAAE,OAAO,aAAa,CAAC;IAC/E,IAAI,MAAM,IAAI,GAAG,IAAI,aAAa,KAAK,qBAAqB;QAAE,OAAO,gBAAgB,CAAC;IACtF,IAAI,MAAM,KAAK,GAAG,IAAI,aAAa,KAAK,mBAAmB;QAAE,OAAO,WAAW,CAAC;IAChF,kGAAkG;IAClG,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAC7F,+EAA+E;IAC/E,6EAA6E;IAC7E,yEAAyE;IACzE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC1C,OAAO,OAAO,CAAC,CAAC,+EAA+E;AACjG,CAAC;AAsBD,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,MAAoB,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC/F,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,OAAgC;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,OAAO,YAAY,OAAO;QAAE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,EAAE,GAAI,OAAkC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,OAA+B,EAAE,IAAY;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAuB,EAAE,OAA+B;IAC5F,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,uBAAuB,IAAI,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAE9C,OAAO,CAAC,KAAK,EAAE,KAAwB,EAAE,IAAkB,EAAqB,EAAE;QAChF,MAAM,SAAS,GAAG,OAAO,OAAO,KAAK,WAAW,IAAI,KAAK,YAAY,OAAO,CAAC;QAC7E,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAE,KAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,KAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/F,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,KAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACpG,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,mBAAmB,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACzF,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,KAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;QAChG,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,KAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,kBAAkB;gBAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QAEpG,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrE,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE3D,MAAM,GAAG,GAAG,KAAK,EAAE,eAAwB,EAAE,UAAyB,EAAqB,EAAE;YAC3F,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;YACtB,IAAI,QAAQ,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;YACnF,IAAI,UAAU,GAAG,eAAe,CAAC;YACjC,IAAI,GAAG,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;YACvE,6EAA6E;YAC7E,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,IAAgC,EAAE,EAAE;gBACnE,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,QAAQ,EAAE,UAAU,IAAI,IAAI,EAAE,SAAS,CAAC;gBAC7F,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC;gBAC7E,IAAI,CAAC,cAAc,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;gBACpG,IAAI,CAAC,gBAAgB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;YACvG,CAAC,CAAC;YACF,MAAM,MAAM,GAAG,CAAC,GAAa,EAAE,OAAgB,EAAE,EAAE;gBACjD,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE;oBACpB,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC9E,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC1D,CAAC,CAAC;gBACH,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YACF,OAAO,IAAI,EAAE,CAAC;gBACZ,QAAQ,EAAE,CAAC;gBAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;gBACnC,IAAI,UAAU,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;oBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;oBAC1C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAChG,WAAW,CAAC,uBAAuB,CAAC,GAAG,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/I,CAAC;gBACD,MAAM,UAAU,GAAG,uBAAuB,IAAI,WAAW,CAAC;gBAC1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC;gBACvD,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAO,EAAE,CAAC;;oBAAM,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChG,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB;oBACpC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/H,IAAI,GAAa,CAAC;gBAClB,IAAI,CAAC;oBACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACpI,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,MAAM,EAAE,OAAO;wBAAE,MAAM,GAAG,CAAC,CAAC,kDAAkD;oBAClF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;oBAC5D,IAAI,QAAQ,IAAI,WAAW,IAAI,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,YAAY,EAAE,CAAC;wBACrE,MAAM,IAAI,gBAAgB,CAAC,2CAA2C,UAAU,CAAC,CAAC,aAAc,GAAa,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE;4BAC/H,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,aAAa,EAAE,mBAAmB;4BAC9E,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC;yBACxG,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC1B,UAAU,GAAG,IAAI,CAAC;oBAClB,SAAS;gBACX,CAAC;wBAAS,CAAC;oBACT,IAAI,KAAK;wBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;oBAC/B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChD,CAAC;gBACD,IAAI,IAAI,GAA+B,IAAI,CAAC;gBAC5C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;oBAAE,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClF,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACpB,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACpD,IAAI,IAAI,KAAK,OAAO;oBAAE,OAAO,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAChD,IAAI,IAAY,CAAC;gBACjB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC9C,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;oBAClC,gFAAgF;oBAChF,IAAI,UAAU,IAAI,gBAAgB;wBAAE,OAAO,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAC9D,gBAAgB,GAAG,IAAI,CAAC;oBAAC,IAAI,GAAG,CAAC,CAAC;gBACpC,CAAC;qBAAM,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBACrC,IAAI,cAAc,IAAI,UAAU;wBAAE,OAAO,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBAC3D,cAAc,EAAE,CAAC;oBAAC,IAAI,GAAG,MAAM,IAAI,MAAM,CAAC;gBAC5C,CAAC;qBAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;gBAClE,CAAC;qBAAM,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;oBACnC,IAAI,GAAG,MAAM,IAAI,MAAM,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,yBAAyB;gBACnD,CAAC;gBACD,IAAI,QAAQ,IAAI,WAAW,IAAI,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,YAAY;oBAAE,OAAO,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC/F,KAAK,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACxC,IAAI,IAAI,GAAG,CAAC;oBAAE,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACxC,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QACF,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAiB,CAAC;AACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "madeonsol-x402",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "Official TypeScript SDK for the MadeOnSol Solana API — KOL wallet tracking, Pump.fun deployer intelligence, x402 micropayments, and the all-DEX trade firehose. Free tier at madeonsol.com/pricing.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"prebuild": "node ../gen-version.mjs",
|
|
20
20
|
"build": "tsc",
|
|
21
21
|
"typecheck": "tsc --noEmit",
|
|
22
|
-
"test": "npm run build && node test/smoke.mjs && node --test test/payment-policy.test.mjs test/stream.test.mjs test/contract.test.mjs",
|
|
22
|
+
"test": "npm run build && node test/smoke.mjs && node --test test/payment-policy.test.mjs test/recovery.test.mjs test/stream.test.mjs test/contract.test.mjs",
|
|
23
23
|
"preflight": "bash ../../scripts/preflight-publish.sh",
|
|
24
24
|
"prepublishOnly": "npm run preflight && npm run build"
|
|
25
25
|
},
|