@daniel.stefan/metalink 1.3.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/README.md +160 -0
- package/package.json +96 -0
- package/packages/cli/dist/bin/cli.d.ts +3 -0
- package/packages/cli/dist/bin/cli.d.ts.map +1 -0
- package/packages/cli/dist/bin/cli.js +4 -0
- package/packages/cli/dist/bin/cli.js.map +1 -0
- package/packages/cli/dist/commands/config/init.d.ts +9 -0
- package/packages/cli/dist/commands/config/init.d.ts.map +1 -0
- package/packages/cli/dist/commands/config/init.js +38 -0
- package/packages/cli/dist/commands/config/init.js.map +1 -0
- package/packages/cli/dist/commands/config/validate.d.ts +9 -0
- package/packages/cli/dist/commands/config/validate.d.ts.map +1 -0
- package/packages/cli/dist/commands/config/validate.js +34 -0
- package/packages/cli/dist/commands/config/validate.js.map +1 -0
- package/packages/cli/dist/commands/daemon/restart.d.ts +15 -0
- package/packages/cli/dist/commands/daemon/restart.d.ts.map +1 -0
- package/packages/cli/dist/commands/daemon/restart.js +184 -0
- package/packages/cli/dist/commands/daemon/restart.js.map +1 -0
- package/packages/cli/dist/commands/daemon/start.d.ts +7 -0
- package/packages/cli/dist/commands/daemon/start.d.ts.map +1 -0
- package/packages/cli/dist/commands/daemon/start.js +85 -0
- package/packages/cli/dist/commands/daemon/start.js.map +1 -0
- package/packages/cli/dist/commands/daemon/status.d.ts +7 -0
- package/packages/cli/dist/commands/daemon/status.d.ts.map +1 -0
- package/packages/cli/dist/commands/daemon/status.js +69 -0
- package/packages/cli/dist/commands/daemon/status.js.map +1 -0
- package/packages/cli/dist/commands/daemon/stop.d.ts +8 -0
- package/packages/cli/dist/commands/daemon/stop.d.ts.map +1 -0
- package/packages/cli/dist/commands/daemon/stop.js +77 -0
- package/packages/cli/dist/commands/daemon/stop.js.map +1 -0
- package/packages/cli/dist/commands/import/mcpm.d.ts +10 -0
- package/packages/cli/dist/commands/import/mcpm.d.ts.map +1 -0
- package/packages/cli/dist/commands/import/mcpm.js +58 -0
- package/packages/cli/dist/commands/import/mcpm.js.map +1 -0
- package/packages/cli/dist/commands/safety/add-risky-pattern.d.ts +16 -0
- package/packages/cli/dist/commands/safety/add-risky-pattern.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/add-risky-pattern.js +72 -0
- package/packages/cli/dist/commands/safety/add-risky-pattern.js.map +1 -0
- package/packages/cli/dist/commands/safety/add-risky.d.ts +12 -0
- package/packages/cli/dist/commands/safety/add-risky.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/add-risky.js +52 -0
- package/packages/cli/dist/commands/safety/add-risky.js.map +1 -0
- package/packages/cli/dist/commands/safety/add-safe-pattern.d.ts +16 -0
- package/packages/cli/dist/commands/safety/add-safe-pattern.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/add-safe-pattern.js +72 -0
- package/packages/cli/dist/commands/safety/add-safe-pattern.js.map +1 -0
- package/packages/cli/dist/commands/safety/add-safe.d.ts +12 -0
- package/packages/cli/dist/commands/safety/add-safe.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/add-safe.js +52 -0
- package/packages/cli/dist/commands/safety/add-safe.js.map +1 -0
- package/packages/cli/dist/commands/safety/check.d.ts +9 -0
- package/packages/cli/dist/commands/safety/check.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/check.js +36 -0
- package/packages/cli/dist/commands/safety/check.js.map +1 -0
- package/packages/cli/dist/commands/safety/export.d.ts +10 -0
- package/packages/cli/dist/commands/safety/export.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/export.js +48 -0
- package/packages/cli/dist/commands/safety/export.js.map +1 -0
- package/packages/cli/dist/commands/safety/import.d.ts +12 -0
- package/packages/cli/dist/commands/safety/import.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/import.js +78 -0
- package/packages/cli/dist/commands/safety/import.js.map +1 -0
- package/packages/cli/dist/commands/safety/index.d.ts +8 -0
- package/packages/cli/dist/commands/safety/index.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/index.js +46 -0
- package/packages/cli/dist/commands/safety/index.js.map +1 -0
- package/packages/cli/dist/commands/safety/list.d.ts +6 -0
- package/packages/cli/dist/commands/safety/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/list.js +77 -0
- package/packages/cli/dist/commands/safety/list.js.map +1 -0
- package/packages/cli/dist/commands/safety/remove.d.ts +9 -0
- package/packages/cli/dist/commands/safety/remove.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/remove.js +46 -0
- package/packages/cli/dist/commands/safety/remove.js.map +1 -0
- package/packages/cli/dist/commands/safety/reset.d.ts +9 -0
- package/packages/cli/dist/commands/safety/reset.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/reset.js +46 -0
- package/packages/cli/dist/commands/safety/reset.js.map +1 -0
- package/packages/cli/dist/commands/safety/validate.d.ts +9 -0
- package/packages/cli/dist/commands/safety/validate.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/validate.js +51 -0
- package/packages/cli/dist/commands/safety/validate.js.map +1 -0
- package/packages/cli/dist/commands/secret/get.d.ts +9 -0
- package/packages/cli/dist/commands/secret/get.d.ts.map +1 -0
- package/packages/cli/dist/commands/secret/get.js +26 -0
- package/packages/cli/dist/commands/secret/get.js.map +1 -0
- package/packages/cli/dist/commands/secret/set.d.ts +10 -0
- package/packages/cli/dist/commands/secret/set.d.ts.map +1 -0
- package/packages/cli/dist/commands/secret/set.js +22 -0
- package/packages/cli/dist/commands/secret/set.js.map +1 -0
- package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.d.ts +2 -0
- package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.js +234 -0
- package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.js.map +1 -0
- package/packages/cli/dist/commands/server/add.d.ts +14 -0
- package/packages/cli/dist/commands/server/add.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/add.js +86 -0
- package/packages/cli/dist/commands/server/add.js.map +1 -0
- package/packages/cli/dist/commands/server/available.d.ts +10 -0
- package/packages/cli/dist/commands/server/available.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/available.js +62 -0
- package/packages/cli/dist/commands/server/available.js.map +1 -0
- package/packages/cli/dist/commands/server/debug.d.ts +18 -0
- package/packages/cli/dist/commands/server/debug.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/debug.js +165 -0
- package/packages/cli/dist/commands/server/debug.js.map +1 -0
- package/packages/cli/dist/commands/server/info.d.ts +13 -0
- package/packages/cli/dist/commands/server/info.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/info.js +62 -0
- package/packages/cli/dist/commands/server/info.js.map +1 -0
- package/packages/cli/dist/commands/server/list.d.ts +10 -0
- package/packages/cli/dist/commands/server/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/list.js +105 -0
- package/packages/cli/dist/commands/server/list.js.map +1 -0
- package/packages/cli/dist/commands/server/refresh-tools.d.ts +13 -0
- package/packages/cli/dist/commands/server/refresh-tools.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/refresh-tools.js +46 -0
- package/packages/cli/dist/commands/server/refresh-tools.js.map +1 -0
- package/packages/cli/dist/commands/server/remove.d.ts +12 -0
- package/packages/cli/dist/commands/server/remove.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/remove.js +39 -0
- package/packages/cli/dist/commands/server/remove.js.map +1 -0
- package/packages/cli/dist/commands/server/restart.d.ts +9 -0
- package/packages/cli/dist/commands/server/restart.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/restart.js +30 -0
- package/packages/cli/dist/commands/server/restart.js.map +1 -0
- package/packages/cli/dist/commands/server/start.d.ts +9 -0
- package/packages/cli/dist/commands/server/start.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/start.js +37 -0
- package/packages/cli/dist/commands/server/start.js.map +1 -0
- package/packages/cli/dist/commands/server/status.d.ts +9 -0
- package/packages/cli/dist/commands/server/status.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/status.js +30 -0
- package/packages/cli/dist/commands/server/status.js.map +1 -0
- package/packages/cli/dist/commands/server/stop.d.ts +9 -0
- package/packages/cli/dist/commands/server/stop.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/stop.js +31 -0
- package/packages/cli/dist/commands/server/stop.js.map +1 -0
- package/packages/cli/dist/commands/server/validate.d.ts +15 -0
- package/packages/cli/dist/commands/server/validate.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/validate.js +87 -0
- package/packages/cli/dist/commands/server/validate.js.map +1 -0
- package/packages/cli/dist/commands/stdio.d.ts +36 -0
- package/packages/cli/dist/commands/stdio.d.ts.map +1 -0
- package/packages/cli/dist/commands/stdio.js +85 -0
- package/packages/cli/dist/commands/stdio.js.map +1 -0
- package/packages/cli/dist/commands/tool/execute-confirm.d.ts +12 -0
- package/packages/cli/dist/commands/tool/execute-confirm.d.ts.map +1 -0
- package/packages/cli/dist/commands/tool/execute-confirm.js +98 -0
- package/packages/cli/dist/commands/tool/execute-confirm.js.map +1 -0
- package/packages/cli/dist/commands/tool/execute.d.ts +12 -0
- package/packages/cli/dist/commands/tool/execute.d.ts.map +1 -0
- package/packages/cli/dist/commands/tool/execute.js +55 -0
- package/packages/cli/dist/commands/tool/execute.js.map +1 -0
- package/packages/cli/dist/commands/tool/list.d.ts +13 -0
- package/packages/cli/dist/commands/tool/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/tool/list.js +91 -0
- package/packages/cli/dist/commands/tool/list.js.map +1 -0
- package/packages/cli/dist/commands/tool/search.d.ts +12 -0
- package/packages/cli/dist/commands/tool/search.d.ts.map +1 -0
- package/packages/cli/dist/commands/tool/search.js +87 -0
- package/packages/cli/dist/commands/tool/search.js.map +1 -0
- package/packages/cli/dist/index.d.ts +2 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +9 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/utils/daemon-checker.d.ts +18 -0
- package/packages/cli/dist/utils/daemon-checker.d.ts.map +1 -0
- package/packages/cli/dist/utils/daemon-checker.js +69 -0
- package/packages/cli/dist/utils/daemon-checker.js.map +1 -0
- package/packages/cli/dist/utils/daemon-endpoint.d.ts +7 -0
- package/packages/cli/dist/utils/daemon-endpoint.d.ts.map +1 -0
- package/packages/cli/dist/utils/daemon-endpoint.js +13 -0
- package/packages/cli/dist/utils/daemon-endpoint.js.map +1 -0
- package/packages/cli/dist/utils/get-configured-port.d.ts +43 -0
- package/packages/cli/dist/utils/get-configured-port.d.ts.map +1 -0
- package/packages/cli/dist/utils/get-configured-port.js +141 -0
- package/packages/cli/dist/utils/get-configured-port.js.map +1 -0
- package/packages/cli/dist/utils/stdio-bridge.d.ts +48 -0
- package/packages/cli/dist/utils/stdio-bridge.d.ts.map +1 -0
- package/packages/cli/dist/utils/stdio-bridge.js +181 -0
- package/packages/cli/dist/utils/stdio-bridge.js.map +1 -0
- package/packages/cli/package.json +48 -0
- package/packages/core/dist/config/defaults.d.ts +36 -0
- package/packages/core/dist/config/defaults.d.ts.map +1 -0
- package/packages/core/dist/config/defaults.js +324 -0
- package/packages/core/dist/config/defaults.js.map +1 -0
- package/packages/core/dist/config/index.d.ts +9 -0
- package/packages/core/dist/config/index.d.ts.map +1 -0
- package/packages/core/dist/config/index.js +14 -0
- package/packages/core/dist/config/index.js.map +1 -0
- package/packages/core/dist/config/loader.d.ts +269 -0
- package/packages/core/dist/config/loader.d.ts.map +1 -0
- package/packages/core/dist/config/loader.js +777 -0
- package/packages/core/dist/config/loader.js.map +1 -0
- package/packages/core/dist/config/registry.d.ts +212 -0
- package/packages/core/dist/config/registry.d.ts.map +1 -0
- package/packages/core/dist/config/registry.js +754 -0
- package/packages/core/dist/config/registry.js.map +1 -0
- package/packages/core/dist/config/schema.d.ts +4352 -0
- package/packages/core/dist/config/schema.d.ts.map +1 -0
- package/packages/core/dist/config/schema.js +267 -0
- package/packages/core/dist/config/schema.js.map +1 -0
- package/packages/core/dist/daemon.d.ts +7 -0
- package/packages/core/dist/daemon.d.ts.map +1 -0
- package/packages/core/dist/daemon.js +116 -0
- package/packages/core/dist/daemon.js.map +1 -0
- package/packages/core/dist/http-client-retry.d.ts +67 -0
- package/packages/core/dist/http-client-retry.d.ts.map +1 -0
- package/packages/core/dist/http-client-retry.js +133 -0
- package/packages/core/dist/http-client-retry.js.map +1 -0
- package/packages/core/dist/http-client-updated.d.ts +147 -0
- package/packages/core/dist/http-client-updated.d.ts.map +1 -0
- package/packages/core/dist/http-client-updated.js +452 -0
- package/packages/core/dist/http-client-updated.js.map +1 -0
- package/packages/core/dist/http-client.d.ts +207 -0
- package/packages/core/dist/http-client.d.ts.map +1 -0
- package/packages/core/dist/http-client.js +704 -0
- package/packages/core/dist/http-client.js.map +1 -0
- package/packages/core/dist/index.d.ts +13 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +23 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/logging/index.d.ts +46 -0
- package/packages/core/dist/logging/index.d.ts.map +1 -0
- package/packages/core/dist/logging/index.js +74 -0
- package/packages/core/dist/logging/index.js.map +1 -0
- package/packages/core/dist/metrics/index.d.ts +339 -0
- package/packages/core/dist/metrics/index.d.ts.map +1 -0
- package/packages/core/dist/metrics/index.js +792 -0
- package/packages/core/dist/metrics/index.js.map +1 -0
- package/packages/core/dist/plugins/index.d.ts +49 -0
- package/packages/core/dist/plugins/index.d.ts.map +1 -0
- package/packages/core/dist/plugins/index.js +82 -0
- package/packages/core/dist/plugins/index.js.map +1 -0
- package/packages/core/dist/secrets/index.d.ts +6 -0
- package/packages/core/dist/secrets/index.d.ts.map +1 -0
- package/packages/core/dist/secrets/index.js +5 -0
- package/packages/core/dist/secrets/index.js.map +1 -0
- package/packages/core/dist/secrets/keyring.d.ts +54 -0
- package/packages/core/dist/secrets/keyring.d.ts.map +1 -0
- package/packages/core/dist/secrets/keyring.js +141 -0
- package/packages/core/dist/secrets/keyring.js.map +1 -0
- package/packages/core/dist/server/batch-executor.d.ts +83 -0
- package/packages/core/dist/server/batch-executor.d.ts.map +1 -0
- package/packages/core/dist/server/batch-executor.js +291 -0
- package/packages/core/dist/server/batch-executor.js.map +1 -0
- package/packages/core/dist/server/circuit-breaker.d.ts +215 -0
- package/packages/core/dist/server/circuit-breaker.d.ts.map +1 -0
- package/packages/core/dist/server/circuit-breaker.js +330 -0
- package/packages/core/dist/server/circuit-breaker.js.map +1 -0
- package/packages/core/dist/server/client-detection.d.ts +40 -0
- package/packages/core/dist/server/client-detection.d.ts.map +1 -0
- package/packages/core/dist/server/client-detection.js +242 -0
- package/packages/core/dist/server/client-detection.js.map +1 -0
- package/packages/core/dist/server/client-profiles.d.ts +102 -0
- package/packages/core/dist/server/client-profiles.d.ts.map +1 -0
- package/packages/core/dist/server/client-profiles.js +254 -0
- package/packages/core/dist/server/client-profiles.js.map +1 -0
- package/packages/core/dist/server/http.d.ts +386 -0
- package/packages/core/dist/server/http.d.ts.map +1 -0
- package/packages/core/dist/server/http.js +4253 -0
- package/packages/core/dist/server/http.js.map +1 -0
- package/packages/core/dist/server/index.d.ts +7 -0
- package/packages/core/dist/server/index.d.ts.map +1 -0
- package/packages/core/dist/server/index.js +6 -0
- package/packages/core/dist/server/index.js.map +1 -0
- package/packages/core/dist/server/manager.d.ts +458 -0
- package/packages/core/dist/server/manager.d.ts.map +1 -0
- package/packages/core/dist/server/manager.js +3255 -0
- package/packages/core/dist/server/manager.js.map +1 -0
- package/packages/core/dist/server/managers/HttpConnectionManager.d.ts +69 -0
- package/packages/core/dist/server/managers/HttpConnectionManager.d.ts.map +1 -0
- package/packages/core/dist/server/managers/HttpConnectionManager.js +214 -0
- package/packages/core/dist/server/managers/HttpConnectionManager.js.map +1 -0
- package/packages/core/dist/server/managers/ProcessManager.d.ts +128 -0
- package/packages/core/dist/server/managers/ProcessManager.d.ts.map +1 -0
- package/packages/core/dist/server/managers/ProcessManager.js +443 -0
- package/packages/core/dist/server/managers/ProcessManager.js.map +1 -0
- package/packages/core/dist/server/managers/SchemaCacheManager.d.ts +152 -0
- package/packages/core/dist/server/managers/SchemaCacheManager.d.ts.map +1 -0
- package/packages/core/dist/server/managers/SchemaCacheManager.js +426 -0
- package/packages/core/dist/server/managers/SchemaCacheManager.js.map +1 -0
- package/packages/core/dist/server/managers/index.d.ts +9 -0
- package/packages/core/dist/server/managers/index.d.ts.map +1 -0
- package/packages/core/dist/server/managers/index.js +9 -0
- package/packages/core/dist/server/managers/index.js.map +1 -0
- package/packages/core/dist/server/metrics.d.ts +134 -0
- package/packages/core/dist/server/metrics.d.ts.map +1 -0
- package/packages/core/dist/server/metrics.js +273 -0
- package/packages/core/dist/server/metrics.js.map +1 -0
- package/packages/core/dist/server/prompts.d.ts +58 -0
- package/packages/core/dist/server/prompts.d.ts.map +1 -0
- package/packages/core/dist/server/prompts.js +405 -0
- package/packages/core/dist/server/prompts.js.map +1 -0
- package/packages/core/dist/server/protocol-versions.d.ts +49 -0
- package/packages/core/dist/server/protocol-versions.d.ts.map +1 -0
- package/packages/core/dist/server/protocol-versions.js +173 -0
- package/packages/core/dist/server/protocol-versions.js.map +1 -0
- package/packages/core/dist/server/resources.d.ts +64 -0
- package/packages/core/dist/server/resources.d.ts.map +1 -0
- package/packages/core/dist/server/resources.js +243 -0
- package/packages/core/dist/server/resources.js.map +1 -0
- package/packages/core/dist/server/schema-store.d.ts +84 -0
- package/packages/core/dist/server/schema-store.d.ts.map +1 -0
- package/packages/core/dist/server/schema-store.js +234 -0
- package/packages/core/dist/server/schema-store.js.map +1 -0
- package/packages/core/dist/server/schema-validator.d.ts +51 -0
- package/packages/core/dist/server/schema-validator.d.ts.map +1 -0
- package/packages/core/dist/server/schema-validator.js +208 -0
- package/packages/core/dist/server/schema-validator.js.map +1 -0
- package/packages/core/dist/server/token-calculator.d.ts +44 -0
- package/packages/core/dist/server/token-calculator.d.ts.map +1 -0
- package/packages/core/dist/server/token-calculator.js +53 -0
- package/packages/core/dist/server/token-calculator.js.map +1 -0
- package/packages/core/dist/server/types.d.ts +45 -0
- package/packages/core/dist/server/types.d.ts.map +1 -0
- package/packages/core/dist/server/types.js +5 -0
- package/packages/core/dist/server/types.js.map +1 -0
- package/packages/core/dist/utils/file-lock.d.ts +73 -0
- package/packages/core/dist/utils/file-lock.d.ts.map +1 -0
- package/packages/core/dist/utils/file-lock.js +235 -0
- package/packages/core/dist/utils/file-lock.js.map +1 -0
- package/packages/core/package.json +36 -0
- package/packages/dashboard/dist/assets/index-B7hvkCMu.css +1 -0
- package/packages/dashboard/dist/assets/index-yZhLPpzr.js +1 -0
- package/packages/dashboard/dist/index.html +14 -0
- package/packages/dashboard/package.json +24 -0
- package/packages/shared/dist/version.d.ts +2 -0
- package/packages/shared/dist/version.d.ts.map +1 -0
- package/packages/shared/dist/version.js +2 -0
- package/packages/shared/dist/version.js.map +1 -0
- package/packages/shared/package.json +18 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for MCP Streamable HTTP Protocol (WITH RETRY LOGIC)
|
|
3
|
+
*
|
|
4
|
+
* Implements MCP 2025-06-18 Streamable HTTP transport for communicating with
|
|
5
|
+
* remote HTTP-based MCP servers (e.g., Windmill, custom HTTP endpoints).
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Exponential backoff retry with jitter (100ms * 2^attempt, max 30s)
|
|
9
|
+
* - Session management with Mcp-Session-Id header
|
|
10
|
+
* - SSE (Server-Sent Events) streaming support
|
|
11
|
+
* - HTTP-stream response batching
|
|
12
|
+
* - Authentication (Bearer, API-Key, OAuth2)
|
|
13
|
+
* - Automatic session resumption via Last-Event-ID
|
|
14
|
+
* - Request/response correlation with JSON-RPC IDs
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'events';
|
|
17
|
+
import { HttpServerConfig } from './config/index.js';
|
|
18
|
+
export interface McpStreamableRequest {
|
|
19
|
+
jsonrpc: '2.0';
|
|
20
|
+
method: string;
|
|
21
|
+
params?: unknown;
|
|
22
|
+
id?: string | number | null;
|
|
23
|
+
}
|
|
24
|
+
export interface McpStreamableResponse {
|
|
25
|
+
jsonrpc: '2.0';
|
|
26
|
+
result?: unknown;
|
|
27
|
+
error?: McpError;
|
|
28
|
+
id?: string | number | null;
|
|
29
|
+
}
|
|
30
|
+
export interface McpError {
|
|
31
|
+
code: number;
|
|
32
|
+
message: string;
|
|
33
|
+
data?: unknown;
|
|
34
|
+
}
|
|
35
|
+
interface HttpClientSession {
|
|
36
|
+
id: string;
|
|
37
|
+
createdAt: number;
|
|
38
|
+
lastEventId?: number;
|
|
39
|
+
lastActivity: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Retry configuration for exponential backoff
|
|
43
|
+
*/
|
|
44
|
+
interface RetryConfig {
|
|
45
|
+
maxRetries: number;
|
|
46
|
+
initialDelayMs: number;
|
|
47
|
+
maxDelayMs: number;
|
|
48
|
+
jitterMs: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* HTTP Client for remote MCP servers with automatic retry on transient failures
|
|
52
|
+
* Handles Streamable HTTP protocol with session management and exponential backoff
|
|
53
|
+
*/
|
|
54
|
+
export declare class HttpClient extends EventEmitter {
|
|
55
|
+
private config;
|
|
56
|
+
private session;
|
|
57
|
+
private pendingRequests;
|
|
58
|
+
private requestId;
|
|
59
|
+
private sseEventBuffer;
|
|
60
|
+
private isConnected;
|
|
61
|
+
private isConnecting;
|
|
62
|
+
private retryConfig;
|
|
63
|
+
constructor(config: HttpServerConfig);
|
|
64
|
+
/**
|
|
65
|
+
* Set custom retry configuration
|
|
66
|
+
* @param config - New retry configuration
|
|
67
|
+
*/
|
|
68
|
+
setRetryConfig(config: Partial<RetryConfig>): void;
|
|
69
|
+
/**
|
|
70
|
+
* Initialize or restore session
|
|
71
|
+
*/
|
|
72
|
+
private initializeSession;
|
|
73
|
+
/**
|
|
74
|
+
* Generate unique session ID (UUID v4)
|
|
75
|
+
*/
|
|
76
|
+
private generateSessionId;
|
|
77
|
+
/**
|
|
78
|
+
* Build HTTP headers with auth and session info
|
|
79
|
+
*/
|
|
80
|
+
private buildHeaders;
|
|
81
|
+
/**
|
|
82
|
+
* Resolve ${secret:name} syntax to actual values
|
|
83
|
+
*/
|
|
84
|
+
private resolveSecret;
|
|
85
|
+
/**
|
|
86
|
+
* Execute a tool via HTTP call
|
|
87
|
+
*/
|
|
88
|
+
call(method: string, params?: unknown): Promise<McpStreamableResponse>;
|
|
89
|
+
/**
|
|
90
|
+
* Send HTTP request with automatic retry on transient failures
|
|
91
|
+
*
|
|
92
|
+
* Retries on:
|
|
93
|
+
* - HTTP 502 (Bad Gateway)
|
|
94
|
+
* - HTTP 503 (Service Unavailable)
|
|
95
|
+
* - HTTP 504 (Gateway Timeout)
|
|
96
|
+
* - Network errors (ECONNRESET, ETIMEDOUT, etc.)
|
|
97
|
+
*
|
|
98
|
+
* Does NOT retry on:
|
|
99
|
+
* - HTTP 400 (Bad Request)
|
|
100
|
+
* - HTTP 401 (Unauthorized)
|
|
101
|
+
* - HTTP 403 (Forbidden)
|
|
102
|
+
* - HTTP 404 (Not Found)
|
|
103
|
+
*/
|
|
104
|
+
private sendRequest;
|
|
105
|
+
/**
|
|
106
|
+
* Handle SSE (Server-Sent Events) streaming response
|
|
107
|
+
*/
|
|
108
|
+
private handleSSEResponse;
|
|
109
|
+
/**
|
|
110
|
+
* Handle individual SSE event
|
|
111
|
+
*/
|
|
112
|
+
private handleSSEEvent;
|
|
113
|
+
/**
|
|
114
|
+
* Handle HTTP-stream response (batch of JSON objects)
|
|
115
|
+
*/
|
|
116
|
+
private handleStreamResponse;
|
|
117
|
+
/**
|
|
118
|
+
* Resolve pending request with response
|
|
119
|
+
*/
|
|
120
|
+
private resolveRequest;
|
|
121
|
+
/**
|
|
122
|
+
* Connect to HTTP server
|
|
123
|
+
*/
|
|
124
|
+
connect(): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Disconnect from HTTP server
|
|
127
|
+
*/
|
|
128
|
+
disconnect(): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Health check - ping the server
|
|
131
|
+
*/
|
|
132
|
+
healthCheck(): Promise<boolean>;
|
|
133
|
+
/**
|
|
134
|
+
* Check if client is connected
|
|
135
|
+
*/
|
|
136
|
+
getConnected(): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Get session info
|
|
139
|
+
*/
|
|
140
|
+
getSession(): HttpClientSession | null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Factory for creating HTTP clients from config
|
|
144
|
+
*/
|
|
145
|
+
export declare function createHttpClient(config: HttpServerConfig): HttpClient;
|
|
146
|
+
export {};
|
|
147
|
+
//# sourceMappingURL=http-client-updated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client-updated.d.ts","sourceRoot":"","sources":["../src/http-client-updated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAMrD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;GAEG;AACH,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA6FD;;;GAGG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,eAAe,CAAmD;IAC1E,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,WAAW,CAKjB;gBAEU,MAAM,EAAE,gBAAgB;IAMpC;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAIlD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoCpB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA6B5E;;;;;;;;;;;;;;OAcG;YACW,WAAW;IAgEzB;;OAEG;YACW,iBAAiB;IAuC/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;YACW,oBAAoB;IAgBlC;;OAEG;IACH,OAAO,CAAC,cAAc;IAsBtB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,UAAU,IAAI,iBAAiB,GAAG,IAAI;CAGvC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAErE"}
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for MCP Streamable HTTP Protocol (WITH RETRY LOGIC)
|
|
3
|
+
*
|
|
4
|
+
* Implements MCP 2025-06-18 Streamable HTTP transport for communicating with
|
|
5
|
+
* remote HTTP-based MCP servers (e.g., Windmill, custom HTTP endpoints).
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Exponential backoff retry with jitter (100ms * 2^attempt, max 30s)
|
|
9
|
+
* - Session management with Mcp-Session-Id header
|
|
10
|
+
* - SSE (Server-Sent Events) streaming support
|
|
11
|
+
* - HTTP-stream response batching
|
|
12
|
+
* - Authentication (Bearer, API-Key, OAuth2)
|
|
13
|
+
* - Automatic session resumption via Last-Event-ID
|
|
14
|
+
* - Request/response correlation with JSON-RPC IDs
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'events';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Retry Logic
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const RETRYABLE_STATUS_CODES = new Set([502, 503, 504]);
|
|
21
|
+
const NON_RETRYABLE_STATUS_CODES = new Set([400, 401, 403, 404]);
|
|
22
|
+
const RETRYABLE_ERROR_PATTERNS = [
|
|
23
|
+
'ECONNREFUSED',
|
|
24
|
+
'ECONNRESET',
|
|
25
|
+
'ETIMEDOUT',
|
|
26
|
+
'EHOSTUNREACH',
|
|
27
|
+
'ENETUNREACH',
|
|
28
|
+
'ERR_HTTP2_STREAM_RESET',
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Determine if an error or response should be retried
|
|
32
|
+
*
|
|
33
|
+
* @param error - Error object or Response from fetch
|
|
34
|
+
* @returns true if the error is retryable
|
|
35
|
+
*/
|
|
36
|
+
function isRetryable(error) {
|
|
37
|
+
// Handle Response objects (failed fetch responses)
|
|
38
|
+
if (error instanceof Response) {
|
|
39
|
+
if (NON_RETRYABLE_STATUS_CODES.has(error.status)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return RETRYABLE_STATUS_CODES.has(error.status);
|
|
43
|
+
}
|
|
44
|
+
// Handle Error objects
|
|
45
|
+
if (error instanceof Error) {
|
|
46
|
+
const message = error.message;
|
|
47
|
+
const httpError = error;
|
|
48
|
+
// Check explicit status code (from HTTP response errors)
|
|
49
|
+
if (httpError.statusCode) {
|
|
50
|
+
if (NON_RETRYABLE_STATUS_CODES.has(httpError.statusCode)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return RETRYABLE_STATUS_CODES.has(httpError.statusCode);
|
|
54
|
+
}
|
|
55
|
+
// Check for network error patterns
|
|
56
|
+
return RETRYABLE_ERROR_PATTERNS.some(pattern => message.includes(pattern));
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Calculate exponential backoff delay with random jitter
|
|
62
|
+
*
|
|
63
|
+
* Formula: min(initialDelay * 2^attempt + random(0, jitterMs), maxDelayMs)
|
|
64
|
+
*
|
|
65
|
+
* Example progression (default config):
|
|
66
|
+
* - Attempt 0: 100-1100ms
|
|
67
|
+
* - Attempt 1: 200-1200ms
|
|
68
|
+
* - Attempt 2: 400-1400ms
|
|
69
|
+
* - (capped at 30s)
|
|
70
|
+
*
|
|
71
|
+
* @param attempt - Zero-based retry attempt number
|
|
72
|
+
* @param config - Retry configuration
|
|
73
|
+
* @returns Delay in milliseconds
|
|
74
|
+
*/
|
|
75
|
+
function calculateBackoffDelay(attempt, config) {
|
|
76
|
+
const baseDelay = config.initialDelayMs * Math.pow(2, attempt);
|
|
77
|
+
const jitter = Math.random() * config.jitterMs;
|
|
78
|
+
const delayWithJitter = baseDelay + jitter;
|
|
79
|
+
return Math.min(delayWithJitter, config.maxDelayMs);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Sleep for specified duration
|
|
83
|
+
* @param ms - Milliseconds to sleep
|
|
84
|
+
*/
|
|
85
|
+
function sleep(ms) {
|
|
86
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
87
|
+
}
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// HttpClient Class
|
|
90
|
+
// ============================================================================
|
|
91
|
+
/**
|
|
92
|
+
* HTTP Client for remote MCP servers with automatic retry on transient failures
|
|
93
|
+
* Handles Streamable HTTP protocol with session management and exponential backoff
|
|
94
|
+
*/
|
|
95
|
+
export class HttpClient extends EventEmitter {
|
|
96
|
+
constructor(config) {
|
|
97
|
+
super();
|
|
98
|
+
this.session = null;
|
|
99
|
+
this.pendingRequests = new Map();
|
|
100
|
+
this.requestId = 1;
|
|
101
|
+
this.sseEventBuffer = '';
|
|
102
|
+
this.isConnected = false;
|
|
103
|
+
this.isConnecting = false;
|
|
104
|
+
this.retryConfig = {
|
|
105
|
+
maxRetries: 3,
|
|
106
|
+
initialDelayMs: 100,
|
|
107
|
+
maxDelayMs: 30000,
|
|
108
|
+
jitterMs: 1000,
|
|
109
|
+
};
|
|
110
|
+
this.config = config;
|
|
111
|
+
this.initializeSession();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Set custom retry configuration
|
|
115
|
+
* @param config - New retry configuration
|
|
116
|
+
*/
|
|
117
|
+
setRetryConfig(config) {
|
|
118
|
+
this.retryConfig = { ...this.retryConfig, ...config };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Initialize or restore session
|
|
122
|
+
*/
|
|
123
|
+
initializeSession() {
|
|
124
|
+
const sessionId = this.session?.id || this.generateSessionId();
|
|
125
|
+
this.session = {
|
|
126
|
+
id: sessionId,
|
|
127
|
+
createdAt: Date.now(),
|
|
128
|
+
lastActivity: Date.now(),
|
|
129
|
+
};
|
|
130
|
+
this.emit('session:created', { sessionId });
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Generate unique session ID (UUID v4)
|
|
134
|
+
*/
|
|
135
|
+
generateSessionId() {
|
|
136
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
137
|
+
const r = Math.random() * 16 | 0;
|
|
138
|
+
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
139
|
+
return v.toString(16);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Build HTTP headers with auth and session info
|
|
144
|
+
*/
|
|
145
|
+
buildHeaders() {
|
|
146
|
+
const headers = {
|
|
147
|
+
'Accept': 'application/json, text/event-stream',
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
'MCP-Protocol-Version': '2025-06-18',
|
|
150
|
+
};
|
|
151
|
+
if (this.session?.id) {
|
|
152
|
+
const sessionHeaderName = this.config.session?.headerName || 'Mcp-Session-Id';
|
|
153
|
+
headers[sessionHeaderName] = this.session.id;
|
|
154
|
+
}
|
|
155
|
+
if (this.session?.lastEventId) {
|
|
156
|
+
headers['Last-Event-ID'] = String(this.session.lastEventId);
|
|
157
|
+
}
|
|
158
|
+
if (this.config.auth?.token) {
|
|
159
|
+
const token = this.resolveSecret(this.config.auth.token);
|
|
160
|
+
const headerName = this.config.auth.headerName || 'Authorization';
|
|
161
|
+
if (this.config.auth.type === 'bearer') {
|
|
162
|
+
headers[headerName] = `Bearer ${token}`;
|
|
163
|
+
}
|
|
164
|
+
else if (this.config.auth.type === 'api-key') {
|
|
165
|
+
headers[headerName] = token;
|
|
166
|
+
}
|
|
167
|
+
else if (this.config.auth.type === 'oauth2') {
|
|
168
|
+
headers[headerName] = `Bearer ${token}`;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (this.config.cors?.enabled) {
|
|
172
|
+
headers['Origin'] = this.config.cors.allowOrigin || '*';
|
|
173
|
+
}
|
|
174
|
+
return headers;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Resolve ${secret:name} syntax to actual values
|
|
178
|
+
*/
|
|
179
|
+
resolveSecret(value) {
|
|
180
|
+
const match = value.match(/\$\{secret:([^}]+)\}/);
|
|
181
|
+
if (match) {
|
|
182
|
+
const secretName = match[1];
|
|
183
|
+
return process.env[`METALINK_SECRET_${secretName}`] || value;
|
|
184
|
+
}
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Execute a tool via HTTP call
|
|
189
|
+
*/
|
|
190
|
+
async call(method, params) {
|
|
191
|
+
if (!this.isConnected && !this.isConnecting) {
|
|
192
|
+
await this.connect();
|
|
193
|
+
}
|
|
194
|
+
const requestId = this.requestId++;
|
|
195
|
+
const request = {
|
|
196
|
+
jsonrpc: '2.0',
|
|
197
|
+
method,
|
|
198
|
+
params,
|
|
199
|
+
id: requestId,
|
|
200
|
+
};
|
|
201
|
+
return new Promise((resolve, reject) => {
|
|
202
|
+
const timeout = setTimeout(() => {
|
|
203
|
+
this.pendingRequests.delete(requestId);
|
|
204
|
+
reject(new Error(`Request timeout for ${method} (ID: ${requestId})`));
|
|
205
|
+
}, 30000);
|
|
206
|
+
this.pendingRequests.set(requestId, { resolve, reject, timeout });
|
|
207
|
+
this.sendRequest(request).catch(err => {
|
|
208
|
+
clearTimeout(timeout);
|
|
209
|
+
this.pendingRequests.delete(requestId);
|
|
210
|
+
reject(err);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Send HTTP request with automatic retry on transient failures
|
|
216
|
+
*
|
|
217
|
+
* Retries on:
|
|
218
|
+
* - HTTP 502 (Bad Gateway)
|
|
219
|
+
* - HTTP 503 (Service Unavailable)
|
|
220
|
+
* - HTTP 504 (Gateway Timeout)
|
|
221
|
+
* - Network errors (ECONNRESET, ETIMEDOUT, etc.)
|
|
222
|
+
*
|
|
223
|
+
* Does NOT retry on:
|
|
224
|
+
* - HTTP 400 (Bad Request)
|
|
225
|
+
* - HTTP 401 (Unauthorized)
|
|
226
|
+
* - HTTP 403 (Forbidden)
|
|
227
|
+
* - HTTP 404 (Not Found)
|
|
228
|
+
*/
|
|
229
|
+
async sendRequest(request) {
|
|
230
|
+
const headers = this.buildHeaders();
|
|
231
|
+
let lastError = null;
|
|
232
|
+
for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {
|
|
233
|
+
try {
|
|
234
|
+
const response = await fetch(this.config.url, {
|
|
235
|
+
method: 'POST',
|
|
236
|
+
headers,
|
|
237
|
+
body: JSON.stringify(request),
|
|
238
|
+
});
|
|
239
|
+
if (!response.ok) {
|
|
240
|
+
// Check if error is retryable
|
|
241
|
+
if (!isRetryable(response)) {
|
|
242
|
+
const error = new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
243
|
+
error.statusCode = response.status;
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
// Retryable error - will retry below
|
|
247
|
+
lastError = new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
248
|
+
lastError.statusCode = response.status;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// Success - process response
|
|
252
|
+
const serverSessionId = response.headers.get('mcp-session-id') || response.headers.get('Mcp-Session-Id');
|
|
253
|
+
if (serverSessionId && this.session) {
|
|
254
|
+
this.session.id = serverSessionId;
|
|
255
|
+
}
|
|
256
|
+
if (this.session) {
|
|
257
|
+
this.session.lastActivity = Date.now();
|
|
258
|
+
}
|
|
259
|
+
if (this.config.transport === 'sse' || this.config.transport === 'sse-first') {
|
|
260
|
+
await this.handleSSEResponse(response);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
await this.handleStreamResponse(response);
|
|
264
|
+
}
|
|
265
|
+
return; // Success
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
270
|
+
// Check if error is retryable
|
|
271
|
+
if (!isRetryable(lastError)) {
|
|
272
|
+
throw lastError;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// If this was the last attempt, throw
|
|
276
|
+
if (attempt === this.retryConfig.maxRetries) {
|
|
277
|
+
throw new Error(`Failed to call ${this.config.url}: ${lastError?.message || 'Unknown error'}`);
|
|
278
|
+
}
|
|
279
|
+
// Calculate backoff delay and wait
|
|
280
|
+
const delayMs = calculateBackoffDelay(attempt, this.retryConfig);
|
|
281
|
+
await sleep(delayMs);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Handle SSE (Server-Sent Events) streaming response
|
|
286
|
+
*/
|
|
287
|
+
async handleSSEResponse(response) {
|
|
288
|
+
const reader = response.body?.getReader();
|
|
289
|
+
if (!reader) {
|
|
290
|
+
throw new Error('No response body for SSE stream');
|
|
291
|
+
}
|
|
292
|
+
const decoder = new TextDecoder();
|
|
293
|
+
try {
|
|
294
|
+
while (true) {
|
|
295
|
+
const { done, value } = await reader.read();
|
|
296
|
+
if (done)
|
|
297
|
+
break;
|
|
298
|
+
const text = decoder.decode(value, { stream: true });
|
|
299
|
+
this.sseEventBuffer += text;
|
|
300
|
+
const lines = this.sseEventBuffer.split('\n');
|
|
301
|
+
this.sseEventBuffer = lines.pop() || '';
|
|
302
|
+
let currentEvent = {};
|
|
303
|
+
for (const line of lines) {
|
|
304
|
+
if (line === '') {
|
|
305
|
+
if (currentEvent.data) {
|
|
306
|
+
this.handleSSEEvent(currentEvent);
|
|
307
|
+
}
|
|
308
|
+
currentEvent = {};
|
|
309
|
+
}
|
|
310
|
+
else if (line.startsWith('id: ')) {
|
|
311
|
+
currentEvent.id = line.slice(4).trim();
|
|
312
|
+
}
|
|
313
|
+
else if (line.startsWith('data: ')) {
|
|
314
|
+
currentEvent.data = line.slice(6);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
reader.releaseLock();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Handle individual SSE event
|
|
325
|
+
*/
|
|
326
|
+
handleSSEEvent(event) {
|
|
327
|
+
if (!event.data)
|
|
328
|
+
return;
|
|
329
|
+
if (event.id && this.session) {
|
|
330
|
+
this.session.lastEventId = parseInt(event.id, 10);
|
|
331
|
+
}
|
|
332
|
+
try {
|
|
333
|
+
const response = JSON.parse(event.data);
|
|
334
|
+
this.resolveRequest(response);
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
console.error('Failed to parse SSE data:', error);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Handle HTTP-stream response (batch of JSON objects)
|
|
342
|
+
*/
|
|
343
|
+
async handleStreamResponse(response) {
|
|
344
|
+
const text = await response.text();
|
|
345
|
+
const lines = text.trim().split('\n');
|
|
346
|
+
for (const line of lines) {
|
|
347
|
+
if (!line.trim())
|
|
348
|
+
continue;
|
|
349
|
+
try {
|
|
350
|
+
const parsedResponse = JSON.parse(line);
|
|
351
|
+
this.resolveRequest(parsedResponse);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
console.error('Failed to parse stream response:', error);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Resolve pending request with response
|
|
360
|
+
*/
|
|
361
|
+
resolveRequest(response) {
|
|
362
|
+
const requestId = response.id;
|
|
363
|
+
if (requestId === null || requestId === undefined) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
const pending = this.pendingRequests.get(requestId);
|
|
367
|
+
if (!pending) {
|
|
368
|
+
console.warn(`Received response for unknown request ID: ${requestId}`);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
this.pendingRequests.delete(requestId);
|
|
372
|
+
clearTimeout(pending.timeout);
|
|
373
|
+
if (response.error) {
|
|
374
|
+
pending.reject(new Error(`RPC Error (${response.error.code}): ${response.error.message}`));
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
pending.resolve(response);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Connect to HTTP server
|
|
382
|
+
*/
|
|
383
|
+
async connect() {
|
|
384
|
+
if (this.isConnected || this.isConnecting)
|
|
385
|
+
return;
|
|
386
|
+
this.isConnecting = true;
|
|
387
|
+
try {
|
|
388
|
+
const response = await this.call('initialize', {
|
|
389
|
+
protocolVersion: '2025-06-18',
|
|
390
|
+
capabilities: {},
|
|
391
|
+
clientInfo: {
|
|
392
|
+
name: 'metalink-http-client',
|
|
393
|
+
version: '1.0.0',
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
if (!response.result) {
|
|
397
|
+
throw new Error('Initialize response missing result');
|
|
398
|
+
}
|
|
399
|
+
this.isConnected = true;
|
|
400
|
+
this.isConnecting = false;
|
|
401
|
+
this.emit('connected', { session: this.session });
|
|
402
|
+
}
|
|
403
|
+
catch (error) {
|
|
404
|
+
this.isConnecting = false;
|
|
405
|
+
this.isConnected = false;
|
|
406
|
+
throw error;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Disconnect from HTTP server
|
|
411
|
+
*/
|
|
412
|
+
async disconnect() {
|
|
413
|
+
this.isConnected = false;
|
|
414
|
+
for (const [, pending] of this.pendingRequests) {
|
|
415
|
+
clearTimeout(pending.timeout);
|
|
416
|
+
pending.reject(new Error('Disconnected'));
|
|
417
|
+
}
|
|
418
|
+
this.pendingRequests.clear();
|
|
419
|
+
this.emit('disconnected');
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Health check - ping the server
|
|
423
|
+
*/
|
|
424
|
+
async healthCheck() {
|
|
425
|
+
try {
|
|
426
|
+
const response = await this.call('ping');
|
|
427
|
+
return !!response.result || !response.error;
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Check if client is connected
|
|
435
|
+
*/
|
|
436
|
+
getConnected() {
|
|
437
|
+
return this.isConnected;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Get session info
|
|
441
|
+
*/
|
|
442
|
+
getSession() {
|
|
443
|
+
return this.session;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Factory for creating HTTP clients from config
|
|
448
|
+
*/
|
|
449
|
+
export function createHttpClient(config) {
|
|
450
|
+
return new HttpClient(config);
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=http-client-updated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client-updated.js","sourceRoot":"","sources":["../src/http-client-updated.ts"],"names":[],"mappings":"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"}
|