@atxp/server 0.2.22 → 0.4.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 (75) hide show
  1. package/dist/atxpContext.js +9 -6
  2. package/dist/atxpContext.js.map +1 -1
  3. package/dist/core/mcp.js +39 -0
  4. package/dist/core/mcp.js.map +1 -0
  5. package/dist/{oAuthChallenge.js → core/oauth.js} +21 -12
  6. package/dist/core/oauth.js.map +1 -0
  7. package/dist/{token.js → core/token.js} +13 -7
  8. package/dist/core/token.js.map +1 -0
  9. package/dist/getResource.js +23 -4
  10. package/dist/getResource.js.map +1 -1
  11. package/dist/index.cjs +654 -0
  12. package/dist/index.cjs.map +1 -0
  13. package/dist/index.d.ts +197 -5
  14. package/dist/index.js +609 -5
  15. package/dist/index.js.map +1 -1
  16. package/dist/node/getRawBody.js +35 -0
  17. package/dist/node/getRawBody.js.map +1 -0
  18. package/dist/node/http.js +49 -0
  19. package/dist/node/http.js.map +1 -0
  20. package/dist/node/oauth.js +41 -0
  21. package/dist/node/oauth.js.map +1 -0
  22. package/dist/node/token.js +15 -0
  23. package/dist/node/token.js.map +1 -0
  24. package/dist/oAuthMetadata.js +6 -12
  25. package/dist/oAuthMetadata.js.map +1 -1
  26. package/dist/paymentServer.js +5 -20
  27. package/dist/paymentServer.js.map +1 -1
  28. package/dist/protectedResourceMetadata.js +10 -16
  29. package/dist/protectedResourceMetadata.js.map +1 -1
  30. package/dist/requirePayment.js +7 -4
  31. package/dist/requirePayment.js.map +1 -1
  32. package/dist/serverConfig.js +37 -0
  33. package/dist/serverConfig.js.map +1 -0
  34. package/dist/serverTestHelpers.d.ts +70 -21
  35. package/dist/serverTestHelpers.js +55 -24
  36. package/dist/serverTestHelpers.js.map +1 -1
  37. package/dist/types.js +4 -2
  38. package/dist/types.js.map +1 -1
  39. package/dist/webapi/mcp.js +25 -0
  40. package/dist/webapi/mcp.js.map +1 -0
  41. package/dist/webapi/oauth.js +43 -0
  42. package/dist/webapi/oauth.js.map +1 -0
  43. package/dist/webapi/token.js +15 -0
  44. package/dist/webapi/token.js.map +1 -0
  45. package/package.json +24 -10
  46. package/dist/atxpContext.d.ts +0 -6
  47. package/dist/atxpContext.d.ts.map +0 -1
  48. package/dist/atxpServer.d.ts +0 -12
  49. package/dist/atxpServer.d.ts.map +0 -1
  50. package/dist/atxpServer.js +0 -101
  51. package/dist/atxpServer.js.map +0 -1
  52. package/dist/getResource.d.ts +0 -4
  53. package/dist/getResource.d.ts.map +0 -1
  54. package/dist/http.d.ts +0 -7
  55. package/dist/http.d.ts.map +0 -1
  56. package/dist/http.js +0 -51
  57. package/dist/http.js.map +0 -1
  58. package/dist/index.d.ts.map +0 -1
  59. package/dist/oAuthChallenge.d.ts +0 -4
  60. package/dist/oAuthChallenge.d.ts.map +0 -1
  61. package/dist/oAuthChallenge.js.map +0 -1
  62. package/dist/oAuthMetadata.d.ts +0 -6
  63. package/dist/oAuthMetadata.d.ts.map +0 -1
  64. package/dist/paymentServer.d.ts +0 -62
  65. package/dist/paymentServer.d.ts.map +0 -1
  66. package/dist/protectedResourceMetadata.d.ts +0 -5
  67. package/dist/protectedResourceMetadata.d.ts.map +0 -1
  68. package/dist/requirePayment.d.ts +0 -3
  69. package/dist/requirePayment.d.ts.map +0 -1
  70. package/dist/serverTestHelpers.d.ts.map +0 -1
  71. package/dist/token.d.ts +0 -4
  72. package/dist/token.d.ts.map +0 -1
  73. package/dist/token.js.map +0 -1
  74. package/dist/types.d.ts +0 -60
  75. package/dist/types.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -1,5 +1,609 @@
1
- export * from './atxpServer.js';
2
- export * from './types.js';
3
- export * from './atxpContext.js';
4
- export * from './requirePayment.js';
5
- //# sourceMappingURL=index.js.map
1
+ import { AsyncLocalStorage } from 'async_hooks';
2
+ import * as contentType from 'content-type';
3
+ import { isJSONRPCRequest } from '@modelcontextprotocol/sdk/types.js';
4
+ import { parseMcpMessages, paymentRequiredError, DEFAULT_AUTHORIZATION_SERVER, MemoryOAuthDb, OAuthResourceClient, ConsoleLogger } from '@atxp/common';
5
+
6
+ var TokenProblem;
7
+ (function (TokenProblem) {
8
+ TokenProblem["NO_TOKEN"] = "NO-TOKEN";
9
+ TokenProblem["NON_BEARER_AUTH_HEADER"] = "NON-BEARER-AUTH-HEADER";
10
+ TokenProblem["INVALID_TOKEN"] = "INVALID-TOKEN";
11
+ TokenProblem["INVALID_AUDIENCE"] = "INVALID-AUDIENCE";
12
+ TokenProblem["NON_SUFFICIENT_FUNDS"] = "NON-SUFFICIENT-FUNDS";
13
+ TokenProblem["INTROSPECT_ERROR"] = "INTROSPECT-ERROR";
14
+ })(TokenProblem || (TokenProblem = {}));
15
+
16
+ const contextStorage = new AsyncLocalStorage();
17
+ function getATXPConfig() {
18
+ const context = contextStorage.getStore();
19
+ return context?.config ?? null;
20
+ }
21
+ function getATXPResource() {
22
+ const context = contextStorage.getStore();
23
+ return context?.resource ?? null;
24
+ }
25
+ // Helper function to get the current request's user
26
+ function atxpAccountId() {
27
+ const context = contextStorage.getStore();
28
+ return context?.tokenData?.sub ?? null;
29
+ }
30
+ // Helper function to run code within a user context
31
+ async function withATXPContext(config, resource, tokenInfo, next) {
32
+ config.logger.debug(`Setting user context to ${tokenInfo?.data?.sub ?? 'null'}`);
33
+ if (tokenInfo && tokenInfo.data?.sub) {
34
+ if (tokenInfo.token) {
35
+ const dbData = {
36
+ accessToken: tokenInfo.token,
37
+ resourceUrl: ''
38
+ };
39
+ // Save the token to the oAuthDB so that other users of the DB can access it
40
+ // if needed (ie, for token-exchange for downstream services)
41
+ await config.oAuthDb.saveAccessToken(tokenInfo.data.sub, '', dbData);
42
+ }
43
+ else {
44
+ config.logger.warn(`Setting user context with token data, but there was no token provided. This probably indicates a bug, since the data should be derived from the token`);
45
+ config.logger.debug(`Token data: ${JSON.stringify(tokenInfo.data)}`);
46
+ }
47
+ }
48
+ const ctx = {
49
+ tokenData: tokenInfo?.data || null,
50
+ config,
51
+ resource
52
+ };
53
+ return contextStorage.run(ctx, next);
54
+ }
55
+
56
+ /**
57
+ * Core platform-agnostic token checking logic
58
+ * Takes an authorization header string instead of platform-specific request objects
59
+ */
60
+ async function checkTokenCore(config, resourceURL, authorizationHeader) {
61
+ const protocol = resourceURL.protocol;
62
+ const host = resourceURL.host;
63
+ const pathname = resourceURL.pathname;
64
+ const protectedResourceMetadataUrl = `${protocol}//${host}/.well-known/oauth-protected-resource${pathname}`;
65
+ const failure = {
66
+ passes: false,
67
+ resourceMetadataUrl: protectedResourceMetadataUrl,
68
+ };
69
+ // Extract the Bearer token from the Authorization header
70
+ if (!authorizationHeader) {
71
+ return { ...failure, problem: TokenProblem.NO_TOKEN, data: null, token: null };
72
+ }
73
+ if (!authorizationHeader.startsWith('Bearer ')) {
74
+ return { ...failure, problem: TokenProblem.NON_BEARER_AUTH_HEADER, data: null, token: null };
75
+ }
76
+ const token = authorizationHeader.substring(7);
77
+ try {
78
+ const introspectionResult = await config.oAuthClient.introspectToken(config.server, token);
79
+ if (!introspectionResult.active) {
80
+ return { ...failure, problem: TokenProblem.INVALID_TOKEN, data: null, token };
81
+ }
82
+ return {
83
+ passes: true,
84
+ data: introspectionResult,
85
+ token,
86
+ };
87
+ }
88
+ catch (error) {
89
+ config.logger.error(`Error during token introspection: ${error}`);
90
+ return { ...failure, problem: TokenProblem.INTROSPECT_ERROR, data: null, token };
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Core platform-agnostic OAuth challenge response creation
96
+ * Returns the response data instead of writing to platform-specific response objects
97
+ */
98
+ function createOAuthChallengeResponseCore(tokenCheck) {
99
+ if (tokenCheck.passes) {
100
+ return null;
101
+ }
102
+ let status = 401;
103
+ let body = {};
104
+ // https://datatracker.ietf.org/doc/html/rfc6750#section-3.1
105
+ switch (tokenCheck.problem) {
106
+ case TokenProblem.NO_TOKEN:
107
+ break;
108
+ case TokenProblem.NON_BEARER_AUTH_HEADER:
109
+ status = 400;
110
+ body = { error: 'invalid_request', error_description: 'Authorization header did not include a Bearer token' };
111
+ break;
112
+ case TokenProblem.INVALID_TOKEN:
113
+ body = { error: 'invalid_token', error_description: 'Token is not active' };
114
+ break;
115
+ case TokenProblem.INVALID_AUDIENCE:
116
+ body = { error: 'invalid_token', error_description: 'Token does not match the expected audience' };
117
+ break;
118
+ case TokenProblem.NON_SUFFICIENT_FUNDS:
119
+ status = 403;
120
+ body = { error: 'insufficient_scope', error_description: 'Non sufficient funds' };
121
+ break;
122
+ case TokenProblem.INTROSPECT_ERROR:
123
+ status = 502;
124
+ body = { error: 'server_error', error_description: 'An internal server error occurred' };
125
+ break;
126
+ }
127
+ const wwwAuthenticate = `Bearer resource_metadata="${tokenCheck.resourceMetadataUrl}"`;
128
+ return {
129
+ status,
130
+ headers: {
131
+ 'Content-Type': 'application/json',
132
+ 'WWW-Authenticate': wwwAuthenticate
133
+ },
134
+ body: JSON.stringify(body)
135
+ };
136
+ }
137
+
138
+ /**
139
+ * Core platform-agnostic MCP request parsing logic
140
+ * Takes parsed JSON and request metadata instead of platform-specific request objects
141
+ */
142
+ function parseMcpRequestsCore(config, requestUrl, method, parsedBody) {
143
+ if (!method || method.toLowerCase() !== 'post') {
144
+ return [];
145
+ }
146
+ // The middleware has to be mounted at the root to serve the protected resource metadata,
147
+ // but the actual MCP server it's controlling is specified by the mountPath.
148
+ const path = requestUrl.pathname.replace(/\/$/, '');
149
+ const mountPath = config.mountPath.replace(/\/$/, '');
150
+ if (path !== mountPath && path !== `${mountPath}/message`) {
151
+ config.logger.debug(`Request path (${path}) does not match the mountPath (${mountPath}), skipping MCP middleware`);
152
+ return [];
153
+ }
154
+ if (!parsedBody || typeof parsedBody !== 'object') {
155
+ return [];
156
+ }
157
+ // Check if it's a JSON-RPC request
158
+ if (Array.isArray(parsedBody)) {
159
+ // Batch request
160
+ return parsedBody.filter(msg => msg && typeof msg === 'object' &&
161
+ msg.jsonrpc === '2.0' &&
162
+ msg.method &&
163
+ msg.id !== undefined);
164
+ }
165
+ else {
166
+ // Single request
167
+ const body = parsedBody;
168
+ if (body.jsonrpc === '2.0' && body.method && body.id !== undefined) {
169
+ return [body];
170
+ }
171
+ }
172
+ return [];
173
+ }
174
+
175
+ /**
176
+ * Node.js HTTP implementation of token checking
177
+ * Extracts data from Node.js IncomingMessage and delegates to core logic
178
+ */
179
+ async function checkToken(config, resourceURL, req) {
180
+ // Extract the authorization header from Node.js request
181
+ const authorizationHeader = req.headers.authorization || null;
182
+ // Use the shared core logic
183
+ return checkTokenCore(config, resourceURL, authorizationHeader);
184
+ }
185
+
186
+ /**
187
+ * Node.js HTTP implementation of OAuth challenge sending
188
+ * Uses Node.js ServerResponse and delegates to core logic
189
+ */
190
+ function sendOAuthChallenge(res, tokenCheck) {
191
+ // Use the shared core logic to get response data
192
+ const responseData = createOAuthChallengeResponseCore(tokenCheck);
193
+ if (!responseData) {
194
+ return false;
195
+ }
196
+ // Apply the response data to Node.js ServerResponse
197
+ Object.entries(responseData.headers).forEach(([key, value]) => {
198
+ res.setHeader(key, value);
199
+ });
200
+ res.writeHead(responseData.status);
201
+ res.end(responseData.body);
202
+ return true;
203
+ }
204
+ function sendProtectedResourceMetadata$1(res, metadata) {
205
+ if (!metadata) {
206
+ return false;
207
+ }
208
+ res.setHeader('Content-Type', 'application/json');
209
+ res.writeHead(200);
210
+ res.end(JSON.stringify(metadata));
211
+ return true;
212
+ }
213
+ function sendOAuthMetadata$1(res, metadata) {
214
+ if (!metadata) {
215
+ return false;
216
+ }
217
+ res.setHeader('Content-Type', 'application/json');
218
+ res.writeHead(200);
219
+ res.end(JSON.stringify(metadata));
220
+ return true;
221
+ }
222
+
223
+ // Helper function to parse size strings like "4mb" to bytes
224
+ function parseSize(size) {
225
+ const match = size.match(/^(\d+(?:\.\d+)?)\s*([kmgt]?b?)$/i);
226
+ if (!match) {
227
+ throw new Error(`Invalid size format: ${size}`);
228
+ }
229
+ const value = parseFloat(match[1]);
230
+ const unit = (match[2] || 'b').toLowerCase();
231
+ const multipliers = {
232
+ 'b': 1,
233
+ 'kb': 1024,
234
+ 'mb': 1024 * 1024,
235
+ 'gb': 1024 * 1024 * 1024,
236
+ 'tb': 1024 * 1024 * 1024 * 1024,
237
+ };
238
+ return Math.floor(value * (multipliers[unit] || 1));
239
+ }
240
+ async function getRawBody(req, encoding, maxSize) {
241
+ // Use native Node.js approach to read request body
242
+ const chunks = [];
243
+ let totalSize = 0;
244
+ const maxSizeBytes = parseSize(maxSize);
245
+ for await (const chunk of req) {
246
+ totalSize += chunk.length;
247
+ if (totalSize > maxSizeBytes) {
248
+ throw new Error(`Request body too large. Maximum size is ${maxSize}`);
249
+ }
250
+ chunks.push(chunk);
251
+ }
252
+ const body = Buffer.concat(chunks);
253
+ return body.toString(encoding);
254
+ }
255
+
256
+ // Useful reference for dealing with low-level http requests:
257
+ // https://github.com/modelcontextprotocol/typescript-sdk/blob/c6ac083b1b37b222b5bfba5563822daa5d03372e/src/server/streamableHttp.ts#L375
258
+ // Using the same value as MCP SDK
259
+ const MAXIMUM_MESSAGE_SIZE = "4mb";
260
+ /**
261
+ * Node.js HTTP implementation of MCP request parsing
262
+ * Handles Node.js IncomingMessage parsing and delegates to core logic
263
+ */
264
+ async function parseMcpRequests(config, requestUrl, req, parsedBody) {
265
+ parsedBody = parsedBody ?? await parseBody(req, config.logger);
266
+ // Use the shared core logic for basic validation and filtering
267
+ const basicMessages = parseMcpRequestsCore(config, requestUrl, req.method || '', parsedBody);
268
+ // Only proceed with MCP processing if the basic validation passed
269
+ if (basicMessages.length === 0) {
270
+ return [];
271
+ }
272
+ // Apply additional MCP-specific processing (parseMcpMessages handles SSE and other formats)
273
+ const messages = await parseMcpMessages(parsedBody, config.logger);
274
+ const requests = messages.filter(msg => isJSONRPCRequest(msg));
275
+ if (requests.length !== messages.length) {
276
+ config.logger.debug(`Dropped ${messages.length - requests.length} MCP messages that were not MCP requests`);
277
+ }
278
+ return requests;
279
+ }
280
+ async function parseBody(req, logger) {
281
+ try {
282
+ const ct = req.headers["content-type"];
283
+ let encoding = "utf-8";
284
+ if (ct) {
285
+ const parsedCt = contentType.parse(ct);
286
+ encoding = parsedCt.parameters.charset ?? "utf-8";
287
+ }
288
+ const body = await getRawBody(req, encoding, MAXIMUM_MESSAGE_SIZE);
289
+ return JSON.parse(body);
290
+ }
291
+ catch (error) {
292
+ logger.error(error.message);
293
+ return undefined;
294
+ }
295
+ }
296
+
297
+ /**
298
+ * Web API implementation of token checking for Cloudflare Workers, Deno, etc.
299
+ * Extracts data from Web API Request and delegates to core logic
300
+ */
301
+ async function checkTokenWebApi(config, resourceURL, request) {
302
+ // Extract authorization header from Web API request
303
+ const authorizationHeader = request.headers.get('authorization');
304
+ // Use the shared core logic
305
+ return checkTokenCore(config, resourceURL, authorizationHeader);
306
+ }
307
+
308
+ /**
309
+ * Web API implementation of OAuth challenge sending for Cloudflare Workers, Deno, etc.
310
+ * Uses Web API Response and delegates to core logic
311
+ */
312
+ function sendOAuthChallengeWebApi(tokenCheck) {
313
+ // Use the shared core logic to get response data
314
+ const responseData = createOAuthChallengeResponseCore(tokenCheck);
315
+ if (!responseData) {
316
+ return null;
317
+ }
318
+ // Convert to Web API Response
319
+ return new Response(responseData.body, {
320
+ status: responseData.status,
321
+ headers: responseData.headers
322
+ });
323
+ }
324
+ function sendProtectedResourceMetadata(metadata) {
325
+ if (!metadata) {
326
+ return null;
327
+ }
328
+ return new Response(JSON.stringify(metadata), {
329
+ status: 200,
330
+ headers: {
331
+ 'Content-Type': 'application/json'
332
+ }
333
+ });
334
+ }
335
+ function sendOAuthMetadata(metadata) {
336
+ if (!metadata) {
337
+ return null;
338
+ }
339
+ return new Response(JSON.stringify(metadata), {
340
+ status: 200,
341
+ headers: {
342
+ 'Content-Type': 'application/json'
343
+ }
344
+ });
345
+ }
346
+
347
+ /**
348
+ * Web API implementation of MCP request parsing for Cloudflare Workers, Deno, etc.
349
+ * Handles Web API Request parsing and delegates to core logic
350
+ */
351
+ async function parseMcpRequestsWebApi(config, request) {
352
+ const requestUrl = new URL(request.url);
353
+ try {
354
+ const text = await request.text();
355
+ if (!text) {
356
+ return [];
357
+ }
358
+ const parsedBody = JSON.parse(text);
359
+ // Use the shared core logic
360
+ return parseMcpRequestsCore(config, requestUrl, request.method, parsedBody);
361
+ }
362
+ catch (error) {
363
+ config.logger.debug(`Error parsing MCP request: ${error instanceof Error ? error.message : String(error)}`);
364
+ return [];
365
+ }
366
+ }
367
+
368
+ async function requirePayment(paymentConfig) {
369
+ const config = getATXPConfig();
370
+ if (!config) {
371
+ throw new Error('No config found');
372
+ }
373
+ const user = atxpAccountId();
374
+ if (!user) {
375
+ config.logger.error('No user found');
376
+ throw new Error('No user found');
377
+ }
378
+ const charge = {
379
+ amount: paymentConfig.price,
380
+ currency: config.currency,
381
+ network: config.network,
382
+ destination: config.destination,
383
+ source: user,
384
+ payeeName: config.payeeName,
385
+ };
386
+ config.logger.debug(`Charging amount ${charge.amount}, destination ${charge.destination}, source ${charge.source}`);
387
+ const chargeResponse = await config.paymentServer.charge(charge);
388
+ if (chargeResponse.success) {
389
+ config.logger.info(`Charged ${charge.amount} for source ${charge.source}`);
390
+ return;
391
+ }
392
+ const existingPaymentId = await paymentConfig.getExistingPaymentId?.();
393
+ if (existingPaymentId) {
394
+ config.logger.info(`Found existing payment ID ${existingPaymentId}`);
395
+ throw paymentRequiredError(config.server, existingPaymentId, charge.amount);
396
+ }
397
+ const paymentId = await config.paymentServer.createPaymentRequest(charge);
398
+ config.logger.info(`Created payment request ${paymentId}`);
399
+ throw paymentRequiredError(config.server, paymentId, charge.amount);
400
+ }
401
+
402
+ /**
403
+ * ATXP Payment Server implementation
404
+ *
405
+ * This class handles payment operations with the ATXP authorization server.
406
+ *
407
+ * @example
408
+ * ```typescript
409
+ * const paymentServer = new ATXPPaymentServer(
410
+ * 'https://auth.atxp.ai',
411
+ * logger
412
+ * );
413
+ * ```
414
+ */
415
+ class ATXPPaymentServer {
416
+ constructor(server, logger, fetchFn = fetch) {
417
+ this.server = server;
418
+ this.logger = logger;
419
+ this.fetchFn = fetchFn;
420
+ this.charge = async ({ source, destination, network, currency, amount }) => {
421
+ const body = { source, destination, network, currency, amount };
422
+ const chargeResponse = await this.makeRequest('POST', '/charge', body);
423
+ const json = await chargeResponse.json();
424
+ if (chargeResponse.status === 200) {
425
+ return { success: true, requiredPayment: null };
426
+ }
427
+ else if (chargeResponse.status === 402) {
428
+ return { success: false, requiredPayment: json };
429
+ }
430
+ else {
431
+ const msg = `Unexpected status code ${chargeResponse.status} from payment server POST /charge endpoint`;
432
+ this.logger.warn(msg);
433
+ this.logger.debug(`Response body: ${JSON.stringify(json)}`);
434
+ throw new Error(msg);
435
+ }
436
+ };
437
+ this.createPaymentRequest = async (charge) => {
438
+ const response = await this.makeRequest('POST', '/payment-request', charge);
439
+ const json = await response.json();
440
+ if (response.status !== 200) {
441
+ this.logger.warn(`POST /payment-request responded with unexpected HTTP status ${response.status}`);
442
+ this.logger.debug(`Response body: ${JSON.stringify(json)}`);
443
+ throw new Error(`POST /payment-request responded with unexpected HTTP status ${response.status}`);
444
+ }
445
+ if (!json.id) {
446
+ throw new Error(`POST /payment-request response did not contain an id`);
447
+ }
448
+ return json.id;
449
+ };
450
+ /**
451
+ * Makes authenticated requests to the ATXP authorization server
452
+ *
453
+ * @param method - HTTP method ('GET' or 'POST')
454
+ * @param path - API endpoint path
455
+ * @param body - Request body (for POST requests)
456
+ * @returns Promise<Response> - The HTTP response from the server
457
+ *
458
+ * @example
459
+ * ```typescript
460
+ * const response = await paymentServer.makeRequest('POST', '/charge', {
461
+ * source: 'user123',
462
+ * destination: 'merchant456',
463
+ * amount: new BigNumber('0.01')
464
+ * });
465
+ * ```
466
+ */
467
+ this.makeRequest = async (method, path, body) => {
468
+ const url = new URL(path, this.server);
469
+ const response = await this.fetchFn(url, {
470
+ method,
471
+ headers: {
472
+ 'Content-Type': 'application/json'
473
+ },
474
+ body: JSON.stringify(body)
475
+ });
476
+ return response;
477
+ };
478
+ }
479
+ }
480
+
481
+ const DEFAULT_CONFIG = {
482
+ mountPath: '/',
483
+ currency: 'USDC',
484
+ network: 'base',
485
+ server: DEFAULT_AUTHORIZATION_SERVER,
486
+ payeeName: 'An ATXP Server',
487
+ allowHttp: false, // May be overridden in buildServerConfig by process.env.NODE_ENV
488
+ resource: null, // Set dynamically from the request URL
489
+ };
490
+ function buildServerConfig(args) {
491
+ if (!args.destination) {
492
+ throw new Error('destination is required');
493
+ }
494
+ // Read environment variables at runtime, not module load time
495
+ const envDefaults = {
496
+ ...DEFAULT_CONFIG,
497
+ atxpAuthClientToken: process.env.ATXP_AUTH_CLIENT_TOKEN,
498
+ allowHttp: process.env.NODE_ENV === 'development',
499
+ };
500
+ const withDefaults = { ...envDefaults, ...args };
501
+ const oAuthDb = withDefaults.oAuthDb ?? new MemoryOAuthDb();
502
+ const oAuthClient = withDefaults.oAuthClient ?? new OAuthResourceClient({
503
+ db: oAuthDb,
504
+ allowInsecureRequests: withDefaults.allowHttp,
505
+ clientName: withDefaults.payeeName,
506
+ });
507
+ const logger = withDefaults.logger ?? new ConsoleLogger();
508
+ const paymentServer = withDefaults.paymentServer ?? new ATXPPaymentServer(withDefaults.server, logger);
509
+ const built = { oAuthDb, oAuthClient, paymentServer, logger };
510
+ return Object.freeze({ ...withDefaults, ...built });
511
+ }
512
+
513
+ function getPath(url) {
514
+ const fullPath = url.pathname.replace(/^\/$/, '');
515
+ return fullPath;
516
+ }
517
+ function getProtocolFromHeaders(headers, requestProtocol) {
518
+ // Check for X-Forwarded-Proto header (common proxy header)
519
+ const forwardedProto = headers['x-forwarded-proto'] || headers['X-Forwarded-Proto'];
520
+ if (forwardedProto) {
521
+ const proto = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto;
522
+ return proto === 'https' ? 'https:' : 'http:';
523
+ }
524
+ // Check for X-Forwarded-Protocol header (alternative)
525
+ const forwardedProtocol = headers['x-forwarded-protocol'] || headers['X-Forwarded-Protocol'];
526
+ if (forwardedProtocol) {
527
+ const proto = Array.isArray(forwardedProtocol) ? forwardedProtocol[0] : forwardedProtocol;
528
+ return proto === 'https' ? 'https:' : 'http:';
529
+ }
530
+ // Fall back to request protocol
531
+ return requestProtocol;
532
+ }
533
+ function getResource(config, requestUrl, headers) {
534
+ if (config.resource) {
535
+ return new URL(config.resource);
536
+ }
537
+ const originalProtocol = headers ? getProtocolFromHeaders(headers, requestUrl.protocol) : requestUrl.protocol;
538
+ const protocol = config.allowHttp ? originalProtocol : 'https:';
539
+ const url = new URL(`${protocol}//${requestUrl.host}${requestUrl.pathname}`);
540
+ const fullPath = getPath(url);
541
+ // If this is a PRM path, convert it into the path for the resource this is the metadata for
542
+ const resourcePath = fullPath.replace('/.well-known/oauth-protected-resource', '').replace(/\/$/, '');
543
+ const resource = new URL(`${protocol}//${requestUrl.host}${resourcePath}`);
544
+ return resource;
545
+ }
546
+
547
+ async function getOAuthMetadata(config, requestUrl) {
548
+ if (isOAuthMetadataRequest(config, requestUrl)) {
549
+ try {
550
+ const authServer = await config.oAuthClient.authorizationServerFromUrl(new URL(config.server));
551
+ return {
552
+ issuer: config.server,
553
+ authorization_endpoint: authServer.authorization_endpoint,
554
+ response_types_supported: authServer.response_types_supported,
555
+ grant_types_supported: authServer.grant_types_supported,
556
+ token_endpoint: authServer.token_endpoint,
557
+ token_endpoint_auth_methods_supported: authServer.token_endpoint_auth_methods_supported,
558
+ registration_endpoint: authServer.registration_endpoint,
559
+ revocation_endpoint: authServer.revocation_endpoint,
560
+ introspection_endpoint: authServer.introspection_endpoint,
561
+ introspection_endpoint_auth_methods_supported: authServer.introspection_endpoint_auth_methods_supported,
562
+ code_challenge_methods_supported: authServer.code_challenge_methods_supported,
563
+ scopes_supported: authServer.scopes_supported
564
+ };
565
+ }
566
+ catch (error) {
567
+ config.logger.error(`Error fetching authorization server configuration from ${config.server}: ${error}`);
568
+ throw error;
569
+ }
570
+ }
571
+ return null;
572
+ }
573
+ function isOAuthMetadataRequest(config, requestUrl) {
574
+ const path = getPath(requestUrl).replace(/\/$/, '');
575
+ return path === '/.well-known/oauth-authorization-server';
576
+ }
577
+
578
+ function getProtectedResourceMetadata(config, requestUrl, headers) {
579
+ if (isProtectedResourceMetadataRequest(config, requestUrl, headers)) {
580
+ const resource = getResource(config, requestUrl, headers);
581
+ return {
582
+ resource,
583
+ resource_name: config.payeeName || resource.toString(),
584
+ authorization_servers: [config.server],
585
+ bearer_methods_supported: ['header'],
586
+ scopes_supported: ['read', 'write'],
587
+ };
588
+ }
589
+ return null;
590
+ }
591
+ function isProtectedResourceMetadataRequest(config, requestUrl, headers) {
592
+ const path = getPath(requestUrl);
593
+ if (!path.startsWith('/.well-known/oauth-protected-resource')) {
594
+ return false;
595
+ }
596
+ const resource = getResource(config, requestUrl, headers);
597
+ const resourcePath = getPath(resource);
598
+ const mountPath = config.mountPath.replace(/\/$/, '');
599
+ if (resourcePath === mountPath) {
600
+ return true;
601
+ }
602
+ if (resourcePath === `${mountPath}/message`) {
603
+ return true;
604
+ }
605
+ return false;
606
+ }
607
+
608
+ export { ATXPPaymentServer, DEFAULT_CONFIG, TokenProblem, atxpAccountId, buildServerConfig, checkTokenCore, checkToken as checkTokenNode, checkTokenWebApi, createOAuthChallengeResponseCore, getATXPConfig, getATXPResource, getOAuthMetadata, getProtectedResourceMetadata, getResource, parseBody as parseBodyNode, parseMcpRequestsCore, parseMcpRequests as parseMcpRequestsNode, parseMcpRequestsWebApi, requirePayment, sendOAuthChallenge, sendOAuthChallengeWebApi, sendOAuthMetadata$1 as sendOAuthMetadataNode, sendOAuthMetadata as sendOAuthMetadataWebApi, sendProtectedResourceMetadata$1 as sendProtectedResourceMetadataNode, sendProtectedResourceMetadata as sendProtectedResourceMetadataWebApi, withATXPContext };
609
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sources":["../src/types.ts","../src/atxpContext.ts","../src/core/token.ts","../src/core/oauth.ts","../src/core/mcp.ts","../src/node/token.ts","../src/node/oauth.ts","../src/node/getRawBody.ts","../src/node/http.ts","../src/webapi/token.ts","../src/webapi/oauth.ts","../src/webapi/mcp.ts","../src/requirePayment.ts","../src/paymentServer.ts","../src/serverConfig.ts","../src/getResource.ts","../src/oAuthMetadata.ts","../src/protectedResourceMetadata.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["sendProtectedResourceMetadata","sendOAuthMetadata"],"mappings":"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"}