@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
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ZLinkFrameworkInternalErrorKind,
|
|
3
|
+
createInternalFrameworkException
|
|
4
|
+
} from '../framework-errors-internal';
|
|
2
5
|
import { createAbortError, throwIfAborted } from '../abort';
|
|
3
6
|
import { AsyncResource } from 'node:async_hooks';
|
|
4
7
|
import { ZLinkStateLane } from '../execution/state-lane';
|
|
@@ -140,11 +143,14 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
140
143
|
> {
|
|
141
144
|
private readonly lane = new ZLinkStateLane();
|
|
142
145
|
private readonly routes = new Map<string, ZLinkActorSessionRoute<TContext, TActor>>();
|
|
143
|
-
private readonly sealWaiters = new Map<
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
private readonly sealWaiters = new Map<
|
|
147
|
+
string,
|
|
148
|
+
Set<{
|
|
149
|
+
readonly bindingToken: string;
|
|
150
|
+
readonly resolve: () => void;
|
|
151
|
+
readonly reject: (error: unknown) => void;
|
|
152
|
+
}>
|
|
153
|
+
>();
|
|
148
154
|
private readonly activeFrameWaiters = new Map<string, Set<ZLinkActorSessionActiveFrameWaiter>>();
|
|
149
155
|
private readonly relocations = new Map<string, ZLinkActorSessionRelocationQueue>();
|
|
150
156
|
private readonly terminalRelocations = new Map<ZLinkActorSessionRelocationState, true>();
|
|
@@ -178,7 +184,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
178
184
|
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
179
185
|
sessionIdentity?: string
|
|
180
186
|
): Promise<void> {
|
|
181
|
-
await this.lane.run(() =>
|
|
187
|
+
await this.lane.run(() =>
|
|
188
|
+
this.bindCore(context, actor, bindingToken, authorityFence, sessionIdentity)
|
|
189
|
+
);
|
|
182
190
|
}
|
|
183
191
|
|
|
184
192
|
private bindCore(
|
|
@@ -207,9 +215,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
207
215
|
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
208
216
|
sessionIdentity?: string
|
|
209
217
|
): Promise<void> {
|
|
210
|
-
await this.lane.run(() =>
|
|
211
|
-
previous, context, actor, bindingToken, authorityFence, sessionIdentity
|
|
212
|
-
)
|
|
218
|
+
await this.lane.run(() =>
|
|
219
|
+
this.replaceCore(previous, context, actor, bindingToken, authorityFence, sessionIdentity)
|
|
220
|
+
);
|
|
213
221
|
}
|
|
214
222
|
|
|
215
223
|
private replaceCore(
|
|
@@ -230,8 +238,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
230
238
|
}
|
|
231
239
|
|
|
232
240
|
context.bindLocal(actor, bindingToken);
|
|
233
|
-
const sameLocalBinding = previous.context === context
|
|
234
|
-
&& previous.bindingToken === bindingToken;
|
|
241
|
+
const sameLocalBinding = previous.context === context && previous.bindingToken === bindingToken;
|
|
235
242
|
if (!sameLocalBinding) {
|
|
236
243
|
try {
|
|
237
244
|
previous.context.unbindLocal(actor.actorId, previous.bindingToken);
|
|
@@ -261,9 +268,17 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
261
268
|
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
262
269
|
sessionIdentity?: string
|
|
263
270
|
): Promise<void> {
|
|
264
|
-
await this.lane.run(() =>
|
|
265
|
-
|
|
266
|
-
|
|
271
|
+
await this.lane.run(() =>
|
|
272
|
+
this.replaceAndReleaseSealCore(
|
|
273
|
+
previous,
|
|
274
|
+
context,
|
|
275
|
+
actor,
|
|
276
|
+
bindingToken,
|
|
277
|
+
sealId,
|
|
278
|
+
authorityFence,
|
|
279
|
+
sessionIdentity
|
|
280
|
+
)
|
|
281
|
+
);
|
|
267
282
|
}
|
|
268
283
|
|
|
269
284
|
private replaceAndReleaseSealCore(
|
|
@@ -316,7 +331,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
316
331
|
actor: ZLinkActorSessionBindingActor,
|
|
317
332
|
bindingToken: string
|
|
318
333
|
): Promise<{ readonly context: TContext } | undefined> {
|
|
319
|
-
return await this.lane.run(() =>
|
|
334
|
+
return await this.lane.run(() =>
|
|
335
|
+
this.capturePendingReplyClaimCore(actorId, actor, bindingToken)
|
|
336
|
+
);
|
|
320
337
|
}
|
|
321
338
|
|
|
322
339
|
private capturePendingReplyClaimCore(
|
|
@@ -476,7 +493,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
476
493
|
): Promise<ZLinkActorSessionFrameAdmission> {
|
|
477
494
|
for (;;) {
|
|
478
495
|
throwIfAborted(signal);
|
|
479
|
-
const admission = await this.lane.run(() =>
|
|
496
|
+
const admission = await this.lane.run(() =>
|
|
497
|
+
this.beginAcceptedFrameCore(actorId, bindingToken)
|
|
498
|
+
);
|
|
480
499
|
if (admission !== undefined) return admission;
|
|
481
500
|
await this.waitForSealRelease(actorId, bindingToken, signal);
|
|
482
501
|
}
|
|
@@ -496,8 +515,8 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
496
515
|
completed = true;
|
|
497
516
|
route.activeFrames.count--;
|
|
498
517
|
if (
|
|
499
|
-
route.activeFrames.count === 0
|
|
500
|
-
|
|
518
|
+
route.activeFrames.count === 0 &&
|
|
519
|
+
this.routes.get(actorId)?.activeFrames === route.activeFrames
|
|
501
520
|
) {
|
|
502
521
|
this.resolveActiveFrameWaiters(actorId);
|
|
503
522
|
}
|
|
@@ -516,7 +535,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
516
535
|
signal?: AbortSignal
|
|
517
536
|
): Promise<ZLinkActorSessionRequestFrameAdmission> {
|
|
518
537
|
const frame = await this.beginAcceptedFrameWhenReady(actorId, bindingToken, signal);
|
|
519
|
-
return await this.lane.run(() =>
|
|
538
|
+
return await this.lane.run(() =>
|
|
539
|
+
this.beginAcceptedRequestFrameCore(actorId, bindingToken, frame)
|
|
540
|
+
);
|
|
520
541
|
}
|
|
521
542
|
|
|
522
543
|
private beginAcceptedRequestFrameCore(
|
|
@@ -570,11 +591,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
570
591
|
operation: () => Promise<TResult>,
|
|
571
592
|
signal?: AbortSignal
|
|
572
593
|
): Promise<TResult> {
|
|
573
|
-
const admission = await this.beginAcceptedFrameWhenReady(
|
|
574
|
-
actorId,
|
|
575
|
-
bindingToken,
|
|
576
|
-
signal
|
|
577
|
-
);
|
|
594
|
+
const admission = await this.beginAcceptedFrameWhenReady(actorId, bindingToken, signal);
|
|
578
595
|
try {
|
|
579
596
|
return await operation();
|
|
580
597
|
} finally {
|
|
@@ -582,7 +599,11 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
582
599
|
}
|
|
583
600
|
}
|
|
584
601
|
|
|
585
|
-
async seal(
|
|
602
|
+
async seal(
|
|
603
|
+
actorId: string,
|
|
604
|
+
sealId: string,
|
|
605
|
+
expected: ZLinkActorSessionRouteFence
|
|
606
|
+
): Promise<void> {
|
|
586
607
|
await this.lane.run(() => this.sealCore(actorId, sealId, expected));
|
|
587
608
|
}
|
|
588
609
|
|
|
@@ -658,9 +679,8 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
658
679
|
assertRelocationClaim(existing, claim);
|
|
659
680
|
return { kind: 'existing', wait: existing.ready };
|
|
660
681
|
}
|
|
661
|
-
const predecessor =
|
|
662
|
-
? undefined
|
|
663
|
-
: queue.seals.get(queue.activeSealId);
|
|
682
|
+
const predecessor =
|
|
683
|
+
queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
664
684
|
if (predecessor !== undefined && predecessor.phase !== 'terminal') {
|
|
665
685
|
if (predecessor.sessionIdentity === undefined || claim.sessionIdentity === undefined) {
|
|
666
686
|
throw createInternalFrameworkException(
|
|
@@ -675,7 +695,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
675
695
|
|
|
676
696
|
this.sealCore(claim.actorId, claim.sealId, expected);
|
|
677
697
|
let resolveTerminal!: () => void;
|
|
678
|
-
const terminal = new Promise<void>((resolve) => {
|
|
698
|
+
const terminal = new Promise<void>((resolve) => {
|
|
699
|
+
resolveTerminal = resolve;
|
|
700
|
+
});
|
|
679
701
|
const ready = this.waitForActiveFramesCore(claim.actorId, signal);
|
|
680
702
|
const actorQueue: ZLinkActorSessionRelocationQueue = queue ?? {
|
|
681
703
|
actorId: claim.actorId,
|
|
@@ -716,7 +738,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
716
738
|
operation: ZLinkActorSessionRetainedOutbound,
|
|
717
739
|
sealId?: string
|
|
718
740
|
): Promise<ServiceSessionBindingAdmissionResult> {
|
|
719
|
-
return await this.lane.run(() =>
|
|
741
|
+
return await this.lane.run(() =>
|
|
742
|
+
this.retainRelocationOutboundCorePublic(actorId, operation, sealId)
|
|
743
|
+
);
|
|
720
744
|
}
|
|
721
745
|
|
|
722
746
|
private retainRelocationOutboundCorePublic(
|
|
@@ -728,10 +752,10 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
728
752
|
const queue = this.relocations.get(actorId);
|
|
729
753
|
const state = queue?.seals.get(sealId);
|
|
730
754
|
if (
|
|
731
|
-
queue === undefined
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
755
|
+
queue === undefined ||
|
|
756
|
+
state === undefined ||
|
|
757
|
+
(queue.activeSealId !== sealId &&
|
|
758
|
+
!(queue.activeSealId === undefined && state.phase === 'terminal'))
|
|
735
759
|
) {
|
|
736
760
|
failRetainedOutbound(
|
|
737
761
|
operation,
|
|
@@ -755,9 +779,8 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
755
779
|
operation: ZLinkActorSessionRetainedOutbound
|
|
756
780
|
): ServiceSessionBindingAdmissionResult {
|
|
757
781
|
const queue = this.relocations.get(claim.actorId);
|
|
758
|
-
const state =
|
|
759
|
-
? undefined
|
|
760
|
-
: queue.seals.get(queue.activeSealId);
|
|
782
|
+
const state =
|
|
783
|
+
queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
761
784
|
const error = this.outboundAdmissionError(claim);
|
|
762
785
|
if (error !== undefined) {
|
|
763
786
|
failRetainedOutbound(operation, error);
|
|
@@ -767,48 +790,32 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
767
790
|
if (!this.matchesCurrentProducerNode(claim)) {
|
|
768
791
|
failRetainedOutbound(
|
|
769
792
|
operation,
|
|
770
|
-
new Error(
|
|
793
|
+
new Error(
|
|
794
|
+
`Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`
|
|
795
|
+
)
|
|
771
796
|
);
|
|
772
797
|
return 'rejected';
|
|
773
798
|
}
|
|
774
799
|
if (queue === undefined) return 'passThrough';
|
|
775
|
-
return this.retainRelocationOutboundCore(
|
|
776
|
-
claim.actorId,
|
|
777
|
-
operation,
|
|
778
|
-
'source',
|
|
779
|
-
claim
|
|
780
|
-
);
|
|
800
|
+
return this.retainRelocationOutboundCore(claim.actorId, operation, 'source', claim);
|
|
781
801
|
}
|
|
782
802
|
if (state.phase === 'sealed' || state.phase === 'applying') {
|
|
783
803
|
const matchesSource = matchesRelocationSourceProof(state, claim);
|
|
784
804
|
const matchesCurrent = this.matchesCurrentProducerNode(claim);
|
|
785
|
-
const authorization = matchesSource || matchesCurrent
|
|
786
|
-
|
|
787
|
-
: 'pendingTarget';
|
|
788
|
-
return this.retainRelocationOutboundCore(
|
|
789
|
-
claim.actorId,
|
|
790
|
-
operation,
|
|
791
|
-
authorization,
|
|
792
|
-
claim
|
|
793
|
-
);
|
|
805
|
+
const authorization = matchesSource || matchesCurrent ? 'source' : 'pendingTarget';
|
|
806
|
+
return this.retainRelocationOutboundCore(claim.actorId, operation, authorization, claim);
|
|
794
807
|
}
|
|
795
808
|
const acceptedProof = state.acceptedProducerProof;
|
|
796
|
-
if (
|
|
797
|
-
acceptedProof === undefined
|
|
798
|
-
|| !matchesAcceptedProducerProof(acceptedProof, claim)
|
|
799
|
-
) {
|
|
809
|
+
if (acceptedProof === undefined || !matchesAcceptedProducerProof(acceptedProof, claim)) {
|
|
800
810
|
failRetainedOutbound(
|
|
801
811
|
operation,
|
|
802
|
-
new Error(
|
|
812
|
+
new Error(
|
|
813
|
+
`Actor '${claim.actorId}' Session outbound admission did not match its accepted producer proof.`
|
|
814
|
+
)
|
|
803
815
|
);
|
|
804
816
|
return 'rejected';
|
|
805
817
|
}
|
|
806
|
-
return this.retainRelocationOutboundCore(
|
|
807
|
-
claim.actorId,
|
|
808
|
-
operation,
|
|
809
|
-
'source',
|
|
810
|
-
claim
|
|
811
|
-
);
|
|
818
|
+
return this.retainRelocationOutboundCore(claim.actorId, operation, 'source', claim);
|
|
812
819
|
}
|
|
813
820
|
|
|
814
821
|
private retainRelocationOutboundCore(
|
|
@@ -818,9 +825,8 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
818
825
|
claim?: ServiceSessionBindingAdmissionClaim
|
|
819
826
|
): ServiceSessionBindingAdmissionResult {
|
|
820
827
|
const queue = this.relocations.get(actorId);
|
|
821
|
-
const state =
|
|
822
|
-
? undefined
|
|
823
|
-
: queue.seals.get(queue.activeSealId);
|
|
828
|
+
const state =
|
|
829
|
+
queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
824
830
|
if (queue === undefined) return 'passThrough';
|
|
825
831
|
if (state === undefined || state.phase === 'applied' || state.phase === 'terminal') {
|
|
826
832
|
if (queue.drainPromise === undefined && queue.outbound.length === 0) return 'passThrough';
|
|
@@ -873,13 +879,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
873
879
|
commitOwnerTransition: () => Promise<void>,
|
|
874
880
|
acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
|
|
875
881
|
): Promise<void> {
|
|
876
|
-
const prepared = await this.lane.run(() =>
|
|
877
|
-
actorId,
|
|
878
|
-
|
|
879
|
-
applyFingerprint,
|
|
880
|
-
action,
|
|
881
|
-
acceptedProducerProof
|
|
882
|
-
));
|
|
882
|
+
const prepared = await this.lane.run(() =>
|
|
883
|
+
this.prepareRelocationApply(actorId, sealId, applyFingerprint, action, acceptedProducerProof)
|
|
884
|
+
);
|
|
883
885
|
if (prepared.applyPromise !== undefined) {
|
|
884
886
|
await prepared.applyPromise;
|
|
885
887
|
return;
|
|
@@ -937,9 +939,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
937
939
|
return { queue, state, applyPromise: state.applyPromise };
|
|
938
940
|
}
|
|
939
941
|
if (
|
|
940
|
-
action === 'commit'
|
|
941
|
-
|
|
942
|
-
|
|
942
|
+
action === 'commit' &&
|
|
943
|
+
acceptedProducerProof !== undefined &&
|
|
944
|
+
!validAcceptedTargetProof(state, acceptedProducerProof)
|
|
943
945
|
) {
|
|
944
946
|
throw createInternalFrameworkException(
|
|
945
947
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
@@ -986,9 +988,10 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
986
988
|
readonly sealId?: string;
|
|
987
989
|
}): void {
|
|
988
990
|
const { queue, state, action, acceptedProducerProof, actorId, sealId } = prepared;
|
|
989
|
-
const proof =
|
|
990
|
-
|
|
991
|
-
|
|
991
|
+
const proof =
|
|
992
|
+
action === 'commit'
|
|
993
|
+
? (acceptedProducerProof ?? this.currentProducerProof(actorId!))
|
|
994
|
+
: relocationSourceProof(state);
|
|
992
995
|
state.acceptedProducerProof = proof;
|
|
993
996
|
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
994
997
|
const entry = queue.outbound[index]!;
|
|
@@ -998,10 +1001,10 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
998
1001
|
continue;
|
|
999
1002
|
}
|
|
1000
1003
|
if (
|
|
1001
|
-
action === 'commit'
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1004
|
+
action === 'commit' &&
|
|
1005
|
+
proof !== undefined &&
|
|
1006
|
+
entry.claim !== undefined &&
|
|
1007
|
+
matchesAcceptedProducerProof(proof, entry.claim)
|
|
1005
1008
|
) {
|
|
1006
1009
|
entry.released = true;
|
|
1007
1010
|
continue;
|
|
@@ -1030,27 +1033,32 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1030
1033
|
actorId: string
|
|
1031
1034
|
): ZLinkActorSessionAcceptedProducerProof | undefined {
|
|
1032
1035
|
const route = this.routes.get(actorId);
|
|
1033
|
-
const actorRef = (
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1036
|
+
const actorRef = (
|
|
1037
|
+
route?.actor as TActor & {
|
|
1038
|
+
readonly ref?: {
|
|
1039
|
+
readonly actorId?: unknown;
|
|
1040
|
+
readonly objectGeneration?: unknown;
|
|
1041
|
+
readonly generation?: unknown;
|
|
1042
|
+
readonly nodeRid?: unknown;
|
|
1043
|
+
readonly ownerNodeGeneration?: unknown;
|
|
1044
|
+
readonly bindingGeneration?: unknown;
|
|
1045
|
+
};
|
|
1046
|
+
}
|
|
1047
|
+
).ref;
|
|
1041
1048
|
const sessionIdentity = route?.sessionIdentity;
|
|
1042
1049
|
if (
|
|
1043
|
-
route === undefined
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
)
|
|
1050
|
+
route === undefined ||
|
|
1051
|
+
actorRef === undefined ||
|
|
1052
|
+
sessionIdentity === undefined ||
|
|
1053
|
+
actorRef.ownerNodeGeneration === undefined
|
|
1054
|
+
)
|
|
1055
|
+
return undefined;
|
|
1048
1056
|
return {
|
|
1049
1057
|
actorId,
|
|
1050
1058
|
objectGeneration: BigInt(
|
|
1051
|
-
actorRef.objectGeneration as bigint | number | string | boolean | undefined
|
|
1052
|
-
|
|
1053
|
-
|
|
1059
|
+
(actorRef.objectGeneration as bigint | number | string | boolean | undefined) ??
|
|
1060
|
+
(actorRef.generation as bigint | number | string | boolean | undefined) ??
|
|
1061
|
+
-1
|
|
1054
1062
|
),
|
|
1055
1063
|
actorNodeRid: String(actorRef.nodeRid ?? ''),
|
|
1056
1064
|
actorNodeGeneration: BigInt(
|
|
@@ -1058,7 +1066,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1058
1066
|
),
|
|
1059
1067
|
sessionIdentity: String(sessionIdentity),
|
|
1060
1068
|
bindingGeneration: BigInt(
|
|
1061
|
-
actorRef.bindingGeneration as bigint | number | string | boolean | undefined ?? -1
|
|
1069
|
+
(actorRef.bindingGeneration as bigint | number | string | boolean | undefined) ?? -1
|
|
1062
1070
|
)
|
|
1063
1071
|
};
|
|
1064
1072
|
}
|
|
@@ -1068,7 +1076,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1068
1076
|
sealId: string,
|
|
1069
1077
|
applyFingerprint: string
|
|
1070
1078
|
): Promise<void> {
|
|
1071
|
-
await this.lane.run(() =>
|
|
1079
|
+
await this.lane.run(() =>
|
|
1080
|
+
this.observeRelocationTerminalCore(actorId, sealId, applyFingerprint)
|
|
1081
|
+
);
|
|
1072
1082
|
}
|
|
1073
1083
|
|
|
1074
1084
|
private observeRelocationTerminalCore(
|
|
@@ -1079,10 +1089,10 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1079
1089
|
const queue = this.relocations.get(actorId);
|
|
1080
1090
|
const state = queue?.seals.get(sealId);
|
|
1081
1091
|
if (
|
|
1082
|
-
queue === undefined
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1092
|
+
queue === undefined ||
|
|
1093
|
+
state === undefined ||
|
|
1094
|
+
state.applyFingerprint !== applyFingerprint ||
|
|
1095
|
+
(state.phase !== 'applied' && state.phase !== 'terminal')
|
|
1086
1096
|
) {
|
|
1087
1097
|
throw createInternalFrameworkException(
|
|
1088
1098
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
@@ -1143,9 +1153,10 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1143
1153
|
if (queue === undefined) return;
|
|
1144
1154
|
const activeSealId = queue.activeSealId;
|
|
1145
1155
|
const activeState = activeSealId === undefined ? undefined : queue.seals.get(activeSealId);
|
|
1146
|
-
const ownsActiveSeal =
|
|
1147
|
-
|
|
1148
|
-
|
|
1156
|
+
const ownsActiveSeal =
|
|
1157
|
+
activeState !== undefined &&
|
|
1158
|
+
activeState.phase !== 'terminal' &&
|
|
1159
|
+
activeState.sessionIdentity === route.sessionIdentity;
|
|
1149
1160
|
if (!ownsActiveSeal) {
|
|
1150
1161
|
// Nothing this exact route still holds open — leave terminal
|
|
1151
1162
|
// retention and any other Session's active seal untouched.
|
|
@@ -1184,7 +1195,10 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1184
1195
|
await this.lane.run(() => this.updateAuthorityFenceCore(actorId, authorityFence));
|
|
1185
1196
|
}
|
|
1186
1197
|
|
|
1187
|
-
private updateAuthorityFenceCore(
|
|
1198
|
+
private updateAuthorityFenceCore(
|
|
1199
|
+
actorId: string,
|
|
1200
|
+
authorityFence: ZLinkActorSessionAuthorityFence
|
|
1201
|
+
): void {
|
|
1188
1202
|
const route = this.requireRouteCore(actorId);
|
|
1189
1203
|
route.authorityFence = authorityFence;
|
|
1190
1204
|
}
|
|
@@ -1195,8 +1209,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1195
1209
|
|
|
1196
1210
|
private validateSealCore(actorId: string, sealId: string): boolean {
|
|
1197
1211
|
const route = this.routes.get(actorId);
|
|
1198
|
-
return route !== undefined
|
|
1199
|
-
&& route.sealId === sealId;
|
|
1212
|
+
return route !== undefined && route.sealId === sealId;
|
|
1200
1213
|
}
|
|
1201
1214
|
|
|
1202
1215
|
/** True while a relocation seal currently holds this actor's ingress. */
|
|
@@ -1254,16 +1267,20 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1254
1267
|
waiters.delete(waiter);
|
|
1255
1268
|
if (waiters.size === 0) this.sealWaiters.delete(actorId);
|
|
1256
1269
|
};
|
|
1257
|
-
timer = startOutsideStateLane(() =>
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1270
|
+
timer = startOutsideStateLane(() =>
|
|
1271
|
+
setTimeout(() => {
|
|
1272
|
+
this.lane.tryPost(() => {
|
|
1273
|
+
removeWaiter();
|
|
1274
|
+
rejectWaiter(
|
|
1275
|
+
createInternalFrameworkException(
|
|
1276
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
1277
|
+
`Actor '${actorId}' session seal was not released within the relocation seal timeout.`,
|
|
1278
|
+
true
|
|
1279
|
+
)
|
|
1280
|
+
);
|
|
1281
|
+
});
|
|
1282
|
+
}, this.sealWaitTimeoutMs)
|
|
1283
|
+
);
|
|
1267
1284
|
timer.unref();
|
|
1268
1285
|
const onAbort = () => {
|
|
1269
1286
|
this.lane.tryPost(() => {
|
|
@@ -1324,17 +1341,21 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1324
1341
|
// Spec 48:205 — transport/deadline limits keep applying during
|
|
1325
1342
|
// relocation: the sealing side must not wait forever for active
|
|
1326
1343
|
// frames that themselves may be waiting on this relocation.
|
|
1327
|
-
timer = startOutsideStateLane(() =>
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1344
|
+
timer = startOutsideStateLane(() =>
|
|
1345
|
+
setTimeout(() => {
|
|
1346
|
+
this.lane.tryPost(() => {
|
|
1347
|
+
waiters.delete(waiter);
|
|
1348
|
+
if (waiters.size === 0) this.activeFrameWaiters.delete(actorId);
|
|
1349
|
+
waiter.reject(
|
|
1350
|
+
createInternalFrameworkException(
|
|
1351
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
1352
|
+
`Actor '${actorId}' session seal timed out waiting for active frames.`,
|
|
1353
|
+
true
|
|
1354
|
+
)
|
|
1355
|
+
);
|
|
1356
|
+
});
|
|
1357
|
+
}, this.sealWaitTimeoutMs)
|
|
1358
|
+
);
|
|
1338
1359
|
timer.unref();
|
|
1339
1360
|
if (signal === undefined) return;
|
|
1340
1361
|
if (signal.aborted) onAbort();
|
|
@@ -1375,11 +1396,14 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1375
1396
|
const delivered = await entry.operation.deliver();
|
|
1376
1397
|
await this.lane.run(() => {
|
|
1377
1398
|
if (delivered) this.settleOutbound(queue, entry);
|
|
1378
|
-
else
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1399
|
+
else
|
|
1400
|
+
this.failOutbound(
|
|
1401
|
+
queue,
|
|
1402
|
+
entry,
|
|
1403
|
+
new Error(
|
|
1404
|
+
`Actor '${queue.actorId}' retained Session outbound delivery was rejected.`
|
|
1405
|
+
)
|
|
1406
|
+
);
|
|
1383
1407
|
if (queue.outbound[0] === entry) queue.outbound.shift();
|
|
1384
1408
|
});
|
|
1385
1409
|
} catch (error) {
|
|
@@ -1391,11 +1415,14 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1391
1415
|
}
|
|
1392
1416
|
});
|
|
1393
1417
|
startOutsideStateLane(() => {
|
|
1394
|
-
void drain.finally(
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1418
|
+
void drain.finally(
|
|
1419
|
+
async () =>
|
|
1420
|
+
await this.lane.run(() => {
|
|
1421
|
+
if (queue.drainPromise === drain) queue.drainPromise = undefined;
|
|
1422
|
+
if (queue.outbound[0]?.released === true) this.startOutboundDrain(queue);
|
|
1423
|
+
else this.deleteEmptyRelocationQueue(queue);
|
|
1424
|
+
})
|
|
1425
|
+
);
|
|
1399
1426
|
});
|
|
1400
1427
|
queue.drainPromise = drain;
|
|
1401
1428
|
}
|
|
@@ -1434,59 +1461,69 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1434
1461
|
failRetainedOutbound(entry.operation, error);
|
|
1435
1462
|
}
|
|
1436
1463
|
|
|
1437
|
-
private outboundAdmissionError(
|
|
1438
|
-
claim: ServiceSessionBindingAdmissionClaim
|
|
1439
|
-
): Error | undefined {
|
|
1464
|
+
private outboundAdmissionError(claim: ServiceSessionBindingAdmissionClaim): Error | undefined {
|
|
1440
1465
|
if (
|
|
1441
|
-
claim.actorId.length === 0
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1466
|
+
claim.actorId.length === 0 ||
|
|
1467
|
+
claim.objectGeneration <= 0n ||
|
|
1468
|
+
claim.actorNodeRid.length === 0 ||
|
|
1469
|
+
claim.actorNodeGeneration <= 0n ||
|
|
1470
|
+
claim.producerNodeRid.length === 0 ||
|
|
1471
|
+
claim.producerNodeGeneration <= 0n ||
|
|
1472
|
+
claim.bindingGeneration <= 0n ||
|
|
1473
|
+
claim.sessionIdentity.length === 0 ||
|
|
1474
|
+
!routingIdsEqual(claim.producerNodeRid, claim.actorNodeRid) ||
|
|
1475
|
+
claim.producerNodeGeneration !== claim.actorNodeGeneration
|
|
1451
1476
|
) {
|
|
1452
1477
|
return new Error(`Actor '${claim.actorId}' Session outbound admission claim is invalid.`);
|
|
1453
1478
|
}
|
|
1454
1479
|
const route = this.routes.get(claim.actorId);
|
|
1455
|
-
const ref = route?.actor as
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1480
|
+
const ref = route?.actor as
|
|
1481
|
+
| (TActor & {
|
|
1482
|
+
readonly ref?: {
|
|
1483
|
+
readonly actorId?: unknown;
|
|
1484
|
+
readonly objectGeneration?: unknown;
|
|
1485
|
+
readonly generation?: unknown;
|
|
1486
|
+
readonly bindingGeneration?: unknown;
|
|
1487
|
+
};
|
|
1488
|
+
})
|
|
1489
|
+
| undefined;
|
|
1461
1490
|
const actorRef = ref?.ref;
|
|
1462
1491
|
const routeSessionIdentity = route?.sessionIdentity;
|
|
1463
1492
|
if (
|
|
1464
|
-
route === undefined
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
actorRef.objectGeneration as bigint | number | string | boolean | undefined
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
) !== claim.objectGeneration
|
|
1472
|
-
|
|
1473
|
-
actorRef.bindingGeneration as bigint | number | string | boolean | undefined ?? -1
|
|
1474
|
-
) !== claim.bindingGeneration
|
|
1475
|
-
|
|
1493
|
+
route === undefined ||
|
|
1494
|
+
actorRef === undefined ||
|
|
1495
|
+
String(actorRef.actorId ?? claim.actorId) !== claim.actorId ||
|
|
1496
|
+
BigInt(
|
|
1497
|
+
(actorRef.objectGeneration as bigint | number | string | boolean | undefined) ??
|
|
1498
|
+
(actorRef.generation as bigint | number | string | boolean | undefined) ??
|
|
1499
|
+
-1
|
|
1500
|
+
) !== claim.objectGeneration ||
|
|
1501
|
+
BigInt(
|
|
1502
|
+
(actorRef.bindingGeneration as bigint | number | string | boolean | undefined) ?? -1
|
|
1503
|
+
) !== claim.bindingGeneration ||
|
|
1504
|
+
String(routeSessionIdentity ?? '') !== claim.sessionIdentity
|
|
1476
1505
|
) {
|
|
1477
|
-
return new Error(
|
|
1506
|
+
return new Error(
|
|
1507
|
+
`Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`
|
|
1508
|
+
);
|
|
1478
1509
|
}
|
|
1479
1510
|
return undefined;
|
|
1480
1511
|
}
|
|
1481
1512
|
|
|
1482
1513
|
private matchesCurrentProducerNode(claim: ServiceSessionBindingAdmissionClaim): boolean {
|
|
1483
1514
|
const route = this.routes.get(claim.actorId);
|
|
1484
|
-
const actorRef = (
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1515
|
+
const actorRef = (
|
|
1516
|
+
route?.actor as TActor & {
|
|
1517
|
+
readonly ref?: {
|
|
1518
|
+
readonly nodeRid?: unknown;
|
|
1519
|
+
};
|
|
1520
|
+
}
|
|
1521
|
+
).ref;
|
|
1522
|
+
return (
|
|
1523
|
+
route !== undefined &&
|
|
1524
|
+
actorRef !== undefined &&
|
|
1525
|
+
routingIdsEqual(String(actorRef.nodeRid ?? ''), claim.actorNodeRid)
|
|
1526
|
+
);
|
|
1490
1527
|
}
|
|
1491
1528
|
|
|
1492
1529
|
private rememberTerminalRelocation(state: ZLinkActorSessionRelocationState): void {
|
|
@@ -1507,11 +1544,11 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1507
1544
|
|
|
1508
1545
|
private deleteEmptyRelocationQueue(queue: ZLinkActorSessionRelocationQueue): void {
|
|
1509
1546
|
if (
|
|
1510
|
-
queue.activeSealId === undefined
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1547
|
+
queue.activeSealId === undefined &&
|
|
1548
|
+
queue.seals.size === 0 &&
|
|
1549
|
+
queue.outbound.length === 0 &&
|
|
1550
|
+
queue.drainPromise === undefined &&
|
|
1551
|
+
this.relocations.get(queue.actorId) === queue
|
|
1515
1552
|
) {
|
|
1516
1553
|
this.relocations.delete(queue.actorId);
|
|
1517
1554
|
}
|
|
@@ -1537,11 +1574,11 @@ function assertRelocationClaim(
|
|
|
1537
1574
|
claim: ZLinkActorSessionRelocationClaim
|
|
1538
1575
|
): void {
|
|
1539
1576
|
if (
|
|
1540
|
-
state.actorGeneration !== claim.actorGeneration
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1577
|
+
state.actorGeneration !== claim.actorGeneration ||
|
|
1578
|
+
state.bindingGeneration !== claim.bindingGeneration ||
|
|
1579
|
+
state.sessionIdentity !== claim.sessionIdentity ||
|
|
1580
|
+
state.actorNodeRid !== claim.actorNodeRid ||
|
|
1581
|
+
state.actorNodeGeneration !== claim.actorNodeGeneration
|
|
1545
1582
|
) {
|
|
1546
1583
|
throw createInternalFrameworkException(
|
|
1547
1584
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
@@ -1559,47 +1596,54 @@ function matchesRelocationSourceProof(
|
|
|
1559
1596
|
state: ZLinkActorSessionRelocationState,
|
|
1560
1597
|
claim: ServiceSessionBindingAdmissionClaim
|
|
1561
1598
|
): boolean {
|
|
1562
|
-
return
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1599
|
+
return (
|
|
1600
|
+
state.actorId === claim.actorId &&
|
|
1601
|
+
state.actorGeneration === claim.objectGeneration &&
|
|
1602
|
+
state.bindingGeneration === claim.bindingGeneration &&
|
|
1603
|
+
state.sessionIdentity === claim.sessionIdentity &&
|
|
1604
|
+
state.actorNodeRid !== undefined &&
|
|
1605
|
+
routingIdsEqual(state.actorNodeRid, claim.actorNodeRid) &&
|
|
1606
|
+
state.actorNodeGeneration === claim.actorNodeGeneration
|
|
1607
|
+
);
|
|
1569
1608
|
}
|
|
1570
1609
|
|
|
1571
1610
|
function matchesAcceptedProducerProof(
|
|
1572
1611
|
proof: ZLinkActorSessionAcceptedProducerProof,
|
|
1573
1612
|
claim: ServiceSessionBindingAdmissionClaim
|
|
1574
1613
|
): boolean {
|
|
1575
|
-
return
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1614
|
+
return (
|
|
1615
|
+
proof.actorId === claim.actorId &&
|
|
1616
|
+
proof.objectGeneration === claim.objectGeneration &&
|
|
1617
|
+
routingIdsEqual(proof.actorNodeRid, claim.actorNodeRid) &&
|
|
1618
|
+
proof.actorNodeGeneration === claim.actorNodeGeneration &&
|
|
1619
|
+
proof.sessionIdentity === claim.sessionIdentity &&
|
|
1620
|
+
proof.bindingGeneration === claim.bindingGeneration
|
|
1621
|
+
);
|
|
1581
1622
|
}
|
|
1582
1623
|
|
|
1583
1624
|
function validAcceptedTargetProof(
|
|
1584
1625
|
state: ZLinkActorSessionRelocationState,
|
|
1585
1626
|
proof: ZLinkActorSessionAcceptedProducerProof
|
|
1586
1627
|
): boolean {
|
|
1587
|
-
return
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1628
|
+
return (
|
|
1629
|
+
proof.actorId === state.actorId &&
|
|
1630
|
+
proof.objectGeneration === state.actorGeneration &&
|
|
1631
|
+
proof.actorNodeRid.length > 0 &&
|
|
1632
|
+
proof.actorNodeGeneration > 0n &&
|
|
1633
|
+
proof.sessionIdentity === state.sessionIdentity &&
|
|
1634
|
+
proof.bindingGeneration === state.bindingGeneration
|
|
1635
|
+
);
|
|
1593
1636
|
}
|
|
1594
1637
|
|
|
1595
1638
|
function relocationSourceProof(
|
|
1596
1639
|
state: ZLinkActorSessionRelocationState
|
|
1597
1640
|
): ZLinkActorSessionAcceptedProducerProof | undefined {
|
|
1598
1641
|
if (
|
|
1599
|
-
state.sessionIdentity === undefined
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
)
|
|
1642
|
+
state.sessionIdentity === undefined ||
|
|
1643
|
+
state.actorNodeRid === undefined ||
|
|
1644
|
+
state.actorNodeGeneration === undefined
|
|
1645
|
+
)
|
|
1646
|
+
return undefined;
|
|
1603
1647
|
return {
|
|
1604
1648
|
actorId: state.actorId,
|
|
1605
1649
|
objectGeneration: state.actorGeneration,
|
|
@@ -1610,10 +1654,7 @@ function relocationSourceProof(
|
|
|
1610
1654
|
};
|
|
1611
1655
|
}
|
|
1612
1656
|
|
|
1613
|
-
function failRetainedOutbound(
|
|
1614
|
-
operation: ZLinkActorSessionRetainedOutbound,
|
|
1615
|
-
error: unknown
|
|
1616
|
-
): void {
|
|
1657
|
+
function failRetainedOutbound(operation: ZLinkActorSessionRetainedOutbound, error: unknown): void {
|
|
1617
1658
|
try {
|
|
1618
1659
|
operation.fail(error);
|
|
1619
1660
|
} catch {
|
|
@@ -1627,9 +1668,9 @@ function assertSuccessorSessionIdentity(
|
|
|
1627
1668
|
successor: ZLinkActorSessionRelocationClaim
|
|
1628
1669
|
): void {
|
|
1629
1670
|
if (
|
|
1630
|
-
predecessor.actorGeneration !== successor.actorGeneration
|
|
1631
|
-
|
|
1632
|
-
|
|
1671
|
+
predecessor.actorGeneration !== successor.actorGeneration ||
|
|
1672
|
+
predecessor.bindingGeneration !== successor.bindingGeneration ||
|
|
1673
|
+
predecessor.sessionIdentity !== successor.sessionIdentity
|
|
1633
1674
|
) {
|
|
1634
1675
|
throw createInternalFrameworkException(
|
|
1635
1676
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
@@ -1648,14 +1689,18 @@ function routeMatchesFence<
|
|
|
1648
1689
|
TContext extends ZLinkActorSessionBindingContext<TActor>,
|
|
1649
1690
|
TActor extends ZLinkActorSessionBindingActor
|
|
1650
1691
|
>(route: ZLinkActorSessionRoute<TContext, TActor>, expected: ZLinkActorSessionRouteFence): boolean {
|
|
1651
|
-
const ref = (route.actor as TActor & { readonly ref?: unknown }).ref as
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1692
|
+
const ref = (route.actor as TActor & { readonly ref?: unknown }).ref as
|
|
1693
|
+
| {
|
|
1694
|
+
readonly objectGeneration?: bigint;
|
|
1695
|
+
readonly generation?: bigint;
|
|
1696
|
+
readonly bindingGeneration?: bigint;
|
|
1697
|
+
}
|
|
1698
|
+
| undefined;
|
|
1699
|
+
return (
|
|
1700
|
+
ref !== undefined &&
|
|
1701
|
+
BigInt(ref.objectGeneration ?? ref.generation ?? -1n) === expected.objectGeneration &&
|
|
1702
|
+
ref.bindingGeneration === expected.bindingGeneration
|
|
1703
|
+
);
|
|
1659
1704
|
}
|
|
1660
1705
|
|
|
1661
1706
|
function sessionIdentityFromContext<
|
|
@@ -1665,10 +1710,7 @@ function sessionIdentityFromContext<
|
|
|
1665
1710
|
return context.routingId === undefined ? undefined : String(context.routingId);
|
|
1666
1711
|
}
|
|
1667
1712
|
|
|
1668
|
-
function waitForSessionRelocation(
|
|
1669
|
-
operation: Promise<void>,
|
|
1670
|
-
signal?: AbortSignal
|
|
1671
|
-
): Promise<void> {
|
|
1713
|
+
function waitForSessionRelocation(operation: Promise<void>, signal?: AbortSignal): Promise<void> {
|
|
1672
1714
|
if (signal === undefined) return operation;
|
|
1673
1715
|
if (signal.aborted) return Promise.reject(signal.reason ?? createAbortError());
|
|
1674
1716
|
return new Promise<void>((resolve, reject) => {
|
|
@@ -1682,7 +1724,7 @@ function waitForSessionRelocation(
|
|
|
1682
1724
|
signal.removeEventListener('abort', onAbort);
|
|
1683
1725
|
resolve();
|
|
1684
1726
|
},
|
|
1685
|
-
error => {
|
|
1727
|
+
(error) => {
|
|
1686
1728
|
signal.removeEventListener('abort', onAbort);
|
|
1687
1729
|
reject(error);
|
|
1688
1730
|
}
|