@weftlabs/sdk 0.25.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.
Files changed (124) hide show
  1. package/README.md +499 -0
  2. package/dist/client-C9_zh3Qg.d.mts +11 -0
  3. package/dist/client-C9_zh3Qg.d.ts +11 -0
  4. package/dist/facilitator/index.d.mts +18 -0
  5. package/dist/facilitator/index.d.ts +18 -0
  6. package/dist/facilitator/index.js +180 -0
  7. package/dist/facilitator/index.js.map +1 -0
  8. package/dist/facilitator/index.mjs +149 -0
  9. package/dist/facilitator/index.mjs.map +1 -0
  10. package/dist/facilitator/middleware/index.d.mts +539 -0
  11. package/dist/facilitator/middleware/index.d.ts +539 -0
  12. package/dist/facilitator/middleware/index.js +1522 -0
  13. package/dist/facilitator/middleware/index.js.map +1 -0
  14. package/dist/facilitator/middleware/index.mjs +1493 -0
  15. package/dist/facilitator/middleware/index.mjs.map +1 -0
  16. package/dist/index.d.mts +5667 -0
  17. package/dist/index.d.ts +5667 -0
  18. package/dist/index.js +5555 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index.mjs +5553 -0
  21. package/dist/index.mjs.map +1 -0
  22. package/dist/server.d.mts +8 -0
  23. package/dist/server.d.ts +8 -0
  24. package/dist/server.js +1587 -0
  25. package/dist/server.js.map +1 -0
  26. package/dist/server.mjs +1574 -0
  27. package/dist/server.mjs.map +1 -0
  28. package/docs/APIKeysApi.md +219 -0
  29. package/docs/AccountApi.md +72 -0
  30. package/docs/AccountBootstrapApproval.md +36 -0
  31. package/docs/AccountBootstrapCreated.md +44 -0
  32. package/docs/AccountBootstrapCreatedApproval.md +38 -0
  33. package/docs/AccountBootstrapCreatedResponse.md +32 -0
  34. package/docs/AccountBootstrapRequest.md +42 -0
  35. package/docs/AccountBootstrapStatus.md +40 -0
  36. package/docs/AccountBootstrapStatusResponse.md +32 -0
  37. package/docs/AccountDetails.md +43 -0
  38. package/docs/AgentBootstrapApi.md +223 -0
  39. package/docs/ApiKey.md +42 -0
  40. package/docs/ApiKeyCreated.md +40 -0
  41. package/docs/ApiKeyCreatedResponse.md +32 -0
  42. package/docs/ApiKeyListResponse.md +34 -0
  43. package/docs/AuthApi.md +408 -0
  44. package/docs/AuthResponse.md +32 -0
  45. package/docs/AuthResponseData.md +36 -0
  46. package/docs/BalanceApi.md +73 -0
  47. package/docs/BalanceResponse.md +45 -0
  48. package/docs/ConfirmRequest.md +32 -0
  49. package/docs/CreateApiKeyRequest.md +32 -0
  50. package/docs/DocumentationApi.md +65 -0
  51. package/docs/EnrolledResource.md +59 -0
  52. package/docs/ErrorResponse.md +33 -0
  53. package/docs/Fetch403Response.md +44 -0
  54. package/docs/FetchApi.md +91 -0
  55. package/docs/FetchBalanceSnapshot.md +41 -0
  56. package/docs/FetchErrorResponse.md +41 -0
  57. package/docs/FetchRequest.md +46 -0
  58. package/docs/FetchRequestBody.md +31 -0
  59. package/docs/FetchResponse.md +49 -0
  60. package/docs/InsufficientScopeResponse.md +37 -0
  61. package/docs/MeApiKey.md +40 -0
  62. package/docs/MeApiKeyCreator.md +37 -0
  63. package/docs/MeResponse.md +32 -0
  64. package/docs/MeResponseData.md +56 -0
  65. package/docs/MessageResponse.md +32 -0
  66. package/docs/MessageResponseData.md +32 -0
  67. package/docs/ModelError.md +39 -0
  68. package/docs/Pagination.md +38 -0
  69. package/docs/PasswordResetRequest.md +32 -0
  70. package/docs/PasswordUpdateRequest.md +36 -0
  71. package/docs/Payment.md +56 -0
  72. package/docs/PaymentListResponse.md +34 -0
  73. package/docs/PaymentResponse.md +32 -0
  74. package/docs/PaymentsApi.md +154 -0
  75. package/docs/PrincipalWallet.md +34 -0
  76. package/docs/PromoBalance.md +37 -0
  77. package/docs/Purchase.md +58 -0
  78. package/docs/PurchaseArtifact.md +38 -0
  79. package/docs/PurchaseListResponse.md +34 -0
  80. package/docs/PurchaseResponse.md +32 -0
  81. package/docs/PurchasesApi.md +157 -0
  82. package/docs/RateLimitResponse.md +34 -0
  83. package/docs/ResendConfirmationRequest.md +32 -0
  84. package/docs/ResourceEnrollmentRequest.md +39 -0
  85. package/docs/ResourceEnrollmentResponse.md +32 -0
  86. package/docs/ResourceStats.md +45 -0
  87. package/docs/ResourcesApi.md +77 -0
  88. package/docs/SearchAccessMethod.md +52 -0
  89. package/docs/SearchApi.md +86 -0
  90. package/docs/SearchCapabilityRef.md +34 -0
  91. package/docs/SearchCuratedCallability.md +34 -0
  92. package/docs/SearchCuratedExecution.md +32 -0
  93. package/docs/SearchCuratedOperation.md +36 -0
  94. package/docs/SearchCuratedService.md +34 -0
  95. package/docs/SearchCuratedSource.md +36 -0
  96. package/docs/SearchEndpointCall.md +39 -0
  97. package/docs/SearchEndpointHit.md +74 -0
  98. package/docs/SearchEndpointPrice.md +41 -0
  99. package/docs/SearchErrorResponse.md +35 -0
  100. package/docs/SearchExecutionModeFilter.md +34 -0
  101. package/docs/SearchFilterSpec.md +49 -0
  102. package/docs/SearchMethodFilter.md +34 -0
  103. package/docs/SearchPaymentOffer.md +47 -0
  104. package/docs/SearchPriceAtomicFilter.md +41 -0
  105. package/docs/SearchPriceUsdFilter.md +41 -0
  106. package/docs/SearchProtocolFilter.md +35 -0
  107. package/docs/SearchProviderRef.md +36 -0
  108. package/docs/SearchRequest.md +36 -0
  109. package/docs/SearchResourceTypeFilter.md +35 -0
  110. package/docs/SearchResponse.md +67 -0
  111. package/docs/SearchResponseWarningsInner.md +38 -0
  112. package/docs/SearchResult.md +38 -0
  113. package/docs/SearchStringSetFilter.md +34 -0
  114. package/docs/SearchWeftFetchCompatibility.md +36 -0
  115. package/docs/SignInRequest.md +34 -0
  116. package/docs/SignUpRequest.md +36 -0
  117. package/docs/SpendingPolicy.md +36 -0
  118. package/docs/User.md +36 -0
  119. package/docs/UserPrincipal.md +49 -0
  120. package/docs/Wallet.md +42 -0
  121. package/examples/charge-api-hono.mjs +40 -0
  122. package/examples/charge-api.mjs +43 -0
  123. package/examples/quickstart.mjs +16 -0
  124. package/package.json +105 -0
package/dist/server.js ADDED
@@ -0,0 +1,1587 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/server.ts
22
+ var server_exports = {};
23
+ __export(server_exports, {
24
+ MAX_EXTENSION_BYTES: () => MAX_EXTENSION_BYTES,
25
+ WEFT_API_KEY_HEADER: () => WEFT_API_KEY_HEADER,
26
+ WEFT_DECLARED_HEADER: () => WEFT_DECLARED_HEADER,
27
+ WEFT_PRODUCT_EXTENSION_KEY: () => WEFT_PRODUCT_EXTENSION_KEY,
28
+ WEFT_PRODUCT_INFO_SCHEMA: () => WEFT_PRODUCT_INFO_SCHEMA,
29
+ WEFT_REQUEST_EXTENSION_KEY: () => WEFT_REQUEST_EXTENSION_KEY,
30
+ WEFT_REQUEST_INFO_SCHEMA: () => WEFT_REQUEST_INFO_SCHEMA,
31
+ WEFT_TYPE_TAG_PREFIX: () => WEFT_TYPE_TAG_PREFIX,
32
+ X402_FACILITATOR_URL: () => X402_FACILITATOR_URL,
33
+ applyProductIdentity: () => applyProductIdentity,
34
+ createFacilitatorClient: () => createFacilitatorClient,
35
+ getFeeInfo: () => getFeeInfo,
36
+ invalidateFeeCache: () => invalidateFeeCache,
37
+ productTypeTag: () => productTypeTag,
38
+ registerDynamicExtensions: () => registerDynamicExtensions,
39
+ weftPaymentMiddleware: () => weftPaymentMiddleware,
40
+ weftPaymentMiddlewareHono: () => weftPaymentMiddlewareHono
41
+ });
42
+ module.exports = __toCommonJS(server_exports);
43
+ __reExport(server_exports, require("@x402/core/server"), module.exports);
44
+
45
+ // src/facilitator/index.ts
46
+ var facilitator_exports = {};
47
+ __export(facilitator_exports, {
48
+ X402_FACILITATOR_URL: () => X402_FACILITATOR_URL,
49
+ createFacilitatorClient: () => createFacilitatorClient,
50
+ getFeeInfo: () => getFeeInfo,
51
+ invalidateFeeCache: () => invalidateFeeCache
52
+ });
53
+ __reExport(facilitator_exports, require("@x402/core"));
54
+ __reExport(facilitator_exports, require("@x402/core/types"));
55
+
56
+ // src/facilitator/client.ts
57
+ var import_server = require("@x402/core/server");
58
+ var FACILITATOR_UNAVAILABLE_ERROR = "weft:facilitator-settle-unavailable";
59
+ var X402_FACILITATOR_URL = "https://x402.weft.network";
60
+ var X402_FACILITATOR_URL_ENV = "X402_FACILITATOR_URL";
61
+ var FacilitatorUnavailableError = class extends Error {
62
+ constructor() {
63
+ super(FACILITATOR_UNAVAILABLE_ERROR);
64
+ this.statusCode = 503;
65
+ this.name = "FacilitatorUnavailableError";
66
+ }
67
+ };
68
+ function isUnavailableSettleError(error) {
69
+ if (!(error instanceof Error)) return false;
70
+ const candidate = error;
71
+ return candidate.name === "SettleError" && candidate.statusCode === 503 && "errorReason" in candidate && "errorMessage" in candidate && "payer" in candidate && "transaction" in candidate && "network" in candidate && !(candidate.errorReason === "settlement_pending" && candidate.transaction);
72
+ }
73
+ var WeftHTTPFacilitatorClient = class extends import_server.HTTPFacilitatorClient {
74
+ async settle(paymentPayload, paymentRequirements) {
75
+ try {
76
+ return await super.settle(paymentPayload, paymentRequirements);
77
+ } catch (error) {
78
+ if (isUnavailableSettleError(error)) {
79
+ throw new FacilitatorUnavailableError();
80
+ }
81
+ throw error;
82
+ }
83
+ }
84
+ };
85
+ function validateUrl(url) {
86
+ if (!url || url.trim() === "") {
87
+ throw new Error("Invalid URL: URL cannot be empty");
88
+ }
89
+ if (!url.startsWith("http://") && !url.startsWith("https://")) {
90
+ throw new Error(
91
+ `Invalid URL format: URL must start with http:// or https://, got: ${url}`
92
+ );
93
+ }
94
+ }
95
+ function resolveUrl(config) {
96
+ if (config?.url) {
97
+ return config.url;
98
+ }
99
+ if (typeof process !== "undefined" && process.env?.[X402_FACILITATOR_URL_ENV]) {
100
+ return process.env[X402_FACILITATOR_URL_ENV];
101
+ }
102
+ return X402_FACILITATOR_URL;
103
+ }
104
+ function assertPathKeyedAuthHeaders(headers) {
105
+ const isHeaderObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
106
+ const hasPathKey = ["verify", "settle", "supported", "bazaar"].some(
107
+ (key) => isHeaderObject(headers[key])
108
+ );
109
+ const looksFlat = !hasPathKey && Object.values(headers).some((value) => !isHeaderObject(value));
110
+ if (looksFlat) {
111
+ throw new Error(
112
+ 'createAuthHeaders must return an object keyed by facilitator path, e.g. { verify: { Authorization: "..." }, settle: { ... }, supported: { ... } }, but received a flat headers object.'
113
+ );
114
+ }
115
+ }
116
+ function mergeSellerWins(derived, seller) {
117
+ const merged = { ...derived };
118
+ for (const [name, value] of Object.entries(seller ?? {})) {
119
+ for (const existing of Object.keys(merged)) {
120
+ if (existing.toLowerCase() === name.toLowerCase()) {
121
+ delete merged[existing];
122
+ }
123
+ }
124
+ merged[name] = value;
125
+ }
126
+ return merged;
127
+ }
128
+ function createFacilitatorClient(config, weftAuthHeaders) {
129
+ const url = resolveUrl(config);
130
+ validateUrl(url);
131
+ const sellerCreateAuthHeaders = config?.createAuthHeaders;
132
+ const derivedByPath = Object.entries(weftAuthHeaders ?? {}).filter(
133
+ ([, headers]) => headers !== void 0 && Object.keys(headers).length > 0
134
+ );
135
+ const createAuthHeaders = derivedByPath.length > 0 ? async () => {
136
+ const sellerHeaders = sellerCreateAuthHeaders ? await sellerCreateAuthHeaders() : void 0;
137
+ if (sellerHeaders) {
138
+ assertPathKeyedAuthHeaders(sellerHeaders);
139
+ }
140
+ const merged = { ...sellerHeaders };
141
+ for (const [path, derived] of derivedByPath) {
142
+ merged[path] = mergeSellerWins(derived, sellerHeaders?.[path]);
143
+ }
144
+ return merged;
145
+ } : sellerCreateAuthHeaders;
146
+ return new WeftHTTPFacilitatorClient({
147
+ url,
148
+ createAuthHeaders
149
+ });
150
+ }
151
+
152
+ // src/facilitator/fee.ts
153
+ var DEFAULT_CACHE_TTL = 5 * 60 * 1e3;
154
+ var feeCache = null;
155
+ function invalidateFeeCache() {
156
+ feeCache = null;
157
+ }
158
+ function isCacheValid() {
159
+ if (!feeCache) return false;
160
+ const now = Date.now();
161
+ return now - feeCache.fetchedAt < feeCache.ttl;
162
+ }
163
+ async function getFeeInfo(config, cacheConfig) {
164
+ if (isCacheValid() && feeCache) {
165
+ return feeCache.feeInfo;
166
+ }
167
+ const client = createFacilitatorClient(config);
168
+ const supported = await client.getSupported();
169
+ const fee = supported.fee;
170
+ if (!fee) {
171
+ throw new Error("Fee information not found in /supported response");
172
+ }
173
+ if (typeof fee.amount !== "string") {
174
+ throw new Error("Invalid fee structure: amount must be a string");
175
+ }
176
+ if (typeof fee.asset !== "string") {
177
+ throw new Error("Invalid fee structure: asset must be a string");
178
+ }
179
+ if (typeof fee.network !== "string") {
180
+ throw new Error("Invalid fee structure: network must be a string");
181
+ }
182
+ const feeInfo = {
183
+ amount: fee.amount,
184
+ asset: fee.asset,
185
+ network: fee.network
186
+ };
187
+ feeCache = {
188
+ feeInfo,
189
+ fetchedAt: Date.now(),
190
+ ttl: cacheConfig?.ttl ?? DEFAULT_CACHE_TTL
191
+ };
192
+ return feeInfo;
193
+ }
194
+
195
+ // src/facilitator/middleware/express.ts
196
+ var import_server2 = require("@x402/core/server");
197
+
198
+ // package.json
199
+ var version = "0.25.0";
200
+
201
+ // src/facilitator/middleware/product.ts
202
+ var PRODUCT_TYPES = ["api", "agent", "mcp"];
203
+ var WEFT_TYPE_TAG_PREFIX = "weft:type:";
204
+ var MAX_TAGS = 5;
205
+ var MAX_TAG_CHARS = 32;
206
+ var MAX_DIMENSIONS = 8;
207
+ var MAX_DIMENSION_CHARS = 64;
208
+ var DIMENSION_NAME = /^[A-Za-z_][A-Za-z0-9_.-]*$/;
209
+ var MAX_SERVICE_NAME_CHARS = 32;
210
+ var MAX_ICON_URL_CHARS = 2048;
211
+ var PRINTABLE_ASCII = /^[\x20-\x7e]+$/;
212
+ var WEFT_PRODUCT_EXTENSION_KEY = "weft.product";
213
+ var WEFT_PRODUCT_INFO_SCHEMA = {
214
+ $schema: "https://json-schema.org/draft/2020-12/schema",
215
+ type: "object",
216
+ properties: {
217
+ kind: { type: "string", enum: [...PRODUCT_TYPES] },
218
+ product_id: { type: "string", minLength: 1 },
219
+ manifest_hash: { type: "string", minLength: 1 }
220
+ },
221
+ additionalProperties: false
222
+ };
223
+ function productTypeTag(type) {
224
+ return `${WEFT_TYPE_TAG_PREFIX}${type}`;
225
+ }
226
+ function isDeclared(value) {
227
+ return value !== void 0 && value !== null;
228
+ }
229
+ function typeName(value) {
230
+ if (value === null) {
231
+ return "null";
232
+ }
233
+ if (Array.isArray(value)) {
234
+ return "an array";
235
+ }
236
+ return `a ${typeof value}`;
237
+ }
238
+ function show(value) {
239
+ try {
240
+ return JSON.stringify(value) ?? String(value);
241
+ } catch {
242
+ return typeName(value);
243
+ }
244
+ }
245
+ function isSingleRoute(routes) {
246
+ return "accepts" in routes;
247
+ }
248
+ function createWarn() {
249
+ const seen = /* @__PURE__ */ new Set();
250
+ return (message, dedupeKey) => {
251
+ const key = dedupeKey ?? message;
252
+ if (seen.has(key)) {
253
+ return;
254
+ }
255
+ seen.add(key);
256
+ console.warn(`[weft] ${message}`);
257
+ };
258
+ }
259
+ function asString(field, value, warn) {
260
+ if (!isDeclared(value)) {
261
+ return void 0;
262
+ }
263
+ if (typeof value !== "string") {
264
+ warn(
265
+ `ignoring ${field} ${show(value)}: expected a string, got ${typeName(value)}`
266
+ );
267
+ return void 0;
268
+ }
269
+ return value;
270
+ }
271
+ function isReservedTypeTag(tag) {
272
+ return tag.trim().toLowerCase().startsWith(WEFT_TYPE_TAG_PREFIX);
273
+ }
274
+ function resolveType(value, field, warn) {
275
+ if (!isDeclared(value)) {
276
+ return void 0;
277
+ }
278
+ if (typeof value !== "string" || !PRODUCT_TYPES.includes(value)) {
279
+ warn(
280
+ `ignoring ${field} ${show(value)}: expected one of ${PRODUCT_TYPES.join(", ")}`
281
+ );
282
+ return void 0;
283
+ }
284
+ return value;
285
+ }
286
+ function asTagList(value, field, warn) {
287
+ if (!isDeclared(value)) {
288
+ return void 0;
289
+ }
290
+ if (!Array.isArray(value)) {
291
+ warn(
292
+ `ignoring ${field} ${show(value)}: expected an array of strings, got ${typeName(value)}`
293
+ );
294
+ return void 0;
295
+ }
296
+ return value.filter((entry) => {
297
+ if (typeof entry === "string") {
298
+ return true;
299
+ }
300
+ warn(
301
+ `dropping tag ${show(entry)}: expected a string, got ${typeName(entry)}`
302
+ );
303
+ return false;
304
+ });
305
+ }
306
+ function resolveTags(routeTags, identityTags, type, warn) {
307
+ const declared = asTagList(routeTags, "route tags", warn) ?? asTagList(identityTags, "tags", warn);
308
+ if (declared === void 0 && type === void 0) {
309
+ return void 0;
310
+ }
311
+ const sellerTags = (declared ?? []).filter((tag) => {
312
+ if (!isReservedTypeTag(tag)) {
313
+ return true;
314
+ }
315
+ warn(
316
+ `dropping reserved tag ${show(tag)}: declare the product kind with \`type\` (${PRODUCT_TYPES.join(", ")}) on the middleware config or on the route`
317
+ );
318
+ return false;
319
+ });
320
+ const malformed = [];
321
+ const carried = [
322
+ ...type !== void 0 ? [productTypeTag(type)] : [],
323
+ ...sellerTags
324
+ ].filter((tag) => {
325
+ if (tag.length <= MAX_TAG_CHARS && PRINTABLE_ASCII.test(tag)) {
326
+ return true;
327
+ }
328
+ malformed.push(tag);
329
+ return false;
330
+ });
331
+ if (malformed.length > 0) {
332
+ warn(
333
+ `dropping ${malformed.length} tag(s) the x402 protocol cannot carry (max ${MAX_TAG_CHARS} printable-ASCII characters each): ${malformed.join(", ")}`
334
+ );
335
+ }
336
+ const deduped = [...new Set(carried)];
337
+ if (deduped.length > MAX_TAGS) {
338
+ const dropped = deduped.slice(MAX_TAGS);
339
+ warn(
340
+ `dropping ${dropped.length} tag(s): the x402 protocol carries ${MAX_TAGS}` + (type !== void 0 ? " and the declared type uses one of them" : "") + `. Dropped: ${dropped.join(", ")}`
341
+ );
342
+ }
343
+ const bounded = deduped.slice(0, MAX_TAGS);
344
+ return bounded.length > 0 ? bounded : void 0;
345
+ }
346
+ function resolveServiceName(routeServiceName, identityName, warn) {
347
+ const declared = asString("route serviceName", routeServiceName, warn) ?? asString("name", identityName, warn);
348
+ if (declared === void 0) {
349
+ return void 0;
350
+ }
351
+ if (!PRINTABLE_ASCII.test(declared)) {
352
+ warn(
353
+ `dropping product name ${show(declared)}: the x402 protocol carries 1-${MAX_SERVICE_NAME_CHARS} printable-ASCII characters (U+0020-U+007E)`
354
+ );
355
+ return void 0;
356
+ }
357
+ if (declared.length > MAX_SERVICE_NAME_CHARS) {
358
+ const truncated = declared.slice(0, MAX_SERVICE_NAME_CHARS);
359
+ warn(
360
+ `product name ${show(declared)} is ${declared.length} characters; the x402 protocol carries ${MAX_SERVICE_NAME_CHARS}, so it travels as ${show(truncated)}`
361
+ );
362
+ return truncated;
363
+ }
364
+ return declared;
365
+ }
366
+ function resolveIconUrl(routeIconUrl, identityIconUrl, warn) {
367
+ const declared = asString("route iconUrl", routeIconUrl, warn) ?? asString("iconUrl", identityIconUrl, warn);
368
+ if (declared === void 0) {
369
+ return void 0;
370
+ }
371
+ if (declared.length > MAX_ICON_URL_CHARS) {
372
+ warn(
373
+ `dropping iconUrl: ${declared.length} characters exceeds the ${MAX_ICON_URL_CHARS} the x402 protocol carries`
374
+ );
375
+ return void 0;
376
+ }
377
+ let scheme;
378
+ try {
379
+ scheme = new URL(declared).protocol;
380
+ } catch {
381
+ warn(
382
+ `dropping iconUrl ${show(declared)}: expected an absolute http or https URL`
383
+ );
384
+ return void 0;
385
+ }
386
+ if (scheme !== "http:" && scheme !== "https:") {
387
+ warn(
388
+ `dropping iconUrl ${show(declared)}: only http and https are carried (a dashboard renders this URL)`
389
+ );
390
+ return void 0;
391
+ }
392
+ return declared;
393
+ }
394
+ function resolveDimensions(value, warn) {
395
+ const declared = asTagList(value, "dimensions", warn);
396
+ if (declared === void 0) {
397
+ return void 0;
398
+ }
399
+ const malformed = [];
400
+ const named = declared.filter((name) => {
401
+ if (name.length <= MAX_DIMENSION_CHARS && DIMENSION_NAME.test(name)) {
402
+ return true;
403
+ }
404
+ malformed.push(name);
405
+ return false;
406
+ });
407
+ if (malformed.length > 0) {
408
+ warn(
409
+ `dropping ${malformed.length} dimension(s) that do not name a field (max ${MAX_DIMENSION_CHARS} characters, starting with a letter or underscore): ${malformed.join(", ")}`
410
+ );
411
+ }
412
+ const deduped = [...new Set(named)];
413
+ if (deduped.length > MAX_DIMENSIONS) {
414
+ warn(
415
+ `dropping ${deduped.length - MAX_DIMENSIONS} dimension(s): at most ${MAX_DIMENSIONS} travel. Dropped: ${deduped.slice(MAX_DIMENSIONS).join(", ")}`
416
+ );
417
+ }
418
+ const bounded = deduped.slice(0, MAX_DIMENSIONS);
419
+ return bounded.length > 0 ? bounded : void 0;
420
+ }
421
+ function resolveOpaqueString(field, value, warn) {
422
+ const declared = asString(field, value, warn);
423
+ if (declared === void 0) {
424
+ return void 0;
425
+ }
426
+ const trimmed = declared.trim();
427
+ if (trimmed === "") {
428
+ warn(`ignoring empty ${field}`);
429
+ return void 0;
430
+ }
431
+ return trimmed;
432
+ }
433
+ function resolveProductExtensions(routeExtensions, type, declaration, warn) {
434
+ const productId = resolveOpaqueString(
435
+ "productId",
436
+ declaration.productId,
437
+ warn
438
+ );
439
+ const manifestHash = resolveOpaqueString(
440
+ "manifestHash",
441
+ declaration.manifestHash,
442
+ warn
443
+ );
444
+ const info = {
445
+ ...type !== void 0 && { kind: type },
446
+ ...productId !== void 0 && { product_id: productId },
447
+ ...manifestHash !== void 0 && { manifest_hash: manifestHash }
448
+ };
449
+ if (Object.keys(info).length === 0) {
450
+ return void 0;
451
+ }
452
+ if (routeExtensions !== void 0) {
453
+ if (typeof routeExtensions !== "object" || routeExtensions === null || Array.isArray(routeExtensions)) {
454
+ warn(
455
+ `route extensions ${show(routeExtensions)} are ${typeName(routeExtensions)}, not an object; leaving them untouched and skipping the ${WEFT_PRODUCT_EXTENSION_KEY} declaration for this route`
456
+ );
457
+ return void 0;
458
+ }
459
+ if (WEFT_PRODUCT_EXTENSION_KEY in routeExtensions) {
460
+ return void 0;
461
+ }
462
+ }
463
+ return {
464
+ ...routeExtensions,
465
+ [WEFT_PRODUCT_EXTENSION_KEY]: { info, schema: WEFT_PRODUCT_INFO_SCHEMA }
466
+ };
467
+ }
468
+ function applyToRoute(route, identity, warn) {
469
+ if (typeof route !== "object" || route === null) {
470
+ warn(
471
+ `ignoring route ${show(route)}: expected a route config object, got ${typeName(route)}`
472
+ );
473
+ return route;
474
+ }
475
+ const {
476
+ type: declaredType,
477
+ serviceName: declaredServiceName,
478
+ tags: declaredTags,
479
+ iconUrl: declaredIconUrl,
480
+ ...rest
481
+ } = route;
482
+ const type = resolveType(declaredType, "route type", warn) ?? resolveType(identity.type, "type", warn);
483
+ const serviceName = resolveServiceName(
484
+ declaredServiceName,
485
+ identity.name,
486
+ warn
487
+ );
488
+ const iconUrl = resolveIconUrl(declaredIconUrl, identity.iconUrl, warn);
489
+ const tags = resolveTags(declaredTags, identity.tags, type, warn);
490
+ const extensions = resolveProductExtensions(
491
+ rest.extensions,
492
+ type,
493
+ identity,
494
+ warn
495
+ );
496
+ return {
497
+ ...rest,
498
+ ...serviceName !== void 0 && { serviceName },
499
+ ...tags !== void 0 && { tags },
500
+ ...iconUrl !== void 0 && { iconUrl },
501
+ ...extensions !== void 0 && { extensions }
502
+ };
503
+ }
504
+ function hasProductIdentity(identity) {
505
+ return isDeclared(identity.name) || isDeclared(identity.type) || isDeclared(identity.tags) || isDeclared(identity.iconUrl) || isDeclared(identity.productId) || isDeclared(identity.manifestHash);
506
+ }
507
+ function hasRouteIdentity(routes) {
508
+ if (isSingleRoute(routes)) {
509
+ return isDeclared(routes.type);
510
+ }
511
+ return Object.values(routes).some((route) => isDeclared(route?.type));
512
+ }
513
+ function sanitizeProductIdentity(identity) {
514
+ const silent = () => void 0;
515
+ const type = resolveType(identity.type, "type", silent);
516
+ const name = resolveServiceName(void 0, identity.name, silent);
517
+ const iconUrl = resolveIconUrl(void 0, identity.iconUrl, silent);
518
+ const tags = resolveTags(void 0, identity.tags, type, silent)?.filter(
519
+ (tag) => !isReservedTypeTag(tag)
520
+ );
521
+ return {
522
+ ...name !== void 0 && { name },
523
+ ...type !== void 0 && { type },
524
+ ...tags !== void 0 && tags.length > 0 && { tags },
525
+ ...iconUrl !== void 0 && { iconUrl }
526
+ };
527
+ }
528
+ function applyProductIdentity(routes, identity) {
529
+ if (typeof routes !== "object" || routes === null) {
530
+ return routes;
531
+ }
532
+ if (!hasProductIdentity(identity) && !hasRouteIdentity(routes)) {
533
+ return routes;
534
+ }
535
+ const warn = createWarn();
536
+ if (isSingleRoute(routes)) {
537
+ return applyToRoute(routes, identity, warn);
538
+ }
539
+ return Object.fromEntries(
540
+ Object.entries(routes).map(([pattern, route]) => [
541
+ pattern,
542
+ applyToRoute(route, identity, warn)
543
+ ])
544
+ );
545
+ }
546
+
547
+ // src/facilitator/middleware/handshake.ts
548
+ var WEFT_DECLARED_HEADER = "X-Weft-Declared";
549
+ function base64UrlEncode(value) {
550
+ const bytes = new TextEncoder().encode(value);
551
+ let binary = "";
552
+ for (const byte of bytes) {
553
+ binary += String.fromCharCode(byte);
554
+ }
555
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
556
+ }
557
+ function declaredIdentityValue(declaration) {
558
+ const declared = sanitizeProductIdentity(declaration);
559
+ const dimensions = resolveDimensions(declaration.dimensions, createWarn());
560
+ const payload = {
561
+ ...declared.name !== void 0 && { name: declared.name },
562
+ ...declared.type !== void 0 && { type: declared.type },
563
+ ...declared.tags !== void 0 && { tags: declared.tags },
564
+ ...declared.iconUrl !== void 0 && { icon_url: declared.iconUrl },
565
+ ...dimensions !== void 0 && { dimensions }
566
+ };
567
+ if (Object.keys(payload).length === 0) {
568
+ return void 0;
569
+ }
570
+ return base64UrlEncode(JSON.stringify(payload));
571
+ }
572
+ var HEADER_SAFE = /^[\x21-\x7e]+$/;
573
+ function resolveApiKey(apiKey) {
574
+ if (apiKey === void 0 || apiKey === null) {
575
+ return void 0;
576
+ }
577
+ if (typeof apiKey !== "string") {
578
+ console.warn(
579
+ `[weft] ignoring apiKey: expected a string, got ${typeof apiKey}`
580
+ );
581
+ return void 0;
582
+ }
583
+ const trimmed = apiKey.trim();
584
+ if (trimmed === "") {
585
+ console.warn("[weft] ignoring empty apiKey");
586
+ return void 0;
587
+ }
588
+ if (!HEADER_SAFE.test(trimmed)) {
589
+ console.warn(
590
+ "[weft] ignoring apiKey: it contains whitespace or non-printable characters that cannot travel in an HTTP header"
591
+ );
592
+ return void 0;
593
+ }
594
+ return trimmed;
595
+ }
596
+ var WEFT_API_KEY_HEADER = "X-API-Key";
597
+ function buildFacilitatorAuthHeaders(adapter, apiKey, declaration) {
598
+ const key = resolveApiKey(apiKey);
599
+ const supported = {
600
+ "User-Agent": `weft-sdk-${adapter}/${version}`
601
+ };
602
+ if (key !== void 0) {
603
+ supported["Authorization"] = `Bearer ${key}`;
604
+ }
605
+ const declared = declaredIdentityValue(declaration);
606
+ if (declared !== void 0) {
607
+ supported[WEFT_DECLARED_HEADER] = declared;
608
+ }
609
+ const settle = key !== void 0 ? { [WEFT_API_KEY_HEADER]: key } : void 0;
610
+ const verify = key !== void 0 ? { [WEFT_API_KEY_HEADER]: key } : void 0;
611
+ return {
612
+ supported,
613
+ ...settle !== void 0 && { settle },
614
+ ...verify !== void 0 && { verify }
615
+ };
616
+ }
617
+
618
+ // src/facilitator/middleware/extensions.ts
619
+ var WEFT_REQUEST_EXTENSION_KEY = "weft.request";
620
+ var WEFT_REQUEST_INFO_SCHEMA = {
621
+ $schema: "https://json-schema.org/draft/2020-12/schema",
622
+ title: "Weft per-request context",
623
+ description: "Seller-authored context for one paid request, for display only. Unauthenticated buyer input by the time it is read; key nothing on it.",
624
+ type: "object",
625
+ additionalProperties: true
626
+ };
627
+ var MAX_EXTENSION_BYTES = 16 * 1024;
628
+ function requestOf(context) {
629
+ const transport = context.transportContext;
630
+ return transport?.request;
631
+ }
632
+ function dropKey(context, key) {
633
+ delete context.paymentRequiredResponse.extensions?.[key];
634
+ return void 0;
635
+ }
636
+ function toJson(value) {
637
+ try {
638
+ return JSON.stringify(value);
639
+ } catch {
640
+ return void 0;
641
+ }
642
+ }
643
+ function byteLength(text) {
644
+ return new TextEncoder().encode(text).length;
645
+ }
646
+ function projectedBytes(context, key, value) {
647
+ const projected = {
648
+ ...context.paymentRequiredResponse.extensions,
649
+ [key]: value
650
+ };
651
+ const json = toJson(projected);
652
+ return json === void 0 ? void 0 : byteLength(json);
653
+ }
654
+ function dynamicExtension(key, warn) {
655
+ return {
656
+ key,
657
+ async enrichPaymentRequiredResponse(declaration, context) {
658
+ if (typeof declaration !== "function") {
659
+ return void 0;
660
+ }
661
+ const request = requestOf(context);
662
+ if (!request) {
663
+ warn(
664
+ `extensions[${key}] is a callback but no HTTP request context reached it; dropping the key from the challenge`,
665
+ `${key}:no-request`
666
+ );
667
+ return dropKey(context, key);
668
+ }
669
+ let resolved;
670
+ try {
671
+ resolved = await declaration(request);
672
+ } catch (error) {
673
+ warn(
674
+ `extensions[${key}] callback failed; dropping the key from the challenge: ` + (error instanceof Error ? error.message : String(error)),
675
+ `${key}:threw`
676
+ );
677
+ return dropKey(context, key);
678
+ }
679
+ if (resolved === void 0 || resolved === null) {
680
+ return dropKey(context, key);
681
+ }
682
+ const json = toJson(resolved);
683
+ if (json === void 0) {
684
+ warn(
685
+ `extensions[${key}] callback returned a value JSON cannot carry (a function, a circular reference, a BigInt or similar); dropping the key from the challenge`,
686
+ `${key}:unserializable`
687
+ );
688
+ return dropKey(context, key);
689
+ }
690
+ const wire = JSON.parse(json);
691
+ if (typeof wire !== "object" || wire === null || Array.isArray(wire)) {
692
+ warn(
693
+ `extensions[${key}] callback returned ${Array.isArray(wire) ? "an array" : `a ${typeof wire}`}; the x402 extensions channel carries objects, so the key is dropped from the challenge`,
694
+ `${key}:not-an-object`
695
+ );
696
+ return dropKey(context, key);
697
+ }
698
+ const value = key === WEFT_REQUEST_EXTENSION_KEY ? { info: wire, schema: WEFT_REQUEST_INFO_SCHEMA } : wire;
699
+ const bytes = projectedBytes(context, key, value) ?? byteLength(json);
700
+ if (bytes > MAX_EXTENSION_BYTES) {
701
+ warn(
702
+ `extensions[${key}] takes the challenge's extensions to ${bytes} bytes, over the ${MAX_EXTENSION_BYTES}-byte facilitator relay cap; dropping the key so the rest of the declaration still reaches settlement`,
703
+ `${key}:over-cap`
704
+ );
705
+ return dropKey(context, key);
706
+ }
707
+ return value;
708
+ }
709
+ };
710
+ }
711
+ function routeConfigs(routes) {
712
+ if (typeof routes !== "object" || routes === null) {
713
+ return [];
714
+ }
715
+ const configs = "accepts" in routes ? [routes] : Object.values(routes);
716
+ return configs.filter(
717
+ (config) => typeof config === "object" && config !== null
718
+ );
719
+ }
720
+ function dynamicExtensionKeys(routes) {
721
+ const keys = /* @__PURE__ */ new Set();
722
+ for (const config of routeConfigs(routes)) {
723
+ const extensions = config.extensions;
724
+ if (typeof extensions !== "object" || extensions === null) {
725
+ continue;
726
+ }
727
+ for (const [key, value] of Object.entries(extensions)) {
728
+ if (typeof value === "function") {
729
+ keys.add(key);
730
+ }
731
+ }
732
+ }
733
+ return [...keys];
734
+ }
735
+ function registerDynamicExtensions(server, routes) {
736
+ const keys = dynamicExtensionKeys(routes);
737
+ if (keys.length === 0) {
738
+ return;
739
+ }
740
+ const warn = createWarn();
741
+ if (typeof server.registerExtension !== "function") {
742
+ warn(
743
+ `this @x402/core build has no registerExtension, so per-request route extensions (${keys.join(", ")}) cannot be resolved and will not ship`
744
+ );
745
+ return;
746
+ }
747
+ for (const key of keys) {
748
+ server.registerExtension(dynamicExtension(key, warn));
749
+ }
750
+ }
751
+
752
+ // src/facilitator/middleware/replay.ts
753
+ var import_http = require("@x402/core/http");
754
+ var import_schemas = require("@x402/core/schemas");
755
+ function paymentResumeCandidate(context) {
756
+ if (!context.paymentHeader) return void 0;
757
+ try {
758
+ const paymentPayload = (0, import_http.decodePaymentSignatureHeader)(context.paymentHeader);
759
+ (0, import_schemas.validatePaymentPayload)(paymentPayload);
760
+ if (paymentPayload.x402Version !== 2) return void 0;
761
+ return {
762
+ paymentPayload,
763
+ paymentRequirements: paymentPayload.accepted
764
+ };
765
+ } catch {
766
+ return void 0;
767
+ }
768
+ }
769
+ function resumePaymentResult(resourceServer, resumed, context) {
770
+ return {
771
+ type: "payment-verified",
772
+ paymentPayload: resumed.paymentPayload,
773
+ paymentRequirements: resumed.paymentRequirements,
774
+ declaredExtensions: resumed.declaredExtensions,
775
+ beforeHandlerSettlement: resumed.beforeHandlerSettlement,
776
+ cancellationDispatcher: resumed.cancellationDispatcher ?? resourceServer.createPaymentCancellationDispatcher(
777
+ resumed.paymentPayload,
778
+ resumed.paymentRequirements,
779
+ resumed.declaredExtensions,
780
+ { request: context },
781
+ resumed.beforeHandlerSettlement ? ["before-handler"] : []
782
+ )
783
+ };
784
+ }
785
+
786
+ // src/facilitator/middleware/settlement.ts
787
+ var import_http2 = require("@x402/core/http");
788
+ var CORE_FACILITATOR_UNAVAILABLE = /^Facilitator settle failed \(503\):(?: |$)/;
789
+ function isFacilitatorUnavailable(errorReason) {
790
+ return errorReason === FACILITATOR_UNAVAILABLE_ERROR || CORE_FACILITATOR_UNAVAILABLE.test(errorReason ?? "");
791
+ }
792
+ function responseHeader(headers, name) {
793
+ const value = Object.entries(headers).find(
794
+ ([key]) => key.toLowerCase() === name
795
+ )?.[1];
796
+ return Array.isArray(value) ? value[0] : value;
797
+ }
798
+ function isFacilitatorUnavailableResponse(response) {
799
+ if (typeof response.body === "object" && response.body !== null) {
800
+ for (const field of ["errorReason", "error"]) {
801
+ if (field in response.body && typeof response.body[field] === "string" && isFacilitatorUnavailable(
802
+ response.body[field]
803
+ )) {
804
+ return true;
805
+ }
806
+ }
807
+ }
808
+ const paymentResponse = responseHeader(response.headers, "payment-response");
809
+ if (!paymentResponse) return false;
810
+ try {
811
+ return isFacilitatorUnavailable(
812
+ (0, import_http2.decodePaymentResponseHeader)(paymentResponse).errorReason
813
+ );
814
+ } catch {
815
+ return false;
816
+ }
817
+ }
818
+ function isJsonResponse(response) {
819
+ const contentType = responseHeader(response.headers, "content-type");
820
+ return /^(application\/json|[^;]+\+json)(?:;|$)/i.test(contentType ?? "");
821
+ }
822
+ function serializeResponseBody(response) {
823
+ if (isJsonResponse(response)) return JSON.stringify(response.body ?? {});
824
+ if (response.body instanceof Blob || response.body instanceof ArrayBuffer || ArrayBuffer.isView(response.body)) {
825
+ return response.body;
826
+ }
827
+ return typeof response.body === "string" ? response.body : String(response.body ?? "");
828
+ }
829
+
830
+ // src/facilitator/middleware/express.ts
831
+ var UNSAFE_FAILURE_HEADERS = /* @__PURE__ */ new Set([
832
+ import_server2.SETTLEMENT_OVERRIDES_HEADER.toLowerCase(),
833
+ "location",
834
+ "set-cookie"
835
+ ]);
836
+ function isUnsafeFailureHeader(name, value) {
837
+ const normalized = name.toLowerCase();
838
+ return UNSAFE_FAILURE_HEADERS.has(normalized) || normalized === "cache-control" && value !== void 0 && /\bpublic\b/i.test(
839
+ Array.isArray(value) ? value.join(",") : String(value)
840
+ );
841
+ }
842
+ var FACILITATOR_SYNC_RETRY_FLOOR_MS = 3e4;
843
+ var ExpressAdapter = class {
844
+ constructor(req) {
845
+ this.req = req;
846
+ }
847
+ getHeader(name) {
848
+ const value = this.req.header(name);
849
+ return Array.isArray(value) ? value[0] : value;
850
+ }
851
+ getMethod() {
852
+ return this.req.method;
853
+ }
854
+ getPath() {
855
+ return this.req.path;
856
+ }
857
+ getUrl() {
858
+ const host = this.req.headers.host || "localhost";
859
+ return `${this.req.protocol}://${host}${this.req.path}`;
860
+ }
861
+ getAcceptHeader() {
862
+ return this.getHeader("Accept") || "";
863
+ }
864
+ getUserAgent() {
865
+ return this.getHeader("User-Agent") || "";
866
+ }
867
+ getQueryParams() {
868
+ return this.req.query;
869
+ }
870
+ getQueryParam(name) {
871
+ return this.req.query[name];
872
+ }
873
+ getBody() {
874
+ return this.req.body;
875
+ }
876
+ };
877
+ function toHeaderRecord(headers) {
878
+ const record = {};
879
+ for (const [key, value] of Object.entries(headers)) {
880
+ if (value === void 0) continue;
881
+ record[key] = Array.isArray(value) ? value.join(",") : String(value);
882
+ }
883
+ return record;
884
+ }
885
+ function responseBodyFromBufferedCalls(calls) {
886
+ const chunks = [];
887
+ for (const [method, args] of calls) {
888
+ if (method !== "write" && method !== "end") continue;
889
+ const chunk = args[0];
890
+ if (chunk === void 0) continue;
891
+ if (typeof chunk === "string") {
892
+ const encoding = typeof args[1] === "string" ? args[1] : "utf8";
893
+ if (!Buffer.isEncoding(encoding)) return void 0;
894
+ chunks.push(Buffer.from(chunk, encoding));
895
+ } else if (Buffer.isBuffer(chunk) || chunk instanceof Uint8Array) {
896
+ chunks.push(Buffer.from(chunk));
897
+ } else {
898
+ return void 0;
899
+ }
900
+ }
901
+ return Buffer.concat(chunks);
902
+ }
903
+ function restoreHeaders(res, headers) {
904
+ for (const name of Object.keys(res.getHeaders())) res.removeHeader(name);
905
+ for (const [name, value] of Object.entries(headers)) {
906
+ if (value !== void 0) res.setHeader(name, value);
907
+ }
908
+ }
909
+ async function sendCoreResponse(res, response) {
910
+ res.status(response.status);
911
+ Object.entries(response.headers).forEach(([key, value]) => {
912
+ res.setHeader(key, value);
913
+ });
914
+ if (isJsonResponse(response)) {
915
+ res.json(response.body ?? {});
916
+ } else if (response.body instanceof Blob) {
917
+ res.send(Buffer.from(await response.body.arrayBuffer()));
918
+ } else if (response.body instanceof ArrayBuffer) {
919
+ res.send(Buffer.from(response.body));
920
+ } else if (ArrayBuffer.isView(response.body)) {
921
+ res.send(
922
+ Buffer.from(
923
+ response.body.buffer,
924
+ response.body.byteOffset,
925
+ response.body.byteLength
926
+ )
927
+ );
928
+ } else {
929
+ res.send(
930
+ typeof response.body === "string" ? response.body : String(response.body ?? "")
931
+ );
932
+ }
933
+ }
934
+ function sendFacilitatorUnavailable(res) {
935
+ res.removeHeader("payment-response");
936
+ res.removeHeader(import_server2.SETTLEMENT_OVERRIDES_HEADER);
937
+ res.setHeader("retry-after", "1");
938
+ res.setHeader("cache-control", (0, import_server2.withPrivateCacheControl)(null));
939
+ res.status(503).json({ error: "facilitator_unavailable" });
940
+ }
941
+ function weftPaymentMiddleware(routes, config) {
942
+ const facilitatorClient = createFacilitatorClient(
943
+ config?.facilitator,
944
+ buildFacilitatorAuthHeaders("express", config?.apiKey, config ?? {})
945
+ );
946
+ const resourceServer = new import_server2.x402ResourceServer(facilitatorClient);
947
+ registerDynamicExtensions(resourceServer, routes);
948
+ if (config?.schemes) {
949
+ config.schemes.forEach(({ network, server: schemeServer }) => {
950
+ resourceServer.register(network, schemeServer);
951
+ });
952
+ }
953
+ const httpServer = new import_server2.x402HTTPResourceServer(
954
+ resourceServer,
955
+ applyProductIdentity(routes, config ?? {})
956
+ );
957
+ if (config?.paywall) {
958
+ httpServer.registerPaywallProvider(config.paywall);
959
+ }
960
+ const syncOnStart = config?.syncFacilitatorOnStart ?? true;
961
+ let facilitatorSynced = false;
962
+ let syncInFlight = null;
963
+ let lastFailedSyncAt = 0;
964
+ const syncFacilitator = () => {
965
+ syncInFlight ?? (syncInFlight = httpServer.initialize().then(
966
+ () => {
967
+ facilitatorSynced = true;
968
+ },
969
+ (error) => {
970
+ lastFailedSyncAt = Date.now();
971
+ console.warn(
972
+ "[weft] facilitator sync failed; payment-protected routes degrade until a later attempt succeeds: " + (error instanceof Error ? error.message : String(error))
973
+ );
974
+ }
975
+ ).finally(() => {
976
+ syncInFlight = null;
977
+ }));
978
+ return syncInFlight;
979
+ };
980
+ let bootSync = syncOnStart ? syncFacilitator() : null;
981
+ return async (req, res, next) => {
982
+ const adapter = new ExpressAdapter(req);
983
+ const context = {
984
+ adapter,
985
+ path: req.path,
986
+ method: req.method,
987
+ paymentHeader: adapter.getHeader("payment-signature") || adapter.getHeader("x-payment")
988
+ };
989
+ if (!httpServer.requiresPayment(context)) {
990
+ return next();
991
+ }
992
+ if (bootSync) {
993
+ await bootSync;
994
+ bootSync = null;
995
+ }
996
+ if (syncOnStart && !facilitatorSynced && Date.now() - lastFailedSyncAt >= FACILITATOR_SYNC_RETRY_FLOOR_MS) {
997
+ void syncFacilitator();
998
+ }
999
+ let result;
1000
+ try {
1001
+ const resumeCandidate = paymentResumeCandidate(context);
1002
+ const resumedPayment = resumeCandidate ? await config?.resumeVerifiedPayment?.(context, resumeCandidate) : void 0;
1003
+ result = resumedPayment ? resumePaymentResult(resourceServer, resumedPayment, context) : await httpServer.processHTTPRequest(context, config?.paywallConfig);
1004
+ } catch (error) {
1005
+ return next(error);
1006
+ }
1007
+ switch (result.type) {
1008
+ case "no-payment-required":
1009
+ return next();
1010
+ case "payment-error": {
1011
+ const { response } = result;
1012
+ if (isFacilitatorUnavailableResponse(response)) {
1013
+ sendFacilitatorUnavailable(res);
1014
+ return;
1015
+ }
1016
+ await sendCoreResponse(res, response);
1017
+ return;
1018
+ }
1019
+ case "payment-verified": {
1020
+ const {
1021
+ paymentPayload,
1022
+ paymentRequirements,
1023
+ declaredExtensions,
1024
+ cancellationDispatcher,
1025
+ beforeHandlerSettlement
1026
+ } = result;
1027
+ const originalWriteHead = res.writeHead.bind(res);
1028
+ const originalWrite = res.write.bind(res);
1029
+ const originalEnd = res.end.bind(res);
1030
+ const originalFlushHeaders = res.flushHeaders.bind(res);
1031
+ const originalSetHeader = res.setHeader.bind(res);
1032
+ const originalRemoveHeader = res.removeHeader.bind(res);
1033
+ const headersBeforeHandler = { ...res.getHeaders() };
1034
+ let bufferedCalls = [];
1035
+ let settled = false;
1036
+ const failureHeaders = /* @__PURE__ */ new Map();
1037
+ const restoreResponseMethods = () => {
1038
+ res.setHeader = originalSetHeader;
1039
+ res.removeHeader = originalRemoveHeader;
1040
+ res.writeHead = originalWriteHead;
1041
+ res.write = originalWrite;
1042
+ res.end = originalEnd;
1043
+ res.flushHeaders = originalFlushHeaders;
1044
+ };
1045
+ const replayBufferedCall = ([method, args]) => {
1046
+ if (method === "writeHead") {
1047
+ const [statusCode, statusMessage] = args;
1048
+ return typeof statusMessage === "string" ? originalWriteHead(statusCode, statusMessage) : originalWriteHead(statusCode);
1049
+ }
1050
+ if (method === "write") return originalWrite(...args);
1051
+ if (method === "end") return originalEnd(...args);
1052
+ return originalFlushHeaders();
1053
+ };
1054
+ let endCalled;
1055
+ const endPromise = new Promise((resolve) => {
1056
+ endCalled = resolve;
1057
+ });
1058
+ res.writeHead = function(...args) {
1059
+ if (!settled) {
1060
+ const [statusCode, statusMessageOrHeaders, maybeHeaders] = args;
1061
+ if (typeof statusCode === "number") {
1062
+ res.statusCode = statusCode;
1063
+ }
1064
+ const headers = typeof statusMessageOrHeaders === "string" ? maybeHeaders : statusMessageOrHeaders;
1065
+ if (Array.isArray(headers)) {
1066
+ const grouped = /* @__PURE__ */ new Map();
1067
+ for (let index = 0; index < headers.length; index += 2) {
1068
+ const name = String(headers[index]);
1069
+ const key = name.toLowerCase();
1070
+ const entry = grouped.get(key) ?? { name, values: [] };
1071
+ entry.values.push(String(headers[index + 1]));
1072
+ grouped.set(key, entry);
1073
+ }
1074
+ for (const { name, values } of grouped.values()) {
1075
+ res.setHeader(name, values.length === 1 ? values[0] : values);
1076
+ }
1077
+ } else if (headers && typeof headers === "object") {
1078
+ for (const [key, value] of Object.entries(headers)) {
1079
+ if (value === void 0) continue;
1080
+ res.setHeader(
1081
+ key,
1082
+ Array.isArray(value) ? value : String(value)
1083
+ );
1084
+ }
1085
+ }
1086
+ bufferedCalls.push(["writeHead", args]);
1087
+ return res;
1088
+ }
1089
+ return originalWriteHead(...args);
1090
+ };
1091
+ res.setHeader = function(name, value) {
1092
+ const result2 = originalSetHeader(name, value);
1093
+ if (!settled && res.statusCode >= 400) {
1094
+ failureHeaders.set(name.toLowerCase(), {
1095
+ name,
1096
+ value: Array.isArray(value) ? [...value] : value
1097
+ });
1098
+ }
1099
+ return result2;
1100
+ };
1101
+ res.removeHeader = function(name) {
1102
+ originalRemoveHeader(name);
1103
+ if (!settled && res.statusCode >= 400) {
1104
+ failureHeaders.set(name.toLowerCase(), { name });
1105
+ }
1106
+ };
1107
+ res.write = function(...args) {
1108
+ if (!settled) {
1109
+ bufferedCalls.push(["write", args]);
1110
+ return true;
1111
+ }
1112
+ return originalWrite(...args);
1113
+ };
1114
+ res.end = function(...args) {
1115
+ if (!settled) {
1116
+ bufferedCalls.push(["end", args]);
1117
+ endCalled();
1118
+ return res;
1119
+ }
1120
+ return originalEnd(...args);
1121
+ };
1122
+ res.flushHeaders = function() {
1123
+ if (!settled) {
1124
+ bufferedCalls.push(["flushHeaders", []]);
1125
+ return;
1126
+ }
1127
+ return originalFlushHeaders();
1128
+ };
1129
+ const finalizeFailure = async (cancellation) => {
1130
+ const preservedFailureHeaders = /* @__PURE__ */ new Map();
1131
+ for (const [name, value] of Object.entries(res.getHeaders())) {
1132
+ if (value === void 0 || isUnsafeFailureHeader(name, value))
1133
+ continue;
1134
+ preservedFailureHeaders.set(
1135
+ name,
1136
+ Array.isArray(value) ? [...value] : value
1137
+ );
1138
+ }
1139
+ const cancelSettlement = await cancellationDispatcher.cancel(cancellation);
1140
+ settled = true;
1141
+ restoreHeaders(res, headersBeforeHandler);
1142
+ for (const [name, value] of Object.entries(res.getHeaders())) {
1143
+ if (isUnsafeFailureHeader(name, value)) res.removeHeader(name);
1144
+ }
1145
+ for (const [name, value] of preservedFailureHeaders) {
1146
+ res.setHeader(name, value);
1147
+ }
1148
+ for (const { name, value } of failureHeaders.values()) {
1149
+ if (value === void 0 || isUnsafeFailureHeader(name, value))
1150
+ res.removeHeader(name);
1151
+ else res.setHeader(name, value);
1152
+ }
1153
+ const existingCacheControl = Object.entries(res.getHeaders()).find(
1154
+ ([key]) => key.toLowerCase() === "cache-control"
1155
+ )?.[1];
1156
+ const headers = httpServer.createFailurePathSettlementHeaders(
1157
+ cancelSettlement,
1158
+ beforeHandlerSettlement,
1159
+ paymentPayload,
1160
+ Array.isArray(existingCacheControl) ? existingCacheControl.join(",") : existingCacheControl === void 0 ? void 0 : String(existingCacheControl)
1161
+ );
1162
+ Object.entries(headers ?? {}).forEach(([key, value]) => {
1163
+ res.setHeader(key, value);
1164
+ });
1165
+ restoreResponseMethods();
1166
+ for (const call of bufferedCalls) replayBufferedCall(call);
1167
+ bufferedCalls = [];
1168
+ };
1169
+ try {
1170
+ next();
1171
+ } catch (error) {
1172
+ bufferedCalls = [];
1173
+ restoreHeaders(res, headersBeforeHandler);
1174
+ failureHeaders.clear();
1175
+ try {
1176
+ next(error);
1177
+ } catch (errorMiddlewareError) {
1178
+ restoreResponseMethods();
1179
+ throw errorMiddlewareError;
1180
+ }
1181
+ await endPromise;
1182
+ await finalizeFailure({ reason: "handler_threw", error });
1183
+ return;
1184
+ }
1185
+ await endPromise;
1186
+ if (res.statusCode >= 400) {
1187
+ await finalizeFailure({
1188
+ reason: "handler_failed",
1189
+ responseStatus: res.statusCode
1190
+ });
1191
+ return;
1192
+ }
1193
+ try {
1194
+ const settleResult = await httpServer.processSettlement(
1195
+ paymentPayload,
1196
+ paymentRequirements,
1197
+ declaredExtensions,
1198
+ // The route handler signals a settlement override (a metered amount
1199
+ // below the signed maximum) through a response header.
1200
+ // `processSettlement` only reads that off `transportContext`, so
1201
+ // omitting this settles the full authorised amount and makes
1202
+ // `upto` behave exactly like `exact`.
1203
+ {
1204
+ request: context,
1205
+ responseBody: responseBodyFromBufferedCalls(bufferedCalls),
1206
+ responseHeaders: toHeaderRecord(res.getHeaders())
1207
+ },
1208
+ void 0,
1209
+ beforeHandlerSettlement
1210
+ );
1211
+ if (!settleResult.success) {
1212
+ bufferedCalls = [];
1213
+ restoreHeaders(res, headersBeforeHandler);
1214
+ if (isFacilitatorUnavailable(settleResult.errorReason)) {
1215
+ sendFacilitatorUnavailable(res);
1216
+ return;
1217
+ }
1218
+ const { response } = settleResult;
1219
+ await sendCoreResponse(res, response);
1220
+ return;
1221
+ }
1222
+ Object.entries(settleResult.headers).forEach(([key, value]) => {
1223
+ const headerValue = Array.isArray(value) ? value.join(",") : String(value);
1224
+ res.setHeader(key, headerValue);
1225
+ });
1226
+ const cacheControl = res.getHeaders()["cache-control"];
1227
+ res.setHeader(
1228
+ "cache-control",
1229
+ (0, import_server2.withPrivateCacheControl)(
1230
+ Array.isArray(cacheControl) ? cacheControl.join(",") : cacheControl === void 0 ? null : String(cacheControl)
1231
+ )
1232
+ );
1233
+ res.removeHeader(import_server2.SETTLEMENT_OVERRIDES_HEADER);
1234
+ } catch (error) {
1235
+ bufferedCalls = [];
1236
+ restoreHeaders(res, headersBeforeHandler);
1237
+ settled = true;
1238
+ restoreResponseMethods();
1239
+ next(error);
1240
+ return;
1241
+ } finally {
1242
+ settled = true;
1243
+ restoreResponseMethods();
1244
+ for (const call of bufferedCalls) replayBufferedCall(call);
1245
+ bufferedCalls = [];
1246
+ }
1247
+ return;
1248
+ }
1249
+ }
1250
+ };
1251
+ }
1252
+
1253
+ // src/facilitator/middleware/hono.ts
1254
+ var import_server3 = require("@x402/core/server");
1255
+ var FACILITATOR_SYNC_RETRY_FLOOR_MS2 = 3e4;
1256
+ var HonoAdapter = class {
1257
+ constructor(c) {
1258
+ this.c = c;
1259
+ }
1260
+ getHeader(name) {
1261
+ return this.c.req.header(name);
1262
+ }
1263
+ getMethod() {
1264
+ return this.c.req.method;
1265
+ }
1266
+ getPath() {
1267
+ return this.c.req.path;
1268
+ }
1269
+ getUrl() {
1270
+ return this.c.req.url;
1271
+ }
1272
+ getAcceptHeader() {
1273
+ return this.c.req.header("Accept") || "";
1274
+ }
1275
+ getUserAgent() {
1276
+ return this.c.req.header("User-Agent") || "";
1277
+ }
1278
+ getQueryParams() {
1279
+ const query = this.c.req.query();
1280
+ const result = {};
1281
+ for (const [key, value] of Object.entries(query)) {
1282
+ result[key] = value;
1283
+ }
1284
+ return result;
1285
+ }
1286
+ getQueryParam(name) {
1287
+ return this.c.req.query(name);
1288
+ }
1289
+ async getBody() {
1290
+ try {
1291
+ return await this.c.req.json();
1292
+ } catch {
1293
+ return void 0;
1294
+ }
1295
+ }
1296
+ };
1297
+ function toHeaderRecord2(headers) {
1298
+ if (!headers) return void 0;
1299
+ const record = {};
1300
+ headers.forEach((value, key) => {
1301
+ record[key] = value;
1302
+ });
1303
+ return record;
1304
+ }
1305
+ function withResponseHeaders(response, additions) {
1306
+ if ((!additions || Object.keys(additions).length === 0) && !response.headers.has(import_server3.SETTLEMENT_OVERRIDES_HEADER))
1307
+ return response;
1308
+ const headers = new Headers(response.headers);
1309
+ Object.entries(additions ?? {}).forEach(([key, value]) => {
1310
+ headers.set(key, value);
1311
+ });
1312
+ headers.delete(import_server3.SETTLEMENT_OVERRIDES_HEADER);
1313
+ return new Response(response.body, {
1314
+ status: response.status,
1315
+ statusText: response.statusText,
1316
+ headers
1317
+ });
1318
+ }
1319
+ function withSuccessfulSettlementHeaders(response, additions) {
1320
+ const headers = new Headers(response.headers);
1321
+ Object.entries(additions).forEach(([key, value]) => {
1322
+ headers.set(key, value);
1323
+ });
1324
+ headers.delete(import_server3.SETTLEMENT_OVERRIDES_HEADER);
1325
+ headers.set(
1326
+ "cache-control",
1327
+ (0, import_server3.withPrivateCacheControl)(headers.get("cache-control"))
1328
+ );
1329
+ return new Response(response.body, {
1330
+ status: response.status,
1331
+ statusText: response.statusText,
1332
+ headers
1333
+ });
1334
+ }
1335
+ function failureResponse(body, status, headers) {
1336
+ const responseHeaders = new Headers();
1337
+ for (const [name, value] of Object.entries(headers)) {
1338
+ const values = Array.isArray(value) ? value : [value];
1339
+ for (const item of values) responseHeaders.append(name, item);
1340
+ }
1341
+ return new Response(serializeResponseBody({ body, headers }), {
1342
+ status,
1343
+ headers: responseHeaders
1344
+ });
1345
+ }
1346
+ function facilitatorUnavailableResponse() {
1347
+ return failureResponse({ error: "facilitator_unavailable" }, 503, {
1348
+ "retry-after": "1",
1349
+ "cache-control": (0, import_server3.withPrivateCacheControl)(null),
1350
+ "content-type": "application/json; charset=UTF-8"
1351
+ });
1352
+ }
1353
+ function replaceContextResponse(c, response) {
1354
+ for (const name of [...c.res?.headers.keys() ?? []]) {
1355
+ c.header(name, void 0);
1356
+ }
1357
+ c.res = response;
1358
+ }
1359
+ function weftPaymentMiddlewareHono(routes, config) {
1360
+ const facilitatorClient = createFacilitatorClient(
1361
+ config?.facilitator,
1362
+ buildFacilitatorAuthHeaders("hono", config?.apiKey, config ?? {})
1363
+ );
1364
+ const resourceServer = new import_server3.x402ResourceServer(facilitatorClient);
1365
+ registerDynamicExtensions(resourceServer, routes);
1366
+ if (config?.schemes) {
1367
+ config.schemes.forEach(({ network, server: schemeServer }) => {
1368
+ resourceServer.register(network, schemeServer);
1369
+ });
1370
+ }
1371
+ const httpServer = new import_server3.x402HTTPResourceServer(
1372
+ resourceServer,
1373
+ applyProductIdentity(routes, config ?? {})
1374
+ );
1375
+ if (config?.paywall) {
1376
+ httpServer.registerPaywallProvider(config.paywall);
1377
+ }
1378
+ const syncOnStart = config?.syncFacilitatorOnStart ?? true;
1379
+ let facilitatorSynced = false;
1380
+ let syncInFlight = null;
1381
+ let lastFailedSyncAt = 0;
1382
+ const syncFacilitator = () => {
1383
+ syncInFlight ?? (syncInFlight = httpServer.initialize().then(
1384
+ () => {
1385
+ facilitatorSynced = true;
1386
+ },
1387
+ (error) => {
1388
+ lastFailedSyncAt = Date.now();
1389
+ console.warn(
1390
+ "[weft] facilitator sync failed; payment-protected routes degrade until a later attempt succeeds: " + (error instanceof Error ? error.message : String(error))
1391
+ );
1392
+ }
1393
+ ).finally(() => {
1394
+ syncInFlight = null;
1395
+ }));
1396
+ return syncInFlight;
1397
+ };
1398
+ let bootSync = syncOnStart ? syncFacilitator() : null;
1399
+ return async (c, next) => {
1400
+ const adapter = new HonoAdapter(c);
1401
+ const context = {
1402
+ adapter,
1403
+ path: c.req.path,
1404
+ method: c.req.method,
1405
+ paymentHeader: adapter.getHeader("payment-signature") || adapter.getHeader("x-payment")
1406
+ };
1407
+ if (!httpServer.requiresPayment(context)) {
1408
+ return next();
1409
+ }
1410
+ if (bootSync) {
1411
+ await bootSync;
1412
+ bootSync = null;
1413
+ }
1414
+ if (syncOnStart && !facilitatorSynced && Date.now() - lastFailedSyncAt >= FACILITATOR_SYNC_RETRY_FLOOR_MS2) {
1415
+ void syncFacilitator();
1416
+ }
1417
+ const resumeCandidate = paymentResumeCandidate(context);
1418
+ const resumedPayment = resumeCandidate ? await config?.resumeVerifiedPayment?.(context, resumeCandidate) : void 0;
1419
+ const result = resumedPayment ? resumePaymentResult(resourceServer, resumedPayment, context) : await httpServer.processHTTPRequest(context, config?.paywallConfig);
1420
+ switch (result.type) {
1421
+ case "no-payment-required":
1422
+ return next();
1423
+ case "payment-error": {
1424
+ const { response } = result;
1425
+ if (isFacilitatorUnavailableResponse(response)) {
1426
+ return facilitatorUnavailableResponse();
1427
+ }
1428
+ if (!response.isHtml && !isJsonResponse(response)) {
1429
+ return failureResponse(
1430
+ response.body,
1431
+ response.status,
1432
+ response.headers
1433
+ );
1434
+ }
1435
+ Object.entries(response.headers).forEach(([key, value]) => {
1436
+ c.header(key, value);
1437
+ });
1438
+ if (response.isHtml) {
1439
+ return c.html(response.body, response.status);
1440
+ }
1441
+ return c.json(response.body || {}, response.status);
1442
+ }
1443
+ case "payment-verified": {
1444
+ const {
1445
+ paymentPayload,
1446
+ paymentRequirements,
1447
+ declaredExtensions,
1448
+ cancellationDispatcher,
1449
+ beforeHandlerSettlement
1450
+ } = result;
1451
+ const propagateHandlerError = async (error) => {
1452
+ replaceContextResponse(c, new Response());
1453
+ const cancelSettlement = await cancellationDispatcher.cancel({
1454
+ reason: "handler_threw",
1455
+ error
1456
+ });
1457
+ const headers = httpServer.createFailurePathSettlementHeaders(
1458
+ cancelSettlement,
1459
+ beforeHandlerSettlement,
1460
+ paymentPayload
1461
+ );
1462
+ Object.entries(headers ?? {}).forEach(([key, value]) => {
1463
+ c.header(key, value);
1464
+ });
1465
+ throw error;
1466
+ };
1467
+ const originalHeader = c.header;
1468
+ const handlerHeaders = /* @__PURE__ */ new Set();
1469
+ const errorHeaders = /* @__PURE__ */ new Set();
1470
+ c.header = (name, value, options) => {
1471
+ (c.error ? errorHeaders : handlerHeaders).add(name.toLowerCase());
1472
+ originalHeader.call(c, name, value, options);
1473
+ };
1474
+ try {
1475
+ await next();
1476
+ } catch (error) {
1477
+ c.header = originalHeader;
1478
+ await propagateHandlerError(error);
1479
+ }
1480
+ c.header = originalHeader;
1481
+ if (c.error) {
1482
+ const res2 = c.res ?? new Response();
1483
+ const responseHeaders = new Headers(res2.headers);
1484
+ for (const name of handlerHeaders) {
1485
+ if (!errorHeaders.has(name)) responseHeaders.delete(name);
1486
+ }
1487
+ const cancelSettlement = await cancellationDispatcher.cancel({
1488
+ reason: "handler_threw",
1489
+ error: c.error
1490
+ });
1491
+ const headers = httpServer.createFailurePathSettlementHeaders(
1492
+ cancelSettlement,
1493
+ beforeHandlerSettlement,
1494
+ paymentPayload,
1495
+ responseHeaders.get("cache-control")
1496
+ );
1497
+ const sanitizedResponse = new Response(res2.body, {
1498
+ status: res2.status,
1499
+ statusText: res2.statusText,
1500
+ headers: responseHeaders
1501
+ });
1502
+ replaceContextResponse(
1503
+ c,
1504
+ withResponseHeaders(sanitizedResponse, headers)
1505
+ );
1506
+ return;
1507
+ }
1508
+ let res = c.res;
1509
+ if (res && res.status >= 400) {
1510
+ const cancelSettlement = await cancellationDispatcher.cancel({
1511
+ reason: "handler_failed",
1512
+ responseStatus: res.status
1513
+ });
1514
+ const headers = httpServer.createFailurePathSettlementHeaders(
1515
+ cancelSettlement,
1516
+ beforeHandlerSettlement,
1517
+ paymentPayload,
1518
+ res.headers.get("cache-control")
1519
+ );
1520
+ replaceContextResponse(c, withResponseHeaders(res, headers));
1521
+ return;
1522
+ }
1523
+ let settleResult;
1524
+ try {
1525
+ settleResult = await httpServer.processSettlement(
1526
+ paymentPayload,
1527
+ paymentRequirements,
1528
+ declaredExtensions,
1529
+ // The route handler signals a settlement override (a metered amount
1530
+ // below the signed maximum) through a response header.
1531
+ // `processSettlement` only reads that off `transportContext`, so
1532
+ // omitting this settles the full authorised amount and makes
1533
+ // `upto` behave exactly like `exact`.
1534
+ {
1535
+ request: context,
1536
+ responseBody: res ? Buffer.from(await res.clone().arrayBuffer()) : void 0,
1537
+ responseHeaders: toHeaderRecord2(res?.headers)
1538
+ },
1539
+ void 0,
1540
+ beforeHandlerSettlement
1541
+ );
1542
+ } catch (error) {
1543
+ replaceContextResponse(c, new Response());
1544
+ throw error;
1545
+ }
1546
+ if (!settleResult.success) {
1547
+ if (isFacilitatorUnavailable(settleResult.errorReason)) {
1548
+ replaceContextResponse(c, facilitatorUnavailableResponse());
1549
+ return;
1550
+ }
1551
+ const { response } = settleResult;
1552
+ replaceContextResponse(
1553
+ c,
1554
+ failureResponse(response.body, response.status, response.headers)
1555
+ );
1556
+ return;
1557
+ } else if (res) {
1558
+ res = withSuccessfulSettlementHeaders(res, settleResult.headers);
1559
+ }
1560
+ if (res) replaceContextResponse(c, res);
1561
+ return;
1562
+ }
1563
+ }
1564
+ };
1565
+ }
1566
+ // Annotate the CommonJS export names for ESM import in node:
1567
+ 0 && (module.exports = {
1568
+ MAX_EXTENSION_BYTES,
1569
+ WEFT_API_KEY_HEADER,
1570
+ WEFT_DECLARED_HEADER,
1571
+ WEFT_PRODUCT_EXTENSION_KEY,
1572
+ WEFT_PRODUCT_INFO_SCHEMA,
1573
+ WEFT_REQUEST_EXTENSION_KEY,
1574
+ WEFT_REQUEST_INFO_SCHEMA,
1575
+ WEFT_TYPE_TAG_PREFIX,
1576
+ X402_FACILITATOR_URL,
1577
+ applyProductIdentity,
1578
+ createFacilitatorClient,
1579
+ getFeeInfo,
1580
+ invalidateFeeCache,
1581
+ productTypeTag,
1582
+ registerDynamicExtensions,
1583
+ weftPaymentMiddleware,
1584
+ weftPaymentMiddlewareHono,
1585
+ ...require("@x402/core/server")
1586
+ });
1587
+ //# sourceMappingURL=server.js.map