paygate 5.1.0 → 5.3.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 +20 -0
- package/dist/core.d.ts +30 -2
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +223 -73
- package/dist/core.js.map +1 -1
- package/dist/core.test.js +287 -30
- package/dist/core.test.js.map +1 -1
- package/dist/express.d.ts +2 -2
- package/dist/express.d.ts.map +1 -1
- package/dist/express.js +10 -10
- package/dist/fastify.d.ts +3 -3
- package/dist/fastify.d.ts.map +1 -1
- package/dist/fastify.js +13 -11
- package/dist/fastify.js.map +1 -1
- package/dist/ghost-partner.d.ts +58 -0
- package/dist/ghost-partner.d.ts.map +1 -0
- package/dist/ghost-partner.js +95 -0
- package/dist/ghost-partner.js.map +1 -0
- package/dist/ghost-partner.test.d.ts +2 -0
- package/dist/ghost-partner.test.d.ts.map +1 -0
- package/dist/ghost-partner.test.js +101 -0
- package/dist/ghost-partner.test.js.map +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/package.json +18 -5
package/dist/core.test.js
CHANGED
|
@@ -1,63 +1,320 @@
|
|
|
1
|
-
import { describe,
|
|
2
|
-
import { buildChallengeHeaders } from
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { buildChallengeHeaders } from "./core.js";
|
|
3
3
|
const baseAccept = {
|
|
4
|
-
scheme:
|
|
5
|
-
network:
|
|
6
|
-
amount:
|
|
7
|
-
resource:
|
|
8
|
-
asset:
|
|
9
|
-
payTo:
|
|
10
|
-
extra: { name:
|
|
4
|
+
scheme: "exact",
|
|
5
|
+
network: "eip155:8453",
|
|
6
|
+
amount: "10000",
|
|
7
|
+
resource: "https://example.com/api/protected",
|
|
8
|
+
asset: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
9
|
+
payTo: "0xabcdef1234567890abcdef1234567890abcdef12",
|
|
10
|
+
extra: { name: "USD Coin", version: "2" },
|
|
11
11
|
};
|
|
12
12
|
const baseBody = {
|
|
13
|
-
error:
|
|
13
|
+
error: "Payment Required",
|
|
14
14
|
x402Version: 2,
|
|
15
15
|
accepts: [baseAccept],
|
|
16
|
-
facilitator:
|
|
16
|
+
facilitator: "https://facilitator.arispay.app",
|
|
17
17
|
gasSponsored: true,
|
|
18
18
|
};
|
|
19
|
-
describe(
|
|
20
|
-
it(
|
|
19
|
+
describe("buildChallengeHeaders", () => {
|
|
20
|
+
it("emits payment-required as base64-encoded JSON of the body", () => {
|
|
21
21
|
const headers = buildChallengeHeaders(baseBody, [baseAccept]);
|
|
22
|
-
const decoded = Buffer.from(headers[
|
|
22
|
+
const decoded = Buffer.from(headers["payment-required"], "base64").toString("utf8");
|
|
23
23
|
expect(JSON.parse(decoded)).toEqual(baseBody);
|
|
24
24
|
});
|
|
25
|
-
it(
|
|
25
|
+
it("keeps X-Payment-Requirements as raw JSON of {x402Version, accepts} only", () => {
|
|
26
26
|
const headers = buildChallengeHeaders(baseBody, [baseAccept]);
|
|
27
|
-
expect(JSON.parse(headers[
|
|
27
|
+
expect(JSON.parse(headers["X-Payment-Requirements"])).toEqual({
|
|
28
28
|
x402Version: 2,
|
|
29
29
|
accepts: [baseAccept],
|
|
30
30
|
});
|
|
31
31
|
});
|
|
32
|
-
it(
|
|
32
|
+
it("declares x402 in WWW-Authenticate", () => {
|
|
33
33
|
const headers = buildChallengeHeaders(baseBody, [baseAccept]);
|
|
34
|
-
expect(headers[
|
|
34
|
+
expect(headers["WWW-Authenticate"]).toBe("x402");
|
|
35
35
|
});
|
|
36
|
-
it(
|
|
36
|
+
it("exposes the canonical headers via CORS", () => {
|
|
37
37
|
const headers = buildChallengeHeaders(baseBody, [baseAccept]);
|
|
38
|
-
const expose = headers[
|
|
39
|
-
expect(expose).toContain(
|
|
40
|
-
expect(expose).toContain(
|
|
38
|
+
const expose = headers["Access-Control-Expose-Headers"];
|
|
39
|
+
expect(expose).toContain("payment-required");
|
|
40
|
+
expect(expose).toContain("x-payment-response");
|
|
41
41
|
});
|
|
42
|
-
it(
|
|
42
|
+
it("strips non-printable-ASCII from the legacy header (Latin1 safety)", () => {
|
|
43
43
|
const acceptsWithEmDash = [
|
|
44
44
|
{
|
|
45
45
|
...baseAccept,
|
|
46
|
-
extra: { ...baseAccept.extra, name:
|
|
46
|
+
extra: { ...baseAccept.extra, name: "USD — Coin" },
|
|
47
47
|
},
|
|
48
48
|
];
|
|
49
49
|
const bodyWithEmDash = { ...baseBody, accepts: acceptsWithEmDash };
|
|
50
50
|
const headers = buildChallengeHeaders(bodyWithEmDash, acceptsWithEmDash);
|
|
51
51
|
// Legacy header should have ? replacements — em dash (U+2014) is char 8212.
|
|
52
|
-
expect(headers[
|
|
53
|
-
expect(/[^\x20-\x7E]/.test(headers[
|
|
52
|
+
expect(headers["X-Payment-Requirements"]).not.toMatch(/—/);
|
|
53
|
+
expect(/[^\x20-\x7E]/.test(headers["X-Payment-Requirements"])).toBe(false);
|
|
54
54
|
// Canonical header preserves the em dash via base64 round-trip.
|
|
55
|
-
const decoded = Buffer.from(headers[
|
|
56
|
-
expect(decoded).toContain(
|
|
55
|
+
const decoded = Buffer.from(headers["payment-required"], "base64").toString("utf8");
|
|
56
|
+
expect(decoded).toContain("—");
|
|
57
57
|
});
|
|
58
|
-
it(
|
|
58
|
+
it("canonical header is valid base64 (alphabet only, padding optional)", () => {
|
|
59
59
|
const headers = buildChallengeHeaders(baseBody, [baseAccept]);
|
|
60
|
-
expect(headers[
|
|
60
|
+
expect(headers["payment-required"]).toMatch(/^[A-Za-z0-9+/]+=*$/);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
// ── EUR (EURC) currency support ──────────────────────
|
|
64
|
+
//
|
|
65
|
+
// `currency: "EUR"` switches the settlement asset to Circle EURC. These
|
|
66
|
+
// tests drive handlePaywall through the v2-shim challenge path (no network
|
|
67
|
+
// I/O) and pin the on-chain-verified EURC constants — a wrong address or
|
|
68
|
+
// EIP-712 name silently breaks every EUR payment.
|
|
69
|
+
import { handlePaywall } from "./core.js";
|
|
70
|
+
const WALLET = "0xabcdef1234567890abcdef1234567890abcdef12";
|
|
71
|
+
const RESOURCE = "https://merchant.example.com/api/data";
|
|
72
|
+
async function challengeFor(config, priceCents = 100) {
|
|
73
|
+
const result = await handlePaywall(config, { priceCents }, RESOURCE, undefined);
|
|
74
|
+
if (result.error)
|
|
75
|
+
throw new Error(`expected challenge, got error: ${result.error.body.error}`);
|
|
76
|
+
return result.challenge;
|
|
77
|
+
}
|
|
78
|
+
describe("currency: EUR (v2-shim path)", () => {
|
|
79
|
+
it("emits the on-chain-verified EURC asset + domain on Base mainnet", async () => {
|
|
80
|
+
const challenge = await challengeFor({ wallet: WALLET, network: "base", currency: "EUR" });
|
|
81
|
+
const accept = challenge.body.accepts[0];
|
|
82
|
+
expect(accept.asset).toBe("0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42");
|
|
83
|
+
expect(accept.extra).toEqual({ name: "EURC", version: "2" });
|
|
84
|
+
expect(accept.network).toBe("eip155:8453");
|
|
85
|
+
});
|
|
86
|
+
it("emits the Base Sepolia EURC asset for testnet", async () => {
|
|
87
|
+
const challenge = await challengeFor({
|
|
88
|
+
wallet: WALLET,
|
|
89
|
+
network: "base-sepolia",
|
|
90
|
+
currency: "EUR",
|
|
91
|
+
});
|
|
92
|
+
const accept = challenge.body.accepts[0];
|
|
93
|
+
expect(accept.asset).toBe("0x808456652fdb597867f38412077A9182bf77359F");
|
|
94
|
+
expect(accept.extra).toEqual({ name: "EURC", version: "2" });
|
|
95
|
+
});
|
|
96
|
+
it("converts EUR cents with the same 10^4 factor (EURC has 6 decimals)", async () => {
|
|
97
|
+
const challenge = await challengeFor({ wallet: WALLET, network: "base", currency: "EUR" }, 250);
|
|
98
|
+
expect(challenge.body.accepts[0].amount).toBe("2500000");
|
|
99
|
+
});
|
|
100
|
+
it("errors clearly on networks with no verified EURC address", async () => {
|
|
101
|
+
const result = await handlePaywall({ wallet: WALLET, network: "polygon", currency: "EUR" }, { priceCents: 100 }, RESOURCE, undefined);
|
|
102
|
+
expect(result.paid).toBe(false);
|
|
103
|
+
expect(result.error?.body.error).toContain("no known EURC address");
|
|
104
|
+
});
|
|
105
|
+
it("honours an explicit asset override under EUR", async () => {
|
|
106
|
+
const challenge = await challengeFor({
|
|
107
|
+
wallet: WALLET,
|
|
108
|
+
network: "polygon",
|
|
109
|
+
currency: "EUR",
|
|
110
|
+
asset: "0x1111111111111111111111111111111111111111",
|
|
111
|
+
});
|
|
112
|
+
expect(challenge.body.accepts[0].asset).toBe("0x1111111111111111111111111111111111111111");
|
|
113
|
+
});
|
|
114
|
+
it("defaults to USDC when currency is omitted (no behavior change)", async () => {
|
|
115
|
+
const challenge = await challengeFor({ wallet: WALLET, network: "base" });
|
|
116
|
+
const accept = challenge.body.accepts[0];
|
|
117
|
+
expect(accept.asset).toBe("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
|
|
118
|
+
expect(accept.extra).toEqual({ name: "USD Coin", version: "2" });
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
// ── v3 manifest path: EUR rail selection ─────────────
|
|
122
|
+
//
|
|
123
|
+
// Locks the manifest-rail selection contract the changeset documents:
|
|
124
|
+
// currency EUR picks the rail whose assetName is "EURC"; absence of a EUR
|
|
125
|
+
// rail is a clear configuration error, not a silent USDC fallback.
|
|
126
|
+
import { afterEach, vi } from "vitest";
|
|
127
|
+
function manifestResponse(rails) {
|
|
128
|
+
return {
|
|
129
|
+
ok: true,
|
|
130
|
+
status: 200,
|
|
131
|
+
json: async () => ({
|
|
132
|
+
version: "1",
|
|
133
|
+
merchant: { slug: "test-merchant", name: "Test" },
|
|
134
|
+
trust: { minTier: "any" },
|
|
135
|
+
rails,
|
|
136
|
+
updated: new Date().toISOString(),
|
|
137
|
+
}),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const USDC_RAIL = {
|
|
141
|
+
scheme: "x402",
|
|
142
|
+
network: "eip155:8453",
|
|
143
|
+
asset: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
144
|
+
assetName: "USDC",
|
|
145
|
+
payTo: WALLET,
|
|
146
|
+
facilitator: "https://facilitator.arispay.app",
|
|
147
|
+
};
|
|
148
|
+
const EURC_RAIL = {
|
|
149
|
+
...USDC_RAIL,
|
|
150
|
+
asset: "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42",
|
|
151
|
+
assetName: "EURC",
|
|
152
|
+
};
|
|
153
|
+
describe("currency: EUR (v3 manifest path)", () => {
|
|
154
|
+
afterEach(() => {
|
|
155
|
+
vi.unstubAllGlobals();
|
|
156
|
+
});
|
|
157
|
+
it("selects the EURC rail when currency is EUR", async () => {
|
|
158
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue(manifestResponse([USDC_RAIL, EURC_RAIL])));
|
|
159
|
+
const challenge = await challengeFor({ merchantId: "m_eur_pick", currency: "EUR" });
|
|
160
|
+
const accept = challenge.body.accepts[0];
|
|
161
|
+
expect(accept.asset).toBe(EURC_RAIL.asset);
|
|
162
|
+
expect(accept.extra).toEqual({ name: "EURC", version: "2" });
|
|
163
|
+
});
|
|
164
|
+
it("errors clearly (no silent USDC fallback) when the merchant has no EUR rail", async () => {
|
|
165
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue(manifestResponse([USDC_RAIL])));
|
|
166
|
+
const result = await handlePaywall({ merchantId: "m_eur_missing", currency: "EUR" }, { priceCents: 100 }, RESOURCE, undefined);
|
|
167
|
+
expect(result.paid).toBe(false);
|
|
168
|
+
expect(result.error?.body.error).toContain("no EUR (EURC) payout rail");
|
|
169
|
+
});
|
|
170
|
+
it("keeps the rails[0] fallback for USD callers (pre-EUR manifests unchanged)", async () => {
|
|
171
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue(manifestResponse([USDC_RAIL])));
|
|
172
|
+
const challenge = await challengeFor({ merchantId: "m_usd_fallback" });
|
|
173
|
+
expect(challenge.body.accepts[0].asset).toBe(USDC_RAIL.asset);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
// ── Settlement validation (L7) ───────────────────────
|
|
177
|
+
const PAYER = "0x1111111111111111111111111111111111111111";
|
|
178
|
+
const PAYEE = "0x2222222222222222222222222222222222222222";
|
|
179
|
+
function makePaymentHeader(payer = PAYER) {
|
|
180
|
+
const payload = {
|
|
181
|
+
x402Version: 2,
|
|
182
|
+
scheme: "exact",
|
|
183
|
+
network: "eip155:8453",
|
|
184
|
+
payload: {
|
|
185
|
+
signature: "0xsig",
|
|
186
|
+
authorization: {
|
|
187
|
+
from: payer,
|
|
188
|
+
to: PAYEE,
|
|
189
|
+
value: "10000",
|
|
190
|
+
validAfter: "0",
|
|
191
|
+
validBefore: "9999999999",
|
|
192
|
+
nonce: "0xabcd",
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
return Buffer.from(JSON.stringify(payload), "utf8").toString("base64");
|
|
197
|
+
}
|
|
198
|
+
function settleResponse(overrides = {}) {
|
|
199
|
+
return {
|
|
200
|
+
ok: true,
|
|
201
|
+
status: 200,
|
|
202
|
+
json: async () => ({
|
|
203
|
+
success: true,
|
|
204
|
+
transaction: "0xtxhash",
|
|
205
|
+
payer: PAYER,
|
|
206
|
+
...overrides,
|
|
207
|
+
}),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
describe("handlePaywall settlement", () => {
|
|
211
|
+
afterEach(() => {
|
|
212
|
+
vi.unstubAllGlobals();
|
|
213
|
+
});
|
|
214
|
+
it("rejects a v3 manifest rail with a missing or non-HTTPS facilitator", async () => {
|
|
215
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue(manifestResponse([{ ...USDC_RAIL, facilitator: "http://insecure.example.com" }])));
|
|
216
|
+
const result = await handlePaywall({ merchantId: "m_bad_facilitator" }, { priceCents: 100 }, RESOURCE, makePaymentHeader());
|
|
217
|
+
expect(result.paid).toBe(false);
|
|
218
|
+
expect(result.error?.body.error).toContain("invalid facilitator URL");
|
|
219
|
+
});
|
|
220
|
+
function mockSettleFetch(settleOverrides = {}) {
|
|
221
|
+
return vi.fn().mockImplementation((url) => {
|
|
222
|
+
if (url.includes("/capabilities")) {
|
|
223
|
+
return manifestResponse([USDC_RAIL]);
|
|
224
|
+
}
|
|
225
|
+
return settleResponse(settleOverrides);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
it("accepts a valid facilitator settlement", async () => {
|
|
229
|
+
vi.stubGlobal("fetch", mockSettleFetch());
|
|
230
|
+
const result = await handlePaywall({ merchantId: "m_ok" }, { priceCents: 100 }, RESOURCE, makePaymentHeader());
|
|
231
|
+
expect(result.paid).toBe(true);
|
|
232
|
+
expect(result.receipt?.txHash).toBe("0xtxhash");
|
|
233
|
+
});
|
|
234
|
+
it("rejects a success response without a transaction hash", async () => {
|
|
235
|
+
vi.stubGlobal("fetch", mockSettleFetch({ transaction: "" }));
|
|
236
|
+
const result = await handlePaywall({ merchantId: "m_ok" }, { priceCents: 100 }, RESOURCE, makePaymentHeader());
|
|
237
|
+
expect(result.paid).toBe(false);
|
|
238
|
+
expect(result.error?.body.code).toBe("INVALID_SETTLEMENT");
|
|
239
|
+
});
|
|
240
|
+
it("rejects a success response with a mismatched payer", async () => {
|
|
241
|
+
vi.stubGlobal("fetch", mockSettleFetch({ payer: "0x9999999999999999999999999999999999999999" }));
|
|
242
|
+
const result = await handlePaywall({ merchantId: "m_ok" }, { priceCents: 100 }, RESOURCE, makePaymentHeader());
|
|
243
|
+
expect(result.paid).toBe(false);
|
|
244
|
+
expect(result.error?.body.code).toBe("INVALID_SETTLEMENT");
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
// ── Self-settle (seller-submitted settlement) ────────
|
|
248
|
+
//
|
|
249
|
+
// Never-sponsor / never-charge: with `selfSettle` configured the SDK
|
|
250
|
+
// verifies via the facilitator (free) and submits the EIP-3009
|
|
251
|
+
// transferWithAuthorization from the seller's own key — the facilitator's
|
|
252
|
+
// /settle is never called.
|
|
253
|
+
const ethersMocks = vi.hoisted(() => {
|
|
254
|
+
const wait = vi.fn().mockResolvedValue({ status: 1, hash: "0xselftx" });
|
|
255
|
+
const transferWithAuthorization = vi.fn().mockResolvedValue({ wait, hash: "0xselftx" });
|
|
256
|
+
return {
|
|
257
|
+
wait,
|
|
258
|
+
transferWithAuthorization,
|
|
259
|
+
JsonRpcProvider: vi.fn(),
|
|
260
|
+
Wallet: vi.fn(),
|
|
261
|
+
Contract: vi.fn().mockImplementation(() => ({ transferWithAuthorization })),
|
|
262
|
+
Signature: { from: vi.fn().mockReturnValue({ v: 27, r: "0xr", s: "0xs" }) },
|
|
263
|
+
};
|
|
264
|
+
});
|
|
265
|
+
vi.mock("ethers", () => ({
|
|
266
|
+
JsonRpcProvider: ethersMocks.JsonRpcProvider,
|
|
267
|
+
Wallet: ethersMocks.Wallet,
|
|
268
|
+
Contract: ethersMocks.Contract,
|
|
269
|
+
Signature: ethersMocks.Signature,
|
|
270
|
+
}));
|
|
271
|
+
const SELF_SETTLE = { privateKey: `0x${"11".repeat(32)}` };
|
|
272
|
+
function mockVerifyFetch(verdict) {
|
|
273
|
+
return vi.fn().mockImplementation((url) => {
|
|
274
|
+
if (url.includes("/capabilities"))
|
|
275
|
+
return manifestResponse([USDC_RAIL]);
|
|
276
|
+
if (url.includes("/verify")) {
|
|
277
|
+
return { ok: true, status: 200, json: async () => verdict };
|
|
278
|
+
}
|
|
279
|
+
throw new Error(`unexpected fetch in self-settle mode: ${url}`);
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
describe("handlePaywall self-settle", () => {
|
|
283
|
+
afterEach(() => {
|
|
284
|
+
vi.unstubAllGlobals();
|
|
285
|
+
vi.clearAllMocks();
|
|
286
|
+
});
|
|
287
|
+
it("verifies via facilitator, submits from the seller's key, never calls /settle", async () => {
|
|
288
|
+
const fetchMock = mockVerifyFetch({ isValid: true });
|
|
289
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
290
|
+
const result = await handlePaywall({ merchantId: "m_self", selfSettle: SELF_SETTLE }, { priceCents: 100 }, RESOURCE, makePaymentHeader());
|
|
291
|
+
expect(result.paid).toBe(true);
|
|
292
|
+
expect(result.receipt?.txHash).toBe("0xselftx");
|
|
293
|
+
expect(result.settlement?.payer).toBe(PAYER);
|
|
294
|
+
expect(ethersMocks.transferWithAuthorization).toHaveBeenCalledWith(PAYER, PAYEE, "10000", "0", "9999999999", "0xabcd", 27, "0xr", "0xs");
|
|
295
|
+
const urls = fetchMock.mock.calls.map((c) => String(c[0]));
|
|
296
|
+
expect(urls.some((u) => u.includes("/settle"))).toBe(false);
|
|
297
|
+
});
|
|
298
|
+
it("returns 402 without submitting when facilitator verification fails", async () => {
|
|
299
|
+
vi.stubGlobal("fetch", mockVerifyFetch({ isValid: false, invalidReason: "invalid_signature" }));
|
|
300
|
+
const result = await handlePaywall({ merchantId: "m_self", selfSettle: SELF_SETTLE }, { priceCents: 100 }, RESOURCE, makePaymentHeader());
|
|
301
|
+
expect(result.paid).toBe(false);
|
|
302
|
+
expect(result.error?.statusCode).toBe(402);
|
|
303
|
+
expect(result.error?.body.code).toBe("invalid_signature");
|
|
304
|
+
expect(ethersMocks.transferWithAuthorization).not.toHaveBeenCalled();
|
|
305
|
+
});
|
|
306
|
+
it("fails clearly on an unknown network with no rpcUrl override", async () => {
|
|
307
|
+
vi.stubGlobal("fetch", vi.fn().mockImplementation((url) => {
|
|
308
|
+
if (url.includes("/capabilities"))
|
|
309
|
+
return manifestResponse([{ ...USDC_RAIL, network: "eip155:1" }]);
|
|
310
|
+
if (url.includes("/verify"))
|
|
311
|
+
return { ok: true, status: 200, json: async () => ({ isValid: true }) };
|
|
312
|
+
throw new Error(`unexpected fetch: ${url}`);
|
|
313
|
+
}));
|
|
314
|
+
const result = await handlePaywall({ merchantId: "m_self_unknown_net", selfSettle: SELF_SETTLE }, { priceCents: 100 }, RESOURCE, makePaymentHeader());
|
|
315
|
+
expect(result.paid).toBe(false);
|
|
316
|
+
expect(result.error?.body.code).toBe("SELF_SETTLE_CONFIG");
|
|
317
|
+
expect(result.error?.body.error).toContain("set selfSettle.rpcUrl");
|
|
61
318
|
});
|
|
62
319
|
});
|
|
63
320
|
//# sourceMappingURL=core.test.js.map
|
package/dist/core.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.test.js","sourceRoot":"","sources":["../src/core.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.test.js","sourceRoot":"","sources":["../src/core.test.ts"],"names":[],"mappings":"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"}
|
package/dist/express.d.ts
CHANGED
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
*
|
|
23
23
|
* v2 config (`wallet` + `network`) still works via the compat shim.
|
|
24
24
|
*/
|
|
25
|
-
import type { RequestHandler } from
|
|
26
|
-
import { type PaygateConfig, type RoutePrice } from
|
|
25
|
+
import type { RequestHandler } from "express";
|
|
26
|
+
import { type PaygateConfig, type RoutePrice } from "./core.js";
|
|
27
27
|
export type { PaygateConfig, RoutePrice };
|
|
28
28
|
/**
|
|
29
29
|
* Create a paywall middleware factory.
|
package/dist/express.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAyB,cAAc,EAAY,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAiB,MAAM,WAAW,CAAC;AAE/E,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAQ1C;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,IACnB,YAAY,UAAU,KAAG,cAAc,CAsChE"}
|
package/dist/express.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { handlePaywall } from
|
|
1
|
+
import { handlePaywall } from "./core.js";
|
|
2
2
|
function getClientIp(req) {
|
|
3
|
-
const forwarded = req.headers[
|
|
4
|
-
if (typeof forwarded ===
|
|
5
|
-
return forwarded.split(
|
|
6
|
-
return req.ip || req.socket.remoteAddress ||
|
|
3
|
+
const forwarded = req.headers["x-forwarded-for"];
|
|
4
|
+
if (typeof forwarded === "string")
|
|
5
|
+
return forwarded.split(",")[0].trim();
|
|
6
|
+
return req.ip || req.socket.remoteAddress || "unknown";
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Create a paywall middleware factory.
|
|
@@ -11,15 +11,15 @@ function getClientIp(req) {
|
|
|
11
11
|
export function paygate(config) {
|
|
12
12
|
return function paywall(routePrice) {
|
|
13
13
|
return async (req, res, next) => {
|
|
14
|
-
const resourceUrl = `${req.protocol}://${req.get(
|
|
15
|
-
const paymentHeader = req.headers[
|
|
14
|
+
const resourceUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
|
|
15
|
+
const paymentHeader = req.headers["x-payment"];
|
|
16
16
|
const clientIp = getClientIp(req);
|
|
17
17
|
// Resolve dynamic price functions against the real request.
|
|
18
18
|
const resolved = { ...routePrice };
|
|
19
|
-
if (typeof routePrice.priceCents ===
|
|
19
|
+
if (typeof routePrice.priceCents === "function") {
|
|
20
20
|
resolved.priceCents = await routePrice.priceCents(req);
|
|
21
21
|
}
|
|
22
|
-
if (typeof routePrice.price ===
|
|
22
|
+
if (typeof routePrice.price === "function") {
|
|
23
23
|
resolved.price = await routePrice.price(req);
|
|
24
24
|
}
|
|
25
25
|
const result = await handlePaywall(config, resolved, resourceUrl, paymentHeader, clientIp);
|
|
@@ -27,7 +27,7 @@ export function paygate(config) {
|
|
|
27
27
|
// Attach settlement + emit receipt header — body stays pristine
|
|
28
28
|
req.paygate = result.receipt ?? { paid: true };
|
|
29
29
|
if (result.receipt) {
|
|
30
|
-
res.setHeader(
|
|
30
|
+
res.setHeader("X-Paygate-Receipt", JSON.stringify(result.receipt));
|
|
31
31
|
}
|
|
32
32
|
return next();
|
|
33
33
|
}
|
package/dist/fastify.d.ts
CHANGED
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
* reply.send({ data: '...' });
|
|
22
22
|
* });
|
|
23
23
|
*/
|
|
24
|
-
import type { FastifyPluginAsync } from
|
|
25
|
-
import { type PaygateConfig, type RoutePrice } from
|
|
24
|
+
import type { FastifyPluginAsync } from "fastify";
|
|
25
|
+
import { type PaygateConfig, type RoutePrice } from "./core.js";
|
|
26
26
|
export type { PaygateConfig, RoutePrice };
|
|
27
|
-
declare module
|
|
27
|
+
declare module "fastify" {
|
|
28
28
|
interface FastifyRequest {
|
|
29
29
|
paygate?: {
|
|
30
30
|
paid: boolean;
|
package/dist/fastify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAmB,kBAAkB,EAAgC,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAiB,MAAM,WAAW,CAAC;AAE/E,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAE1C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,OAAO,CAAC,EAAE;YACR,IAAI,EAAE,OAAO,CAAC;YACd,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC;YAAE,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACpE;IACD,UAAU,oBAAoB;QAC5B,OAAO,CAAC,EAAE,UAAU,CAAC;QACrB,mDAAmD;QACnD,IAAI,CAAC,EAAE,UAAU,CAAC;KACnB;CACF;AAsBD,QAAA,MAAM,aAAa,EAAE,kBAAkB,CAAC,aAAa,CAiDpD,CAAC;AAEF,eAAe,aAAa,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/fastify.js
CHANGED
|
@@ -1,34 +1,36 @@
|
|
|
1
|
-
import { handlePaywall } from
|
|
1
|
+
import { handlePaywall } from "./core.js";
|
|
2
2
|
function getClientIp(request) {
|
|
3
|
-
const forwarded = request.headers[
|
|
4
|
-
if (typeof forwarded ===
|
|
5
|
-
return forwarded.split(
|
|
3
|
+
const forwarded = request.headers["x-forwarded-for"];
|
|
4
|
+
if (typeof forwarded === "string")
|
|
5
|
+
return forwarded.split(",")[0].trim();
|
|
6
6
|
return request.ip;
|
|
7
7
|
}
|
|
8
8
|
async function resolveRoutePrice(routePrice, request) {
|
|
9
9
|
const out = { ...routePrice };
|
|
10
|
-
if (typeof routePrice.priceCents ===
|
|
10
|
+
if (typeof routePrice.priceCents === "function") {
|
|
11
11
|
out.priceCents = await routePrice.priceCents(request);
|
|
12
12
|
}
|
|
13
|
-
if (typeof routePrice.price ===
|
|
13
|
+
if (typeof routePrice.price === "function") {
|
|
14
14
|
out.price = await routePrice.price(request);
|
|
15
15
|
}
|
|
16
16
|
return out;
|
|
17
17
|
}
|
|
18
18
|
const paygatePlugin = async (fastify, config) => {
|
|
19
|
-
fastify.decorateRequest(
|
|
20
|
-
fastify.decorateRequest(
|
|
21
|
-
|
|
19
|
+
fastify.decorateRequest("paygate", undefined);
|
|
20
|
+
fastify.decorateRequest("paygatePay", (async (_routePrice) => ({
|
|
21
|
+
paid: false,
|
|
22
|
+
})));
|
|
23
|
+
fastify.addHook("onRequest", async (request, reply) => {
|
|
22
24
|
const clientIp = getClientIp(request);
|
|
23
25
|
request.paygatePay = async (routePrice) => {
|
|
24
26
|
const resourceUrl = `${request.protocol}://${request.hostname}${request.url}`;
|
|
25
|
-
const paymentHeader = request.headers[
|
|
27
|
+
const paymentHeader = request.headers["x-payment"];
|
|
26
28
|
const resolved = await resolveRoutePrice(routePrice, request);
|
|
27
29
|
const result = await handlePaywall(config, resolved, resourceUrl, paymentHeader, clientIp);
|
|
28
30
|
if (result.paid) {
|
|
29
31
|
request.paygate = result.receipt ?? { paid: true };
|
|
30
32
|
if (result.receipt) {
|
|
31
|
-
reply.header(
|
|
33
|
+
reply.header("X-Paygate-Receipt", JSON.stringify(result.receipt));
|
|
32
34
|
}
|
|
33
35
|
return { paid: true };
|
|
34
36
|
}
|
package/dist/fastify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAuC,aAAa,EAAE,MAAM,WAAW,CAAC;AAqB/E,SAAS,WAAW,CAAC,OAAuB;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrD,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IAC1E,OAAO,OAAO,CAAC,EAAE,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,UAAsB,EACtB,OAAuB;IAEvB,MAAM,GAAG,GAAe,EAAE,GAAG,UAAU,EAAE,CAAC;IAC1C,IAAI,OAAO,UAAU,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAChD,GAAG,CAAC,UAAU,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAC3C,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,aAAa,GAAsC,KAAK,EAC5D,OAAwB,EACxB,MAAqB,EACrB,EAAE;IACF,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,SAAgB,CAAC,CAAC;IACrD,OAAO,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,WAAuB,EAAE,EAAE,CAAC,CAAC;QACzE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAQ,CAAC,CAAC;IAEZ,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAClF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEtC,OAAO,CAAC,UAAU,GAAG,KAAK,EAAE,UAAsB,EAAE,EAAE;YACpD,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAuB,CAAC;YACzE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;YAE3F,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACnD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACpE,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACxB,CAAC;YAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC3B,CAAC;gBACD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC9C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,GAAG,GAAI,OAAO,CAAC,YAAY,EAAE,MAAc,IAAI,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAA2B,CAAC;QACvE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI;gBAAE,OAAO;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface GhostPayPartnerConfig {
|
|
2
|
+
/** ArisPay API base URL. Defaults to https://api.arispay.app */
|
|
3
|
+
apiUrl?: string;
|
|
4
|
+
/** Merchant API key issued during partner onboarding (`mp_live_*`). */
|
|
5
|
+
apiKey: string;
|
|
6
|
+
/** Webhook signing secret configured for the merchant. Required only for verifyWebhook. */
|
|
7
|
+
webhookSecret?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface GhostPaymentLink {
|
|
10
|
+
linkId: string;
|
|
11
|
+
token: string;
|
|
12
|
+
amountCents: number;
|
|
13
|
+
currency: string;
|
|
14
|
+
memo: string | null;
|
|
15
|
+
reference: string | null;
|
|
16
|
+
status: string;
|
|
17
|
+
expiresAt: string | null;
|
|
18
|
+
url: string;
|
|
19
|
+
}
|
|
20
|
+
export interface GhostWebhookPayload {
|
|
21
|
+
type: "ghost.payment.succeeded" | "ghost.payment.failed";
|
|
22
|
+
data: {
|
|
23
|
+
paymentId: string;
|
|
24
|
+
merchantReference: string;
|
|
25
|
+
amountCents: number;
|
|
26
|
+
currency: string;
|
|
27
|
+
feeCents: number;
|
|
28
|
+
settlementProvider: string;
|
|
29
|
+
settlementTxRef: string | null;
|
|
30
|
+
reference: string | null;
|
|
31
|
+
settledAt: string | null;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export declare class GhostPayPartner {
|
|
35
|
+
private apiUrl;
|
|
36
|
+
private apiKey;
|
|
37
|
+
private webhookSecret?;
|
|
38
|
+
constructor(config: GhostPayPartnerConfig);
|
|
39
|
+
private request;
|
|
40
|
+
/**
|
|
41
|
+
* Create a Ghost Pay payment link for the configured merchant.
|
|
42
|
+
*/
|
|
43
|
+
createPaymentLink(input: {
|
|
44
|
+
amountCents: number;
|
|
45
|
+
currency?: string;
|
|
46
|
+
memo?: string;
|
|
47
|
+
reference?: string;
|
|
48
|
+
expiresInMinutes?: number;
|
|
49
|
+
}): Promise<GhostPaymentLink>;
|
|
50
|
+
/**
|
|
51
|
+
* Verify the HMAC-SHA256 signature on a Ghost Pay webhook.
|
|
52
|
+
*
|
|
53
|
+
* Throws if the signature is missing, malformed, or does not match the
|
|
54
|
+
* configured webhook secret.
|
|
55
|
+
*/
|
|
56
|
+
verifyWebhook(signatureHeader: string | null | undefined, timestampHeader: string | null | undefined, rawBody: string): GhostWebhookPayload;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ghost-partner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghost-partner.d.ts","sourceRoot":"","sources":["../src/ghost-partner.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,yBAAyB,GAAG,sBAAsB,CAAC;IACzD,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC;CACH;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,MAAM,EAAE,qBAAqB;YAM3B,OAAO;IA2BrB;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU7B;;;;;OAKG;IACH,aAAa,CACX,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC1C,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC1C,OAAO,EAAE,MAAM,GACd,mBAAmB;CA+BvB"}
|