@armory-sh/middleware-bun 0.3.27 → 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/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { M as MiddlewareConfig, B as BunHandler, a as BunMiddleware } from './routes-BKjM-6xh.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-BKjM-6xh.js';
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';
3
3
  import '@armory-sh/base';
4
4
 
5
5
  interface BunMiddlewareConfig extends MiddlewareConfig {
package/dist/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import { createPaymentRequirements as createPaymentRequirements$1 } from './chunk-BJBLQMMR.js';
2
2
  export { createRouteAwareBunMiddleware } from './chunk-BJBLQMMR.js';
3
- import { resolveNetwork, isValidationError, resolveToken, createPaymentRequirements, PAYMENT_SIGNATURE_HEADER, createPaymentRequiredHeaders, decodePayloadHeader, findRequirementByAccepted, verifyPayment, extractPayerAddress, settlePayment, TOKENS, registerToken, createSettlementHeaders } from '@armory-sh/base';
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;
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 (!isValidationError(resolvedChain) && resolvedChain.config.chainId === chainId) {
22
- for (const [, url] of Object.entries(tokenMap)) {
23
- const network = resolveNetwork(chainKey);
24
- if (!isValidationError(network)) {
25
- for (const tokenKey of Object.keys(tokenMap)) {
26
- const resolvedToken = resolveToken(tokenKey, network);
27
- if (!isValidationError(resolvedToken) && resolvedToken.config.contractAddress.toLowerCase() === assetAddress) {
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
  }
@@ -63,6 +61,48 @@ function createPaymentRequirements2(config) {
63
61
  ensureTokensRegistered();
64
62
  return createPaymentRequirements(config);
65
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
+ }
66
106
  var errorResponse = (error, status, headers, accepts) => new Response(JSON.stringify({ error, accepts }), {
67
107
  status,
68
108
  headers: { "Content-Type": "application/json", ...headers }
@@ -99,6 +139,12 @@ var appendSettlementHeaders = (response, settlement) => {
99
139
  };
100
140
  var paymentMiddleware = (config, handler) => {
101
141
  const { requirements, error } = createPaymentRequirements2(config);
142
+ const resolvePaymentRequiredHeaders = async () => createPaymentRequiredHeaders(requirements, {
143
+ extensions: await resolvePaymentRequiredExtensions(
144
+ config,
145
+ requirements
146
+ )
147
+ });
102
148
  return async (request) => {
103
149
  if (error) {
104
150
  return errorResponse(
@@ -117,10 +163,11 @@ var paymentMiddleware = (config, handler) => {
117
163
  }
118
164
  const paymentSig = request.headers.get(PAYMENT_SIGNATURE_HEADER);
119
165
  if (!paymentSig) {
166
+ const requiredHeaders = await resolvePaymentRequiredHeaders();
120
167
  return errorResponse(
121
168
  "Payment required",
122
169
  402,
123
- createPaymentRequiredHeaders(requirements),
170
+ requiredHeaders,
124
171
  [requirements]
125
172
  );
126
173
  }
@@ -158,10 +205,11 @@ var paymentMiddleware = (config, handler) => {
158
205
  { url: facilitatorUrl }
159
206
  );
160
207
  if (!verifyResult.isValid) {
208
+ const requiredHeaders = await resolvePaymentRequiredHeaders();
161
209
  return errorResponse(
162
210
  `Payment verification failed: ${verifyResult.invalidReason}`,
163
211
  402,
164
- createPaymentRequiredHeaders(requirements)
212
+ requiredHeaders
165
213
  );
166
214
  }
167
215
  const payerAddress = verifyResult.payer ?? extractPayerAddress(payload);
@@ -14,6 +14,7 @@ interface PaymentConfig {
14
14
  facilitatorUrl?: string;
15
15
  facilitatorUrlByChain?: Record<string, string>;
16
16
  facilitatorUrlByToken?: Record<string, Record<string, string>>;
17
+ extensions?: Record<string, unknown>;
17
18
  }
18
19
  interface ResolvedRequirementsConfig {
19
20
  requirements: PaymentRequirementsV2[];
package/dist/routes.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { e as BunMiddleware, b as RouteAwareBunMiddlewareConfig, d as createRouteAwareBunMiddleware } from './routes-BKjM-6xh.js';
1
+ export { e as BunMiddleware, b as RouteAwareBunMiddlewareConfig, d as createRouteAwareBunMiddleware } from './routes-C69V5KAQ.js';
2
2
  import '@armory-sh/base';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@armory-sh/middleware-bun",
3
- "version": "0.3.27",
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.29"
46
+ "@armory-sh/base": "0.2.30"
47
47
  },
48
48
  "devDependencies": {
49
49
  "bun-types": "latest",