@spine-event-engine/server 2.0.0-snapshot.24 → 2.0.0-snapshot.26
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 +86 -19
- package/REFERENCE.md +538 -150
- package/dist/agent/agent-acceptance-receipts.d.ts +69 -0
- package/dist/agent/agent-acceptance-receipts.d.ts.map +1 -0
- package/dist/agent/agent-acceptance-receipts.js +198 -0
- package/dist/agent/agent-acceptance-receipts.js.map +1 -0
- package/dist/agent/agent-execution-capacity.d.ts +37 -9
- package/dist/agent/agent-execution-capacity.d.ts.map +1 -1
- package/dist/agent/agent-execution-capacity.js +73 -15
- package/dist/agent/agent-execution-capacity.js.map +1 -1
- package/dist/agent/agent-history.d.ts +33 -12
- package/dist/agent/agent-history.d.ts.map +1 -1
- package/dist/agent/agent-history.js +61 -18
- package/dist/agent/agent-history.js.map +1 -1
- package/dist/agent/agent-live-ai-audit.d.ts +95 -0
- package/dist/agent/agent-live-ai-audit.d.ts.map +1 -0
- package/dist/agent/agent-live-ai-audit.js +290 -0
- package/dist/agent/agent-live-ai-audit.js.map +1 -0
- package/dist/agent/agent-live-ai-runtime.d.ts +300 -0
- package/dist/agent/agent-live-ai-runtime.d.ts.map +1 -0
- package/dist/agent/agent-live-ai-runtime.js +611 -0
- package/dist/agent/agent-live-ai-runtime.js.map +1 -0
- package/dist/agent/agent-live-audit.d.ts +67 -0
- package/dist/agent/agent-live-audit.d.ts.map +1 -0
- package/dist/agent/agent-live-audit.js +121 -0
- package/dist/agent/agent-live-audit.js.map +1 -0
- package/dist/agent/agent-live-budget.d.ts +84 -0
- package/dist/agent/agent-live-budget.d.ts.map +1 -0
- package/dist/agent/agent-live-budget.js +161 -0
- package/dist/agent/agent-live-budget.js.map +1 -0
- package/dist/agent/agent-live-fault.d.ts +18 -0
- package/dist/agent/agent-live-fault.d.ts.map +1 -0
- package/dist/agent/{agent-execution-fault.js → agent-live-fault.js} +7 -7
- package/dist/agent/agent-live-fault.js.map +1 -0
- package/dist/agent/agent-live-inputs.d.ts +74 -0
- package/dist/agent/agent-live-inputs.d.ts.map +1 -0
- package/dist/agent/agent-live-inputs.js +15 -0
- package/dist/agent/agent-live-inputs.js.map +1 -0
- package/dist/agent/agent-live-interaction-events.d.ts +46 -0
- package/dist/agent/agent-live-interaction-events.d.ts.map +1 -0
- package/dist/agent/agent-live-interaction-events.js +104 -0
- package/dist/agent/agent-live-interaction-events.js.map +1 -0
- package/dist/agent/agent-live-mcp-controls.d.ts +129 -0
- package/dist/agent/agent-live-mcp-controls.d.ts.map +1 -0
- package/dist/agent/agent-live-mcp-controls.js +228 -0
- package/dist/agent/agent-live-mcp-controls.js.map +1 -0
- package/dist/agent/agent-live-mcp-host.d.ts +88 -0
- package/dist/agent/agent-live-mcp-host.d.ts.map +1 -0
- package/dist/agent/{agent-mcp-host.js → agent-live-mcp-host.js} +1 -1
- package/dist/agent/agent-live-mcp-host.js.map +1 -0
- package/dist/agent/{agent-mcp-runtime.d.ts → agent-live-mcp-runtime.d.ts} +6 -6
- package/dist/agent/agent-live-mcp-runtime.d.ts.map +1 -0
- package/dist/agent/{agent-mcp-runtime.js → agent-live-mcp-runtime.js} +13 -42
- package/dist/agent/agent-live-mcp-runtime.js.map +1 -0
- package/dist/agent/agent-live-read-runtime.d.ts +72 -0
- package/dist/agent/agent-live-read-runtime.d.ts.map +1 -0
- package/dist/agent/agent-live-read-runtime.js +122 -0
- package/dist/agent/agent-live-read-runtime.js.map +1 -0
- package/dist/agent/agent-model-selection.d.ts +21 -34
- package/dist/agent/agent-model-selection.d.ts.map +1 -1
- package/dist/agent/agent-model-selection.js +61 -78
- package/dist/agent/agent-model-selection.js.map +1 -1
- package/dist/browser/browser-server.d.ts +163 -0
- package/dist/browser/browser-server.d.ts.map +1 -1
- package/dist/browser/browser-server.js +579 -188
- package/dist/browser/browser-server.js.map +1 -1
- package/dist/browser/durable-subscription-bindings.d.ts +5 -0
- package/dist/browser/durable-subscription-bindings.d.ts.map +1 -1
- package/dist/browser/durable-subscription-bindings.js +226 -38
- package/dist/browser/durable-subscription-bindings.js.map +1 -1
- package/dist/browser/options.d.ts +5 -0
- package/dist/browser/options.d.ts.map +1 -1
- package/dist/bus/command-bus.d.ts +17 -18
- package/dist/bus/command-bus.d.ts.map +1 -1
- package/dist/bus/command-bus.js +97 -54
- package/dist/bus/command-bus.js.map +1 -1
- package/dist/bus/command-errors.d.ts +20 -4
- package/dist/bus/command-errors.d.ts.map +1 -1
- package/dist/bus/command-errors.js +47 -7
- package/dist/bus/command-errors.js.map +1 -1
- package/dist/bus/event-bus.d.ts +20 -4
- package/dist/bus/event-bus.d.ts.map +1 -1
- package/dist/bus/event-bus.js +166 -14
- package/dist/bus/event-bus.js.map +1 -1
- package/dist/context/bounded-context.d.ts +169 -98
- package/dist/context/bounded-context.d.ts.map +1 -1
- package/dist/context/bounded-context.js +837 -503
- package/dist/context/bounded-context.js.map +1 -1
- package/dist/context/entity-inbox.d.ts +7 -2
- package/dist/context/entity-inbox.d.ts.map +1 -1
- package/dist/context/entity-inbox.js +22 -13
- package/dist/context/entity-inbox.js.map +1 -1
- package/dist/context/local-inbox-handoff.d.ts +34 -34
- package/dist/context/local-inbox-handoff.d.ts.map +1 -1
- package/dist/context/local-inbox-handoff.js +108 -150
- package/dist/context/local-inbox-handoff.js.map +1 -1
- package/dist/context/projection-handoff.d.ts +2 -2
- package/dist/context/projection-handoff.d.ts.map +1 -1
- package/dist/context/projection-handoff.js +10 -8
- package/dist/context/projection-handoff.js.map +1 -1
- package/dist/context/tenant-index.d.ts +36 -31
- package/dist/context/tenant-index.d.ts.map +1 -1
- package/dist/context/tenant-index.js +123 -125
- package/dist/context/tenant-index.js.map +1 -1
- package/dist/context/tenant-unknown-error.d.ts +33 -0
- package/dist/context/tenant-unknown-error.d.ts.map +1 -0
- package/dist/context/tenant-unknown-error.js +75 -0
- package/dist/context/tenant-unknown-error.js.map +1 -0
- package/dist/delivery/agent-delivery-scope.d.ts +66 -0
- package/dist/delivery/agent-delivery-scope.d.ts.map +1 -0
- package/dist/delivery/agent-delivery-scope.js +44 -0
- package/dist/delivery/agent-delivery-scope.js.map +1 -0
- package/dist/delivery/delivery-builder.d.ts +25 -1
- package/dist/delivery/delivery-builder.d.ts.map +1 -1
- package/dist/delivery/delivery-builder.js +89 -0
- package/dist/delivery/delivery-builder.js.map +1 -1
- package/dist/delivery/delivery-monitor.d.ts +1 -1
- package/dist/delivery/delivery-monitor.js +1 -1
- package/dist/delivery/delivery-run-control.d.ts +6 -0
- package/dist/delivery/delivery-run-control.d.ts.map +1 -1
- package/dist/delivery/delivery-run-control.js +10 -0
- package/dist/delivery/delivery-run-control.js.map +1 -1
- package/dist/delivery/delivery-supervisor.d.ts.map +1 -1
- package/dist/delivery/delivery-supervisor.js +28 -4
- package/dist/delivery/delivery-supervisor.js.map +1 -1
- package/dist/delivery/delivery-tenant.d.ts +17 -0
- package/dist/delivery/delivery-tenant.d.ts.map +1 -0
- package/dist/delivery/delivery-tenant.js +50 -0
- package/dist/delivery/delivery-tenant.js.map +1 -0
- package/dist/delivery/delivery.d.ts +96 -2
- package/dist/delivery/delivery.d.ts.map +1 -1
- package/dist/delivery/delivery.js +693 -53
- package/dist/delivery/delivery.js.map +1 -1
- package/dist/delivery/inbox-records.d.ts.map +1 -1
- package/dist/delivery/inbox-records.js +9 -16
- package/dist/delivery/inbox-records.js.map +1 -1
- package/dist/delivery/inbox-storage.d.ts +6 -0
- package/dist/delivery/inbox-storage.d.ts.map +1 -1
- package/dist/delivery/inbox-storage.js +43 -6
- package/dist/delivery/inbox-storage.js.map +1 -1
- package/dist/delivery/inbox.d.ts.map +1 -1
- package/dist/delivery/inbox.js +3 -2
- package/dist/delivery/inbox.js.map +1 -1
- package/dist/delivery/reception-observation.d.ts +12 -4
- package/dist/delivery/reception-observation.d.ts.map +1 -1
- package/dist/delivery/reception-observation.js +14 -3
- package/dist/delivery/reception-observation.js.map +1 -1
- package/dist/delivery/sharded-work-registry.d.ts +6 -0
- package/dist/delivery/sharded-work-registry.d.ts.map +1 -1
- package/dist/delivery/sharded-work-registry.js +41 -4
- package/dist/delivery/sharded-work-registry.js.map +1 -1
- package/dist/entity/entity-storage-descriptor.d.ts.map +1 -1
- package/dist/entity/entity-storage-descriptor.js +7 -4
- package/dist/entity/entity-storage-descriptor.js.map +1 -1
- package/dist/entity/entity.d.ts +59 -0
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +60 -0
- package/dist/entity/entity.js.map +1 -1
- package/dist/handler/app-query-handler.d.ts +60 -0
- package/dist/handler/app-query-handler.d.ts.map +1 -0
- package/dist/{bus/saved-dispatcher-binding.js → handler/app-query-handler.js} +8 -12
- package/dist/handler/app-query-handler.js.map +1 -0
- package/dist/handler/generated-registry-discovery.d.ts +6 -0
- package/dist/handler/generated-registry-discovery.d.ts.map +1 -1
- package/dist/handler/generated-registry-discovery.js +71 -2
- package/dist/handler/generated-registry-discovery.js.map +1 -1
- package/dist/handler/handler-decorators.d.ts +8 -29
- package/dist/handler/handler-decorators.d.ts.map +1 -1
- package/dist/handler/handler-decorators.js +33 -210
- package/dist/handler/handler-decorators.js.map +1 -1
- package/dist/handler/spine-metadata-inventory.d.ts +99 -0
- package/dist/handler/spine-metadata-inventory.d.ts.map +1 -0
- package/dist/handler/spine-metadata-inventory.js +162 -0
- package/dist/handler/spine-metadata-inventory.js.map +1 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/integration/external-messages.d.ts.map +1 -1
- package/dist/integration/external-messages.js +9 -15
- package/dist/integration/external-messages.js.map +1 -1
- package/dist/integration/integration-broker.d.ts.map +1 -1
- package/dist/integration/integration-broker.js +112 -6
- package/dist/integration/integration-broker.js.map +1 -1
- package/dist/integration/third-party-context.d.ts.map +1 -1
- package/dist/integration/third-party-context.js +7 -10
- package/dist/integration/third-party-context.js.map +1 -1
- package/dist/repository/primitive-id.js +26 -11
- package/dist/repository/primitive-id.js.map +1 -1
- package/dist/repository/repository.d.ts +75 -60
- package/dist/repository/repository.d.ts.map +1 -1
- package/dist/repository/repository.js +1757 -1818
- package/dist/repository/repository.js.map +1 -1
- package/dist/runtime/runtime.d.ts +13 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +18 -0
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/signal-metadata.d.ts.map +1 -1
- package/dist/runtime/signal-metadata.js +6 -6
- package/dist/runtime/signal-metadata.js.map +1 -1
- package/dist/runtime/signal-publisher.d.ts +0 -6
- package/dist/runtime/signal-publisher.d.ts.map +1 -1
- package/dist/runtime/signal-publisher.js +1 -9
- package/dist/runtime/signal-publisher.js.map +1 -1
- package/dist/runtime/standalone-handler-runtime.d.ts +0 -7
- package/dist/runtime/standalone-handler-runtime.d.ts.map +1 -1
- package/dist/runtime/standalone-handler-runtime.js +13 -99
- package/dist/runtime/standalone-handler-runtime.js.map +1 -1
- package/dist/server/managed-delivery-gate.d.ts +34 -0
- package/dist/server/managed-delivery-gate.d.ts.map +1 -0
- package/dist/server/managed-delivery-gate.js +70 -0
- package/dist/server/managed-delivery-gate.js.map +1 -0
- package/dist/server/managed-server-application.d.ts +12 -11
- package/dist/server/managed-server-application.d.ts.map +1 -1
- package/dist/server/managed-server-application.js +48 -29
- package/dist/server/managed-server-application.js.map +1 -1
- package/dist/server/node-coordinator.d.ts +18 -5
- package/dist/server/node-coordinator.d.ts.map +1 -1
- package/dist/server/node-coordinator.js +554 -84
- package/dist/server/node-coordinator.js.map +1 -1
- package/dist/server/reserved-spine-rpc-paths.json +1 -0
- package/dist/server/server-environment.d.ts +220 -25
- package/dist/server/server-environment.d.ts.map +1 -1
- package/dist/server/server-environment.js +734 -145
- package/dist/server/server-environment.js.map +1 -1
- package/dist/server/server-log.d.ts +7 -0
- package/dist/server/server-log.d.ts.map +1 -1
- package/dist/server/server-log.js +14 -1
- package/dist/server/server-log.js.map +1 -1
- package/dist/server/server.d.ts +60 -29
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +155 -201
- package/dist/server/server.js.map +1 -1
- package/dist/services/app-query-execution.d.ts +53 -0
- package/dist/services/app-query-execution.d.ts.map +1 -0
- package/dist/services/app-query-execution.js +408 -0
- package/dist/services/app-query-execution.js.map +1 -0
- package/dist/services/query-reader.d.ts +32 -7
- package/dist/services/query-reader.d.ts.map +1 -1
- package/dist/services/query-reader.js +22 -2
- package/dist/services/query-reader.js.map +1 -1
- package/dist/services/read-request-status.d.ts +65 -0
- package/dist/services/read-request-status.d.ts.map +1 -0
- package/dist/services/read-request-status.js +151 -0
- package/dist/services/read-request-status.js.map +1 -0
- package/dist/services/spine-services.d.ts +37 -8
- package/dist/services/spine-services.d.ts.map +1 -1
- package/dist/services/spine-services.js +1103 -470
- package/dist/services/spine-services.js.map +1 -1
- package/dist/services/trusted-reader-ingress.d.ts +92 -0
- package/dist/services/trusted-reader-ingress.d.ts.map +1 -0
- package/dist/services/trusted-reader-ingress.js +89 -0
- package/dist/services/trusted-reader-ingress.js.map +1 -0
- package/dist/spi/handler-registry.d.ts +2 -0
- package/dist/spi/handler-registry.d.ts.map +1 -1
- package/dist/spi/handler-registry.js +1 -1
- package/dist/spi/handler-registry.js.map +1 -1
- package/dist/stand/event-origin-filter.js +3 -3
- package/dist/stand/event-origin-filter.js.map +1 -1
- package/dist/stand/read-side-filter-engine.d.ts +46 -0
- package/dist/stand/read-side-filter-engine.d.ts.map +1 -0
- package/dist/stand/read-side-filter-engine.js +356 -0
- package/dist/stand/read-side-filter-engine.js.map +1 -0
- package/dist/stand/read-side-filter.d.ts +247 -0
- package/dist/stand/read-side-filter.d.ts.map +1 -0
- package/dist/stand/read-side-filter.js +39 -0
- package/dist/stand/read-side-filter.js.map +1 -0
- package/dist/stand/read-side-message.d.ts +66 -0
- package/dist/stand/read-side-message.d.ts.map +1 -0
- package/dist/stand/read-side-message.js +167 -0
- package/dist/stand/read-side-message.js.map +1 -0
- package/dist/stand/stand-direct-delivery.d.ts +161 -0
- package/dist/stand/stand-direct-delivery.d.ts.map +1 -0
- package/dist/stand/stand-direct-delivery.js +210 -0
- package/dist/stand/stand-direct-delivery.js.map +1 -0
- package/dist/stand/stand.d.ts +94 -42
- package/dist/stand/stand.d.ts.map +1 -1
- package/dist/stand/stand.js +460 -60
- package/dist/stand/stand.js.map +1 -1
- package/dist/stand/subscription-observer.d.ts.map +1 -1
- package/dist/stand/subscription-observer.js +157 -40
- package/dist/stand/subscription-observer.js.map +1 -1
- package/dist/stand/subscription-read-filters.d.ts +40 -0
- package/dist/stand/subscription-read-filters.d.ts.map +1 -0
- package/dist/stand/subscription-read-filters.js +91 -0
- package/dist/stand/subscription-read-filters.js.map +1 -0
- package/dist/stand/subscription-reader-binding.d.ts +20 -0
- package/dist/stand/subscription-reader-binding.d.ts.map +1 -0
- package/dist/stand/subscription-reader-binding.js +56 -0
- package/dist/stand/subscription-reader-binding.js.map +1 -0
- package/dist/stand/subscription-records.d.ts +30 -3
- package/dist/stand/subscription-records.d.ts.map +1 -1
- package/dist/stand/subscription-records.js +61 -16
- package/dist/stand/subscription-records.js.map +1 -1
- package/dist/stand/subscription-registry.d.ts +54 -15
- package/dist/stand/subscription-registry.d.ts.map +1 -1
- package/dist/stand/subscription-registry.js +164 -41
- package/dist/stand/subscription-registry.js.map +1 -1
- package/dist/stand/subscription-runtime.d.ts +12 -5
- package/dist/stand/subscription-runtime.d.ts.map +1 -1
- package/dist/stand/subscription-runtime.js +183 -34
- package/dist/stand/subscription-runtime.js.map +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4 -3
- package/dist/testing/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -14
- package/dist/agent/agent-admission.d.ts +0 -80
- package/dist/agent/agent-admission.d.ts.map +0 -1
- package/dist/agent/agent-admission.js +0 -127
- package/dist/agent/agent-admission.js.map +0 -1
- package/dist/agent/agent-ai-runtime.d.ts +0 -76
- package/dist/agent/agent-ai-runtime.d.ts.map +0 -1
- package/dist/agent/agent-ai-runtime.js +0 -1269
- package/dist/agent/agent-ai-runtime.js.map +0 -1
- package/dist/agent/agent-execution-fault.d.ts +0 -18
- package/dist/agent/agent-execution-fault.d.ts.map +0 -1
- package/dist/agent/agent-execution-fault.js.map +0 -1
- package/dist/agent/agent-execution-session.d.ts +0 -103
- package/dist/agent/agent-execution-session.d.ts.map +0 -1
- package/dist/agent/agent-execution-session.js +0 -238
- package/dist/agent/agent-execution-session.js.map +0 -1
- package/dist/agent/agent-interaction-audit.d.ts +0 -58
- package/dist/agent/agent-interaction-audit.d.ts.map +0 -1
- package/dist/agent/agent-interaction-audit.js +0 -114
- package/dist/agent/agent-interaction-audit.js.map +0 -1
- package/dist/agent/agent-interaction-events.d.ts +0 -40
- package/dist/agent/agent-interaction-events.d.ts.map +0 -1
- package/dist/agent/agent-interaction-events.js +0 -129
- package/dist/agent/agent-interaction-events.js.map +0 -1
- package/dist/agent/agent-mcp-budget.d.ts +0 -125
- package/dist/agent/agent-mcp-budget.d.ts.map +0 -1
- package/dist/agent/agent-mcp-budget.js +0 -566
- package/dist/agent/agent-mcp-budget.js.map +0 -1
- package/dist/agent/agent-mcp-host.d.ts +0 -125
- package/dist/agent/agent-mcp-host.d.ts.map +0 -1
- package/dist/agent/agent-mcp-host.js.map +0 -1
- package/dist/agent/agent-mcp-runtime.d.ts.map +0 -1
- package/dist/agent/agent-mcp-runtime.js.map +0 -1
- package/dist/agent/agent-read-runtime.d.ts +0 -70
- package/dist/agent/agent-read-runtime.d.ts.map +0 -1
- package/dist/agent/agent-read-runtime.js +0 -320
- package/dist/agent/agent-read-runtime.js.map +0 -1
- package/dist/agent/agent-revisions.d.ts +0 -35
- package/dist/agent/agent-revisions.d.ts.map +0 -1
- package/dist/agent/agent-revisions.js +0 -133
- package/dist/agent/agent-revisions.js.map +0 -1
- package/dist/agent/agent-scheduler.d.ts +0 -99
- package/dist/agent/agent-scheduler.d.ts.map +0 -1
- package/dist/agent/agent-scheduler.js +0 -398
- package/dist/agent/agent-scheduler.js.map +0 -1
- package/dist/bus/saved-dispatcher-binding.d.ts +0 -53
- package/dist/bus/saved-dispatcher-binding.d.ts.map +0 -1
- package/dist/bus/saved-dispatcher-binding.js.map +0 -1
- package/dist/delivery/delivery-run-coordinator.d.ts +0 -218
- package/dist/delivery/delivery-run-coordinator.d.ts.map +0 -1
- package/dist/delivery/delivery-run-coordinator.js +0 -609
- package/dist/delivery/delivery-run-coordinator.js.map +0 -1
- package/dist/delivery/parked-delivery-obligations.d.ts +0 -182
- package/dist/delivery/parked-delivery-obligations.d.ts.map +0 -1
- package/dist/delivery/parked-delivery-obligations.js +0 -390
- package/dist/delivery/parked-delivery-obligations.js.map +0 -1
- package/dist/server/environment-attachment.d.ts +0 -356
- package/dist/server/environment-attachment.d.ts.map +0 -1
- package/dist/server/environment-attachment.js +0 -2062
- package/dist/server/environment-attachment.js.map +0 -1
- package/dist/server/environment-delivery-records.d.ts +0 -77
- package/dist/server/environment-delivery-records.d.ts.map +0 -1
- package/dist/server/environment-delivery-records.js +0 -282
- package/dist/server/environment-delivery-records.js.map +0 -1
- package/dist/server/environment-delivery-worker.d.ts +0 -161
- package/dist/server/environment-delivery-worker.d.ts.map +0 -1
- package/dist/server/environment-delivery-worker.js +0 -973
- package/dist/server/environment-delivery-worker.js.map +0 -1
package/dist/server/server.js
CHANGED
|
@@ -12,10 +12,18 @@
|
|
|
12
12
|
* the License.
|
|
13
13
|
*/
|
|
14
14
|
import * as http2 from "node:http2";
|
|
15
|
+
import { clone } from "@bufbuild/protobuf";
|
|
16
|
+
import { ActorContextSchema } from "@spine-event-engine/proto";
|
|
17
|
+
import { snapshotTrustedReader, } from "@spine-event-engine/core/spi/trusted-reader";
|
|
15
18
|
import { connectNodeAdapter } from "@connectrpc/connect-node";
|
|
16
19
|
import { BoundedContext, BoundedContextBuilder, boundedContextAccess, } from "../context/bounded-context.js";
|
|
17
20
|
import { SpineServices, spineServicesAccess, } from "../services/spine-services.js";
|
|
18
21
|
import { RegisteredTargets } from "../services/registered-targets.js";
|
|
22
|
+
import { AppQueryExecution } from "../services/app-query-execution.js";
|
|
23
|
+
import { ReadSideFilter } from "../stand/read-side-filter.js";
|
|
24
|
+
import { ReadSideFilterEngine } from "../stand/read-side-filter-engine.js";
|
|
25
|
+
import { TypeRegistry } from "@spine-event-engine/core";
|
|
26
|
+
import { registeredProtoModules } from "@spine-event-engine/proto/codegen";
|
|
19
27
|
import { ProcessServerCoordinator } from "./process-server-coordinator.js";
|
|
20
28
|
import { CloseErrors, RetryableCloseGroup } from "./retryable-close.js";
|
|
21
29
|
import { ServerEnvironment, serverEnvironmentAccess } from "./server-environment.js";
|
|
@@ -30,10 +38,9 @@ const assemblingStands = new WeakMap();
|
|
|
30
38
|
/**
|
|
31
39
|
* Configures and starts local Spine Connect/gRPC-compatible services.
|
|
32
40
|
*
|
|
33
|
-
* A server assembles its bounded contexts
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* to this assembly.
|
|
41
|
+
* A server assembles its bounded contexts and opens generated services before
|
|
42
|
+
* accepting network requests. It closes its contexts and added resources in
|
|
43
|
+
* order while environment Delivery remains available to sibling contexts.
|
|
37
44
|
*/
|
|
38
45
|
export class Server {
|
|
39
46
|
#host;
|
|
@@ -41,14 +48,16 @@ export class Server {
|
|
|
41
48
|
#readMaxBytes;
|
|
42
49
|
#writeMaxBytes;
|
|
43
50
|
#contexts = [];
|
|
44
|
-
#aiRegistry;
|
|
45
51
|
#resources = [];
|
|
46
52
|
#listenerLifecycles = [];
|
|
53
|
+
#appQueries;
|
|
54
|
+
#readFilters;
|
|
47
55
|
#services;
|
|
48
56
|
#environment;
|
|
49
57
|
#starting;
|
|
50
58
|
#startingOwnership;
|
|
51
59
|
#run;
|
|
60
|
+
#active;
|
|
52
61
|
#failedStartCleanup;
|
|
53
62
|
#failedListenerLifecycle;
|
|
54
63
|
#failedStartConsumed = false;
|
|
@@ -63,6 +72,8 @@ export class Server {
|
|
|
63
72
|
this.#readMaxBytes = ServerValues.normalizeMessageMaxBytes(options.readMaxBytes ?? defaultMessageMaxBytes, "readMaxBytes");
|
|
64
73
|
this.#writeMaxBytes = ServerValues.normalizeMessageMaxBytes(options.writeMaxBytes ?? defaultMessageMaxBytes, "writeMaxBytes");
|
|
65
74
|
this.#contexts.push(...(options.contexts ?? []));
|
|
75
|
+
this.#appQueries = Object.freeze([...(options.appQueries ?? [])]);
|
|
76
|
+
this.#readFilters = Object.freeze([...new Set(options.readSideFilters ?? [])]);
|
|
66
77
|
this.#resources.push(...(options.resources ?? []));
|
|
67
78
|
this.#services = options.services ?? {};
|
|
68
79
|
this.#environment = ServerEnvironment.instance();
|
|
@@ -81,10 +92,9 @@ export class Server {
|
|
|
81
92
|
/**
|
|
82
93
|
* Adds one bounded context or builder to the assembly.
|
|
83
94
|
*
|
|
84
|
-
* Builders assemble during {@link start} before
|
|
85
|
-
* They use {@link ServerEnvironment.storageFactory}
|
|
86
|
-
*
|
|
87
|
-
* closes added contexts only after services, sessions, and active work stop.
|
|
95
|
+
* Builders assemble during {@link start} before the listener opens.
|
|
96
|
+
* They use {@link ServerEnvironment.storageFactory}. The running server closes
|
|
97
|
+
* added contexts after services, sessions, and active work stop.
|
|
88
98
|
*
|
|
89
99
|
* @param context Supplies the context or builder to expose.
|
|
90
100
|
* @returns This server builder.
|
|
@@ -94,15 +104,22 @@ export class Server {
|
|
|
94
104
|
return this;
|
|
95
105
|
}
|
|
96
106
|
/**
|
|
97
|
-
*
|
|
98
|
-
* An explicit Bounded Context registry takes precedence.
|
|
107
|
+
* Executes a generated application request through this Server's active handler table.
|
|
99
108
|
*
|
|
100
|
-
* @
|
|
101
|
-
* @
|
|
109
|
+
* @typeParam Q Generated request with a declared paired response.
|
|
110
|
+
* @param query Generated application request, captured before any await.
|
|
111
|
+
* @param executionContext Effective actor and verified facts from framework execution.
|
|
112
|
+
* @returns The paired generated application result.
|
|
102
113
|
*/
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
114
|
+
async query(query, executionContext) {
|
|
115
|
+
const detached = structuredClone(query);
|
|
116
|
+
const actor = clone(ActorContextSchema, executionContext.actorContext);
|
|
117
|
+
const reader = snapshotTrustedReader(executionContext);
|
|
118
|
+
const signal = executionContext.signal;
|
|
119
|
+
const running = this.#starting === undefined ? this.#active : await this.#starting;
|
|
120
|
+
if (!(running instanceof RunningHttp2Server))
|
|
121
|
+
throw new Error("Server App Query execution requires a running Server.");
|
|
122
|
+
return running.queryTyped(detached, actor, reader, signal);
|
|
106
123
|
}
|
|
107
124
|
/**
|
|
108
125
|
* Adds a framework closeable owned by this server assembly.
|
|
@@ -128,15 +145,13 @@ export class Server {
|
|
|
128
145
|
return this;
|
|
129
146
|
}
|
|
130
147
|
/**
|
|
131
|
-
* Starts the server after
|
|
148
|
+
* Starts the server after assembling contexts and services.
|
|
132
149
|
*
|
|
133
|
-
* Built contexts
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* while run-managed ownership is active, installs no signal handlers, and
|
|
139
|
-
* never closes the environment.
|
|
150
|
+
* Built contexts register recipients before generated services and the listener
|
|
151
|
+
* open. A failed assembly or listener open leaves no listener and closes acquired
|
|
152
|
+
* resources. Network cleanup is a hard gate before context or dependency cleanup.
|
|
153
|
+
* Caller-managed startup shares the active environment, rejects during a managed
|
|
154
|
+
* server run, installs no signal handlers, and never closes the environment.
|
|
140
155
|
* A later call after incomplete cleanup retries only that cleanup and leaves
|
|
141
156
|
* this server terminal. A fresh server may reuse the singleton environment.
|
|
142
157
|
* Concurrent callers share one start or cleanup attempt.
|
|
@@ -146,6 +161,9 @@ export class Server {
|
|
|
146
161
|
start() {
|
|
147
162
|
return this.#start("caller");
|
|
148
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Shares or begins startup under the selected environment lifecycle mode.
|
|
166
|
+
*/
|
|
149
167
|
#start(ownership) {
|
|
150
168
|
const current = this.#starting;
|
|
151
169
|
if (current !== undefined) {
|
|
@@ -162,7 +180,7 @@ export class Server {
|
|
|
162
180
|
const starting = lifecycle !== undefined
|
|
163
181
|
? this.#retryFailedListenerLifecycle(lifecycle)
|
|
164
182
|
: cleanup === undefined
|
|
165
|
-
? this.#startOnce(
|
|
183
|
+
? this.#startOnce()
|
|
166
184
|
: this.#retryFailedStartCleanup(cleanup);
|
|
167
185
|
this.#starting = starting;
|
|
168
186
|
this.#startingOwnership = ownership;
|
|
@@ -206,37 +224,35 @@ export class Server {
|
|
|
206
224
|
return running;
|
|
207
225
|
}
|
|
208
226
|
/**
|
|
209
|
-
* Builds contexts
|
|
227
|
+
* Builds contexts and opens the listener for one start attempt.
|
|
210
228
|
*
|
|
211
|
-
* @param ownership Whether the environment is managed by this Server.
|
|
212
229
|
* @returns The running listener after lifecycle startup.
|
|
213
230
|
*/
|
|
214
|
-
async #startOnce(
|
|
231
|
+
async #startOnce() {
|
|
232
|
+
await serverEnvironmentAccess.awaitSetup(this.#environment);
|
|
215
233
|
const admission = { token: {}, contexts: [] };
|
|
216
234
|
const contexts = await this.#prepareContexts(admission);
|
|
217
|
-
const
|
|
218
|
-
const running = await this.#openListener(contexts,
|
|
235
|
+
const routes = await this.#installContexts(contexts, admission);
|
|
236
|
+
const running = await this.#openListener(contexts, routes);
|
|
219
237
|
await this.#startLifecycles(running);
|
|
238
|
+
this.#active = running;
|
|
220
239
|
return running;
|
|
221
240
|
}
|
|
222
241
|
/**
|
|
223
242
|
* Opens the service listener with retryable cleanup for every preparation phase.
|
|
224
243
|
*
|
|
225
244
|
* @param contexts Contexts exposed by the listener.
|
|
226
|
-
* @param attachment Active environment delivery attachment.
|
|
227
245
|
* @param routes Routes installed for these contexts.
|
|
228
246
|
* @returns The prepared running listener.
|
|
229
247
|
*/
|
|
230
|
-
async #openListener(contexts,
|
|
248
|
+
async #openListener(contexts, routes) {
|
|
231
249
|
const closeables = [...contexts, ...this.#resources];
|
|
232
250
|
const cleanup = {
|
|
233
251
|
closeGroup: new RetryableCloseGroup(closeables, "Server start cleanup failed while closing owned contexts/resources."),
|
|
234
|
-
attachment,
|
|
235
252
|
routes,
|
|
236
|
-
failedStartRollback: undefined,
|
|
237
253
|
};
|
|
238
254
|
try {
|
|
239
|
-
return await this.#prepareListener(contexts,
|
|
255
|
+
return await this.#prepareListener(contexts, routes, closeables, cleanup);
|
|
240
256
|
}
|
|
241
257
|
catch (error) {
|
|
242
258
|
this.#failedStartCleanup = cleanup;
|
|
@@ -247,16 +263,13 @@ export class Server {
|
|
|
247
263
|
* Constructs services and the HTTP adapter, then binds the listener.
|
|
248
264
|
*
|
|
249
265
|
* @param contexts Contexts exposed by this Server.
|
|
250
|
-
* @param attachment Active delivery attachment.
|
|
251
266
|
* @param routes Installed state routes.
|
|
252
267
|
* @param closeables Contexts and resources for eventual shutdown.
|
|
253
268
|
* @param cleanup Retained cleanup state if preparation fails.
|
|
254
269
|
* @returns The prepared running listener.
|
|
255
270
|
*/
|
|
256
|
-
async #prepareListener(contexts,
|
|
257
|
-
const services =
|
|
258
|
-
cleanup.services = services;
|
|
259
|
-
spineServicesAccess.installLogger(services, serverEnvironmentAccess.loggerFor(this.#environment));
|
|
271
|
+
async #prepareListener(contexts, routes, closeables, cleanup) {
|
|
272
|
+
const { queries, services } = this.#createReadServices(contexts, routes, cleanup);
|
|
260
273
|
const { httpServer, sessions } = this.#createHttpListener(services);
|
|
261
274
|
cleanup.network = { server: httpServer, sessions };
|
|
262
275
|
const address = await ServerValues.listen(httpServer, this.#host, this.#port);
|
|
@@ -265,8 +278,8 @@ export class Server {
|
|
|
265
278
|
server: httpServer,
|
|
266
279
|
sessions,
|
|
267
280
|
environment: this.#environment,
|
|
268
|
-
attachment,
|
|
269
281
|
routes,
|
|
282
|
+
queries,
|
|
270
283
|
services,
|
|
271
284
|
host,
|
|
272
285
|
port: address.port,
|
|
@@ -274,6 +287,31 @@ export class Server {
|
|
|
274
287
|
closeables,
|
|
275
288
|
});
|
|
276
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Installs Server result policies and query execution into one listener's services.
|
|
292
|
+
*
|
|
293
|
+
* @param contexts Exposed Bounded Contexts.
|
|
294
|
+
* @param routes Validated Entity state routes.
|
|
295
|
+
* @param cleanup Retained failure cleanup state.
|
|
296
|
+
* @returns Listener services and App Query execution lifetime.
|
|
297
|
+
*/
|
|
298
|
+
#createReadServices(contexts, routes, cleanup) {
|
|
299
|
+
const filters = this.#readFilters.length === 0
|
|
300
|
+
? undefined
|
|
301
|
+
: new ReadSideFilterEngine(this.#readFilters, TypeRegistry.from(...registeredProtoModules()));
|
|
302
|
+
const queries = new AppQueryExecution(this.#appQueries, routes, filters);
|
|
303
|
+
const services = new SpineServices({
|
|
304
|
+
contexts,
|
|
305
|
+
readMaxBytes: this.#readMaxBytes,
|
|
306
|
+
...this.#services,
|
|
307
|
+
});
|
|
308
|
+
cleanup.services = services;
|
|
309
|
+
spineServicesAccess.installAppQueries(services, queries);
|
|
310
|
+
if (filters !== undefined)
|
|
311
|
+
spineServicesAccess.installReadFilters(services, filters);
|
|
312
|
+
spineServicesAccess.installLogger(services, serverEnvironmentAccess.loggerFor(this.#environment));
|
|
313
|
+
return { queries, services };
|
|
314
|
+
}
|
|
277
315
|
/**
|
|
278
316
|
* Prepares an HTTP listener and its tracked sessions for startup.
|
|
279
317
|
*
|
|
@@ -326,7 +364,7 @@ export class Server {
|
|
|
326
364
|
throw conflict;
|
|
327
365
|
for (const entry of this.#contexts) {
|
|
328
366
|
const context = boundedContextAccess.isBuilder(entry)
|
|
329
|
-
? await boundedContextAccess.build(entry
|
|
367
|
+
? await boundedContextAccess.build(entry)
|
|
330
368
|
: entry;
|
|
331
369
|
if (boundedContextAccess.isBuilder(entry))
|
|
332
370
|
this.#admitContext(context, admission);
|
|
@@ -335,7 +373,7 @@ export class Server {
|
|
|
335
373
|
return contexts;
|
|
336
374
|
}
|
|
337
375
|
catch (error) {
|
|
338
|
-
await this.#
|
|
376
|
+
await this.#cleanupFailedRegistration(admission.contexts, undefined, error, admission);
|
|
339
377
|
throw error;
|
|
340
378
|
}
|
|
341
379
|
}
|
|
@@ -368,14 +406,13 @@ export class Server {
|
|
|
368
406
|
admission.contexts.length = 0;
|
|
369
407
|
}
|
|
370
408
|
/**
|
|
371
|
-
*
|
|
409
|
+
* Installs state routes for the assembled contexts.
|
|
372
410
|
*
|
|
373
411
|
* @param contexts Built contexts for this Server.
|
|
374
|
-
* @param
|
|
375
|
-
* @
|
|
376
|
-
* @returns The environment attachment and its installed routes.
|
|
412
|
+
* @param admission Reservations transferred to installed routes.
|
|
413
|
+
* @returns The installed routes.
|
|
377
414
|
*/
|
|
378
|
-
async #
|
|
415
|
+
async #installContexts(contexts, admission) {
|
|
379
416
|
const freshContexts = contexts.filter((context) => RegisteredTargets.forStand(context.stand()) === undefined);
|
|
380
417
|
let routes;
|
|
381
418
|
try {
|
|
@@ -387,42 +424,29 @@ export class Server {
|
|
|
387
424
|
boundedContextAccess.installLogger(context, logger);
|
|
388
425
|
serverEnvironmentAccess.warnVolatileRegistry(this.#environment, context);
|
|
389
426
|
}
|
|
390
|
-
|
|
391
|
-
ownership,
|
|
392
|
-
descriptors: contexts.map((context) => boundedContextAccess.delivery(context)),
|
|
393
|
-
});
|
|
394
|
-
return { attachment, routes };
|
|
427
|
+
return routes;
|
|
395
428
|
}
|
|
396
429
|
catch (error) {
|
|
397
|
-
await this.#
|
|
430
|
+
await this.#cleanupFailedRegistration(freshContexts, routes, error, admission);
|
|
398
431
|
throw error;
|
|
399
432
|
}
|
|
400
433
|
}
|
|
401
434
|
/**
|
|
402
|
-
* Retains retryable cleanup when route
|
|
435
|
+
* Retains retryable cleanup when route installation fails.
|
|
403
436
|
*
|
|
404
437
|
* @param contexts Fresh contexts to close after failure.
|
|
405
438
|
* @param routes Routes installed by this attempt, if any.
|
|
406
|
-
* @param error Original route
|
|
439
|
+
* @param error Original route failure.
|
|
407
440
|
* @param admission Reservations retained until context cleanup succeeds.
|
|
408
441
|
*/
|
|
409
|
-
async #
|
|
442
|
+
async #cleanupFailedRegistration(contexts, routes, error, admission) {
|
|
410
443
|
const closeGroup = new RetryableCloseGroup([...contexts, ...this.#resources], "Server start cleanup failed while closing owned contexts/resources.");
|
|
411
|
-
if (serverEnvironmentAccess.failedStartRetryPending(this.#environment, error)) {
|
|
412
|
-
this.#failedStartCleanup = {
|
|
413
|
-
closeGroup,
|
|
414
|
-
failedStartRollback: { rejection: error },
|
|
415
|
-
routes,
|
|
416
|
-
admission,
|
|
417
|
-
};
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
444
|
try {
|
|
421
445
|
await closeGroup.close();
|
|
422
446
|
}
|
|
423
447
|
catch (cleanupError) {
|
|
424
|
-
this.#failedStartCleanup = { closeGroup,
|
|
425
|
-
throw ServerValues.
|
|
448
|
+
this.#failedStartCleanup = { closeGroup, routes, admission };
|
|
449
|
+
throw ServerValues.registrationCleanupError(error, cleanupError);
|
|
426
450
|
}
|
|
427
451
|
routes?.release();
|
|
428
452
|
if (admission !== undefined)
|
|
@@ -446,6 +470,9 @@ export class Server {
|
|
|
446
470
|
throw error;
|
|
447
471
|
}
|
|
448
472
|
}
|
|
473
|
+
/**
|
|
474
|
+
* Retries deferred network and resource cleanup from a failed startup, then reports the prior failure.
|
|
475
|
+
*/
|
|
449
476
|
async #retryFailedStartCleanup(cleanup) {
|
|
450
477
|
const errors = [];
|
|
451
478
|
if (!(await this.#closeFailedStartNetwork(cleanup, errors))) {
|
|
@@ -457,12 +484,18 @@ export class Server {
|
|
|
457
484
|
}
|
|
458
485
|
throw new Error("Server deferred cleanup completed after an earlier failed start.");
|
|
459
486
|
}
|
|
487
|
+
/**
|
|
488
|
+
* Retries a failed listener lifecycle close and leaves the server terminal.
|
|
489
|
+
*/
|
|
460
490
|
async #retryFailedListenerLifecycle(running) {
|
|
461
491
|
await running.close();
|
|
462
492
|
this.#failedListenerLifecycle = undefined;
|
|
463
493
|
this.#failedStartConsumed = true;
|
|
464
494
|
throw new Error("Server deferred cleanup completed after an earlier failed start.");
|
|
465
495
|
}
|
|
496
|
+
/**
|
|
497
|
+
* Cleans up startup resources after listener lifecycle startup fails.
|
|
498
|
+
*/
|
|
466
499
|
async #cleanupFailedListenerStart(cleanup, startError) {
|
|
467
500
|
const errors = [];
|
|
468
501
|
if (!(await this.#closeFailedStartNetwork(cleanup, errors))) {
|
|
@@ -471,11 +504,10 @@ export class Server {
|
|
|
471
504
|
await this.#advanceFailedStartCleanup(cleanup, errors);
|
|
472
505
|
return ServerValues.throwListenerStartError(startError, errors);
|
|
473
506
|
}
|
|
507
|
+
/**
|
|
508
|
+
* Closes acquired dependencies and releases startup registrations after network cleanup succeeds.
|
|
509
|
+
*/
|
|
474
510
|
async #advanceFailedStartCleanup(cleanup, errors) {
|
|
475
|
-
if (!(await this.#advanceFailedStartAttachment(cleanup, errors))) {
|
|
476
|
-
return;
|
|
477
|
-
}
|
|
478
|
-
await this.#retryFailedStartRollback(cleanup, errors);
|
|
479
511
|
let closeFailed = false;
|
|
480
512
|
try {
|
|
481
513
|
await cleanup.closeGroup.close();
|
|
@@ -484,7 +516,7 @@ export class Server {
|
|
|
484
516
|
closeFailed = true;
|
|
485
517
|
CloseErrors.collect(error, errors);
|
|
486
518
|
}
|
|
487
|
-
if (!closeFailed &&
|
|
519
|
+
if (!closeFailed && this.#failedStartCleanup === cleanup) {
|
|
488
520
|
cleanup.routes?.release();
|
|
489
521
|
if (cleanup.admission !== undefined)
|
|
490
522
|
this.#releaseAdmission(cleanup.admission);
|
|
@@ -495,26 +527,8 @@ export class Server {
|
|
|
495
527
|
}
|
|
496
528
|
}
|
|
497
529
|
/**
|
|
498
|
-
*
|
|
499
|
-
*
|
|
500
|
-
* @param cleanup Retained failed-start state.
|
|
501
|
-
* @param errors Errors collected across cleanup phases.
|
|
530
|
+
* Attempts listener and session shutdown, retaining cleanup state if it fails.
|
|
502
531
|
*/
|
|
503
|
-
async #retryFailedStartRollback(cleanup, errors) {
|
|
504
|
-
const failedStartRollback = cleanup.failedStartRollback;
|
|
505
|
-
if (failedStartRollback !== undefined &&
|
|
506
|
-
serverEnvironmentAccess.failedStartRetryPending(this.#environment, failedStartRollback.rejection)) {
|
|
507
|
-
try {
|
|
508
|
-
await serverEnvironmentAccess.retryFailedStart(this.#environment);
|
|
509
|
-
}
|
|
510
|
-
catch (error) {
|
|
511
|
-
if (serverEnvironmentAccess.failedStartRetryPending(this.#environment, failedStartRollback.rejection)) {
|
|
512
|
-
throw error;
|
|
513
|
-
}
|
|
514
|
-
CloseErrors.collect(error, errors);
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
532
|
async #closeFailedStartNetwork(cleanup, errors) {
|
|
519
533
|
const network = cleanup.network;
|
|
520
534
|
if (network === undefined) {
|
|
@@ -530,34 +544,9 @@ export class Server {
|
|
|
530
544
|
return false;
|
|
531
545
|
}
|
|
532
546
|
}
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
return true;
|
|
537
|
-
}
|
|
538
|
-
try {
|
|
539
|
-
if (serverEnvironmentAccess.detachRetryPending(this.#environment, attachment)) {
|
|
540
|
-
await serverEnvironmentAccess.retryDetach(this.#environment, attachment);
|
|
541
|
-
}
|
|
542
|
-
else {
|
|
543
|
-
await serverEnvironmentAccess.detach(this.#environment, attachment);
|
|
544
|
-
}
|
|
545
|
-
delete cleanup.attachment;
|
|
546
|
-
return true;
|
|
547
|
-
}
|
|
548
|
-
catch (error) {
|
|
549
|
-
CloseErrors.collect(error, errors);
|
|
550
|
-
}
|
|
551
|
-
try {
|
|
552
|
-
if (serverEnvironmentAccess.endpointSafe(this.#environment, attachment)) {
|
|
553
|
-
return true;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
catch (error) {
|
|
557
|
-
CloseErrors.collect(error, errors);
|
|
558
|
-
}
|
|
559
|
-
return false;
|
|
560
|
-
}
|
|
547
|
+
/**
|
|
548
|
+
* Clears the in-progress startup marker after the shared attempt settles.
|
|
549
|
+
*/
|
|
561
550
|
#finishStart(starting) {
|
|
562
551
|
if (this.#starting === starting) {
|
|
563
552
|
this.#starting = undefined;
|
|
@@ -571,11 +560,17 @@ export class Server {
|
|
|
571
560
|
* @internal
|
|
572
561
|
*/
|
|
573
562
|
export const serverBuilderAccess = Object.freeze({
|
|
563
|
+
/**
|
|
564
|
+
* Reports whether the configured server host resolves to a loopback address.
|
|
565
|
+
*/
|
|
574
566
|
isLoopback(server) {
|
|
575
567
|
const host = serverHosts.get(server);
|
|
576
568
|
return host !== undefined && isLoopbackHost(host);
|
|
577
569
|
},
|
|
578
570
|
});
|
|
571
|
+
/**
|
|
572
|
+
* Recognizes IPv4 and IPv6 loopback host spellings accepted by the server.
|
|
573
|
+
*/
|
|
579
574
|
function isLoopbackHost(host) {
|
|
580
575
|
if (host === "::1" || host === "::ffff:127.0.0.1")
|
|
581
576
|
return true;
|
|
@@ -588,11 +583,17 @@ function isLoopbackHost(host) {
|
|
|
588
583
|
* @internal
|
|
589
584
|
*/
|
|
590
585
|
export const runningServerAccess = Object.freeze({
|
|
586
|
+
/**
|
|
587
|
+
* Returns subscription registries for contexts in this running server, when available.
|
|
588
|
+
*/
|
|
591
589
|
subscriptionRegistries(server) {
|
|
592
590
|
return runningContexts
|
|
593
591
|
.get(server)
|
|
594
592
|
?.map((context) => boundedContextAccess.subscriptionRegistry(context));
|
|
595
593
|
},
|
|
594
|
+
/**
|
|
595
|
+
* Waits for admitted Delivery work across this server’s contexts to settle.
|
|
596
|
+
*/
|
|
596
597
|
drainDelivery(server) {
|
|
597
598
|
return server instanceof RunningHttp2Server ? server.drainDelivery() : Promise.resolve();
|
|
598
599
|
},
|
|
@@ -608,15 +609,14 @@ class RunningHttp2Server {
|
|
|
608
609
|
#listenerLifecycles;
|
|
609
610
|
#startedLifecycles = [];
|
|
610
611
|
#environment;
|
|
611
|
-
#attachment;
|
|
612
612
|
#routes;
|
|
613
613
|
#services;
|
|
614
|
+
#queries;
|
|
614
615
|
host;
|
|
615
616
|
port;
|
|
616
617
|
baseUrl;
|
|
617
618
|
#closed;
|
|
618
619
|
#networkClosed = false;
|
|
619
|
-
#attachmentDetached = false;
|
|
620
620
|
#closeGroup;
|
|
621
621
|
/**
|
|
622
622
|
* Captures the running listener's network, environment, and cleanup resources.
|
|
@@ -630,20 +630,36 @@ class RunningHttp2Server {
|
|
|
630
630
|
this.#contexts = options.contexts;
|
|
631
631
|
this.#listenerLifecycles = options.listenerLifecycles;
|
|
632
632
|
this.#environment = options.environment;
|
|
633
|
-
this.#attachment = options.attachment;
|
|
634
633
|
this.#routes = options.routes;
|
|
635
634
|
this.#services = options.services;
|
|
635
|
+
this.#queries = options.queries;
|
|
636
636
|
this.host = options.host;
|
|
637
637
|
this.port = options.port;
|
|
638
638
|
this.baseUrl = `http://${ServerValues.formatHostForUrl(options.host)}:${options.port.toString()}`;
|
|
639
639
|
this.#closeGroup = new RetryableCloseGroup(this.#closeables, "Server close failed while closing owned contexts/resources.");
|
|
640
640
|
}
|
|
641
|
+
/**
|
|
642
|
+
* Dispatches a generated request only while this listener remains active.
|
|
643
|
+
*
|
|
644
|
+
* @typeParam Q Generated application request with a paired response.
|
|
645
|
+
* @param query Captured generated request.
|
|
646
|
+
* @param actor Current effective actor and tenant.
|
|
647
|
+
* @param reader Verified current invocation facts.
|
|
648
|
+
* @param signal Current invocation cancellation, when available.
|
|
649
|
+
* @returns The paired generated application result.
|
|
650
|
+
*/
|
|
651
|
+
queryTyped(query, actor, reader, signal) {
|
|
652
|
+
if (this.#closed !== undefined)
|
|
653
|
+
return Promise.reject(new Error("Server App Query execution is closed."));
|
|
654
|
+
return this.#queries.executeTyped(query, actor, reader, signal);
|
|
655
|
+
}
|
|
641
656
|
/**
|
|
642
657
|
* Closes this listener once, preserving a failed close for retry.
|
|
643
658
|
*
|
|
644
659
|
* @returns Completion after resources close.
|
|
645
660
|
*/
|
|
646
661
|
close() {
|
|
662
|
+
this.#queries.beginClose();
|
|
647
663
|
this.#closed ??= this.#closeOnce().catch((error) => {
|
|
648
664
|
this.#closed = undefined;
|
|
649
665
|
throw error;
|
|
@@ -651,9 +667,9 @@ class RunningHttp2Server {
|
|
|
651
667
|
return this.#closed;
|
|
652
668
|
}
|
|
653
669
|
/**
|
|
654
|
-
* Starts listener
|
|
670
|
+
* Starts listener lifecycles after the native listener accepts connections.
|
|
655
671
|
*
|
|
656
|
-
* @returns Completes after all
|
|
672
|
+
* @returns Completes after all listener lifecycles start or their rollback settles.
|
|
657
673
|
*/
|
|
658
674
|
async startLifecycles() {
|
|
659
675
|
try {
|
|
@@ -681,20 +697,12 @@ class RunningHttp2Server {
|
|
|
681
697
|
return this.#closed === undefined;
|
|
682
698
|
}
|
|
683
699
|
/**
|
|
684
|
-
*
|
|
700
|
+
* Waits for the environment's admitted Delivery work.
|
|
685
701
|
*
|
|
686
|
-
* @returns Completion after
|
|
702
|
+
* @returns Completion after active shard runs settle.
|
|
687
703
|
*/
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
return;
|
|
691
|
-
if (serverEnvironmentAccess.detachRetryPending(this.#environment, this.#attachment)) {
|
|
692
|
-
await serverEnvironmentAccess.retryDetach(this.#environment, this.#attachment);
|
|
693
|
-
}
|
|
694
|
-
else {
|
|
695
|
-
await serverEnvironmentAccess.detach(this.#environment, this.#attachment);
|
|
696
|
-
}
|
|
697
|
-
this.#attachmentDetached = true;
|
|
704
|
+
drainDelivery() {
|
|
705
|
+
return serverEnvironmentAccess.whenDeliveryIdle(this.#environment);
|
|
698
706
|
}
|
|
699
707
|
/**
|
|
700
708
|
* Closes network, delivery, accepted context work, and registered resources.
|
|
@@ -703,7 +711,6 @@ class RunningHttp2Server {
|
|
|
703
711
|
*/
|
|
704
712
|
async #closeOnce() {
|
|
705
713
|
await this.#closeListenerAndNetwork();
|
|
706
|
-
const { detachErrors, detachRejected } = await this.#detachDelivery();
|
|
707
714
|
const errors = [];
|
|
708
715
|
try {
|
|
709
716
|
await this.#drainContexts();
|
|
@@ -718,14 +725,6 @@ class RunningHttp2Server {
|
|
|
718
725
|
catch (error) {
|
|
719
726
|
errors.push(error);
|
|
720
727
|
}
|
|
721
|
-
if (detachRejected) {
|
|
722
|
-
if (errors.length === 0)
|
|
723
|
-
ServerValues.throwRunningDetachErrors(detachErrors);
|
|
724
|
-
const combined = [...detachErrors];
|
|
725
|
-
for (const error of errors)
|
|
726
|
-
CloseErrors.collect(error, combined);
|
|
727
|
-
throw new AggregateError(combined, "Server close failed while draining contexts and resources.");
|
|
728
|
-
}
|
|
729
728
|
if (errors.length > 1)
|
|
730
729
|
throw new AggregateError(errors, "Server close failed while draining contexts and resources.");
|
|
731
730
|
if (errors.length === 1)
|
|
@@ -733,7 +732,7 @@ class RunningHttp2Server {
|
|
|
733
732
|
spineServicesAccess.clearLogger(this.#services);
|
|
734
733
|
}
|
|
735
734
|
/**
|
|
736
|
-
* Closes lifecycle
|
|
735
|
+
* Closes lifecycle callbacks and network intake before context cleanup.
|
|
737
736
|
*
|
|
738
737
|
* @returns Completion after the listener and sessions close.
|
|
739
738
|
*/
|
|
@@ -750,53 +749,20 @@ class RunningHttp2Server {
|
|
|
750
749
|
this.#networkClosed = true;
|
|
751
750
|
}
|
|
752
751
|
}
|
|
753
|
-
/**
|
|
754
|
-
* Completes Delivery detachment while retaining errors for safe endpoint cleanup.
|
|
755
|
-
*
|
|
756
|
-
* @returns Detachment errors and whether detachment itself was rejected.
|
|
757
|
-
*/
|
|
758
|
-
async #detachDelivery() {
|
|
759
|
-
const detachErrors = [];
|
|
760
|
-
let detachRejected = false;
|
|
761
|
-
if (!this.#attachmentDetached) {
|
|
762
|
-
try {
|
|
763
|
-
if (serverEnvironmentAccess.detachRetryPending(this.#environment, this.#attachment)) {
|
|
764
|
-
await serverEnvironmentAccess.retryDetach(this.#environment, this.#attachment);
|
|
765
|
-
}
|
|
766
|
-
else {
|
|
767
|
-
await serverEnvironmentAccess.detach(this.#environment, this.#attachment);
|
|
768
|
-
}
|
|
769
|
-
this.#attachmentDetached = true;
|
|
770
|
-
}
|
|
771
|
-
catch (error) {
|
|
772
|
-
detachRejected = true;
|
|
773
|
-
CloseErrors.collect(error, detachErrors);
|
|
774
|
-
}
|
|
775
|
-
if (detachRejected) {
|
|
776
|
-
let endpointSafe = false;
|
|
777
|
-
try {
|
|
778
|
-
endpointSafe = serverEnvironmentAccess.endpointSafe(this.#environment, this.#attachment);
|
|
779
|
-
}
|
|
780
|
-
catch (error) {
|
|
781
|
-
CloseErrors.collect(error, detachErrors);
|
|
782
|
-
}
|
|
783
|
-
if (!endpointSafe) {
|
|
784
|
-
ServerValues.throwRunningDetachErrors(detachErrors);
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
return { detachErrors, detachRejected };
|
|
789
|
-
}
|
|
790
752
|
/**
|
|
791
753
|
* Waits for every context's accepted work before any Stand closes.
|
|
792
754
|
*
|
|
793
755
|
* @returns Completion after all context work drains.
|
|
794
756
|
*/
|
|
795
757
|
async #drainContexts() {
|
|
758
|
+
await this.#queries.drain();
|
|
796
759
|
for (const context of this.#contexts)
|
|
797
760
|
boundedContextAccess.beginClose(context);
|
|
798
761
|
const drained = await Promise.allSettled(this.#contexts.map((context) => boundedContextAccess.drainWork(context)));
|
|
799
|
-
const
|
|
762
|
+
const delivery = await Promise.allSettled([
|
|
763
|
+
serverEnvironmentAccess.whenDeliveryIdle(this.#environment),
|
|
764
|
+
]);
|
|
765
|
+
const drainErrors = [...drained, ...delivery].flatMap((result) => result.status === "rejected" ? [result.reason] : []);
|
|
800
766
|
if (drainErrors.length > 0) {
|
|
801
767
|
throw new AggregateError(drainErrors, "Server close failed while draining contexts.");
|
|
802
768
|
}
|
|
@@ -859,17 +825,17 @@ const ServerValues = Object.freeze({
|
|
|
859
825
|
});
|
|
860
826
|
},
|
|
861
827
|
/**
|
|
862
|
-
* Collects
|
|
828
|
+
* Collects route registration and immediate cleanup failures for startup reporting.
|
|
863
829
|
*
|
|
864
|
-
* @param startError
|
|
830
|
+
* @param startError Route or duplicate registration failure.
|
|
865
831
|
* @param cleanupError Failure while closing prepared resources.
|
|
866
832
|
* @returns Both failures in one AggregateError.
|
|
867
833
|
*/
|
|
868
|
-
|
|
834
|
+
registrationCleanupError(startError, cleanupError) {
|
|
869
835
|
const errors = [];
|
|
870
836
|
CloseErrors.collect(startError, errors);
|
|
871
837
|
CloseErrors.collect(cleanupError, errors);
|
|
872
|
-
return new AggregateError(errors, "Server
|
|
838
|
+
return new AggregateError(errors, "Server registration failed and immediate dependency cleanup also failed.");
|
|
873
839
|
},
|
|
874
840
|
/**
|
|
875
841
|
* Throws one deferred cleanup failure or groups several.
|
|
@@ -901,18 +867,6 @@ const ServerValues = Object.freeze({
|
|
|
901
867
|
}
|
|
902
868
|
throw new AggregateError(errors, "Server start failed while opening listener and cleanup also failed.");
|
|
903
869
|
},
|
|
904
|
-
/**
|
|
905
|
-
* Throws one delivery-detachment error or groups several.
|
|
906
|
-
*
|
|
907
|
-
* @param errors Delivery-detachment failures.
|
|
908
|
-
* @returns Never; this method throws.
|
|
909
|
-
*/
|
|
910
|
-
throwRunningDetachErrors(errors) {
|
|
911
|
-
if (errors.length === 1) {
|
|
912
|
-
throw errors[0];
|
|
913
|
-
}
|
|
914
|
-
throw new AggregateError(errors, "Server close failed while detaching delivery.");
|
|
915
|
-
},
|
|
916
870
|
/**
|
|
917
871
|
* Closes the HTTP/2 server and all tracked sessions.
|
|
918
872
|
*
|