@zlink-systems/framework 0.21.0 → 0.23.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/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -0
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -1
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +28 -22
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-join-deferred-scope.d.ts +0 -1
- package/dist/runtime/actors/actor-join-deferred-scope.js +0 -18
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +160 -130
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/contracts/index.d.ts +1 -0
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +3 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +134 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +12 -20
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +46 -42
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -0
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -39
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +6 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +55 -0
- package/dist/runtime/diagnostics/flow-context.d.ts +2 -1
- package/dist/runtime/diagnostics/flow-context.js +2 -2
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +58 -42
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -27
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +4 -2
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +169 -144
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +1 -0
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +4 -0
- package/dist/runtime/foundation/service-stateful-runtime.js +461 -439
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -0
- package/dist/runtime/foundation/service-topology-registry.js +105 -96
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +245 -228
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +20 -18
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +209 -220
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +2 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +29 -21
- package/dist/runtime/spots/spot-actor-packet-drain.js +14 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +79 -86
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +17 -15
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +2 -3
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +6 -6
- package/dist/runtime/spots/spot-timer.js +26 -30
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +21 -8
- package/dist/runtime/streams/actor-session-binding-registry.js +168 -148
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +20 -17
- package/dist/runtime/streams/bound-session-response-target.js +8 -1
- package/dist/runtime/streams/bound-session-service.d.ts +1 -0
- package/dist/runtime/streams/bound-session-service.js +14 -12
- package/dist/runtime/streams/index.js +28 -20
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +52 -31
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.d.ts +5 -1
- package/dist/runtime/streams/protocol.js +68 -20
- package/dist/runtime/streams/session-actor-coordinator.js +37 -41
- package/dist/runtime/streams/session-context.d.ts +9 -2
- package/dist/runtime/streams/session-context.js +50 -32
- package/dist/runtime/streams/session-local-actors.d.ts +3 -1
- package/dist/runtime/streams/session-local-actors.js +17 -2
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.d.ts +1 -1
- package/dist/runtime/streams/stream-frame-factory.js +14 -7
- package/dist/runtime/streams/stream-session-runtime.js +112 -78
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +3 -3
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +2 -2
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +142 -134
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +1 -32
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +353 -326
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +77 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +370 -390
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +44 -44
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +218 -206
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +12 -47
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/dispatch-error-details.ts +62 -0
- package/src/runtime/diagnostics/flow-context.ts +18 -7
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +107 -79
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -55
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +364 -396
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1233 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +170 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +19 -18
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +595 -564
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +196 -148
- package/src/runtime/spots/spot-actor-packet-drain.ts +56 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +235 -222
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +129 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +13 -18
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +58 -47
- package/src/runtime/spots/spot-timer.ts +103 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +421 -292
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +8 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +60 -50
- package/src/runtime/streams/bound-session-response-target.ts +39 -9
- package/src/runtime/streams/bound-session-service.ts +52 -42
- package/src/runtime/streams/index.ts +183 -100
- package/src/runtime/streams/managed-stream.ts +123 -90
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +115 -46
- package/src/runtime/streams/session-actor-coordinator.ts +109 -93
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +96 -51
- package/src/runtime/streams/session-local-actors.ts +19 -3
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +59 -40
- package/src/runtime/streams/stream-session-runtime.ts +317 -214
- package/src/runtime/workers/index.ts +68 -29
|
@@ -60,15 +60,9 @@ import type {
|
|
|
60
60
|
ZLinkSpotLocationQueryStore
|
|
61
61
|
} from './internal-store-contracts';
|
|
62
62
|
import type { ZLinkDomainLocationStore } from './domain-store-contract';
|
|
63
|
-
import {
|
|
64
|
-
zlinkLocationAutoConnectTypeName,
|
|
65
|
-
zlinkLocationRoleName
|
|
66
|
-
} from './canonical-codec';
|
|
63
|
+
import { zlinkLocationAutoConnectTypeName, zlinkLocationRoleName } from './canonical-codec';
|
|
67
64
|
import { ZLinkLocationKeyCodec } from './key-codec';
|
|
68
|
-
import {
|
|
69
|
-
ZLinkLiveRowFilter,
|
|
70
|
-
ZLinkOwnerLeaseTracker
|
|
71
|
-
} from './lease-tracker';
|
|
65
|
+
import { ZLinkLiveRowFilter, ZLinkOwnerLeaseTracker } from './lease-tracker';
|
|
72
66
|
import type { ZLinkOwnershipLostEvent } from './lifecycle-runtime';
|
|
73
67
|
|
|
74
68
|
export interface ZLinkLocationRuntimeStores {
|
|
@@ -158,7 +152,10 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
158
152
|
private ownerCleanupComplete = true;
|
|
159
153
|
private readonly metrics?: import('../diagnostics').ZLinkRuntimeMetrics;
|
|
160
154
|
private readonly meshNames: readonly string[];
|
|
161
|
-
private readonly leaseScopes: readonly {
|
|
155
|
+
private readonly leaseScopes: readonly {
|
|
156
|
+
readonly kind: 'mesh' | 'channel';
|
|
157
|
+
readonly name: string;
|
|
158
|
+
}[];
|
|
162
159
|
private readonly rewriteAuthorityPayloadForOwner?: ZLinkLocationRuntimeOptions['rewriteAuthorityPayloadForOwner'];
|
|
163
160
|
private nextLeaseRenewAtMs?: number;
|
|
164
161
|
private ownerToken?: ZLinkLocationOwnerToken;
|
|
@@ -170,9 +167,11 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
170
167
|
lastError?: string;
|
|
171
168
|
|
|
172
169
|
get ownerLeaseUsable(): boolean {
|
|
173
|
-
return
|
|
174
|
-
|
|
175
|
-
|
|
170
|
+
return (
|
|
171
|
+
this.ownerToken !== undefined &&
|
|
172
|
+
this.ownerLeaseDeadlineMs !== undefined &&
|
|
173
|
+
this.monotonicNowMs() < this.ownerLeaseDeadlineMs
|
|
174
|
+
);
|
|
176
175
|
}
|
|
177
176
|
|
|
178
177
|
constructor(runtimeOptions: ZLinkLocationRuntimeOptions) {
|
|
@@ -182,16 +181,21 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
182
181
|
this.events = runtimeOptions.events;
|
|
183
182
|
this.metrics = runtimeOptions.metrics;
|
|
184
183
|
this.meshNames = [...new Set(runtimeOptions.meshNames ?? [])];
|
|
185
|
-
this.leaseScopes =
|
|
184
|
+
this.leaseScopes =
|
|
185
|
+
runtimeOptions.leaseScopes ?? this.meshNames.map((name) => ({ kind: 'mesh', name }));
|
|
186
186
|
this.rewriteAuthorityPayloadForOwner = runtimeOptions.rewriteAuthorityPayloadForOwner;
|
|
187
187
|
this.monotonicNowMs = runtimeOptions.monotonicNowMs ?? (() => performance.now());
|
|
188
|
-
this.setTimer =
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
188
|
+
this.setTimer =
|
|
189
|
+
runtimeOptions.setTimer ?? ((callback, delayMs) => setTimeout(callback, delayMs));
|
|
190
|
+
this.clearTimer =
|
|
191
|
+
runtimeOptions.clearTimer ?? ((handle) => clearTimeout(handle as NodeJS.Timeout));
|
|
192
|
+
const leaseTracker =
|
|
193
|
+
runtimeOptions.leaseTracker ??
|
|
194
|
+
new ZLinkOwnerLeaseTracker({
|
|
195
|
+
store: this.stores.ownerLeaseStore,
|
|
196
|
+
options: this.options,
|
|
197
|
+
monotonicNowMs: this.monotonicNowMs
|
|
198
|
+
});
|
|
195
199
|
this.liveRows = new ZLinkLiveRowFilter(leaseTracker);
|
|
196
200
|
}
|
|
197
201
|
|
|
@@ -221,8 +225,10 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
221
225
|
const failures: unknown[] = [];
|
|
222
226
|
for (const entry of entries) {
|
|
223
227
|
const snapshot = entry.snapshot;
|
|
224
|
-
if (
|
|
225
|
-
|
|
228
|
+
if (
|
|
229
|
+
snapshot.ownerId !== owner.ownerId ||
|
|
230
|
+
snapshot.ownerLeaseGeneration === owner.leaseGeneration
|
|
231
|
+
) {
|
|
226
232
|
continue;
|
|
227
233
|
}
|
|
228
234
|
try {
|
|
@@ -237,8 +243,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
237
243
|
},
|
|
238
244
|
targetOwner: owner,
|
|
239
245
|
payload: Buffer.from(
|
|
240
|
-
this.rewriteAuthorityPayloadForOwner?.(snapshot.payload, owner)
|
|
241
|
-
?? snapshot.payload
|
|
246
|
+
this.rewriteAuthorityPayloadForOwner?.(snapshot.payload, owner) ?? snapshot.payload
|
|
242
247
|
)
|
|
243
248
|
},
|
|
244
249
|
signal
|
|
@@ -246,16 +251,18 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
246
251
|
if (result.kind === 'stored') continue;
|
|
247
252
|
if (result.kind === 'conflict') {
|
|
248
253
|
const current = result.current;
|
|
249
|
-
if (
|
|
250
|
-
|
|
251
|
-
|
|
254
|
+
if (
|
|
255
|
+
current.kind === 'snapshot' &&
|
|
256
|
+
current.ownerId === owner.ownerId &&
|
|
257
|
+
current.ownerLeaseGeneration === owner.leaseGeneration
|
|
258
|
+
) {
|
|
252
259
|
continue;
|
|
253
260
|
}
|
|
254
261
|
continue;
|
|
255
262
|
}
|
|
256
|
-
failures.push(
|
|
257
|
-
`Authority '${entry.key.value}' recovery returned '${result.kind}'.`
|
|
258
|
-
)
|
|
263
|
+
failures.push(
|
|
264
|
+
new Error(`Authority '${entry.key.value}' recovery returned '${result.kind}'.`)
|
|
265
|
+
);
|
|
259
266
|
} catch (error) {
|
|
260
267
|
failures.push(error);
|
|
261
268
|
}
|
|
@@ -352,10 +359,11 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
352
359
|
return;
|
|
353
360
|
}
|
|
354
361
|
try {
|
|
355
|
-
const owner = this.ownerToken ??
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
362
|
+
const owner = this.ownerToken ??
|
|
363
|
+
this.lastOwnerToken ?? {
|
|
364
|
+
ownerId: this.ownerId,
|
|
365
|
+
leaseGeneration: 0n
|
|
366
|
+
};
|
|
359
367
|
await this.stores.locationStore.removeAllByOwner(owner, signal);
|
|
360
368
|
const currentLease = await this.stores.ownerLeaseStore.readOwnerLease(this.ownerId, signal);
|
|
361
369
|
if (currentLease.kind === 'found') {
|
|
@@ -382,11 +390,12 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
382
390
|
try {
|
|
383
391
|
const renewStartedAtMs = this.monotonicNowMs();
|
|
384
392
|
const result = await withTimeout(
|
|
385
|
-
(renewSignal) =>
|
|
393
|
+
(renewSignal) =>
|
|
394
|
+
this.stores.ownerLeaseStore.renewOwnerLease(
|
|
386
395
|
this.ownerToken as ZLinkLocationOwnerToken,
|
|
387
396
|
this.options.ownerLeaseTtlMs,
|
|
388
397
|
renewSignal
|
|
389
|
-
|
|
398
|
+
),
|
|
390
399
|
this.options.ownerLeaseRenewTimeoutMs,
|
|
391
400
|
signal
|
|
392
401
|
);
|
|
@@ -453,10 +462,8 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
453
462
|
// not install a token into a stopped runtime or leave an orphan lease.
|
|
454
463
|
try {
|
|
455
464
|
await withTimeout(
|
|
456
|
-
releaseSignal =>
|
|
457
|
-
claim.token,
|
|
458
|
-
releaseSignal
|
|
459
|
-
),
|
|
465
|
+
(releaseSignal) =>
|
|
466
|
+
this.stores.ownerLeaseStore.releaseOwnerLease(claim.token, releaseSignal),
|
|
460
467
|
remainingTimeoutMs(timeoutDeadline)
|
|
461
468
|
);
|
|
462
469
|
} catch (error) {
|
|
@@ -499,11 +506,12 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
499
506
|
let claim: Awaited<ReturnType<ZLinkOwnerLeaseStore['claimOwnerLease']>>;
|
|
500
507
|
try {
|
|
501
508
|
claim = await withTimeout(
|
|
502
|
-
(claimSignal) =>
|
|
503
|
-
this.
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
509
|
+
(claimSignal) =>
|
|
510
|
+
this.stores.ownerLeaseStore.claimOwnerLease(
|
|
511
|
+
this.ownerId,
|
|
512
|
+
this.options.ownerLeaseTtlMs,
|
|
513
|
+
claimSignal
|
|
514
|
+
),
|
|
507
515
|
remainingTimeoutMs(timeoutDeadline),
|
|
508
516
|
signal
|
|
509
517
|
);
|
|
@@ -515,27 +523,27 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
515
523
|
}
|
|
516
524
|
if (claim.kind !== 'conflict') return claim;
|
|
517
525
|
const conflict = new ZLinkOwnerLeaseClaimError(claim.kind);
|
|
518
|
-
return await this.confirmOwnerLease(conflict, timeoutDeadline, signal) ?? claim;
|
|
526
|
+
return (await this.confirmOwnerLease(conflict, timeoutDeadline, signal)) ?? claim;
|
|
519
527
|
}
|
|
520
528
|
|
|
521
529
|
private async confirmOwnerLease(
|
|
522
530
|
originalError: unknown,
|
|
523
531
|
timeoutDeadline: number,
|
|
524
532
|
signal?: AbortSignal
|
|
525
|
-
): Promise<
|
|
533
|
+
): Promise<
|
|
534
|
+
| Extract<Awaited<ReturnType<ZLinkOwnerLeaseStore['claimOwnerLease']>>, { kind: 'claimed' }>
|
|
535
|
+
| undefined
|
|
536
|
+
> {
|
|
526
537
|
const confirmationTimeoutMs = remainingTimeoutMs(timeoutDeadline);
|
|
527
538
|
if (confirmationTimeoutMs <= 0) throw originalError;
|
|
528
539
|
let confirmed: Awaited<ReturnType<ZLinkOwnerLeaseStore['readOwnerLease']>>;
|
|
529
540
|
try {
|
|
530
541
|
confirmed = await withTimeout(
|
|
531
|
-
readSignal => this.stores.ownerLeaseStore.readOwnerLease(this.ownerId, readSignal),
|
|
542
|
+
(readSignal) => this.stores.ownerLeaseStore.readOwnerLease(this.ownerId, readSignal),
|
|
532
543
|
confirmationTimeoutMs
|
|
533
544
|
);
|
|
534
545
|
} catch (confirmationError) {
|
|
535
|
-
this.recordFailure(
|
|
536
|
-
errorMessage(confirmationError),
|
|
537
|
-
'owner_lease_claim_confirmation'
|
|
538
|
-
);
|
|
546
|
+
this.recordFailure(errorMessage(confirmationError), 'owner_lease_claim_confirmation');
|
|
539
547
|
throw originalError;
|
|
540
548
|
}
|
|
541
549
|
if (confirmed.kind !== 'found' || confirmed.token.ownerId !== this.ownerId) {
|
|
@@ -544,10 +552,8 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
544
552
|
if (signal?.aborted === true) {
|
|
545
553
|
try {
|
|
546
554
|
await withTimeout(
|
|
547
|
-
releaseSignal =>
|
|
548
|
-
confirmed.token,
|
|
549
|
-
releaseSignal
|
|
550
|
-
),
|
|
555
|
+
(releaseSignal) =>
|
|
556
|
+
this.stores.ownerLeaseStore.releaseOwnerLease(confirmed.token, releaseSignal),
|
|
551
557
|
remainingTimeoutMs(timeoutDeadline)
|
|
552
558
|
);
|
|
553
559
|
} catch (releaseError) {
|
|
@@ -574,10 +580,9 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
574
580
|
// The Store's remaining TTL is measured at an unknown point during the
|
|
575
581
|
// request. Subtract the full observed round trip and the fencing margin
|
|
576
582
|
// so local eligibility cannot outlive the conservative pre-request bound.
|
|
577
|
-
this.ownerLeaseDeadlineMs =
|
|
578
|
-
|
|
579
|
-
remainingTtlMs - roundTripMs - this.options.ownerLeaseFencingMarginMs
|
|
580
|
-
);
|
|
583
|
+
this.ownerLeaseDeadlineMs =
|
|
584
|
+
requestCompletedAtMs +
|
|
585
|
+
Math.max(0, remainingTtlMs - roundTripMs - this.options.ownerLeaseFencingMarginMs);
|
|
581
586
|
}
|
|
582
587
|
|
|
583
588
|
async publishDraining(signal?: AbortSignal): Promise<boolean> {
|
|
@@ -600,10 +605,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
600
605
|
}
|
|
601
606
|
|
|
602
607
|
async writeMeshNode(
|
|
603
|
-
descriptor: Omit<
|
|
604
|
-
ZLinkMeshNodeDescriptor,
|
|
605
|
-
'ownerId' | 'leaseGeneration' | 'updatedAt'
|
|
606
|
-
>,
|
|
608
|
+
descriptor: Omit<ZLinkMeshNodeDescriptor, 'ownerId' | 'leaseGeneration' | 'updatedAt'>,
|
|
607
609
|
intent: ZLinkLocationWriteIntent,
|
|
608
610
|
signal?: AbortSignal
|
|
609
611
|
): Promise<ZLinkLocationWriteResult> {
|
|
@@ -622,22 +624,20 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
622
624
|
updatedAt: new Date()
|
|
623
625
|
};
|
|
624
626
|
let result = await this.guardWrite(() =>
|
|
625
|
-
this.stores.locationStore.updateMeshNode(stamped, intent, signal)
|
|
627
|
+
this.stores.locationStore.updateMeshNode(stamped, intent, signal)
|
|
628
|
+
);
|
|
626
629
|
if (
|
|
627
|
-
intent === ZLinkLocationWriteIntent.Renew
|
|
628
|
-
|
|
629
|
-
|
|
630
|
+
intent === ZLinkLocationWriteIntent.Renew &&
|
|
631
|
+
(result.status === ZLinkLocationWriteStatus.RejectedConflict ||
|
|
632
|
+
result.status === ZLinkLocationWriteStatus.IgnoredStale)
|
|
630
633
|
) {
|
|
631
634
|
// A Store restart can remove the descriptor while retaining the
|
|
632
635
|
// in-process owner token. Renew cannot recreate an absent row, so use
|
|
633
636
|
// NewClaim as a bounded fallback. If another owner has recreated the
|
|
634
637
|
// row, NewClaim remains rejected and the caller keeps the conflict.
|
|
635
638
|
result = await this.guardWrite(() =>
|
|
636
|
-
this.stores.locationStore.updateMeshNode(
|
|
637
|
-
|
|
638
|
-
ZLinkLocationWriteIntent.NewClaim,
|
|
639
|
-
signal
|
|
640
|
-
));
|
|
639
|
+
this.stores.locationStore.updateMeshNode(stamped, ZLinkLocationWriteIntent.NewClaim, signal)
|
|
640
|
+
);
|
|
641
641
|
}
|
|
642
642
|
this.notifyIfStale(
|
|
643
643
|
result,
|
|
@@ -660,7 +660,9 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
660
660
|
// row was stored under.
|
|
661
661
|
const normalizedEndpoint = normalizeEndpoint(peer.endpoint);
|
|
662
662
|
const stamped = { ...peer, endpoint: normalizedEndpoint, ownerId: this.ownerId };
|
|
663
|
-
const result = await this.guardWrite(() =>
|
|
663
|
+
const result = await this.guardWrite(() =>
|
|
664
|
+
this.stores.peerStore.updatePeer(stamped, intent, signal)
|
|
665
|
+
);
|
|
664
666
|
const key: ZLinkPeerLocationKey = {
|
|
665
667
|
autoConnectType: peer.autoConnectType,
|
|
666
668
|
meshName: peer.meshName,
|
|
@@ -670,7 +672,10 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
670
672
|
};
|
|
671
673
|
const rowKey = ZLinkLocationKeyCodec.encodePeerKey(key);
|
|
672
674
|
if (result.status === ZLinkLocationWriteStatus.Stored) {
|
|
673
|
-
this.events?.peerRowUpdated(
|
|
675
|
+
this.events?.peerRowUpdated(
|
|
676
|
+
{ kind: ZLinkLocationKind.Peer, key },
|
|
677
|
+
{ ...stamped, generation: result.generation, updatedAt: result.updatedAt }
|
|
678
|
+
);
|
|
674
679
|
}
|
|
675
680
|
this.notifyIfStale(result, ZLinkLocationKind.Peer, rowKey);
|
|
676
681
|
return result;
|
|
@@ -684,7 +689,9 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
684
689
|
const owner = this.ownerToken;
|
|
685
690
|
if (owner === undefined) throw new Error('Spot location write requires a claimed owner token.');
|
|
686
691
|
const stamped = { ...spot, ownerId: owner.ownerId, leaseGeneration: owner.leaseGeneration };
|
|
687
|
-
const result = await this.guardWrite(() =>
|
|
692
|
+
const result = await this.guardWrite(() =>
|
|
693
|
+
this.stores.spotStore.updateSpot(stamped, intent, signal)
|
|
694
|
+
);
|
|
688
695
|
const key = { meshName: spot.meshName, spotId: spot.spotId };
|
|
689
696
|
if (result.status === ZLinkLocationWriteStatus.Stored) {
|
|
690
697
|
this.events?.spotRowUpdated(key, { ...stamped, updatedAt: result.updatedAt });
|
|
@@ -699,14 +706,17 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
699
706
|
signal?: AbortSignal
|
|
700
707
|
): Promise<ZLinkLocationWriteResult> {
|
|
701
708
|
const owner = this.ownerToken;
|
|
702
|
-
if (owner === undefined)
|
|
709
|
+
if (owner === undefined)
|
|
710
|
+
throw new Error('Actor location write requires a claimed owner token.');
|
|
703
711
|
const stamped = {
|
|
704
712
|
...actor,
|
|
705
713
|
actorType: actor.actorType,
|
|
706
714
|
ownerId: owner.ownerId,
|
|
707
715
|
leaseGeneration: owner.leaseGeneration
|
|
708
716
|
};
|
|
709
|
-
const result = await this.guardWrite(() =>
|
|
717
|
+
const result = await this.guardWrite(() =>
|
|
718
|
+
this.stores.actorStore.updateActor(stamped, intent, signal)
|
|
719
|
+
);
|
|
710
720
|
const key = { meshName: stamped.meshName, actorId: stamped.actorId };
|
|
711
721
|
if (result.status === ZLinkLocationWriteStatus.Stored) {
|
|
712
722
|
this.events?.actorRowUpdated(key, { ...stamped, updatedAt: result.updatedAt });
|
|
@@ -721,19 +731,33 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
721
731
|
signal?: AbortSignal
|
|
722
732
|
): Promise<ZLinkLocationWriteResult> {
|
|
723
733
|
const stamped = { ...route, ownerId: this.ownerId };
|
|
724
|
-
const result = await this.guardWrite(() =>
|
|
734
|
+
const result = await this.guardWrite(() =>
|
|
735
|
+
this.stores.routeStore.updateRoute(stamped, intent, signal)
|
|
736
|
+
);
|
|
725
737
|
const key = { routeKind: route.routeKind, routeKey: route.routeKey };
|
|
726
738
|
if (result.status === ZLinkLocationWriteStatus.Stored) {
|
|
727
|
-
this.events?.routeRowUpdated(key, {
|
|
739
|
+
this.events?.routeRowUpdated(key, {
|
|
740
|
+
...stamped,
|
|
741
|
+
generation: result.generation,
|
|
742
|
+
updatedAt: result.updatedAt
|
|
743
|
+
});
|
|
728
744
|
}
|
|
729
745
|
this.notifyIfStale(result, ZLinkLocationKind.Route, ZLinkLocationKeyCodec.encodeRouteKey(key));
|
|
730
746
|
return result;
|
|
731
747
|
}
|
|
732
748
|
|
|
733
|
-
async removePeer(
|
|
749
|
+
async removePeer(
|
|
750
|
+
key: ZLinkPeerLocationKey,
|
|
751
|
+
generation: bigint,
|
|
752
|
+
signal?: AbortSignal
|
|
753
|
+
): Promise<ZLinkLocationWriteResult> {
|
|
734
754
|
const result = await this.guardWrite(() =>
|
|
735
755
|
this.stores.peerStore.removePeer(
|
|
736
|
-
key,
|
|
756
|
+
key,
|
|
757
|
+
{ ownerId: this.ownerId, leaseGeneration: generation },
|
|
758
|
+
signal
|
|
759
|
+
)
|
|
760
|
+
);
|
|
737
761
|
if (result.status === ZLinkLocationWriteStatus.Stored) {
|
|
738
762
|
this.events?.peerRowRemoved({ kind: ZLinkLocationKind.Peer, key });
|
|
739
763
|
}
|
|
@@ -741,32 +765,64 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
741
765
|
return result;
|
|
742
766
|
}
|
|
743
767
|
|
|
744
|
-
async removeSpot(
|
|
768
|
+
async removeSpot(
|
|
769
|
+
key: ZLinkSpotLocationKey,
|
|
770
|
+
generation: bigint,
|
|
771
|
+
signal?: AbortSignal
|
|
772
|
+
): Promise<ZLinkLocationWriteStatus> {
|
|
745
773
|
const status = await this.guardStatusWrite(() =>
|
|
746
774
|
this.stores.spotStore.removeSpot(
|
|
747
|
-
key,
|
|
775
|
+
key,
|
|
776
|
+
{ ownerId: this.ownerId, leaseGeneration: generation },
|
|
777
|
+
signal
|
|
778
|
+
)
|
|
779
|
+
);
|
|
748
780
|
if (status === ZLinkLocationWriteStatus.Stored) {
|
|
749
781
|
this.events?.spotRowRemoved(key);
|
|
750
782
|
}
|
|
751
|
-
this.notifyIfStaleStatus(
|
|
783
|
+
this.notifyIfStaleStatus(
|
|
784
|
+
status,
|
|
785
|
+
ZLinkLocationKind.Spot,
|
|
786
|
+
ZLinkLocationKeyCodec.encodeSpotKey(key)
|
|
787
|
+
);
|
|
752
788
|
return status;
|
|
753
789
|
}
|
|
754
790
|
|
|
755
|
-
async removeActor(
|
|
791
|
+
async removeActor(
|
|
792
|
+
key: ZLinkActorLocationKey,
|
|
793
|
+
generation: bigint,
|
|
794
|
+
signal?: AbortSignal
|
|
795
|
+
): Promise<ZLinkLocationWriteStatus> {
|
|
756
796
|
const status = await this.guardStatusWrite(() =>
|
|
757
797
|
this.stores.actorStore.removeActor(
|
|
758
|
-
key,
|
|
798
|
+
key,
|
|
799
|
+
{ ownerId: this.ownerId, leaseGeneration: generation },
|
|
800
|
+
signal
|
|
801
|
+
)
|
|
802
|
+
);
|
|
759
803
|
if (status === ZLinkLocationWriteStatus.Stored) {
|
|
760
804
|
this.events?.actorRowRemoved(key);
|
|
761
805
|
}
|
|
762
|
-
this.notifyIfStaleStatus(
|
|
806
|
+
this.notifyIfStaleStatus(
|
|
807
|
+
status,
|
|
808
|
+
ZLinkLocationKind.Actor,
|
|
809
|
+
ZLinkLocationKeyCodec.encodeActorKey(key)
|
|
810
|
+
);
|
|
763
811
|
return status;
|
|
764
812
|
}
|
|
765
813
|
|
|
766
|
-
async removeRoute(
|
|
814
|
+
async removeRoute(
|
|
815
|
+
key: ZLinkRouteLocationKey,
|
|
816
|
+
generation: bigint,
|
|
817
|
+
signal?: AbortSignal
|
|
818
|
+
): Promise<ZLinkLocationWriteResult> {
|
|
767
819
|
const result = await this.guardWrite(() =>
|
|
768
820
|
this.stores.routeStore.removeRoute(
|
|
769
|
-
key,
|
|
821
|
+
key,
|
|
822
|
+
{ ownerId: this.ownerId, leaseGeneration: generation },
|
|
823
|
+
signal
|
|
824
|
+
)
|
|
825
|
+
);
|
|
770
826
|
if (result.status === ZLinkLocationWriteStatus.Stored) {
|
|
771
827
|
this.events?.routeRowRemoved(key);
|
|
772
828
|
}
|
|
@@ -790,7 +846,10 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
790
846
|
this.recordFailure(errorMessage(error), 'read');
|
|
791
847
|
}
|
|
792
848
|
|
|
793
|
-
async listPeerLocations(
|
|
849
|
+
async listPeerLocations(
|
|
850
|
+
filter: ZLinkPeerLocationFilter,
|
|
851
|
+
signal?: AbortSignal
|
|
852
|
+
): Promise<readonly ZLinkPeerLocation[]> {
|
|
794
853
|
const rows = await this.stores.peerStore.listPeers(filter, signal);
|
|
795
854
|
const live = await this.filterLive(rows, (row) => row.ownerId, signal);
|
|
796
855
|
// Location Store rows may have been written before this process adopted
|
|
@@ -814,7 +873,11 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
814
873
|
page?: ZLinkPageRequest,
|
|
815
874
|
signal?: AbortSignal
|
|
816
875
|
): Promise<ZLinkLocationPage<ZLinkMeshNodeDescriptor>> {
|
|
817
|
-
const rows = await this.stores.locationStore.listMeshNodes(
|
|
876
|
+
const rows = await this.stores.locationStore.listMeshNodes(
|
|
877
|
+
meshName,
|
|
878
|
+
this.pageRequest(page),
|
|
879
|
+
signal
|
|
880
|
+
);
|
|
818
881
|
const live = await this.filterLive(rows.items, (row) => row.ownerId, signal);
|
|
819
882
|
return {
|
|
820
883
|
items: live.map((row) => ({ ...row, endpoint: normalizeEndpoint(row.endpoint) })),
|
|
@@ -827,10 +890,12 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
827
890
|
page?: ZLinkPageRequest,
|
|
828
891
|
signal?: AbortSignal
|
|
829
892
|
): Promise<ZLinkLocationPage<ZLinkSpotLocation>> {
|
|
830
|
-
const queryStore = this.stores.spotStore as ZLinkSpotLocationStore
|
|
831
|
-
|
|
893
|
+
const queryStore = this.stores.spotStore as ZLinkSpotLocationStore &
|
|
894
|
+
Partial<ZLinkSpotLocationQueryStore>;
|
|
832
895
|
if (queryStore.listSpots === undefined) {
|
|
833
|
-
throw new Error(
|
|
896
|
+
throw new Error(
|
|
897
|
+
'The configured Spot location store does not provide operational list queries.'
|
|
898
|
+
);
|
|
834
899
|
}
|
|
835
900
|
const rows = await queryStore.listSpots(filter, this.pageRequest(page), signal);
|
|
836
901
|
return {
|
|
@@ -844,10 +909,12 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
844
909
|
page?: ZLinkPageRequest,
|
|
845
910
|
signal?: AbortSignal
|
|
846
911
|
): Promise<ZLinkLocationPage<ZLinkActorLocation>> {
|
|
847
|
-
const queryStore = this.stores.actorStore as ZLinkActorLocationStore
|
|
848
|
-
|
|
912
|
+
const queryStore = this.stores.actorStore as ZLinkActorLocationStore &
|
|
913
|
+
Partial<ZLinkActorLocationQueryStore>;
|
|
849
914
|
if (queryStore.listActors === undefined) {
|
|
850
|
-
throw new Error(
|
|
915
|
+
throw new Error(
|
|
916
|
+
'The configured Actor location store does not provide operational list queries.'
|
|
917
|
+
);
|
|
851
918
|
}
|
|
852
919
|
const rows = await queryStore.listActors(filter, this.pageRequest(page), signal);
|
|
853
920
|
return {
|
|
@@ -864,9 +931,8 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
864
931
|
const normalizedPage = this.pageRequest(page);
|
|
865
932
|
const pageSize = normalizedPage.pageSize ?? this.options.listPageSize;
|
|
866
933
|
const requestedCursor = normalizedPage.continuationToken;
|
|
867
|
-
let cursor =
|
|
868
|
-
? undefined
|
|
869
|
-
: PublicAuthorityScanCursor.from(requestedCursor);
|
|
934
|
+
let cursor =
|
|
935
|
+
requestedCursor === undefined ? undefined : PublicAuthorityScanCursor.from(requestedCursor);
|
|
870
936
|
const items: ZLinkLocationObjectEntry[] = [];
|
|
871
937
|
for (;;) {
|
|
872
938
|
// Keep the Store cursor at the public page boundary. Scanning 1000 rows
|
|
@@ -878,15 +944,18 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
878
944
|
for (const entry of result.items) {
|
|
879
945
|
const identity = decodeAuthorityKey(entry.key);
|
|
880
946
|
const allocation = entry.snapshot.allocation;
|
|
881
|
-
if (
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
)
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
947
|
+
if (
|
|
948
|
+
allocation.objectKind !== filter.objectKind ||
|
|
949
|
+
(filter.stableType !== undefined && allocation.stableType !== filter.stableType) ||
|
|
950
|
+
(filter.meshName !== undefined && allocation.descriptor.meshName !== filter.meshName)
|
|
951
|
+
)
|
|
952
|
+
continue;
|
|
953
|
+
const live =
|
|
954
|
+
(await this.liveRows.resolve(
|
|
955
|
+
entry,
|
|
956
|
+
(candidate) => candidate.snapshot.ownerId,
|
|
957
|
+
signal
|
|
958
|
+
)) !== undefined;
|
|
890
959
|
items.push(this.objectLocationEntry(identity.globalId, entry.snapshot, live));
|
|
891
960
|
if (items.length >= pageSize) break;
|
|
892
961
|
}
|
|
@@ -917,8 +986,8 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
917
986
|
signal
|
|
918
987
|
);
|
|
919
988
|
if (found.kind === 'missing' || found.allocation.objectKind === 'actor') return undefined;
|
|
920
|
-
const live =
|
|
921
|
-
!== undefined;
|
|
989
|
+
const live =
|
|
990
|
+
(await this.liveRows.resolve(found, (snapshot) => snapshot.ownerId, signal)) !== undefined;
|
|
922
991
|
return this.objectLocationEntry(String(spotId), found, live);
|
|
923
992
|
}
|
|
924
993
|
|
|
@@ -932,8 +1001,8 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
932
1001
|
signal
|
|
933
1002
|
);
|
|
934
1003
|
if (found.kind === 'missing' || found.allocation.objectKind !== kind) return undefined;
|
|
935
|
-
const live =
|
|
936
|
-
!== undefined;
|
|
1004
|
+
const live =
|
|
1005
|
+
(await this.liveRows.resolve(found, (snapshot) => snapshot.ownerId, signal)) !== undefined;
|
|
937
1006
|
return this.objectLocationEntry(globalId, found, live);
|
|
938
1007
|
}
|
|
939
1008
|
|
|
@@ -948,9 +1017,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
948
1017
|
objectGeneration: snapshot.objectGeneration,
|
|
949
1018
|
meshName: allocation.descriptor.meshName,
|
|
950
1019
|
nodeRid: allocation.descriptor.rid,
|
|
951
|
-
state: allocation.state === 'reserved'
|
|
952
|
-
? 'creating'
|
|
953
|
-
: ownerLive ? 'ready' : 'unavailable',
|
|
1020
|
+
state: allocation.state === 'reserved' ? 'creating' : ownerLive ? 'ready' : 'unavailable',
|
|
954
1021
|
stableType: allocation.stableType
|
|
955
1022
|
};
|
|
956
1023
|
}
|
|
@@ -975,7 +1042,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
975
1042
|
const entries: ZLinkLocationTopologyEntry[] = [];
|
|
976
1043
|
for (const meshName of this.meshNamesOf(filter.meshName)) {
|
|
977
1044
|
for (const descriptor of await this.listAllMeshNodeDescriptors(meshName, signal)) {
|
|
978
|
-
const live = (await this.filterLive([descriptor], row => row.ownerId, signal)).length > 0;
|
|
1045
|
+
const live = (await this.filterLive([descriptor], (row) => row.ownerId, signal)).length > 0;
|
|
979
1046
|
const entry: ZLinkLocationTopologyEntry = {
|
|
980
1047
|
meshName: descriptor.meshName,
|
|
981
1048
|
nodeRid: descriptor.rid,
|
|
@@ -985,14 +1052,16 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
985
1052
|
// 않는다고 정한다. Host lifecycle의 `Draining`만 보면 relocate로 빠지는
|
|
986
1053
|
// node가 계속 accepting으로 보인다.
|
|
987
1054
|
draining:
|
|
988
|
-
descriptor.state === ZLinkFrameworkRuntimeState.Draining
|
|
989
|
-
|
|
990
|
-
|
|
1055
|
+
descriptor.state === ZLinkFrameworkRuntimeState.Draining ||
|
|
1056
|
+
descriptor.state === ZLinkFrameworkRuntimeState.Relocating ||
|
|
1057
|
+
descriptor.state === ZLinkFrameworkRuntimeState.Relocated,
|
|
991
1058
|
state: live ? ZLinkLocationTopologyState.Ready : ZLinkLocationTopologyState.Lost,
|
|
992
1059
|
updatedAt: descriptor.updatedAt
|
|
993
1060
|
};
|
|
994
|
-
if (
|
|
995
|
-
|
|
1061
|
+
if (
|
|
1062
|
+
(filter.nodeRid === undefined || entry.nodeRid === filter.nodeRid) &&
|
|
1063
|
+
(filter.state === undefined || entry.state === filter.state)
|
|
1064
|
+
) {
|
|
996
1065
|
entries.push(entry);
|
|
997
1066
|
}
|
|
998
1067
|
}
|
|
@@ -1001,9 +1070,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
1001
1070
|
}
|
|
1002
1071
|
|
|
1003
1072
|
private pageRequest(page: ZLinkPageRequest | undefined): ZLinkPageRequest {
|
|
1004
|
-
return page?.pageSize === undefined
|
|
1005
|
-
? { ...page, pageSize: this.options.listPageSize }
|
|
1006
|
-
: page;
|
|
1073
|
+
return page?.pageSize === undefined ? { ...page, pageSize: this.options.listPageSize } : page;
|
|
1007
1074
|
}
|
|
1008
1075
|
|
|
1009
1076
|
async listServiceSummaries(
|
|
@@ -1015,16 +1082,16 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
1015
1082
|
for (const meshName of this.meshNamesOf(filter.meshName)) {
|
|
1016
1083
|
const descriptors = await this.listAllMeshNodeDescriptors(meshName, signal);
|
|
1017
1084
|
if (descriptors.length === 0) continue;
|
|
1018
|
-
const live = await this.filterLive(descriptors, row => row.ownerId, signal);
|
|
1019
|
-
const liveOwners = new Set(live.map(row => row.ownerId));
|
|
1085
|
+
const live = await this.filterLive(descriptors, (row) => row.ownerId, signal);
|
|
1086
|
+
const liveOwners = new Set(live.map((row) => row.ownerId));
|
|
1020
1087
|
summaries.push({
|
|
1021
1088
|
meshName,
|
|
1022
1089
|
totalCount: descriptors.length,
|
|
1023
|
-
readyCount: descriptors.filter(row => liveOwners.has(row.ownerId)).length,
|
|
1090
|
+
readyCount: descriptors.filter((row) => liveOwners.has(row.ownerId)).length,
|
|
1024
1091
|
errorCount: 0,
|
|
1025
|
-
stoppedCount: descriptors.filter(row => !liveOwners.has(row.ownerId)).length,
|
|
1092
|
+
stoppedCount: descriptors.filter((row) => !liveOwners.has(row.ownerId)).length,
|
|
1026
1093
|
lastUpdatedAt: descriptors.reduce(
|
|
1027
|
-
(latest, row) => row.updatedAt > latest ? row.updatedAt : latest,
|
|
1094
|
+
(latest, row) => (row.updatedAt > latest ? row.updatedAt : latest),
|
|
1028
1095
|
descriptors[0].updatedAt
|
|
1029
1096
|
)
|
|
1030
1097
|
});
|
|
@@ -1054,7 +1121,10 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
1054
1121
|
return rows;
|
|
1055
1122
|
}
|
|
1056
1123
|
|
|
1057
|
-
private pageInMemory<T>(
|
|
1124
|
+
private pageInMemory<T>(
|
|
1125
|
+
entries: readonly T[],
|
|
1126
|
+
page: ZLinkPageRequest | undefined
|
|
1127
|
+
): ZLinkLocationPage<T> {
|
|
1058
1128
|
const normalized = this.pageRequest(page);
|
|
1059
1129
|
const parsedOffset = Number.parseInt(normalized.continuationToken ?? '0', 10);
|
|
1060
1130
|
const offset = Number.isFinite(parsedOffset) && parsedOffset >= 0 ? parsedOffset : 0;
|
|
@@ -1079,8 +1149,8 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
1079
1149
|
if (!this.started) {
|
|
1080
1150
|
return;
|
|
1081
1151
|
}
|
|
1082
|
-
const scheduledAt =
|
|
1083
|
-
?? this.monotonicNowMs() + this.options.ownerLeaseRenewIntervalMs;
|
|
1152
|
+
const scheduledAt =
|
|
1153
|
+
this.nextLeaseRenewAtMs ?? this.monotonicNowMs() + this.options.ownerLeaseRenewIntervalMs;
|
|
1084
1154
|
const delayMs = Math.max(0, scheduledAt - this.monotonicNowMs());
|
|
1085
1155
|
this.heartbeatTimer = this.setTimer(() => {
|
|
1086
1156
|
this.heartbeatTimer = undefined;
|
|
@@ -1089,27 +1159,33 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
1089
1159
|
this.metrics?.recordOwnerLeaseRenewLateness(lateness, scope.kind, scope.name);
|
|
1090
1160
|
}
|
|
1091
1161
|
this.nextLeaseRenewAtMs = scheduledAt + this.options.ownerLeaseRenewIntervalMs;
|
|
1092
|
-
if (
|
|
1093
|
-
|
|
1162
|
+
if (
|
|
1163
|
+
this.ownerLeaseDeadlineMs !== undefined &&
|
|
1164
|
+
this.monotonicNowMs() >= this.ownerLeaseDeadlineMs
|
|
1165
|
+
) {
|
|
1094
1166
|
this.ownerLeaseHealthy = false;
|
|
1095
1167
|
this.recordFailure('Owner lease expired before renewal completed.', 'lease_expired');
|
|
1096
1168
|
for (const handler of this.ownerLeaseRenewalFailedHandlers) handler();
|
|
1097
1169
|
}
|
|
1098
|
-
const renewal = this.renewOwnerLeaseOnce()
|
|
1099
|
-
(
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1170
|
+
const renewal = this.renewOwnerLeaseOnce()
|
|
1171
|
+
.then(
|
|
1172
|
+
() => undefined,
|
|
1173
|
+
() => undefined
|
|
1174
|
+
)
|
|
1175
|
+
.finally(() => {
|
|
1176
|
+
if (this.heartbeatRenewal === renewal) {
|
|
1177
|
+
this.heartbeatRenewal = undefined;
|
|
1178
|
+
}
|
|
1179
|
+
this.scheduleHeartbeat();
|
|
1180
|
+
});
|
|
1107
1181
|
this.heartbeatRenewal = renewal;
|
|
1108
1182
|
void renewal;
|
|
1109
1183
|
}, delayMs);
|
|
1110
1184
|
}
|
|
1111
1185
|
|
|
1112
|
-
private async guardWrite(
|
|
1186
|
+
private async guardWrite(
|
|
1187
|
+
write: () => Promise<ZLinkLocationWriteResult>
|
|
1188
|
+
): Promise<ZLinkLocationWriteResult> {
|
|
1113
1189
|
try {
|
|
1114
1190
|
return await write();
|
|
1115
1191
|
} catch (error) {
|
|
@@ -1129,8 +1205,15 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
1129
1205
|
}
|
|
1130
1206
|
}
|
|
1131
1207
|
|
|
1132
|
-
private notifyIfStale(
|
|
1133
|
-
|
|
1208
|
+
private notifyIfStale(
|
|
1209
|
+
result: ZLinkLocationWriteResult,
|
|
1210
|
+
kind: ZLinkLocationKind,
|
|
1211
|
+
key: string
|
|
1212
|
+
): void {
|
|
1213
|
+
if (
|
|
1214
|
+
result.status === ZLinkLocationWriteStatus.IgnoredStale ||
|
|
1215
|
+
result.status === ZLinkLocationWriteStatus.RejectedConflict
|
|
1216
|
+
) {
|
|
1134
1217
|
this.metrics?.recordLocationStoreError('compare_exchange');
|
|
1135
1218
|
}
|
|
1136
1219
|
if (result.status !== ZLinkLocationWriteStatus.IgnoredStale) {
|
|
@@ -1141,8 +1224,15 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
1141
1224
|
}
|
|
1142
1225
|
}
|
|
1143
1226
|
|
|
1144
|
-
private notifyIfStaleStatus(
|
|
1145
|
-
|
|
1227
|
+
private notifyIfStaleStatus(
|
|
1228
|
+
status: ZLinkLocationWriteStatus,
|
|
1229
|
+
kind: ZLinkLocationKind,
|
|
1230
|
+
key: string
|
|
1231
|
+
): void {
|
|
1232
|
+
if (
|
|
1233
|
+
status === ZLinkLocationWriteStatus.IgnoredStale ||
|
|
1234
|
+
status === ZLinkLocationWriteStatus.RejectedConflict
|
|
1235
|
+
) {
|
|
1146
1236
|
this.metrics?.recordLocationStoreError('compare_exchange');
|
|
1147
1237
|
}
|
|
1148
1238
|
if (status !== ZLinkLocationWriteStatus.IgnoredStale) {
|
|
@@ -1172,9 +1262,10 @@ async function withTimeout<T>(
|
|
|
1172
1262
|
signal?: AbortSignal
|
|
1173
1263
|
): Promise<T> {
|
|
1174
1264
|
const timeoutController = new AbortController();
|
|
1175
|
-
const operationSignal =
|
|
1176
|
-
|
|
1177
|
-
|
|
1265
|
+
const operationSignal =
|
|
1266
|
+
signal === undefined
|
|
1267
|
+
? timeoutController.signal
|
|
1268
|
+
: AbortSignal.any([signal, timeoutController.signal]);
|
|
1178
1269
|
let timeout: ReturnType<typeof setTimeout> | undefined;
|
|
1179
1270
|
let abort: (() => void) | undefined;
|
|
1180
1271
|
const deadline = new Promise<never>((_resolve, reject) => {
|
|
@@ -1185,12 +1276,13 @@ async function withTimeout<T>(
|
|
|
1185
1276
|
}, timeoutMs);
|
|
1186
1277
|
timeout.unref();
|
|
1187
1278
|
});
|
|
1188
|
-
const cancellation =
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1279
|
+
const cancellation =
|
|
1280
|
+
signal === undefined
|
|
1281
|
+
? undefined
|
|
1282
|
+
: new Promise<never>((_resolve, reject) => {
|
|
1283
|
+
abort = () => reject(signal.reason);
|
|
1284
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
1285
|
+
});
|
|
1194
1286
|
try {
|
|
1195
1287
|
signal?.throwIfAborted();
|
|
1196
1288
|
return await Promise.race(
|