@mooring-live/x402-client 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/client.d.ts +3 -1
- package/dist/client.js +28 -8
- package/dist/client.js.map +1 -1
- package/dist/denial.d.ts +23 -0
- package/dist/denial.js +39 -1
- package/dist/denial.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/scheme.d.ts +6 -0
- package/dist/scheme.js +14 -2
- package/dist/scheme.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# @mooring-live/x402-client
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@mooring-live/x402-client)
|
|
4
|
+
|
|
3
5
|
Pay [x402](https://x402.org)-protected APIs from a **Mooring spending card** on Stellar.
|
|
4
6
|
|
|
5
7
|
A card is a Soroban custom account (`__check_auth`) that holds USDC and enforces a spending
|
|
@@ -105,6 +107,19 @@ that could not be read (the pre-check fails **closed**), a facilitator `simulati
|
|
|
105
107
|
re-run pre-check no longer explains, and an on-chain failure whose diagnostics do not name the
|
|
106
108
|
card.
|
|
107
109
|
|
|
110
|
+
## Allowing a merchant from a denial
|
|
111
|
+
|
|
112
|
+
A `not_allowlisted` denial carries `err.merchant` (`payTo`, and when known `amount`, `network` and
|
|
113
|
+
`url`, the service URL with its query string removed). When `url` is known the message ends with a
|
|
114
|
+
link the card's owner can open to allow the merchant:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
https://app.mooring.live/allow?card=<C…>&url=<service url without query>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`allowMerchantUrl(appUrl, card, serviceUrl)` builds the same link. Point it at another deployment
|
|
121
|
+
of the app with the `appUrl` option (default `https://app.mooring.live`).
|
|
122
|
+
|
|
108
123
|
## Options
|
|
109
124
|
|
|
110
125
|
| Option | Type | Default | Meaning |
|
|
@@ -114,6 +129,7 @@ card.
|
|
|
114
129
|
| `network` | `"stellar:testnet" \| "stellar:pubnet"` | — | CAIP-2 network |
|
|
115
130
|
| `rpcUrl` | `string` | testnet default; **required** on pubnet | Soroban RPC endpoint |
|
|
116
131
|
| `precheck` | `boolean` | `true` | run the local policy mirror before signing |
|
|
132
|
+
| `appUrl` | `string` | `https://app.mooring.live` | base URL of the Mooring app used in the allow link |
|
|
117
133
|
| `onDenial` | `(d: CardPolicyDenied) => void` | — | called at every denial stage |
|
|
118
134
|
| `onPaymentError` | `(e: PaymentError) => void` | — | called for every non-policy failure |
|
|
119
135
|
| `fetch` | `typeof fetch` | `globalThis.fetch` | transport (`createMooringFetch` only) |
|
package/dist/client.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export interface MooringClientOptions {
|
|
|
9
9
|
rpcUrl?: string;
|
|
10
10
|
/** Run the local policy pre-check before signing (default true). */
|
|
11
11
|
precheck?: boolean;
|
|
12
|
+
/** Base URL of the Mooring app used in the allow link on a denial (default `DEFAULT_APP_URL`). */
|
|
13
|
+
appUrl?: string;
|
|
12
14
|
/** Called whenever the card's policy denies a payment, at any stage. */
|
|
13
15
|
onDenial?: (denial: CardPolicyDenied) => void;
|
|
14
16
|
/** Called whenever a payment fails for a reason that is *not* the card's policy. */
|
|
@@ -52,7 +54,7 @@ declare class FailureBox {
|
|
|
52
54
|
* surface the typed reason. `createMooringFetch` is what turns them into
|
|
53
55
|
* thrown `CardPolicyDenied` / `PaymentError`.
|
|
54
56
|
*/
|
|
55
|
-
export declare function createMooringClient(opts: MooringClientOptions, box?: FailureBox): x402Client;
|
|
57
|
+
export declare function createMooringClient(opts: MooringClientOptions, box?: FailureBox, requestUrl?: string): x402Client;
|
|
56
58
|
/**
|
|
57
59
|
* A `fetch` that pays x402-protected requests from the card, and rejects with
|
|
58
60
|
* `CardPolicyDenied` (the card's policy refused) or `PaymentError` (anything
|
package/dist/client.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { decodePaymentResponseHeader, wrapFetchWithPayment, x402Client } from "@x402/fetch";
|
|
2
2
|
import { getNetworkPassphrase, getRpcUrl } from "@x402/stellar";
|
|
3
3
|
import { readCardInfo, readMerchants } from "./card.js";
|
|
4
|
-
import { CARD_ERROR_CODES, CardPolicyDenied, PaymentError, cardDenialFromEvents, classifyContractError, } from "./denial.js";
|
|
4
|
+
import { CARD_ERROR_CODES, CardPolicyDenied, DEFAULT_APP_URL, PaymentError, cardDenialFromEvents, classifyContractError, isAbsoluteHttpUrl, stripQuery, } from "./denial.js";
|
|
5
5
|
import { precheck } from "./precheck.js";
|
|
6
6
|
import { reconcileSettlement } from "./reconcile.js";
|
|
7
7
|
import { CardExactStellarScheme } from "./scheme.js";
|
|
@@ -40,7 +40,7 @@ class FailureBox {
|
|
|
40
40
|
* surface the typed reason. `createMooringFetch` is what turns them into
|
|
41
41
|
* thrown `CardPolicyDenied` / `PaymentError`.
|
|
42
42
|
*/
|
|
43
|
-
export function createMooringClient(opts, box = new FailureBox()) {
|
|
43
|
+
export function createMooringClient(opts, box = new FailureBox(), requestUrl) {
|
|
44
44
|
const rpcUrl = getRpcUrl(opts.network, opts.rpcUrl ? { url: opts.rpcUrl } : undefined);
|
|
45
45
|
const passphrase = getNetworkPassphrase(opts.network);
|
|
46
46
|
const scheme = new CardExactStellarScheme({
|
|
@@ -48,12 +48,25 @@ export function createMooringClient(opts, box = new FailureBox()) {
|
|
|
48
48
|
agent: opts.agent,
|
|
49
49
|
network: opts.network,
|
|
50
50
|
rpcUrl: opts.rpcUrl,
|
|
51
|
+
appUrl: opts.appUrl,
|
|
52
|
+
requestUrl,
|
|
51
53
|
// A failure raised inside the scheme (the card refusing the enforcing
|
|
52
54
|
// simulation, or the CAP-71 credential guard) travels out as a thrown
|
|
53
55
|
// error, but it must reach the hooks and the box like every other stage.
|
|
54
56
|
onDenial: (denial) => box.set(denial, opts),
|
|
55
57
|
onPaymentError: (error) => box.set(error, opts),
|
|
56
58
|
});
|
|
59
|
+
/** What a denial carries so the owner can allow the merchant: its terms, the card and the app. */
|
|
60
|
+
const denialContext = (req) => ({
|
|
61
|
+
merchant: {
|
|
62
|
+
payTo: req.payTo,
|
|
63
|
+
amount: req.amount,
|
|
64
|
+
network: req.network,
|
|
65
|
+
...(requestUrl ? { url: requestUrl } : {}),
|
|
66
|
+
},
|
|
67
|
+
card: opts.card,
|
|
68
|
+
appUrl: opts.appUrl ?? DEFAULT_APP_URL,
|
|
69
|
+
});
|
|
57
70
|
const evaluate = async (req) => {
|
|
58
71
|
const [info, merchants] = await Promise.all([
|
|
59
72
|
readCardInfo(rpcUrl, passphrase, opts.card),
|
|
@@ -79,6 +92,7 @@ export function createMooringClient(opts, box = new FailureBox()) {
|
|
|
79
92
|
return new CardPolicyDenied(parsed.reason, stage, {
|
|
80
93
|
contractError: parsed.code,
|
|
81
94
|
detail: text || undefined,
|
|
95
|
+
...denialContext(req),
|
|
82
96
|
});
|
|
83
97
|
}
|
|
84
98
|
let reason = null;
|
|
@@ -88,10 +102,11 @@ export function createMooringClient(opts, box = new FailureBox()) {
|
|
|
88
102
|
catch {
|
|
89
103
|
/* the card could not be read; fall through to the reason string */
|
|
90
104
|
}
|
|
91
|
-
if (reason)
|
|
92
|
-
return new CardPolicyDenied(reason, stage, { detail: text || undefined });
|
|
105
|
+
if (reason) {
|
|
106
|
+
return new CardPolicyDenied(reason, stage, { detail: text || undefined, ...denialContext(req) });
|
|
107
|
+
}
|
|
93
108
|
if (text.includes("simulation_failed")) {
|
|
94
|
-
return new CardPolicyDenied("unknown", stage, { detail: text || undefined });
|
|
109
|
+
return new CardPolicyDenied("unknown", stage, { detail: text || undefined, ...denialContext(req) });
|
|
95
110
|
}
|
|
96
111
|
return new PaymentError({ kind: "rejected", detail: text || undefined });
|
|
97
112
|
};
|
|
@@ -139,6 +154,7 @@ export function createMooringClient(opts, box = new FailureBox()) {
|
|
|
139
154
|
return new CardPolicyDenied(parsed?.reason ?? "unknown", "settle", {
|
|
140
155
|
contractError: parsed?.code,
|
|
141
156
|
detail: `${reason} tx=${hash}`,
|
|
157
|
+
...denialContext(req),
|
|
142
158
|
});
|
|
143
159
|
};
|
|
144
160
|
const client = x402Client.fromConfig({
|
|
@@ -156,11 +172,11 @@ export function createMooringClient(opts, box = new FailureBox()) {
|
|
|
156
172
|
catch (err) {
|
|
157
173
|
// Fail closed: a card we cannot read is a card we cannot spend from.
|
|
158
174
|
const detail = `pre-check unavailable: ${err instanceof Error ? err.message : String(err)}`;
|
|
159
|
-
box.set(new CardPolicyDenied("unknown", "precheck", { detail }), opts);
|
|
175
|
+
box.set(new CardPolicyDenied("unknown", "precheck", { detail, ...denialContext(selectedRequirements) }), opts);
|
|
160
176
|
return { abort: true, reason: detail };
|
|
161
177
|
}
|
|
162
178
|
if (reason) {
|
|
163
|
-
box.set(new CardPolicyDenied(reason, "precheck"), opts);
|
|
179
|
+
box.set(new CardPolicyDenied(reason, "precheck", denialContext(selectedRequirements)), opts);
|
|
164
180
|
return { abort: true, reason };
|
|
165
181
|
}
|
|
166
182
|
});
|
|
@@ -191,7 +207,11 @@ export function createMooringFetch(opts) {
|
|
|
191
207
|
const transport = opts.fetch ?? globalThis.fetch;
|
|
192
208
|
return (async (input, init) => {
|
|
193
209
|
const box = new FailureBox();
|
|
194
|
-
|
|
210
|
+
// Only an absolute http(s) URL can become an allow link; anything else
|
|
211
|
+
// (a relative path, another scheme) is left off the denial entirely.
|
|
212
|
+
const rawUrl = input instanceof Request ? input.url : String(input);
|
|
213
|
+
const requestUrl = isAbsoluteHttpUrl(rawUrl) ? stripQuery(rawUrl) : undefined;
|
|
214
|
+
const wrapped = wrapFetchWithPayment(transport, createMooringClient(opts, box, requestUrl));
|
|
195
215
|
try {
|
|
196
216
|
const res = await wrapped(input, init);
|
|
197
217
|
// Verify and settle failures come back as a non-2xx response, not a
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5F,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/denial.d.ts
CHANGED
|
@@ -45,14 +45,37 @@ export declare function cardDenialFromEvents(events: readonly xdr.DiagnosticEven
|
|
|
45
45
|
code: number;
|
|
46
46
|
reason: DenialReason;
|
|
47
47
|
} | null;
|
|
48
|
+
/** The merchant a denied payment was addressed to, as far as the client knows. */
|
|
49
|
+
export interface DeniedMerchant {
|
|
50
|
+
payTo: string;
|
|
51
|
+
url?: string;
|
|
52
|
+
amount?: string;
|
|
53
|
+
network?: string;
|
|
54
|
+
}
|
|
55
|
+
/** The hosted Mooring web app, used to build "allow this merchant" links. */
|
|
56
|
+
export declare const DEFAULT_APP_URL = "https://app.mooring.live";
|
|
57
|
+
/**
|
|
58
|
+
* `origin + pathname` of an absolute URL (drops query and fragment). Input
|
|
59
|
+
* that does not parse (a relative URL, say) is cut at its first `?` or `#`,
|
|
60
|
+
* so a query string can never pass through.
|
|
61
|
+
*/
|
|
62
|
+
export declare function stripQuery(url: string): string;
|
|
63
|
+
/** True for an absolute `http:` / `https:` URL. */
|
|
64
|
+
export declare function isAbsoluteHttpUrl(url: string): boolean;
|
|
65
|
+
/** Link to the web app's allow page for a card and a paid service URL (query and fragment are dropped). */
|
|
66
|
+
export declare function allowMerchantUrl(appBaseUrl: string, card: string, serviceUrl: string): string;
|
|
48
67
|
export declare class CardPolicyDenied extends Error {
|
|
49
68
|
readonly reason: DenialReason;
|
|
50
69
|
readonly stage: DenialStage;
|
|
51
70
|
readonly contractError?: number;
|
|
52
71
|
readonly detail?: string;
|
|
72
|
+
readonly merchant?: DeniedMerchant;
|
|
53
73
|
constructor(reason: DenialReason, stage: DenialStage, opts?: {
|
|
54
74
|
contractError?: number;
|
|
55
75
|
detail?: string;
|
|
76
|
+
merchant?: DeniedMerchant;
|
|
77
|
+
card?: string;
|
|
78
|
+
appUrl?: string;
|
|
56
79
|
});
|
|
57
80
|
}
|
|
58
81
|
/**
|
package/dist/denial.js
CHANGED
|
@@ -73,18 +73,56 @@ export function cardDenialFromEvents(events, card) {
|
|
|
73
73
|
}
|
|
74
74
|
return null;
|
|
75
75
|
}
|
|
76
|
+
/** The hosted Mooring web app, used to build "allow this merchant" links. */
|
|
77
|
+
export const DEFAULT_APP_URL = "https://app.mooring.live";
|
|
78
|
+
/**
|
|
79
|
+
* `origin + pathname` of an absolute URL (drops query and fragment). Input
|
|
80
|
+
* that does not parse (a relative URL, say) is cut at its first `?` or `#`,
|
|
81
|
+
* so a query string can never pass through.
|
|
82
|
+
*/
|
|
83
|
+
export function stripQuery(url) {
|
|
84
|
+
try {
|
|
85
|
+
const u = new URL(url);
|
|
86
|
+
return u.origin + u.pathname;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
const cut = url.search(/[?#]/);
|
|
90
|
+
return cut === -1 ? url : url.slice(0, cut);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** True for an absolute `http:` / `https:` URL. */
|
|
94
|
+
export function isAbsoluteHttpUrl(url) {
|
|
95
|
+
try {
|
|
96
|
+
const { protocol } = new URL(url);
|
|
97
|
+
return protocol === "http:" || protocol === "https:";
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Link to the web app's allow page for a card and a paid service URL (query and fragment are dropped). */
|
|
104
|
+
export function allowMerchantUrl(appBaseUrl, card, serviceUrl) {
|
|
105
|
+
const base = appBaseUrl.endsWith("/") ? appBaseUrl.slice(0, -1) : appBaseUrl;
|
|
106
|
+
return `${base}/allow?card=${card}&url=${encodeURIComponent(stripQuery(serviceUrl))}`;
|
|
107
|
+
}
|
|
76
108
|
export class CardPolicyDenied extends Error {
|
|
77
109
|
reason;
|
|
78
110
|
stage;
|
|
79
111
|
contractError;
|
|
80
112
|
detail;
|
|
113
|
+
merchant;
|
|
81
114
|
constructor(reason, stage, opts = {}) {
|
|
82
|
-
|
|
115
|
+
const appUrl = opts.appUrl ?? DEFAULT_APP_URL;
|
|
116
|
+
const link = reason === "not_allowlisted" && opts.merchant?.url && opts.card && appUrl
|
|
117
|
+
? ` — allow it: ${allowMerchantUrl(appUrl, opts.card, opts.merchant.url)}`
|
|
118
|
+
: "";
|
|
119
|
+
super(`card policy denied (${reason}) at ${stage}${opts.contractError ? ` [contract error #${opts.contractError}]` : ""}${opts.detail ? `: ${opts.detail}` : ""}${link}`);
|
|
83
120
|
this.name = "CardPolicyDenied";
|
|
84
121
|
this.reason = reason;
|
|
85
122
|
this.stage = stage;
|
|
86
123
|
this.contractError = opts.contractError;
|
|
87
124
|
this.detail = opts.detail;
|
|
125
|
+
this.merchant = opts.merchant;
|
|
88
126
|
}
|
|
89
127
|
}
|
|
90
128
|
/**
|
package/dist/denial.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"denial.js","sourceRoot":"","sources":["../src/denial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAY,MAAM,sBAAsB,CAAC;AAiBhE,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAiC;IAC5D,CAAC,EAAE,eAAe;IAClB,CAAC,EAAE,eAAe;IAClB,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,aAAa;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,CAAC,EAAE,2CAA2C;IAC9C,CAAC,EAAE,6EAA6E;IAChF,CAAC,EAAE,sBAAsB;IACzB,CAAC,EAAE,+BAA+B;IAClC,CAAC,EAAE,wBAAwB;IAC3B,CAAC,EAAE,+CAA+C;IAClD,CAAC,EAAE,sDAAsD;IACzD,CAAC,EAAE,iEAAiE;IACpE,CAAC,EAAE,uCAAuC;IAC1C,EAAE,EAAE,wCAAwC;IAC5C,EAAE,EAAE,qEAAqE;IACzE,EAAE,EAAE,yDAAyD;IAC7D,EAAE,EAAE,qDAAqD;CAC1D,CAAC;AAEF,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD,8EAA8E;AAC9E,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;AAC/D,CAAC;AAED,gFAAgF;AAChF,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAsC,EACtC,IAAY;IAEZ,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QACtD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAiD,CAAC;QACpE,IAAI,GAAG,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACvE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,MAAM,CAAe;IACrB,KAAK,CAAc;IACnB,aAAa,CAAU;IACvB,MAAM,CAAU;
|
|
1
|
+
{"version":3,"file":"denial.js","sourceRoot":"","sources":["../src/denial.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { signCardAuthEntries } from "./signer.js";
|
|
2
|
-
export { CARD_ERROR_CODES, CARD_ERRORS, CardPolicyDenied, PaymentError, cardDenialFromEvents, classifyContractError, } from "./denial.js";
|
|
3
|
-
export type { DenialReason, DenialStage } from "./denial.js";
|
|
2
|
+
export { CARD_ERROR_CODES, CARD_ERRORS, CardPolicyDenied, DEFAULT_APP_URL, PaymentError, allowMerchantUrl, cardDenialFromEvents, classifyContractError, } from "./denial.js";
|
|
3
|
+
export type { DeniedMerchant, DenialReason, DenialStage } from "./denial.js";
|
|
4
4
|
export { reconcileSettlement } from "./reconcile.js";
|
|
5
5
|
export type { SettlementOutcome } from "./reconcile.js";
|
|
6
6
|
export { precheck } from "./precheck.js";
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { signCardAuthEntries } from "./signer.js";
|
|
2
|
-
export { CARD_ERROR_CODES, CARD_ERRORS, CardPolicyDenied, PaymentError, cardDenialFromEvents, classifyContractError, } from "./denial.js";
|
|
2
|
+
export { CARD_ERROR_CODES, CARD_ERRORS, CardPolicyDenied, DEFAULT_APP_URL, PaymentError, allowMerchantUrl, cardDenialFromEvents, classifyContractError, } from "./denial.js";
|
|
3
3
|
export { reconcileSettlement } from "./reconcile.js";
|
|
4
4
|
export { precheck } from "./precheck.js";
|
|
5
5
|
export { readCardInfo, readMerchants } from "./card.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/scheme.d.ts
CHANGED
|
@@ -21,6 +21,10 @@ export interface CardSchemeOptions {
|
|
|
21
21
|
network: StellarNetwork;
|
|
22
22
|
/** Required on pubnet; optional on testnet. */
|
|
23
23
|
rpcUrl?: string;
|
|
24
|
+
/** Base URL of the Mooring app used in the allow link (default `DEFAULT_APP_URL`). */
|
|
25
|
+
appUrl?: string;
|
|
26
|
+
/** The (query-stripped) URL being paid for; lets a denial carry the allow link. */
|
|
27
|
+
requestUrl?: string;
|
|
24
28
|
/** Called when the card rejects the payment in the enforcing simulation. */
|
|
25
29
|
onDenial?: (denial: CardPolicyDenied) => void;
|
|
26
30
|
/** Called when the payment fails for a reason that is not the card's policy. */
|
|
@@ -43,6 +47,8 @@ export declare class CardExactStellarScheme implements SchemeNetworkClient {
|
|
|
43
47
|
private readonly network;
|
|
44
48
|
private readonly rpcUrl;
|
|
45
49
|
private readonly passphrase;
|
|
50
|
+
private readonly appUrl?;
|
|
51
|
+
private readonly requestUrl?;
|
|
46
52
|
private readonly onDenial?;
|
|
47
53
|
private readonly onPaymentError?;
|
|
48
54
|
constructor(opts: CardSchemeOptions);
|
package/dist/scheme.js
CHANGED
|
@@ -41,12 +41,16 @@ export class CardExactStellarScheme {
|
|
|
41
41
|
network;
|
|
42
42
|
rpcUrl;
|
|
43
43
|
passphrase;
|
|
44
|
+
appUrl;
|
|
45
|
+
requestUrl;
|
|
44
46
|
onDenial;
|
|
45
47
|
onPaymentError;
|
|
46
48
|
constructor(opts) {
|
|
47
49
|
this.card = opts.card;
|
|
48
50
|
this.agent = opts.agent;
|
|
49
51
|
this.network = opts.network;
|
|
52
|
+
this.appUrl = opts.appUrl;
|
|
53
|
+
this.requestUrl = opts.requestUrl;
|
|
50
54
|
this.onDenial = opts.onDenial;
|
|
51
55
|
this.onPaymentError = opts.onPaymentError;
|
|
52
56
|
this.rpcUrl = getRpcUrl(opts.network, opts.rpcUrl ? { url: opts.rpcUrl } : undefined);
|
|
@@ -94,7 +98,7 @@ export class CardExactStellarScheme {
|
|
|
94
98
|
assertSimulationOk(tx.simulation);
|
|
95
99
|
}
|
|
96
100
|
catch (err) {
|
|
97
|
-
const denial = this.denialFromCard(err);
|
|
101
|
+
const denial = this.denialFromCard(err, req);
|
|
98
102
|
if (!denial)
|
|
99
103
|
throw err;
|
|
100
104
|
this.onDenial?.(denial);
|
|
@@ -121,7 +125,7 @@ export class CardExactStellarScheme {
|
|
|
121
125
|
* so the reason is taken from that fragment and nowhere else. Anything that
|
|
122
126
|
* does not match stays an ordinary error.
|
|
123
127
|
*/
|
|
124
|
-
denialFromCard(err) {
|
|
128
|
+
denialFromCard(err, req) {
|
|
125
129
|
const text = err instanceof Error ? err.message : String(err);
|
|
126
130
|
const fragment = new RegExp(`failed account authentication with error"?,\\s*${this.card}\\s*,[^\\]]*`).exec(text);
|
|
127
131
|
if (!fragment)
|
|
@@ -132,6 +136,14 @@ export class CardExactStellarScheme {
|
|
|
132
136
|
return new CardPolicyDenied(parsed.reason, "simulate", {
|
|
133
137
|
contractError: parsed.code,
|
|
134
138
|
detail: text.split("\n")[0],
|
|
139
|
+
merchant: {
|
|
140
|
+
payTo: req.payTo,
|
|
141
|
+
amount: req.amount,
|
|
142
|
+
network: req.network,
|
|
143
|
+
...(this.requestUrl ? { url: this.requestUrl } : {}),
|
|
144
|
+
},
|
|
145
|
+
card: this.card,
|
|
146
|
+
appUrl: this.appUrl,
|
|
135
147
|
});
|
|
136
148
|
}
|
|
137
149
|
/**
|
package/dist/scheme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheme.js","sourceRoot":"","sources":["../src/scheme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAW,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAO,MAAM,sBAAsB,CAAC;AAM3F,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,EACT,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,2BAA2B,GAAG,CAAC,CAAC;AACtC,uEAAuE;AACvE,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,iBAAyB;IAC7D,OAAO,IAAI,CAAC,GAAG,CACb,aAAa,EACb,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,2BAA2B,CAAC,GAAG,aAAa,CAC3E,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"scheme.js","sourceRoot":"","sources":["../src/scheme.ts"],"names":[],"mappings":"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"}
|