@loop_ouroboros/mcp-hub-lite 1.0.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.
- package/CHANGELOG.md +228 -0
- package/LICENSE +21 -0
- package/README.md +354 -0
- package/dist/client/assets/HomeView-f901HeKw.js +1 -0
- package/dist/client/assets/ResourceDetailView-BdOaL_-o.css +1 -0
- package/dist/client/assets/ResourceDetailView-Bz66ZjfY.js +1 -0
- package/dist/client/assets/ResourcesView-CjMklkyv.css +1 -0
- package/dist/client/assets/ResourcesView-lI_fItfA.js +1 -0
- package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +1 -0
- package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +2 -0
- package/dist/client/assets/ServerListView-Bws09jNR.css +1 -0
- package/dist/client/assets/ServerListView-CP6Ffkfx.js +30 -0
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +1 -0
- package/dist/client/assets/SessionsView-D68qKR4D.js +1 -0
- package/dist/client/assets/SettingsView-BPYfO9BE.js +1 -0
- package/dist/client/assets/ToolCallDialog-Br8FNebN.js +1 -0
- package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +1 -0
- package/dist/client/assets/ToolsView-B6hUiR43.js +1 -0
- package/dist/client/assets/ToolsView-BLnU8cV6.css +1 -0
- package/dist/client/assets/_baseClone-DCmK847M.js +1 -0
- package/dist/client/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
- package/dist/client/assets/el-form-item-BVMLpmVC.css +1 -0
- package/dist/client/assets/el-form-item-DM0q2hmO.js +12 -0
- package/dist/client/assets/el-input-BtI9NECe.js +1 -0
- package/dist/client/assets/el-input-CmuHb8HS.css +1 -0
- package/dist/client/assets/el-loading-CChNmKeI.js +1 -0
- package/dist/client/assets/el-loading-bpKhqqQq.css +1 -0
- package/dist/client/assets/el-overlay-B2ZKM6Up.css +1 -0
- package/dist/client/assets/el-overlay-lZZbPmsX.js +1 -0
- package/dist/client/assets/el-select-BXztu2b5.js +1 -0
- package/dist/client/assets/el-select-C0U_l4IZ.css +1 -0
- package/dist/client/assets/el-tab-pane-CnNoQHsR.css +1 -0
- package/dist/client/assets/el-tab-pane-Dy9ruaEX.js +1 -0
- package/dist/client/assets/el-table-column-98UyVgBH.js +1 -0
- package/dist/client/assets/el-table-column-T_mV9jNw.css +1 -0
- package/dist/client/assets/el-tag-B5lLT51E.js +1 -0
- package/dist/client/assets/el-tag-DjxZVOpb.css +1 -0
- package/dist/client/assets/event-BB_Ol6Sd.js +1 -0
- package/dist/client/assets/index-BgKcmWJr.js +1 -0
- package/dist/client/assets/index-BsDWtoIl.css +1 -0
- package/dist/client/assets/index-BzQXG7no.js +1 -0
- package/dist/client/assets/index-CSTs2jYk.js +2 -0
- package/dist/client/assets/omit-Bx5HJNV_.js +1 -0
- package/dist/client/assets/raf-B9VDMtMF.js +1 -0
- package/dist/client/assets/typescript-Bp3YSIOJ.js +1 -0
- package/dist/client/assets/vnode-B8aJx8u4.js +1 -0
- package/dist/client/assets/vue-vendor-6ny5zj9i.js +3 -0
- package/dist/client/index.html +15 -0
- package/dist/server/shared/index.d.ts +3 -0
- package/dist/server/shared/index.d.ts.map +1 -0
- package/dist/server/shared/index.js +2 -0
- package/dist/server/shared/models/index.d.ts +4 -0
- package/dist/server/shared/models/index.d.ts.map +1 -0
- package/dist/server/shared/models/index.js +3 -0
- package/dist/server/shared/models/resource.model.d.ts +8 -0
- package/dist/server/shared/models/resource.model.d.ts.map +1 -0
- package/dist/server/shared/models/resource.model.js +1 -0
- package/dist/server/shared/models/server.model.d.ts +57 -0
- package/dist/server/shared/models/server.model.d.ts.map +1 -0
- package/dist/server/shared/models/server.model.js +1 -0
- package/dist/server/shared/models/session.model.d.ts +73 -0
- package/dist/server/shared/models/session.model.d.ts.map +1 -0
- package/dist/server/shared/models/session.model.js +70 -0
- package/dist/server/shared/models/tool.model.d.ts +22 -0
- package/dist/server/shared/models/tool.model.d.ts.map +1 -0
- package/dist/server/shared/models/tool.model.js +1 -0
- package/dist/server/shared/types/client.types.d.ts +35 -0
- package/dist/server/shared/types/client.types.d.ts.map +1 -0
- package/dist/server/shared/types/client.types.js +5 -0
- package/dist/server/shared/types/common.types.d.ts +5 -0
- package/dist/server/shared/types/common.types.d.ts.map +1 -0
- package/dist/server/shared/types/common.types.js +2 -0
- package/dist/server/shared/types/index.d.ts +4 -0
- package/dist/server/shared/types/index.d.ts.map +1 -0
- package/dist/server/shared/types/index.js +3 -0
- package/dist/server/shared/types/session.types.d.ts +15 -0
- package/dist/server/shared/types/session.types.d.ts.map +1 -0
- package/dist/server/shared/types/session.types.js +5 -0
- package/dist/server/shared/types/websocket.types.d.ts +177 -0
- package/dist/server/shared/types/websocket.types.d.ts.map +1 -0
- package/dist/server/shared/types/websocket.types.js +25 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts +13 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.js +271 -0
- package/dist/server/src/api/mcp/gateway.d.ts +14 -0
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -0
- package/dist/server/src/api/mcp/gateway.js +116 -0
- package/dist/server/src/api/mcp/session-context-extractor.d.ts +47 -0
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -0
- package/dist/server/src/api/mcp/session-context-extractor.js +127 -0
- package/dist/server/src/api/mcp/sse-stream-manager.d.ts +13 -0
- package/dist/server/src/api/mcp/sse-stream-manager.d.ts.map +1 -0
- package/dist/server/src/api/mcp/sse-stream-manager.js +40 -0
- package/dist/server/src/api/web/clients.d.ts +30 -0
- package/dist/server/src/api/web/clients.d.ts.map +1 -0
- package/dist/server/src/api/web/clients.js +41 -0
- package/dist/server/src/api/web/config.d.ts +21 -0
- package/dist/server/src/api/web/config.d.ts.map +1 -0
- package/dist/server/src/api/web/config.js +119 -0
- package/dist/server/src/api/web/health.d.ts +21 -0
- package/dist/server/src/api/web/health.d.ts.map +1 -0
- package/dist/server/src/api/web/health.js +24 -0
- package/dist/server/src/api/web/hub-tools.d.ts +30 -0
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -0
- package/dist/server/src/api/web/hub-tools.js +202 -0
- package/dist/server/src/api/web/logs.d.ts +30 -0
- package/dist/server/src/api/web/logs.d.ts.map +1 -0
- package/dist/server/src/api/web/logs.js +141 -0
- package/dist/server/src/api/web/mcp-status.d.ts +29 -0
- package/dist/server/src/api/web/mcp-status.d.ts.map +1 -0
- package/dist/server/src/api/web/mcp-status.js +126 -0
- package/dist/server/src/api/web/resources.d.ts +28 -0
- package/dist/server/src/api/web/resources.d.ts.map +1 -0
- package/dist/server/src/api/web/resources.js +93 -0
- package/dist/server/src/api/web/search.d.ts +26 -0
- package/dist/server/src/api/web/search.d.ts.map +1 -0
- package/dist/server/src/api/web/search.js +62 -0
- package/dist/server/src/api/web/servers.d.ts +33 -0
- package/dist/server/src/api/web/servers.d.ts.map +1 -0
- package/dist/server/src/api/web/servers.js +235 -0
- package/dist/server/src/api/web/sessions.d.ts +29 -0
- package/dist/server/src/api/web/sessions.d.ts.map +1 -0
- package/dist/server/src/api/web/sessions.js +104 -0
- package/dist/server/src/api/ws/events.d.ts +29 -0
- package/dist/server/src/api/ws/events.d.ts.map +1 -0
- package/dist/server/src/api/ws/events.js +44 -0
- package/dist/server/src/api/ws/ws-handler.d.ts +83 -0
- package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -0
- package/dist/server/src/api/ws/ws-handler.js +217 -0
- package/dist/server/src/app.d.ts +24 -0
- package/dist/server/src/app.d.ts.map +1 -0
- package/dist/server/src/app.js +108 -0
- package/dist/server/src/cli/commands/list.d.ts +71 -0
- package/dist/server/src/cli/commands/list.d.ts.map +1 -0
- package/dist/server/src/cli/commands/list.js +97 -0
- package/dist/server/src/cli/commands/restart.d.ts +42 -0
- package/dist/server/src/cli/commands/restart.d.ts.map +1 -0
- package/dist/server/src/cli/commands/restart.js +61 -0
- package/dist/server/src/cli/commands/start.d.ts +43 -0
- package/dist/server/src/cli/commands/start.d.ts.map +1 -0
- package/dist/server/src/cli/commands/start.js +160 -0
- package/dist/server/src/cli/commands/status.d.ts +39 -0
- package/dist/server/src/cli/commands/status.d.ts.map +1 -0
- package/dist/server/src/cli/commands/status.js +164 -0
- package/dist/server/src/cli/commands/stop.d.ts +34 -0
- package/dist/server/src/cli/commands/stop.d.ts.map +1 -0
- package/dist/server/src/cli/commands/stop.js +47 -0
- package/dist/server/src/cli/commands/ui.d.ts +44 -0
- package/dist/server/src/cli/commands/ui.d.ts.map +1 -0
- package/dist/server/src/cli/commands/ui.js +95 -0
- package/dist/server/src/cli/index.d.ts +62 -0
- package/dist/server/src/cli/index.d.ts.map +1 -0
- package/dist/server/src/cli/index.js +88 -0
- package/dist/server/src/cli/parse-args.d.ts +108 -0
- package/dist/server/src/cli/parse-args.d.ts.map +1 -0
- package/dist/server/src/cli/parse-args.js +131 -0
- package/dist/server/src/cli/server.d.ts +171 -0
- package/dist/server/src/cli/server.d.ts.map +1 -0
- package/dist/server/src/cli/server.js +246 -0
- package/dist/server/src/config/config-change-logger.d.ts +16 -0
- package/dist/server/src/config/config-change-logger.d.ts.map +1 -0
- package/dist/server/src/config/config-change-logger.js +43 -0
- package/dist/server/src/config/config-loader.d.ts +22 -0
- package/dist/server/src/config/config-loader.d.ts.map +1 -0
- package/dist/server/src/config/config-loader.js +66 -0
- package/dist/server/src/config/config-manager.d.ts +158 -0
- package/dist/server/src/config/config-manager.d.ts.map +1 -0
- package/dist/server/src/config/config-manager.js +246 -0
- package/dist/server/src/config/config-saver.d.ts +16 -0
- package/dist/server/src/config/config-saver.d.ts.map +1 -0
- package/dist/server/src/config/config-saver.js +28 -0
- package/dist/server/src/config/config.schema.d.ts +108 -0
- package/dist/server/src/config/config.schema.d.ts.map +1 -0
- package/dist/server/src/config/config.schema.js +103 -0
- package/dist/server/src/config/server-config-manager.d.ts +74 -0
- package/dist/server/src/config/server-config-manager.d.ts.map +1 -0
- package/dist/server/src/config/server-config-manager.js +157 -0
- package/dist/server/src/config/type-converter.d.ts +13 -0
- package/dist/server/src/config/type-converter.d.ts.map +1 -0
- package/dist/server/src/config/type-converter.js +37 -0
- package/dist/server/src/index.d.ts +3 -0
- package/dist/server/src/index.d.ts.map +1 -0
- package/dist/server/src/index.js +352 -0
- package/dist/server/src/models/event.model.d.ts +106 -0
- package/dist/server/src/models/event.model.d.ts.map +1 -0
- package/dist/server/src/models/event.model.js +5 -0
- package/dist/server/src/models/server.model.d.ts +19 -0
- package/dist/server/src/models/server.model.d.ts.map +1 -0
- package/dist/server/src/models/server.model.js +1 -0
- package/dist/server/src/models/system-tools.constants.d.ts +73 -0
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -0
- package/dist/server/src/models/system-tools.constants.js +31 -0
- package/dist/server/src/models/types.d.ts +84 -0
- package/dist/server/src/models/types.d.ts.map +1 -0
- package/dist/server/src/models/types.js +67 -0
- package/dist/server/src/pid/file.d.ts +26 -0
- package/dist/server/src/pid/file.d.ts.map +1 -0
- package/dist/server/src/pid/file.js +68 -0
- package/dist/server/src/pid/manager.d.ts +98 -0
- package/dist/server/src/pid/manager.d.ts.map +1 -0
- package/dist/server/src/pid/manager.js +158 -0
- package/dist/server/src/pid/types.d.ts +13 -0
- package/dist/server/src/pid/types.d.ts.map +1 -0
- package/dist/server/src/pid/types.js +4 -0
- package/dist/server/src/server/dev-server.d.ts +2 -0
- package/dist/server/src/server/dev-server.d.ts.map +1 -0
- package/dist/server/src/server/dev-server.js +171 -0
- package/dist/server/src/server/runner.d.ts +57 -0
- package/dist/server/src/server/runner.d.ts.map +1 -0
- package/dist/server/src/server/runner.js +163 -0
- package/dist/server/src/services/client-tracker.service.d.ts +132 -0
- package/dist/server/src/services/client-tracker.service.d.ts.map +1 -0
- package/dist/server/src/services/client-tracker.service.js +203 -0
- package/dist/server/src/services/connection/connection-manager.d.ts +478 -0
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -0
- package/dist/server/src/services/connection/connection-manager.js +929 -0
- package/dist/server/src/services/connection/index.d.ts +6 -0
- package/dist/server/src/services/connection/index.d.ts.map +1 -0
- package/dist/server/src/services/connection/index.js +4 -0
- package/dist/server/src/services/connection/tool-cache.d.ts +122 -0
- package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -0
- package/dist/server/src/services/connection/tool-cache.js +202 -0
- package/dist/server/src/services/connection/types.d.ts +30 -0
- package/dist/server/src/services/connection/types.d.ts.map +1 -0
- package/dist/server/src/services/connection/types.js +1 -0
- package/dist/server/src/services/event-bus.service.d.ts +169 -0
- package/dist/server/src/services/event-bus.service.d.ts.map +1 -0
- package/dist/server/src/services/event-bus.service.js +200 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts +61 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -0
- package/dist/server/src/services/gateway/gateway.service.js +107 -0
- package/dist/server/src/services/gateway/index.d.ts +8 -0
- package/dist/server/src/services/gateway/index.d.ts.map +1 -0
- package/dist/server/src/services/gateway/index.js +6 -0
- package/dist/server/src/services/gateway/log-formatter.d.ts +26 -0
- package/dist/server/src/services/gateway/log-formatter.d.ts.map +1 -0
- package/dist/server/src/services/gateway/log-formatter.js +66 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +13 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +131 -0
- package/dist/server/src/services/gateway/request-handlers/index.d.ts +9 -0
- package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/index.js +8 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +85 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.js +56 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +228 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.js +79 -0
- package/dist/server/src/services/gateway/tool-list-generator.d.ts +23 -0
- package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -0
- package/dist/server/src/services/gateway/tool-list-generator.js +115 -0
- package/dist/server/src/services/gateway/types.d.ts +27 -0
- package/dist/server/src/services/gateway/types.d.ts.map +1 -0
- package/dist/server/src/services/gateway/types.js +4 -0
- package/dist/server/src/services/gateway.service.d.ts +7 -0
- package/dist/server/src/services/gateway.service.d.ts.map +1 -0
- package/dist/server/src/services/gateway.service.js +6 -0
- package/dist/server/src/services/hub-manager.service.d.ts +299 -0
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -0
- package/dist/server/src/services/hub-manager.service.js +413 -0
- package/dist/server/src/services/hub-tools/index.d.ts +10 -0
- package/dist/server/src/services/hub-tools/index.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/index.js +6 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +63 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/resource-generator.js +141 -0
- package/dist/server/src/services/hub-tools/server-selector.d.ts +63 -0
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/server-selector.js +108 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +47 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +225 -0
- package/dist/server/src/services/hub-tools/tool-search.d.ts +85 -0
- package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/tool-search.js +115 -0
- package/dist/server/src/services/hub-tools/types.d.ts +42 -0
- package/dist/server/src/services/hub-tools/types.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/types.js +1 -0
- package/dist/server/src/services/hub-tools.service.d.ts +235 -0
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools.service.js +457 -0
- package/dist/server/src/services/log-storage.service.d.ts +177 -0
- package/dist/server/src/services/log-storage.service.d.ts.map +1 -0
- package/dist/server/src/services/log-storage.service.js +243 -0
- package/dist/server/src/services/mcp-connection-manager.d.ts +7 -0
- package/dist/server/src/services/mcp-connection-manager.d.ts.map +1 -0
- package/dist/server/src/services/mcp-connection-manager.js +6 -0
- package/dist/server/src/services/mcp-session-manager.d.ts +6 -0
- package/dist/server/src/services/mcp-session-manager.d.ts.map +1 -0
- package/dist/server/src/services/mcp-session-manager.js +4 -0
- package/dist/server/src/services/search/index.d.ts +5 -0
- package/dist/server/src/services/search/index.d.ts.map +1 -0
- package/dist/server/src/services/search/index.js +5 -0
- package/dist/server/src/services/search/search-cache.d.ts +132 -0
- package/dist/server/src/services/search/search-cache.d.ts.map +1 -0
- package/dist/server/src/services/search/search-cache.js +151 -0
- package/dist/server/src/services/search/search-core.service.d.ts +108 -0
- package/dist/server/src/services/search/search-core.service.d.ts.map +1 -0
- package/dist/server/src/services/search/search-core.service.js +187 -0
- package/dist/server/src/services/search/search-scorer.d.ts +54 -0
- package/dist/server/src/services/search/search-scorer.d.ts.map +1 -0
- package/dist/server/src/services/search/search-scorer.js +83 -0
- package/dist/server/src/services/search/types.d.ts +20 -0
- package/dist/server/src/services/search/types.d.ts.map +1 -0
- package/dist/server/src/services/search/types.js +1 -0
- package/dist/server/src/services/session/index.d.ts +6 -0
- package/dist/server/src/services/session/index.d.ts.map +1 -0
- package/dist/server/src/services/session/index.js +4 -0
- package/dist/server/src/services/session/session-manager.d.ts +352 -0
- package/dist/server/src/services/session/session-manager.d.ts.map +1 -0
- package/dist/server/src/services/session/session-manager.js +835 -0
- package/dist/server/src/services/session/types.d.ts +32 -0
- package/dist/server/src/services/session/types.d.ts.map +1 -0
- package/dist/server/src/services/session/types.js +1 -0
- package/dist/server/src/services/simple-search.service.d.ts +67 -0
- package/dist/server/src/services/simple-search.service.d.ts.map +1 -0
- package/dist/server/src/services/simple-search.service.js +82 -0
- package/dist/server/src/services/system-tool-handler.d.ts +10 -0
- package/dist/server/src/services/system-tool-handler.d.ts.map +1 -0
- package/dist/server/src/services/system-tool-handler.js +77 -0
- package/dist/server/src/utils/error-handler.d.ts +18 -0
- package/dist/server/src/utils/error-handler.d.ts.map +1 -0
- package/dist/server/src/utils/error-handler.js +59 -0
- package/dist/server/src/utils/format-utils.d.ts +23 -0
- package/dist/server/src/utils/format-utils.d.ts.map +1 -0
- package/dist/server/src/utils/format-utils.js +58 -0
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -0
- package/dist/server/src/utils/index.js +1 -0
- package/dist/server/src/utils/json-utils.d.ts +82 -0
- package/dist/server/src/utils/json-utils.d.ts.map +1 -0
- package/dist/server/src/utils/json-utils.js +204 -0
- package/dist/server/src/utils/log-rotator.d.ts +223 -0
- package/dist/server/src/utils/log-rotator.d.ts.map +1 -0
- package/dist/server/src/utils/log-rotator.js +306 -0
- package/dist/server/src/utils/logger/dev-logger.d.ts +39 -0
- package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger/dev-logger.js +63 -0
- package/dist/server/src/utils/logger/index.d.ts +36 -0
- package/dist/server/src/utils/logger/index.d.ts.map +1 -0
- package/dist/server/src/utils/logger/index.js +46 -0
- package/dist/server/src/utils/logger/log-colors.d.ts +27 -0
- package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-colors.js +41 -0
- package/dist/server/src/utils/logger/log-context.d.ts +13 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-context.js +5 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts +47 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-formatter.js +150 -0
- package/dist/server/src/utils/logger/log-modules.d.ts +141 -0
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-modules.js +81 -0
- package/dist/server/src/utils/logger/log-output.d.ts +68 -0
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-output.js +320 -0
- package/dist/server/src/utils/logger/logger.d.ts +190 -0
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger/logger.js +350 -0
- package/dist/server/src/utils/logger.d.ts +12 -0
- package/dist/server/src/utils/logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger.js +12 -0
- package/dist/server/src/utils/mcp-error-handler.d.ts +162 -0
- package/dist/server/src/utils/mcp-error-handler.d.ts.map +1 -0
- package/dist/server/src/utils/mcp-error-handler.js +270 -0
- package/dist/server/src/utils/port-checker.d.ts +16 -0
- package/dist/server/src/utils/port-checker.d.ts.map +1 -0
- package/dist/server/src/utils/port-checker.js +242 -0
- package/dist/server/src/utils/request-context.d.ts +71 -0
- package/dist/server/src/utils/request-context.d.ts.map +1 -0
- package/dist/server/src/utils/request-context.js +73 -0
- package/dist/server/src/utils/tool-args-parser.d.ts +17 -0
- package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -0
- package/dist/server/src/utils/tool-args-parser.js +34 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts +104 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/sse-transport.js +189 -0
- package/dist/server/src/utils/transports/stdio-transport.d.ts +122 -0
- package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/stdio-transport.js +324 -0
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts +146 -0
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/streamable-http-transport.js +212 -0
- package/dist/server/src/utils/transports/transport-factory.d.ts +26 -0
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -0
- package/dist/server/src/utils/transports/transport-factory.js +104 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts +35 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -0
- package/dist/server/src/utils/transports/transport.interface.js +1 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.js +103 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +181 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +155 -0
- package/dist/server/tests/evaluation/evaluation.test.d.ts +2 -0
- package/dist/server/tests/evaluation/evaluation.test.d.ts.map +1 -0
- package/dist/server/tests/evaluation/evaluation.test.js +102 -0
- package/dist/server/tests/helpers/sdk-test-helpers.d.ts +32 -0
- package/dist/server/tests/helpers/sdk-test-helpers.d.ts.map +1 -0
- package/dist/server/tests/helpers/sdk-test-helpers.js +82 -0
- package/dist/server/tests/integration/api/gateway.test.d.ts +2 -0
- package/dist/server/tests/integration/api/gateway.test.d.ts.map +1 -0
- package/dist/server/tests/integration/api/gateway.test.js +366 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts +2 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts.map +1 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +109 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts +2 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts.map +1 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +149 -0
- package/dist/server/tests/server.test.d.ts +2 -0
- package/dist/server/tests/server.test.d.ts.map +1 -0
- package/dist/server/tests/server.test.js +95 -0
- package/dist/server/tests/setup.d.ts +7 -0
- package/dist/server/tests/setup.d.ts.map +1 -0
- package/dist/server/tests/setup.js +53 -0
- package/dist/server/tests/types/logger-test-helpers.d.ts +17 -0
- package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -0
- package/dist/server/tests/types/logger-test-helpers.js +4 -0
- package/dist/server/tests/types/test-helpers.d.ts +27 -0
- package/dist/server/tests/types/test-helpers.d.ts.map +1 -0
- package/dist/server/tests/types/test-helpers.js +4 -0
- package/dist/server/tests/unit/cli/basic-cli.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/basic-cli.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/basic-cli.test.js +33 -0
- package/dist/server/tests/unit/cli/cli.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/cli.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/cli.test.js +17 -0
- package/dist/server/tests/unit/cli/commands.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/commands.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/commands.test.js +75 -0
- package/dist/server/tests/unit/cli/server.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/server.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/server.test.js +68 -0
- package/dist/server/tests/unit/server/runner.test.d.ts +2 -0
- package/dist/server/tests/unit/server/runner.test.d.ts.map +1 -0
- package/dist/server/tests/unit/server/runner.test.js +488 -0
- package/dist/server/tests/unit/server/setup.d.ts +2 -0
- package/dist/server/tests/unit/server/setup.d.ts.map +1 -0
- package/dist/server/tests/unit/server/setup.js +21 -0
- package/dist/server/tests/unit/services/gateway-logging.test.d.ts +2 -0
- package/dist/server/tests/unit/services/gateway-logging.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/gateway-logging.test.js +47 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.js +140 -0
- package/dist/server/tests/unit/services/hub-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-manager.test.js +98 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +674 -0
- package/dist/server/tests/unit/services/search/search-cache.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-cache.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-cache.test.js +58 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.js +84 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.js +97 -0
- package/dist/server/tests/unit/services/session-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/session-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/session-manager.test.js +481 -0
- package/dist/server/tests/unit/utils/config.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/config.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/config.test.js +634 -0
- package/dist/server/tests/unit/utils/json-utils.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/json-utils.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/json-utils.test.js +296 -0
- package/dist/server/tests/unit/utils/log-rotator.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/log-rotator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/log-rotator.test.js +296 -0
- package/dist/server/tests/unit/utils/logger.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/logger.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/logger.test.js +462 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.js +163 -0
- package/dist/server/tests/unit/utils/request-context.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/request-context.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/request-context.test.js +82 -0
- package/dist/server/vite.config.d.ts +3 -0
- package/dist/server/vite.config.d.ts.map +1 -0
- package/dist/server/vite.config.js +160 -0
- package/dist/server/vitest.config.d.ts +3 -0
- package/dist/server/vitest.config.d.ts.map +1 -0
- package/dist/server/vitest.config.js +53 -0
- package/package.json +113 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { PassThrough } from 'stream';
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
|
+
// Re-implement ReadBuffer as it is not exported from SDK root
|
|
5
|
+
class ReadBuffer {
|
|
6
|
+
_buffer;
|
|
7
|
+
append(chunk) {
|
|
8
|
+
this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
|
|
9
|
+
}
|
|
10
|
+
readMessage() {
|
|
11
|
+
if (!this._buffer) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const index = this._buffer.indexOf('\n');
|
|
15
|
+
if (index === -1) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const line = this._buffer.toString('utf8', 0, index).replace(/\r$/, '');
|
|
19
|
+
this._buffer = this._buffer.subarray(index + 1);
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(line);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return JSON.parse(line);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
clear() {
|
|
28
|
+
this._buffer = undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A transport implementation for communicating with MCP (Model Context Protocol) servers
|
|
33
|
+
* via standard input/output streams. This transport spawns a child process and establishes
|
|
34
|
+
* bidirectional communication using stdin/stdout for JSON-RPC message exchange.
|
|
35
|
+
*
|
|
36
|
+
* The StdioTransport handles:
|
|
37
|
+
* - Cross-platform process spawning (including Windows batch file compatibility)
|
|
38
|
+
* - JSON-RPC message parsing and serialization
|
|
39
|
+
* - Proper process lifecycle management with graceful shutdown
|
|
40
|
+
* - Error handling and logging
|
|
41
|
+
* - Separate handling of stdout (for JSON-RPC) and stderr (for logging)
|
|
42
|
+
*
|
|
43
|
+
* This transport is primarily used for local MCP servers that communicate through
|
|
44
|
+
* standard I/O streams, such as those launched via npx, npm, or other package managers.
|
|
45
|
+
*
|
|
46
|
+
* @implements {Transport}
|
|
47
|
+
*/
|
|
48
|
+
export class StdioTransport {
|
|
49
|
+
_process;
|
|
50
|
+
_readBuffer = new ReadBuffer();
|
|
51
|
+
_stderrStream = null;
|
|
52
|
+
_serverParams;
|
|
53
|
+
_serverName;
|
|
54
|
+
_serverId;
|
|
55
|
+
_logStorage;
|
|
56
|
+
/**
|
|
57
|
+
* Gets the process ID of the spawned child process.
|
|
58
|
+
*
|
|
59
|
+
* @returns {number | undefined} The PID of the child process, or undefined if not started
|
|
60
|
+
*/
|
|
61
|
+
get pid() {
|
|
62
|
+
return this._process?.pid;
|
|
63
|
+
}
|
|
64
|
+
onclose;
|
|
65
|
+
onerror;
|
|
66
|
+
onmessage;
|
|
67
|
+
onstdout;
|
|
68
|
+
onstderr;
|
|
69
|
+
/**
|
|
70
|
+
* Creates a new StdioTransport instance.
|
|
71
|
+
*
|
|
72
|
+
* @param {StdioServerParameters} server - Configuration parameters for the child process
|
|
73
|
+
* @param {string} [serverName] - Optional name for the server used in logging
|
|
74
|
+
* @param {StdioTransportOptions} [options] - Additional options for the transport
|
|
75
|
+
*/
|
|
76
|
+
constructor(server, serverName, options) {
|
|
77
|
+
this._serverParams = server;
|
|
78
|
+
this._serverName = serverName;
|
|
79
|
+
this._serverId = options?.serverId;
|
|
80
|
+
this._logStorage = options?.logStorage;
|
|
81
|
+
if (server.stderr === 'pipe') {
|
|
82
|
+
this._stderrStream = new PassThrough();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Starts the transport by spawning the child process and establishing communication channels.
|
|
87
|
+
*
|
|
88
|
+
* This method handles platform-specific considerations:
|
|
89
|
+
* - On Windows, it automatically wraps batch commands (like npx, npm, etc.) with cmd.exe /c
|
|
90
|
+
* - Sets up proper stdio configuration based on the server parameters
|
|
91
|
+
* - Configures event listeners for process lifecycle events
|
|
92
|
+
* - Establishes data flow for stdout and stderr handling
|
|
93
|
+
*
|
|
94
|
+
* @returns {Promise<void>} Resolves when the child process is successfully spawned
|
|
95
|
+
* @throws {Error} If the transport is already started
|
|
96
|
+
*/
|
|
97
|
+
async start() {
|
|
98
|
+
if (this._process) {
|
|
99
|
+
throw new Error('StdioTransport already started!');
|
|
100
|
+
}
|
|
101
|
+
let command = this._serverParams.command;
|
|
102
|
+
let args = this._serverParams.args ?? [];
|
|
103
|
+
// Windows compatibility: Batch files (npx, npm, etc.) need cmd.exe /c to run with shell: false
|
|
104
|
+
if (process.platform === 'win32') {
|
|
105
|
+
const knownBatchCommands = ['npx', 'npm', 'pnpm', 'yarn', 'uvx'];
|
|
106
|
+
if (knownBatchCommands.includes(command) ||
|
|
107
|
+
command.endsWith('.cmd') ||
|
|
108
|
+
command.endsWith('.bat')) {
|
|
109
|
+
// Use cmd.exe /c to execute the batch file
|
|
110
|
+
args = ['/c', command, ...args];
|
|
111
|
+
command = 'cmd.exe';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
this._process = spawn(command, args, {
|
|
116
|
+
env: { ...process.env, ...this._serverParams.env },
|
|
117
|
+
stdio: [
|
|
118
|
+
'pipe',
|
|
119
|
+
'pipe',
|
|
120
|
+
this._serverParams.stderr === 'pipe' ? 'pipe' : this._serverParams.stderr || 'inherit'
|
|
121
|
+
],
|
|
122
|
+
shell: false,
|
|
123
|
+
windowsHide: true, // Force hide window on Windows
|
|
124
|
+
cwd: this._serverParams.cwd
|
|
125
|
+
});
|
|
126
|
+
this._process.on('error', (error) => {
|
|
127
|
+
reject(error);
|
|
128
|
+
this.onerror?.(error);
|
|
129
|
+
});
|
|
130
|
+
this._process.on('spawn', () => {
|
|
131
|
+
resolve();
|
|
132
|
+
});
|
|
133
|
+
this._process.on('close', () => {
|
|
134
|
+
this._process = undefined;
|
|
135
|
+
this.onclose?.();
|
|
136
|
+
});
|
|
137
|
+
this._process.stdin?.on('error', (error) => {
|
|
138
|
+
this.onerror?.(error);
|
|
139
|
+
});
|
|
140
|
+
this._process.stdout?.on('data', (chunk) => {
|
|
141
|
+
const dataStr = chunk.toString('utf8');
|
|
142
|
+
// Forward raw stdout data
|
|
143
|
+
this.onstdout?.(dataStr);
|
|
144
|
+
// Don't log raw JSON-RPC communication to avoid log noise
|
|
145
|
+
// Only need to view raw communication during development debugging
|
|
146
|
+
// Parse JSON-RPC messages
|
|
147
|
+
this._readBuffer.append(chunk);
|
|
148
|
+
this.processReadBuffer();
|
|
149
|
+
});
|
|
150
|
+
this._process.stdout?.on('error', (error) => {
|
|
151
|
+
this.onerror?.(error);
|
|
152
|
+
});
|
|
153
|
+
/**
|
|
154
|
+
* Handles stderr data with common processing logic.
|
|
155
|
+
*
|
|
156
|
+
* @param chunk - The stderr data chunk
|
|
157
|
+
* @param writeToStream - Whether to write data to the PassThrough stream
|
|
158
|
+
*/
|
|
159
|
+
const handleStderrData = (chunk, writeToStream = false) => {
|
|
160
|
+
const dataStr = chunk.toString('utf8');
|
|
161
|
+
// Forward raw stderr data
|
|
162
|
+
this.onstderr?.(dataStr);
|
|
163
|
+
const trimmedData = dataStr.trim();
|
|
164
|
+
let logLevel = 'info';
|
|
165
|
+
// Identify log levels by keywords: only explicit error/warning markers
|
|
166
|
+
// use corresponding levels, everything else defaults to info
|
|
167
|
+
const lowerData = trimmedData.toLowerCase();
|
|
168
|
+
// Error level keywords
|
|
169
|
+
if (lowerData.includes('error') ||
|
|
170
|
+
lowerData.includes('err') ||
|
|
171
|
+
lowerData.includes('exception') ||
|
|
172
|
+
lowerData.includes('fatal') ||
|
|
173
|
+
lowerData.includes('critical')) {
|
|
174
|
+
logLevel = 'error';
|
|
175
|
+
}
|
|
176
|
+
// Warn level keywords
|
|
177
|
+
else if (lowerData.includes('warn') ||
|
|
178
|
+
lowerData.includes('wrn') ||
|
|
179
|
+
lowerData.includes('warning') ||
|
|
180
|
+
lowerData.includes('deprecation') ||
|
|
181
|
+
lowerData.includes('deprecated')) {
|
|
182
|
+
logLevel = 'warn';
|
|
183
|
+
}
|
|
184
|
+
if (this._serverName) {
|
|
185
|
+
logger.serverLog(logLevel, this._serverName, trimmedData, {
|
|
186
|
+
pid: this._process?.pid
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
logger.serverLog(logLevel, 'Unknown Server', trimmedData, {
|
|
191
|
+
pid: this._process?.pid
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Store in logStorage for frontend display if available
|
|
195
|
+
if (this._logStorage && this._serverId) {
|
|
196
|
+
this._logStorage.append(this._serverId, logLevel, `[${this._serverName || 'Unknown Server'}] [STDERR] ${trimmedData}`);
|
|
197
|
+
}
|
|
198
|
+
// Optionally write to PassThrough stream if configured
|
|
199
|
+
if (writeToStream) {
|
|
200
|
+
this._stderrStream?.write(chunk);
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
if (this._stderrStream && this._process.stderr) {
|
|
204
|
+
this._process.stderr.on('data', (chunk) => {
|
|
205
|
+
handleStderrData(chunk, true); // Write to PassThrough stream for piped stderr
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
else if (this._process.stderr) {
|
|
209
|
+
// If stderr is not in pipe mode, listen directly
|
|
210
|
+
this._process.stderr.on('data', (chunk) => {
|
|
211
|
+
handleStderrData(chunk, false); // No PassThrough stream for non-piped stderr
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Gets the stderr stream for the child process.
|
|
218
|
+
*
|
|
219
|
+
* Returns a PassThrough stream if stderr is configured as 'pipe', otherwise returns
|
|
220
|
+
* the actual stderr stream from the child process, or null if no stderr is available.
|
|
221
|
+
*
|
|
222
|
+
* @returns {PassThrough | NodeJS.ReadableStream | null} The stderr stream or null
|
|
223
|
+
*/
|
|
224
|
+
get stderr() {
|
|
225
|
+
return this._stderrStream ?? this._process?.stderr ?? null;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Processes the internal read buffer to extract and dispatch JSON-RPC messages.
|
|
229
|
+
*
|
|
230
|
+
* This method continuously reads complete JSON-RPC messages from the buffer
|
|
231
|
+
* and dispatches them to the onmessage callback. It handles partial messages
|
|
232
|
+
* by leaving incomplete data in the buffer for future processing.
|
|
233
|
+
*
|
|
234
|
+
* The method uses a while loop to process all available complete messages
|
|
235
|
+
* in a single call, ensuring efficient message handling without blocking.
|
|
236
|
+
*
|
|
237
|
+
* @private
|
|
238
|
+
*/
|
|
239
|
+
processReadBuffer() {
|
|
240
|
+
while (true) {
|
|
241
|
+
try {
|
|
242
|
+
const message = this._readBuffer.readMessage();
|
|
243
|
+
if (message === null) {
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
this.onmessage?.(message);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
this.onerror?.(error);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Closes the transport by gracefully terminating the child process.
|
|
255
|
+
*
|
|
256
|
+
* This method implements a graceful shutdown sequence:
|
|
257
|
+
* 1. Sends SIGTERM to allow the child process to clean up
|
|
258
|
+
* 2. Waits up to 5 seconds for graceful termination
|
|
259
|
+
* 3. Forces termination with SIGKILL if the process doesn't exit
|
|
260
|
+
* 4. Cleans up internal state and resolves the promise
|
|
261
|
+
*
|
|
262
|
+
* The method ensures proper cleanup of the read buffer and handles
|
|
263
|
+
* any errors that occur during the shutdown process.
|
|
264
|
+
*
|
|
265
|
+
* @returns {Promise<void>} Resolves when the transport is fully closed
|
|
266
|
+
*/
|
|
267
|
+
async close() {
|
|
268
|
+
if (this._process) {
|
|
269
|
+
return new Promise((resolve) => {
|
|
270
|
+
// Listen for child process exit events
|
|
271
|
+
const cleanup = () => {
|
|
272
|
+
this._process = undefined;
|
|
273
|
+
this._readBuffer.clear();
|
|
274
|
+
resolve();
|
|
275
|
+
};
|
|
276
|
+
if (this._process) {
|
|
277
|
+
this._process.once('close', cleanup);
|
|
278
|
+
this._process.once('exit', cleanup);
|
|
279
|
+
// Send SIGTERM signal to give child process a chance to shut down gracefully
|
|
280
|
+
try {
|
|
281
|
+
this._process.kill('SIGTERM');
|
|
282
|
+
// Set timeout protection to force kill if child process doesn't exit within 5 seconds
|
|
283
|
+
const timeout = setTimeout(() => {
|
|
284
|
+
if (this._process) {
|
|
285
|
+
logger.warn('Child process did not exit gracefully, force killing...');
|
|
286
|
+
this._process.kill('SIGKILL');
|
|
287
|
+
}
|
|
288
|
+
}, 5000);
|
|
289
|
+
// Ensure timeout timer is cleared after process exits
|
|
290
|
+
this._process.once('close', () => clearTimeout(timeout));
|
|
291
|
+
this._process.once('exit', () => clearTimeout(timeout));
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
logger.error('Error closing stdio transport:', error);
|
|
295
|
+
cleanup();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
// Process is already undefined, just resolve
|
|
300
|
+
resolve();
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
this._readBuffer.clear();
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Sends a JSON-RPC message to the child process via stdin.
|
|
308
|
+
*
|
|
309
|
+
* This method serializes the message to JSON, appends a newline character,
|
|
310
|
+
* and writes it to the child process's stdin stream. It validates that
|
|
311
|
+
* the transport is connected before attempting to send the message.
|
|
312
|
+
*
|
|
313
|
+
* @param {JSONRPCMessage} message - The JSON-RPC message to send
|
|
314
|
+
* @returns {Promise<void>} Resolves when the message is written to stdin
|
|
315
|
+
* @throws {Error} If the transport is not connected (no active child process)
|
|
316
|
+
*/
|
|
317
|
+
async send(message) {
|
|
318
|
+
if (!this._process?.stdin) {
|
|
319
|
+
throw new Error('Not connected');
|
|
320
|
+
}
|
|
321
|
+
const json = JSON.stringify(message) + '\n';
|
|
322
|
+
this._process.stdin.write(json);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
/**
|
|
4
|
+
* Streamable HTTP Transport implementation for MCP (Model Context Protocol)
|
|
5
|
+
*
|
|
6
|
+
* This transport enables communication with MCP servers that support the Streamable HTTP protocol,
|
|
7
|
+
* which provides bidirectional communication over HTTP using a combination of POST requests for
|
|
8
|
+
* sending messages and Server-Sent Events (SSE) for receiving streamed responses.
|
|
9
|
+
*
|
|
10
|
+
* The Streamable HTTP protocol is particularly useful for:
|
|
11
|
+
* - Remote MCP servers accessible via HTTP/HTTPS
|
|
12
|
+
* - Scenarios requiring streaming responses from tools
|
|
13
|
+
* - Environments where WebSocket connections are restricted
|
|
14
|
+
* - Integration with existing HTTP infrastructure
|
|
15
|
+
*
|
|
16
|
+
* Protocol Details:
|
|
17
|
+
* - **Outbound Messages**: Sent via HTTP POST requests with JSON-RPC 2.0 formatted payloads
|
|
18
|
+
* - **Inbound Messages**: Received via HTTP GET requests using Server-Sent Events (SSE) for real-time streaming
|
|
19
|
+
* - **Headers**: Custom headers can be provided for authentication, authorization, or other HTTP requirements
|
|
20
|
+
* - **Timeout**: Configurable request timeout to prevent hanging connections
|
|
21
|
+
*
|
|
22
|
+
* This transport wraps the official MCP SDK's StreamableHTTPClientTransport and provides
|
|
23
|
+
* consistent error handling, logging, and lifecycle management integrated with the MCP Hub Lite system.
|
|
24
|
+
*
|
|
25
|
+
* @implements {Transport}
|
|
26
|
+
* @see {@link https://modelcontextprotocol.io/transports/streamable-http} - Official MCP Streamable HTTP specification
|
|
27
|
+
*/
|
|
28
|
+
export declare class StreamableHttpTransport implements Transport {
|
|
29
|
+
private url;
|
|
30
|
+
private headers;
|
|
31
|
+
private timeout;
|
|
32
|
+
/**
|
|
33
|
+
* Internal reference to the underlying MCP SDK transport instance
|
|
34
|
+
* @private
|
|
35
|
+
*/
|
|
36
|
+
private transport;
|
|
37
|
+
/**
|
|
38
|
+
* Flag indicating whether the transport is in the process of closing
|
|
39
|
+
* Prevents sending messages during shutdown and handles unexpected closures
|
|
40
|
+
* @private
|
|
41
|
+
*/
|
|
42
|
+
private isClosing;
|
|
43
|
+
/**
|
|
44
|
+
* Event handler called when a JSON-RPC message is received from the server
|
|
45
|
+
* @public
|
|
46
|
+
*/
|
|
47
|
+
onmessage?: (message: JSONRPCMessage) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Event handler called when an error occurs in the transport connection
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
onerror?: (error: Error) => void;
|
|
53
|
+
/**
|
|
54
|
+
* Event handler called when the transport connection is closed
|
|
55
|
+
* @public
|
|
56
|
+
*/
|
|
57
|
+
onclose?: () => void;
|
|
58
|
+
/**
|
|
59
|
+
* Creates a new Streamable HTTP Transport instance
|
|
60
|
+
*
|
|
61
|
+
* @param url - The base URL of the MCP server endpoint (e.g., "https://api.example.com/mcp")
|
|
62
|
+
* @param headers - Optional HTTP headers to include with all requests (default: {})
|
|
63
|
+
* Commonly used for authentication tokens, API keys, or custom headers
|
|
64
|
+
* @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
|
|
65
|
+
* Controls how long to wait for HTTP responses before timing out
|
|
66
|
+
*/
|
|
67
|
+
constructor(url: string, headers?: Record<string, string>, timeout?: number);
|
|
68
|
+
/**
|
|
69
|
+
* Initializes and starts the Streamable HTTP transport connection
|
|
70
|
+
*
|
|
71
|
+
* This method establishes the connection to the MCP server by:
|
|
72
|
+
* 1. Validating that the transport hasn't already been started
|
|
73
|
+
* 2. Creating a new StreamableHTTPClientTransport instance from the MCP SDK
|
|
74
|
+
* 3. Configuring HTTP request options including headers and timeout
|
|
75
|
+
* 4. Setting up event handlers for message, error, and close events
|
|
76
|
+
* 5. Starting the underlying transport connection
|
|
77
|
+
*
|
|
78
|
+
* The transport will automatically handle:
|
|
79
|
+
* - Message routing to the onmessage handler
|
|
80
|
+
* - Error logging and propagation to the onerror handler
|
|
81
|
+
* - Connection lifecycle management with proper cleanup
|
|
82
|
+
*
|
|
83
|
+
* @returns {Promise<void>} Resolves when the transport is successfully started
|
|
84
|
+
* @throws {Error} If the transport is already started or if connection fails
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const transport = new StreamableHttpTransport('https://api.example.com/mcp', {
|
|
89
|
+
* 'Authorization': 'Bearer your-token'
|
|
90
|
+
* });
|
|
91
|
+
* await transport.start();
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
start(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Gracefully closes the Streamable HTTP transport connection
|
|
97
|
+
*
|
|
98
|
+
* This method performs a clean shutdown of the transport by:
|
|
99
|
+
* 1. Setting the closing flag to prevent new message sends
|
|
100
|
+
* 2. Closing the underlying MCP SDK transport connection
|
|
101
|
+
* 3. Cleaning up the internal transport reference
|
|
102
|
+
* 4. Triggering the onclose event handler
|
|
103
|
+
*
|
|
104
|
+
* The method is idempotent and can be called multiple times safely.
|
|
105
|
+
* It ensures proper resource cleanup and prevents memory leaks.
|
|
106
|
+
*
|
|
107
|
+
* @returns {Promise<void>} Resolves when the transport is successfully closed
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* await transport.close();
|
|
112
|
+
* // Transport is now closed and cannot send/receive messages
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
close(): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* Sends a JSON-RPC message to the connected MCP server
|
|
118
|
+
*
|
|
119
|
+
* This method transmits the provided JSON-RPC message to the server using the
|
|
120
|
+
* Streamable HTTP protocol. The message is sent as an HTTP POST request with
|
|
121
|
+
* the appropriate Content-Type header and any configured custom headers.
|
|
122
|
+
*
|
|
123
|
+
* The method includes comprehensive validation and error handling:
|
|
124
|
+
* - Prevents sending messages when the transport is closing
|
|
125
|
+
* - Ensures the transport has been properly initialized
|
|
126
|
+
* - Logs transmission errors for debugging purposes
|
|
127
|
+
* - Re-throws errors to allow caller error handling
|
|
128
|
+
*
|
|
129
|
+
* @param message - The JSON-RPC 2.0 formatted message to send to the server
|
|
130
|
+
* @returns {Promise<void>} Resolves when the message is successfully sent
|
|
131
|
+
* @throws {Error} If the transport is closing, not started, or if sending fails
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* const request: JSONRPCMessage = {
|
|
136
|
+
* jsonrpc: '2.0',
|
|
137
|
+
* id: 1,
|
|
138
|
+
* method: 'textDocument/completion',
|
|
139
|
+
* params: { /* completion parameters *\/ }
|
|
140
|
+
* };
|
|
141
|
+
* await transport.send(request);
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
send(message: JSONRPCMessage): Promise<void>;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=streamable-http-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/streamable-http-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAK1E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,uBAAwB,YAAW,SAAS;IA0CrD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IA3CjB;;;OAGG;IACH,OAAO,CAAC,SAAS,CAA8C;IAE/D;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAS;IAE1B;;;OAGG;IACI,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAErD;;;OAGG;IACI,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAExC;;;OAGG;IACI,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;;;;;;;OAQG;gBAEO,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACpC,OAAO,GAAE,MAAc;IAGjC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD5B;;;;;;;;;;;;;;;;;;;OAmBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAoBnD"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { logger, LOG_MODULES } from '../logger.js';
|
|
2
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
import { URL } from 'url';
|
|
4
|
+
/**
|
|
5
|
+
* Streamable HTTP Transport implementation for MCP (Model Context Protocol)
|
|
6
|
+
*
|
|
7
|
+
* This transport enables communication with MCP servers that support the Streamable HTTP protocol,
|
|
8
|
+
* which provides bidirectional communication over HTTP using a combination of POST requests for
|
|
9
|
+
* sending messages and Server-Sent Events (SSE) for receiving streamed responses.
|
|
10
|
+
*
|
|
11
|
+
* The Streamable HTTP protocol is particularly useful for:
|
|
12
|
+
* - Remote MCP servers accessible via HTTP/HTTPS
|
|
13
|
+
* - Scenarios requiring streaming responses from tools
|
|
14
|
+
* - Environments where WebSocket connections are restricted
|
|
15
|
+
* - Integration with existing HTTP infrastructure
|
|
16
|
+
*
|
|
17
|
+
* Protocol Details:
|
|
18
|
+
* - **Outbound Messages**: Sent via HTTP POST requests with JSON-RPC 2.0 formatted payloads
|
|
19
|
+
* - **Inbound Messages**: Received via HTTP GET requests using Server-Sent Events (SSE) for real-time streaming
|
|
20
|
+
* - **Headers**: Custom headers can be provided for authentication, authorization, or other HTTP requirements
|
|
21
|
+
* - **Timeout**: Configurable request timeout to prevent hanging connections
|
|
22
|
+
*
|
|
23
|
+
* This transport wraps the official MCP SDK's StreamableHTTPClientTransport and provides
|
|
24
|
+
* consistent error handling, logging, and lifecycle management integrated with the MCP Hub Lite system.
|
|
25
|
+
*
|
|
26
|
+
* @implements {Transport}
|
|
27
|
+
* @see {@link https://modelcontextprotocol.io/transports/streamable-http} - Official MCP Streamable HTTP specification
|
|
28
|
+
*/
|
|
29
|
+
export class StreamableHttpTransport {
|
|
30
|
+
url;
|
|
31
|
+
headers;
|
|
32
|
+
timeout;
|
|
33
|
+
/**
|
|
34
|
+
* Internal reference to the underlying MCP SDK transport instance
|
|
35
|
+
* @private
|
|
36
|
+
*/
|
|
37
|
+
transport = null;
|
|
38
|
+
/**
|
|
39
|
+
* Flag indicating whether the transport is in the process of closing
|
|
40
|
+
* Prevents sending messages during shutdown and handles unexpected closures
|
|
41
|
+
* @private
|
|
42
|
+
*/
|
|
43
|
+
isClosing = false;
|
|
44
|
+
/**
|
|
45
|
+
* Event handler called when a JSON-RPC message is received from the server
|
|
46
|
+
* @public
|
|
47
|
+
*/
|
|
48
|
+
onmessage;
|
|
49
|
+
/**
|
|
50
|
+
* Event handler called when an error occurs in the transport connection
|
|
51
|
+
* @public
|
|
52
|
+
*/
|
|
53
|
+
onerror;
|
|
54
|
+
/**
|
|
55
|
+
* Event handler called when the transport connection is closed
|
|
56
|
+
* @public
|
|
57
|
+
*/
|
|
58
|
+
onclose;
|
|
59
|
+
/**
|
|
60
|
+
* Creates a new Streamable HTTP Transport instance
|
|
61
|
+
*
|
|
62
|
+
* @param url - The base URL of the MCP server endpoint (e.g., "https://api.example.com/mcp")
|
|
63
|
+
* @param headers - Optional HTTP headers to include with all requests (default: {})
|
|
64
|
+
* Commonly used for authentication tokens, API keys, or custom headers
|
|
65
|
+
* @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
|
|
66
|
+
* Controls how long to wait for HTTP responses before timing out
|
|
67
|
+
*/
|
|
68
|
+
constructor(url, headers = {}, timeout = 30000) {
|
|
69
|
+
this.url = url;
|
|
70
|
+
this.headers = headers;
|
|
71
|
+
this.timeout = timeout;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Initializes and starts the Streamable HTTP transport connection
|
|
75
|
+
*
|
|
76
|
+
* This method establishes the connection to the MCP server by:
|
|
77
|
+
* 1. Validating that the transport hasn't already been started
|
|
78
|
+
* 2. Creating a new StreamableHTTPClientTransport instance from the MCP SDK
|
|
79
|
+
* 3. Configuring HTTP request options including headers and timeout
|
|
80
|
+
* 4. Setting up event handlers for message, error, and close events
|
|
81
|
+
* 5. Starting the underlying transport connection
|
|
82
|
+
*
|
|
83
|
+
* The transport will automatically handle:
|
|
84
|
+
* - Message routing to the onmessage handler
|
|
85
|
+
* - Error logging and propagation to the onerror handler
|
|
86
|
+
* - Connection lifecycle management with proper cleanup
|
|
87
|
+
*
|
|
88
|
+
* @returns {Promise<void>} Resolves when the transport is successfully started
|
|
89
|
+
* @throws {Error} If the transport is already started or if connection fails
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const transport = new StreamableHttpTransport('https://api.example.com/mcp', {
|
|
94
|
+
* 'Authorization': 'Bearer your-token'
|
|
95
|
+
* });
|
|
96
|
+
* await transport.start();
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
async start() {
|
|
100
|
+
if (this.transport) {
|
|
101
|
+
throw new Error('Streamable HTTP Transport already started!');
|
|
102
|
+
}
|
|
103
|
+
this.isClosing = false;
|
|
104
|
+
try {
|
|
105
|
+
const url = new URL(this.url);
|
|
106
|
+
const requestInit = {
|
|
107
|
+
headers: {
|
|
108
|
+
'Content-Type': 'application/json',
|
|
109
|
+
...this.headers
|
|
110
|
+
},
|
|
111
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
112
|
+
};
|
|
113
|
+
this.transport = new StreamableHTTPClientTransport(url, {
|
|
114
|
+
requestInit
|
|
115
|
+
});
|
|
116
|
+
// Set up event handlers
|
|
117
|
+
this.transport.onmessage = (message) => {
|
|
118
|
+
this.onmessage?.(message);
|
|
119
|
+
};
|
|
120
|
+
this.transport.onerror = (error) => {
|
|
121
|
+
logger.error('Streamable HTTP transport error:', error, LOG_MODULES.HTTP_TRANSPORT);
|
|
122
|
+
this.onerror?.(error);
|
|
123
|
+
};
|
|
124
|
+
this.transport.onclose = () => {
|
|
125
|
+
logger.info('Streamable HTTP transport closed', LOG_MODULES.HTTP_TRANSPORT);
|
|
126
|
+
if (!this.isClosing) {
|
|
127
|
+
// Unexpected close, trigger error
|
|
128
|
+
const error = new Error('Streamable HTTP transport closed unexpectedly');
|
|
129
|
+
this.onerror?.(error);
|
|
130
|
+
}
|
|
131
|
+
this.onclose?.();
|
|
132
|
+
};
|
|
133
|
+
await this.transport.start();
|
|
134
|
+
logger.info(`Streamable HTTP transport initialized for ${this.url}`, LOG_MODULES.HTTP_TRANSPORT);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
logger.error('Failed to create Streamable HTTP transport:', error, LOG_MODULES.HTTP_TRANSPORT);
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Gracefully closes the Streamable HTTP transport connection
|
|
143
|
+
*
|
|
144
|
+
* This method performs a clean shutdown of the transport by:
|
|
145
|
+
* 1. Setting the closing flag to prevent new message sends
|
|
146
|
+
* 2. Closing the underlying MCP SDK transport connection
|
|
147
|
+
* 3. Cleaning up the internal transport reference
|
|
148
|
+
* 4. Triggering the onclose event handler
|
|
149
|
+
*
|
|
150
|
+
* The method is idempotent and can be called multiple times safely.
|
|
151
|
+
* It ensures proper resource cleanup and prevents memory leaks.
|
|
152
|
+
*
|
|
153
|
+
* @returns {Promise<void>} Resolves when the transport is successfully closed
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```typescript
|
|
157
|
+
* await transport.close();
|
|
158
|
+
* // Transport is now closed and cannot send/receive messages
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
async close() {
|
|
162
|
+
this.isClosing = true;
|
|
163
|
+
if (this.transport) {
|
|
164
|
+
await this.transport.close();
|
|
165
|
+
this.transport = null;
|
|
166
|
+
}
|
|
167
|
+
this.onclose?.();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Sends a JSON-RPC message to the connected MCP server
|
|
171
|
+
*
|
|
172
|
+
* This method transmits the provided JSON-RPC message to the server using the
|
|
173
|
+
* Streamable HTTP protocol. The message is sent as an HTTP POST request with
|
|
174
|
+
* the appropriate Content-Type header and any configured custom headers.
|
|
175
|
+
*
|
|
176
|
+
* The method includes comprehensive validation and error handling:
|
|
177
|
+
* - Prevents sending messages when the transport is closing
|
|
178
|
+
* - Ensures the transport has been properly initialized
|
|
179
|
+
* - Logs transmission errors for debugging purposes
|
|
180
|
+
* - Re-throws errors to allow caller error handling
|
|
181
|
+
*
|
|
182
|
+
* @param message - The JSON-RPC 2.0 formatted message to send to the server
|
|
183
|
+
* @returns {Promise<void>} Resolves when the message is successfully sent
|
|
184
|
+
* @throws {Error} If the transport is closing, not started, or if sending fails
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* ```typescript
|
|
188
|
+
* const request: JSONRPCMessage = {
|
|
189
|
+
* jsonrpc: '2.0',
|
|
190
|
+
* id: 1,
|
|
191
|
+
* method: 'textDocument/completion',
|
|
192
|
+
* params: { /* completion parameters *\/ }
|
|
193
|
+
* };
|
|
194
|
+
* await transport.send(request);
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
async send(message) {
|
|
198
|
+
if (this.isClosing) {
|
|
199
|
+
throw new Error('Transport is closing');
|
|
200
|
+
}
|
|
201
|
+
if (!this.transport) {
|
|
202
|
+
throw new Error('Streamable HTTP transport not started');
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
await this.transport.send(message);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
logger.error('Failed to send message via Streamable HTTP:', error, LOG_MODULES.HTTP_TRANSPORT);
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|