@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
@@ -0,0 +1,180 @@
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/facilitator/index.ts
22
+ var facilitator_exports = {};
23
+ __export(facilitator_exports, {
24
+ X402_FACILITATOR_URL: () => X402_FACILITATOR_URL,
25
+ createFacilitatorClient: () => createFacilitatorClient,
26
+ getFeeInfo: () => getFeeInfo,
27
+ invalidateFeeCache: () => invalidateFeeCache
28
+ });
29
+ module.exports = __toCommonJS(facilitator_exports);
30
+ __reExport(facilitator_exports, require("@x402/core"), module.exports);
31
+ __reExport(facilitator_exports, require("@x402/core/types"), module.exports);
32
+
33
+ // src/facilitator/client.ts
34
+ var import_server = require("@x402/core/server");
35
+ var FACILITATOR_UNAVAILABLE_ERROR = "weft:facilitator-settle-unavailable";
36
+ var X402_FACILITATOR_URL = "https://x402.weft.network";
37
+ var X402_FACILITATOR_URL_ENV = "X402_FACILITATOR_URL";
38
+ var FacilitatorUnavailableError = class extends Error {
39
+ constructor() {
40
+ super(FACILITATOR_UNAVAILABLE_ERROR);
41
+ this.statusCode = 503;
42
+ this.name = "FacilitatorUnavailableError";
43
+ }
44
+ };
45
+ function isUnavailableSettleError(error) {
46
+ if (!(error instanceof Error)) return false;
47
+ const candidate = error;
48
+ 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);
49
+ }
50
+ var WeftHTTPFacilitatorClient = class extends import_server.HTTPFacilitatorClient {
51
+ async settle(paymentPayload, paymentRequirements) {
52
+ try {
53
+ return await super.settle(paymentPayload, paymentRequirements);
54
+ } catch (error) {
55
+ if (isUnavailableSettleError(error)) {
56
+ throw new FacilitatorUnavailableError();
57
+ }
58
+ throw error;
59
+ }
60
+ }
61
+ };
62
+ function validateUrl(url) {
63
+ if (!url || url.trim() === "") {
64
+ throw new Error("Invalid URL: URL cannot be empty");
65
+ }
66
+ if (!url.startsWith("http://") && !url.startsWith("https://")) {
67
+ throw new Error(
68
+ `Invalid URL format: URL must start with http:// or https://, got: ${url}`
69
+ );
70
+ }
71
+ }
72
+ function resolveUrl(config) {
73
+ if (config?.url) {
74
+ return config.url;
75
+ }
76
+ if (typeof process !== "undefined" && process.env?.[X402_FACILITATOR_URL_ENV]) {
77
+ return process.env[X402_FACILITATOR_URL_ENV];
78
+ }
79
+ return X402_FACILITATOR_URL;
80
+ }
81
+ function assertPathKeyedAuthHeaders(headers) {
82
+ const isHeaderObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
83
+ const hasPathKey = ["verify", "settle", "supported", "bazaar"].some(
84
+ (key) => isHeaderObject(headers[key])
85
+ );
86
+ const looksFlat = !hasPathKey && Object.values(headers).some((value) => !isHeaderObject(value));
87
+ if (looksFlat) {
88
+ throw new Error(
89
+ 'createAuthHeaders must return an object keyed by facilitator path, e.g. { verify: { Authorization: "..." }, settle: { ... }, supported: { ... } }, but received a flat headers object.'
90
+ );
91
+ }
92
+ }
93
+ function mergeSellerWins(derived, seller) {
94
+ const merged = { ...derived };
95
+ for (const [name, value] of Object.entries(seller ?? {})) {
96
+ for (const existing of Object.keys(merged)) {
97
+ if (existing.toLowerCase() === name.toLowerCase()) {
98
+ delete merged[existing];
99
+ }
100
+ }
101
+ merged[name] = value;
102
+ }
103
+ return merged;
104
+ }
105
+ function createFacilitatorClient(config, weftAuthHeaders) {
106
+ const url = resolveUrl(config);
107
+ validateUrl(url);
108
+ const sellerCreateAuthHeaders = config?.createAuthHeaders;
109
+ const derivedByPath = Object.entries(weftAuthHeaders ?? {}).filter(
110
+ ([, headers]) => headers !== void 0 && Object.keys(headers).length > 0
111
+ );
112
+ const createAuthHeaders = derivedByPath.length > 0 ? async () => {
113
+ const sellerHeaders = sellerCreateAuthHeaders ? await sellerCreateAuthHeaders() : void 0;
114
+ if (sellerHeaders) {
115
+ assertPathKeyedAuthHeaders(sellerHeaders);
116
+ }
117
+ const merged = { ...sellerHeaders };
118
+ for (const [path, derived] of derivedByPath) {
119
+ merged[path] = mergeSellerWins(derived, sellerHeaders?.[path]);
120
+ }
121
+ return merged;
122
+ } : sellerCreateAuthHeaders;
123
+ return new WeftHTTPFacilitatorClient({
124
+ url,
125
+ createAuthHeaders
126
+ });
127
+ }
128
+
129
+ // src/facilitator/fee.ts
130
+ var DEFAULT_CACHE_TTL = 5 * 60 * 1e3;
131
+ var feeCache = null;
132
+ function invalidateFeeCache() {
133
+ feeCache = null;
134
+ }
135
+ function isCacheValid() {
136
+ if (!feeCache) return false;
137
+ const now = Date.now();
138
+ return now - feeCache.fetchedAt < feeCache.ttl;
139
+ }
140
+ async function getFeeInfo(config, cacheConfig) {
141
+ if (isCacheValid() && feeCache) {
142
+ return feeCache.feeInfo;
143
+ }
144
+ const client = createFacilitatorClient(config);
145
+ const supported = await client.getSupported();
146
+ const fee = supported.fee;
147
+ if (!fee) {
148
+ throw new Error("Fee information not found in /supported response");
149
+ }
150
+ if (typeof fee.amount !== "string") {
151
+ throw new Error("Invalid fee structure: amount must be a string");
152
+ }
153
+ if (typeof fee.asset !== "string") {
154
+ throw new Error("Invalid fee structure: asset must be a string");
155
+ }
156
+ if (typeof fee.network !== "string") {
157
+ throw new Error("Invalid fee structure: network must be a string");
158
+ }
159
+ const feeInfo = {
160
+ amount: fee.amount,
161
+ asset: fee.asset,
162
+ network: fee.network
163
+ };
164
+ feeCache = {
165
+ feeInfo,
166
+ fetchedAt: Date.now(),
167
+ ttl: cacheConfig?.ttl ?? DEFAULT_CACHE_TTL
168
+ };
169
+ return feeInfo;
170
+ }
171
+ // Annotate the CommonJS export names for ESM import in node:
172
+ 0 && (module.exports = {
173
+ X402_FACILITATOR_URL,
174
+ createFacilitatorClient,
175
+ getFeeInfo,
176
+ invalidateFeeCache,
177
+ ...require("@x402/core"),
178
+ ...require("@x402/core/types")
179
+ });
180
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/facilitator/index.ts","../../src/facilitator/client.ts","../../src/facilitator/fee.ts"],"sourcesContent":["export * from \"@x402/core\";\nexport * from \"@x402/core/types\";\n\nexport { X402_FACILITATOR_URL, createFacilitatorClient } from \"./client\";\nexport type { WeftFacilitatorConfig } from \"./client\";\n\nexport { getFeeInfo, invalidateFeeCache } from \"./fee\";\nexport type { FeeInfo, FeeCacheConfig } from \"./fee\";\n","import { HTTPFacilitatorClient, FacilitatorConfig } from \"@x402/core/server\";\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SettleResponse,\n} from \"@x402/core/types\";\n\nexport const FACILITATOR_UNAVAILABLE_ERROR =\n \"weft:facilitator-settle-unavailable\";\n\nexport const X402_FACILITATOR_URL = \"https://x402.weft.network\";\nexport const X402_FACILITATOR_URL_ENV = \"X402_FACILITATOR_URL\";\n\nexport interface WeftFacilitatorConfig {\n url?: string;\n createAuthHeaders?: FacilitatorConfig[\"createAuthHeaders\"];\n}\n\nclass FacilitatorUnavailableError extends Error {\n readonly statusCode = 503;\n\n constructor() {\n super(FACILITATOR_UNAVAILABLE_ERROR);\n this.name = \"FacilitatorUnavailableError\";\n }\n}\n\nfunction isUnavailableSettleError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const candidate = error as Error & Record<string, unknown>;\n return (\n candidate.name === \"SettleError\" &&\n candidate.statusCode === 503 &&\n \"errorReason\" in candidate &&\n \"errorMessage\" in candidate &&\n \"payer\" in candidate &&\n \"transaction\" in candidate &&\n \"network\" in candidate &&\n !(candidate.errorReason === \"settlement_pending\" && candidate.transaction)\n );\n}\n\nclass WeftHTTPFacilitatorClient extends HTTPFacilitatorClient {\n override async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n try {\n return await super.settle(paymentPayload, paymentRequirements);\n } catch (error) {\n if (isUnavailableSettleError(error)) {\n throw new FacilitatorUnavailableError();\n }\n throw error;\n }\n }\n}\n\nexport function validateUrl(url: string): void {\n if (!url || url.trim() === \"\") {\n throw new Error(\"Invalid URL: URL cannot be empty\");\n }\n\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n throw new Error(\n `Invalid URL format: URL must start with http:// or https://, got: ${url}`,\n );\n }\n}\n\nexport function resolveUrl(config?: WeftFacilitatorConfig): string {\n if (config?.url) {\n return config.url;\n }\n\n if (\n typeof process !== \"undefined\" &&\n process.env?.[X402_FACILITATOR_URL_ENV]\n ) {\n return process.env[X402_FACILITATOR_URL_ENV]!;\n }\n\n return X402_FACILITATOR_URL;\n}\n\ntype AuthHeadersByPath = Awaited<\n ReturnType<NonNullable<FacilitatorConfig[\"createAuthHeaders\"]>>\n>;\n\n/**\n * Reject a flat headers object the way `@x402/core` itself would.\n *\n * Upstream's `HTTPFacilitatorClient` throws when `createAuthHeaders` returns\n * `{ Authorization: ... }` instead of `{ supported: { Authorization: ... } }`,\n * because silently dropping auth on every request is worse than failing loud.\n * Merging the handshake's own `supported` headers in would mask that check —\n * the merged object always has a path key — so the check runs here first,\n * with the same failure mode a misconfigured seller sees today.\n *\n * @param headers - What the seller's `createAuthHeaders` returned\n */\nfunction assertPathKeyedAuthHeaders(headers: AuthHeadersByPath): void {\n const isHeaderObject = (value: unknown): boolean =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n const hasPathKey = [\"verify\", \"settle\", \"supported\", \"bazaar\"].some((key) =>\n isHeaderObject(headers[key as keyof AuthHeadersByPath]),\n );\n const looksFlat =\n !hasPathKey &&\n Object.values(headers).some((value) => !isHeaderObject(value));\n\n if (looksFlat) {\n throw new Error(\n \"createAuthHeaders must return an object keyed by facilitator path, \" +\n 'e.g. { verify: { Authorization: \"...\" }, settle: { ... }, ' +\n \"supported: { ... } }, but received a flat headers object.\",\n );\n }\n}\n\n/**\n * Merge SDK-derived headers under a seller's, case-insensitively, seller wins.\n *\n * Header names are case-insensitive, but object keys are not: a plain spread\n * would keep a derived `Authorization` and a seller `authorization` as two\n * keys, and the HTTP layer folds those into one comma-joined value — a\n * garbled credential. So a seller header replaces any derived header of the\n * same name whatever its case, and the seller's spelling is the one sent.\n *\n * @param derived - Headers the SDK derived from config for one path\n * @param seller - The seller's own headers for that path, if any\n * @returns The merged headers, the seller's winning on conflict\n */\nfunction mergeSellerWins(\n derived: Record<string, string>,\n seller: Record<string, string> | undefined,\n): Record<string, string> {\n const merged: Record<string, string> = { ...derived };\n for (const [name, value] of Object.entries(seller ?? {})) {\n for (const existing of Object.keys(merged)) {\n if (existing.toLowerCase() === name.toLowerCase()) {\n delete merged[existing];\n }\n }\n merged[name] = value;\n }\n return merged;\n}\n\nexport function createFacilitatorClient(\n config?: WeftFacilitatorConfig,\n weftAuthHeaders?: AuthHeadersByPath,\n): HTTPFacilitatorClient {\n const url = resolveUrl(config);\n validateUrl(url);\n\n const sellerCreateAuthHeaders = config?.createAuthHeaders;\n\n // Only the paths the SDK actually derived headers for — `supported` always,\n // `settle` and `verify` when an apiKey was configured. Empty paths are\n // dropped so a caller with no derived headers is byte-identical to passing\n // none.\n const derivedByPath = Object.entries(weftAuthHeaders ?? {}).filter(\n ([, headers]) => headers !== undefined && Object.keys(headers).length > 0,\n ) as Array<[keyof AuthHeadersByPath, Record<string, string>]>;\n\n const createAuthHeaders =\n derivedByPath.length > 0\n ? async (): Promise<AuthHeadersByPath> => {\n const sellerHeaders = sellerCreateAuthHeaders\n ? await sellerCreateAuthHeaders()\n : undefined;\n if (sellerHeaders) {\n assertPathKeyedAuthHeaders(sellerHeaders);\n }\n // The seller's own headers win on conflict: an explicit\n // createAuthHeaders is a more deliberate act than `apiKey`.\n const merged: AuthHeadersByPath = { ...sellerHeaders };\n for (const [path, derived] of derivedByPath) {\n merged[path] = mergeSellerWins(derived, sellerHeaders?.[path]);\n }\n return merged;\n }\n : sellerCreateAuthHeaders;\n\n return new WeftHTTPFacilitatorClient({\n url,\n createAuthHeaders,\n });\n}\n","import { createFacilitatorClient, WeftFacilitatorConfig } from \"./client\";\n\nexport interface FeeInfo {\n amount: string;\n asset: string;\n network: string;\n}\n\nexport interface FeeCacheConfig {\n ttl?: number;\n}\n\ninterface FeeCache {\n feeInfo: FeeInfo;\n fetchedAt: number;\n ttl: number;\n}\n\nconst DEFAULT_CACHE_TTL = 5 * 60 * 1000;\n\nlet feeCache: FeeCache | null = null;\n\nexport function invalidateFeeCache(): void {\n feeCache = null;\n}\n\nfunction isCacheValid(): boolean {\n if (!feeCache) return false;\n const now = Date.now();\n return now - feeCache.fetchedAt < feeCache.ttl;\n}\n\nexport async function getFeeInfo(\n config?: WeftFacilitatorConfig,\n cacheConfig?: FeeCacheConfig,\n): Promise<FeeInfo> {\n if (isCacheValid() && feeCache) {\n return feeCache.feeInfo;\n }\n\n const client = createFacilitatorClient(config);\n const supported = await client.getSupported();\n\n const fee = (supported as { fee?: FeeInfo }).fee;\n if (!fee) {\n throw new Error(\"Fee information not found in /supported response\");\n }\n\n if (typeof fee.amount !== \"string\") {\n throw new Error(\"Invalid fee structure: amount must be a string\");\n }\n if (typeof fee.asset !== \"string\") {\n throw new Error(\"Invalid fee structure: asset must be a string\");\n }\n if (typeof fee.network !== \"string\") {\n throw new Error(\"Invalid fee structure: network must be a string\");\n }\n\n const feeInfo: FeeInfo = {\n amount: fee.amount,\n asset: fee.asset,\n network: fee.network,\n };\n\n feeCache = {\n feeInfo,\n fetchedAt: Date.now(),\n ttl: cacheConfig?.ttl ?? DEFAULT_CACHE_TTL,\n };\n\n return feeInfo;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,149 @@
1
+ // src/facilitator/index.ts
2
+ export * from "@x402/core";
3
+ export * from "@x402/core/types";
4
+
5
+ // src/facilitator/client.ts
6
+ import { HTTPFacilitatorClient } from "@x402/core/server";
7
+ var FACILITATOR_UNAVAILABLE_ERROR = "weft:facilitator-settle-unavailable";
8
+ var X402_FACILITATOR_URL = "https://x402.weft.network";
9
+ var X402_FACILITATOR_URL_ENV = "X402_FACILITATOR_URL";
10
+ var FacilitatorUnavailableError = class extends Error {
11
+ constructor() {
12
+ super(FACILITATOR_UNAVAILABLE_ERROR);
13
+ this.statusCode = 503;
14
+ this.name = "FacilitatorUnavailableError";
15
+ }
16
+ };
17
+ function isUnavailableSettleError(error) {
18
+ if (!(error instanceof Error)) return false;
19
+ const candidate = error;
20
+ 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);
21
+ }
22
+ var WeftHTTPFacilitatorClient = class extends HTTPFacilitatorClient {
23
+ async settle(paymentPayload, paymentRequirements) {
24
+ try {
25
+ return await super.settle(paymentPayload, paymentRequirements);
26
+ } catch (error) {
27
+ if (isUnavailableSettleError(error)) {
28
+ throw new FacilitatorUnavailableError();
29
+ }
30
+ throw error;
31
+ }
32
+ }
33
+ };
34
+ function validateUrl(url) {
35
+ if (!url || url.trim() === "") {
36
+ throw new Error("Invalid URL: URL cannot be empty");
37
+ }
38
+ if (!url.startsWith("http://") && !url.startsWith("https://")) {
39
+ throw new Error(
40
+ `Invalid URL format: URL must start with http:// or https://, got: ${url}`
41
+ );
42
+ }
43
+ }
44
+ function resolveUrl(config) {
45
+ if (config?.url) {
46
+ return config.url;
47
+ }
48
+ if (typeof process !== "undefined" && process.env?.[X402_FACILITATOR_URL_ENV]) {
49
+ return process.env[X402_FACILITATOR_URL_ENV];
50
+ }
51
+ return X402_FACILITATOR_URL;
52
+ }
53
+ function assertPathKeyedAuthHeaders(headers) {
54
+ const isHeaderObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
55
+ const hasPathKey = ["verify", "settle", "supported", "bazaar"].some(
56
+ (key) => isHeaderObject(headers[key])
57
+ );
58
+ const looksFlat = !hasPathKey && Object.values(headers).some((value) => !isHeaderObject(value));
59
+ if (looksFlat) {
60
+ throw new Error(
61
+ 'createAuthHeaders must return an object keyed by facilitator path, e.g. { verify: { Authorization: "..." }, settle: { ... }, supported: { ... } }, but received a flat headers object.'
62
+ );
63
+ }
64
+ }
65
+ function mergeSellerWins(derived, seller) {
66
+ const merged = { ...derived };
67
+ for (const [name, value] of Object.entries(seller ?? {})) {
68
+ for (const existing of Object.keys(merged)) {
69
+ if (existing.toLowerCase() === name.toLowerCase()) {
70
+ delete merged[existing];
71
+ }
72
+ }
73
+ merged[name] = value;
74
+ }
75
+ return merged;
76
+ }
77
+ function createFacilitatorClient(config, weftAuthHeaders) {
78
+ const url = resolveUrl(config);
79
+ validateUrl(url);
80
+ const sellerCreateAuthHeaders = config?.createAuthHeaders;
81
+ const derivedByPath = Object.entries(weftAuthHeaders ?? {}).filter(
82
+ ([, headers]) => headers !== void 0 && Object.keys(headers).length > 0
83
+ );
84
+ const createAuthHeaders = derivedByPath.length > 0 ? async () => {
85
+ const sellerHeaders = sellerCreateAuthHeaders ? await sellerCreateAuthHeaders() : void 0;
86
+ if (sellerHeaders) {
87
+ assertPathKeyedAuthHeaders(sellerHeaders);
88
+ }
89
+ const merged = { ...sellerHeaders };
90
+ for (const [path, derived] of derivedByPath) {
91
+ merged[path] = mergeSellerWins(derived, sellerHeaders?.[path]);
92
+ }
93
+ return merged;
94
+ } : sellerCreateAuthHeaders;
95
+ return new WeftHTTPFacilitatorClient({
96
+ url,
97
+ createAuthHeaders
98
+ });
99
+ }
100
+
101
+ // src/facilitator/fee.ts
102
+ var DEFAULT_CACHE_TTL = 5 * 60 * 1e3;
103
+ var feeCache = null;
104
+ function invalidateFeeCache() {
105
+ feeCache = null;
106
+ }
107
+ function isCacheValid() {
108
+ if (!feeCache) return false;
109
+ const now = Date.now();
110
+ return now - feeCache.fetchedAt < feeCache.ttl;
111
+ }
112
+ async function getFeeInfo(config, cacheConfig) {
113
+ if (isCacheValid() && feeCache) {
114
+ return feeCache.feeInfo;
115
+ }
116
+ const client = createFacilitatorClient(config);
117
+ const supported = await client.getSupported();
118
+ const fee = supported.fee;
119
+ if (!fee) {
120
+ throw new Error("Fee information not found in /supported response");
121
+ }
122
+ if (typeof fee.amount !== "string") {
123
+ throw new Error("Invalid fee structure: amount must be a string");
124
+ }
125
+ if (typeof fee.asset !== "string") {
126
+ throw new Error("Invalid fee structure: asset must be a string");
127
+ }
128
+ if (typeof fee.network !== "string") {
129
+ throw new Error("Invalid fee structure: network must be a string");
130
+ }
131
+ const feeInfo = {
132
+ amount: fee.amount,
133
+ asset: fee.asset,
134
+ network: fee.network
135
+ };
136
+ feeCache = {
137
+ feeInfo,
138
+ fetchedAt: Date.now(),
139
+ ttl: cacheConfig?.ttl ?? DEFAULT_CACHE_TTL
140
+ };
141
+ return feeInfo;
142
+ }
143
+ export {
144
+ X402_FACILITATOR_URL,
145
+ createFacilitatorClient,
146
+ getFeeInfo,
147
+ invalidateFeeCache
148
+ };
149
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/facilitator/index.ts","../../src/facilitator/client.ts","../../src/facilitator/fee.ts"],"sourcesContent":["export * from \"@x402/core\";\nexport * from \"@x402/core/types\";\n\nexport { X402_FACILITATOR_URL, createFacilitatorClient } from \"./client\";\nexport type { WeftFacilitatorConfig } from \"./client\";\n\nexport { getFeeInfo, invalidateFeeCache } from \"./fee\";\nexport type { FeeInfo, FeeCacheConfig } from \"./fee\";\n","import { HTTPFacilitatorClient, FacilitatorConfig } from \"@x402/core/server\";\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SettleResponse,\n} from \"@x402/core/types\";\n\nexport const FACILITATOR_UNAVAILABLE_ERROR =\n \"weft:facilitator-settle-unavailable\";\n\nexport const X402_FACILITATOR_URL = \"https://x402.weft.network\";\nexport const X402_FACILITATOR_URL_ENV = \"X402_FACILITATOR_URL\";\n\nexport interface WeftFacilitatorConfig {\n url?: string;\n createAuthHeaders?: FacilitatorConfig[\"createAuthHeaders\"];\n}\n\nclass FacilitatorUnavailableError extends Error {\n readonly statusCode = 503;\n\n constructor() {\n super(FACILITATOR_UNAVAILABLE_ERROR);\n this.name = \"FacilitatorUnavailableError\";\n }\n}\n\nfunction isUnavailableSettleError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const candidate = error as Error & Record<string, unknown>;\n return (\n candidate.name === \"SettleError\" &&\n candidate.statusCode === 503 &&\n \"errorReason\" in candidate &&\n \"errorMessage\" in candidate &&\n \"payer\" in candidate &&\n \"transaction\" in candidate &&\n \"network\" in candidate &&\n !(candidate.errorReason === \"settlement_pending\" && candidate.transaction)\n );\n}\n\nclass WeftHTTPFacilitatorClient extends HTTPFacilitatorClient {\n override async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n try {\n return await super.settle(paymentPayload, paymentRequirements);\n } catch (error) {\n if (isUnavailableSettleError(error)) {\n throw new FacilitatorUnavailableError();\n }\n throw error;\n }\n }\n}\n\nexport function validateUrl(url: string): void {\n if (!url || url.trim() === \"\") {\n throw new Error(\"Invalid URL: URL cannot be empty\");\n }\n\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n throw new Error(\n `Invalid URL format: URL must start with http:// or https://, got: ${url}`,\n );\n }\n}\n\nexport function resolveUrl(config?: WeftFacilitatorConfig): string {\n if (config?.url) {\n return config.url;\n }\n\n if (\n typeof process !== \"undefined\" &&\n process.env?.[X402_FACILITATOR_URL_ENV]\n ) {\n return process.env[X402_FACILITATOR_URL_ENV]!;\n }\n\n return X402_FACILITATOR_URL;\n}\n\ntype AuthHeadersByPath = Awaited<\n ReturnType<NonNullable<FacilitatorConfig[\"createAuthHeaders\"]>>\n>;\n\n/**\n * Reject a flat headers object the way `@x402/core` itself would.\n *\n * Upstream's `HTTPFacilitatorClient` throws when `createAuthHeaders` returns\n * `{ Authorization: ... }` instead of `{ supported: { Authorization: ... } }`,\n * because silently dropping auth on every request is worse than failing loud.\n * Merging the handshake's own `supported` headers in would mask that check —\n * the merged object always has a path key — so the check runs here first,\n * with the same failure mode a misconfigured seller sees today.\n *\n * @param headers - What the seller's `createAuthHeaders` returned\n */\nfunction assertPathKeyedAuthHeaders(headers: AuthHeadersByPath): void {\n const isHeaderObject = (value: unknown): boolean =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n const hasPathKey = [\"verify\", \"settle\", \"supported\", \"bazaar\"].some((key) =>\n isHeaderObject(headers[key as keyof AuthHeadersByPath]),\n );\n const looksFlat =\n !hasPathKey &&\n Object.values(headers).some((value) => !isHeaderObject(value));\n\n if (looksFlat) {\n throw new Error(\n \"createAuthHeaders must return an object keyed by facilitator path, \" +\n 'e.g. { verify: { Authorization: \"...\" }, settle: { ... }, ' +\n \"supported: { ... } }, but received a flat headers object.\",\n );\n }\n}\n\n/**\n * Merge SDK-derived headers under a seller's, case-insensitively, seller wins.\n *\n * Header names are case-insensitive, but object keys are not: a plain spread\n * would keep a derived `Authorization` and a seller `authorization` as two\n * keys, and the HTTP layer folds those into one comma-joined value — a\n * garbled credential. So a seller header replaces any derived header of the\n * same name whatever its case, and the seller's spelling is the one sent.\n *\n * @param derived - Headers the SDK derived from config for one path\n * @param seller - The seller's own headers for that path, if any\n * @returns The merged headers, the seller's winning on conflict\n */\nfunction mergeSellerWins(\n derived: Record<string, string>,\n seller: Record<string, string> | undefined,\n): Record<string, string> {\n const merged: Record<string, string> = { ...derived };\n for (const [name, value] of Object.entries(seller ?? {})) {\n for (const existing of Object.keys(merged)) {\n if (existing.toLowerCase() === name.toLowerCase()) {\n delete merged[existing];\n }\n }\n merged[name] = value;\n }\n return merged;\n}\n\nexport function createFacilitatorClient(\n config?: WeftFacilitatorConfig,\n weftAuthHeaders?: AuthHeadersByPath,\n): HTTPFacilitatorClient {\n const url = resolveUrl(config);\n validateUrl(url);\n\n const sellerCreateAuthHeaders = config?.createAuthHeaders;\n\n // Only the paths the SDK actually derived headers for — `supported` always,\n // `settle` and `verify` when an apiKey was configured. Empty paths are\n // dropped so a caller with no derived headers is byte-identical to passing\n // none.\n const derivedByPath = Object.entries(weftAuthHeaders ?? {}).filter(\n ([, headers]) => headers !== undefined && Object.keys(headers).length > 0,\n ) as Array<[keyof AuthHeadersByPath, Record<string, string>]>;\n\n const createAuthHeaders =\n derivedByPath.length > 0\n ? async (): Promise<AuthHeadersByPath> => {\n const sellerHeaders = sellerCreateAuthHeaders\n ? await sellerCreateAuthHeaders()\n : undefined;\n if (sellerHeaders) {\n assertPathKeyedAuthHeaders(sellerHeaders);\n }\n // The seller's own headers win on conflict: an explicit\n // createAuthHeaders is a more deliberate act than `apiKey`.\n const merged: AuthHeadersByPath = { ...sellerHeaders };\n for (const [path, derived] of derivedByPath) {\n merged[path] = mergeSellerWins(derived, sellerHeaders?.[path]);\n }\n return merged;\n }\n : sellerCreateAuthHeaders;\n\n return new WeftHTTPFacilitatorClient({\n url,\n createAuthHeaders,\n });\n}\n","import { createFacilitatorClient, WeftFacilitatorConfig } from \"./client\";\n\nexport interface FeeInfo {\n amount: string;\n asset: string;\n network: string;\n}\n\nexport interface FeeCacheConfig {\n ttl?: number;\n}\n\ninterface FeeCache {\n feeInfo: FeeInfo;\n fetchedAt: number;\n ttl: number;\n}\n\nconst DEFAULT_CACHE_TTL = 5 * 60 * 1000;\n\nlet feeCache: FeeCache | null = null;\n\nexport function invalidateFeeCache(): void {\n feeCache = null;\n}\n\nfunction isCacheValid(): boolean {\n if (!feeCache) return false;\n const now = Date.now();\n return now - feeCache.fetchedAt < feeCache.ttl;\n}\n\nexport async function getFeeInfo(\n config?: WeftFacilitatorConfig,\n cacheConfig?: FeeCacheConfig,\n): Promise<FeeInfo> {\n if (isCacheValid() && feeCache) {\n return feeCache.feeInfo;\n }\n\n const client = createFacilitatorClient(config);\n const supported = await client.getSupported();\n\n const fee = (supported as { fee?: FeeInfo }).fee;\n if (!fee) {\n throw new Error(\"Fee information not found in /supported response\");\n }\n\n if (typeof fee.amount !== \"string\") {\n throw new Error(\"Invalid fee structure: amount must be a string\");\n }\n if (typeof fee.asset !== \"string\") {\n throw new Error(\"Invalid fee structure: asset must be a string\");\n }\n if (typeof fee.network !== \"string\") {\n throw new Error(\"Invalid fee structure: network must be a string\");\n }\n\n const feeInfo: FeeInfo = {\n amount: fee.amount,\n asset: fee.asset,\n network: fee.network,\n };\n\n feeCache = {\n feeInfo,\n fetchedAt: Date.now(),\n ttl: cacheConfig?.ttl ?? DEFAULT_CACHE_TTL,\n };\n\n return feeInfo;\n}\n"],"mappings":"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","names":[]}