@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
@@ -0,0 +1,35 @@
1
+ // Helper function to parse size strings like "4mb" to bytes
2
+ function parseSize(size) {
3
+ const match = size.match(/^(\d+(?:\.\d+)?)\s*([kmgt]?b?)$/i);
4
+ if (!match) {
5
+ throw new Error(`Invalid size format: ${size}`);
6
+ }
7
+ const value = parseFloat(match[1]);
8
+ const unit = (match[2] || 'b').toLowerCase();
9
+ const multipliers = {
10
+ 'b': 1,
11
+ 'kb': 1024,
12
+ 'mb': 1024 * 1024,
13
+ 'gb': 1024 * 1024 * 1024,
14
+ 'tb': 1024 * 1024 * 1024 * 1024,
15
+ };
16
+ return Math.floor(value * (multipliers[unit] || 1));
17
+ }
18
+ async function getRawBody(req, encoding, maxSize) {
19
+ // Use native Node.js approach to read request body
20
+ const chunks = [];
21
+ let totalSize = 0;
22
+ const maxSizeBytes = parseSize(maxSize);
23
+ for await (const chunk of req) {
24
+ totalSize += chunk.length;
25
+ if (totalSize > maxSizeBytes) {
26
+ throw new Error(`Request body too large. Maximum size is ${maxSize}`);
27
+ }
28
+ chunks.push(chunk);
29
+ }
30
+ const body = Buffer.concat(chunks);
31
+ return body.toString(encoding);
32
+ }
33
+
34
+ export { getRawBody };
35
+ //# sourceMappingURL=getRawBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getRawBody.js","sources":["../../src/node/getRawBody.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA;AACA,SAAS,SAAS,CAAC,IAAY,EAAA;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAA,CAAE,CAAC;IACjD;IAEA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,IAAA,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,WAAW,EAAE;AAE5C,IAAA,MAAM,WAAW,GAA2B;AAC1C,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI,GAAG,IAAI;AACjB,QAAA,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;AACxB,QAAA,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;KAChC;AAED,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD;AAEO,eAAe,UAAU,CAAC,GAAoB,EAAE,QAAgB,EAAE,OAAe,EAAA;;IAEtF,MAAM,MAAM,GAAa,EAAE;IAC3B,IAAI,SAAS,GAAG,CAAC;AACjB,IAAA,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;AAEvC,IAAA,WAAW,MAAM,KAAK,IAAI,GAAG,EAAE;AAC7B,QAAA,SAAS,IAAI,KAAK,CAAC,MAAM;AACzB,QAAA,IAAI,SAAS,GAAG,YAAY,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,CAAA,CAAE,CAAC;QACvE;AACA,QAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IACpB;IAEA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AAClC,IAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,QAA0B,CAAC;AAClD;;;;"}
@@ -0,0 +1,49 @@
1
+ import * as contentType from 'content-type';
2
+ import { isJSONRPCRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ import { parseMcpMessages } from '@atxp/common';
4
+ import { parseMcpRequestsCore } from '../core/mcp.js';
5
+ import { getRawBody } from './getRawBody.js';
6
+
7
+ // Useful reference for dealing with low-level http requests:
8
+ // https://github.com/modelcontextprotocol/typescript-sdk/blob/c6ac083b1b37b222b5bfba5563822daa5d03372e/src/server/streamableHttp.ts#L375
9
+ // Using the same value as MCP SDK
10
+ const MAXIMUM_MESSAGE_SIZE = "4mb";
11
+ /**
12
+ * Node.js HTTP implementation of MCP request parsing
13
+ * Handles Node.js IncomingMessage parsing and delegates to core logic
14
+ */
15
+ async function parseMcpRequests(config, requestUrl, req, parsedBody) {
16
+ parsedBody = parsedBody ?? await parseBody(req, config.logger);
17
+ // Use the shared core logic for basic validation and filtering
18
+ const basicMessages = parseMcpRequestsCore(config, requestUrl, req.method || '', parsedBody);
19
+ // Only proceed with MCP processing if the basic validation passed
20
+ if (basicMessages.length === 0) {
21
+ return [];
22
+ }
23
+ // Apply additional MCP-specific processing (parseMcpMessages handles SSE and other formats)
24
+ const messages = await parseMcpMessages(parsedBody, config.logger);
25
+ const requests = messages.filter(msg => isJSONRPCRequest(msg));
26
+ if (requests.length !== messages.length) {
27
+ config.logger.debug(`Dropped ${messages.length - requests.length} MCP messages that were not MCP requests`);
28
+ }
29
+ return requests;
30
+ }
31
+ async function parseBody(req, logger) {
32
+ try {
33
+ const ct = req.headers["content-type"];
34
+ let encoding = "utf-8";
35
+ if (ct) {
36
+ const parsedCt = contentType.parse(ct);
37
+ encoding = parsedCt.parameters.charset ?? "utf-8";
38
+ }
39
+ const body = await getRawBody(req, encoding, MAXIMUM_MESSAGE_SIZE);
40
+ return JSON.parse(body);
41
+ }
42
+ catch (error) {
43
+ logger.error(error.message);
44
+ return undefined;
45
+ }
46
+ }
47
+
48
+ export { parseBody, parseMcpRequests };
49
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sources":["../../src/node/http.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAOA;AACA;AAEA;AACA,MAAM,oBAAoB,GAAG,KAAK;AAElC;;;AAGG;AACI,eAAe,gBAAgB,CAAC,MAAkB,EAAE,UAAe,EAAE,GAAoB,EAAE,UAAoB,EAAA;AACpH,IAAA,UAAU,GAAG,UAAU,IAAI,MAAM,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;;AAG9D,IAAA,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,UAAU,CAAC;;AAG5F,IAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,QAAA,OAAO,EAAE;IACX;;IAGA,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;AAElE,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE;AACvC,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,QAAA,EAAW,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,wCAAA,CAA0C,CAAC;IAC7G;AAEA,IAAA,OAAO,QAAQ;AACjB;AAEO,eAAe,SAAS,CAAC,GAAoB,EAAE,MAAc,EAAA;AAClE,IAAA,IAAI;QACF,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC;QAEtC,IAAI,QAAQ,GAAG,OAAO;QACtB,IAAI,EAAE,EAAE;YACN,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,IAAI,OAAO;QACnD;QACA,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,oBAAoB,CAAC;AAClE,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,MAAM,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC;AACtC,QAAA,OAAO,SAAS;IAClB;AACF;;;;"}
@@ -0,0 +1,41 @@
1
+ import { createOAuthChallengeResponseCore } from '../core/oauth.js';
2
+
3
+ /**
4
+ * Node.js HTTP implementation of OAuth challenge sending
5
+ * Uses Node.js ServerResponse and delegates to core logic
6
+ */
7
+ function sendOAuthChallenge(res, tokenCheck) {
8
+ // Use the shared core logic to get response data
9
+ const responseData = createOAuthChallengeResponseCore(tokenCheck);
10
+ if (!responseData) {
11
+ return false;
12
+ }
13
+ // Apply the response data to Node.js ServerResponse
14
+ Object.entries(responseData.headers).forEach(([key, value]) => {
15
+ res.setHeader(key, value);
16
+ });
17
+ res.writeHead(responseData.status);
18
+ res.end(responseData.body);
19
+ return true;
20
+ }
21
+ function sendProtectedResourceMetadata(res, metadata) {
22
+ if (!metadata) {
23
+ return false;
24
+ }
25
+ res.setHeader('Content-Type', 'application/json');
26
+ res.writeHead(200);
27
+ res.end(JSON.stringify(metadata));
28
+ return true;
29
+ }
30
+ function sendOAuthMetadata(res, metadata) {
31
+ if (!metadata) {
32
+ return false;
33
+ }
34
+ res.setHeader('Content-Type', 'application/json');
35
+ res.writeHead(200);
36
+ res.end(JSON.stringify(metadata));
37
+ return true;
38
+ }
39
+
40
+ export { sendOAuthChallenge, sendOAuthMetadata, sendProtectedResourceMetadata };
41
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sources":["../../src/node/oauth.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA;;;AAGG;AACG,SAAU,kBAAkB,CAAC,GAAmB,EAAE,UAAsB,EAAA;;AAE5E,IAAA,MAAM,YAAY,GAAG,gCAAgC,CAAC,UAAU,CAAC;IAEjE,IAAI,CAAC,YAAY,EAAE;AACjB,QAAA,OAAO,KAAK;IACd;;AAGA,IAAA,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC5D,QAAA,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC;AAC3B,IAAA,CAAC,CAAC;AACF,IAAA,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC;AAClC,IAAA,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC;AAE1B,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,6BAA6B,CAAC,GAAmB,EAAE,QAA0C,EAAA;IAC3G,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,KAAK;IACd;AACA,IAAA,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACjD,IAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;IAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,iBAAiB,CAAC,GAAmB,EAAE,QAA0C,EAAA;IAC/F,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,KAAK;IACd;AACA,IAAA,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACjD,IAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;IAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,IAAA,OAAO,IAAI;AACb;;;;"}
@@ -0,0 +1,15 @@
1
+ import { checkTokenCore } from '../core/token.js';
2
+
3
+ /**
4
+ * Node.js HTTP implementation of token checking
5
+ * Extracts data from Node.js IncomingMessage and delegates to core logic
6
+ */
7
+ async function checkToken(config, resourceURL, req) {
8
+ // Extract the authorization header from Node.js request
9
+ const authorizationHeader = req.headers.authorization || null;
10
+ // Use the shared core logic
11
+ return checkTokenCore(config, resourceURL, authorizationHeader);
12
+ }
13
+
14
+ export { checkToken };
15
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sources":["../../src/node/token.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA;;;AAGG;AACI,eAAe,UAAU,CAAC,MAAkB,EAAE,WAAgB,EAAE,GAAoB,EAAA;;IAEzF,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI;;IAG7D,OAAO,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,mBAAmB,CAAC;AACjE;;;;"}
@@ -1,14 +1,6 @@
1
- import { getPath } from "./getResource.js";
2
- export function sendOAuthMetadata(res, metadata) {
3
- if (!metadata) {
4
- return false;
5
- }
6
- res.setHeader('Content-Type', 'application/json');
7
- res.writeHead(200);
8
- res.end(JSON.stringify(metadata));
9
- return true;
10
- }
11
- export async function getOAuthMetadata(config, requestUrl) {
1
+ import { getPath } from './getResource.js';
2
+
3
+ async function getOAuthMetadata(config, requestUrl) {
12
4
  if (isOAuthMetadataRequest(config, requestUrl)) {
13
5
  try {
14
6
  const authServer = await config.oAuthClient.authorizationServerFromUrl(new URL(config.server));
@@ -38,4 +30,6 @@ function isOAuthMetadataRequest(config, requestUrl) {
38
30
  const path = getPath(requestUrl).replace(/\/$/, '');
39
31
  return path === '/.well-known/oauth-authorization-server';
40
32
  }
41
- //# sourceMappingURL=oAuthMetadata.js.map
33
+
34
+ export { getOAuthMetadata };
35
+ //# sourceMappingURL=oAuthMetadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oAuthMetadata.js","sourceRoot":"","sources":["../src/oAuthMetadata.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,UAAU,iBAAiB,CAAC,GAAmB,EAAE,QAA0C;IAC/F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAkB,EAAE,UAAe;IACxE,IAAI,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAE/F,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;gBACzD,wBAAwB,EAAE,UAAU,CAAC,wBAAwB;gBAC7D,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;gBACvD,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,qCAAqC,EAAE,UAAU,CAAC,qCAAqC;gBACvF,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;gBACvD,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;gBACnD,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;gBACzD,6CAA6C,EAAE,UAAU,CAAC,6CAA6C;gBACvG,gCAAgC,EAAE,UAAU,CAAC,gCAAgC;gBAC7E,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;aAC9C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;YACzG,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAkB,EAAE,UAAe;IACjE,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,IAAI,KAAK,yCAAyC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"oAuthMetadata.js","sources":["../src/oAuthMetadata.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIO,eAAe,gBAAgB,CAAC,MAAkB,EAAE,UAAe,EAAA;AACxE,IAAA,IAAI,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE;AAC9C,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE9F,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;gBACzD,wBAAwB,EAAE,UAAU,CAAC,wBAAwB;gBAC7D,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;gBACvD,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,qCAAqC,EAAE,UAAU,CAAC,qCAAqC;gBACvF,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;gBACvD,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;gBACnD,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;gBACzD,6CAA6C,EAAE,UAAU,CAAC,6CAA6C;gBACvG,gCAAgC,EAAE,UAAU,CAAC,gCAAgC;gBAC7E,gBAAgB,EAAE,UAAU,CAAC;aAC9B;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,uDAAA,EAA0D,MAAM,CAAC,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAC;AACxG,YAAA,MAAM,KAAK;QACb;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,sBAAsB,CAAC,MAAkB,EAAE,UAAe,EAAA;AACjE,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACnD,OAAO,IAAI,KAAK,yCAAyC;AAC3D;;;;"}
@@ -3,25 +3,17 @@
3
3
  *
4
4
  * This class handles payment operations with the ATXP authorization server.
5
5
  *
6
- * **Required Environment Variable:**
7
- * - `ATXP_AUTH_CLIENT_TOKEN`: Authentication token for the ATXP authorization server.
8
- * This token is used to authenticate API calls to the ATXP server for payment operations.
9
- * Must be set when using this class, otherwise an error will be thrown.
10
- *
11
6
  * @example
12
7
  * ```typescript
13
- * // Ensure ATXP_AUTH_CLIENT_TOKEN is set in your environment
14
8
  * const paymentServer = new ATXPPaymentServer(
15
9
  * 'https://auth.atxp.ai',
16
- * oAuthDb,
17
10
  * logger
18
11
  * );
19
12
  * ```
20
13
  */
21
- export class ATXPPaymentServer {
22
- constructor(server, authCredentials, logger, fetchFn = fetch) {
14
+ class ATXPPaymentServer {
15
+ constructor(server, logger, fetchFn = fetch) {
23
16
  this.server = server;
24
- this.authCredentials = authCredentials;
25
17
  this.logger = logger;
26
18
  this.fetchFn = fetchFn;
27
19
  this.charge = async ({ source, destination, network, currency, amount }) => {
@@ -57,18 +49,13 @@ export class ATXPPaymentServer {
57
49
  /**
58
50
  * Makes authenticated requests to the ATXP authorization server
59
51
  *
60
- * This method automatically includes the `ATXP_AUTH_CLIENT_TOKEN` from environment variables
61
- * in the Authorization header for all requests.
62
- *
63
52
  * @param method - HTTP method ('GET' or 'POST')
64
53
  * @param path - API endpoint path
65
54
  * @param body - Request body (for POST requests)
66
55
  * @returns Promise<Response> - The HTTP response from the server
67
- * @throws {Error} When `ATXP_AUTH_CLIENT_TOKEN` environment variable is not set
68
56
  *
69
57
  * @example
70
58
  * ```typescript
71
- * // Ensure ATXP_AUTH_CLIENT_TOKEN is set in your environment
72
59
  * const response = await paymentServer.makeRequest('POST', '/charge', {
73
60
  * source: 'user123',
74
61
  * destination: 'merchant456',
@@ -81,16 +68,14 @@ export class ATXPPaymentServer {
81
68
  const response = await this.fetchFn(url, {
82
69
  method,
83
70
  headers: {
84
- 'Authorization': `Bearer ${this.authCredentials}`,
85
71
  'Content-Type': 'application/json'
86
72
  },
87
73
  body: JSON.stringify(body)
88
74
  });
89
75
  return response;
90
76
  };
91
- if (!authCredentials || authCredentials.trim() === '') {
92
- throw new Error('Auth credentials are required');
93
- }
94
77
  }
95
78
  }
96
- //# sourceMappingURL=paymentServer.js.map
79
+
80
+ export { ATXPPaymentServer };
81
+ //# sourceMappingURL=paymentServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paymentServer.js","sourceRoot":"","sources":["../src/paymentServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paymentServer.js","sources":["../src/paymentServer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,16 +1,8 @@
1
- import { getPath, getResource } from "./getResource.js";
2
- export function sendProtectedResourceMetadata(res, metadata) {
3
- if (!metadata) {
4
- return false;
5
- }
6
- res.setHeader('Content-Type', 'application/json');
7
- res.writeHead(200);
8
- res.end(JSON.stringify(metadata));
9
- return true;
10
- }
11
- export function getProtectedResourceMetadata(config, requestUrl) {
12
- if (isProtectedResourceMetadataRequest(config, requestUrl)) {
13
- const resource = getResource(config, requestUrl);
1
+ import { getResource, getPath } from './getResource.js';
2
+
3
+ function getProtectedResourceMetadata(config, requestUrl, headers) {
4
+ if (isProtectedResourceMetadataRequest(config, requestUrl, headers)) {
5
+ const resource = getResource(config, requestUrl, headers);
14
6
  return {
15
7
  resource,
16
8
  resource_name: config.payeeName || resource.toString(),
@@ -21,12 +13,12 @@ export function getProtectedResourceMetadata(config, requestUrl) {
21
13
  }
22
14
  return null;
23
15
  }
24
- function isProtectedResourceMetadataRequest(config, requestUrl) {
16
+ function isProtectedResourceMetadataRequest(config, requestUrl, headers) {
25
17
  const path = getPath(requestUrl);
26
18
  if (!path.startsWith('/.well-known/oauth-protected-resource')) {
27
19
  return false;
28
20
  }
29
- const resource = getResource(config, requestUrl);
21
+ const resource = getResource(config, requestUrl, headers);
30
22
  const resourcePath = getPath(resource);
31
23
  const mountPath = config.mountPath.replace(/\/$/, '');
32
24
  if (resourcePath === mountPath) {
@@ -37,4 +29,6 @@ function isProtectedResourceMetadataRequest(config, requestUrl) {
37
29
  }
38
30
  return false;
39
31
  }
40
- //# sourceMappingURL=protectedResourceMetadata.js.map
32
+
33
+ export { getProtectedResourceMetadata };
34
+ //# sourceMappingURL=protectedResourceMetadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protectedResourceMetadata.js","sourceRoot":"","sources":["../src/protectedResourceMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,UAAU,6BAA6B,CAAC,GAAmB,EAAE,QAA0C;IAC3G,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAkB,EAAE,UAAe;IAC9E,IAAI,kCAAkC,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjD,OAAO;YACL,QAAQ;YACR,aAAa,EAAE,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACtD,qBAAqB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YACtC,wBAAwB,EAAE,CAAC,QAAQ,CAAC;YACpC,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SACpC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kCAAkC,CAAC,MAAkB,EAAE,UAAe;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,uCAAuC,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,YAAY,KAAK,GAAG,SAAS,UAAU,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"protectedResourceMetadata.js","sources":["../src/protectedResourceMetadata.ts"],"sourcesContent":[null],"names":[],"mappings":";;SAGgB,4BAA4B,CAAC,MAAkB,EAAE,UAAe,EAAE,OAAuD,EAAA;IACvI,IAAI,kCAAkC,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;QACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;QACzD,OAAO;YACL,QAAQ;YACR,aAAa,EAAE,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,EAAE;AACtD,YAAA,qBAAqB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YACtC,wBAAwB,EAAE,CAAC,QAAQ,CAAC;AACpC,YAAA,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SACpC;IACH;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,kCAAkC,CAAC,MAAkB,EAAE,UAAe,EAAE,OAAuD,EAAA;AACtI,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,uCAAuC,CAAC,EAAE;AAC7D,QAAA,OAAO,KAAK;IACd;IACA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;AACzD,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;AACtC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACrD,IAAA,IAAI,YAAY,KAAK,SAAS,EAAE;AAC9B,QAAA,OAAO,IAAI;IACb;AACA,IAAA,IAAI,YAAY,KAAK,CAAA,EAAG,SAAS,CAAA,QAAA,CAAU,EAAE;AAC3C,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,KAAK;AACd;;;;"}
@@ -1,6 +1,7 @@
1
- import { paymentRequiredError } from "@atxp/common";
2
- import { getATXPConfig, atxpAccountId } from "./atxpContext.js";
3
- export async function requirePayment(paymentConfig) {
1
+ import { paymentRequiredError } from '@atxp/common';
2
+ import { getATXPConfig, atxpAccountId } from './atxpContext.js';
3
+
4
+ async function requirePayment(paymentConfig) {
4
5
  const config = getATXPConfig();
5
6
  if (!config) {
6
7
  throw new Error('No config found');
@@ -33,4 +34,6 @@ export async function requirePayment(paymentConfig) {
33
34
  config.logger.info(`Created payment request ${paymentId}`);
34
35
  throw paymentRequiredError(config.server, paymentId, charge.amount);
35
36
  }
36
- //# sourceMappingURL=requirePayment.js.map
37
+
38
+ export { requirePayment };
39
+ //# sourceMappingURL=requirePayment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"requirePayment.js","sourceRoot":"","sources":["../src/requirePayment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,aAAmC;IACtE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,aAAa,CAAC,KAAK;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IAEF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,WAAW,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACpH,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjE,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAM,aAAa,CAAC,oBAAoB,EAAE,EAAE,CAAC;IACvE,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,iBAAiB,EAAE,CAAC,CAAC;QACrE,MAAM,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAC7E,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;IAC3D,MAAM,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"requirePayment.js","sources":["../src/requirePayment.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGO,eAAe,cAAc,CAAC,aAAmC,EAAA;AACtE,IAAA,MAAM,MAAM,GAAG,aAAa,EAAE;IAC9B,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;IACpC;AACA,IAAA,MAAM,IAAI,GAAG,aAAa,EAAE;IAC5B,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;AACpC,QAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;IAClC;AAEA,IAAA,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,aAAa,CAAC,KAAK;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;AAC/B,QAAA,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B;AAED,IAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,gBAAA,EAAmB,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,WAAW,CAAA,SAAA,EAAY,MAAM,CAAC,MAAM,CAAA,CAAE,CAAC;IACnH,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;AAChE,IAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AAC1B,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,MAAM,CAAC,MAAM,eAAe,MAAM,CAAC,MAAM,CAAA,CAAE,CAAC;QAC1E;IACF;IAEA,MAAM,iBAAiB,GAAG,MAAM,aAAa,CAAC,oBAAoB,IAAI;IACtE,IAAI,iBAAiB,EAAE;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,0BAAA,EAA6B,iBAAiB,CAAA,CAAE,CAAC;AACpE,QAAA,MAAM,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC;IAC7E;IAEA,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,MAAM,CAAC;IACzE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAE,CAAC;AAC1D,IAAA,MAAM,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;AACrE;;;;"}
@@ -0,0 +1,37 @@
1
+ import { DEFAULT_AUTHORIZATION_SERVER, MemoryOAuthDb, OAuthResourceClient, ConsoleLogger } from '@atxp/common';
2
+ import { ATXPPaymentServer } from './paymentServer.js';
3
+
4
+ const DEFAULT_CONFIG = {
5
+ mountPath: '/',
6
+ currency: 'USDC',
7
+ network: 'base',
8
+ server: DEFAULT_AUTHORIZATION_SERVER,
9
+ payeeName: 'An ATXP Server',
10
+ allowHttp: false, // May be overridden in buildServerConfig by process.env.NODE_ENV
11
+ resource: null, // Set dynamically from the request URL
12
+ };
13
+ function buildServerConfig(args) {
14
+ if (!args.destination) {
15
+ throw new Error('destination is required');
16
+ }
17
+ // Read environment variables at runtime, not module load time
18
+ const envDefaults = {
19
+ ...DEFAULT_CONFIG,
20
+ atxpAuthClientToken: process.env.ATXP_AUTH_CLIENT_TOKEN,
21
+ allowHttp: process.env.NODE_ENV === 'development',
22
+ };
23
+ const withDefaults = { ...envDefaults, ...args };
24
+ const oAuthDb = withDefaults.oAuthDb ?? new MemoryOAuthDb();
25
+ const oAuthClient = withDefaults.oAuthClient ?? new OAuthResourceClient({
26
+ db: oAuthDb,
27
+ allowInsecureRequests: withDefaults.allowHttp,
28
+ clientName: withDefaults.payeeName,
29
+ });
30
+ const logger = withDefaults.logger ?? new ConsoleLogger();
31
+ const paymentServer = withDefaults.paymentServer ?? new ATXPPaymentServer(withDefaults.server, logger);
32
+ const built = { oAuthDb, oAuthClient, paymentServer, logger };
33
+ return Object.freeze({ ...withDefaults, ...built });
34
+ }
35
+
36
+ export { DEFAULT_CONFIG, buildServerConfig };
37
+ //# sourceMappingURL=serverConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverConfig.js","sources":["../src/serverConfig.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAUO,MAAM,cAAc,GAAkE;AAC3F,IAAA,SAAS,EAAE,GAAG;AACd,IAAA,QAAQ,EAAE,MAAe;AACzB,IAAA,OAAO,EAAE,MAAe;AACxB,IAAA,MAAM,EAAE,4BAA4B;AACpC,IAAA,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,IAAI;;AAGV,SAAU,iBAAiB,CAAC,IAAc,EAAA;AAC9C,IAAA,IAAG,CAAC,IAAI,CAAC,WAAW,EAAE;AACpB,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;IAC5C;;AAGA,IAAA,MAAM,WAAW,GAAG;AAClB,QAAA,GAAG,cAAc;AACjB,QAAA,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;AACvD,QAAA,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;KAClD;IACD,MAAM,YAAY,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,EAAE;IAChD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI,IAAI,aAAa,EAAE;IAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,IAAI,IAAI,mBAAmB,CAAC;AACtE,QAAA,EAAE,EAAE,OAAO;QACX,qBAAqB,EAAE,YAAY,CAAC,SAAS;QAC7C,UAAU,EAAE,YAAY,CAAC,SAAS;AACnC,KAAA,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,IAAI,aAAa,EAAE;AACzD,IAAA,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,IAAI,IAAI,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;IAEtG,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAC;AAC5D,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE,CAAC;AACrD;;;;"}
@@ -1,55 +1,104 @@
1
+ import * as vitest from 'vitest';
1
2
  import { IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'http';
2
3
  import { JSONRPCRequest } from '@modelcontextprotocol/sdk/types.js';
3
- import { OAuthResourceClient, TokenData, Logger, Currency, Network } from '@atxp/common';
4
- import { Charge, ATXPConfig, TokenCheck, TokenProblem, McpMethod, McpName, PaymentServer } from './types.js';
4
+ import { PaymentRequestData, Currency, Network, AuthorizationServerUrl, UrlString, Logger, OAuthDb, OAuthResourceClient, TokenData } from '@atxp/common';
5
5
  import * as oauth from 'oauth4webapi';
6
- export declare const DESTINATION = "testDestination";
7
- export declare const SOURCE = "testSource";
8
- export declare function charge({ amount, currency, network, destination, source }?: {
6
+
7
+ type McpMethod = 'notifications/cancelled' | 'initialize' | 'ping' | 'notifications/progress' | 'resources/list' | 'resources/templates/list' | 'resources/read' | 'notifications/resources/list_changed' | 'resources/subscribe' | 'resources/unsubscribe' | 'notifications/resources/updated' | 'prompts/list' | 'prompts/get' | 'notifications/prompts/list_changed' | 'tools/list' | 'tools/call' | 'notifications/tools/list_changed' | 'logging/setLevel' | 'notifications/message' | 'sampling/createMessage' | 'elicitation/create' | 'completion/complete' | 'roots/list' | 'notifications/roots/list_changed';
8
+ type McpName = string;
9
+ type Charge = Omit<PaymentRequestData, 'resource' | 'resourceName' | 'iss'>;
10
+ type ChargeResponse = {
11
+ success: boolean;
12
+ requiredPayment: PaymentRequestData | null;
13
+ };
14
+ type PaymentServer = {
15
+ charge: (args: Charge) => Promise<ChargeResponse>;
16
+ createPaymentRequest: (args: Charge) => Promise<string>;
17
+ };
18
+ type ATXPConfig = {
19
+ destination: string;
20
+ mountPath: string;
21
+ currency: Currency;
22
+ network: Network;
23
+ server: AuthorizationServerUrl;
24
+ payeeName: string;
25
+ resource: UrlString | null;
26
+ allowHttp: boolean;
27
+ logger: Logger;
28
+ oAuthDb: OAuthDb;
29
+ oAuthClient: OAuthResourceClient;
30
+ paymentServer: PaymentServer;
31
+ };
32
+ declare enum TokenProblem {
33
+ NO_TOKEN = "NO-TOKEN",
34
+ NON_BEARER_AUTH_HEADER = "NON-BEARER-AUTH-HEADER",
35
+ INVALID_TOKEN = "INVALID-TOKEN",
36
+ INVALID_AUDIENCE = "INVALID-AUDIENCE",
37
+ NON_SUFFICIENT_FUNDS = "NON-SUFFICIENT-FUNDS",
38
+ INTROSPECT_ERROR = "INTROSPECT-ERROR"
39
+ }
40
+ type TokenCheckPass = {
41
+ passes: true;
42
+ token: string;
43
+ data: TokenData;
44
+ };
45
+ type TokenCheckFail = {
46
+ passes: false;
47
+ problem: TokenProblem;
48
+ token: string | null;
49
+ data: TokenData | null;
50
+ resourceMetadataUrl: string | null;
51
+ };
52
+ type TokenCheck = TokenCheckPass | TokenCheckFail;
53
+
54
+ declare const DESTINATION = "testDestination";
55
+ declare const SOURCE = "testSource";
56
+ declare function charge({ amount, currency, network, destination, source }?: {
9
57
  amount?: BigNumber;
10
58
  currency?: Currency;
11
59
  network?: Network;
12
60
  destination?: string;
13
61
  source?: string;
14
62
  }): Charge;
15
- export declare const oneCentCharge: Charge;
16
- export declare const zeroCharge: Charge;
17
- export declare function logger(): Logger;
18
- export declare function config(args?: Partial<ATXPConfig>): ATXPConfig;
19
- export declare function paymentServer({ charge, createPaymentRequest }?: {
20
- charge?: import("vitest").Mock<(...args: any[]) => any> | undefined;
21
- createPaymentRequest?: import("vitest").Mock<(...args: any[]) => any> | undefined;
63
+ declare const oneCentCharge: Charge;
64
+ declare const zeroCharge: Charge;
65
+ declare function logger(): Logger;
66
+ declare function config(args?: Partial<ATXPConfig>): ATXPConfig;
67
+ declare function paymentServer({ charge, createPaymentRequest }?: {
68
+ charge?: vitest.Mock<(...args: any[]) => any> | undefined;
69
+ createPaymentRequest?: vitest.Mock<(...args: any[]) => any> | undefined;
22
70
  }): PaymentServer;
23
- export declare function mcpRequest({ method, params, id }?: {
71
+ declare function mcpRequest({ method, params, id }?: {
24
72
  method?: McpMethod;
25
73
  params?: any;
26
74
  id?: string;
27
75
  }): JSONRPCRequest;
28
- export declare function mcpToolRequest({ toolName, args, }?: {
76
+ declare function mcpToolRequest({ toolName, args, }?: {
29
77
  toolName?: McpName;
30
78
  args?: any;
31
79
  }): JSONRPCRequest;
32
- export declare function incomingMessage({ body, method, url, headers }?: {
80
+ declare function incomingMessage({ body, method, url, headers }?: {
33
81
  body?: any;
34
82
  method?: 'POST' | 'GET' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS';
35
83
  url?: string;
36
84
  headers?: IncomingHttpHeaders;
37
85
  }): IncomingMessage;
38
- export declare function incomingToolMessage({ authHeader, url, }?: {
86
+ declare function incomingToolMessage({ authHeader, url, }?: {
39
87
  authHeader?: string;
40
88
  url?: string;
41
89
  }): IncomingMessage;
42
- export declare function oAuthClient({ introspectResult, authorizationServer }?: {
90
+ declare function oAuthClient({ introspectResult, authorizationServer }?: {
43
91
  introspectResult?: TokenData;
44
92
  authorizationServer?: oauth.AuthorizationServer;
45
93
  }): OAuthResourceClient;
46
- export declare function tokenData({ active, sub, scope, aud }?: Partial<TokenData>): TokenData;
47
- export declare function tokenCheck({ data, token, passes, problem, resourceMetadataUrl }?: {
94
+ declare function tokenData({ active, sub, scope, aud }?: Partial<TokenData>): TokenData;
95
+ declare function tokenCheck({ data, token, passes, problem, resourceMetadataUrl }?: {
48
96
  data?: TokenData;
49
97
  token?: string | null;
50
98
  passes?: boolean;
51
99
  problem?: TokenProblem;
52
100
  resourceMetadataUrl?: string;
53
101
  }): TokenCheck;
54
- export declare function serverResponse(): ServerResponse;
55
- //# sourceMappingURL=serverTestHelpers.d.ts.map
102
+ declare function serverResponse(): ServerResponse;
103
+
104
+ export { DESTINATION, SOURCE, charge, config, incomingMessage, incomingToolMessage, logger, mcpRequest, mcpToolRequest, oAuthClient, oneCentCharge, paymentServer, serverResponse, tokenCheck, tokenData, zeroCharge };