@noego/wood 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +107 -0
- package/bin/axe.js +202 -0
- package/bin/stick.js +96 -0
- package/bin/wood.js +572 -0
- package/dist/bridge/backend_bridge.cjs +186 -0
- package/dist/bridge/backend_bridge.cjs.map +1 -0
- package/dist/bridge/backend_bridge.d.cts +32 -0
- package/dist/bridge/backend_bridge.d.ts +32 -0
- package/dist/bridge/backend_bridge.js +152 -0
- package/dist/bridge/backend_bridge.js.map +1 -0
- package/dist/bridge/backend_entry.cjs +64 -0
- package/dist/bridge/backend_entry.cjs.map +1 -0
- package/dist/bridge/backend_entry.d.cts +14 -0
- package/dist/bridge/backend_entry.d.ts +14 -0
- package/dist/bridge/backend_entry.js +39 -0
- package/dist/bridge/backend_entry.js.map +1 -0
- package/dist/bridge/index.cjs +34 -0
- package/dist/bridge/index.cjs.map +1 -0
- package/dist/bridge/index.d.cts +2 -0
- package/dist/bridge/index.d.ts +2 -0
- package/dist/bridge/index.js +8 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/client/controller_contract.cjs +17 -0
- package/dist/client/controller_contract.cjs.map +1 -0
- package/dist/client/controller_contract.d.cts +15 -0
- package/dist/client/controller_contract.d.ts +15 -0
- package/dist/client/controller_contract.js +1 -0
- package/dist/client/controller_contract.js.map +1 -0
- package/dist/client/global_polyfill.cjs +6 -0
- package/dist/client/global_polyfill.cjs.map +1 -0
- package/dist/client/global_polyfill.d.cts +2 -0
- package/dist/client/global_polyfill.d.ts +2 -0
- package/dist/client/global_polyfill.js +5 -0
- package/dist/client/global_polyfill.js.map +1 -0
- package/dist/client/index.cjs +451 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +75 -0
- package/dist/client/index.d.ts +75 -0
- package/dist/client/index.js +414 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/wood_controller.svelte.cjs +110 -0
- package/dist/client/wood_controller.svelte.cjs.map +1 -0
- package/dist/client/wood_controller.svelte.d.cts +30 -0
- package/dist/client/wood_controller.svelte.d.ts +30 -0
- package/dist/client/wood_controller.svelte.js +86 -0
- package/dist/client/wood_controller.svelte.js.map +1 -0
- package/dist/codegen/controller_registration_generator.cjs +138 -0
- package/dist/codegen/controller_registration_generator.cjs.map +1 -0
- package/dist/codegen/controller_registration_generator.d.cts +18 -0
- package/dist/codegen/controller_registration_generator.d.ts +18 -0
- package/dist/codegen/controller_registration_generator.js +104 -0
- package/dist/codegen/controller_registration_generator.js.map +1 -0
- package/dist/codegen/index.cjs +50 -0
- package/dist/codegen/index.cjs.map +1 -0
- package/dist/codegen/index.d.cts +10 -0
- package/dist/codegen/index.d.ts +10 -0
- package/dist/codegen/index.js +19 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/preload_generator.cjs +151 -0
- package/dist/codegen/preload_generator.cjs.map +1 -0
- package/dist/codegen/preload_generator.d.cts +8 -0
- package/dist/codegen/preload_generator.d.ts +8 -0
- package/dist/codegen/preload_generator.js +127 -0
- package/dist/codegen/preload_generator.js.map +1 -0
- package/dist/codegen/renderer_app_generator.cjs +397 -0
- package/dist/codegen/renderer_app_generator.cjs.map +1 -0
- package/dist/codegen/renderer_app_generator.d.cts +13 -0
- package/dist/codegen/renderer_app_generator.d.ts +13 -0
- package/dist/codegen/renderer_app_generator.js +363 -0
- package/dist/codegen/renderer_app_generator.js.map +1 -0
- package/dist/codegen/renderer_controller_registration_generator.cjs +122 -0
- package/dist/codegen/renderer_controller_registration_generator.cjs.map +1 -0
- package/dist/codegen/renderer_controller_registration_generator.d.cts +9 -0
- package/dist/codegen/renderer_controller_registration_generator.d.ts +9 -0
- package/dist/codegen/renderer_controller_registration_generator.js +88 -0
- package/dist/codegen/renderer_controller_registration_generator.js.map +1 -0
- package/dist/codegen/renderer_view_manifest_generator.cjs +126 -0
- package/dist/codegen/renderer_view_manifest_generator.cjs.map +1 -0
- package/dist/codegen/renderer_view_manifest_generator.d.cts +11 -0
- package/dist/codegen/renderer_view_manifest_generator.d.ts +11 -0
- package/dist/codegen/renderer_view_manifest_generator.js +92 -0
- package/dist/codegen/renderer_view_manifest_generator.js.map +1 -0
- package/dist/codegen/runtime_generator.cjs +156 -0
- package/dist/codegen/runtime_generator.cjs.map +1 -0
- package/dist/codegen/runtime_generator.d.cts +14 -0
- package/dist/codegen/runtime_generator.d.ts +14 -0
- package/dist/codegen/runtime_generator.js +122 -0
- package/dist/codegen/runtime_generator.js.map +1 -0
- package/dist/codegen/test_mock_generator.cjs +98 -0
- package/dist/codegen/test_mock_generator.cjs.map +1 -0
- package/dist/codegen/test_mock_generator.d.cts +5 -0
- package/dist/codegen/test_mock_generator.d.ts +5 -0
- package/dist/codegen/test_mock_generator.js +74 -0
- package/dist/codegen/test_mock_generator.js.map +1 -0
- package/dist/codegen/type_generator.cjs +203 -0
- package/dist/codegen/type_generator.cjs.map +1 -0
- package/dist/codegen/type_generator.d.cts +5 -0
- package/dist/codegen/type_generator.d.ts +5 -0
- package/dist/codegen/type_generator.js +179 -0
- package/dist/codegen/type_generator.js.map +1 -0
- package/dist/components/contextMenu.cjs +163 -0
- package/dist/components/contextMenu.cjs.map +1 -0
- package/dist/components/contextMenu.d.cts +43 -0
- package/dist/components/contextMenu.d.ts +43 -0
- package/dist/components/contextMenu.js +138 -0
- package/dist/components/contextMenu.js.map +1 -0
- package/dist/config/config_parser.cjs +176 -0
- package/dist/config/config_parser.cjs.map +1 -0
- package/dist/config/config_parser.d.cts +9 -0
- package/dist/config/config_parser.d.ts +9 -0
- package/dist/config/config_parser.js +142 -0
- package/dist/config/config_parser.js.map +1 -0
- package/dist/config/index.cjs +29 -0
- package/dist/config/index.cjs.map +1 -0
- package/dist/config/index.d.cts +2 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/controller/__fixtures__/controllers/chat.cjs +32 -0
- package/dist/controller/__fixtures__/controllers/chat.cjs.map +1 -0
- package/dist/controller/__fixtures__/controllers/chat.d.cts +11 -0
- package/dist/controller/__fixtures__/controllers/chat.d.ts +11 -0
- package/dist/controller/__fixtures__/controllers/chat.js +12 -0
- package/dist/controller/__fixtures__/controllers/chat.js.map +1 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.cjs +29 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.cjs.map +1 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.d.cts +3 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.d.ts +3 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.js +5 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.js.map +1 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs +32 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs.map +1 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.d.cts +12 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.d.ts +12 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.js +12 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.js.map +1 -0
- package/dist/controller/__fixtures__/controllers/test.cjs +29 -0
- package/dist/controller/__fixtures__/controllers/test.cjs.map +1 -0
- package/dist/controller/__fixtures__/controllers/test.d.cts +7 -0
- package/dist/controller/__fixtures__/controllers/test.d.ts +7 -0
- package/dist/controller/__fixtures__/controllers/test.js +9 -0
- package/dist/controller/__fixtures__/controllers/test.js.map +1 -0
- package/dist/controller/controller_resolver.cjs +180 -0
- package/dist/controller/controller_resolver.cjs.map +1 -0
- package/dist/controller/controller_resolver.d.cts +51 -0
- package/dist/controller/controller_resolver.d.ts +51 -0
- package/dist/controller/controller_resolver.js +145 -0
- package/dist/controller/controller_resolver.js.map +1 -0
- package/dist/controller/index.cjs +31 -0
- package/dist/controller/index.cjs.map +1 -0
- package/dist/controller/index.d.cts +2 -0
- package/dist/controller/index.d.ts +2 -0
- package/dist/controller/index.js +6 -0
- package/dist/controller/index.js.map +1 -0
- package/dist/dev/backend_watcher.cjs +108 -0
- package/dist/dev/backend_watcher.cjs.map +1 -0
- package/dist/dev/backend_watcher.d.cts +22 -0
- package/dist/dev/backend_watcher.d.ts +22 -0
- package/dist/dev/backend_watcher.js +84 -0
- package/dist/dev/backend_watcher.js.map +1 -0
- package/dist/dev/dev_metadata.cjs +94 -0
- package/dist/dev/dev_metadata.cjs.map +1 -0
- package/dist/dev/dev_metadata.d.cts +20 -0
- package/dist/dev/dev_metadata.d.ts +20 -0
- package/dist/dev/dev_metadata.js +52 -0
- package/dist/dev/dev_metadata.js.map +1 -0
- package/dist/dev/esbuild_backend.cjs +124 -0
- package/dist/dev/esbuild_backend.cjs.map +1 -0
- package/dist/dev/esbuild_backend.d.cts +30 -0
- package/dist/dev/esbuild_backend.d.ts +30 -0
- package/dist/dev/esbuild_backend.js +90 -0
- package/dist/dev/esbuild_backend.js.map +1 -0
- package/dist/dev/index.cjs +57 -0
- package/dist/dev/index.cjs.map +1 -0
- package/dist/dev/index.d.cts +8 -0
- package/dist/dev/index.d.ts +8 -0
- package/dist/dev/index.js +31 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/wood_dev_server.cjs +220 -0
- package/dist/dev/wood_dev_server.cjs.map +1 -0
- package/dist/dev/wood_dev_server.d.cts +39 -0
- package/dist/dev/wood_dev_server.d.ts +39 -0
- package/dist/dev/wood_dev_server.js +186 -0
- package/dist/dev/wood_dev_server.js.map +1 -0
- package/dist/dev/yaml_watcher.cjs +142 -0
- package/dist/dev/yaml_watcher.cjs.map +1 -0
- package/dist/dev/yaml_watcher.d.cts +22 -0
- package/dist/dev/yaml_watcher.d.ts +22 -0
- package/dist/dev/yaml_watcher.js +108 -0
- package/dist/dev/yaml_watcher.js.map +1 -0
- package/dist/electron/index.cjs +176 -0
- package/dist/electron/index.cjs.map +1 -0
- package/dist/electron/index.d.cts +29 -0
- package/dist/electron/index.d.ts +29 -0
- package/dist/electron/index.js +140 -0
- package/dist/electron/index.js.map +1 -0
- package/dist/index.cjs +178 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +41 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/index.cjs +80 -0
- package/dist/ipc/index.cjs.map +1 -0
- package/dist/ipc/index.d.cts +12 -0
- package/dist/ipc/index.d.ts +12 -0
- package/dist/ipc/index.js +57 -0
- package/dist/ipc/index.js.map +1 -0
- package/dist/ipc/shared.cjs +50 -0
- package/dist/ipc/shared.cjs.map +1 -0
- package/dist/ipc/shared.d.cts +10 -0
- package/dist/ipc/shared.d.ts +10 -0
- package/dist/ipc/shared.js +23 -0
- package/dist/ipc/shared.js.map +1 -0
- package/dist/loader/__fixtures__/layouts/app.load.cjs +27 -0
- package/dist/loader/__fixtures__/layouts/app.load.cjs.map +1 -0
- package/dist/loader/__fixtures__/layouts/app.load.d.cts +5 -0
- package/dist/loader/__fixtures__/layouts/app.load.d.ts +5 -0
- package/dist/loader/__fixtures__/layouts/app.load.js +7 -0
- package/dist/loader/__fixtures__/layouts/app.load.js.map +1 -0
- package/dist/loader/__fixtures__/views/test/page.load.cjs +27 -0
- package/dist/loader/__fixtures__/views/test/page.load.cjs.map +1 -0
- package/dist/loader/__fixtures__/views/test/page.load.d.cts +6 -0
- package/dist/loader/__fixtures__/views/test/page.load.d.ts +6 -0
- package/dist/loader/__fixtures__/views/test/page.load.js +7 -0
- package/dist/loader/__fixtures__/views/test/page.load.js.map +1 -0
- package/dist/loader/index.cjs +29 -0
- package/dist/loader/index.cjs.map +1 -0
- package/dist/loader/index.d.cts +3 -0
- package/dist/loader/index.d.ts +3 -0
- package/dist/loader/index.js +5 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/loader_runner.cjs +109 -0
- package/dist/loader/loader_runner.cjs.map +1 -0
- package/dist/loader/loader_runner.d.cts +27 -0
- package/dist/loader/loader_runner.d.ts +27 -0
- package/dist/loader/loader_runner.js +75 -0
- package/dist/loader/loader_runner.js.map +1 -0
- package/dist/main/index.cjs +500 -0
- package/dist/main/index.cjs.map +1 -0
- package/dist/main/index.d.cts +98 -0
- package/dist/main/index.d.ts +98 -0
- package/dist/main/index.js +475 -0
- package/dist/main/index.js.map +1 -0
- package/dist/middleware/__fixtures__/middleware/auth.cjs +44 -0
- package/dist/middleware/__fixtures__/middleware/auth.cjs.map +1 -0
- package/dist/middleware/__fixtures__/middleware/auth.d.cts +6 -0
- package/dist/middleware/__fixtures__/middleware/auth.d.ts +6 -0
- package/dist/middleware/__fixtures__/middleware/auth.js +19 -0
- package/dist/middleware/__fixtures__/middleware/auth.js.map +1 -0
- package/dist/middleware/__fixtures__/middleware/sequence.cjs +47 -0
- package/dist/middleware/__fixtures__/middleware/sequence.cjs.map +1 -0
- package/dist/middleware/__fixtures__/middleware/sequence.d.cts +7 -0
- package/dist/middleware/__fixtures__/middleware/sequence.d.ts +7 -0
- package/dist/middleware/__fixtures__/middleware/sequence.js +21 -0
- package/dist/middleware/__fixtures__/middleware/sequence.js.map +1 -0
- package/dist/middleware/index.cjs +34 -0
- package/dist/middleware/index.cjs.map +1 -0
- package/dist/middleware/index.d.cts +3 -0
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +8 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/middleware_pipeline.cjs +55 -0
- package/dist/middleware/middleware_pipeline.cjs.map +1 -0
- package/dist/middleware/middleware_pipeline.d.cts +13 -0
- package/dist/middleware/middleware_pipeline.d.ts +13 -0
- package/dist/middleware/middleware_pipeline.js +30 -0
- package/dist/middleware/middleware_pipeline.js.map +1 -0
- package/dist/middleware/middleware_resolver.cjs +91 -0
- package/dist/middleware/middleware_resolver.cjs.map +1 -0
- package/dist/middleware/middleware_resolver.d.cts +19 -0
- package/dist/middleware/middleware_resolver.d.ts +19 -0
- package/dist/middleware/middleware_resolver.js +57 -0
- package/dist/middleware/middleware_resolver.js.map +1 -0
- package/dist/navigation/index.cjs +205 -0
- package/dist/navigation/index.cjs.map +1 -0
- package/dist/navigation/index.d.cts +34 -0
- package/dist/navigation/index.d.ts +34 -0
- package/dist/navigation/index.js +176 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/parser/index.cjs +36 -0
- package/dist/parser/index.cjs.map +1 -0
- package/dist/parser/index.d.cts +4 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.js +9 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/operations_parser.cjs +94 -0
- package/dist/parser/operations_parser.cjs.map +1 -0
- package/dist/parser/operations_parser.d.cts +7 -0
- package/dist/parser/operations_parser.d.ts +7 -0
- package/dist/parser/operations_parser.js +59 -0
- package/dist/parser/operations_parser.js.map +1 -0
- package/dist/parser/views_parser.cjs +153 -0
- package/dist/parser/views_parser.cjs.map +1 -0
- package/dist/parser/views_parser.d.cts +11 -0
- package/dist/parser/views_parser.d.ts +11 -0
- package/dist/parser/views_parser.js +118 -0
- package/dist/parser/views_parser.js.map +1 -0
- package/dist/router/index.cjs +31 -0
- package/dist/router/index.cjs.map +1 -0
- package/dist/router/index.d.cts +2 -0
- package/dist/router/index.d.ts +2 -0
- package/dist/router/index.js +6 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/wood_router.cjs +246 -0
- package/dist/router/wood_router.cjs.map +1 -0
- package/dist/router/wood_router.d.cts +70 -0
- package/dist/router/wood_router.d.ts +70 -0
- package/dist/router/wood_router.js +221 -0
- package/dist/router/wood_router.js.map +1 -0
- package/dist/runtime/application_root.cjs +98 -0
- package/dist/runtime/application_root.cjs.map +1 -0
- package/dist/runtime/application_root.d.cts +5 -0
- package/dist/runtime/application_root.d.ts +5 -0
- package/dist/runtime/application_root.js +61 -0
- package/dist/runtime/application_root.js.map +1 -0
- package/dist/runtime/get_container.cjs +96 -0
- package/dist/runtime/get_container.cjs.map +1 -0
- package/dist/runtime/get_container.d.cts +16 -0
- package/dist/runtime/get_container.d.ts +16 -0
- package/dist/runtime/get_container.js +60 -0
- package/dist/runtime/get_container.js.map +1 -0
- package/dist/runtime/index.cjs +49 -0
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.cts +8 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.js +24 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/renderer_log_dispatcher.cjs +79 -0
- package/dist/runtime/renderer_log_dispatcher.cjs.map +1 -0
- package/dist/runtime/renderer_log_dispatcher.d.cts +27 -0
- package/dist/runtime/renderer_log_dispatcher.d.ts +27 -0
- package/dist/runtime/renderer_log_dispatcher.js +54 -0
- package/dist/runtime/renderer_log_dispatcher.js.map +1 -0
- package/dist/runtime/runtime.cjs +158 -0
- package/dist/runtime/runtime.cjs.map +1 -0
- package/dist/runtime/runtime.d.cts +35 -0
- package/dist/runtime/runtime.d.ts +35 -0
- package/dist/runtime/runtime.js +136 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/stick/allow_cli.cjs +39 -0
- package/dist/stick/allow_cli.cjs.map +1 -0
- package/dist/stick/allow_cli.d.cts +6 -0
- package/dist/stick/allow_cli.d.ts +6 -0
- package/dist/stick/allow_cli.js +15 -0
- package/dist/stick/allow_cli.js.map +1 -0
- package/dist/stick/index.cjs +276 -0
- package/dist/stick/index.cjs.map +1 -0
- package/dist/stick/index.d.cts +111 -0
- package/dist/stick/index.d.ts +111 -0
- package/dist/stick/index.js +237 -0
- package/dist/stick/index.js.map +1 -0
- package/dist/stick/static_renderer.cjs +144 -0
- package/dist/stick/static_renderer.cjs.map +1 -0
- package/dist/stick/static_renderer.d.cts +51 -0
- package/dist/stick/static_renderer.d.ts +51 -0
- package/dist/stick/static_renderer.js +119 -0
- package/dist/stick/static_renderer.js.map +1 -0
- package/dist/stick/template_resolver.cjs +156 -0
- package/dist/stick/template_resolver.cjs.map +1 -0
- package/dist/stick/template_resolver.d.cts +7 -0
- package/dist/stick/template_resolver.d.ts +7 -0
- package/dist/stick/template_resolver.js +122 -0
- package/dist/stick/template_resolver.js.map +1 -0
- package/dist/testing/create_controller_harness.cjs +175 -0
- package/dist/testing/create_controller_harness.cjs.map +1 -0
- package/dist/testing/create_controller_harness.d.cts +37 -0
- package/dist/testing/create_controller_harness.d.ts +37 -0
- package/dist/testing/create_controller_harness.js +162 -0
- package/dist/testing/create_controller_harness.js.map +1 -0
- package/dist/testing/create_router_bridge.cjs +103 -0
- package/dist/testing/create_router_bridge.cjs.map +1 -0
- package/dist/testing/create_router_bridge.d.cts +71 -0
- package/dist/testing/create_router_bridge.d.ts +71 -0
- package/dist/testing/create_router_bridge.js +78 -0
- package/dist/testing/create_router_bridge.js.map +1 -0
- package/dist/testing/create_test_container.cjs +72 -0
- package/dist/testing/create_test_container.cjs.map +1 -0
- package/dist/testing/create_test_container.d.cts +14 -0
- package/dist/testing/create_test_container.d.ts +14 -0
- package/dist/testing/create_test_container.js +48 -0
- package/dist/testing/create_test_container.js.map +1 -0
- package/dist/testing/create_test_router.cjs +57 -0
- package/dist/testing/create_test_router.cjs.map +1 -0
- package/dist/testing/create_test_router.d.cts +19 -0
- package/dist/testing/create_test_router.d.ts +19 -0
- package/dist/testing/create_test_router.js +33 -0
- package/dist/testing/create_test_router.js.map +1 -0
- package/dist/testing/index.cjs +48 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +12 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.js +22 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock_electron.cjs +100 -0
- package/dist/testing/mock_electron.cjs.map +1 -0
- package/dist/testing/mock_electron.d.cts +12 -0
- package/dist/testing/mock_electron.d.ts +12 -0
- package/dist/testing/mock_electron.js +75 -0
- package/dist/testing/mock_electron.js.map +1 -0
- package/dist/tracing/index.cjs +56 -0
- package/dist/tracing/index.cjs.map +1 -0
- package/dist/tracing/index.d.cts +4 -0
- package/dist/tracing/index.d.ts +4 -0
- package/dist/tracing/index.js +35 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/trace_hub.cjs +213 -0
- package/dist/tracing/trace_hub.cjs.map +1 -0
- package/dist/tracing/trace_hub.d.cts +47 -0
- package/dist/tracing/trace_hub.d.ts +47 -0
- package/dist/tracing/trace_hub.js +172 -0
- package/dist/tracing/trace_hub.js.map +1 -0
- package/dist/tracing/trace_provider.cjs +200 -0
- package/dist/tracing/trace_provider.cjs.map +1 -0
- package/dist/tracing/trace_provider.d.cts +69 -0
- package/dist/tracing/trace_provider.d.ts +69 -0
- package/dist/tracing/trace_provider.js +179 -0
- package/dist/tracing/trace_provider.js.map +1 -0
- package/dist/types/bridge.cjs +51 -0
- package/dist/types/bridge.cjs.map +1 -0
- package/dist/types/bridge.d.cts +56 -0
- package/dist/types/bridge.d.ts +56 -0
- package/dist/types/bridge.js +25 -0
- package/dist/types/bridge.js.map +1 -0
- package/dist/types/config.cjs +17 -0
- package/dist/types/config.cjs.map +1 -0
- package/dist/types/config.d.cts +74 -0
- package/dist/types/config.d.ts +74 -0
- package/dist/types/config.js +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/context.cjs +17 -0
- package/dist/types/context.cjs.map +1 -0
- package/dist/types/context.d.cts +61 -0
- package/dist/types/context.d.ts +61 -0
- package/dist/types/context.js +1 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/context_menu.cjs +17 -0
- package/dist/types/context_menu.cjs.map +1 -0
- package/dist/types/context_menu.d.cts +30 -0
- package/dist/types/context_menu.d.ts +30 -0
- package/dist/types/context_menu.js +1 -0
- package/dist/types/context_menu.js.map +1 -0
- package/dist/types/index.cjs +33 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +6 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/operations.cjs +17 -0
- package/dist/types/operations.cjs.map +1 -0
- package/dist/types/operations.d.cts +39 -0
- package/dist/types/operations.d.ts +39 -0
- package/dist/types/operations.js +1 -0
- package/dist/types/operations.js.map +1 -0
- package/dist/types/views.cjs +17 -0
- package/dist/types/views.cjs.map +1 -0
- package/dist/types/views.d.cts +44 -0
- package/dist/types/views.d.ts +44 -0
- package/dist/types/views.js +1 -0
- package/dist/types/views.js.map +1 -0
- package/dist/validation/index.cjs +29 -0
- package/dist/validation/index.cjs.map +1 -0
- package/dist/validation/index.d.cts +1 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/index.js +5 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schema_validator.cjs +86 -0
- package/dist/validation/schema_validator.cjs.map +1 -0
- package/dist/validation/schema_validator.d.cts +24 -0
- package/dist/validation/schema_validator.d.ts +24 -0
- package/dist/validation/schema_validator.js +52 -0
- package/dist/validation/schema_validator.js.map +1 -0
- package/dist/window/index.cjs +32 -0
- package/dist/window/index.cjs.map +1 -0
- package/dist/window/index.d.cts +4 -0
- package/dist/window/index.d.ts +4 -0
- package/dist/window/index.js +7 -0
- package/dist/window/index.js.map +1 -0
- package/dist/window/window_manager.cjs +354 -0
- package/dist/window/window_manager.cjs.map +1 -0
- package/dist/window/window_manager.d.cts +172 -0
- package/dist/window/window_manager.d.ts +172 -0
- package/dist/window/window_manager.js +330 -0
- package/dist/window/window_manager.js.map +1 -0
- package/dist/window/window_state_store.cjs +129 -0
- package/dist/window/window_state_store.cjs.map +1 -0
- package/dist/window/window_state_store.d.cts +39 -0
- package/dist/window/window_state_store.d.ts +39 -0
- package/dist/window/window_state_store.js +105 -0
- package/dist/window/window_state_store.js.map +1 -0
- package/loaders/loader.mjs +46 -0
- package/package.json +119 -0
- package/src/components/ContextMenuProvider.svelte +145 -0
- package/src/components/NavigationShell.svelte +204 -0
- package/src/components/WoodRecursiveRender.svelte +91 -0
- package/src/components/contextMenu.ts +228 -0
- package/src/components/index.d.ts +14 -0
- package/src/components/index.js +2 -0
- package/src/stick/WoodRecursiveRender.svelte +74 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var backend_bridge_exports = {};
|
|
30
|
+
__export(backend_bridge_exports, {
|
|
31
|
+
BackendBridge: () => BackendBridge
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(backend_bridge_exports);
|
|
34
|
+
var import_child_process = require("child_process");
|
|
35
|
+
var import_crypto = __toESM(require("crypto"), 1);
|
|
36
|
+
var import_logger = require("@noego/logger");
|
|
37
|
+
const logger = (0, import_logger.getLogger)("wood:bridge");
|
|
38
|
+
class BackendBridge {
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.child = null;
|
|
41
|
+
this.pending = /* @__PURE__ */ new Map();
|
|
42
|
+
this._state = "stopped";
|
|
43
|
+
this.options = options;
|
|
44
|
+
this.timeoutMs = options.timeout ?? 3e4;
|
|
45
|
+
}
|
|
46
|
+
get state() {
|
|
47
|
+
return this._state;
|
|
48
|
+
}
|
|
49
|
+
/** Start the backend process and wait for the ready signal. */
|
|
50
|
+
async start() {
|
|
51
|
+
this._state = "starting";
|
|
52
|
+
this.child = (0, import_child_process.fork)(this.options.backendEntry, [], {
|
|
53
|
+
stdio: ["pipe", "pipe", "pipe", "ipc"]
|
|
54
|
+
});
|
|
55
|
+
this.child.on("message", (msg) => this.onMessage(msg));
|
|
56
|
+
this.child.on("exit", (code, signal) => {
|
|
57
|
+
this._state = "stopped";
|
|
58
|
+
this.rejectAllPending(new Error("Backend process exited"));
|
|
59
|
+
logger.debug(`backend exited code=${code} signal=${signal}`);
|
|
60
|
+
this.options.onExit?.(code, signal);
|
|
61
|
+
});
|
|
62
|
+
this.child.stdout?.pipe(process.stdout);
|
|
63
|
+
this.child.stderr?.pipe(process.stderr);
|
|
64
|
+
await this.waitForReady();
|
|
65
|
+
this.options.onReady?.();
|
|
66
|
+
}
|
|
67
|
+
/** Stop the backend process gracefully (SIGTERM then SIGKILL). */
|
|
68
|
+
async stop() {
|
|
69
|
+
if (!this.child || this.child.killed) return;
|
|
70
|
+
this._state = "stopped";
|
|
71
|
+
this.rejectAllPending(new Error("Backend is stopping"));
|
|
72
|
+
return new Promise((resolve) => {
|
|
73
|
+
const killTimer = setTimeout(() => {
|
|
74
|
+
if (this.child && !this.child.killed) {
|
|
75
|
+
this.child.kill("SIGKILL");
|
|
76
|
+
logger.warn("backend did not exit in time, sent SIGKILL");
|
|
77
|
+
}
|
|
78
|
+
resolve();
|
|
79
|
+
}, 2e3);
|
|
80
|
+
this.child.once("exit", () => {
|
|
81
|
+
clearTimeout(killTimer);
|
|
82
|
+
resolve();
|
|
83
|
+
});
|
|
84
|
+
this.child.kill("SIGTERM");
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Restart the backend process. */
|
|
88
|
+
async restart() {
|
|
89
|
+
this._state = "restarting";
|
|
90
|
+
logger.info("restarting backend");
|
|
91
|
+
await this.stop();
|
|
92
|
+
await this.start();
|
|
93
|
+
}
|
|
94
|
+
/** Send a request to the backend and return the result. */
|
|
95
|
+
call(channel, data) {
|
|
96
|
+
if (this._state !== "ready") {
|
|
97
|
+
return Promise.reject(new Error(`Backend not ready (state: ${this._state})`));
|
|
98
|
+
}
|
|
99
|
+
const id = import_crypto.default.randomUUID();
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
const timer = setTimeout(() => {
|
|
102
|
+
this.pending.delete(id);
|
|
103
|
+
reject(new Error(`Backend timeout: ${channel}`));
|
|
104
|
+
}, this.timeoutMs);
|
|
105
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
106
|
+
this.child.send({
|
|
107
|
+
type: "request",
|
|
108
|
+
id,
|
|
109
|
+
channel,
|
|
110
|
+
data
|
|
111
|
+
});
|
|
112
|
+
logger.debug(`call ${id}: ${channel}`);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// -- Private --
|
|
116
|
+
waitForReady() {
|
|
117
|
+
return new Promise((resolve, reject) => {
|
|
118
|
+
const timer = setTimeout(() => {
|
|
119
|
+
reject(new Error("Backend failed to send ready signal within timeout"));
|
|
120
|
+
}, this.timeoutMs);
|
|
121
|
+
const readyHandler = (msg) => {
|
|
122
|
+
if (msg?.type === "ready") {
|
|
123
|
+
clearTimeout(timer);
|
|
124
|
+
this.child?.removeListener("message", readyHandler);
|
|
125
|
+
this._state = "ready";
|
|
126
|
+
logger.info("backend ready");
|
|
127
|
+
resolve();
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
this.child.on("message", readyHandler);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
onMessage(msg) {
|
|
134
|
+
const message = msg;
|
|
135
|
+
if (message.type === "response") {
|
|
136
|
+
const resp = message;
|
|
137
|
+
const entry = this.pending.get(resp.id);
|
|
138
|
+
if (entry) {
|
|
139
|
+
clearTimeout(entry.timer);
|
|
140
|
+
this.pending.delete(resp.id);
|
|
141
|
+
if (resp.error) {
|
|
142
|
+
entry.reject(new Error(resp.error.message ?? "Backend error"));
|
|
143
|
+
} else {
|
|
144
|
+
entry.resolve(resp.result);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (message.type === "push") {
|
|
149
|
+
const push = message;
|
|
150
|
+
this.options.onPush?.(push.channel, push.data);
|
|
151
|
+
}
|
|
152
|
+
if (message.type === "electron-api") {
|
|
153
|
+
this.handleElectronProxy(message);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async handleElectronProxy(msg) {
|
|
157
|
+
if (!this.options.onElectronApi) return;
|
|
158
|
+
try {
|
|
159
|
+
const result = await this.options.onElectronApi(msg.id, msg.api, msg.args);
|
|
160
|
+
this.child?.send({
|
|
161
|
+
type: "electron-api-response",
|
|
162
|
+
id: msg.id,
|
|
163
|
+
result
|
|
164
|
+
});
|
|
165
|
+
} catch (err) {
|
|
166
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
167
|
+
this.child?.send({
|
|
168
|
+
type: "electron-api-response",
|
|
169
|
+
id: msg.id,
|
|
170
|
+
error: { message: error.message, name: error.name }
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
rejectAllPending(error) {
|
|
175
|
+
for (const [, entry] of this.pending) {
|
|
176
|
+
clearTimeout(entry.timer);
|
|
177
|
+
entry.reject(error);
|
|
178
|
+
}
|
|
179
|
+
this.pending.clear();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
183
|
+
0 && (module.exports = {
|
|
184
|
+
BackendBridge
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=backend_bridge.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bridge/backend_bridge.ts"],"sourcesContent":["import { fork, type ChildProcess } from 'child_process';\nimport crypto from 'crypto';\nimport { getLogger } from '@noego/logger';\nimport type {\n BridgeRequest,\n BridgeResponse,\n BridgeReady,\n BridgePush,\n BridgeElectronApi,\n} from '../types/bridge';\n\nconst logger = getLogger('wood:bridge');\n\ninterface PendingCall {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout;\n}\n\nexport interface BridgeOptions {\n backendEntry: string;\n timeout?: number;\n onReady?: () => void;\n onPush?: (channel: string, data: unknown) => void;\n onElectronApi?: (id: string, api: string, args: unknown[]) => Promise<unknown>;\n onExit?: (code: number | null, signal: string | null) => void;\n}\n\ntype BridgeState = 'stopped' | 'starting' | 'ready' | 'restarting';\n\nexport class BackendBridge {\n private child: ChildProcess | null = null;\n private pending = new Map<string, PendingCall>();\n private readonly options: BridgeOptions;\n private readonly timeoutMs: number;\n private _state: BridgeState = 'stopped';\n\n constructor(options: BridgeOptions) {\n this.options = options;\n this.timeoutMs = options.timeout ?? 30_000;\n }\n\n get state(): BridgeState {\n return this._state;\n }\n\n /** Start the backend process and wait for the ready signal. */\n async start(): Promise<void> {\n this._state = 'starting';\n\n this.child = fork(this.options.backendEntry, [], {\n stdio: ['pipe', 'pipe', 'pipe', 'ipc'],\n });\n\n this.child.on('message', (msg: unknown) => this.onMessage(msg));\n this.child.on('exit', (code, signal) => {\n this._state = 'stopped';\n this.rejectAllPending(new Error('Backend process exited'));\n logger.debug(`backend exited code=${code} signal=${signal}`);\n this.options.onExit?.(code, signal);\n });\n\n this.child.stdout?.pipe(process.stdout);\n this.child.stderr?.pipe(process.stderr);\n\n await this.waitForReady();\n this.options.onReady?.();\n }\n\n /** Stop the backend process gracefully (SIGTERM then SIGKILL). */\n async stop(): Promise<void> {\n if (!this.child || this.child.killed) return;\n\n this._state = 'stopped';\n this.rejectAllPending(new Error('Backend is stopping'));\n\n return new Promise<void>((resolve) => {\n const killTimer = setTimeout(() => {\n if (this.child && !this.child.killed) {\n this.child.kill('SIGKILL');\n logger.warn('backend did not exit in time, sent SIGKILL');\n }\n resolve();\n }, 2000);\n\n this.child!.once('exit', () => {\n clearTimeout(killTimer);\n resolve();\n });\n\n this.child!.kill('SIGTERM');\n });\n }\n\n /** Restart the backend process. */\n async restart(): Promise<void> {\n this._state = 'restarting';\n logger.info('restarting backend');\n await this.stop();\n await this.start();\n }\n\n /** Send a request to the backend and return the result. */\n call(channel: string, data: unknown): Promise<unknown> {\n if (this._state !== 'ready') {\n return Promise.reject(new Error(`Backend not ready (state: ${this._state})`));\n }\n\n const id = crypto.randomUUID();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`Backend timeout: ${channel}`));\n }, this.timeoutMs);\n\n this.pending.set(id, { resolve, reject, timer });\n\n this.child!.send({\n type: 'request',\n id,\n channel,\n data,\n } satisfies BridgeRequest);\n\n logger.debug(`call ${id}: ${channel}`);\n });\n }\n\n // -- Private --\n\n private waitForReady(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error('Backend failed to send ready signal within timeout'));\n }, this.timeoutMs);\n\n const readyHandler = (msg: unknown) => {\n if ((msg as BridgeReady)?.type === 'ready') {\n clearTimeout(timer);\n this.child?.removeListener('message', readyHandler);\n this._state = 'ready';\n logger.info('backend ready');\n resolve();\n }\n };\n\n this.child!.on('message', readyHandler);\n });\n }\n\n private onMessage(msg: unknown): void {\n const message = msg as BridgeResponse | BridgePush | BridgeElectronApi;\n\n if (message.type === 'response') {\n const resp = message as BridgeResponse;\n const entry = this.pending.get(resp.id);\n if (entry) {\n clearTimeout(entry.timer);\n this.pending.delete(resp.id);\n if (resp.error) {\n entry.reject(new Error(resp.error.message ?? 'Backend error'));\n } else {\n entry.resolve(resp.result);\n }\n }\n }\n\n if (message.type === 'push') {\n const push = message as BridgePush;\n this.options.onPush?.(push.channel, push.data);\n }\n\n if (message.type === 'electron-api') {\n this.handleElectronProxy(message as BridgeElectronApi);\n }\n }\n\n private async handleElectronProxy(msg: BridgeElectronApi): Promise<void> {\n if (!this.options.onElectronApi) return;\n\n try {\n const result = await this.options.onElectronApi(msg.id, msg.api, msg.args);\n this.child?.send({\n type: 'electron-api-response',\n id: msg.id,\n result,\n });\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.child?.send({\n type: 'electron-api-response',\n id: msg.id,\n error: { message: error.message, name: error.name },\n });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [, entry] of this.pending) {\n clearTimeout(entry.timer);\n entry.reject(error);\n }\n this.pending.clear();\n }\n}\n"],"mappings":"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","names":["crypto"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
interface BridgeOptions {
|
|
2
|
+
backendEntry: string;
|
|
3
|
+
timeout?: number;
|
|
4
|
+
onReady?: () => void;
|
|
5
|
+
onPush?: (channel: string, data: unknown) => void;
|
|
6
|
+
onElectronApi?: (id: string, api: string, args: unknown[]) => Promise<unknown>;
|
|
7
|
+
onExit?: (code: number | null, signal: string | null) => void;
|
|
8
|
+
}
|
|
9
|
+
type BridgeState = 'stopped' | 'starting' | 'ready' | 'restarting';
|
|
10
|
+
declare class BackendBridge {
|
|
11
|
+
private child;
|
|
12
|
+
private pending;
|
|
13
|
+
private readonly options;
|
|
14
|
+
private readonly timeoutMs;
|
|
15
|
+
private _state;
|
|
16
|
+
constructor(options: BridgeOptions);
|
|
17
|
+
get state(): BridgeState;
|
|
18
|
+
/** Start the backend process and wait for the ready signal. */
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
/** Stop the backend process gracefully (SIGTERM then SIGKILL). */
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
/** Restart the backend process. */
|
|
23
|
+
restart(): Promise<void>;
|
|
24
|
+
/** Send a request to the backend and return the result. */
|
|
25
|
+
call(channel: string, data: unknown): Promise<unknown>;
|
|
26
|
+
private waitForReady;
|
|
27
|
+
private onMessage;
|
|
28
|
+
private handleElectronProxy;
|
|
29
|
+
private rejectAllPending;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { BackendBridge, type BridgeOptions };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
interface BridgeOptions {
|
|
2
|
+
backendEntry: string;
|
|
3
|
+
timeout?: number;
|
|
4
|
+
onReady?: () => void;
|
|
5
|
+
onPush?: (channel: string, data: unknown) => void;
|
|
6
|
+
onElectronApi?: (id: string, api: string, args: unknown[]) => Promise<unknown>;
|
|
7
|
+
onExit?: (code: number | null, signal: string | null) => void;
|
|
8
|
+
}
|
|
9
|
+
type BridgeState = 'stopped' | 'starting' | 'ready' | 'restarting';
|
|
10
|
+
declare class BackendBridge {
|
|
11
|
+
private child;
|
|
12
|
+
private pending;
|
|
13
|
+
private readonly options;
|
|
14
|
+
private readonly timeoutMs;
|
|
15
|
+
private _state;
|
|
16
|
+
constructor(options: BridgeOptions);
|
|
17
|
+
get state(): BridgeState;
|
|
18
|
+
/** Start the backend process and wait for the ready signal. */
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
/** Stop the backend process gracefully (SIGTERM then SIGKILL). */
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
/** Restart the backend process. */
|
|
23
|
+
restart(): Promise<void>;
|
|
24
|
+
/** Send a request to the backend and return the result. */
|
|
25
|
+
call(channel: string, data: unknown): Promise<unknown>;
|
|
26
|
+
private waitForReady;
|
|
27
|
+
private onMessage;
|
|
28
|
+
private handleElectronProxy;
|
|
29
|
+
private rejectAllPending;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { BackendBridge, type BridgeOptions };
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { fork } from "child_process";
|
|
2
|
+
import crypto from "crypto";
|
|
3
|
+
import { getLogger } from "@noego/logger";
|
|
4
|
+
const logger = getLogger("wood:bridge");
|
|
5
|
+
class BackendBridge {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.child = null;
|
|
8
|
+
this.pending = /* @__PURE__ */ new Map();
|
|
9
|
+
this._state = "stopped";
|
|
10
|
+
this.options = options;
|
|
11
|
+
this.timeoutMs = options.timeout ?? 3e4;
|
|
12
|
+
}
|
|
13
|
+
get state() {
|
|
14
|
+
return this._state;
|
|
15
|
+
}
|
|
16
|
+
/** Start the backend process and wait for the ready signal. */
|
|
17
|
+
async start() {
|
|
18
|
+
this._state = "starting";
|
|
19
|
+
this.child = fork(this.options.backendEntry, [], {
|
|
20
|
+
stdio: ["pipe", "pipe", "pipe", "ipc"]
|
|
21
|
+
});
|
|
22
|
+
this.child.on("message", (msg) => this.onMessage(msg));
|
|
23
|
+
this.child.on("exit", (code, signal) => {
|
|
24
|
+
this._state = "stopped";
|
|
25
|
+
this.rejectAllPending(new Error("Backend process exited"));
|
|
26
|
+
logger.debug(`backend exited code=${code} signal=${signal}`);
|
|
27
|
+
this.options.onExit?.(code, signal);
|
|
28
|
+
});
|
|
29
|
+
this.child.stdout?.pipe(process.stdout);
|
|
30
|
+
this.child.stderr?.pipe(process.stderr);
|
|
31
|
+
await this.waitForReady();
|
|
32
|
+
this.options.onReady?.();
|
|
33
|
+
}
|
|
34
|
+
/** Stop the backend process gracefully (SIGTERM then SIGKILL). */
|
|
35
|
+
async stop() {
|
|
36
|
+
if (!this.child || this.child.killed) return;
|
|
37
|
+
this._state = "stopped";
|
|
38
|
+
this.rejectAllPending(new Error("Backend is stopping"));
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
const killTimer = setTimeout(() => {
|
|
41
|
+
if (this.child && !this.child.killed) {
|
|
42
|
+
this.child.kill("SIGKILL");
|
|
43
|
+
logger.warn("backend did not exit in time, sent SIGKILL");
|
|
44
|
+
}
|
|
45
|
+
resolve();
|
|
46
|
+
}, 2e3);
|
|
47
|
+
this.child.once("exit", () => {
|
|
48
|
+
clearTimeout(killTimer);
|
|
49
|
+
resolve();
|
|
50
|
+
});
|
|
51
|
+
this.child.kill("SIGTERM");
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/** Restart the backend process. */
|
|
55
|
+
async restart() {
|
|
56
|
+
this._state = "restarting";
|
|
57
|
+
logger.info("restarting backend");
|
|
58
|
+
await this.stop();
|
|
59
|
+
await this.start();
|
|
60
|
+
}
|
|
61
|
+
/** Send a request to the backend and return the result. */
|
|
62
|
+
call(channel, data) {
|
|
63
|
+
if (this._state !== "ready") {
|
|
64
|
+
return Promise.reject(new Error(`Backend not ready (state: ${this._state})`));
|
|
65
|
+
}
|
|
66
|
+
const id = crypto.randomUUID();
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const timer = setTimeout(() => {
|
|
69
|
+
this.pending.delete(id);
|
|
70
|
+
reject(new Error(`Backend timeout: ${channel}`));
|
|
71
|
+
}, this.timeoutMs);
|
|
72
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
73
|
+
this.child.send({
|
|
74
|
+
type: "request",
|
|
75
|
+
id,
|
|
76
|
+
channel,
|
|
77
|
+
data
|
|
78
|
+
});
|
|
79
|
+
logger.debug(`call ${id}: ${channel}`);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// -- Private --
|
|
83
|
+
waitForReady() {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
const timer = setTimeout(() => {
|
|
86
|
+
reject(new Error("Backend failed to send ready signal within timeout"));
|
|
87
|
+
}, this.timeoutMs);
|
|
88
|
+
const readyHandler = (msg) => {
|
|
89
|
+
if (msg?.type === "ready") {
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
this.child?.removeListener("message", readyHandler);
|
|
92
|
+
this._state = "ready";
|
|
93
|
+
logger.info("backend ready");
|
|
94
|
+
resolve();
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
this.child.on("message", readyHandler);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
onMessage(msg) {
|
|
101
|
+
const message = msg;
|
|
102
|
+
if (message.type === "response") {
|
|
103
|
+
const resp = message;
|
|
104
|
+
const entry = this.pending.get(resp.id);
|
|
105
|
+
if (entry) {
|
|
106
|
+
clearTimeout(entry.timer);
|
|
107
|
+
this.pending.delete(resp.id);
|
|
108
|
+
if (resp.error) {
|
|
109
|
+
entry.reject(new Error(resp.error.message ?? "Backend error"));
|
|
110
|
+
} else {
|
|
111
|
+
entry.resolve(resp.result);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (message.type === "push") {
|
|
116
|
+
const push = message;
|
|
117
|
+
this.options.onPush?.(push.channel, push.data);
|
|
118
|
+
}
|
|
119
|
+
if (message.type === "electron-api") {
|
|
120
|
+
this.handleElectronProxy(message);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async handleElectronProxy(msg) {
|
|
124
|
+
if (!this.options.onElectronApi) return;
|
|
125
|
+
try {
|
|
126
|
+
const result = await this.options.onElectronApi(msg.id, msg.api, msg.args);
|
|
127
|
+
this.child?.send({
|
|
128
|
+
type: "electron-api-response",
|
|
129
|
+
id: msg.id,
|
|
130
|
+
result
|
|
131
|
+
});
|
|
132
|
+
} catch (err) {
|
|
133
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
134
|
+
this.child?.send({
|
|
135
|
+
type: "electron-api-response",
|
|
136
|
+
id: msg.id,
|
|
137
|
+
error: { message: error.message, name: error.name }
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
rejectAllPending(error) {
|
|
142
|
+
for (const [, entry] of this.pending) {
|
|
143
|
+
clearTimeout(entry.timer);
|
|
144
|
+
entry.reject(error);
|
|
145
|
+
}
|
|
146
|
+
this.pending.clear();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export {
|
|
150
|
+
BackendBridge
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=backend_bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bridge/backend_bridge.ts"],"sourcesContent":["import { fork, type ChildProcess } from 'child_process';\nimport crypto from 'crypto';\nimport { getLogger } from '@noego/logger';\nimport type {\n BridgeRequest,\n BridgeResponse,\n BridgeReady,\n BridgePush,\n BridgeElectronApi,\n} from '../types/bridge';\n\nconst logger = getLogger('wood:bridge');\n\ninterface PendingCall {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout;\n}\n\nexport interface BridgeOptions {\n backendEntry: string;\n timeout?: number;\n onReady?: () => void;\n onPush?: (channel: string, data: unknown) => void;\n onElectronApi?: (id: string, api: string, args: unknown[]) => Promise<unknown>;\n onExit?: (code: number | null, signal: string | null) => void;\n}\n\ntype BridgeState = 'stopped' | 'starting' | 'ready' | 'restarting';\n\nexport class BackendBridge {\n private child: ChildProcess | null = null;\n private pending = new Map<string, PendingCall>();\n private readonly options: BridgeOptions;\n private readonly timeoutMs: number;\n private _state: BridgeState = 'stopped';\n\n constructor(options: BridgeOptions) {\n this.options = options;\n this.timeoutMs = options.timeout ?? 30_000;\n }\n\n get state(): BridgeState {\n return this._state;\n }\n\n /** Start the backend process and wait for the ready signal. */\n async start(): Promise<void> {\n this._state = 'starting';\n\n this.child = fork(this.options.backendEntry, [], {\n stdio: ['pipe', 'pipe', 'pipe', 'ipc'],\n });\n\n this.child.on('message', (msg: unknown) => this.onMessage(msg));\n this.child.on('exit', (code, signal) => {\n this._state = 'stopped';\n this.rejectAllPending(new Error('Backend process exited'));\n logger.debug(`backend exited code=${code} signal=${signal}`);\n this.options.onExit?.(code, signal);\n });\n\n this.child.stdout?.pipe(process.stdout);\n this.child.stderr?.pipe(process.stderr);\n\n await this.waitForReady();\n this.options.onReady?.();\n }\n\n /** Stop the backend process gracefully (SIGTERM then SIGKILL). */\n async stop(): Promise<void> {\n if (!this.child || this.child.killed) return;\n\n this._state = 'stopped';\n this.rejectAllPending(new Error('Backend is stopping'));\n\n return new Promise<void>((resolve) => {\n const killTimer = setTimeout(() => {\n if (this.child && !this.child.killed) {\n this.child.kill('SIGKILL');\n logger.warn('backend did not exit in time, sent SIGKILL');\n }\n resolve();\n }, 2000);\n\n this.child!.once('exit', () => {\n clearTimeout(killTimer);\n resolve();\n });\n\n this.child!.kill('SIGTERM');\n });\n }\n\n /** Restart the backend process. */\n async restart(): Promise<void> {\n this._state = 'restarting';\n logger.info('restarting backend');\n await this.stop();\n await this.start();\n }\n\n /** Send a request to the backend and return the result. */\n call(channel: string, data: unknown): Promise<unknown> {\n if (this._state !== 'ready') {\n return Promise.reject(new Error(`Backend not ready (state: ${this._state})`));\n }\n\n const id = crypto.randomUUID();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`Backend timeout: ${channel}`));\n }, this.timeoutMs);\n\n this.pending.set(id, { resolve, reject, timer });\n\n this.child!.send({\n type: 'request',\n id,\n channel,\n data,\n } satisfies BridgeRequest);\n\n logger.debug(`call ${id}: ${channel}`);\n });\n }\n\n // -- Private --\n\n private waitForReady(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error('Backend failed to send ready signal within timeout'));\n }, this.timeoutMs);\n\n const readyHandler = (msg: unknown) => {\n if ((msg as BridgeReady)?.type === 'ready') {\n clearTimeout(timer);\n this.child?.removeListener('message', readyHandler);\n this._state = 'ready';\n logger.info('backend ready');\n resolve();\n }\n };\n\n this.child!.on('message', readyHandler);\n });\n }\n\n private onMessage(msg: unknown): void {\n const message = msg as BridgeResponse | BridgePush | BridgeElectronApi;\n\n if (message.type === 'response') {\n const resp = message as BridgeResponse;\n const entry = this.pending.get(resp.id);\n if (entry) {\n clearTimeout(entry.timer);\n this.pending.delete(resp.id);\n if (resp.error) {\n entry.reject(new Error(resp.error.message ?? 'Backend error'));\n } else {\n entry.resolve(resp.result);\n }\n }\n }\n\n if (message.type === 'push') {\n const push = message as BridgePush;\n this.options.onPush?.(push.channel, push.data);\n }\n\n if (message.type === 'electron-api') {\n this.handleElectronProxy(message as BridgeElectronApi);\n }\n }\n\n private async handleElectronProxy(msg: BridgeElectronApi): Promise<void> {\n if (!this.options.onElectronApi) return;\n\n try {\n const result = await this.options.onElectronApi(msg.id, msg.api, msg.args);\n this.child?.send({\n type: 'electron-api-response',\n id: msg.id,\n result,\n });\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.child?.send({\n type: 'electron-api-response',\n id: msg.id,\n error: { message: error.message, name: error.name },\n });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [, entry] of this.pending) {\n clearTimeout(entry.timer);\n entry.reject(error);\n }\n this.pending.clear();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var backend_entry_exports = {};
|
|
20
|
+
__export(backend_entry_exports, {
|
|
21
|
+
pushEvent: () => pushEvent,
|
|
22
|
+
startBackendLoop: () => startBackendLoop
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(backend_entry_exports);
|
|
25
|
+
function startBackendLoop(handler) {
|
|
26
|
+
process.on("message", async (msg) => {
|
|
27
|
+
const message = msg;
|
|
28
|
+
if (message.type === "request") {
|
|
29
|
+
try {
|
|
30
|
+
const result = await handler.dispatch(message.channel, message.data);
|
|
31
|
+
process.send({
|
|
32
|
+
type: "response",
|
|
33
|
+
id: message.id,
|
|
34
|
+
result
|
|
35
|
+
});
|
|
36
|
+
} catch (err) {
|
|
37
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
38
|
+
process.send({
|
|
39
|
+
type: "response",
|
|
40
|
+
id: message.id,
|
|
41
|
+
error: {
|
|
42
|
+
message: error.message,
|
|
43
|
+
name: error.name,
|
|
44
|
+
stack: error.stack
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
process.send({ type: "ready" });
|
|
51
|
+
}
|
|
52
|
+
function pushEvent(channel, data) {
|
|
53
|
+
process.send({
|
|
54
|
+
type: "push",
|
|
55
|
+
channel,
|
|
56
|
+
data
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
60
|
+
0 && (module.exports = {
|
|
61
|
+
pushEvent,
|
|
62
|
+
startBackendLoop
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=backend_entry.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bridge/backend_entry.ts"],"sourcesContent":["import type { BridgeRequest, BridgePush, BridgeResponse, BridgeReady } from '../types/bridge.cjs';\n\nexport interface BackendHandler {\n dispatch(channel: string, data: unknown): Promise<unknown>;\n}\n\n/**\n * Start the backend message loop.\n * Called from the backend entry point after initialization.\n */\nexport function startBackendLoop(handler: BackendHandler): void {\n process.on('message', async (msg: unknown) => {\n const message = msg as BridgeRequest;\n\n if (message.type === 'request') {\n try {\n const result = await handler.dispatch(message.channel, message.data);\n process.send!({\n type: 'response',\n id: message.id,\n result,\n } satisfies BridgeResponse);\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error(String(err));\n process.send!({\n type: 'response',\n id: message.id,\n error: {\n message: error.message,\n name: error.name,\n stack: error.stack,\n },\n } satisfies BridgeResponse);\n }\n }\n });\n\n // Signal ready to the shell process\n process.send!({ type: 'ready' } satisfies BridgeReady);\n}\n\n/**\n * Push an event to the shell (forwarded to all renderers).\n */\nexport function pushEvent(channel: string, data: unknown): void {\n process.send!({\n type: 'push',\n channel,\n data,\n } satisfies BridgePush);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUO,SAAS,iBAAiB,SAA+B;AAC9D,UAAQ,GAAG,WAAW,OAAO,QAAiB;AAC5C,UAAM,UAAU;AAEhB,QAAI,QAAQ,SAAS,WAAW;AAC9B,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,SAAS,QAAQ,IAAI;AACnE,gBAAQ,KAAM;AAAA,UACZ,MAAM;AAAA,UACN,IAAI,QAAQ;AAAA,UACZ;AAAA,QACF,CAA0B;AAAA,MAC5B,SAAS,KAAc;AACrB,cAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAQ,KAAM;AAAA,UACZ,MAAM;AAAA,UACN,IAAI,QAAQ;AAAA,UACZ,OAAO;AAAA,YACL,SAAS,MAAM;AAAA,YACf,MAAM,MAAM;AAAA,YACZ,OAAO,MAAM;AAAA,UACf;AAAA,QACF,CAA0B;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC;AAGD,UAAQ,KAAM,EAAE,MAAM,QAAQ,CAAuB;AACvD;AAKO,SAAS,UAAU,SAAiB,MAAqB;AAC9D,UAAQ,KAAM;AAAA,IACZ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,CAAsB;AACxB;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface BackendHandler {
|
|
2
|
+
dispatch(channel: string, data: unknown): Promise<unknown>;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Start the backend message loop.
|
|
6
|
+
* Called from the backend entry point after initialization.
|
|
7
|
+
*/
|
|
8
|
+
declare function startBackendLoop(handler: BackendHandler): void;
|
|
9
|
+
/**
|
|
10
|
+
* Push an event to the shell (forwarded to all renderers).
|
|
11
|
+
*/
|
|
12
|
+
declare function pushEvent(channel: string, data: unknown): void;
|
|
13
|
+
|
|
14
|
+
export { type BackendHandler, pushEvent, startBackendLoop };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface BackendHandler {
|
|
2
|
+
dispatch(channel: string, data: unknown): Promise<unknown>;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Start the backend message loop.
|
|
6
|
+
* Called from the backend entry point after initialization.
|
|
7
|
+
*/
|
|
8
|
+
declare function startBackendLoop(handler: BackendHandler): void;
|
|
9
|
+
/**
|
|
10
|
+
* Push an event to the shell (forwarded to all renderers).
|
|
11
|
+
*/
|
|
12
|
+
declare function pushEvent(channel: string, data: unknown): void;
|
|
13
|
+
|
|
14
|
+
export { type BackendHandler, pushEvent, startBackendLoop };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
function startBackendLoop(handler) {
|
|
2
|
+
process.on("message", async (msg) => {
|
|
3
|
+
const message = msg;
|
|
4
|
+
if (message.type === "request") {
|
|
5
|
+
try {
|
|
6
|
+
const result = await handler.dispatch(message.channel, message.data);
|
|
7
|
+
process.send({
|
|
8
|
+
type: "response",
|
|
9
|
+
id: message.id,
|
|
10
|
+
result
|
|
11
|
+
});
|
|
12
|
+
} catch (err) {
|
|
13
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
14
|
+
process.send({
|
|
15
|
+
type: "response",
|
|
16
|
+
id: message.id,
|
|
17
|
+
error: {
|
|
18
|
+
message: error.message,
|
|
19
|
+
name: error.name,
|
|
20
|
+
stack: error.stack
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
process.send({ type: "ready" });
|
|
27
|
+
}
|
|
28
|
+
function pushEvent(channel, data) {
|
|
29
|
+
process.send({
|
|
30
|
+
type: "push",
|
|
31
|
+
channel,
|
|
32
|
+
data
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
pushEvent,
|
|
37
|
+
startBackendLoop
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=backend_entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bridge/backend_entry.ts"],"sourcesContent":["import type { BridgeRequest, BridgePush, BridgeResponse, BridgeReady } from '../types/bridge.js';\n\nexport interface BackendHandler {\n dispatch(channel: string, data: unknown): Promise<unknown>;\n}\n\n/**\n * Start the backend message loop.\n * Called from the backend entry point after initialization.\n */\nexport function startBackendLoop(handler: BackendHandler): void {\n process.on('message', async (msg: unknown) => {\n const message = msg as BridgeRequest;\n\n if (message.type === 'request') {\n try {\n const result = await handler.dispatch(message.channel, message.data);\n process.send!({\n type: 'response',\n id: message.id,\n result,\n } satisfies BridgeResponse);\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error(String(err));\n process.send!({\n type: 'response',\n id: message.id,\n error: {\n message: error.message,\n name: error.name,\n stack: error.stack,\n },\n } satisfies BridgeResponse);\n }\n }\n });\n\n // Signal ready to the shell process\n process.send!({ type: 'ready' } satisfies BridgeReady);\n}\n\n/**\n * Push an event to the shell (forwarded to all renderers).\n */\nexport function pushEvent(channel: string, data: unknown): void {\n process.send!({\n type: 'push',\n channel,\n data,\n } satisfies BridgePush);\n}\n"],"mappings":"AAUO,SAAS,iBAAiB,SAA+B;AAC9D,UAAQ,GAAG,WAAW,OAAO,QAAiB;AAC5C,UAAM,UAAU;AAEhB,QAAI,QAAQ,SAAS,WAAW;AAC9B,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,SAAS,QAAQ,IAAI;AACnE,gBAAQ,KAAM;AAAA,UACZ,MAAM;AAAA,UACN,IAAI,QAAQ;AAAA,UACZ;AAAA,QACF,CAA0B;AAAA,MAC5B,SAAS,KAAc;AACrB,cAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAQ,KAAM;AAAA,UACZ,MAAM;AAAA,UACN,IAAI,QAAQ;AAAA,UACZ,OAAO;AAAA,YACL,SAAS,MAAM;AAAA,YACf,MAAM,MAAM;AAAA,YACZ,OAAO,MAAM;AAAA,UACf;AAAA,QACF,CAA0B;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC;AAGD,UAAQ,KAAM,EAAE,MAAM,QAAQ,CAAuB;AACvD;AAKO,SAAS,UAAU,SAAiB,MAAqB;AAC9D,UAAQ,KAAM;AAAA,IACZ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,CAAsB;AACxB;","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var bridge_exports = {};
|
|
20
|
+
__export(bridge_exports, {
|
|
21
|
+
BackendBridge: () => import_backend_bridge.BackendBridge,
|
|
22
|
+
pushEvent: () => import_backend_entry.pushEvent,
|
|
23
|
+
startBackendLoop: () => import_backend_entry.startBackendLoop
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(bridge_exports);
|
|
26
|
+
var import_backend_bridge = require("./backend_bridge.cjs");
|
|
27
|
+
var import_backend_entry = require("./backend_entry.cjs");
|
|
28
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
29
|
+
0 && (module.exports = {
|
|
30
|
+
BackendBridge,
|
|
31
|
+
pushEvent,
|
|
32
|
+
startBackendLoop
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bridge/index.ts"],"sourcesContent":["export { BackendBridge, type BridgeOptions } from './backend_bridge.cjs';\nexport { startBackendLoop, pushEvent, type BackendHandler } from './backend_entry.cjs';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAkD;AAClD,2BAAiE;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bridge/index.ts"],"sourcesContent":["export { BackendBridge, type BridgeOptions } from './backend_bridge.js';\nexport { startBackendLoop, pushEvent, type BackendHandler } from './backend_entry.js';\n"],"mappings":"AAAA,SAAS,qBAAyC;AAClD,SAAS,kBAAkB,iBAAsC;","names":[]}
|