@run402/sdk 4.121.0 → 4.122.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.
Files changed (34) hide show
  1. package/dist/namespaces/deploy.d.ts.map +1 -1
  2. package/dist/namespaces/deploy.js +3 -0
  3. package/dist/namespaces/deploy.js.map +1 -1
  4. package/dist/namespaces/deploy.types.d.ts +4 -2
  5. package/dist/namespaces/deploy.types.d.ts.map +1 -1
  6. package/dist/namespaces/deploy.types.js +4 -0
  7. package/dist/namespaces/deploy.types.js.map +1 -1
  8. package/dist/namespaces/pay.d.ts +7 -0
  9. package/dist/namespaces/pay.d.ts.map +1 -1
  10. package/dist/namespaces/pay.js +5 -0
  11. package/dist/namespaces/pay.js.map +1 -1
  12. package/dist/node/_paid-stack.d.ts +8 -3
  13. package/dist/node/_paid-stack.d.ts.map +1 -1
  14. package/dist/node/_paid-stack.js.map +1 -1
  15. package/dist/node/lightning-paid-fetch.d.ts.map +1 -1
  16. package/dist/node/lightning-paid-fetch.js +2 -0
  17. package/dist/node/lightning-paid-fetch.js.map +1 -1
  18. package/dist/node/mpp-pay-executor.d.ts +40 -0
  19. package/dist/node/mpp-pay-executor.d.ts.map +1 -0
  20. package/dist/node/mpp-pay-executor.js +352 -0
  21. package/dist/node/mpp-pay-executor.js.map +1 -0
  22. package/dist/node/paid-fetch.d.ts +2 -1
  23. package/dist/node/paid-fetch.d.ts.map +1 -1
  24. package/dist/node/paid-fetch.js +44 -18
  25. package/dist/node/paid-fetch.js.map +1 -1
  26. package/dist/node/payment-attempts.d.ts +2 -2
  27. package/dist/node/payment-attempts.d.ts.map +1 -1
  28. package/dist/node/payment-attempts.js +2 -2
  29. package/dist/node/payment-attempts.js.map +1 -1
  30. package/dist/node/payment-offers.d.ts +35 -0
  31. package/dist/node/payment-offers.d.ts.map +1 -0
  32. package/dist/node/payment-offers.js +145 -0
  33. package/dist/node/payment-offers.js.map +1 -0
  34. package/package.json +1 -1
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Every payment a 402 offers, whichever protocol states it: x402 entries from
3
+ * `PAYMENT-REQUIRED`, MPP challenges from `WWW-Authenticate: Payment`. The
4
+ * wrong-rail error lists these and names the rail switch that would pay the
5
+ * first one (spec `tenant-x402-payment-client-surface`).
6
+ *
7
+ * Parsed without the paid stack: an x402-only install has no `mppx`, and the
8
+ * error still has to say what the seller wanted.
9
+ */
10
+ const LNBTC_PREFIX = "lnbtc:";
11
+ export function paymentOffers(response) {
12
+ return [...x402Offers(response), ...mppOffers(response)];
13
+ }
14
+ export function x402Offers(response) {
15
+ const header = response.headers.get("PAYMENT-REQUIRED");
16
+ if (!header)
17
+ return [];
18
+ try {
19
+ // base64url decoding accepts both alphabets, so it reads either seller encoding.
20
+ const decoded = JSON.parse(Buffer.from(header, "base64url").toString("utf8"));
21
+ if (!Array.isArray(decoded.accepts))
22
+ return [];
23
+ return decoded.accepts.flatMap((accept) => {
24
+ const entry = accept;
25
+ return typeof entry?.scheme === "string"
26
+ ? [{ protocol: "x402", method: entry.scheme, network: typeof entry.network === "string" ? entry.network : null }]
27
+ : [];
28
+ });
29
+ }
30
+ catch {
31
+ return [];
32
+ }
33
+ }
34
+ /** The `Payment` challenges in `WWW-Authenticate`, with their decoded `request`. */
35
+ export function mppChallenges(response) {
36
+ const header = response.headers.get("WWW-Authenticate");
37
+ if (!header)
38
+ return [];
39
+ return splitPaymentChallenges(header).flatMap((params) => {
40
+ if (!params.method || !params.intent)
41
+ return [];
42
+ return [{
43
+ ...(params.id ? { id: params.id } : {}),
44
+ method: params.method,
45
+ intent: params.intent,
46
+ request: decodeRequest(params.request),
47
+ }];
48
+ });
49
+ }
50
+ export function mppOffers(response) {
51
+ return mppChallenges(response).map((challenge) => ({
52
+ protocol: "mpp",
53
+ method: challenge.method,
54
+ intent: challenge.intent,
55
+ network: mppNetwork(challenge),
56
+ }));
57
+ }
58
+ /** `eip155:<chainId>` for a Tempo charge; the request's own network otherwise. */
59
+ function mppNetwork(challenge) {
60
+ const details = challenge.request?.methodDetails;
61
+ if (challenge.method === "tempo" && (typeof details?.chainId === "number" || typeof details?.chainId === "string")) {
62
+ return `eip155:${String(details.chainId)}`;
63
+ }
64
+ return typeof details?.network === "string" ? details.network : null;
65
+ }
66
+ /** The rail that pays an offer: x402 EVM entries, MPP Tempo, and Lightning (either protocol). */
67
+ export function railForOffer(offer) {
68
+ if (offer.method === "lightning" || offer.network?.startsWith(LNBTC_PREFIX))
69
+ return "lightning";
70
+ if (offer.protocol === "mpp")
71
+ return offer.method === "tempo" ? "mpp" : null;
72
+ return offer.method === "exact" ? "x402" : null;
73
+ }
74
+ /** The first offer's rail, when it is not the configured one. */
75
+ export function switchRailFor(offers, configured) {
76
+ for (const offer of offers) {
77
+ const rail = railForOffer(offer);
78
+ if (rail && rail !== configured)
79
+ return rail;
80
+ }
81
+ return null;
82
+ }
83
+ /**
84
+ * RFC 9110 auth-params for every `Payment` scheme in the header. A header may
85
+ * carry several challenges, comma-joined; a new challenge starts where a
86
+ * scheme token is followed by a space instead of `=`.
87
+ */
88
+ function splitPaymentChallenges(header) {
89
+ const challenges = [];
90
+ let index = 0;
91
+ while (index < header.length) {
92
+ index = skip(header, index, " \t,");
93
+ const token = readToken(header, index);
94
+ if (!token)
95
+ break;
96
+ index += token.length;
97
+ if (header[index] !== "=") {
98
+ challenges.push({ scheme: token.toLowerCase(), params: {} });
99
+ continue;
100
+ }
101
+ const current = challenges[challenges.length - 1];
102
+ const parsed = readParamValue(header, index + 1);
103
+ index = parsed.next;
104
+ if (current)
105
+ current.params[token.toLowerCase()] = parsed.value;
106
+ }
107
+ return challenges.filter((challenge) => challenge.scheme === "payment").map((challenge) => challenge.params);
108
+ }
109
+ function skip(value, index, chars) {
110
+ while (index < value.length && chars.includes(value[index]))
111
+ index += 1;
112
+ return index;
113
+ }
114
+ function readToken(value, index) {
115
+ const match = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+/.exec(value.slice(index));
116
+ return match ? match[0] : "";
117
+ }
118
+ function readParamValue(value, index) {
119
+ index = skip(value, index, " \t");
120
+ if (value[index] !== "\"") {
121
+ const token = /^[^,\s]*/.exec(value.slice(index))[0];
122
+ return { value: token, next: index + token.length };
123
+ }
124
+ let out = "";
125
+ let cursor = index + 1;
126
+ while (cursor < value.length && value[cursor] !== "\"") {
127
+ if (value[cursor] === "\\" && cursor + 1 < value.length)
128
+ cursor += 1;
129
+ out += value[cursor];
130
+ cursor += 1;
131
+ }
132
+ return { value: out, next: cursor + 1 };
133
+ }
134
+ function decodeRequest(encoded) {
135
+ if (!encoded)
136
+ return null;
137
+ try {
138
+ const value = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
139
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ }
145
+ //# sourceMappingURL=payment-offers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-offers.js","sourceRoot":"","sources":["../../src/node/payment-offers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@run402/sdk",
3
- "version": "4.121.0",
3
+ "version": "4.122.0",
4
4
  "description": "Typed TypeScript client for the Run402 API. Kernel shared by the run402-mcp server, the run402 CLI, and user-deployed run402 functions.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",