madeonsol-x402 2.7.0 → 3.0.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.
@@ -0,0 +1,104 @@
1
+ export declare const PAYMENT_RECOVERY_HEADER = "PAYMENT-RECOVERY";
2
+ export declare const X402_RECOVERY_VERSION = 1;
3
+ export type PaymentRail = "solana" | "rhc";
4
+ /**
5
+ * Canonical request identity (server: x402RequestHash). sha256 of
6
+ * JSON ["madeonsol-x402-request-v1", METHOD, pathname, sorted query pairs];
7
+ * pairs are URLSearchParams entries sorted by key, then value (UTF-16 order).
8
+ */
9
+ export declare function x402RequestHash(method: string, url: string | URL): Promise<string>;
10
+ /** The exact 5-line UTF-8 message the payer signs (no trailing newline). */
11
+ export declare function recoveryMessage(paymentId: string, requestHash: string, issuedAt: number): string;
12
+ /** base64(JSON {version, paymentId, requestHash, issuedAt, signature}) — exactly these keys. */
13
+ export declare function encodeRecoveryHeader(proof: {
14
+ paymentId: string;
15
+ requestHash: string;
16
+ issuedAt: number;
17
+ signature: string;
18
+ }): string;
19
+ /**
20
+ * Local payment identity from the proof header the client sent.
21
+ * Solana: sha256 of the base64-decoded payload.transaction bytes.
22
+ * RHC: sha256(JSON ["rhc-x402-eip3009-v1", "eip155:4663", USDG, from, nonce]) (lower-case).
23
+ */
24
+ export declare function paymentIdFromProof(rail: PaymentRail, proofHeader: string): Promise<string | null>;
25
+ export interface PaidResultProvenance {
26
+ paymentId: string | null;
27
+ requestHash: string | null;
28
+ /** X-Paid-Result-Status: result_stored | result_not_stored | paid_result_missing. */
29
+ status: string | null;
30
+ /** X-Paid-Result-Source: live (this run) | stored (a replay of the stored bytes). */
31
+ source: string | null;
32
+ /** X-Paid-Result-Origin: original | deferred. */
33
+ origin: string | null;
34
+ /** True when the answer was produced AFTER the payment by a deferred run: it is not data from paidAt. */
35
+ deferred: boolean;
36
+ stored: boolean | null;
37
+ paidAt: string | null;
38
+ generatedAt: string | null;
39
+ /** sha256 of the body bytes; a stored replay is byte-identical to the first answer. */
40
+ sha256: string | null;
41
+ /** Number of sends of this same proof (1 = no recovery was needed). */
42
+ attempts: number;
43
+ }
44
+ /** Provenance headers of a paid answer, or null when the server sent none (pre-PAY-05). */
45
+ export declare function readPaidResult(res: Response): PaidResultProvenance | null;
46
+ /** Additive: `{...data, _x402_payment}` for objects, `{data, _x402_payment}` otherwise. */
47
+ export declare function withPaidResult<T>(data: T, provenance: PaidResultProvenance | null): T | Record<string, unknown>;
48
+ export declare class X402PaymentError extends Error {
49
+ readonly status: number;
50
+ readonly code: string | null;
51
+ readonly reason: string | null;
52
+ readonly paymentStatus: string | null;
53
+ readonly paymentId: string | null;
54
+ readonly requestHash: string | null;
55
+ readonly retryAfterSeconds: number | null;
56
+ readonly body: unknown;
57
+ /** Still recoverable with the SAME proof (never by a new payment). */
58
+ readonly retryable: boolean;
59
+ /** Only a proven `not_paid` (HTTP 402) allows a new payment for this request. */
60
+ readonly newPaymentAllowed: boolean;
61
+ /** Continue recovery with the same proof and URL (present when `retryable`). */
62
+ readonly resume?: () => Promise<Response>;
63
+ constructor(message: string, fields: {
64
+ status: number;
65
+ code?: string | null;
66
+ reason?: string | null;
67
+ paymentStatus?: string | null;
68
+ paymentId?: string | null;
69
+ requestHash?: string | null;
70
+ retryAfterSeconds?: number | null;
71
+ body?: unknown;
72
+ resume?: () => Promise<Response>;
73
+ cause?: unknown;
74
+ });
75
+ }
76
+ /** Build a coded error from a non-2xx paid response; `message` keeps each SDK's historic prefix. */
77
+ export declare function x402PaymentErrorFrom(res: Response, message: (bodyText: string) => string): Promise<X402PaymentError>;
78
+ export type PaidResponseKind = "final" | "signature_required" | "in_progress" | "result_missing" | "uncertain" | "gateway" | "rate_limited";
79
+ /** Classify one answer to a paid GET (server contract § 2.3 + § 9.3). */
80
+ export declare function classifyPaidResponse(status: number, body: Record<string, any> | null): PaidResponseKind;
81
+ export interface RecoveryOptions {
82
+ /** Total sends of one proof, the original included. Default 8. */
83
+ maxAttempts?: number;
84
+ /** Wall-time bound of the recovery phase. Default 600 000 ms (10 min). */
85
+ maxElapsedMs?: number;
86
+ /** Per-send timeout. Default none (the caller's signal / transport decide). */
87
+ attemptTimeoutMs?: number;
88
+ /** Deferred-run retries after `paid_result_missing` (contract: 1–2). Default 2. */
89
+ maxResultMissingRetries?: number;
90
+ /** Test hooks. */
91
+ sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
92
+ now?: () => number;
93
+ }
94
+ export interface RecoveringFetchOptions extends RecoveryOptions {
95
+ rail: PaymentRail;
96
+ /** Payer signature over the UTF-8 message: Solana base58 ed25519, RHC 0x EIP-191 personal_sign. */
97
+ sign: (message: string) => Promise<string>;
98
+ }
99
+ /**
100
+ * Wrap a transport so a paid GET survives a lost response. Requests without a
101
+ * payment proof, and non-GET requests, are passed through exactly once.
102
+ */
103
+ export declare function createRecoveringFetch(transport: typeof fetch, options: RecoveringFetchOptions): typeof fetch;
104
+ //# sourceMappingURL=x402-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-recovery.d.ts","sourceRoot":"","sources":["../src/x402-recovery.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "madeonsol-x402",
3
- "version": "2.7.0",
3
+ "version": "3.0.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
  },