@zlink-systems/framework 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -0
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -1
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +28 -22
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-join-deferred-scope.d.ts +0 -1
- package/dist/runtime/actors/actor-join-deferred-scope.js +0 -18
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +160 -130
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/contracts/index.d.ts +1 -0
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +3 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +134 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +12 -20
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +46 -42
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -0
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -39
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +6 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +55 -0
- package/dist/runtime/diagnostics/flow-context.d.ts +2 -1
- package/dist/runtime/diagnostics/flow-context.js +2 -2
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +58 -42
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -27
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +4 -2
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +169 -144
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +1 -0
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +4 -0
- package/dist/runtime/foundation/service-stateful-runtime.js +461 -439
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -0
- package/dist/runtime/foundation/service-topology-registry.js +105 -96
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +245 -228
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +20 -18
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +209 -220
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +2 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +29 -21
- package/dist/runtime/spots/spot-actor-packet-drain.js +14 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +79 -86
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +17 -15
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +2 -3
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +6 -6
- package/dist/runtime/spots/spot-timer.js +26 -30
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +21 -8
- package/dist/runtime/streams/actor-session-binding-registry.js +168 -148
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +20 -17
- package/dist/runtime/streams/bound-session-response-target.js +8 -1
- package/dist/runtime/streams/bound-session-service.d.ts +1 -0
- package/dist/runtime/streams/bound-session-service.js +14 -12
- package/dist/runtime/streams/index.js +28 -20
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +52 -31
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.d.ts +5 -1
- package/dist/runtime/streams/protocol.js +68 -20
- package/dist/runtime/streams/session-actor-coordinator.js +37 -41
- package/dist/runtime/streams/session-context.d.ts +9 -2
- package/dist/runtime/streams/session-context.js +50 -32
- package/dist/runtime/streams/session-local-actors.d.ts +3 -1
- package/dist/runtime/streams/session-local-actors.js +17 -2
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.d.ts +1 -1
- package/dist/runtime/streams/stream-frame-factory.js +14 -7
- package/dist/runtime/streams/stream-session-runtime.js +112 -78
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +3 -3
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +2 -2
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +142 -134
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +1 -32
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +353 -326
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +77 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +370 -390
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +44 -44
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +218 -206
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +12 -47
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/dispatch-error-details.ts +62 -0
- package/src/runtime/diagnostics/flow-context.ts +18 -7
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +107 -79
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -55
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +364 -396
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1233 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +170 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +19 -18
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +595 -564
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +196 -148
- package/src/runtime/spots/spot-actor-packet-drain.ts +56 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +235 -222
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +129 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +13 -18
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +58 -47
- package/src/runtime/spots/spot-timer.ts +103 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +421 -292
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +8 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +60 -50
- package/src/runtime/streams/bound-session-response-target.ts +39 -9
- package/src/runtime/streams/bound-session-service.ts +52 -42
- package/src/runtime/streams/index.ts +183 -100
- package/src/runtime/streams/managed-stream.ts +123 -90
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +115 -46
- package/src/runtime/streams/session-actor-coordinator.ts +109 -93
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +96 -51
- package/src/runtime/streams/session-local-actors.ts +19 -3
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +59 -40
- package/src/runtime/streams/stream-session-runtime.ts +317 -214
- package/src/runtime/workers/index.ts +68 -29
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ZLinkActorSessionBindingRegistry = void 0;
|
|
3
|
+
exports.ZLinkActorSessionBindingRegistry = exports.ZLinkActorSessionBindingTermination = void 0;
|
|
4
4
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
5
5
|
const abort_1 = require("../abort");
|
|
6
6
|
const node_async_hooks_1 = require("node:async_hooks");
|
|
7
7
|
const state_lane_1 = require("../execution/state-lane");
|
|
8
8
|
const routing_id_1 = require("../routing-id");
|
|
9
9
|
const detachedStateLaneResource = new node_async_hooks_1.AsyncResource('zlink:actor-session-binding-registry');
|
|
10
|
+
var ZLinkActorSessionBindingTermination;
|
|
11
|
+
(function (ZLinkActorSessionBindingTermination) {
|
|
12
|
+
ZLinkActorSessionBindingTermination[ZLinkActorSessionBindingTermination["BindingEnd"] = 0] = "BindingEnd";
|
|
13
|
+
ZLinkActorSessionBindingTermination[ZLinkActorSessionBindingTermination["PhysicalDisconnect"] = 1] = "PhysicalDisconnect";
|
|
14
|
+
})(ZLinkActorSessionBindingTermination || (exports.ZLinkActorSessionBindingTermination = ZLinkActorSessionBindingTermination = {}));
|
|
10
15
|
class ZLinkActorSessionBindingRegistry {
|
|
11
16
|
terminalRelocationCapacity;
|
|
12
17
|
outboundCapacity;
|
|
13
18
|
sealWaitTimeoutMs;
|
|
19
|
+
errorSink;
|
|
14
20
|
lane = new state_lane_1.ZLinkStateLane();
|
|
15
21
|
routes = new Map();
|
|
22
|
+
nextActorSlots = new WeakMap();
|
|
16
23
|
sealWaiters = new Map();
|
|
17
24
|
activeFrameWaiters = new Map();
|
|
18
25
|
relocations = new Map();
|
|
@@ -24,10 +31,11 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
24
31
|
// (the sealing side) must observe that bound; an unbounded wait here
|
|
25
32
|
// turns a lost control or a lifecycle interlock into a silent stall
|
|
26
33
|
// (spec 48:205 — transport/deadline limits apply during relocation).
|
|
27
|
-
sealWaitTimeoutMs = 3_000) {
|
|
34
|
+
sealWaitTimeoutMs = 3_000, errorSink) {
|
|
28
35
|
this.terminalRelocationCapacity = terminalRelocationCapacity;
|
|
29
36
|
this.outboundCapacity = outboundCapacity;
|
|
30
37
|
this.sealWaitTimeoutMs = sealWaitTimeoutMs;
|
|
38
|
+
this.errorSink = errorSink;
|
|
31
39
|
if (!Number.isSafeInteger(terminalRelocationCapacity) || terminalRelocationCapacity <= 0) {
|
|
32
40
|
throw new RangeError('Session relocation terminal capacity must be a positive safe integer.');
|
|
33
41
|
}
|
|
@@ -38,62 +46,78 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
38
46
|
throw new RangeError('Session relocation seal timeout must be a positive safe integer.');
|
|
39
47
|
}
|
|
40
48
|
}
|
|
41
|
-
async bind(context, actor, bindingToken, authorityFence, sessionIdentity) {
|
|
42
|
-
await this.lane.run(() => this.
|
|
49
|
+
async bind(context, actor, bindingToken, authorityFence, sessionIdentity, commitActor) {
|
|
50
|
+
await this.lane.run(() => this.commitCore(undefined, context, actor, bindingToken, authorityFence, sessionIdentity, commitActor));
|
|
43
51
|
}
|
|
44
|
-
|
|
45
|
-
this.routes.set(actor.actorId, {
|
|
46
|
-
context,
|
|
47
|
-
actor,
|
|
48
|
-
bindingToken,
|
|
49
|
-
sessionIdentity: sessionIdentity ?? sessionIdentityFromContext(context),
|
|
50
|
-
activeFrames: { count: 0, requests: new Set() },
|
|
51
|
-
authorityFence
|
|
52
|
-
});
|
|
53
|
-
context.bindLocal(actor, bindingToken);
|
|
54
|
-
}
|
|
55
|
-
async replace(previous, context, actor, bindingToken, authorityFence, sessionIdentity) {
|
|
56
|
-
await this.lane.run(() => this.replaceCore(previous, context, actor, bindingToken, authorityFence, sessionIdentity));
|
|
57
|
-
}
|
|
58
|
-
replaceCore(previous, context, actor, bindingToken, authorityFence, sessionIdentity) {
|
|
52
|
+
async commitCore(previous, context, actor, bindingToken, authorityFence, sessionIdentity, commitActor) {
|
|
59
53
|
const current = this.routes.get(actor.actorId);
|
|
60
54
|
if (current !== previous) {
|
|
61
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorSessionNotBound, `Actor '${actor.actorId}' session binding changed before route
|
|
55
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorSessionNotBound, `Actor '${actor.actorId}' session binding changed before route commit.`, true);
|
|
62
56
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
57
|
+
const sameBinding = previous !== undefined &&
|
|
58
|
+
previous.context === context &&
|
|
59
|
+
previous.bindingToken === bindingToken;
|
|
60
|
+
const actorSlot = sameBinding ? previous.actorSlot : this.issueActorSlot(context);
|
|
61
|
+
commitActor?.();
|
|
62
|
+
context.bindLocal(actor, bindingToken, actorSlot);
|
|
63
|
+
try {
|
|
64
|
+
if (previous !== undefined && !sameBinding) {
|
|
65
|
+
this.routes.delete(actor.actorId);
|
|
68
66
|
previous.context.unbindLocal(actor.actorId, previous.bindingToken);
|
|
67
|
+
if (previous.actorSlot !== undefined) {
|
|
68
|
+
let unbound;
|
|
69
|
+
try {
|
|
70
|
+
unbound = previous.context.actorSlotControls?.enqueueUnbound(previous.actorSlot);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
unbound = Promise.reject(error);
|
|
74
|
+
}
|
|
75
|
+
void unbound?.catch((error) => this.errorSink?.()?.reportRuntimeTaskException('retired session actor unbound', error));
|
|
76
|
+
}
|
|
69
77
|
}
|
|
70
|
-
|
|
71
|
-
context.
|
|
72
|
-
previous.context.bindLocal(previous.actor, previous.bindingToken);
|
|
73
|
-
throw error;
|
|
78
|
+
if (!sameBinding && actorSlot !== undefined) {
|
|
79
|
+
await context.actorSlotControls.enqueueBound(actorSlot, actor.actorId);
|
|
74
80
|
}
|
|
75
81
|
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
context.unbindLocal(actor.actorId, bindingToken);
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
76
86
|
this.routes.set(actor.actorId, {
|
|
77
87
|
context,
|
|
78
88
|
actor,
|
|
79
89
|
bindingToken,
|
|
90
|
+
actorSlot,
|
|
80
91
|
sessionIdentity: sessionIdentity ?? sessionIdentityFromContext(context),
|
|
81
|
-
activeFrames: previous
|
|
82
|
-
sealId: previous
|
|
83
|
-
authorityFence: authorityFence ?? previous
|
|
92
|
+
activeFrames: previous?.activeFrames ?? { count: 0, requests: new Set() },
|
|
93
|
+
sealId: previous?.sealId,
|
|
94
|
+
authorityFence: authorityFence ?? previous?.authorityFence
|
|
84
95
|
});
|
|
85
96
|
}
|
|
86
|
-
|
|
87
|
-
|
|
97
|
+
issueActorSlot(context) {
|
|
98
|
+
if (context.actorSlotControls === undefined)
|
|
99
|
+
return undefined;
|
|
100
|
+
const actorSlot = this.nextActorSlots.get(context) ?? 1;
|
|
101
|
+
if (actorSlot > 0xffff) {
|
|
102
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidOperation, `Stream session '${String(context.routingId)}' exhausted its Actor slots.`);
|
|
103
|
+
}
|
|
104
|
+
this.nextActorSlots.set(context, actorSlot + 1);
|
|
105
|
+
return actorSlot;
|
|
106
|
+
}
|
|
107
|
+
async replace(previous, context, actor, bindingToken, authorityFence, sessionIdentity, commitActor) {
|
|
108
|
+
await this.lane.run(() => this.commitCore(previous, context, actor, bindingToken, authorityFence, sessionIdentity, commitActor));
|
|
109
|
+
}
|
|
110
|
+
async replaceAndReleaseSeal(previous, context, actor, bindingToken, sealId, authorityFence, sessionIdentity, commitActor) {
|
|
111
|
+
await this.lane.run(() => this.replaceAndReleaseSealCore(previous, context, actor, bindingToken, sealId, authorityFence, sessionIdentity, commitActor));
|
|
88
112
|
}
|
|
89
|
-
replaceAndReleaseSealCore(previous, context, actor, bindingToken, sealId, authorityFence, sessionIdentity) {
|
|
113
|
+
async replaceAndReleaseSealCore(previous, context, actor, bindingToken, sealId, authorityFence, sessionIdentity, commitActor) {
|
|
90
114
|
if (previous.sealId !== sealId) {
|
|
91
115
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${actor.actorId}' route switch did not match its relocation seal.`, true);
|
|
92
116
|
}
|
|
93
117
|
// JavaScript cannot interleave another ingress turn between these two
|
|
94
118
|
// synchronous mutations. The replacement preserves the seal, then the
|
|
95
119
|
// exact release publishes the route to held ingress as one owner turn.
|
|
96
|
-
this.
|
|
120
|
+
await this.commitCore(previous, context, actor, bindingToken, authorityFence, sessionIdentity, commitActor);
|
|
97
121
|
if (!this.abortSealCore(actor.actorId, sealId)) {
|
|
98
122
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${actor.actorId}' route switch lost its relocation seal.`, true);
|
|
99
123
|
}
|
|
@@ -120,10 +144,10 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
120
144
|
}
|
|
121
145
|
return Object.freeze({ context: route.context });
|
|
122
146
|
}
|
|
123
|
-
async unbind(actorId, context, bindingToken) {
|
|
124
|
-
await this.lane.run(() => this.unbindCore(actorId, context, bindingToken));
|
|
147
|
+
async unbind(actorId, context, bindingToken, termination = ZLinkActorSessionBindingTermination.BindingEnd) {
|
|
148
|
+
await this.lane.run(() => this.unbindCore(actorId, context, bindingToken, termination));
|
|
125
149
|
}
|
|
126
|
-
unbindCore(actorId, context, bindingToken) {
|
|
150
|
+
async unbindCore(actorId, context, bindingToken, termination) {
|
|
127
151
|
const route = this.routes.get(actorId);
|
|
128
152
|
if (route === undefined || route.context !== context || route.bindingToken !== bindingToken) {
|
|
129
153
|
return;
|
|
@@ -133,24 +157,28 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
133
157
|
this.rejectSealWaiters(actorId, new Error(`Actor '${actorId}' session binding was removed while ingress was held.`));
|
|
134
158
|
this.rejectActiveFrameWaiters(actorId, new Error(`Actor '${actorId}' session binding was removed while accepted frames were active.`));
|
|
135
159
|
this.clearRouteRelocation(actorId, route, new Error(`Actor '${actorId}' session binding was removed.`));
|
|
160
|
+
if (termination === ZLinkActorSessionBindingTermination.BindingEnd &&
|
|
161
|
+
route.actorSlot !== undefined) {
|
|
162
|
+
await context.actorSlotControls?.enqueueUnbound(route.actorSlot);
|
|
163
|
+
}
|
|
136
164
|
}
|
|
137
165
|
async unbindActor(actorId) {
|
|
138
166
|
await this.lane.run(() => this.unbindActorCore(actorId));
|
|
139
167
|
}
|
|
140
|
-
unbindActorCore(actorId) {
|
|
168
|
+
async unbindActorCore(actorId) {
|
|
141
169
|
const route = this.routes.get(actorId);
|
|
142
170
|
if (route === undefined) {
|
|
143
171
|
return;
|
|
144
172
|
}
|
|
145
|
-
this.unbindCore(actorId, route.context, route.bindingToken);
|
|
173
|
+
await this.unbindCore(actorId, route.context, route.bindingToken, ZLinkActorSessionBindingTermination.BindingEnd);
|
|
146
174
|
}
|
|
147
175
|
async cleanup(context) {
|
|
148
176
|
await this.lane.run(() => this.cleanupCore(context));
|
|
149
177
|
}
|
|
150
|
-
cleanupCore(context) {
|
|
178
|
+
async cleanupCore(context) {
|
|
151
179
|
for (const route of [...this.routes.values()]) {
|
|
152
180
|
if (route.context === context) {
|
|
153
|
-
this.unbindCore(route.actor.actorId, context, route.bindingToken);
|
|
181
|
+
await this.unbindCore(route.actor.actorId, context, route.bindingToken, ZLinkActorSessionBindingTermination.PhysicalDisconnect);
|
|
154
182
|
}
|
|
155
183
|
}
|
|
156
184
|
}
|
|
@@ -238,8 +266,8 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
238
266
|
return;
|
|
239
267
|
completed = true;
|
|
240
268
|
route.activeFrames.count--;
|
|
241
|
-
if (route.activeFrames.count === 0
|
|
242
|
-
|
|
269
|
+
if (route.activeFrames.count === 0 &&
|
|
270
|
+
this.routes.get(actorId)?.activeFrames === route.activeFrames) {
|
|
243
271
|
this.resolveActiveFrameWaiters(actorId);
|
|
244
272
|
}
|
|
245
273
|
};
|
|
@@ -356,9 +384,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
356
384
|
assertRelocationClaim(existing, claim);
|
|
357
385
|
return { kind: 'existing', wait: existing.ready };
|
|
358
386
|
}
|
|
359
|
-
const predecessor = queue?.activeSealId === undefined
|
|
360
|
-
? undefined
|
|
361
|
-
: queue.seals.get(queue.activeSealId);
|
|
387
|
+
const predecessor = queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
362
388
|
if (predecessor !== undefined && predecessor.phase !== 'terminal') {
|
|
363
389
|
if (predecessor.sessionIdentity === undefined || claim.sessionIdentity === undefined) {
|
|
364
390
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${claim.actorId}' session ingress is sealed by another relocation.`, true);
|
|
@@ -368,7 +394,9 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
368
394
|
}
|
|
369
395
|
this.sealCore(claim.actorId, claim.sealId, expected);
|
|
370
396
|
let resolveTerminal;
|
|
371
|
-
const terminal = new Promise((resolve) => {
|
|
397
|
+
const terminal = new Promise((resolve) => {
|
|
398
|
+
resolveTerminal = resolve;
|
|
399
|
+
});
|
|
372
400
|
const ready = this.waitForActiveFramesCore(claim.actorId, signal);
|
|
373
401
|
const actorQueue = queue ?? {
|
|
374
402
|
actorId: claim.actorId,
|
|
@@ -402,10 +430,10 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
402
430
|
if (sealId !== undefined) {
|
|
403
431
|
const queue = this.relocations.get(actorId);
|
|
404
432
|
const state = queue?.seals.get(sealId);
|
|
405
|
-
if (queue === undefined
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
433
|
+
if (queue === undefined ||
|
|
434
|
+
state === undefined ||
|
|
435
|
+
(queue.activeSealId !== sealId &&
|
|
436
|
+
!(queue.activeSealId === undefined && state.phase === 'terminal'))) {
|
|
409
437
|
failRetainedOutbound(operation, new Error(`Actor '${actorId}' Session outbound did not match its exact relocation seal.`));
|
|
410
438
|
return 'rejected';
|
|
411
439
|
}
|
|
@@ -417,9 +445,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
417
445
|
}
|
|
418
446
|
admitRelocationOutboundCore(claim, operation) {
|
|
419
447
|
const queue = this.relocations.get(claim.actorId);
|
|
420
|
-
const state = queue?.activeSealId === undefined
|
|
421
|
-
? undefined
|
|
422
|
-
: queue.seals.get(queue.activeSealId);
|
|
448
|
+
const state = queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
423
449
|
const error = this.outboundAdmissionError(claim);
|
|
424
450
|
if (error !== undefined) {
|
|
425
451
|
failRetainedOutbound(operation, error);
|
|
@@ -437,14 +463,11 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
437
463
|
if (state.phase === 'sealed' || state.phase === 'applying') {
|
|
438
464
|
const matchesSource = matchesRelocationSourceProof(state, claim);
|
|
439
465
|
const matchesCurrent = this.matchesCurrentProducerNode(claim);
|
|
440
|
-
const authorization = matchesSource || matchesCurrent
|
|
441
|
-
? 'source'
|
|
442
|
-
: 'pendingTarget';
|
|
466
|
+
const authorization = matchesSource || matchesCurrent ? 'source' : 'pendingTarget';
|
|
443
467
|
return this.retainRelocationOutboundCore(claim.actorId, operation, authorization, claim);
|
|
444
468
|
}
|
|
445
469
|
const acceptedProof = state.acceptedProducerProof;
|
|
446
|
-
if (acceptedProof === undefined
|
|
447
|
-
|| !matchesAcceptedProducerProof(acceptedProof, claim)) {
|
|
470
|
+
if (acceptedProof === undefined || !matchesAcceptedProducerProof(acceptedProof, claim)) {
|
|
448
471
|
failRetainedOutbound(operation, new Error(`Actor '${claim.actorId}' Session outbound admission did not match its accepted producer proof.`));
|
|
449
472
|
return 'rejected';
|
|
450
473
|
}
|
|
@@ -452,9 +475,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
452
475
|
}
|
|
453
476
|
retainRelocationOutboundCore(actorId, operation, authorization, claim) {
|
|
454
477
|
const queue = this.relocations.get(actorId);
|
|
455
|
-
const state = queue?.activeSealId === undefined
|
|
456
|
-
? undefined
|
|
457
|
-
: queue.seals.get(queue.activeSealId);
|
|
478
|
+
const state = queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
458
479
|
if (queue === undefined)
|
|
459
480
|
return 'passThrough';
|
|
460
481
|
if (state === undefined || state.phase === 'applied' || state.phase === 'terminal') {
|
|
@@ -535,9 +556,9 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
535
556
|
}
|
|
536
557
|
return { queue, state, applyPromise: state.applyPromise };
|
|
537
558
|
}
|
|
538
|
-
if (action === 'commit'
|
|
539
|
-
|
|
540
|
-
|
|
559
|
+
if (action === 'commit' &&
|
|
560
|
+
acceptedProducerProof !== undefined &&
|
|
561
|
+
!validAcceptedTargetProof(state, acceptedProducerProof)) {
|
|
541
562
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${actorId}' command 44 target producer proof did not match its Session seal.`, true);
|
|
542
563
|
}
|
|
543
564
|
if (action === 'abort' && acceptedProducerProof !== undefined) {
|
|
@@ -567,7 +588,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
567
588
|
completeRelocationApply(prepared) {
|
|
568
589
|
const { queue, state, action, acceptedProducerProof, actorId, sealId } = prepared;
|
|
569
590
|
const proof = action === 'commit'
|
|
570
|
-
? acceptedProducerProof ?? this.currentProducerProof(actorId)
|
|
591
|
+
? (acceptedProducerProof ?? this.currentProducerProof(actorId))
|
|
571
592
|
: relocationSourceProof(state);
|
|
572
593
|
state.acceptedProducerProof = proof;
|
|
573
594
|
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
@@ -578,10 +599,10 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
578
599
|
entry.released = true;
|
|
579
600
|
continue;
|
|
580
601
|
}
|
|
581
|
-
if (action === 'commit'
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
602
|
+
if (action === 'commit' &&
|
|
603
|
+
proof !== undefined &&
|
|
604
|
+
entry.claim !== undefined &&
|
|
605
|
+
matchesAcceptedProducerProof(proof, entry.claim)) {
|
|
585
606
|
entry.released = true;
|
|
586
607
|
continue;
|
|
587
608
|
}
|
|
@@ -601,16 +622,16 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
601
622
|
const route = this.routes.get(actorId);
|
|
602
623
|
const actorRef = (route?.actor).ref;
|
|
603
624
|
const sessionIdentity = route?.sessionIdentity;
|
|
604
|
-
if (route === undefined
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
625
|
+
if (route === undefined ||
|
|
626
|
+
actorRef === undefined ||
|
|
627
|
+
sessionIdentity === undefined ||
|
|
628
|
+
actorRef.ownerNodeGeneration === undefined)
|
|
608
629
|
return undefined;
|
|
609
630
|
return {
|
|
610
631
|
actorId,
|
|
611
|
-
objectGeneration: BigInt(actorRef.objectGeneration
|
|
612
|
-
|
|
613
|
-
|
|
632
|
+
objectGeneration: BigInt(actorRef.objectGeneration ??
|
|
633
|
+
actorRef.generation ??
|
|
634
|
+
-1),
|
|
614
635
|
actorNodeRid: String(actorRef.nodeRid ?? ''),
|
|
615
636
|
actorNodeGeneration: BigInt(actorRef.ownerNodeGeneration),
|
|
616
637
|
sessionIdentity: String(sessionIdentity),
|
|
@@ -623,10 +644,10 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
623
644
|
observeRelocationTerminalCore(actorId, sealId, applyFingerprint) {
|
|
624
645
|
const queue = this.relocations.get(actorId);
|
|
625
646
|
const state = queue?.seals.get(sealId);
|
|
626
|
-
if (queue === undefined
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
647
|
+
if (queue === undefined ||
|
|
648
|
+
state === undefined ||
|
|
649
|
+
state.applyFingerprint !== applyFingerprint ||
|
|
650
|
+
(state.phase !== 'applied' && state.phase !== 'terminal')) {
|
|
630
651
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${actorId}' Session relocation terminal did not match its exact route apply.`, true);
|
|
631
652
|
}
|
|
632
653
|
if (state.phase === 'terminal') {
|
|
@@ -680,9 +701,9 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
680
701
|
return;
|
|
681
702
|
const activeSealId = queue.activeSealId;
|
|
682
703
|
const activeState = activeSealId === undefined ? undefined : queue.seals.get(activeSealId);
|
|
683
|
-
const ownsActiveSeal = activeState !== undefined
|
|
684
|
-
|
|
685
|
-
|
|
704
|
+
const ownsActiveSeal = activeState !== undefined &&
|
|
705
|
+
activeState.phase !== 'terminal' &&
|
|
706
|
+
activeState.sessionIdentity === route.sessionIdentity;
|
|
686
707
|
if (!ownsActiveSeal) {
|
|
687
708
|
// Nothing this exact route still holds open — leave terminal
|
|
688
709
|
// retention and any other Session's active seal untouched.
|
|
@@ -725,8 +746,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
725
746
|
}
|
|
726
747
|
validateSealCore(actorId, sealId) {
|
|
727
748
|
const route = this.routes.get(actorId);
|
|
728
|
-
return route !== undefined
|
|
729
|
-
&& route.sealId === sealId;
|
|
749
|
+
return route !== undefined && route.sealId === sealId;
|
|
730
750
|
}
|
|
731
751
|
/** True while a relocation seal currently holds this actor's ingress. */
|
|
732
752
|
async isSealed(actorId) {
|
|
@@ -952,30 +972,30 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
952
972
|
failRetainedOutbound(entry.operation, error);
|
|
953
973
|
}
|
|
954
974
|
outboundAdmissionError(claim) {
|
|
955
|
-
if (claim.actorId.length === 0
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
975
|
+
if (claim.actorId.length === 0 ||
|
|
976
|
+
claim.objectGeneration <= 0n ||
|
|
977
|
+
claim.actorNodeRid.length === 0 ||
|
|
978
|
+
claim.actorNodeGeneration <= 0n ||
|
|
979
|
+
claim.producerNodeRid.length === 0 ||
|
|
980
|
+
claim.producerNodeGeneration <= 0n ||
|
|
981
|
+
claim.bindingGeneration <= 0n ||
|
|
982
|
+
claim.sessionIdentity.length === 0 ||
|
|
983
|
+
!(0, routing_id_1.routingIdsEqual)(claim.producerNodeRid, claim.actorNodeRid) ||
|
|
984
|
+
claim.producerNodeGeneration !== claim.actorNodeGeneration) {
|
|
965
985
|
return new Error(`Actor '${claim.actorId}' Session outbound admission claim is invalid.`);
|
|
966
986
|
}
|
|
967
987
|
const route = this.routes.get(claim.actorId);
|
|
968
988
|
const ref = route?.actor;
|
|
969
989
|
const actorRef = ref?.ref;
|
|
970
990
|
const routeSessionIdentity = route?.sessionIdentity;
|
|
971
|
-
if (route === undefined
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
991
|
+
if (route === undefined ||
|
|
992
|
+
actorRef === undefined ||
|
|
993
|
+
String(actorRef.actorId ?? claim.actorId) !== claim.actorId ||
|
|
994
|
+
BigInt(actorRef.objectGeneration ??
|
|
995
|
+
actorRef.generation ??
|
|
996
|
+
-1) !== claim.objectGeneration ||
|
|
997
|
+
BigInt(actorRef.bindingGeneration ?? -1) !== claim.bindingGeneration ||
|
|
998
|
+
String(routeSessionIdentity ?? '') !== claim.sessionIdentity) {
|
|
979
999
|
return new Error(`Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`);
|
|
980
1000
|
}
|
|
981
1001
|
return undefined;
|
|
@@ -983,9 +1003,9 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
983
1003
|
matchesCurrentProducerNode(claim) {
|
|
984
1004
|
const route = this.routes.get(claim.actorId);
|
|
985
1005
|
const actorRef = (route?.actor).ref;
|
|
986
|
-
return route !== undefined
|
|
987
|
-
|
|
988
|
-
|
|
1006
|
+
return (route !== undefined &&
|
|
1007
|
+
actorRef !== undefined &&
|
|
1008
|
+
(0, routing_id_1.routingIdsEqual)(String(actorRef.nodeRid ?? ''), claim.actorNodeRid));
|
|
989
1009
|
}
|
|
990
1010
|
rememberTerminalRelocation(state) {
|
|
991
1011
|
this.terminalRelocations.delete(state);
|
|
@@ -1003,11 +1023,11 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
1003
1023
|
}
|
|
1004
1024
|
}
|
|
1005
1025
|
deleteEmptyRelocationQueue(queue) {
|
|
1006
|
-
if (queue.activeSealId === undefined
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1026
|
+
if (queue.activeSealId === undefined &&
|
|
1027
|
+
queue.seals.size === 0 &&
|
|
1028
|
+
queue.outbound.length === 0 &&
|
|
1029
|
+
queue.drainPromise === undefined &&
|
|
1030
|
+
this.relocations.get(queue.actorId) === queue) {
|
|
1011
1031
|
this.relocations.delete(queue.actorId);
|
|
1012
1032
|
}
|
|
1013
1033
|
}
|
|
@@ -1030,11 +1050,11 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
1030
1050
|
}
|
|
1031
1051
|
exports.ZLinkActorSessionBindingRegistry = ZLinkActorSessionBindingRegistry;
|
|
1032
1052
|
function assertRelocationClaim(state, claim) {
|
|
1033
|
-
if (state.actorGeneration !== claim.actorGeneration
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1053
|
+
if (state.actorGeneration !== claim.actorGeneration ||
|
|
1054
|
+
state.bindingGeneration !== claim.bindingGeneration ||
|
|
1055
|
+
state.sessionIdentity !== claim.sessionIdentity ||
|
|
1056
|
+
state.actorNodeRid !== claim.actorNodeRid ||
|
|
1057
|
+
state.actorNodeGeneration !== claim.actorNodeGeneration) {
|
|
1038
1058
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${claim.actorId}' repeated Session seal changed its exact identity.`, true);
|
|
1039
1059
|
}
|
|
1040
1060
|
}
|
|
@@ -1042,34 +1062,34 @@ function startOutsideStateLane(work) {
|
|
|
1042
1062
|
return detachedStateLaneResource.runInAsyncScope(work);
|
|
1043
1063
|
}
|
|
1044
1064
|
function matchesRelocationSourceProof(state, claim) {
|
|
1045
|
-
return state.actorId === claim.actorId
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1065
|
+
return (state.actorId === claim.actorId &&
|
|
1066
|
+
state.actorGeneration === claim.objectGeneration &&
|
|
1067
|
+
state.bindingGeneration === claim.bindingGeneration &&
|
|
1068
|
+
state.sessionIdentity === claim.sessionIdentity &&
|
|
1069
|
+
state.actorNodeRid !== undefined &&
|
|
1070
|
+
(0, routing_id_1.routingIdsEqual)(state.actorNodeRid, claim.actorNodeRid) &&
|
|
1071
|
+
state.actorNodeGeneration === claim.actorNodeGeneration);
|
|
1052
1072
|
}
|
|
1053
1073
|
function matchesAcceptedProducerProof(proof, claim) {
|
|
1054
|
-
return proof.actorId === claim.actorId
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1074
|
+
return (proof.actorId === claim.actorId &&
|
|
1075
|
+
proof.objectGeneration === claim.objectGeneration &&
|
|
1076
|
+
(0, routing_id_1.routingIdsEqual)(proof.actorNodeRid, claim.actorNodeRid) &&
|
|
1077
|
+
proof.actorNodeGeneration === claim.actorNodeGeneration &&
|
|
1078
|
+
proof.sessionIdentity === claim.sessionIdentity &&
|
|
1079
|
+
proof.bindingGeneration === claim.bindingGeneration);
|
|
1060
1080
|
}
|
|
1061
1081
|
function validAcceptedTargetProof(state, proof) {
|
|
1062
|
-
return proof.actorId === state.actorId
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1082
|
+
return (proof.actorId === state.actorId &&
|
|
1083
|
+
proof.objectGeneration === state.actorGeneration &&
|
|
1084
|
+
proof.actorNodeRid.length > 0 &&
|
|
1085
|
+
proof.actorNodeGeneration > 0n &&
|
|
1086
|
+
proof.sessionIdentity === state.sessionIdentity &&
|
|
1087
|
+
proof.bindingGeneration === state.bindingGeneration);
|
|
1068
1088
|
}
|
|
1069
1089
|
function relocationSourceProof(state) {
|
|
1070
|
-
if (state.sessionIdentity === undefined
|
|
1071
|
-
|
|
1072
|
-
|
|
1090
|
+
if (state.sessionIdentity === undefined ||
|
|
1091
|
+
state.actorNodeRid === undefined ||
|
|
1092
|
+
state.actorNodeGeneration === undefined)
|
|
1073
1093
|
return undefined;
|
|
1074
1094
|
return {
|
|
1075
1095
|
actorId: state.actorId,
|
|
@@ -1090,17 +1110,17 @@ function failRetainedOutbound(operation, error) {
|
|
|
1090
1110
|
}
|
|
1091
1111
|
}
|
|
1092
1112
|
function assertSuccessorSessionIdentity(predecessor, successor) {
|
|
1093
|
-
if (predecessor.actorGeneration !== successor.actorGeneration
|
|
1094
|
-
|
|
1095
|
-
|
|
1113
|
+
if (predecessor.actorGeneration !== successor.actorGeneration ||
|
|
1114
|
+
predecessor.bindingGeneration !== successor.bindingGeneration ||
|
|
1115
|
+
predecessor.sessionIdentity !== successor.sessionIdentity) {
|
|
1096
1116
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${successor.actorId}' successor Session seal changed its exact Session identity.`, true);
|
|
1097
1117
|
}
|
|
1098
1118
|
}
|
|
1099
1119
|
function routeMatchesFence(route, expected) {
|
|
1100
1120
|
const ref = route.actor.ref;
|
|
1101
|
-
return ref !== undefined
|
|
1102
|
-
|
|
1103
|
-
|
|
1121
|
+
return (ref !== undefined &&
|
|
1122
|
+
BigInt(ref.objectGeneration ?? ref.generation ?? -1n) === expected.objectGeneration &&
|
|
1123
|
+
ref.bindingGeneration === expected.bindingGeneration);
|
|
1104
1124
|
}
|
|
1105
1125
|
function sessionIdentityFromContext(context) {
|
|
1106
1126
|
return context.routingId === undefined ? undefined : String(context.routingId);
|
|
@@ -1119,7 +1139,7 @@ function waitForSessionRelocation(operation, signal) {
|
|
|
1119
1139
|
operation.then(() => {
|
|
1120
1140
|
signal.removeEventListener('abort', onAbort);
|
|
1121
1141
|
resolve();
|
|
1122
|
-
}, error => {
|
|
1142
|
+
}, (error) => {
|
|
1123
1143
|
signal.removeEventListener('abort', onAbort);
|
|
1124
1144
|
reject(error);
|
|
1125
1145
|
});
|
|
@@ -2,6 +2,7 @@ import type { ActorRef } from '../../contracts';
|
|
|
2
2
|
import type { ServiceSessionBindingAdmissionClaim, ServiceSessionBindingAdmissionResult } from '../foundation/service-session-binding-ingress-port';
|
|
3
3
|
import type { ZLinkActorSessionAuthorityFence, ZLinkActorSessionAcceptedProducerProof, ZLinkActorSessionRelocationClaim, ZLinkActorSessionRelocationSnapshot, ZLinkActorSessionRetainedOutbound, ZLinkActorSessionRouteFence } from './actor-session-binding-registry';
|
|
4
4
|
export interface ZLinkActorSessionBindingRuntimeOwner {
|
|
5
|
+
actorSlot(actorId: string, sessionRid: string): Promise<number | undefined>;
|
|
5
6
|
sealRelocation(claim: ZLinkActorSessionRelocationClaim, expected: ZLinkActorSessionRouteFence, signal?: AbortSignal): Promise<void>;
|
|
6
7
|
relocationSnapshot(actorId: string, sealId: string): Promise<ZLinkActorSessionRelocationSnapshot | undefined>;
|
|
7
8
|
retainRelocationOutbound(actorId: string, operation: ZLinkActorSessionRetainedOutbound, sealId?: string): Promise<ServiceSessionBindingAdmissionResult>;
|
|
@@ -6,7 +6,9 @@ class ZLinkActorSessionLifecycleCoordinator {
|
|
|
6
6
|
async run(actorId, operation) {
|
|
7
7
|
const previous = this.tails.get(actorId) ?? Promise.resolve();
|
|
8
8
|
let release;
|
|
9
|
-
const current = new Promise((resolve) => {
|
|
9
|
+
const current = new Promise((resolve) => {
|
|
10
|
+
release = resolve;
|
|
11
|
+
});
|
|
10
12
|
const tail = previous.catch(() => undefined).then(() => current);
|
|
11
13
|
this.tails.set(actorId, tail);
|
|
12
14
|
await previous.catch(() => undefined);
|