@armory-sh/middleware-bun 0.3.26 → 0.3.28
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/dist/{chunk-WLKV5FDR.js → chunk-BJBLQMMR.js} +56 -17
- package/dist/index.d.ts +9 -1
- package/dist/index.js +285 -21
- package/dist/routes-C69V5KAQ.d.ts +49 -0
- package/dist/routes.d.ts +2 -27
- package/dist/routes.js +1 -1
- package/package.json +4 -2
|
@@ -8,7 +8,9 @@ var toSlug = (network) => {
|
|
|
8
8
|
return normalizeNetworkName(net.name);
|
|
9
9
|
}
|
|
10
10
|
if (network.startsWith("eip155:")) {
|
|
11
|
-
const
|
|
11
|
+
const chainPart = network.split(":")[1];
|
|
12
|
+
if (!chainPart) throw new Error(`Invalid network format: ${network}`);
|
|
13
|
+
const chainId = parseInt(chainPart, 10);
|
|
12
14
|
const net = getNetworkByChainId(chainId);
|
|
13
15
|
if (!net) throw new Error(`No network found for chainId: ${chainId}`);
|
|
14
16
|
return normalizeNetworkName(net.name);
|
|
@@ -38,12 +40,16 @@ var createV2Requirements = (config, expiry) => {
|
|
|
38
40
|
const network = getNetworkConfig(networkName);
|
|
39
41
|
if (!network) throw new Error(`Unsupported network: ${networkName}`);
|
|
40
42
|
return {
|
|
43
|
+
scheme: "exact",
|
|
41
44
|
amount: config.amount,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
network: getChainId(config.network),
|
|
46
|
+
asset: network.usdcAddress,
|
|
47
|
+
payTo: config.payTo,
|
|
48
|
+
maxTimeoutSeconds: Math.max(1, expiry - Math.floor(Date.now() / 1e3)),
|
|
49
|
+
extra: {
|
|
50
|
+
name: "USDC",
|
|
51
|
+
version: "2"
|
|
52
|
+
}
|
|
47
53
|
};
|
|
48
54
|
};
|
|
49
55
|
var createPaymentRequirements = (config) => {
|
|
@@ -80,7 +86,9 @@ var parsePaymentHeader = async (request, requirements) => {
|
|
|
80
86
|
const paymentSig = request.headers.get(PAYMENT_SIGNATURE_HEADER);
|
|
81
87
|
if (paymentSig) {
|
|
82
88
|
try {
|
|
83
|
-
const payload = decodePayloadHeader(paymentSig, {
|
|
89
|
+
const payload = decodePayloadHeader(paymentSig, {
|
|
90
|
+
accepted: requirements
|
|
91
|
+
});
|
|
84
92
|
return { payload, payerAddress: extractPayerAddress(payload) };
|
|
85
93
|
} catch {
|
|
86
94
|
}
|
|
@@ -133,32 +141,58 @@ var createRouteAwareBunMiddleware = (config, handler) => {
|
|
|
133
141
|
const { routes: resolvedRoutes, error: configError } = resolveRouteConfig(config);
|
|
134
142
|
const middleware = async (request) => {
|
|
135
143
|
if (configError) {
|
|
136
|
-
return errorResponse(
|
|
144
|
+
return errorResponse(
|
|
145
|
+
`Payment middleware configuration error: ${configError.message}`,
|
|
146
|
+
500
|
|
147
|
+
);
|
|
137
148
|
}
|
|
138
149
|
const path = new URL(request.url).pathname;
|
|
139
|
-
const matchedRoute = resolvedRoutes.find(
|
|
150
|
+
const matchedRoute = resolvedRoutes.find(
|
|
151
|
+
(r) => matchRoute(r.pattern, path)
|
|
152
|
+
);
|
|
140
153
|
if (!matchedRoute) {
|
|
141
154
|
return null;
|
|
142
155
|
}
|
|
143
156
|
const routeConfig = matchedRoute.config;
|
|
144
|
-
const {
|
|
157
|
+
const {
|
|
158
|
+
facilitator,
|
|
159
|
+
settlementMode = "settle",
|
|
160
|
+
waitForSettlement = false
|
|
161
|
+
} = routeConfig;
|
|
145
162
|
const requirements = createPaymentRequirements(routeConfig);
|
|
146
163
|
const paymentResult = await parsePaymentHeader(request, requirements);
|
|
147
164
|
if (!paymentResult) {
|
|
148
|
-
return errorResponse(
|
|
165
|
+
return errorResponse(
|
|
166
|
+
"Payment required",
|
|
167
|
+
402,
|
|
168
|
+
createPaymentRequiredHeaders(requirements),
|
|
169
|
+
[requirements]
|
|
170
|
+
);
|
|
149
171
|
}
|
|
150
172
|
const { payerAddress, payload } = paymentResult;
|
|
151
173
|
if (facilitator) {
|
|
152
|
-
const verifyResult = await verifyPayment(payload, requirements, {
|
|
174
|
+
const verifyResult = await verifyPayment(payload, requirements, {
|
|
175
|
+
url: facilitator.url
|
|
176
|
+
});
|
|
153
177
|
if (!verifyResult.isValid) {
|
|
154
|
-
return errorResponse(
|
|
178
|
+
return errorResponse(
|
|
179
|
+
`Payment verification failed: ${verifyResult.invalidReason}`,
|
|
180
|
+
402,
|
|
181
|
+
createPaymentRequiredHeaders(requirements),
|
|
182
|
+
[requirements]
|
|
183
|
+
);
|
|
155
184
|
}
|
|
156
185
|
}
|
|
157
186
|
if (!handler) {
|
|
158
187
|
if (settlementMode === "settle" && facilitator) {
|
|
159
188
|
const settle = async () => {
|
|
160
|
-
const result = await settlePayment(payload, requirements, {
|
|
161
|
-
|
|
189
|
+
const result = await settlePayment(payload, requirements, {
|
|
190
|
+
url: facilitator.url
|
|
191
|
+
});
|
|
192
|
+
return result.success ? successResponse(
|
|
193
|
+
payerAddress,
|
|
194
|
+
createSettlementResponse(true, result.transaction)
|
|
195
|
+
) : errorResponse(result.errorReason ?? "Settlement failed", 400);
|
|
162
196
|
};
|
|
163
197
|
if (waitForSettlement) {
|
|
164
198
|
return await settle();
|
|
@@ -172,9 +206,14 @@ var createRouteAwareBunMiddleware = (config, handler) => {
|
|
|
172
206
|
if (response.status >= 400 || settlementMode !== "settle" || !facilitator) {
|
|
173
207
|
return response;
|
|
174
208
|
}
|
|
175
|
-
const settleResult = await settlePayment(payload, requirements, {
|
|
209
|
+
const settleResult = await settlePayment(payload, requirements, {
|
|
210
|
+
url: facilitator.url
|
|
211
|
+
});
|
|
176
212
|
if (!settleResult.success) {
|
|
177
|
-
return errorResponse(
|
|
213
|
+
return errorResponse(
|
|
214
|
+
settleResult.errorReason ?? "Settlement failed",
|
|
215
|
+
502
|
|
216
|
+
);
|
|
178
217
|
}
|
|
179
218
|
const settlement = createSettlementResponse(true, settleResult.transaction);
|
|
180
219
|
return appendSettlementHeaders(response, settlement);
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import { M as MiddlewareConfig, B as BunHandler, a as BunMiddleware } from './routes-C69V5KAQ.js';
|
|
2
|
+
export { P as PaymentConfig, R as ResolvedRequirementsConfig, b as RouteAwareBunMiddlewareConfig, c as createPaymentRequirements, d as createRouteAwareBunMiddleware, p as paymentMiddleware, r as resolveFacilitatorUrlFromRequirement } from './routes-C69V5KAQ.js';
|
|
2
3
|
import '@armory-sh/base';
|
|
4
|
+
|
|
5
|
+
interface BunMiddlewareConfig extends MiddlewareConfig {
|
|
6
|
+
waitForSettlement?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare const createBunMiddleware: (config: BunMiddlewareConfig, handler?: BunHandler) => BunMiddleware | ((request: Request) => Promise<Response>);
|
|
9
|
+
|
|
10
|
+
export { BunHandler, BunMiddleware, type BunMiddlewareConfig, createBunMiddleware };
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,255 @@
|
|
|
1
|
-
import { createPaymentRequirements } from './chunk-
|
|
2
|
-
export { createRouteAwareBunMiddleware } from './chunk-
|
|
3
|
-
import {
|
|
1
|
+
import { createPaymentRequirements as createPaymentRequirements$1 } from './chunk-BJBLQMMR.js';
|
|
2
|
+
export { createRouteAwareBunMiddleware } from './chunk-BJBLQMMR.js';
|
|
3
|
+
import { resolveNetwork, isValidationError, resolveToken, createPaymentRequirements, PAYMENT_SIGNATURE_HEADER, decodePayloadHeader, findRequirementByAccepted, verifyPayment, extractPayerAddress, settlePayment, createPaymentRequiredHeaders, TOKENS, registerToken, createSettlementHeaders, getSupported } from '@armory-sh/base';
|
|
4
4
|
|
|
5
|
+
var extensionCapabilityCache = /* @__PURE__ */ new Map();
|
|
6
|
+
var EXTENSION_CAPABILITY_TTL_MS = 5 * 60 * 1e3;
|
|
7
|
+
function ensureTokensRegistered() {
|
|
8
|
+
for (const token of Object.values(TOKENS)) {
|
|
9
|
+
try {
|
|
10
|
+
registerToken(token);
|
|
11
|
+
} catch {
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function resolveFacilitatorUrlFromRequirement(config, requirement) {
|
|
16
|
+
const chainId = parseInt(requirement.network.split(":")[1] || "0", 10);
|
|
17
|
+
const assetAddress = requirement.asset.toLowerCase();
|
|
18
|
+
if (config.facilitatorUrlByToken) {
|
|
19
|
+
for (const [chainKey, tokenMap] of Object.entries(
|
|
20
|
+
config.facilitatorUrlByToken
|
|
21
|
+
)) {
|
|
22
|
+
const resolvedChain = resolveNetwork(chainKey);
|
|
23
|
+
if (isValidationError(resolvedChain) || resolvedChain.config.chainId !== chainId) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
for (const [tokenKey, url] of Object.entries(tokenMap)) {
|
|
27
|
+
const resolvedToken = resolveToken(tokenKey, resolvedChain);
|
|
28
|
+
if (!isValidationError(resolvedToken) && resolvedToken.config.contractAddress.toLowerCase() === assetAddress) {
|
|
29
|
+
return url;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (config.facilitatorUrlByChain) {
|
|
35
|
+
for (const [chainKey, url] of Object.entries(
|
|
36
|
+
config.facilitatorUrlByChain
|
|
37
|
+
)) {
|
|
38
|
+
const resolvedChain = resolveNetwork(chainKey);
|
|
39
|
+
if (!isValidationError(resolvedChain) && resolvedChain.config.chainId === chainId) {
|
|
40
|
+
return url;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return config.facilitatorUrl;
|
|
45
|
+
}
|
|
46
|
+
function createPaymentRequirements2(config) {
|
|
47
|
+
if (config.requirements) {
|
|
48
|
+
return {
|
|
49
|
+
requirements: Array.isArray(config.requirements) ? config.requirements : [config.requirements]
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (!config.payTo) {
|
|
53
|
+
return {
|
|
54
|
+
requirements: [],
|
|
55
|
+
error: {
|
|
56
|
+
code: "VALIDATION_FAILED",
|
|
57
|
+
message: "Missing payment configuration: provide payTo or explicit requirements"
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
ensureTokensRegistered();
|
|
62
|
+
return createPaymentRequirements(config);
|
|
63
|
+
}
|
|
64
|
+
async function resolvePaymentRequiredExtensions(config, requirements) {
|
|
65
|
+
if (!config.extensions) {
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
let filtered = { ...config.extensions };
|
|
69
|
+
for (const requirement of requirements) {
|
|
70
|
+
const facilitatorUrl = resolveFacilitatorUrlFromRequirement(config, requirement);
|
|
71
|
+
if (!facilitatorUrl) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const cacheKey = `${facilitatorUrl}|${requirement.network.toLowerCase()}`;
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
let keys = extensionCapabilityCache.get(cacheKey);
|
|
77
|
+
if (!keys || keys.expiresAt <= now) {
|
|
78
|
+
try {
|
|
79
|
+
const supported = await getSupported({ url: facilitatorUrl });
|
|
80
|
+
const nextKeys = /* @__PURE__ */ new Set();
|
|
81
|
+
for (const kind of supported.kinds) {
|
|
82
|
+
if (kind.network.toLowerCase() !== requirement.network.toLowerCase()) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (kind.extra && typeof kind.extra === "object") {
|
|
86
|
+
for (const key of Object.keys(kind.extra)) {
|
|
87
|
+
nextKeys.add(key);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
keys = { expiresAt: now + EXTENSION_CAPABILITY_TTL_MS, keys: nextKeys };
|
|
92
|
+
} catch {
|
|
93
|
+
keys = { expiresAt: now + EXTENSION_CAPABILITY_TTL_MS, keys: /* @__PURE__ */ new Set() };
|
|
94
|
+
}
|
|
95
|
+
extensionCapabilityCache.set(cacheKey, keys);
|
|
96
|
+
}
|
|
97
|
+
filtered = Object.fromEntries(
|
|
98
|
+
Object.entries(filtered).filter(([key]) => keys.keys.has(key))
|
|
99
|
+
);
|
|
100
|
+
if (Object.keys(filtered).length === 0) {
|
|
101
|
+
return {};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return filtered;
|
|
105
|
+
}
|
|
106
|
+
var errorResponse = (error, status, headers, accepts) => new Response(JSON.stringify({ error, accepts }), {
|
|
107
|
+
status,
|
|
108
|
+
headers: { "Content-Type": "application/json", ...headers }
|
|
109
|
+
});
|
|
110
|
+
var successResponse = (payerAddress, settlement) => {
|
|
111
|
+
return new Response(
|
|
112
|
+
JSON.stringify({
|
|
113
|
+
verified: true,
|
|
114
|
+
payerAddress,
|
|
115
|
+
settlement: void 0
|
|
116
|
+
}),
|
|
117
|
+
{
|
|
118
|
+
status: 200,
|
|
119
|
+
headers: {
|
|
120
|
+
"Content-Type": "application/json",
|
|
121
|
+
"X-Payment-Verified": "true",
|
|
122
|
+
"X-Payer-Address": payerAddress,
|
|
123
|
+
...{}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
};
|
|
128
|
+
var appendSettlementHeaders = (response, settlement) => {
|
|
129
|
+
const headers = new Headers(response.headers);
|
|
130
|
+
const settlementHeaders = createSettlementHeaders(settlement);
|
|
131
|
+
for (const [key, value] of Object.entries(settlementHeaders)) {
|
|
132
|
+
headers.set(key, value);
|
|
133
|
+
}
|
|
134
|
+
return new Response(response.body, {
|
|
135
|
+
status: response.status,
|
|
136
|
+
statusText: response.statusText,
|
|
137
|
+
headers
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
var paymentMiddleware = (config, handler) => {
|
|
141
|
+
const { requirements, error } = createPaymentRequirements2(config);
|
|
142
|
+
const resolvePaymentRequiredHeaders = async () => createPaymentRequiredHeaders(requirements, {
|
|
143
|
+
extensions: await resolvePaymentRequiredExtensions(
|
|
144
|
+
config,
|
|
145
|
+
requirements
|
|
146
|
+
)
|
|
147
|
+
});
|
|
148
|
+
return async (request) => {
|
|
149
|
+
if (error) {
|
|
150
|
+
return errorResponse(
|
|
151
|
+
"Payment middleware configuration error",
|
|
152
|
+
500,
|
|
153
|
+
void 0,
|
|
154
|
+
[error.message]
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
const primaryRequirement = requirements[0];
|
|
158
|
+
if (!primaryRequirement) {
|
|
159
|
+
return errorResponse(
|
|
160
|
+
"Payment middleware configuration error: No payment requirements configured",
|
|
161
|
+
500
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
const paymentSig = request.headers.get(PAYMENT_SIGNATURE_HEADER);
|
|
165
|
+
if (!paymentSig) {
|
|
166
|
+
const requiredHeaders = await resolvePaymentRequiredHeaders();
|
|
167
|
+
return errorResponse(
|
|
168
|
+
"Payment required",
|
|
169
|
+
402,
|
|
170
|
+
requiredHeaders,
|
|
171
|
+
[requirements]
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
let payload;
|
|
175
|
+
try {
|
|
176
|
+
payload = decodePayloadHeader(paymentSig, {
|
|
177
|
+
accepted: primaryRequirement
|
|
178
|
+
});
|
|
179
|
+
} catch {
|
|
180
|
+
return errorResponse("Invalid payment payload", 400);
|
|
181
|
+
}
|
|
182
|
+
const selectedRequirement = findRequirementByAccepted(
|
|
183
|
+
requirements,
|
|
184
|
+
payload.accepted
|
|
185
|
+
);
|
|
186
|
+
if (!selectedRequirement) {
|
|
187
|
+
return errorResponse(
|
|
188
|
+
"Invalid payment payload: accepted requirement is not configured for this endpoint",
|
|
189
|
+
400
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
const facilitatorUrl = resolveFacilitatorUrlFromRequirement(
|
|
193
|
+
config,
|
|
194
|
+
selectedRequirement
|
|
195
|
+
);
|
|
196
|
+
if (!facilitatorUrl) {
|
|
197
|
+
return errorResponse(
|
|
198
|
+
"Payment middleware configuration error: Facilitator URL is required",
|
|
199
|
+
500
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
const verifyResult = await verifyPayment(
|
|
203
|
+
payload,
|
|
204
|
+
selectedRequirement,
|
|
205
|
+
{ url: facilitatorUrl }
|
|
206
|
+
);
|
|
207
|
+
if (!verifyResult.isValid) {
|
|
208
|
+
const requiredHeaders = await resolvePaymentRequiredHeaders();
|
|
209
|
+
return errorResponse(
|
|
210
|
+
`Payment verification failed: ${verifyResult.invalidReason}`,
|
|
211
|
+
402,
|
|
212
|
+
requiredHeaders
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
const payerAddress = verifyResult.payer ?? extractPayerAddress(payload);
|
|
216
|
+
if (!handler) {
|
|
217
|
+
return successResponse(payerAddress);
|
|
218
|
+
}
|
|
219
|
+
const response = await handler(request);
|
|
220
|
+
if (response.status >= 400) {
|
|
221
|
+
return response;
|
|
222
|
+
}
|
|
223
|
+
const settleResult = await settlePayment(
|
|
224
|
+
payload,
|
|
225
|
+
selectedRequirement,
|
|
226
|
+
{ url: facilitatorUrl }
|
|
227
|
+
);
|
|
228
|
+
if (!settleResult.success) {
|
|
229
|
+
return errorResponse(
|
|
230
|
+
settleResult.errorReason ?? "Settlement failed",
|
|
231
|
+
502
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
return appendSettlementHeaders(response, settleResult);
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// src/index.ts
|
|
5
239
|
var parsePaymentHeader = async (request, requirements) => {
|
|
6
240
|
const paymentSig = request.headers.get(PAYMENT_SIGNATURE_HEADER);
|
|
7
241
|
if (paymentSig) {
|
|
8
242
|
try {
|
|
9
|
-
const payload = decodePayloadHeader(paymentSig, {
|
|
243
|
+
const payload = decodePayloadHeader(paymentSig, {
|
|
244
|
+
accepted: requirements
|
|
245
|
+
});
|
|
10
246
|
return { payload, payerAddress: extractPayerAddress(payload) };
|
|
11
247
|
} catch {
|
|
12
248
|
}
|
|
13
249
|
}
|
|
14
250
|
return null;
|
|
15
251
|
};
|
|
16
|
-
var
|
|
252
|
+
var errorResponse2 = (error, status, headers, accepts) => new Response(JSON.stringify({ error, accepts }), {
|
|
17
253
|
status,
|
|
18
254
|
headers: { "Content-Type": "application/json", ...headers }
|
|
19
255
|
});
|
|
@@ -23,7 +259,7 @@ var createSettlementResponse = (success, txHash) => ({
|
|
|
23
259
|
errorReason: void 0 ,
|
|
24
260
|
network: "base"
|
|
25
261
|
});
|
|
26
|
-
var
|
|
262
|
+
var successResponse2 = (payerAddress, settlement) => {
|
|
27
263
|
const isSuccess = settlement?.success;
|
|
28
264
|
const txHash = settlement?.transaction;
|
|
29
265
|
return new Response(
|
|
@@ -43,7 +279,7 @@ var successResponse = (payerAddress, settlement) => {
|
|
|
43
279
|
}
|
|
44
280
|
);
|
|
45
281
|
};
|
|
46
|
-
var
|
|
282
|
+
var appendSettlementHeaders2 = (response, settlement) => {
|
|
47
283
|
const headers = new Headers(response.headers);
|
|
48
284
|
const settlementHeaders = createSettlementHeaders(settlement);
|
|
49
285
|
for (const [key, value] of Object.entries(settlementHeaders)) {
|
|
@@ -56,44 +292,72 @@ var appendSettlementHeaders = (response, settlement) => {
|
|
|
56
292
|
});
|
|
57
293
|
};
|
|
58
294
|
var createBunMiddleware = (config, handler) => {
|
|
59
|
-
const {
|
|
60
|
-
|
|
295
|
+
const {
|
|
296
|
+
facilitator,
|
|
297
|
+
settlementMode = "settle",
|
|
298
|
+
waitForSettlement = false
|
|
299
|
+
} = config;
|
|
300
|
+
const requirements = createPaymentRequirements$1(config);
|
|
61
301
|
const middleware = async (request) => {
|
|
62
302
|
const paymentResult = await parsePaymentHeader(request, requirements);
|
|
63
303
|
if (!paymentResult) {
|
|
64
|
-
return
|
|
304
|
+
return errorResponse2(
|
|
305
|
+
"Payment required",
|
|
306
|
+
402,
|
|
307
|
+
createPaymentRequiredHeaders(requirements),
|
|
308
|
+
[requirements]
|
|
309
|
+
);
|
|
65
310
|
}
|
|
66
311
|
const { payerAddress, payload } = paymentResult;
|
|
67
312
|
if (facilitator) {
|
|
68
|
-
const verifyResult = await verifyPayment(
|
|
313
|
+
const verifyResult = await verifyPayment(
|
|
314
|
+
payload,
|
|
315
|
+
requirements,
|
|
316
|
+
{ url: facilitator.url }
|
|
317
|
+
);
|
|
69
318
|
if (!verifyResult.isValid) {
|
|
70
|
-
return
|
|
319
|
+
return errorResponse2(
|
|
320
|
+
`Payment verification failed: ${verifyResult.invalidReason}`,
|
|
321
|
+
402,
|
|
322
|
+
createPaymentRequiredHeaders(requirements),
|
|
323
|
+
[requirements]
|
|
324
|
+
);
|
|
71
325
|
}
|
|
72
326
|
}
|
|
73
327
|
if (!handler) {
|
|
74
328
|
if (settlementMode === "settle" && facilitator) {
|
|
75
329
|
const settle = async () => {
|
|
76
|
-
const result = await settlePayment(payload, requirements, {
|
|
77
|
-
|
|
330
|
+
const result = await settlePayment(payload, requirements, {
|
|
331
|
+
url: facilitator.url
|
|
332
|
+
});
|
|
333
|
+
return result.success ? successResponse2(
|
|
334
|
+
payerAddress,
|
|
335
|
+
createSettlementResponse(true, result.transaction)
|
|
336
|
+
) : errorResponse2(result.errorReason ?? "Settlement failed", 400);
|
|
78
337
|
};
|
|
79
338
|
if (waitForSettlement) {
|
|
80
339
|
return await settle();
|
|
81
340
|
}
|
|
82
341
|
settle().catch(console.error);
|
|
83
|
-
return
|
|
342
|
+
return successResponse2(payerAddress);
|
|
84
343
|
}
|
|
85
|
-
return
|
|
344
|
+
return successResponse2(payerAddress);
|
|
86
345
|
}
|
|
87
346
|
const response = await handler(request);
|
|
88
347
|
if (response.status >= 400 || settlementMode !== "settle" || !facilitator) {
|
|
89
348
|
return response;
|
|
90
349
|
}
|
|
91
|
-
const settleResult = await settlePayment(payload, requirements, {
|
|
350
|
+
const settleResult = await settlePayment(payload, requirements, {
|
|
351
|
+
url: facilitator.url
|
|
352
|
+
});
|
|
92
353
|
if (!settleResult.success) {
|
|
93
|
-
return
|
|
354
|
+
return errorResponse2(
|
|
355
|
+
settleResult.errorReason ?? "Settlement failed",
|
|
356
|
+
502
|
|
357
|
+
);
|
|
94
358
|
}
|
|
95
359
|
const settlement = createSettlementResponse(true, settleResult.transaction);
|
|
96
|
-
return
|
|
360
|
+
return appendSettlementHeaders2(response, settlement);
|
|
97
361
|
};
|
|
98
362
|
if (!handler) {
|
|
99
363
|
return middleware;
|
|
@@ -101,10 +365,10 @@ var createBunMiddleware = (config, handler) => {
|
|
|
101
365
|
return async (request) => {
|
|
102
366
|
const result = await middleware(request);
|
|
103
367
|
if (!result) {
|
|
104
|
-
return
|
|
368
|
+
return errorResponse2("Payment middleware returned no response", 500);
|
|
105
369
|
}
|
|
106
370
|
return result;
|
|
107
371
|
};
|
|
108
372
|
};
|
|
109
373
|
|
|
110
|
-
export { createBunMiddleware };
|
|
374
|
+
export { createBunMiddleware, createPaymentRequirements2 as createPaymentRequirements, paymentMiddleware, resolveFacilitatorUrlFromRequirement };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { PaymentRequirementsV2, PayToAddress, FacilitatorConfig, SettlementMode } from '@armory-sh/base';
|
|
2
|
+
|
|
3
|
+
type NetworkId = string | number;
|
|
4
|
+
type TokenId = string;
|
|
5
|
+
interface PaymentConfig {
|
|
6
|
+
payTo?: string;
|
|
7
|
+
requirements?: PaymentRequirementsV2 | PaymentRequirementsV2[];
|
|
8
|
+
chains?: NetworkId[];
|
|
9
|
+
chain?: NetworkId;
|
|
10
|
+
tokens?: TokenId[];
|
|
11
|
+
token?: TokenId;
|
|
12
|
+
amount?: string;
|
|
13
|
+
maxTimeoutSeconds?: number;
|
|
14
|
+
facilitatorUrl?: string;
|
|
15
|
+
facilitatorUrlByChain?: Record<string, string>;
|
|
16
|
+
facilitatorUrlByToken?: Record<string, Record<string, string>>;
|
|
17
|
+
extensions?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
interface ResolvedRequirementsConfig {
|
|
20
|
+
requirements: PaymentRequirementsV2[];
|
|
21
|
+
error?: {
|
|
22
|
+
code: string;
|
|
23
|
+
message: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
type BunMiddleware$1 = (request: Request) => Promise<Response | null>;
|
|
27
|
+
type BunHandler = (request: Request) => Promise<Response> | Response;
|
|
28
|
+
declare function resolveFacilitatorUrlFromRequirement(config: PaymentConfig, requirement: PaymentRequirementsV2): string | undefined;
|
|
29
|
+
declare function createPaymentRequirements(config: PaymentConfig): ResolvedRequirementsConfig;
|
|
30
|
+
declare const paymentMiddleware: (config: PaymentConfig, handler?: BunHandler) => BunMiddleware$1;
|
|
31
|
+
|
|
32
|
+
interface MiddlewareConfig {
|
|
33
|
+
payTo: PayToAddress;
|
|
34
|
+
network: string | number;
|
|
35
|
+
amount: string;
|
|
36
|
+
facilitator?: FacilitatorConfig;
|
|
37
|
+
settlementMode?: SettlementMode;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
type BunMiddleware = (request: Request) => Promise<Response | null>;
|
|
41
|
+
interface RouteAwareBunMiddlewareConfig extends MiddlewareConfig {
|
|
42
|
+
route?: string;
|
|
43
|
+
routes?: string[];
|
|
44
|
+
perRoute?: Record<string, Partial<MiddlewareConfig>>;
|
|
45
|
+
waitForSettlement?: boolean;
|
|
46
|
+
}
|
|
47
|
+
declare const createRouteAwareBunMiddleware: (config: RouteAwareBunMiddlewareConfig, handler?: BunHandler) => BunMiddleware | ((request: Request) => Promise<Response>);
|
|
48
|
+
|
|
49
|
+
export { type BunHandler as B, type MiddlewareConfig as M, type PaymentConfig as P, type ResolvedRequirementsConfig as R, type BunMiddleware$1 as a, type RouteAwareBunMiddlewareConfig as b, createPaymentRequirements as c, createRouteAwareBunMiddleware as d, type BunMiddleware as e, paymentMiddleware as p, resolveFacilitatorUrlFromRequirement as r };
|
package/dist/routes.d.ts
CHANGED
|
@@ -1,27 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
interface MiddlewareConfig {
|
|
4
|
-
payTo: PayToAddress;
|
|
5
|
-
network: string | number;
|
|
6
|
-
amount: string;
|
|
7
|
-
facilitator?: FacilitatorConfig;
|
|
8
|
-
settlementMode?: SettlementMode;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
type BunMiddleware$1 = (request: Request) => Promise<Response | null>;
|
|
12
|
-
interface RouteAwareBunMiddlewareConfig extends MiddlewareConfig {
|
|
13
|
-
route?: string;
|
|
14
|
-
routes?: string[];
|
|
15
|
-
perRoute?: Record<string, Partial<MiddlewareConfig>>;
|
|
16
|
-
waitForSettlement?: boolean;
|
|
17
|
-
}
|
|
18
|
-
declare const createRouteAwareBunMiddleware: (config: RouteAwareBunMiddlewareConfig, handler?: BunHandler) => BunMiddleware$1 | ((request: Request) => Promise<Response>);
|
|
19
|
-
|
|
20
|
-
type BunMiddleware = (request: Request) => Promise<Response | null>;
|
|
21
|
-
type BunHandler = (request: Request) => Promise<Response> | Response;
|
|
22
|
-
interface BunMiddlewareConfig extends MiddlewareConfig {
|
|
23
|
-
waitForSettlement?: boolean;
|
|
24
|
-
}
|
|
25
|
-
declare const createBunMiddleware: (config: BunMiddlewareConfig, handler?: BunHandler) => BunMiddleware | ((request: Request) => Promise<Response>);
|
|
26
|
-
|
|
27
|
-
export { type BunHandler as B, type BunMiddleware$1 as BunMiddleware, type RouteAwareBunMiddlewareConfig, type BunMiddleware as a, type BunMiddlewareConfig as b, createBunMiddleware as c, createRouteAwareBunMiddleware };
|
|
1
|
+
export { e as BunMiddleware, b as RouteAwareBunMiddlewareConfig, d as createRouteAwareBunMiddleware } from './routes-C69V5KAQ.js';
|
|
2
|
+
import '@armory-sh/base';
|
package/dist/routes.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { createRouteAwareBunMiddleware } from './chunk-
|
|
1
|
+
export { createRouteAwareBunMiddleware } from './chunk-BJBLQMMR.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@armory-sh/middleware-bun",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.28",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Sawyer Cutler <sawyer@dirtroad.dev>",
|
|
6
6
|
"keywords": [
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"directory": "packages/middleware-bun"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@armory-sh/base": "0.2.
|
|
46
|
+
"@armory-sh/base": "0.2.30"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"bun-types": "latest",
|
|
@@ -52,6 +52,8 @@
|
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "rm -rf dist && tsup",
|
|
55
|
+
"lint": "bun run build",
|
|
56
|
+
"format": "bun run lint",
|
|
55
57
|
"test": "bun test"
|
|
56
58
|
}
|
|
57
59
|
}
|