@lunora/x402 1.0.0-alpha.6 → 1.0.0-alpha.61
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.md +18 -0
- package/README.md +22 -2
- package/dist/charge/index.d.mts +81 -21
- package/dist/charge/index.d.ts +81 -21
- package/dist/charge/index.mjs +1 -7
- package/dist/index.d.mts +2 -3
- package/dist/index.d.ts +2 -3
- package/dist/index.mjs +1 -2
- package/dist/packem_shared/DEFAULT_ALLOWED_ASSETS-Bda-nP2p.mjs +1 -0
- package/dist/packem_shared/DEFAULT_FACILITATOR_URL-CPJNUMvi.mjs +1 -0
- package/dist/packem_shared/EVM_NETWORKS-C5yyzK27.mjs +1 -0
- package/dist/packem_shared/createChargeMiddleware-CURPSr23.mjs +1 -0
- package/dist/packem_shared/createFacilitatorClient-piLSnKs5.mjs +1 -0
- package/dist/packem_shared/createPayFetch-yWtKD0NN.mjs +1 -0
- package/dist/packem_shared/createProcedureChargeGate-Ki_K8dQE.mjs +1 -0
- package/dist/packem_shared/{config.d-B-NYmHgG.d.ts → index.d-C1PlJUJL.d.mts} +142 -13
- package/dist/packem_shared/{config.d-B-NYmHgG.d.mts → index.d-C1PlJUJL.d.ts} +142 -13
- package/dist/packem_shared/optional-peer-BBhVxozi.mjs +1 -0
- package/dist/packem_shared/registerWallet-DvCt0Q7M.mjs +1 -0
- package/dist/packem_shared/toPaymentEventRow-DTXuTDh0.mjs +1 -0
- package/dist/packem_shared/withX402-CXFSHtTo.mjs +1 -0
- package/dist/pay/index.d.mts +9 -9
- package/dist/pay/index.d.ts +9 -9
- package/dist/pay/index.mjs +1 -21
- package/package.json +21 -9
- package/dist/packem_shared/DEFAULT_FACILITATOR_URL-Cbz6kIqa.mjs +0 -4
- package/dist/packem_shared/DEFAULT_STABLECOIN_DECIMALS-CpW619nu.mjs +0 -90
- package/dist/packem_shared/EVM_NETWORKS-BhnYWUQ4.mjs +0 -26
- package/dist/packem_shared/createChargeMiddleware-D3yhOpFs.mjs +0 -162
- package/dist/packem_shared/createFacilitatorClient-rXHBnCZm.mjs +0 -16
- package/dist/packem_shared/createPayFetch-BeT05njL.mjs +0 -17
- package/dist/packem_shared/createProcedureChargeGate-eh9yv36U.mjs +0 -21
- package/dist/packem_shared/registerWallet-I4pVwq65.mjs +0 -109
- package/dist/packem_shared/toPaymentEventRow-DW4O9N7Y.mjs +0 -22
- package/dist/packem_shared/withX402-DILL2DvD.mjs +0 -15
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { x402HTTPResourceServer } from '@x402/core/http';
|
|
2
|
-
import { toCaip2, isEvmNetwork } from './EVM_NETWORKS-BhnYWUQ4.mjs';
|
|
3
|
-
import { toReceipt } from './toPaymentEventRow-DW4O9N7Y.mjs';
|
|
4
|
-
import { createFacilitatorClient } from './createFacilitatorClient-rXHBnCZm.mjs';
|
|
5
|
-
|
|
6
|
-
const buildResourceServer = async (config) => {
|
|
7
|
-
const { x402ResourceServer: ResourceServer } = await import('@x402/core/server');
|
|
8
|
-
const server = new ResourceServer(createFacilitatorClient(config.facilitator));
|
|
9
|
-
const network = toCaip2(config.network);
|
|
10
|
-
if (isEvmNetwork(config.network)) {
|
|
11
|
-
const { registerExactEvmScheme } = await import('@x402/evm/exact/server');
|
|
12
|
-
registerExactEvmScheme(server, { networks: [network] });
|
|
13
|
-
} else {
|
|
14
|
-
const { registerExactSvmScheme } = await import('@x402/svm/exact/server');
|
|
15
|
-
registerExactSvmScheme(server, { networks: [network] });
|
|
16
|
-
}
|
|
17
|
-
return server;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const PAYMENT_HEADER = "X-PAYMENT";
|
|
21
|
-
const headerRecord = (headers) => {
|
|
22
|
-
const record = /* @__PURE__ */ Object.create(null);
|
|
23
|
-
for (const [key, value] of headers) {
|
|
24
|
-
record[key] = value;
|
|
25
|
-
}
|
|
26
|
-
return record;
|
|
27
|
-
};
|
|
28
|
-
const reportReceipt = (sink, settlement, resource, waitUntil) => {
|
|
29
|
-
if (sink === void 0) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
try {
|
|
33
|
-
const sent = Promise.resolve(sink(toReceipt(settlement, { resource, ts: Date.now() }))).catch(() => {
|
|
34
|
-
});
|
|
35
|
-
waitUntil?.(sent);
|
|
36
|
-
} catch {
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
const resolvePayTo = (config) => {
|
|
40
|
-
const evm = isEvmNetwork(config.network);
|
|
41
|
-
const address = evm ? config.recipient.evm : config.recipient.svm;
|
|
42
|
-
if (address === void 0 || address.length === 0) {
|
|
43
|
-
throw new Error(`x402 charge on "${config.network}" needs recipient.${evm ? "evm" : "svm"} set.`);
|
|
44
|
-
}
|
|
45
|
-
return address;
|
|
46
|
-
};
|
|
47
|
-
const buildRoute = (config) => {
|
|
48
|
-
const accepts = {
|
|
49
|
-
network: toCaip2(config.network),
|
|
50
|
-
payTo: resolvePayTo(config),
|
|
51
|
-
price: config.price,
|
|
52
|
-
scheme: "exact"
|
|
53
|
-
};
|
|
54
|
-
return { accepts };
|
|
55
|
-
};
|
|
56
|
-
const createRequestAdapter = (request, url) => {
|
|
57
|
-
return {
|
|
58
|
-
getAcceptHeader: () => request.headers.get("accept") ?? "",
|
|
59
|
-
getHeader: (name) => request.headers.get(name) ?? void 0,
|
|
60
|
-
getMethod: () => request.method,
|
|
61
|
-
getPath: () => url.pathname,
|
|
62
|
-
getQueryParam: (name) => {
|
|
63
|
-
const values = url.searchParams.getAll(name);
|
|
64
|
-
if (values.length === 0) {
|
|
65
|
-
return void 0;
|
|
66
|
-
}
|
|
67
|
-
return values.length === 1 ? values[0] : values;
|
|
68
|
-
},
|
|
69
|
-
getQueryParams: () => {
|
|
70
|
-
const params = /* @__PURE__ */ Object.create(null);
|
|
71
|
-
for (const key of new Set(url.searchParams.keys())) {
|
|
72
|
-
const values = url.searchParams.getAll(key);
|
|
73
|
-
const [first, ...rest] = values;
|
|
74
|
-
if (first === void 0) {
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
params[key] = rest.length > 0 ? values : first;
|
|
78
|
-
}
|
|
79
|
-
return params;
|
|
80
|
-
},
|
|
81
|
-
getUrl: () => request.url,
|
|
82
|
-
getUserAgent: () => request.headers.get("user-agent") ?? ""
|
|
83
|
-
};
|
|
84
|
-
};
|
|
85
|
-
const toResponse = (instructions) => {
|
|
86
|
-
const headers = new Headers(instructions.headers);
|
|
87
|
-
const { body } = instructions;
|
|
88
|
-
if (body === void 0 || body === null) {
|
|
89
|
-
return new Response(void 0, { headers, status: instructions.status });
|
|
90
|
-
}
|
|
91
|
-
if (typeof body === "string") {
|
|
92
|
-
if (instructions.isHtml && !headers.has("content-type")) {
|
|
93
|
-
headers.set("content-type", "text/html; charset=utf-8");
|
|
94
|
-
}
|
|
95
|
-
return new Response(body, { headers, status: instructions.status });
|
|
96
|
-
}
|
|
97
|
-
return Response.json(body, { headers, status: instructions.status });
|
|
98
|
-
};
|
|
99
|
-
const withHeaders = (response, extra) => {
|
|
100
|
-
const headers = new Headers(response.headers);
|
|
101
|
-
for (const [key, value] of Object.entries(extra)) {
|
|
102
|
-
headers.set(key, value);
|
|
103
|
-
}
|
|
104
|
-
return new Response(response.body, { headers, status: response.status, statusText: response.statusText });
|
|
105
|
-
};
|
|
106
|
-
const createChargeMiddleware = async (config, routeOverrides, options) => {
|
|
107
|
-
const server = await buildResourceServer(config);
|
|
108
|
-
const http = new x402HTTPResourceServer(server, { ...buildRoute(config), ...routeOverrides });
|
|
109
|
-
await http.initialize();
|
|
110
|
-
const settleBeforeHandler = options?.settleBeforeHandler ?? false;
|
|
111
|
-
const handle = async (request, runHandler, deps) => {
|
|
112
|
-
const url = new URL(request.url);
|
|
113
|
-
const context = {
|
|
114
|
-
adapter: createRequestAdapter(request, url),
|
|
115
|
-
method: request.method,
|
|
116
|
-
path: url.pathname,
|
|
117
|
-
paymentHeader: request.headers.get(PAYMENT_HEADER) ?? void 0
|
|
118
|
-
};
|
|
119
|
-
const result = await http.processHTTPRequest(context);
|
|
120
|
-
if (result.type === "no-payment-required") {
|
|
121
|
-
return runHandler();
|
|
122
|
-
}
|
|
123
|
-
if (result.type === "payment-error") {
|
|
124
|
-
return toResponse(result.response);
|
|
125
|
-
}
|
|
126
|
-
const resource = routeOverrides?.resource ?? request.url;
|
|
127
|
-
if (settleBeforeHandler) {
|
|
128
|
-
const settlement2 = await http.processSettlement(result.paymentPayload, result.paymentRequirements, result.declaredExtensions, {
|
|
129
|
-
request: context
|
|
130
|
-
});
|
|
131
|
-
if (!settlement2.success) {
|
|
132
|
-
return toResponse(settlement2.response);
|
|
133
|
-
}
|
|
134
|
-
reportReceipt(config.onReceipt, settlement2, resource, deps?.waitUntil);
|
|
135
|
-
const response2 = await runHandler();
|
|
136
|
-
return withHeaders(response2, settlement2.headers);
|
|
137
|
-
}
|
|
138
|
-
let response;
|
|
139
|
-
try {
|
|
140
|
-
response = await runHandler();
|
|
141
|
-
} catch (error) {
|
|
142
|
-
try {
|
|
143
|
-
await result.cancellationDispatcher.cancel({ error, reason: "handler_threw" });
|
|
144
|
-
} catch (cancelError) {
|
|
145
|
-
console.error("x402 charge: failed to cancel payment after the handler threw", cancelError);
|
|
146
|
-
}
|
|
147
|
-
throw error;
|
|
148
|
-
}
|
|
149
|
-
const settlement = await http.processSettlement(result.paymentPayload, result.paymentRequirements, result.declaredExtensions, {
|
|
150
|
-
request: context,
|
|
151
|
-
responseHeaders: headerRecord(response.headers)
|
|
152
|
-
});
|
|
153
|
-
if (settlement.success) {
|
|
154
|
-
reportReceipt(config.onReceipt, settlement, resource, deps?.waitUntil);
|
|
155
|
-
return withHeaders(response, settlement.headers);
|
|
156
|
-
}
|
|
157
|
-
return toResponse(settlement.response);
|
|
158
|
-
};
|
|
159
|
-
return { handle };
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
export { buildRoute, createChargeMiddleware, createRequestAdapter, reportReceipt, resolvePayTo, toResponse, withHeaders };
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { HTTPFacilitatorClient } from '@x402/core/server';
|
|
2
|
-
import { resolveFacilitatorUrl } from './DEFAULT_FACILITATOR_URL-Cbz6kIqa.mjs';
|
|
3
|
-
|
|
4
|
-
const createFacilitatorClient = (config) => {
|
|
5
|
-
const url = resolveFacilitatorUrl(config);
|
|
6
|
-
if (config?.headers === void 0) {
|
|
7
|
-
return new HTTPFacilitatorClient({ url });
|
|
8
|
-
}
|
|
9
|
-
const headers = { ...config.headers };
|
|
10
|
-
return new HTTPFacilitatorClient({
|
|
11
|
-
createAuthHeaders: () => Promise.resolve({ settle: headers, supported: headers, verify: headers }),
|
|
12
|
-
url
|
|
13
|
-
});
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export { createFacilitatorClient };
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { x402Client } from '@x402/core/client';
|
|
2
|
-
import { wrapFetchWithPayment } from '@x402/fetch';
|
|
3
|
-
import { assertBoundedPolicy, buildSpendPolicy, buildPaymentGuard, releaseSpendOnFailure, createSpendState } from './DEFAULT_STABLECOIN_DECIMALS-CpW619nu.mjs';
|
|
4
|
-
import { registerWallet } from './registerWallet-I4pVwq65.mjs';
|
|
5
|
-
|
|
6
|
-
const createPayFetch = async (config, deps) => {
|
|
7
|
-
assertBoundedPolicy(config.policy);
|
|
8
|
-
const client = new x402Client();
|
|
9
|
-
await registerWallet(client, config, deps);
|
|
10
|
-
const state = createSpendState();
|
|
11
|
-
client.registerPolicy(buildSpendPolicy(config.policy));
|
|
12
|
-
client.onBeforePaymentCreation(buildPaymentGuard(config.policy, state));
|
|
13
|
-
client.onPaymentCreationFailure(releaseSpendOnFailure(state));
|
|
14
|
-
return wrapFetchWithPayment(deps.fetch ?? globalThis.fetch, client);
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export { createPayFetch };
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { createChargeMiddleware } from './createChargeMiddleware-D3yhOpFs.mjs';
|
|
2
|
-
|
|
3
|
-
const createProcedureChargeGate = (config) => {
|
|
4
|
-
const middlewareByFunction = /* @__PURE__ */ new Map();
|
|
5
|
-
return async (request, spec, dispatch, deps) => {
|
|
6
|
-
let pending = middlewareByFunction.get(spec.functionPath);
|
|
7
|
-
if (pending === void 0) {
|
|
8
|
-
pending = createChargeMiddleware({ ...config, price: spec.price }, { resource: spec.functionPath }, { settleBeforeHandler: true }).catch(
|
|
9
|
-
(error) => {
|
|
10
|
-
middlewareByFunction.delete(spec.functionPath);
|
|
11
|
-
throw error;
|
|
12
|
-
}
|
|
13
|
-
);
|
|
14
|
-
middlewareByFunction.set(spec.functionPath, pending);
|
|
15
|
-
}
|
|
16
|
-
const middleware = await pending;
|
|
17
|
-
return middleware.handle(request, dispatch, deps);
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export { createProcedureChargeGate };
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { LunoraError } from '@lunora/errors';
|
|
2
|
-
import { toCaip2, isEvmNetwork } from './EVM_NETWORKS-BhnYWUQ4.mjs';
|
|
3
|
-
|
|
4
|
-
const HEX_PRIVATE_KEY = /^0x[0-9a-fA-F]{64}$/;
|
|
5
|
-
const requireSecret = async (getSecret, name) => {
|
|
6
|
-
const value = await getSecret(name);
|
|
7
|
-
if (value === void 0 || value.length === 0) {
|
|
8
|
-
throw new LunoraError("ENV_INVALID", `x402 pay: secret "${name}" is not set — the agent wallet has no key to sign with.`);
|
|
9
|
-
}
|
|
10
|
-
return value;
|
|
11
|
-
};
|
|
12
|
-
const assertSignerFamily = (signer, evm) => {
|
|
13
|
-
const looksEvm = signer.address.startsWith("0x");
|
|
14
|
-
if (evm && !looksEvm) {
|
|
15
|
-
throw new LunoraError("ENV_INVALID", `x402 pay: the supplied signer address "${signer.address}" is not an EVM (0x…) address, but the network is EVM.`);
|
|
16
|
-
}
|
|
17
|
-
if (!evm && looksEvm) {
|
|
18
|
-
throw new LunoraError("ENV_INVALID", `x402 pay: the supplied signer address "${signer.address}" is an EVM (0x…) address, but the network is Solana.`);
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
const resolveCdpEvmAccount = async (signer, getSecret) => {
|
|
22
|
-
let cdpModule;
|
|
23
|
-
try {
|
|
24
|
-
cdpModule = await import('@coinbase/cdp-sdk');
|
|
25
|
-
} catch {
|
|
26
|
-
throw new LunoraError(
|
|
27
|
-
"ENV_INVALID",
|
|
28
|
-
'x402 pay: CDP-managed custody needs the optional @coinbase/cdp-sdk peer — install it, or use "raw-key"/"signer" custody instead.'
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
const [apiKeyId, apiKeySecret, walletSecret] = await Promise.all([
|
|
32
|
-
requireSecret(getSecret, signer.apiKeyIdSecretName ?? "CDP_API_KEY_ID"),
|
|
33
|
-
requireSecret(getSecret, signer.apiKeySecretName ?? "CDP_API_KEY_SECRET"),
|
|
34
|
-
requireSecret(getSecret, signer.walletSecretName ?? "CDP_WALLET_SECRET")
|
|
35
|
-
]);
|
|
36
|
-
const cdp = new cdpModule.CdpClient({ apiKeyId, apiKeySecret, walletSecret });
|
|
37
|
-
return cdp.evm.getOrCreateAccount({ name: signer.account });
|
|
38
|
-
};
|
|
39
|
-
const resolveEvmAccount = async (privateKey) => {
|
|
40
|
-
const key = privateKey.startsWith("0x") ? privateKey : `0x${privateKey}`;
|
|
41
|
-
if (!HEX_PRIVATE_KEY.test(key)) {
|
|
42
|
-
throw new LunoraError("ENV_INVALID", "x402 pay: the EVM wallet key must be a 32-byte hex private key (64 hex chars, optional 0x prefix).");
|
|
43
|
-
}
|
|
44
|
-
const { privateKeyToAccount } = await import('viem/accounts');
|
|
45
|
-
return privateKeyToAccount(key);
|
|
46
|
-
};
|
|
47
|
-
const resolveSvmSigner = async (secret) => {
|
|
48
|
-
const trimmed = secret.trim();
|
|
49
|
-
const { createKeyPairSignerFromBytes, createKeyPairSignerFromPrivateKeyBytes, getBase58Encoder } = await import('@solana/kit');
|
|
50
|
-
let bytes;
|
|
51
|
-
if (trimmed.startsWith("[")) {
|
|
52
|
-
let parsed;
|
|
53
|
-
try {
|
|
54
|
-
parsed = JSON.parse(trimmed);
|
|
55
|
-
} catch {
|
|
56
|
-
throw new LunoraError("ENV_INVALID", "x402 pay: the Solana wallet key looks like a JSON byte array but is not valid JSON.");
|
|
57
|
-
}
|
|
58
|
-
if (!Array.isArray(parsed) || parsed.some((entry) => typeof entry !== "number")) {
|
|
59
|
-
throw new LunoraError("ENV_INVALID", "x402 pay: the Solana wallet key JSON must be an array of byte values.");
|
|
60
|
-
}
|
|
61
|
-
bytes = Uint8Array.from(parsed);
|
|
62
|
-
} else {
|
|
63
|
-
try {
|
|
64
|
-
bytes = Uint8Array.from(getBase58Encoder().encode(trimmed));
|
|
65
|
-
} catch {
|
|
66
|
-
throw new LunoraError("ENV_INVALID", "x402 pay: the Solana wallet key must be a base58 secret key or a JSON byte array.");
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (bytes.length === 64) {
|
|
70
|
-
return createKeyPairSignerFromBytes(bytes);
|
|
71
|
-
}
|
|
72
|
-
if (bytes.length === 32) {
|
|
73
|
-
return createKeyPairSignerFromPrivateKeyBytes(bytes);
|
|
74
|
-
}
|
|
75
|
-
throw new LunoraError(
|
|
76
|
-
"ENV_INVALID",
|
|
77
|
-
`x402 pay: the Solana wallet key must decode to 32 or 64 bytes (got ${String(bytes.length)}). Provide a base58 secret key or a JSON byte array.`
|
|
78
|
-
);
|
|
79
|
-
};
|
|
80
|
-
const registerWallet = async (client, config, deps) => {
|
|
81
|
-
const network = toCaip2(config.network);
|
|
82
|
-
const { signer } = config;
|
|
83
|
-
const evm = isEvmNetwork(config.network);
|
|
84
|
-
let account;
|
|
85
|
-
if (signer.type === "signer") {
|
|
86
|
-
assertSignerFamily(signer.signer, evm);
|
|
87
|
-
account = signer.signer;
|
|
88
|
-
} else if (signer.type === "cdp") {
|
|
89
|
-
if (!evm) {
|
|
90
|
-
throw new LunoraError(
|
|
91
|
-
"NOT_IMPLEMENTED",
|
|
92
|
-
`x402 pay: CDP-managed Solana custody (account "${signer.account}") is not wired — a CDP Solana account is not a @solana/kit signer. Build a @solana/kit signer around it and pass it via the { type: "signer" } escape hatch, or use "raw-key".`
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
account = await resolveCdpEvmAccount(signer, deps.getSecret);
|
|
96
|
-
} else {
|
|
97
|
-
const secret = await requireSecret(deps.getSecret, signer.secretName);
|
|
98
|
-
account = evm ? await resolveEvmAccount(secret) : await resolveSvmSigner(secret);
|
|
99
|
-
}
|
|
100
|
-
if (evm) {
|
|
101
|
-
const { registerExactEvmScheme } = await import('@x402/evm/exact/client');
|
|
102
|
-
registerExactEvmScheme(client, { networks: [network], signer: account });
|
|
103
|
-
} else {
|
|
104
|
-
const { registerExactSvmScheme } = await import('@x402/svm/exact/client');
|
|
105
|
-
registerExactSvmScheme(client, { networks: [network], signer: account });
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
export { registerWallet, resolveEvmAccount, resolveSvmSigner };
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
const toReceipt = (settlement, context) => {
|
|
2
|
-
return {
|
|
3
|
-
amount: settlement.amount ?? settlement.requirements.amount,
|
|
4
|
-
asset: settlement.requirements.asset,
|
|
5
|
-
from: settlement.payer,
|
|
6
|
-
network: settlement.network,
|
|
7
|
-
resource: context.resource,
|
|
8
|
-
to: settlement.requirements.payTo,
|
|
9
|
-
ts: context.ts,
|
|
10
|
-
tx: settlement.transaction
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
const toPaymentEventRow = (receipt) => {
|
|
14
|
-
return {
|
|
15
|
-
processedAt: receipt.ts,
|
|
16
|
-
provider: "x402",
|
|
17
|
-
providerEventId: receipt.tx,
|
|
18
|
-
type: "x402.settled"
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export { toPaymentEventRow, toReceipt };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { createChargeMiddleware } from './createChargeMiddleware-D3yhOpFs.mjs';
|
|
2
|
-
|
|
3
|
-
const withX402 = (config, handler) => {
|
|
4
|
-
let pending;
|
|
5
|
-
return async (context, request) => {
|
|
6
|
-
pending ??= createChargeMiddleware(config).catch((error) => {
|
|
7
|
-
pending = void 0;
|
|
8
|
-
throw error;
|
|
9
|
-
});
|
|
10
|
-
const middleware = await pending;
|
|
11
|
-
return middleware.handle(request, () => handler(context, request));
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export { withX402 };
|