@ai-setting/roy-agent-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +99145 -0
- package/package.json +114 -0
- package/src/config/config-component.test.ts +627 -0
- package/src/config/config-component.ts +906 -0
- package/src/config/config-parser.test.ts +319 -0
- package/src/config/config-parser.ts +203 -0
- package/src/config/decentralized-config.test.ts +740 -0
- package/src/config/env-key.ts +210 -0
- package/src/config/env-source.test.ts +252 -0
- package/src/config/env-source.ts +301 -0
- package/src/config/file-source.test.ts +357 -0
- package/src/config/file-source.ts +421 -0
- package/src/config/index.ts +24 -0
- package/src/config/protocol-resolver.test.ts +217 -0
- package/src/config/protocol-resolver.ts +228 -0
- package/src/env/agent/agent-component.abort.test.ts +511 -0
- package/src/env/agent/agent-component.record-session.test.ts +349 -0
- package/src/env/agent/agent-component.test.ts +1389 -0
- package/src/env/agent/agent-component.tool-error.test.ts +327 -0
- package/src/env/agent/agent-component.ts +1711 -0
- package/src/env/agent/agent-config-registration.test.ts +226 -0
- package/src/env/agent/agent-config-registration.ts +46 -0
- package/src/env/agent/agent-reminder-plugin.integration.test.ts +243 -0
- package/src/env/agent/index.ts +10 -0
- package/src/env/agent/summary-agent.parse-hint.test.ts +360 -0
- package/src/env/agent/summary-agent.ts +508 -0
- package/src/env/agent/types.ts +536 -0
- package/src/env/commands/commands-component.test.ts +364 -0
- package/src/env/commands/commands-component.ts +604 -0
- package/src/env/commands/commands-config-registration.test.ts +198 -0
- package/src/env/commands/commands-config-registration.ts +38 -0
- package/src/env/commands/index.ts +21 -0
- package/src/env/commands/parser.test.ts +203 -0
- package/src/env/commands/parser.ts +115 -0
- package/src/env/commands/types.ts +184 -0
- package/src/env/commands-prompt-integration.test.ts +243 -0
- package/src/env/component-env.test.ts +119 -0
- package/src/env/component.ts +335 -0
- package/src/env/constants.test.ts +72 -0
- package/src/env/constants.ts +123 -0
- package/src/env/debug/debug-component.test.ts +114 -0
- package/src/env/debug/debug-component.ts +547 -0
- package/src/env/debug/formatters/index.ts +9 -0
- package/src/env/debug/formatters/repl-formatter.test.ts +139 -0
- package/src/env/debug/formatters/repl-formatter.ts +358 -0
- package/src/env/debug/formatters/trace-formatter.test.ts +119 -0
- package/src/env/debug/formatters/trace-formatter.ts +191 -0
- package/src/env/debug/formatters/tree-formatter.test.ts +107 -0
- package/src/env/debug/formatters/tree-formatter.ts +325 -0
- package/src/env/debug/index.ts +38 -0
- package/src/env/debug/parser/regex-parser.test.ts +201 -0
- package/src/env/debug/parser/regex-parser.ts +196 -0
- package/src/env/debug/parser/span-builder.test.ts +241 -0
- package/src/env/debug/parser/span-builder.ts +386 -0
- package/src/env/debug/reader/log-reader.test.ts +170 -0
- package/src/env/debug/reader/log-reader.ts +186 -0
- package/src/env/debug/reader/span-db-reader.test.ts +118 -0
- package/src/env/debug/reader/span-db-reader.ts +201 -0
- package/src/env/debug/types.test.ts +187 -0
- package/src/env/debug/types.ts +171 -0
- package/src/env/environment-init.test.ts +183 -0
- package/src/env/environment-lifecycle.test.ts +516 -0
- package/src/env/environment-service.test.ts +332 -0
- package/src/env/environment.handle-query.test.ts +96 -0
- package/src/env/environment.test.ts +232 -0
- package/src/env/environment.ts +708 -0
- package/src/env/errors.test.ts +165 -0
- package/src/env/errors.ts +157 -0
- package/src/env/event-source/event-source-agent-handler.test.ts +193 -0
- package/src/env/event-source/event-source-agent-handler.ts +111 -0
- package/src/env/event-source/event-source-component.process-cleanup.test.ts +236 -0
- package/src/env/event-source/event-source-component.stop.test.ts +346 -0
- package/src/env/event-source/event-source-component.test.ts +1207 -0
- package/src/env/event-source/event-source-component.ts +1379 -0
- package/src/env/event-source/event-source-config-registration.test.ts +242 -0
- package/src/env/event-source/event-source-config-registration.ts +37 -0
- package/src/env/event-source/event-source-integration.test.ts +320 -0
- package/src/env/event-source/event-source-platform.test.ts +630 -0
- package/src/env/event-source/types.ts +298 -0
- package/src/env/hook/global-hook-manager.ts +162 -0
- package/src/env/hook/hook-manager.test.ts +374 -0
- package/src/env/hook/hook-manager.ts +309 -0
- package/src/env/hook/index.ts +38 -0
- package/src/env/hook/types.ts +138 -0
- package/src/env/index.ts +144 -0
- package/src/env/interface.ts +203 -0
- package/src/env/llm/hooks.test.ts +293 -0
- package/src/env/llm/hooks.ts +316 -0
- package/src/env/llm/index.ts +61 -0
- package/src/env/llm/invoke-threshold-check.test.ts +88 -0
- package/src/env/llm/invoke-timeout.test.ts +54 -0
- package/src/env/llm/invoke.test.ts +71 -0
- package/src/env/llm/invoke.ts +1039 -0
- package/src/env/llm/llm-config.test.ts +523 -0
- package/src/env/llm/llm.test.ts +233 -0
- package/src/env/llm/llm.ts +568 -0
- package/src/env/llm/provider.test.ts +182 -0
- package/src/env/llm/provider.ts +108 -0
- package/src/env/llm/transform.test.ts +251 -0
- package/src/env/llm/transform.ts +286 -0
- package/src/env/llm/types.test.ts +580 -0
- package/src/env/llm/types.ts +424 -0
- package/src/env/log-trace/decorator-otel.test.ts +182 -0
- package/src/env/log-trace/decorator.ts +230 -0
- package/src/env/log-trace/index.ts +79 -0
- package/src/env/log-trace/log-trace-component.test.ts +242 -0
- package/src/env/log-trace/log-trace-component.ts +497 -0
- package/src/env/log-trace/log-trace-config-registration.test.ts +348 -0
- package/src/env/log-trace/log-trace-config-registration.ts +45 -0
- package/src/env/log-trace/logger.test.ts +149 -0
- package/src/env/log-trace/logger.ts +522 -0
- package/src/env/log-trace/opentelemetry/cli-propagation.test.ts +147 -0
- package/src/env/log-trace/opentelemetry/cli-propagation.ts +194 -0
- package/src/env/log-trace/opentelemetry/integration.test.ts +668 -0
- package/src/env/log-trace/opentelemetry/mod.ts +25 -0
- package/src/env/log-trace/opentelemetry/propagation-env.test.ts +181 -0
- package/src/env/log-trace/opentelemetry/propagation-env.ts +136 -0
- package/src/env/log-trace/opentelemetry/propagation.test.ts +259 -0
- package/src/env/log-trace/opentelemetry/propagation.ts +215 -0
- package/src/env/log-trace/opentelemetry/tracer-provider-context.test.ts +166 -0
- package/src/env/log-trace/opentelemetry/tracer-provider.test.ts +379 -0
- package/src/env/log-trace/opentelemetry/tracer-provider.ts +612 -0
- package/src/env/log-trace/span-storage.test.ts +145 -0
- package/src/env/log-trace/span-storage.ts +230 -0
- package/src/env/log-trace/trace-context.test.ts +187 -0
- package/src/env/log-trace/trace-context.ts +162 -0
- package/src/env/log-trace/types.test.ts +63 -0
- package/src/env/log-trace/types.ts +172 -0
- package/src/env/mcp/README.md +244 -0
- package/src/env/mcp/__integration__/mcp-component.integration.test.ts +373 -0
- package/src/env/mcp/config.test.ts +74 -0
- package/src/env/mcp/config.ts +116 -0
- package/src/env/mcp/index.ts +41 -0
- package/src/env/mcp/loader.test.ts +161 -0
- package/src/env/mcp/loader.ts +209 -0
- package/src/env/mcp/mcp-component.test.ts +111 -0
- package/src/env/mcp/mcp-component.ts +358 -0
- package/src/env/mcp/mcp-config-registration.test.ts +304 -0
- package/src/env/mcp/mcp-config-registration.ts +50 -0
- package/src/env/mcp/scanner.test.ts +170 -0
- package/src/env/mcp/scanner.ts +246 -0
- package/src/env/mcp/tool/adapter.test.ts +520 -0
- package/src/env/mcp/tool/adapter.ts +521 -0
- package/src/env/mcp/tool/index.ts +5 -0
- package/src/env/mcp/types.test.ts +171 -0
- package/src/env/mcp/types.ts +79 -0
- package/src/env/memory/README.md +177 -0
- package/src/env/memory/built-in/index.ts +59 -0
- package/src/env/memory/built-in/recall-memory.ts +103 -0
- package/src/env/memory/built-in/record-memory.ts +148 -0
- package/src/env/memory/index.ts +20 -0
- package/src/env/memory/memory-component.test.ts +239 -0
- package/src/env/memory/memory-component.ts +503 -0
- package/src/env/memory/memory-config-registration.test.ts +67 -0
- package/src/env/memory/memory-config-registration.ts +48 -0
- package/src/env/memory/memory-config.ts +45 -0
- package/src/env/memory/memory-file.test.ts +268 -0
- package/src/env/memory/plugin/index.ts +48 -0
- package/src/env/memory/plugin/memory-agent.test.ts +249 -0
- package/src/env/memory/plugin/memory-agent.ts +365 -0
- package/src/env/memory/plugin/memory-manager.ts +198 -0
- package/src/env/memory/plugin/memory-plugin-agent.test.ts +145 -0
- package/src/env/memory/plugin/memory-plugin.ts +210 -0
- package/src/env/memory/plugin/plugin-simplified.test.ts +51 -0
- package/src/env/memory/plugin/recall-memory.test.ts +106 -0
- package/src/env/memory/plugin/recall-memory.ts +53 -0
- package/src/env/memory/plugin/types.ts +101 -0
- package/src/env/memory/tools/memory-agent-tools.ts +228 -0
- package/src/env/memory/types.ts +85 -0
- package/src/env/paths.ts +118 -0
- package/src/env/prompt/index.ts +18 -0
- package/src/env/prompt/memory-prompts.test.ts +91 -0
- package/src/env/prompt/prompt-component.test.ts +491 -0
- package/src/env/prompt/prompt-component.ts +619 -0
- package/src/env/prompt/prompt-config-registration.test.ts +213 -0
- package/src/env/prompt/prompt-config-registration.ts +39 -0
- package/src/env/prompt/prompts-index.ts +504 -0
- package/src/env/prompt/renderer.ts +67 -0
- package/src/env/prompt/types.ts +136 -0
- package/src/env/session/hooks.ts +18 -0
- package/src/env/session/index.ts +37 -0
- package/src/env/session/search-query-parser.test.ts +425 -0
- package/src/env/session/search-query-parser.ts +171 -0
- package/src/env/session/session-checkpoint.test.ts +523 -0
- package/src/env/session/session-component.extract-recent-messages.test.ts +209 -0
- package/src/env/session/session-component.test.ts +132 -0
- package/src/env/session/session-component.ts +1249 -0
- package/src/env/session/session-config-registration.test.ts +138 -0
- package/src/env/session/session-config-registration.ts +52 -0
- package/src/env/session/session-message-converter.test.ts +763 -0
- package/src/env/session/session-message-converter.ts +415 -0
- package/src/env/session/session-message-e2e.test.ts +448 -0
- package/src/env/session/session-search.test.ts +391 -0
- package/src/env/session/session-store.test.ts +362 -0
- package/src/env/session/session-store.ts +141 -0
- package/src/env/session/storage/index.ts +6 -0
- package/src/env/session/storage/memory.ts +502 -0
- package/src/env/session/storage/sqlite.ts +794 -0
- package/src/env/session/types.ts +742 -0
- package/src/env/skill/config.ts +39 -0
- package/src/env/skill/index.ts +6 -0
- package/src/env/skill/parser.test.ts +116 -0
- package/src/env/skill/parser.ts +77 -0
- package/src/env/skill/scanner.test.ts +211 -0
- package/src/env/skill/scanner.ts +119 -0
- package/src/env/skill/skill-component.test.ts +234 -0
- package/src/env/skill/skill-component.ts +352 -0
- package/src/env/skill/skill-config-registration.test.ts +60 -0
- package/src/env/skill/skill-config-registration.ts +43 -0
- package/src/env/skill/tool/index.ts +1 -0
- package/src/env/skill/tool/skill-tool.test.ts +100 -0
- package/src/env/skill/tool/skill-tool.ts +72 -0
- package/src/env/skill/types.ts +64 -0
- package/src/env/task/delegate/delegate-tool.test.ts +498 -0
- package/src/env/task/delegate/delegate-tool.ts +1014 -0
- package/src/env/task/delegate/index.ts +18 -0
- package/src/env/task/delegate/stop-tool.test.ts +140 -0
- package/src/env/task/delegate/stop-tool.ts +119 -0
- package/src/env/task/delegate/task-events.test.ts +178 -0
- package/src/env/task/delegate/task-events.ts +143 -0
- package/src/env/task/hooks/contexts.test.ts +92 -0
- package/src/env/task/hooks/contexts.ts +192 -0
- package/src/env/task/hooks/index.ts +23 -0
- package/src/env/task/hooks/task-hook-points.test.ts +32 -0
- package/src/env/task/hooks/task-hook-points.ts +54 -0
- package/src/env/task/index.ts +7 -0
- package/src/env/task/plugins/index.ts +13 -0
- package/src/env/task/plugins/task-plugin.test.ts +74 -0
- package/src/env/task/plugins/task-plugin.ts +89 -0
- package/src/env/task/plugins/task-tag-plugin.test.ts +377 -0
- package/src/env/task/plugins/task-tag-plugin.ts +319 -0
- package/src/env/task/plugins/task-workflow-extractor.integration.test.ts +226 -0
- package/src/env/task/plugins/workflow-extractor-agent.test.ts +107 -0
- package/src/env/task/plugins/workflow-extractor-agent.ts +225 -0
- package/src/env/task/storage/index.ts +6 -0
- package/src/env/task/storage/sqlite-task-store.test.ts +283 -0
- package/src/env/task/storage/sqlite-task-store.ts +903 -0
- package/src/env/task/storage/task-search.test.ts +291 -0
- package/src/env/task/tag-service.test.ts +198 -0
- package/src/env/task/tag-service.ts +264 -0
- package/src/env/task/task-component.test.ts +193 -0
- package/src/env/task/task-component.ts +658 -0
- package/src/env/task/task-config-registration.test.ts +57 -0
- package/src/env/task/task-config-registration.ts +37 -0
- package/src/env/task/task-types.test.ts +137 -0
- package/src/env/task/tools/complete-tool.ts +44 -0
- package/src/env/task/tools/create-tool.ts +49 -0
- package/src/env/task/tools/delete-tool.ts +43 -0
- package/src/env/task/tools/get-tool.ts +59 -0
- package/src/env/task/tools/index.ts +10 -0
- package/src/env/task/tools/list-tool.ts +40 -0
- package/src/env/task/tools/operation/create-tool.ts +48 -0
- package/src/env/task/tools/operation/delete-tool.ts +43 -0
- package/src/env/task/tools/operation/get-tool.ts +43 -0
- package/src/env/task/tools/operation/index.ts +9 -0
- package/src/env/task/tools/operation/list-tool.ts +40 -0
- package/src/env/task/tools/operation/operation-tools.test.ts +274 -0
- package/src/env/task/tools/operation/operation-types.ts +75 -0
- package/src/env/task/tools/operation/update-tool.ts +47 -0
- package/src/env/task/tools/task-tools.test.ts +203 -0
- package/src/env/task/tools/task-types.test.ts +75 -0
- package/src/env/task/tools/task-types.ts +68 -0
- package/src/env/task/tools/update-tool.ts +70 -0
- package/src/env/task/types.ts +160 -0
- package/src/env/tool/built-in/bash.ts +201 -0
- package/src/env/tool/built-in/echo.ts +29 -0
- package/src/env/tool/built-in/edit-file.test.ts +136 -0
- package/src/env/tool/built-in/edit-file.ts +92 -0
- package/src/env/tool/built-in/glob.test.ts +94 -0
- package/src/env/tool/built-in/glob.ts +65 -0
- package/src/env/tool/built-in/grep.test.ts +122 -0
- package/src/env/tool/built-in/grep.ts +108 -0
- package/src/env/tool/built-in/index.ts +44 -0
- package/src/env/tool/built-in/read-file.test.ts +84 -0
- package/src/env/tool/built-in/read-file.ts +75 -0
- package/src/env/tool/built-in/write-file.test.ts +119 -0
- package/src/env/tool/built-in/write-file.ts +68 -0
- package/src/env/tool/index.ts +24 -0
- package/src/env/tool/registry.test.ts +257 -0
- package/src/env/tool/registry.ts +167 -0
- package/src/env/tool/tool-component.test.ts +559 -0
- package/src/env/tool/tool-component.ts +563 -0
- package/src/env/tool/tool-config-registration.test.ts +249 -0
- package/src/env/tool/tool-config-registration.ts +46 -0
- package/src/env/tool/types.ts +267 -0
- package/src/env/tool/validator.test.ts +143 -0
- package/src/env/tool/validator.ts +44 -0
- package/src/env/types.ts +180 -0
- package/src/env/workflow/ask-user-tool-registration.test.ts +216 -0
- package/src/env/workflow/complex-workflow.integration.test.ts +1900 -0
- package/src/env/workflow/decorators/decorator-node.ts +229 -0
- package/src/env/workflow/decorators/decorator.test.ts +196 -0
- package/src/env/workflow/decorators/edge.ts +82 -0
- package/src/env/workflow/decorators/index.ts +31 -0
- package/src/env/workflow/decorators/node-as.ts +98 -0
- package/src/env/workflow/decorators/workflow.ts +54 -0
- package/src/env/workflow/engine/dag-manager.test.ts +570 -0
- package/src/env/workflow/engine/dag-manager.ts +594 -0
- package/src/env/workflow/engine/engine.ts +1422 -0
- package/src/env/workflow/engine/event-bus.test.ts +359 -0
- package/src/env/workflow/engine/event-bus.ts +156 -0
- package/src/env/workflow/engine/executor-agent-session.test.ts +84 -0
- package/src/env/workflow/engine/executor.test.ts +619 -0
- package/src/env/workflow/engine/executor.ts +593 -0
- package/src/env/workflow/engine/index.ts +24 -0
- package/src/env/workflow/engine/node-registry.test.ts +560 -0
- package/src/env/workflow/engine/node-registry.ts +289 -0
- package/src/env/workflow/engine/resume-removed.test.ts +22 -0
- package/src/env/workflow/engine/scheduler.test.ts +715 -0
- package/src/env/workflow/engine/scheduler.ts +318 -0
- package/src/env/workflow/engine/workflow-engine.test.ts +815 -0
- package/src/env/workflow/extractor/workflow-converter.ts +306 -0
- package/src/env/workflow/fixtures.ts +380 -0
- package/src/env/workflow/index.ts +38 -0
- package/src/env/workflow/integration/run-resume-unified.test.ts +186 -0
- package/src/env/workflow/integration/service-integration.test.ts +267 -0
- package/src/env/workflow/metadata/keys.ts +12 -0
- package/src/env/workflow/nodes/agent-component-adapter.test.ts +318 -0
- package/src/env/workflow/nodes/agent-component-adapter.ts +448 -0
- package/src/env/workflow/nodes/agent-node.test.ts +371 -0
- package/src/env/workflow/nodes/agent-node.ts +598 -0
- package/src/env/workflow/nodes/ask-user-node.ts +113 -0
- package/src/env/workflow/nodes/condition-node.ts +200 -0
- package/src/env/workflow/nodes/index.ts +9 -0
- package/src/env/workflow/nodes/merge-node.ts +141 -0
- package/src/env/workflow/nodes/skill-node.test.ts +253 -0
- package/src/env/workflow/nodes/skill-node.ts +393 -0
- package/src/env/workflow/nodes/tool-node.test.ts +251 -0
- package/src/env/workflow/nodes/tool-node.ts +493 -0
- package/src/env/workflow/nodes/workflow-llm-history.test.ts +455 -0
- package/src/env/workflow/nodes/workflow-node.test.ts +315 -0
- package/src/env/workflow/nodes/workflow-node.ts +311 -0
- package/src/env/workflow/service/index.ts +27 -0
- package/src/env/workflow/service/registry.test.ts +133 -0
- package/src/env/workflow/service/registry.ts +71 -0
- package/src/env/workflow/service/workflow-service.test.ts +310 -0
- package/src/env/workflow/service/workflow-service.ts +393 -0
- package/src/env/workflow/storage/index.ts +28 -0
- package/src/env/workflow/storage/mock-repositories.ts +385 -0
- package/src/env/workflow/storage/sqlite.test.ts +179 -0
- package/src/env/workflow/storage/sqlite.ts +163 -0
- package/src/env/workflow/storage/workflow-repo.test.ts +780 -0
- package/src/env/workflow/storage/workflow-repo.ts +342 -0
- package/src/env/workflow/tools/ask-user-tool.ts +82 -0
- package/src/env/workflow/tools/index.ts +26 -0
- package/src/env/workflow/tools/run-workflow.test.ts +352 -0
- package/src/env/workflow/tools/run-workflow.ts +214 -0
- package/src/env/workflow/types/context.ts +18 -0
- package/src/env/workflow/types/decorators-types.ts +198 -0
- package/src/env/workflow/types/event.test.ts +515 -0
- package/src/env/workflow/types/event.ts +193 -0
- package/src/env/workflow/types/index.ts +49 -0
- package/src/env/workflow/types/run.test.ts +437 -0
- package/src/env/workflow/types/run.ts +173 -0
- package/src/env/workflow/types/workflow-hil.ts +114 -0
- package/src/env/workflow/types/workflow-message.test.ts +138 -0
- package/src/env/workflow/types/workflow-message.ts +196 -0
- package/src/env/workflow/types/workflow-session.test.ts +95 -0
- package/src/env/workflow/types/workflow-session.ts +59 -0
- package/src/env/workflow/types/workflow.test.ts +495 -0
- package/src/env/workflow/types/workflow.ts +195 -0
- package/src/env/workflow/types_compat.ts +51 -0
- package/src/env/workflow/utils/create-workflow.ts +47 -0
- package/src/env/workflow/utils/execution-state.ts +245 -0
- package/src/env/workflow/utils/index.ts +18 -0
- package/src/env/workflow/utils/node-registry-helper.ts +58 -0
- package/src/env/workflow/utils/recovery-validator.test.ts +460 -0
- package/src/env/workflow/utils/recovery-validator.ts +377 -0
- package/src/env/workflow/utils/session-parser.test.ts +111 -0
- package/src/env/workflow/utils/session-parser.ts +94 -0
- package/src/env/workflow/utils/session-recovery.test.ts +334 -0
- package/src/env/workflow/utils/session-recovery.ts +188 -0
- package/src/env/workflow/utils/template-resolver.test.ts +258 -0
- package/src/env/workflow/utils/template-resolver.ts +436 -0
- package/src/env/workflow/utils/validation-rules.ts +149 -0
- package/src/env/workflow/workflow-component.ts +544 -0
- package/src/index.ts +422 -0
- package/src/utils/id.ts +21 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Propagation Env 测试
|
|
3
|
+
*
|
|
4
|
+
* 测试 propagation-env 模块:
|
|
5
|
+
* - injectToEnv: 从当前 OTelTracerProvider 获取上下文并注入环境变量
|
|
6
|
+
* - injectToEnvWithContext: 直接注入指定 SpanContext
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, test, expect, beforeEach, afterEach, vi } from 'bun:test';
|
|
10
|
+
import {
|
|
11
|
+
injectToEnv,
|
|
12
|
+
injectToEnvWithContext,
|
|
13
|
+
injectToEnvFromCarrier,
|
|
14
|
+
} from './propagation-env';
|
|
15
|
+
import { propagation } from './propagation';
|
|
16
|
+
|
|
17
|
+
// Mock the tracer-provider module
|
|
18
|
+
const mockInjectToEnv = vi.fn();
|
|
19
|
+
const mockGetCurrentContext = vi.fn();
|
|
20
|
+
|
|
21
|
+
vi.mock('./tracer-provider', () => ({
|
|
22
|
+
getTracerProvider: vi.fn().mockReturnValue({
|
|
23
|
+
getTracer: vi.fn().mockReturnValue({
|
|
24
|
+
injectToEnv: mockInjectToEnv,
|
|
25
|
+
getCurrentContext: mockGetCurrentContext,
|
|
26
|
+
}),
|
|
27
|
+
isInitialized: vi.fn().mockReturnValue(true),
|
|
28
|
+
}),
|
|
29
|
+
}));
|
|
30
|
+
|
|
31
|
+
describe('propagation-env', () => {
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
vi.clearAllMocks();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('injectToEnv', () => {
|
|
37
|
+
test('should inject TRACEPARENT to provided env object', async () => {
|
|
38
|
+
// Create a mock tracer with current context
|
|
39
|
+
const mockSpanContext = {
|
|
40
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
41
|
+
spanId: 'b7ad6b7169203331',
|
|
42
|
+
parentSpanId: undefined,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
mockGetCurrentContext.mockReturnValue(mockSpanContext);
|
|
46
|
+
mockInjectToEnv.mockImplementation((env: Record<string, string | undefined>) => {
|
|
47
|
+
env['TRACEPARENT'] = '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01';
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const env: Record<string, string | undefined> = {};
|
|
51
|
+
injectToEnv(env);
|
|
52
|
+
|
|
53
|
+
expect(env['TRACEPARENT']).toBeDefined();
|
|
54
|
+
expect(env['TRACEPARENT']).toMatch(/^00-[0-9a-f]{32}-[0-9a-f]{16}-01$/);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('should not inject if no current context', () => {
|
|
58
|
+
mockGetCurrentContext.mockReturnValue(undefined);
|
|
59
|
+
mockInjectToEnv.mockImplementation((_env: Record<string, string | undefined>) => {});
|
|
60
|
+
|
|
61
|
+
const env: Record<string, string | undefined> = {};
|
|
62
|
+
injectToEnv(env);
|
|
63
|
+
|
|
64
|
+
// injectToEnv should not set TRACEPARENT when no context
|
|
65
|
+
expect(mockInjectToEnv).toHaveBeenCalledWith(env);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('should preserve existing env variables', () => {
|
|
69
|
+
const mockSpanContext = {
|
|
70
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
71
|
+
spanId: 'b7ad6b7169203331',
|
|
72
|
+
parentSpanId: undefined,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
mockGetCurrentContext.mockReturnValue(mockSpanContext);
|
|
76
|
+
mockInjectToEnv.mockImplementation((env: Record<string, string | undefined>) => {
|
|
77
|
+
env['TRACEPARENT'] = '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01';
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const env: Record<string, string | undefined> = {
|
|
81
|
+
HOME: '/home/user',
|
|
82
|
+
PATH: '/usr/bin',
|
|
83
|
+
CUSTOM_VAR: 'custom-value',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
injectToEnv(env);
|
|
87
|
+
|
|
88
|
+
expect(env['HOME']).toBe('/home/user');
|
|
89
|
+
expect(env['PATH']).toBe('/usr/bin');
|
|
90
|
+
expect(env['CUSTOM_VAR']).toBe('custom-value');
|
|
91
|
+
expect(env['TRACEPARENT']).toBeDefined();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('injectToEnvWithContext', () => {
|
|
96
|
+
test('should inject given SpanContext to env', () => {
|
|
97
|
+
const context = {
|
|
98
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
99
|
+
spanId: 'b7ad6b7169203331',
|
|
100
|
+
parentSpanId: 'a1b2c3d4e5f67890',
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const env: Record<string, string | undefined> = {};
|
|
104
|
+
injectToEnvWithContext(env, context);
|
|
105
|
+
|
|
106
|
+
// 验证 propagation.inject 被正确调用
|
|
107
|
+
expect(env['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('should inject traceparent format correctly', () => {
|
|
111
|
+
const context = {
|
|
112
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
113
|
+
spanId: 'b7ad6b7169203331',
|
|
114
|
+
parentSpanId: undefined,
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const env: Record<string, string | undefined> = {};
|
|
118
|
+
injectToEnvWithContext(env, context);
|
|
119
|
+
|
|
120
|
+
const traceparent = env['TRACEPARENT'];
|
|
121
|
+
expect(traceparent).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('should overwrite existing TRACEPARENT', () => {
|
|
125
|
+
const context = {
|
|
126
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
127
|
+
spanId: 'b7ad6b7169203331',
|
|
128
|
+
parentSpanId: undefined,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const env: Record<string, string | undefined> = {
|
|
132
|
+
TRACEPARENT: '00-old-trace-old-span-old-flags',
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
injectToEnvWithContext(env, context);
|
|
136
|
+
|
|
137
|
+
expect(env['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe('injectToEnvFromCarrier', () => {
|
|
142
|
+
test('should inject from source carrier to target carrier', () => {
|
|
143
|
+
const sourceCarrier: Record<string, string | undefined> = {
|
|
144
|
+
TRACEPARENT: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const targetCarrier: Record<string, string | undefined> = {};
|
|
148
|
+
injectToEnvFromCarrier(targetCarrier, sourceCarrier);
|
|
149
|
+
|
|
150
|
+
expect(targetCarrier['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test('should return undefined if source has no TRACEPARENT', () => {
|
|
154
|
+
const sourceCarrier: Record<string, string | undefined> = {};
|
|
155
|
+
const targetCarrier: Record<string, string | undefined> = {};
|
|
156
|
+
|
|
157
|
+
injectToEnvFromCarrier(targetCarrier, sourceCarrier);
|
|
158
|
+
|
|
159
|
+
expect(targetCarrier['TRACEPARENT']).toBeUndefined();
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('propagation-env integration', () => {
|
|
165
|
+
test('should produce valid W3C traceparent format', () => {
|
|
166
|
+
const context = {
|
|
167
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
168
|
+
spanId: 'b7ad6b7169203331',
|
|
169
|
+
parentSpanId: undefined,
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const env: Record<string, string | undefined> = {};
|
|
173
|
+
injectToEnvWithContext(env, context);
|
|
174
|
+
|
|
175
|
+
// Parse and verify format
|
|
176
|
+
const parsed = propagation.extract(env);
|
|
177
|
+
expect(parsed).toBeDefined();
|
|
178
|
+
expect(parsed!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
|
|
179
|
+
expect(parsed!.spanId).toBe('b7ad6b7169203331');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Propagation Env Module
|
|
3
|
+
*
|
|
4
|
+
* 提供便捷的环境变量注入功能,用于在子进程执行时传递 trace context。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { injectToEnv, injectToEnvWithContext } from './propagation-env';
|
|
9
|
+
*
|
|
10
|
+
* // 在 Bash 工具中执行子进程前:
|
|
11
|
+
* const traceEnv = injectToEnv(); // 从当前 OTelTracerProvider 获取并注入
|
|
12
|
+
* const options = {
|
|
13
|
+
* env: { ...process.env, ...traceEnv, ...env },
|
|
14
|
+
* };
|
|
15
|
+
* spawn(command, args, options);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { SpanContext } from "../types";
|
|
20
|
+
import { propagation } from "./propagation";
|
|
21
|
+
import { getTracerProvider } from "./tracer-provider";
|
|
22
|
+
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Types
|
|
25
|
+
// ============================================================================
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 环境变量对象类型
|
|
29
|
+
*/
|
|
30
|
+
export type EnvCarrier = Record<string, string | undefined>;
|
|
31
|
+
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Core Functions
|
|
34
|
+
// ============================================================================
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 从当前 OTelTracerProvider 获取上下文并注入到环境变量
|
|
38
|
+
*
|
|
39
|
+
* 这是一个便捷函数,封装了常见的注入模式:
|
|
40
|
+
* 1. 从全局 TracerProvider 获取当前 Tracer
|
|
41
|
+
* 2. 获取当前 span context
|
|
42
|
+
* 3. 注入到目标环境变量
|
|
43
|
+
*
|
|
44
|
+
* @param env 目标环境变量对象(默认:{})
|
|
45
|
+
* @returns 注入了 TRACEPARENT 的环境变量对象
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const env = injectToEnv({ PATH: '/usr/bin' });
|
|
50
|
+
* // env.TRACEPARENT = '00-{traceId}-{spanId}-01'
|
|
51
|
+
* // env.PATH = '/usr/bin'
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export function injectToEnv(env: EnvCarrier = {}): EnvCarrier {
|
|
55
|
+
const provider = getTracerProvider();
|
|
56
|
+
|
|
57
|
+
// 如果 provider 未初始化,尝试获取 tracer(可能会自动初始化)
|
|
58
|
+
const tracer = provider.getTracer('roy-tracer');
|
|
59
|
+
|
|
60
|
+
tracer.injectToEnv(env);
|
|
61
|
+
|
|
62
|
+
return env;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 将指定的 SpanContext 直接注入到环境变量
|
|
67
|
+
*
|
|
68
|
+
* 与 injectToEnv 不同,这个函数不需要访问全局 TracerProvider,
|
|
69
|
+
* 直接使用传入的 SpanContext 进行注入。
|
|
70
|
+
*
|
|
71
|
+
* @param env 目标环境变量对象
|
|
72
|
+
* @param context 要注入的 SpanContext
|
|
73
|
+
* @returns 注入了 TRACEPARENT 的环境变量对象
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const span = tracer.startSpan('my-span');
|
|
78
|
+
* const env = injectToEnvWithContext({}, span.spanContext);
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export function injectToEnvWithContext(env: EnvCarrier, context: SpanContext): EnvCarrier {
|
|
82
|
+
propagation.inject(env, context);
|
|
83
|
+
return env;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 从源环境变量 carrier 复制 TRACEPARENT 到目标 carrier
|
|
88
|
+
*
|
|
89
|
+
* 用于将一个环境变量对象中的 trace context 传递到另一个:
|
|
90
|
+
* - 从 process.env 复制到子进程的环境变量
|
|
91
|
+
* - 从父进程环境变量复制到子进程环境变量
|
|
92
|
+
*
|
|
93
|
+
* @param target 目标 carrier(将被修改)
|
|
94
|
+
* @param source 源 carrier
|
|
95
|
+
* @returns 目标 carrier
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* // 在 fork 子进程时继承父进程的 trace context
|
|
100
|
+
* const childEnv = injectToEnvFromCarrier({}, process.env);
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export function injectToEnvFromCarrier(target: EnvCarrier, source: EnvCarrier): EnvCarrier {
|
|
104
|
+
const extracted = propagation.extract(source);
|
|
105
|
+
|
|
106
|
+
if (extracted) {
|
|
107
|
+
// 将提取的上下文重新注入到目标
|
|
108
|
+
// ExtractedContext 包含发送方的 traceId 和 spanId
|
|
109
|
+
// 需要构造新的 SpanContext 用于传播
|
|
110
|
+
const context: SpanContext = {
|
|
111
|
+
traceId: extracted.traceId,
|
|
112
|
+
spanId: extracted.spanId, // 使用发送方的 spanId
|
|
113
|
+
parentSpanId: undefined, // 新的 span 将作为根 span(但会继承 traceId)
|
|
114
|
+
};
|
|
115
|
+
propagation.inject(target, context);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return target;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ============================================================================
|
|
122
|
+
// Utility Functions
|
|
123
|
+
// ============================================================================
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 获取 TRACEPARENT 字段名
|
|
127
|
+
*/
|
|
128
|
+
export function getTraceparentHeader(): string {
|
|
129
|
+
return propagation.getTraceparentHeader();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Re-exports
|
|
134
|
+
// ============================================================================
|
|
135
|
+
|
|
136
|
+
export type { SpanContext } from "../types";
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview W3C TraceContext Propagation 测试
|
|
3
|
+
*
|
|
4
|
+
* 测试 W3C TraceContext 标准的 traceparent 格式:
|
|
5
|
+
* - 注入 (inject): 将 SpanContext 序列化到环境变量
|
|
6
|
+
* - 提取 (extract): 从环境变量反序列化 SpanContext
|
|
7
|
+
* - 序列化 (serialize): SpanContext -> traceparent 字符串
|
|
8
|
+
* - 反序列化 (parse): traceparent 字符串 -> SpanContext
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { describe, test, expect, beforeEach } from 'bun:test';
|
|
12
|
+
import {
|
|
13
|
+
propagation,
|
|
14
|
+
serialize,
|
|
15
|
+
parse,
|
|
16
|
+
type SpanContext,
|
|
17
|
+
type ExtractedContext,
|
|
18
|
+
} from './propagation';
|
|
19
|
+
|
|
20
|
+
describe('propagation', () => {
|
|
21
|
+
describe('serialize', () => {
|
|
22
|
+
test('should serialize basic SpanContext to traceparent format', () => {
|
|
23
|
+
const context: SpanContext = {
|
|
24
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
25
|
+
spanId: 'b7ad6b7169203331',
|
|
26
|
+
parentSpanId: undefined,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const result = serialize(context);
|
|
30
|
+
// W3C TraceContext: 使用 spanId 而非 parentSpanId
|
|
31
|
+
expect(result).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('should serialize SpanContext with parentSpanId', () => {
|
|
35
|
+
const context: SpanContext = {
|
|
36
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
37
|
+
spanId: 'b7ad6b7169203331',
|
|
38
|
+
parentSpanId: 'a1b2c3d4e5f67890',
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const result = serialize(context);
|
|
42
|
+
// W3C TraceContext: 使用 spanId 而非 parentSpanId
|
|
43
|
+
expect(result).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('should pad traceId to 32 characters', () => {
|
|
47
|
+
const context: SpanContext = {
|
|
48
|
+
traceId: '1',
|
|
49
|
+
spanId: 'b7ad6b7169203331',
|
|
50
|
+
parentSpanId: undefined,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const result = serialize(context);
|
|
54
|
+
// traceId "1" should be padded to "00000000000000000000000000000001"
|
|
55
|
+
expect(result).toMatch(/^00-0{31}1-/);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('should pad spanId to 16 characters', () => {
|
|
59
|
+
const context: SpanContext = {
|
|
60
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
61
|
+
spanId: '1',
|
|
62
|
+
parentSpanId: undefined,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const result = serialize(context);
|
|
66
|
+
// spanId "1" should be padded to "0000000000000001"
|
|
67
|
+
expect(result).toMatch(/-0{15}1-01$/);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('parse', () => {
|
|
72
|
+
test('should parse valid traceparent string', () => {
|
|
73
|
+
const traceparent = '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01';
|
|
74
|
+
|
|
75
|
+
const result = parse(traceparent);
|
|
76
|
+
|
|
77
|
+
expect(result).toBeDefined();
|
|
78
|
+
expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
|
|
79
|
+
// parse returns ExtractedContext: spanId is the sender's spanId
|
|
80
|
+
expect(result!.spanId).toBe('b7ad6b7169203331');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('should parse traceparent string', () => {
|
|
84
|
+
const traceparent = '00-0af7651916cd43dd8448eb211c80319c-a1b2c3d4e5f67890-01';
|
|
85
|
+
|
|
86
|
+
const result = parse(traceparent);
|
|
87
|
+
|
|
88
|
+
expect(result).toBeDefined();
|
|
89
|
+
expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
|
|
90
|
+
expect(result!.spanId).toBe('a1b2c3d4e5f67890');
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('should return undefined for invalid traceparent format', () => {
|
|
94
|
+
const invalidTraceparent = 'invalid-format';
|
|
95
|
+
|
|
96
|
+
const result = parse(invalidTraceparent);
|
|
97
|
+
|
|
98
|
+
expect(result).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test('should return undefined for wrong version', () => {
|
|
102
|
+
const wrongVersion = '01-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01';
|
|
103
|
+
|
|
104
|
+
const result = parse(wrongVersion);
|
|
105
|
+
|
|
106
|
+
expect(result).toBeUndefined();
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('should return undefined for traceId wrong length', () => {
|
|
110
|
+
const wrongLength = '00-0af7651916cd43dd8448eb211c80319-b7ad6b7169203331-01';
|
|
111
|
+
|
|
112
|
+
const result = parse(wrongLength);
|
|
113
|
+
|
|
114
|
+
expect(result).toBeUndefined();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('should return undefined for spanId wrong length', () => {
|
|
118
|
+
const wrongLength = '00-0af7651916cd43dd8448eb211c80319c-b7ad6b716920333-01';
|
|
119
|
+
|
|
120
|
+
const result = parse(wrongLength);
|
|
121
|
+
|
|
122
|
+
expect(result).toBeUndefined();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
describe('inject', () => {
|
|
127
|
+
test('should inject SpanContext to carrier', () => {
|
|
128
|
+
const carrier: Record<string, string> = {};
|
|
129
|
+
const context: SpanContext = {
|
|
130
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
131
|
+
spanId: 'b7ad6b7169203331',
|
|
132
|
+
parentSpanId: undefined,
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
propagation.inject(carrier, context);
|
|
136
|
+
|
|
137
|
+
expect(carrier['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test('should inject with parentSpanId', () => {
|
|
141
|
+
const carrier: Record<string, string> = {};
|
|
142
|
+
const context: SpanContext = {
|
|
143
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
144
|
+
spanId: 'b7ad6b7169203331',
|
|
145
|
+
parentSpanId: 'a1b2c3d4e5f67890',
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
propagation.inject(carrier, context);
|
|
149
|
+
|
|
150
|
+
// W3C TraceContext: inject uses spanId (sender's span ID)
|
|
151
|
+
expect(carrier['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test('should overwrite existing TRACEPARENT', () => {
|
|
155
|
+
const carrier: Record<string, string> = {
|
|
156
|
+
TRACEPARENT: '00-old-trace-old-span-old-flags',
|
|
157
|
+
};
|
|
158
|
+
const context: SpanContext = {
|
|
159
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
160
|
+
spanId: 'b7ad6b7169203331',
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
propagation.inject(carrier, context);
|
|
164
|
+
|
|
165
|
+
expect(carrier['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
describe('extract', () => {
|
|
170
|
+
test('should extract SpanContext from carrier', () => {
|
|
171
|
+
const carrier: Record<string, string> = {
|
|
172
|
+
TRACEPARENT: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const result = propagation.extract(carrier);
|
|
176
|
+
|
|
177
|
+
expect(result).toBeDefined();
|
|
178
|
+
expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
|
|
179
|
+
// extract returns ExtractedContext: spanId is sender's spanId
|
|
180
|
+
expect(result!.spanId).toBe('b7ad6b7169203331');
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test('should extract with spanId', () => {
|
|
184
|
+
const carrier: Record<string, string> = {
|
|
185
|
+
TRACEPARENT: '00-0af7651916cd43dd8448eb211c80319c-a1b2c3d4e5f67890-01',
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const result = propagation.extract(carrier);
|
|
189
|
+
|
|
190
|
+
expect(result).toBeDefined();
|
|
191
|
+
expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
|
|
192
|
+
expect(result!.spanId).toBe('a1b2c3d4e5f67890');
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test('should return undefined when TRACEPARENT not present', () => {
|
|
196
|
+
const carrier: Record<string, string> = {};
|
|
197
|
+
|
|
198
|
+
const result = propagation.extract(carrier);
|
|
199
|
+
|
|
200
|
+
expect(result).toBeUndefined();
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test('should return undefined for invalid TRACEPARENT', () => {
|
|
204
|
+
const carrier: Record<string, string> = {
|
|
205
|
+
TRACEPARENT: 'invalid-traceparent',
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const result = propagation.extract(carrier);
|
|
209
|
+
|
|
210
|
+
expect(result).toBeUndefined();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test('should handle lowercase traceparent', () => {
|
|
214
|
+
const carrier: Record<string, string> = {
|
|
215
|
+
TRACEPARENT: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
const result = propagation.extract(carrier);
|
|
219
|
+
|
|
220
|
+
expect(result).toBeDefined();
|
|
221
|
+
expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
describe('roundtrip', () => {
|
|
226
|
+
test('should serialize and parse back to same values (traceId and parentSpanId)', () => {
|
|
227
|
+
const original: SpanContext = {
|
|
228
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
229
|
+
spanId: 'b7ad6b7169203331',
|
|
230
|
+
parentSpanId: 'a1b2c3d4e5f67890',
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const serialized = serialize(original);
|
|
234
|
+
const parsed = parse(serialized);
|
|
235
|
+
|
|
236
|
+
// parse returns ExtractedContext: spanId is sender's spanId
|
|
237
|
+
expect(parsed).toBeDefined();
|
|
238
|
+
expect(parsed!.traceId).toBe(original.traceId);
|
|
239
|
+
expect(parsed!.spanId).toBe(original.spanId);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test('should inject and extract back to same values', () => {
|
|
243
|
+
const original: SpanContext = {
|
|
244
|
+
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
245
|
+
spanId: 'b7ad6b7169203331',
|
|
246
|
+
parentSpanId: 'a1b2c3d4e5f67890',
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
const carrier: Record<string, string> = {};
|
|
250
|
+
propagation.inject(carrier, original);
|
|
251
|
+
const extracted = propagation.extract(carrier);
|
|
252
|
+
|
|
253
|
+
// extract returns ExtractedContext (without spanId)
|
|
254
|
+
expect(extracted).toBeDefined();
|
|
255
|
+
expect(extracted!.traceId).toBe(original.traceId);
|
|
256
|
+
expect(extracted!.spanId).toBe(original.spanId); // injected uses spanId
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
});
|