@zlink-systems/framework 0.26.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/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/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +15 -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 +1 -2
- package/dist/runtime/activation-admission.js +2 -6
- 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 +13 -11
- package/dist/runtime/actors/actor-handoff.d.ts +4 -4
- package/dist/runtime/actors/actor-handoff.js +8 -8
- 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 +83 -105
- 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 +1 -1
- package/dist/runtime/actors/actor-remote-joiner.js +5 -9
- 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-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
- package/dist/runtime/actors/deferred-join-completion.js +1 -0
- package/dist/runtime/actors/index.d.ts +9 -7
- package/dist/runtime/actors/index.js +87 -69
- 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 +2 -0
- package/dist/runtime/admission.js +7 -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 +6 -23
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
- 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-support.d.ts +1 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
- package/dist/runtime/backend/raw-binding-port.d.ts +1 -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 -8
- package/dist/runtime/channels/channel-clients.js +68 -52
- 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 -10
- 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.js +5 -2
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +248 -174
- package/dist/runtime/channels/channel-transports.d.ts +11 -17
- 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 +130 -72
- 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 +12 -9
- package/dist/runtime/execution/index.js +58 -14
- package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
- package/dist/runtime/execution/serial-execution-queue.js +54 -15
- 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/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 +8 -5
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
- 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.js +22 -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 +0 -6
- 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-object-owner.js +3 -2
- 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 -12
- 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 +26 -25
- package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
- package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
- package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
- package/dist/runtime/foundation/service-topology-registry.js +17 -32
- 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 +16 -18
- package/dist/runtime/host/actor-transfer-runtime.js +143 -176
- 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 +14 -13
- package/dist/runtime/host/index.js +190 -157
- 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 +7 -20
- package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
- package/dist/runtime/host/route-mesh-runtime.js +171 -252
- 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 +21 -30
- package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
- 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 -10
- package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
- package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
- 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 +72 -22
- 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 +4 -9
- package/dist/runtime/locations/lifecycle.js +2 -31
- 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 +37 -28
- 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 +6 -0
- package/dist/runtime/locations/spot-location-claims.js +42 -1
- 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 +1 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
- package/dist/runtime/spots/index.d.ts +14 -20
- package/dist/runtime/spots/index.js +302 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
- package/dist/runtime/spots/spot-activation-registry.js +14 -50
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +2 -2
- package/dist/runtime/spots/spot-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-activation.js +49 -32
- 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 +4 -52
- package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
- package/dist/runtime/spots/spot-actor-membership.js +22 -45
- 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 +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +9 -20
- 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 +5 -4
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +9 -8
- 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 -3
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
- 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 +2 -16
- package/dist/runtime/spots/spot-serial-executor.js +2 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
- package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
- 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 +11 -1
- package/dist/runtime/streams/index.d.ts +14 -15
- package/dist/runtime/streams/index.js +20 -21
- 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/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/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/Spots/Contracts.ts +1 -1
- package/src/internal.ts +14 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +2 -8
- 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 +39 -33
- package/src/runtime/actors/actor-handoff.ts +24 -22
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +172 -174
- 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 +9 -11
- 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-state.ts +85 -247
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +10 -6
- package/src/runtime/actors/index.ts +100 -79
- 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 +8 -1
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +13 -29
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
- package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
- package/src/runtime/backend/raw-binding-port.ts +1 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -85
- 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 -23
- 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 +6 -2
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +301 -192
- package/src/runtime/channels/channel-transports.ts +161 -112
- 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 +172 -91
- 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 +60 -20
- package/src/runtime/execution/serial-execution-queue.ts +131 -18
- 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/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +31 -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 +0 -10
- 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-object-owner.ts +5 -2
- 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 -17
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
- package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
- package/src/runtime/foundation/service-topology-registry.ts +23 -32
- 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 +180 -260
- 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 +327 -296
- 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 +8 -41
- package/src/runtime/host/route-mesh-runtime.ts +228 -271
- 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 +699 -561
- 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 +73 -22
- package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
- 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 +100 -25
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +13 -43
- 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 +75 -49
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +58 -1
- 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 +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
- package/src/runtime/spots/index.ts +433 -229
- package/src/runtime/spots/spot-activation-registry.ts +30 -69
- package/src/runtime/spots/spot-activation-state.ts +2 -2
- package/src/runtime/spots/spot-activation.ts +67 -37
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
- package/src/runtime/spots/spot-actor-membership.ts +40 -72
- 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 -30
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +21 -17
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
- package/src/runtime/spots/spot-outbound.ts +45 -23
- 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 -26
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +5 -27
- package/src/runtime/spots/spot-serial-executor.ts +2 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +21 -1
- package/src/runtime/streams/index.ts +76 -64
- 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/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/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/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,11 +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 { ZLinkActivationAdmission } from '../activation-admission';
|
|
39
|
-
import type { ZLinkSpotNodeOptions } from '../configuration';
|
|
40
|
-
import { ZLinkObjectRole, type ZLinkMeshNodeDescriptor } from '../../contracts';
|
|
41
55
|
|
|
42
56
|
export interface ZLinkRouteMeshRuntimeCoordinatorOptions {
|
|
43
57
|
readonly meshNames: readonly string[];
|
|
@@ -70,7 +84,6 @@ export interface ZLinkLocalPlacementCounts {
|
|
|
70
84
|
|
|
71
85
|
interface ZLinkMeshDrainState {
|
|
72
86
|
state: ZLinkTopologyState;
|
|
73
|
-
sequence: bigint;
|
|
74
87
|
deadline?: Date;
|
|
75
88
|
operation?: Promise<ZLinkMeshDrainResult>;
|
|
76
89
|
result?: ZLinkMeshDrainResult;
|
|
@@ -81,9 +94,6 @@ interface ZLinkMeshDrainState {
|
|
|
81
94
|
|
|
82
95
|
export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
83
96
|
private readonly states = new Map<string, ZLinkMeshDrainState>();
|
|
84
|
-
private readonly placementFingerprints = new Map<string, string>();
|
|
85
|
-
private readonly peerFingerprints = new Map<string, Map<string, string>>();
|
|
86
|
-
private readonly locationStoreHealthFingerprints = new Map<string, boolean>();
|
|
87
97
|
private placementObserver?: ReturnType<typeof setInterval>;
|
|
88
98
|
private hostOperation?: Promise<ZLinkMeshDrainResult>;
|
|
89
99
|
private shutdownOperation?: Promise<ZLinkMeshDrainResult>;
|
|
@@ -94,7 +104,6 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
94
104
|
options.admission.register(meshName);
|
|
95
105
|
this.states.set(meshName, {
|
|
96
106
|
state: ZLinkTopologyState.Starting,
|
|
97
|
-
sequence: 0n,
|
|
98
107
|
waiters: [],
|
|
99
108
|
observers: new Set()
|
|
100
109
|
});
|
|
@@ -109,6 +118,12 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
109
118
|
}
|
|
110
119
|
|
|
111
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 {
|
|
112
127
|
const drain = this.requireState(meshName);
|
|
113
128
|
const node = this.options.meshNode(meshName);
|
|
114
129
|
if (node === undefined) throw routeNotFound(meshName);
|
|
@@ -157,7 +172,8 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
157
172
|
)
|
|
158
173
|
).length
|
|
159
174
|
);
|
|
160
|
-
const localWeight =
|
|
175
|
+
const localWeight =
|
|
176
|
+
descriptor?.channelWeights[channelName] ?? channel.weight ?? ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
161
177
|
const readyTargetCount =
|
|
162
178
|
Number(readyMemberCount) + (channel.server === true && localWeight > 0 ? 1 : 0);
|
|
163
179
|
return { channelName, isReady: readyTargetCount > 0, readyTargetCount };
|
|
@@ -205,20 +221,15 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
205
221
|
isAvailable: placementAvailable,
|
|
206
222
|
activeActorCount: populationCapacity?.actors.active ?? 0,
|
|
207
223
|
activeSpotCount: populationCapacity?.spots.active ?? 0,
|
|
208
|
-
unavailableReason:
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
? ZLinkTopologyReason.LocationUnavailable
|
|
214
|
-
: placementWeight <= 0
|
|
215
|
-
? ZLinkTopologyReason.NoReadyTarget
|
|
216
|
-
: ZLinkTopologyReason.CapacityExceeded
|
|
224
|
+
unavailableReason: placementUnavailableReason(
|
|
225
|
+
placementAvailable,
|
|
226
|
+
hostState,
|
|
227
|
+
locationStoreHealthy
|
|
228
|
+
)
|
|
217
229
|
},
|
|
218
|
-
sequence
|
|
230
|
+
sequence,
|
|
219
231
|
observedAt: new Date()
|
|
220
232
|
};
|
|
221
|
-
drain.lastSnapshot = snapshot;
|
|
222
233
|
return snapshot;
|
|
223
234
|
}
|
|
224
235
|
|
|
@@ -230,15 +241,15 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
230
241
|
const state = this.requireState(meshName);
|
|
231
242
|
if (!Number.isInteger(capacity) || capacity <= 0)
|
|
232
243
|
throw new RangeError('Observer capacity must be positive.');
|
|
233
|
-
|
|
244
|
+
const snapshot = this.snapshot(meshName);
|
|
234
245
|
const queue = new RuntimeEventQueue<ZLinkRouteMeshStatus>(capacity, signal);
|
|
246
|
+
state.observers.add(queue);
|
|
247
|
+
this.startPlacementObserver();
|
|
235
248
|
queue.onClose(() => {
|
|
236
249
|
state.observers.delete(queue);
|
|
237
250
|
this.stopPlacementObserverIfIdle();
|
|
238
251
|
});
|
|
239
|
-
this.
|
|
240
|
-
state.observers.add(queue);
|
|
241
|
-
this.startPlacementObserver();
|
|
252
|
+
this.publishStatus(meshName, queue, snapshot);
|
|
242
253
|
return queue;
|
|
243
254
|
}
|
|
244
255
|
|
|
@@ -247,78 +258,29 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
247
258
|
}
|
|
248
259
|
|
|
249
260
|
hostStateChanged(): void {
|
|
250
|
-
for (const [meshName, state] of this.states)
|
|
251
|
-
state.sequence += 1n;
|
|
252
|
-
let snapshot: ZLinkRouteMeshStatus;
|
|
253
|
-
try {
|
|
254
|
-
snapshot = this.snapshot(meshName);
|
|
255
|
-
} catch {
|
|
256
|
-
continue;
|
|
257
|
-
}
|
|
258
|
-
for (const observer of state.observers) observer.push(snapshot, meshName);
|
|
259
|
-
}
|
|
261
|
+
for (const [meshName, state] of this.states) this.publishCurrentStatus(meshName, state);
|
|
260
262
|
}
|
|
261
263
|
|
|
262
264
|
stopObservers(): void {
|
|
263
265
|
for (const [meshName, state] of this.states) {
|
|
264
|
-
state.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
channels: current.channels.map((channel) => ({
|
|
276
|
-
...channel,
|
|
277
|
-
isReady: false
|
|
278
|
-
})),
|
|
279
|
-
placement: {
|
|
280
|
-
...current.placement,
|
|
281
|
-
isAvailable: false,
|
|
282
|
-
unavailableReason: ZLinkTopologyReason.RuntimeNotReady
|
|
283
|
-
},
|
|
284
|
-
sequence: terminalSequence,
|
|
285
|
-
observedAt: new Date()
|
|
286
|
-
};
|
|
287
|
-
} catch {
|
|
288
|
-
const current = state.lastSnapshot;
|
|
289
|
-
if (current !== undefined) {
|
|
290
|
-
const terminalSequence =
|
|
291
|
-
current.sequence >= state.sequence ? current.sequence + 1n : state.sequence;
|
|
292
|
-
state.sequence = terminalSequence;
|
|
293
|
-
terminal = {
|
|
294
|
-
...current,
|
|
295
|
-
state: ZLinkTopologyState.Stopped,
|
|
296
|
-
isReady: false,
|
|
297
|
-
channels: current.channels.map((channel) => ({
|
|
298
|
-
...channel,
|
|
299
|
-
isReady: false
|
|
300
|
-
})),
|
|
301
|
-
placement: {
|
|
302
|
-
...current.placement,
|
|
303
|
-
isAvailable: false,
|
|
304
|
-
unavailableReason: ZLinkTopologyReason.RuntimeNotReady
|
|
305
|
-
},
|
|
306
|
-
sequence: terminalSequence,
|
|
307
|
-
observedAt: new Date()
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
for (const observer of [...state.observers]) {
|
|
312
|
-
if (terminal === undefined) observer.close();
|
|
313
|
-
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
|
+
);
|
|
314
277
|
}
|
|
315
|
-
state.observers.clear();
|
|
316
278
|
}
|
|
317
279
|
}
|
|
318
280
|
|
|
319
281
|
drain(
|
|
320
282
|
meshName: string,
|
|
321
|
-
deadlineMs =
|
|
283
|
+
deadlineMs: number = DEFAULT_ROUTE_MESH_DRAIN_TIMEOUT_MS,
|
|
322
284
|
signal?: AbortSignal
|
|
323
285
|
): Promise<ZLinkMeshDrainResult> {
|
|
324
286
|
const state = this.requireState(meshName);
|
|
@@ -339,7 +301,10 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
339
301
|
return waitForOperation(operation, signal);
|
|
340
302
|
}
|
|
341
303
|
|
|
342
|
-
drainHost(
|
|
304
|
+
drainHost(
|
|
305
|
+
deadlineMs: number = DEFAULT_ROUTE_MESH_DRAIN_TIMEOUT_MS,
|
|
306
|
+
signal?: AbortSignal
|
|
307
|
+
): Promise<ZLinkMeshDrainResult> {
|
|
343
308
|
if (!Number.isFinite(deadlineMs) || deadlineMs <= 0) {
|
|
344
309
|
return Promise.reject(new TypeError('Drain deadlineMs must be greater than zero.'));
|
|
345
310
|
}
|
|
@@ -352,16 +317,12 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
352
317
|
return waitForOperation(this.hostOperation, signal);
|
|
353
318
|
}
|
|
354
319
|
|
|
355
|
-
shutdownHost(
|
|
356
|
-
deadline: number | Date = 30_000,
|
|
357
|
-
signal?: AbortSignal,
|
|
358
|
-
remainingTimeoutMs?: number
|
|
359
|
-
): Promise<ZLinkMeshDrainResult> {
|
|
320
|
+
shutdownHost(deadline: number | Date, signal: AbortSignal): Promise<ZLinkMeshDrainResult> {
|
|
360
321
|
if (typeof deadline === 'number' && (!Number.isFinite(deadline) || deadline <= 0)) {
|
|
361
322
|
return Promise.reject(new TypeError('Shutdown deadlineMs must be greater than zero.'));
|
|
362
323
|
}
|
|
363
324
|
if (this.shutdownOperation === undefined) {
|
|
364
|
-
const operation = this.performHostShutdown(deadline,
|
|
325
|
+
const operation = this.performHostShutdown(deadline, signal);
|
|
365
326
|
this.shutdownOperation = operation;
|
|
366
327
|
for (const state of this.states.values()) state.operation ??= operation;
|
|
367
328
|
}
|
|
@@ -397,7 +358,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
397
358
|
rollback.abort(
|
|
398
359
|
createDeadlineExceededError('Retire descriptor rollback deadline exceeded.')
|
|
399
360
|
),
|
|
400
|
-
Math.min(deadlineMs,
|
|
361
|
+
Math.min(deadlineMs, MAX_ROUTE_MESH_OBSERVATION_WAIT_MS)
|
|
401
362
|
);
|
|
402
363
|
let rollbackFailed = false;
|
|
403
364
|
for (const meshName of attempted.reverse()) {
|
|
@@ -444,7 +405,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
444
405
|
return { kind: 'drained' };
|
|
445
406
|
} catch (error) {
|
|
446
407
|
const classified = drainFailureReason(error);
|
|
447
|
-
if (
|
|
408
|
+
if (isRelocationDebugEnabled()) {
|
|
448
409
|
console.error('[zlink.runtime.relocation.drain_failed]', classified, error);
|
|
449
410
|
}
|
|
450
411
|
const reason: ZLinkDrainForceReason = deadline.signal.aborted
|
|
@@ -456,7 +417,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
456
417
|
rollback.abort(
|
|
457
418
|
createDeadlineExceededError('Relocation descriptor rollback deadline exceeded.')
|
|
458
419
|
),
|
|
459
|
-
Math.min(Math.max(1, deadlineMs),
|
|
420
|
+
Math.min(Math.max(1, deadlineMs), MAX_ROUTE_MESH_OBSERVATION_WAIT_MS)
|
|
460
421
|
);
|
|
461
422
|
try {
|
|
462
423
|
await Promise.all(
|
|
@@ -585,25 +546,14 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
585
546
|
|
|
586
547
|
private async performHostShutdown(
|
|
587
548
|
cleanupDeadline: Date | number,
|
|
588
|
-
|
|
549
|
+
signal: AbortSignal
|
|
589
550
|
): Promise<ZLinkMeshDrainResult> {
|
|
590
|
-
const timeoutMs = Math.max(
|
|
591
|
-
0,
|
|
592
|
-
remainingTimeoutMs ??
|
|
593
|
-
(cleanupDeadline instanceof Date ? cleanupDeadline.getTime() - Date.now() : cleanupDeadline)
|
|
594
|
-
);
|
|
595
551
|
const deadlineAt =
|
|
596
552
|
cleanupDeadline instanceof Date ? cleanupDeadline : new Date(Date.now() + cleanupDeadline);
|
|
597
553
|
const entries = [...this.states.entries()];
|
|
598
|
-
if (entries.length === 0) return { kind: 'drained' };
|
|
599
554
|
for (const [, state] of entries) {
|
|
600
555
|
state.deadline = deadlineAt;
|
|
601
556
|
}
|
|
602
|
-
const deadline = new AbortController();
|
|
603
|
-
const timer = setTimeout(
|
|
604
|
-
() => deadline.abort(createDeadlineExceededError('Shutdown deadline exceeded.')),
|
|
605
|
-
timeoutMs
|
|
606
|
-
);
|
|
607
557
|
let result: ZLinkMeshDrainResult;
|
|
608
558
|
try {
|
|
609
559
|
for (const [meshName, state] of entries) {
|
|
@@ -611,16 +561,16 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
611
561
|
this.transition(meshName, state, ZLinkTopologyState.Stopping);
|
|
612
562
|
}
|
|
613
563
|
await Promise.all(
|
|
614
|
-
entries.map(([meshName]) => this.options.publishDraining(meshName,
|
|
564
|
+
entries.map(([meshName]) => this.options.publishDraining(meshName, signal))
|
|
615
565
|
);
|
|
616
|
-
await this.options.publishHostDraining(
|
|
566
|
+
await this.options.publishHostDraining(signal);
|
|
617
567
|
await Promise.all(
|
|
618
|
-
entries.map(([meshName]) => this.options.admission.awaitZero(meshName,
|
|
568
|
+
entries.map(([meshName]) => this.options.admission.awaitZero(meshName, signal))
|
|
619
569
|
);
|
|
620
570
|
await Promise.all(
|
|
621
|
-
entries.map(([meshName]) => this.options.shutdownResources?.(meshName,
|
|
571
|
+
entries.map(([meshName]) => this.options.shutdownResources?.(meshName, signal))
|
|
622
572
|
);
|
|
623
|
-
await this.options.cleanupHostResources(
|
|
573
|
+
await this.options.cleanupHostResources(signal);
|
|
624
574
|
result = { kind: 'drained' };
|
|
625
575
|
for (const [meshName, state] of entries) {
|
|
626
576
|
this.transition(meshName, state, ZLinkTopologyState.Stopped);
|
|
@@ -630,7 +580,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
630
580
|
const reason: ZLinkDrainForceReason =
|
|
631
581
|
classified !== 'teardown_failed'
|
|
632
582
|
? classified
|
|
633
|
-
:
|
|
583
|
+
: signal.aborted
|
|
634
584
|
? 'deadline_exceeded'
|
|
635
585
|
: classified;
|
|
636
586
|
await Promise.all(
|
|
@@ -642,8 +592,6 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
642
592
|
for (const [meshName, state] of entries) {
|
|
643
593
|
this.transition(meshName, state, ZLinkTopologyState.Failed);
|
|
644
594
|
}
|
|
645
|
-
} finally {
|
|
646
|
-
clearTimeout(timer);
|
|
647
595
|
}
|
|
648
596
|
for (const [, state] of entries) {
|
|
649
597
|
state.result = result;
|
|
@@ -656,113 +604,83 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
656
604
|
private transition(meshName: string, state: ZLinkMeshDrainState, next: ZLinkTopologyState): void {
|
|
657
605
|
if (state.state === next) return;
|
|
658
606
|
state.state = next;
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
try {
|
|
663
|
-
current = this.snapshot(meshName);
|
|
664
|
-
snapshotAvailable = true;
|
|
665
|
-
} catch {
|
|
666
|
-
current = state.lastSnapshot;
|
|
667
|
-
}
|
|
668
|
-
const terminal = next === ZLinkTopologyState.Stopped || next === ZLinkTopologyState.Failed;
|
|
669
|
-
if (current !== undefined) {
|
|
670
|
-
if (terminal) {
|
|
671
|
-
const terminalSequence =
|
|
672
|
-
current.sequence >= state.sequence ? current.sequence + 1n : state.sequence;
|
|
673
|
-
state.sequence = terminalSequence;
|
|
674
|
-
const terminalStatus = {
|
|
675
|
-
...current,
|
|
676
|
-
state: next,
|
|
677
|
-
isReady: false,
|
|
678
|
-
channels: current.channels.map((channel) => ({
|
|
679
|
-
...channel,
|
|
680
|
-
isReady: false
|
|
681
|
-
})),
|
|
682
|
-
placement: {
|
|
683
|
-
...current.placement,
|
|
684
|
-
isAvailable: false,
|
|
685
|
-
unavailableReason: ZLinkTopologyReason.RuntimeNotReady
|
|
686
|
-
},
|
|
687
|
-
sequence: terminalSequence,
|
|
688
|
-
observedAt: new Date()
|
|
689
|
-
};
|
|
690
|
-
for (const observer of state.observers) observer.seal(terminalStatus, meshName);
|
|
691
|
-
} else if (snapshotAvailable) {
|
|
692
|
-
for (const observer of state.observers) observer.push(current, meshName);
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
if (terminal) {
|
|
696
|
-
if (current === undefined) {
|
|
697
|
-
for (const observer of state.observers) observer.close();
|
|
698
|
-
}
|
|
699
|
-
state.observers.clear();
|
|
700
|
-
this.stopPlacementObserverIfIdle();
|
|
607
|
+
const published = this.publishCurrentStatus(meshName, state);
|
|
608
|
+
if (topologyObservationIsTerminal(next) && published === undefined) {
|
|
609
|
+
for (const observer of [...state.observers]) observer.close();
|
|
701
610
|
}
|
|
702
611
|
}
|
|
703
612
|
|
|
704
|
-
private
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
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));
|
|
712
627
|
}
|
|
713
|
-
this.
|
|
628
|
+
if (this.options.meshNode(meshName) === undefined) return undefined;
|
|
629
|
+
const current = this.buildSnapshot(meshName, published?.sequence ?? 0n);
|
|
630
|
+
return this.publishSnapshot(
|
|
714
631
|
meshName,
|
|
715
|
-
|
|
632
|
+
state,
|
|
633
|
+
topologyObservationIsTerminal(current.state)
|
|
634
|
+
? terminalSnapshot(current, current.state)
|
|
635
|
+
: current
|
|
716
636
|
);
|
|
717
637
|
}
|
|
718
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
|
+
|
|
719
664
|
private startPlacementObserver(): void {
|
|
720
665
|
if (this.placementObserver !== undefined) return;
|
|
721
|
-
this.placementObserver = setInterval(
|
|
666
|
+
this.placementObserver = setInterval(
|
|
667
|
+
() => this.observePlacementChanges(),
|
|
668
|
+
PLACEMENT_OBSERVATION_INTERVAL_MS
|
|
669
|
+
);
|
|
722
670
|
this.placementObserver.unref();
|
|
723
671
|
}
|
|
724
672
|
|
|
725
673
|
private stopPlacementObserverIfIdle(): void {
|
|
726
|
-
|
|
674
|
+
for (const state of this.states.values()) {
|
|
675
|
+
if (state.observers.size > 0) return;
|
|
676
|
+
}
|
|
727
677
|
if (this.placementObserver !== undefined) clearInterval(this.placementObserver);
|
|
728
678
|
this.placementObserver = undefined;
|
|
729
679
|
}
|
|
730
680
|
|
|
731
681
|
private observePlacementChanges(): void {
|
|
732
682
|
for (const [meshName, state] of this.states) {
|
|
733
|
-
|
|
734
|
-
const locationStoreHealthy = this.options.isLocationStoreHealthy?.() ?? true;
|
|
735
|
-
if (locationStoreHealthy !== this.locationStoreHealthFingerprints.get(meshName)) {
|
|
736
|
-
this.locationStoreHealthFingerprints.set(meshName, locationStoreHealthy);
|
|
737
|
-
state.sequence += 1n;
|
|
738
|
-
for (const observer of state.observers) {
|
|
739
|
-
observer.push(this.snapshot(meshName), meshName);
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
const descriptor = this.options.meshNodeDescriptor?.(meshName);
|
|
743
|
-
if (descriptor === undefined) continue;
|
|
744
|
-
const fingerprint = placementFingerprint(descriptor);
|
|
745
|
-
const previous = this.placementFingerprints.get(meshName);
|
|
746
|
-
this.placementFingerprints.set(meshName, fingerprint);
|
|
747
|
-
const node = this.options.meshNode(meshName);
|
|
748
|
-
if (previous !== undefined && previous !== fingerprint) {
|
|
749
|
-
state.sequence += 1n;
|
|
750
|
-
for (const observer of state.observers) {
|
|
751
|
-
observer.push(this.snapshot(meshName), meshName);
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
const previousPeers = this.peerFingerprints.get(meshName) ?? new Map();
|
|
756
|
-
const peers = node?.peers() ?? [];
|
|
757
|
-
const nextPeers = peerFingerprintMap(peers);
|
|
758
|
-
this.peerFingerprints.set(meshName, nextPeers);
|
|
759
|
-
for (const peerRid of new Set([...previousPeers.keys(), ...nextPeers.keys()])) {
|
|
760
|
-
if (previousPeers.get(peerRid) === nextPeers.get(peerRid)) continue;
|
|
761
|
-
state.sequence += 1n;
|
|
762
|
-
for (const observer of state.observers) {
|
|
763
|
-
observer.push(this.snapshot(meshName), meshName);
|
|
764
|
-
}
|
|
765
|
-
}
|
|
683
|
+
this.publishCurrentStatus(meshName, state);
|
|
766
684
|
}
|
|
767
685
|
}
|
|
768
686
|
|
|
@@ -773,6 +691,77 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
|
|
|
773
691
|
}
|
|
774
692
|
}
|
|
775
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
|
+
|
|
776
765
|
function topologyStateForHost(
|
|
777
766
|
state: ZLinkFrameworkRuntimeState,
|
|
778
767
|
fallback: ZLinkTopologyState
|
|
@@ -793,30 +782,6 @@ function topologyStateForHost(
|
|
|
793
782
|
}
|
|
794
783
|
}
|
|
795
784
|
|
|
796
|
-
function placementFingerprint(descriptor: ZLinkMeshNodeDescriptor): string {
|
|
797
|
-
const spotTypes = [...descriptor.populationCapacity.spotTypes]
|
|
798
|
-
.sort((left, right) => {
|
|
799
|
-
const kind = left.objectKind.localeCompare(right.objectKind);
|
|
800
|
-
return kind !== 0 ? kind : left.stableType.localeCompare(right.stableType);
|
|
801
|
-
})
|
|
802
|
-
.map((entry) => [
|
|
803
|
-
entry.objectKind,
|
|
804
|
-
entry.stableType,
|
|
805
|
-
entry.active,
|
|
806
|
-
entry.reserved,
|
|
807
|
-
entry.limit
|
|
808
|
-
]);
|
|
809
|
-
return JSON.stringify([
|
|
810
|
-
descriptor.objectRole,
|
|
811
|
-
descriptor.placementWeight,
|
|
812
|
-
descriptor.populationCapacity.actors,
|
|
813
|
-
descriptor.populationCapacity.spots,
|
|
814
|
-
spotTypes,
|
|
815
|
-
descriptor.activationConcurrency,
|
|
816
|
-
Object.entries(descriptor.channelWeights).sort(([left], [right]) => left.localeCompare(right))
|
|
817
|
-
]);
|
|
818
|
-
}
|
|
819
|
-
|
|
820
785
|
function hasRemainingCapacity(capacity: {
|
|
821
786
|
readonly active: number;
|
|
822
787
|
readonly limit: number;
|
|
@@ -825,19 +790,11 @@ function hasRemainingCapacity(capacity: {
|
|
|
825
790
|
return capacity.limit === 0 || capacity.active + (capacity.reserved ?? 0) < capacity.limit;
|
|
826
791
|
}
|
|
827
792
|
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
peer.lifecycleGeneration.toString(),
|
|
834
|
-
peer.descriptorRevision.toString(),
|
|
835
|
-
peer.endpoint,
|
|
836
|
-
peer.state,
|
|
837
|
-
peer.lastError
|
|
838
|
-
])
|
|
839
|
-
])
|
|
840
|
-
);
|
|
793
|
+
export class ZLinkDrainingStatePublishError extends Error {
|
|
794
|
+
constructor(cause: unknown) {
|
|
795
|
+
super('Failed to publish draining peer rows.', { cause });
|
|
796
|
+
this.name = 'ZLinkDrainingStatePublishError';
|
|
797
|
+
}
|
|
841
798
|
}
|
|
842
799
|
|
|
843
800
|
export class ZLinkRetiringRollbackError extends Error {
|
|
@@ -861,33 +818,32 @@ function multiMeshDrainError(): ZLinkFrameworkException {
|
|
|
861
818
|
);
|
|
862
819
|
}
|
|
863
820
|
|
|
864
|
-
function backendState(state:
|
|
821
|
+
function backendState(state: MeshNodeRuntimeState): ZLinkTopologyState {
|
|
865
822
|
switch (state) {
|
|
866
|
-
case
|
|
823
|
+
case MeshNodeRuntimeState.Preparing:
|
|
867
824
|
return ZLinkTopologyState.Starting;
|
|
868
|
-
case
|
|
869
|
-
case 3:
|
|
870
|
-
case 4:
|
|
825
|
+
case MeshNodeRuntimeState.Serving:
|
|
871
826
|
return ZLinkTopologyState.Ready;
|
|
872
|
-
case
|
|
827
|
+
case MeshNodeRuntimeState.Retiring:
|
|
828
|
+
case MeshNodeRuntimeState.Draining:
|
|
873
829
|
return ZLinkTopologyState.Stopping;
|
|
874
|
-
case
|
|
830
|
+
case MeshNodeRuntimeState.Stopped:
|
|
875
831
|
return ZLinkTopologyState.Stopped;
|
|
876
832
|
default:
|
|
877
833
|
return ZLinkTopologyState.Failed;
|
|
878
834
|
}
|
|
879
835
|
}
|
|
880
836
|
|
|
881
|
-
function peerState(state:
|
|
837
|
+
function peerState(state: MeshPeerRuntimeState): ZLinkPeerState {
|
|
882
838
|
switch (state) {
|
|
883
|
-
case
|
|
839
|
+
case MeshPeerRuntimeState.Serving:
|
|
884
840
|
return ZLinkPeerState.Ready;
|
|
885
|
-
case
|
|
841
|
+
case MeshPeerRuntimeState.Draining:
|
|
886
842
|
return ZLinkPeerState.Draining;
|
|
887
|
-
case
|
|
843
|
+
case MeshPeerRuntimeState.NotRequired:
|
|
888
844
|
return ZLinkPeerState.NotRequired;
|
|
889
|
-
case
|
|
890
|
-
case
|
|
845
|
+
case MeshPeerRuntimeState.Connecting:
|
|
846
|
+
case MeshPeerRuntimeState.Preparing:
|
|
891
847
|
return ZLinkPeerState.Connecting;
|
|
892
848
|
default:
|
|
893
849
|
return ZLinkPeerState.NotConnected;
|
|
@@ -907,14 +863,15 @@ function peerUnavailableReason(state: ZLinkPeerState): ZLinkTopologyReason | und
|
|
|
907
863
|
}
|
|
908
864
|
|
|
909
865
|
function drainFailureReason(error: unknown): ZLinkDrainForceReason {
|
|
910
|
-
|
|
911
|
-
|
|
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';
|
|
912
871
|
if (
|
|
913
|
-
|
|
872
|
+
error instanceof ZLinkOwnerCleanupError ||
|
|
914
873
|
(error instanceof AggregateError &&
|
|
915
|
-
error.errors.some(
|
|
916
|
-
(nested) => nested instanceof Error && nested.name === 'ZLinkOwnerCleanupError'
|
|
917
|
-
))
|
|
874
|
+
error.errors.some((nested) => nested instanceof ZLinkOwnerCleanupError))
|
|
918
875
|
) {
|
|
919
876
|
return 'owner_cleanup_failed';
|
|
920
877
|
}
|