@loop_ouroboros/mcp-hub-lite 1.0.2 → 1.1.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.
- package/CHANGELOG.md +32 -0
- package/dist/client/assets/{HomeView-7rMg9C6t.js → HomeView-BBwvy1oj.js} +1 -1
- package/dist/client/assets/ResourceDetailView-CZ2aB73w.js +1 -0
- package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
- package/dist/client/assets/ResourcesView-CN1NlhWs.js +1 -0
- package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
- package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
- package/dist/client/assets/ServerDashboard-k652Vw4Z.js +1 -0
- package/dist/client/assets/ServerDetail-BLQ-a4cO.js +2 -0
- package/dist/client/assets/ServerDetail-CtnNKJGx.css +1 -0
- package/dist/client/assets/{ServerListView-Bws09jNR.css → ServerListView-B-bPljsO.css} +1 -1
- package/dist/client/assets/ServerListView-BHrsFD5i.js +36 -0
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHhwEuGe.js +1 -0
- package/dist/client/assets/SettingsView-CUOFNXrz.js +1 -0
- package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
- package/dist/client/assets/ToolCallDialog-BfPjLxfV.js +1 -0
- package/dist/client/assets/ToolsView-BxgXvPC3.css +1 -0
- package/dist/client/assets/ToolsView-CyuhYAE2.js +1 -0
- package/dist/client/assets/{_baseClone-5q1b0P3O.js → _baseClone-DO5qfalW.js} +1 -1
- package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
- package/dist/client/assets/el-form-item-CcGsD2K_.js +12 -0
- package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
- package/dist/client/assets/el-input-tYgeiaCT.js +1 -0
- package/dist/client/assets/{el-loading-H85n3BUC.js → el-loading-Dwl9E_Vr.js} +1 -1
- package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
- package/dist/client/assets/el-overlay-kqX_BABo.js +1 -0
- package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
- package/dist/client/assets/el-radio-group-D8aWBVOT.js +1 -0
- package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
- package/dist/client/assets/el-skeleton-item-BRwIFspE.js +1 -0
- package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
- package/dist/client/assets/el-switch-BF8c-xeU.js +1 -0
- package/dist/client/assets/el-tab-pane-C4Ep94cd.js +1 -0
- package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
- package/dist/client/assets/el-table-column-Cog6uCh-.js +1 -0
- package/dist/client/assets/index-ByNBhPAR.js +1 -0
- package/dist/client/assets/index-CTB6oe-9.js +2 -0
- package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
- package/dist/client/assets/omit-CUnDT6sS.js +1 -0
- package/dist/client/assets/{raf-DY5mgbuB.js → raf-CmzeRPMd.js} +1 -1
- package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-CbgVSHIh.js} +3 -3
- package/dist/client/index.html +3 -3
- package/dist/server/shared/models/resource.model.d.ts +2 -1
- package/dist/server/shared/models/resource.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.d.ts +362 -5
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.js +220 -1
- package/dist/server/shared/models/session.model.d.ts +1 -57
- package/dist/server/shared/models/session.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.js +1 -55
- package/dist/server/shared/models/tool.model.d.ts +4 -2
- package/dist/server/shared/models/tool.model.d.ts.map +1 -1
- package/dist/server/shared/types/session-context.types.d.ts +0 -2
- package/dist/server/shared/types/session-context.types.d.ts.map +1 -1
- package/dist/server/shared/types/websocket.types.d.ts +17 -10
- package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
- package/dist/server/src/api/mcp/debug-response-wrapper.js +2 -2
- package/dist/server/src/api/mcp/gateway.d.ts +1 -3
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +32 -49
- package/dist/server/src/api/web/hub-tools.d.ts +2 -2
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +3 -54
- package/dist/server/src/api/web/mcp-status.d.ts +1 -1
- package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
- package/dist/server/src/api/web/mcp-status.js +71 -30
- package/dist/server/src/api/web/resources.d.ts.map +1 -1
- package/dist/server/src/api/web/resources.js +28 -22
- package/dist/server/src/api/web/search.d.ts +2 -16
- package/dist/server/src/api/web/search.d.ts.map +1 -1
- package/dist/server/src/api/web/search.js +24 -45
- package/dist/server/src/api/web/servers.d.ts +3 -3
- package/dist/server/src/api/web/servers.d.ts.map +1 -1
- package/dist/server/src/api/web/servers.js +70 -25
- package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
- package/dist/server/src/api/ws/ws-handler.js +4 -2
- package/dist/server/src/app.d.ts.map +1 -1
- package/dist/server/src/app.js +0 -2
- package/dist/server/src/cli/commands/list.js +2 -2
- package/dist/server/src/cli/commands/server.d.ts +57 -0
- package/dist/server/src/cli/commands/server.d.ts.map +1 -0
- package/dist/server/src/cli/commands/server.js +169 -0
- package/dist/server/src/cli/commands/status.d.ts.map +1 -1
- package/dist/server/src/cli/commands/status.js +41 -30
- package/dist/server/src/cli/index.d.ts.map +1 -1
- package/dist/server/src/cli/index.js +2 -1
- package/dist/server/src/cli/server.d.ts +11 -2
- package/dist/server/src/cli/server.d.ts.map +1 -1
- package/dist/server/src/config/config-change-logger.d.ts +22 -0
- package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
- package/dist/server/src/config/config-change-logger.js +135 -11
- package/dist/server/src/config/config-loader.d.ts +6 -5
- package/dist/server/src/config/config-loader.d.ts.map +1 -1
- package/dist/server/src/config/config-loader.js +54 -16
- package/dist/server/src/config/config-manager.d.ts +51 -43
- package/dist/server/src/config/config-manager.d.ts.map +1 -1
- package/dist/server/src/config/config-manager.js +84 -66
- package/dist/server/src/config/config-migrator.d.ts +82 -0
- package/dist/server/src/config/config-migrator.d.ts.map +1 -0
- package/dist/server/src/config/config-migrator.js +348 -0
- package/dist/server/src/config/config-saver.d.ts +2 -0
- package/dist/server/src/config/config-saver.d.ts.map +1 -1
- package/dist/server/src/config/config-saver.js +8 -2
- package/dist/server/src/config/config.schema.d.ts +10 -104
- package/dist/server/src/config/config.schema.d.ts.map +1 -1
- package/dist/server/src/config/config.schema.js +15 -99
- package/dist/server/src/config/path-validator.d.ts +27 -0
- package/dist/server/src/config/path-validator.d.ts.map +1 -0
- package/dist/server/src/config/path-validator.js +53 -0
- package/dist/server/src/config/server-config-manager.d.ts +37 -31
- package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
- package/dist/server/src/config/server-config-manager.js +222 -66
- package/dist/server/src/config/type-converter.d.ts.map +1 -1
- package/dist/server/src/config/type-converter.js +3 -2
- package/dist/server/src/models/event.model.d.ts +17 -10
- package/dist/server/src/models/event.model.d.ts.map +1 -1
- package/dist/server/src/models/server.model.d.ts +17 -3
- package/dist/server/src/models/server.model.d.ts.map +1 -1
- package/dist/server/src/models/server.model.js +2 -1
- package/dist/server/src/models/system-tools.constants.d.ts +10 -27
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
- package/dist/server/src/models/system-tools.constants.js +4 -8
- package/dist/server/src/pid/manager.d.ts.map +1 -1
- package/dist/server/src/pid/manager.js +2 -1
- package/dist/server/src/server/dev-server.js +34 -20
- package/dist/server/src/server/runner.d.ts.map +1 -1
- package/dist/server/src/server/runner.js +41 -26
- package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +286 -241
- package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
- package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
- package/dist/server/src/services/connection/tool-cache.js +50 -55
- package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
- package/dist/server/src/services/gateway/gateway.service.js +53 -23
- package/dist/server/src/services/gateway/global-transport.d.ts +19 -0
- package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
- package/dist/server/src/services/gateway/global-transport.js +66 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
- package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
- package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +20 -80
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
- package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
- package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
- package/dist/server/src/services/gateway/types.d.ts +2 -1
- package/dist/server/src/services/gateway/types.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.d.ts +32 -238
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.js +89 -267
- package/dist/server/src/services/hub-tools/index.d.ts +1 -3
- package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/index.js +1 -2
- package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
- package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
- package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
- package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +24 -1
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +259 -39
- package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/server-selector.js +44 -37
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
- package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
- package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/tool-search.js +10 -4
- package/dist/server/src/services/hub-tools/types.d.ts +2 -2
- package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.d.ts +43 -72
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.js +185 -110
- package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/system-tool-handler.js +7 -17
- package/dist/server/src/utils/composite-key.d.ts +29 -0
- package/dist/server/src/utils/composite-key.d.ts.map +1 -0
- package/dist/server/src/utils/composite-key.js +39 -0
- package/dist/server/src/utils/error-handler.d.ts.map +1 -1
- package/dist/server/src/utils/error-handler.js +3 -2
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/utils/index.js +2 -0
- package/dist/server/src/utils/instance-id.d.ts +22 -0
- package/dist/server/src/utils/instance-id.d.ts.map +1 -0
- package/dist/server/src/utils/instance-id.js +59 -0
- package/dist/server/src/utils/json-utils.d.ts +4 -4
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +4 -4
- package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
- package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +82 -5
- package/dist/server/src/utils/logger/log-modules.d.ts +15 -9
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +8 -6
- package/dist/server/src/utils/parameter-validator.d.ts +10 -0
- package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
- package/dist/server/src/utils/parameter-validator.js +53 -0
- package/dist/server/src/utils/process-tree.d.ts +49 -0
- package/dist/server/src/utils/process-tree.d.ts.map +1 -0
- package/dist/server/src/utils/process-tree.js +285 -0
- package/dist/server/src/utils/sort-utils.d.ts +40 -0
- package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
- package/dist/server/src/utils/sort-utils.js +131 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
- package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/sse-transport.js +55 -9
- package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
- package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/stdio-transport.js +66 -247
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
- package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
- package/dist/server/src/utils/transports/transport-factory.js +31 -11
- package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
- package/dist/server/src/utils/version.d.ts +11 -0
- package/dist/server/src/utils/version.d.ts.map +1 -0
- package/dist/server/src/utils/version.js +57 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
- package/dist/server/tests/server.test.js +27 -16
- package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
- package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
- package/dist/server/tests/temp/temp-run-docling.js +53 -0
- package/dist/server/tests/types/test-helpers.d.ts +1 -2
- package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
- package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
- package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-saver.test.js +200 -0
- package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config.schema.test.js +347 -0
- package/dist/server/tests/unit/server/runner.test.js +86 -62
- package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
- package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -320
- package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
- package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
- package/dist/server/tests/unit/services/session-manager.test.js +26 -436
- package/dist/server/tests/unit/utils/config.test.js +88 -186
- package/dist/server/tests/unit/utils/json-utils.test.js +18 -18
- package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
- package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
- package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
- package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
- package/package.json +3 -1
- package/dist/client/assets/ResourceDetailView-Bf-1ffbk.js +0 -1
- package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
- package/dist/client/assets/ResourcesView-g5x4xCPh.js +0 -1
- package/dist/client/assets/ServerDashboard-Chpne8Q0.css +0 -1
- package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +0 -2
- package/dist/client/assets/ServerListView-dV2XrPjo.js +0 -32
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
- package/dist/client/assets/SessionsView-Ckd38lj1.js +0 -1
- package/dist/client/assets/SettingsView-BJUdepEQ.js +0 -1
- package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +0 -1
- package/dist/client/assets/ToolsView-0c2eputu.js +0 -1
- package/dist/client/assets/ToolsView-E3Ps9c7i.css +0 -1
- package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
- package/dist/client/assets/el-form-item-ClFnj49k.js +0 -12
- package/dist/client/assets/el-input-CDnuSKVZ.js +0 -1
- package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
- package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
- package/dist/client/assets/el-overlay-CzMkXyYy.js +0 -1
- package/dist/client/assets/el-select-DvjGddk_.js +0 -1
- package/dist/client/assets/el-tab-pane-C_DQMcwe.js +0 -1
- package/dist/client/assets/el-table-column-CASRIbZM.js +0 -1
- package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
- package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
- package/dist/client/assets/el-tag-npbwux4f.js +0 -1
- package/dist/client/assets/index-CCnAxNF8.js +0 -2
- package/dist/client/assets/index-d1DZeSfz.js +0 -1
- package/dist/client/assets/omit-DPsOVNIJ.js +0 -1
- package/dist/client/assets/vnode-CHomNjgN.js +0 -1
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { logger, LOG_MODULES } from './logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Windows Process Tree Utility Module
|
|
5
|
+
*
|
|
6
|
+
* This module provides process tree management utilities specifically for Windows.
|
|
7
|
+
* It handles the case where shell: true spawns cmd.exe which then spawns
|
|
8
|
+
* the actual working process (like node.exe, python.exe, etc.).
|
|
9
|
+
*
|
|
10
|
+
* On non-Windows platforms, all methods return safe default values
|
|
11
|
+
* and don't perform any actual operations.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Gets all child process IDs for a given parent PID on Windows.
|
|
15
|
+
*
|
|
16
|
+
* @param pid - Parent process ID
|
|
17
|
+
@returns Promise resolving to array of child PID
|
|
18
|
+
*/
|
|
19
|
+
export async function getChildren(pid) {
|
|
20
|
+
if (process.platform !== 'win32') {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const result = await executePowerShellCommand(`Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq ${pid} } | Select-Object -ExpandProperty ProcessId`);
|
|
25
|
+
const pids = parsePidList(result);
|
|
26
|
+
return pids;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
logger.debug(`Failed to get children for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Gets the entire process tree (all descendants) for a given PID.
|
|
35
|
+
* Includes the original PID at the beginning of the array.
|
|
36
|
+
*
|
|
37
|
+
* @param pid - Root process ID
|
|
38
|
+
* @returns Array of all process IDs in the tree
|
|
39
|
+
*/
|
|
40
|
+
export async function getProcessTree(pid) {
|
|
41
|
+
if (process.platform !== 'win32') {
|
|
42
|
+
return [pid];
|
|
43
|
+
}
|
|
44
|
+
const tree = [pid];
|
|
45
|
+
const queue = [pid];
|
|
46
|
+
while (queue.length > 0) {
|
|
47
|
+
const current = queue.shift();
|
|
48
|
+
const children = await getChildren(current);
|
|
49
|
+
for (const child of children) {
|
|
50
|
+
if (!tree.includes(child)) {
|
|
51
|
+
tree.push(child);
|
|
52
|
+
queue.push(child);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return tree;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Checks if any process in the process tree is still running.
|
|
60
|
+
*
|
|
61
|
+
* @param pid - Root process ID
|
|
62
|
+
* @returns True if any process in the tree is running
|
|
63
|
+
*/
|
|
64
|
+
export async function isAnyInTreeRunning(pid) {
|
|
65
|
+
if (process.platform !== 'win32') {
|
|
66
|
+
return isProcessRunning(pid);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const tree = await getProcessTree(pid);
|
|
70
|
+
for (const processId of tree) {
|
|
71
|
+
if (isProcessRunning(processId)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger.debug(`Error checking process tree for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
|
|
79
|
+
return isProcessRunning(pid);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Tries to find the actual working process PID in the tree.
|
|
84
|
+
* This looks for processes that are likely the actual worker
|
|
85
|
+
* (node.exe, python.exe, etc.) rather than shell processes.
|
|
86
|
+
*
|
|
87
|
+
* @param pid - Root process ID
|
|
88
|
+
* @returns Working process PID if found, undefined otherwise
|
|
89
|
+
*/
|
|
90
|
+
export async function getWorkingProcessPid(pid) {
|
|
91
|
+
if (process.platform !== 'win32') {
|
|
92
|
+
return pid;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const tree = await getProcessTree(pid);
|
|
96
|
+
// If only the root process is in the tree, return it
|
|
97
|
+
if (tree.length === 1) {
|
|
98
|
+
return pid;
|
|
99
|
+
}
|
|
100
|
+
// Get process names for all PIDs in the tree
|
|
101
|
+
const processInfo = await getProcessInfo(tree);
|
|
102
|
+
// Filter out shell processes (cmd.exe, powershell.exe, etc.)
|
|
103
|
+
const workerProcesses = processInfo.filter((info) => !isShellProcess(info.name));
|
|
104
|
+
if (workerProcesses.length > 0) {
|
|
105
|
+
// Prefer the deepest (last) worker process in the tree
|
|
106
|
+
return workerProcesses[workerProcesses.length - 1].pid;
|
|
107
|
+
}
|
|
108
|
+
// If no worker processes found, return the last process in the tree
|
|
109
|
+
return tree[tree.length - 1];
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
logger.debug(`Error finding working process for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
|
|
113
|
+
return pid;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Kills the entire process tree.
|
|
118
|
+
*
|
|
119
|
+
* @param pid - Root process ID
|
|
120
|
+
* @param signal - Signal to send (default: SIGTERM)
|
|
121
|
+
*/
|
|
122
|
+
export async function killProcessTree(pid, signal = 'SIGTERM') {
|
|
123
|
+
if (process.platform !== 'win32') {
|
|
124
|
+
// On non-Windows, just kill the single process
|
|
125
|
+
try {
|
|
126
|
+
process.kill(pid, signal);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Process might already be dead
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const tree = await getProcessTree(pid);
|
|
135
|
+
// Kill processes in reverse order (children first, parent last)
|
|
136
|
+
for (let i = tree.length - 1; i >= 0; i--) {
|
|
137
|
+
const processId = tree[i];
|
|
138
|
+
try {
|
|
139
|
+
process.kill(processId, signal);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Process might already be dead
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
logger.debug(`Error killing process tree for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
|
|
148
|
+
// Fallback: try to kill just the root process
|
|
149
|
+
try {
|
|
150
|
+
process.kill(pid, signal);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Process might already be dead
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// ==================== Internal Helper Functions ====================
|
|
158
|
+
/**
|
|
159
|
+
* Checks if a single process is running.
|
|
160
|
+
*
|
|
161
|
+
* @param pid - Process ID
|
|
162
|
+
* @returns True if process is running
|
|
163
|
+
*/
|
|
164
|
+
function isProcessRunning(pid) {
|
|
165
|
+
try {
|
|
166
|
+
process.kill(pid, 0);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Executes a PowerShell command and returns the output.
|
|
175
|
+
*
|
|
176
|
+
* @param command - PowerShell command
|
|
177
|
+
* @returns Command output
|
|
178
|
+
*/
|
|
179
|
+
async function executePowerShellCommand(command) {
|
|
180
|
+
return new Promise((resolve, reject) => {
|
|
181
|
+
const ps = spawn('powershell.exe', ['-Command', command], {
|
|
182
|
+
windowsHide: true,
|
|
183
|
+
stdio: ['ignore', 'pipe', 'pipe']
|
|
184
|
+
});
|
|
185
|
+
let stdout = '';
|
|
186
|
+
let stderr = '';
|
|
187
|
+
ps.stdout?.on('data', (data) => {
|
|
188
|
+
stdout += data.toString();
|
|
189
|
+
});
|
|
190
|
+
ps.stderr?.on('data', (data) => {
|
|
191
|
+
stderr += data.toString();
|
|
192
|
+
});
|
|
193
|
+
ps.on('close', (code) => {
|
|
194
|
+
if (code === 0) {
|
|
195
|
+
resolve(stdout.trim());
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
reject(new Error(`PowerShell command failed: ${stderr || stdout}`));
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
ps.on('error', (error) => {
|
|
202
|
+
reject(error);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Parses a list of PIDs from command output.
|
|
208
|
+
*
|
|
209
|
+
* @param output - Command output
|
|
210
|
+
* * @returns Array of PIDs
|
|
211
|
+
*/
|
|
212
|
+
function parsePidList(output) {
|
|
213
|
+
const lines = output
|
|
214
|
+
.split('\n')
|
|
215
|
+
.map((line) => line.trim())
|
|
216
|
+
.filter((line) => line.length > 0);
|
|
217
|
+
const pids = [];
|
|
218
|
+
for (const line of lines) {
|
|
219
|
+
const pid = parseInt(line, 10);
|
|
220
|
+
if (!isNaN(pid) && pid > 0) {
|
|
221
|
+
pids.push(pid);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return pids;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Gets process information for multiple PIDs.
|
|
228
|
+
*
|
|
229
|
+
* @param pids - Array of process IDs
|
|
230
|
+
* @returns Array of process info objects
|
|
231
|
+
*/
|
|
232
|
+
async function getProcessInfo(pids) {
|
|
233
|
+
if (pids.length === 0) {
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
const result = await executePowerShellCommand(`Get-CimInstance Win32_Process | Where-Object { ${pids.map((pid) => `$_.ProcessId -eq ${pid}`).join(' -or ')} } | Select-Object ProcessId, Name | ConvertTo-Csv -NoTypeInformation`);
|
|
237
|
+
return parseProcessInfoCsv(result);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Parses process info from CSV output.
|
|
241
|
+
*
|
|
242
|
+
* @param csvOutput - CSV output from PowerShell
|
|
243
|
+
* @ *returns Array of process info
|
|
244
|
+
*/
|
|
245
|
+
function parseProcessInfoCsv(csvOutput) {
|
|
246
|
+
const lines = csvOutput
|
|
247
|
+
.split('\n')
|
|
248
|
+
.map((line) => line.trim())
|
|
249
|
+
.filter((line) => line.length > 0);
|
|
250
|
+
if (lines.length < 2) {
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
const info = [];
|
|
254
|
+
// Skip header line
|
|
255
|
+
for (let i = 1; i < lines.length; i++) {
|
|
256
|
+
const parts = lines[i].split(',').map((p) => p.trim().replace(/^"|"$/g, ''));
|
|
257
|
+
if (parts.length >= 2) {
|
|
258
|
+
const pid = parseInt(parts[0], 10);
|
|
259
|
+
if (!isNaN(pid) && pid > 0) {
|
|
260
|
+
info.push({
|
|
261
|
+
pid,
|
|
262
|
+
name: parts[1].toLowerCase()
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return info;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Checks if a process name is a shell process.
|
|
271
|
+
*
|
|
272
|
+
* @param processName - Process name (should be lowercase)
|
|
273
|
+
* @returns True if it's a shell process
|
|
274
|
+
*/
|
|
275
|
+
function isShellProcess(processName) {
|
|
276
|
+
const shellProcesses = [
|
|
277
|
+
'cmd.exe',
|
|
278
|
+
'powershell.exe',
|
|
279
|
+
'pwsh.exe',
|
|
280
|
+
'command.com',
|
|
281
|
+
'sh.exe',
|
|
282
|
+
'bash.exe'
|
|
283
|
+
];
|
|
284
|
+
return shellProcesses.includes(processName.toLowerCase());
|
|
285
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Object key sorting utilities for consistent configuration.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Sorts object keys alphabetically using localeCompare.
|
|
6
|
+
* Returns a new object with sorted keys, preserving the original object.
|
|
7
|
+
*
|
|
8
|
+
* @param obj - Object to sort
|
|
9
|
+
* @returns New object with sorted keys
|
|
10
|
+
*/
|
|
11
|
+
export declare function sortObjectKeys<T extends Record<string, unknown>>(obj: T): T;
|
|
12
|
+
/**
|
|
13
|
+
* Sorts object keys alphabetically, case-insensitive.
|
|
14
|
+
* Returns a new object with sorted keys, preserving the original object and original key case.
|
|
15
|
+
*
|
|
16
|
+
* @param obj - Object to sort
|
|
17
|
+
* @returns New object with sorted keys (case-insensitive sort)
|
|
18
|
+
*/
|
|
19
|
+
export declare function sortObjectKeysCaseInsensitive<T extends Record<string, unknown>>(obj: T): T;
|
|
20
|
+
/**
|
|
21
|
+
* Recursively sorts all object keys in a nested structure.
|
|
22
|
+
* Returns a new object with all nested keys sorted, preserving the original object.
|
|
23
|
+
*
|
|
24
|
+
* @param obj - Object to sort recursively
|
|
25
|
+
* @returns New object with all nested keys sorted
|
|
26
|
+
*/
|
|
27
|
+
export declare function sortObjectKeysDeep<T>(obj: T): T;
|
|
28
|
+
/**
|
|
29
|
+
* Sorts env and headers objects in a server configuration.
|
|
30
|
+
* This is a convenience function for server template/instance configurations.
|
|
31
|
+
* Also normalizes URL fields by removing trailing slashes.
|
|
32
|
+
*
|
|
33
|
+
* @param config - Server configuration object with optional env and headers
|
|
34
|
+
* @returns New object with sorted env and headers keys and normalized URLs
|
|
35
|
+
*/
|
|
36
|
+
export declare function sortServerConfigEnvHeaders<T extends {
|
|
37
|
+
env?: Record<string, string>;
|
|
38
|
+
headers?: Record<string, string>;
|
|
39
|
+
}>(config: T): T;
|
|
40
|
+
//# sourceMappingURL=sort-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/sort-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoDH;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAW3E;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAa1F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAmB/C;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,CAAC,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAC5E,MAAM,EAAE,CAAC,GAAG,CAAC,CAcd"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Object key sorting utilities for consistent configuration.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Normalizes a URL string by removing trailing slashes.
|
|
6
|
+
*
|
|
7
|
+
* @param url - The URL to normalize
|
|
8
|
+
* @returns Normalized URL
|
|
9
|
+
*/
|
|
10
|
+
function normalizeUrl(url) {
|
|
11
|
+
return url.replace(/\/+$/, '');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Normalizes URL fields in a configuration object.
|
|
15
|
+
* Currently handles:
|
|
16
|
+
* - url fields at any level
|
|
17
|
+
* - proxy.url fields
|
|
18
|
+
*
|
|
19
|
+
* @param obj - Object to normalize
|
|
20
|
+
* @returns New object with normalized URLs
|
|
21
|
+
*/
|
|
22
|
+
function normalizeConfigUrls(obj) {
|
|
23
|
+
if (!obj) {
|
|
24
|
+
return obj;
|
|
25
|
+
}
|
|
26
|
+
if (Array.isArray(obj)) {
|
|
27
|
+
return obj.map((item) => normalizeConfigUrls(item));
|
|
28
|
+
}
|
|
29
|
+
if (typeof obj === 'object') {
|
|
30
|
+
const result = {};
|
|
31
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
32
|
+
if (key === 'url' && typeof value === 'string') {
|
|
33
|
+
result[key] = normalizeUrl(value);
|
|
34
|
+
}
|
|
35
|
+
else if (key === 'proxy' && typeof value === 'object' && value !== null) {
|
|
36
|
+
const proxy = value;
|
|
37
|
+
if (typeof proxy.url === 'string') {
|
|
38
|
+
result[key] = { ...proxy, url: normalizeUrl(proxy.url) };
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
result[key] = normalizeConfigUrls(value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
result[key] = normalizeConfigUrls(value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
return obj;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sorts object keys alphabetically using localeCompare.
|
|
54
|
+
* Returns a new object with sorted keys, preserving the original object.
|
|
55
|
+
*
|
|
56
|
+
* @param obj - Object to sort
|
|
57
|
+
* @returns New object with sorted keys
|
|
58
|
+
*/
|
|
59
|
+
export function sortObjectKeys(obj) {
|
|
60
|
+
if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
|
|
61
|
+
return obj;
|
|
62
|
+
}
|
|
63
|
+
const sortedObj = {};
|
|
64
|
+
const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b));
|
|
65
|
+
for (const key of keys) {
|
|
66
|
+
sortedObj[key] = obj[key];
|
|
67
|
+
}
|
|
68
|
+
return sortedObj;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Sorts object keys alphabetically, case-insensitive.
|
|
72
|
+
* Returns a new object with sorted keys, preserving the original object and original key case.
|
|
73
|
+
*
|
|
74
|
+
* @param obj - Object to sort
|
|
75
|
+
* @returns New object with sorted keys (case-insensitive sort)
|
|
76
|
+
*/
|
|
77
|
+
export function sortObjectKeysCaseInsensitive(obj) {
|
|
78
|
+
if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
|
|
79
|
+
return obj;
|
|
80
|
+
}
|
|
81
|
+
const sortedObj = {};
|
|
82
|
+
const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));
|
|
83
|
+
for (const key of keys) {
|
|
84
|
+
sortedObj[key] = obj[key];
|
|
85
|
+
}
|
|
86
|
+
return sortedObj;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Recursively sorts all object keys in a nested structure.
|
|
90
|
+
* Returns a new object with all nested keys sorted, preserving the original object.
|
|
91
|
+
*
|
|
92
|
+
* @param obj - Object to sort recursively
|
|
93
|
+
* @returns New object with all nested keys sorted
|
|
94
|
+
*/
|
|
95
|
+
export function sortObjectKeysDeep(obj) {
|
|
96
|
+
if (!obj) {
|
|
97
|
+
return obj;
|
|
98
|
+
}
|
|
99
|
+
if (Array.isArray(obj)) {
|
|
100
|
+
return obj.map((item) => sortObjectKeysDeep(item));
|
|
101
|
+
}
|
|
102
|
+
if (typeof obj === 'object') {
|
|
103
|
+
const sortedObj = {};
|
|
104
|
+
const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b));
|
|
105
|
+
for (const key of keys) {
|
|
106
|
+
sortedObj[key] = sortObjectKeysDeep(obj[key]);
|
|
107
|
+
}
|
|
108
|
+
return sortedObj;
|
|
109
|
+
}
|
|
110
|
+
return obj;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Sorts env and headers objects in a server configuration.
|
|
114
|
+
* This is a convenience function for server template/instance configurations.
|
|
115
|
+
* Also normalizes URL fields by removing trailing slashes.
|
|
116
|
+
*
|
|
117
|
+
* @param config - Server configuration object with optional env and headers
|
|
118
|
+
* @returns New object with sorted env and headers keys and normalized URLs
|
|
119
|
+
*/
|
|
120
|
+
export function sortServerConfigEnvHeaders(config) {
|
|
121
|
+
// First normalize URLs
|
|
122
|
+
const normalized = normalizeConfigUrls(config);
|
|
123
|
+
const result = { ...normalized };
|
|
124
|
+
if (result.env) {
|
|
125
|
+
result.env = sortObjectKeysCaseInsensitive(result.env);
|
|
126
|
+
}
|
|
127
|
+
if (result.headers) {
|
|
128
|
+
result.headers = sortObjectKeysCaseInsensitive(result.headers);
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
@@ -31,9 +31,12 @@ export declare class SseTransport implements Transport {
|
|
|
31
31
|
private headers;
|
|
32
32
|
private reconnectInterval;
|
|
33
33
|
private maxReconnectAttempts;
|
|
34
|
+
private proxy?;
|
|
34
35
|
private eventSource;
|
|
35
36
|
private reconnectAttempts;
|
|
36
37
|
private isClosing;
|
|
38
|
+
private _serverName?;
|
|
39
|
+
private _compositeKey?;
|
|
37
40
|
onmessage?: (message: JSONRPCMessage) => void;
|
|
38
41
|
onerror?: (error: Error) => void;
|
|
39
42
|
onclose?: () => void;
|
|
@@ -44,8 +47,20 @@ export declare class SseTransport implements Transport {
|
|
|
44
47
|
* @param headers - Optional HTTP headers to include in the SSE connection request
|
|
45
48
|
* @param reconnectInterval - Time interval (in milliseconds) between reconnection attempts (default: 3000ms)
|
|
46
49
|
* @param maxReconnectAttempts - Maximum number of reconnection attempts before giving up (default: 5)
|
|
50
|
+
* @param proxy - Optional proxy configuration
|
|
51
|
+
* @param serverName - Optional server name for logging
|
|
52
|
+
* @param compositeKey - Optional composite key (serverName-serverIndex) for logging
|
|
47
53
|
*/
|
|
48
|
-
constructor(url: string, headers?: Record<string, string>, reconnectInterval?: number, maxReconnectAttempts?: number
|
|
54
|
+
constructor(url: string, headers?: Record<string, string>, reconnectInterval?: number, maxReconnectAttempts?: number, proxy?: {
|
|
55
|
+
url: string;
|
|
56
|
+
} | undefined, serverName?: string, compositeKey?: string);
|
|
57
|
+
/**
|
|
58
|
+
* Helper method to format log messages with server context.
|
|
59
|
+
*
|
|
60
|
+
* @param message - The base message
|
|
61
|
+
* @returns Formatted message with server context if available
|
|
62
|
+
*/
|
|
63
|
+
private formatLogMessage;
|
|
49
64
|
/**
|
|
50
65
|
* Initializes and starts the SSE connection to the specified URL.
|
|
51
66
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-transport.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/sse-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"sse-transport.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/sse-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAQ1E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,YAAa,YAAW,SAAS;IAuB1C,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,KAAK,CAAC;IA1BhB,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAC,CAAS;IAExB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;;;;;;;;;OAUG;gBAEO,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACpC,iBAAiB,GAAE,MAAa,EAChC,oBAAoB,GAAE,MAAU,EAChC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,YAAA,EAC/B,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM;IAMvB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;;;;;;;;OASG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyG5B;;;;;;;;OAQG;YACW,OAAO;IAOrB;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;;;;;;OAQG;YACW,aAAa;IAQ3B;;;;;;;;;;;;OAYG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAyBnD"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { logger } from '../logger.js';
|
|
2
|
+
import { LOG_MODULES } from '../logger/log-modules.js';
|
|
3
|
+
import { ProxyAgent, fetch as undiciFetch } from 'undici';
|
|
2
4
|
// Use EventSource from the 'eventsource' package for Node.js compatibility
|
|
3
5
|
import { EventSource } from 'eventsource';
|
|
4
6
|
/**
|
|
@@ -32,9 +34,12 @@ export class SseTransport {
|
|
|
32
34
|
headers;
|
|
33
35
|
reconnectInterval;
|
|
34
36
|
maxReconnectAttempts;
|
|
37
|
+
proxy;
|
|
35
38
|
eventSource = null;
|
|
36
39
|
reconnectAttempts = 0;
|
|
37
40
|
isClosing = false;
|
|
41
|
+
_serverName;
|
|
42
|
+
_compositeKey;
|
|
38
43
|
onmessage;
|
|
39
44
|
onerror;
|
|
40
45
|
onclose;
|
|
@@ -45,12 +50,35 @@ export class SseTransport {
|
|
|
45
50
|
* @param headers - Optional HTTP headers to include in the SSE connection request
|
|
46
51
|
* @param reconnectInterval - Time interval (in milliseconds) between reconnection attempts (default: 3000ms)
|
|
47
52
|
* @param maxReconnectAttempts - Maximum number of reconnection attempts before giving up (default: 5)
|
|
53
|
+
* @param proxy - Optional proxy configuration
|
|
54
|
+
* @param serverName - Optional server name for logging
|
|
55
|
+
* @param compositeKey - Optional composite key (serverName-serverIndex) for logging
|
|
48
56
|
*/
|
|
49
|
-
constructor(url, headers = {}, reconnectInterval = 3000, maxReconnectAttempts = 5) {
|
|
57
|
+
constructor(url, headers = {}, reconnectInterval = 3000, maxReconnectAttempts = 5, proxy, serverName, compositeKey) {
|
|
50
58
|
this.url = url;
|
|
51
59
|
this.headers = headers;
|
|
52
60
|
this.reconnectInterval = reconnectInterval;
|
|
53
61
|
this.maxReconnectAttempts = maxReconnectAttempts;
|
|
62
|
+
this.proxy = proxy;
|
|
63
|
+
this._serverName = serverName;
|
|
64
|
+
this._compositeKey = compositeKey;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Helper method to format log messages with server context.
|
|
68
|
+
*
|
|
69
|
+
* @param message - The base message
|
|
70
|
+
* @returns Formatted message with server context if available
|
|
71
|
+
*/
|
|
72
|
+
formatLogMessage(message) {
|
|
73
|
+
if (this._compositeKey) {
|
|
74
|
+
return `${message} (compositeKey=${this._compositeKey}, url=${this.url})`;
|
|
75
|
+
}
|
|
76
|
+
else if (this._serverName) {
|
|
77
|
+
return `${message} (server=${this._serverName}, url=${this.url})`;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return `${message} (url=${this.url})`;
|
|
81
|
+
}
|
|
54
82
|
}
|
|
55
83
|
/**
|
|
56
84
|
* Initializes and starts the SSE connection to the specified URL.
|
|
@@ -75,6 +103,24 @@ export class SseTransport {
|
|
|
75
103
|
if (Object.keys(this.headers).length > 0) {
|
|
76
104
|
options.headers = this.headers;
|
|
77
105
|
}
|
|
106
|
+
const proxyInfo = this.proxy?.url ? `, proxy=${this.proxy.url}` : '';
|
|
107
|
+
logger.info(this.formatLogMessage(`Attempting to connect to SSE server${proxyInfo}`), LOG_MODULES.SSE_TRANSPORT);
|
|
108
|
+
// Add proxy support if configured
|
|
109
|
+
if (this.proxy?.url) {
|
|
110
|
+
const agent = new ProxyAgent(this.proxy.url);
|
|
111
|
+
// Create custom fetch function with proxy
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
113
|
+
const customFetch = (input, init) => {
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
115
|
+
const fetchOptions = {
|
|
116
|
+
...init,
|
|
117
|
+
dispatcher: agent
|
|
118
|
+
};
|
|
119
|
+
return undiciFetch(input, fetchOptions);
|
|
120
|
+
};
|
|
121
|
+
options.fetch = customFetch;
|
|
122
|
+
logger.info(this.formatLogMessage(`SSE transport configured with proxy: ${this.proxy.url}`), LOG_MODULES.SSE_TRANSPORT);
|
|
123
|
+
}
|
|
78
124
|
this.eventSource = new EventSource(this.url, options);
|
|
79
125
|
this.eventSource.onmessage = (event) => {
|
|
80
126
|
try {
|
|
@@ -83,34 +129,34 @@ export class SseTransport {
|
|
|
83
129
|
this.reconnectAttempts = 0; // Reset on successful message
|
|
84
130
|
}
|
|
85
131
|
catch (error) {
|
|
86
|
-
logger.error('Failed to parse SSE message
|
|
132
|
+
logger.error(this.formatLogMessage('Failed to parse SSE message'), error, LOG_MODULES.SSE_TRANSPORT);
|
|
87
133
|
this.onerror?.(new Error(`Invalid JSON in SSE message: ${event.data}`));
|
|
88
134
|
}
|
|
89
135
|
};
|
|
90
136
|
this.eventSource.onerror = () => {
|
|
91
137
|
const error = new Error(`SSE connection error for ${this.url}`);
|
|
92
|
-
logger.error('SSE connection error
|
|
138
|
+
logger.error(this.formatLogMessage('SSE connection error'), error, LOG_MODULES.SSE_TRANSPORT);
|
|
93
139
|
if (!this.isClosing) {
|
|
94
140
|
this.reconnectAttempts++;
|
|
95
141
|
if (this.reconnectAttempts <= this.maxReconnectAttempts) {
|
|
96
|
-
logger.info(`Attempting to reconnect SSE (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`);
|
|
142
|
+
logger.info(this.formatLogMessage(`Attempting to reconnect SSE (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`), LOG_MODULES.SSE_TRANSPORT);
|
|
97
143
|
setTimeout(() => {
|
|
98
144
|
this.restart();
|
|
99
145
|
}, this.reconnectInterval);
|
|
100
146
|
}
|
|
101
147
|
else {
|
|
102
|
-
logger.error('Max reconnection attempts reached for SSE');
|
|
148
|
+
logger.error(this.formatLogMessage('Max reconnection attempts reached for SSE'), LOG_MODULES.SSE_TRANSPORT);
|
|
103
149
|
this.onerror?.(error);
|
|
104
150
|
this.closeInternal();
|
|
105
151
|
}
|
|
106
152
|
}
|
|
107
153
|
};
|
|
108
154
|
this.eventSource.onopen = () => {
|
|
109
|
-
logger.info(
|
|
155
|
+
logger.info(this.formatLogMessage('SSE connection opened'), LOG_MODULES.SSE_TRANSPORT);
|
|
110
156
|
};
|
|
111
157
|
}
|
|
112
158
|
catch (error) {
|
|
113
|
-
logger.error('Failed to create SSE connection
|
|
159
|
+
logger.error(this.formatLogMessage('Failed to create SSE connection'), error, LOG_MODULES.SSE_TRANSPORT);
|
|
114
160
|
throw error;
|
|
115
161
|
}
|
|
116
162
|
}
|
|
@@ -180,10 +226,10 @@ export class SseTransport {
|
|
|
180
226
|
// Type-safe way to access message properties
|
|
181
227
|
const messageId = 'id' in message ? String(message.id) : 'unknown';
|
|
182
228
|
const method = 'method' in message ? String(message.method) : 'unknown';
|
|
183
|
-
logger.warn('Attempted to send message via SSE transport', {
|
|
229
|
+
logger.warn(this.formatLogMessage('Attempted to send message via SSE transport'), {
|
|
184
230
|
messageId,
|
|
185
231
|
method
|
|
186
|
-
});
|
|
232
|
+
}, LOG_MODULES.SSE_TRANSPORT);
|
|
187
233
|
throw error;
|
|
188
234
|
}
|
|
189
235
|
}
|