@zlink-systems/framework 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +16 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +28 -0
- package/dist/runtime/activation-admission.js +57 -0
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +19 -17
- package/dist/runtime/actors/actor-handoff.d.ts +13 -7
- package/dist/runtime/actors/actor-handoff.js +36 -25
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +85 -123
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
- package/dist/runtime/actors/actor-remote-joiner.js +11 -17
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
- package/dist/runtime/actors/deferred-join-completion.js +21 -0
- package/dist/runtime/actors/index.d.ts +10 -8
- package/dist/runtime/actors/index.js +101 -73
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +7 -1
- package/dist/runtime/admission.js +11 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +8 -33
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
- package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
- package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -9
- package/dist/runtime/channels/channel-clients.js +68 -60
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -18
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
- package/dist/runtime/channels/channel-runtime-manager.js +4 -12
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
- package/dist/runtime/channels/channel-socket-registry.js +296 -235
- package/dist/runtime/channels/channel-transports.d.ts +11 -20
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +133 -81
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +22 -9
- package/dist/runtime/execution/index.js +107 -37
- package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
- package/dist/runtime/execution/serial-execution-queue.js +99 -26
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/listener-records.d.ts +11 -0
- package/dist/runtime/foundation/listener-records.js +20 -0
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
- package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
- package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
- package/dist/runtime/foundation/service-topology-registry.js +22 -61
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
- package/dist/runtime/host/actor-transfer-runtime.js +210 -256
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +19 -14
- package/dist/runtime/host/index.js +234 -175
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +11 -23
- package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
- package/dist/runtime/host/route-mesh-runtime.js +178 -257
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
- package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
- package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
- package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
- package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +5 -10
- package/dist/runtime/locations/lifecycle.js +4 -33
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +44 -30
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
- package/dist/runtime/locations/spot-location-claims.js +40 -23
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
- package/dist/runtime/spots/index.d.ts +29 -29
- package/dist/runtime/spots/index.js +441 -313
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
- package/dist/runtime/spots/spot-activation-registry.js +27 -60
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
- package/dist/runtime/spots/spot-activation-state.js +4 -17
- package/dist/runtime/spots/spot-activation.d.ts +10 -9
- package/dist/runtime/spots/spot-activation.js +103 -81
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
- package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
- package/dist/runtime/spots/spot-actor-membership.js +44 -53
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-entry-activation.js +9 -21
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +6 -5
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
- package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +10 -37
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
- package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
- package/dist/runtime/spots/spot-serial-executor.js +9 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
- package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
- package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +12 -19
- package/dist/runtime/streams/index.d.ts +15 -14
- package/dist/runtime/streams/index.js +38 -39
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/session-serial-executor.js +2 -2
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +15 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +72 -0
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +45 -39
- package/src/runtime/actors/actor-handoff.ts +55 -45
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +174 -215
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +15 -36
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/actor-source-transfer.ts +5 -18
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +44 -0
- package/src/runtime/actors/index.ts +122 -88
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +13 -2
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +15 -42
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
- package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
- package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
- package/src/runtime/backend/raw-binding-port.ts +14 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -31
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +8 -15
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +369 -262
- package/src/runtime/channels/channel-transports.ts +161 -115
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +175 -106
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +116 -38
- package/src/runtime/execution/serial-execution-queue.ts +179 -34
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/listener-records.ts +21 -0
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
- package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
- package/src/runtime/foundation/service-topology-registry.ts +30 -79
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +266 -418
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +408 -312
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +12 -44
- package/src/runtime/host/route-mesh-runtime.ts +236 -275
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
- package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
- package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +16 -45
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +90 -58
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +54 -26
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
- package/src/runtime/spots/index.ts +687 -437
- package/src/runtime/spots/spot-activation-registry.ts +42 -71
- package/src/runtime/spots/spot-activation-state.ts +4 -16
- package/src/runtime/spots/spot-activation.ts +167 -115
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
- package/src/runtime/spots/spot-actor-membership.ts +107 -75
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -33
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +29 -21
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
- package/src/runtime/spots/spot-outbound.ts +47 -68
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +10 -43
- package/src/runtime/spots/spot-serial-executor.ts +10 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +23 -37
- package/src/runtime/streams/index.ts +102 -88
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/session-serial-executor.ts +2 -2
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
- package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,27 +1,46 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
createInternalFrameworkException
|
|
4
|
-
} from '../framework-errors-internal';
|
|
5
|
-
import type { RoutingId } from '../../contracts';
|
|
6
|
-
import {
|
|
2
|
+
type RoutingId,
|
|
7
3
|
ZLinkFrameworkException,
|
|
8
4
|
ZLinkFrameworkRuntimeState,
|
|
9
|
-
|
|
10
|
-
ZLinkTopologyReason,
|
|
5
|
+
ZLinkObjectRole,
|
|
11
6
|
ZLinkPeerState,
|
|
7
|
+
ZLinkTopologyReason,
|
|
8
|
+
ZLinkTopologyState,
|
|
9
|
+
type ZLinkMeshNodeDescriptor,
|
|
12
10
|
type ZLinkObservedStatus,
|
|
13
|
-
type
|
|
14
|
-
type
|
|
11
|
+
type ZLinkRouteMeshRuntime,
|
|
12
|
+
type ZLinkRouteMeshStatus
|
|
15
13
|
} from '../../contracts';
|
|
14
|
+
|
|
15
|
+
import { ZLINK_DEFAULT_PUBLIC_WEIGHT } from '../../contracts/Configuration/RegistrationBuilderPolicy';
|
|
16
|
+
import { createDeadlineExceededError } from '../abort';
|
|
17
|
+
import type { ZLinkActivationAdmission } from '../activation-admission';
|
|
18
|
+
import type { ZLinkRuntimeAdmissionGate } from '../admission';
|
|
19
|
+
import type { ZLinkBackendMeshNode } from '../backend';
|
|
20
|
+
import type { ZLinkSpotNodeOptions } from '../configuration';
|
|
21
|
+
import { isRelocationDebugEnabled } from '../diagnostics';
|
|
16
22
|
import {
|
|
17
23
|
RuntimeEventQueue,
|
|
18
24
|
ZLINK_DEFAULT_TERMINAL_OBSERVATION_CAPACITY
|
|
19
25
|
} from '../diagnostics/runtime-observation-queue';
|
|
20
|
-
import {
|
|
26
|
+
import { debugPendingWorkNames, isStructuralGuardEnabled } from '../execution/state-lane';
|
|
21
27
|
import {
|
|
22
28
|
runtimeStateIsReady,
|
|
29
|
+
topologyObservationIsTerminal,
|
|
23
30
|
topologyRuntimeIsReady
|
|
24
31
|
} from '../foundation/runtime-state-projections';
|
|
32
|
+
import {
|
|
33
|
+
MeshNodeRuntimeState,
|
|
34
|
+
MeshPeerRuntimeState
|
|
35
|
+
} from '../foundation/service-runtime-contracts';
|
|
36
|
+
import {
|
|
37
|
+
ZLinkFrameworkInternalErrorKind,
|
|
38
|
+
createInternalFrameworkException
|
|
39
|
+
} from '../framework-errors-internal';
|
|
40
|
+
import { ZLinkOwnerCleanupError } from '../locations/runtime';
|
|
41
|
+
const DEFAULT_ROUTE_MESH_DRAIN_TIMEOUT_MS = 30_000;
|
|
42
|
+
const MAX_ROUTE_MESH_OBSERVATION_WAIT_MS = 1000;
|
|
43
|
+
const PLACEMENT_OBSERVATION_INTERVAL_MS = 100;
|
|
25
44
|
|
|
26
45
|
type ZLinkDrainForceReason =
|
|
27
46
|
'deadline_exceeded' | 'drain_state_publish_failed' | 'owner_cleanup_failed' | 'teardown_failed';
|
|
@@ -33,10 +52,6 @@ type ZLinkMeshDrainResult =
|
|
|
33
52
|
readonly reason: ZLinkDrainForceReason;
|
|
34
53
|
readonly error?: unknown;
|
|
35
54
|
};
|
|
36
|
-
import type { ZLinkBackendMeshNode } from '../backend';
|
|
37
|
-
import type { ZLinkRuntimeAdmissionGate } from '../admission';
|
|
38
|
-
import type { ZLinkSpotNodeOptions } from '../configuration';
|
|
39
|
-
import { ZLinkObjectRole, type ZLinkMeshNodeDescriptor } from '../../contracts';
|
|
40
55
|
|
|
41
56
|
export interface ZLinkRouteMeshRuntimeCoordinatorOptions {
|
|
42
57
|
readonly meshNames: readonly string[];
|
|
@@ -47,6 +62,7 @@ export interface ZLinkRouteMeshRuntimeCoordinatorOptions {
|
|
|
47
62
|
readonly isLocationStoreHealthy?: () => boolean;
|
|
48
63
|
readonly hostState?: () => ZLinkFrameworkRuntimeState;
|
|
49
64
|
readonly admission: ZLinkRuntimeAdmissionGate;
|
|
65
|
+
readonly activationAdmission?: ZLinkActivationAdmission;
|
|
50
66
|
readonly publishRetiring: (meshName: string, signal: AbortSignal) => Promise<void>;
|
|
51
67
|
readonly rollbackRetiring: (meshName: string, signal: AbortSignal) => Promise<void>;
|
|
52
68
|
readonly publishDraining: (meshName: string, signal: AbortSignal) => Promise<void>;
|
|
@@ -68,7 +84,6 @@ export interface ZLinkLocalPlacementCounts {
|
|
|
68
84
|
|
|
69
85
|
interface ZLinkMeshDrainState {
|
|
70
86
|
state: ZLinkTopologyState;
|
|
71
|
-
sequence: bigint;
|
|
72
87
|
deadline?: Date;
|
|
73
88
|
operation?: Promise<ZLinkMeshDrainResult>;
|
|
74
89
|
result?: ZLinkMeshDrainResult;
|
|
@@ -79,9 +94,6 @@ interface ZLinkMeshDrainState {
|
|
|
79
94
|
|
|
80
95
|
export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
81
96
|
private readonly states = new Map<string, ZLinkMeshDrainState>();
|
|
82
|
-
private readonly placementFingerprints = new Map<string, string>();
|
|
83
|
-
private readonly peerFingerprints = new Map<string, Map<string, string>>();
|
|
84
|
-
private readonly locationStoreHealthFingerprints = new Map<string, boolean>();
|
|
85
97
|
private placementObserver?: ReturnType<typeof setInterval>;
|
|
86
98
|
private hostOperation?: Promise<ZLinkMeshDrainResult>;
|
|
87
99
|
private shutdownOperation?: Promise<ZLinkMeshDrainResult>;
|
|
@@ -92,7 +104,6 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
92
104
|
options.admission.register(meshName);
|
|
93
105
|
this.states.set(meshName, {
|
|
94
106
|
state: ZLinkTopologyState.Starting,
|
|
95
|
-
sequence: 0n,
|
|
96
107
|
waiters: [],
|
|
97
108
|
observers: new Set()
|
|
98
109
|
});
|
|
@@ -107,24 +118,32 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
107
118
|
}
|
|
108
119
|
|
|
109
120
|
snapshot(meshName: string): ZLinkRouteMeshStatus {
|
|
121
|
+
const published = this.publishCurrentStatus(meshName, this.requireState(meshName));
|
|
122
|
+
if (published === undefined) throw routeNotFound(meshName);
|
|
123
|
+
return published;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private buildSnapshot(meshName: string, sequence: bigint): ZLinkRouteMeshStatus {
|
|
110
127
|
const drain = this.requireState(meshName);
|
|
111
128
|
const node = this.options.meshNode(meshName);
|
|
112
129
|
if (node === undefined) throw routeNotFound(meshName);
|
|
113
130
|
const status = node.status();
|
|
114
131
|
const descriptor = this.options.meshNodeDescriptor?.(meshName);
|
|
115
132
|
const localPlacementCounts = this.options.localPlacementCounts?.(meshName);
|
|
133
|
+
// Active counts come only from this MeshNode's activation records (runtime monitoring §5);
|
|
134
|
+
// before the object managers exist nothing is active on it.
|
|
116
135
|
const populationCapacity =
|
|
117
|
-
descriptor === undefined
|
|
118
|
-
?
|
|
136
|
+
descriptor === undefined
|
|
137
|
+
? undefined
|
|
119
138
|
: {
|
|
120
139
|
...descriptor.populationCapacity,
|
|
121
140
|
actors: {
|
|
122
141
|
...descriptor.populationCapacity.actors,
|
|
123
|
-
active: localPlacementCounts
|
|
142
|
+
active: localPlacementCounts?.activeActorCount ?? 0
|
|
124
143
|
},
|
|
125
144
|
spots: {
|
|
126
145
|
...descriptor.populationCapacity.spots,
|
|
127
|
-
active: localPlacementCounts
|
|
146
|
+
active: localPlacementCounts?.activeSpotCount ?? 0
|
|
128
147
|
}
|
|
129
148
|
};
|
|
130
149
|
const backendPeers = node.peers();
|
|
@@ -153,7 +172,8 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
153
172
|
)
|
|
154
173
|
).length
|
|
155
174
|
);
|
|
156
|
-
const localWeight =
|
|
175
|
+
const localWeight =
|
|
176
|
+
descriptor?.channelWeights[channelName] ?? channel.weight ?? ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
157
177
|
const readyTargetCount =
|
|
158
178
|
Number(readyMemberCount) + (channel.server === true && localWeight > 0 ? 1 : 0);
|
|
159
179
|
return { channelName, isReady: readyTargetCount > 0, readyTargetCount };
|
|
@@ -180,7 +200,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
180
200
|
const capacityAvailable =
|
|
181
201
|
descriptor !== undefined &&
|
|
182
202
|
populationCapacity !== undefined &&
|
|
183
|
-
|
|
203
|
+
(this.options.activationAdmission?.hasHeadroom(meshName) ?? true) &&
|
|
184
204
|
(hasRemainingCapacity(populationCapacity.actors) ||
|
|
185
205
|
hasRemainingCapacity(populationCapacity.spots));
|
|
186
206
|
const placementAvailable =
|
|
@@ -201,20 +221,15 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
201
221
|
isAvailable: placementAvailable,
|
|
202
222
|
activeActorCount: populationCapacity?.actors.active ?? 0,
|
|
203
223
|
activeSpotCount: populationCapacity?.spots.active ?? 0,
|
|
204
|
-
unavailableReason:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
? ZLinkTopologyReason.LocationUnavailable
|
|
210
|
-
: placementWeight <= 0
|
|
211
|
-
? ZLinkTopologyReason.NoReadyTarget
|
|
212
|
-
: ZLinkTopologyReason.CapacityExceeded
|
|
224
|
+
unavailableReason: placementUnavailableReason(
|
|
225
|
+
placementAvailable,
|
|
226
|
+
hostState,
|
|
227
|
+
locationStoreHealthy
|
|
228
|
+
)
|
|
213
229
|
},
|
|
214
|
-
sequence
|
|
230
|
+
sequence,
|
|
215
231
|
observedAt: new Date()
|
|
216
232
|
};
|
|
217
|
-
drain.lastSnapshot = snapshot;
|
|
218
233
|
return snapshot;
|
|
219
234
|
}
|
|
220
235
|
|
|
@@ -226,15 +241,15 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
226
241
|
const state = this.requireState(meshName);
|
|
227
242
|
if (!Number.isInteger(capacity) || capacity <= 0)
|
|
228
243
|
throw new RangeError('Observer capacity must be positive.');
|
|
229
|
-
|
|
244
|
+
const snapshot = this.snapshot(meshName);
|
|
230
245
|
const queue = new RuntimeEventQueue<ZLinkRouteMeshStatus>(capacity, signal);
|
|
246
|
+
state.observers.add(queue);
|
|
247
|
+
this.startPlacementObserver();
|
|
231
248
|
queue.onClose(() => {
|
|
232
249
|
state.observers.delete(queue);
|
|
233
250
|
this.stopPlacementObserverIfIdle();
|
|
234
251
|
});
|
|
235
|
-
this.
|
|
236
|
-
state.observers.add(queue);
|
|
237
|
-
this.startPlacementObserver();
|
|
252
|
+
this.publishStatus(meshName, queue, snapshot);
|
|
238
253
|
return queue;
|
|
239
254
|
}
|
|
240
255
|
|
|
@@ -243,78 +258,29 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
243
258
|
}
|
|
244
259
|
|
|
245
260
|
hostStateChanged(): void {
|
|
246
|
-
for (const [meshName, state] of this.states)
|
|
247
|
-
state.sequence += 1n;
|
|
248
|
-
let snapshot: ZLinkRouteMeshStatus;
|
|
249
|
-
try {
|
|
250
|
-
snapshot = this.snapshot(meshName);
|
|
251
|
-
} catch {
|
|
252
|
-
continue;
|
|
253
|
-
}
|
|
254
|
-
for (const observer of state.observers) observer.push(snapshot, meshName);
|
|
255
|
-
}
|
|
261
|
+
for (const [meshName, state] of this.states) this.publishCurrentStatus(meshName, state);
|
|
256
262
|
}
|
|
257
263
|
|
|
258
264
|
stopObservers(): void {
|
|
259
265
|
for (const [meshName, state] of this.states) {
|
|
260
|
-
state.
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
const
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
channels: current.channels.map((channel) => ({
|
|
272
|
-
...channel,
|
|
273
|
-
isReady: false
|
|
274
|
-
})),
|
|
275
|
-
placement: {
|
|
276
|
-
...current.placement,
|
|
277
|
-
isAvailable: false,
|
|
278
|
-
unavailableReason: ZLinkTopologyReason.RuntimeNotReady
|
|
279
|
-
},
|
|
280
|
-
sequence: terminalSequence,
|
|
281
|
-
observedAt: new Date()
|
|
282
|
-
};
|
|
283
|
-
} catch {
|
|
284
|
-
const current = state.lastSnapshot;
|
|
285
|
-
if (current !== undefined) {
|
|
286
|
-
const terminalSequence =
|
|
287
|
-
current.sequence >= state.sequence ? current.sequence + 1n : state.sequence;
|
|
288
|
-
state.sequence = terminalSequence;
|
|
289
|
-
terminal = {
|
|
290
|
-
...current,
|
|
291
|
-
state: ZLinkTopologyState.Stopped,
|
|
292
|
-
isReady: false,
|
|
293
|
-
channels: current.channels.map((channel) => ({
|
|
294
|
-
...channel,
|
|
295
|
-
isReady: false
|
|
296
|
-
})),
|
|
297
|
-
placement: {
|
|
298
|
-
...current.placement,
|
|
299
|
-
isAvailable: false,
|
|
300
|
-
unavailableReason: ZLinkTopologyReason.RuntimeNotReady
|
|
301
|
-
},
|
|
302
|
-
sequence: terminalSequence,
|
|
303
|
-
observedAt: new Date()
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
for (const observer of [...state.observers]) {
|
|
308
|
-
if (terminal === undefined) observer.close();
|
|
309
|
-
else observer.seal(terminal, meshName);
|
|
266
|
+
const published = state.lastSnapshot;
|
|
267
|
+
if (published !== undefined && topologyObservationIsTerminal(published.state)) continue;
|
|
268
|
+
const current = published ?? this.publishCurrentStatus(meshName, state);
|
|
269
|
+
if (current === undefined) {
|
|
270
|
+
for (const observer of [...state.observers]) observer.close();
|
|
271
|
+
} else {
|
|
272
|
+
this.publishSnapshot(
|
|
273
|
+
meshName,
|
|
274
|
+
state,
|
|
275
|
+
terminalSnapshot(current, ZLinkTopologyState.Stopped)
|
|
276
|
+
);
|
|
310
277
|
}
|
|
311
|
-
state.observers.clear();
|
|
312
278
|
}
|
|
313
279
|
}
|
|
314
280
|
|
|
315
281
|
drain(
|
|
316
282
|
meshName: string,
|
|
317
|
-
deadlineMs =
|
|
283
|
+
deadlineMs: number = DEFAULT_ROUTE_MESH_DRAIN_TIMEOUT_MS,
|
|
318
284
|
signal?: AbortSignal
|
|
319
285
|
): Promise<ZLinkMeshDrainResult> {
|
|
320
286
|
const state = this.requireState(meshName);
|
|
@@ -335,7 +301,10 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
335
301
|
return waitForOperation(operation, signal);
|
|
336
302
|
}
|
|
337
303
|
|
|
338
|
-
drainHost(
|
|
304
|
+
drainHost(
|
|
305
|
+
deadlineMs: number = DEFAULT_ROUTE_MESH_DRAIN_TIMEOUT_MS,
|
|
306
|
+
signal?: AbortSignal
|
|
307
|
+
): Promise<ZLinkMeshDrainResult> {
|
|
339
308
|
if (!Number.isFinite(deadlineMs) || deadlineMs <= 0) {
|
|
340
309
|
return Promise.reject(new TypeError('Drain deadlineMs must be greater than zero.'));
|
|
341
310
|
}
|
|
@@ -348,16 +317,12 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
348
317
|
return waitForOperation(this.hostOperation, signal);
|
|
349
318
|
}
|
|
350
319
|
|
|
351
|
-
shutdownHost(
|
|
352
|
-
deadline: number | Date = 30_000,
|
|
353
|
-
signal?: AbortSignal,
|
|
354
|
-
remainingTimeoutMs?: number
|
|
355
|
-
): Promise<ZLinkMeshDrainResult> {
|
|
320
|
+
shutdownHost(deadline: number | Date, signal: AbortSignal): Promise<ZLinkMeshDrainResult> {
|
|
356
321
|
if (typeof deadline === 'number' && (!Number.isFinite(deadline) || deadline <= 0)) {
|
|
357
322
|
return Promise.reject(new TypeError('Shutdown deadlineMs must be greater than zero.'));
|
|
358
323
|
}
|
|
359
324
|
if (this.shutdownOperation === undefined) {
|
|
360
|
-
const operation = this.performHostShutdown(deadline,
|
|
325
|
+
const operation = this.performHostShutdown(deadline, signal);
|
|
361
326
|
this.shutdownOperation = operation;
|
|
362
327
|
for (const state of this.states.values()) state.operation ??= operation;
|
|
363
328
|
}
|
|
@@ -393,7 +358,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
393
358
|
rollback.abort(
|
|
394
359
|
createDeadlineExceededError('Retire descriptor rollback deadline exceeded.')
|
|
395
360
|
),
|
|
396
|
-
Math.min(deadlineMs,
|
|
361
|
+
Math.min(deadlineMs, MAX_ROUTE_MESH_OBSERVATION_WAIT_MS)
|
|
397
362
|
);
|
|
398
363
|
let rollbackFailed = false;
|
|
399
364
|
for (const meshName of attempted.reverse()) {
|
|
@@ -440,7 +405,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
440
405
|
return { kind: 'drained' };
|
|
441
406
|
} catch (error) {
|
|
442
407
|
const classified = drainFailureReason(error);
|
|
443
|
-
if (
|
|
408
|
+
if (isRelocationDebugEnabled()) {
|
|
444
409
|
console.error('[zlink.runtime.relocation.drain_failed]', classified, error);
|
|
445
410
|
}
|
|
446
411
|
const reason: ZLinkDrainForceReason = deadline.signal.aborted
|
|
@@ -452,7 +417,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
452
417
|
rollback.abort(
|
|
453
418
|
createDeadlineExceededError('Relocation descriptor rollback deadline exceeded.')
|
|
454
419
|
),
|
|
455
|
-
Math.min(Math.max(1, deadlineMs),
|
|
420
|
+
Math.min(Math.max(1, deadlineMs), MAX_ROUTE_MESH_OBSERVATION_WAIT_MS)
|
|
456
421
|
);
|
|
457
422
|
try {
|
|
458
423
|
await Promise.all(
|
|
@@ -581,25 +546,14 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
581
546
|
|
|
582
547
|
private async performHostShutdown(
|
|
583
548
|
cleanupDeadline: Date | number,
|
|
584
|
-
|
|
549
|
+
signal: AbortSignal
|
|
585
550
|
): Promise<ZLinkMeshDrainResult> {
|
|
586
|
-
const timeoutMs = Math.max(
|
|
587
|
-
0,
|
|
588
|
-
remainingTimeoutMs ??
|
|
589
|
-
(cleanupDeadline instanceof Date ? cleanupDeadline.getTime() - Date.now() : cleanupDeadline)
|
|
590
|
-
);
|
|
591
551
|
const deadlineAt =
|
|
592
552
|
cleanupDeadline instanceof Date ? cleanupDeadline : new Date(Date.now() + cleanupDeadline);
|
|
593
553
|
const entries = [...this.states.entries()];
|
|
594
|
-
if (entries.length === 0) return { kind: 'drained' };
|
|
595
554
|
for (const [, state] of entries) {
|
|
596
555
|
state.deadline = deadlineAt;
|
|
597
556
|
}
|
|
598
|
-
const deadline = new AbortController();
|
|
599
|
-
const timer = setTimeout(
|
|
600
|
-
() => deadline.abort(createDeadlineExceededError('Shutdown deadline exceeded.')),
|
|
601
|
-
timeoutMs
|
|
602
|
-
);
|
|
603
557
|
let result: ZLinkMeshDrainResult;
|
|
604
558
|
try {
|
|
605
559
|
for (const [meshName, state] of entries) {
|
|
@@ -607,16 +561,16 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
607
561
|
this.transition(meshName, state, ZLinkTopologyState.Stopping);
|
|
608
562
|
}
|
|
609
563
|
await Promise.all(
|
|
610
|
-
entries.map(([meshName]) => this.options.publishDraining(meshName,
|
|
564
|
+
entries.map(([meshName]) => this.options.publishDraining(meshName, signal))
|
|
611
565
|
);
|
|
612
|
-
await this.options.publishHostDraining(
|
|
566
|
+
await this.options.publishHostDraining(signal);
|
|
613
567
|
await Promise.all(
|
|
614
|
-
entries.map(([meshName]) => this.options.admission.awaitZero(meshName,
|
|
568
|
+
entries.map(([meshName]) => this.options.admission.awaitZero(meshName, signal))
|
|
615
569
|
);
|
|
616
570
|
await Promise.all(
|
|
617
|
-
entries.map(([meshName]) => this.options.shutdownResources?.(meshName,
|
|
571
|
+
entries.map(([meshName]) => this.options.shutdownResources?.(meshName, signal))
|
|
618
572
|
);
|
|
619
|
-
await this.options.cleanupHostResources(
|
|
573
|
+
await this.options.cleanupHostResources(signal);
|
|
620
574
|
result = { kind: 'drained' };
|
|
621
575
|
for (const [meshName, state] of entries) {
|
|
622
576
|
this.transition(meshName, state, ZLinkTopologyState.Stopped);
|
|
@@ -626,7 +580,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
626
580
|
const reason: ZLinkDrainForceReason =
|
|
627
581
|
classified !== 'teardown_failed'
|
|
628
582
|
? classified
|
|
629
|
-
:
|
|
583
|
+
: signal.aborted
|
|
630
584
|
? 'deadline_exceeded'
|
|
631
585
|
: classified;
|
|
632
586
|
await Promise.all(
|
|
@@ -638,8 +592,6 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
638
592
|
for (const [meshName, state] of entries) {
|
|
639
593
|
this.transition(meshName, state, ZLinkTopologyState.Failed);
|
|
640
594
|
}
|
|
641
|
-
} finally {
|
|
642
|
-
clearTimeout(timer);
|
|
643
595
|
}
|
|
644
596
|
for (const [, state] of entries) {
|
|
645
597
|
state.result = result;
|
|
@@ -652,113 +604,83 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
652
604
|
private transition(meshName: string, state: ZLinkMeshDrainState, next: ZLinkTopologyState): void {
|
|
653
605
|
if (state.state === next) return;
|
|
654
606
|
state.state = next;
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
try {
|
|
659
|
-
current = this.snapshot(meshName);
|
|
660
|
-
snapshotAvailable = true;
|
|
661
|
-
} catch {
|
|
662
|
-
current = state.lastSnapshot;
|
|
663
|
-
}
|
|
664
|
-
const terminal = next === ZLinkTopologyState.Stopped || next === ZLinkTopologyState.Failed;
|
|
665
|
-
if (current !== undefined) {
|
|
666
|
-
if (terminal) {
|
|
667
|
-
const terminalSequence =
|
|
668
|
-
current.sequence >= state.sequence ? current.sequence + 1n : state.sequence;
|
|
669
|
-
state.sequence = terminalSequence;
|
|
670
|
-
const terminalStatus = {
|
|
671
|
-
...current,
|
|
672
|
-
state: next,
|
|
673
|
-
isReady: false,
|
|
674
|
-
channels: current.channels.map((channel) => ({
|
|
675
|
-
...channel,
|
|
676
|
-
isReady: false
|
|
677
|
-
})),
|
|
678
|
-
placement: {
|
|
679
|
-
...current.placement,
|
|
680
|
-
isAvailable: false,
|
|
681
|
-
unavailableReason: ZLinkTopologyReason.RuntimeNotReady
|
|
682
|
-
},
|
|
683
|
-
sequence: terminalSequence,
|
|
684
|
-
observedAt: new Date()
|
|
685
|
-
};
|
|
686
|
-
for (const observer of state.observers) observer.seal(terminalStatus, meshName);
|
|
687
|
-
} else if (snapshotAvailable) {
|
|
688
|
-
for (const observer of state.observers) observer.push(current, meshName);
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
if (terminal) {
|
|
692
|
-
if (current === undefined) {
|
|
693
|
-
for (const observer of state.observers) observer.close();
|
|
694
|
-
}
|
|
695
|
-
state.observers.clear();
|
|
696
|
-
this.stopPlacementObserverIfIdle();
|
|
607
|
+
const published = this.publishCurrentStatus(meshName, state);
|
|
608
|
+
if (topologyObservationIsTerminal(next) && published === undefined) {
|
|
609
|
+
for (const observer of [...state.observers]) observer.close();
|
|
697
610
|
}
|
|
698
611
|
}
|
|
699
612
|
|
|
700
|
-
private
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
613
|
+
private publishCurrentStatus(
|
|
614
|
+
meshName: string,
|
|
615
|
+
state: ZLinkMeshDrainState
|
|
616
|
+
): ZLinkRouteMeshStatus | undefined {
|
|
617
|
+
const published = state.lastSnapshot;
|
|
618
|
+
if (published !== undefined && topologyObservationIsTerminal(published.state)) return published;
|
|
619
|
+
const desired = topologyObservationIsTerminal(state.state)
|
|
620
|
+
? state.state
|
|
621
|
+
: topologyStateForHost(
|
|
622
|
+
this.options.hostState?.() ?? ZLinkFrameworkRuntimeState.Serving,
|
|
623
|
+
state.state
|
|
624
|
+
);
|
|
625
|
+
if (published !== undefined && topologyObservationIsTerminal(desired)) {
|
|
626
|
+
return this.publishSnapshot(meshName, state, terminalSnapshot(published, desired));
|
|
708
627
|
}
|
|
709
|
-
this.
|
|
628
|
+
if (this.options.meshNode(meshName) === undefined) return undefined;
|
|
629
|
+
const current = this.buildSnapshot(meshName, published?.sequence ?? 0n);
|
|
630
|
+
return this.publishSnapshot(
|
|
710
631
|
meshName,
|
|
711
|
-
|
|
632
|
+
state,
|
|
633
|
+
topologyObservationIsTerminal(current.state)
|
|
634
|
+
? terminalSnapshot(current, current.state)
|
|
635
|
+
: current
|
|
712
636
|
);
|
|
713
637
|
}
|
|
714
638
|
|
|
639
|
+
private publishSnapshot(
|
|
640
|
+
meshName: string,
|
|
641
|
+
state: ZLinkMeshDrainState,
|
|
642
|
+
current: ZLinkRouteMeshStatus
|
|
643
|
+
): ZLinkRouteMeshStatus {
|
|
644
|
+
const published = state.lastSnapshot;
|
|
645
|
+
if (published !== undefined && samePublicRouteMeshStatus(published, current)) return published;
|
|
646
|
+
const next = { ...current, sequence: (published?.sequence ?? 0n) + 1n, observedAt: new Date() };
|
|
647
|
+
state.lastSnapshot = next;
|
|
648
|
+
for (const observer of [...state.observers]) this.publishStatus(meshName, observer, next);
|
|
649
|
+
return next;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
private publishStatus(
|
|
653
|
+
meshName: string,
|
|
654
|
+
observer: RuntimeEventQueue<ZLinkRouteMeshStatus>,
|
|
655
|
+
status: ZLinkRouteMeshStatus
|
|
656
|
+
): void {
|
|
657
|
+
if (topologyObservationIsTerminal(status.state)) {
|
|
658
|
+
observer.seal(status, meshName);
|
|
659
|
+
} else {
|
|
660
|
+
observer.push(status, meshName);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
715
664
|
private startPlacementObserver(): void {
|
|
716
665
|
if (this.placementObserver !== undefined) return;
|
|
717
|
-
this.placementObserver = setInterval(
|
|
666
|
+
this.placementObserver = setInterval(
|
|
667
|
+
() => this.observePlacementChanges(),
|
|
668
|
+
PLACEMENT_OBSERVATION_INTERVAL_MS
|
|
669
|
+
);
|
|
718
670
|
this.placementObserver.unref();
|
|
719
671
|
}
|
|
720
672
|
|
|
721
673
|
private stopPlacementObserverIfIdle(): void {
|
|
722
|
-
|
|
674
|
+
for (const state of this.states.values()) {
|
|
675
|
+
if (state.observers.size > 0) return;
|
|
676
|
+
}
|
|
723
677
|
if (this.placementObserver !== undefined) clearInterval(this.placementObserver);
|
|
724
678
|
this.placementObserver = undefined;
|
|
725
679
|
}
|
|
726
680
|
|
|
727
681
|
private observePlacementChanges(): void {
|
|
728
682
|
for (const [meshName, state] of this.states) {
|
|
729
|
-
|
|
730
|
-
const locationStoreHealthy = this.options.isLocationStoreHealthy?.() ?? true;
|
|
731
|
-
if (locationStoreHealthy !== this.locationStoreHealthFingerprints.get(meshName)) {
|
|
732
|
-
this.locationStoreHealthFingerprints.set(meshName, locationStoreHealthy);
|
|
733
|
-
state.sequence += 1n;
|
|
734
|
-
for (const observer of state.observers) {
|
|
735
|
-
observer.push(this.snapshot(meshName), meshName);
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
const descriptor = this.options.meshNodeDescriptor?.(meshName);
|
|
739
|
-
if (descriptor === undefined) continue;
|
|
740
|
-
const fingerprint = placementFingerprint(descriptor);
|
|
741
|
-
const previous = this.placementFingerprints.get(meshName);
|
|
742
|
-
this.placementFingerprints.set(meshName, fingerprint);
|
|
743
|
-
const node = this.options.meshNode(meshName);
|
|
744
|
-
if (previous !== undefined && previous !== fingerprint) {
|
|
745
|
-
state.sequence += 1n;
|
|
746
|
-
for (const observer of state.observers) {
|
|
747
|
-
observer.push(this.snapshot(meshName), meshName);
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
const previousPeers = this.peerFingerprints.get(meshName) ?? new Map();
|
|
752
|
-
const peers = node?.peers() ?? [];
|
|
753
|
-
const nextPeers = peerFingerprintMap(peers);
|
|
754
|
-
this.peerFingerprints.set(meshName, nextPeers);
|
|
755
|
-
for (const peerRid of new Set([...previousPeers.keys(), ...nextPeers.keys()])) {
|
|
756
|
-
if (previousPeers.get(peerRid) === nextPeers.get(peerRid)) continue;
|
|
757
|
-
state.sequence += 1n;
|
|
758
|
-
for (const observer of state.observers) {
|
|
759
|
-
observer.push(this.snapshot(meshName), meshName);
|
|
760
|
-
}
|
|
761
|
-
}
|
|
683
|
+
this.publishCurrentStatus(meshName, state);
|
|
762
684
|
}
|
|
763
685
|
}
|
|
764
686
|
|
|
@@ -769,6 +691,77 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
769
691
|
}
|
|
770
692
|
}
|
|
771
693
|
|
|
694
|
+
function terminalSnapshot(
|
|
695
|
+
current: ZLinkRouteMeshStatus,
|
|
696
|
+
state: ZLinkTopologyState
|
|
697
|
+
): ZLinkRouteMeshStatus {
|
|
698
|
+
return {
|
|
699
|
+
...current,
|
|
700
|
+
state,
|
|
701
|
+
isReady: false,
|
|
702
|
+
channels: current.channels.map((channel) => ({ ...channel, isReady: false })),
|
|
703
|
+
placement: {
|
|
704
|
+
...current.placement,
|
|
705
|
+
isAvailable: false,
|
|
706
|
+
unavailableReason: ZLinkTopologyReason.RuntimeNotReady
|
|
707
|
+
}
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
function samePublicRouteMeshStatus(
|
|
712
|
+
left: ZLinkRouteMeshStatus,
|
|
713
|
+
right: ZLinkRouteMeshStatus
|
|
714
|
+
): boolean {
|
|
715
|
+
return (
|
|
716
|
+
left.meshName === right.meshName &&
|
|
717
|
+
left.state === right.state &&
|
|
718
|
+
left.isReady === right.isReady &&
|
|
719
|
+
left.readyPeerCount === right.readyPeerCount &&
|
|
720
|
+
left.placement.isAvailable === right.placement.isAvailable &&
|
|
721
|
+
left.placement.activeActorCount === right.placement.activeActorCount &&
|
|
722
|
+
left.placement.activeSpotCount === right.placement.activeSpotCount &&
|
|
723
|
+
left.placement.unavailableReason === right.placement.unavailableReason &&
|
|
724
|
+
left.channels.length === right.channels.length &&
|
|
725
|
+
left.channels.every((channel, index) => {
|
|
726
|
+
const other = right.channels[index]!;
|
|
727
|
+
return (
|
|
728
|
+
channel.channelName === other.channelName &&
|
|
729
|
+
channel.isReady === other.isReady &&
|
|
730
|
+
channel.readyTargetCount === other.readyTargetCount
|
|
731
|
+
);
|
|
732
|
+
}) &&
|
|
733
|
+
left.peers.length === right.peers.length &&
|
|
734
|
+
left.peers.every((peer, index) => {
|
|
735
|
+
const other = right.peers[index]!;
|
|
736
|
+
return (
|
|
737
|
+
peer.nodeRid === other.nodeRid &&
|
|
738
|
+
peer.state === other.state &&
|
|
739
|
+
peer.unavailableReason === other.unavailableReason
|
|
740
|
+
);
|
|
741
|
+
})
|
|
742
|
+
);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
function placementUnavailableReason(
|
|
746
|
+
available: boolean,
|
|
747
|
+
hostState: ZLinkFrameworkRuntimeState,
|
|
748
|
+
locationStoreHealthy: boolean
|
|
749
|
+
): ZLinkTopologyReason | undefined {
|
|
750
|
+
if (available) return undefined;
|
|
751
|
+
switch (hostState) {
|
|
752
|
+
case ZLinkFrameworkRuntimeState.Relocating:
|
|
753
|
+
case ZLinkFrameworkRuntimeState.Relocated:
|
|
754
|
+
case ZLinkFrameworkRuntimeState.Draining:
|
|
755
|
+
return ZLinkTopologyReason.Draining;
|
|
756
|
+
case ZLinkFrameworkRuntimeState.Serving:
|
|
757
|
+
return !locationStoreHealthy
|
|
758
|
+
? ZLinkTopologyReason.LocationUnavailable
|
|
759
|
+
: ZLinkTopologyReason.CapacityExceeded;
|
|
760
|
+
default:
|
|
761
|
+
return ZLinkTopologyReason.RuntimeNotReady;
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
772
765
|
function topologyStateForHost(
|
|
773
766
|
state: ZLinkFrameworkRuntimeState,
|
|
774
767
|
fallback: ZLinkTopologyState
|
|
@@ -789,30 +782,6 @@ function topologyStateForHost(
|
|
|
789
782
|
}
|
|
790
783
|
}
|
|
791
784
|
|
|
792
|
-
function placementFingerprint(descriptor: ZLinkMeshNodeDescriptor): string {
|
|
793
|
-
const spotTypes = [...descriptor.populationCapacity.spotTypes]
|
|
794
|
-
.sort((left, right) => {
|
|
795
|
-
const kind = left.objectKind.localeCompare(right.objectKind);
|
|
796
|
-
return kind !== 0 ? kind : left.stableType.localeCompare(right.stableType);
|
|
797
|
-
})
|
|
798
|
-
.map((entry) => [
|
|
799
|
-
entry.objectKind,
|
|
800
|
-
entry.stableType,
|
|
801
|
-
entry.active,
|
|
802
|
-
entry.reserved,
|
|
803
|
-
entry.limit
|
|
804
|
-
]);
|
|
805
|
-
return JSON.stringify([
|
|
806
|
-
descriptor.objectRole,
|
|
807
|
-
descriptor.placementWeight,
|
|
808
|
-
descriptor.populationCapacity.actors,
|
|
809
|
-
descriptor.populationCapacity.spots,
|
|
810
|
-
spotTypes,
|
|
811
|
-
descriptor.activationConcurrency,
|
|
812
|
-
Object.entries(descriptor.channelWeights).sort(([left], [right]) => left.localeCompare(right))
|
|
813
|
-
]);
|
|
814
|
-
}
|
|
815
|
-
|
|
816
785
|
function hasRemainingCapacity(capacity: {
|
|
817
786
|
readonly active: number;
|
|
818
787
|
readonly limit: number;
|
|
@@ -821,19 +790,11 @@ function hasRemainingCapacity(capacity: {
|
|
|
821
790
|
return capacity.limit === 0 || capacity.active + (capacity.reserved ?? 0) < capacity.limit;
|
|
822
791
|
}
|
|
823
792
|
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
peer.lifecycleGeneration.toString(),
|
|
830
|
-
peer.descriptorRevision.toString(),
|
|
831
|
-
peer.endpoint,
|
|
832
|
-
peer.state,
|
|
833
|
-
peer.lastError
|
|
834
|
-
])
|
|
835
|
-
])
|
|
836
|
-
);
|
|
793
|
+
export class ZLinkDrainingStatePublishError extends Error {
|
|
794
|
+
constructor(cause: unknown) {
|
|
795
|
+
super('Failed to publish draining peer rows.', { cause });
|
|
796
|
+
this.name = 'ZLinkDrainingStatePublishError';
|
|
797
|
+
}
|
|
837
798
|
}
|
|
838
799
|
|
|
839
800
|
export class ZLinkRetiringRollbackError extends Error {
|
|
@@ -857,33 +818,32 @@ function multiMeshDrainError(): ZLinkFrameworkException {
|
|
|
857
818
|
);
|
|
858
819
|
}
|
|
859
820
|
|
|
860
|
-
function backendState(state:
|
|
821
|
+
function backendState(state: MeshNodeRuntimeState): ZLinkTopologyState {
|
|
861
822
|
switch (state) {
|
|
862
|
-
case
|
|
823
|
+
case MeshNodeRuntimeState.Preparing:
|
|
863
824
|
return ZLinkTopologyState.Starting;
|
|
864
|
-
case
|
|
865
|
-
case 3:
|
|
866
|
-
case 4:
|
|
825
|
+
case MeshNodeRuntimeState.Serving:
|
|
867
826
|
return ZLinkTopologyState.Ready;
|
|
868
|
-
case
|
|
827
|
+
case MeshNodeRuntimeState.Retiring:
|
|
828
|
+
case MeshNodeRuntimeState.Draining:
|
|
869
829
|
return ZLinkTopologyState.Stopping;
|
|
870
|
-
case
|
|
830
|
+
case MeshNodeRuntimeState.Stopped:
|
|
871
831
|
return ZLinkTopologyState.Stopped;
|
|
872
832
|
default:
|
|
873
833
|
return ZLinkTopologyState.Failed;
|
|
874
834
|
}
|
|
875
835
|
}
|
|
876
836
|
|
|
877
|
-
function peerState(state:
|
|
837
|
+
function peerState(state: MeshPeerRuntimeState): ZLinkPeerState {
|
|
878
838
|
switch (state) {
|
|
879
|
-
case
|
|
839
|
+
case MeshPeerRuntimeState.Serving:
|
|
880
840
|
return ZLinkPeerState.Ready;
|
|
881
|
-
case
|
|
841
|
+
case MeshPeerRuntimeState.Draining:
|
|
882
842
|
return ZLinkPeerState.Draining;
|
|
883
|
-
case
|
|
843
|
+
case MeshPeerRuntimeState.NotRequired:
|
|
884
844
|
return ZLinkPeerState.NotRequired;
|
|
885
|
-
case
|
|
886
|
-
case
|
|
845
|
+
case MeshPeerRuntimeState.Connecting:
|
|
846
|
+
case MeshPeerRuntimeState.Preparing:
|
|
887
847
|
return ZLinkPeerState.Connecting;
|
|
888
848
|
default:
|
|
889
849
|
return ZLinkPeerState.NotConnected;
|
|
@@ -903,14 +863,15 @@ function peerUnavailableReason(state: ZLinkPeerState): ZLinkTopologyReason | und
|
|
|
903
863
|
}
|
|
904
864
|
|
|
905
865
|
function drainFailureReason(error: unknown): ZLinkDrainForceReason {
|
|
906
|
-
|
|
907
|
-
|
|
866
|
+
if (isStructuralGuardEnabled()) {
|
|
867
|
+
const pending = debugPendingWorkNames();
|
|
868
|
+
if (pending.length > 0) console.error('[zlink.runtime.drain.pending]', pending);
|
|
869
|
+
}
|
|
870
|
+
if (error instanceof ZLinkDrainingStatePublishError) return 'drain_state_publish_failed';
|
|
908
871
|
if (
|
|
909
|
-
|
|
872
|
+
error instanceof ZLinkOwnerCleanupError ||
|
|
910
873
|
(error instanceof AggregateError &&
|
|
911
|
-
error.errors.some(
|
|
912
|
-
(nested) => nested instanceof Error && nested.name === 'ZLinkOwnerCleanupError'
|
|
913
|
-
))
|
|
874
|
+
error.errors.some((nested) => nested instanceof ZLinkOwnerCleanupError))
|
|
914
875
|
) {
|
|
915
876
|
return 'owner_cleanup_failed';
|
|
916
877
|
}
|