@noego/wood 0.4.9 → 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/bin/axe.js +313 -98
- package/dist/{loader/__fixtures__/layouts/app.load.cjs → automation/actions.cjs} +3 -13
- package/dist/automation/actions.cjs.map +1 -0
- package/dist/automation/actions.d.cts +57 -0
- package/dist/automation/actions.d.ts +57 -0
- package/dist/automation/actions.js +1 -0
- package/dist/automation/actions.js.map +1 -0
- package/dist/automation/actions_executor.cjs +101 -0
- package/dist/automation/actions_executor.cjs.map +1 -0
- package/dist/automation/actions_executor.d.cts +16 -0
- package/dist/automation/actions_executor.d.ts +16 -0
- package/dist/automation/actions_executor.js +76 -0
- package/dist/automation/actions_executor.js.map +1 -0
- package/dist/automation/connection.cjs +86 -0
- package/dist/automation/connection.cjs.map +1 -0
- package/dist/automation/connection.d.cts +18 -0
- package/dist/automation/connection.d.ts +18 -0
- package/dist/automation/connection.js +51 -0
- package/dist/automation/connection.js.map +1 -0
- package/dist/{middleware/__fixtures__/middleware/sequence.cjs → automation/errors.cjs} +25 -22
- package/dist/automation/errors.cjs.map +1 -0
- package/dist/automation/errors.d.cts +31 -0
- package/dist/automation/errors.d.ts +31 -0
- package/dist/automation/errors.js +24 -0
- package/dist/automation/errors.js.map +1 -0
- package/dist/automation/index.cjs +49 -0
- package/dist/automation/index.cjs.map +1 -0
- package/dist/automation/index.d.cts +16 -0
- package/dist/automation/index.d.ts +16 -0
- package/dist/automation/index.js +15 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/introspection_reader.cjs +75 -0
- package/dist/automation/introspection_reader.cjs.map +1 -0
- package/dist/automation/introspection_reader.d.cts +20 -0
- package/dist/automation/introspection_reader.d.ts +20 -0
- package/dist/automation/introspection_reader.js +48 -0
- package/dist/automation/introspection_reader.js.map +1 -0
- package/dist/automation/locator.cjs +102 -0
- package/dist/automation/locator.cjs.map +1 -0
- package/dist/automation/locator.d.cts +51 -0
- package/dist/automation/locator.d.ts +51 -0
- package/dist/automation/locator.js +75 -0
- package/dist/automation/locator.js.map +1 -0
- package/dist/{loader/__fixtures__/views/test/page.load.cjs → automation/observation.cjs} +3 -13
- package/dist/automation/observation.cjs.map +1 -0
- package/dist/automation/observation.d.cts +44 -0
- package/dist/automation/observation.d.ts +44 -0
- package/dist/automation/observation.js +1 -0
- package/dist/automation/observation.js.map +1 -0
- package/dist/{controller/__fixtures__/controllers/test.cjs → automation/receipts.cjs} +3 -15
- package/dist/automation/receipts.cjs.map +1 -0
- package/dist/automation/receipts.d.cts +27 -0
- package/dist/automation/receipts.d.ts +27 -0
- package/dist/automation/receipts.js +1 -0
- package/dist/automation/receipts.js.map +1 -0
- package/dist/automation/scenario.cjs +696 -0
- package/dist/automation/scenario.cjs.map +1 -0
- package/dist/automation/scenario.d.cts +89 -0
- package/dist/automation/scenario.d.ts +89 -0
- package/dist/automation/scenario.js +660 -0
- package/dist/automation/scenario.js.map +1 -0
- package/dist/automation/scrolling.cjs +17 -0
- package/dist/automation/scrolling.cjs.map +1 -0
- package/dist/automation/scrolling.d.cts +51 -0
- package/dist/automation/scrolling.d.ts +51 -0
- package/dist/automation/scrolling.js +1 -0
- package/dist/automation/scrolling.js.map +1 -0
- package/dist/automation/scrolling_executor.cjs +109 -0
- package/dist/automation/scrolling_executor.cjs.map +1 -0
- package/dist/automation/scrolling_executor.d.cts +13 -0
- package/dist/automation/scrolling_executor.d.ts +13 -0
- package/dist/automation/scrolling_executor.js +84 -0
- package/dist/automation/scrolling_executor.js.map +1 -0
- package/dist/automation/target_identity.cjs +17 -0
- package/dist/automation/target_identity.cjs.map +1 -0
- package/dist/automation/target_identity.d.cts +28 -0
- package/dist/automation/target_identity.d.ts +28 -0
- package/dist/automation/target_identity.js +1 -0
- package/dist/automation/target_identity.js.map +1 -0
- package/dist/automation/target_registry.cjs +148 -0
- package/dist/automation/target_registry.cjs.map +1 -0
- package/dist/automation/target_registry.d.cts +32 -0
- package/dist/automation/target_registry.d.ts +32 -0
- package/dist/automation/target_registry.js +122 -0
- package/dist/automation/target_registry.js.map +1 -0
- package/dist/automation/waits.cjs +17 -0
- package/dist/automation/waits.cjs.map +1 -0
- package/dist/automation/waits.d.cts +44 -0
- package/dist/automation/waits.d.ts +44 -0
- package/dist/automation/waits.js +1 -0
- package/dist/automation/waits.js.map +1 -0
- package/dist/automation/waits_executor.cjs +104 -0
- package/dist/automation/waits_executor.cjs.map +1 -0
- package/dist/automation/waits_executor.d.cts +14 -0
- package/dist/automation/waits_executor.d.ts +14 -0
- package/dist/automation/waits_executor.js +79 -0
- package/dist/automation/waits_executor.js.map +1 -0
- 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 +19 -3
- package/dist/client/index.d.ts +19 -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 +95 -44
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +95 -44
- 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 +11 -7
- package/dist/index.d.ts +11 -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/automation_introspection.cjs +110 -0
- package/dist/navigation/automation_introspection.cjs.map +1 -0
- package/dist/navigation/automation_introspection.d.cts +60 -0
- package/dist/navigation/automation_introspection.d.ts +60 -0
- package/dist/navigation/automation_introspection.js +85 -0
- package/dist/navigation/automation_introspection.js.map +1 -0
- package/dist/navigation/index.cjs +10 -2
- package/dist/navigation/index.cjs.map +1 -1
- package/dist/navigation/index.d.cts +27 -1
- package/dist/navigation/index.d.ts +27 -1
- package/dist/navigation/index.js +6 -1
- 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/automation_assertions.cjs +417 -0
- package/dist/testing/automation_assertions.cjs.map +1 -0
- package/dist/testing/automation_assertions.d.cts +44 -0
- package/dist/testing/automation_assertions.d.ts +44 -0
- package/dist/testing/automation_assertions.js +385 -0
- package/dist/testing/automation_assertions.js.map +1 -0
- package/dist/testing/browser.cjs +130 -57
- package/dist/testing/browser.cjs.map +1 -1
- package/dist/testing/browser.d.cts +10 -4
- package/dist/testing/browser.d.ts +10 -4
- package/dist/testing/browser.js +132 -53
- 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 +18 -2
- package/dist/testing/create_controller_harness.d.ts +18 -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/geometry.cjs +109 -0
- package/dist/testing/geometry.cjs.map +1 -0
- package/dist/testing/geometry.d.cts +45 -0
- package/dist/testing/geometry.d.ts +45 -0
- package/dist/testing/geometry.js +79 -0
- package/dist/testing/geometry.js.map +1 -0
- package/dist/testing/index.cjs +62 -2
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +23 -4
- package/dist/testing/index.d.ts +23 -4
- package/dist/testing/index.js +50 -2
- 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 +19 -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.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.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.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.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
|
@@ -21,6 +21,24 @@ function traceLevelOrder(level) {
|
|
|
21
21
|
let rendererMinLevel = "debug";
|
|
22
22
|
let rendererEnabled = false;
|
|
23
23
|
let customRendererTraceTransport = null;
|
|
24
|
+
let traceProducerId = null;
|
|
25
|
+
function randomIdSuffix() {
|
|
26
|
+
const c = globalThis.crypto;
|
|
27
|
+
if (c && typeof c.randomUUID === "function") {
|
|
28
|
+
return c.randomUUID();
|
|
29
|
+
}
|
|
30
|
+
return `${Date.now().toString(36)}-${Math.random().toString(16).slice(2)}`;
|
|
31
|
+
}
|
|
32
|
+
function getTraceProducerId() {
|
|
33
|
+
if (traceProducerId === null) {
|
|
34
|
+
const processTag = typeof process !== "undefined" && process?.versions?.electron ? process.type === "renderer" ? "renderer" : "main" : typeof window !== "undefined" ? "renderer" : "main";
|
|
35
|
+
traceProducerId = `${processTag}:${randomIdSuffix()}`;
|
|
36
|
+
}
|
|
37
|
+
return traceProducerId;
|
|
38
|
+
}
|
|
39
|
+
function hasValidRemoteIdentity(event) {
|
|
40
|
+
return typeof event.timestamp === "string" && Number.isFinite(Date.parse(event.timestamp)) && typeof event.traceSeq === "number" && Number.isSafeInteger(event.traceSeq) && event.traceSeq >= 1;
|
|
41
|
+
}
|
|
24
42
|
function normalizeTraceInput(raw) {
|
|
25
43
|
const input = raw ?? {};
|
|
26
44
|
const source = typeof input.source === "string" && input.source.trim().length > 0 ? input.source : "unknown";
|
|
@@ -79,8 +97,8 @@ class TraceHub {
|
|
|
79
97
|
get events$() {
|
|
80
98
|
return this.shared$;
|
|
81
99
|
}
|
|
82
|
-
setMinLevel(
|
|
83
|
-
this.minLevels[
|
|
100
|
+
setMinLevel(process2, level) {
|
|
101
|
+
this.minLevels[process2] = level;
|
|
84
102
|
}
|
|
85
103
|
registerSink(sink) {
|
|
86
104
|
this.sinks.add(sink);
|
|
@@ -88,36 +106,61 @@ class TraceHub {
|
|
|
88
106
|
this.sinks.delete(sink);
|
|
89
107
|
};
|
|
90
108
|
}
|
|
91
|
-
publish(
|
|
109
|
+
publish(process2, level, input) {
|
|
92
110
|
const normalized = normalizeTraceInput(input);
|
|
93
111
|
const event = {
|
|
94
112
|
...normalized,
|
|
95
113
|
level,
|
|
96
|
-
process,
|
|
114
|
+
process: process2,
|
|
97
115
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
98
|
-
traceSeq: this.nextTraceSeq
|
|
116
|
+
traceSeq: this.nextTraceSeq++,
|
|
117
|
+
producerId: getTraceProducerId()
|
|
99
118
|
};
|
|
100
|
-
if (traceLevelOrder(level) >= traceLevelOrder(this.minLevels[
|
|
119
|
+
if (traceLevelOrder(level) >= traceLevelOrder(this.minLevels[process2])) {
|
|
101
120
|
this.publishToSinks(event);
|
|
102
121
|
this.subject.next(event);
|
|
103
122
|
}
|
|
104
123
|
return event;
|
|
105
124
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Single renderer admission point: assigns timestamp, traceSeq, and
|
|
127
|
+
* producerId exactly once, then delivers the same event to sinks and
|
|
128
|
+
* events$ subscribers. The returned event is what the renderer transport
|
|
129
|
+
* must forward — no downstream stage may regenerate its identity.
|
|
130
|
+
*
|
|
131
|
+
* Callers gate on rendererEnabled/level BEFORE calling, so gated-out events
|
|
132
|
+
* consume no traceSeq.
|
|
133
|
+
*/
|
|
134
|
+
admitRenderer(level, input) {
|
|
113
135
|
const event = {
|
|
114
136
|
...input,
|
|
115
137
|
level,
|
|
116
138
|
process: "renderer",
|
|
117
139
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
118
|
-
traceSeq: this.nextTraceSeq
|
|
140
|
+
traceSeq: this.nextTraceSeq++,
|
|
141
|
+
producerId: getTraceProducerId()
|
|
119
142
|
};
|
|
120
143
|
this.publishToSinks(event);
|
|
144
|
+
this.subject.next(event);
|
|
145
|
+
return event;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Delivers an event admitted by a remote producer (e.g. a renderer event
|
|
149
|
+
* received over IPC) to this hub's sinks and events$ subscribers without
|
|
150
|
+
* reassigning identity or advancing this hub's own traceSeq counter.
|
|
151
|
+
* The min-level gate for the event's process still applies — delivery
|
|
152
|
+
* filtering is not identity assignment.
|
|
153
|
+
*/
|
|
154
|
+
ingest(event) {
|
|
155
|
+
if (event.producerId !== void 0 && event.producerId === getTraceProducerId()) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const gate = this.minLevels[event.process] ?? this.minLevels.renderer;
|
|
159
|
+
if (traceLevelOrder(event.level) < traceLevelOrder(gate)) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
this.publishToSinks(event);
|
|
163
|
+
this.subject.next(event);
|
|
121
164
|
}
|
|
122
165
|
publishToSinks(event) {
|
|
123
166
|
if (this.sinks.size === 0) {
|
|
@@ -161,18 +204,38 @@ function setRendererTraceEnabled(enabled) {
|
|
|
161
204
|
function publishMainTrace(level, input) {
|
|
162
205
|
return getGlobalTraceHub().publish("main", level, input);
|
|
163
206
|
}
|
|
164
|
-
function publishTestTrace(
|
|
165
|
-
return getGlobalTraceHub().publish(
|
|
207
|
+
function publishTestTrace(process2, level, input) {
|
|
208
|
+
return getGlobalTraceHub().publish(process2, level, input);
|
|
166
209
|
}
|
|
167
210
|
function dispatchRendererTracePayload(rawPayload, context) {
|
|
168
211
|
const payload = rawPayload ?? {};
|
|
169
212
|
const level = normalizeTraceLevel(payload.level);
|
|
213
|
+
if (hasValidRemoteIdentity(payload)) {
|
|
214
|
+
const merged = mergeTraceRuntimeContext(payload, context);
|
|
215
|
+
getGlobalTraceHub().ingest({
|
|
216
|
+
...merged,
|
|
217
|
+
level,
|
|
218
|
+
process: "renderer",
|
|
219
|
+
timestamp: payload.timestamp,
|
|
220
|
+
traceSeq: payload.traceSeq,
|
|
221
|
+
...typeof payload.producerId === "string" && payload.producerId.trim().length > 0 ? { producerId: payload.producerId } : {}
|
|
222
|
+
});
|
|
223
|
+
return { ok: true, forwarded: true };
|
|
224
|
+
}
|
|
170
225
|
getGlobalTraceHub().publish("renderer", level, mergeTraceRuntimeContext(payload, context));
|
|
171
226
|
return {
|
|
172
227
|
ok: true,
|
|
173
228
|
forwarded: true
|
|
174
229
|
};
|
|
175
230
|
}
|
|
231
|
+
function ingestRemoteTraceEvent(event, context) {
|
|
232
|
+
if (!hasValidRemoteIdentity(event)) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
const merged = context ? { ...mergeTraceRuntimeContext(event, context), level: event.level, process: event.process, timestamp: event.timestamp, traceSeq: event.traceSeq, ...event.producerId ? { producerId: event.producerId } : {} } : event;
|
|
236
|
+
getGlobalTraceHub().ingest(merged);
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
176
239
|
function setRendererTraceTransport(fn) {
|
|
177
240
|
customRendererTraceTransport = fn;
|
|
178
241
|
}
|
|
@@ -183,11 +246,10 @@ function emitRendererTrace(level, input) {
|
|
|
183
246
|
if (traceLevelOrder(level) < traceLevelOrder(rendererMinLevel)) {
|
|
184
247
|
return;
|
|
185
248
|
}
|
|
186
|
-
const
|
|
187
|
-
getGlobalTraceHub().publishRendererToSinks(level, normalized);
|
|
249
|
+
const event = getGlobalTraceHub().admitRenderer(level, normalizeTraceInput(input));
|
|
188
250
|
if (customRendererTraceTransport) {
|
|
189
251
|
try {
|
|
190
|
-
customRendererTraceTransport(
|
|
252
|
+
customRendererTraceTransport(event);
|
|
191
253
|
return;
|
|
192
254
|
} catch {
|
|
193
255
|
}
|
|
@@ -197,7 +259,7 @@ function emitRendererTrace(level, input) {
|
|
|
197
259
|
return;
|
|
198
260
|
}
|
|
199
261
|
try {
|
|
200
|
-
bridge.__trace(
|
|
262
|
+
bridge.__trace(event);
|
|
201
263
|
} catch {
|
|
202
264
|
}
|
|
203
265
|
}
|
|
@@ -207,12 +269,15 @@ function clearTraceHubForTests() {
|
|
|
207
269
|
rendererMinLevel = "debug";
|
|
208
270
|
rendererEnabled = false;
|
|
209
271
|
customRendererTraceTransport = null;
|
|
272
|
+
traceProducerId = null;
|
|
210
273
|
}
|
|
211
274
|
export {
|
|
212
275
|
clearTraceHubForTests,
|
|
213
276
|
dispatchRendererTracePayload,
|
|
214
277
|
emitRendererTrace,
|
|
215
278
|
getTraceEvents$,
|
|
279
|
+
getTraceProducerId,
|
|
280
|
+
ingestRemoteTraceEvent,
|
|
216
281
|
normalizeTraceLevel,
|
|
217
282
|
publishMainTrace,
|
|
218
283
|
publishTestTrace,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tracing/trace_hub.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { share } from 'rxjs/operators';\nimport type {\n WoodTraceEventSink,\n WoodTraceEventSnapshot,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport type StandardTraceLevel = 'debug' | 'info' | 'warn' | 'error';\nexport type TraceLevel = StandardTraceLevel | (string & {});\nexport type TraceProcess = 'main' | 'renderer' | 'test';\n\nexport type TraceInput = {\n source: string;\n type: string;\n message?: string;\n conversationId?: number | string;\n payload?: Record<string, unknown>;\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n};\n\nexport type TraceEvent = TraceInput & {\n level: TraceLevel;\n process: TraceProcess;\n timestamp: string;\n traceSeq: number;\n};\n\nexport type TraceDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n};\n\nexport type TraceRuntimeContext = {\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n};\n\nexport type TraceWaitOptions = {\n timeoutMs?: number;\n};\n\nconst TRACE_HUB_SYMBOL = Symbol.for('@noego/wood.trace.hub');\n\nconst LEVEL_ORDER: Record<StandardTraceLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\nconst CUSTOM_LEVEL_ORDER = LEVEL_ORDER.info;\n\nexport function normalizeTraceLevel(level: unknown, fallback: TraceLevel = 'info'): TraceLevel {\n if (typeof level !== 'string') {\n return fallback;\n }\n\n const normalized = level.trim().toLowerCase();\n return normalized.length > 0 ? normalized : fallback;\n}\n\nfunction traceLevelOrder(level: TraceLevel): number {\n return LEVEL_ORDER[level as StandardTraceLevel] ?? CUSTOM_LEVEL_ORDER;\n}\n\nlet rendererMinLevel: TraceLevel = 'debug';\nlet rendererEnabled = false;\nlet customRendererTraceTransport: ((payload: unknown) => void) | null = null;\n\ntype GlobalWithTraceHub = typeof globalThis & {\n [TRACE_HUB_SYMBOL]?: TraceHub;\n};\n\ntype TraceBridgeLike = Record<string, unknown> & {\n __trace?: (payload: unknown) => void;\n};\n\ntype GlobalWithTraceBridge = typeof globalThis & {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n window?: {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n };\n};\n\nfunction normalizeTraceInput(raw: unknown): TraceInput {\n const input = (raw ?? {}) as Partial<TraceInput> & Record<string, unknown>;\n const source = typeof input.source === 'string' && input.source.trim().length > 0\n ? input.source\n : 'unknown';\n const type = typeof input.type === 'string' && input.type.trim().length > 0\n ? input.type\n : 'unknown';\n const message = typeof input.message === 'string' ? input.message : undefined;\n const conversationId = typeof input.conversationId === 'number' || typeof input.conversationId === 'string'\n ? input.conversationId\n : undefined;\n const windowId = typeof input.windowId === 'string' && input.windowId.trim().length > 0\n ? input.windowId\n : undefined;\n const webContentsId = typeof input.webContentsId === 'number' && Number.isFinite(input.webContentsId)\n ? input.webContentsId\n : undefined;\n const routeKey = typeof input.routeKey === 'string' && input.routeKey.trim().length > 0\n ? input.routeKey\n : undefined;\n const harnessId = typeof input.harnessId === 'string' && input.harnessId.trim().length > 0\n ? input.harnessId\n : undefined;\n const payload = isRecord(input.payload) ? { ...input.payload } : undefined;\n\n return {\n source,\n type,\n ...(message ? { message } : {}),\n ...(conversationId !== undefined ? { conversationId } : {}),\n ...(windowId !== undefined ? { windowId } : {}),\n ...(webContentsId !== undefined ? { webContentsId } : {}),\n ...(routeKey !== undefined ? { routeKey } : {}),\n ...(harnessId !== undefined ? { harnessId } : {}),\n ...(payload ? { payload } : {}),\n };\n}\n\nfunction mergeTraceRuntimeContext(input: unknown, context: TraceRuntimeContext | undefined): TraceInput {\n if (!context) {\n return normalizeTraceInput(input);\n }\n return normalizeTraceInput({\n ...(isRecord(input) ? input : {}),\n ...context,\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction resolveTraceBridge(): TraceBridgeLike | null {\n const globalObj = globalThis as GlobalWithTraceBridge;\n const bridge = globalObj.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.window?.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n return null;\n }\n return bridge as TraceBridgeLike;\n}\n\nclass TraceHub {\n private readonly subject = new Subject<TraceEvent>();\n private readonly shared$ = this.subject.asObservable().pipe(share());\n private readonly sinks = new Set<WoodTraceEventSink>();\n private nextTraceSeq = 1;\n private minLevels: Record<TraceProcess, TraceLevel> = {\n main: 'debug',\n renderer: 'debug',\n test: 'debug',\n };\n\n get events$(): Observable<TraceEvent> {\n return this.shared$;\n }\n\n setMinLevel(process: TraceProcess, level: TraceLevel): void {\n this.minLevels[process] = level;\n }\n\n registerSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer {\n this.sinks.add(sink);\n return () => {\n this.sinks.delete(sink);\n };\n }\n\n publish(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n const normalized = normalizeTraceInput(input);\n const event: TraceEvent = {\n ...normalized,\n level,\n process,\n timestamp: new Date().toISOString(),\n traceSeq: this.nextTraceSeq++,\n };\n if (traceLevelOrder(level) >= traceLevelOrder(this.minLevels[process])) {\n this.publishToSinks(event);\n this.subject.next(event);\n }\n return event;\n }\n\n publishRendererToSinks(level: TraceLevel, input: TraceInput): void {\n if (this.sinks.size === 0) {\n return;\n }\n if (traceLevelOrder(level) < traceLevelOrder(this.minLevels.renderer)) {\n return;\n }\n const event: TraceEvent = {\n ...input,\n level,\n process: 'renderer',\n timestamp: new Date().toISOString(),\n traceSeq: this.nextTraceSeq++,\n };\n this.publishToSinks(event);\n }\n\n private publishToSinks(event: TraceEvent): void {\n if (this.sinks.size === 0) {\n return;\n }\n const snapshot: WoodTraceEventSnapshot = Object.freeze({\n ...event,\n ...(event.payload ? { payload: Object.freeze({ ...event.payload }) } : {}),\n });\n for (const sink of this.sinks) {\n try {\n sink(snapshot);\n } catch {\n // Trace sinks are observational and cannot fail trace callers or peers.\n }\n }\n }\n}\n\nfunction getGlobalTraceHub(): TraceHub {\n const globalObj = globalThis as GlobalWithTraceHub;\n if (!globalObj[TRACE_HUB_SYMBOL]) {\n globalObj[TRACE_HUB_SYMBOL] = new TraceHub();\n }\n return globalObj[TRACE_HUB_SYMBOL] as TraceHub;\n}\n\nexport function getTraceEvents$(): Observable<TraceEvent> {\n return getGlobalTraceHub().events$;\n}\n\nexport function registerTraceSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer {\n return getGlobalTraceHub().registerSink(sink);\n}\n\nexport function setMainTraceMinLevel(level: TraceLevel): void {\n getGlobalTraceHub().setMinLevel('main', level);\n}\n\nexport function setRendererTraceMinLevel(level: TraceLevel): void {\n rendererMinLevel = level;\n getGlobalTraceHub().setMinLevel('renderer', level);\n}\n\nexport function setRendererTraceEnabled(enabled: boolean): void {\n rendererEnabled = enabled;\n}\n\nexport function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish('main', level, input);\n}\n\nexport function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish(process, level, input);\n}\n\nexport function dispatchRendererTracePayload(\n rawPayload: unknown,\n context?: TraceRuntimeContext,\n): TraceDispatchResult {\n const payload = (rawPayload ?? {}) as Partial<TraceInput> & { level?: unknown };\n const level = normalizeTraceLevel(payload.level);\n getGlobalTraceHub().publish('renderer', level, mergeTraceRuntimeContext(payload, context));\n return {\n ok: true,\n forwarded: true,\n };\n}\n\nexport function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void {\n customRendererTraceTransport = fn;\n}\n\nexport function emitRendererTrace(level: TraceLevel, input: TraceInput): void {\n if (!rendererEnabled) {\n return;\n }\n if (traceLevelOrder(level) < traceLevelOrder(rendererMinLevel)) {\n return;\n }\n const normalized = { ...normalizeTraceInput(input), level };\n getGlobalTraceHub().publishRendererToSinks(level, normalized);\n\n if (customRendererTraceTransport) {\n try {\n customRendererTraceTransport(normalized);\n return;\n } catch {\n // Fall through to bridge.__trace\n }\n }\n\n const bridge = resolveTraceBridge();\n if (!bridge || typeof bridge.__trace !== 'function') {\n return;\n }\n try {\n bridge.__trace(normalized);\n } catch {\n // Tracing is observational and must never break the caller.\n }\n}\n\nexport function clearTraceHubForTests(): void {\n const globalObj = globalThis as GlobalWithTraceHub;\n delete globalObj[TRACE_HUB_SYMBOL];\n rendererMinLevel = 'debug';\n rendererEnabled = false;\n customRendererTraceTransport = null;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tracing/trace_hub.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { share } from 'rxjs/operators';\nimport type {\n WoodTraceEventSink,\n WoodTraceEventSnapshot,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport type StandardTraceLevel = 'debug' | 'info' | 'warn' | 'error';\nexport type TraceLevel = StandardTraceLevel | (string & {});\nexport type TraceProcess = 'main' | 'renderer' | 'test';\n\nexport type TraceInput = {\n source: string;\n type: string;\n message?: string;\n conversationId?: number | string;\n payload?: Record<string, unknown>;\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n};\n\nexport type TraceEvent = TraceInput & {\n level: TraceLevel;\n process: TraceProcess;\n timestamp: string;\n traceSeq: number;\n /**\n * Durable producer identity stamped at admission. Together with traceSeq it\n * forms the identity key `(producerId, traceSeq)` across merged streams\n * (main + ingested renderer events).\n */\n producerId?: string;\n};\n\nexport type TraceDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n};\n\nexport type TraceRuntimeContext = {\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n};\n\nexport type TraceWaitOptions = {\n timeoutMs?: number;\n};\n\nconst TRACE_HUB_SYMBOL = Symbol.for('@noego/wood.trace.hub');\n\nconst LEVEL_ORDER: Record<StandardTraceLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\nconst CUSTOM_LEVEL_ORDER = LEVEL_ORDER.info;\n\nexport function normalizeTraceLevel(level: unknown, fallback: TraceLevel = 'info'): TraceLevel {\n if (typeof level !== 'string') {\n return fallback;\n }\n\n const normalized = level.trim().toLowerCase();\n return normalized.length > 0 ? normalized : fallback;\n}\n\nfunction traceLevelOrder(level: TraceLevel): number {\n return LEVEL_ORDER[level as StandardTraceLevel] ?? CUSTOM_LEVEL_ORDER;\n}\n\nlet rendererMinLevel: TraceLevel = 'debug';\nlet rendererEnabled = false;\nlet customRendererTraceTransport: ((payload: unknown) => void) | null = null;\nlet traceProducerId: string | null = null;\n\nfunction randomIdSuffix(): string {\n const c = globalThis.crypto;\n if (c && typeof c.randomUUID === 'function') {\n return c.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(16).slice(2)}`;\n}\n\n/**\n * Returns this process's durable trace producer identity, created lazily.\n * The identity is stable for the process lifetime represented by the hub's\n * traceSeq stream.\n */\nexport function getTraceProducerId(): string {\n if (traceProducerId === null) {\n const processTag = typeof process !== 'undefined' && process?.versions?.electron\n ? (process.type === 'renderer' ? 'renderer' : 'main')\n : (typeof window !== 'undefined' ? 'renderer' : 'main');\n traceProducerId = `${processTag}:${randomIdSuffix()}`;\n }\n return traceProducerId;\n}\n\n/** Validates that an event carries usable remote identity fields. */\nfunction hasValidRemoteIdentity(event: Partial<TraceEvent>): event is Partial<TraceEvent> & {\n timestamp: string;\n traceSeq: number;\n} {\n return typeof event.timestamp === 'string'\n && Number.isFinite(Date.parse(event.timestamp))\n && typeof event.traceSeq === 'number'\n && Number.isSafeInteger(event.traceSeq)\n && event.traceSeq >= 1;\n}\n\ntype GlobalWithTraceHub = typeof globalThis & {\n [TRACE_HUB_SYMBOL]?: TraceHub;\n};\n\ntype TraceBridgeLike = Record<string, unknown> & {\n __trace?: (payload: unknown) => void;\n};\n\ntype GlobalWithTraceBridge = typeof globalThis & {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n window?: {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n };\n};\n\nfunction normalizeTraceInput(raw: unknown): TraceInput {\n const input = (raw ?? {}) as Partial<TraceInput> & Record<string, unknown>;\n const source = typeof input.source === 'string' && input.source.trim().length > 0\n ? input.source\n : 'unknown';\n const type = typeof input.type === 'string' && input.type.trim().length > 0\n ? input.type\n : 'unknown';\n const message = typeof input.message === 'string' ? input.message : undefined;\n const conversationId = typeof input.conversationId === 'number' || typeof input.conversationId === 'string'\n ? input.conversationId\n : undefined;\n const windowId = typeof input.windowId === 'string' && input.windowId.trim().length > 0\n ? input.windowId\n : undefined;\n const webContentsId = typeof input.webContentsId === 'number' && Number.isFinite(input.webContentsId)\n ? input.webContentsId\n : undefined;\n const routeKey = typeof input.routeKey === 'string' && input.routeKey.trim().length > 0\n ? input.routeKey\n : undefined;\n const harnessId = typeof input.harnessId === 'string' && input.harnessId.trim().length > 0\n ? input.harnessId\n : undefined;\n const payload = isRecord(input.payload) ? { ...input.payload } : undefined;\n\n return {\n source,\n type,\n ...(message ? { message } : {}),\n ...(conversationId !== undefined ? { conversationId } : {}),\n ...(windowId !== undefined ? { windowId } : {}),\n ...(webContentsId !== undefined ? { webContentsId } : {}),\n ...(routeKey !== undefined ? { routeKey } : {}),\n ...(harnessId !== undefined ? { harnessId } : {}),\n ...(payload ? { payload } : {}),\n };\n}\n\nfunction mergeTraceRuntimeContext(input: unknown, context: TraceRuntimeContext | undefined): TraceInput {\n if (!context) {\n return normalizeTraceInput(input);\n }\n return normalizeTraceInput({\n ...(isRecord(input) ? input : {}),\n ...context,\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction resolveTraceBridge(): TraceBridgeLike | null {\n const globalObj = globalThis as GlobalWithTraceBridge;\n const bridge = globalObj.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.window?.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n return null;\n }\n return bridge as TraceBridgeLike;\n}\n\nclass TraceHub {\n private readonly subject = new Subject<TraceEvent>();\n private readonly shared$ = this.subject.asObservable().pipe(share());\n private readonly sinks = new Set<WoodTraceEventSink>();\n private nextTraceSeq = 1;\n private minLevels: Record<TraceProcess, TraceLevel> = {\n main: 'debug',\n renderer: 'debug',\n test: 'debug',\n };\n\n get events$(): Observable<TraceEvent> {\n return this.shared$;\n }\n\n setMinLevel(process: TraceProcess, level: TraceLevel): void {\n this.minLevels[process] = level;\n }\n\n registerSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer {\n this.sinks.add(sink);\n return () => {\n this.sinks.delete(sink);\n };\n }\n\n publish(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n const normalized = normalizeTraceInput(input);\n const event: TraceEvent = {\n ...normalized,\n level,\n process,\n timestamp: new Date().toISOString(),\n traceSeq: this.nextTraceSeq++,\n producerId: getTraceProducerId(),\n };\n if (traceLevelOrder(level) >= traceLevelOrder(this.minLevels[process])) {\n this.publishToSinks(event);\n this.subject.next(event);\n }\n return event;\n }\n\n /**\n * Single renderer admission point: assigns timestamp, traceSeq, and\n * producerId exactly once, then delivers the same event to sinks and\n * events$ subscribers. The returned event is what the renderer transport\n * must forward — no downstream stage may regenerate its identity.\n *\n * Callers gate on rendererEnabled/level BEFORE calling, so gated-out events\n * consume no traceSeq.\n */\n admitRenderer(level: TraceLevel, input: TraceInput): TraceEvent {\n const event: TraceEvent = {\n ...input,\n level,\n process: 'renderer',\n timestamp: new Date().toISOString(),\n traceSeq: this.nextTraceSeq++,\n producerId: getTraceProducerId(),\n };\n this.publishToSinks(event);\n this.subject.next(event);\n return event;\n }\n\n /**\n * Delivers an event admitted by a remote producer (e.g. a renderer event\n * received over IPC) to this hub's sinks and events$ subscribers without\n * reassigning identity or advancing this hub's own traceSeq counter.\n * The min-level gate for the event's process still applies — delivery\n * filtering is not identity assignment.\n */\n ingest(event: TraceEvent): void {\n // Same-process echo suppression: an event this process's own producer\n // admitted was already delivered to sinks and events$ at admission\n // (same-process bridge/test compositions loop the transport back into the\n // same hub). Ingest is for events admitted by a REMOTE producer.\n if (event.producerId !== undefined && event.producerId === getTraceProducerId()) {\n return;\n }\n const gate = this.minLevels[event.process as TraceProcess] ?? this.minLevels.renderer;\n if (traceLevelOrder(event.level) < traceLevelOrder(gate)) {\n return;\n }\n this.publishToSinks(event);\n this.subject.next(event);\n }\n\n private publishToSinks(event: TraceEvent): void {\n if (this.sinks.size === 0) {\n return;\n }\n const snapshot: WoodTraceEventSnapshot = Object.freeze({\n ...event,\n ...(event.payload ? { payload: Object.freeze({ ...event.payload }) } : {}),\n });\n for (const sink of this.sinks) {\n try {\n sink(snapshot);\n } catch {\n // Trace sinks are observational and cannot fail trace callers or peers.\n }\n }\n }\n}\n\nfunction getGlobalTraceHub(): TraceHub {\n const globalObj = globalThis as GlobalWithTraceHub;\n if (!globalObj[TRACE_HUB_SYMBOL]) {\n globalObj[TRACE_HUB_SYMBOL] = new TraceHub();\n }\n return globalObj[TRACE_HUB_SYMBOL] as TraceHub;\n}\n\nexport function getTraceEvents$(): Observable<TraceEvent> {\n return getGlobalTraceHub().events$;\n}\n\nexport function registerTraceSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer {\n return getGlobalTraceHub().registerSink(sink);\n}\n\nexport function setMainTraceMinLevel(level: TraceLevel): void {\n getGlobalTraceHub().setMinLevel('main', level);\n}\n\nexport function setRendererTraceMinLevel(level: TraceLevel): void {\n rendererMinLevel = level;\n getGlobalTraceHub().setMinLevel('renderer', level);\n}\n\nexport function setRendererTraceEnabled(enabled: boolean): void {\n rendererEnabled = enabled;\n}\n\nexport function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish('main', level, input);\n}\n\nexport function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish(process, level, input);\n}\n\nexport function dispatchRendererTracePayload(\n rawPayload: unknown,\n context?: TraceRuntimeContext,\n): TraceDispatchResult {\n const payload = (rawPayload ?? {}) as Partial<TraceEvent> & { level?: unknown };\n const level = normalizeTraceLevel(payload.level);\n\n if (hasValidRemoteIdentity(payload)) {\n // The renderer already admitted this event: preserve its identity, merge\n // main-side runtime context, and ingest without re-stamping.\n const merged = mergeTraceRuntimeContext(payload, context);\n getGlobalTraceHub().ingest({\n ...merged,\n level,\n process: 'renderer',\n timestamp: payload.timestamp,\n traceSeq: payload.traceSeq,\n ...(typeof payload.producerId === 'string' && payload.producerId.trim().length > 0\n ? { producerId: payload.producerId }\n : {}),\n });\n return { ok: true, forwarded: true };\n }\n\n // Legacy sender without identity: fall back to main-side re-admission.\n getGlobalTraceHub().publish('renderer', level, mergeTraceRuntimeContext(payload, context));\n return {\n ok: true,\n forwarded: true,\n };\n}\n\n/**\n * Delivers an already-admitted remote trace event (e.g. a renderer event\n * unwrapped from a persisted IPC batch) to this process's sinks and events$\n * observers. Identity is preserved: no new timestamp, traceSeq, or producerId\n * is assigned, this hub's own counter does not advance, and the event is not\n * re-forwarded through any renderer transport.\n */\nexport function ingestRemoteTraceEvent(\n event: TraceEvent,\n context?: TraceRuntimeContext,\n): boolean {\n if (!hasValidRemoteIdentity(event)) {\n return false;\n }\n const merged = context\n ? { ...mergeTraceRuntimeContext(event, context), level: event.level, process: event.process, timestamp: event.timestamp, traceSeq: event.traceSeq, ...(event.producerId ? { producerId: event.producerId } : {}) }\n : event;\n getGlobalTraceHub().ingest(merged as TraceEvent);\n return true;\n}\n\nexport function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void {\n customRendererTraceTransport = fn;\n}\n\nexport function emitRendererTrace(level: TraceLevel, input: TraceInput): void {\n if (!rendererEnabled) {\n return;\n }\n // Gate before admission so gated-out events consume no traceSeq.\n if (traceLevelOrder(level) < traceLevelOrder(rendererMinLevel)) {\n return;\n }\n\n // Single admission point: the same event (with timestamp/traceSeq/producerId)\n // is what local sinks, events$ subscribers, and the transport all see.\n const event = getGlobalTraceHub().admitRenderer(level, normalizeTraceInput(input));\n\n if (customRendererTraceTransport) {\n try {\n customRendererTraceTransport(event);\n return;\n } catch {\n // Fall through to bridge.__trace\n }\n }\n\n const bridge = resolveTraceBridge();\n if (!bridge || typeof bridge.__trace !== 'function') {\n return;\n }\n try {\n bridge.__trace(event);\n } catch {\n // Tracing is observational and must never break the caller.\n }\n}\n\nexport function clearTraceHubForTests(): void {\n const globalObj = globalThis as GlobalWithTraceHub;\n delete globalObj[TRACE_HUB_SYMBOL];\n rendererMinLevel = 'debug';\n rendererEnabled = false;\n customRendererTraceTransport = null;\n traceProducerId = null;\n}\n"],"mappings":"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","names":["process"]}
|
|
@@ -229,10 +229,9 @@ TestTracer = __decorateClass([
|
|
|
229
229
|
__decorateParam(0, (0, import_ioc.Inject)(TraceProviderConfiguration))
|
|
230
230
|
], TestTracer);
|
|
231
231
|
let TraceProvider = class extends FrameworkTracer {
|
|
232
|
-
constructor(configuration
|
|
232
|
+
constructor(configuration) {
|
|
233
233
|
super();
|
|
234
234
|
this.configuration = configuration;
|
|
235
|
-
this.container = container;
|
|
236
235
|
}
|
|
237
236
|
get mode() {
|
|
238
237
|
return this.resolveImplementation().mode;
|
|
@@ -269,7 +268,21 @@ let TraceProvider = class extends FrameworkTracer {
|
|
|
269
268
|
return this.resolveSync(MainTracer);
|
|
270
269
|
}
|
|
271
270
|
resolveSync(token) {
|
|
272
|
-
|
|
271
|
+
let scope = import_ioc.ExecutionContext.current() ?? this.lastScope;
|
|
272
|
+
if (scope && scope.isDisposed?.()) {
|
|
273
|
+
const root = scope.contextRoot?.();
|
|
274
|
+
const liveRoot = root && !root.isDisposed?.() ? root : void 0;
|
|
275
|
+
if (!liveRoot) return inertTracer();
|
|
276
|
+
scope = liveRoot;
|
|
277
|
+
this.lastScope = scope;
|
|
278
|
+
}
|
|
279
|
+
if (!scope) {
|
|
280
|
+
throw new Error(
|
|
281
|
+
`TraceProvider cannot resolve ${token.name}: no active IoC execution context. Resolve TraceProvider through the container and call it from IoC-managed code.`
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
this.lastScope = scope;
|
|
285
|
+
const resolved = scope.instance(token);
|
|
273
286
|
if (resolved instanceof Promise) {
|
|
274
287
|
throw new Error(`${token.name} must resolve synchronously`);
|
|
275
288
|
}
|
|
@@ -277,10 +290,12 @@ let TraceProvider = class extends FrameworkTracer {
|
|
|
277
290
|
}
|
|
278
291
|
};
|
|
279
292
|
TraceProvider = __decorateClass([
|
|
280
|
-
(0, import_ioc.
|
|
281
|
-
__decorateParam(0, (0, import_ioc.Inject)(TraceProviderConfiguration))
|
|
282
|
-
__decorateParam(1, (0, import_ioc.Inject)(import_ioc.SCOPED_CONTAINER))
|
|
293
|
+
(0, import_ioc.Component)({ scope: import_ioc.LoadAs.Singleton }),
|
|
294
|
+
__decorateParam(0, (0, import_ioc.Inject)(TraceProviderConfiguration))
|
|
283
295
|
], TraceProvider);
|
|
296
|
+
function inertTracer() {
|
|
297
|
+
return new Proxy({}, { get: () => () => void 0 });
|
|
298
|
+
}
|
|
284
299
|
// Annotate the CommonJS export names for ESM import in node:
|
|
285
300
|
0 && (module.exports = {
|
|
286
301
|
FrameworkTracer,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tracing/trace_provider.ts"],"sourcesContent":["import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER, type IContainer } from '@noego/ioc';\nimport type { Observable } from 'rxjs';\nimport {\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n registerTraceSink,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n} from './trace_hub.js';\nimport type {\n WoodTraceEventSink,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport type TraceProviderMode = 'live' | 'test';\nexport type TraceRuntime = 'main' | 'renderer' | 'test';\nexport type TraceContext = Partial<TraceInput>;\n\nexport abstract class FrameworkTracer {\n abstract readonly mode: TraceProviderMode;\n abstract readonly process: TraceProcess;\n abstract readonly events$: Observable<TraceEvent>;\n abstract traceAt(level: TraceLevel, event: TraceInput): void;\n abstract debug(event: TraceInput): void;\n abstract info(event: TraceInput): void;\n abstract warn(event: TraceInput): void;\n abstract error(event: TraceInput): void;\n\n registerSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer {\n return registerTraceSink(sink);\n }\n\n extend(context: TraceContext): FrameworkTracer {\n return new ContextualTracer(this, context);\n }\n}\n\nclass ContextualTracer extends FrameworkTracer {\n constructor(\n private readonly parent: FrameworkTracer,\n private readonly context: TraceContext,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.parent.mode;\n }\n\n get process(): TraceProcess {\n return this.parent.process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.parent.events$;\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.parent.traceAt(level, this.mergeEvent(event));\n }\n\n debug(event: TraceInput): void {\n this.parent.debug(this.mergeEvent(event));\n }\n\n info(event: TraceInput): void {\n this.parent.info(this.mergeEvent(event));\n }\n\n warn(event: TraceInput): void {\n this.parent.warn(this.mergeEvent(event));\n }\n\n error(event: TraceInput): void {\n this.parent.error(this.mergeEvent(event));\n }\n\n private mergeEvent(event: TraceInput): TraceInput {\n return {\n ...this.context,\n ...event,\n };\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProviderConfiguration {\n private mode: TraceProviderMode = 'live';\n private runtime: TraceRuntime = 'main';\n private minLevel: TraceLevel = 'debug';\n private enabled: boolean | null = null;\n private databasePath: string | null = null;\n\n configureMode(mode: TraceProviderMode): void {\n this.mode = mode;\n }\n\n /**\n * Point trace persistence at a concrete database file. Injected by the test\n * backend harness (per-test `framework-trace.db`) BEFORE trace services\n * initialize. `null` keeps the production/native persistence path.\n */\n configureDatabasePath(databasePath: string | null): void {\n this.databasePath = databasePath;\n }\n\n getDatabasePath(): string | null {\n return this.databasePath;\n }\n\n configureRuntime(runtime: TraceRuntime): void {\n this.runtime = runtime;\n this.applyRuntimeConfiguration();\n }\n\n configureMinLevel(level: TraceLevel): void {\n this.minLevel = level;\n this.applyRuntimeConfiguration();\n }\n\n configureEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.applyRuntimeConfiguration();\n }\n\n getMode(): TraceProviderMode {\n return this.mode;\n }\n\n getRuntime(): TraceRuntime {\n return this.runtime;\n }\n\n getMinLevel(): TraceLevel {\n return this.minLevel;\n }\n\n getEnabled(): boolean {\n return this.enabled ?? (this.runtime === 'renderer' ? false : true);\n }\n\n private applyRuntimeConfiguration(): void {\n if (this.runtime === 'renderer') {\n setRendererTraceEnabled(this.getEnabled());\n setRendererTraceMinLevel(this.minLevel);\n return;\n }\n\n setMainTraceMinLevel(this.minLevel);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class MainTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'main' as const;\n readonly events$ = getTraceEvents$();\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n publishMainTrace(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class RendererTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'renderer' as const;\n readonly events$ = getTraceEvents$();\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n emitRendererTrace(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TestTracer extends FrameworkTracer {\n readonly mode = 'test' as const;\n readonly events$ = getTraceEvents$();\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get process(): TraceProcess {\n const runtime = this.configuration.getRuntime();\n if (runtime === 'renderer') return 'renderer';\n if (runtime === 'main') return 'main';\n return 'test';\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.publish(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n\n private publish(level: TraceLevel, event: TraceInput): void {\n publishTestTrace(this.process, level, event);\n }\n}\n\n@Provider()\nexport class TraceProvider extends FrameworkTracer {\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n @Inject(SCOPED_CONTAINER) private readonly container: IContainer,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.resolveImplementation().mode;\n }\n\n get process(): TraceProcess {\n return this.resolveImplementation().process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.resolveImplementation().events$;\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.resolveImplementation().traceAt(level, event);\n }\n\n debug(event: TraceInput): void {\n this.resolveImplementation().debug(event);\n }\n\n info(event: TraceInput): void {\n this.resolveImplementation().info(event);\n }\n\n warn(event: TraceInput): void {\n this.resolveImplementation().warn(event);\n }\n\n error(event: TraceInput): void {\n this.resolveImplementation().error(event);\n }\n\n private resolveImplementation(): FrameworkTracer {\n const mode = this.configuration.getMode();\n if (mode === 'test') {\n return this.resolveSync(TestTracer);\n }\n\n if (this.configuration.getRuntime() === 'renderer') {\n return this.resolveSync(RendererTracer);\n }\n\n return this.resolveSync(MainTracer);\n }\n\n private resolveSync<T>(token: new (...args: any[]) => T): T {\n const resolved = this.container.instance<T, true>(token);\n if (resolved instanceof Promise) {\n throw new Error(`${token.name} must resolve synchronously`);\n }\n return resolved;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tracing/trace_provider.ts"],"sourcesContent":["import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER, type IContainer, ExecutionContext } from '@noego/ioc';\nimport type { Observable } from 'rxjs';\nimport {\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n registerTraceSink,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n} from './trace_hub.js';\nimport type {\n WoodTraceEventSink,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport type TraceProviderMode = 'live' | 'test';\nexport type TraceRuntime = 'main' | 'renderer' | 'test';\nexport type TraceContext = Partial<TraceInput>;\n\nexport abstract class FrameworkTracer {\n abstract readonly mode: TraceProviderMode;\n abstract readonly process: TraceProcess;\n abstract readonly events$: Observable<TraceEvent>;\n abstract traceAt(level: TraceLevel, event: TraceInput): void;\n abstract debug(event: TraceInput): void;\n abstract info(event: TraceInput): void;\n abstract warn(event: TraceInput): void;\n abstract error(event: TraceInput): void;\n\n registerSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer {\n return registerTraceSink(sink);\n }\n\n extend(context: TraceContext): FrameworkTracer {\n return new ContextualTracer(this, context);\n }\n}\n\nclass ContextualTracer extends FrameworkTracer {\n constructor(\n private readonly parent: FrameworkTracer,\n private readonly context: TraceContext,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.parent.mode;\n }\n\n get process(): TraceProcess {\n return this.parent.process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.parent.events$;\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.parent.traceAt(level, this.mergeEvent(event));\n }\n\n debug(event: TraceInput): void {\n this.parent.debug(this.mergeEvent(event));\n }\n\n info(event: TraceInput): void {\n this.parent.info(this.mergeEvent(event));\n }\n\n warn(event: TraceInput): void {\n this.parent.warn(this.mergeEvent(event));\n }\n\n error(event: TraceInput): void {\n this.parent.error(this.mergeEvent(event));\n }\n\n private mergeEvent(event: TraceInput): TraceInput {\n return {\n ...this.context,\n ...event,\n };\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProviderConfiguration {\n private mode: TraceProviderMode = 'live';\n private runtime: TraceRuntime = 'main';\n private minLevel: TraceLevel = 'debug';\n private enabled: boolean | null = null;\n private databasePath: string | null = null;\n\n configureMode(mode: TraceProviderMode): void {\n this.mode = mode;\n }\n\n /**\n * Point trace persistence at a concrete database file. Injected by the test\n * backend harness (per-test `framework-trace.db`) BEFORE trace services\n * initialize. `null` keeps the production/native persistence path.\n */\n configureDatabasePath(databasePath: string | null): void {\n this.databasePath = databasePath;\n }\n\n getDatabasePath(): string | null {\n return this.databasePath;\n }\n\n configureRuntime(runtime: TraceRuntime): void {\n this.runtime = runtime;\n this.applyRuntimeConfiguration();\n }\n\n configureMinLevel(level: TraceLevel): void {\n this.minLevel = level;\n this.applyRuntimeConfiguration();\n }\n\n configureEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.applyRuntimeConfiguration();\n }\n\n getMode(): TraceProviderMode {\n return this.mode;\n }\n\n getRuntime(): TraceRuntime {\n return this.runtime;\n }\n\n getMinLevel(): TraceLevel {\n return this.minLevel;\n }\n\n getEnabled(): boolean {\n return this.enabled ?? (this.runtime === 'renderer' ? false : true);\n }\n\n private applyRuntimeConfiguration(): void {\n if (this.runtime === 'renderer') {\n setRendererTraceEnabled(this.getEnabled());\n setRendererTraceMinLevel(this.minLevel);\n return;\n }\n\n setMainTraceMinLevel(this.minLevel);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class MainTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'main' as const;\n readonly events$ = getTraceEvents$();\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n publishMainTrace(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class RendererTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'renderer' as const;\n readonly events$ = getTraceEvents$();\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n emitRendererTrace(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TestTracer extends FrameworkTracer {\n readonly mode = 'test' as const;\n readonly events$ = getTraceEvents$();\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get process(): TraceProcess {\n const runtime = this.configuration.getRuntime();\n if (runtime === 'renderer') return 'renderer';\n if (runtime === 'main') return 'main';\n return 'test';\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.publish(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n\n private publish(level: TraceLevel, event: TraceInput): void {\n publishTestTrace(this.process, level, event);\n }\n}\n\n/**\n * Singleton, not scoped: TraceProvider is injected by singleton and scoped\n * services alike, so it must be safe to capture. It therefore injects no\n * container — delegate tracers resolve through the ACTIVE IoC execution\n * context (D25/D26: method calls on IoC-resolved instances run under their\n * owning environment, so a scope is present whenever the provider is used\n * through the container). Delegates are root-shared Singletons, so any\n * scope of the owning hierarchy resolves the same instances; the last seen\n * scope is kept as a fallback for context-less call sites.\n */\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProvider extends FrameworkTracer {\n private lastScope: IContainer | undefined;\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.resolveImplementation().mode;\n }\n\n get process(): TraceProcess {\n return this.resolveImplementation().process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.resolveImplementation().events$;\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.resolveImplementation().traceAt(level, event);\n }\n\n debug(event: TraceInput): void {\n this.resolveImplementation().debug(event);\n }\n\n info(event: TraceInput): void {\n this.resolveImplementation().info(event);\n }\n\n warn(event: TraceInput): void {\n this.resolveImplementation().warn(event);\n }\n\n error(event: TraceInput): void {\n this.resolveImplementation().error(event);\n }\n\n private resolveImplementation(): FrameworkTracer {\n const mode = this.configuration.getMode();\n if (mode === 'test') {\n return this.resolveSync(TestTracer);\n }\n\n if (this.configuration.getRuntime() === 'renderer') {\n return this.resolveSync(RendererTracer);\n }\n\n return this.resolveSync(MainTracer);\n }\n\n private resolveSync<T>(token: new (...args: any[]) => T): T {\n let scope: IContainer | undefined = (ExecutionContext.current() as IContainer | undefined) ?? this.lastScope;\n // Fire-and-forget emission can outlive the scope that was active when it\n // was scheduled (a wood operation scope is disposed at dispatch end).\n // Delegate tracers are root-shared Singletons, so degrade to the live\n // hierarchy root rather than re-entering a disposed scope.\n if (scope && (scope as { isDisposed?: () => boolean }).isDisposed?.()) {\n const root = (scope as { contextRoot?: () => IContainer }).contextRoot?.();\n const liveRoot = root && !(root as { isDisposed?: () => boolean }).isDisposed?.() ? root : undefined;\n // The whole hierarchy is gone (environment teardown): emission from a\n // service's own dispose hook is fire-and-forget by design, so it is\n // dropped rather than failing the teardown it is part of.\n if (!liveRoot) return inertTracer<T>();\n scope = liveRoot;\n this.lastScope = scope;\n }\n if (!scope) {\n throw new Error(\n `TraceProvider cannot resolve ${token.name}: no active IoC execution context. ` +\n 'Resolve TraceProvider through the container and call it from IoC-managed code.'\n );\n }\n this.lastScope = scope;\n const resolved = scope.instance<T, true>(token);\n if (resolved instanceof Promise) {\n throw new Error(`${token.name} must resolve synchronously`);\n }\n return resolved;\n }\n}\n\n/** A delegate whose every method is a no-op: emission after the hierarchy is disposed. */\nfunction inertTracer<T>(): T {\n return new Proxy({}, { get: () => () => undefined }) as T;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { IContainer } from '@noego/ioc';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
import { d as TraceProcess, a as TraceEvent, c as TraceLevel, b as TraceInput, W as WoodTraceEventSink, h as WoodTraceSinkDisposer } from '../trace_hub-
|
|
2
|
+
import { d as TraceProcess, a as TraceEvent, c as TraceLevel, b as TraceInput, W as WoodTraceEventSink, h as WoodTraceSinkDisposer } from '../trace_hub-Cpo_nVze.cjs';
|
|
4
3
|
|
|
5
4
|
type TraceProviderMode = 'live' | 'test';
|
|
6
5
|
type TraceRuntime = 'main' | 'renderer' | 'test';
|
|
@@ -73,10 +72,20 @@ declare class TestTracer extends FrameworkTracer {
|
|
|
73
72
|
error(event: TraceInput): void;
|
|
74
73
|
private publish;
|
|
75
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Singleton, not scoped: TraceProvider is injected by singleton and scoped
|
|
77
|
+
* services alike, so it must be safe to capture. It therefore injects no
|
|
78
|
+
* container — delegate tracers resolve through the ACTIVE IoC execution
|
|
79
|
+
* context (D25/D26: method calls on IoC-resolved instances run under their
|
|
80
|
+
* owning environment, so a scope is present whenever the provider is used
|
|
81
|
+
* through the container). Delegates are root-shared Singletons, so any
|
|
82
|
+
* scope of the owning hierarchy resolves the same instances; the last seen
|
|
83
|
+
* scope is kept as a fallback for context-less call sites.
|
|
84
|
+
*/
|
|
76
85
|
declare class TraceProvider extends FrameworkTracer {
|
|
77
86
|
private readonly configuration;
|
|
78
|
-
private
|
|
79
|
-
constructor(configuration: TraceProviderConfiguration
|
|
87
|
+
private lastScope;
|
|
88
|
+
constructor(configuration: TraceProviderConfiguration);
|
|
80
89
|
get mode(): TraceProviderMode;
|
|
81
90
|
get process(): TraceProcess;
|
|
82
91
|
get events$(): Observable<TraceEvent>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { IContainer } from '@noego/ioc';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
import { d as TraceProcess, a as TraceEvent, c as TraceLevel, b as TraceInput, W as WoodTraceEventSink, h as WoodTraceSinkDisposer } from '../trace_hub-
|
|
2
|
+
import { d as TraceProcess, a as TraceEvent, c as TraceLevel, b as TraceInput, W as WoodTraceEventSink, h as WoodTraceSinkDisposer } from '../trace_hub-Cpo_nVze.js';
|
|
4
3
|
|
|
5
4
|
type TraceProviderMode = 'live' | 'test';
|
|
6
5
|
type TraceRuntime = 'main' | 'renderer' | 'test';
|
|
@@ -73,10 +72,20 @@ declare class TestTracer extends FrameworkTracer {
|
|
|
73
72
|
error(event: TraceInput): void;
|
|
74
73
|
private publish;
|
|
75
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Singleton, not scoped: TraceProvider is injected by singleton and scoped
|
|
77
|
+
* services alike, so it must be safe to capture. It therefore injects no
|
|
78
|
+
* container — delegate tracers resolve through the ACTIVE IoC execution
|
|
79
|
+
* context (D25/D26: method calls on IoC-resolved instances run under their
|
|
80
|
+
* owning environment, so a scope is present whenever the provider is used
|
|
81
|
+
* through the container). Delegates are root-shared Singletons, so any
|
|
82
|
+
* scope of the owning hierarchy resolves the same instances; the last seen
|
|
83
|
+
* scope is kept as a fallback for context-less call sites.
|
|
84
|
+
*/
|
|
76
85
|
declare class TraceProvider extends FrameworkTracer {
|
|
77
86
|
private readonly configuration;
|
|
78
|
-
private
|
|
79
|
-
constructor(configuration: TraceProviderConfiguration
|
|
87
|
+
private lastScope;
|
|
88
|
+
constructor(configuration: TraceProviderConfiguration);
|
|
80
89
|
get mode(): TraceProviderMode;
|
|
81
90
|
get process(): TraceProcess;
|
|
82
91
|
get events$(): Observable<TraceEvent>;
|
|
@@ -9,7 +9,7 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
9
9
|
return result;
|
|
10
10
|
};
|
|
11
11
|
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
-
import { Component, Inject, LoadAs,
|
|
12
|
+
import { Component, Inject, LoadAs, ExecutionContext } from "@noego/ioc";
|
|
13
13
|
import {
|
|
14
14
|
emitRendererTrace,
|
|
15
15
|
getTraceEvents$,
|
|
@@ -212,10 +212,9 @@ TestTracer = __decorateClass([
|
|
|
212
212
|
__decorateParam(0, Inject(TraceProviderConfiguration))
|
|
213
213
|
], TestTracer);
|
|
214
214
|
let TraceProvider = class extends FrameworkTracer {
|
|
215
|
-
constructor(configuration
|
|
215
|
+
constructor(configuration) {
|
|
216
216
|
super();
|
|
217
217
|
this.configuration = configuration;
|
|
218
|
-
this.container = container;
|
|
219
218
|
}
|
|
220
219
|
get mode() {
|
|
221
220
|
return this.resolveImplementation().mode;
|
|
@@ -252,7 +251,21 @@ let TraceProvider = class extends FrameworkTracer {
|
|
|
252
251
|
return this.resolveSync(MainTracer);
|
|
253
252
|
}
|
|
254
253
|
resolveSync(token) {
|
|
255
|
-
|
|
254
|
+
let scope = ExecutionContext.current() ?? this.lastScope;
|
|
255
|
+
if (scope && scope.isDisposed?.()) {
|
|
256
|
+
const root = scope.contextRoot?.();
|
|
257
|
+
const liveRoot = root && !root.isDisposed?.() ? root : void 0;
|
|
258
|
+
if (!liveRoot) return inertTracer();
|
|
259
|
+
scope = liveRoot;
|
|
260
|
+
this.lastScope = scope;
|
|
261
|
+
}
|
|
262
|
+
if (!scope) {
|
|
263
|
+
throw new Error(
|
|
264
|
+
`TraceProvider cannot resolve ${token.name}: no active IoC execution context. Resolve TraceProvider through the container and call it from IoC-managed code.`
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
this.lastScope = scope;
|
|
268
|
+
const resolved = scope.instance(token);
|
|
256
269
|
if (resolved instanceof Promise) {
|
|
257
270
|
throw new Error(`${token.name} must resolve synchronously`);
|
|
258
271
|
}
|
|
@@ -260,10 +273,12 @@ let TraceProvider = class extends FrameworkTracer {
|
|
|
260
273
|
}
|
|
261
274
|
};
|
|
262
275
|
TraceProvider = __decorateClass([
|
|
263
|
-
|
|
264
|
-
__decorateParam(0, Inject(TraceProviderConfiguration))
|
|
265
|
-
__decorateParam(1, Inject(SCOPED_CONTAINER))
|
|
276
|
+
Component({ scope: LoadAs.Singleton }),
|
|
277
|
+
__decorateParam(0, Inject(TraceProviderConfiguration))
|
|
266
278
|
], TraceProvider);
|
|
279
|
+
function inertTracer() {
|
|
280
|
+
return new Proxy({}, { get: () => () => void 0 });
|
|
281
|
+
}
|
|
267
282
|
export {
|
|
268
283
|
FrameworkTracer,
|
|
269
284
|
MainTracer,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tracing/trace_provider.ts"],"sourcesContent":["import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER, type IContainer } from '@noego/ioc';\nimport type { Observable } from 'rxjs';\nimport {\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n registerTraceSink,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n} from './trace_hub.js';\nimport type {\n WoodTraceEventSink,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport type TraceProviderMode = 'live' | 'test';\nexport type TraceRuntime = 'main' | 'renderer' | 'test';\nexport type TraceContext = Partial<TraceInput>;\n\nexport abstract class FrameworkTracer {\n abstract readonly mode: TraceProviderMode;\n abstract readonly process: TraceProcess;\n abstract readonly events$: Observable<TraceEvent>;\n abstract traceAt(level: TraceLevel, event: TraceInput): void;\n abstract debug(event: TraceInput): void;\n abstract info(event: TraceInput): void;\n abstract warn(event: TraceInput): void;\n abstract error(event: TraceInput): void;\n\n registerSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer {\n return registerTraceSink(sink);\n }\n\n extend(context: TraceContext): FrameworkTracer {\n return new ContextualTracer(this, context);\n }\n}\n\nclass ContextualTracer extends FrameworkTracer {\n constructor(\n private readonly parent: FrameworkTracer,\n private readonly context: TraceContext,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.parent.mode;\n }\n\n get process(): TraceProcess {\n return this.parent.process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.parent.events$;\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.parent.traceAt(level, this.mergeEvent(event));\n }\n\n debug(event: TraceInput): void {\n this.parent.debug(this.mergeEvent(event));\n }\n\n info(event: TraceInput): void {\n this.parent.info(this.mergeEvent(event));\n }\n\n warn(event: TraceInput): void {\n this.parent.warn(this.mergeEvent(event));\n }\n\n error(event: TraceInput): void {\n this.parent.error(this.mergeEvent(event));\n }\n\n private mergeEvent(event: TraceInput): TraceInput {\n return {\n ...this.context,\n ...event,\n };\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProviderConfiguration {\n private mode: TraceProviderMode = 'live';\n private runtime: TraceRuntime = 'main';\n private minLevel: TraceLevel = 'debug';\n private enabled: boolean | null = null;\n private databasePath: string | null = null;\n\n configureMode(mode: TraceProviderMode): void {\n this.mode = mode;\n }\n\n /**\n * Point trace persistence at a concrete database file. Injected by the test\n * backend harness (per-test `framework-trace.db`) BEFORE trace services\n * initialize. `null` keeps the production/native persistence path.\n */\n configureDatabasePath(databasePath: string | null): void {\n this.databasePath = databasePath;\n }\n\n getDatabasePath(): string | null {\n return this.databasePath;\n }\n\n configureRuntime(runtime: TraceRuntime): void {\n this.runtime = runtime;\n this.applyRuntimeConfiguration();\n }\n\n configureMinLevel(level: TraceLevel): void {\n this.minLevel = level;\n this.applyRuntimeConfiguration();\n }\n\n configureEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.applyRuntimeConfiguration();\n }\n\n getMode(): TraceProviderMode {\n return this.mode;\n }\n\n getRuntime(): TraceRuntime {\n return this.runtime;\n }\n\n getMinLevel(): TraceLevel {\n return this.minLevel;\n }\n\n getEnabled(): boolean {\n return this.enabled ?? (this.runtime === 'renderer' ? false : true);\n }\n\n private applyRuntimeConfiguration(): void {\n if (this.runtime === 'renderer') {\n setRendererTraceEnabled(this.getEnabled());\n setRendererTraceMinLevel(this.minLevel);\n return;\n }\n\n setMainTraceMinLevel(this.minLevel);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class MainTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'main' as const;\n readonly events$ = getTraceEvents$();\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n publishMainTrace(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class RendererTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'renderer' as const;\n readonly events$ = getTraceEvents$();\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n emitRendererTrace(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TestTracer extends FrameworkTracer {\n readonly mode = 'test' as const;\n readonly events$ = getTraceEvents$();\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get process(): TraceProcess {\n const runtime = this.configuration.getRuntime();\n if (runtime === 'renderer') return 'renderer';\n if (runtime === 'main') return 'main';\n return 'test';\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.publish(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n\n private publish(level: TraceLevel, event: TraceInput): void {\n publishTestTrace(this.process, level, event);\n }\n}\n\n@Provider()\nexport class TraceProvider extends FrameworkTracer {\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n @Inject(SCOPED_CONTAINER) private readonly container: IContainer,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.resolveImplementation().mode;\n }\n\n get process(): TraceProcess {\n return this.resolveImplementation().process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.resolveImplementation().events$;\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.resolveImplementation().traceAt(level, event);\n }\n\n debug(event: TraceInput): void {\n this.resolveImplementation().debug(event);\n }\n\n info(event: TraceInput): void {\n this.resolveImplementation().info(event);\n }\n\n warn(event: TraceInput): void {\n this.resolveImplementation().warn(event);\n }\n\n error(event: TraceInput): void {\n this.resolveImplementation().error(event);\n }\n\n private resolveImplementation(): FrameworkTracer {\n const mode = this.configuration.getMode();\n if (mode === 'test') {\n return this.resolveSync(TestTracer);\n }\n\n if (this.configuration.getRuntime() === 'renderer') {\n return this.resolveSync(RendererTracer);\n }\n\n return this.resolveSync(MainTracer);\n }\n\n private resolveSync<T>(token: new (...args: any[]) => T): T {\n const resolved = this.container.instance<T, true>(token);\n if (resolved instanceof Promise) {\n throw new Error(`${token.name} must resolve synchronously`);\n }\n return resolved;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tracing/trace_provider.ts"],"sourcesContent":["import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER, type IContainer, ExecutionContext } from '@noego/ioc';\nimport type { Observable } from 'rxjs';\nimport {\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n registerTraceSink,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n} from './trace_hub.js';\nimport type {\n WoodTraceEventSink,\n WoodTraceSinkDisposer,\n} from './types/wood_trace_sink.types.js';\n\nexport type TraceProviderMode = 'live' | 'test';\nexport type TraceRuntime = 'main' | 'renderer' | 'test';\nexport type TraceContext = Partial<TraceInput>;\n\nexport abstract class FrameworkTracer {\n abstract readonly mode: TraceProviderMode;\n abstract readonly process: TraceProcess;\n abstract readonly events$: Observable<TraceEvent>;\n abstract traceAt(level: TraceLevel, event: TraceInput): void;\n abstract debug(event: TraceInput): void;\n abstract info(event: TraceInput): void;\n abstract warn(event: TraceInput): void;\n abstract error(event: TraceInput): void;\n\n registerSink(sink: WoodTraceEventSink): WoodTraceSinkDisposer {\n return registerTraceSink(sink);\n }\n\n extend(context: TraceContext): FrameworkTracer {\n return new ContextualTracer(this, context);\n }\n}\n\nclass ContextualTracer extends FrameworkTracer {\n constructor(\n private readonly parent: FrameworkTracer,\n private readonly context: TraceContext,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.parent.mode;\n }\n\n get process(): TraceProcess {\n return this.parent.process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.parent.events$;\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.parent.traceAt(level, this.mergeEvent(event));\n }\n\n debug(event: TraceInput): void {\n this.parent.debug(this.mergeEvent(event));\n }\n\n info(event: TraceInput): void {\n this.parent.info(this.mergeEvent(event));\n }\n\n warn(event: TraceInput): void {\n this.parent.warn(this.mergeEvent(event));\n }\n\n error(event: TraceInput): void {\n this.parent.error(this.mergeEvent(event));\n }\n\n private mergeEvent(event: TraceInput): TraceInput {\n return {\n ...this.context,\n ...event,\n };\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProviderConfiguration {\n private mode: TraceProviderMode = 'live';\n private runtime: TraceRuntime = 'main';\n private minLevel: TraceLevel = 'debug';\n private enabled: boolean | null = null;\n private databasePath: string | null = null;\n\n configureMode(mode: TraceProviderMode): void {\n this.mode = mode;\n }\n\n /**\n * Point trace persistence at a concrete database file. Injected by the test\n * backend harness (per-test `framework-trace.db`) BEFORE trace services\n * initialize. `null` keeps the production/native persistence path.\n */\n configureDatabasePath(databasePath: string | null): void {\n this.databasePath = databasePath;\n }\n\n getDatabasePath(): string | null {\n return this.databasePath;\n }\n\n configureRuntime(runtime: TraceRuntime): void {\n this.runtime = runtime;\n this.applyRuntimeConfiguration();\n }\n\n configureMinLevel(level: TraceLevel): void {\n this.minLevel = level;\n this.applyRuntimeConfiguration();\n }\n\n configureEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.applyRuntimeConfiguration();\n }\n\n getMode(): TraceProviderMode {\n return this.mode;\n }\n\n getRuntime(): TraceRuntime {\n return this.runtime;\n }\n\n getMinLevel(): TraceLevel {\n return this.minLevel;\n }\n\n getEnabled(): boolean {\n return this.enabled ?? (this.runtime === 'renderer' ? false : true);\n }\n\n private applyRuntimeConfiguration(): void {\n if (this.runtime === 'renderer') {\n setRendererTraceEnabled(this.getEnabled());\n setRendererTraceMinLevel(this.minLevel);\n return;\n }\n\n setMainTraceMinLevel(this.minLevel);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class MainTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'main' as const;\n readonly events$ = getTraceEvents$();\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n publishMainTrace(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class RendererTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'renderer' as const;\n readonly events$ = getTraceEvents$();\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n emitRendererTrace(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TestTracer extends FrameworkTracer {\n readonly mode = 'test' as const;\n readonly events$ = getTraceEvents$();\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get process(): TraceProcess {\n const runtime = this.configuration.getRuntime();\n if (runtime === 'renderer') return 'renderer';\n if (runtime === 'main') return 'main';\n return 'test';\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.publish(level, event);\n }\n\n debug(event: TraceInput): void {\n this.traceAt('debug', event);\n }\n\n info(event: TraceInput): void {\n this.traceAt('info', event);\n }\n\n warn(event: TraceInput): void {\n this.traceAt('warn', event);\n }\n\n error(event: TraceInput): void {\n this.traceAt('error', event);\n }\n\n private publish(level: TraceLevel, event: TraceInput): void {\n publishTestTrace(this.process, level, event);\n }\n}\n\n/**\n * Singleton, not scoped: TraceProvider is injected by singleton and scoped\n * services alike, so it must be safe to capture. It therefore injects no\n * container — delegate tracers resolve through the ACTIVE IoC execution\n * context (D25/D26: method calls on IoC-resolved instances run under their\n * owning environment, so a scope is present whenever the provider is used\n * through the container). Delegates are root-shared Singletons, so any\n * scope of the owning hierarchy resolves the same instances; the last seen\n * scope is kept as a fallback for context-less call sites.\n */\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProvider extends FrameworkTracer {\n private lastScope: IContainer | undefined;\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.resolveImplementation().mode;\n }\n\n get process(): TraceProcess {\n return this.resolveImplementation().process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.resolveImplementation().events$;\n }\n\n traceAt(level: TraceLevel, event: TraceInput): void {\n this.resolveImplementation().traceAt(level, event);\n }\n\n debug(event: TraceInput): void {\n this.resolveImplementation().debug(event);\n }\n\n info(event: TraceInput): void {\n this.resolveImplementation().info(event);\n }\n\n warn(event: TraceInput): void {\n this.resolveImplementation().warn(event);\n }\n\n error(event: TraceInput): void {\n this.resolveImplementation().error(event);\n }\n\n private resolveImplementation(): FrameworkTracer {\n const mode = this.configuration.getMode();\n if (mode === 'test') {\n return this.resolveSync(TestTracer);\n }\n\n if (this.configuration.getRuntime() === 'renderer') {\n return this.resolveSync(RendererTracer);\n }\n\n return this.resolveSync(MainTracer);\n }\n\n private resolveSync<T>(token: new (...args: any[]) => T): T {\n let scope: IContainer | undefined = (ExecutionContext.current() as IContainer | undefined) ?? this.lastScope;\n // Fire-and-forget emission can outlive the scope that was active when it\n // was scheduled (a wood operation scope is disposed at dispatch end).\n // Delegate tracers are root-shared Singletons, so degrade to the live\n // hierarchy root rather than re-entering a disposed scope.\n if (scope && (scope as { isDisposed?: () => boolean }).isDisposed?.()) {\n const root = (scope as { contextRoot?: () => IContainer }).contextRoot?.();\n const liveRoot = root && !(root as { isDisposed?: () => boolean }).isDisposed?.() ? root : undefined;\n // The whole hierarchy is gone (environment teardown): emission from a\n // service's own dispose hook is fire-and-forget by design, so it is\n // dropped rather than failing the teardown it is part of.\n if (!liveRoot) return inertTracer<T>();\n scope = liveRoot;\n this.lastScope = scope;\n }\n if (!scope) {\n throw new Error(\n `TraceProvider cannot resolve ${token.name}: no active IoC execution context. ` +\n 'Resolve TraceProvider through the container and call it from IoC-managed code.'\n );\n }\n this.lastScope = scope;\n const resolved = scope.instance<T, true>(token);\n if (resolved instanceof Promise) {\n throw new Error(`${token.name} must resolve synchronously`);\n }\n return resolved;\n }\n}\n\n/** A delegate whose every method is a no-op: emission after the hierarchy is disposed. */\nfunction inertTracer<T>(): T {\n return new Proxy({}, { get: () => () => undefined }) as T;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/tracing/types/wood_trace_batch.types.ts"],"sourcesContent":["import type { MetadataSnapshotLimits } from '@noego/telemetry/core';\nimport type { TraceEvent, TraceInput, TraceLevel } from '../trace_hub.js';\n\nexport type WoodRendererTraceInput = Readonly<\n Omit<TraceInput, 'payload'> & {\n readonly level: TraceLevel;\n readonly payload?: Readonly<Record<string, unknown>>;\n }\n>;\n\nexport type WoodRendererTraceEvent = Readonly<\n Omit<TraceEvent, 'payload'> & {\n readonly payload?: Readonly<Record<string, unknown>>;\n }\n>;\n\nexport type WoodTraceBatch = Readonly<{\n kind: 'wood.trace.batch';\n protocolVersion: 1;\n producerId: string;\n batchId: string;\n sequenceStart: number;\n sequenceEnd: number;\n events: readonly WoodRendererTraceEvent[];\n}>;\n\nexport type WoodTraceBatchAcknowledgement =\n /** The injected receiver's durable terminal committed every event. */\n | Readonly<{\n kind: 'committed';\n batchId: string;\n committedAtMs: number;\n acceptedEvents: number;\n }>\n | Readonly<{\n kind: 'retryable';\n batchId: string;\n reason: string;\n retryAfterMs: number;\n }>\n | Readonly<{\n kind: 'rejected';\n batchId: string;\n reason: string;\n }>;\n\nexport type WoodTraceBatchRuntimeContext = Readonly<{\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n}>;\n\nexport type WoodTraceBatchReceiver = (\n batch: WoodTraceBatch,\n context: WoodTraceBatchRuntimeContext,\n) => Promise<WoodTraceBatchAcknowledgement>;\n\nexport type WoodTraceBatchAdmissionResult =\n | Readonly<{ kind: 'admitted'; sequence: number }>\n | Readonly<{ kind: 'dropped'; sequence: number; reason: 'capacity' | 'closed' }>;\n\nexport type WoodTraceBatchTransportStatus = Readonly<{\n state: 'accepting' | 'draining' | 'stopped';\n producerId: string;\n nextSequence: number;\n queuedEvents: number;\n inFlightBatchId: string | null;\n droppedCapacity: number;\n droppedClosed: number;\n droppedRejected: number;\n droppedRetryExhausted: number;\n metadataTruncatedValues: number;\n metadataRedactedValues: number;\n metadataSerializationFailures: number;\n committedBatches: number;\n retryAttempts: number;\n}>;\n\nexport interface WoodTraceBatchPort {\n postMessage(batch: WoodTraceBatch): void;\n subscribe(listener: (message: unknown) => void): () => void;\n close(): void;\n}\n\nexport type WoodTraceBatchTransportOptions = Readonly<{\n producerId: string;\n maxQueuedEvents: number;\n maxBatchEvents: number;\n acknowledgementTimeoutMs: number;\n retryLimit: number;\n retryBaseDelayMs: number;\n now: () => number;\n schedule: (work: () => void) => void;\n delay: (durationMs: number) => Promise<void>;\n metadataSnapshotLimits?: MetadataSnapshotLimits;\n}>;\n\nexport type WoodTraceBatchParseResult =\n | Readonly<{ kind: 'not-batch' }>\n | Readonly<{ kind: 'invalid'; batchId: string | null; reason: string }>\n | Readonly<{ kind: 'valid'; batch: WoodTraceBatch }>;\n\nexport type WoodTraceAcknowledgementParseResult =\n | Readonly<{ ok: true; acknowledgement: WoodTraceBatchAcknowledgement }>\n | Readonly<{ ok: false; reason: string }>;\n\nexport type WoodTraceEventParseResult =\n | Readonly<{ kind: 'valid'; event: WoodRendererTraceEvent }>\n | Readonly<{ kind: 'invalid'; reason: string }>;\n\nexport type WoodTraceEventsParseResult =\n | Readonly<{ kind: 'valid'; events: readonly WoodRendererTraceEvent[] }>\n | Readonly<{ kind: 'invalid'; reason: string }>;\n\nexport type WoodTraceIdentityValidationResult =\n | Readonly<{ kind: 'valid' }>\n | Readonly<{ kind: 'invalid'; reason: string }>;\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/tracing/types/wood_trace_batch.types.ts"],"sourcesContent":["import type { MetadataSnapshotLimits } from '@noego/telemetry/core';\nimport type { TraceEvent, TraceInput, TraceLevel } from '../trace_hub.js';\n\nexport type WoodRendererTraceInput = Readonly<\n Omit<TraceInput, 'payload'> & {\n readonly level: TraceLevel;\n readonly payload?: Readonly<Record<string, unknown>>;\n /**\n * Hub-admitted identity, present when the renderer TraceHub admitted the\n * event before it reached the transport. The transport preserves these\n * exactly; it stamps its own only for legacy senders that omit them.\n */\n readonly timestamp?: string;\n readonly traceSeq?: number;\n readonly producerId?: string;\n }\n>;\n\nexport type WoodRendererTraceEvent = Readonly<\n Omit<TraceEvent, 'payload'> & {\n readonly payload?: Readonly<Record<string, unknown>>;\n }\n>;\n\nexport type WoodTraceBatch = Readonly<{\n kind: 'wood.trace.batch';\n protocolVersion: 1;\n producerId: string;\n batchId: string;\n sequenceStart: number;\n sequenceEnd: number;\n events: readonly WoodRendererTraceEvent[];\n}>;\n\nexport type WoodTraceBatchAcknowledgement =\n /** The injected receiver's durable terminal committed every event. */\n | Readonly<{\n kind: 'committed';\n batchId: string;\n committedAtMs: number;\n acceptedEvents: number;\n }>\n | Readonly<{\n kind: 'retryable';\n batchId: string;\n reason: string;\n retryAfterMs: number;\n }>\n | Readonly<{\n kind: 'rejected';\n batchId: string;\n reason: string;\n }>;\n\nexport type WoodTraceBatchRuntimeContext = Readonly<{\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n}>;\n\nexport type WoodTraceBatchReceiver = (\n batch: WoodTraceBatch,\n context: WoodTraceBatchRuntimeContext,\n) => Promise<WoodTraceBatchAcknowledgement>;\n\nexport type WoodTraceBatchAdmissionResult =\n | Readonly<{ kind: 'admitted'; sequence: number }>\n | Readonly<{ kind: 'dropped'; sequence: number; reason: 'capacity' | 'closed' }>;\n\nexport type WoodTraceBatchTransportStatus = Readonly<{\n state: 'accepting' | 'draining' | 'stopped';\n producerId: string;\n nextSequence: number;\n queuedEvents: number;\n inFlightBatchId: string | null;\n droppedCapacity: number;\n droppedClosed: number;\n droppedRejected: number;\n droppedRetryExhausted: number;\n /**\n * Count of stamped events whose traceSeq regressed against this transport's\n * sequence stream and were restamped as legacy. Nonzero means more than one\n * admission source is feeding one transport — the invariant is broken.\n */\n identityRestamped: number;\n metadataTruncatedValues: number;\n metadataRedactedValues: number;\n metadataSerializationFailures: number;\n committedBatches: number;\n retryAttempts: number;\n}>;\n\nexport interface WoodTraceBatchPort {\n postMessage(batch: WoodTraceBatch): void;\n subscribe(listener: (message: unknown) => void): () => void;\n close(): void;\n}\n\nexport type WoodTraceBatchTransportOptions = Readonly<{\n producerId: string;\n maxQueuedEvents: number;\n maxBatchEvents: number;\n acknowledgementTimeoutMs: number;\n retryLimit: number;\n retryBaseDelayMs: number;\n now: () => number;\n schedule: (work: () => void) => void;\n delay: (durationMs: number) => Promise<void>;\n metadataSnapshotLimits?: MetadataSnapshotLimits;\n}>;\n\nexport type WoodTraceBatchParseResult =\n | Readonly<{ kind: 'not-batch' }>\n | Readonly<{ kind: 'invalid'; batchId: string | null; reason: string }>\n | Readonly<{ kind: 'valid'; batch: WoodTraceBatch }>;\n\nexport type WoodTraceAcknowledgementParseResult =\n | Readonly<{ ok: true; acknowledgement: WoodTraceBatchAcknowledgement }>\n | Readonly<{ ok: false; reason: string }>;\n\nexport type WoodTraceEventParseResult =\n | Readonly<{ kind: 'valid'; event: WoodRendererTraceEvent }>\n | Readonly<{ kind: 'invalid'; reason: string }>;\n\nexport type WoodTraceEventsParseResult =\n | Readonly<{ kind: 'valid'; events: readonly WoodRendererTraceEvent[] }>\n | Readonly<{ kind: 'invalid'; reason: string }>;\n\nexport type WoodTraceIdentityValidationResult =\n | Readonly<{ kind: 'valid' }>\n | Readonly<{ kind: 'invalid'; reason: string }>;\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|