@zlink-systems/framework 0.21.0 → 0.22.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/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- 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 +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- 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 +158 -124
- 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/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.js +116 -113
- 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 +10 -18
- 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 +43 -33
- 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.js +9 -7
- 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/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- 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 -23
- 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.js +136 -136
- 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-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- 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 +244 -227
- 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/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 +208 -219
- 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.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -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 +74 -85
- 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 +16 -14
- 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 +1 -2
- 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 +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- 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.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- 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 +1 -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 +0 -1
- 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 +138 -130
- 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 +5 -4
- 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 +351 -320
- 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 +73 -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 +335 -383
- 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 +40 -42
- 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 +215 -197
- 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 +11 -8
- 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/flow-context.ts +12 -3
- 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 +95 -76
- 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 -51
- 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 +312 -385
- 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 +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -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 +1 -1
- 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 +593 -563
- 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 +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -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 +230 -221
- 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 +128 -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 +11 -17
- 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 +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- 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 +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- package/src/runtime/workers/index.ts +68 -29
|
@@ -91,13 +91,12 @@ class RawServiceMeshRuntime {
|
|
|
91
91
|
router = host.createRouter();
|
|
92
92
|
const receiveFlowRouter = router;
|
|
93
93
|
router.setRoutingId(this.descriptor.nodeRoutingId);
|
|
94
|
-
this.applicationJobQueue.registerReceiveFlowTarget?.(router, state => receiveFlowRouter.setReceiveFlowState(state), this.onReceiveFlowConfigFailure);
|
|
94
|
+
this.applicationJobQueue.registerReceiveFlowTarget?.(router, (state) => receiveFlowRouter.setReceiveFlowState(state), this.onReceiveFlowConfigFailure);
|
|
95
95
|
router.bind(this.descriptor.advertisedEndpoint);
|
|
96
96
|
const boundEndpoint = router.localEndpoint();
|
|
97
97
|
const next = {
|
|
98
98
|
...this.descriptor,
|
|
99
|
-
advertisedEndpoint: this.resolveAdvertisedEndpoint?.(boundEndpoint)
|
|
100
|
-
?? boundEndpoint,
|
|
99
|
+
advertisedEndpoint: this.resolveAdvertisedEndpoint?.(boundEndpoint) ?? boundEndpoint,
|
|
101
100
|
descriptorRevision: this.descriptor.descriptorRevision + 1n,
|
|
102
101
|
state: 'serving'
|
|
103
102
|
};
|
|
@@ -152,20 +151,16 @@ class RawServiceMeshRuntime {
|
|
|
152
151
|
disconnectPeer(endpoint, nodeRoutingId, lifecycleGeneration) {
|
|
153
152
|
const current = this.topology.peer(nodeRoutingId);
|
|
154
153
|
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
155
|
-
if (lifecycleGeneration !== undefined
|
|
156
|
-
&& (
|
|
154
|
+
if (lifecycleGeneration !== undefined &&
|
|
157
155
|
// Discovery has already fenced this RID to a replacement process.
|
|
158
156
|
// The old auto-connect intent must not use disconnectRid here: that
|
|
159
157
|
// is RID-wide and can close the provisional replacement before its
|
|
160
158
|
// Hello/admission promotes it. admitPeer owns exact old-pair teardown
|
|
161
159
|
// after the replacement descriptor is accepted.
|
|
162
|
-
(expected?.lifecycleGeneration !== undefined
|
|
163
|
-
|
|
164
|
-
||
|
|
165
|
-
|
|
166
|
-
&& current.descriptor.lifecycleGeneration !== lifecycleGeneration)
|
|
167
|
-
|| (current === undefined
|
|
168
|
-
&& expected?.lifecycleGeneration !== lifecycleGeneration))) {
|
|
160
|
+
((expected?.lifecycleGeneration !== undefined &&
|
|
161
|
+
expected.lifecycleGeneration !== lifecycleGeneration) ||
|
|
162
|
+
(current !== undefined && current.descriptor.lifecycleGeneration !== lifecycleGeneration) ||
|
|
163
|
+
(current === undefined && expected?.lifecycleGeneration !== lifecycleGeneration))) {
|
|
169
164
|
return;
|
|
170
165
|
}
|
|
171
166
|
try {
|
|
@@ -185,9 +180,9 @@ class RawServiceMeshRuntime {
|
|
|
185
180
|
if (current !== undefined)
|
|
186
181
|
this.removePeer(current);
|
|
187
182
|
this.topology.forgetNotRequired(nodeRoutingId);
|
|
188
|
-
if (lifecycleGeneration === undefined
|
|
189
|
-
|
|
190
|
-
|
|
183
|
+
if (lifecycleGeneration === undefined ||
|
|
184
|
+
expected?.lifecycleGeneration === undefined ||
|
|
185
|
+
expected.lifecycleGeneration === lifecycleGeneration) {
|
|
191
186
|
this.expectedPeers.delete(nodeRoutingId);
|
|
192
187
|
}
|
|
193
188
|
this.notifyPeerConnectionIntentRemoved(nodeRoutingId);
|
|
@@ -222,7 +217,9 @@ class RawServiceMeshRuntime {
|
|
|
222
217
|
}
|
|
223
218
|
observePeerConnectionIntentRemoved(listener) {
|
|
224
219
|
this.peerConnectionIntentRemoved.add(listener);
|
|
225
|
-
return () => {
|
|
220
|
+
return () => {
|
|
221
|
+
this.peerConnectionIntentRemoved.delete(listener);
|
|
222
|
+
};
|
|
226
223
|
}
|
|
227
224
|
notifyPeerConnectionIntentRemoved(nodeRoutingId) {
|
|
228
225
|
// Only the logical owner's removal publishes lifecycle termination.
|
|
@@ -235,18 +232,19 @@ class RawServiceMeshRuntime {
|
|
|
235
232
|
async announcePeer(nodeRoutingId) {
|
|
236
233
|
if (!this.expectedPeers.has(nodeRoutingId) || this.peerAdmissionSealed?.() === true)
|
|
237
234
|
return false;
|
|
238
|
-
return this.send(nodeRoutingId, [
|
|
235
|
+
return this.send(nodeRoutingId, [
|
|
236
|
+
(0, service_wire_m6a_codec_1.encodeRouteMeshAdmission)(service_wire_m6a_codec_1.M6aServiceWireCommand.hello, this.topology.localDescriptor())
|
|
237
|
+
]);
|
|
239
238
|
}
|
|
240
239
|
isPeerRouteReady(nodeRoutingId, lifecycleGeneration) {
|
|
241
240
|
const peer = this.topology.peer(nodeRoutingId);
|
|
242
241
|
const monitorConnection = this.monitorConnectionStates.get(nodeRoutingId);
|
|
243
|
-
const applicationRouteReady = monitorConnection === undefined
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
&& this.liveness.isReady(nodeRoutingId, peer.connectionId);
|
|
242
|
+
const applicationRouteReady = monitorConnection === undefined || monitorConnection === peer?.connectionId;
|
|
243
|
+
const ready = peer !== undefined &&
|
|
244
|
+
(lifecycleGeneration === undefined ||
|
|
245
|
+
peer.descriptor.lifecycleGeneration === lifecycleGeneration) &&
|
|
246
|
+
applicationRouteReady &&
|
|
247
|
+
this.liveness.isReady(nodeRoutingId, peer.connectionId);
|
|
250
248
|
return ready;
|
|
251
249
|
}
|
|
252
250
|
async announceExpectedPeers() {
|
|
@@ -267,10 +265,10 @@ class RawServiceMeshRuntime {
|
|
|
267
265
|
async updateLocalDescriptor(options) {
|
|
268
266
|
const current = this.topology.localDescriptor();
|
|
269
267
|
const channels = options.state === 'draining'
|
|
270
|
-
? current.channels.map(channel => ({ ...channel, weight: 0 }))
|
|
268
|
+
? current.channels.map((channel) => ({ ...channel, weight: 0 }))
|
|
271
269
|
: options.channelName === undefined
|
|
272
270
|
? current.channels
|
|
273
|
-
: current.channels.map(channel => channel.name === options.channelName
|
|
271
|
+
: current.channels.map((channel) => channel.name === options.channelName
|
|
274
272
|
? { ...channel, weight: options.channelWeight }
|
|
275
273
|
: channel);
|
|
276
274
|
const next = {
|
|
@@ -305,7 +303,7 @@ class RawServiceMeshRuntime {
|
|
|
305
303
|
return this.send(targetNodeRoutingId, [(0, service_wire_m6a_codec_1.encodeNodeSendHeader)(), this.applicationFrame(payload)]);
|
|
306
304
|
}
|
|
307
305
|
async sendToChannel(channelName, payload) {
|
|
308
|
-
const selected = this.topology.selectChannel(channelName, peer => this.isLocalOrReadyPeer(peer.descriptor.nodeRoutingId));
|
|
306
|
+
const selected = this.topology.selectChannel(channelName, (peer) => this.isLocalOrReadyPeer(peer.descriptor.nodeRoutingId));
|
|
309
307
|
if (selected === undefined)
|
|
310
308
|
return false;
|
|
311
309
|
const applicationFrame = this.applicationFrame(payload);
|
|
@@ -337,14 +335,13 @@ class RawServiceMeshRuntime {
|
|
|
337
335
|
return this.requestToTarget(targetNodeRoutingId, payload, timeoutMs);
|
|
338
336
|
}
|
|
339
337
|
requestToChannel(channelName, payload, timeoutMs) {
|
|
340
|
-
const selected = this.topology.selectChannel(channelName, peer => this.isLocalOrReadyPeer(peer.descriptor.nodeRoutingId));
|
|
338
|
+
const selected = this.topology.selectChannel(channelName, (peer) => this.isLocalOrReadyPeer(peer.descriptor.nodeRoutingId));
|
|
341
339
|
return selected === undefined
|
|
342
340
|
? undefined
|
|
343
341
|
: this.requestToTarget(selected.descriptor.nodeRoutingId, payload, timeoutMs, channelName);
|
|
344
342
|
}
|
|
345
343
|
isLocalOrReadyPeer(nodeRoutingId) {
|
|
346
|
-
return nodeRoutingId === this.descriptor.nodeRoutingId
|
|
347
|
-
|| this.isPeerRouteReady(nodeRoutingId);
|
|
344
|
+
return nodeRoutingId === this.descriptor.nodeRoutingId || this.isPeerRouteReady(nodeRoutingId);
|
|
348
345
|
}
|
|
349
346
|
setServiceIngress(handler) {
|
|
350
347
|
if (this.serviceIngress !== undefined && this.serviceIngress !== handler) {
|
|
@@ -400,7 +397,9 @@ class RawServiceMeshRuntime {
|
|
|
400
397
|
const startedAtMs = performance.now();
|
|
401
398
|
let messages = 0;
|
|
402
399
|
let bytes = 0;
|
|
403
|
-
const observe = (_source, byteCount) => {
|
|
400
|
+
const observe = (_source, byteCount) => {
|
|
401
|
+
bytes += byteCount;
|
|
402
|
+
};
|
|
404
403
|
while (receiveReady && messages < 64 && !this.closed) {
|
|
405
404
|
const result = await this.receiveOne(performance.now(), observe);
|
|
406
405
|
if (result === 'noData') {
|
|
@@ -460,13 +459,13 @@ class RawServiceMeshRuntime {
|
|
|
460
459
|
}
|
|
461
460
|
}
|
|
462
461
|
pullMonitorEvents() {
|
|
463
|
-
this.monitor?.drain(event => {
|
|
462
|
+
this.monitor?.drain((event) => {
|
|
464
463
|
this.observeMonitorEvent(event);
|
|
465
464
|
if (this.monitorEvents.length < MAX_PENDING_MONITOR_EVENTS) {
|
|
466
465
|
this.monitorEvents.push(event);
|
|
467
466
|
return;
|
|
468
467
|
}
|
|
469
|
-
const existingIndex = this.monitorEvents.findIndex(candidate => sameMonitorConnection(candidate, event));
|
|
468
|
+
const existingIndex = this.monitorEvents.findIndex((candidate) => sameMonitorConnection(candidate, event));
|
|
470
469
|
if (existingIndex >= 0)
|
|
471
470
|
this.monitorEvents[existingIndex] = event;
|
|
472
471
|
else {
|
|
@@ -497,7 +496,9 @@ class RawServiceMeshRuntime {
|
|
|
497
496
|
: undefined;
|
|
498
497
|
if (correlation === undefined)
|
|
499
498
|
return false;
|
|
500
|
-
const reply = [
|
|
499
|
+
const reply = [
|
|
500
|
+
(0, service_wire_m6a_codec_1.encodeReplyHeader)(correlation, runtime_values_1.RequestResult.ProtocolError, service_wire_constants_generated_1.ServiceWireFrameworkErrorCode.requestProtocolError)
|
|
501
|
+
];
|
|
501
502
|
if (received.reply === undefined)
|
|
502
503
|
return false;
|
|
503
504
|
received.reply(reply);
|
|
@@ -510,12 +511,13 @@ class RawServiceMeshRuntime {
|
|
|
510
511
|
}
|
|
511
512
|
}
|
|
512
513
|
async processReceived(received, nowMs, applicationJobOwner) {
|
|
513
|
-
if (received.parts.length === 0
|
|
514
|
-
|
|
515
|
-
&& received.parts[0].byteLength === 0)) {
|
|
514
|
+
if (received.parts.length === 0 ||
|
|
515
|
+
(received.parts.length === 1 && received.parts[0].byteLength === 0)) {
|
|
516
516
|
if (this.peerAdmissionSealed?.() === true)
|
|
517
517
|
return 'dropped';
|
|
518
|
-
return await this.send(received.sourceRid, [
|
|
518
|
+
return (await this.send(received.sourceRid, [
|
|
519
|
+
(0, service_wire_m6a_codec_1.encodeRouteMeshAdmission)(service_wire_m6a_codec_1.M6aServiceWireCommand.hello, this.topology.localDescriptor())
|
|
520
|
+
]))
|
|
519
521
|
? 'infrastructure'
|
|
520
522
|
: 'dropped';
|
|
521
523
|
}
|
|
@@ -524,16 +526,16 @@ class RawServiceMeshRuntime {
|
|
|
524
526
|
if (header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.hello && this.peerAdmissionSealed?.() === true) {
|
|
525
527
|
return 'dropped';
|
|
526
528
|
}
|
|
527
|
-
if (header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.hello
|
|
528
|
-
|
|
529
|
-
|
|
529
|
+
if (header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.hello ||
|
|
530
|
+
header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.admit ||
|
|
531
|
+
header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.update) {
|
|
530
532
|
if (received.parts.length !== 1)
|
|
531
533
|
return 'protocolError';
|
|
532
534
|
const descriptor = (0, service_wire_m6a_codec_1.decodeRouteMeshAdmission)(received.parts[0], header.command, received.sourceRid);
|
|
533
535
|
const expected = this.expectedPeers.get(received.sourceRid);
|
|
534
|
-
if (expected !== undefined
|
|
535
|
-
|
|
536
|
-
|
|
536
|
+
if (expected !== undefined &&
|
|
537
|
+
(expected.meshName !== descriptor.meshName ||
|
|
538
|
+
expected.nodeRoutingId !== descriptor.nodeRoutingId)) {
|
|
537
539
|
await this.send(received.sourceRid, [(0, service_wire_m6a_codec_1.encodeReject)(3)]);
|
|
538
540
|
return 'infrastructure';
|
|
539
541
|
}
|
|
@@ -543,8 +545,8 @@ class RawServiceMeshRuntime {
|
|
|
543
545
|
const detail = result === 'invalidDescriptor'
|
|
544
546
|
? describeInvalidAdmissionDescriptor(descriptor, expected, this.topology.peer(descriptor.nodeRoutingId)?.descriptor)
|
|
545
547
|
: undefined;
|
|
546
|
-
console.warn(`RouteMesh admission rejected peer '${received.sourceRid}' as ${result}`
|
|
547
|
-
|
|
548
|
+
console.warn(`RouteMesh admission rejected peer '${received.sourceRid}' as ${result}` +
|
|
549
|
+
(detail === undefined ? '.' : ` (${detail}).`));
|
|
548
550
|
await this.send(received.sourceRid, [(0, service_wire_m6a_codec_1.encodeReject)(admissionReason(result))]);
|
|
549
551
|
return 'infrastructure';
|
|
550
552
|
}
|
|
@@ -554,7 +556,9 @@ class RawServiceMeshRuntime {
|
|
|
554
556
|
// Hello supplies only the sender's descriptor. Even NotRequired
|
|
555
557
|
// peers must receive ours before the intent owner closes transport;
|
|
556
558
|
// submitting a response does not guarantee delivery before close.
|
|
557
|
-
await this.send(received.sourceRid, [
|
|
559
|
+
await this.send(received.sourceRid, [
|
|
560
|
+
(0, service_wire_m6a_codec_1.encodeRouteMeshAdmission)(service_wire_m6a_codec_1.M6aServiceWireCommand.admit, this.topology.localDescriptor())
|
|
561
|
+
]);
|
|
558
562
|
}
|
|
559
563
|
else if (result === 'notRequired') {
|
|
560
564
|
this.retireNotRequiredExpectedPeer(received.sourceRid, descriptor.advertisedEndpoint);
|
|
@@ -588,17 +592,20 @@ class RawServiceMeshRuntime {
|
|
|
588
592
|
const peer = this.topology.peer(received.sourceRid);
|
|
589
593
|
if (peer === undefined)
|
|
590
594
|
return 'protocolError';
|
|
591
|
-
if (header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.livenessProbe
|
|
592
|
-
|
|
595
|
+
if (header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.livenessProbe ||
|
|
596
|
+
header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.livenessAck) {
|
|
593
597
|
if (received.parts.length !== 1)
|
|
594
598
|
return 'protocolError';
|
|
595
599
|
const record = livenessCodec.decodeLivenessRecord(received.parts[0]);
|
|
596
600
|
if (record.command === service_wire_m6a_codec_1.M6aServiceWireCommand.livenessProbe) {
|
|
597
601
|
const ack = this.liveness.acknowledgeProbe(received.sourceRid, peer.connectionId, record.probeId);
|
|
598
|
-
const sent = ack !== undefined &&
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
+
const sent = ack !== undefined &&
|
|
603
|
+
(await this.send(received.sourceRid, [
|
|
604
|
+
livenessCodec.encodeLivenessRecord({
|
|
605
|
+
command: service_wire_m6a_codec_1.M6aServiceWireCommand.livenessAck,
|
|
606
|
+
probeId: record.probeId
|
|
607
|
+
})
|
|
608
|
+
]));
|
|
602
609
|
if (!sent) {
|
|
603
610
|
return 'protocolError';
|
|
604
611
|
}
|
|
@@ -621,7 +628,7 @@ class RawServiceMeshRuntime {
|
|
|
621
628
|
});
|
|
622
629
|
if (stateful !== undefined)
|
|
623
630
|
return stateful;
|
|
624
|
-
if (header.flags === 0
|
|
631
|
+
if (header.flags === 0 &&
|
|
625
632
|
// A bare infrastructure control is normally exactly one frame, but a
|
|
626
633
|
// relocation Prepare now rides its bound-session journal as
|
|
627
634
|
// node-internal ZLNI frames trailing the canonical command frame
|
|
@@ -633,8 +640,8 @@ class RawServiceMeshRuntime {
|
|
|
633
640
|
// protocolError (surfaced downstream as `invalid_frame`, stalling
|
|
634
641
|
// the source's Prepare resend loop past the relocation admission
|
|
635
642
|
// budget).
|
|
636
|
-
|
|
637
|
-
|
|
643
|
+
received.parts.length >= 1 &&
|
|
644
|
+
isBareInfrastructureControl(header.command)) {
|
|
638
645
|
const accepted = this.mailbox.tryEnqueue({
|
|
639
646
|
owner: `node:${this.descriptor.nodeRoutingId}`,
|
|
640
647
|
domain: 'infrastructure',
|
|
@@ -646,9 +653,9 @@ class RawServiceMeshRuntime {
|
|
|
646
653
|
});
|
|
647
654
|
return accepted ? 'infrastructure' : 'dropped';
|
|
648
655
|
}
|
|
649
|
-
if (header.flags !== 0
|
|
650
|
-
|
|
651
|
-
|
|
656
|
+
if (header.flags !== 0 ||
|
|
657
|
+
received.parts.length !== 2 ||
|
|
658
|
+
![
|
|
652
659
|
service_wire_m6a_codec_1.M6aServiceWireCommand.nodeSend,
|
|
653
660
|
service_wire_m6a_codec_1.M6aServiceWireCommand.nodeRequest,
|
|
654
661
|
service_wire_m6a_codec_1.M6aServiceWireCommand.channelSend,
|
|
@@ -694,9 +701,7 @@ class RawServiceMeshRuntime {
|
|
|
694
701
|
sourceRoute: received.sourceRoute,
|
|
695
702
|
requestSequence: received.requestSeq,
|
|
696
703
|
...(received.reply === undefined ? {} : { reply: received.reply })
|
|
697
|
-
}, [
|
|
698
|
-
(0, service_wire_m6a_codec_1.encodeReplyHeader)(correlation, runtime_values_1.RequestResult.NotConnected, 0)
|
|
699
|
-
]);
|
|
704
|
+
}, [(0, service_wire_m6a_codec_1.encodeReplyHeader)(correlation, runtime_values_1.RequestResult.NotConnected, 0)]);
|
|
700
705
|
return 'infrastructure';
|
|
701
706
|
}
|
|
702
707
|
return 'dropped';
|
|
@@ -711,10 +716,12 @@ class RawServiceMeshRuntime {
|
|
|
711
716
|
const result = this.liveness.tick(nowMs);
|
|
712
717
|
this.requireStarted();
|
|
713
718
|
for (const probe of result.probes) {
|
|
714
|
-
await this.send(probe.nodeRoutingId, [
|
|
719
|
+
await this.send(probe.nodeRoutingId, [
|
|
720
|
+
livenessCodec.encodeLivenessRecord({
|
|
715
721
|
command: service_wire_m6a_codec_1.M6aServiceWireCommand.livenessProbe,
|
|
716
722
|
probeId: probe.probeId
|
|
717
|
-
})
|
|
723
|
+
})
|
|
724
|
+
]);
|
|
718
725
|
}
|
|
719
726
|
for (const nodeRoutingId of result.timedOutNodes) {
|
|
720
727
|
const peer = this.topology.peer(nodeRoutingId);
|
|
@@ -739,13 +746,13 @@ class RawServiceMeshRuntime {
|
|
|
739
746
|
this.monitorEvents.length = 0;
|
|
740
747
|
for (const event of events) {
|
|
741
748
|
handled++;
|
|
742
|
-
const nodeRoutingId = event.routingId
|
|
743
|
-
?? this.expectedPeerRoutingId(event.remoteAddress);
|
|
749
|
+
const nodeRoutingId = event.routingId ?? this.expectedPeerRoutingId(event.remoteAddress);
|
|
744
750
|
if (event.event === MONITOR_CONNECTION_READY && isConnectionReadyEdge(event)) {
|
|
745
751
|
if (nodeRoutingId === undefined) {
|
|
746
752
|
const candidate = this.createUnresolvedConnectionCandidate(event);
|
|
747
|
-
const alreadyQueued = this.unresolvedConnectionCandidates.some(value => value.connectionId === candidate.connectionId);
|
|
748
|
-
if (!alreadyQueued &&
|
|
753
|
+
const alreadyQueued = this.unresolvedConnectionCandidates.some((value) => value.connectionId === candidate.connectionId);
|
|
754
|
+
if (!alreadyQueued &&
|
|
755
|
+
this.unresolvedConnectionCandidates.length < MAX_UNRESOLVED_CONNECTION_CANDIDATES) {
|
|
749
756
|
this.unresolvedConnectionCandidates.push(candidate);
|
|
750
757
|
}
|
|
751
758
|
continue;
|
|
@@ -762,7 +769,8 @@ class RawServiceMeshRuntime {
|
|
|
762
769
|
if (existingPeer !== undefined) {
|
|
763
770
|
if (this.liveness.isReady(nodeRoutingId, existingPeer.connectionId)) {
|
|
764
771
|
const existingCandidate = this.connectionCandidates
|
|
765
|
-
.get(nodeRoutingId)
|
|
772
|
+
.get(nodeRoutingId)
|
|
773
|
+
?.get(existingPeer.connectionId);
|
|
766
774
|
if (this.isDiscoveredLifecycleReplacement(existingPeer, nodeRoutingId)) {
|
|
767
775
|
// A current discovery descriptor with the same RID but a
|
|
768
776
|
// different lifecycle token denotes a replacement process.
|
|
@@ -816,8 +824,7 @@ class RawServiceMeshRuntime {
|
|
|
816
824
|
this.connectionIds.set(nodeRoutingId, candidate.connectionId);
|
|
817
825
|
await this.announcePeer(nodeRoutingId);
|
|
818
826
|
}
|
|
819
|
-
else if (event.event === MONITOR_DISCONNECTED
|
|
820
|
-
&& nodeRoutingId !== undefined) {
|
|
827
|
+
else if (event.event === MONITOR_DISCONNECTED && nodeRoutingId !== undefined) {
|
|
821
828
|
const peer = this.topology.peer(nodeRoutingId);
|
|
822
829
|
const disconnectedId = monitorConnectionId(event, nodeRoutingId);
|
|
823
830
|
this.removeConnectionCandidate(nodeRoutingId, disconnectedId);
|
|
@@ -827,7 +834,7 @@ class RawServiceMeshRuntime {
|
|
|
827
834
|
}
|
|
828
835
|
else if (event.event === MONITOR_DISCONNECTED) {
|
|
829
836
|
const disconnectedId = monitorConnectionId(event);
|
|
830
|
-
const index = this.unresolvedConnectionCandidates.findIndex(candidate => candidate.connectionId === disconnectedId);
|
|
837
|
+
const index = this.unresolvedConnectionCandidates.findIndex((candidate) => candidate.connectionId === disconnectedId);
|
|
831
838
|
if (index >= 0)
|
|
832
839
|
this.unresolvedConnectionCandidates.splice(index, 1);
|
|
833
840
|
}
|
|
@@ -864,8 +871,8 @@ class RawServiceMeshRuntime {
|
|
|
864
871
|
const encodedPayload = this.applicationFrame(payload);
|
|
865
872
|
const pending = this.operations.register(timeoutMs);
|
|
866
873
|
let selectedTargetNodeRoutingId = targetNodeRoutingId;
|
|
867
|
-
if (selectedTargetNodeRoutingId !== this.descriptor.nodeRoutingId
|
|
868
|
-
|
|
874
|
+
if (selectedTargetNodeRoutingId !== this.descriptor.nodeRoutingId &&
|
|
875
|
+
!this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
|
|
869
876
|
// Channel selection happens before native admission. If that selection
|
|
870
877
|
// becomes stale during a peer drain, choose another ready channel peer
|
|
871
878
|
// while no request has been submitted yet. Reusing the same pending
|
|
@@ -874,16 +881,15 @@ class RawServiceMeshRuntime {
|
|
|
874
881
|
if (channelName !== undefined) {
|
|
875
882
|
const excludedTargets = new Set([selectedTargetNodeRoutingId]);
|
|
876
883
|
for (;;) {
|
|
877
|
-
const alternate = this.topology.selectChannel(channelName, peer => {
|
|
884
|
+
const alternate = this.topology.selectChannel(channelName, (peer) => {
|
|
878
885
|
const candidate = peer.descriptor.nodeRoutingId;
|
|
879
|
-
return !excludedTargets.has(candidate)
|
|
880
|
-
&& this.isLocalOrReadyPeer(candidate);
|
|
886
|
+
return !excludedTargets.has(candidate) && this.isLocalOrReadyPeer(candidate);
|
|
881
887
|
});
|
|
882
888
|
if (alternate === undefined)
|
|
883
889
|
break;
|
|
884
890
|
selectedTargetNodeRoutingId = alternate.descriptor.nodeRoutingId;
|
|
885
|
-
if (selectedTargetNodeRoutingId === this.descriptor.nodeRoutingId
|
|
886
|
-
|
|
891
|
+
if (selectedTargetNodeRoutingId === this.descriptor.nodeRoutingId ||
|
|
892
|
+
this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
|
|
887
893
|
break;
|
|
888
894
|
}
|
|
889
895
|
excludedTargets.add(selectedTargetNodeRoutingId);
|
|
@@ -930,7 +936,7 @@ class RawServiceMeshRuntime {
|
|
|
930
936
|
finally {
|
|
931
937
|
applicationJobOwner.close();
|
|
932
938
|
}
|
|
933
|
-
})().catch(error => this.operations.fail(pending.id, error));
|
|
939
|
+
})().catch((error) => this.operations.fail(pending.id, error));
|
|
934
940
|
return pending;
|
|
935
941
|
}
|
|
936
942
|
if (!this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
|
|
@@ -938,12 +944,10 @@ class RawServiceMeshRuntime {
|
|
|
938
944
|
// topology has never observed. A known peer without a usable route is
|
|
939
945
|
// a Framework NotConnected result; an unknown RID is completed locally
|
|
940
946
|
// as RequestTargetNotFound without submitting an application frame.
|
|
941
|
-
const knownTarget = this.topology.peer(selectedTargetNodeRoutingId) !== undefined
|
|
942
|
-
|
|
947
|
+
const knownTarget = this.topology.peer(selectedTargetNodeRoutingId) !== undefined ||
|
|
948
|
+
this.topology.knownDescriptor(selectedTargetNodeRoutingId) !== undefined;
|
|
943
949
|
this.operations.complete(pending.id, {
|
|
944
|
-
terminalResult: knownTarget
|
|
945
|
-
? runtime_values_1.RequestResult.NotConnected
|
|
946
|
-
: runtime_values_1.RequestResult.NotFound,
|
|
950
|
+
terminalResult: knownTarget ? runtime_values_1.RequestResult.NotConnected : runtime_values_1.RequestResult.NotFound,
|
|
947
951
|
failureCode: knownTarget ? 0 : REQUEST_TARGET_NOT_FOUND_FAILURE_CODE
|
|
948
952
|
});
|
|
949
953
|
return pending;
|
|
@@ -959,7 +963,7 @@ class RawServiceMeshRuntime {
|
|
|
959
963
|
this.operations.fail(pending.id, error);
|
|
960
964
|
return pending;
|
|
961
965
|
}
|
|
962
|
-
void request.then(replyParts => {
|
|
966
|
+
void request.then((replyParts) => {
|
|
963
967
|
try {
|
|
964
968
|
if (replyParts.length < 1 || replyParts.length > 2) {
|
|
965
969
|
throw new service_wire_m6a_codec_1.ServiceWireProtocolError('Invalid reply parts.');
|
|
@@ -987,7 +991,7 @@ class RawServiceMeshRuntime {
|
|
|
987
991
|
catch (error) {
|
|
988
992
|
this.operations.fail(pending.id, error);
|
|
989
993
|
}
|
|
990
|
-
}, error => {
|
|
994
|
+
}, (error) => {
|
|
991
995
|
this.operations.fail(pending.id, error);
|
|
992
996
|
});
|
|
993
997
|
return pending;
|
|
@@ -1004,11 +1008,11 @@ class RawServiceMeshRuntime {
|
|
|
1004
1008
|
}
|
|
1005
1009
|
admitPeer(descriptor, connection, nowMs, expected) {
|
|
1006
1010
|
const previous = this.topology.peer(descriptor.nodeRoutingId);
|
|
1007
|
-
if (previous !== undefined
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1011
|
+
if (previous !== undefined &&
|
|
1012
|
+
previous.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration &&
|
|
1013
|
+
(descriptor.descriptorRevision < previous.descriptor.descriptorRevision ||
|
|
1014
|
+
(descriptor.descriptorRevision === previous.descriptor.descriptorRevision &&
|
|
1015
|
+
!(0, service_topology_registry_1.sameServiceNodeDescriptor)(previous.descriptor, descriptor)))) {
|
|
1012
1016
|
throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`RouteMesh peer '${descriptor.nodeRoutingId}' descriptor revision is stale or conflicting.`);
|
|
1013
1017
|
}
|
|
1014
1018
|
const result = this.topology.admit(descriptor, connection.connectionId, expected, connection.discriminator);
|
|
@@ -1019,7 +1023,8 @@ class RawServiceMeshRuntime {
|
|
|
1019
1023
|
this.monitorConnectionStates.set(descriptor.nodeRoutingId, connection.connectionId);
|
|
1020
1024
|
if (previous !== undefined && previous.connectionId !== connection.connectionId) {
|
|
1021
1025
|
const previousCandidate = this.connectionCandidates
|
|
1022
|
-
.get(descriptor.nodeRoutingId)
|
|
1026
|
+
.get(descriptor.nodeRoutingId)
|
|
1027
|
+
?.get(previous.connectionId);
|
|
1023
1028
|
if (previousCandidate !== undefined) {
|
|
1024
1029
|
this.removeConnectionCandidate(descriptor.nodeRoutingId, previousCandidate.connectionId);
|
|
1025
1030
|
}
|
|
@@ -1106,8 +1111,8 @@ class RawServiceMeshRuntime {
|
|
|
1106
1111
|
createUnresolvedConnectionCandidate(event) {
|
|
1107
1112
|
const connectionId = monitorConnectionId(event);
|
|
1108
1113
|
const local = this.topology.localDescriptor();
|
|
1109
|
-
const direction = this.endpointOnlyPeers.has(event.remoteAddress)
|
|
1110
|
-
|
|
1114
|
+
const direction = this.endpointOnlyPeers.has(event.remoteAddress) ||
|
|
1115
|
+
this.expectedPeerRoutingId(event.remoteAddress) !== undefined
|
|
1111
1116
|
? 'outbound'
|
|
1112
1117
|
: event.localAddress === local.advertisedEndpoint
|
|
1113
1118
|
? 'inbound'
|
|
@@ -1123,21 +1128,18 @@ class RawServiceMeshRuntime {
|
|
|
1123
1128
|
promoteUnresolvedConnectionCandidate(nodeRoutingId, advertisedEndpoint) {
|
|
1124
1129
|
const relevant = this.unresolvedConnectionCandidates
|
|
1125
1130
|
.map((candidate, index) => ({ candidate, index }))
|
|
1126
|
-
.filter(({ candidate }) => candidate.remoteAddress === advertisedEndpoint
|
|
1127
|
-
|| candidate.direction === 'inbound');
|
|
1131
|
+
.filter(({ candidate }) => candidate.remoteAddress === advertisedEndpoint || candidate.direction === 'inbound');
|
|
1128
1132
|
if (relevant.length === 0)
|
|
1129
1133
|
return undefined;
|
|
1130
|
-
const directions = new Set(relevant.map(value => value.candidate.direction));
|
|
1134
|
+
const directions = new Set(relevant.map((value) => value.candidate.direction));
|
|
1131
1135
|
const localRid = this.topology.localDescriptor().nodeRoutingId;
|
|
1132
1136
|
const preferredDirection = directions.has('inbound') && directions.has('outbound')
|
|
1133
1137
|
? localRid.localeCompare(nodeRoutingId) <= 0
|
|
1134
1138
|
? 'outbound'
|
|
1135
1139
|
: 'inbound'
|
|
1136
1140
|
: relevant.at(-1).candidate.direction;
|
|
1137
|
-
const selected = [...relevant]
|
|
1138
|
-
.
|
|
1139
|
-
.find(value => value.candidate.direction === preferredDirection)
|
|
1140
|
-
?? relevant.at(-1);
|
|
1141
|
+
const selected = [...relevant].reverse().find((value) => value.candidate.direction === preferredDirection) ??
|
|
1142
|
+
relevant.at(-1);
|
|
1141
1143
|
this.unresolvedConnectionCandidates.splice(selected.index, 1);
|
|
1142
1144
|
const initiator = selected.candidate.direction === 'outbound'
|
|
1143
1145
|
? localRid
|
|
@@ -1173,10 +1175,10 @@ class RawServiceMeshRuntime {
|
|
|
1173
1175
|
// A same-RID replacement is permitted only from a complete discovery
|
|
1174
1176
|
// fence. Manual/endpoint-only intent has no authority to replace a ready
|
|
1175
1177
|
// peer, and lifecycle generations are opaque equality tokens.
|
|
1176
|
-
return expected?.endpoint !== undefined
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1178
|
+
return (expected?.endpoint !== undefined &&
|
|
1179
|
+
expected.securityIdentity !== undefined &&
|
|
1180
|
+
expected.lifecycleGeneration !== undefined &&
|
|
1181
|
+
admitted.descriptor.lifecycleGeneration !== expected.lifecycleGeneration);
|
|
1180
1182
|
}
|
|
1181
1183
|
expectedPeerRoutingId(endpoint) {
|
|
1182
1184
|
for (const [nodeRoutingId, expected] of this.expectedPeers) {
|
|
@@ -1193,14 +1195,14 @@ class RawServiceMeshRuntime {
|
|
|
1193
1195
|
if (event.routingId === nodeRoutingId)
|
|
1194
1196
|
return true;
|
|
1195
1197
|
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
1196
|
-
return expected === undefined ||
|
|
1197
|
-
|
|
1198
|
+
return (expected === undefined ||
|
|
1199
|
+
expected.endpoint === undefined ||
|
|
1200
|
+
expected.endpoint === event.remoteAddress);
|
|
1198
1201
|
}
|
|
1199
1202
|
retireNotRequiredExpectedPeer(nodeRoutingId, advertisedEndpoint) {
|
|
1200
1203
|
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
1201
|
-
const endpoint = expected?.endpoint
|
|
1202
|
-
|
|
1203
|
-
&& this.endpointOnlyPeers.has(advertisedEndpoint)
|
|
1204
|
+
const endpoint = expected?.endpoint ??
|
|
1205
|
+
(advertisedEndpoint !== undefined && this.endpointOnlyPeers.has(advertisedEndpoint)
|
|
1204
1206
|
? advertisedEndpoint
|
|
1205
1207
|
: undefined);
|
|
1206
1208
|
if (endpoint !== undefined) {
|
|
@@ -1235,8 +1237,7 @@ class RawServiceMeshRuntime {
|
|
|
1235
1237
|
this.onPeerDisconnected?.(peer.descriptor.nodeRoutingId, peer.descriptor.advertisedEndpoint, peer.descriptor.lifecycleGeneration);
|
|
1236
1238
|
}
|
|
1237
1239
|
observeMonitorEvent(event) {
|
|
1238
|
-
const nodeRoutingId = event.routingId
|
|
1239
|
-
?? this.expectedPeerRoutingId(event.remoteAddress);
|
|
1240
|
+
const nodeRoutingId = event.routingId ?? this.expectedPeerRoutingId(event.remoteAddress);
|
|
1240
1241
|
if (nodeRoutingId === undefined)
|
|
1241
1242
|
return;
|
|
1242
1243
|
const connectionId = monitorConnectionId(event, nodeRoutingId);
|
|
@@ -1247,9 +1248,9 @@ class RawServiceMeshRuntime {
|
|
|
1247
1248
|
// allow a late stale READY to overwrite the admitted replacement.
|
|
1248
1249
|
return;
|
|
1249
1250
|
}
|
|
1250
|
-
if (event.event === MONITOR_DISCONNECTED
|
|
1251
|
-
|
|
1252
|
-
|
|
1251
|
+
if (event.event === MONITOR_DISCONNECTED &&
|
|
1252
|
+
this.monitorConnectionStates.get(nodeRoutingId) === connectionId &&
|
|
1253
|
+
this.topology.peer(nodeRoutingId)?.connectionId === connectionId) {
|
|
1253
1254
|
this.monitorConnectionStates.set(nodeRoutingId, null);
|
|
1254
1255
|
}
|
|
1255
1256
|
}
|
|
@@ -1307,11 +1308,7 @@ function isAlreadyDisconnectedError(error) {
|
|
|
1307
1308
|
}
|
|
1308
1309
|
function monitorConnectionId(event, resolvedNodeRoutingId = event.routingId ?? '') {
|
|
1309
1310
|
if (event.connectionId !== undefined && event.connectionId !== 0n) {
|
|
1310
|
-
return JSON.stringify([
|
|
1311
|
-
resolvedNodeRoutingId,
|
|
1312
|
-
'connection',
|
|
1313
|
-
event.connectionId.toString()
|
|
1314
|
-
]);
|
|
1311
|
+
return JSON.stringify([resolvedNodeRoutingId, 'connection', event.connectionId.toString()]);
|
|
1315
1312
|
}
|
|
1316
1313
|
return JSON.stringify([
|
|
1317
1314
|
// Monitor `value` is event-specific: CONNECTION_READY reports the
|
|
@@ -1324,8 +1321,8 @@ function monitorConnectionId(event, resolvedNodeRoutingId = event.routingId ?? '
|
|
|
1324
1321
|
]);
|
|
1325
1322
|
}
|
|
1326
1323
|
function sameMonitorConnection(left, right) {
|
|
1327
|
-
return monitorConnectionId(left) === monitorConnectionId(right)
|
|
1328
|
-
|
|
1324
|
+
return (monitorConnectionId(left) === monitorConnectionId(right) &&
|
|
1325
|
+
left.remoteAddress === right.remoteAddress);
|
|
1329
1326
|
}
|
|
1330
1327
|
function isConnectionReadyEdge(event) {
|
|
1331
1328
|
return event.flags === undefined
|
|
@@ -1339,21 +1336,20 @@ function describeInvalidAdmissionDescriptor(descriptor, expected, current) {
|
|
|
1339
1336
|
catch (error) {
|
|
1340
1337
|
return `descriptor validation: ${error instanceof Error ? error.message : String(error)}`;
|
|
1341
1338
|
}
|
|
1342
|
-
if (expected?.endpoint !== undefined
|
|
1343
|
-
&& descriptor.advertisedEndpoint !== expected.endpoint) {
|
|
1339
|
+
if (expected?.endpoint !== undefined && descriptor.advertisedEndpoint !== expected.endpoint) {
|
|
1344
1340
|
return `advertisedEndpoint expected='${expected.endpoint}' actual='${descriptor.advertisedEndpoint}'`;
|
|
1345
1341
|
}
|
|
1346
|
-
if (expected?.securityIdentity !== undefined
|
|
1347
|
-
|
|
1342
|
+
if (expected?.securityIdentity !== undefined &&
|
|
1343
|
+
descriptor.securityIdentity !== expected.securityIdentity) {
|
|
1348
1344
|
return `securityIdentity expected='${expected.securityIdentity}' actual='${descriptor.securityIdentity}'`;
|
|
1349
1345
|
}
|
|
1350
|
-
if (expected?.lifecycleGeneration !== undefined
|
|
1351
|
-
|
|
1346
|
+
if (expected?.lifecycleGeneration !== undefined &&
|
|
1347
|
+
descriptor.lifecycleGeneration !== expected.lifecycleGeneration) {
|
|
1352
1348
|
return `lifecycleGeneration expected=${expected.lifecycleGeneration} actual=${descriptor.lifecycleGeneration}`;
|
|
1353
1349
|
}
|
|
1354
|
-
if (current !== undefined
|
|
1355
|
-
|
|
1356
|
-
|
|
1350
|
+
if (current !== undefined &&
|
|
1351
|
+
current.lifecycleGeneration === descriptor.lifecycleGeneration &&
|
|
1352
|
+
descriptor.descriptorRevision > current.descriptorRevision) {
|
|
1357
1353
|
const immutableField = immutableDescriptorMismatch(current, descriptor);
|
|
1358
1354
|
if (immutableField !== undefined)
|
|
1359
1355
|
return immutableField;
|
|
@@ -1362,8 +1358,12 @@ function describeInvalidAdmissionDescriptor(descriptor, expected, current) {
|
|
|
1362
1358
|
}
|
|
1363
1359
|
function immutableDescriptorMismatch(current, descriptor) {
|
|
1364
1360
|
const fields = [
|
|
1365
|
-
'advertisedEndpoint',
|
|
1366
|
-
'
|
|
1361
|
+
'advertisedEndpoint',
|
|
1362
|
+
'securityIdentity',
|
|
1363
|
+
'applicationVersion',
|
|
1364
|
+
'objectRole',
|
|
1365
|
+
'activeCapacityLimit',
|
|
1366
|
+
'pendingCapacityLimit'
|
|
1367
1367
|
];
|
|
1368
1368
|
for (const field of fields) {
|
|
1369
1369
|
if (current[field] !== descriptor[field]) {
|
|
@@ -1373,8 +1373,8 @@ function immutableDescriptorMismatch(current, descriptor) {
|
|
|
1373
1373
|
if (JSON.stringify(current.protocolCapabilities) !== JSON.stringify(descriptor.protocolCapabilities)) {
|
|
1374
1374
|
return `protocolCapabilities changed within lifecycle expected=${JSON.stringify(current.protocolCapabilities)} actual=${JSON.stringify(descriptor.protocolCapabilities)}`;
|
|
1375
1375
|
}
|
|
1376
|
-
if (JSON.stringify(current.channels.map(channel => channel.name))
|
|
1377
|
-
|
|
1376
|
+
if (JSON.stringify(current.channels.map((channel) => channel.name)) !==
|
|
1377
|
+
JSON.stringify(descriptor.channels.map((channel) => channel.name))) {
|
|
1378
1378
|
return 'channels changed within lifecycle';
|
|
1379
1379
|
}
|
|
1380
1380
|
return undefined;
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.routeMeshConnectionNotRequired = routeMeshConnectionNotRequired;
|
|
4
4
|
exports.descriptorConnectionNotRequired = descriptorConnectionNotRequired;
|
|
5
5
|
function routeMeshConnectionNotRequired(localObjectRole, localHasServerChannel, remoteObjectRole, remoteHasServerChannel) {
|
|
6
|
-
return localObjectRole === 'client'
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
return (localObjectRole === 'client' &&
|
|
7
|
+
!localHasServerChannel &&
|
|
8
|
+
remoteObjectRole === 'client' &&
|
|
9
|
+
!remoteHasServerChannel);
|
|
10
10
|
}
|
|
11
11
|
function descriptorConnectionNotRequired(local, remote) {
|
|
12
12
|
return routeMeshConnectionNotRequired(local.objectRole, local.channels.length > 0, remote.objectRole, remote.channels.length > 0);
|