@1mcp/agent 0.12.0 → 0.13.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 (161) hide show
  1. package/README.md +22 -37
  2. package/build/auth/clientSessionManager.d.ts +94 -0
  3. package/build/auth/clientSessionManager.d.ts.map +1 -0
  4. package/build/auth/clientSessionManager.js +220 -0
  5. package/build/auth/clientSessionManager.js.map +1 -0
  6. package/build/auth/sdkOAuthClientProvider.d.ts +93 -0
  7. package/build/auth/sdkOAuthClientProvider.d.ts.map +1 -0
  8. package/build/auth/sdkOAuthClientProvider.js +199 -0
  9. package/build/auth/sdkOAuthClientProvider.js.map +1 -0
  10. package/build/auth/sdkOAuthServerProvider.d.ts +63 -0
  11. package/build/auth/sdkOAuthServerProvider.d.ts.map +1 -0
  12. package/build/auth/sdkOAuthServerProvider.js +428 -0
  13. package/build/auth/sdkOAuthServerProvider.js.map +1 -0
  14. package/build/auth/{sessionManager.d.ts → serverSessionManager.d.ts} +24 -36
  15. package/build/auth/serverSessionManager.d.ts.map +1 -0
  16. package/build/auth/{sessionManager.js → serverSessionManager.js} +77 -24
  17. package/build/auth/serverSessionManager.js.map +1 -0
  18. package/build/auth/sessionTypes.d.ts +24 -0
  19. package/build/auth/sessionTypes.d.ts.map +1 -0
  20. package/build/auth/sessionTypes.js +3 -0
  21. package/build/auth/sessionTypes.js.map +1 -0
  22. package/build/capabilities/capabilityManager.d.ts +2 -2
  23. package/build/capabilities/capabilityManager.d.ts.map +1 -1
  24. package/build/capabilities/capabilityManager.js +1 -1
  25. package/build/capabilities/capabilityManager.js.map +1 -1
  26. package/build/config/{configManager.d.ts → mcpConfigManager.d.ts} +11 -6
  27. package/build/config/mcpConfigManager.d.ts.map +1 -0
  28. package/build/config/{configManager.js → mcpConfigManager.js} +26 -8
  29. package/build/config/mcpConfigManager.js.map +1 -0
  30. package/build/constants.d.ts +36 -14
  31. package/build/constants.d.ts.map +1 -1
  32. package/build/constants.js +40 -17
  33. package/build/constants.js.map +1 -1
  34. package/build/core/client/clientManager.d.ts +14 -6
  35. package/build/core/client/clientManager.d.ts.map +1 -1
  36. package/build/core/client/clientManager.js +90 -28
  37. package/build/core/client/clientManager.js.map +1 -1
  38. package/build/core/server/{serverConfig.d.ts → agentConfig.d.ts} +50 -15
  39. package/build/core/server/agentConfig.d.ts.map +1 -0
  40. package/build/core/server/agentConfig.js +166 -0
  41. package/build/core/server/agentConfig.js.map +1 -0
  42. package/build/core/server/serverManager.d.ts +12 -5
  43. package/build/core/server/serverManager.d.ts.map +1 -1
  44. package/build/core/server/serverManager.js +12 -2
  45. package/build/core/server/serverManager.js.map +1 -1
  46. package/build/core/types/client.d.ts +22 -9
  47. package/build/core/types/client.d.ts.map +1 -1
  48. package/build/core/types/client.js +2 -0
  49. package/build/core/types/client.js.map +1 -1
  50. package/build/core/types/server.d.ts +3 -3
  51. package/build/core/types/server.d.ts.map +1 -1
  52. package/build/core/types/transport.d.ts +58 -0
  53. package/build/core/types/transport.d.ts.map +1 -1
  54. package/build/core/types/transport.js +10 -0
  55. package/build/core/types/transport.js.map +1 -1
  56. package/build/handlers/notificationHandlers.d.ts +3 -3
  57. package/build/handlers/notificationHandlers.d.ts.map +1 -1
  58. package/build/handlers/notificationHandlers.js +2 -2
  59. package/build/handlers/notificationHandlers.js.map +1 -1
  60. package/build/handlers/requestHandlers.d.ts +2 -2
  61. package/build/handlers/requestHandlers.d.ts.map +1 -1
  62. package/build/handlers/requestHandlers.js +4 -3
  63. package/build/handlers/requestHandlers.js.map +1 -1
  64. package/build/index.js +47 -7
  65. package/build/index.js.map +1 -1
  66. package/build/{transport/http/middleware/loggingMiddleware.d.ts → logger/mcpLoggingEnhancer.d.ts} +1 -1
  67. package/build/logger/mcpLoggingEnhancer.d.ts.map +1 -0
  68. package/build/{transport/http/middleware/loggingMiddleware.js → logger/mcpLoggingEnhancer.js} +2 -2
  69. package/build/logger/mcpLoggingEnhancer.js.map +1 -0
  70. package/build/server.js +4 -4
  71. package/build/server.js.map +1 -1
  72. package/build/services/configReloadService.d.ts +2 -2
  73. package/build/services/configReloadService.d.ts.map +1 -1
  74. package/build/services/configReloadService.js +4 -4
  75. package/build/services/configReloadService.js.map +1 -1
  76. package/build/transport/http/middlewares/errorHandler.d.ts.map +1 -0
  77. package/build/transport/http/{errorHandler.js → middlewares/errorHandler.js} +1 -1
  78. package/build/transport/http/middlewares/errorHandler.js.map +1 -0
  79. package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts +42 -0
  80. package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts.map +1 -0
  81. package/build/transport/http/middlewares/scopeAuthMiddleware.js +136 -0
  82. package/build/transport/http/middlewares/scopeAuthMiddleware.js.map +1 -0
  83. package/build/transport/http/middlewares/securityMiddleware.d.ts +30 -0
  84. package/build/transport/http/middlewares/securityMiddleware.d.ts.map +1 -0
  85. package/build/transport/http/middlewares/securityMiddleware.js +201 -0
  86. package/build/transport/http/middlewares/securityMiddleware.js.map +1 -0
  87. package/build/transport/http/middlewares/tagsExtractor.d.ts.map +1 -0
  88. package/build/transport/http/middlewares/tagsExtractor.js.map +1 -0
  89. package/build/transport/http/routes/oauthRoutes.d.ts +3 -13
  90. package/build/transport/http/routes/oauthRoutes.d.ts.map +1 -1
  91. package/build/transport/http/routes/oauthRoutes.js +459 -117
  92. package/build/transport/http/routes/oauthRoutes.js.map +1 -1
  93. package/build/transport/http/routes/sseRoutes.d.ts +2 -2
  94. package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
  95. package/build/transport/http/routes/sseRoutes.js +9 -7
  96. package/build/transport/http/routes/sseRoutes.js.map +1 -1
  97. package/build/transport/http/routes/streamableHttpRoutes.d.ts +2 -2
  98. package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
  99. package/build/transport/http/routes/streamableHttpRoutes.js +16 -10
  100. package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
  101. package/build/transport/http/server.d.ts +3 -2
  102. package/build/transport/http/server.d.ts.map +1 -1
  103. package/build/transport/http/server.js +58 -21
  104. package/build/transport/http/server.js.map +1 -1
  105. package/build/transport/transportFactory.d.ts +9 -0
  106. package/build/transport/transportFactory.d.ts.map +1 -0
  107. package/build/transport/transportFactory.js +148 -0
  108. package/build/transport/transportFactory.js.map +1 -0
  109. package/build/utils/clientFiltering.d.ts +4 -4
  110. package/build/utils/clientFiltering.d.ts.map +1 -1
  111. package/build/utils/clientFiltering.js +14 -14
  112. package/build/utils/clientFiltering.js.map +1 -1
  113. package/build/utils/errorHandling.d.ts +0 -12
  114. package/build/utils/errorHandling.d.ts.map +1 -1
  115. package/build/utils/errorHandling.js +1 -42
  116. package/build/utils/errorHandling.js.map +1 -1
  117. package/build/utils/pagination.d.ts +2 -2
  118. package/build/utils/pagination.d.ts.map +1 -1
  119. package/build/utils/pagination.js +4 -4
  120. package/build/utils/pagination.js.map +1 -1
  121. package/build/utils/parsing.d.ts +13 -0
  122. package/build/utils/parsing.d.ts.map +1 -0
  123. package/build/utils/parsing.js +32 -0
  124. package/build/utils/parsing.js.map +1 -0
  125. package/build/utils/sanitization.d.ts +60 -0
  126. package/build/utils/sanitization.d.ts.map +1 -0
  127. package/build/utils/sanitization.js +149 -0
  128. package/build/utils/sanitization.js.map +1 -0
  129. package/build/utils/scopeValidation.d.ts +102 -0
  130. package/build/utils/scopeValidation.d.ts.map +1 -0
  131. package/build/utils/scopeValidation.js +244 -0
  132. package/build/utils/scopeValidation.js.map +1 -0
  133. package/package.json +20 -11
  134. package/build/auth/authManager.d.ts +0 -109
  135. package/build/auth/authManager.d.ts.map +0 -1
  136. package/build/auth/authManager.js +0 -173
  137. package/build/auth/authManager.js.map +0 -1
  138. package/build/auth/authMiddleware.d.ts +0 -16
  139. package/build/auth/authMiddleware.d.ts.map +0 -1
  140. package/build/auth/authMiddleware.js +0 -45
  141. package/build/auth/authMiddleware.js.map +0 -1
  142. package/build/auth/sessionManager.d.ts.map +0 -1
  143. package/build/auth/sessionManager.js.map +0 -1
  144. package/build/config/configManager.d.ts.map +0 -1
  145. package/build/config/configManager.js.map +0 -1
  146. package/build/core/server/serverConfig.d.ts.map +0 -1
  147. package/build/core/server/serverConfig.js +0 -117
  148. package/build/core/server/serverConfig.js.map +0 -1
  149. package/build/transport/config.d.ts +0 -7
  150. package/build/transport/config.d.ts.map +0 -1
  151. package/build/transport/config.js +0 -90
  152. package/build/transport/config.js.map +0 -1
  153. package/build/transport/http/errorHandler.d.ts.map +0 -1
  154. package/build/transport/http/errorHandler.js.map +0 -1
  155. package/build/transport/http/middleware/loggingMiddleware.d.ts.map +0 -1
  156. package/build/transport/http/middleware/loggingMiddleware.js.map +0 -1
  157. package/build/utils/tagsExtractor.d.ts.map +0 -1
  158. package/build/utils/tagsExtractor.js.map +0 -1
  159. /package/build/transport/http/{errorHandler.d.ts → middlewares/errorHandler.d.ts} +0 -0
  160. /package/build/{utils → transport/http/middlewares}/tagsExtractor.d.ts +0 -0
  161. /package/build/{utils → transport/http/middlewares}/tagsExtractor.js +0 -0
@@ -2,14 +2,16 @@ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
2
2
  import { ErrorCode } from '@modelcontextprotocol/sdk/types.js';
3
3
  import logger from '../../../logger/logger.js';
4
4
  import { SSE_ENDPOINT, MESSAGES_ENDPOINT } from '../../../constants.js';
5
- import tagsExtractor from '../../../utils/tagsExtractor.js';
6
- export function setupSseRoutes(app, serverManager, authMiddleware) {
7
- app.get(SSE_ENDPOINT, authMiddleware, tagsExtractor, async (req, res) => {
5
+ import tagsExtractor from '../middlewares/tagsExtractor.js';
6
+ import scopeAuthMiddleware, { getValidatedTags } from '../middlewares/scopeAuthMiddleware.js';
7
+ import { sanitizeHeaders } from '../../../utils/sanitization.js';
8
+ export function setupSseRoutes(router, serverManager) {
9
+ router.get(SSE_ENDPOINT, tagsExtractor, scopeAuthMiddleware, async (req, res) => {
8
10
  try {
9
- logger.info('[GET] sse', { query: req.query, headers: req.headers });
11
+ logger.info('[GET] sse', { query: req.query, headers: sanitizeHeaders(req.headers) });
10
12
  const transport = new SSEServerTransport(MESSAGES_ENDPOINT, res);
11
- // Use tags from middleware
12
- const tags = res.locals.tags;
13
+ // Use validated tags from scope auth middleware
14
+ const tags = getValidatedTags(res);
13
15
  // Connect the transport using the server manager
14
16
  await serverManager.connectTransport(transport, transport.sessionId, {
15
17
  tags,
@@ -25,7 +27,7 @@ export function setupSseRoutes(app, serverManager, authMiddleware) {
25
27
  res.status(500).end();
26
28
  }
27
29
  });
28
- app.post(MESSAGES_ENDPOINT, authMiddleware, async (req, res) => {
30
+ router.post(MESSAGES_ENDPOINT, async (req, res) => {
29
31
  try {
30
32
  const sessionId = req.query.sessionId;
31
33
  if (!sessionId) {
@@ -1 +1 @@
1
- {"version":3,"file":"sseRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/sseRoutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sseRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/sseRoutes.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import express from 'express';
1
+ import { Router } from 'express';
2
2
  import { ServerManager } from '../../../core/server/serverManager.js';
3
- export declare function setupStreamableHttpRoutes(app: express.Application, serverManager: ServerManager, authMiddleware: express.RequestHandler): void;
3
+ export declare function setupStreamableHttpRoutes(router: Router, serverManager: ServerManager): void;
4
4
  //# sourceMappingURL=streamableHttpRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"streamableHttpRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAM9B,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAGtE,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,CAAC,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,OAAO,CAAC,cAAc,GACrC,IAAI,CA6HN"}
1
+ {"version":3,"file":"streamableHttpRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAMpD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAKtE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,CA4H5F"}
@@ -3,11 +3,17 @@ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/
3
3
  import { ErrorCode } from '@modelcontextprotocol/sdk/types.js';
4
4
  import logger from '../../../logger/logger.js';
5
5
  import { STREAMABLE_HTTP_ENDPOINT } from '../../../constants.js';
6
- import tagsExtractor from '../../../utils/tagsExtractor.js';
7
- export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
8
- app.post(STREAMABLE_HTTP_ENDPOINT, authMiddleware, tagsExtractor, async (req, res) => {
6
+ import tagsExtractor from '../middlewares/tagsExtractor.js';
7
+ import scopeAuthMiddleware, { getValidatedTags } from '../middlewares/scopeAuthMiddleware.js';
8
+ import { sanitizeHeaders } from '../../../utils/sanitization.js';
9
+ export function setupStreamableHttpRoutes(router, serverManager) {
10
+ router.post(STREAMABLE_HTTP_ENDPOINT, tagsExtractor, scopeAuthMiddleware, async (req, res) => {
9
11
  try {
10
- logger.info('[POST] streamable-http', { query: req.query, body: req.body, headers: req.headers });
12
+ logger.info('[POST] streamable-http', {
13
+ query: req.query,
14
+ body: req.body,
15
+ headers: sanitizeHeaders(req.headers),
16
+ });
11
17
  let transport;
12
18
  const sessionId = req.headers['mcp-session-id'];
13
19
  if (!sessionId) {
@@ -15,8 +21,8 @@ export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
15
21
  transport = new StreamableHTTPServerTransport({
16
22
  sessionIdGenerator: () => id,
17
23
  });
18
- // Use tags from middleware
19
- const tags = res.locals.tags;
24
+ // Use validated tags from scope auth middleware
25
+ const tags = getValidatedTags(res);
20
26
  await serverManager.connectTransport(transport, id, {
21
27
  tags,
22
28
  enablePagination: req.query.pagination === 'true',
@@ -57,9 +63,9 @@ export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
57
63
  res.status(500).end();
58
64
  }
59
65
  });
60
- app.get(STREAMABLE_HTTP_ENDPOINT, authMiddleware, async (req, res) => {
66
+ router.get(STREAMABLE_HTTP_ENDPOINT, async (req, res) => {
61
67
  try {
62
- logger.info('[GET] streamable-http', { query: req.query, headers: req.headers });
68
+ logger.info('[GET] streamable-http', { query: req.query, headers: sanitizeHeaders(req.headers) });
63
69
  const sessionId = req.headers['mcp-session-id'];
64
70
  if (!sessionId) {
65
71
  res.status(400).json({
@@ -87,9 +93,9 @@ export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
87
93
  res.status(500).end();
88
94
  }
89
95
  });
90
- app.delete(STREAMABLE_HTTP_ENDPOINT, authMiddleware, async (req, res) => {
96
+ router.delete(STREAMABLE_HTTP_ENDPOINT, async (req, res) => {
91
97
  try {
92
- logger.info('[DELETE] streamable-http', { query: req.query, headers: req.headers });
98
+ logger.info('[DELETE] streamable-http', { query: req.query, headers: sanitizeHeaders(req.headers) });
93
99
  const sessionId = req.headers['mcp-session-id'];
94
100
  if (!sessionId) {
95
101
  res.status(400).json({
@@ -1 +1 @@
1
- {"version":3,"file":"streamableHttpRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streamableHttpRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ import { ServerManager } from '../../core/server/serverManager.js';
15
15
  export declare class ExpressServer {
16
16
  private app;
17
17
  private serverManager;
18
- private authManager;
18
+ private oauthProvider;
19
19
  private configManager;
20
20
  /**
21
21
  * Creates a new ExpressServer instance.
@@ -30,6 +30,7 @@ export declare class ExpressServer {
30
30
  * Sets up Express middleware including CORS, body parsing, and error handling.
31
31
  *
32
32
  * Configures the basic middleware stack required for the MCP server:
33
+ * - Enhanced security middleware (conditional based on feature flag)
33
34
  * - CORS for cross-origin requests
34
35
  * - JSON body parsing
35
36
  * - Global error handling
@@ -55,7 +56,7 @@ export declare class ExpressServer {
55
56
  * @param port - The port number to listen on
56
57
  * @param host - The host address to bind to
57
58
  */
58
- start(port: number, host: string): void;
59
+ start(): void;
59
60
  /**
60
61
  * Performs graceful shutdown of the Express server.
61
62
  *
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAUnE;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAsB;IAE3C;;;;;;;OAOG;gBACS,aAAa,EAAE,aAAa;IAaxC;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAQvB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAmBnB;;;;;;;;OAQG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAO9C;;;;;;;OAOG;IACI,QAAQ,IAAI,IAAI;CAGxB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAQnE;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAqB;IAE1C;;;;;;;OAOG;gBACS,aAAa,EAAE,aAAa;IAaxC;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAgDnB;;;;;;;;OAQG;IACI,KAAK,IAAI,IAAI;IASpB;;;;;;;OAOG;IACI,QAAQ,IAAI,IAAI;CAGxB"}
@@ -1,14 +1,16 @@
1
1
  import express from 'express';
2
2
  import bodyParser from 'body-parser';
3
3
  import cors from 'cors';
4
+ import { mcpAuthRouter } from '@modelcontextprotocol/sdk/server/auth/router.js';
4
5
  import logger from '../../logger/logger.js';
5
- import errorHandler from './errorHandler.js';
6
- import { AuthManager } from '../../auth/authManager.js';
7
- import { createAuthMiddleware } from '../../auth/authMiddleware.js';
8
- import { setupOAuthRoutes } from './routes/oauthRoutes.js';
6
+ import errorHandler from './middlewares/errorHandler.js';
7
+ import { setupSecurityMiddleware } from './middlewares/securityMiddleware.js';
8
+ import { SDKOAuthServerProvider } from '../../auth/sdkOAuthServerProvider.js';
9
9
  import { setupStreamableHttpRoutes } from './routes/streamableHttpRoutes.js';
10
10
  import { setupSseRoutes } from './routes/sseRoutes.js';
11
- import { ServerConfigManager } from '../../core/server/serverConfig.js';
11
+ import oauthRoutes from './routes/oauthRoutes.js';
12
+ import { AgentConfigManager } from '../../core/server/agentConfig.js';
13
+ import { RATE_LIMIT_CONFIG } from '../../constants.js';
12
14
  /**
13
15
  * ExpressServer orchestrates the HTTP/SSE transport layer for the MCP server.
14
16
  *
@@ -25,7 +27,7 @@ import { ServerConfigManager } from '../../core/server/serverConfig.js';
25
27
  export class ExpressServer {
26
28
  app;
27
29
  serverManager;
28
- authManager;
30
+ oauthProvider;
29
31
  configManager;
30
32
  /**
31
33
  * Creates a new ExpressServer instance.
@@ -38,10 +40,10 @@ export class ExpressServer {
38
40
  constructor(serverManager) {
39
41
  this.app = express();
40
42
  this.serverManager = serverManager;
41
- this.configManager = ServerConfigManager.getInstance();
42
- // Initialize auth manager with custom session storage path if configured
43
+ this.configManager = AgentConfigManager.getInstance();
44
+ // Initialize OAuth provider with custom session storage path if configured
43
45
  const sessionStoragePath = this.configManager.getSessionStoragePath();
44
- this.authManager = new AuthManager(sessionStoragePath);
46
+ this.oauthProvider = new SDKOAuthServerProvider(sessionStoragePath);
45
47
  this.setupMiddleware();
46
48
  this.setupRoutes();
47
49
  }
@@ -49,13 +51,19 @@ export class ExpressServer {
49
51
  * Sets up Express middleware including CORS, body parsing, and error handling.
50
52
  *
51
53
  * Configures the basic middleware stack required for the MCP server:
54
+ * - Enhanced security middleware (conditional based on feature flag)
52
55
  * - CORS for cross-origin requests
53
56
  * - JSON body parsing
54
57
  * - Global error handling
55
58
  */
56
59
  setupMiddleware() {
60
+ // Conditionally apply enhanced security middleware (must be first if enabled)
61
+ if (this.configManager.isEnhancedSecurityEnabled()) {
62
+ this.app.use(...setupSecurityMiddleware());
63
+ }
57
64
  this.app.use(cors()); // Allow all origins for local dev
58
65
  this.app.use(bodyParser.json());
66
+ this.app.use(bodyParser.urlencoded({ extended: true }));
59
67
  // Add error handling middleware
60
68
  this.app.use(errorHandler);
61
69
  }
@@ -70,16 +78,43 @@ export class ExpressServer {
70
78
  * Logs the authentication status for debugging purposes.
71
79
  */
72
80
  setupRoutes() {
73
- // Create auth middleware
74
- const authMiddleware = createAuthMiddleware(this.authManager);
75
- // Setup OAuth routes (always available, but auth can be disabled)
76
- setupOAuthRoutes(this.app, this.authManager);
77
- // Setup MCP transport routes with auth middleware
78
- setupStreamableHttpRoutes(this.app, this.serverManager, authMiddleware);
79
- setupSseRoutes(this.app, this.serverManager, authMiddleware);
81
+ // Setup OAuth routes using SDK's mcpAuthRouter
82
+ const { host, port } = this.configManager.getConfig();
83
+ const issuerUrl = new URL(`http://${host}:${port}`);
84
+ const rateLimitConfig = {
85
+ windowMs: this.configManager.getRateLimitWindowMs(),
86
+ max: this.configManager.getRateLimitMax(),
87
+ message: RATE_LIMIT_CONFIG.OAUTH.MESSAGE,
88
+ standardHeaders: true,
89
+ legacyHeaders: false,
90
+ };
91
+ const authRouter = mcpAuthRouter({
92
+ provider: this.oauthProvider,
93
+ issuerUrl,
94
+ authorizationOptions: {
95
+ rateLimit: rateLimitConfig,
96
+ },
97
+ tokenOptions: {
98
+ rateLimit: rateLimitConfig,
99
+ },
100
+ revocationOptions: {
101
+ rateLimit: rateLimitConfig,
102
+ },
103
+ clientRegistrationOptions: {
104
+ rateLimit: rateLimitConfig,
105
+ },
106
+ });
107
+ this.app.use(authRouter);
108
+ // Setup OAuth management routes (no auth required)
109
+ this.app.use('/oauth', oauthRoutes);
110
+ // Setup MCP transport routes (auth is handled per-route via scopeAuthMiddleware)
111
+ const router = express.Router();
112
+ setupStreamableHttpRoutes(router, this.serverManager);
113
+ setupSseRoutes(router, this.serverManager);
114
+ this.app.use(router);
80
115
  // Log authentication status
81
- if (this.authManager.isAuthEnabled()) {
82
- logger.info('Authentication enabled - OAuth 2.1 endpoints available');
116
+ if (this.configManager.isAuthEnabled()) {
117
+ logger.info('Authentication enabled - OAuth 2.1 endpoints available via SDK');
83
118
  }
84
119
  else {
85
120
  logger.info('Authentication disabled - all endpoints accessible without auth');
@@ -94,10 +129,12 @@ export class ExpressServer {
94
129
  * @param port - The port number to listen on
95
130
  * @param host - The host address to bind to
96
131
  */
97
- start(port, host) {
132
+ start() {
133
+ const { port, host } = this.configManager.getConfig();
98
134
  this.app.listen(port, host, () => {
99
- const authStatus = this.authManager.isAuthEnabled() ? 'with authentication' : 'without authentication';
135
+ const authStatus = this.configManager.isAuthEnabled() ? 'with authentication' : 'without authentication';
100
136
  logger.info(`Server is running on port ${port} with HTTP/SSE and Streamable HTTP transport ${authStatus}`);
137
+ logger.info(`📋 OAuth Management Dashboard: http://${host}:${port}/oauth`);
101
138
  });
102
139
  }
103
140
  /**
@@ -109,7 +146,7 @@ export class ExpressServer {
109
146
  * - Timer cleanup
110
147
  */
111
148
  shutdown() {
112
- this.authManager.shutdown();
149
+ this.oauthProvider.shutdown();
113
150
  }
114
151
  }
115
152
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { AuthProviderTransport } from '../core/types/index.js';
2
+ import { MCPServerParams } from '../core/types/index.js';
3
+ /**
4
+ * Creates transport instances from configuration
5
+ * @param config - Configuration object with server parameters
6
+ * @returns Record of transport instances
7
+ */
8
+ export declare function createTransports(config: Record<string, MCPServerParams>): Record<string, AuthProviderTransport>;
9
+ //# sourceMappingURL=transportFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportFactory.d.ts","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAyB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA2JzD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA2B/G"}
@@ -0,0 +1,148 @@
1
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
2
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
3
+ import { StreamableHTTPClientTransport, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
+ import { ZodError } from 'zod';
5
+ import logger from '../logger/logger.js';
6
+ import { transportConfigSchema } from '../core/types/index.js';
7
+ import { SDKOAuthClientProvider } from '../auth/sdkOAuthClientProvider.js';
8
+ import { AUTH_CONFIG } from '../constants.js';
9
+ import { AgentConfigManager } from '../core/server/agentConfig.js';
10
+ /**
11
+ * Infers transport type from configuration parameters
12
+ */
13
+ function inferTransportType(params, name) {
14
+ const inferredParams = { ...params };
15
+ if (inferredParams.type) {
16
+ return inferredParams;
17
+ }
18
+ logger.warn(`Transport type is missing for ${name}, inferring type...`);
19
+ if (inferredParams.command) {
20
+ inferredParams.type = 'stdio';
21
+ logger.info(`Inferred transport type for ${name} as stdio`);
22
+ }
23
+ else if (inferredParams.url) {
24
+ if (inferredParams.url.endsWith('mcp')) {
25
+ inferredParams.type = 'http';
26
+ logger.info(`Inferred transport type for ${name} as http/streamableHttp`);
27
+ }
28
+ else {
29
+ inferredParams.type = 'sse';
30
+ logger.info(`Inferred transport type for ${name} as sse`);
31
+ }
32
+ }
33
+ return inferredParams;
34
+ }
35
+ /**
36
+ * Creates OAuth provider for HTTP-based transports
37
+ */
38
+ function createOAuthProvider(name, validatedTransport) {
39
+ const { host, port } = AgentConfigManager.getInstance().getConfig();
40
+ const oauthConfig = {
41
+ autoRegister: true,
42
+ redirectUrl: `http://${host}:${port}${AUTH_CONFIG.CLIENT.OAUTH.DEFAULT_CALLBACK_PATH}/${name}`,
43
+ ...validatedTransport.oauth,
44
+ };
45
+ logger.info(`Creating OAuth client provider for transport: ${name}`);
46
+ return new SDKOAuthClientProvider(name, oauthConfig);
47
+ }
48
+ /**
49
+ * Creates SSE transport with OAuth provider
50
+ */
51
+ function createSSETransport(name, validatedTransport) {
52
+ if (!validatedTransport.url) {
53
+ throw new Error(`URL is required for SSE transport: ${name}`);
54
+ }
55
+ const sseOptions = {
56
+ requestInit: {
57
+ headers: validatedTransport.headers,
58
+ },
59
+ };
60
+ const oauthProvider = createOAuthProvider(name, validatedTransport);
61
+ sseOptions.authProvider = oauthProvider;
62
+ const transport = new SSEClientTransport(new URL(validatedTransport.url), sseOptions);
63
+ transport.oauthProvider = oauthProvider;
64
+ return transport;
65
+ }
66
+ /**
67
+ * Creates HTTP transport with OAuth provider
68
+ */
69
+ function createHTTPTransport(name, validatedTransport) {
70
+ if (!validatedTransport.url) {
71
+ throw new Error(`URL is required for HTTP transport: ${name}`);
72
+ }
73
+ const httpOptions = {
74
+ requestInit: {
75
+ headers: validatedTransport.headers,
76
+ },
77
+ };
78
+ const oauthProvider = createOAuthProvider(name, validatedTransport);
79
+ httpOptions.authProvider = oauthProvider;
80
+ const transport = new StreamableHTTPClientTransport(new URL(validatedTransport.url), httpOptions);
81
+ transport.oauthProvider = oauthProvider;
82
+ return transport;
83
+ }
84
+ /**
85
+ * Creates stdio transport
86
+ */
87
+ function createStdioTransport(name, validatedTransport) {
88
+ if (!validatedTransport.command) {
89
+ throw new Error(`Command is required for stdio transport: ${name}`);
90
+ }
91
+ return new StdioClientTransport(validatedTransport);
92
+ }
93
+ /**
94
+ * Creates a single transport instance
95
+ */
96
+ function createSingleTransport(name, validatedTransport) {
97
+ switch (validatedTransport.type) {
98
+ case 'sse':
99
+ return createSSETransport(name, validatedTransport);
100
+ case 'http':
101
+ case 'streamableHttp':
102
+ return createHTTPTransport(name, validatedTransport);
103
+ case 'stdio':
104
+ return createStdioTransport(name, validatedTransport);
105
+ default:
106
+ throw new Error(`Invalid transport type: ${validatedTransport.type}`);
107
+ }
108
+ }
109
+ /**
110
+ * Assigns transport properties and adds to collection
111
+ */
112
+ function assignTransport(transports, name, transport, validatedTransport) {
113
+ transport.timeout = validatedTransport.timeout;
114
+ transport.tags = validatedTransport.tags;
115
+ transports[name] = transport;
116
+ }
117
+ /**
118
+ * Creates transport instances from configuration
119
+ * @param config - Configuration object with server parameters
120
+ * @returns Record of transport instances
121
+ */
122
+ export function createTransports(config) {
123
+ const transports = {};
124
+ for (const [name, params] of Object.entries(config)) {
125
+ if (params.disabled) {
126
+ logger.debug(`Skipping disabled transport: ${name}`);
127
+ continue;
128
+ }
129
+ try {
130
+ const inferredParams = inferTransportType(params, name);
131
+ const validatedTransport = transportConfigSchema.parse(inferredParams);
132
+ const transport = createSingleTransport(name, validatedTransport);
133
+ assignTransport(transports, name, transport, validatedTransport);
134
+ logger.debug(`Created transport: ${name}`);
135
+ }
136
+ catch (error) {
137
+ if (error instanceof ZodError) {
138
+ logger.error(`Invalid transport configuration for ${name}:`, error.errors);
139
+ }
140
+ else {
141
+ logger.error(`Error creating transport ${name}:`, error);
142
+ }
143
+ throw error;
144
+ }
145
+ }
146
+ return transports;
147
+ }
148
+ //# sourceMappingURL=transportFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportFactory.js","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,2CAA2C,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAA6B,MAAM,yCAAyC,CAAC;AACxG,OAAO,EACL,6BAA6B,GAE9B,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAyB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAqB,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAuB,EAAE,IAAY;IAC/D,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAErC,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,IAAI,qBAAqB,CAAC,CAAC;IAExE,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,WAAW,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,cAAc,CAAC,IAAI,GAAG,MAAM,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,yBAAyB,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,GAAG,KAAK,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,SAAS,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,IAAY,EACZ,kBAAsD;IAEtD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;IAEpE,MAAM,WAAW,GAAsB;QACrC,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,UAAU,IAAI,IAAI,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,EAAE;QAC9F,GAAG,kBAAkB,CAAC,KAAK;KAC5B,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;IACrE,OAAO,IAAI,sBAAsB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,IAAY,EACZ,kBAAsD;IAEtD,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,UAAU,GAA8B;QAC5C,WAAW,EAAE;YACX,OAAO,EAAE,kBAAkB,CAAC,OAAO;SACpC;KACF,CAAC;IAEF,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACpE,UAAU,CAAC,YAAY,GAAG,aAAa,CAAC;IAExC,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,UAAU,CAA0B,CAAC;IAC/G,SAAS,CAAC,aAAa,GAAG,aAAa,CAAC;IAExC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,IAAY,EACZ,kBAAsD;IAEtD,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,WAAW,GAAyC;QACxD,WAAW,EAAE;YACX,OAAO,EAAE,kBAAkB,CAAC,OAAO;SACpC;KACF,CAAC;IAEF,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACpE,WAAW,CAAC,YAAY,GAAG,aAAa,CAAC;IAEzC,MAAM,SAAS,GAAG,IAAI,6BAA6B,CACjD,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAC/B,WAAW,CACa,CAAC;IAC3B,SAAS,CAAC,aAAa,GAAG,aAAa,CAAC;IAExC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,IAAY,EACZ,kBAAsD;IAEtD,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,IAAI,oBAAoB,CAAC,kBAA2C,CAA0B,CAAC;AACxG,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,IAAY,EACZ,kBAAsD;IAEtD,QAAQ,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAChC,KAAK,KAAK;YACR,OAAO,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC;QACZ,KAAK,gBAAgB;YACnB,OAAO,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACvD,KAAK,OAAO;YACV,OAAO,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACxD;YACE,MAAM,IAAI,KAAK,CAAC,2BAA2B,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,UAAiD,EACjD,IAAY,EACZ,SAAgC,EAChC,kBAAsD;IAEtD,SAAS,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC;IAC/C,SAAS,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACzC,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAuC;IACtE,MAAM,UAAU,GAA0C,EAAE,CAAC;IAE7D,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACxD,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;YAElE,eAAe,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,MAAM,CAAC,KAAK,CAAC,uCAAuC,IAAI,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -1,20 +1,20 @@
1
1
  import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
2
- import { Clients } from '../core/types/index.js';
2
+ import { OutboundConnections } from '../core/types/index.js';
3
3
  /**
4
4
  * Filters clients by tags
5
5
  * @param clients Record of client instances
6
6
  * @param tags Array of tags to filter by
7
7
  * @returns Filtered record of client instances
8
8
  */
9
- export declare function filterClientsByTags(clients: Clients, tags?: string[]): Clients;
9
+ export declare function filterClientsByTags(clients: OutboundConnections, tags?: string[]): OutboundConnections;
10
10
  /**
11
11
  * Filters clients by capabilities
12
12
  * @param clients Record of client instances
13
13
  * @param capabilities Object containing capabilities to filter by
14
14
  * @returns Filtered record of client instances
15
15
  */
16
- export declare function filterClientsByCapabilities(clients: Clients, capabilities: ServerCapabilities): Clients;
17
- type ClientFilter = (clients: Clients) => Clients;
16
+ export declare function filterClientsByCapabilities(clients: OutboundConnections, capabilities: ServerCapabilities): OutboundConnections;
17
+ type ClientFilter = (clients: OutboundConnections) => OutboundConnections;
18
18
  /**
19
19
  * Filters clients by multiple criteria
20
20
  * @param filters Array of client filters
@@ -1 +1 @@
1
- {"version":3,"file":"clientFiltering.d.ts","sourceRoot":"","sources":["../../src/utils/clientFiltering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAyB9E;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAwBvG;AAED,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAItE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,GAAG,YAAY,CAYrF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,CAYpD"}
1
+ {"version":3,"file":"clientFiltering.d.ts","sourceRoot":"","sources":["../../src/utils/clientFiltering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAsB,MAAM,wBAAwB,CAAC;AAGjF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAyBtG;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,kBAAkB,GAC/B,mBAAmB,CAwBrB;AAED,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,mBAAmB,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAItE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,GAAG,YAAY,CAYrF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,CAYpD"}
@@ -9,13 +9,13 @@ export function filterClientsByTags(clients, tags) {
9
9
  if (!tags || tags.length === 0) {
10
10
  return clients;
11
11
  }
12
- const filteredClients = {};
12
+ const filteredClients = new Map();
13
13
  let matchedClients = 0;
14
- for (const [name, clientInfo] of Object.entries(clients)) {
14
+ for (const [name, clientInfo] of clients.entries()) {
15
15
  const clientTags = clientInfo.transport.tags || [];
16
16
  const hasMatchingTags = tags.every((tag) => clientTags.includes(tag));
17
17
  if (hasMatchingTags) {
18
- filteredClients[name] = clientInfo;
18
+ filteredClients.set(name, clientInfo);
19
19
  matchedClients++;
20
20
  }
21
21
  }
@@ -25,7 +25,7 @@ export function filterClientsByTags(clients, tags) {
25
25
  else {
26
26
  logger.debug(`Found ${matchedClients} clients matching tags: ${tags.join(', ')}`);
27
27
  }
28
- return Object.freeze(filteredClients);
28
+ return filteredClients;
29
29
  }
30
30
  /**
31
31
  * Filters clients by capabilities
@@ -34,16 +34,16 @@ export function filterClientsByTags(clients, tags) {
34
34
  * @returns Filtered record of client instances
35
35
  */
36
36
  export function filterClientsByCapabilities(clients, capabilities) {
37
- const filteredClients = {};
37
+ const filteredClients = new Map();
38
38
  let matchedClients = 0;
39
- for (const [name, clientInfo] of Object.entries(clients)) {
39
+ for (const [name, clientInfo] of clients.entries()) {
40
40
  const clientCapabilities = clientInfo.capabilities || {};
41
41
  const hasMatchingCapabilities = Object.keys(capabilities).every((capability) => {
42
42
  const clientCapability = clientCapabilities[capability];
43
43
  return clientCapability !== undefined;
44
44
  });
45
45
  if (hasMatchingCapabilities) {
46
- filteredClients[name] = clientInfo;
46
+ filteredClients.set(name, clientInfo);
47
47
  matchedClients++;
48
48
  }
49
49
  }
@@ -53,7 +53,7 @@ export function filterClientsByCapabilities(clients, capabilities) {
53
53
  else {
54
54
  logger.debug(`Found ${matchedClients} clients matching capabilities: ${JSON.stringify(capabilities)}`);
55
55
  }
56
- return Object.freeze(filteredClients);
56
+ return filteredClients;
57
57
  }
58
58
  /**
59
59
  * Filters clients by multiple criteria
@@ -72,13 +72,13 @@ export function filterClients(...filters) {
72
72
  */
73
73
  export function byCapabilities(requiredCapabilities) {
74
74
  return (clients) => {
75
- return Object.entries(clients).reduce((filtered, [name, clientInfo]) => {
75
+ return Array.from(clients.entries()).reduce((filtered, [name, clientInfo]) => {
76
76
  const hasCapabilities = Object.keys(requiredCapabilities).every((cap) => clientInfo.capabilities && cap in clientInfo.capabilities);
77
77
  if (hasCapabilities) {
78
- filtered[name] = clientInfo;
78
+ filtered.set(name, clientInfo);
79
79
  }
80
80
  return filtered;
81
- }, {});
81
+ }, new Map());
82
82
  };
83
83
  }
84
84
  /**
@@ -90,13 +90,13 @@ export function byTags(tags) {
90
90
  return (clients) => {
91
91
  if (!tags || tags.length === 0)
92
92
  return clients;
93
- return Object.entries(clients).reduce((filtered, [name, clientInfo]) => {
93
+ return Array.from(clients.entries()).reduce((filtered, [name, clientInfo]) => {
94
94
  const hasMatchingTags = tags.every((tag) => clientInfo.transport.tags?.includes(tag));
95
95
  if (hasMatchingTags) {
96
- filtered[name] = clientInfo;
96
+ filtered.set(name, clientInfo);
97
97
  }
98
98
  return filtered;
99
- }, {});
99
+ }, new Map());
100
100
  };
101
101
  }
102
102
  //# sourceMappingURL=clientFiltering.js.map