@zlink-systems/framework 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +16 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +28 -0
- package/dist/runtime/activation-admission.js +57 -0
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +19 -17
- package/dist/runtime/actors/actor-handoff.d.ts +13 -7
- package/dist/runtime/actors/actor-handoff.js +36 -25
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +85 -123
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
- package/dist/runtime/actors/actor-remote-joiner.js +11 -17
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
- package/dist/runtime/actors/deferred-join-completion.js +21 -0
- package/dist/runtime/actors/index.d.ts +10 -8
- package/dist/runtime/actors/index.js +101 -73
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +7 -1
- package/dist/runtime/admission.js +11 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +8 -33
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
- package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
- package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -9
- package/dist/runtime/channels/channel-clients.js +68 -60
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -18
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
- package/dist/runtime/channels/channel-runtime-manager.js +4 -12
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
- package/dist/runtime/channels/channel-socket-registry.js +296 -235
- package/dist/runtime/channels/channel-transports.d.ts +11 -20
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +133 -81
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +22 -9
- package/dist/runtime/execution/index.js +107 -37
- package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
- package/dist/runtime/execution/serial-execution-queue.js +99 -26
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/listener-records.d.ts +11 -0
- package/dist/runtime/foundation/listener-records.js +20 -0
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
- package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
- package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
- package/dist/runtime/foundation/service-topology-registry.js +22 -61
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
- package/dist/runtime/host/actor-transfer-runtime.js +210 -256
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +19 -14
- package/dist/runtime/host/index.js +234 -175
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +11 -23
- package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
- package/dist/runtime/host/route-mesh-runtime.js +178 -257
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
- package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
- package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
- package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
- package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +5 -10
- package/dist/runtime/locations/lifecycle.js +4 -33
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +44 -30
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
- package/dist/runtime/locations/spot-location-claims.js +40 -23
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
- package/dist/runtime/spots/index.d.ts +29 -29
- package/dist/runtime/spots/index.js +441 -313
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
- package/dist/runtime/spots/spot-activation-registry.js +27 -60
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
- package/dist/runtime/spots/spot-activation-state.js +4 -17
- package/dist/runtime/spots/spot-activation.d.ts +10 -9
- package/dist/runtime/spots/spot-activation.js +103 -81
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
- package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
- package/dist/runtime/spots/spot-actor-membership.js +44 -53
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-entry-activation.js +9 -21
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +6 -5
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
- package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +10 -37
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
- package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
- package/dist/runtime/spots/spot-serial-executor.js +9 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
- package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
- package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +12 -19
- package/dist/runtime/streams/index.d.ts +15 -14
- package/dist/runtime/streams/index.js +38 -39
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/session-serial-executor.js +2 -2
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +15 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +72 -0
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +45 -39
- package/src/runtime/actors/actor-handoff.ts +55 -45
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +174 -215
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +15 -36
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/actor-source-transfer.ts +5 -18
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +44 -0
- package/src/runtime/actors/index.ts +122 -88
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +13 -2
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +15 -42
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
- package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
- package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
- package/src/runtime/backend/raw-binding-port.ts +14 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -31
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +8 -15
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +369 -262
- package/src/runtime/channels/channel-transports.ts +161 -115
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +175 -106
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +116 -38
- package/src/runtime/execution/serial-execution-queue.ts +179 -34
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/listener-records.ts +21 -0
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
- package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
- package/src/runtime/foundation/service-topology-registry.ts +30 -79
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +266 -418
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +408 -312
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +12 -44
- package/src/runtime/host/route-mesh-runtime.ts +236 -275
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
- package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
- package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +16 -45
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +90 -58
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +54 -26
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
- package/src/runtime/spots/index.ts +687 -437
- package/src/runtime/spots/spot-activation-registry.ts +42 -71
- package/src/runtime/spots/spot-activation-state.ts +4 -16
- package/src/runtime/spots/spot-activation.ts +167 -115
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
- package/src/runtime/spots/spot-actor-membership.ts +107 -75
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -33
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +29 -21
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
- package/src/runtime/spots/spot-outbound.ts +47 -68
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +10 -43
- package/src/runtime/spots/spot-serial-executor.ts +10 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +23 -37
- package/src/runtime/streams/index.ts +102 -88
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/session-serial-executor.ts +2 -2
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
- package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
import { AsyncResource } from 'node:async_hooks';
|
|
2
|
+
import {
|
|
3
|
+
ZLinkFrameworkErrorKind,
|
|
4
|
+
ZLinkFrameworkException
|
|
5
|
+
} from '../../contracts/Errors/ZLinkFrameworkException';
|
|
6
|
+
import { zlinkDefaultLocationOptions } from '../../contracts/Locations/Options';
|
|
7
|
+
import { createAbortError, throwIfAborted } from '../abort';
|
|
8
|
+
import { ZLinkStateLane } from '../execution/state-lane';
|
|
1
9
|
import {
|
|
2
10
|
ZLinkFrameworkInternalErrorKind,
|
|
3
11
|
createInternalFrameworkException
|
|
4
12
|
} from '../framework-errors-internal';
|
|
5
|
-
|
|
6
|
-
import { AsyncResource } from 'node:async_hooks';
|
|
7
|
-
import { ZLinkStateLane } from '../execution/state-lane';
|
|
8
|
-
import { routingIdsEqual } from '../routing-id';
|
|
9
|
-
import type {
|
|
10
|
-
ServiceSessionBindingAdmissionClaim,
|
|
11
|
-
ServiceSessionBindingAdmissionResult
|
|
12
|
-
} from '../foundation/service-session-binding-ingress-port';
|
|
13
|
+
export const DEFAULT_TERMINAL_RELOCATION_CAPACITY = 4096;
|
|
13
14
|
|
|
14
15
|
const detachedStateLaneResource = new AsyncResource('zlink:actor-session-binding-registry');
|
|
15
16
|
export interface ZLinkActorSessionBindingActor {
|
|
16
17
|
readonly actorId: string;
|
|
18
|
+
readonly ref: { readonly actorId: string; readonly bindingGeneration?: bigint };
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
export interface ZLinkActorSessionBindingContext<TActor extends ZLinkActorSessionBindingActor> {
|
|
@@ -50,20 +52,6 @@ export interface ZLinkActorSessionRelocationClaim {
|
|
|
50
52
|
readonly sealId: string;
|
|
51
53
|
}
|
|
52
54
|
|
|
53
|
-
export interface ZLinkActorSessionRetainedOutbound {
|
|
54
|
-
deliver(): Promise<boolean>;
|
|
55
|
-
fail(error: unknown): void;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export interface ZLinkActorSessionAcceptedProducerProof {
|
|
59
|
-
readonly actorId: string;
|
|
60
|
-
readonly objectGeneration: bigint;
|
|
61
|
-
readonly actorNodeRid: string;
|
|
62
|
-
readonly actorNodeGeneration: bigint;
|
|
63
|
-
readonly sessionIdentity: string;
|
|
64
|
-
readonly bindingGeneration: bigint;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
55
|
export interface ZLinkActorSessionRelocationSnapshot extends ZLinkActorSessionRelocationClaim {
|
|
68
56
|
readonly phase: 'sealed' | 'applying' | 'applied' | 'terminal';
|
|
69
57
|
readonly applyFingerprint?: string;
|
|
@@ -107,30 +95,21 @@ interface ZLinkActorSessionRelocationState {
|
|
|
107
95
|
phase: 'sealed' | 'applying' | 'applied' | 'terminal';
|
|
108
96
|
applyFingerprint?: string;
|
|
109
97
|
applyPromise?: Promise<void>;
|
|
110
|
-
acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
|
|
111
98
|
readonly ready: Promise<void>;
|
|
112
99
|
readonly terminal: Promise<void>;
|
|
113
100
|
readonly resolveTerminal: () => void;
|
|
114
101
|
}
|
|
115
102
|
|
|
116
|
-
interface ZLinkActorSessionOutboundEntry {
|
|
117
|
-
readonly sealId?: string;
|
|
118
|
-
readonly operation: ZLinkActorSessionRetainedOutbound;
|
|
119
|
-
readonly arrivalOrder: bigint;
|
|
120
|
-
readonly claim?: ServiceSessionBindingAdmissionClaim;
|
|
121
|
-
readonly authorization: 'legacy' | 'source' | 'pendingTarget';
|
|
122
|
-
released: boolean;
|
|
123
|
-
settled: boolean;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
103
|
interface ZLinkActorSessionRelocationQueue {
|
|
127
104
|
readonly actorId: string;
|
|
128
105
|
activeSealId?: string;
|
|
129
106
|
readonly seals: Map<string, ZLinkActorSessionRelocationState>;
|
|
130
|
-
readonly
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
107
|
+
readonly ingress: Array<{
|
|
108
|
+
sealId?: string;
|
|
109
|
+
readonly deliver: () => Promise<void>;
|
|
110
|
+
readonly drop: (reason: 'stale_target' | 'target_closed' | 'shutdown', error?: unknown) => void;
|
|
111
|
+
}>;
|
|
112
|
+
ingressDrain?: Promise<void>;
|
|
134
113
|
}
|
|
135
114
|
|
|
136
115
|
export interface ZLinkActorSessionAuthorityFence {
|
|
@@ -167,24 +146,20 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
167
146
|
private readonly terminalRelocations = new Map<ZLinkActorSessionRelocationState, true>();
|
|
168
147
|
|
|
169
148
|
constructor(
|
|
170
|
-
private readonly terminalRelocationCapacity =
|
|
171
|
-
private readonly outboundCapacity = 4096,
|
|
149
|
+
private readonly terminalRelocationCapacity: number = DEFAULT_TERMINAL_RELOCATION_CAPACITY,
|
|
172
150
|
// Spec 06 — SessionRelocationSealTimeout bounds how long a session
|
|
173
151
|
// relocation seal may hold ingress (default 3,000 ms, finite only).
|
|
174
152
|
// Every wait on the seal (accept paths) and on active-frame drain
|
|
175
153
|
// (the sealing side) must observe that bound; an unbounded wait here
|
|
176
154
|
// turns a lost control or a lifecycle interlock into a silent stall
|
|
177
155
|
// (spec 48:205 — transport/deadline limits apply during relocation).
|
|
178
|
-
private readonly sealWaitTimeoutMs =
|
|
156
|
+
private readonly sealWaitTimeoutMs: number = zlinkDefaultLocationOptions.sessionRelocationSealTimeoutMs,
|
|
179
157
|
private readonly errorSink?: () =>
|
|
180
158
|
{ reportRuntimeTaskException(taskName: string, error: unknown): void } | undefined
|
|
181
159
|
) {
|
|
182
160
|
if (!Number.isSafeInteger(terminalRelocationCapacity) || terminalRelocationCapacity <= 0) {
|
|
183
161
|
throw new RangeError('Session relocation terminal capacity must be a positive safe integer.');
|
|
184
162
|
}
|
|
185
|
-
if (!Number.isSafeInteger(outboundCapacity) || outboundCapacity <= 0) {
|
|
186
|
-
throw new RangeError('Session relocation outbound capacity must be a positive safe integer.');
|
|
187
|
-
}
|
|
188
163
|
if (!Number.isSafeInteger(sealWaitTimeoutMs) || sealWaitTimeoutMs <= 0) {
|
|
189
164
|
throw new RangeError('Session relocation seal timeout must be a positive safe integer.');
|
|
190
165
|
}
|
|
@@ -211,7 +186,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
211
186
|
);
|
|
212
187
|
}
|
|
213
188
|
|
|
214
|
-
private
|
|
189
|
+
private commitCore(
|
|
215
190
|
previous: ZLinkActorSessionRoute<TContext, TActor> | undefined,
|
|
216
191
|
context: TContext,
|
|
217
192
|
actor: TActor,
|
|
@@ -219,7 +194,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
219
194
|
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
220
195
|
sessionIdentity?: string,
|
|
221
196
|
commitActor?: () => void
|
|
222
|
-
):
|
|
197
|
+
): void {
|
|
223
198
|
const current = this.routes.get(actor.actorId);
|
|
224
199
|
if (current !== previous) {
|
|
225
200
|
throw createInternalFrameworkException(
|
|
@@ -255,7 +230,24 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
255
230
|
}
|
|
256
231
|
|
|
257
232
|
if (!sameBinding && actorSlot !== undefined) {
|
|
258
|
-
|
|
233
|
+
// Session–Actor binding §5-2: `$zlink.actor.bound` enters the ordered
|
|
234
|
+
// STREAM queue before the slot is published; transport completion is
|
|
235
|
+
// not awaited inside the state lane (execution gate).
|
|
236
|
+
void context
|
|
237
|
+
.actorSlotControls!.enqueueBound(actorSlot, actor.actorId)
|
|
238
|
+
.catch(async (error) => {
|
|
239
|
+
this.errorSink?.()?.reportRuntimeTaskException('session actor bound', error);
|
|
240
|
+
// The client never learned the slot, so the binding ends through
|
|
241
|
+
// the one unbind path; no `$zlink.actor.unbound` follows.
|
|
242
|
+
await this.unbind(
|
|
243
|
+
actor.actorId,
|
|
244
|
+
context,
|
|
245
|
+
bindingToken,
|
|
246
|
+
ZLinkActorSessionBindingTermination.PhysicalDisconnect
|
|
247
|
+
).catch((unbindError) =>
|
|
248
|
+
this.errorSink?.()?.reportRuntimeTaskException('session actor bound', unbindError)
|
|
249
|
+
);
|
|
250
|
+
});
|
|
259
251
|
}
|
|
260
252
|
} catch (error) {
|
|
261
253
|
context.unbindLocal(actor.actorId, bindingToken);
|
|
@@ -333,7 +325,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
333
325
|
);
|
|
334
326
|
}
|
|
335
327
|
|
|
336
|
-
private
|
|
328
|
+
private replaceAndReleaseSealCore(
|
|
337
329
|
previous: ZLinkActorSessionRoute<TContext, TActor>,
|
|
338
330
|
context: TContext,
|
|
339
331
|
actor: TActor,
|
|
@@ -342,7 +334,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
342
334
|
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
343
335
|
sessionIdentity?: string,
|
|
344
336
|
commitActor?: () => void
|
|
345
|
-
):
|
|
337
|
+
): void {
|
|
346
338
|
if (previous.sealId !== sealId) {
|
|
347
339
|
throw createInternalFrameworkException(
|
|
348
340
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
@@ -353,7 +345,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
353
345
|
// JavaScript cannot interleave another ingress turn between these two
|
|
354
346
|
// synchronous mutations. The replacement preserves the seal, then the
|
|
355
347
|
// exact release publishes the route to held ingress as one owner turn.
|
|
356
|
-
|
|
348
|
+
this.commitCore(
|
|
357
349
|
previous,
|
|
358
350
|
context,
|
|
359
351
|
actor,
|
|
@@ -383,6 +375,22 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
383
375
|
return await this.lane.run(() => this.routeCore(actorId));
|
|
384
376
|
}
|
|
385
377
|
|
|
378
|
+
/** Selects the route only when it is the exact Session binding (§8.1 validation values). */
|
|
379
|
+
async routeForSessionBinding(
|
|
380
|
+
actorId: string,
|
|
381
|
+
sessionRid: string,
|
|
382
|
+
bindingGeneration?: bigint
|
|
383
|
+
): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined> {
|
|
384
|
+
return await this.lane.run(() => {
|
|
385
|
+
const route = this.routeCore(actorId);
|
|
386
|
+
const generation = route?.actor.ref.bindingGeneration;
|
|
387
|
+
return route?.sessionIdentity === sessionRid &&
|
|
388
|
+
(bindingGeneration === undefined || generation === bindingGeneration)
|
|
389
|
+
? route
|
|
390
|
+
: undefined;
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
|
|
386
394
|
private routeCore(actorId: string): ZLinkActorSessionRoute<TContext, TActor> | undefined {
|
|
387
395
|
return this.routes.get(actorId);
|
|
388
396
|
}
|
|
@@ -415,15 +423,19 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
415
423
|
bindingToken: string,
|
|
416
424
|
termination = ZLinkActorSessionBindingTermination.BindingEnd
|
|
417
425
|
): Promise<void> {
|
|
418
|
-
await this.lane.run(() =>
|
|
426
|
+
const { submission } = await this.lane.run(() => ({
|
|
427
|
+
submission: this.unbindCore(actorId, context, bindingToken, termination)
|
|
428
|
+
}));
|
|
429
|
+
await submission;
|
|
419
430
|
}
|
|
420
431
|
|
|
421
|
-
|
|
432
|
+
/** Fixes the unbind order in the lane; the caller awaits transport completion outside it. */
|
|
433
|
+
private unbindCore(
|
|
422
434
|
actorId: string,
|
|
423
435
|
context: TContext,
|
|
424
436
|
bindingToken: string,
|
|
425
437
|
termination: ZLinkActorSessionBindingTermination
|
|
426
|
-
): Promise<void> {
|
|
438
|
+
): Promise<void> | undefined {
|
|
427
439
|
const route = this.routes.get(actorId);
|
|
428
440
|
if (route === undefined || route.context !== context || route.bindingToken !== bindingToken) {
|
|
429
441
|
return;
|
|
@@ -438,29 +450,29 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
438
450
|
actorId,
|
|
439
451
|
new Error(`Actor '${actorId}' session binding was removed while accepted frames were active.`)
|
|
440
452
|
);
|
|
441
|
-
this.clearRouteRelocation(
|
|
442
|
-
actorId,
|
|
443
|
-
route,
|
|
444
|
-
new Error(`Actor '${actorId}' session binding was removed.`)
|
|
445
|
-
);
|
|
453
|
+
this.clearRouteRelocation(actorId, route);
|
|
446
454
|
if (
|
|
447
455
|
termination === ZLinkActorSessionBindingTermination.BindingEnd &&
|
|
448
456
|
route.actorSlot !== undefined
|
|
449
457
|
) {
|
|
450
|
-
|
|
458
|
+
return context.actorSlotControls?.enqueueUnbound(route.actorSlot);
|
|
451
459
|
}
|
|
460
|
+
return undefined;
|
|
452
461
|
}
|
|
453
462
|
|
|
454
463
|
async unbindActor(actorId: string): Promise<void> {
|
|
455
|
-
await this.lane.run(() =>
|
|
464
|
+
const { submission } = await this.lane.run(() => ({
|
|
465
|
+
submission: this.unbindActorCore(actorId)
|
|
466
|
+
}));
|
|
467
|
+
await submission;
|
|
456
468
|
}
|
|
457
469
|
|
|
458
|
-
private
|
|
470
|
+
private unbindActorCore(actorId: string): Promise<void> | undefined {
|
|
459
471
|
const route = this.routes.get(actorId);
|
|
460
472
|
if (route === undefined) {
|
|
461
|
-
return;
|
|
473
|
+
return undefined;
|
|
462
474
|
}
|
|
463
|
-
|
|
475
|
+
return this.unbindCore(
|
|
464
476
|
actorId,
|
|
465
477
|
route.context,
|
|
466
478
|
route.bindingToken,
|
|
@@ -472,10 +484,10 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
472
484
|
await this.lane.run(() => this.cleanupCore(context));
|
|
473
485
|
}
|
|
474
486
|
|
|
475
|
-
private
|
|
487
|
+
private cleanupCore(context: TContext): void {
|
|
476
488
|
for (const route of [...this.routes.values()]) {
|
|
477
489
|
if (route.context === context) {
|
|
478
|
-
|
|
490
|
+
this.unbindCore(
|
|
479
491
|
route.actor.actorId,
|
|
480
492
|
context,
|
|
481
493
|
route.bindingToken,
|
|
@@ -539,6 +551,37 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
539
551
|
}
|
|
540
552
|
}
|
|
541
553
|
|
|
554
|
+
async acceptOneWay(
|
|
555
|
+
actorId: string,
|
|
556
|
+
bindingToken: string,
|
|
557
|
+
prepare: () => {
|
|
558
|
+
readonly deliver: () => Promise<void>;
|
|
559
|
+
readonly drop: (
|
|
560
|
+
reason: 'stale_target' | 'target_closed' | 'shutdown',
|
|
561
|
+
error?: unknown
|
|
562
|
+
) => void;
|
|
563
|
+
}
|
|
564
|
+
): Promise<boolean> {
|
|
565
|
+
return await this.lane.run(() => {
|
|
566
|
+
const route = this.requireRouteCore(actorId);
|
|
567
|
+
this.requireCurrentTokenCore(actorId, bindingToken);
|
|
568
|
+
const queue = this.relocations.get(actorId);
|
|
569
|
+
if (
|
|
570
|
+
queue === undefined ||
|
|
571
|
+
(route.sealId === undefined &&
|
|
572
|
+
queue.ingress.length === 0 &&
|
|
573
|
+
queue.ingressDrain === undefined)
|
|
574
|
+
)
|
|
575
|
+
return false;
|
|
576
|
+
queue.ingress.push({
|
|
577
|
+
...prepare(),
|
|
578
|
+
sealId: route.sealId
|
|
579
|
+
});
|
|
580
|
+
if (route.sealId === undefined) this.startHeldOneWayDrain(actorId, queue);
|
|
581
|
+
return true;
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
|
|
542
585
|
/**
|
|
543
586
|
* Holds Session ingress accepted after a relocation seal until the target
|
|
544
587
|
* route is published and the seal is released. The caller keeps the
|
|
@@ -714,6 +757,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
714
757
|
);
|
|
715
758
|
}
|
|
716
759
|
route.sealId = sealId;
|
|
760
|
+
if (!this.relocations.has(actorId)) {
|
|
761
|
+
this.relocations.set(actorId, { actorId, seals: new Map(), ingress: [] });
|
|
762
|
+
}
|
|
717
763
|
// A pre-seal REQUEST is captured as part of installing command 42. Its
|
|
718
764
|
// Session frame no longer gates the seal; its single submission attempt
|
|
719
765
|
// and terminal continue under the request admission state above.
|
|
@@ -786,13 +832,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
786
832
|
resolveTerminal = resolve;
|
|
787
833
|
});
|
|
788
834
|
const ready = this.waitForActiveFramesCore(claim.actorId, signal);
|
|
789
|
-
const actorQueue
|
|
790
|
-
actorId: claim.actorId,
|
|
791
|
-
seals: new Map(),
|
|
792
|
-
outbound: [],
|
|
793
|
-
nextArrivalOrder: 1n,
|
|
794
|
-
outboundCount: 0
|
|
795
|
-
};
|
|
835
|
+
const actorQueue = this.relocations.get(claim.actorId)!;
|
|
796
836
|
const state: ZLinkActorSessionRelocationState = {
|
|
797
837
|
...claim,
|
|
798
838
|
phase: 'sealed',
|
|
@@ -820,154 +860,14 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
820
860
|
return this.relocations.get(actorId)?.seals.get(sealId);
|
|
821
861
|
}
|
|
822
862
|
|
|
823
|
-
async retainRelocationOutbound(
|
|
824
|
-
actorId: string,
|
|
825
|
-
operation: ZLinkActorSessionRetainedOutbound,
|
|
826
|
-
sealId?: string
|
|
827
|
-
): Promise<ServiceSessionBindingAdmissionResult> {
|
|
828
|
-
return await this.lane.run(() =>
|
|
829
|
-
this.retainRelocationOutboundCorePublic(actorId, operation, sealId)
|
|
830
|
-
);
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
private retainRelocationOutboundCorePublic(
|
|
834
|
-
actorId: string,
|
|
835
|
-
operation: ZLinkActorSessionRetainedOutbound,
|
|
836
|
-
sealId?: string
|
|
837
|
-
): ServiceSessionBindingAdmissionResult {
|
|
838
|
-
if (sealId !== undefined) {
|
|
839
|
-
const queue = this.relocations.get(actorId);
|
|
840
|
-
const state = queue?.seals.get(sealId);
|
|
841
|
-
if (
|
|
842
|
-
queue === undefined ||
|
|
843
|
-
state === undefined ||
|
|
844
|
-
(queue.activeSealId !== sealId &&
|
|
845
|
-
!(queue.activeSealId === undefined && state.phase === 'terminal'))
|
|
846
|
-
) {
|
|
847
|
-
failRetainedOutbound(
|
|
848
|
-
operation,
|
|
849
|
-
new Error(`Actor '${actorId}' Session outbound did not match its exact relocation seal.`)
|
|
850
|
-
);
|
|
851
|
-
return 'rejected';
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
return this.retainRelocationOutboundCore(actorId, operation, 'legacy');
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
async admitRelocationOutbound(
|
|
858
|
-
claim: ServiceSessionBindingAdmissionClaim,
|
|
859
|
-
operation: ZLinkActorSessionRetainedOutbound
|
|
860
|
-
): Promise<ServiceSessionBindingAdmissionResult> {
|
|
861
|
-
return await this.lane.run(() => this.admitRelocationOutboundCore(claim, operation));
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
private admitRelocationOutboundCore(
|
|
865
|
-
claim: ServiceSessionBindingAdmissionClaim,
|
|
866
|
-
operation: ZLinkActorSessionRetainedOutbound
|
|
867
|
-
): ServiceSessionBindingAdmissionResult {
|
|
868
|
-
const queue = this.relocations.get(claim.actorId);
|
|
869
|
-
const state =
|
|
870
|
-
queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
871
|
-
const error = this.outboundAdmissionError(claim);
|
|
872
|
-
if (error !== undefined) {
|
|
873
|
-
failRetainedOutbound(operation, error);
|
|
874
|
-
return 'rejected';
|
|
875
|
-
}
|
|
876
|
-
if (queue === undefined || state === undefined) {
|
|
877
|
-
if (!this.matchesCurrentProducerNode(claim)) {
|
|
878
|
-
failRetainedOutbound(
|
|
879
|
-
operation,
|
|
880
|
-
new Error(
|
|
881
|
-
`Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`
|
|
882
|
-
)
|
|
883
|
-
);
|
|
884
|
-
return 'rejected';
|
|
885
|
-
}
|
|
886
|
-
if (queue === undefined) return 'passThrough';
|
|
887
|
-
return this.retainRelocationOutboundCore(claim.actorId, operation, 'source', claim);
|
|
888
|
-
}
|
|
889
|
-
if (state.phase === 'sealed' || state.phase === 'applying') {
|
|
890
|
-
const matchesSource = matchesRelocationSourceProof(state, claim);
|
|
891
|
-
const matchesCurrent = this.matchesCurrentProducerNode(claim);
|
|
892
|
-
const authorization = matchesSource || matchesCurrent ? 'source' : 'pendingTarget';
|
|
893
|
-
return this.retainRelocationOutboundCore(claim.actorId, operation, authorization, claim);
|
|
894
|
-
}
|
|
895
|
-
const acceptedProof = state.acceptedProducerProof;
|
|
896
|
-
if (acceptedProof === undefined || !matchesAcceptedProducerProof(acceptedProof, claim)) {
|
|
897
|
-
failRetainedOutbound(
|
|
898
|
-
operation,
|
|
899
|
-
new Error(
|
|
900
|
-
`Actor '${claim.actorId}' Session outbound admission did not match its accepted producer proof.`
|
|
901
|
-
)
|
|
902
|
-
);
|
|
903
|
-
return 'rejected';
|
|
904
|
-
}
|
|
905
|
-
return this.retainRelocationOutboundCore(claim.actorId, operation, 'source', claim);
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
private retainRelocationOutboundCore(
|
|
909
|
-
actorId: string,
|
|
910
|
-
operation: ZLinkActorSessionRetainedOutbound,
|
|
911
|
-
authorization: ZLinkActorSessionOutboundEntry['authorization'],
|
|
912
|
-
claim?: ServiceSessionBindingAdmissionClaim
|
|
913
|
-
): ServiceSessionBindingAdmissionResult {
|
|
914
|
-
const queue = this.relocations.get(actorId);
|
|
915
|
-
const state =
|
|
916
|
-
queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
917
|
-
if (queue === undefined) return 'passThrough';
|
|
918
|
-
if (state === undefined || state.phase === 'applied' || state.phase === 'terminal') {
|
|
919
|
-
if (queue.drainPromise === undefined && queue.outbound.length === 0) return 'passThrough';
|
|
920
|
-
if (!this.reserveOutbound(queue, operation)) return 'rejected';
|
|
921
|
-
queue.outbound.push({
|
|
922
|
-
operation,
|
|
923
|
-
authorization,
|
|
924
|
-
arrivalOrder: queue.nextArrivalOrder++,
|
|
925
|
-
...(claim === undefined ? {} : { claim }),
|
|
926
|
-
released: true,
|
|
927
|
-
settled: false
|
|
928
|
-
});
|
|
929
|
-
this.startOutboundDrain(queue);
|
|
930
|
-
return 'retained';
|
|
931
|
-
}
|
|
932
|
-
if (!this.reserveOutbound(queue, operation)) return 'rejected';
|
|
933
|
-
queue.outbound.push({
|
|
934
|
-
sealId: state.sealId,
|
|
935
|
-
operation,
|
|
936
|
-
authorization,
|
|
937
|
-
arrivalOrder: queue.nextArrivalOrder++,
|
|
938
|
-
...(claim === undefined ? {} : { claim }),
|
|
939
|
-
released: false,
|
|
940
|
-
settled: false
|
|
941
|
-
});
|
|
942
|
-
return 'retained';
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
async discardRelocationOutbound(actorId: string, sealId: string, error: unknown): Promise<void> {
|
|
946
|
-
await this.lane.run(() => this.discardRelocationOutboundCore(actorId, sealId, error));
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
private discardRelocationOutboundCore(actorId: string, sealId: string, error: unknown): void {
|
|
950
|
-
const queue = this.relocations.get(actorId);
|
|
951
|
-
if (queue === undefined) return;
|
|
952
|
-
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
953
|
-
const entry = queue.outbound[index]!;
|
|
954
|
-
if (entry.sealId !== sealId) continue;
|
|
955
|
-
queue.outbound.splice(index, 1);
|
|
956
|
-
this.failOutbound(queue, entry, error);
|
|
957
|
-
}
|
|
958
|
-
this.deleteEmptyRelocationQueue(queue);
|
|
959
|
-
}
|
|
960
|
-
|
|
961
863
|
async applyRelocation(
|
|
962
864
|
actorId: string,
|
|
963
865
|
sealId: string,
|
|
964
866
|
applyFingerprint: string,
|
|
965
|
-
|
|
966
|
-
commitOwnerTransition: () => Promise<void>,
|
|
967
|
-
acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
|
|
867
|
+
commitOwnerTransition: () => Promise<void>
|
|
968
868
|
): Promise<void> {
|
|
969
869
|
const prepared = await this.lane.run(() =>
|
|
970
|
-
this.prepareRelocationApply(actorId, sealId, applyFingerprint
|
|
870
|
+
this.prepareRelocationApply(actorId, sealId, applyFingerprint)
|
|
971
871
|
);
|
|
972
872
|
if (prepared.applyPromise !== undefined) {
|
|
973
873
|
await prepared.applyPromise;
|
|
@@ -991,20 +891,13 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
991
891
|
private prepareRelocationApply(
|
|
992
892
|
actorId: string,
|
|
993
893
|
sealId: string,
|
|
994
|
-
applyFingerprint: string
|
|
995
|
-
action: 'commit' | 'abort',
|
|
996
|
-
acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
|
|
894
|
+
applyFingerprint: string
|
|
997
895
|
): {
|
|
998
|
-
readonly queue: ZLinkActorSessionRelocationQueue;
|
|
999
896
|
readonly state: ZLinkActorSessionRelocationState;
|
|
1000
897
|
readonly applyPromise?: Promise<void>;
|
|
1001
|
-
readonly action?: 'commit' | 'abort';
|
|
1002
|
-
readonly acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
|
|
1003
898
|
readonly promise?: Promise<void>;
|
|
1004
899
|
readonly resolve?: () => void;
|
|
1005
900
|
readonly reject?: (error: unknown) => void;
|
|
1006
|
-
readonly actorId?: string;
|
|
1007
|
-
readonly sealId?: string;
|
|
1008
901
|
} {
|
|
1009
902
|
const queue = this.relocations.get(actorId);
|
|
1010
903
|
const state = queue?.seals.get(sealId);
|
|
@@ -1023,25 +916,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1023
916
|
true
|
|
1024
917
|
);
|
|
1025
918
|
}
|
|
1026
|
-
return {
|
|
1027
|
-
}
|
|
1028
|
-
if (
|
|
1029
|
-
action === 'commit' &&
|
|
1030
|
-
acceptedProducerProof !== undefined &&
|
|
1031
|
-
!validAcceptedTargetProof(state, acceptedProducerProof)
|
|
1032
|
-
) {
|
|
1033
|
-
throw createInternalFrameworkException(
|
|
1034
|
-
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
1035
|
-
`Actor '${actorId}' command 44 target producer proof did not match its Session seal.`,
|
|
1036
|
-
true
|
|
1037
|
-
);
|
|
1038
|
-
}
|
|
1039
|
-
if (action === 'abort' && acceptedProducerProof !== undefined) {
|
|
1040
|
-
throw createInternalFrameworkException(
|
|
1041
|
-
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
1042
|
-
`Actor '${actorId}' abort route supplied a target producer proof.`,
|
|
1043
|
-
true
|
|
1044
|
-
);
|
|
919
|
+
return { state, applyPromise: state.applyPromise };
|
|
1045
920
|
}
|
|
1046
921
|
|
|
1047
922
|
state.phase = 'applying';
|
|
@@ -1054,57 +929,17 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1054
929
|
});
|
|
1055
930
|
state.applyPromise = promise;
|
|
1056
931
|
return {
|
|
1057
|
-
queue,
|
|
1058
932
|
state,
|
|
1059
|
-
action,
|
|
1060
|
-
acceptedProducerProof,
|
|
1061
933
|
promise,
|
|
1062
934
|
resolve,
|
|
1063
|
-
reject
|
|
1064
|
-
actorId,
|
|
1065
|
-
sealId
|
|
935
|
+
reject
|
|
1066
936
|
};
|
|
1067
937
|
}
|
|
1068
938
|
|
|
1069
939
|
private completeRelocationApply(prepared: {
|
|
1070
|
-
readonly queue: ZLinkActorSessionRelocationQueue;
|
|
1071
940
|
readonly state: ZLinkActorSessionRelocationState;
|
|
1072
|
-
readonly action?: 'commit' | 'abort';
|
|
1073
|
-
readonly acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
|
|
1074
|
-
readonly actorId?: string;
|
|
1075
|
-
readonly sealId?: string;
|
|
1076
941
|
}): void {
|
|
1077
|
-
|
|
1078
|
-
const proof =
|
|
1079
|
-
action === 'commit'
|
|
1080
|
-
? (acceptedProducerProof ?? this.currentProducerProof(actorId!))
|
|
1081
|
-
: relocationSourceProof(state);
|
|
1082
|
-
state.acceptedProducerProof = proof;
|
|
1083
|
-
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
1084
|
-
const entry = queue.outbound[index]!;
|
|
1085
|
-
if (entry.sealId !== sealId) continue;
|
|
1086
|
-
if (entry.authorization !== 'pendingTarget') {
|
|
1087
|
-
entry.released = true;
|
|
1088
|
-
continue;
|
|
1089
|
-
}
|
|
1090
|
-
if (
|
|
1091
|
-
action === 'commit' &&
|
|
1092
|
-
proof !== undefined &&
|
|
1093
|
-
entry.claim !== undefined &&
|
|
1094
|
-
matchesAcceptedProducerProof(proof, entry.claim)
|
|
1095
|
-
) {
|
|
1096
|
-
entry.released = true;
|
|
1097
|
-
continue;
|
|
1098
|
-
}
|
|
1099
|
-
queue.outbound.splice(index, 1);
|
|
1100
|
-
this.failOutbound(
|
|
1101
|
-
queue,
|
|
1102
|
-
entry,
|
|
1103
|
-
new Error(`Actor '${actorId}' pending Session producer did not match command 44 proof.`)
|
|
1104
|
-
);
|
|
1105
|
-
}
|
|
1106
|
-
this.startOutboundDrain(queue);
|
|
1107
|
-
state.phase = 'applied';
|
|
942
|
+
prepared.state.phase = 'applied';
|
|
1108
943
|
}
|
|
1109
944
|
|
|
1110
945
|
private failRelocationApply(prepared: {
|
|
@@ -1113,49 +948,6 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1113
948
|
prepared.state.phase = 'sealed';
|
|
1114
949
|
prepared.state.applyFingerprint = undefined;
|
|
1115
950
|
prepared.state.applyPromise = undefined;
|
|
1116
|
-
prepared.state.acceptedProducerProof = undefined;
|
|
1117
|
-
}
|
|
1118
|
-
|
|
1119
|
-
private currentProducerProof(
|
|
1120
|
-
actorId: string
|
|
1121
|
-
): ZLinkActorSessionAcceptedProducerProof | undefined {
|
|
1122
|
-
const route = this.routes.get(actorId);
|
|
1123
|
-
const actorRef = (
|
|
1124
|
-
route?.actor as TActor & {
|
|
1125
|
-
readonly ref?: {
|
|
1126
|
-
readonly actorId?: unknown;
|
|
1127
|
-
readonly objectGeneration?: unknown;
|
|
1128
|
-
readonly generation?: unknown;
|
|
1129
|
-
readonly nodeRid?: unknown;
|
|
1130
|
-
readonly ownerNodeGeneration?: unknown;
|
|
1131
|
-
readonly bindingGeneration?: unknown;
|
|
1132
|
-
};
|
|
1133
|
-
}
|
|
1134
|
-
).ref;
|
|
1135
|
-
const sessionIdentity = route?.sessionIdentity;
|
|
1136
|
-
if (
|
|
1137
|
-
route === undefined ||
|
|
1138
|
-
actorRef === undefined ||
|
|
1139
|
-
sessionIdentity === undefined ||
|
|
1140
|
-
actorRef.ownerNodeGeneration === undefined
|
|
1141
|
-
)
|
|
1142
|
-
return undefined;
|
|
1143
|
-
return {
|
|
1144
|
-
actorId,
|
|
1145
|
-
objectGeneration: BigInt(
|
|
1146
|
-
(actorRef.objectGeneration as bigint | number | string | boolean | undefined) ??
|
|
1147
|
-
(actorRef.generation as bigint | number | string | boolean | undefined) ??
|
|
1148
|
-
-1
|
|
1149
|
-
),
|
|
1150
|
-
actorNodeRid: String(actorRef.nodeRid ?? ''),
|
|
1151
|
-
actorNodeGeneration: BigInt(
|
|
1152
|
-
actorRef.ownerNodeGeneration as bigint | number | string | boolean
|
|
1153
|
-
),
|
|
1154
|
-
sessionIdentity: String(sessionIdentity),
|
|
1155
|
-
bindingGeneration: BigInt(
|
|
1156
|
-
(actorRef.bindingGeneration as bigint | number | string | boolean | undefined) ?? -1
|
|
1157
|
-
)
|
|
1158
|
-
};
|
|
1159
951
|
}
|
|
1160
952
|
|
|
1161
953
|
async observeRelocationTerminal(
|
|
@@ -1199,7 +991,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1199
991
|
|
|
1200
992
|
/**
|
|
1201
993
|
* Actor-wide relocation teardown: every seal (active and terminal-retained)
|
|
1202
|
-
*
|
|
994
|
+
* for `actorId` is discarded unconditionally.
|
|
1203
995
|
* Reserved for paths where the Actor itself is gone or being torn down
|
|
1204
996
|
* (destroy, ownership clear, relocation-seal expiry/failure) — never for a
|
|
1205
997
|
* single physical route's disconnect, which must not disturb a relocation
|
|
@@ -1212,8 +1004,18 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1212
1004
|
private clearRelocationCore(actorId: string, error: unknown): void {
|
|
1213
1005
|
const queue = this.relocations.get(actorId);
|
|
1214
1006
|
if (queue === undefined) return;
|
|
1007
|
+
this.rejectSealWaiters(
|
|
1008
|
+
actorId,
|
|
1009
|
+
error,
|
|
1010
|
+
error instanceof ZLinkFrameworkException &&
|
|
1011
|
+
error.kind === ZLinkFrameworkErrorKind.DeadlineExceeded
|
|
1012
|
+
? 'target_closed'
|
|
1013
|
+
: error instanceof ZLinkFrameworkException &&
|
|
1014
|
+
error.kind === ZLinkFrameworkErrorKind.ShuttingDown
|
|
1015
|
+
? 'shutdown'
|
|
1016
|
+
: 'stale_target'
|
|
1017
|
+
);
|
|
1215
1018
|
this.relocations.delete(actorId);
|
|
1216
|
-
for (const entry of queue.outbound.splice(0)) this.failOutbound(queue, entry, error);
|
|
1217
1019
|
for (const state of queue.seals.values()) {
|
|
1218
1020
|
this.terminalRelocations.delete(state);
|
|
1219
1021
|
if (state.phase !== 'terminal') state.resolveTerminal();
|
|
@@ -1224,7 +1026,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1224
1026
|
* Spec 48 §137: a relocation seal's lifecycle is independent of any single
|
|
1225
1027
|
* physical route's binding. Unbinding one physical route (a disconnect)
|
|
1226
1028
|
* must retire only the still-open (nonterminal) relocation seal that this
|
|
1227
|
-
* exact route's Session owns
|
|
1029
|
+
* exact route's Session owns — it
|
|
1228
1030
|
* must never reach into a seal that has already reached 'terminal' (its
|
|
1229
1031
|
* bounded retention exists precisely so a late same-seal relay can still
|
|
1230
1032
|
* pass on a successor route) nor into a different Session's active seal
|
|
@@ -1233,8 +1035,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1233
1035
|
*/
|
|
1234
1036
|
private clearRouteRelocation(
|
|
1235
1037
|
actorId: string,
|
|
1236
|
-
route: ZLinkActorSessionRoute<TContext, TActor
|
|
1237
|
-
error: unknown
|
|
1038
|
+
route: ZLinkActorSessionRoute<TContext, TActor>
|
|
1238
1039
|
): void {
|
|
1239
1040
|
const queue = this.relocations.get(actorId);
|
|
1240
1041
|
if (queue === undefined) return;
|
|
@@ -1250,12 +1051,6 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1250
1051
|
this.deleteEmptyRelocationQueue(queue);
|
|
1251
1052
|
return;
|
|
1252
1053
|
}
|
|
1253
|
-
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
1254
|
-
const entry = queue.outbound[index]!;
|
|
1255
|
-
if (entry.sealId !== activeSealId) continue;
|
|
1256
|
-
queue.outbound.splice(index, 1);
|
|
1257
|
-
this.failOutbound(queue, entry, error);
|
|
1258
|
-
}
|
|
1259
1054
|
queue.activeSealId = undefined;
|
|
1260
1055
|
queue.seals.delete(activeSealId!);
|
|
1261
1056
|
this.terminalRelocations.delete(activeState);
|
|
@@ -1464,155 +1259,6 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1464
1259
|
for (const waiter of waiters) waiter.reject(error);
|
|
1465
1260
|
}
|
|
1466
1261
|
|
|
1467
|
-
private startOutboundDrain(queue: ZLinkActorSessionRelocationQueue): void {
|
|
1468
|
-
if (queue.drainPromise !== undefined) return;
|
|
1469
|
-
const drain = startOutsideStateLane(async () => {
|
|
1470
|
-
for (;;) {
|
|
1471
|
-
const entry = await this.lane.run(() => {
|
|
1472
|
-
const current = queue.outbound.at(0);
|
|
1473
|
-
if (current === undefined || !current.released) return undefined;
|
|
1474
|
-
if (current.settled) {
|
|
1475
|
-
queue.outbound.shift();
|
|
1476
|
-
return null;
|
|
1477
|
-
}
|
|
1478
|
-
return current;
|
|
1479
|
-
});
|
|
1480
|
-
if (entry === undefined) return;
|
|
1481
|
-
if (entry === null) continue;
|
|
1482
|
-
try {
|
|
1483
|
-
const delivered = await entry.operation.deliver();
|
|
1484
|
-
await this.lane.run(() => {
|
|
1485
|
-
if (delivered) this.settleOutbound(queue, entry);
|
|
1486
|
-
else
|
|
1487
|
-
this.failOutbound(
|
|
1488
|
-
queue,
|
|
1489
|
-
entry,
|
|
1490
|
-
new Error(
|
|
1491
|
-
`Actor '${queue.actorId}' retained Session outbound delivery was rejected.`
|
|
1492
|
-
)
|
|
1493
|
-
);
|
|
1494
|
-
if (queue.outbound[0] === entry) queue.outbound.shift();
|
|
1495
|
-
});
|
|
1496
|
-
} catch (error) {
|
|
1497
|
-
await this.lane.run(() => {
|
|
1498
|
-
this.failOutbound(queue, entry, error);
|
|
1499
|
-
if (queue.outbound[0] === entry) queue.outbound.shift();
|
|
1500
|
-
});
|
|
1501
|
-
}
|
|
1502
|
-
}
|
|
1503
|
-
});
|
|
1504
|
-
startOutsideStateLane(() => {
|
|
1505
|
-
void drain.finally(
|
|
1506
|
-
async () =>
|
|
1507
|
-
await this.lane.run(() => {
|
|
1508
|
-
if (queue.drainPromise === drain) queue.drainPromise = undefined;
|
|
1509
|
-
if (queue.outbound[0]?.released === true) this.startOutboundDrain(queue);
|
|
1510
|
-
else this.deleteEmptyRelocationQueue(queue);
|
|
1511
|
-
})
|
|
1512
|
-
);
|
|
1513
|
-
});
|
|
1514
|
-
queue.drainPromise = drain;
|
|
1515
|
-
}
|
|
1516
|
-
|
|
1517
|
-
private reserveOutbound(
|
|
1518
|
-
queue: ZLinkActorSessionRelocationQueue,
|
|
1519
|
-
operation: ZLinkActorSessionRetainedOutbound
|
|
1520
|
-
): boolean {
|
|
1521
|
-
if (queue.outboundCount < this.outboundCapacity) {
|
|
1522
|
-
queue.outboundCount++;
|
|
1523
|
-
return true;
|
|
1524
|
-
}
|
|
1525
|
-
failRetainedOutbound(
|
|
1526
|
-
operation,
|
|
1527
|
-
new Error(`Actor '${queue.actorId}' Session relocation outbound capacity was exhausted.`)
|
|
1528
|
-
);
|
|
1529
|
-
return false;
|
|
1530
|
-
}
|
|
1531
|
-
|
|
1532
|
-
private settleOutbound(
|
|
1533
|
-
queue: ZLinkActorSessionRelocationQueue,
|
|
1534
|
-
entry: ZLinkActorSessionOutboundEntry
|
|
1535
|
-
): void {
|
|
1536
|
-
if (entry.settled) return;
|
|
1537
|
-
entry.settled = true;
|
|
1538
|
-
queue.outboundCount--;
|
|
1539
|
-
}
|
|
1540
|
-
|
|
1541
|
-
private failOutbound(
|
|
1542
|
-
queue: ZLinkActorSessionRelocationQueue,
|
|
1543
|
-
entry: ZLinkActorSessionOutboundEntry,
|
|
1544
|
-
error: unknown
|
|
1545
|
-
): void {
|
|
1546
|
-
if (entry.settled) return;
|
|
1547
|
-
this.settleOutbound(queue, entry);
|
|
1548
|
-
failRetainedOutbound(entry.operation, error);
|
|
1549
|
-
}
|
|
1550
|
-
|
|
1551
|
-
private outboundAdmissionError(claim: ServiceSessionBindingAdmissionClaim): Error | undefined {
|
|
1552
|
-
if (
|
|
1553
|
-
claim.actorId.length === 0 ||
|
|
1554
|
-
claim.objectGeneration <= 0n ||
|
|
1555
|
-
claim.actorNodeRid.length === 0 ||
|
|
1556
|
-
claim.actorNodeGeneration <= 0n ||
|
|
1557
|
-
claim.producerNodeRid.length === 0 ||
|
|
1558
|
-
claim.producerNodeGeneration <= 0n ||
|
|
1559
|
-
claim.bindingGeneration <= 0n ||
|
|
1560
|
-
claim.sessionIdentity.length === 0 ||
|
|
1561
|
-
!routingIdsEqual(claim.producerNodeRid, claim.actorNodeRid) ||
|
|
1562
|
-
claim.producerNodeGeneration !== claim.actorNodeGeneration
|
|
1563
|
-
) {
|
|
1564
|
-
return new Error(`Actor '${claim.actorId}' Session outbound admission claim is invalid.`);
|
|
1565
|
-
}
|
|
1566
|
-
const route = this.routes.get(claim.actorId);
|
|
1567
|
-
const ref = route?.actor as
|
|
1568
|
-
| (TActor & {
|
|
1569
|
-
readonly ref?: {
|
|
1570
|
-
readonly actorId?: unknown;
|
|
1571
|
-
readonly objectGeneration?: unknown;
|
|
1572
|
-
readonly generation?: unknown;
|
|
1573
|
-
readonly bindingGeneration?: unknown;
|
|
1574
|
-
};
|
|
1575
|
-
})
|
|
1576
|
-
| undefined;
|
|
1577
|
-
const actorRef = ref?.ref;
|
|
1578
|
-
const routeSessionIdentity = route?.sessionIdentity;
|
|
1579
|
-
if (
|
|
1580
|
-
route === undefined ||
|
|
1581
|
-
actorRef === undefined ||
|
|
1582
|
-
String(actorRef.actorId ?? claim.actorId) !== claim.actorId ||
|
|
1583
|
-
BigInt(
|
|
1584
|
-
(actorRef.objectGeneration as bigint | number | string | boolean | undefined) ??
|
|
1585
|
-
(actorRef.generation as bigint | number | string | boolean | undefined) ??
|
|
1586
|
-
-1
|
|
1587
|
-
) !== claim.objectGeneration ||
|
|
1588
|
-
BigInt(
|
|
1589
|
-
(actorRef.bindingGeneration as bigint | number | string | boolean | undefined) ?? -1
|
|
1590
|
-
) !== claim.bindingGeneration ||
|
|
1591
|
-
String(routeSessionIdentity ?? '') !== claim.sessionIdentity
|
|
1592
|
-
) {
|
|
1593
|
-
return new Error(
|
|
1594
|
-
`Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`
|
|
1595
|
-
);
|
|
1596
|
-
}
|
|
1597
|
-
return undefined;
|
|
1598
|
-
}
|
|
1599
|
-
|
|
1600
|
-
private matchesCurrentProducerNode(claim: ServiceSessionBindingAdmissionClaim): boolean {
|
|
1601
|
-
const route = this.routes.get(claim.actorId);
|
|
1602
|
-
const actorRef = (
|
|
1603
|
-
route?.actor as TActor & {
|
|
1604
|
-
readonly ref?: {
|
|
1605
|
-
readonly nodeRid?: unknown;
|
|
1606
|
-
};
|
|
1607
|
-
}
|
|
1608
|
-
).ref;
|
|
1609
|
-
return (
|
|
1610
|
-
route !== undefined &&
|
|
1611
|
-
actorRef !== undefined &&
|
|
1612
|
-
routingIdsEqual(String(actorRef.nodeRid ?? ''), claim.actorNodeRid)
|
|
1613
|
-
);
|
|
1614
|
-
}
|
|
1615
|
-
|
|
1616
1262
|
private rememberTerminalRelocation(state: ZLinkActorSessionRelocationState): void {
|
|
1617
1263
|
this.terminalRelocations.delete(state);
|
|
1618
1264
|
this.terminalRelocations.set(state, true);
|
|
@@ -1633,27 +1279,74 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1633
1279
|
if (
|
|
1634
1280
|
queue.activeSealId === undefined &&
|
|
1635
1281
|
queue.seals.size === 0 &&
|
|
1636
|
-
queue.
|
|
1637
|
-
queue.
|
|
1282
|
+
queue.ingress.length === 0 &&
|
|
1283
|
+
queue.ingressDrain === undefined &&
|
|
1638
1284
|
this.relocations.get(queue.actorId) === queue
|
|
1639
1285
|
) {
|
|
1640
1286
|
this.relocations.delete(queue.actorId);
|
|
1641
1287
|
}
|
|
1642
1288
|
}
|
|
1643
1289
|
|
|
1644
|
-
private resolveSealWaiters(actorId: string,
|
|
1290
|
+
private resolveSealWaiters(actorId: string, sealId: string): void {
|
|
1291
|
+
const queue = this.relocations.get(actorId);
|
|
1292
|
+
if (queue !== undefined) {
|
|
1293
|
+
for (const entry of queue.ingress) {
|
|
1294
|
+
if (entry.sealId === sealId) entry.sealId = undefined;
|
|
1295
|
+
}
|
|
1296
|
+
this.startHeldOneWayDrain(actorId, queue);
|
|
1297
|
+
}
|
|
1645
1298
|
const waiters = this.sealWaiters.get(actorId);
|
|
1646
1299
|
if (waiters === undefined) return;
|
|
1647
1300
|
this.sealWaiters.delete(actorId);
|
|
1648
1301
|
for (const waiter of waiters) waiter.resolve();
|
|
1649
1302
|
}
|
|
1650
1303
|
|
|
1651
|
-
private rejectSealWaiters(
|
|
1304
|
+
private rejectSealWaiters(
|
|
1305
|
+
actorId: string,
|
|
1306
|
+
error: unknown,
|
|
1307
|
+
reason: 'stale_target' | 'target_closed' | 'shutdown' = 'target_closed'
|
|
1308
|
+
): void {
|
|
1309
|
+
const queue = this.relocations.get(actorId);
|
|
1310
|
+
if (queue !== undefined) {
|
|
1311
|
+
for (const delivery of queue.ingress.splice(0)) delivery.drop(reason, error);
|
|
1312
|
+
}
|
|
1652
1313
|
const waiters = this.sealWaiters.get(actorId);
|
|
1653
1314
|
if (waiters === undefined) return;
|
|
1654
1315
|
this.sealWaiters.delete(actorId);
|
|
1655
1316
|
for (const waiter of waiters) waiter.reject(error);
|
|
1656
1317
|
}
|
|
1318
|
+
|
|
1319
|
+
private startHeldOneWayDrain(actorId: string, queue: ZLinkActorSessionRelocationQueue): void {
|
|
1320
|
+
if (queue.ingressDrain !== undefined) return;
|
|
1321
|
+
const drain = startOutsideStateLane(async () => {
|
|
1322
|
+
for (;;) {
|
|
1323
|
+
const next = await this.lane.run(() => {
|
|
1324
|
+
if (this.relocations.get(actorId) !== queue) return undefined;
|
|
1325
|
+
const first = queue.ingress.at(0);
|
|
1326
|
+
if (first === undefined || first.sealId !== undefined) return undefined;
|
|
1327
|
+
return queue.ingress.shift();
|
|
1328
|
+
});
|
|
1329
|
+
if (next === undefined) return;
|
|
1330
|
+
try {
|
|
1331
|
+
await next.deliver();
|
|
1332
|
+
} catch (error) {
|
|
1333
|
+
next.drop('stale_target', error);
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
});
|
|
1337
|
+
queue.ingressDrain = drain;
|
|
1338
|
+
startOutsideStateLane(() => {
|
|
1339
|
+
void drain.finally(async () => {
|
|
1340
|
+
await this.lane.run(() => {
|
|
1341
|
+
if (queue.ingressDrain !== drain) return;
|
|
1342
|
+
queue.ingressDrain = undefined;
|
|
1343
|
+
if (queue.ingress.at(0)?.sealId === undefined && queue.ingress.length > 0)
|
|
1344
|
+
this.startHeldOneWayDrain(actorId, queue);
|
|
1345
|
+
else this.deleteEmptyRelocationQueue(queue);
|
|
1346
|
+
});
|
|
1347
|
+
});
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1657
1350
|
}
|
|
1658
1351
|
|
|
1659
1352
|
function assertRelocationClaim(
|
|
@@ -1679,77 +1372,6 @@ function startOutsideStateLane<T>(work: () => T): T {
|
|
|
1679
1372
|
return detachedStateLaneResource.runInAsyncScope(work);
|
|
1680
1373
|
}
|
|
1681
1374
|
|
|
1682
|
-
function matchesRelocationSourceProof(
|
|
1683
|
-
state: ZLinkActorSessionRelocationState,
|
|
1684
|
-
claim: ServiceSessionBindingAdmissionClaim
|
|
1685
|
-
): boolean {
|
|
1686
|
-
return (
|
|
1687
|
-
state.actorId === claim.actorId &&
|
|
1688
|
-
state.actorGeneration === claim.objectGeneration &&
|
|
1689
|
-
state.bindingGeneration === claim.bindingGeneration &&
|
|
1690
|
-
state.sessionIdentity === claim.sessionIdentity &&
|
|
1691
|
-
state.actorNodeRid !== undefined &&
|
|
1692
|
-
routingIdsEqual(state.actorNodeRid, claim.actorNodeRid) &&
|
|
1693
|
-
state.actorNodeGeneration === claim.actorNodeGeneration
|
|
1694
|
-
);
|
|
1695
|
-
}
|
|
1696
|
-
|
|
1697
|
-
function matchesAcceptedProducerProof(
|
|
1698
|
-
proof: ZLinkActorSessionAcceptedProducerProof,
|
|
1699
|
-
claim: ServiceSessionBindingAdmissionClaim
|
|
1700
|
-
): boolean {
|
|
1701
|
-
return (
|
|
1702
|
-
proof.actorId === claim.actorId &&
|
|
1703
|
-
proof.objectGeneration === claim.objectGeneration &&
|
|
1704
|
-
routingIdsEqual(proof.actorNodeRid, claim.actorNodeRid) &&
|
|
1705
|
-
proof.actorNodeGeneration === claim.actorNodeGeneration &&
|
|
1706
|
-
proof.sessionIdentity === claim.sessionIdentity &&
|
|
1707
|
-
proof.bindingGeneration === claim.bindingGeneration
|
|
1708
|
-
);
|
|
1709
|
-
}
|
|
1710
|
-
|
|
1711
|
-
function validAcceptedTargetProof(
|
|
1712
|
-
state: ZLinkActorSessionRelocationState,
|
|
1713
|
-
proof: ZLinkActorSessionAcceptedProducerProof
|
|
1714
|
-
): boolean {
|
|
1715
|
-
return (
|
|
1716
|
-
proof.actorId === state.actorId &&
|
|
1717
|
-
proof.objectGeneration === state.actorGeneration &&
|
|
1718
|
-
proof.actorNodeRid.length > 0 &&
|
|
1719
|
-
proof.actorNodeGeneration > 0n &&
|
|
1720
|
-
proof.sessionIdentity === state.sessionIdentity &&
|
|
1721
|
-
proof.bindingGeneration === state.bindingGeneration
|
|
1722
|
-
);
|
|
1723
|
-
}
|
|
1724
|
-
|
|
1725
|
-
function relocationSourceProof(
|
|
1726
|
-
state: ZLinkActorSessionRelocationState
|
|
1727
|
-
): ZLinkActorSessionAcceptedProducerProof | undefined {
|
|
1728
|
-
if (
|
|
1729
|
-
state.sessionIdentity === undefined ||
|
|
1730
|
-
state.actorNodeRid === undefined ||
|
|
1731
|
-
state.actorNodeGeneration === undefined
|
|
1732
|
-
)
|
|
1733
|
-
return undefined;
|
|
1734
|
-
return {
|
|
1735
|
-
actorId: state.actorId,
|
|
1736
|
-
objectGeneration: state.actorGeneration,
|
|
1737
|
-
actorNodeRid: state.actorNodeRid,
|
|
1738
|
-
actorNodeGeneration: state.actorNodeGeneration,
|
|
1739
|
-
sessionIdentity: state.sessionIdentity,
|
|
1740
|
-
bindingGeneration: state.bindingGeneration
|
|
1741
|
-
};
|
|
1742
|
-
}
|
|
1743
|
-
|
|
1744
|
-
function failRetainedOutbound(operation: ZLinkActorSessionRetainedOutbound, error: unknown): void {
|
|
1745
|
-
try {
|
|
1746
|
-
operation.fail(error);
|
|
1747
|
-
} catch {
|
|
1748
|
-
// The aggregate has already removed the entry. A failure observer cannot
|
|
1749
|
-
// retain or settle the same delivery a second time.
|
|
1750
|
-
}
|
|
1751
|
-
}
|
|
1752
|
-
|
|
1753
1375
|
function assertSuccessorSessionIdentity(
|
|
1754
1376
|
predecessor: ZLinkActorSessionRelocationState,
|
|
1755
1377
|
successor: ZLinkActorSessionRelocationClaim
|