@alsania-io/mcpnyx 0.0.1

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 (98) hide show
  1. package/README.md +251 -0
  2. package/dist/gateways/configToSse.d.ts +16 -0
  3. package/dist/gateways/configToSse.d.ts.map +1 -0
  4. package/dist/gateways/configToSse.js +144 -0
  5. package/dist/gateways/configToSse.js.map +1 -0
  6. package/dist/gateways/configToStreamableHttp.d.ts +16 -0
  7. package/dist/gateways/configToStreamableHttp.d.ts.map +1 -0
  8. package/dist/gateways/configToStreamableHttp.js +287 -0
  9. package/dist/gateways/configToStreamableHttp.js.map +1 -0
  10. package/dist/gateways/configToWs.d.ts +14 -0
  11. package/dist/gateways/configToWs.d.ts.map +1 -0
  12. package/dist/gateways/configToWs.js +145 -0
  13. package/dist/gateways/configToWs.js.map +1 -0
  14. package/dist/gateways/sseToSse.d.ts +16 -0
  15. package/dist/gateways/sseToSse.d.ts.map +1 -0
  16. package/dist/gateways/sseToSse.js +224 -0
  17. package/dist/gateways/sseToSse.js.map +1 -0
  18. package/dist/gateways/sseToStdio.d.ts +8 -0
  19. package/dist/gateways/sseToStdio.d.ts.map +1 -0
  20. package/dist/gateways/sseToStdio.js +130 -0
  21. package/dist/gateways/sseToStdio.js.map +1 -0
  22. package/dist/gateways/sseToWs.d.ts +14 -0
  23. package/dist/gateways/sseToWs.d.ts.map +1 -0
  24. package/dist/gateways/sseToWs.js +212 -0
  25. package/dist/gateways/sseToWs.js.map +1 -0
  26. package/dist/gateways/stdioToSse.d.ts +16 -0
  27. package/dist/gateways/stdioToSse.d.ts.map +1 -0
  28. package/dist/gateways/stdioToSse.js +134 -0
  29. package/dist/gateways/stdioToSse.js.map +1 -0
  30. package/dist/gateways/stdioToStatefulStreamableHttp.d.ts +15 -0
  31. package/dist/gateways/stdioToStatefulStreamableHttp.d.ts.map +1 -0
  32. package/dist/gateways/stdioToStatefulStreamableHttp.js +189 -0
  33. package/dist/gateways/stdioToStatefulStreamableHttp.js.map +1 -0
  34. package/dist/gateways/stdioToStatelessStreamableHttp.d.ts +14 -0
  35. package/dist/gateways/stdioToStatelessStreamableHttp.d.ts.map +1 -0
  36. package/dist/gateways/stdioToStatelessStreamableHttp.js +132 -0
  37. package/dist/gateways/stdioToStatelessStreamableHttp.js.map +1 -0
  38. package/dist/gateways/stdioToWs.d.ts +13 -0
  39. package/dist/gateways/stdioToWs.d.ts.map +1 -0
  40. package/dist/gateways/stdioToWs.js +115 -0
  41. package/dist/gateways/stdioToWs.js.map +1 -0
  42. package/dist/gateways/streamableHttpToSse.d.ts +16 -0
  43. package/dist/gateways/streamableHttpToSse.d.ts.map +1 -0
  44. package/dist/gateways/streamableHttpToSse.js +219 -0
  45. package/dist/gateways/streamableHttpToSse.js.map +1 -0
  46. package/dist/gateways/streamableHttpToStdio.d.ts +8 -0
  47. package/dist/gateways/streamableHttpToStdio.d.ts.map +1 -0
  48. package/dist/gateways/streamableHttpToStdio.js +124 -0
  49. package/dist/gateways/streamableHttpToStdio.js.map +1 -0
  50. package/dist/index.d.ts +46 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +424 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/lib/config.d.ts +78 -0
  55. package/dist/lib/config.d.ts.map +1 -0
  56. package/dist/lib/config.js +59 -0
  57. package/dist/lib/config.js.map +1 -0
  58. package/dist/lib/corsOrigin.d.ts +6 -0
  59. package/dist/lib/corsOrigin.d.ts.map +1 -0
  60. package/dist/lib/corsOrigin.js +24 -0
  61. package/dist/lib/corsOrigin.js.map +1 -0
  62. package/dist/lib/getLogger.d.ts +6 -0
  63. package/dist/lib/getLogger.d.ts.map +1 -0
  64. package/dist/lib/getLogger.js +55 -0
  65. package/dist/lib/getLogger.js.map +1 -0
  66. package/dist/lib/getVersion.d.ts +2 -0
  67. package/dist/lib/getVersion.d.ts.map +1 -0
  68. package/dist/lib/getVersion.js +17 -0
  69. package/dist/lib/getVersion.js.map +1 -0
  70. package/dist/lib/headers.d.ts +9 -0
  71. package/dist/lib/headers.d.ts.map +1 -0
  72. package/dist/lib/headers.js +32 -0
  73. package/dist/lib/headers.js.map +1 -0
  74. package/dist/lib/mcpServerManager.d.ts +24 -0
  75. package/dist/lib/mcpServerManager.d.ts.map +1 -0
  76. package/dist/lib/mcpServerManager.js +347 -0
  77. package/dist/lib/mcpServerManager.js.map +1 -0
  78. package/dist/lib/onSignals.d.ts +14 -0
  79. package/dist/lib/onSignals.d.ts.map +1 -0
  80. package/dist/lib/onSignals.js +28 -0
  81. package/dist/lib/onSignals.js.map +1 -0
  82. package/dist/lib/serializeCorsOrigin.d.ts +5 -0
  83. package/dist/lib/serializeCorsOrigin.d.ts.map +1 -0
  84. package/dist/lib/serializeCorsOrigin.js +7 -0
  85. package/dist/lib/serializeCorsOrigin.js.map +1 -0
  86. package/dist/lib/sessionAccessCounter.d.ts +12 -0
  87. package/dist/lib/sessionAccessCounter.d.ts.map +1 -0
  88. package/dist/lib/sessionAccessCounter.js +78 -0
  89. package/dist/lib/sessionAccessCounter.js.map +1 -0
  90. package/dist/server/websocket.d.ts +22 -0
  91. package/dist/server/websocket.d.ts.map +1 -0
  92. package/dist/server/websocket.js +103 -0
  93. package/dist/server/websocket.js.map +1 -0
  94. package/dist/types.d.ts +7 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +2 -0
  97. package/dist/types.js.map +1 -0
  98. package/package.json +95 -0
@@ -0,0 +1,55 @@
1
+ import util from 'node:util';
2
+ const defaultFormatArgs = (args) => args;
3
+ const log = ({ formatArgs = defaultFormatArgs, } = { formatArgs: defaultFormatArgs }) => (...args) => console.log('[mcp-nyx]', ...formatArgs(args));
4
+ const logStderr = ({ formatArgs = defaultFormatArgs, } = { formatArgs: defaultFormatArgs }) => (...args) => console.error('[mcp-nyx]', ...formatArgs(args));
5
+ const noneLogger = {
6
+ info: () => { },
7
+ error: () => { },
8
+ debug: () => { },
9
+ warn: () => { },
10
+ };
11
+ const infoLogger = {
12
+ info: log(),
13
+ error: logStderr(),
14
+ debug: () => { },
15
+ warn: logStderr(),
16
+ };
17
+ const infoLoggerStdio = {
18
+ info: logStderr(),
19
+ error: logStderr(),
20
+ debug: () => { },
21
+ warn: logStderr(),
22
+ };
23
+ const debugFormatArgs = (args) => args.map((arg) => {
24
+ if (typeof arg === 'object') {
25
+ return util.inspect(arg, {
26
+ depth: null,
27
+ colors: process.stderr.isTTY,
28
+ compact: false,
29
+ });
30
+ }
31
+ return arg;
32
+ });
33
+ const debugLogger = {
34
+ info: log({ formatArgs: debugFormatArgs }),
35
+ error: logStderr({ formatArgs: debugFormatArgs }),
36
+ debug: log({ formatArgs: debugFormatArgs }),
37
+ warn: logStderr({ formatArgs: debugFormatArgs }),
38
+ };
39
+ const debugLoggerStdio = {
40
+ info: logStderr({ formatArgs: debugFormatArgs }),
41
+ error: logStderr({ formatArgs: debugFormatArgs }),
42
+ debug: logStderr({ formatArgs: debugFormatArgs }),
43
+ warn: logStderr({ formatArgs: debugFormatArgs }),
44
+ };
45
+ export const getLogger = ({ logLevel, outputTransport }) => {
46
+ if (logLevel === 'none') {
47
+ return noneLogger;
48
+ }
49
+ if (logLevel === 'debug') {
50
+ return outputTransport === 'stdio' ? debugLoggerStdio : debugLogger;
51
+ }
52
+ // info logLevel
53
+ return outputTransport === 'stdio' ? infoLoggerStdio : infoLogger;
54
+ };
55
+ //# sourceMappingURL=getLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLogger.js","sourceRoot":"","sources":["../../src/lib/getLogger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getVersion(): string;
2
+ //# sourceMappingURL=getVersion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getVersion.d.ts","sourceRoot":"","sources":["../../src/lib/getVersion.ts"],"names":[],"mappings":"AAOA,wBAAgB,UAAU,IAAI,MAAM,CASnC"}
@@ -0,0 +1,17 @@
1
+ import { fileURLToPath } from 'url';
2
+ import { join, dirname } from 'path';
3
+ import { readFileSync } from 'fs';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ export function getVersion() {
7
+ try {
8
+ const packageJsonPath = join(__dirname, '../../package.json');
9
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
10
+ return packageJson.version || '1.0.0';
11
+ }
12
+ catch (err) {
13
+ console.error('[mcp-nyx]', 'Unable to retrieve version:', err);
14
+ return 'unknown';
15
+ }
16
+ }
17
+ //# sourceMappingURL=getVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getVersion.js","sourceRoot":"","sources":["../../src/lib/getVersion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,OAAO,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Logger } from '../types.js';
2
+ export declare const headers: ({ argv, logger, }: {
3
+ argv: {
4
+ header: (string | number)[];
5
+ oauth2Bearer: string | undefined;
6
+ };
7
+ logger: Logger;
8
+ }) => Record<string, string>;
9
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/lib/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AA+BrC,eAAO,MAAM,OAAO,GAAI,mBAGrB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;KAClC,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAcxB,CAAC"}
@@ -0,0 +1,32 @@
1
+ const parseHeaders = ({ argvHeader, logger, }) => {
2
+ return argvHeader.reduce((acc, rawHeader) => {
3
+ const header = `${rawHeader}`;
4
+ const colonIndex = header.indexOf(':');
5
+ if (colonIndex === -1) {
6
+ logger.error(`Invalid header format: ${header}, ignoring`);
7
+ return acc;
8
+ }
9
+ const key = header.slice(0, colonIndex).trim();
10
+ const value = header.slice(colonIndex + 1).trim();
11
+ if (!key || !value) {
12
+ logger.error(`Invalid header format: ${header}, ignoring`);
13
+ return acc;
14
+ }
15
+ acc[key] = value;
16
+ return acc;
17
+ }, {});
18
+ };
19
+ export const headers = ({ argv, logger, }) => {
20
+ const headers = parseHeaders({
21
+ argvHeader: argv.header,
22
+ logger,
23
+ });
24
+ if ('oauth2Bearer' in argv) {
25
+ return {
26
+ ...headers,
27
+ Authorization: `Bearer ${argv.oauth2Bearer}`,
28
+ };
29
+ }
30
+ return headers;
31
+ };
32
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/lib/headers.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,CAAC,EACpB,UAAU,EACV,MAAM,GAIP,EAA0B,EAAE;IAC3B,OAAO,UAAU,CAAC,MAAM,CAAyB,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;QAClE,MAAM,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,YAAY,CAAC,CAAC;YAC3D,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAElD,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,YAAY,CAAC,CAAC;YAC3D,OAAO,GAAG,CAAC;QACb,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EACtB,IAAI,EACJ,MAAM,GAOP,EAA0B,EAAE;IAC3B,MAAM,OAAO,GAAG,YAAY,CAAC;QAC3B,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,MAAM;KACP,CAAC,CAAC;IAEH,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;QAC3B,OAAO;YACL,GAAG,OAAO;YACV,aAAa,EAAE,UAAU,IAAI,CAAC,YAAY,EAAE;SAC7C,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ChildProcessWithoutNullStreams } from 'child_process';
2
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import type { JSONRPCRequest, JSONRPCResponse, Tool, Resource } from '@modelcontextprotocol/sdk/types.js';
4
+ import { McpServerConfig } from './config.js';
5
+ import { Logger } from '../types.js';
6
+ export interface ManagedServer {
7
+ name: string;
8
+ config: McpServerConfig;
9
+ client: Client;
10
+ tools: Tool[];
11
+ resources: Resource[];
12
+ connected: boolean;
13
+ child?: ChildProcessWithoutNullStreams;
14
+ }
15
+ export declare class McpServerManager {
16
+ private servers;
17
+ private logger;
18
+ constructor(logger: Logger);
19
+ addServer(name: string, config: McpServerConfig): Promise<void>;
20
+ handleRequest(request: JSONRPCRequest): Promise<JSONRPCResponse>;
21
+ getServers(): Map<string, ManagedServer>;
22
+ cleanup(): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=mcpServerManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpServerManager.d.ts","sourceRoot":"","sources":["../../src/lib/mcpServerManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,8BAA8B,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,IAAI,EACJ,QAAQ,EAGT,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,8BAA8B,CAAC;CACxC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoI/D,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IA4NtE,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;IAIlC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAa/B"}
@@ -0,0 +1,347 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
4
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
5
+ import { z } from 'zod';
6
+ import { detectServerType } from './config.js';
7
+ import { getVersion } from './getVersion.js';
8
+ export class McpServerManager {
9
+ servers = new Map();
10
+ logger;
11
+ constructor(logger) {
12
+ this.logger = logger;
13
+ }
14
+ async addServer(name, config) {
15
+ const serverType = detectServerType(config);
16
+ const client = new Client({
17
+ name: 'mcp-nyx',
18
+ version: getVersion(),
19
+ }, {
20
+ capabilities: {},
21
+ });
22
+ let transport;
23
+ let child;
24
+ if (serverType === 'stdio') {
25
+ if (!config.command) {
26
+ throw new Error(`Stdio server ${name} missing command`);
27
+ }
28
+ const args = config.args || [];
29
+ this.logger.info(`Starting server ${name}: ${config.command} ${args.join(' ')}`);
30
+ this.logger.debug(`Command: "${config.command}", Args: [${args.map((a) => `"${a}"`).join(', ')}]`);
31
+ this.logger.debug(`Creating StdioClientTransport for ${name}`);
32
+ try {
33
+ // Use command and args to create the transport, similar to test files
34
+ // StdioClientTransport will handle spawning the process internally
35
+ transport = new StdioClientTransport({
36
+ command: config.command,
37
+ args: args,
38
+ env: config.env ? { ...process.env, ...config.env } : process.env,
39
+ });
40
+ this.logger.debug(`StdioClientTransport created for ${name}`);
41
+ }
42
+ catch (transportErr) {
43
+ this.logger.error(`Failed to create StdioClientTransport for ${name}:`, transportErr);
44
+ throw transportErr;
45
+ }
46
+ }
47
+ else if (serverType === 'sse') {
48
+ if (!config.url) {
49
+ throw new Error(`HTTP server ${name} missing URL`);
50
+ }
51
+ const url = new URL(config.url);
52
+ if (url.pathname.endsWith('/sse') || url.pathname.includes('/sse')) {
53
+ const headers = config.headers || {};
54
+ this.logger.info(`Connecting to SSE server ${name} with headers: ${Object.keys(headers).length ? JSON.stringify(headers) : '(none)'}`);
55
+ transport = new SSEClientTransport(url, {
56
+ eventSourceInit: {
57
+ fetch: (...props) => {
58
+ const [url, init = {}] = props;
59
+ return fetch(url, {
60
+ ...init,
61
+ headers: { ...init.headers, ...headers },
62
+ });
63
+ },
64
+ },
65
+ requestInit: {
66
+ headers,
67
+ },
68
+ });
69
+ }
70
+ else {
71
+ throw new Error(`HTTP server ${name} URL must be an SSE endpoint (path should end with /sse)`);
72
+ }
73
+ }
74
+ else if (serverType === 'streamable-http') {
75
+ if (!config.url) {
76
+ throw new Error(`Streamable HTTP server ${name} missing URL`);
77
+ }
78
+ const headers = config.headers || {};
79
+ this.logger.info(`Connecting to streamable HTTP server ${name}: ${config.url}`);
80
+ this.logger.info(`With headers: ${Object.keys(headers).length ? JSON.stringify(headers) : '(none)'}`);
81
+ const url = new URL(config.url);
82
+ transport = new StreamableHTTPClientTransport(url, {
83
+ requestInit: {
84
+ headers,
85
+ },
86
+ });
87
+ }
88
+ else {
89
+ throw new Error(`Unsupported server type: ${serverType}`);
90
+ }
91
+ try {
92
+ this.logger.debug(`Attempting to connect client to transport for ${name}`);
93
+ await client.connect(transport);
94
+ this.logger.info(`Connected to server: ${name}`);
95
+ const server = {
96
+ name,
97
+ config,
98
+ client,
99
+ tools: [],
100
+ resources: [],
101
+ connected: true,
102
+ child: child || undefined,
103
+ };
104
+ try {
105
+ const toolsResponse = (await client.request({ method: 'tools/list', params: {} }, z.object({ tools: z.array(z.any()) })));
106
+ server.tools = toolsResponse.tools || [];
107
+ this.logger.info(`Server ${name} has ${server.tools.length} tools`);
108
+ }
109
+ catch (err) {
110
+ this.logger.warn(`Server ${name} does not support tools: ${err}`);
111
+ }
112
+ try {
113
+ const resourcesResponse = (await client.request({ method: 'resources/list', params: {} }, z.object({ resources: z.array(z.any()) })));
114
+ server.resources = resourcesResponse.resources || [];
115
+ this.logger.info(`Server ${name} has ${server.resources.length} resources`);
116
+ }
117
+ catch (err) {
118
+ this.logger.debug(`Server ${name} does not support resources: ${err}`);
119
+ }
120
+ this.servers.set(name, server);
121
+ }
122
+ catch (err) {
123
+ if (child) {
124
+ child.kill();
125
+ }
126
+ throw new Error(`Failed to connect to server ${name}: ${err}`);
127
+ }
128
+ }
129
+ async handleRequest(request) {
130
+ const { method, params, id } = request;
131
+ if (method === 'initialize') {
132
+ return {
133
+ jsonrpc: '2.0',
134
+ id,
135
+ result: {
136
+ protocolVersion: '2024-11-05',
137
+ capabilities: {
138
+ tools: {},
139
+ resources: {},
140
+ },
141
+ serverInfo: {
142
+ name: 'mcp-nyx-unified',
143
+ version: getVersion(),
144
+ },
145
+ },
146
+ };
147
+ }
148
+ if (method === 'tools/list') {
149
+ const allTools = [];
150
+ for (const [serverName, server] of this.servers) {
151
+ if (server.connected) {
152
+ for (const tool of server.tools) {
153
+ allTools.push({
154
+ ...tool,
155
+ name: `${serverName}.${tool.name}`,
156
+ });
157
+ }
158
+ }
159
+ }
160
+ return {
161
+ jsonrpc: '2.0',
162
+ id,
163
+ result: { tools: allTools },
164
+ };
165
+ }
166
+ if (method === 'resources/list') {
167
+ const allResources = [];
168
+ for (const [serverName, server] of this.servers) {
169
+ if (server.connected) {
170
+ for (const resource of server.resources) {
171
+ allResources.push({
172
+ ...resource,
173
+ name: `${serverName}.${resource.name}`,
174
+ uri: `${serverName}://${resource.uri}`,
175
+ });
176
+ }
177
+ }
178
+ }
179
+ return {
180
+ jsonrpc: '2.0',
181
+ id,
182
+ result: { resources: allResources },
183
+ };
184
+ }
185
+ if (method === 'tools/call') {
186
+ const toolName = params?.name;
187
+ if (!toolName) {
188
+ return {
189
+ jsonrpc: '2.0',
190
+ id,
191
+ error: {
192
+ code: -32602,
193
+ message: 'Tool name is required',
194
+ },
195
+ };
196
+ }
197
+ let serverName;
198
+ let originalToolName;
199
+ if (toolName.includes('.')) {
200
+ // Tool name includes server prefix
201
+ [serverName, originalToolName] = toolName.split('.', 2);
202
+ }
203
+ else {
204
+ // No server prefix, find which server has this tool
205
+ let foundServer = null;
206
+ for (const [sName, server] of this.servers) {
207
+ if (server.connected && server.tools.some((tool) => tool.name === toolName)) {
208
+ if (foundServer) {
209
+ // Tool exists in multiple servers, require explicit server name
210
+ return {
211
+ jsonrpc: '2.0',
212
+ id,
213
+ error: {
214
+ code: -32602,
215
+ message: `Tool '${toolName}' exists in multiple servers (${foundServer}, ${sName}). Use format: servername.toolname`,
216
+ },
217
+ };
218
+ }
219
+ foundServer = sName;
220
+ }
221
+ }
222
+ if (!foundServer) {
223
+ return {
224
+ jsonrpc: '2.0',
225
+ id,
226
+ error: {
227
+ code: -32601,
228
+ message: `Tool '${toolName}' not found in any connected server`,
229
+ },
230
+ };
231
+ }
232
+ serverName = foundServer;
233
+ originalToolName = toolName;
234
+ }
235
+ const server = this.servers.get(serverName);
236
+ if (!server || !server.connected) {
237
+ return {
238
+ jsonrpc: '2.0',
239
+ id,
240
+ error: {
241
+ code: -32601,
242
+ message: `Server ${serverName} not found or not connected`,
243
+ },
244
+ };
245
+ }
246
+ try {
247
+ const response = await server.client.request({
248
+ method: 'tools/call',
249
+ params: {
250
+ ...params,
251
+ name: originalToolName,
252
+ },
253
+ }, z.any());
254
+ return {
255
+ jsonrpc: '2.0',
256
+ id,
257
+ result: response,
258
+ };
259
+ }
260
+ catch (err) {
261
+ return {
262
+ jsonrpc: '2.0',
263
+ id,
264
+ error: {
265
+ code: err.code || -32000,
266
+ message: err.message || 'Tool call failed',
267
+ },
268
+ };
269
+ }
270
+ }
271
+ if (method === 'resources/read') {
272
+ const uri = params?.uri;
273
+ if (!uri || !uri.includes('://')) {
274
+ return {
275
+ jsonrpc: '2.0',
276
+ id,
277
+ error: {
278
+ code: -32602,
279
+ message: 'Invalid resource URI. Expected format: servername://resource-uri',
280
+ },
281
+ };
282
+ }
283
+ const [serverName, originalUri] = uri.split('://', 2);
284
+ const server = this.servers.get(serverName);
285
+ if (!server || !server.connected) {
286
+ return {
287
+ jsonrpc: '2.0',
288
+ id,
289
+ error: {
290
+ code: -32601,
291
+ message: `Server ${serverName} not found or not connected`,
292
+ },
293
+ };
294
+ }
295
+ try {
296
+ const response = await server.client.request({
297
+ method: 'resources/read',
298
+ params: {
299
+ ...params,
300
+ uri: originalUri,
301
+ },
302
+ }, z.any());
303
+ return {
304
+ jsonrpc: '2.0',
305
+ id,
306
+ result: response,
307
+ };
308
+ }
309
+ catch (err) {
310
+ return {
311
+ jsonrpc: '2.0',
312
+ id,
313
+ error: {
314
+ code: err.code || -32000,
315
+ message: err.message || 'Resource read failed',
316
+ },
317
+ };
318
+ }
319
+ }
320
+ return {
321
+ jsonrpc: '2.0',
322
+ id,
323
+ error: {
324
+ code: -32601,
325
+ message: `Method not found: ${method}`,
326
+ },
327
+ };
328
+ }
329
+ getServers() {
330
+ return this.servers;
331
+ }
332
+ async cleanup() {
333
+ for (const [name, server] of this.servers) {
334
+ try {
335
+ if (server.child) {
336
+ server.child.kill();
337
+ }
338
+ this.logger.info(`Cleaned up server: ${name}`);
339
+ }
340
+ catch (err) {
341
+ this.logger.error(`Error cleaning up server ${name}: ${err}`);
342
+ }
343
+ }
344
+ this.servers.clear();
345
+ }
346
+ }
347
+ //# sourceMappingURL=mcpServerManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpServerManager.js","sourceRoot":"","sources":["../../src/lib/mcpServerManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AASnG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAa7C,MAAM,OAAO,gBAAgB;IACnB,OAAO,GAA+B,IAAI,GAAG,EAAE,CAAC;IAChD,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,MAAuB;QACnD,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;YACE,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,UAAU,EAAE;SACtB,EACD;YACE,YAAY,EAAE,EAAE;SACjB,CACF,CAAC;QAEF,IAAI,SAAS,CAAC;QACd,IAAI,KAAiD,CAAC;QAEtD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,kBAAkB,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAE/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,KAAK,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,OAAO,aAAa,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEnG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;YAE/D,IAAI,CAAC;gBACH,sEAAsE;gBACtE,mEAAmE;gBACnE,SAAS,GAAG,IAAI,oBAAoB,CAAC;oBACnC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,IAAI;oBACV,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;iBAC3D,CAAC,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,IAAI,GAAG,EAAE,YAAY,CAAC,CAAC;gBACtF,MAAM,YAAY,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,cAAc,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,4BAA4B,IAAI,kBAAkB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CACrH,CAAC;gBACF,SAAS,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE;oBACtC,eAAe,EAAE;wBACf,KAAK,EAAE,CAAC,GAAG,KAA+B,EAAE,EAAE;4BAC5C,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;4BAC/B,OAAO,KAAK,CAAC,GAAG,EAAE;gCAChB,GAAG,IAAI;gCACP,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE;6BACzC,CAAC,CAAC;wBACL,CAAC;qBACF;oBACD,WAAW,EAAE;wBACX,OAAO;qBACR;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,0DAA0D,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,KAAK,iBAAiB,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,cAAc,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YAChF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,SAAS,GAAG,IAAI,6BAA6B,CAAC,GAAG,EAAE;gBACjD,WAAW,EAAE;oBACX,OAAO;iBACR;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;YAC3E,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;YAEjD,MAAM,MAAM,GAAkB;gBAC5B,IAAI;gBACJ,MAAM;gBACN,MAAM;gBACN,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,KAAK,IAAI,SAAS;aAC1B,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CACzC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,EACpC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CACtC,CAAoB,CAAC;gBACtB,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,4BAA4B,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,iBAAiB,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAC7C,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,EACxC,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAC1C,CAAwB,CAAC;gBAC1B,MAAM,CAAC,SAAS,GAAG,iBAAiB,CAAC,SAAS,IAAI,EAAE,CAAC;gBACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ,MAAM,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC;YAC9E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,gCAAgC,GAAG,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAuB;QACzC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;QAEvC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,EAAE;gBACF,MAAM,EAAE;oBACN,eAAe,EAAE,YAAY;oBAC7B,YAAY,EAAE;wBACZ,KAAK,EAAE,EAAE;wBACT,SAAS,EAAE,EAAE;qBACd;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,iBAAiB;wBACvB,OAAO,EAAE,UAAU,EAAE;qBACtB;iBACF;aACF,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAW,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBAChC,QAAQ,CAAC,IAAI,CAAC;4BACZ,GAAG,IAAI;4BACP,IAAI,EAAE,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE;yBACnC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,EAAE;gBACF,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;aAC5B,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAChC,MAAM,YAAY,GAAe,EAAE,CAAC;YACpC,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACxC,YAAY,CAAC,IAAI,CAAC;4BAChB,GAAG,QAAQ;4BACX,IAAI,EAAE,GAAG,UAAU,IAAI,QAAQ,CAAC,IAAI,EAAE;4BACtC,GAAG,EAAE,GAAG,UAAU,MAAM,QAAQ,CAAC,GAAG,EAAE;yBACvC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,EAAE;gBACF,MAAM,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;aACpC,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,EAAE,IAAc,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,uBAAuB;qBACjC;iBACK,CAAC;YACX,CAAC;YAED,IAAI,UAAkB,CAAC;YACvB,IAAI,gBAAwB,CAAC;YAE7B,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,mCAAmC;gBACnC,CAAC,UAAU,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,oDAAoD;gBACpD,IAAI,WAAW,GAAkB,IAAI,CAAC;gBACtC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC3C,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;wBAC5E,IAAI,WAAW,EAAE,CAAC;4BAChB,gEAAgE;4BAChE,OAAO;gCACL,OAAO,EAAE,KAAK;gCACd,EAAE;gCACF,KAAK,EAAE;oCACL,IAAI,EAAE,CAAC,KAAK;oCACZ,OAAO,EAAE,SAAS,QAAQ,iCAAiC,WAAW,KAAK,KAAK,oCAAoC;iCACrH;6BACK,CAAC;wBACX,CAAC;wBACD,WAAW,GAAG,KAAK,CAAC;oBACtB,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,EAAE;wBACF,KAAK,EAAE;4BACL,IAAI,EAAE,CAAC,KAAK;4BACZ,OAAO,EAAE,SAAS,QAAQ,qCAAqC;yBAChE;qBACK,CAAC;gBACX,CAAC;gBAED,UAAU,GAAG,WAAW,CAAC;gBACzB,gBAAgB,GAAG,QAAQ,CAAC;YAC9B,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE5C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACjC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,UAAU,UAAU,6BAA6B;qBAC3D;iBACK,CAAC;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC1C;oBACE,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE;wBACN,GAAG,MAAM;wBACT,IAAI,EAAE,gBAAgB;qBACvB;iBACF,EACD,CAAC,CAAC,GAAG,EAAE,CACR,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,MAAM,EAAE,QAAQ;iBACjB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,KAAK,EAAE;wBACL,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK;wBACxB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,kBAAkB;qBAC3C;iBACK,CAAC;YACX,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,MAAM,EAAE,GAAa,CAAC;YAClC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,kEAAkE;qBAC5E;iBACK,CAAC;YACX,CAAC;YAED,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE5C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACjC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,UAAU,UAAU,6BAA6B;qBAC3D;iBACK,CAAC;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC1C;oBACE,MAAM,EAAE,gBAAgB;oBACxB,MAAM,EAAE;wBACN,GAAG,MAAM;wBACT,GAAG,EAAE,WAAW;qBACjB;iBACF,EACD,CAAC,CAAC,GAAG,EAAE,CACR,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,MAAM,EAAE,QAAQ;iBACjB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,KAAK,EAAE;wBACL,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK;wBACxB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,sBAAsB;qBAC/C;iBACK,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,EAAE;YACF,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK;gBACZ,OAAO,EAAE,qBAAqB,MAAM,EAAE;aACvC;SACK,CAAC;IACX,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACtB,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { Logger } from '../types.js';
2
+ export interface OnSignalsOptions {
3
+ logger: Logger;
4
+ cleanup?: () => void;
5
+ }
6
+ /**
7
+ * Sets up signal handlers for graceful shutdown.
8
+ *
9
+ * @param options Configuration options
10
+ * @param options.logger Logger instance
11
+ * @param options.cleanup Optional cleanup function to be called before exit
12
+ */
13
+ export declare function onSignals(options: OnSignalsOptions): void;
14
+ //# sourceMappingURL=onSignals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onSignals.d.ts","sourceRoot":"","sources":["../../src/lib/onSignals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAwBzD"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Sets up signal handlers for graceful shutdown.
3
+ *
4
+ * @param options Configuration options
5
+ * @param options.logger Logger instance
6
+ * @param options.cleanup Optional cleanup function to be called before exit
7
+ */
8
+ export function onSignals(options) {
9
+ const { logger, cleanup } = options;
10
+ const handleSignal = (signal) => {
11
+ logger.info(`Caught ${signal}. Exiting...`);
12
+ if (cleanup) {
13
+ cleanup();
14
+ }
15
+ process.exit(0);
16
+ };
17
+ process.on('SIGINT', () => handleSignal('SIGINT'));
18
+ process.on('SIGTERM', () => handleSignal('SIGTERM'));
19
+ process.on('SIGHUP', () => handleSignal('SIGHUP'));
20
+ process.stdin.on('close', () => {
21
+ logger.info('stdin closed. Exiting...');
22
+ if (cleanup) {
23
+ cleanup();
24
+ }
25
+ process.exit(0);
26
+ });
27
+ }
28
+ //# sourceMappingURL=onSignals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onSignals.js","sourceRoot":"","sources":["../../src/lib/onSignals.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEpC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,EAAE;QACtC,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,cAAc,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEnD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IAErD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEnD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CorsOptions } from 'cors';
2
+ export declare const serializeCorsOrigin: ({ corsOrigin }: {
3
+ corsOrigin: CorsOptions["origin"];
4
+ }) => string;
5
+ //# sourceMappingURL=serializeCorsOrigin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializeCorsOrigin.d.ts","sourceRoot":"","sources":["../../src/lib/serializeCorsOrigin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAExC,eAAO,MAAM,mBAAmB,GAAI,gBAAgB;IAAE,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;CAAE,WAOrF,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const serializeCorsOrigin = ({ corsOrigin }) => JSON.stringify(corsOrigin, (_key, value) => {
2
+ if (value instanceof RegExp) {
3
+ return value.toString();
4
+ }
5
+ return value;
6
+ });
7
+ //# sourceMappingURL=serializeCorsOrigin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializeCorsOrigin.js","sourceRoot":"","sources":["../../src/lib/serializeCorsOrigin.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,UAAU,EAAyC,EAAE,EAAE,CAC3F,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IACzC,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Logger } from '../types.js';
2
+ export declare class SessionAccessCounter {
3
+ timeout: number;
4
+ cleanup: (sessionId: string) => unknown;
5
+ logger: Logger;
6
+ private sessions;
7
+ constructor(timeout: number, cleanup: (sessionId: string) => unknown, logger: Logger);
8
+ inc(sessionId: string, reason: string): void;
9
+ dec(sessionId: string, reason: string): void;
10
+ clear(sessionId: string, runCleanup: boolean, reason: string): void;
11
+ }
12
+ //# sourceMappingURL=sessionAccessCounter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionAccessCounter.d.ts","sourceRoot":"","sources":["../../src/lib/sessionAccessCounter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,qBAAa,oBAAoB;IAItB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO;IACvC,MAAM,EAAE,MAAM;IALvB,OAAO,CAAC,QAAQ,CAAiF;gBAGxF,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,EACvC,MAAM,EAAE,MAAM;IAGvB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAwBrC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAmCrC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;CAsB7D"}