@omnitron-dev/omnitron 0.3.0 → 0.3.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 +4 -0
- package/dist/BUILD.json +2 -2
- package/dist/cli/omnitron.js +26 -2
- package/dist/cli/omnitron.js.map +1 -1
- package/dist/cluster/mesh-link.js +1 -1
- package/dist/cluster/slave-connector.d.ts +2 -2
- package/dist/cluster/slave-connector.js +1 -1
- package/dist/commands/deploy.d.ts +4 -4
- package/dist/commands/deploy.js +4 -4
- package/dist/commands/discover.d.ts +2 -2
- package/dist/commands/discover.js +2 -2
- package/dist/commands/fleet-asking.d.ts +2 -2
- package/dist/commands/fleet-asking.js +2 -2
- package/dist/commands/fleet-recover.d.ts +2 -0
- package/dist/commands/fleet-recover.d.ts.map +1 -0
- package/dist/commands/fleet-recover.js +30 -0
- package/dist/commands/fleet-recover.js.map +1 -0
- package/dist/commands/host-ingress.d.ts +3 -0
- package/dist/commands/host-ingress.d.ts.map +1 -0
- package/dist/commands/host-ingress.js +31 -0
- package/dist/commands/host-ingress.js.map +1 -0
- package/dist/commands/infra.d.ts +2 -2
- package/dist/commands/infra.js +7 -7
- package/dist/commands/infra.js.map +1 -1
- package/dist/commands/logs.d.ts +1 -1
- package/dist/commands/logs.js +3 -3
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/node.d.ts +2 -14
- package/dist/commands/node.d.ts.map +1 -1
- package/dist/commands/node.js +33 -22
- package/dist/commands/node.js.map +1 -1
- package/dist/commands/pipeline.d.ts.map +1 -1
- package/dist/commands/pipeline.js +8 -1
- package/dist/commands/pipeline.js.map +1 -1
- package/dist/commands/project.d.ts +2 -2
- package/dist/commands/project.js +2 -2
- package/dist/commands/release.d.ts +1 -1
- package/dist/commands/release.js +4 -4
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/remote.d.ts +3 -3
- package/dist/commands/remote.js +3 -3
- package/dist/commands/tor.d.ts +1 -1
- package/dist/commands/tor.js +2 -2
- package/dist/config/types.d.ts +9 -6
- package/dist/config/types.d.ts.map +1 -1
- package/dist/daemon/daemon-entry.js +1 -1
- package/dist/daemon/daemon-entry.js.map +1 -1
- package/dist/daemon/daemon.d.ts +5 -19
- package/dist/daemon/daemon.d.ts.map +1 -1
- package/dist/daemon/daemon.js +54 -51
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/daemon.module.d.ts.map +1 -1
- package/dist/daemon/daemon.module.js +3 -5
- package/dist/daemon/daemon.module.js.map +1 -1
- package/dist/daemon/daemon.rpc-service.d.ts +2 -2
- package/dist/daemon/daemon.rpc-service.js +6 -6
- package/dist/daemon/daemon.rpc-service.js.map +1 -1
- package/dist/execution/data-channel.d.ts +1 -1
- package/dist/execution/data-channel.js +1 -1
- package/dist/execution/execution.service.d.ts +10 -3
- package/dist/execution/execution.service.d.ts.map +1 -1
- package/dist/execution/execution.service.js +101 -44
- package/dist/execution/execution.service.js.map +1 -1
- package/dist/infrastructure/bare-metal-plan.js +1 -1
- package/dist/infrastructure/bare-metal-plan.js.map +1 -1
- package/dist/infrastructure/config-payload.d.ts +4 -4
- package/dist/infrastructure/config-payload.js +4 -4
- package/dist/infrastructure/container-runtime.d.ts +2 -10
- package/dist/infrastructure/container-runtime.d.ts.map +1 -1
- package/dist/infrastructure/container-runtime.js +41 -20
- package/dist/infrastructure/container-runtime.js.map +1 -1
- package/dist/infrastructure/gateway-redis-db.d.ts +2 -2
- package/dist/infrastructure/gateway-redis-db.js +2 -2
- package/dist/infrastructure/host-ingress-config.d.ts +12 -0
- package/dist/infrastructure/host-ingress-config.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-config.js +197 -0
- package/dist/infrastructure/host-ingress-config.js.map +1 -0
- package/dist/infrastructure/host-ingress-lock.d.ts +4 -0
- package/dist/infrastructure/host-ingress-lock.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-lock.js +36 -0
- package/dist/infrastructure/host-ingress-lock.js.map +1 -0
- package/dist/infrastructure/host-ingress-runtime.d.ts +25 -0
- package/dist/infrastructure/host-ingress-runtime.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-runtime.js +114 -0
- package/dist/infrastructure/host-ingress-runtime.js.map +1 -0
- package/dist/infrastructure/host-ingress-takeover.d.ts +18 -0
- package/dist/infrastructure/host-ingress-takeover.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-takeover.js +142 -0
- package/dist/infrastructure/host-ingress-takeover.js.map +1 -0
- package/dist/infrastructure/host-ingress-types.d.ts +173 -0
- package/dist/infrastructure/host-ingress-types.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress-types.js +2 -0
- package/dist/infrastructure/host-ingress-types.js.map +1 -0
- package/dist/infrastructure/host-ingress.service.d.ts +47 -0
- package/dist/infrastructure/host-ingress.service.d.ts.map +1 -0
- package/dist/infrastructure/host-ingress.service.js +514 -0
- package/dist/infrastructure/host-ingress.service.js.map +1 -0
- package/dist/infrastructure/infrastructure.service.d.ts +21 -5
- package/dist/infrastructure/infrastructure.service.d.ts.map +1 -1
- package/dist/infrastructure/infrastructure.service.js +91 -10
- package/dist/infrastructure/infrastructure.service.js.map +1 -1
- package/dist/infrastructure/orphan-containers.d.ts +7 -7
- package/dist/infrastructure/orphan-containers.js +6 -6
- package/dist/infrastructure/presets/minio.js +1 -1
- package/dist/infrastructure/presets/minio.js.map +1 -1
- package/dist/infrastructure/provisioning-outcome.d.ts +1 -1
- package/dist/infrastructure/provisioning-outcome.js +1 -1
- package/dist/infrastructure/service-binding.js +1 -1
- package/dist/infrastructure/service-resolver.d.ts +10 -4
- package/dist/infrastructure/service-resolver.d.ts.map +1 -1
- package/dist/infrastructure/service-resolver.js +88 -45
- package/dist/infrastructure/service-resolver.js.map +1 -1
- package/dist/infrastructure/shipped-config.js +4 -4
- package/dist/infrastructure/stack-infra-manager.d.ts +10 -1
- package/dist/infrastructure/stack-infra-manager.d.ts.map +1 -1
- package/dist/infrastructure/stack-infra-manager.js +53 -43
- package/dist/infrastructure/stack-infra-manager.js.map +1 -1
- package/dist/infrastructure/types.d.ts +8 -6
- package/dist/infrastructure/types.d.ts.map +1 -1
- package/dist/monitoring/log-line.d.ts +3 -3
- package/dist/monitoring/log-line.js +3 -3
- package/dist/monitoring/log-manager.d.ts +3 -3
- package/dist/monitoring/log-manager.js +3 -3
- package/dist/operations.d.ts +16 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +13 -0
- package/dist/operations.js.map +1 -0
- package/dist/orchestrator/app-handle.d.ts +3 -3
- package/dist/orchestrator/app-handle.js +3 -3
- package/dist/orchestrator/bootstrap-loader.d.ts +2 -2
- package/dist/orchestrator/bootstrap-loader.js +3 -3
- package/dist/orchestrator/bootstrap-loader.js.map +1 -1
- package/dist/orchestrator/bootstrap-process.d.ts +1 -1
- package/dist/orchestrator/bootstrap-process.d.ts.map +1 -1
- package/dist/orchestrator/bootstrap-process.js +3 -2
- package/dist/orchestrator/bootstrap-process.js.map +1 -1
- package/dist/orchestrator/build-service.d.ts +6 -12
- package/dist/orchestrator/build-service.d.ts.map +1 -1
- package/dist/orchestrator/build-service.js +120 -83
- package/dist/orchestrator/build-service.js.map +1 -1
- package/dist/orchestrator/call-exposed-service.js +1 -1
- package/dist/orchestrator/classic-launcher.d.ts.map +1 -1
- package/dist/orchestrator/classic-launcher.js +6 -1
- package/dist/orchestrator/classic-launcher.js.map +1 -1
- package/dist/orchestrator/file-watcher.d.ts +1 -0
- package/dist/orchestrator/file-watcher.d.ts.map +1 -1
- package/dist/orchestrator/file-watcher.js +14 -3
- package/dist/orchestrator/file-watcher.js.map +1 -1
- package/dist/orchestrator/http-routes.d.ts +4 -0
- package/dist/orchestrator/http-routes.d.ts.map +1 -0
- package/dist/orchestrator/http-routes.js +19 -0
- package/dist/orchestrator/http-routes.js.map +1 -0
- package/dist/orchestrator/orchestrator.service.d.ts +18 -4
- package/dist/orchestrator/orchestrator.service.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.service.js +151 -110
- package/dist/orchestrator/orchestrator.service.js.map +1 -1
- package/dist/orchestrator/service-router.d.ts +1 -1
- package/dist/orchestrator/service-router.js +1 -1
- package/dist/orchestrator/topology-query.d.ts +1 -1
- package/dist/orchestrator/topology-query.js +1 -1
- package/dist/project/artifact-builder.js +2 -2
- package/dist/project/artifact-builder.js.map +1 -1
- package/dist/project/build-decision.d.ts +1 -1
- package/dist/project/build-decision.js +1 -1
- package/dist/project/config-resolver.js +1 -1
- package/dist/project/config-resolver.js.map +1 -1
- package/dist/project/declared-config.d.ts +2 -2
- package/dist/project/declared-config.js +2 -2
- package/dist/project/deploy-phases.d.ts +1 -1
- package/dist/project/deploy-phases.js +1 -1
- package/dist/project/exec-in-group.d.ts +1 -1
- package/dist/project/exec-in-group.js +1 -1
- package/dist/project/node-app-config.d.ts +2 -2
- package/dist/project/node-app-config.js +2 -2
- package/dist/project/node-app-config.js.map +1 -1
- package/dist/project/node-app-health.d.ts +1 -1
- package/dist/project/node-app-health.js +1 -1
- package/dist/project/operator-account.d.ts +9 -3
- package/dist/project/operator-account.d.ts.map +1 -1
- package/dist/project/operator-account.js +9 -9
- package/dist/project/operator-account.js.map +1 -1
- package/dist/project/registry.d.ts.map +1 -1
- package/dist/project/registry.js +4 -22
- package/dist/project/registry.js.map +1 -1
- package/dist/project/stack-env.d.ts +1 -1
- package/dist/project/stack-env.js +1 -1
- package/dist/project/stand-containers.d.ts +9 -2
- package/dist/project/stand-containers.d.ts.map +1 -1
- package/dist/project/stand-containers.js +17 -17
- package/dist/project/stand-containers.js.map +1 -1
- package/dist/release/artifact-store.d.ts +1 -1
- package/dist/release/artifact-store.d.ts.map +1 -1
- package/dist/release/artifact-store.js +1 -1
- package/dist/release/artifact-store.js.map +1 -1
- package/dist/release/attest-on-node.d.ts +3 -2
- package/dist/release/attest-on-node.d.ts.map +1 -1
- package/dist/release/attest-on-node.js +6 -6
- package/dist/release/attest-on-node.js.map +1 -1
- package/dist/release/attest.d.ts +3 -3
- package/dist/release/attest.js +1 -1
- package/dist/release/build-run.d.ts +2 -2
- package/dist/release/build-run.js +4 -4
- package/dist/release/build-run.js.map +1 -1
- package/dist/release/builder.d.ts +1 -1
- package/dist/release/builder.d.ts.map +1 -1
- package/dist/release/builder.js +1 -1
- package/dist/release/builder.js.map +1 -1
- package/dist/release/daemon-omni.d.ts +1 -1
- package/dist/release/daemon-omni.js +1 -1
- package/dist/release/definition-inputs.d.ts +1 -1
- package/dist/release/definition-inputs.js +1 -1
- package/dist/release/layout.d.ts +2 -2
- package/dist/release/layout.js +2 -2
- package/dist/release/manifest.d.ts +1 -1
- package/dist/release/manifest.js +1 -1
- package/dist/release/publish.d.ts +1 -1
- package/dist/release/publish.js +1 -1
- package/dist/release/store.d.ts +1 -1
- package/dist/release/store.d.ts.map +1 -1
- package/dist/release/store.js +3 -3
- package/dist/release/store.js.map +1 -1
- package/dist/services/alert.service.d.ts +2 -2
- package/dist/services/alert.service.js +2 -2
- package/dist/services/backup-pipeline.d.ts +1 -1
- package/dist/services/backup-pipeline.js +1 -1
- package/dist/services/backup.service.d.ts +3 -3
- package/dist/services/backup.service.js +3 -3
- package/dist/services/bundle-builder.d.ts +15 -12
- package/dist/services/bundle-builder.d.ts.map +1 -1
- package/dist/services/bundle-builder.js +124 -48
- package/dist/services/bundle-builder.js.map +1 -1
- package/dist/services/discovery.service.d.ts +1 -1
- package/dist/services/discovery.service.js +1 -1
- package/dist/services/host-operation-barrier.d.ts +8 -0
- package/dist/services/host-operation-barrier.d.ts.map +1 -0
- package/dist/services/host-operation-barrier.js +44 -0
- package/dist/services/host-operation-barrier.js.map +1 -0
- package/dist/services/host-upgrade.d.ts +129 -0
- package/dist/services/host-upgrade.d.ts.map +1 -0
- package/dist/services/host-upgrade.js +352 -0
- package/dist/services/host-upgrade.js.map +1 -0
- package/dist/services/infrastructure.rpc-service.d.ts +16 -1
- package/dist/services/infrastructure.rpc-service.d.ts.map +1 -1
- package/dist/services/infrastructure.rpc-service.js +71 -10
- package/dist/services/infrastructure.rpc-service.js.map +1 -1
- package/dist/services/local-bundle.d.ts +9 -0
- package/dist/services/local-bundle.d.ts.map +1 -1
- package/dist/services/local-bundle.js +11 -2
- package/dist/services/local-bundle.js.map +1 -1
- package/dist/services/log-collector.service.d.ts +1 -1
- package/dist/services/log-collector.service.js +1 -1
- package/dist/services/maintenance-lock.d.ts +2 -2
- package/dist/services/maintenance-lock.d.ts.map +1 -1
- package/dist/services/maintenance-lock.js +1 -1
- package/dist/services/migration-output.d.ts +2 -2
- package/dist/services/migration-output.js +2 -2
- package/dist/services/node-deploy-lease.d.ts +19 -2
- package/dist/services/node-deploy-lease.d.ts.map +1 -1
- package/dist/services/node-deploy-lease.js +84 -10
- package/dist/services/node-deploy-lease.js.map +1 -1
- package/dist/services/node-manager.rpc-service.d.ts +6 -1
- package/dist/services/node-manager.rpc-service.d.ts.map +1 -1
- package/dist/services/node-manager.rpc-service.js +25 -1
- package/dist/services/node-manager.rpc-service.js.map +1 -1
- package/dist/services/node-manager.service.d.ts +1 -1
- package/dist/services/node-manager.service.js +1 -1
- package/dist/services/node-upgrade.d.ts +1 -1
- package/dist/services/pipeline.rpc-service.d.ts +4 -0
- package/dist/services/pipeline.rpc-service.d.ts.map +1 -1
- package/dist/services/pipeline.rpc-service.js +9 -0
- package/dist/services/pipeline.rpc-service.js.map +1 -1
- package/dist/services/pipeline.service.d.ts +2 -0
- package/dist/services/pipeline.service.d.ts.map +1 -1
- package/dist/services/pipeline.service.js +12 -0
- package/dist/services/pipeline.service.js.map +1 -1
- package/dist/services/project.rpc-service.d.ts +7 -0
- package/dist/services/project.rpc-service.d.ts.map +1 -1
- package/dist/services/project.rpc-service.js +11 -0
- package/dist/services/project.rpc-service.js.map +1 -1
- package/dist/services/project.service.d.ts +21 -11
- package/dist/services/project.service.d.ts.map +1 -1
- package/dist/services/project.service.js +74 -59
- package/dist/services/project.service.js.map +1 -1
- package/dist/services/redeploy-decision.d.ts +2 -2
- package/dist/services/redeploy-decision.js +1 -1
- package/dist/services/release.rpc-service.d.ts +1 -1
- package/dist/services/release.rpc-service.js +1 -1
- package/dist/services/remote-deployer.service.d.ts +27 -16
- package/dist/services/remote-deployer.service.d.ts.map +1 -1
- package/dist/services/remote-deployer.service.js +269 -101
- package/dist/services/remote-deployer.service.js.map +1 -1
- package/dist/services/remote-provisioner.d.ts +2 -0
- package/dist/services/remote-provisioner.d.ts.map +1 -1
- package/dist/services/remote-provisioner.js +1 -1
- package/dist/services/remote-provisioner.js.map +1 -1
- package/dist/services/static-carry-forward.d.ts +26 -1
- package/dist/services/static-carry-forward.d.ts.map +1 -1
- package/dist/services/static-carry-forward.js +275 -1
- package/dist/services/static-carry-forward.js.map +1 -1
- package/dist/shared/dto/nodes.d.ts +2 -2
- package/dist/shared/dto/services.d.ts +27 -0
- package/dist/shared/dto/services.d.ts.map +1 -1
- package/dist/shared/local-infra-host.d.ts +2 -2
- package/dist/shared/local-infra-host.js +2 -2
- package/dist/shared/release-reading.d.ts +1 -1
- package/dist/shared/release-reading.js +1 -1
- package/package.json +16 -12
- package/webapp/dist/BUILD.json +2 -2
- package/webapp/dist/assets/FormControlLabel-BbSxpQwN.js +1 -0
- package/webapp/dist/assets/{Grid-BZ7xhoHQ.js → Grid-DizFZYue.js} +1 -1
- package/webapp/dist/assets/{Switch-DGSAxQPM.js → Switch-Bfiqzx8l.js} +1 -1
- package/webapp/dist/assets/alerts-DH_RVRS3.js +1 -0
- package/webapp/dist/assets/apps-B96355sz.js +1 -0
- package/webapp/dist/assets/audit-CYGtbi4k.js +1 -0
- package/webapp/dist/assets/client-BmqFExWT.js +1 -0
- package/webapp/dist/assets/containers-B_TpThln.js +2 -0
- package/webapp/dist/assets/dashboard-DHf2_65N.js +1 -0
- package/webapp/dist/assets/dashboard-builder-CWY2pjeG.js +1 -0
- package/webapp/dist/assets/{deploy-release-dialog-D6C-XcKY.js → deploy-release-dialog-Dp-zpSAd.js} +1 -1
- package/webapp/dist/assets/deployments-tJI6O3fK.js +1 -0
- package/webapp/dist/assets/detail-B2zP1Hto.js +8 -0
- package/webapp/dist/assets/detail-CoIrwmsy.js +1 -0
- package/webapp/dist/assets/detail-DWaGaOtL.js +2 -0
- package/webapp/dist/assets/index-Dvo0iprx.css +1 -0
- package/webapp/dist/assets/index-vMnY_4jR.js +412 -0
- package/webapp/dist/assets/logs-DTRjOfX8.js +12 -0
- package/webapp/dist/assets/maplibre-gl-DowHoZAx.js +814 -0
- package/webapp/dist/assets/{metrics-CQgjz2Lz.js → metrics-UCajtdox.js} +2 -2
- package/webapp/dist/assets/nodes-DuTVU0f6.js +7 -0
- package/webapp/dist/assets/pipelines-C8BeDcAl.js +4 -0
- package/webapp/dist/assets/projects-Dp_zFfLY.js +1 -0
- package/webapp/dist/assets/react-DlmbjZJV.js +1 -0
- package/webapp/dist/assets/react-apexcharts.esm-C8pn45ml.js +97 -0
- package/webapp/dist/assets/{release-bits-Dj4EOhhb.js → release-bits-BzTKz5fM.js} +1 -1
- package/webapp/dist/assets/release-build-panel-DcW9YcXQ.js +1 -0
- package/webapp/dist/assets/releases-B4hcr1bE.js +2 -0
- package/webapp/dist/assets/rolldown-runtime-XKyaHtl9.js +1 -0
- package/webapp/dist/assets/settings-DIteZTbe.js +1 -0
- package/webapp/dist/assets/sign-in-D4kMBOHp.js +1 -0
- package/webapp/dist/assets/stacks-Brnf-EB7.js +1 -0
- package/webapp/dist/assets/{system-info-BtE3dgfw.js → system-info-CFDNVKkU.js} +1 -1
- package/webapp/dist/assets/topology-7WeTUsDN.js +12 -0
- package/webapp/dist/assets/traces-9c3gwCN-.js +1 -0
- package/webapp/dist/assets/{use-stack-context-CZUgPq88.js → use-stack-context-CnA5FTHu.js} +1 -1
- package/webapp/dist/index.html +6 -6
- package/webapp/dist/assets/FormControlLabel-BrH2diyl.js +0 -1
- package/webapp/dist/assets/alerts-sXqHJbsa.js +0 -1
- package/webapp/dist/assets/apps-B_Ah8Flh.js +0 -1
- package/webapp/dist/assets/audit-YXihwyui.js +0 -1
- package/webapp/dist/assets/client-CGbBvy9k.js +0 -1
- package/webapp/dist/assets/containers-Di4NOTLf.js +0 -2
- package/webapp/dist/assets/dashboard-Cfuf95N3.js +0 -1
- package/webapp/dist/assets/dashboard-builder-CowaYb-M.js +0 -1
- package/webapp/dist/assets/deployments-ChTq5kCw.js +0 -1
- package/webapp/dist/assets/detail-BsGWv7Dj.js +0 -1
- package/webapp/dist/assets/detail-CyVf_cw5.js +0 -2
- package/webapp/dist/assets/detail-D027j6aO.js +0 -8
- package/webapp/dist/assets/index-B8AHIPc-.css +0 -1
- package/webapp/dist/assets/index-DiZbrwxT.js +0 -414
- package/webapp/dist/assets/logs-L2b8Oqmo.js +0 -12
- package/webapp/dist/assets/maplibre-gl-MlmG2kbn.js +0 -801
- package/webapp/dist/assets/nodes-Nwia2Ty6.js +0 -7
- package/webapp/dist/assets/pipelines-DCu_rXOr.js +0 -4
- package/webapp/dist/assets/projects-Bb4aV76h.js +0 -1
- package/webapp/dist/assets/react-CwJFpaho.js +0 -1
- package/webapp/dist/assets/react-apexcharts.esm-Dy0Fez42.js +0 -1956
- package/webapp/dist/assets/release-build-panel-D6OCVlhT.js +0 -1
- package/webapp/dist/assets/releases-CnAt3yO6.js +0 -2
- package/webapp/dist/assets/rolldown-runtime-hePW80VL.js +0 -1
- package/webapp/dist/assets/settings-DU-mjiwb.js +0 -1
- package/webapp/dist/assets/sign-in-Bcvjrr4C.js +0 -1
- package/webapp/dist/assets/stacks-B-e8p50I.js +0 -1
- package/webapp/dist/assets/topology-Cwch-uF1.js +0 -12
- package/webapp/dist/assets/traces-BbShR-4P.js +0 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Adapt declared methods and pathnames to Titan's ordered, null-fallthrough handlers. */
|
|
2
|
+
export function compileCustomRoutes(routes) {
|
|
3
|
+
return routes.map((route) => {
|
|
4
|
+
// Titan accepts fall-through handlers, while defineSystem declares routes.
|
|
5
|
+
// Preserve the method and pathname boundary when adapting between them.
|
|
6
|
+
const pattern = new RegExp('^' +
|
|
7
|
+
route.pattern
|
|
8
|
+
.split('*')
|
|
9
|
+
.map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
|
|
10
|
+
.join('.*') +
|
|
11
|
+
'$');
|
|
12
|
+
return async (request) => {
|
|
13
|
+
if (request.method !== route.method || !pattern.test(new URL(request.url).pathname))
|
|
14
|
+
return null;
|
|
15
|
+
return route.handler(request);
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=http-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-routes.js","sourceRoot":"","sources":["../../src/orchestrator/http-routes.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CACjC,MAAkD;IAElD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,2EAA2E;QAC3E,wEAAwE;QACxE,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,GAAG;YACD,KAAK,CAAC,OAAO;iBACV,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;iBAC1D,IAAI,CAAC,IAAI,CAAC;YACb,GAAG,CACN,CAAC;QACF,OAAO,KAAK,EAAE,OAAgB,EAAE,EAAE;YAChC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjG,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -108,6 +108,19 @@ export declare class OrchestratorService extends EventEmitter {
|
|
|
108
108
|
devMode: boolean;
|
|
109
109
|
/** esbuild bundling pipeline — pre-bundles TS entry points for child processes */
|
|
110
110
|
private buildService;
|
|
111
|
+
private watchDisabled;
|
|
112
|
+
private watchSelection;
|
|
113
|
+
private readonly bootstrapSources;
|
|
114
|
+
private allowsWatch;
|
|
115
|
+
/** One policy for both fs.watch and esbuild; disabling does not stop apps. */
|
|
116
|
+
setWatchMode(enabled: boolean, apps?: string[]): Promise<void>;
|
|
117
|
+
getBuildWatchedApps(): Array<{
|
|
118
|
+
name: string;
|
|
119
|
+
directory: string;
|
|
120
|
+
}>;
|
|
121
|
+
private syncBootstrapWatch;
|
|
122
|
+
/** Automatic triggers remain revocable while queued; manual restart is independent. */
|
|
123
|
+
restartAfterChange(name: string): Promise<AppHandle | undefined>;
|
|
111
124
|
/** Cached build results per app name */
|
|
112
125
|
private readonly buildResults;
|
|
113
126
|
/**
|
|
@@ -297,7 +310,7 @@ export declare class OrchestratorService extends EventEmitter {
|
|
|
297
310
|
* `topologyPools` — so `supervisor.stop()` never reached them, and nothing
|
|
298
311
|
* in the orchestrator destroyed a pool: only the daemon's own shutdown did.
|
|
299
312
|
* Every restart of an app with `instances > 1` left the previous workers
|
|
300
|
-
* running. On
|
|
313
|
+
* running. On sample/test (2026-09-25): quotes's `ohlcv-aggregator` and
|
|
301
314
|
* storage's `transform` in three generations at once.
|
|
302
315
|
*
|
|
303
316
|
* The pools go even when the supervisor's stop throws: a stop that failed
|
|
@@ -321,7 +334,7 @@ export declare class OrchestratorService extends EventEmitter {
|
|
|
321
334
|
* `restartApp` starts from this. `false` when nothing by that name runs
|
|
322
335
|
* here. See `AppHandle.redefine`.
|
|
323
336
|
*/
|
|
324
|
-
redefineApp(name: string, entry: IEcosystemAppEntry): boolean
|
|
337
|
+
redefineApp(name: string, entry: IEcosystemAppEntry): Promise<boolean>;
|
|
325
338
|
/**
|
|
326
339
|
* Restart an app, coalescing concurrent triggers.
|
|
327
340
|
*
|
|
@@ -463,7 +476,7 @@ export declare class OrchestratorService extends EventEmitter {
|
|
|
463
476
|
} | null>;
|
|
464
477
|
/**
|
|
465
478
|
* `name` is resolved like every other per-app question (`main` finds
|
|
466
|
-
* `
|
|
479
|
+
* `sample/dev/main`); it was compared verbatim, so `omnitron metrics main`
|
|
467
480
|
* printed «(no data)». An unknown name answers `{}`, and the caller says so.
|
|
468
481
|
*/
|
|
469
482
|
getMetrics(name?: string): Promise<Record<string, IProcessMetrics | null>>;
|
|
@@ -472,7 +485,7 @@ export declare class OrchestratorService extends EventEmitter {
|
|
|
472
485
|
* children and its worker pools — and combined (`app-health.ts`).
|
|
473
486
|
*
|
|
474
487
|
* `name` is resolved like every other per-app question: `main` finds
|
|
475
|
-
* `
|
|
488
|
+
* `sample/dev/main`. It was compared verbatim, so `omnitron health main`
|
|
476
489
|
* matched nothing and the answer was empty. An unknown name answers `{}`,
|
|
477
490
|
* and the caller says so.
|
|
478
491
|
*/
|
|
@@ -513,6 +526,7 @@ export declare class OrchestratorService extends EventEmitter {
|
|
|
513
526
|
* Otherwise, creates a single bootstrap-process as before.
|
|
514
527
|
*/
|
|
515
528
|
private launchBootstrapMode;
|
|
529
|
+
private prepareBootstrapBuild;
|
|
516
530
|
/**
|
|
517
531
|
* Launch app with process topology — multiple children managed by Omnitron.
|
|
518
532
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.service.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAQL,KAAK,cAAc,EAGnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAKnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAElB,cAAc,EACd,SAAS,EAEV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAoD5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AA0BzD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAQnF;AA2CD,qBAAa,mBAAoB,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"orchestrator.service.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -229,6 +229,56 @@ export class OrchestratorService extends EventEmitter {
|
|
|
229
229
|
devMode = false;
|
|
230
230
|
/** esbuild bundling pipeline — pre-bundles TS entry points for child processes */
|
|
231
231
|
buildService = null;
|
|
232
|
+
watchDisabled = false;
|
|
233
|
+
watchSelection = null;
|
|
234
|
+
bootstrapSources = new Map();
|
|
235
|
+
allowsWatch(entry) {
|
|
236
|
+
return this.devMode && !this.watchDisabled && entry.watch !== false &&
|
|
237
|
+
(!this.watchSelection || this.watchSelection.has(entry.name));
|
|
238
|
+
}
|
|
239
|
+
/** One policy for both fs.watch and esbuild; disabling does not stop apps. */
|
|
240
|
+
async setWatchMode(enabled, apps) {
|
|
241
|
+
this.watchDisabled = !enabled;
|
|
242
|
+
this.watchSelection = apps ? new Set(apps.map((name) => this.resolveAppName(name) ?? name)) : null;
|
|
243
|
+
for (const [name, state] of this.restartCoalescer) {
|
|
244
|
+
if (!enabled || !this.handles.get(name) || !this.allowsWatch(this.handles.get(name).entry))
|
|
245
|
+
state.watchSerial = 0;
|
|
246
|
+
}
|
|
247
|
+
await Promise.all([...this.bootstrapSources.keys()].map((name) => this.syncBootstrapWatch(name)));
|
|
248
|
+
}
|
|
249
|
+
getBuildWatchedApps() {
|
|
250
|
+
return [...this.bootstrapSources].filter(([name]) => this.buildService?.isWatching(name))
|
|
251
|
+
.map(([name, source]) => ({ name, directory: path.dirname(source.path) }));
|
|
252
|
+
}
|
|
253
|
+
async syncBootstrapWatch(name) {
|
|
254
|
+
const source = this.bootstrapSources.get(name);
|
|
255
|
+
const entry = this.handles.get(name)?.entry;
|
|
256
|
+
if (!this.buildService || !source)
|
|
257
|
+
return;
|
|
258
|
+
if (!entry || !this.allowsWatch(entry) || !entry.bootstrap ||
|
|
259
|
+
path.resolve(entry.cwd ?? this.cwd, entry.bootstrap) !== source.path) {
|
|
260
|
+
const state = this.restartCoalescer.get(name);
|
|
261
|
+
if (state)
|
|
262
|
+
state.watchSerial = 0;
|
|
263
|
+
await this.buildService.unwatchApp(name);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
if (this.buildService.isWatching(name))
|
|
267
|
+
return;
|
|
268
|
+
await this.buildService.watchApp(name, source.path, source.definition, () => {
|
|
269
|
+
void this.restartAfterChange(name).catch((error) => {
|
|
270
|
+
this.logger.error({ app: name, error: error.message }, 'Restart after source change failed');
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/** Automatic triggers remain revocable while queued; manual restart is independent. */
|
|
275
|
+
async restartAfterChange(name) {
|
|
276
|
+
const canonical = this.resolveAppName(name) ?? name;
|
|
277
|
+
const handle = this.handles.get(canonical);
|
|
278
|
+
if (!handle || !this.allowsWatch(handle.entry))
|
|
279
|
+
return handle;
|
|
280
|
+
return this.restartAppCoalesced(canonical, true, 'watch');
|
|
281
|
+
}
|
|
232
282
|
/** Cached build results per app name */
|
|
233
283
|
buildResults = new Map();
|
|
234
284
|
/**
|
|
@@ -686,7 +736,8 @@ export class OrchestratorService extends EventEmitter {
|
|
|
686
736
|
// - exact key already exists, online → return it (idempotent)
|
|
687
737
|
// - exact key already exists, not online → fall through and re-launch
|
|
688
738
|
// under the same key
|
|
689
|
-
// -
|
|
739
|
+
// - different fully qualified keys are distinct apps and coexist
|
|
740
|
+
// - bare/qualified keys with the same effective short name:
|
|
690
741
|
// - new is MORE specific (namespaced) and existing is bare → stop
|
|
691
742
|
// the bare one and re-launch under the namespaced key. Without
|
|
692
743
|
// this, a boot-race where bare-name auto-start beats the
|
|
@@ -696,13 +747,19 @@ export class OrchestratorService extends EventEmitter {
|
|
|
696
747
|
// restart by canonical name, not register an alias.
|
|
697
748
|
const effective = effectiveAppName(entry.name);
|
|
698
749
|
const newIsNamespaced = entry.name.includes('/');
|
|
750
|
+
if (!newIsNamespaced && [...this.handles.keys()].filter(key => key.includes('/') && effectiveAppName(key) === effective).length > 1) {
|
|
751
|
+
throw new Error(`Ambiguous app name '${entry.name}'; use its full project/stack/app identity`);
|
|
752
|
+
}
|
|
699
753
|
for (const [key, h] of this.handles) {
|
|
700
754
|
if (key === entry.name)
|
|
701
755
|
continue;
|
|
702
756
|
if (effectiveAppName(key) !== effective)
|
|
703
757
|
continue;
|
|
704
758
|
const existingIsNamespaced = key.includes('/');
|
|
705
|
-
//
|
|
759
|
+
// Qualified identities are separate deployments, even when their basename matches.
|
|
760
|
+
if (newIsNamespaced && existingIsNamespaced)
|
|
761
|
+
continue;
|
|
762
|
+
// A bare alias may still refer to the one qualified deployment.
|
|
706
763
|
if (h.status === 'online') {
|
|
707
764
|
if (newIsNamespaced && !existingIsNamespaced) {
|
|
708
765
|
this.logger.info({ stale: key, replacing_with: entry.name, effective }, 'Stopping bare-name handle to re-register under namespaced key');
|
|
@@ -746,7 +803,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
746
803
|
// crashing leaves its siblings — the server among them — up; and its pools
|
|
747
804
|
// were never any supervisor's to stop. Stopped before the new handle
|
|
748
805
|
// starts, or the new one finds its own predecessor on its port: on
|
|
749
|
-
//
|
|
806
|
+
// sample/test (2026-09-25) payments's crash restarts failed five times on
|
|
750
807
|
// `EADDRINUSE :3004`, «held by … a child this daemon still accounts for».
|
|
751
808
|
if (existing) {
|
|
752
809
|
await this.releaseExposedServices(existing);
|
|
@@ -827,7 +884,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
827
884
|
* `topologyPools` — so `supervisor.stop()` never reached them, and nothing
|
|
828
885
|
* in the orchestrator destroyed a pool: only the daemon's own shutdown did.
|
|
829
886
|
* Every restart of an app with `instances > 1` left the previous workers
|
|
830
|
-
* running. On
|
|
887
|
+
* running. On sample/test (2026-09-25): quotes's `ohlcv-aggregator` and
|
|
831
888
|
* storage's `transform` in three generations at once.
|
|
832
889
|
*
|
|
833
890
|
* The pools go even when the supervisor's stop throws: a stop that failed
|
|
@@ -892,8 +949,6 @@ export class OrchestratorService extends EventEmitter {
|
|
|
892
949
|
});
|
|
893
950
|
}
|
|
894
951
|
async stopAll(force = false) {
|
|
895
|
-
if (!this.config)
|
|
896
|
-
return 0;
|
|
897
952
|
if (this.metricsTimer) {
|
|
898
953
|
clearInterval(this.metricsTimer);
|
|
899
954
|
this.metricsTimer = null;
|
|
@@ -906,7 +961,34 @@ export class OrchestratorService extends EventEmitter {
|
|
|
906
961
|
let count = 0;
|
|
907
962
|
// When force=true (daemon shutdown), use short timeout per app (3s SIGTERM, then SIGKILL)
|
|
908
963
|
const perAppTimeout = force ? 3_000 : 10_000;
|
|
909
|
-
|
|
964
|
+
// Registered projects need not belong to the daemon's root ecosystem.
|
|
965
|
+
// Ownership is defined by handles, not by whichever config booted first.
|
|
966
|
+
// Drain admitted starts before taking the shutdown graph snapshot.
|
|
967
|
+
await Promise.allSettled([...this.startingApps.values()]);
|
|
968
|
+
const entries = [...this.handles.values()].map((handle) => handle.entry);
|
|
969
|
+
const names = new Set(entries.map((entry) => entry.name));
|
|
970
|
+
const graph = entries.map((entry) => {
|
|
971
|
+
const scope = entry.name.slice(0, entry.name.lastIndexOf('/') + 1);
|
|
972
|
+
return {
|
|
973
|
+
...entry,
|
|
974
|
+
dependsOn: (entry.dependsOn ?? []).flatMap((dependency) => {
|
|
975
|
+
const name = !dependency.includes('/') && names.has(scope + dependency)
|
|
976
|
+
? scope + dependency : dependency;
|
|
977
|
+
// A dependency never started here has no owned process to stop.
|
|
978
|
+
return names.has(name) ? [name] : [];
|
|
979
|
+
}),
|
|
980
|
+
};
|
|
981
|
+
});
|
|
982
|
+
let batches;
|
|
983
|
+
try {
|
|
984
|
+
batches = resolveShutdownOrder(graph);
|
|
985
|
+
}
|
|
986
|
+
catch (error) {
|
|
987
|
+
// Invalid reconfiguration must not turn shutdown into leaked children.
|
|
988
|
+
this.logger.error({ error: error.message }, 'Invalid shutdown graph; stopping every owned app');
|
|
989
|
+
batches = [entries];
|
|
990
|
+
}
|
|
991
|
+
for (const batch of batches) {
|
|
910
992
|
await Promise.all(batch.map(async (entry) => {
|
|
911
993
|
try {
|
|
912
994
|
await this.stopApp(entry.name, force, perAppTimeout);
|
|
@@ -932,6 +1014,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
932
1014
|
this.buildService = null;
|
|
933
1015
|
}
|
|
934
1016
|
this.buildResults.clear();
|
|
1017
|
+
this.bootstrapSources.clear();
|
|
935
1018
|
return count;
|
|
936
1019
|
}
|
|
937
1020
|
/**
|
|
@@ -940,11 +1023,17 @@ export class OrchestratorService extends EventEmitter {
|
|
|
940
1023
|
* `restartApp` starts from this. `false` when nothing by that name runs
|
|
941
1024
|
* here. See `AppHandle.redefine`.
|
|
942
1025
|
*/
|
|
943
|
-
redefineApp(name, entry) {
|
|
1026
|
+
async redefineApp(name, entry) {
|
|
944
1027
|
const handle = this.handles.get(this.resolveAppName(name) ?? name);
|
|
945
1028
|
if (!handle)
|
|
946
1029
|
return false;
|
|
947
1030
|
handle.redefine(entry);
|
|
1031
|
+
if (!this.allowsWatch(entry)) {
|
|
1032
|
+
const state = this.restartCoalescer.get(handle.name);
|
|
1033
|
+
if (state)
|
|
1034
|
+
state.watchSerial = 0;
|
|
1035
|
+
}
|
|
1036
|
+
await this.syncBootstrapWatch(handle.name);
|
|
948
1037
|
return true;
|
|
949
1038
|
}
|
|
950
1039
|
/**
|
|
@@ -980,7 +1069,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
980
1069
|
* triggers, just continuations — they must not bump or the trailing
|
|
981
1070
|
* coalesced restart would re-fire forever.
|
|
982
1071
|
*/
|
|
983
|
-
async restartAppCoalesced(name, fromExternal) {
|
|
1072
|
+
async restartAppCoalesced(name, fromExternal, cause = 'manual') {
|
|
984
1073
|
const canonical = this.resolveAppName(name) ?? name;
|
|
985
1074
|
const handle = this.handles.get(canonical);
|
|
986
1075
|
if (!handle) {
|
|
@@ -1037,9 +1126,19 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1037
1126
|
}
|
|
1038
1127
|
name = canonical;
|
|
1039
1128
|
const state = this.getCoalescerState(name);
|
|
1040
|
-
if (fromExternal)
|
|
1129
|
+
if (fromExternal) {
|
|
1041
1130
|
state.triggerSerial += 1;
|
|
1042
|
-
|
|
1131
|
+
if (cause === 'watch')
|
|
1132
|
+
state.watchSerial = state.triggerSerial;
|
|
1133
|
+
else
|
|
1134
|
+
state.manualSerial = state.triggerSerial;
|
|
1135
|
+
}
|
|
1136
|
+
if (!this.allowsWatch(handle.entry) || ['errored', 'crashed', 'stopped', 'stopping'].includes(handle.status)) {
|
|
1137
|
+
state.watchSerial = 0;
|
|
1138
|
+
}
|
|
1139
|
+
const observedSerial = Math.max(state.manualSerial, state.watchSerial);
|
|
1140
|
+
if (observedSerial <= state.firedSerial)
|
|
1141
|
+
return handle;
|
|
1043
1142
|
// Cooldown: the app reported online recently. Wait it out, then
|
|
1044
1143
|
// proceed as a non-external continuation (we already counted this
|
|
1045
1144
|
// trigger when we first arrived).
|
|
@@ -1068,7 +1167,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1068
1167
|
}
|
|
1069
1168
|
// Take the slot. Capture which serial this run is consuming —
|
|
1070
1169
|
// anything bumped after this is the next run's problem.
|
|
1071
|
-
const consumedSerial =
|
|
1170
|
+
const consumedSerial = observedSerial;
|
|
1072
1171
|
const promise = this.restartAppNow(name);
|
|
1073
1172
|
state.inFlight = promise;
|
|
1074
1173
|
try {
|
|
@@ -1084,7 +1183,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1084
1183
|
// trigger arrived between when we claimed the slot and now.
|
|
1085
1184
|
// Two coalescer arms colliding can no longer cause this branch
|
|
1086
1185
|
// to fire because they don't bump triggerSerial.
|
|
1087
|
-
if (state.
|
|
1186
|
+
if (Math.max(state.manualSerial, state.watchSerial) > consumedSerial) {
|
|
1088
1187
|
this.restartAppCoalesced(name, /* fromExternal */ false).catch((err) => {
|
|
1089
1188
|
this.logger.error({ app: name, error: err.message }, 'Trailing coalesced restart failed');
|
|
1090
1189
|
});
|
|
@@ -1140,7 +1239,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1140
1239
|
getCoalescerState(name) {
|
|
1141
1240
|
let state = this.restartCoalescer.get(name);
|
|
1142
1241
|
if (!state) {
|
|
1143
|
-
state = { inFlight: null, triggerSerial: 0, firedSerial: 0, cooldownUntil: 0 };
|
|
1242
|
+
state = { inFlight: null, triggerSerial: 0, firedSerial: 0, manualSerial: 0, watchSerial: 0, cooldownUntil: 0 };
|
|
1144
1243
|
this.restartCoalescer.set(name, state);
|
|
1145
1244
|
}
|
|
1146
1245
|
return state;
|
|
@@ -1179,7 +1278,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1179
1278
|
// is the one with that address. Falling through to the short-name match
|
|
1180
1279
|
// answered a question about one deployment with another's data:
|
|
1181
1280
|
//
|
|
1182
|
-
// omnitron logs
|
|
1281
|
+
// omnitron logs sample/deployed/main → sample/dev/main
|
|
1183
1282
|
//
|
|
1184
1283
|
// — the node's app asked for, this laptop's app printed, with nothing
|
|
1185
1284
|
// said. `startApp` already refuses this for the same reason ("a
|
|
@@ -1379,7 +1478,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1379
1478
|
}
|
|
1380
1479
|
/**
|
|
1381
1480
|
* `name` is resolved like every other per-app question (`main` finds
|
|
1382
|
-
* `
|
|
1481
|
+
* `sample/dev/main`); it was compared verbatim, so `omnitron metrics main`
|
|
1383
1482
|
* printed «(no data)». An unknown name answers `{}`, and the caller says so.
|
|
1384
1483
|
*/
|
|
1385
1484
|
async getMetrics(name) {
|
|
@@ -1409,7 +1508,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1409
1508
|
* children and its worker pools — and combined (`app-health.ts`).
|
|
1410
1509
|
*
|
|
1411
1510
|
* `name` is resolved like every other per-app question: `main` finds
|
|
1412
|
-
* `
|
|
1511
|
+
* `sample/dev/main`. It was compared verbatim, so `omnitron health main`
|
|
1413
1512
|
* matched nothing and the answer was empty. An unknown name answers `{}`,
|
|
1414
1513
|
* and the caller says so.
|
|
1415
1514
|
*/
|
|
@@ -1569,7 +1668,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1569
1668
|
// Refused, with the reason. This fell back to «single-process mode» at
|
|
1570
1669
|
// warn — but every definition declares its topology (IAppDefinition:
|
|
1571
1670
|
// `processes` is required), so the fallback started the app in a shape
|
|
1572
|
-
// it was never written for. Measured 2026-09-23 on the master:
|
|
1671
|
+
// it was never written for. Measured 2026-09-23 on the master: payments
|
|
1573
1672
|
// and messaging, whose definitions failed to load («Parameter
|
|
1574
1673
|
// decorators only work when experimental decorators are enabled»), were
|
|
1575
1674
|
// started that way and died on «Dependency 'AuthModule:JWTService' not
|
|
@@ -1631,96 +1730,8 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1631
1730
|
}
|
|
1632
1731
|
// Build all entry points via esbuild (dev mode bundles from source .ts)
|
|
1633
1732
|
//
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
// that triggered us. Reusing it skips a redundant cold rebuild
|
|
1637
|
-
// (which was costing ~500ms per restart and racing against the
|
|
1638
|
-
// watcher's own incremental output). The watch context is also
|
|
1639
|
-
// preserved (we never unwatched), so we don't re-arm it either.
|
|
1640
|
-
if (definition && this.devMode) {
|
|
1641
|
-
try {
|
|
1642
|
-
if (!this.buildService) {
|
|
1643
|
-
this.buildService = new BuildService(/* isDev */ true, {
|
|
1644
|
-
onEsbuildReset: (info) => this.metricsBridge?.recordResilientHandleReset(info),
|
|
1645
|
-
onBuildResult: ({ app, kind, durationMs, ok }) => this.metricsBridge?.recordEsbuildBuild(app, kind, durationMs, ok),
|
|
1646
|
-
});
|
|
1647
|
-
}
|
|
1648
|
-
const existing = this.buildResults.get(entry.name);
|
|
1649
|
-
const existingWatch = this.buildService.isWatching?.(entry.name);
|
|
1650
|
-
// Bundle on-disk presence check. A restart can race against
|
|
1651
|
-
// the user (or a script) removing `.omnitron-build/` between
|
|
1652
|
-
// builds — without this stat the orchestrator hands the
|
|
1653
|
-
// worker a path that no longer exists and the child dies
|
|
1654
|
-
// with `ERR_MODULE_NOT_FOUND` before the supervisor can
|
|
1655
|
-
// recover. Cheap stat, big DX win.
|
|
1656
|
-
const bundlePresent = existing
|
|
1657
|
-
? fs.existsSync(existing.bootstrapPath)
|
|
1658
|
-
: false;
|
|
1659
|
-
if (existing && existingWatch && bundlePresent) {
|
|
1660
|
-
// Restart path — keep the already-built bundle and live watch.
|
|
1661
|
-
this.logger.debug({ app: entry.name, modules: existing.modulePaths.size }, 'Reusing existing esbuild bundle + watch (restart path)');
|
|
1662
|
-
}
|
|
1663
|
-
else {
|
|
1664
|
-
if (existing && existingWatch && !bundlePresent) {
|
|
1665
|
-
// Bundle was deleted out from under us. Clear the watch
|
|
1666
|
-
// and the cached BuildResult so the next call rebuilds
|
|
1667
|
-
// from cold and re-arms the watcher cleanly.
|
|
1668
|
-
this.logger.warn({ app: entry.name, bootstrapPath: existing.bootstrapPath }, 'Cached bundle missing on disk — forcing rebuild');
|
|
1669
|
-
try {
|
|
1670
|
-
await this.buildService.unwatchApp?.(entry.name);
|
|
1671
|
-
}
|
|
1672
|
-
catch (err) {
|
|
1673
|
-
this.logger.debug({ err, app: entry.name }, 'unwatchApp failed (non-fatal)');
|
|
1674
|
-
}
|
|
1675
|
-
this.buildResults.delete(entry.name);
|
|
1676
|
-
}
|
|
1677
|
-
// First-start path — build everything from cold and arm the watcher.
|
|
1678
|
-
const buildResult = await this.buildService.buildApp(entry.name, bootstrapAbsPath, definition);
|
|
1679
|
-
this.buildResults.set(entry.name, buildResult);
|
|
1680
|
-
this.logger.info({ app: entry.name, modules: buildResult.modulePaths.size }, 'Built entry points via esbuild');
|
|
1681
|
-
// Start esbuild watch for incremental rebuilds on source changes.
|
|
1682
|
-
// On rebuild → fire a restart trigger; the coalescer takes it
|
|
1683
|
-
// from there.
|
|
1684
|
-
await this.buildService.watchApp(entry.name, bootstrapAbsPath, definition, () => {
|
|
1685
|
-
// Gate: skip if the app is in a non-running state — repeated
|
|
1686
|
-
// restarts of an escalated/errored process just churn forever
|
|
1687
|
-
// without forward progress (Fix #248).
|
|
1688
|
-
// Skip restart when the app is in a terminal non-running
|
|
1689
|
-
// state. Includes 'crashed' (supervisor escalated after
|
|
1690
|
-
// exceeding its restart budget) and 'errored' (start
|
|
1691
|
-
// failed). 'stopped' means operator explicitly stopped it.
|
|
1692
|
-
// In all three cases, restarting just churns a known-broken
|
|
1693
|
-
// process; the operator must fix the underlying issue and
|
|
1694
|
-
// call `omnitron start <app>` to clear the state.
|
|
1695
|
-
const status = this.getAppStatus(entry.name);
|
|
1696
|
-
if (status === 'errored' || status === 'crashed' || status === 'stopped') {
|
|
1697
|
-
this.logger.warn({ app: entry.name, status }, 'esbuild rebuild detected but app is not running — skipping restart');
|
|
1698
|
-
return;
|
|
1699
|
-
}
|
|
1700
|
-
this.logger.info({ app: entry.name }, 'esbuild rebuild detected — restarting');
|
|
1701
|
-
this.metricsBridge?.recordEsbuildBuild(entry.name, 'rebuild', 0, true);
|
|
1702
|
-
this.restartApp(entry.name).catch((err) => {
|
|
1703
|
-
this.logger.error({ app: entry.name, error: err.message }, 'Restart after esbuild rebuild failed');
|
|
1704
|
-
});
|
|
1705
|
-
});
|
|
1706
|
-
}
|
|
1707
|
-
}
|
|
1708
|
-
catch (err) {
|
|
1709
|
-
// The "fall back to tsx" wording was misleading — the orchestrator
|
|
1710
|
-
// does not inject a tsx loader into spawned children, so without
|
|
1711
|
-
// a build the bootstrap-process will try to `import` the source
|
|
1712
|
-
// .ts file (referenced as `./app.module.js` in the topology) and
|
|
1713
|
-
// fail with a cryptic "Cannot find module" downstream. Surface
|
|
1714
|
-
// the build error directly so the operator sees the actual
|
|
1715
|
-
// problem on `omnitron start/restart`.
|
|
1716
|
-
// esbuild's error carries an `errors[]` with file, line and column.
|
|
1717
|
-
// `.message` is the summary; the locations are what an operator needs
|
|
1718
|
-
// to fix the build, and they exist only on the original.
|
|
1719
|
-
this.logger.error({ app: entry.name, error: err }, 'esbuild build failed — app cannot start without bundled output');
|
|
1720
|
-
throw new Error(`Cannot launch '${entry.name}' in dev mode: esbuild build failed (${err.message}). ` +
|
|
1721
|
-
`Fix the build error and retry, or run with bundled output present in apps/${entry.name}/.omnitron-build/.`, { cause: err });
|
|
1722
|
-
}
|
|
1723
|
-
}
|
|
1733
|
+
if (definition)
|
|
1734
|
+
await this.prepareBootstrapBuild(entry, bootstrapAbsPath, definition);
|
|
1724
1735
|
const buildResult = this.buildResults.get(entry.name);
|
|
1725
1736
|
// Use bundled bootstrap path for topology import when available
|
|
1726
1737
|
const effectiveBootstrapPath = buildResult?.bootstrapPath ?? bootstrapAbsPath;
|
|
@@ -1731,6 +1742,36 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1731
1742
|
await this.launchSingleProcess(entry, handle, config, effectiveBootstrapPath, buildResult);
|
|
1732
1743
|
}
|
|
1733
1744
|
}
|
|
1745
|
+
async prepareBootstrapBuild(entry, bootstrapAbsPath, definition) {
|
|
1746
|
+
const sourceTopology = /\.(?:[cm]?ts|tsx)$/.test(bootstrapAbsPath) ||
|
|
1747
|
+
definition.processes.some((process) => /\.(?:[cm]?ts|tsx)$/.test(process.module));
|
|
1748
|
+
if (!this.devMode && !sourceTopology)
|
|
1749
|
+
return;
|
|
1750
|
+
try {
|
|
1751
|
+
this.buildService ??= new BuildService(this.devMode, {
|
|
1752
|
+
onEsbuildReset: (info) => this.metricsBridge?.recordResilientHandleReset(info),
|
|
1753
|
+
onBuildResult: ({ app, kind, durationMs, ok }) => this.metricsBridge?.recordEsbuildBuild(app, kind, durationMs, ok),
|
|
1754
|
+
});
|
|
1755
|
+
const existing = this.buildResults.get(entry.name);
|
|
1756
|
+
const current = this.handles.get(entry.name)?.entry ?? entry;
|
|
1757
|
+
const reusable = existing && this.allowsWatch(current) && this.buildService.isWatching(entry.name) &&
|
|
1758
|
+
this.buildService.canReuseBuild(existing, bootstrapAbsPath, definition);
|
|
1759
|
+
if (!reusable) {
|
|
1760
|
+
// A manual restart with watch:false deliberately compiles the current
|
|
1761
|
+
// sources. It must not reuse an artifact that stopped being maintained.
|
|
1762
|
+
await this.buildService.unwatchApp(entry.name);
|
|
1763
|
+
this.buildResults.delete(entry.name);
|
|
1764
|
+
this.buildResults.set(entry.name, await this.buildService.buildApp(entry.name, bootstrapAbsPath, definition));
|
|
1765
|
+
this.logger.info({ app: entry.name }, 'Built entry points via esbuild');
|
|
1766
|
+
}
|
|
1767
|
+
this.bootstrapSources.set(entry.name, { path: bootstrapAbsPath, definition });
|
|
1768
|
+
await this.syncBootstrapWatch(entry.name);
|
|
1769
|
+
}
|
|
1770
|
+
catch (error) {
|
|
1771
|
+
this.logger.error({ app: entry.name, error }, 'esbuild build failed — app cannot start without bundled output');
|
|
1772
|
+
throw new Error(`Cannot launch '${entry.name}': esbuild build failed (${error.message}). Fix the build error and retry.`, { cause: error });
|
|
1773
|
+
}
|
|
1774
|
+
}
|
|
1734
1775
|
/**
|
|
1735
1776
|
* Launch app with process topology — multiple children managed by Omnitron.
|
|
1736
1777
|
*
|
|
@@ -1969,7 +2010,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1969
2010
|
// This was a pool-only feature, ignored in silence everywhere else: a
|
|
1970
2011
|
// process declaring `expose: true` got no registration and no warning,
|
|
1971
2012
|
// and every consumer naming it in `topology.access` started without a
|
|
1972
|
-
// proxy. Measured on
|
|
2013
|
+
// proxy. Measured on quotes, whose `collector` is a single process
|
|
1973
2014
|
// holding the only objects that know whether the exchange WebSockets are
|
|
1974
2015
|
// up — the server process could not ask, and answered `ready: down —
|
|
1975
2016
|
// exchanges unavailable` while three were connected.
|
|
@@ -1977,7 +2018,7 @@ export class OrchestratorService extends EventEmitter {
|
|
|
1977
2018
|
// After `supervisor.start()` because there is no child to ask before it.
|
|
1978
2019
|
// A consumer among these children may therefore start before the service
|
|
1979
2020
|
// is registered; consumers re-resolve their proxy on use for exactly that
|
|
1980
|
-
// reason (see
|
|
2021
|
+
// reason (see quotes's `OhlcvSchedulerService`).
|
|
1981
2022
|
await this.exposeChildTopologyServices(entry, supervisor, serviceRouter, singleEntries);
|
|
1982
2023
|
}
|
|
1983
2024
|
/**
|