@noego/wood 0.4.10 → 0.5.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/README.md +118 -42
- package/dist/bridge/backend_bridge.cjs.map +1 -1
- package/dist/bridge/backend_bridge.js.map +1 -1
- package/dist/client/index.cjs +78 -21
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +18 -3
- package/dist/client/index.d.ts +18 -3
- package/dist/client/index.js +80 -22
- package/dist/client/index.js.map +1 -1
- package/dist/client/renderer_log_transport.cjs +151 -0
- package/dist/client/renderer_log_transport.cjs.map +1 -0
- package/dist/client/renderer_log_transport.d.cts +54 -0
- package/dist/client/renderer_log_transport.d.ts +54 -0
- package/dist/client/renderer_log_transport.js +123 -0
- package/dist/client/renderer_log_transport.js.map +1 -0
- package/dist/codegen/controller_registration_generator.cjs +13 -2
- package/dist/codegen/controller_registration_generator.cjs.map +1 -1
- package/dist/codegen/controller_registration_generator.d.cts +12 -1
- package/dist/codegen/controller_registration_generator.d.ts +12 -1
- package/dist/codegen/controller_registration_generator.js +10 -1
- package/dist/codegen/controller_registration_generator.js.map +1 -1
- package/dist/codegen/index.d.cts +1 -0
- package/dist/codegen/index.d.ts +1 -0
- package/dist/codegen/preload_generator.cjs +13 -6
- package/dist/codegen/preload_generator.cjs.map +1 -1
- package/dist/codegen/preload_generator.d.cts +11 -2
- package/dist/codegen/preload_generator.d.ts +11 -2
- package/dist/codegen/preload_generator.js +13 -6
- package/dist/codegen/preload_generator.js.map +1 -1
- package/dist/codegen/renderer_app_generator.cjs +78 -42
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +78 -42
- package/dist/codegen/renderer_app_generator.js.map +1 -1
- package/dist/codegen/type_generator.cjs +1 -0
- package/dist/codegen/type_generator.cjs.map +1 -1
- package/dist/codegen/type_generator.js +1 -0
- package/dist/codegen/type_generator.js.map +1 -1
- package/dist/config/config_parser.cjs +95 -4
- package/dist/config/config_parser.cjs.map +1 -1
- package/dist/config/config_parser.d.cts +10 -2
- package/dist/config/config_parser.d.ts +10 -2
- package/dist/config/config_parser.js +92 -3
- package/dist/config/config_parser.js.map +1 -1
- package/dist/config/index.cjs +6 -2
- package/dist/config/index.cjs.map +1 -1
- package/dist/config/index.d.cts +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +8 -2
- package/dist/config/index.js.map +1 -1
- package/dist/controller/controller_resolver.cjs +51 -3
- package/dist/controller/controller_resolver.cjs.map +1 -1
- package/dist/controller/controller_resolver.d.cts +27 -4
- package/dist/controller/controller_resolver.d.ts +27 -4
- package/dist/controller/controller_resolver.js +48 -2
- package/dist/controller/controller_resolver.js.map +1 -1
- package/dist/controller/index.cjs +6 -2
- package/dist/controller/index.cjs.map +1 -1
- package/dist/controller/index.d.cts +1 -1
- package/dist/controller/index.d.ts +1 -1
- package/dist/controller/index.js +4 -2
- package/dist/controller/index.js.map +1 -1
- package/dist/dev/wood_dev_server.cjs +4 -1
- package/dist/dev/wood_dev_server.cjs.map +1 -1
- package/dist/dev/wood_dev_server.js +5 -2
- package/dist/dev/wood_dev_server.js.map +1 -1
- package/dist/dev/yaml_watcher.cjs +1 -1
- package/dist/dev/yaml_watcher.cjs.map +1 -1
- package/dist/dev/yaml_watcher.d.cts +4 -0
- package/dist/dev/yaml_watcher.d.ts +4 -0
- package/dist/dev/yaml_watcher.js +1 -1
- package/dist/dev/yaml_watcher.js.map +1 -1
- package/dist/frontend/frontend_lifecycle.cjs +74 -0
- package/dist/frontend/frontend_lifecycle.cjs.map +1 -0
- package/dist/frontend/frontend_lifecycle.d.cts +50 -0
- package/dist/frontend/frontend_lifecycle.d.ts +50 -0
- package/dist/frontend/frontend_lifecycle.js +50 -0
- package/dist/frontend/frontend_lifecycle.js.map +1 -0
- package/dist/frontend/frontend_page.cjs +122 -0
- package/dist/frontend/frontend_page.cjs.map +1 -0
- package/dist/frontend/frontend_page.d.cts +62 -0
- package/dist/frontend/frontend_page.d.ts +62 -0
- package/dist/frontend/frontend_page.js +98 -0
- package/dist/frontend/frontend_page.js.map +1 -0
- package/dist/frontend/frontend_surface.cjs +249 -0
- package/dist/frontend/frontend_surface.cjs.map +1 -0
- package/dist/frontend/frontend_surface.d.cts +64 -0
- package/dist/frontend/frontend_surface.d.ts +64 -0
- package/dist/frontend/frontend_surface.js +224 -0
- package/dist/frontend/frontend_surface.js.map +1 -0
- package/dist/frontend/index.cjs +52 -0
- package/dist/frontend/index.cjs.map +1 -0
- package/dist/frontend/index.d.cts +10 -0
- package/dist/frontend/index.d.ts +10 -0
- package/dist/frontend/index.js +19 -0
- package/dist/frontend/index.js.map +1 -0
- package/dist/frontend/page_catalog.cjs +135 -0
- package/dist/frontend/page_catalog.cjs.map +1 -0
- package/dist/frontend/page_catalog.d.cts +56 -0
- package/dist/frontend/page_catalog.d.ts +56 -0
- package/dist/frontend/page_catalog.js +108 -0
- package/dist/frontend/page_catalog.js.map +1 -0
- package/dist/frontend/tracked_transport.cjs +55 -0
- package/dist/frontend/tracked_transport.cjs.map +1 -0
- package/dist/frontend/tracked_transport.d.cts +36 -0
- package/dist/frontend/tracked_transport.d.ts +36 -0
- package/dist/frontend/tracked_transport.js +31 -0
- package/dist/frontend/tracked_transport.js.map +1 -0
- package/dist/frontend/work_registry.cjs +153 -0
- package/dist/frontend/work_registry.cjs.map +1 -0
- package/dist/frontend/work_registry.d.cts +70 -0
- package/dist/frontend/work_registry.d.ts +70 -0
- package/dist/frontend/work_registry.js +128 -0
- package/dist/frontend/work_registry.js.map +1 -0
- package/dist/index.cjs +24 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -7
- package/dist/index.d.ts +10 -7
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/main/index.cjs +10 -0
- package/dist/main/index.cjs.map +1 -1
- package/dist/main/index.d.cts +14 -2
- package/dist/main/index.d.ts +14 -2
- package/dist/main/index.js +16 -0
- package/dist/main/index.js.map +1 -1
- package/dist/middleware/middleware_resolver.cjs +22 -1
- package/dist/middleware/middleware_resolver.cjs.map +1 -1
- package/dist/middleware/middleware_resolver.d.cts +13 -1
- package/dist/middleware/middleware_resolver.d.ts +13 -1
- package/dist/middleware/middleware_resolver.js +22 -1
- package/dist/middleware/middleware_resolver.js.map +1 -1
- package/dist/navigation/index.cjs +3 -0
- package/dist/navigation/index.cjs.map +1 -1
- package/dist/navigation/index.d.cts +25 -1
- package/dist/navigation/index.d.ts +25 -1
- package/dist/navigation/index.js +2 -0
- package/dist/navigation/index.js.map +1 -1
- package/dist/{middleware/__fixtures__/middleware/auth.cjs → navigation/layout_preservation.cjs} +18 -20
- package/dist/navigation/layout_preservation.cjs.map +1 -0
- package/dist/navigation/layout_preservation.d.cts +2 -0
- package/dist/navigation/layout_preservation.d.ts +2 -0
- package/dist/navigation/layout_preservation.js +18 -0
- package/dist/navigation/layout_preservation.js.map +1 -0
- package/dist/parser/index.cjs +2 -0
- package/dist/parser/index.cjs.map +1 -1
- package/dist/parser/index.d.cts +1 -1
- package/dist/parser/index.d.ts +1 -1
- package/dist/parser/index.js +2 -1
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/operations_parser.cjs +6 -0
- package/dist/parser/operations_parser.cjs.map +1 -1
- package/dist/parser/operations_parser.d.cts +9 -2
- package/dist/parser/operations_parser.d.ts +9 -2
- package/dist/parser/operations_parser.js +5 -0
- package/dist/parser/operations_parser.js.map +1 -1
- package/dist/parser/views_parser.cjs.map +1 -1
- package/dist/parser/views_parser.js.map +1 -1
- package/dist/router/index.d.cts +1 -0
- package/dist/router/index.d.ts +1 -0
- package/dist/router/wood_router.cjs +35 -3
- package/dist/router/wood_router.cjs.map +1 -1
- package/dist/router/wood_router.d.cts +15 -0
- package/dist/router/wood_router.d.ts +15 -0
- package/dist/router/wood_router.js +36 -4
- package/dist/router/wood_router.js.map +1 -1
- package/dist/runtime/get_container.cjs +9 -34
- package/dist/runtime/get_container.cjs.map +1 -1
- package/dist/runtime/get_container.d.cts +24 -4
- package/dist/runtime/get_container.d.ts +24 -4
- package/dist/runtime/get_container.js +8 -23
- package/dist/runtime/get_container.js.map +1 -1
- package/dist/runtime/index.cjs +9 -0
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +5 -2
- package/dist/runtime/index.d.ts +5 -2
- package/dist/runtime/index.js +10 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderer_config_extension.cjs +50 -0
- package/dist/runtime/renderer_config_extension.cjs.map +1 -0
- package/dist/runtime/renderer_config_extension.d.cts +19 -0
- package/dist/runtime/renderer_config_extension.d.ts +19 -0
- package/dist/runtime/renderer_config_extension.js +24 -0
- package/dist/runtime/renderer_config_extension.js.map +1 -0
- package/dist/runtime/renderer_log_batch_receiver.cjs +73 -0
- package/dist/runtime/renderer_log_batch_receiver.cjs.map +1 -0
- package/dist/runtime/renderer_log_batch_receiver.d.cts +29 -0
- package/dist/runtime/renderer_log_batch_receiver.d.ts +29 -0
- package/dist/runtime/renderer_log_batch_receiver.js +48 -0
- package/dist/runtime/renderer_log_batch_receiver.js.map +1 -0
- package/dist/runtime/renderer_trace_batch_receiver_registry.d.cts +1 -1
- package/dist/runtime/renderer_trace_batch_receiver_registry.d.ts +1 -1
- package/dist/runtime/runtime.cjs +14 -0
- package/dist/runtime/runtime.cjs.map +1 -1
- package/dist/runtime/runtime.d.cts +2 -1
- package/dist/runtime/runtime.d.ts +2 -1
- package/dist/runtime/runtime.js +14 -0
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/stick/index.cjs.map +1 -1
- package/dist/stick/index.js.map +1 -1
- package/dist/testing/browser.cjs +104 -23
- package/dist/testing/browser.cjs.map +1 -1
- package/dist/testing/browser.d.cts +8 -3
- package/dist/testing/browser.d.ts +8 -3
- package/dist/testing/browser.js +102 -22
- package/dist/testing/browser.js.map +1 -1
- package/dist/testing/create_controller_harness.cjs +28 -8
- package/dist/testing/create_controller_harness.cjs.map +1 -1
- package/dist/testing/create_controller_harness.d.cts +17 -2
- package/dist/testing/create_controller_harness.d.ts +17 -2
- package/dist/testing/create_controller_harness.js +28 -8
- package/dist/testing/create_controller_harness.js.map +1 -1
- package/dist/testing/create_router_bridge.d.cts +1 -0
- package/dist/testing/create_router_bridge.d.ts +1 -0
- package/dist/testing/create_test_router.d.cts +1 -0
- package/dist/testing/create_test_router.d.ts +1 -0
- package/dist/testing/index.cjs +31 -0
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +20 -5
- package/dist/testing/index.d.ts +20 -5
- package/dist/testing/index.js +19 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/{controller/__fixtures__/controllers/not_a_class.cjs → testing/test_wood.cjs} +15 -7
- package/dist/testing/test_wood.cjs.map +1 -0
- package/dist/testing/test_wood.d.cts +16 -0
- package/dist/testing/test_wood.d.ts +16 -0
- package/dist/testing/test_wood.js +12 -0
- package/dist/testing/test_wood.js.map +1 -0
- package/dist/testing/test_wood_config.cjs +272 -0
- package/dist/testing/test_wood_config.cjs.map +1 -0
- package/dist/testing/test_wood_config.d.cts +111 -0
- package/dist/testing/test_wood_config.d.ts +111 -0
- package/dist/testing/test_wood_config.js +247 -0
- package/dist/testing/test_wood_config.js.map +1 -0
- package/dist/testing/wood_config_source.cjs +146 -0
- package/dist/testing/wood_config_source.cjs.map +1 -0
- package/dist/testing/wood_config_source.d.cts +36 -0
- package/dist/testing/wood_config_source.d.ts +36 -0
- package/dist/testing/wood_config_source.js +112 -0
- package/dist/testing/wood_config_source.js.map +1 -0
- package/dist/testing/wood_env_renderer.cjs +210 -0
- package/dist/testing/wood_env_renderer.cjs.map +1 -0
- package/dist/testing/wood_env_renderer.d.cts +74 -0
- package/dist/testing/wood_env_renderer.d.ts +74 -0
- package/dist/testing/wood_env_renderer.js +188 -0
- package/dist/testing/wood_env_renderer.js.map +1 -0
- package/dist/testing/wood_test_selection.cjs +94 -0
- package/dist/testing/wood_test_selection.cjs.map +1 -0
- package/dist/testing/wood_test_selection.d.cts +39 -0
- package/dist/testing/wood_test_selection.d.ts +39 -0
- package/dist/testing/wood_test_selection.js +68 -0
- package/dist/testing/wood_test_selection.js.map +1 -0
- package/dist/trace-testing/index.d.cts +1 -2
- package/dist/trace-testing/index.d.ts +1 -2
- package/dist/trace-testing/trace_recorder.cjs +1 -1
- package/dist/trace-testing/trace_recorder.cjs.map +1 -1
- package/dist/trace-testing/trace_recorder.d.cts +1 -2
- package/dist/trace-testing/trace_recorder.d.ts +1 -2
- package/dist/trace-testing/trace_recorder.js +1 -1
- package/dist/trace-testing/trace_recorder.js.map +1 -1
- package/dist/trace-transport/index.d.cts +1 -1
- package/dist/trace-transport/index.d.ts +1 -1
- package/dist/{trace_hub-Cob54qRx.d.cts → trace_hub-Cpo_nVze.d.cts} +21 -1
- package/dist/{trace_hub-Cob54qRx.d.ts → trace_hub-Cpo_nVze.d.ts} +21 -1
- package/dist/tracing/index.cjs +9 -2
- package/dist/tracing/index.cjs.map +1 -1
- package/dist/tracing/index.d.cts +3 -2
- package/dist/tracing/index.d.ts +3 -2
- package/dist/tracing/index.js +7 -1
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/renderer_trace_batch_host.d.cts +1 -1
- package/dist/tracing/renderer_trace_batch_host.d.ts +1 -1
- package/dist/tracing/renderer_trace_batch_transport.cjs +48 -6
- package/dist/tracing/renderer_trace_batch_transport.cjs.map +1 -1
- package/dist/tracing/renderer_trace_batch_transport.d.cts +17 -1
- package/dist/tracing/renderer_trace_batch_transport.d.ts +17 -1
- package/dist/tracing/renderer_trace_batch_transport.js +48 -6
- package/dist/tracing/renderer_trace_batch_transport.js.map +1 -1
- package/dist/tracing/trace_batch_adapter.cjs +110 -0
- package/dist/tracing/trace_batch_adapter.cjs.map +1 -0
- package/dist/tracing/trace_batch_adapter.d.cts +36 -0
- package/dist/tracing/trace_batch_adapter.d.ts +36 -0
- package/dist/tracing/trace_batch_adapter.js +86 -0
- package/dist/tracing/trace_batch_adapter.js.map +1 -0
- package/dist/tracing/trace_commit_writer.d.cts +1 -1
- package/dist/tracing/trace_commit_writer.d.ts +1 -1
- package/dist/tracing/trace_hub.cjs +87 -20
- package/dist/tracing/trace_hub.cjs.map +1 -1
- package/dist/tracing/trace_hub.d.cts +1 -1
- package/dist/tracing/trace_hub.d.ts +1 -1
- package/dist/tracing/trace_hub.js +85 -20
- package/dist/tracing/trace_hub.js.map +1 -1
- package/dist/tracing/trace_provider.cjs +21 -6
- package/dist/tracing/trace_provider.cjs.map +1 -1
- package/dist/tracing/trace_provider.d.cts +13 -4
- package/dist/tracing/trace_provider.d.ts +13 -4
- package/dist/tracing/trace_provider.js +22 -7
- package/dist/tracing/trace_provider.js.map +1 -1
- package/dist/tracing/types/wood_trace_batch.types.cjs.map +1 -1
- package/dist/tracing/types/wood_trace_batch.types.d.cts +15 -1
- package/dist/tracing/types/wood_trace_batch.types.d.ts +15 -1
- package/dist/tracing/types/wood_trace_sink.types.d.cts +1 -1
- package/dist/tracing/types/wood_trace_sink.types.d.ts +1 -1
- package/dist/tracing/wood_trace_batch_contract.cjs +2 -0
- package/dist/tracing/wood_trace_batch_contract.cjs.map +1 -1
- package/dist/tracing/wood_trace_batch_contract.d.cts +1 -1
- package/dist/tracing/wood_trace_batch_contract.d.ts +1 -1
- package/dist/tracing/wood_trace_batch_contract.js +2 -0
- package/dist/tracing/wood_trace_batch_contract.js.map +1 -1
- package/dist/transport/build_transport_bridge.cjs +4 -2
- package/dist/transport/build_transport_bridge.cjs.map +1 -1
- package/dist/transport/build_transport_bridge.d.cts +7 -1
- package/dist/transport/build_transport_bridge.d.ts +7 -1
- package/dist/transport/build_transport_bridge.js +2 -1
- package/dist/transport/build_transport_bridge.js.map +1 -1
- package/dist/transport/in_process_router_transport.d.cts +1 -0
- package/dist/transport/in_process_router_transport.d.ts +1 -0
- package/dist/transport/index.d.cts +1 -0
- package/dist/transport/index.d.ts +1 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.cts +47 -1
- package/dist/types/config.d.ts +47 -1
- package/dist/types/context.cjs +12 -0
- package/dist/types/context.cjs.map +1 -1
- package/dist/types/context.d.cts +27 -1
- package/dist/types/context.d.ts +27 -1
- package/dist/types/context.js +4 -0
- package/dist/types/context.js.map +1 -1
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.cts +2 -0
- package/dist/types/operations.d.ts +2 -0
- package/docs/axe.md +706 -0
- package/package.json +13 -5
- package/src/components/NavigationShell.scopes.browser.test.ts +363 -0
- package/src/components/NavigationShell.svelte +126 -49
- package/dist/controller/__fixtures__/controllers/chat.cjs +0 -32
- package/dist/controller/__fixtures__/controllers/chat.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/chat.d.cts +0 -11
- package/dist/controller/__fixtures__/controllers/chat.d.ts +0 -11
- package/dist/controller/__fixtures__/controllers/chat.js +0 -12
- package/dist/controller/__fixtures__/controllers/chat.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/not_a_class.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/not_a_class.d.cts +0 -3
- package/dist/controller/__fixtures__/controllers/not_a_class.d.ts +0 -3
- package/dist/controller/__fixtures__/controllers/not_a_class.js +0 -5
- package/dist/controller/__fixtures__/controllers/not_a_class.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs +0 -32
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/settings.controller.d.cts +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.d.ts +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.js +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/test.cjs +0 -29
- package/dist/controller/__fixtures__/controllers/test.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/test.d.cts +0 -7
- package/dist/controller/__fixtures__/controllers/test.d.ts +0 -7
- package/dist/controller/__fixtures__/controllers/test.js +0 -9
- package/dist/controller/__fixtures__/controllers/test.js.map +0 -1
- package/dist/loader/__fixtures__/layouts/app.load.cjs +0 -27
- package/dist/loader/__fixtures__/layouts/app.load.cjs.map +0 -1
- package/dist/loader/__fixtures__/layouts/app.load.d.cts +0 -5
- package/dist/loader/__fixtures__/layouts/app.load.d.ts +0 -5
- package/dist/loader/__fixtures__/layouts/app.load.js +0 -7
- package/dist/loader/__fixtures__/layouts/app.load.js.map +0 -1
- package/dist/loader/__fixtures__/views/test/page.load.cjs +0 -27
- package/dist/loader/__fixtures__/views/test/page.load.cjs.map +0 -1
- package/dist/loader/__fixtures__/views/test/page.load.d.cts +0 -6
- package/dist/loader/__fixtures__/views/test/page.load.d.ts +0 -6
- package/dist/loader/__fixtures__/views/test/page.load.js +0 -7
- package/dist/loader/__fixtures__/views/test/page.load.js.map +0 -1
- package/dist/middleware/__fixtures__/middleware/auth.cjs.map +0 -1
- package/dist/middleware/__fixtures__/middleware/auth.d.cts +0 -6
- package/dist/middleware/__fixtures__/middleware/auth.d.ts +0 -6
- package/dist/middleware/__fixtures__/middleware/auth.js +0 -19
- package/dist/middleware/__fixtures__/middleware/auth.js.map +0 -1
- package/dist/middleware/__fixtures__/middleware/sequence.cjs +0 -47
- package/dist/middleware/__fixtures__/middleware/sequence.cjs.map +0 -1
- package/dist/middleware/__fixtures__/middleware/sequence.d.cts +0 -7
- package/dist/middleware/__fixtures__/middleware/sequence.d.ts +0 -7
- package/dist/middleware/__fixtures__/middleware/sequence.js +0 -21
- package/dist/middleware/__fixtures__/middleware/sequence.js.map +0 -1
|
@@ -26,6 +26,12 @@ type TraceEvent = TraceInput & {
|
|
|
26
26
|
process: TraceProcess;
|
|
27
27
|
timestamp: string;
|
|
28
28
|
traceSeq: number;
|
|
29
|
+
/**
|
|
30
|
+
* Durable producer identity stamped at admission. Together with traceSeq it
|
|
31
|
+
* forms the identity key `(producerId, traceSeq)` across merged streams
|
|
32
|
+
* (main + ingested renderer events).
|
|
33
|
+
*/
|
|
34
|
+
producerId?: string;
|
|
29
35
|
};
|
|
30
36
|
type TraceDispatchResult = {
|
|
31
37
|
ok: boolean;
|
|
@@ -41,6 +47,12 @@ type TraceWaitOptions = {
|
|
|
41
47
|
timeoutMs?: number;
|
|
42
48
|
};
|
|
43
49
|
declare function normalizeTraceLevel(level: unknown, fallback?: TraceLevel): TraceLevel;
|
|
50
|
+
/**
|
|
51
|
+
* Returns this process's durable trace producer identity, created lazily.
|
|
52
|
+
* The identity is stable for the process lifetime represented by the hub's
|
|
53
|
+
* traceSeq stream.
|
|
54
|
+
*/
|
|
55
|
+
declare function getTraceProducerId(): string;
|
|
44
56
|
declare function getTraceEvents$(): Observable<TraceEvent>;
|
|
45
57
|
declare function registerTraceSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer;
|
|
46
58
|
declare function setMainTraceMinLevel(level: TraceLevel): void;
|
|
@@ -49,8 +61,16 @@ declare function setRendererTraceEnabled(enabled: boolean): void;
|
|
|
49
61
|
declare function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent;
|
|
50
62
|
declare function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent;
|
|
51
63
|
declare function dispatchRendererTracePayload(rawPayload: unknown, context?: TraceRuntimeContext): TraceDispatchResult;
|
|
64
|
+
/**
|
|
65
|
+
* Delivers an already-admitted remote trace event (e.g. a renderer event
|
|
66
|
+
* unwrapped from a persisted IPC batch) to this process's sinks and events$
|
|
67
|
+
* observers. Identity is preserved: no new timestamp, traceSeq, or producerId
|
|
68
|
+
* is assigned, this hub's own counter does not advance, and the event is not
|
|
69
|
+
* re-forwarded through any renderer transport.
|
|
70
|
+
*/
|
|
71
|
+
declare function ingestRemoteTraceEvent(event: TraceEvent, context?: TraceRuntimeContext): boolean;
|
|
52
72
|
declare function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void;
|
|
53
73
|
declare function emitRendererTrace(level: TraceLevel, input: TraceInput): void;
|
|
54
74
|
declare function clearTraceHubForTests(): void;
|
|
55
75
|
|
|
56
|
-
export { type StandardTraceLevel as S, type TraceDispatchResult as T, type WoodTraceEventSink as W, type TraceEvent as a, type TraceInput as b, type TraceLevel as c, type TraceProcess as d, type TraceRuntimeContext as e, type TraceWaitOptions as f, type WoodTraceEventSnapshot as g, type WoodTraceSinkDisposer as h, clearTraceHubForTests as i, getTraceEvents$ as j,
|
|
76
|
+
export { type StandardTraceLevel as S, type TraceDispatchResult as T, type WoodTraceEventSink as W, type TraceEvent as a, type TraceInput as b, type TraceLevel as c, type TraceProcess as d, type TraceRuntimeContext as e, type TraceWaitOptions as f, type WoodTraceEventSnapshot as g, type WoodTraceSinkDisposer as h, clearTraceHubForTests as i, getTraceEvents$ as j, getTraceProducerId as k, ingestRemoteTraceEvent as l, publishTestTrace as m, setRendererTraceTransport as n, dispatchRendererTracePayload as o, publishMainTrace as p, emitRendererTrace as q, registerTraceSink as r, setRendererTraceEnabled as s, setMainTraceMinLevel as t, setRendererTraceMinLevel as u, normalizeTraceLevel as v };
|
|
@@ -26,6 +26,12 @@ type TraceEvent = TraceInput & {
|
|
|
26
26
|
process: TraceProcess;
|
|
27
27
|
timestamp: string;
|
|
28
28
|
traceSeq: number;
|
|
29
|
+
/**
|
|
30
|
+
* Durable producer identity stamped at admission. Together with traceSeq it
|
|
31
|
+
* forms the identity key `(producerId, traceSeq)` across merged streams
|
|
32
|
+
* (main + ingested renderer events).
|
|
33
|
+
*/
|
|
34
|
+
producerId?: string;
|
|
29
35
|
};
|
|
30
36
|
type TraceDispatchResult = {
|
|
31
37
|
ok: boolean;
|
|
@@ -41,6 +47,12 @@ type TraceWaitOptions = {
|
|
|
41
47
|
timeoutMs?: number;
|
|
42
48
|
};
|
|
43
49
|
declare function normalizeTraceLevel(level: unknown, fallback?: TraceLevel): TraceLevel;
|
|
50
|
+
/**
|
|
51
|
+
* Returns this process's durable trace producer identity, created lazily.
|
|
52
|
+
* The identity is stable for the process lifetime represented by the hub's
|
|
53
|
+
* traceSeq stream.
|
|
54
|
+
*/
|
|
55
|
+
declare function getTraceProducerId(): string;
|
|
44
56
|
declare function getTraceEvents$(): Observable<TraceEvent>;
|
|
45
57
|
declare function registerTraceSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer;
|
|
46
58
|
declare function setMainTraceMinLevel(level: TraceLevel): void;
|
|
@@ -49,8 +61,16 @@ declare function setRendererTraceEnabled(enabled: boolean): void;
|
|
|
49
61
|
declare function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent;
|
|
50
62
|
declare function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent;
|
|
51
63
|
declare function dispatchRendererTracePayload(rawPayload: unknown, context?: TraceRuntimeContext): TraceDispatchResult;
|
|
64
|
+
/**
|
|
65
|
+
* Delivers an already-admitted remote trace event (e.g. a renderer event
|
|
66
|
+
* unwrapped from a persisted IPC batch) to this process's sinks and events$
|
|
67
|
+
* observers. Identity is preserved: no new timestamp, traceSeq, or producerId
|
|
68
|
+
* is assigned, this hub's own counter does not advance, and the event is not
|
|
69
|
+
* re-forwarded through any renderer transport.
|
|
70
|
+
*/
|
|
71
|
+
declare function ingestRemoteTraceEvent(event: TraceEvent, context?: TraceRuntimeContext): boolean;
|
|
52
72
|
declare function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void;
|
|
53
73
|
declare function emitRendererTrace(level: TraceLevel, input: TraceInput): void;
|
|
54
74
|
declare function clearTraceHubForTests(): void;
|
|
55
75
|
|
|
56
|
-
export { type StandardTraceLevel as S, type TraceDispatchResult as T, type WoodTraceEventSink as W, type TraceEvent as a, type TraceInput as b, type TraceLevel as c, type TraceProcess as d, type TraceRuntimeContext as e, type TraceWaitOptions as f, type WoodTraceEventSnapshot as g, type WoodTraceSinkDisposer as h, clearTraceHubForTests as i, getTraceEvents$ as j,
|
|
76
|
+
export { type StandardTraceLevel as S, type TraceDispatchResult as T, type WoodTraceEventSink as W, type TraceEvent as a, type TraceInput as b, type TraceLevel as c, type TraceProcess as d, type TraceRuntimeContext as e, type TraceWaitOptions as f, type WoodTraceEventSnapshot as g, type WoodTraceSinkDisposer as h, clearTraceHubForTests as i, getTraceEvents$ as j, getTraceProducerId as k, ingestRemoteTraceEvent as l, publishTestTrace as m, setRendererTraceTransport as n, dispatchRendererTracePayload as o, publishMainTrace as p, emitRendererTrace as q, registerTraceSink as r, setRendererTraceEnabled as s, setMainTraceMinLevel as t, setRendererTraceMinLevel as u, normalizeTraceLevel as v };
|
package/dist/tracing/index.cjs
CHANGED
|
@@ -32,16 +32,20 @@ __export(tracing_exports, {
|
|
|
32
32
|
dispatchRendererTracePayload: () => import_trace_hub.dispatchRendererTracePayload,
|
|
33
33
|
emitRendererTrace: () => import_trace_hub.emitRendererTrace,
|
|
34
34
|
getTraceEvents$: () => import_trace_hub.getTraceEvents$,
|
|
35
|
+
getTraceProducerId: () => import_trace_hub.getTraceProducerId,
|
|
36
|
+
ingestRemoteTraceEvent: () => import_trace_hub.ingestRemoteTraceEvent,
|
|
35
37
|
publishMainTrace: () => import_trace_hub.publishMainTrace,
|
|
36
38
|
publishTestTrace: () => import_trace_hub.publishTestTrace,
|
|
37
39
|
registerTraceSink: () => import_trace_hub.registerTraceSink,
|
|
38
40
|
setMainTraceMinLevel: () => import_trace_hub.setMainTraceMinLevel,
|
|
39
41
|
setRendererTraceEnabled: () => import_trace_hub.setRendererTraceEnabled,
|
|
40
42
|
setRendererTraceMinLevel: () => import_trace_hub.setRendererTraceMinLevel,
|
|
41
|
-
setRendererTraceTransport: () => import_trace_hub.setRendererTraceTransport
|
|
43
|
+
setRendererTraceTransport: () => import_trace_hub.setRendererTraceTransport,
|
|
44
|
+
woodBatchToTraceBatch: () => import_trace_batch_adapter.woodBatchToTraceBatch
|
|
42
45
|
});
|
|
43
46
|
module.exports = __toCommonJS(tracing_exports);
|
|
44
47
|
var import_trace_hub = require("./trace_hub.js");
|
|
48
|
+
var import_trace_batch_adapter = require("./trace_batch_adapter.js");
|
|
45
49
|
var import_renderer_trace_batch_host = require("./renderer_trace_batch_host.js");
|
|
46
50
|
var import_renderer_trace_batch_transport = require("./renderer_trace_batch_transport.js");
|
|
47
51
|
var import_wood_trace_batch_contract = require("./wood_trace_batch_contract.js");
|
|
@@ -63,12 +67,15 @@ var import_trace_provider = require("./trace_provider.js");
|
|
|
63
67
|
dispatchRendererTracePayload,
|
|
64
68
|
emitRendererTrace,
|
|
65
69
|
getTraceEvents$,
|
|
70
|
+
getTraceProducerId,
|
|
71
|
+
ingestRemoteTraceEvent,
|
|
66
72
|
publishMainTrace,
|
|
67
73
|
publishTestTrace,
|
|
68
74
|
registerTraceSink,
|
|
69
75
|
setMainTraceMinLevel,
|
|
70
76
|
setRendererTraceEnabled,
|
|
71
77
|
setRendererTraceMinLevel,
|
|
72
|
-
setRendererTraceTransport
|
|
78
|
+
setRendererTraceTransport,
|
|
79
|
+
woodBatchToTraceBatch
|
|
73
80
|
});
|
|
74
81
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tracing/index.ts"],"sourcesContent":["export {\n clearTraceHubForTests,\n dispatchRendererTracePayload,\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n registerTraceSink,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n setRendererTraceTransport,\n type TraceDispatchResult,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n type TraceRuntimeContext,\n type TraceWaitOptions,\n} from './trace_hub.js';\n\nexport { RendererTraceBatchHost } from './renderer_trace_batch_host.js';\nexport { RendererTraceBatchTransport } from './renderer_trace_batch_transport.js';\nexport { WoodTraceBatchContract } from './wood_trace_batch_contract.js';\nexport type {\n WoodRendererTraceEvent,\n WoodRendererTraceInput,\n WoodTraceAcknowledgementParseResult,\n WoodTraceBatch,\n WoodTraceBatchAcknowledgement,\n WoodTraceBatchAdmissionResult,\n WoodTraceBatchParseResult,\n WoodTraceBatchPort,\n WoodTraceBatchReceiver,\n WoodTraceBatchRuntimeContext,\n WoodTraceBatchTransportOptions,\n WoodTraceBatchTransportStatus,\n WoodTraceEventParseResult,\n WoodTraceEventsParseResult,\n WoodTraceIdentityValidationResult,\n} from './types/wood_trace_batch.types.js';\nexport type {\n WoodTraceEventSink,\n WoodTraceEventSnapshot,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport {\n TraceCommitWriter,\n type TraceCommitRow,\n type TraceCommitWriterOptions,\n type TraceFlushOptions,\n type TraceFlushResult,\n type WoodTracePersistencePort,\n} from './trace_commit_writer.js';\n\nexport {\n FrameworkTracer,\n MainTracer,\n RendererTracer,\n TestTracer,\n TraceProvider,\n TraceProviderConfiguration,\n type TraceContext,\n type TraceProviderMode,\n type TraceRuntime,\n} from './trace_provider.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/tracing/index.ts"],"sourcesContent":["export {\n clearTraceHubForTests,\n dispatchRendererTracePayload,\n emitRendererTrace,\n getTraceEvents$,\n getTraceProducerId,\n ingestRemoteTraceEvent,\n publishMainTrace,\n publishTestTrace,\n registerTraceSink,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n setRendererTraceTransport,\n type TraceDispatchResult,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n type TraceRuntimeContext,\n type TraceWaitOptions,\n} from './trace_hub.js';\n\nexport { woodBatchToTraceBatch } from './trace_batch_adapter.js';\nexport type { WoodTraceBatchConversion } from './trace_batch_adapter.js';\nexport { RendererTraceBatchHost } from './renderer_trace_batch_host.js';\nexport { RendererTraceBatchTransport } from './renderer_trace_batch_transport.js';\nexport { WoodTraceBatchContract } from './wood_trace_batch_contract.js';\nexport type {\n WoodRendererTraceEvent,\n WoodRendererTraceInput,\n WoodTraceAcknowledgementParseResult,\n WoodTraceBatch,\n WoodTraceBatchAcknowledgement,\n WoodTraceBatchAdmissionResult,\n WoodTraceBatchParseResult,\n WoodTraceBatchPort,\n WoodTraceBatchReceiver,\n WoodTraceBatchRuntimeContext,\n WoodTraceBatchTransportOptions,\n WoodTraceBatchTransportStatus,\n WoodTraceEventParseResult,\n WoodTraceEventsParseResult,\n WoodTraceIdentityValidationResult,\n} from './types/wood_trace_batch.types.js';\nexport type {\n WoodTraceEventSink,\n WoodTraceEventSnapshot,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport {\n TraceCommitWriter,\n type TraceCommitRow,\n type TraceCommitWriterOptions,\n type TraceFlushOptions,\n type TraceFlushResult,\n type WoodTracePersistencePort,\n} from './trace_commit_writer.js';\n\nexport {\n FrameworkTracer,\n MainTracer,\n RendererTracer,\n TestTracer,\n TraceProvider,\n TraceProviderConfiguration,\n type TraceContext,\n type TraceProviderMode,\n type TraceRuntime,\n} from './trace_provider.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAqBO;AAEP,iCAAsC;AAEtC,uCAAuC;AACvC,4CAA4C;AAC5C,uCAAuC;AAwBvC,iCAOO;AAEP,4BAUO;","names":[]}
|
package/dist/tracing/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { T as TraceDispatchResult, a as TraceEvent, b as TraceInput, c as TraceLevel, d as TraceProcess, e as TraceRuntimeContext, f as TraceWaitOptions, W as WoodTraceEventSink, g as WoodTraceEventSnapshot, h as WoodTraceSinkDisposer, i as clearTraceHubForTests,
|
|
1
|
+
export { T as TraceDispatchResult, a as TraceEvent, b as TraceInput, c as TraceLevel, d as TraceProcess, e as TraceRuntimeContext, f as TraceWaitOptions, W as WoodTraceEventSink, g as WoodTraceEventSnapshot, h as WoodTraceSinkDisposer, i as clearTraceHubForTests, o as dispatchRendererTracePayload, q as emitRendererTrace, j as getTraceEvents$, k as getTraceProducerId, l as ingestRemoteTraceEvent, p as publishMainTrace, m as publishTestTrace, r as registerTraceSink, t as setMainTraceMinLevel, s as setRendererTraceEnabled, u as setRendererTraceMinLevel, n as setRendererTraceTransport } from '../trace_hub-Cpo_nVze.cjs';
|
|
2
|
+
export { WoodTraceBatchConversion, woodBatchToTraceBatch } from './trace_batch_adapter.cjs';
|
|
2
3
|
export { RendererTraceBatchHost } from './renderer_trace_batch_host.cjs';
|
|
3
4
|
export { RendererTraceBatchTransport } from './renderer_trace_batch_transport.cjs';
|
|
4
5
|
export { WoodTraceBatchContract } from './wood_trace_batch_contract.cjs';
|
|
@@ -6,5 +7,5 @@ export { WoodRendererTraceEvent, WoodRendererTraceInput, WoodTraceAcknowledgemen
|
|
|
6
7
|
export { TraceCommitRow, TraceCommitWriter, TraceCommitWriterOptions, TraceFlushOptions, TraceFlushResult, WoodTracePersistencePort } from './trace_commit_writer.cjs';
|
|
7
8
|
export { FrameworkTracer, MainTracer, RendererTracer, TestTracer, TraceContext, TraceProvider, TraceProviderConfiguration, TraceProviderMode, TraceRuntime } from './trace_provider.cjs';
|
|
8
9
|
import 'rxjs';
|
|
10
|
+
import '@noego/trace';
|
|
9
11
|
import '@noego/telemetry/core';
|
|
10
|
-
import '@noego/ioc';
|
package/dist/tracing/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { T as TraceDispatchResult, a as TraceEvent, b as TraceInput, c as TraceLevel, d as TraceProcess, e as TraceRuntimeContext, f as TraceWaitOptions, W as WoodTraceEventSink, g as WoodTraceEventSnapshot, h as WoodTraceSinkDisposer, i as clearTraceHubForTests,
|
|
1
|
+
export { T as TraceDispatchResult, a as TraceEvent, b as TraceInput, c as TraceLevel, d as TraceProcess, e as TraceRuntimeContext, f as TraceWaitOptions, W as WoodTraceEventSink, g as WoodTraceEventSnapshot, h as WoodTraceSinkDisposer, i as clearTraceHubForTests, o as dispatchRendererTracePayload, q as emitRendererTrace, j as getTraceEvents$, k as getTraceProducerId, l as ingestRemoteTraceEvent, p as publishMainTrace, m as publishTestTrace, r as registerTraceSink, t as setMainTraceMinLevel, s as setRendererTraceEnabled, u as setRendererTraceMinLevel, n as setRendererTraceTransport } from '../trace_hub-Cpo_nVze.js';
|
|
2
|
+
export { WoodTraceBatchConversion, woodBatchToTraceBatch } from './trace_batch_adapter.js';
|
|
2
3
|
export { RendererTraceBatchHost } from './renderer_trace_batch_host.js';
|
|
3
4
|
export { RendererTraceBatchTransport } from './renderer_trace_batch_transport.js';
|
|
4
5
|
export { WoodTraceBatchContract } from './wood_trace_batch_contract.js';
|
|
@@ -6,5 +7,5 @@ export { WoodRendererTraceEvent, WoodRendererTraceInput, WoodTraceAcknowledgemen
|
|
|
6
7
|
export { TraceCommitRow, TraceCommitWriter, TraceCommitWriterOptions, TraceFlushOptions, TraceFlushResult, WoodTracePersistencePort } from './trace_commit_writer.js';
|
|
7
8
|
export { FrameworkTracer, MainTracer, RendererTracer, TestTracer, TraceContext, TraceProvider, TraceProviderConfiguration, TraceProviderMode, TraceRuntime } from './trace_provider.js';
|
|
8
9
|
import 'rxjs';
|
|
10
|
+
import '@noego/trace';
|
|
9
11
|
import '@noego/telemetry/core';
|
|
10
|
-
import '@noego/ioc';
|
package/dist/tracing/index.js
CHANGED
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
dispatchRendererTracePayload,
|
|
4
4
|
emitRendererTrace,
|
|
5
5
|
getTraceEvents$,
|
|
6
|
+
getTraceProducerId,
|
|
7
|
+
ingestRemoteTraceEvent,
|
|
6
8
|
publishMainTrace,
|
|
7
9
|
publishTestTrace,
|
|
8
10
|
registerTraceSink,
|
|
@@ -11,6 +13,7 @@ import {
|
|
|
11
13
|
setRendererTraceMinLevel,
|
|
12
14
|
setRendererTraceTransport
|
|
13
15
|
} from "./trace_hub.js";
|
|
16
|
+
import { woodBatchToTraceBatch } from "./trace_batch_adapter.js";
|
|
14
17
|
import { RendererTraceBatchHost } from "./renderer_trace_batch_host.js";
|
|
15
18
|
import { RendererTraceBatchTransport } from "./renderer_trace_batch_transport.js";
|
|
16
19
|
import { WoodTraceBatchContract } from "./wood_trace_batch_contract.js";
|
|
@@ -40,12 +43,15 @@ export {
|
|
|
40
43
|
dispatchRendererTracePayload,
|
|
41
44
|
emitRendererTrace,
|
|
42
45
|
getTraceEvents$,
|
|
46
|
+
getTraceProducerId,
|
|
47
|
+
ingestRemoteTraceEvent,
|
|
43
48
|
publishMainTrace,
|
|
44
49
|
publishTestTrace,
|
|
45
50
|
registerTraceSink,
|
|
46
51
|
setMainTraceMinLevel,
|
|
47
52
|
setRendererTraceEnabled,
|
|
48
53
|
setRendererTraceMinLevel,
|
|
49
|
-
setRendererTraceTransport
|
|
54
|
+
setRendererTraceTransport,
|
|
55
|
+
woodBatchToTraceBatch
|
|
50
56
|
};
|
|
51
57
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tracing/index.ts"],"sourcesContent":["export {\n clearTraceHubForTests,\n dispatchRendererTracePayload,\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n registerTraceSink,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n setRendererTraceTransport,\n type TraceDispatchResult,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n type TraceRuntimeContext,\n type TraceWaitOptions,\n} from './trace_hub.js';\n\nexport { RendererTraceBatchHost } from './renderer_trace_batch_host.js';\nexport { RendererTraceBatchTransport } from './renderer_trace_batch_transport.js';\nexport { WoodTraceBatchContract } from './wood_trace_batch_contract.js';\nexport type {\n WoodRendererTraceEvent,\n WoodRendererTraceInput,\n WoodTraceAcknowledgementParseResult,\n WoodTraceBatch,\n WoodTraceBatchAcknowledgement,\n WoodTraceBatchAdmissionResult,\n WoodTraceBatchParseResult,\n WoodTraceBatchPort,\n WoodTraceBatchReceiver,\n WoodTraceBatchRuntimeContext,\n WoodTraceBatchTransportOptions,\n WoodTraceBatchTransportStatus,\n WoodTraceEventParseResult,\n WoodTraceEventsParseResult,\n WoodTraceIdentityValidationResult,\n} from './types/wood_trace_batch.types.js';\nexport type {\n WoodTraceEventSink,\n WoodTraceEventSnapshot,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport {\n TraceCommitWriter,\n type TraceCommitRow,\n type TraceCommitWriterOptions,\n type TraceFlushOptions,\n type TraceFlushResult,\n type WoodTracePersistencePort,\n} from './trace_commit_writer.js';\n\nexport {\n FrameworkTracer,\n MainTracer,\n RendererTracer,\n TestTracer,\n TraceProvider,\n TraceProviderConfiguration,\n type TraceContext,\n type TraceProviderMode,\n type TraceRuntime,\n} from './trace_provider.js';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AAEP,SAAS,8BAA8B;AACvC,SAAS,mCAAmC;AAC5C,SAAS,8BAA8B;AAwBvC;AAAA,EACE;AAAA,OAMK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tracing/index.ts"],"sourcesContent":["export {\n clearTraceHubForTests,\n dispatchRendererTracePayload,\n emitRendererTrace,\n getTraceEvents$,\n getTraceProducerId,\n ingestRemoteTraceEvent,\n publishMainTrace,\n publishTestTrace,\n registerTraceSink,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n setRendererTraceTransport,\n type TraceDispatchResult,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n type TraceRuntimeContext,\n type TraceWaitOptions,\n} from './trace_hub.js';\n\nexport { woodBatchToTraceBatch } from './trace_batch_adapter.js';\nexport type { WoodTraceBatchConversion } from './trace_batch_adapter.js';\nexport { RendererTraceBatchHost } from './renderer_trace_batch_host.js';\nexport { RendererTraceBatchTransport } from './renderer_trace_batch_transport.js';\nexport { WoodTraceBatchContract } from './wood_trace_batch_contract.js';\nexport type {\n WoodRendererTraceEvent,\n WoodRendererTraceInput,\n WoodTraceAcknowledgementParseResult,\n WoodTraceBatch,\n WoodTraceBatchAcknowledgement,\n WoodTraceBatchAdmissionResult,\n WoodTraceBatchParseResult,\n WoodTraceBatchPort,\n WoodTraceBatchReceiver,\n WoodTraceBatchRuntimeContext,\n WoodTraceBatchTransportOptions,\n WoodTraceBatchTransportStatus,\n WoodTraceEventParseResult,\n WoodTraceEventsParseResult,\n WoodTraceIdentityValidationResult,\n} from './types/wood_trace_batch.types.js';\nexport type {\n WoodTraceEventSink,\n WoodTraceEventSnapshot,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport {\n TraceCommitWriter,\n type TraceCommitRow,\n type TraceCommitWriterOptions,\n type TraceFlushOptions,\n type TraceFlushResult,\n type WoodTracePersistencePort,\n} from './trace_commit_writer.js';\n\nexport {\n FrameworkTracer,\n MainTracer,\n RendererTracer,\n TestTracer,\n TraceProvider,\n TraceProviderConfiguration,\n type TraceContext,\n type TraceProviderMode,\n type TraceRuntime,\n} from './trace_provider.js';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AAEP,SAAS,6BAA6B;AAEtC,SAAS,8BAA8B;AACvC,SAAS,mCAAmC;AAC5C,SAAS,8BAA8B;AAwBvC;AAAA,EACE;AAAA,OAMK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WoodTraceBatchReceiver, WoodTraceBatchRuntimeContext, WoodTraceBatchAcknowledgement } from './types/wood_trace_batch.types.cjs';
|
|
2
2
|
import '@noego/telemetry/core';
|
|
3
|
-
import '../trace_hub-
|
|
3
|
+
import '../trace_hub-Cpo_nVze.cjs';
|
|
4
4
|
import 'rxjs';
|
|
5
5
|
|
|
6
6
|
declare class RendererTraceBatchHost {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WoodTraceBatchReceiver, WoodTraceBatchRuntimeContext, WoodTraceBatchAcknowledgement } from './types/wood_trace_batch.types.js';
|
|
2
2
|
import '@noego/telemetry/core';
|
|
3
|
-
import '../trace_hub-
|
|
3
|
+
import '../trace_hub-Cpo_nVze.js';
|
|
4
4
|
import 'rxjs';
|
|
5
5
|
|
|
6
6
|
declare class RendererTraceBatchHost {
|
|
@@ -38,6 +38,7 @@ class RendererTraceBatchTransport {
|
|
|
38
38
|
this.droppedClosed = 0;
|
|
39
39
|
this.droppedRejected = 0;
|
|
40
40
|
this.droppedRetryExhausted = 0;
|
|
41
|
+
this.identityRestamped = 0;
|
|
41
42
|
this.committedBatches = 0;
|
|
42
43
|
this.retryAttempts = 0;
|
|
43
44
|
this.metadataTruncatedValues = 0;
|
|
@@ -49,8 +50,8 @@ class RendererTraceBatchTransport {
|
|
|
49
50
|
);
|
|
50
51
|
}
|
|
51
52
|
admit(event) {
|
|
52
|
-
const
|
|
53
|
-
|
|
53
|
+
const identity = this.resolveIdentity(event);
|
|
54
|
+
const sequence = identity.sequence;
|
|
54
55
|
if (this.state !== "accepting") {
|
|
55
56
|
this.droppedClosed += 1;
|
|
56
57
|
return { kind: "dropped", sequence, reason: "closed" };
|
|
@@ -60,10 +61,46 @@ class RendererTraceBatchTransport {
|
|
|
60
61
|
this.droppedCapacity += 1;
|
|
61
62
|
return { kind: "dropped", sequence, reason: "capacity" };
|
|
62
63
|
}
|
|
63
|
-
this.queue.push(Object.freeze({ sequence, event: this.snapshotEvent(event, sequence) }));
|
|
64
|
+
this.queue.push(Object.freeze({ sequence, event: this.snapshotEvent(event, sequence, identity) }));
|
|
64
65
|
this.scheduleDrain();
|
|
65
66
|
return { kind: "admitted", sequence };
|
|
66
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolves the queue sequence and preserved identity for an incoming event,
|
|
70
|
+
* reading identity fields from the raw input BEFORE metadata snapshotting so
|
|
71
|
+
* truncation/redaction can never alter identity.
|
|
72
|
+
*
|
|
73
|
+
* A hub-admitted event (valid timestamp + traceSeq) keeps its identity and
|
|
74
|
+
* its queue sequence is derived as traceSeq - 1 so the batch sequence range
|
|
75
|
+
* stays aligned with hub identity. A stamped event whose traceSeq regresses
|
|
76
|
+
* against the already-assigned sequence stream is restamped as legacy (its
|
|
77
|
+
* occurrence timestamp is still preserved, its producerId is dropped so a
|
|
78
|
+
* reassigned sequence cannot masquerade under the durable identity key) and
|
|
79
|
+
* counted in identityRestamped. Legacy events without identity are stamped
|
|
80
|
+
* exactly as before.
|
|
81
|
+
*/
|
|
82
|
+
resolveIdentity(event) {
|
|
83
|
+
const rawTimestamp = typeof event.timestamp === "string" && Number.isFinite(Date.parse(event.timestamp)) ? event.timestamp : void 0;
|
|
84
|
+
const rawSeq = typeof event.traceSeq === "number" && Number.isSafeInteger(event.traceSeq) && event.traceSeq >= 1 ? event.traceSeq : void 0;
|
|
85
|
+
const producerId = typeof event.producerId === "string" && event.producerId.trim().length > 0 ? event.producerId : void 0;
|
|
86
|
+
if (rawTimestamp !== void 0 && rawSeq !== void 0 && rawSeq - 1 >= this.nextSequence) {
|
|
87
|
+
this.nextSequence = rawSeq;
|
|
88
|
+
return {
|
|
89
|
+
sequence: rawSeq - 1,
|
|
90
|
+
timestamp: rawTimestamp,
|
|
91
|
+
...producerId !== void 0 ? { producerId } : {}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (rawTimestamp !== void 0 && rawSeq !== void 0) {
|
|
95
|
+
this.identityRestamped += 1;
|
|
96
|
+
}
|
|
97
|
+
const sequence = this.nextSequence;
|
|
98
|
+
this.nextSequence += 1;
|
|
99
|
+
return {
|
|
100
|
+
sequence,
|
|
101
|
+
...rawTimestamp !== void 0 ? { timestamp: rawTimestamp } : {}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
67
104
|
attachPort(port) {
|
|
68
105
|
this.detachPort();
|
|
69
106
|
this.port = port;
|
|
@@ -86,6 +123,7 @@ class RendererTraceBatchTransport {
|
|
|
86
123
|
droppedClosed: this.droppedClosed,
|
|
87
124
|
droppedRejected: this.droppedRejected,
|
|
88
125
|
droppedRetryExhausted: this.droppedRetryExhausted,
|
|
126
|
+
identityRestamped: this.identityRestamped,
|
|
89
127
|
metadataTruncatedValues: this.metadataTruncatedValues,
|
|
90
128
|
metadataRedactedValues: this.metadataRedactedValues,
|
|
91
129
|
metadataSerializationFailures: this.metadataSerializationFailures,
|
|
@@ -252,14 +290,17 @@ class RendererTraceBatchTransport {
|
|
|
252
290
|
this.handleAcknowledgementTimeout(current.batch.batchId, attempt);
|
|
253
291
|
});
|
|
254
292
|
}
|
|
255
|
-
snapshotEvent(event, sequence) {
|
|
293
|
+
snapshotEvent(event, sequence, identity) {
|
|
256
294
|
const snapshot = this.metadataSnapshotter.snapshot(event);
|
|
257
295
|
this.metadataTruncatedValues += snapshot.stats.truncatedValues;
|
|
258
296
|
this.metadataRedactedValues += snapshot.stats.redactedValues;
|
|
259
297
|
this.metadataSerializationFailures += snapshot.stats.serializationFailures;
|
|
260
298
|
const input = snapshot.metadata;
|
|
261
|
-
|
|
262
|
-
|
|
299
|
+
let timestamp = identity.timestamp;
|
|
300
|
+
if (timestamp === void 0) {
|
|
301
|
+
const occurredAt = new Date(this.options.now());
|
|
302
|
+
timestamp = Number.isNaN(occurredAt.getTime()) ? (/* @__PURE__ */ new Date(0)).toISOString() : occurredAt.toISOString();
|
|
303
|
+
}
|
|
263
304
|
return Object.freeze({
|
|
264
305
|
source: this.snapshotString(input.source, "unknown"),
|
|
265
306
|
type: this.snapshotString(input.type, "unknown"),
|
|
@@ -267,6 +308,7 @@ class RendererTraceBatchTransport {
|
|
|
267
308
|
process: "renderer",
|
|
268
309
|
timestamp,
|
|
269
310
|
traceSeq: sequence + 1,
|
|
311
|
+
...identity.producerId !== void 0 ? { producerId: identity.producerId } : {},
|
|
270
312
|
...this.snapshotOptionalString("message", input.message),
|
|
271
313
|
...this.snapshotConversationId(input.conversationId),
|
|
272
314
|
...this.snapshotPayload(input.payload),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tracing/renderer_trace_batch_transport.ts"],"sourcesContent":["import {\n BoundedMetadataSnapshotter,\n DEFAULT_METADATA_SNAPSHOT_LIMITS,\n type TelemetryJsonObject,\n type TelemetryJsonValue,\n} from '@noego/telemetry/core';\nimport { WoodTraceBatchContract } from './wood_trace_batch_contract.js';\nimport type {\n WoodRendererTraceEvent,\n WoodRendererTraceInput,\n WoodTraceBatch,\n WoodTraceBatchAdmissionResult,\n WoodTraceBatchPort,\n WoodTraceBatchTransportOptions,\n WoodTraceBatchTransportStatus,\n} from './types/wood_trace_batch.types.js';\n\ntype QueuedTraceEvent = Readonly<{\n sequence: number;\n event: WoodRendererTraceEvent;\n}>;\n\ntype InFlightTraceBatch = {\n batch: WoodTraceBatch;\n attempts: number;\n awaitingAcknowledgement: boolean;\n retryReady: boolean;\n retryGeneration: number;\n};\n\nexport class RendererTraceBatchTransport {\n private readonly contract = new WoodTraceBatchContract();\n private readonly metadataSnapshotter: BoundedMetadataSnapshotter;\n private readonly queue: QueuedTraceEvent[] = [];\n private state: 'accepting' | 'draining' | 'stopped' = 'accepting';\n private port: WoodTraceBatchPort | null = null;\n private unsubscribePort: (() => void) | null = null;\n private inFlight: InFlightTraceBatch | null = null;\n private nextSequence = 0;\n private drainScheduled = false;\n private droppedCapacity = 0;\n private droppedClosed = 0;\n private droppedRejected = 0;\n private droppedRetryExhausted = 0;\n private committedBatches = 0;\n private retryAttempts = 0;\n private metadataTruncatedValues = 0;\n private metadataRedactedValues = 0;\n private metadataSerializationFailures = 0;\n\n constructor(private readonly options: WoodTraceBatchTransportOptions) {\n this.validateOptions();\n this.metadataSnapshotter = new BoundedMetadataSnapshotter(\n options.metadataSnapshotLimits ?? DEFAULT_METADATA_SNAPSHOT_LIMITS,\n );\n }\n\n admit(event: WoodRendererTraceInput): WoodTraceBatchAdmissionResult {\n const sequence = this.nextSequence;\n this.nextSequence += 1;\n if (this.state !== 'accepting') {\n this.droppedClosed += 1;\n return { kind: 'dropped', sequence, reason: 'closed' };\n }\n\n const retainedEvents = this.queue.length + (this.inFlight?.batch.events.length ?? 0);\n if (retainedEvents >= this.options.maxQueuedEvents) {\n this.droppedCapacity += 1;\n return { kind: 'dropped', sequence, reason: 'capacity' };\n }\n\n this.queue.push(Object.freeze({ sequence, event: this.snapshotEvent(event, sequence) }));\n this.scheduleDrain();\n return { kind: 'admitted', sequence };\n }\n\n attachPort(port: WoodTraceBatchPort): void {\n this.detachPort();\n this.port = port;\n this.unsubscribePort = port.subscribe((message) => this.handleAcknowledgement(message));\n if (this.inFlight) {\n this.inFlight.awaitingAcknowledgement = false;\n this.inFlight.retryReady = true;\n this.inFlight.retryGeneration += 1;\n }\n this.scheduleDrain();\n }\n\n status(): WoodTraceBatchTransportStatus {\n return Object.freeze({\n state: this.state,\n producerId: this.options.producerId,\n nextSequence: this.nextSequence,\n queuedEvents: this.queue.length,\n inFlightBatchId: this.inFlight?.batch.batchId ?? null,\n droppedCapacity: this.droppedCapacity,\n droppedClosed: this.droppedClosed,\n droppedRejected: this.droppedRejected,\n droppedRetryExhausted: this.droppedRetryExhausted,\n metadataTruncatedValues: this.metadataTruncatedValues,\n metadataRedactedValues: this.metadataRedactedValues,\n metadataSerializationFailures: this.metadataSerializationFailures,\n committedBatches: this.committedBatches,\n retryAttempts: this.retryAttempts,\n });\n }\n\n async flush(deadlineMs: number): Promise<void> {\n this.scheduleDrain();\n while (this.hasPendingEvents() && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n this.scheduleDrain();\n }\n }\n\n async close(deadlineMs: number): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n this.state = 'draining';\n await this.flush(deadlineMs);\n const abandonedEvents = this.queue.length + (this.inFlight?.batch.events.length ?? 0);\n this.droppedClosed += abandonedEvents;\n this.queue.length = 0;\n this.inFlight = null;\n this.detachPort();\n this.state = 'stopped';\n }\n\n private abandonRetryExhausted(): void {\n if (!this.inFlight) {\n return;\n }\n this.droppedRetryExhausted += this.inFlight.batch.events.length;\n this.inFlight = null;\n this.scheduleDrain();\n }\n\n private createInFlightBatch(): void {\n if (this.inFlight || this.queue.length === 0 || !this.port) {\n return;\n }\n const entries = this.queue.splice(0, this.options.maxBatchEvents);\n const first = entries[0];\n if (!first) {\n return;\n }\n this.inFlight = {\n batch: this.contract.create(\n this.options.producerId,\n first.sequence,\n entries.map((entry) => entry.event),\n ),\n attempts: 0,\n awaitingAcknowledgement: false,\n retryReady: true,\n retryGeneration: 0,\n };\n }\n\n private detachPort(): void {\n this.unsubscribePort?.();\n this.unsubscribePort = null;\n this.port?.close();\n this.port = null;\n }\n\n private drain(): void {\n this.createInFlightBatch();\n this.sendInFlightBatch();\n }\n\n private handleAcknowledgement(message: unknown): void {\n const parsed = this.contract.parseAcknowledgement(message);\n if (!parsed.ok || !this.inFlight) {\n return;\n }\n const acknowledgement = parsed.acknowledgement;\n if (acknowledgement.batchId !== this.inFlight.batch.batchId) {\n return;\n }\n\n this.inFlight.retryGeneration += 1;\n this.inFlight.awaitingAcknowledgement = false;\n if (acknowledgement.kind === 'committed') {\n if (acknowledgement.acceptedEvents !== this.inFlight.batch.events.length) {\n this.scheduleRetry(0);\n return;\n }\n this.committedBatches += 1;\n this.inFlight = null;\n this.scheduleDrain();\n return;\n }\n if (acknowledgement.kind === 'rejected') {\n this.droppedRejected += this.inFlight.batch.events.length;\n this.inFlight = null;\n this.scheduleDrain();\n return;\n }\n this.scheduleRetry(acknowledgement.retryAfterMs);\n }\n\n private handleAcknowledgementTimeout(batchId: string, attempt: number): void {\n if (!this.inFlight\n || this.inFlight.batch.batchId !== batchId\n || this.inFlight.attempts !== attempt\n || !this.inFlight.awaitingAcknowledgement) {\n return;\n }\n this.inFlight.awaitingAcknowledgement = false;\n this.scheduleRetry(this.retryDelay(attempt));\n }\n\n private hasPendingEvents(): boolean {\n return this.queue.length > 0 || this.inFlight !== null;\n }\n\n private retryDelay(attempt: number): number {\n return this.options.retryBaseDelayMs * (2 ** Math.max(0, attempt - 1));\n }\n\n private scheduleDrain(): void {\n if (this.drainScheduled) {\n return;\n }\n this.drainScheduled = true;\n this.options.schedule(() => {\n this.drainScheduled = false;\n this.drain();\n });\n }\n\n private scheduleRetry(requestedDelayMs: number): void {\n if (!this.inFlight) {\n return;\n }\n if (this.inFlight.attempts > this.options.retryLimit) {\n this.abandonRetryExhausted();\n return;\n }\n\n this.inFlight.retryReady = false;\n const generation = this.inFlight.retryGeneration + 1;\n this.inFlight.retryGeneration = generation;\n const delayMs = Math.max(requestedDelayMs, this.retryDelay(this.inFlight.attempts));\n void this.options.delay(delayMs).then(() => {\n if (!this.inFlight || this.inFlight.retryGeneration !== generation) {\n return;\n }\n this.inFlight.retryReady = true;\n this.scheduleDrain();\n });\n }\n\n private sendInFlightBatch(): void {\n const current = this.inFlight;\n const port = this.port;\n if (!current || !port || current.awaitingAcknowledgement || !current.retryReady) {\n return;\n }\n if (current.attempts > this.options.retryLimit) {\n this.abandonRetryExhausted();\n return;\n }\n\n current.attempts += 1;\n if (current.attempts > 1) {\n this.retryAttempts += 1;\n }\n current.awaitingAcknowledgement = true;\n current.retryReady = false;\n const attempt = current.attempts;\n try {\n port.postMessage(current.batch);\n } catch {\n current.awaitingAcknowledgement = false;\n this.detachPort();\n return;\n }\n\n void this.options.delay(this.options.acknowledgementTimeoutMs).then(() => {\n this.handleAcknowledgementTimeout(current.batch.batchId, attempt);\n });\n }\n\n private snapshotEvent(\n event: WoodRendererTraceInput,\n sequence: number,\n ): WoodRendererTraceEvent {\n const snapshot = this.metadataSnapshotter.snapshot(event);\n this.metadataTruncatedValues += snapshot.stats.truncatedValues;\n this.metadataRedactedValues += snapshot.stats.redactedValues;\n this.metadataSerializationFailures += snapshot.stats.serializationFailures;\n const input = snapshot.metadata;\n const occurredAt = new Date(this.options.now());\n const timestamp = Number.isNaN(occurredAt.getTime())\n ? new Date(0).toISOString()\n : occurredAt.toISOString();\n return Object.freeze({\n source: this.snapshotString(input.source, 'unknown'),\n type: this.snapshotString(input.type, 'unknown'),\n level: this.snapshotString(input.level, 'info'),\n process: 'renderer',\n timestamp,\n traceSeq: sequence + 1,\n ...this.snapshotOptionalString('message', input.message),\n ...this.snapshotConversationId(input.conversationId),\n ...this.snapshotPayload(input.payload),\n ...this.snapshotOptionalString('windowId', input.windowId),\n ...this.snapshotOptionalNumber('webContentsId', input.webContentsId),\n ...this.snapshotOptionalString('routeKey', input.routeKey),\n ...this.snapshotOptionalString('harnessId', input.harnessId),\n });\n }\n\n private snapshotConversationId(\n value: TelemetryJsonValue | undefined,\n ): Pick<WoodRendererTraceEvent, 'conversationId'> | Record<string, never> {\n return typeof value === 'string' || typeof value === 'number'\n ? { conversationId: value }\n : {};\n }\n\n private snapshotOptionalNumber<Key extends 'webContentsId'>(\n key: Key,\n value: TelemetryJsonValue | undefined,\n ): Partial<Pick<WoodRendererTraceEvent, Key>> {\n return typeof value === 'number' && Number.isFinite(value)\n ? { [key]: value } as Pick<WoodRendererTraceEvent, Key>\n : {};\n }\n\n private snapshotOptionalString<Key extends 'message' | 'windowId' | 'routeKey' | 'harnessId'>(\n key: Key,\n value: TelemetryJsonValue | undefined,\n ): Partial<Pick<WoodRendererTraceEvent, Key>> {\n return typeof value === 'string'\n ? { [key]: value } as Pick<WoodRendererTraceEvent, Key>\n : {};\n }\n\n private snapshotPayload(\n value: TelemetryJsonValue | undefined,\n ): Pick<WoodRendererTraceEvent, 'payload'> | Record<string, never> {\n if (value === undefined) {\n return {};\n }\n const payload: TelemetryJsonObject = this.isJsonObject(value)\n ? value\n : Object.freeze({ __telemetry: value });\n return { payload };\n }\n\n private snapshotString(value: TelemetryJsonValue | undefined, fallback: string): string {\n return typeof value === 'string' && value.trim().length > 0 ? value : fallback;\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private validateOptions(): void {\n const validCapacity = Number.isSafeInteger(this.options.maxQueuedEvents)\n && this.options.maxQueuedEvents > 0\n && Number.isSafeInteger(this.options.maxBatchEvents)\n && this.options.maxBatchEvents > 0\n && this.options.maxBatchEvents <= this.options.maxQueuedEvents;\n const validRetry = Number.isSafeInteger(this.options.retryLimit)\n && this.options.retryLimit >= 0\n && Number.isFinite(this.options.retryBaseDelayMs)\n && this.options.retryBaseDelayMs >= 0\n && Number.isFinite(this.options.acknowledgementTimeoutMs)\n && this.options.acknowledgementTimeoutMs > 0;\n if (!this.options.producerId.trim() || !validCapacity || !validRetry) {\n throw new Error('Renderer trace batch transport options are invalid');\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tracing/renderer_trace_batch_transport.ts"],"sourcesContent":["import {\n BoundedMetadataSnapshotter,\n DEFAULT_METADATA_SNAPSHOT_LIMITS,\n type TelemetryJsonObject,\n type TelemetryJsonValue,\n} from '@noego/telemetry/core';\nimport { WoodTraceBatchContract } from './wood_trace_batch_contract.js';\nimport type {\n WoodRendererTraceEvent,\n WoodRendererTraceInput,\n WoodTraceBatch,\n WoodTraceBatchAdmissionResult,\n WoodTraceBatchPort,\n WoodTraceBatchTransportOptions,\n WoodTraceBatchTransportStatus,\n} from './types/wood_trace_batch.types.js';\n\ntype QueuedTraceEvent = Readonly<{\n sequence: number;\n event: WoodRendererTraceEvent;\n}>;\n\ntype InFlightTraceBatch = {\n batch: WoodTraceBatch;\n attempts: number;\n awaitingAcknowledgement: boolean;\n retryReady: boolean;\n retryGeneration: number;\n};\n\nexport class RendererTraceBatchTransport {\n private readonly contract = new WoodTraceBatchContract();\n private readonly metadataSnapshotter: BoundedMetadataSnapshotter;\n private readonly queue: QueuedTraceEvent[] = [];\n private state: 'accepting' | 'draining' | 'stopped' = 'accepting';\n private port: WoodTraceBatchPort | null = null;\n private unsubscribePort: (() => void) | null = null;\n private inFlight: InFlightTraceBatch | null = null;\n private nextSequence = 0;\n private drainScheduled = false;\n private droppedCapacity = 0;\n private droppedClosed = 0;\n private droppedRejected = 0;\n private droppedRetryExhausted = 0;\n private identityRestamped = 0;\n private committedBatches = 0;\n private retryAttempts = 0;\n private metadataTruncatedValues = 0;\n private metadataRedactedValues = 0;\n private metadataSerializationFailures = 0;\n\n constructor(private readonly options: WoodTraceBatchTransportOptions) {\n this.validateOptions();\n this.metadataSnapshotter = new BoundedMetadataSnapshotter(\n options.metadataSnapshotLimits ?? DEFAULT_METADATA_SNAPSHOT_LIMITS,\n );\n }\n\n admit(event: WoodRendererTraceInput): WoodTraceBatchAdmissionResult {\n const identity = this.resolveIdentity(event);\n const sequence = identity.sequence;\n if (this.state !== 'accepting') {\n this.droppedClosed += 1;\n return { kind: 'dropped', sequence, reason: 'closed' };\n }\n\n const retainedEvents = this.queue.length + (this.inFlight?.batch.events.length ?? 0);\n if (retainedEvents >= this.options.maxQueuedEvents) {\n this.droppedCapacity += 1;\n return { kind: 'dropped', sequence, reason: 'capacity' };\n }\n\n this.queue.push(Object.freeze({ sequence, event: this.snapshotEvent(event, sequence, identity) }));\n this.scheduleDrain();\n return { kind: 'admitted', sequence };\n }\n\n /**\n * Resolves the queue sequence and preserved identity for an incoming event,\n * reading identity fields from the raw input BEFORE metadata snapshotting so\n * truncation/redaction can never alter identity.\n *\n * A hub-admitted event (valid timestamp + traceSeq) keeps its identity and\n * its queue sequence is derived as traceSeq - 1 so the batch sequence range\n * stays aligned with hub identity. A stamped event whose traceSeq regresses\n * against the already-assigned sequence stream is restamped as legacy (its\n * occurrence timestamp is still preserved, its producerId is dropped so a\n * reassigned sequence cannot masquerade under the durable identity key) and\n * counted in identityRestamped. Legacy events without identity are stamped\n * exactly as before.\n */\n private resolveIdentity(event: WoodRendererTraceInput): {\n sequence: number;\n timestamp?: string;\n producerId?: string;\n } {\n const rawTimestamp = typeof event.timestamp === 'string'\n && Number.isFinite(Date.parse(event.timestamp))\n ? event.timestamp\n : undefined;\n const rawSeq = typeof event.traceSeq === 'number'\n && Number.isSafeInteger(event.traceSeq)\n && event.traceSeq >= 1\n ? event.traceSeq\n : undefined;\n const producerId = typeof event.producerId === 'string' && event.producerId.trim().length > 0\n ? event.producerId\n : undefined;\n\n if (rawTimestamp !== undefined && rawSeq !== undefined && rawSeq - 1 >= this.nextSequence) {\n this.nextSequence = rawSeq;\n return {\n sequence: rawSeq - 1,\n timestamp: rawTimestamp,\n ...(producerId !== undefined ? { producerId } : {}),\n };\n }\n\n if (rawTimestamp !== undefined && rawSeq !== undefined) {\n // Stamped but non-monotonic against this transport's sequence stream:\n // protocol survival wins, durable sequence identity is sacrificed loudly.\n this.identityRestamped += 1;\n }\n\n const sequence = this.nextSequence;\n this.nextSequence += 1;\n return {\n sequence,\n ...(rawTimestamp !== undefined ? { timestamp: rawTimestamp } : {}),\n };\n }\n\n attachPort(port: WoodTraceBatchPort): void {\n this.detachPort();\n this.port = port;\n this.unsubscribePort = port.subscribe((message) => this.handleAcknowledgement(message));\n if (this.inFlight) {\n this.inFlight.awaitingAcknowledgement = false;\n this.inFlight.retryReady = true;\n this.inFlight.retryGeneration += 1;\n }\n this.scheduleDrain();\n }\n\n status(): WoodTraceBatchTransportStatus {\n return Object.freeze({\n state: this.state,\n producerId: this.options.producerId,\n nextSequence: this.nextSequence,\n queuedEvents: this.queue.length,\n inFlightBatchId: this.inFlight?.batch.batchId ?? null,\n droppedCapacity: this.droppedCapacity,\n droppedClosed: this.droppedClosed,\n droppedRejected: this.droppedRejected,\n droppedRetryExhausted: this.droppedRetryExhausted,\n identityRestamped: this.identityRestamped,\n metadataTruncatedValues: this.metadataTruncatedValues,\n metadataRedactedValues: this.metadataRedactedValues,\n metadataSerializationFailures: this.metadataSerializationFailures,\n committedBatches: this.committedBatches,\n retryAttempts: this.retryAttempts,\n });\n }\n\n async flush(deadlineMs: number): Promise<void> {\n this.scheduleDrain();\n while (this.hasPendingEvents() && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n this.scheduleDrain();\n }\n }\n\n async close(deadlineMs: number): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n this.state = 'draining';\n await this.flush(deadlineMs);\n const abandonedEvents = this.queue.length + (this.inFlight?.batch.events.length ?? 0);\n this.droppedClosed += abandonedEvents;\n this.queue.length = 0;\n this.inFlight = null;\n this.detachPort();\n this.state = 'stopped';\n }\n\n private abandonRetryExhausted(): void {\n if (!this.inFlight) {\n return;\n }\n this.droppedRetryExhausted += this.inFlight.batch.events.length;\n this.inFlight = null;\n this.scheduleDrain();\n }\n\n private createInFlightBatch(): void {\n if (this.inFlight || this.queue.length === 0 || !this.port) {\n return;\n }\n const entries = this.queue.splice(0, this.options.maxBatchEvents);\n const first = entries[0];\n if (!first) {\n return;\n }\n this.inFlight = {\n batch: this.contract.create(\n this.options.producerId,\n first.sequence,\n entries.map((entry) => entry.event),\n ),\n attempts: 0,\n awaitingAcknowledgement: false,\n retryReady: true,\n retryGeneration: 0,\n };\n }\n\n private detachPort(): void {\n this.unsubscribePort?.();\n this.unsubscribePort = null;\n this.port?.close();\n this.port = null;\n }\n\n private drain(): void {\n this.createInFlightBatch();\n this.sendInFlightBatch();\n }\n\n private handleAcknowledgement(message: unknown): void {\n const parsed = this.contract.parseAcknowledgement(message);\n if (!parsed.ok || !this.inFlight) {\n return;\n }\n const acknowledgement = parsed.acknowledgement;\n if (acknowledgement.batchId !== this.inFlight.batch.batchId) {\n return;\n }\n\n this.inFlight.retryGeneration += 1;\n this.inFlight.awaitingAcknowledgement = false;\n if (acknowledgement.kind === 'committed') {\n if (acknowledgement.acceptedEvents !== this.inFlight.batch.events.length) {\n this.scheduleRetry(0);\n return;\n }\n this.committedBatches += 1;\n this.inFlight = null;\n this.scheduleDrain();\n return;\n }\n if (acknowledgement.kind === 'rejected') {\n this.droppedRejected += this.inFlight.batch.events.length;\n this.inFlight = null;\n this.scheduleDrain();\n return;\n }\n this.scheduleRetry(acknowledgement.retryAfterMs);\n }\n\n private handleAcknowledgementTimeout(batchId: string, attempt: number): void {\n if (!this.inFlight\n || this.inFlight.batch.batchId !== batchId\n || this.inFlight.attempts !== attempt\n || !this.inFlight.awaitingAcknowledgement) {\n return;\n }\n this.inFlight.awaitingAcknowledgement = false;\n this.scheduleRetry(this.retryDelay(attempt));\n }\n\n private hasPendingEvents(): boolean {\n return this.queue.length > 0 || this.inFlight !== null;\n }\n\n private retryDelay(attempt: number): number {\n return this.options.retryBaseDelayMs * (2 ** Math.max(0, attempt - 1));\n }\n\n private scheduleDrain(): void {\n if (this.drainScheduled) {\n return;\n }\n this.drainScheduled = true;\n this.options.schedule(() => {\n this.drainScheduled = false;\n this.drain();\n });\n }\n\n private scheduleRetry(requestedDelayMs: number): void {\n if (!this.inFlight) {\n return;\n }\n if (this.inFlight.attempts > this.options.retryLimit) {\n this.abandonRetryExhausted();\n return;\n }\n\n this.inFlight.retryReady = false;\n const generation = this.inFlight.retryGeneration + 1;\n this.inFlight.retryGeneration = generation;\n const delayMs = Math.max(requestedDelayMs, this.retryDelay(this.inFlight.attempts));\n void this.options.delay(delayMs).then(() => {\n if (!this.inFlight || this.inFlight.retryGeneration !== generation) {\n return;\n }\n this.inFlight.retryReady = true;\n this.scheduleDrain();\n });\n }\n\n private sendInFlightBatch(): void {\n const current = this.inFlight;\n const port = this.port;\n if (!current || !port || current.awaitingAcknowledgement || !current.retryReady) {\n return;\n }\n if (current.attempts > this.options.retryLimit) {\n this.abandonRetryExhausted();\n return;\n }\n\n current.attempts += 1;\n if (current.attempts > 1) {\n this.retryAttempts += 1;\n }\n current.awaitingAcknowledgement = true;\n current.retryReady = false;\n const attempt = current.attempts;\n try {\n port.postMessage(current.batch);\n } catch {\n current.awaitingAcknowledgement = false;\n this.detachPort();\n return;\n }\n\n void this.options.delay(this.options.acknowledgementTimeoutMs).then(() => {\n this.handleAcknowledgementTimeout(current.batch.batchId, attempt);\n });\n }\n\n private snapshotEvent(\n event: WoodRendererTraceInput,\n sequence: number,\n identity: { timestamp?: string; producerId?: string },\n ): WoodRendererTraceEvent {\n const snapshot = this.metadataSnapshotter.snapshot(event);\n this.metadataTruncatedValues += snapshot.stats.truncatedValues;\n this.metadataRedactedValues += snapshot.stats.redactedValues;\n this.metadataSerializationFailures += snapshot.stats.serializationFailures;\n const input = snapshot.metadata;\n // A hub-preserved occurrence timestamp is authoritative; only legacy\n // unstamped events receive a transport-stamped time.\n let timestamp = identity.timestamp;\n if (timestamp === undefined) {\n const occurredAt = new Date(this.options.now());\n timestamp = Number.isNaN(occurredAt.getTime())\n ? new Date(0).toISOString()\n : occurredAt.toISOString();\n }\n return Object.freeze({\n source: this.snapshotString(input.source, 'unknown'),\n type: this.snapshotString(input.type, 'unknown'),\n level: this.snapshotString(input.level, 'info'),\n process: 'renderer',\n timestamp,\n traceSeq: sequence + 1,\n ...(identity.producerId !== undefined ? { producerId: identity.producerId } : {}),\n ...this.snapshotOptionalString('message', input.message),\n ...this.snapshotConversationId(input.conversationId),\n ...this.snapshotPayload(input.payload),\n ...this.snapshotOptionalString('windowId', input.windowId),\n ...this.snapshotOptionalNumber('webContentsId', input.webContentsId),\n ...this.snapshotOptionalString('routeKey', input.routeKey),\n ...this.snapshotOptionalString('harnessId', input.harnessId),\n });\n }\n\n private snapshotConversationId(\n value: TelemetryJsonValue | undefined,\n ): Pick<WoodRendererTraceEvent, 'conversationId'> | Record<string, never> {\n return typeof value === 'string' || typeof value === 'number'\n ? { conversationId: value }\n : {};\n }\n\n private snapshotOptionalNumber<Key extends 'webContentsId'>(\n key: Key,\n value: TelemetryJsonValue | undefined,\n ): Partial<Pick<WoodRendererTraceEvent, Key>> {\n return typeof value === 'number' && Number.isFinite(value)\n ? { [key]: value } as Pick<WoodRendererTraceEvent, Key>\n : {};\n }\n\n private snapshotOptionalString<Key extends 'message' | 'windowId' | 'routeKey' | 'harnessId'>(\n key: Key,\n value: TelemetryJsonValue | undefined,\n ): Partial<Pick<WoodRendererTraceEvent, Key>> {\n return typeof value === 'string'\n ? { [key]: value } as Pick<WoodRendererTraceEvent, Key>\n : {};\n }\n\n private snapshotPayload(\n value: TelemetryJsonValue | undefined,\n ): Pick<WoodRendererTraceEvent, 'payload'> | Record<string, never> {\n if (value === undefined) {\n return {};\n }\n const payload: TelemetryJsonObject = this.isJsonObject(value)\n ? value\n : Object.freeze({ __telemetry: value });\n return { payload };\n }\n\n private snapshotString(value: TelemetryJsonValue | undefined, fallback: string): string {\n return typeof value === 'string' && value.trim().length > 0 ? value : fallback;\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private validateOptions(): void {\n const validCapacity = Number.isSafeInteger(this.options.maxQueuedEvents)\n && this.options.maxQueuedEvents > 0\n && Number.isSafeInteger(this.options.maxBatchEvents)\n && this.options.maxBatchEvents > 0\n && this.options.maxBatchEvents <= this.options.maxQueuedEvents;\n const validRetry = Number.isSafeInteger(this.options.retryLimit)\n && this.options.retryLimit >= 0\n && Number.isFinite(this.options.retryBaseDelayMs)\n && this.options.retryBaseDelayMs >= 0\n && Number.isFinite(this.options.acknowledgementTimeoutMs)\n && this.options.acknowledgementTimeoutMs > 0;\n if (!this.options.producerId.trim() || !validCapacity || !validRetry) {\n throw new Error('Renderer trace batch transport options are invalid');\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WoodTraceBatchTransportOptions, WoodRendererTraceInput, WoodTraceBatchAdmissionResult, WoodTraceBatchPort, WoodTraceBatchTransportStatus } from './types/wood_trace_batch.types.cjs';
|
|
2
2
|
import '@noego/telemetry/core';
|
|
3
|
-
import '../trace_hub-
|
|
3
|
+
import '../trace_hub-Cpo_nVze.cjs';
|
|
4
4
|
import 'rxjs';
|
|
5
5
|
|
|
6
6
|
declare class RendererTraceBatchTransport {
|
|
@@ -18,6 +18,7 @@ declare class RendererTraceBatchTransport {
|
|
|
18
18
|
private droppedClosed;
|
|
19
19
|
private droppedRejected;
|
|
20
20
|
private droppedRetryExhausted;
|
|
21
|
+
private identityRestamped;
|
|
21
22
|
private committedBatches;
|
|
22
23
|
private retryAttempts;
|
|
23
24
|
private metadataTruncatedValues;
|
|
@@ -25,6 +26,21 @@ declare class RendererTraceBatchTransport {
|
|
|
25
26
|
private metadataSerializationFailures;
|
|
26
27
|
constructor(options: WoodTraceBatchTransportOptions);
|
|
27
28
|
admit(event: WoodRendererTraceInput): WoodTraceBatchAdmissionResult;
|
|
29
|
+
/**
|
|
30
|
+
* Resolves the queue sequence and preserved identity for an incoming event,
|
|
31
|
+
* reading identity fields from the raw input BEFORE metadata snapshotting so
|
|
32
|
+
* truncation/redaction can never alter identity.
|
|
33
|
+
*
|
|
34
|
+
* A hub-admitted event (valid timestamp + traceSeq) keeps its identity and
|
|
35
|
+
* its queue sequence is derived as traceSeq - 1 so the batch sequence range
|
|
36
|
+
* stays aligned with hub identity. A stamped event whose traceSeq regresses
|
|
37
|
+
* against the already-assigned sequence stream is restamped as legacy (its
|
|
38
|
+
* occurrence timestamp is still preserved, its producerId is dropped so a
|
|
39
|
+
* reassigned sequence cannot masquerade under the durable identity key) and
|
|
40
|
+
* counted in identityRestamped. Legacy events without identity are stamped
|
|
41
|
+
* exactly as before.
|
|
42
|
+
*/
|
|
43
|
+
private resolveIdentity;
|
|
28
44
|
attachPort(port: WoodTraceBatchPort): void;
|
|
29
45
|
status(): WoodTraceBatchTransportStatus;
|
|
30
46
|
flush(deadlineMs: number): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WoodTraceBatchTransportOptions, WoodRendererTraceInput, WoodTraceBatchAdmissionResult, WoodTraceBatchPort, WoodTraceBatchTransportStatus } from './types/wood_trace_batch.types.js';
|
|
2
2
|
import '@noego/telemetry/core';
|
|
3
|
-
import '../trace_hub-
|
|
3
|
+
import '../trace_hub-Cpo_nVze.js';
|
|
4
4
|
import 'rxjs';
|
|
5
5
|
|
|
6
6
|
declare class RendererTraceBatchTransport {
|
|
@@ -18,6 +18,7 @@ declare class RendererTraceBatchTransport {
|
|
|
18
18
|
private droppedClosed;
|
|
19
19
|
private droppedRejected;
|
|
20
20
|
private droppedRetryExhausted;
|
|
21
|
+
private identityRestamped;
|
|
21
22
|
private committedBatches;
|
|
22
23
|
private retryAttempts;
|
|
23
24
|
private metadataTruncatedValues;
|
|
@@ -25,6 +26,21 @@ declare class RendererTraceBatchTransport {
|
|
|
25
26
|
private metadataSerializationFailures;
|
|
26
27
|
constructor(options: WoodTraceBatchTransportOptions);
|
|
27
28
|
admit(event: WoodRendererTraceInput): WoodTraceBatchAdmissionResult;
|
|
29
|
+
/**
|
|
30
|
+
* Resolves the queue sequence and preserved identity for an incoming event,
|
|
31
|
+
* reading identity fields from the raw input BEFORE metadata snapshotting so
|
|
32
|
+
* truncation/redaction can never alter identity.
|
|
33
|
+
*
|
|
34
|
+
* A hub-admitted event (valid timestamp + traceSeq) keeps its identity and
|
|
35
|
+
* its queue sequence is derived as traceSeq - 1 so the batch sequence range
|
|
36
|
+
* stays aligned with hub identity. A stamped event whose traceSeq regresses
|
|
37
|
+
* against the already-assigned sequence stream is restamped as legacy (its
|
|
38
|
+
* occurrence timestamp is still preserved, its producerId is dropped so a
|
|
39
|
+
* reassigned sequence cannot masquerade under the durable identity key) and
|
|
40
|
+
* counted in identityRestamped. Legacy events without identity are stamped
|
|
41
|
+
* exactly as before.
|
|
42
|
+
*/
|
|
43
|
+
private resolveIdentity;
|
|
28
44
|
attachPort(port: WoodTraceBatchPort): void;
|
|
29
45
|
status(): WoodTraceBatchTransportStatus;
|
|
30
46
|
flush(deadlineMs: number): Promise<void>;
|
|
@@ -18,6 +18,7 @@ class RendererTraceBatchTransport {
|
|
|
18
18
|
this.droppedClosed = 0;
|
|
19
19
|
this.droppedRejected = 0;
|
|
20
20
|
this.droppedRetryExhausted = 0;
|
|
21
|
+
this.identityRestamped = 0;
|
|
21
22
|
this.committedBatches = 0;
|
|
22
23
|
this.retryAttempts = 0;
|
|
23
24
|
this.metadataTruncatedValues = 0;
|
|
@@ -29,8 +30,8 @@ class RendererTraceBatchTransport {
|
|
|
29
30
|
);
|
|
30
31
|
}
|
|
31
32
|
admit(event) {
|
|
32
|
-
const
|
|
33
|
-
|
|
33
|
+
const identity = this.resolveIdentity(event);
|
|
34
|
+
const sequence = identity.sequence;
|
|
34
35
|
if (this.state !== "accepting") {
|
|
35
36
|
this.droppedClosed += 1;
|
|
36
37
|
return { kind: "dropped", sequence, reason: "closed" };
|
|
@@ -40,10 +41,46 @@ class RendererTraceBatchTransport {
|
|
|
40
41
|
this.droppedCapacity += 1;
|
|
41
42
|
return { kind: "dropped", sequence, reason: "capacity" };
|
|
42
43
|
}
|
|
43
|
-
this.queue.push(Object.freeze({ sequence, event: this.snapshotEvent(event, sequence) }));
|
|
44
|
+
this.queue.push(Object.freeze({ sequence, event: this.snapshotEvent(event, sequence, identity) }));
|
|
44
45
|
this.scheduleDrain();
|
|
45
46
|
return { kind: "admitted", sequence };
|
|
46
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolves the queue sequence and preserved identity for an incoming event,
|
|
50
|
+
* reading identity fields from the raw input BEFORE metadata snapshotting so
|
|
51
|
+
* truncation/redaction can never alter identity.
|
|
52
|
+
*
|
|
53
|
+
* A hub-admitted event (valid timestamp + traceSeq) keeps its identity and
|
|
54
|
+
* its queue sequence is derived as traceSeq - 1 so the batch sequence range
|
|
55
|
+
* stays aligned with hub identity. A stamped event whose traceSeq regresses
|
|
56
|
+
* against the already-assigned sequence stream is restamped as legacy (its
|
|
57
|
+
* occurrence timestamp is still preserved, its producerId is dropped so a
|
|
58
|
+
* reassigned sequence cannot masquerade under the durable identity key) and
|
|
59
|
+
* counted in identityRestamped. Legacy events without identity are stamped
|
|
60
|
+
* exactly as before.
|
|
61
|
+
*/
|
|
62
|
+
resolveIdentity(event) {
|
|
63
|
+
const rawTimestamp = typeof event.timestamp === "string" && Number.isFinite(Date.parse(event.timestamp)) ? event.timestamp : void 0;
|
|
64
|
+
const rawSeq = typeof event.traceSeq === "number" && Number.isSafeInteger(event.traceSeq) && event.traceSeq >= 1 ? event.traceSeq : void 0;
|
|
65
|
+
const producerId = typeof event.producerId === "string" && event.producerId.trim().length > 0 ? event.producerId : void 0;
|
|
66
|
+
if (rawTimestamp !== void 0 && rawSeq !== void 0 && rawSeq - 1 >= this.nextSequence) {
|
|
67
|
+
this.nextSequence = rawSeq;
|
|
68
|
+
return {
|
|
69
|
+
sequence: rawSeq - 1,
|
|
70
|
+
timestamp: rawTimestamp,
|
|
71
|
+
...producerId !== void 0 ? { producerId } : {}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (rawTimestamp !== void 0 && rawSeq !== void 0) {
|
|
75
|
+
this.identityRestamped += 1;
|
|
76
|
+
}
|
|
77
|
+
const sequence = this.nextSequence;
|
|
78
|
+
this.nextSequence += 1;
|
|
79
|
+
return {
|
|
80
|
+
sequence,
|
|
81
|
+
...rawTimestamp !== void 0 ? { timestamp: rawTimestamp } : {}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
47
84
|
attachPort(port) {
|
|
48
85
|
this.detachPort();
|
|
49
86
|
this.port = port;
|
|
@@ -66,6 +103,7 @@ class RendererTraceBatchTransport {
|
|
|
66
103
|
droppedClosed: this.droppedClosed,
|
|
67
104
|
droppedRejected: this.droppedRejected,
|
|
68
105
|
droppedRetryExhausted: this.droppedRetryExhausted,
|
|
106
|
+
identityRestamped: this.identityRestamped,
|
|
69
107
|
metadataTruncatedValues: this.metadataTruncatedValues,
|
|
70
108
|
metadataRedactedValues: this.metadataRedactedValues,
|
|
71
109
|
metadataSerializationFailures: this.metadataSerializationFailures,
|
|
@@ -232,14 +270,17 @@ class RendererTraceBatchTransport {
|
|
|
232
270
|
this.handleAcknowledgementTimeout(current.batch.batchId, attempt);
|
|
233
271
|
});
|
|
234
272
|
}
|
|
235
|
-
snapshotEvent(event, sequence) {
|
|
273
|
+
snapshotEvent(event, sequence, identity) {
|
|
236
274
|
const snapshot = this.metadataSnapshotter.snapshot(event);
|
|
237
275
|
this.metadataTruncatedValues += snapshot.stats.truncatedValues;
|
|
238
276
|
this.metadataRedactedValues += snapshot.stats.redactedValues;
|
|
239
277
|
this.metadataSerializationFailures += snapshot.stats.serializationFailures;
|
|
240
278
|
const input = snapshot.metadata;
|
|
241
|
-
|
|
242
|
-
|
|
279
|
+
let timestamp = identity.timestamp;
|
|
280
|
+
if (timestamp === void 0) {
|
|
281
|
+
const occurredAt = new Date(this.options.now());
|
|
282
|
+
timestamp = Number.isNaN(occurredAt.getTime()) ? (/* @__PURE__ */ new Date(0)).toISOString() : occurredAt.toISOString();
|
|
283
|
+
}
|
|
243
284
|
return Object.freeze({
|
|
244
285
|
source: this.snapshotString(input.source, "unknown"),
|
|
245
286
|
type: this.snapshotString(input.type, "unknown"),
|
|
@@ -247,6 +288,7 @@ class RendererTraceBatchTransport {
|
|
|
247
288
|
process: "renderer",
|
|
248
289
|
timestamp,
|
|
249
290
|
traceSeq: sequence + 1,
|
|
291
|
+
...identity.producerId !== void 0 ? { producerId: identity.producerId } : {},
|
|
250
292
|
...this.snapshotOptionalString("message", input.message),
|
|
251
293
|
...this.snapshotConversationId(input.conversationId),
|
|
252
294
|
...this.snapshotPayload(input.payload),
|