@zlink-systems/framework 0.26.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/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/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +15 -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 +1 -2
- package/dist/runtime/activation-admission.js +2 -6
- 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 +13 -11
- package/dist/runtime/actors/actor-handoff.d.ts +4 -4
- package/dist/runtime/actors/actor-handoff.js +8 -8
- 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 +83 -105
- 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 +1 -1
- package/dist/runtime/actors/actor-remote-joiner.js +5 -9
- 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-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
- package/dist/runtime/actors/deferred-join-completion.js +1 -0
- package/dist/runtime/actors/index.d.ts +9 -7
- package/dist/runtime/actors/index.js +87 -69
- 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 +2 -0
- package/dist/runtime/admission.js +7 -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 +6 -23
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
- 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-support.d.ts +1 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
- package/dist/runtime/backend/raw-binding-port.d.ts +1 -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 -8
- package/dist/runtime/channels/channel-clients.js +68 -52
- 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 -10
- 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.js +5 -2
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +248 -174
- package/dist/runtime/channels/channel-transports.d.ts +11 -17
- 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 +130 -72
- 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 +12 -9
- package/dist/runtime/execution/index.js +58 -14
- package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
- package/dist/runtime/execution/serial-execution-queue.js +54 -15
- 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/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 +8 -5
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
- 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.js +22 -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 +0 -6
- 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-object-owner.js +3 -2
- 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 -12
- 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 +26 -25
- package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
- package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
- package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
- package/dist/runtime/foundation/service-topology-registry.js +17 -32
- 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 +16 -18
- package/dist/runtime/host/actor-transfer-runtime.js +143 -176
- 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 +14 -13
- package/dist/runtime/host/index.js +190 -157
- 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 +7 -20
- package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
- package/dist/runtime/host/route-mesh-runtime.js +171 -252
- 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 +21 -30
- package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
- 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 -10
- package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
- package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
- 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 +72 -22
- 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 +4 -9
- package/dist/runtime/locations/lifecycle.js +2 -31
- 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 +37 -28
- 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 +6 -0
- package/dist/runtime/locations/spot-location-claims.js +42 -1
- 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 +1 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
- package/dist/runtime/spots/index.d.ts +14 -20
- package/dist/runtime/spots/index.js +302 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
- package/dist/runtime/spots/spot-activation-registry.js +14 -50
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +2 -2
- package/dist/runtime/spots/spot-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-activation.js +49 -32
- 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 +4 -52
- package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
- package/dist/runtime/spots/spot-actor-membership.js +22 -45
- 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 +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +9 -20
- 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 +5 -4
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +9 -8
- 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 -3
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
- 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 +2 -16
- package/dist/runtime/spots/spot-serial-executor.js +2 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
- package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
- 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 +11 -1
- package/dist/runtime/streams/index.d.ts +14 -15
- package/dist/runtime/streams/index.js +20 -21
- 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/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/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/Spots/Contracts.ts +1 -1
- package/src/internal.ts +14 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +2 -8
- 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 +39 -33
- package/src/runtime/actors/actor-handoff.ts +24 -22
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +172 -174
- 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 +9 -11
- 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-state.ts +85 -247
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +10 -6
- package/src/runtime/actors/index.ts +100 -79
- 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 +8 -1
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +13 -29
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
- package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
- package/src/runtime/backend/raw-binding-port.ts +1 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -85
- 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 -23
- 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 +6 -2
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +301 -192
- package/src/runtime/channels/channel-transports.ts +161 -112
- 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 +172 -91
- 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 +60 -20
- package/src/runtime/execution/serial-execution-queue.ts +131 -18
- 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/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +31 -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 +0 -10
- 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-object-owner.ts +5 -2
- 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 -17
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
- package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
- package/src/runtime/foundation/service-topology-registry.ts +23 -32
- 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 +180 -260
- 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 +327 -296
- 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 +8 -41
- package/src/runtime/host/route-mesh-runtime.ts +228 -271
- 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 +699 -561
- 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 +73 -22
- package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
- 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 +100 -25
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +13 -43
- 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 +75 -49
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +58 -1
- 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 +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
- package/src/runtime/spots/index.ts +433 -229
- package/src/runtime/spots/spot-activation-registry.ts +30 -69
- package/src/runtime/spots/spot-activation-state.ts +2 -2
- package/src/runtime/spots/spot-activation.ts +67 -37
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
- package/src/runtime/spots/spot-actor-membership.ts +40 -72
- 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 -30
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +21 -17
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
- package/src/runtime/spots/spot-outbound.ts +45 -23
- 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 -26
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +5 -27
- package/src/runtime/spots/spot-serial-executor.ts +2 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +21 -1
- package/src/runtime/streams/index.ts +76 -64
- 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/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/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/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,15 +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 type { ServiceSessionBindingAdmissionResult } from '../foundation/service-session-binding-ingress-port';
|
|
13
|
+
export const DEFAULT_TERMINAL_RELOCATION_CAPACITY = 4096;
|
|
9
14
|
|
|
10
15
|
const detachedStateLaneResource = new AsyncResource('zlink:actor-session-binding-registry');
|
|
11
16
|
export interface ZLinkActorSessionBindingActor {
|
|
12
17
|
readonly actorId: string;
|
|
18
|
+
readonly ref: { readonly actorId: string; readonly bindingGeneration?: bigint };
|
|
13
19
|
}
|
|
14
20
|
|
|
15
21
|
export interface ZLinkActorSessionBindingContext<TActor extends ZLinkActorSessionBindingActor> {
|
|
@@ -46,11 +52,6 @@ export interface ZLinkActorSessionRelocationClaim {
|
|
|
46
52
|
readonly sealId: string;
|
|
47
53
|
}
|
|
48
54
|
|
|
49
|
-
export interface ZLinkActorSessionRetainedOutbound {
|
|
50
|
-
deliver(): Promise<boolean>;
|
|
51
|
-
fail(error: unknown): void;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
55
|
export interface ZLinkActorSessionRelocationSnapshot extends ZLinkActorSessionRelocationClaim {
|
|
55
56
|
readonly phase: 'sealed' | 'applying' | 'applied' | 'terminal';
|
|
56
57
|
readonly applyFingerprint?: string;
|
|
@@ -99,22 +100,16 @@ interface ZLinkActorSessionRelocationState {
|
|
|
99
100
|
readonly resolveTerminal: () => void;
|
|
100
101
|
}
|
|
101
102
|
|
|
102
|
-
interface ZLinkActorSessionOutboundEntry {
|
|
103
|
-
readonly sealId?: string;
|
|
104
|
-
readonly operation: ZLinkActorSessionRetainedOutbound;
|
|
105
|
-
readonly arrivalOrder: bigint;
|
|
106
|
-
released: boolean;
|
|
107
|
-
settled: boolean;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
103
|
interface ZLinkActorSessionRelocationQueue {
|
|
111
104
|
readonly actorId: string;
|
|
112
105
|
activeSealId?: string;
|
|
113
106
|
readonly seals: Map<string, ZLinkActorSessionRelocationState>;
|
|
114
|
-
readonly
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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>;
|
|
118
113
|
}
|
|
119
114
|
|
|
120
115
|
export interface ZLinkActorSessionAuthorityFence {
|
|
@@ -151,24 +146,20 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
151
146
|
private readonly terminalRelocations = new Map<ZLinkActorSessionRelocationState, true>();
|
|
152
147
|
|
|
153
148
|
constructor(
|
|
154
|
-
private readonly terminalRelocationCapacity =
|
|
155
|
-
private readonly outboundCapacity = 4096,
|
|
149
|
+
private readonly terminalRelocationCapacity: number = DEFAULT_TERMINAL_RELOCATION_CAPACITY,
|
|
156
150
|
// Spec 06 — SessionRelocationSealTimeout bounds how long a session
|
|
157
151
|
// relocation seal may hold ingress (default 3,000 ms, finite only).
|
|
158
152
|
// Every wait on the seal (accept paths) and on active-frame drain
|
|
159
153
|
// (the sealing side) must observe that bound; an unbounded wait here
|
|
160
154
|
// turns a lost control or a lifecycle interlock into a silent stall
|
|
161
155
|
// (spec 48:205 — transport/deadline limits apply during relocation).
|
|
162
|
-
private readonly sealWaitTimeoutMs =
|
|
156
|
+
private readonly sealWaitTimeoutMs: number = zlinkDefaultLocationOptions.sessionRelocationSealTimeoutMs,
|
|
163
157
|
private readonly errorSink?: () =>
|
|
164
158
|
{ reportRuntimeTaskException(taskName: string, error: unknown): void } | undefined
|
|
165
159
|
) {
|
|
166
160
|
if (!Number.isSafeInteger(terminalRelocationCapacity) || terminalRelocationCapacity <= 0) {
|
|
167
161
|
throw new RangeError('Session relocation terminal capacity must be a positive safe integer.');
|
|
168
162
|
}
|
|
169
|
-
if (!Number.isSafeInteger(outboundCapacity) || outboundCapacity <= 0) {
|
|
170
|
-
throw new RangeError('Session relocation outbound capacity must be a positive safe integer.');
|
|
171
|
-
}
|
|
172
163
|
if (!Number.isSafeInteger(sealWaitTimeoutMs) || sealWaitTimeoutMs <= 0) {
|
|
173
164
|
throw new RangeError('Session relocation seal timeout must be a positive safe integer.');
|
|
174
165
|
}
|
|
@@ -195,7 +186,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
195
186
|
);
|
|
196
187
|
}
|
|
197
188
|
|
|
198
|
-
private
|
|
189
|
+
private commitCore(
|
|
199
190
|
previous: ZLinkActorSessionRoute<TContext, TActor> | undefined,
|
|
200
191
|
context: TContext,
|
|
201
192
|
actor: TActor,
|
|
@@ -203,7 +194,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
203
194
|
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
204
195
|
sessionIdentity?: string,
|
|
205
196
|
commitActor?: () => void
|
|
206
|
-
):
|
|
197
|
+
): void {
|
|
207
198
|
const current = this.routes.get(actor.actorId);
|
|
208
199
|
if (current !== previous) {
|
|
209
200
|
throw createInternalFrameworkException(
|
|
@@ -239,7 +230,24 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
239
230
|
}
|
|
240
231
|
|
|
241
232
|
if (!sameBinding && actorSlot !== undefined) {
|
|
242
|
-
|
|
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
|
+
});
|
|
243
251
|
}
|
|
244
252
|
} catch (error) {
|
|
245
253
|
context.unbindLocal(actor.actorId, bindingToken);
|
|
@@ -317,7 +325,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
317
325
|
);
|
|
318
326
|
}
|
|
319
327
|
|
|
320
|
-
private
|
|
328
|
+
private replaceAndReleaseSealCore(
|
|
321
329
|
previous: ZLinkActorSessionRoute<TContext, TActor>,
|
|
322
330
|
context: TContext,
|
|
323
331
|
actor: TActor,
|
|
@@ -326,7 +334,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
326
334
|
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
327
335
|
sessionIdentity?: string,
|
|
328
336
|
commitActor?: () => void
|
|
329
|
-
):
|
|
337
|
+
): void {
|
|
330
338
|
if (previous.sealId !== sealId) {
|
|
331
339
|
throw createInternalFrameworkException(
|
|
332
340
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
@@ -337,7 +345,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
337
345
|
// JavaScript cannot interleave another ingress turn between these two
|
|
338
346
|
// synchronous mutations. The replacement preserves the seal, then the
|
|
339
347
|
// exact release publishes the route to held ingress as one owner turn.
|
|
340
|
-
|
|
348
|
+
this.commitCore(
|
|
341
349
|
previous,
|
|
342
350
|
context,
|
|
343
351
|
actor,
|
|
@@ -367,6 +375,22 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
367
375
|
return await this.lane.run(() => this.routeCore(actorId));
|
|
368
376
|
}
|
|
369
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
|
+
|
|
370
394
|
private routeCore(actorId: string): ZLinkActorSessionRoute<TContext, TActor> | undefined {
|
|
371
395
|
return this.routes.get(actorId);
|
|
372
396
|
}
|
|
@@ -399,15 +423,19 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
399
423
|
bindingToken: string,
|
|
400
424
|
termination = ZLinkActorSessionBindingTermination.BindingEnd
|
|
401
425
|
): Promise<void> {
|
|
402
|
-
await this.lane.run(() =>
|
|
426
|
+
const { submission } = await this.lane.run(() => ({
|
|
427
|
+
submission: this.unbindCore(actorId, context, bindingToken, termination)
|
|
428
|
+
}));
|
|
429
|
+
await submission;
|
|
403
430
|
}
|
|
404
431
|
|
|
405
|
-
|
|
432
|
+
/** Fixes the unbind order in the lane; the caller awaits transport completion outside it. */
|
|
433
|
+
private unbindCore(
|
|
406
434
|
actorId: string,
|
|
407
435
|
context: TContext,
|
|
408
436
|
bindingToken: string,
|
|
409
437
|
termination: ZLinkActorSessionBindingTermination
|
|
410
|
-
): Promise<void> {
|
|
438
|
+
): Promise<void> | undefined {
|
|
411
439
|
const route = this.routes.get(actorId);
|
|
412
440
|
if (route === undefined || route.context !== context || route.bindingToken !== bindingToken) {
|
|
413
441
|
return;
|
|
@@ -422,29 +450,29 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
422
450
|
actorId,
|
|
423
451
|
new Error(`Actor '${actorId}' session binding was removed while accepted frames were active.`)
|
|
424
452
|
);
|
|
425
|
-
this.clearRouteRelocation(
|
|
426
|
-
actorId,
|
|
427
|
-
route,
|
|
428
|
-
new Error(`Actor '${actorId}' session binding was removed.`)
|
|
429
|
-
);
|
|
453
|
+
this.clearRouteRelocation(actorId, route);
|
|
430
454
|
if (
|
|
431
455
|
termination === ZLinkActorSessionBindingTermination.BindingEnd &&
|
|
432
456
|
route.actorSlot !== undefined
|
|
433
457
|
) {
|
|
434
|
-
|
|
458
|
+
return context.actorSlotControls?.enqueueUnbound(route.actorSlot);
|
|
435
459
|
}
|
|
460
|
+
return undefined;
|
|
436
461
|
}
|
|
437
462
|
|
|
438
463
|
async unbindActor(actorId: string): Promise<void> {
|
|
439
|
-
await this.lane.run(() =>
|
|
464
|
+
const { submission } = await this.lane.run(() => ({
|
|
465
|
+
submission: this.unbindActorCore(actorId)
|
|
466
|
+
}));
|
|
467
|
+
await submission;
|
|
440
468
|
}
|
|
441
469
|
|
|
442
|
-
private
|
|
470
|
+
private unbindActorCore(actorId: string): Promise<void> | undefined {
|
|
443
471
|
const route = this.routes.get(actorId);
|
|
444
472
|
if (route === undefined) {
|
|
445
|
-
return;
|
|
473
|
+
return undefined;
|
|
446
474
|
}
|
|
447
|
-
|
|
475
|
+
return this.unbindCore(
|
|
448
476
|
actorId,
|
|
449
477
|
route.context,
|
|
450
478
|
route.bindingToken,
|
|
@@ -456,10 +484,10 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
456
484
|
await this.lane.run(() => this.cleanupCore(context));
|
|
457
485
|
}
|
|
458
486
|
|
|
459
|
-
private
|
|
487
|
+
private cleanupCore(context: TContext): void {
|
|
460
488
|
for (const route of [...this.routes.values()]) {
|
|
461
489
|
if (route.context === context) {
|
|
462
|
-
|
|
490
|
+
this.unbindCore(
|
|
463
491
|
route.actor.actorId,
|
|
464
492
|
context,
|
|
465
493
|
route.bindingToken,
|
|
@@ -523,6 +551,37 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
523
551
|
}
|
|
524
552
|
}
|
|
525
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
|
+
|
|
526
585
|
/**
|
|
527
586
|
* Holds Session ingress accepted after a relocation seal until the target
|
|
528
587
|
* route is published and the seal is released. The caller keeps the
|
|
@@ -698,6 +757,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
698
757
|
);
|
|
699
758
|
}
|
|
700
759
|
route.sealId = sealId;
|
|
760
|
+
if (!this.relocations.has(actorId)) {
|
|
761
|
+
this.relocations.set(actorId, { actorId, seals: new Map(), ingress: [] });
|
|
762
|
+
}
|
|
701
763
|
// A pre-seal REQUEST is captured as part of installing command 42. Its
|
|
702
764
|
// Session frame no longer gates the seal; its single submission attempt
|
|
703
765
|
// and terminal continue under the request admission state above.
|
|
@@ -770,13 +832,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
770
832
|
resolveTerminal = resolve;
|
|
771
833
|
});
|
|
772
834
|
const ready = this.waitForActiveFramesCore(claim.actorId, signal);
|
|
773
|
-
const actorQueue
|
|
774
|
-
actorId: claim.actorId,
|
|
775
|
-
seals: new Map(),
|
|
776
|
-
outbound: [],
|
|
777
|
-
nextArrivalOrder: 1n,
|
|
778
|
-
outboundCount: 0
|
|
779
|
-
};
|
|
835
|
+
const actorQueue = this.relocations.get(claim.actorId)!;
|
|
780
836
|
const state: ZLinkActorSessionRelocationState = {
|
|
781
837
|
...claim,
|
|
782
838
|
phase: 'sealed',
|
|
@@ -804,93 +860,6 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
804
860
|
return this.relocations.get(actorId)?.seals.get(sealId);
|
|
805
861
|
}
|
|
806
862
|
|
|
807
|
-
async retainRelocationOutbound(
|
|
808
|
-
actorId: string,
|
|
809
|
-
operation: ZLinkActorSessionRetainedOutbound,
|
|
810
|
-
sealId?: string
|
|
811
|
-
): Promise<ServiceSessionBindingAdmissionResult> {
|
|
812
|
-
return await this.lane.run(() =>
|
|
813
|
-
this.retainRelocationOutboundCorePublic(actorId, operation, sealId)
|
|
814
|
-
);
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
private retainRelocationOutboundCorePublic(
|
|
818
|
-
actorId: string,
|
|
819
|
-
operation: ZLinkActorSessionRetainedOutbound,
|
|
820
|
-
sealId?: string
|
|
821
|
-
): ServiceSessionBindingAdmissionResult {
|
|
822
|
-
if (sealId !== undefined) {
|
|
823
|
-
const queue = this.relocations.get(actorId);
|
|
824
|
-
const state = queue?.seals.get(sealId);
|
|
825
|
-
if (
|
|
826
|
-
queue === undefined ||
|
|
827
|
-
state === undefined ||
|
|
828
|
-
(queue.activeSealId !== sealId &&
|
|
829
|
-
!(queue.activeSealId === undefined && state.phase === 'terminal'))
|
|
830
|
-
) {
|
|
831
|
-
failRetainedOutbound(
|
|
832
|
-
operation,
|
|
833
|
-
new Error(`Actor '${actorId}' Session outbound did not match its exact relocation seal.`)
|
|
834
|
-
);
|
|
835
|
-
return 'rejected';
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
return this.retainRelocationOutboundCore(actorId, operation);
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
/**
|
|
842
|
-
* Session–Actor binding §8.1: the Session owner holds a push only while the
|
|
843
|
-
* binding's relocation seal is open, and keeps it behind earlier held pushes.
|
|
844
|
-
* Whether the push names the current binding was decided once by the Session
|
|
845
|
-
* owner's binding record before this call.
|
|
846
|
-
*/
|
|
847
|
-
private retainRelocationOutboundCore(
|
|
848
|
-
actorId: string,
|
|
849
|
-
operation: ZLinkActorSessionRetainedOutbound
|
|
850
|
-
): ServiceSessionBindingAdmissionResult {
|
|
851
|
-
const queue = this.relocations.get(actorId);
|
|
852
|
-
const state =
|
|
853
|
-
queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
854
|
-
if (queue === undefined) return 'passThrough';
|
|
855
|
-
if (state === undefined || state.phase === 'applied' || state.phase === 'terminal') {
|
|
856
|
-
if (queue.drainPromise === undefined && queue.outbound.length === 0) return 'passThrough';
|
|
857
|
-
if (!this.reserveOutbound(queue, operation)) return 'rejected';
|
|
858
|
-
queue.outbound.push({
|
|
859
|
-
operation,
|
|
860
|
-
arrivalOrder: queue.nextArrivalOrder++,
|
|
861
|
-
released: true,
|
|
862
|
-
settled: false
|
|
863
|
-
});
|
|
864
|
-
this.startOutboundDrain(queue);
|
|
865
|
-
return 'retained';
|
|
866
|
-
}
|
|
867
|
-
if (!this.reserveOutbound(queue, operation)) return 'rejected';
|
|
868
|
-
queue.outbound.push({
|
|
869
|
-
sealId: state.sealId,
|
|
870
|
-
operation,
|
|
871
|
-
arrivalOrder: queue.nextArrivalOrder++,
|
|
872
|
-
released: false,
|
|
873
|
-
settled: false
|
|
874
|
-
});
|
|
875
|
-
return 'retained';
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
async discardRelocationOutbound(actorId: string, sealId: string, error: unknown): Promise<void> {
|
|
879
|
-
await this.lane.run(() => this.discardRelocationOutboundCore(actorId, sealId, error));
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
private discardRelocationOutboundCore(actorId: string, sealId: string, error: unknown): void {
|
|
883
|
-
const queue = this.relocations.get(actorId);
|
|
884
|
-
if (queue === undefined) return;
|
|
885
|
-
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
886
|
-
const entry = queue.outbound[index]!;
|
|
887
|
-
if (entry.sealId !== sealId) continue;
|
|
888
|
-
queue.outbound.splice(index, 1);
|
|
889
|
-
this.failOutbound(queue, entry, error);
|
|
890
|
-
}
|
|
891
|
-
this.deleteEmptyRelocationQueue(queue);
|
|
892
|
-
}
|
|
893
|
-
|
|
894
863
|
async applyRelocation(
|
|
895
864
|
actorId: string,
|
|
896
865
|
sealId: string,
|
|
@@ -924,13 +893,11 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
924
893
|
sealId: string,
|
|
925
894
|
applyFingerprint: string
|
|
926
895
|
): {
|
|
927
|
-
readonly queue: ZLinkActorSessionRelocationQueue;
|
|
928
896
|
readonly state: ZLinkActorSessionRelocationState;
|
|
929
897
|
readonly applyPromise?: Promise<void>;
|
|
930
898
|
readonly promise?: Promise<void>;
|
|
931
899
|
readonly resolve?: () => void;
|
|
932
900
|
readonly reject?: (error: unknown) => void;
|
|
933
|
-
readonly sealId?: string;
|
|
934
901
|
} {
|
|
935
902
|
const queue = this.relocations.get(actorId);
|
|
936
903
|
const state = queue?.seals.get(sealId);
|
|
@@ -949,7 +916,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
949
916
|
true
|
|
950
917
|
);
|
|
951
918
|
}
|
|
952
|
-
return {
|
|
919
|
+
return { state, applyPromise: state.applyPromise };
|
|
953
920
|
}
|
|
954
921
|
|
|
955
922
|
state.phase = 'applying';
|
|
@@ -962,31 +929,17 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
962
929
|
});
|
|
963
930
|
state.applyPromise = promise;
|
|
964
931
|
return {
|
|
965
|
-
queue,
|
|
966
932
|
state,
|
|
967
933
|
promise,
|
|
968
934
|
resolve,
|
|
969
|
-
reject
|
|
970
|
-
sealId
|
|
935
|
+
reject
|
|
971
936
|
};
|
|
972
937
|
}
|
|
973
938
|
|
|
974
|
-
/**
|
|
975
|
-
* Command 44 commit or abort releases every push held under this seal in
|
|
976
|
-
* arrival order (Session–Actor binding §8.1). The held pushes were admitted
|
|
977
|
-
* by the current binding; the route change does not judge them again.
|
|
978
|
-
*/
|
|
979
939
|
private completeRelocationApply(prepared: {
|
|
980
|
-
readonly queue: ZLinkActorSessionRelocationQueue;
|
|
981
940
|
readonly state: ZLinkActorSessionRelocationState;
|
|
982
|
-
readonly sealId?: string;
|
|
983
941
|
}): void {
|
|
984
|
-
|
|
985
|
-
for (const entry of queue.outbound) {
|
|
986
|
-
if (entry.sealId === sealId) entry.released = true;
|
|
987
|
-
}
|
|
988
|
-
this.startOutboundDrain(queue);
|
|
989
|
-
state.phase = 'applied';
|
|
942
|
+
prepared.state.phase = 'applied';
|
|
990
943
|
}
|
|
991
944
|
|
|
992
945
|
private failRelocationApply(prepared: {
|
|
@@ -1038,7 +991,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1038
991
|
|
|
1039
992
|
/**
|
|
1040
993
|
* Actor-wide relocation teardown: every seal (active and terminal-retained)
|
|
1041
|
-
*
|
|
994
|
+
* for `actorId` is discarded unconditionally.
|
|
1042
995
|
* Reserved for paths where the Actor itself is gone or being torn down
|
|
1043
996
|
* (destroy, ownership clear, relocation-seal expiry/failure) — never for a
|
|
1044
997
|
* single physical route's disconnect, which must not disturb a relocation
|
|
@@ -1051,8 +1004,18 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1051
1004
|
private clearRelocationCore(actorId: string, error: unknown): void {
|
|
1052
1005
|
const queue = this.relocations.get(actorId);
|
|
1053
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
|
+
);
|
|
1054
1018
|
this.relocations.delete(actorId);
|
|
1055
|
-
for (const entry of queue.outbound.splice(0)) this.failOutbound(queue, entry, error);
|
|
1056
1019
|
for (const state of queue.seals.values()) {
|
|
1057
1020
|
this.terminalRelocations.delete(state);
|
|
1058
1021
|
if (state.phase !== 'terminal') state.resolveTerminal();
|
|
@@ -1063,7 +1026,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1063
1026
|
* Spec 48 §137: a relocation seal's lifecycle is independent of any single
|
|
1064
1027
|
* physical route's binding. Unbinding one physical route (a disconnect)
|
|
1065
1028
|
* must retire only the still-open (nonterminal) relocation seal that this
|
|
1066
|
-
* exact route's Session owns
|
|
1029
|
+
* exact route's Session owns — it
|
|
1067
1030
|
* must never reach into a seal that has already reached 'terminal' (its
|
|
1068
1031
|
* bounded retention exists precisely so a late same-seal relay can still
|
|
1069
1032
|
* pass on a successor route) nor into a different Session's active seal
|
|
@@ -1072,8 +1035,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1072
1035
|
*/
|
|
1073
1036
|
private clearRouteRelocation(
|
|
1074
1037
|
actorId: string,
|
|
1075
|
-
route: ZLinkActorSessionRoute<TContext, TActor
|
|
1076
|
-
error: unknown
|
|
1038
|
+
route: ZLinkActorSessionRoute<TContext, TActor>
|
|
1077
1039
|
): void {
|
|
1078
1040
|
const queue = this.relocations.get(actorId);
|
|
1079
1041
|
if (queue === undefined) return;
|
|
@@ -1089,12 +1051,6 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1089
1051
|
this.deleteEmptyRelocationQueue(queue);
|
|
1090
1052
|
return;
|
|
1091
1053
|
}
|
|
1092
|
-
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
1093
|
-
const entry = queue.outbound[index]!;
|
|
1094
|
-
if (entry.sealId !== activeSealId) continue;
|
|
1095
|
-
queue.outbound.splice(index, 1);
|
|
1096
|
-
this.failOutbound(queue, entry, error);
|
|
1097
|
-
}
|
|
1098
1054
|
queue.activeSealId = undefined;
|
|
1099
1055
|
queue.seals.delete(activeSealId!);
|
|
1100
1056
|
this.terminalRelocations.delete(activeState);
|
|
@@ -1303,90 +1259,6 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1303
1259
|
for (const waiter of waiters) waiter.reject(error);
|
|
1304
1260
|
}
|
|
1305
1261
|
|
|
1306
|
-
private startOutboundDrain(queue: ZLinkActorSessionRelocationQueue): void {
|
|
1307
|
-
if (queue.drainPromise !== undefined) return;
|
|
1308
|
-
const drain = startOutsideStateLane(async () => {
|
|
1309
|
-
for (;;) {
|
|
1310
|
-
const entry = await this.lane.run(() => {
|
|
1311
|
-
const current = queue.outbound.at(0);
|
|
1312
|
-
if (current === undefined || !current.released) return undefined;
|
|
1313
|
-
if (current.settled) {
|
|
1314
|
-
queue.outbound.shift();
|
|
1315
|
-
return null;
|
|
1316
|
-
}
|
|
1317
|
-
return current;
|
|
1318
|
-
});
|
|
1319
|
-
if (entry === undefined) return;
|
|
1320
|
-
if (entry === null) continue;
|
|
1321
|
-
try {
|
|
1322
|
-
const delivered = await entry.operation.deliver();
|
|
1323
|
-
await this.lane.run(() => {
|
|
1324
|
-
if (delivered) this.settleOutbound(queue, entry);
|
|
1325
|
-
else
|
|
1326
|
-
this.failOutbound(
|
|
1327
|
-
queue,
|
|
1328
|
-
entry,
|
|
1329
|
-
new Error(
|
|
1330
|
-
`Actor '${queue.actorId}' retained Session outbound delivery was rejected.`
|
|
1331
|
-
)
|
|
1332
|
-
);
|
|
1333
|
-
if (queue.outbound[0] === entry) queue.outbound.shift();
|
|
1334
|
-
});
|
|
1335
|
-
} catch (error) {
|
|
1336
|
-
await this.lane.run(() => {
|
|
1337
|
-
this.failOutbound(queue, entry, error);
|
|
1338
|
-
if (queue.outbound[0] === entry) queue.outbound.shift();
|
|
1339
|
-
});
|
|
1340
|
-
}
|
|
1341
|
-
}
|
|
1342
|
-
});
|
|
1343
|
-
startOutsideStateLane(() => {
|
|
1344
|
-
void drain.finally(
|
|
1345
|
-
async () =>
|
|
1346
|
-
await this.lane.run(() => {
|
|
1347
|
-
if (queue.drainPromise === drain) queue.drainPromise = undefined;
|
|
1348
|
-
if (queue.outbound[0]?.released === true) this.startOutboundDrain(queue);
|
|
1349
|
-
else this.deleteEmptyRelocationQueue(queue);
|
|
1350
|
-
})
|
|
1351
|
-
);
|
|
1352
|
-
});
|
|
1353
|
-
queue.drainPromise = drain;
|
|
1354
|
-
}
|
|
1355
|
-
|
|
1356
|
-
private reserveOutbound(
|
|
1357
|
-
queue: ZLinkActorSessionRelocationQueue,
|
|
1358
|
-
operation: ZLinkActorSessionRetainedOutbound
|
|
1359
|
-
): boolean {
|
|
1360
|
-
if (queue.outboundCount < this.outboundCapacity) {
|
|
1361
|
-
queue.outboundCount++;
|
|
1362
|
-
return true;
|
|
1363
|
-
}
|
|
1364
|
-
failRetainedOutbound(
|
|
1365
|
-
operation,
|
|
1366
|
-
new Error(`Actor '${queue.actorId}' Session relocation outbound capacity was exhausted.`)
|
|
1367
|
-
);
|
|
1368
|
-
return false;
|
|
1369
|
-
}
|
|
1370
|
-
|
|
1371
|
-
private settleOutbound(
|
|
1372
|
-
queue: ZLinkActorSessionRelocationQueue,
|
|
1373
|
-
entry: ZLinkActorSessionOutboundEntry
|
|
1374
|
-
): void {
|
|
1375
|
-
if (entry.settled) return;
|
|
1376
|
-
entry.settled = true;
|
|
1377
|
-
queue.outboundCount--;
|
|
1378
|
-
}
|
|
1379
|
-
|
|
1380
|
-
private failOutbound(
|
|
1381
|
-
queue: ZLinkActorSessionRelocationQueue,
|
|
1382
|
-
entry: ZLinkActorSessionOutboundEntry,
|
|
1383
|
-
error: unknown
|
|
1384
|
-
): void {
|
|
1385
|
-
if (entry.settled) return;
|
|
1386
|
-
this.settleOutbound(queue, entry);
|
|
1387
|
-
failRetainedOutbound(entry.operation, error);
|
|
1388
|
-
}
|
|
1389
|
-
|
|
1390
1262
|
private rememberTerminalRelocation(state: ZLinkActorSessionRelocationState): void {
|
|
1391
1263
|
this.terminalRelocations.delete(state);
|
|
1392
1264
|
this.terminalRelocations.set(state, true);
|
|
@@ -1407,27 +1279,74 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
1407
1279
|
if (
|
|
1408
1280
|
queue.activeSealId === undefined &&
|
|
1409
1281
|
queue.seals.size === 0 &&
|
|
1410
|
-
queue.
|
|
1411
|
-
queue.
|
|
1282
|
+
queue.ingress.length === 0 &&
|
|
1283
|
+
queue.ingressDrain === undefined &&
|
|
1412
1284
|
this.relocations.get(queue.actorId) === queue
|
|
1413
1285
|
) {
|
|
1414
1286
|
this.relocations.delete(queue.actorId);
|
|
1415
1287
|
}
|
|
1416
1288
|
}
|
|
1417
1289
|
|
|
1418
|
-
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
|
+
}
|
|
1419
1298
|
const waiters = this.sealWaiters.get(actorId);
|
|
1420
1299
|
if (waiters === undefined) return;
|
|
1421
1300
|
this.sealWaiters.delete(actorId);
|
|
1422
1301
|
for (const waiter of waiters) waiter.resolve();
|
|
1423
1302
|
}
|
|
1424
1303
|
|
|
1425
|
-
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
|
+
}
|
|
1426
1313
|
const waiters = this.sealWaiters.get(actorId);
|
|
1427
1314
|
if (waiters === undefined) return;
|
|
1428
1315
|
this.sealWaiters.delete(actorId);
|
|
1429
1316
|
for (const waiter of waiters) waiter.reject(error);
|
|
1430
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
|
+
}
|
|
1431
1350
|
}
|
|
1432
1351
|
|
|
1433
1352
|
function assertRelocationClaim(
|
|
@@ -1453,15 +1372,6 @@ function startOutsideStateLane<T>(work: () => T): T {
|
|
|
1453
1372
|
return detachedStateLaneResource.runInAsyncScope(work);
|
|
1454
1373
|
}
|
|
1455
1374
|
|
|
1456
|
-
function failRetainedOutbound(operation: ZLinkActorSessionRetainedOutbound, error: unknown): void {
|
|
1457
|
-
try {
|
|
1458
|
-
operation.fail(error);
|
|
1459
|
-
} catch {
|
|
1460
|
-
// The aggregate has already removed the entry. A failure observer cannot
|
|
1461
|
-
// retain or settle the same delivery a second time.
|
|
1462
|
-
}
|
|
1463
|
-
}
|
|
1464
|
-
|
|
1465
1375
|
function assertSuccessorSessionIdentity(
|
|
1466
1376
|
predecessor: ZLinkActorSessionRelocationState,
|
|
1467
1377
|
successor: ZLinkActorSessionRelocationClaim
|