@armory-sh/middleware-elysia 0.3.27 → 0.3.29
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/index.d.ts +1 -0
- package/dist/index.js +64 -15
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ interface PaymentConfig {
|
|
|
16
16
|
facilitatorUrl?: string;
|
|
17
17
|
facilitatorUrlByChain?: Record<string, string>;
|
|
18
18
|
facilitatorUrlByToken?: Record<string, Record<string, string>>;
|
|
19
|
+
extensions?: Record<string, unknown>;
|
|
19
20
|
}
|
|
20
21
|
interface ResolvedRequirementsConfig {
|
|
21
22
|
requirements: PaymentRequirementsV2[];
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { routeAwarePaymentMiddleware } from './chunk-L45RQOFN.js';
|
|
2
|
-
import { resolveNetwork, isValidationError, resolveToken, createPaymentRequirements as createPaymentRequirements$1, PAYMENT_SIGNATURE_HEADER,
|
|
2
|
+
import { resolveNetwork, isValidationError, resolveToken, enrichPaymentRequirements, createPaymentRequirements as createPaymentRequirements$1, PAYMENT_SIGNATURE_HEADER, decodePayloadHeader, findRequirementByAccepted, verifyPayment, settlePayment, createSettlementHeaders, createPaymentRequiredHeaders, TOKENS, registerToken, getSupported } from '@armory-sh/base';
|
|
3
3
|
import { Elysia } from 'elysia';
|
|
4
4
|
|
|
5
|
+
var extensionCapabilityCache = /* @__PURE__ */ new Map();
|
|
6
|
+
var EXTENSION_CAPABILITY_TTL_MS = 5 * 60 * 1e3;
|
|
5
7
|
function ensureTokensRegistered() {
|
|
6
8
|
for (const token of Object.values(TOKENS)) {
|
|
7
9
|
try {
|
|
@@ -18,17 +20,13 @@ function resolveFacilitatorUrlFromRequirement(config, requirement) {
|
|
|
18
20
|
config.facilitatorUrlByToken
|
|
19
21
|
)) {
|
|
20
22
|
const resolvedChain = resolveNetwork(chainKey);
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return url;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
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;
|
|
32
30
|
}
|
|
33
31
|
}
|
|
34
32
|
}
|
|
@@ -47,8 +45,9 @@ function resolveFacilitatorUrlFromRequirement(config, requirement) {
|
|
|
47
45
|
}
|
|
48
46
|
function createPaymentRequirements(config) {
|
|
49
47
|
if (config.requirements) {
|
|
48
|
+
const requirements = Array.isArray(config.requirements) ? config.requirements : [config.requirements];
|
|
50
49
|
return {
|
|
51
|
-
requirements:
|
|
50
|
+
requirements: enrichPaymentRequirements(requirements)
|
|
52
51
|
};
|
|
53
52
|
}
|
|
54
53
|
if (!config.payTo) {
|
|
@@ -63,12 +62,60 @@ function createPaymentRequirements(config) {
|
|
|
63
62
|
ensureTokensRegistered();
|
|
64
63
|
return createPaymentRequirements$1(config);
|
|
65
64
|
}
|
|
65
|
+
async function resolvePaymentRequiredExtensions(config, requirements) {
|
|
66
|
+
if (!config.extensions) {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
let filtered = { ...config.extensions };
|
|
70
|
+
for (const requirement of requirements) {
|
|
71
|
+
const facilitatorUrl = resolveFacilitatorUrlFromRequirement(config, requirement);
|
|
72
|
+
if (!facilitatorUrl) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const cacheKey = `${facilitatorUrl}|${requirement.network.toLowerCase()}`;
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
let keys = extensionCapabilityCache.get(cacheKey);
|
|
78
|
+
if (!keys || keys.expiresAt <= now) {
|
|
79
|
+
try {
|
|
80
|
+
const supported = await getSupported({ url: facilitatorUrl });
|
|
81
|
+
const nextKeys = /* @__PURE__ */ new Set();
|
|
82
|
+
for (const kind of supported.kinds) {
|
|
83
|
+
if (kind.network.toLowerCase() !== requirement.network.toLowerCase()) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (kind.extra && typeof kind.extra === "object") {
|
|
87
|
+
for (const key of Object.keys(kind.extra)) {
|
|
88
|
+
nextKeys.add(key);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
keys = { expiresAt: now + EXTENSION_CAPABILITY_TTL_MS, keys: nextKeys };
|
|
93
|
+
} catch {
|
|
94
|
+
keys = { expiresAt: now + EXTENSION_CAPABILITY_TTL_MS, keys: /* @__PURE__ */ new Set() };
|
|
95
|
+
}
|
|
96
|
+
extensionCapabilityCache.set(cacheKey, keys);
|
|
97
|
+
}
|
|
98
|
+
filtered = Object.fromEntries(
|
|
99
|
+
Object.entries(filtered).filter(([key]) => keys.keys.has(key))
|
|
100
|
+
);
|
|
101
|
+
if (Object.keys(filtered).length === 0) {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return filtered;
|
|
106
|
+
}
|
|
66
107
|
var errorResponse = (error, status, headers) => new Response(JSON.stringify(error), {
|
|
67
108
|
status,
|
|
68
109
|
headers: { "Content-Type": "application/json", ...headers }
|
|
69
110
|
});
|
|
70
111
|
var paymentMiddleware = (config) => {
|
|
71
112
|
const { requirements, error } = createPaymentRequirements(config);
|
|
113
|
+
const resolvePaymentRequiredHeaders = async () => createPaymentRequiredHeaders(requirements, {
|
|
114
|
+
extensions: await resolvePaymentRequiredExtensions(
|
|
115
|
+
config,
|
|
116
|
+
requirements
|
|
117
|
+
)
|
|
118
|
+
});
|
|
72
119
|
return new Elysia({ name: "armory-payment" }).derive(() => ({
|
|
73
120
|
payment: void 0
|
|
74
121
|
})).onBeforeHandle(async (context) => {
|
|
@@ -95,10 +142,11 @@ var paymentMiddleware = (config) => {
|
|
|
95
142
|
PAYMENT_SIGNATURE_HEADER
|
|
96
143
|
);
|
|
97
144
|
if (!paymentHeader) {
|
|
145
|
+
const requiredHeaders = await resolvePaymentRequiredHeaders();
|
|
98
146
|
return errorResponse(
|
|
99
147
|
{ error: "Payment required", accepts: requirements },
|
|
100
148
|
402,
|
|
101
|
-
|
|
149
|
+
requiredHeaders
|
|
102
150
|
);
|
|
103
151
|
}
|
|
104
152
|
let paymentPayload;
|
|
@@ -147,13 +195,14 @@ var paymentMiddleware = (config) => {
|
|
|
147
195
|
{ url: facilitatorUrl }
|
|
148
196
|
);
|
|
149
197
|
if (!verifyResult.isValid) {
|
|
198
|
+
const requiredHeaders = await resolvePaymentRequiredHeaders();
|
|
150
199
|
return errorResponse(
|
|
151
200
|
{
|
|
152
201
|
error: "Payment verification failed",
|
|
153
202
|
message: verifyResult.invalidReason
|
|
154
203
|
},
|
|
155
204
|
402,
|
|
156
|
-
|
|
205
|
+
requiredHeaders
|
|
157
206
|
);
|
|
158
207
|
}
|
|
159
208
|
const payerAddress = verifyResult.payer ?? paymentPayload.payload.authorization.from;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@armory-sh/middleware-elysia",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.29",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Sawyer Cutler <sawyer@dirtroad.dev>",
|
|
6
6
|
"keywords": [
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"elysia": "^1"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@armory-sh/base": "0.2.
|
|
50
|
+
"@armory-sh/base": "0.2.31"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"bun-types": "latest",
|