@noego/wood 0.4.10 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -42
- package/dist/bridge/backend_bridge.cjs.map +1 -1
- package/dist/bridge/backend_bridge.js.map +1 -1
- package/dist/client/index.cjs +78 -21
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +18 -3
- package/dist/client/index.d.ts +18 -3
- package/dist/client/index.js +80 -22
- package/dist/client/index.js.map +1 -1
- package/dist/client/renderer_log_transport.cjs +151 -0
- package/dist/client/renderer_log_transport.cjs.map +1 -0
- package/dist/client/renderer_log_transport.d.cts +54 -0
- package/dist/client/renderer_log_transport.d.ts +54 -0
- package/dist/client/renderer_log_transport.js +123 -0
- package/dist/client/renderer_log_transport.js.map +1 -0
- package/dist/codegen/controller_registration_generator.cjs +13 -2
- package/dist/codegen/controller_registration_generator.cjs.map +1 -1
- package/dist/codegen/controller_registration_generator.d.cts +12 -1
- package/dist/codegen/controller_registration_generator.d.ts +12 -1
- package/dist/codegen/controller_registration_generator.js +10 -1
- package/dist/codegen/controller_registration_generator.js.map +1 -1
- package/dist/codegen/index.d.cts +1 -0
- package/dist/codegen/index.d.ts +1 -0
- package/dist/codegen/preload_generator.cjs +13 -6
- package/dist/codegen/preload_generator.cjs.map +1 -1
- package/dist/codegen/preload_generator.d.cts +11 -2
- package/dist/codegen/preload_generator.d.ts +11 -2
- package/dist/codegen/preload_generator.js +13 -6
- package/dist/codegen/preload_generator.js.map +1 -1
- package/dist/codegen/renderer_app_generator.cjs +78 -42
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +78 -42
- package/dist/codegen/renderer_app_generator.js.map +1 -1
- package/dist/codegen/type_generator.cjs +1 -0
- package/dist/codegen/type_generator.cjs.map +1 -1
- package/dist/codegen/type_generator.js +1 -0
- package/dist/codegen/type_generator.js.map +1 -1
- package/dist/config/config_parser.cjs +95 -4
- package/dist/config/config_parser.cjs.map +1 -1
- package/dist/config/config_parser.d.cts +10 -2
- package/dist/config/config_parser.d.ts +10 -2
- package/dist/config/config_parser.js +92 -3
- package/dist/config/config_parser.js.map +1 -1
- package/dist/config/index.cjs +6 -2
- package/dist/config/index.cjs.map +1 -1
- package/dist/config/index.d.cts +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +8 -2
- package/dist/config/index.js.map +1 -1
- package/dist/controller/controller_resolver.cjs +51 -3
- package/dist/controller/controller_resolver.cjs.map +1 -1
- package/dist/controller/controller_resolver.d.cts +27 -4
- package/dist/controller/controller_resolver.d.ts +27 -4
- package/dist/controller/controller_resolver.js +48 -2
- package/dist/controller/controller_resolver.js.map +1 -1
- package/dist/controller/index.cjs +6 -2
- package/dist/controller/index.cjs.map +1 -1
- package/dist/controller/index.d.cts +1 -1
- package/dist/controller/index.d.ts +1 -1
- package/dist/controller/index.js +4 -2
- package/dist/controller/index.js.map +1 -1
- package/dist/dev/wood_dev_server.cjs +4 -1
- package/dist/dev/wood_dev_server.cjs.map +1 -1
- package/dist/dev/wood_dev_server.js +5 -2
- package/dist/dev/wood_dev_server.js.map +1 -1
- package/dist/dev/yaml_watcher.cjs +1 -1
- package/dist/dev/yaml_watcher.cjs.map +1 -1
- package/dist/dev/yaml_watcher.d.cts +4 -0
- package/dist/dev/yaml_watcher.d.ts +4 -0
- package/dist/dev/yaml_watcher.js +1 -1
- package/dist/dev/yaml_watcher.js.map +1 -1
- package/dist/frontend/frontend_lifecycle.cjs +74 -0
- package/dist/frontend/frontend_lifecycle.cjs.map +1 -0
- package/dist/frontend/frontend_lifecycle.d.cts +50 -0
- package/dist/frontend/frontend_lifecycle.d.ts +50 -0
- package/dist/frontend/frontend_lifecycle.js +50 -0
- package/dist/frontend/frontend_lifecycle.js.map +1 -0
- package/dist/frontend/frontend_page.cjs +122 -0
- package/dist/frontend/frontend_page.cjs.map +1 -0
- package/dist/frontend/frontend_page.d.cts +62 -0
- package/dist/frontend/frontend_page.d.ts +62 -0
- package/dist/frontend/frontend_page.js +98 -0
- package/dist/frontend/frontend_page.js.map +1 -0
- package/dist/frontend/frontend_surface.cjs +249 -0
- package/dist/frontend/frontend_surface.cjs.map +1 -0
- package/dist/frontend/frontend_surface.d.cts +64 -0
- package/dist/frontend/frontend_surface.d.ts +64 -0
- package/dist/frontend/frontend_surface.js +224 -0
- package/dist/frontend/frontend_surface.js.map +1 -0
- package/dist/frontend/index.cjs +52 -0
- package/dist/frontend/index.cjs.map +1 -0
- package/dist/frontend/index.d.cts +10 -0
- package/dist/frontend/index.d.ts +10 -0
- package/dist/frontend/index.js +19 -0
- package/dist/frontend/index.js.map +1 -0
- package/dist/frontend/page_catalog.cjs +135 -0
- package/dist/frontend/page_catalog.cjs.map +1 -0
- package/dist/frontend/page_catalog.d.cts +56 -0
- package/dist/frontend/page_catalog.d.ts +56 -0
- package/dist/frontend/page_catalog.js +108 -0
- package/dist/frontend/page_catalog.js.map +1 -0
- package/dist/frontend/tracked_transport.cjs +55 -0
- package/dist/frontend/tracked_transport.cjs.map +1 -0
- package/dist/frontend/tracked_transport.d.cts +36 -0
- package/dist/frontend/tracked_transport.d.ts +36 -0
- package/dist/frontend/tracked_transport.js +31 -0
- package/dist/frontend/tracked_transport.js.map +1 -0
- package/dist/frontend/work_registry.cjs +153 -0
- package/dist/frontend/work_registry.cjs.map +1 -0
- package/dist/frontend/work_registry.d.cts +70 -0
- package/dist/frontend/work_registry.d.ts +70 -0
- package/dist/frontend/work_registry.js +128 -0
- package/dist/frontend/work_registry.js.map +1 -0
- package/dist/index.cjs +24 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -7
- package/dist/index.d.ts +10 -7
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/main/index.cjs +10 -0
- package/dist/main/index.cjs.map +1 -1
- package/dist/main/index.d.cts +14 -2
- package/dist/main/index.d.ts +14 -2
- package/dist/main/index.js +16 -0
- package/dist/main/index.js.map +1 -1
- package/dist/middleware/middleware_resolver.cjs +22 -1
- package/dist/middleware/middleware_resolver.cjs.map +1 -1
- package/dist/middleware/middleware_resolver.d.cts +13 -1
- package/dist/middleware/middleware_resolver.d.ts +13 -1
- package/dist/middleware/middleware_resolver.js +22 -1
- package/dist/middleware/middleware_resolver.js.map +1 -1
- package/dist/navigation/index.cjs +3 -0
- package/dist/navigation/index.cjs.map +1 -1
- package/dist/navigation/index.d.cts +25 -1
- package/dist/navigation/index.d.ts +25 -1
- package/dist/navigation/index.js +2 -0
- package/dist/navigation/index.js.map +1 -1
- package/dist/{middleware/__fixtures__/middleware/auth.cjs → navigation/layout_preservation.cjs} +18 -20
- package/dist/navigation/layout_preservation.cjs.map +1 -0
- package/dist/navigation/layout_preservation.d.cts +2 -0
- package/dist/navigation/layout_preservation.d.ts +2 -0
- package/dist/navigation/layout_preservation.js +18 -0
- package/dist/navigation/layout_preservation.js.map +1 -0
- package/dist/parser/index.cjs +2 -0
- package/dist/parser/index.cjs.map +1 -1
- package/dist/parser/index.d.cts +1 -1
- package/dist/parser/index.d.ts +1 -1
- package/dist/parser/index.js +2 -1
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/operations_parser.cjs +6 -0
- package/dist/parser/operations_parser.cjs.map +1 -1
- package/dist/parser/operations_parser.d.cts +9 -2
- package/dist/parser/operations_parser.d.ts +9 -2
- package/dist/parser/operations_parser.js +5 -0
- package/dist/parser/operations_parser.js.map +1 -1
- package/dist/parser/views_parser.cjs.map +1 -1
- package/dist/parser/views_parser.js.map +1 -1
- package/dist/router/index.d.cts +1 -0
- package/dist/router/index.d.ts +1 -0
- package/dist/router/wood_router.cjs +35 -3
- package/dist/router/wood_router.cjs.map +1 -1
- package/dist/router/wood_router.d.cts +15 -0
- package/dist/router/wood_router.d.ts +15 -0
- package/dist/router/wood_router.js +36 -4
- package/dist/router/wood_router.js.map +1 -1
- package/dist/runtime/get_container.cjs +9 -34
- package/dist/runtime/get_container.cjs.map +1 -1
- package/dist/runtime/get_container.d.cts +24 -4
- package/dist/runtime/get_container.d.ts +24 -4
- package/dist/runtime/get_container.js +8 -23
- package/dist/runtime/get_container.js.map +1 -1
- package/dist/runtime/index.cjs +9 -0
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +5 -2
- package/dist/runtime/index.d.ts +5 -2
- package/dist/runtime/index.js +10 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderer_config_extension.cjs +50 -0
- package/dist/runtime/renderer_config_extension.cjs.map +1 -0
- package/dist/runtime/renderer_config_extension.d.cts +19 -0
- package/dist/runtime/renderer_config_extension.d.ts +19 -0
- package/dist/runtime/renderer_config_extension.js +24 -0
- package/dist/runtime/renderer_config_extension.js.map +1 -0
- package/dist/runtime/renderer_log_batch_receiver.cjs +73 -0
- package/dist/runtime/renderer_log_batch_receiver.cjs.map +1 -0
- package/dist/runtime/renderer_log_batch_receiver.d.cts +29 -0
- package/dist/runtime/renderer_log_batch_receiver.d.ts +29 -0
- package/dist/runtime/renderer_log_batch_receiver.js +48 -0
- package/dist/runtime/renderer_log_batch_receiver.js.map +1 -0
- package/dist/runtime/renderer_trace_batch_receiver_registry.d.cts +1 -1
- package/dist/runtime/renderer_trace_batch_receiver_registry.d.ts +1 -1
- package/dist/runtime/runtime.cjs +14 -0
- package/dist/runtime/runtime.cjs.map +1 -1
- package/dist/runtime/runtime.d.cts +2 -1
- package/dist/runtime/runtime.d.ts +2 -1
- package/dist/runtime/runtime.js +14 -0
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/stick/index.cjs.map +1 -1
- package/dist/stick/index.js.map +1 -1
- package/dist/testing/browser.cjs +104 -23
- package/dist/testing/browser.cjs.map +1 -1
- package/dist/testing/browser.d.cts +8 -3
- package/dist/testing/browser.d.ts +8 -3
- package/dist/testing/browser.js +102 -22
- package/dist/testing/browser.js.map +1 -1
- package/dist/testing/create_controller_harness.cjs +28 -8
- package/dist/testing/create_controller_harness.cjs.map +1 -1
- package/dist/testing/create_controller_harness.d.cts +17 -2
- package/dist/testing/create_controller_harness.d.ts +17 -2
- package/dist/testing/create_controller_harness.js +28 -8
- package/dist/testing/create_controller_harness.js.map +1 -1
- package/dist/testing/create_router_bridge.d.cts +1 -0
- package/dist/testing/create_router_bridge.d.ts +1 -0
- package/dist/testing/create_test_router.d.cts +1 -0
- package/dist/testing/create_test_router.d.ts +1 -0
- package/dist/testing/index.cjs +31 -0
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +20 -5
- package/dist/testing/index.d.ts +20 -5
- package/dist/testing/index.js +19 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/{controller/__fixtures__/controllers/not_a_class.cjs → testing/test_wood.cjs} +15 -7
- package/dist/testing/test_wood.cjs.map +1 -0
- package/dist/testing/test_wood.d.cts +16 -0
- package/dist/testing/test_wood.d.ts +16 -0
- package/dist/testing/test_wood.js +12 -0
- package/dist/testing/test_wood.js.map +1 -0
- package/dist/testing/test_wood_config.cjs +272 -0
- package/dist/testing/test_wood_config.cjs.map +1 -0
- package/dist/testing/test_wood_config.d.cts +111 -0
- package/dist/testing/test_wood_config.d.ts +111 -0
- package/dist/testing/test_wood_config.js +247 -0
- package/dist/testing/test_wood_config.js.map +1 -0
- package/dist/testing/wood_config_source.cjs +146 -0
- package/dist/testing/wood_config_source.cjs.map +1 -0
- package/dist/testing/wood_config_source.d.cts +36 -0
- package/dist/testing/wood_config_source.d.ts +36 -0
- package/dist/testing/wood_config_source.js +112 -0
- package/dist/testing/wood_config_source.js.map +1 -0
- package/dist/testing/wood_env_renderer.cjs +210 -0
- package/dist/testing/wood_env_renderer.cjs.map +1 -0
- package/dist/testing/wood_env_renderer.d.cts +74 -0
- package/dist/testing/wood_env_renderer.d.ts +74 -0
- package/dist/testing/wood_env_renderer.js +188 -0
- package/dist/testing/wood_env_renderer.js.map +1 -0
- package/dist/testing/wood_test_selection.cjs +94 -0
- package/dist/testing/wood_test_selection.cjs.map +1 -0
- package/dist/testing/wood_test_selection.d.cts +39 -0
- package/dist/testing/wood_test_selection.d.ts +39 -0
- package/dist/testing/wood_test_selection.js +68 -0
- package/dist/testing/wood_test_selection.js.map +1 -0
- package/dist/trace-testing/index.d.cts +1 -2
- package/dist/trace-testing/index.d.ts +1 -2
- package/dist/trace-testing/trace_recorder.cjs +1 -1
- package/dist/trace-testing/trace_recorder.cjs.map +1 -1
- package/dist/trace-testing/trace_recorder.d.cts +1 -2
- package/dist/trace-testing/trace_recorder.d.ts +1 -2
- package/dist/trace-testing/trace_recorder.js +1 -1
- package/dist/trace-testing/trace_recorder.js.map +1 -1
- package/dist/trace-transport/index.d.cts +1 -1
- package/dist/trace-transport/index.d.ts +1 -1
- package/dist/{trace_hub-Cob54qRx.d.cts → trace_hub-Cpo_nVze.d.cts} +21 -1
- package/dist/{trace_hub-Cob54qRx.d.ts → trace_hub-Cpo_nVze.d.ts} +21 -1
- package/dist/tracing/index.cjs +9 -2
- package/dist/tracing/index.cjs.map +1 -1
- package/dist/tracing/index.d.cts +3 -2
- package/dist/tracing/index.d.ts +3 -2
- package/dist/tracing/index.js +7 -1
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/renderer_trace_batch_host.d.cts +1 -1
- package/dist/tracing/renderer_trace_batch_host.d.ts +1 -1
- package/dist/tracing/renderer_trace_batch_transport.cjs +48 -6
- package/dist/tracing/renderer_trace_batch_transport.cjs.map +1 -1
- package/dist/tracing/renderer_trace_batch_transport.d.cts +17 -1
- package/dist/tracing/renderer_trace_batch_transport.d.ts +17 -1
- package/dist/tracing/renderer_trace_batch_transport.js +48 -6
- package/dist/tracing/renderer_trace_batch_transport.js.map +1 -1
- package/dist/tracing/trace_batch_adapter.cjs +110 -0
- package/dist/tracing/trace_batch_adapter.cjs.map +1 -0
- package/dist/tracing/trace_batch_adapter.d.cts +36 -0
- package/dist/tracing/trace_batch_adapter.d.ts +36 -0
- package/dist/tracing/trace_batch_adapter.js +86 -0
- package/dist/tracing/trace_batch_adapter.js.map +1 -0
- package/dist/tracing/trace_commit_writer.d.cts +1 -1
- package/dist/tracing/trace_commit_writer.d.ts +1 -1
- package/dist/tracing/trace_hub.cjs +87 -20
- package/dist/tracing/trace_hub.cjs.map +1 -1
- package/dist/tracing/trace_hub.d.cts +1 -1
- package/dist/tracing/trace_hub.d.ts +1 -1
- package/dist/tracing/trace_hub.js +85 -20
- package/dist/tracing/trace_hub.js.map +1 -1
- package/dist/tracing/trace_provider.cjs +21 -6
- package/dist/tracing/trace_provider.cjs.map +1 -1
- package/dist/tracing/trace_provider.d.cts +13 -4
- package/dist/tracing/trace_provider.d.ts +13 -4
- package/dist/tracing/trace_provider.js +22 -7
- package/dist/tracing/trace_provider.js.map +1 -1
- package/dist/tracing/types/wood_trace_batch.types.cjs.map +1 -1
- package/dist/tracing/types/wood_trace_batch.types.d.cts +15 -1
- package/dist/tracing/types/wood_trace_batch.types.d.ts +15 -1
- package/dist/tracing/types/wood_trace_sink.types.d.cts +1 -1
- package/dist/tracing/types/wood_trace_sink.types.d.ts +1 -1
- package/dist/tracing/wood_trace_batch_contract.cjs +2 -0
- package/dist/tracing/wood_trace_batch_contract.cjs.map +1 -1
- package/dist/tracing/wood_trace_batch_contract.d.cts +1 -1
- package/dist/tracing/wood_trace_batch_contract.d.ts +1 -1
- package/dist/tracing/wood_trace_batch_contract.js +2 -0
- package/dist/tracing/wood_trace_batch_contract.js.map +1 -1
- package/dist/transport/build_transport_bridge.cjs +4 -2
- package/dist/transport/build_transport_bridge.cjs.map +1 -1
- package/dist/transport/build_transport_bridge.d.cts +7 -1
- package/dist/transport/build_transport_bridge.d.ts +7 -1
- package/dist/transport/build_transport_bridge.js +2 -1
- package/dist/transport/build_transport_bridge.js.map +1 -1
- package/dist/transport/in_process_router_transport.d.cts +1 -0
- package/dist/transport/in_process_router_transport.d.ts +1 -0
- package/dist/transport/index.d.cts +1 -0
- package/dist/transport/index.d.ts +1 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.cts +47 -1
- package/dist/types/config.d.ts +47 -1
- package/dist/types/context.cjs +12 -0
- package/dist/types/context.cjs.map +1 -1
- package/dist/types/context.d.cts +27 -1
- package/dist/types/context.d.ts +27 -1
- package/dist/types/context.js +4 -0
- package/dist/types/context.js.map +1 -1
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.cts +2 -0
- package/dist/types/operations.d.ts +2 -0
- package/docs/axe.md +706 -0
- package/package.json +13 -5
- package/src/components/NavigationShell.scopes.browser.test.ts +363 -0
- package/src/components/NavigationShell.svelte +126 -49
- package/dist/controller/__fixtures__/controllers/chat.cjs +0 -32
- package/dist/controller/__fixtures__/controllers/chat.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/chat.d.cts +0 -11
- package/dist/controller/__fixtures__/controllers/chat.d.ts +0 -11
- package/dist/controller/__fixtures__/controllers/chat.js +0 -12
- package/dist/controller/__fixtures__/controllers/chat.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/not_a_class.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/not_a_class.d.cts +0 -3
- package/dist/controller/__fixtures__/controllers/not_a_class.d.ts +0 -3
- package/dist/controller/__fixtures__/controllers/not_a_class.js +0 -5
- package/dist/controller/__fixtures__/controllers/not_a_class.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs +0 -32
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/settings.controller.d.cts +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.d.ts +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.js +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/test.cjs +0 -29
- package/dist/controller/__fixtures__/controllers/test.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/test.d.cts +0 -7
- package/dist/controller/__fixtures__/controllers/test.d.ts +0 -7
- package/dist/controller/__fixtures__/controllers/test.js +0 -9
- package/dist/controller/__fixtures__/controllers/test.js.map +0 -1
- package/dist/loader/__fixtures__/layouts/app.load.cjs +0 -27
- package/dist/loader/__fixtures__/layouts/app.load.cjs.map +0 -1
- package/dist/loader/__fixtures__/layouts/app.load.d.cts +0 -5
- package/dist/loader/__fixtures__/layouts/app.load.d.ts +0 -5
- package/dist/loader/__fixtures__/layouts/app.load.js +0 -7
- package/dist/loader/__fixtures__/layouts/app.load.js.map +0 -1
- package/dist/loader/__fixtures__/views/test/page.load.cjs +0 -27
- package/dist/loader/__fixtures__/views/test/page.load.cjs.map +0 -1
- package/dist/loader/__fixtures__/views/test/page.load.d.cts +0 -6
- package/dist/loader/__fixtures__/views/test/page.load.d.ts +0 -6
- package/dist/loader/__fixtures__/views/test/page.load.js +0 -7
- package/dist/loader/__fixtures__/views/test/page.load.js.map +0 -1
- package/dist/middleware/__fixtures__/middleware/auth.cjs.map +0 -1
- package/dist/middleware/__fixtures__/middleware/auth.d.cts +0 -6
- package/dist/middleware/__fixtures__/middleware/auth.d.ts +0 -6
- package/dist/middleware/__fixtures__/middleware/auth.js +0 -19
- package/dist/middleware/__fixtures__/middleware/auth.js.map +0 -1
- package/dist/middleware/__fixtures__/middleware/sequence.cjs +0 -47
- package/dist/middleware/__fixtures__/middleware/sequence.cjs.map +0 -1
- package/dist/middleware/__fixtures__/middleware/sequence.d.cts +0 -7
- package/dist/middleware/__fixtures__/middleware/sequence.d.ts +0 -7
- package/dist/middleware/__fixtures__/middleware/sequence.js +0 -21
- package/dist/middleware/__fixtures__/middleware/sequence.js.map +0 -1
|
@@ -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":[]}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { MetadataSnapshotLimits } from '@noego/telemetry/core';
|
|
2
|
-
import { a as TraceEvent, b as TraceInput, c as TraceLevel } from '../../trace_hub-
|
|
2
|
+
import { a as TraceEvent, b as TraceInput, c as TraceLevel } from '../../trace_hub-Cpo_nVze.cjs';
|
|
3
3
|
import 'rxjs';
|
|
4
4
|
|
|
5
5
|
type WoodRendererTraceInput = Readonly<Omit<TraceInput, 'payload'> & {
|
|
6
6
|
readonly level: TraceLevel;
|
|
7
7
|
readonly payload?: Readonly<Record<string, unknown>>;
|
|
8
|
+
/**
|
|
9
|
+
* Hub-admitted identity, present when the renderer TraceHub admitted the
|
|
10
|
+
* event before it reached the transport. The transport preserves these
|
|
11
|
+
* exactly; it stamps its own only for legacy senders that omit them.
|
|
12
|
+
*/
|
|
13
|
+
readonly timestamp?: string;
|
|
14
|
+
readonly traceSeq?: number;
|
|
15
|
+
readonly producerId?: string;
|
|
8
16
|
}>;
|
|
9
17
|
type WoodRendererTraceEvent = Readonly<Omit<TraceEvent, 'payload'> & {
|
|
10
18
|
readonly payload?: Readonly<Record<string, unknown>>;
|
|
@@ -60,6 +68,12 @@ type WoodTraceBatchTransportStatus = Readonly<{
|
|
|
60
68
|
droppedClosed: number;
|
|
61
69
|
droppedRejected: number;
|
|
62
70
|
droppedRetryExhausted: number;
|
|
71
|
+
/**
|
|
72
|
+
* Count of stamped events whose traceSeq regressed against this transport's
|
|
73
|
+
* sequence stream and were restamped as legacy. Nonzero means more than one
|
|
74
|
+
* admission source is feeding one transport — the invariant is broken.
|
|
75
|
+
*/
|
|
76
|
+
identityRestamped: number;
|
|
63
77
|
metadataTruncatedValues: number;
|
|
64
78
|
metadataRedactedValues: number;
|
|
65
79
|
metadataSerializationFailures: number;
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { MetadataSnapshotLimits } from '@noego/telemetry/core';
|
|
2
|
-
import { a as TraceEvent, b as TraceInput, c as TraceLevel } from '../../trace_hub-
|
|
2
|
+
import { a as TraceEvent, b as TraceInput, c as TraceLevel } from '../../trace_hub-Cpo_nVze.js';
|
|
3
3
|
import 'rxjs';
|
|
4
4
|
|
|
5
5
|
type WoodRendererTraceInput = Readonly<Omit<TraceInput, 'payload'> & {
|
|
6
6
|
readonly level: TraceLevel;
|
|
7
7
|
readonly payload?: Readonly<Record<string, unknown>>;
|
|
8
|
+
/**
|
|
9
|
+
* Hub-admitted identity, present when the renderer TraceHub admitted the
|
|
10
|
+
* event before it reached the transport. The transport preserves these
|
|
11
|
+
* exactly; it stamps its own only for legacy senders that omit them.
|
|
12
|
+
*/
|
|
13
|
+
readonly timestamp?: string;
|
|
14
|
+
readonly traceSeq?: number;
|
|
15
|
+
readonly producerId?: string;
|
|
8
16
|
}>;
|
|
9
17
|
type WoodRendererTraceEvent = Readonly<Omit<TraceEvent, 'payload'> & {
|
|
10
18
|
readonly payload?: Readonly<Record<string, unknown>>;
|
|
@@ -60,6 +68,12 @@ type WoodTraceBatchTransportStatus = Readonly<{
|
|
|
60
68
|
droppedClosed: number;
|
|
61
69
|
droppedRejected: number;
|
|
62
70
|
droppedRetryExhausted: number;
|
|
71
|
+
/**
|
|
72
|
+
* Count of stamped events whose traceSeq regressed against this transport's
|
|
73
|
+
* sequence stream and were restamped as legacy. Nonzero means more than one
|
|
74
|
+
* admission source is feeding one transport — the invariant is broken.
|
|
75
|
+
*/
|
|
76
|
+
identityRestamped: number;
|
|
63
77
|
metadataTruncatedValues: number;
|
|
64
78
|
metadataRedactedValues: number;
|
|
65
79
|
metadataSerializationFailures: number;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { W as WoodTraceEventSink, g as WoodTraceEventSnapshot, h as WoodTraceSinkDisposer } from '../../trace_hub-
|
|
1
|
+
export { W as WoodTraceEventSink, g as WoodTraceEventSnapshot, h as WoodTraceSinkDisposer } from '../../trace_hub-Cpo_nVze.cjs';
|
|
2
2
|
import 'rxjs';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { W as WoodTraceEventSink, g as WoodTraceEventSnapshot, h as WoodTraceSinkDisposer } from '../../trace_hub-
|
|
1
|
+
export { W as WoodTraceEventSink, g as WoodTraceEventSnapshot, h as WoodTraceSinkDisposer } from '../../trace_hub-Cpo_nVze.js';
|
|
2
2
|
import 'rxjs';
|
|
@@ -153,6 +153,8 @@ class WoodTraceBatchContract {
|
|
|
153
153
|
process: "renderer",
|
|
154
154
|
timestamp: input.timestamp,
|
|
155
155
|
traceSeq: input.traceSeq,
|
|
156
|
+
// Durable identity passthrough: never a validation failure when absent.
|
|
157
|
+
...typeof input.producerId === "string" && input.producerId.trim().length > 0 ? { producerId: input.producerId } : {},
|
|
156
158
|
...typeof input.message === "string" ? { message: input.message } : {},
|
|
157
159
|
...this.isConversationId(input.conversationId) ? { conversationId: input.conversationId } : {},
|
|
158
160
|
...input.payload ? { payload: input.payload } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tracing/wood_trace_batch_contract.ts"],"sourcesContent":["import type {\n WoodRendererTraceEvent,\n WoodTraceAcknowledgementParseResult,\n WoodTraceBatch,\n WoodTraceBatchAcknowledgement,\n WoodTraceBatchParseResult,\n WoodTraceEventParseResult,\n WoodTraceEventsParseResult,\n WoodTraceIdentityValidationResult,\n} from './types/wood_trace_batch.types.js';\n\nconst MAX_BATCH_EVENTS = 256;\n\nexport class WoodTraceBatchContract {\n create(\n producerId: string,\n sequenceStart: number,\n events: readonly WoodRendererTraceEvent[],\n ): WoodTraceBatch {\n const snapshots = events.map((event) => this.snapshotEvent(event));\n const last = snapshots[snapshots.length - 1];\n const sequenceEnd = last ? last.traceSeq - 1 : sequenceStart - 1;\n return Object.freeze({\n kind: 'wood.trace.batch',\n protocolVersion: 1,\n producerId,\n batchId: `wtb1:${producerId}:${sequenceStart}-${sequenceEnd}`,\n sequenceStart,\n sequenceEnd,\n events: Object.freeze(snapshots),\n });\n }\n\n parse(input: unknown): WoodTraceBatchParseResult {\n if (!this.isRecord(input) || input.kind !== 'wood.trace.batch') {\n return { kind: 'not-batch' };\n }\n\n const batchId = typeof input.batchId === 'string' ? input.batchId : null;\n const identity = this.validateIdentity(input);\n if (identity.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: identity.reason };\n }\n const producerId = input.producerId;\n if (typeof producerId !== 'string') {\n return { kind: 'invalid', batchId, reason: 'Trace batch producer identity is invalid' };\n }\n\n const parsedEvents = this.parseEvents(input.events);\n if (parsedEvents.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: parsedEvents.reason };\n }\n const events = parsedEvents.events;\n\n const parsedSequenceRange = this.parseSequenceRange(input, events);\n if (parsedSequenceRange.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: parsedSequenceRange.reason };\n }\n const { sequenceStart, sequenceEnd } = parsedSequenceRange;\n const hasTraceSequenceMismatch = events.some((event, index) => {\n const previous = events[index - 1];\n return previous !== undefined && event.traceSeq <= previous.traceSeq;\n });\n if (hasTraceSequenceMismatch) {\n return { kind: 'invalid', batchId, reason: 'Trace event sequences are not strictly increasing' };\n }\n const expectedBatchId = `wtb1:${producerId}:${sequenceStart}-${sequenceEnd}`;\n if (input.batchId !== expectedBatchId) {\n return { kind: 'invalid', batchId, reason: 'Trace batch identity does not match its sequence range' };\n }\n\n return {\n kind: 'valid',\n batch: this.create(producerId, sequenceStart, events),\n };\n }\n\n parseAcknowledgement(input: unknown): WoodTraceAcknowledgementParseResult {\n if (!this.isRecord(input) || typeof input.kind !== 'string' || typeof input.batchId !== 'string') {\n return { ok: false, reason: 'Trace batch acknowledgement framing is invalid' };\n }\n\n if (input.kind === 'committed') {\n return this.parseCommittedAcknowledgement(input);\n }\n if (input.kind === 'retryable') {\n return this.parseRetryableAcknowledgement(input);\n }\n if (input.kind === 'rejected' && typeof input.reason === 'string') {\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'rejected',\n batchId: input.batchId,\n reason: input.reason,\n }),\n };\n }\n return { ok: false, reason: 'Trace batch acknowledgement kind is invalid' };\n }\n\n private parseCommittedAcknowledgement(\n input: Record<string, unknown>,\n ): WoodTraceAcknowledgementParseResult {\n const batchId = input.batchId;\n const committedAtMs = input.committedAtMs;\n const acceptedEvents = input.acceptedEvents;\n const validNumbers = typeof batchId === 'string'\n && typeof committedAtMs === 'number'\n && Number.isFinite(committedAtMs)\n && typeof acceptedEvents === 'number'\n && Number.isSafeInteger(acceptedEvents)\n && acceptedEvents >= 0;\n if (!validNumbers) {\n return { ok: false, reason: 'Committed trace acknowledgement is invalid' };\n }\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'committed',\n batchId,\n committedAtMs,\n acceptedEvents,\n }),\n };\n }\n\n private parseRetryableAcknowledgement(\n input: Record<string, unknown>,\n ): WoodTraceAcknowledgementParseResult {\n const batchId = input.batchId;\n const retryAfterMs = input.retryAfterMs;\n if (typeof batchId !== 'string'\n || typeof input.reason !== 'string'\n || typeof retryAfterMs !== 'number'\n || !Number.isFinite(retryAfterMs)\n || retryAfterMs < 0) {\n return { ok: false, reason: 'Retryable trace acknowledgement is invalid' };\n }\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'retryable',\n batchId,\n reason: input.reason,\n retryAfterMs,\n }),\n };\n }\n\n private parseEvent(input: unknown): WoodTraceEventParseResult {\n if (!this.isRecord(input)) {\n return { kind: 'invalid', reason: 'Trace event is not an object' };\n }\n const hasValidIdentity = this.hasValidEventIdentity(input);\n const hasValidTiming = this.hasValidEventTiming(input);\n if (!hasValidIdentity || !hasValidTiming) {\n return { kind: 'invalid', reason: 'Trace event identity or timing is invalid' };\n }\n if (input.payload !== undefined && !this.isRecord(input.payload)) {\n return { kind: 'invalid', reason: 'Trace event payload is invalid' };\n }\n return {\n kind: 'valid',\n event: this.snapshotEvent({\n source: input.source,\n type: input.type,\n level: input.level,\n process: 'renderer',\n timestamp: input.timestamp,\n traceSeq: input.traceSeq,\n ...(typeof input.message === 'string' ? { message: input.message } : {}),\n ...(this.isConversationId(input.conversationId) ? { conversationId: input.conversationId } : {}),\n ...(input.payload ? { payload: input.payload } : {}),\n ...(typeof input.windowId === 'string' ? { windowId: input.windowId } : {}),\n ...(typeof input.webContentsId === 'number' && Number.isFinite(input.webContentsId)\n ? { webContentsId: input.webContentsId }\n : {}),\n ...(typeof input.routeKey === 'string' ? { routeKey: input.routeKey } : {}),\n ...(typeof input.harnessId === 'string' ? { harnessId: input.harnessId } : {}),\n }),\n };\n }\n\n private hasValidEventIdentity(input: Record<string, unknown>): input is Record<string, unknown> & {\n source: string;\n type: string;\n level: string;\n process: 'renderer';\n } {\n return typeof input.source === 'string'\n && input.source.trim().length > 0\n && typeof input.type === 'string'\n && input.type.trim().length > 0\n && typeof input.level === 'string'\n && input.level.trim().length > 0\n && input.process === 'renderer';\n }\n\n private hasValidEventTiming(input: Record<string, unknown>): input is Record<string, unknown> & {\n timestamp: string;\n traceSeq: number;\n } {\n return typeof input.timestamp === 'string'\n && Number.isFinite(Date.parse(input.timestamp))\n && typeof input.traceSeq === 'number'\n && Number.isSafeInteger(input.traceSeq)\n && input.traceSeq >= 1;\n }\n\n private parseEvents(input: unknown): WoodTraceEventsParseResult {\n if (!Array.isArray(input) || input.length === 0 || input.length > MAX_BATCH_EVENTS) {\n return { kind: 'invalid', reason: 'Trace batch events are invalid' };\n }\n const events: WoodRendererTraceEvent[] = [];\n for (const rawEvent of input) {\n const parsedEvent = this.parseEvent(rawEvent);\n if (parsedEvent.kind === 'invalid') {\n return parsedEvent;\n }\n events.push(parsedEvent.event);\n }\n return { kind: 'valid', events: Object.freeze(events) };\n }\n\n private parseSequenceRange(\n input: Record<string, unknown>,\n events: readonly WoodRendererTraceEvent[],\n ): { kind: 'invalid'; reason: string } | { kind: 'valid'; sequenceStart: number; sequenceEnd: number } {\n const sequenceStart = input.sequenceStart;\n const sequenceEnd = input.sequenceEnd;\n if (typeof sequenceStart !== 'number' || typeof sequenceEnd !== 'number') {\n return { kind: 'invalid', reason: 'Trace batch sequence range is invalid' };\n }\n const firstEvent = events[0];\n const lastEvent = events[events.length - 1];\n const hasInvalidRange = !Number.isSafeInteger(sequenceStart)\n || sequenceStart < 0\n || !Number.isSafeInteger(sequenceEnd)\n || !firstEvent\n || !lastEvent\n || firstEvent.traceSeq !== sequenceStart + 1\n || lastEvent.traceSeq !== sequenceEnd + 1;\n if (hasInvalidRange) {\n return { kind: 'invalid', reason: 'Trace batch sequence range does not match its events' };\n }\n return { kind: 'valid', sequenceStart, sequenceEnd };\n }\n\n private snapshotEvent(event: WoodRendererTraceEvent): WoodRendererTraceEvent {\n return Object.freeze({\n ...event,\n ...(event.payload ? { payload: Object.freeze({ ...event.payload }) } : {}),\n });\n }\n\n private validateIdentity(input: Record<string, unknown>): WoodTraceIdentityValidationResult {\n if (input.protocolVersion !== 1) {\n return { kind: 'invalid', reason: 'Trace batch protocol version is unsupported' };\n }\n if (typeof input.producerId !== 'string' || input.producerId.trim().length === 0) {\n return { kind: 'invalid', reason: 'Trace batch producer identity is invalid' };\n }\n if (typeof input.batchId !== 'string' || input.batchId.trim().length === 0) {\n return { kind: 'invalid', reason: 'Trace batch identity is invalid' };\n }\n return { kind: 'valid' };\n }\n\n private isConversationId(value: unknown): value is string | number {\n return typeof value === 'string' || (typeof value === 'number' && Number.isFinite(value));\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tracing/wood_trace_batch_contract.ts"],"sourcesContent":["import type {\n WoodRendererTraceEvent,\n WoodTraceAcknowledgementParseResult,\n WoodTraceBatch,\n WoodTraceBatchAcknowledgement,\n WoodTraceBatchParseResult,\n WoodTraceEventParseResult,\n WoodTraceEventsParseResult,\n WoodTraceIdentityValidationResult,\n} from './types/wood_trace_batch.types.js';\n\nconst MAX_BATCH_EVENTS = 256;\n\nexport class WoodTraceBatchContract {\n create(\n producerId: string,\n sequenceStart: number,\n events: readonly WoodRendererTraceEvent[],\n ): WoodTraceBatch {\n const snapshots = events.map((event) => this.snapshotEvent(event));\n const last = snapshots[snapshots.length - 1];\n const sequenceEnd = last ? last.traceSeq - 1 : sequenceStart - 1;\n return Object.freeze({\n kind: 'wood.trace.batch',\n protocolVersion: 1,\n producerId,\n batchId: `wtb1:${producerId}:${sequenceStart}-${sequenceEnd}`,\n sequenceStart,\n sequenceEnd,\n events: Object.freeze(snapshots),\n });\n }\n\n parse(input: unknown): WoodTraceBatchParseResult {\n if (!this.isRecord(input) || input.kind !== 'wood.trace.batch') {\n return { kind: 'not-batch' };\n }\n\n const batchId = typeof input.batchId === 'string' ? input.batchId : null;\n const identity = this.validateIdentity(input);\n if (identity.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: identity.reason };\n }\n const producerId = input.producerId;\n if (typeof producerId !== 'string') {\n return { kind: 'invalid', batchId, reason: 'Trace batch producer identity is invalid' };\n }\n\n const parsedEvents = this.parseEvents(input.events);\n if (parsedEvents.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: parsedEvents.reason };\n }\n const events = parsedEvents.events;\n\n const parsedSequenceRange = this.parseSequenceRange(input, events);\n if (parsedSequenceRange.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: parsedSequenceRange.reason };\n }\n const { sequenceStart, sequenceEnd } = parsedSequenceRange;\n const hasTraceSequenceMismatch = events.some((event, index) => {\n const previous = events[index - 1];\n return previous !== undefined && event.traceSeq <= previous.traceSeq;\n });\n if (hasTraceSequenceMismatch) {\n return { kind: 'invalid', batchId, reason: 'Trace event sequences are not strictly increasing' };\n }\n const expectedBatchId = `wtb1:${producerId}:${sequenceStart}-${sequenceEnd}`;\n if (input.batchId !== expectedBatchId) {\n return { kind: 'invalid', batchId, reason: 'Trace batch identity does not match its sequence range' };\n }\n\n return {\n kind: 'valid',\n batch: this.create(producerId, sequenceStart, events),\n };\n }\n\n parseAcknowledgement(input: unknown): WoodTraceAcknowledgementParseResult {\n if (!this.isRecord(input) || typeof input.kind !== 'string' || typeof input.batchId !== 'string') {\n return { ok: false, reason: 'Trace batch acknowledgement framing is invalid' };\n }\n\n if (input.kind === 'committed') {\n return this.parseCommittedAcknowledgement(input);\n }\n if (input.kind === 'retryable') {\n return this.parseRetryableAcknowledgement(input);\n }\n if (input.kind === 'rejected' && typeof input.reason === 'string') {\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'rejected',\n batchId: input.batchId,\n reason: input.reason,\n }),\n };\n }\n return { ok: false, reason: 'Trace batch acknowledgement kind is invalid' };\n }\n\n private parseCommittedAcknowledgement(\n input: Record<string, unknown>,\n ): WoodTraceAcknowledgementParseResult {\n const batchId = input.batchId;\n const committedAtMs = input.committedAtMs;\n const acceptedEvents = input.acceptedEvents;\n const validNumbers = typeof batchId === 'string'\n && typeof committedAtMs === 'number'\n && Number.isFinite(committedAtMs)\n && typeof acceptedEvents === 'number'\n && Number.isSafeInteger(acceptedEvents)\n && acceptedEvents >= 0;\n if (!validNumbers) {\n return { ok: false, reason: 'Committed trace acknowledgement is invalid' };\n }\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'committed',\n batchId,\n committedAtMs,\n acceptedEvents,\n }),\n };\n }\n\n private parseRetryableAcknowledgement(\n input: Record<string, unknown>,\n ): WoodTraceAcknowledgementParseResult {\n const batchId = input.batchId;\n const retryAfterMs = input.retryAfterMs;\n if (typeof batchId !== 'string'\n || typeof input.reason !== 'string'\n || typeof retryAfterMs !== 'number'\n || !Number.isFinite(retryAfterMs)\n || retryAfterMs < 0) {\n return { ok: false, reason: 'Retryable trace acknowledgement is invalid' };\n }\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'retryable',\n batchId,\n reason: input.reason,\n retryAfterMs,\n }),\n };\n }\n\n private parseEvent(input: unknown): WoodTraceEventParseResult {\n if (!this.isRecord(input)) {\n return { kind: 'invalid', reason: 'Trace event is not an object' };\n }\n const hasValidIdentity = this.hasValidEventIdentity(input);\n const hasValidTiming = this.hasValidEventTiming(input);\n if (!hasValidIdentity || !hasValidTiming) {\n return { kind: 'invalid', reason: 'Trace event identity or timing is invalid' };\n }\n if (input.payload !== undefined && !this.isRecord(input.payload)) {\n return { kind: 'invalid', reason: 'Trace event payload is invalid' };\n }\n return {\n kind: 'valid',\n event: this.snapshotEvent({\n source: input.source,\n type: input.type,\n level: input.level,\n process: 'renderer',\n timestamp: input.timestamp,\n traceSeq: input.traceSeq,\n // Durable identity passthrough: never a validation failure when absent.\n ...(typeof input.producerId === 'string' && input.producerId.trim().length > 0\n ? { producerId: input.producerId }\n : {}),\n ...(typeof input.message === 'string' ? { message: input.message } : {}),\n ...(this.isConversationId(input.conversationId) ? { conversationId: input.conversationId } : {}),\n ...(input.payload ? { payload: input.payload } : {}),\n ...(typeof input.windowId === 'string' ? { windowId: input.windowId } : {}),\n ...(typeof input.webContentsId === 'number' && Number.isFinite(input.webContentsId)\n ? { webContentsId: input.webContentsId }\n : {}),\n ...(typeof input.routeKey === 'string' ? { routeKey: input.routeKey } : {}),\n ...(typeof input.harnessId === 'string' ? { harnessId: input.harnessId } : {}),\n }),\n };\n }\n\n private hasValidEventIdentity(input: Record<string, unknown>): input is Record<string, unknown> & {\n source: string;\n type: string;\n level: string;\n process: 'renderer';\n } {\n return typeof input.source === 'string'\n && input.source.trim().length > 0\n && typeof input.type === 'string'\n && input.type.trim().length > 0\n && typeof input.level === 'string'\n && input.level.trim().length > 0\n && input.process === 'renderer';\n }\n\n private hasValidEventTiming(input: Record<string, unknown>): input is Record<string, unknown> & {\n timestamp: string;\n traceSeq: number;\n } {\n return typeof input.timestamp === 'string'\n && Number.isFinite(Date.parse(input.timestamp))\n && typeof input.traceSeq === 'number'\n && Number.isSafeInteger(input.traceSeq)\n && input.traceSeq >= 1;\n }\n\n private parseEvents(input: unknown): WoodTraceEventsParseResult {\n if (!Array.isArray(input) || input.length === 0 || input.length > MAX_BATCH_EVENTS) {\n return { kind: 'invalid', reason: 'Trace batch events are invalid' };\n }\n const events: WoodRendererTraceEvent[] = [];\n for (const rawEvent of input) {\n const parsedEvent = this.parseEvent(rawEvent);\n if (parsedEvent.kind === 'invalid') {\n return parsedEvent;\n }\n events.push(parsedEvent.event);\n }\n return { kind: 'valid', events: Object.freeze(events) };\n }\n\n private parseSequenceRange(\n input: Record<string, unknown>,\n events: readonly WoodRendererTraceEvent[],\n ): { kind: 'invalid'; reason: string } | { kind: 'valid'; sequenceStart: number; sequenceEnd: number } {\n const sequenceStart = input.sequenceStart;\n const sequenceEnd = input.sequenceEnd;\n if (typeof sequenceStart !== 'number' || typeof sequenceEnd !== 'number') {\n return { kind: 'invalid', reason: 'Trace batch sequence range is invalid' };\n }\n const firstEvent = events[0];\n const lastEvent = events[events.length - 1];\n const hasInvalidRange = !Number.isSafeInteger(sequenceStart)\n || sequenceStart < 0\n || !Number.isSafeInteger(sequenceEnd)\n || !firstEvent\n || !lastEvent\n || firstEvent.traceSeq !== sequenceStart + 1\n || lastEvent.traceSeq !== sequenceEnd + 1;\n if (hasInvalidRange) {\n return { kind: 'invalid', reason: 'Trace batch sequence range does not match its events' };\n }\n return { kind: 'valid', sequenceStart, sequenceEnd };\n }\n\n private snapshotEvent(event: WoodRendererTraceEvent): WoodRendererTraceEvent {\n return Object.freeze({\n ...event,\n ...(event.payload ? { payload: Object.freeze({ ...event.payload }) } : {}),\n });\n }\n\n private validateIdentity(input: Record<string, unknown>): WoodTraceIdentityValidationResult {\n if (input.protocolVersion !== 1) {\n return { kind: 'invalid', reason: 'Trace batch protocol version is unsupported' };\n }\n if (typeof input.producerId !== 'string' || input.producerId.trim().length === 0) {\n return { kind: 'invalid', reason: 'Trace batch producer identity is invalid' };\n }\n if (typeof input.batchId !== 'string' || input.batchId.trim().length === 0) {\n return { kind: 'invalid', reason: 'Trace batch identity is invalid' };\n }\n return { kind: 'valid' };\n }\n\n private isConversationId(value: unknown): value is string | number {\n return typeof value === 'string' || (typeof value === 'number' && Number.isFinite(value));\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAM,mBAAmB;AAElB,MAAM,uBAAuB;AAAA,EAClC,OACE,YACA,eACA,QACgB;AAChB,UAAM,YAAY,OAAO,IAAI,CAAC,UAAU,KAAK,cAAc,KAAK,CAAC;AACjE,UAAM,OAAO,UAAU,UAAU,SAAS,CAAC;AAC3C,UAAM,cAAc,OAAO,KAAK,WAAW,IAAI,gBAAgB;AAC/D,WAAO,OAAO,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB;AAAA,MACA,SAAS,QAAQ,UAAU,IAAI,aAAa,IAAI,WAAW;AAAA,MAC3D;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAA2C;AAC/C,QAAI,CAAC,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,oBAAoB;AAC9D,aAAO,EAAE,MAAM,YAAY;AAAA,IAC7B;AAEA,UAAM,UAAU,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AACpE,UAAM,WAAW,KAAK,iBAAiB,KAAK;AAC5C,QAAI,SAAS,SAAS,WAAW;AAC/B,aAAO,EAAE,MAAM,WAAW,SAAS,QAAQ,SAAS,OAAO;AAAA,IAC7D;AACA,UAAM,aAAa,MAAM;AACzB,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO,EAAE,MAAM,WAAW,SAAS,QAAQ,2CAA2C;AAAA,IACxF;AAEA,UAAM,eAAe,KAAK,YAAY,MAAM,MAAM;AAClD,QAAI,aAAa,SAAS,WAAW;AACnC,aAAO,EAAE,MAAM,WAAW,SAAS,QAAQ,aAAa,OAAO;AAAA,IACjE;AACA,UAAM,SAAS,aAAa;AAE5B,UAAM,sBAAsB,KAAK,mBAAmB,OAAO,MAAM;AACjE,QAAI,oBAAoB,SAAS,WAAW;AAC1C,aAAO,EAAE,MAAM,WAAW,SAAS,QAAQ,oBAAoB,OAAO;AAAA,IACxE;AACA,UAAM,EAAE,eAAe,YAAY,IAAI;AACvC,UAAM,2BAA2B,OAAO,KAAK,CAAC,OAAO,UAAU;AAC7D,YAAM,WAAW,OAAO,QAAQ,CAAC;AACjC,aAAO,aAAa,UAAa,MAAM,YAAY,SAAS;AAAA,IAC9D,CAAC;AACD,QAAI,0BAA0B;AAC5B,aAAO,EAAE,MAAM,WAAW,SAAS,QAAQ,oDAAoD;AAAA,IACjG;AACA,UAAM,kBAAkB,QAAQ,UAAU,IAAI,aAAa,IAAI,WAAW;AAC1E,QAAI,MAAM,YAAY,iBAAiB;AACrC,aAAO,EAAE,MAAM,WAAW,SAAS,QAAQ,yDAAyD;AAAA,IACtG;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,YAAY,eAAe,MAAM;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,qBAAqB,OAAqD;AACxE,QAAI,CAAC,KAAK,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,YAAY,UAAU;AAChG,aAAO,EAAE,IAAI,OAAO,QAAQ,iDAAiD;AAAA,IAC/E;AAEA,QAAI,MAAM,SAAS,aAAa;AAC9B,aAAO,KAAK,8BAA8B,KAAK;AAAA,IACjD;AACA,QAAI,MAAM,SAAS,aAAa;AAC9B,aAAO,KAAK,8BAA8B,KAAK;AAAA,IACjD;AACA,QAAI,MAAM,SAAS,cAAc,OAAO,MAAM,WAAW,UAAU;AACjE,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,iBAAiB,OAAO,OAAO;AAAA,UAC7B,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,EAAE,IAAI,OAAO,QAAQ,8CAA8C;AAAA,EAC5E;AAAA,EAEQ,8BACN,OACqC;AACrC,UAAM,UAAU,MAAM;AACtB,UAAM,gBAAgB,MAAM;AAC5B,UAAM,iBAAiB,MAAM;AAC7B,UAAM,eAAe,OAAO,YAAY,YACnC,OAAO,kBAAkB,YACzB,OAAO,SAAS,aAAa,KAC7B,OAAO,mBAAmB,YAC1B,OAAO,cAAc,cAAc,KACnC,kBAAkB;AACvB,QAAI,CAAC,cAAc;AACjB,aAAO,EAAE,IAAI,OAAO,QAAQ,6CAA6C;AAAA,IAC3E;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,iBAAiB,OAAO,OAAO;AAAA,QAC7B,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,8BACN,OACqC;AACrC,UAAM,UAAU,MAAM;AACtB,UAAM,eAAe,MAAM;AAC3B,QAAI,OAAO,YAAY,YAClB,OAAO,MAAM,WAAW,YACxB,OAAO,iBAAiB,YACxB,CAAC,OAAO,SAAS,YAAY,KAC7B,eAAe,GAAG;AACrB,aAAO,EAAE,IAAI,OAAO,QAAQ,6CAA6C;AAAA,IAC3E;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,iBAAiB,OAAO,OAAO;AAAA,QAC7B,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,MAAM;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,WAAW,OAA2C;AAC5D,QAAI,CAAC,KAAK,SAAS,KAAK,GAAG;AACzB,aAAO,EAAE,MAAM,WAAW,QAAQ,+BAA+B;AAAA,IACnE;AACA,UAAM,mBAAmB,KAAK,sBAAsB,KAAK;AACzD,UAAM,iBAAiB,KAAK,oBAAoB,KAAK;AACrD,QAAI,CAAC,oBAAoB,CAAC,gBAAgB;AACxC,aAAO,EAAE,MAAM,WAAW,QAAQ,4CAA4C;AAAA,IAChF;AACA,QAAI,MAAM,YAAY,UAAa,CAAC,KAAK,SAAS,MAAM,OAAO,GAAG;AAChE,aAAO,EAAE,MAAM,WAAW,QAAQ,iCAAiC;AAAA,IACrE;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,KAAK,cAAc;AAAA,QACxB,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,SAAS;AAAA,QACT,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA;AAAA,QAEhB,GAAI,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,KAAK,EAAE,SAAS,IACzE,EAAE,YAAY,MAAM,WAAW,IAC/B,CAAC;AAAA,QACL,GAAI,OAAO,MAAM,YAAY,WAAW,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,QACtE,GAAI,KAAK,iBAAiB,MAAM,cAAc,IAAI,EAAE,gBAAgB,MAAM,eAAe,IAAI,CAAC;AAAA,QAC9F,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,QAClD,GAAI,OAAO,MAAM,aAAa,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,QACzE,GAAI,OAAO,MAAM,kBAAkB,YAAY,OAAO,SAAS,MAAM,aAAa,IAC9E,EAAE,eAAe,MAAM,cAAc,IACrC,CAAC;AAAA,QACL,GAAI,OAAO,MAAM,aAAa,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,QACzE,GAAI,OAAO,MAAM,cAAc,WAAW,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,sBAAsB,OAK5B;AACA,WAAO,OAAO,MAAM,WAAW,YAC1B,MAAM,OAAO,KAAK,EAAE,SAAS,KAC7B,OAAO,MAAM,SAAS,YACtB,MAAM,KAAK,KAAK,EAAE,SAAS,KAC3B,OAAO,MAAM,UAAU,YACvB,MAAM,MAAM,KAAK,EAAE,SAAS,KAC5B,MAAM,YAAY;AAAA,EACzB;AAAA,EAEQ,oBAAoB,OAG1B;AACA,WAAO,OAAO,MAAM,cAAc,YAC7B,OAAO,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,KAC3C,OAAO,MAAM,aAAa,YAC1B,OAAO,cAAc,MAAM,QAAQ,KACnC,MAAM,YAAY;AAAA,EACzB;AAAA,EAEQ,YAAY,OAA4C;AAC9D,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM,SAAS,kBAAkB;AAClF,aAAO,EAAE,MAAM,WAAW,QAAQ,iCAAiC;AAAA,IACrE;AACA,UAAM,SAAmC,CAAC;AAC1C,eAAW,YAAY,OAAO;AAC5B,YAAM,cAAc,KAAK,WAAW,QAAQ;AAC5C,UAAI,YAAY,SAAS,WAAW;AAClC,eAAO;AAAA,MACT;AACA,aAAO,KAAK,YAAY,KAAK;AAAA,IAC/B;AACA,WAAO,EAAE,MAAM,SAAS,QAAQ,OAAO,OAAO,MAAM,EAAE;AAAA,EACxD;AAAA,EAEQ,mBACN,OACA,QACqG;AACrG,UAAM,gBAAgB,MAAM;AAC5B,UAAM,cAAc,MAAM;AAC1B,QAAI,OAAO,kBAAkB,YAAY,OAAO,gBAAgB,UAAU;AACxE,aAAO,EAAE,MAAM,WAAW,QAAQ,wCAAwC;AAAA,IAC5E;AACA,UAAM,aAAa,OAAO,CAAC;AAC3B,UAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAC1C,UAAM,kBAAkB,CAAC,OAAO,cAAc,aAAa,KACtD,gBAAgB,KAChB,CAAC,OAAO,cAAc,WAAW,KACjC,CAAC,cACD,CAAC,aACD,WAAW,aAAa,gBAAgB,KACxC,UAAU,aAAa,cAAc;AAC1C,QAAI,iBAAiB;AACnB,aAAO,EAAE,MAAM,WAAW,QAAQ,uDAAuD;AAAA,IAC3F;AACA,WAAO,EAAE,MAAM,SAAS,eAAe,YAAY;AAAA,EACrD;AAAA,EAEQ,cAAc,OAAuD;AAC3E,WAAO,OAAO,OAAO;AAAA,MACnB,GAAG;AAAA,MACH,GAAI,MAAM,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,EAAE,IAAI,CAAC;AAAA,IAC1E,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,OAAmE;AAC1F,QAAI,MAAM,oBAAoB,GAAG;AAC/B,aAAO,EAAE,MAAM,WAAW,QAAQ,8CAA8C;AAAA,IAClF;AACA,QAAI,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,KAAK,EAAE,WAAW,GAAG;AAChF,aAAO,EAAE,MAAM,WAAW,QAAQ,2CAA2C;AAAA,IAC/E;AACA,QAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC1E,aAAO,EAAE,MAAM,WAAW,QAAQ,kCAAkC;AAAA,IACtE;AACA,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AAAA,EAEQ,iBAAiB,OAA0C;AACjE,WAAO,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAAA,EACzF;AAAA,EAEQ,SAAS,OAAkD;AACjE,WAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAAA,EAC5E;AACF;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WoodRendererTraceEvent, WoodTraceBatch, WoodTraceBatchParseResult, WoodTraceAcknowledgementParseResult } from './types/wood_trace_batch.types.cjs';
|
|
2
2
|
import '@noego/telemetry/core';
|
|
3
|
-
import '../trace_hub-
|
|
3
|
+
import '../trace_hub-Cpo_nVze.cjs';
|
|
4
4
|
import 'rxjs';
|
|
5
5
|
|
|
6
6
|
declare class WoodTraceBatchContract {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WoodRendererTraceEvent, WoodTraceBatch, WoodTraceBatchParseResult, WoodTraceAcknowledgementParseResult } from './types/wood_trace_batch.types.js';
|
|
2
2
|
import '@noego/telemetry/core';
|
|
3
|
-
import '../trace_hub-
|
|
3
|
+
import '../trace_hub-Cpo_nVze.js';
|
|
4
4
|
import 'rxjs';
|
|
5
5
|
|
|
6
6
|
declare class WoodTraceBatchContract {
|
|
@@ -130,6 +130,8 @@ class WoodTraceBatchContract {
|
|
|
130
130
|
process: "renderer",
|
|
131
131
|
timestamp: input.timestamp,
|
|
132
132
|
traceSeq: input.traceSeq,
|
|
133
|
+
// Durable identity passthrough: never a validation failure when absent.
|
|
134
|
+
...typeof input.producerId === "string" && input.producerId.trim().length > 0 ? { producerId: input.producerId } : {},
|
|
133
135
|
...typeof input.message === "string" ? { message: input.message } : {},
|
|
134
136
|
...this.isConversationId(input.conversationId) ? { conversationId: input.conversationId } : {},
|
|
135
137
|
...input.payload ? { payload: input.payload } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tracing/wood_trace_batch_contract.ts"],"sourcesContent":["import type {\n WoodRendererTraceEvent,\n WoodTraceAcknowledgementParseResult,\n WoodTraceBatch,\n WoodTraceBatchAcknowledgement,\n WoodTraceBatchParseResult,\n WoodTraceEventParseResult,\n WoodTraceEventsParseResult,\n WoodTraceIdentityValidationResult,\n} from './types/wood_trace_batch.types.js';\n\nconst MAX_BATCH_EVENTS = 256;\n\nexport class WoodTraceBatchContract {\n create(\n producerId: string,\n sequenceStart: number,\n events: readonly WoodRendererTraceEvent[],\n ): WoodTraceBatch {\n const snapshots = events.map((event) => this.snapshotEvent(event));\n const last = snapshots[snapshots.length - 1];\n const sequenceEnd = last ? last.traceSeq - 1 : sequenceStart - 1;\n return Object.freeze({\n kind: 'wood.trace.batch',\n protocolVersion: 1,\n producerId,\n batchId: `wtb1:${producerId}:${sequenceStart}-${sequenceEnd}`,\n sequenceStart,\n sequenceEnd,\n events: Object.freeze(snapshots),\n });\n }\n\n parse(input: unknown): WoodTraceBatchParseResult {\n if (!this.isRecord(input) || input.kind !== 'wood.trace.batch') {\n return { kind: 'not-batch' };\n }\n\n const batchId = typeof input.batchId === 'string' ? input.batchId : null;\n const identity = this.validateIdentity(input);\n if (identity.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: identity.reason };\n }\n const producerId = input.producerId;\n if (typeof producerId !== 'string') {\n return { kind: 'invalid', batchId, reason: 'Trace batch producer identity is invalid' };\n }\n\n const parsedEvents = this.parseEvents(input.events);\n if (parsedEvents.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: parsedEvents.reason };\n }\n const events = parsedEvents.events;\n\n const parsedSequenceRange = this.parseSequenceRange(input, events);\n if (parsedSequenceRange.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: parsedSequenceRange.reason };\n }\n const { sequenceStart, sequenceEnd } = parsedSequenceRange;\n const hasTraceSequenceMismatch = events.some((event, index) => {\n const previous = events[index - 1];\n return previous !== undefined && event.traceSeq <= previous.traceSeq;\n });\n if (hasTraceSequenceMismatch) {\n return { kind: 'invalid', batchId, reason: 'Trace event sequences are not strictly increasing' };\n }\n const expectedBatchId = `wtb1:${producerId}:${sequenceStart}-${sequenceEnd}`;\n if (input.batchId !== expectedBatchId) {\n return { kind: 'invalid', batchId, reason: 'Trace batch identity does not match its sequence range' };\n }\n\n return {\n kind: 'valid',\n batch: this.create(producerId, sequenceStart, events),\n };\n }\n\n parseAcknowledgement(input: unknown): WoodTraceAcknowledgementParseResult {\n if (!this.isRecord(input) || typeof input.kind !== 'string' || typeof input.batchId !== 'string') {\n return { ok: false, reason: 'Trace batch acknowledgement framing is invalid' };\n }\n\n if (input.kind === 'committed') {\n return this.parseCommittedAcknowledgement(input);\n }\n if (input.kind === 'retryable') {\n return this.parseRetryableAcknowledgement(input);\n }\n if (input.kind === 'rejected' && typeof input.reason === 'string') {\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'rejected',\n batchId: input.batchId,\n reason: input.reason,\n }),\n };\n }\n return { ok: false, reason: 'Trace batch acknowledgement kind is invalid' };\n }\n\n private parseCommittedAcknowledgement(\n input: Record<string, unknown>,\n ): WoodTraceAcknowledgementParseResult {\n const batchId = input.batchId;\n const committedAtMs = input.committedAtMs;\n const acceptedEvents = input.acceptedEvents;\n const validNumbers = typeof batchId === 'string'\n && typeof committedAtMs === 'number'\n && Number.isFinite(committedAtMs)\n && typeof acceptedEvents === 'number'\n && Number.isSafeInteger(acceptedEvents)\n && acceptedEvents >= 0;\n if (!validNumbers) {\n return { ok: false, reason: 'Committed trace acknowledgement is invalid' };\n }\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'committed',\n batchId,\n committedAtMs,\n acceptedEvents,\n }),\n };\n }\n\n private parseRetryableAcknowledgement(\n input: Record<string, unknown>,\n ): WoodTraceAcknowledgementParseResult {\n const batchId = input.batchId;\n const retryAfterMs = input.retryAfterMs;\n if (typeof batchId !== 'string'\n || typeof input.reason !== 'string'\n || typeof retryAfterMs !== 'number'\n || !Number.isFinite(retryAfterMs)\n || retryAfterMs < 0) {\n return { ok: false, reason: 'Retryable trace acknowledgement is invalid' };\n }\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'retryable',\n batchId,\n reason: input.reason,\n retryAfterMs,\n }),\n };\n }\n\n private parseEvent(input: unknown): WoodTraceEventParseResult {\n if (!this.isRecord(input)) {\n return { kind: 'invalid', reason: 'Trace event is not an object' };\n }\n const hasValidIdentity = this.hasValidEventIdentity(input);\n const hasValidTiming = this.hasValidEventTiming(input);\n if (!hasValidIdentity || !hasValidTiming) {\n return { kind: 'invalid', reason: 'Trace event identity or timing is invalid' };\n }\n if (input.payload !== undefined && !this.isRecord(input.payload)) {\n return { kind: 'invalid', reason: 'Trace event payload is invalid' };\n }\n return {\n kind: 'valid',\n event: this.snapshotEvent({\n source: input.source,\n type: input.type,\n level: input.level,\n process: 'renderer',\n timestamp: input.timestamp,\n traceSeq: input.traceSeq,\n ...(typeof input.message === 'string' ? { message: input.message } : {}),\n ...(this.isConversationId(input.conversationId) ? { conversationId: input.conversationId } : {}),\n ...(input.payload ? { payload: input.payload } : {}),\n ...(typeof input.windowId === 'string' ? { windowId: input.windowId } : {}),\n ...(typeof input.webContentsId === 'number' && Number.isFinite(input.webContentsId)\n ? { webContentsId: input.webContentsId }\n : {}),\n ...(typeof input.routeKey === 'string' ? { routeKey: input.routeKey } : {}),\n ...(typeof input.harnessId === 'string' ? { harnessId: input.harnessId } : {}),\n }),\n };\n }\n\n private hasValidEventIdentity(input: Record<string, unknown>): input is Record<string, unknown> & {\n source: string;\n type: string;\n level: string;\n process: 'renderer';\n } {\n return typeof input.source === 'string'\n && input.source.trim().length > 0\n && typeof input.type === 'string'\n && input.type.trim().length > 0\n && typeof input.level === 'string'\n && input.level.trim().length > 0\n && input.process === 'renderer';\n }\n\n private hasValidEventTiming(input: Record<string, unknown>): input is Record<string, unknown> & {\n timestamp: string;\n traceSeq: number;\n } {\n return typeof input.timestamp === 'string'\n && Number.isFinite(Date.parse(input.timestamp))\n && typeof input.traceSeq === 'number'\n && Number.isSafeInteger(input.traceSeq)\n && input.traceSeq >= 1;\n }\n\n private parseEvents(input: unknown): WoodTraceEventsParseResult {\n if (!Array.isArray(input) || input.length === 0 || input.length > MAX_BATCH_EVENTS) {\n return { kind: 'invalid', reason: 'Trace batch events are invalid' };\n }\n const events: WoodRendererTraceEvent[] = [];\n for (const rawEvent of input) {\n const parsedEvent = this.parseEvent(rawEvent);\n if (parsedEvent.kind === 'invalid') {\n return parsedEvent;\n }\n events.push(parsedEvent.event);\n }\n return { kind: 'valid', events: Object.freeze(events) };\n }\n\n private parseSequenceRange(\n input: Record<string, unknown>,\n events: readonly WoodRendererTraceEvent[],\n ): { kind: 'invalid'; reason: string } | { kind: 'valid'; sequenceStart: number; sequenceEnd: number } {\n const sequenceStart = input.sequenceStart;\n const sequenceEnd = input.sequenceEnd;\n if (typeof sequenceStart !== 'number' || typeof sequenceEnd !== 'number') {\n return { kind: 'invalid', reason: 'Trace batch sequence range is invalid' };\n }\n const firstEvent = events[0];\n const lastEvent = events[events.length - 1];\n const hasInvalidRange = !Number.isSafeInteger(sequenceStart)\n || sequenceStart < 0\n || !Number.isSafeInteger(sequenceEnd)\n || !firstEvent\n || !lastEvent\n || firstEvent.traceSeq !== sequenceStart + 1\n || lastEvent.traceSeq !== sequenceEnd + 1;\n if (hasInvalidRange) {\n return { kind: 'invalid', reason: 'Trace batch sequence range does not match its events' };\n }\n return { kind: 'valid', sequenceStart, sequenceEnd };\n }\n\n private snapshotEvent(event: WoodRendererTraceEvent): WoodRendererTraceEvent {\n return Object.freeze({\n ...event,\n ...(event.payload ? { payload: Object.freeze({ ...event.payload }) } : {}),\n });\n }\n\n private validateIdentity(input: Record<string, unknown>): WoodTraceIdentityValidationResult {\n if (input.protocolVersion !== 1) {\n return { kind: 'invalid', reason: 'Trace batch protocol version is unsupported' };\n }\n if (typeof input.producerId !== 'string' || input.producerId.trim().length === 0) {\n return { kind: 'invalid', reason: 'Trace batch producer identity is invalid' };\n }\n if (typeof input.batchId !== 'string' || input.batchId.trim().length === 0) {\n return { kind: 'invalid', reason: 'Trace batch identity is invalid' };\n }\n return { kind: 'valid' };\n }\n\n private isConversationId(value: unknown): value is string | number {\n return typeof value === 'string' || (typeof value === 'number' && Number.isFinite(value));\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tracing/wood_trace_batch_contract.ts"],"sourcesContent":["import type {\n WoodRendererTraceEvent,\n WoodTraceAcknowledgementParseResult,\n WoodTraceBatch,\n WoodTraceBatchAcknowledgement,\n WoodTraceBatchParseResult,\n WoodTraceEventParseResult,\n WoodTraceEventsParseResult,\n WoodTraceIdentityValidationResult,\n} from './types/wood_trace_batch.types.js';\n\nconst MAX_BATCH_EVENTS = 256;\n\nexport class WoodTraceBatchContract {\n create(\n producerId: string,\n sequenceStart: number,\n events: readonly WoodRendererTraceEvent[],\n ): WoodTraceBatch {\n const snapshots = events.map((event) => this.snapshotEvent(event));\n const last = snapshots[snapshots.length - 1];\n const sequenceEnd = last ? last.traceSeq - 1 : sequenceStart - 1;\n return Object.freeze({\n kind: 'wood.trace.batch',\n protocolVersion: 1,\n producerId,\n batchId: `wtb1:${producerId}:${sequenceStart}-${sequenceEnd}`,\n sequenceStart,\n sequenceEnd,\n events: Object.freeze(snapshots),\n });\n }\n\n parse(input: unknown): WoodTraceBatchParseResult {\n if (!this.isRecord(input) || input.kind !== 'wood.trace.batch') {\n return { kind: 'not-batch' };\n }\n\n const batchId = typeof input.batchId === 'string' ? input.batchId : null;\n const identity = this.validateIdentity(input);\n if (identity.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: identity.reason };\n }\n const producerId = input.producerId;\n if (typeof producerId !== 'string') {\n return { kind: 'invalid', batchId, reason: 'Trace batch producer identity is invalid' };\n }\n\n const parsedEvents = this.parseEvents(input.events);\n if (parsedEvents.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: parsedEvents.reason };\n }\n const events = parsedEvents.events;\n\n const parsedSequenceRange = this.parseSequenceRange(input, events);\n if (parsedSequenceRange.kind === 'invalid') {\n return { kind: 'invalid', batchId, reason: parsedSequenceRange.reason };\n }\n const { sequenceStart, sequenceEnd } = parsedSequenceRange;\n const hasTraceSequenceMismatch = events.some((event, index) => {\n const previous = events[index - 1];\n return previous !== undefined && event.traceSeq <= previous.traceSeq;\n });\n if (hasTraceSequenceMismatch) {\n return { kind: 'invalid', batchId, reason: 'Trace event sequences are not strictly increasing' };\n }\n const expectedBatchId = `wtb1:${producerId}:${sequenceStart}-${sequenceEnd}`;\n if (input.batchId !== expectedBatchId) {\n return { kind: 'invalid', batchId, reason: 'Trace batch identity does not match its sequence range' };\n }\n\n return {\n kind: 'valid',\n batch: this.create(producerId, sequenceStart, events),\n };\n }\n\n parseAcknowledgement(input: unknown): WoodTraceAcknowledgementParseResult {\n if (!this.isRecord(input) || typeof input.kind !== 'string' || typeof input.batchId !== 'string') {\n return { ok: false, reason: 'Trace batch acknowledgement framing is invalid' };\n }\n\n if (input.kind === 'committed') {\n return this.parseCommittedAcknowledgement(input);\n }\n if (input.kind === 'retryable') {\n return this.parseRetryableAcknowledgement(input);\n }\n if (input.kind === 'rejected' && typeof input.reason === 'string') {\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'rejected',\n batchId: input.batchId,\n reason: input.reason,\n }),\n };\n }\n return { ok: false, reason: 'Trace batch acknowledgement kind is invalid' };\n }\n\n private parseCommittedAcknowledgement(\n input: Record<string, unknown>,\n ): WoodTraceAcknowledgementParseResult {\n const batchId = input.batchId;\n const committedAtMs = input.committedAtMs;\n const acceptedEvents = input.acceptedEvents;\n const validNumbers = typeof batchId === 'string'\n && typeof committedAtMs === 'number'\n && Number.isFinite(committedAtMs)\n && typeof acceptedEvents === 'number'\n && Number.isSafeInteger(acceptedEvents)\n && acceptedEvents >= 0;\n if (!validNumbers) {\n return { ok: false, reason: 'Committed trace acknowledgement is invalid' };\n }\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'committed',\n batchId,\n committedAtMs,\n acceptedEvents,\n }),\n };\n }\n\n private parseRetryableAcknowledgement(\n input: Record<string, unknown>,\n ): WoodTraceAcknowledgementParseResult {\n const batchId = input.batchId;\n const retryAfterMs = input.retryAfterMs;\n if (typeof batchId !== 'string'\n || typeof input.reason !== 'string'\n || typeof retryAfterMs !== 'number'\n || !Number.isFinite(retryAfterMs)\n || retryAfterMs < 0) {\n return { ok: false, reason: 'Retryable trace acknowledgement is invalid' };\n }\n return {\n ok: true,\n acknowledgement: Object.freeze({\n kind: 'retryable',\n batchId,\n reason: input.reason,\n retryAfterMs,\n }),\n };\n }\n\n private parseEvent(input: unknown): WoodTraceEventParseResult {\n if (!this.isRecord(input)) {\n return { kind: 'invalid', reason: 'Trace event is not an object' };\n }\n const hasValidIdentity = this.hasValidEventIdentity(input);\n const hasValidTiming = this.hasValidEventTiming(input);\n if (!hasValidIdentity || !hasValidTiming) {\n return { kind: 'invalid', reason: 'Trace event identity or timing is invalid' };\n }\n if (input.payload !== undefined && !this.isRecord(input.payload)) {\n return { kind: 'invalid', reason: 'Trace event payload is invalid' };\n }\n return {\n kind: 'valid',\n event: this.snapshotEvent({\n source: input.source,\n type: input.type,\n level: input.level,\n process: 'renderer',\n timestamp: input.timestamp,\n traceSeq: input.traceSeq,\n // Durable identity passthrough: never a validation failure when absent.\n ...(typeof input.producerId === 'string' && input.producerId.trim().length > 0\n ? { producerId: input.producerId }\n : {}),\n ...(typeof input.message === 'string' ? { message: input.message } : {}),\n ...(this.isConversationId(input.conversationId) ? { conversationId: input.conversationId } : {}),\n ...(input.payload ? { payload: input.payload } : {}),\n ...(typeof input.windowId === 'string' ? { windowId: input.windowId } : {}),\n ...(typeof input.webContentsId === 'number' && Number.isFinite(input.webContentsId)\n ? { webContentsId: input.webContentsId }\n : {}),\n ...(typeof input.routeKey === 'string' ? { routeKey: input.routeKey } : {}),\n ...(typeof input.harnessId === 'string' ? { harnessId: input.harnessId } : {}),\n }),\n };\n }\n\n private hasValidEventIdentity(input: Record<string, unknown>): input is Record<string, unknown> & {\n source: string;\n type: string;\n level: string;\n process: 'renderer';\n } {\n return typeof input.source === 'string'\n && input.source.trim().length > 0\n && typeof input.type === 'string'\n && input.type.trim().length > 0\n && typeof input.level === 'string'\n && input.level.trim().length > 0\n && input.process === 'renderer';\n }\n\n private hasValidEventTiming(input: Record<string, unknown>): input is Record<string, unknown> & {\n timestamp: string;\n traceSeq: number;\n } {\n return typeof input.timestamp === 'string'\n && Number.isFinite(Date.parse(input.timestamp))\n && typeof input.traceSeq === 'number'\n && Number.isSafeInteger(input.traceSeq)\n && input.traceSeq >= 1;\n }\n\n private parseEvents(input: unknown): WoodTraceEventsParseResult {\n if (!Array.isArray(input) || input.length === 0 || input.length > MAX_BATCH_EVENTS) {\n return { kind: 'invalid', reason: 'Trace batch events are invalid' };\n }\n const events: WoodRendererTraceEvent[] = [];\n for (const rawEvent of input) {\n const parsedEvent = this.parseEvent(rawEvent);\n if (parsedEvent.kind === 'invalid') {\n return parsedEvent;\n }\n events.push(parsedEvent.event);\n }\n return { kind: 'valid', events: Object.freeze(events) };\n }\n\n private parseSequenceRange(\n input: Record<string, unknown>,\n events: readonly WoodRendererTraceEvent[],\n ): { kind: 'invalid'; reason: string } | { kind: 'valid'; sequenceStart: number; sequenceEnd: number } {\n const sequenceStart = input.sequenceStart;\n const sequenceEnd = input.sequenceEnd;\n if (typeof sequenceStart !== 'number' || typeof sequenceEnd !== 'number') {\n return { kind: 'invalid', reason: 'Trace batch sequence range is invalid' };\n }\n const firstEvent = events[0];\n const lastEvent = events[events.length - 1];\n const hasInvalidRange = !Number.isSafeInteger(sequenceStart)\n || sequenceStart < 0\n || !Number.isSafeInteger(sequenceEnd)\n || !firstEvent\n || !lastEvent\n || firstEvent.traceSeq !== sequenceStart + 1\n || lastEvent.traceSeq !== sequenceEnd + 1;\n if (hasInvalidRange) {\n return { kind: 'invalid', reason: 'Trace batch sequence range does not match its events' };\n }\n return { kind: 'valid', sequenceStart, sequenceEnd };\n }\n\n private snapshotEvent(event: WoodRendererTraceEvent): WoodRendererTraceEvent {\n return Object.freeze({\n ...event,\n ...(event.payload ? { payload: Object.freeze({ ...event.payload }) } : {}),\n });\n }\n\n private validateIdentity(input: Record<string, unknown>): WoodTraceIdentityValidationResult {\n if (input.protocolVersion !== 1) {\n return { kind: 'invalid', reason: 'Trace batch protocol version is unsupported' };\n }\n if (typeof input.producerId !== 'string' || input.producerId.trim().length === 0) {\n return { kind: 'invalid', reason: 'Trace batch producer identity is invalid' };\n }\n if (typeof input.batchId !== 'string' || input.batchId.trim().length === 0) {\n return { kind: 'invalid', reason: 'Trace batch identity is invalid' };\n }\n return { kind: 'valid' };\n }\n\n private isConversationId(value: unknown): value is string | number {\n return typeof value === 'string' || (typeof value === 'number' && Number.isFinite(value));\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -18,7 +18,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var build_transport_bridge_exports = {};
|
|
20
20
|
__export(build_transport_bridge_exports, {
|
|
21
|
-
buildTransportBridge: () => buildTransportBridge
|
|
21
|
+
buildTransportBridge: () => buildTransportBridge,
|
|
22
|
+
operationHasInput: () => operationHasInput
|
|
22
23
|
});
|
|
23
24
|
module.exports = __toCommonJS(build_transport_bridge_exports);
|
|
24
25
|
function operationHasInput(op) {
|
|
@@ -57,6 +58,7 @@ function buildTransportBridge(operations, transport) {
|
|
|
57
58
|
}
|
|
58
59
|
// Annotate the CommonJS export names for ESM import in node:
|
|
59
60
|
0 && (module.exports = {
|
|
60
|
-
buildTransportBridge
|
|
61
|
+
buildTransportBridge,
|
|
62
|
+
operationHasInput
|
|
61
63
|
});
|
|
62
64
|
//# sourceMappingURL=build_transport_bridge.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/transport/build_transport_bridge.ts"],"sourcesContent":["import type { OperationDef } from '../types/index.cjs';\nimport type { WoodRpcManifestEntry } from '../client/index.js';\nimport type { WoodRpcTransport } from './wood_rpc_transport.js';\n\n/**\n * Build a `WoodBridge`-shaped object (the global `__NOEGO_WOOD_BRIDGE__` shape)\n * backed by a `WoodRpcTransport` instead of Electron's `ipcRenderer`.\n *\n * Every operation channel (e.g. `chat.messages.send`) becomes a nested method\n * on the returned bridge that calls `transport.invoke(channel, data)`. `on()`\n * is backed by `transport.subscribe`, and `__rpcManifest` is derived from the\n * same operations map used by codegen — so the existing `getApp()` renderer\n * client can be pointed at this bridge with zero changes.\n *\n * The production Electron preload path is untouched: it still exposes its own\n * `ipcRenderer`-backed bridge. This function is the test-mode equivalent that\n * any `WoodRpcTransport` (in-process or loopback) plugs into.\n */\nexport interface TransportBridgeResult {\n bridge: Record<string, any>;\n}\n\
|
|
1
|
+
{"version":3,"sources":["../../src/transport/build_transport_bridge.ts"],"sourcesContent":["import type { OperationDef } from '../types/index.cjs';\nimport type { WoodRpcManifestEntry } from '../client/index.js';\nimport type { WoodRpcTransport } from './wood_rpc_transport.js';\n\n/**\n * Build a `WoodBridge`-shaped object (the global `__NOEGO_WOOD_BRIDGE__` shape)\n * backed by a `WoodRpcTransport` instead of Electron's `ipcRenderer`.\n *\n * Every operation channel (e.g. `chat.messages.send`) becomes a nested method\n * on the returned bridge that calls `transport.invoke(channel, data)`. `on()`\n * is backed by `transport.subscribe`, and `__rpcManifest` is derived from the\n * same operations map used by codegen — so the existing `getApp()` renderer\n * client can be pointed at this bridge with zero changes.\n *\n * The production Electron preload path is untouched: it still exposes its own\n * `ipcRenderer`-backed bridge. This function is the test-mode equivalent that\n * any `WoodRpcTransport` (in-process or loopback) plugs into.\n */\nexport interface TransportBridgeResult {\n bridge: Record<string, any>;\n}\n\n/**\n * The ONE definition of \"this operation takes an input argument\": a\n * non-empty object schema. The preload generator, transport bridge, and\n * test harnesses must agree, or renderer arity enforcement drifts.\n */\nexport function operationHasInput(op: OperationDef): boolean {\n return Boolean(\n op.inputSchema &&\n (op.inputSchema as Record<string, unknown>).type === 'object' &&\n Object.keys(\n (op.inputSchema as Record<string, Record<string, unknown>>).properties ?? {},\n ).length > 0,\n );\n}\n\nfunction buildManifest(operations: Map<string, OperationDef>): WoodRpcManifestEntry[] {\n return Array.from(operations.values()).map((op) => ({\n channel: op.channel,\n controller: op.controller,\n action: op.action,\n path: op.channel.split('.'),\n hasInput: operationHasInput(op),\n }));\n}\n\n/**\n * Build the nested bridge tree from the operations' dot-path channels.\n * Mirrors the nesting used by the preload generator and router bridge:\n * intermediate segments become namespace objects, leaf segments become\n * transport-backed invoke functions.\n */\nexport function buildTransportBridge(\n operations: Map<string, OperationDef>,\n transport: WoodRpcTransport,\n): TransportBridgeResult {\n const tree: Record<string, any> = {};\n\n for (const channel of operations.keys()) {\n const parts = channel.split('.');\n let current = tree;\n\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n current[parts[i]] = {};\n }\n current = current[parts[i]];\n }\n\n const leaf = parts[parts.length - 1];\n current[leaf] = (data?: unknown) => transport.invoke(channel, data);\n }\n\n tree.on = (channel: string, callback: (...args: unknown[]) => void) =>\n transport.subscribe(channel, (payload) => callback(payload));\n\n tree.__rpcManifest = buildManifest(operations);\n\n return { bridge: tree };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BO,SAAS,kBAAkB,IAA2B;AAC3D,SAAO;AAAA,IACL,GAAG,eACA,GAAG,YAAwC,SAAS,YACrD,OAAO;AAAA,MACJ,GAAG,YAAwD,cAAc,CAAC;AAAA,IAC7E,EAAE,SAAS;AAAA,EACf;AACF;AAEA,SAAS,cAAc,YAA+D;AACpF,SAAO,MAAM,KAAK,WAAW,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ;AAAA,IAClD,SAAS,GAAG;AAAA,IACZ,YAAY,GAAG;AAAA,IACf,QAAQ,GAAG;AAAA,IACX,MAAM,GAAG,QAAQ,MAAM,GAAG;AAAA,IAC1B,UAAU,kBAAkB,EAAE;AAAA,EAChC,EAAE;AACJ;AAQO,SAAS,qBACd,YACA,WACuB;AACvB,QAAM,OAA4B,CAAC;AAEnC,aAAW,WAAW,WAAW,KAAK,GAAG;AACvC,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,QAAI,UAAU;AAEd,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAI,CAAC,QAAQ,MAAM,CAAC,CAAC,GAAG;AACtB,gBAAQ,MAAM,CAAC,CAAC,IAAI,CAAC;AAAA,MACvB;AACA,gBAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC5B;AAEA,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAQ,IAAI,IAAI,CAAC,SAAmB,UAAU,OAAO,SAAS,IAAI;AAAA,EACpE;AAEA,OAAK,KAAK,CAAC,SAAiB,aAC1B,UAAU,UAAU,SAAS,CAAC,YAAY,SAAS,OAAO,CAAC;AAE7D,OAAK,gBAAgB,cAAc,UAAU;AAE7C,SAAO,EAAE,QAAQ,KAAK;AACxB;","names":[]}
|
|
@@ -18,6 +18,12 @@ import { WoodRpcTransport } from './wood_rpc_transport.cjs';
|
|
|
18
18
|
interface TransportBridgeResult {
|
|
19
19
|
bridge: Record<string, any>;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* The ONE definition of "this operation takes an input argument": a
|
|
23
|
+
* non-empty object schema. The preload generator, transport bridge, and
|
|
24
|
+
* test harnesses must agree, or renderer arity enforcement drifts.
|
|
25
|
+
*/
|
|
26
|
+
declare function operationHasInput(op: OperationDef): boolean;
|
|
21
27
|
/**
|
|
22
28
|
* Build the nested bridge tree from the operations' dot-path channels.
|
|
23
29
|
* Mirrors the nesting used by the preload generator and router bridge:
|
|
@@ -26,4 +32,4 @@ interface TransportBridgeResult {
|
|
|
26
32
|
*/
|
|
27
33
|
declare function buildTransportBridge(operations: Map<string, OperationDef>, transport: WoodRpcTransport): TransportBridgeResult;
|
|
28
34
|
|
|
29
|
-
export { type TransportBridgeResult, buildTransportBridge };
|
|
35
|
+
export { type TransportBridgeResult, buildTransportBridge, operationHasInput };
|
|
@@ -18,6 +18,12 @@ import { WoodRpcTransport } from './wood_rpc_transport.js';
|
|
|
18
18
|
interface TransportBridgeResult {
|
|
19
19
|
bridge: Record<string, any>;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* The ONE definition of "this operation takes an input argument": a
|
|
23
|
+
* non-empty object schema. The preload generator, transport bridge, and
|
|
24
|
+
* test harnesses must agree, or renderer arity enforcement drifts.
|
|
25
|
+
*/
|
|
26
|
+
declare function operationHasInput(op: OperationDef): boolean;
|
|
21
27
|
/**
|
|
22
28
|
* Build the nested bridge tree from the operations' dot-path channels.
|
|
23
29
|
* Mirrors the nesting used by the preload generator and router bridge:
|
|
@@ -26,4 +32,4 @@ interface TransportBridgeResult {
|
|
|
26
32
|
*/
|
|
27
33
|
declare function buildTransportBridge(operations: Map<string, OperationDef>, transport: WoodRpcTransport): TransportBridgeResult;
|
|
28
34
|
|
|
29
|
-
export { type TransportBridgeResult, buildTransportBridge };
|
|
35
|
+
export { type TransportBridgeResult, buildTransportBridge, operationHasInput };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/transport/build_transport_bridge.ts"],"sourcesContent":["import type { OperationDef } from '../types/index.js';\nimport type { WoodRpcManifestEntry } from '../client/index.js';\nimport type { WoodRpcTransport } from './wood_rpc_transport.js';\n\n/**\n * Build a `WoodBridge`-shaped object (the global `__NOEGO_WOOD_BRIDGE__` shape)\n * backed by a `WoodRpcTransport` instead of Electron's `ipcRenderer`.\n *\n * Every operation channel (e.g. `chat.messages.send`) becomes a nested method\n * on the returned bridge that calls `transport.invoke(channel, data)`. `on()`\n * is backed by `transport.subscribe`, and `__rpcManifest` is derived from the\n * same operations map used by codegen — so the existing `getApp()` renderer\n * client can be pointed at this bridge with zero changes.\n *\n * The production Electron preload path is untouched: it still exposes its own\n * `ipcRenderer`-backed bridge. This function is the test-mode equivalent that\n * any `WoodRpcTransport` (in-process or loopback) plugs into.\n */\nexport interface TransportBridgeResult {\n bridge: Record<string, any>;\n}\n\
|
|
1
|
+
{"version":3,"sources":["../../src/transport/build_transport_bridge.ts"],"sourcesContent":["import type { OperationDef } from '../types/index.js';\nimport type { WoodRpcManifestEntry } from '../client/index.js';\nimport type { WoodRpcTransport } from './wood_rpc_transport.js';\n\n/**\n * Build a `WoodBridge`-shaped object (the global `__NOEGO_WOOD_BRIDGE__` shape)\n * backed by a `WoodRpcTransport` instead of Electron's `ipcRenderer`.\n *\n * Every operation channel (e.g. `chat.messages.send`) becomes a nested method\n * on the returned bridge that calls `transport.invoke(channel, data)`. `on()`\n * is backed by `transport.subscribe`, and `__rpcManifest` is derived from the\n * same operations map used by codegen — so the existing `getApp()` renderer\n * client can be pointed at this bridge with zero changes.\n *\n * The production Electron preload path is untouched: it still exposes its own\n * `ipcRenderer`-backed bridge. This function is the test-mode equivalent that\n * any `WoodRpcTransport` (in-process or loopback) plugs into.\n */\nexport interface TransportBridgeResult {\n bridge: Record<string, any>;\n}\n\n/**\n * The ONE definition of \"this operation takes an input argument\": a\n * non-empty object schema. The preload generator, transport bridge, and\n * test harnesses must agree, or renderer arity enforcement drifts.\n */\nexport function operationHasInput(op: OperationDef): boolean {\n return Boolean(\n op.inputSchema &&\n (op.inputSchema as Record<string, unknown>).type === 'object' &&\n Object.keys(\n (op.inputSchema as Record<string, Record<string, unknown>>).properties ?? {},\n ).length > 0,\n );\n}\n\nfunction buildManifest(operations: Map<string, OperationDef>): WoodRpcManifestEntry[] {\n return Array.from(operations.values()).map((op) => ({\n channel: op.channel,\n controller: op.controller,\n action: op.action,\n path: op.channel.split('.'),\n hasInput: operationHasInput(op),\n }));\n}\n\n/**\n * Build the nested bridge tree from the operations' dot-path channels.\n * Mirrors the nesting used by the preload generator and router bridge:\n * intermediate segments become namespace objects, leaf segments become\n * transport-backed invoke functions.\n */\nexport function buildTransportBridge(\n operations: Map<string, OperationDef>,\n transport: WoodRpcTransport,\n): TransportBridgeResult {\n const tree: Record<string, any> = {};\n\n for (const channel of operations.keys()) {\n const parts = channel.split('.');\n let current = tree;\n\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n current[parts[i]] = {};\n }\n current = current[parts[i]];\n }\n\n const leaf = parts[parts.length - 1];\n current[leaf] = (data?: unknown) => transport.invoke(channel, data);\n }\n\n tree.on = (channel: string, callback: (...args: unknown[]) => void) =>\n transport.subscribe(channel, (payload) => callback(payload));\n\n tree.__rpcManifest = buildManifest(operations);\n\n return { bridge: tree };\n}\n"],"mappings":"AA2BO,SAAS,kBAAkB,IAA2B;AAC3D,SAAO;AAAA,IACL,GAAG,eACA,GAAG,YAAwC,SAAS,YACrD,OAAO;AAAA,MACJ,GAAG,YAAwD,cAAc,CAAC;AAAA,IAC7E,EAAE,SAAS;AAAA,EACf;AACF;AAEA,SAAS,cAAc,YAA+D;AACpF,SAAO,MAAM,KAAK,WAAW,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ;AAAA,IAClD,SAAS,GAAG;AAAA,IACZ,YAAY,GAAG;AAAA,IACf,QAAQ,GAAG;AAAA,IACX,MAAM,GAAG,QAAQ,MAAM,GAAG;AAAA,IAC1B,UAAU,kBAAkB,EAAE;AAAA,EAChC,EAAE;AACJ;AAQO,SAAS,qBACd,YACA,WACuB;AACvB,QAAM,OAA4B,CAAC;AAEnC,aAAW,WAAW,WAAW,KAAK,GAAG;AACvC,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,QAAI,UAAU;AAEd,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAI,CAAC,QAAQ,MAAM,CAAC,CAAC,GAAG;AACtB,gBAAQ,MAAM,CAAC,CAAC,IAAI,CAAC;AAAA,MACvB;AACA,gBAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC5B;AAEA,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAQ,IAAI,IAAI,CAAC,SAAmB,UAAU,OAAO,SAAS,IAAI;AAAA,EACpE;AAEA,OAAK,KAAK,CAAC,SAAiB,aAC1B,UAAU,UAAU,SAAS,CAAC,YAAY,SAAS,OAAO,CAAC;AAE7D,OAAK,gBAAgB,cAAc,UAAU;AAE7C,SAAO,EAAE,QAAQ,KAAK;AACxB;","names":[]}
|
|
@@ -2,6 +2,7 @@ import { WoodRouter } from '../router/wood_router.cjs';
|
|
|
2
2
|
import { RouterBridgeEvents } from '../testing/create_router_bridge.cjs';
|
|
3
3
|
import { WoodRpcTransport } from './wood_rpc_transport.cjs';
|
|
4
4
|
import '../types/operations.cjs';
|
|
5
|
+
import '../types/context.cjs';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* A `WoodRpcTransport` that dispatches straight through a real `WoodRouter`
|
|
@@ -2,6 +2,7 @@ import { WoodRouter } from '../router/wood_router.js';
|
|
|
2
2
|
import { RouterBridgeEvents } from '../testing/create_router_bridge.js';
|
|
3
3
|
import { WoodRpcTransport } from './wood_rpc_transport.js';
|
|
4
4
|
import '../types/operations.js';
|
|
5
|
+
import '../types/context.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* A `WoodRpcTransport` that dispatches straight through a real `WoodRouter`
|
|
@@ -5,4 +5,5 @@ export { LoopbackSerializationError, assertLoopbackSerializable } from './loopba
|
|
|
5
5
|
export { TransportBridgeResult, buildTransportBridge } from './build_transport_bridge.cjs';
|
|
6
6
|
import '../router/wood_router.cjs';
|
|
7
7
|
import '../types/operations.cjs';
|
|
8
|
+
import '../types/context.cjs';
|
|
8
9
|
import '../testing/create_router_bridge.cjs';
|
|
@@ -5,4 +5,5 @@ export { LoopbackSerializationError, assertLoopbackSerializable } from './loopba
|
|
|
5
5
|
export { TransportBridgeResult, buildTransportBridge } from './build_transport_bridge.js';
|
|
6
6
|
import '../router/wood_router.js';
|
|
7
7
|
import '../types/operations.js';
|
|
8
|
+
import '../types/context.js';
|
|
8
9
|
import '../testing/create_router_bridge.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/config.ts"],"sourcesContent":["/** Configuration types for wood.config.yml */\n\n/** Top-level Wood configuration parsed from wood.config.yml */\nexport interface WoodConfig {\n root: string;\n outDir: string;\n app: {\n boot: string;\n watch: string[];\n };\n main: {\n entry: string;\n controllers: string;\n middleware: string;\n openapi: string;\n watch: string[];\n };\n renderer: {\n openapi: string;\n componentDir: string;\n controllers: string;\n entry?: string;\n watch?: string[];\n };\n windows: Record<string, WindowDef>;\n database?: {\n path: string;\n migrations?: string;\n };\n assets?: string[];\n dev?: DevConfig;\n build?: ElectronBuilderConfig;\n}\n\n/** BrowserWindow definition from the `windows` section of wood.config.yml */\nexport interface WindowDef {\n title: string;\n width: number;\n height: number;\n defaultRoute: string;\n frame?: boolean;\n transparent?: boolean;\n resizable?: boolean;\n alwaysOnTop?: boolean;\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n show?: boolean;\n parent?: string;\n modal?: boolean;\n vibrancy?: string;\n backgroundMaterial?: string;\n rememberBounds?: boolean;\n contextMenu?: 'native' | 'custom';\n acceptFirstMouse?: boolean;\n nativeQuitFallback?: boolean;\n titleBarStyle?: 'default' | 'hidden' | 'hiddenInset' | 'customButtonsOnHover';\n trafficLightPosition?: { x: number; y: number };\n titleBarOverlay?: boolean | { color?: string; symbolColor?: string; height?: number };\n}\n\n/** Dev-mode settings from the `dev` section of wood.config.yml */\nexport interface DevConfig {\n port?: number;\n watch?: boolean;\n splitServe?: boolean;\n electronArgs?: string[];\n inspectPort?: number;\n backendInspectPort?: number;\n}\n\n/** Electron-builder packaging configuration from the `build` section */\nexport interface ElectronBuilderConfig {\n appId: string;\n productName: string;\n mac?: Record<string, unknown>;\n win?: Record<string, unknown>;\n linux?: Record<string, unknown>;\n [key: string]: unknown;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/config.ts"],"sourcesContent":["/** Configuration types for wood.config.yml */\n\n/** Top-level Wood configuration parsed from wood.config.yml */\nexport interface WoodConfig {\n root: string;\n outDir: string;\n app: {\n boot: string;\n watch: string[];\n };\n main: {\n entry: string;\n controllers: string;\n middleware: string;\n openapi: string;\n watch: string[];\n testing?: MainTestingConfig;\n };\n renderer: {\n openapi: string;\n componentDir: string;\n controllers: string;\n entry?: string;\n watch?: string[];\n testing?: RendererTestingConfig;\n };\n windows: Record<string, WindowDef>;\n database?: {\n path: string;\n migrations?: string;\n };\n assets?: string[];\n dev?: DevConfig;\n build?: ElectronBuilderConfig;\n observability?: ObservabilityConfig;\n}\n\n/**\n * Test-composition hooks for the main process (`main.testing`). Only the\n * application can know how its backend composes on a fresh IoC root; the\n * config names the module so `@noego/wood/testing`'s `testWood(configPath)`\n * finds it without any test-site wiring.\n */\nexport interface MainTestingConfig {\n /**\n * Module (config-relative path) whose default export composes the app's\n * backend on the root the test builder hands it. See `WoodComposeMain`\n * in `@noego/wood/testing`.\n */\n compose?: string;\n}\n\n/** Test-composition hooks for the renderer (`renderer.testing`). */\nexport interface RendererTestingConfig {\n /**\n * Module (config-relative path) whose default export mounts a page's real\n * component for a controller under a DOM driver. See `WoodPageHost` in\n * `@noego/wood/testing`.\n */\n host?: string;\n}\n\n/**\n * Renderer→main IPC trace batching policy. Owned here (wood.config.yml) per\n * the NoEgo observability architecture: the generated preload embeds the\n * resolved values but is not the configuration owner, and changing this policy\n * never changes instrumentation call sites or record semantics.\n */\nexport interface RendererTraceBatchingConfig {\n maxQueuedEvents: number;\n maxBatchEvents: number;\n acknowledgementTimeoutMs: number;\n retryLimit: number;\n retryBaseDelayMs: number;\n}\n\nexport interface ObservabilityConfig {\n trace?: {\n rendererToMain?: {\n batching?: RendererTraceBatchingConfig;\n };\n };\n}\n\n/** BrowserWindow definition from the `windows` section of wood.config.yml */\nexport interface WindowDef {\n title: string;\n width: number;\n height: number;\n defaultRoute: string;\n frame?: boolean;\n transparent?: boolean;\n resizable?: boolean;\n alwaysOnTop?: boolean;\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n show?: boolean;\n parent?: string;\n modal?: boolean;\n vibrancy?: string;\n backgroundMaterial?: string;\n rememberBounds?: boolean;\n contextMenu?: 'native' | 'custom';\n acceptFirstMouse?: boolean;\n nativeQuitFallback?: boolean;\n titleBarStyle?: 'default' | 'hidden' | 'hiddenInset' | 'customButtonsOnHover';\n trafficLightPosition?: { x: number; y: number };\n titleBarOverlay?: boolean | { color?: string; symbolColor?: string; height?: number };\n}\n\n/** Dev-mode settings from the `dev` section of wood.config.yml */\nexport interface DevConfig {\n port?: number;\n watch?: boolean;\n splitServe?: boolean;\n electronArgs?: string[];\n inspectPort?: number;\n backendInspectPort?: number;\n}\n\n/** Electron-builder packaging configuration from the `build` section */\nexport interface ElectronBuilderConfig {\n appId: string;\n productName: string;\n mac?: Record<string, unknown>;\n win?: Record<string, unknown>;\n linux?: Record<string, unknown>;\n [key: string]: unknown;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|