@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,72 +1,72 @@
|
|
|
1
|
-
import { createHash
|
|
2
|
-
import
|
|
3
|
-
ActorRef,
|
|
4
|
-
RoutingId,
|
|
5
|
-
ZLinkActor,
|
|
6
|
-
ZLinkActorJoinOperationId,
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import {
|
|
3
|
+
type ActorRef,
|
|
4
|
+
type RoutingId,
|
|
5
|
+
type ZLinkActor,
|
|
6
|
+
type ZLinkActorJoinOperationId,
|
|
7
|
+
type ZLinkMessageSerializer,
|
|
8
|
+
type ZLinkSpot,
|
|
9
|
+
ZLinkEncodedPayload,
|
|
7
10
|
ZLinkMessage,
|
|
8
|
-
|
|
9
|
-
ZLinkRelocationStore,
|
|
10
|
-
ZLinkSpot
|
|
11
|
+
ZLinkSpotKind
|
|
11
12
|
} from '../../contracts';
|
|
12
|
-
|
|
13
|
-
import type {
|
|
14
|
-
ZLinkAggregateId,
|
|
15
|
-
ZLinkAuthoritySnapshot,
|
|
16
|
-
ZLinkLocationOwnerToken
|
|
17
|
-
} from '../locations/internal-location-contracts';
|
|
18
|
-
import type {
|
|
19
|
-
ZLinkAuthorityStore,
|
|
20
|
-
ZLinkObjectCreationStore,
|
|
21
|
-
ZLinkOwnerLeaseStore
|
|
22
|
-
} from '../locations/internal-store-contracts';
|
|
23
|
-
import { encodeAuthorityKey } from '../locations/authority-key-codec';
|
|
13
|
+
|
|
24
14
|
import type { Message } from '../../contracts/Common/Message';
|
|
25
|
-
import type { ZLinkBackendActorRef, ZLinkBackendMeshNode } from '../backend';
|
|
26
15
|
import {
|
|
16
|
+
createDeferredJoinCompletion,
|
|
17
|
+
rewriteActorAuthorityRoute,
|
|
27
18
|
toFrameworkActorRef,
|
|
28
|
-
mergeRemoteBoundSessionTarget,
|
|
29
|
-
preferredRemoteBoundSessionTarget,
|
|
30
19
|
type ZLinkActorHandoffCoordinator,
|
|
31
20
|
type ZLinkActorHandoffPrefixAdmission,
|
|
32
21
|
type ZLinkActorHandoffPrefixQueue,
|
|
33
22
|
type ZLinkActorHandoffReplayPreparation,
|
|
34
23
|
type ZLinkActorRoutedJoinTransport,
|
|
35
24
|
type ZLinkActorTransferRegistry,
|
|
36
|
-
|
|
37
|
-
ZLinkDeferredJoinAcceptedJournal,
|
|
38
|
-
rewriteActorAuthorityRoute,
|
|
39
|
-
type ZLinkDeferredJoinAcceptedRoot,
|
|
40
|
-
type ZLinkDeferredJoinRootIdentity,
|
|
25
|
+
type ZLinkDeferredJoinCompletion,
|
|
41
26
|
type ZLinkRemoteBoundSessionTarget
|
|
42
27
|
} from '../actors';
|
|
43
|
-
import type { ZLinkActorRuntimeState } from '../actors/actor-runtime-state';
|
|
44
|
-
import { ZLinkActorRetryDelay } from '../actors/actor-retry-delay';
|
|
45
|
-
import { encodeRoutingIdStorageHex, routingIdsEqual } from '../routing-id';
|
|
46
|
-
import type { ZLinkLocationLifecycle } from '../locations';
|
|
47
|
-
import { wrapFrameworkPayloadMessage } from '../messaging/payload-codec';
|
|
48
|
-
import type { DefaultZLinkSpotManager } from '../spots';
|
|
49
|
-
import type { ZLinkSpotRouteResolver, ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
|
|
50
28
|
import type {
|
|
51
29
|
ZLinkActorHandoffPacket,
|
|
52
30
|
ZLinkActorHandoffResult,
|
|
53
31
|
ZLinkActorHandoffTerminalAcceptance,
|
|
54
32
|
ZLinkActorHandoffTerminalAck
|
|
55
33
|
} from '../actors/actor-handoff';
|
|
56
|
-
import type { ZLinkNativeActorJoinSnapshot } from '../spots/spot-runtime-ports';
|
|
57
34
|
import {
|
|
58
35
|
ownerFence,
|
|
59
36
|
type ZLinkActorMessageFollowOwnerFence
|
|
60
37
|
} from '../actors/actor-message-follow-context';
|
|
61
|
-
import type {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
ServiceWireOperationId
|
|
66
|
-
} from '../foundation/service-stateful-wire-codec';
|
|
67
|
-
import { serviceSessionRelocationIdentityKey } from '../foundation/service-stateful-wire-codec';
|
|
38
|
+
import type { ZLinkActorRuntimeState } from '../actors/actor-runtime-state';
|
|
39
|
+
import type { ZLinkBackendActorRef, ZLinkBackendMeshNode } from '../backend';
|
|
40
|
+
import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
|
|
41
|
+
import { isRelocationDebugEnabled, relocationDebug } from '../diagnostics';
|
|
68
42
|
import { operationIdentityKey } from '../foundation/operation-identity';
|
|
43
|
+
import {
|
|
44
|
+
type ServiceSessionRelocationRoute,
|
|
45
|
+
type ServiceSessionRelocationSeal,
|
|
46
|
+
type ServiceSessionRelocationSealed,
|
|
47
|
+
type ServiceWireOperationId,
|
|
48
|
+
serviceSessionRelocationIdentityKey
|
|
49
|
+
} from '../foundation/service-stateful-wire-codec';
|
|
50
|
+
|
|
51
|
+
import type { ZLinkLocationLifecycle } from '../locations';
|
|
52
|
+
import { encodeAuthorityKey } from '../locations/authority-key-codec';
|
|
53
|
+
import type {
|
|
54
|
+
ZLinkAggregateId,
|
|
55
|
+
ZLinkAuthoritySnapshot,
|
|
56
|
+
ZLinkLocationOwnerToken
|
|
57
|
+
} from '../locations/internal-location-contracts';
|
|
58
|
+
import type {
|
|
59
|
+
ZLinkAuthorityStore,
|
|
60
|
+
ZLinkObjectCreationStore,
|
|
61
|
+
ZLinkOwnerLeaseStore
|
|
62
|
+
} from '../locations/internal-store-contracts';
|
|
63
|
+
import { wrapFrameworkPayloadMessage } from '../messaging/payload-codec';
|
|
64
|
+
import { encodeRoutingIdStorageHex, routingIdsEqual } from '../routing-id';
|
|
65
|
+
import type { DefaultZLinkSpotManager } from '../spots';
|
|
66
|
+
import type { ZLinkSpotRouteResolver, ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
|
|
69
67
|
import { BoundedReplayMap } from './bounded-replay-map';
|
|
68
|
+
const TRANSFER_RESOLUTION_TIMEOUT_MS = 5_000;
|
|
69
|
+
const TRANSFER_POLL_INTERVAL_MS = 10;
|
|
70
70
|
|
|
71
71
|
const DEFERRED_JOIN_TERMINAL_CAPACITY = 4096;
|
|
72
72
|
|
|
@@ -168,7 +168,7 @@ export interface ZLinkActorTransferRuntimeActorManager {
|
|
|
168
168
|
actorType: string,
|
|
169
169
|
objectGeneration: bigint,
|
|
170
170
|
authorityOwnerGeneration: bigint,
|
|
171
|
-
spotId: RoutingId,
|
|
171
|
+
spotId: RoutingId | undefined,
|
|
172
172
|
spotGeneration: bigint,
|
|
173
173
|
membershipEpoch: bigint,
|
|
174
174
|
signal?: AbortSignal,
|
|
@@ -198,7 +198,6 @@ export interface ZLinkActorTransferRuntimeOptions {
|
|
|
198
198
|
readonly authorityStore: () =>
|
|
199
199
|
(ZLinkAuthorityStore & ZLinkObjectCreationStore & ZLinkOwnerLeaseStore) | undefined;
|
|
200
200
|
readonly currentOwner: () => ZLinkLocationOwnerToken | undefined;
|
|
201
|
-
readonly relocationStore: () => ZLinkRelocationStore | undefined;
|
|
202
201
|
/** Live admitted peers of a mesh; used to stop retries against a gone session owner. */
|
|
203
202
|
readonly liveDescriptors?: (
|
|
204
203
|
meshName: string,
|
|
@@ -216,7 +215,6 @@ export interface ZLinkActorTransferRuntimeOptions {
|
|
|
216
215
|
}
|
|
217
216
|
|
|
218
217
|
export class ZLinkActorTransferRuntime {
|
|
219
|
-
private readonly sourceDepartureTasks = new Map<string, Promise<void>>();
|
|
220
218
|
private readonly coreSourceLeaves = new Map<
|
|
221
219
|
string,
|
|
222
220
|
{
|
|
@@ -229,43 +227,31 @@ export class ZLinkActorTransferRuntime {
|
|
|
229
227
|
notifySubmitted?: () => Promise<void>;
|
|
230
228
|
}
|
|
231
229
|
>();
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
>(
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
ZLinkDeferredJoinAcceptedRoot
|
|
239
|
-
>(DEFERRED_JOIN_TERMINAL_CAPACITY);
|
|
230
|
+
// Spot Actor membership sections 4-5: Join completion idempotency is
|
|
231
|
+
// process-local. These maps end with the process; nothing is replayed.
|
|
232
|
+
private readonly activeDeferredJoinTerminals = new Map<string, Promise<void>>();
|
|
233
|
+
private readonly deferredJoinTerminals = new BoundedReplayMap<string, true>(
|
|
234
|
+
DEFERRED_JOIN_TERMINAL_CAPACITY
|
|
235
|
+
);
|
|
240
236
|
|
|
241
237
|
constructor(private readonly options: ZLinkActorTransferRuntimeOptions) {}
|
|
242
238
|
|
|
243
|
-
beginDeferredActorHandoff(
|
|
244
|
-
actor: ZLinkActor,
|
|
245
|
-
state: ZLinkActorRuntimeState,
|
|
246
|
-
operationId: string
|
|
247
|
-
): void {
|
|
239
|
+
beginDeferredActorHandoff(actor: ZLinkActor, state: ZLinkActorRuntimeState): void {
|
|
248
240
|
const actorId = actor.context.actorId;
|
|
249
241
|
this.options.actorHandoff.beginProvisional(
|
|
250
242
|
actorId,
|
|
251
|
-
operationId,
|
|
252
243
|
requireSourceObjectGeneration(actorId, state)
|
|
253
244
|
);
|
|
254
245
|
}
|
|
255
246
|
|
|
256
|
-
promoteDeferredActorHandoff(
|
|
257
|
-
actor
|
|
258
|
-
_state: ZLinkActorRuntimeState,
|
|
259
|
-
operationId: string
|
|
260
|
-
): void {
|
|
261
|
-
this.options.actorHandoff.promoteProvisional(actor.context.actorId, operationId);
|
|
247
|
+
promoteDeferredActorHandoff(actor: ZLinkActor, _state: ZLinkActorRuntimeState): void {
|
|
248
|
+
this.options.actorHandoff.promoteProvisional(actor.context.actorId);
|
|
262
249
|
}
|
|
263
250
|
|
|
264
251
|
async completeDeferredActorHandoff(
|
|
265
252
|
actor: ZLinkActor,
|
|
266
253
|
target: ZLinkSpotRouteTarget,
|
|
267
|
-
_targetActorRef: ActorRef
|
|
268
|
-
operationId: string
|
|
254
|
+
_targetActorRef: ActorRef
|
|
269
255
|
): Promise<void> {
|
|
270
256
|
const actorId = actor.context.actorId;
|
|
271
257
|
if (!this.options.actorHandoff.isProvisional(actorId)) return;
|
|
@@ -275,7 +261,6 @@ export class ZLinkActorTransferRuntime {
|
|
|
275
261
|
}
|
|
276
262
|
const admitted = this.options.actorHandoff.admitDeferredPrefix(
|
|
277
263
|
actorId,
|
|
278
|
-
operationId,
|
|
279
264
|
(drain) => manager.admitRoutedActorPacketPrefix(target.spotId, actorId, drain),
|
|
280
265
|
this.options.prepareApplicationJob
|
|
281
266
|
);
|
|
@@ -284,110 +269,70 @@ export class ZLinkActorTransferRuntime {
|
|
|
284
269
|
|
|
285
270
|
async cancelDeferredActorHandoff(
|
|
286
271
|
actor: ZLinkActor,
|
|
287
|
-
|
|
288
|
-
operationId: string
|
|
272
|
+
state: ZLinkActorRuntimeState
|
|
289
273
|
): Promise<void> {
|
|
290
|
-
const admitted = this.admitDeferredSourcePrefix(actor,
|
|
274
|
+
const admitted = this.admitDeferredSourcePrefix(actor, state);
|
|
291
275
|
void this.observeHandoffReplay(admitted.terminal);
|
|
292
276
|
}
|
|
293
277
|
|
|
294
|
-
|
|
278
|
+
prepareDeferredJoinAccepted(
|
|
295
279
|
actorId: string,
|
|
296
280
|
operationId: ZLinkActorJoinOperationId,
|
|
297
281
|
actorRef: ActorRef,
|
|
298
282
|
rawReply: Uint8Array,
|
|
299
|
-
replyContentType?: string
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
): Promise<ZLinkDeferredJoinAcceptedRoot> {
|
|
303
|
-
return await this.requireDeferredJoinJournal().prepare(
|
|
304
|
-
actorId,
|
|
305
|
-
operationId,
|
|
306
|
-
actorRef,
|
|
307
|
-
rawReply,
|
|
308
|
-
replyContentType,
|
|
309
|
-
signal,
|
|
310
|
-
canonicalInventoryDigest
|
|
311
|
-
);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
async isDeferredJoinAcceptedRootPublication(
|
|
315
|
-
reference: string,
|
|
316
|
-
checksumCrc32c: number,
|
|
317
|
-
expected: ZLinkDeferredJoinRootIdentity,
|
|
318
|
-
signal?: AbortSignal
|
|
319
|
-
): Promise<boolean> {
|
|
320
|
-
const relocation = this.options.relocationStore();
|
|
321
|
-
return relocation === undefined
|
|
322
|
-
? false
|
|
323
|
-
: await isDeferredJoinAcceptedRootPublication(
|
|
324
|
-
relocation,
|
|
325
|
-
reference,
|
|
326
|
-
checksumCrc32c,
|
|
327
|
-
expected,
|
|
328
|
-
signal
|
|
329
|
-
);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
async discardDeferredJoinAccepted(
|
|
333
|
-
root: ZLinkDeferredJoinAcceptedRoot,
|
|
334
|
-
signal?: AbortSignal
|
|
335
|
-
): Promise<void> {
|
|
336
|
-
await this.requireDeferredJoinJournal().discardPrepared(root, signal);
|
|
283
|
+
replyContentType?: string
|
|
284
|
+
): ZLinkDeferredJoinCompletion {
|
|
285
|
+
return createDeferredJoinCompletion(actorId, operationId, actorRef, rawReply, replyContentType);
|
|
337
286
|
}
|
|
338
287
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
async commitAndDeliverDeferredJoinAccepted(
|
|
348
|
-
root: ZLinkDeferredJoinAcceptedRoot,
|
|
288
|
+
/**
|
|
289
|
+
* Runs the completion callback once in the target Actor mailbox.
|
|
290
|
+
* A repeated delivery of the same OperationId in this process observes the
|
|
291
|
+
* first terminal (completion idempotency only).
|
|
292
|
+
*/
|
|
293
|
+
async deliverDeferredJoinCompletion(
|
|
294
|
+
completion: ZLinkDeferredJoinCompletion,
|
|
349
295
|
actor: ZLinkActor,
|
|
350
296
|
actorRef: ActorRef,
|
|
351
297
|
submitMailbox: <T>(operation: () => Promise<T>) => Promise<T>,
|
|
352
298
|
signal?: AbortSignal
|
|
353
|
-
): Promise<
|
|
354
|
-
const terminalKey = deferredJoinTerminalKey(
|
|
355
|
-
|
|
356
|
-
if (terminal !== undefined) {
|
|
299
|
+
): Promise<void> {
|
|
300
|
+
const terminalKey = deferredJoinTerminalKey(completion);
|
|
301
|
+
if (this.deferredJoinTerminals.get(terminalKey) !== undefined) {
|
|
357
302
|
this.deferredJoinTerminals.touch(terminalKey);
|
|
358
|
-
return
|
|
303
|
+
return;
|
|
359
304
|
}
|
|
360
305
|
const active = this.activeDeferredJoinTerminals.get(terminalKey);
|
|
361
306
|
if (active !== undefined) return await waitForOperation(active, signal);
|
|
362
|
-
const
|
|
363
|
-
|
|
307
|
+
const delivery = this.deliverDeferredJoinCompletionCore(
|
|
308
|
+
completion,
|
|
364
309
|
actor,
|
|
365
310
|
actorRef,
|
|
366
311
|
submitMailbox
|
|
367
312
|
);
|
|
368
|
-
this.activeDeferredJoinTerminals.set(terminalKey,
|
|
369
|
-
void
|
|
370
|
-
(
|
|
371
|
-
this.deferredJoinTerminals.remember(terminalKey,
|
|
372
|
-
if (this.activeDeferredJoinTerminals.get(terminalKey) ===
|
|
313
|
+
this.activeDeferredJoinTerminals.set(terminalKey, delivery);
|
|
314
|
+
void delivery.then(
|
|
315
|
+
() => {
|
|
316
|
+
this.deferredJoinTerminals.remember(terminalKey, true);
|
|
317
|
+
if (this.activeDeferredJoinTerminals.get(terminalKey) === delivery) {
|
|
373
318
|
this.activeDeferredJoinTerminals.delete(terminalKey);
|
|
374
319
|
}
|
|
375
320
|
},
|
|
376
321
|
() => {
|
|
377
|
-
if (this.activeDeferredJoinTerminals.get(terminalKey) ===
|
|
322
|
+
if (this.activeDeferredJoinTerminals.get(terminalKey) === delivery) {
|
|
378
323
|
this.activeDeferredJoinTerminals.delete(terminalKey);
|
|
379
324
|
}
|
|
380
325
|
}
|
|
381
326
|
);
|
|
382
|
-
return await waitForOperation(
|
|
327
|
+
return await waitForOperation(delivery, signal);
|
|
383
328
|
}
|
|
384
329
|
|
|
385
|
-
private async
|
|
386
|
-
|
|
330
|
+
private async deliverDeferredJoinCompletionCore(
|
|
331
|
+
completion: ZLinkDeferredJoinCompletion,
|
|
387
332
|
actor: ZLinkActor,
|
|
388
333
|
actorRef: ActorRef,
|
|
389
334
|
submitMailbox: <T>(operation: () => Promise<T>) => Promise<T>
|
|
390
|
-
): Promise<
|
|
335
|
+
): Promise<void> {
|
|
391
336
|
const targetActorRef = this.options
|
|
392
337
|
.actorManager()
|
|
393
338
|
?.getState(actor.context.actorId)?.nativeActorRef;
|
|
@@ -395,47 +340,43 @@ export class ZLinkActorTransferRuntime {
|
|
|
395
340
|
targetActorRef === undefined
|
|
396
341
|
? actorRef
|
|
397
342
|
: toFrameworkActorRef(targetActorRef, actor.context.meshName);
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
current,
|
|
408
|
-
actor,
|
|
409
|
-
currentActorRef,
|
|
410
|
-
submitMailbox
|
|
411
|
-
);
|
|
412
|
-
return current;
|
|
413
|
-
} catch (error) {
|
|
414
|
-
lastError = error;
|
|
415
|
-
if (attempt < 2) {
|
|
416
|
-
await new Promise<void>((resolve) => {
|
|
417
|
-
const timer = setTimeout(resolve, 10 << attempt);
|
|
418
|
-
timer.unref();
|
|
419
|
-
});
|
|
420
|
-
current =
|
|
421
|
-
(await this.requireDeferredJoinJournal().recover(currentActorRef.actorId)) ?? current;
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
throw lastError;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
private requireDeferredJoinJournal(): ZLinkDeferredJoinAcceptedJournal {
|
|
429
|
-
const authority = this.options.authorityStore();
|
|
430
|
-
const relocation = this.options.relocationStore();
|
|
431
|
-
if (authority === undefined || relocation === undefined) {
|
|
432
|
-
throw new Error('Cross-node deferred Actor Join requires Location and Relocation Stores.');
|
|
343
|
+
if (
|
|
344
|
+
completion.actor.actorId !== currentActorRef.actorId ||
|
|
345
|
+
completion.actor.objectGeneration !== currentActorRef.objectGeneration
|
|
346
|
+
) {
|
|
347
|
+
throw new Error(
|
|
348
|
+
'Deferred Join completion generation fence is stale ' +
|
|
349
|
+
`(completion ${completion.actor.actorId}/${completion.actor.objectGeneration}, ` +
|
|
350
|
+
`actor ${currentActorRef.actorId}/${currentActorRef.objectGeneration}).`
|
|
351
|
+
);
|
|
433
352
|
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
353
|
+
await submitMailbox(async () => {
|
|
354
|
+
if (completion.status === 'failed') {
|
|
355
|
+
await actor.onJoinCompleted?.({
|
|
356
|
+
status: 'failed',
|
|
357
|
+
operationId: completion.operationId,
|
|
358
|
+
kind: completion.kind
|
|
359
|
+
});
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
await actor.onJoinCompleted?.({
|
|
363
|
+
status: 'accepted',
|
|
364
|
+
operationId: completion.operationId,
|
|
365
|
+
actor: currentActorRef,
|
|
366
|
+
reply:
|
|
367
|
+
completion.rawReply.byteLength === 0
|
|
368
|
+
? undefined
|
|
369
|
+
: completion.replyContentType === undefined
|
|
370
|
+
? ZLinkMessage.fromEncoded(ZLinkEncodedPayload.from(completion.rawReply))
|
|
371
|
+
: wrapFrameworkPayloadMessage(
|
|
372
|
+
RuntimeMessage.from(completion.rawReply),
|
|
373
|
+
this.options.messageSerializers,
|
|
374
|
+
completion.replyContentType,
|
|
375
|
+
undefined,
|
|
376
|
+
'reply'
|
|
377
|
+
)
|
|
378
|
+
});
|
|
379
|
+
});
|
|
439
380
|
}
|
|
440
381
|
|
|
441
382
|
private async prepareSourceActorLeave(
|
|
@@ -471,13 +412,10 @@ export class ZLinkActorTransferRuntime {
|
|
|
471
412
|
private async beginSourceActorMove(
|
|
472
413
|
actor: ZLinkActor,
|
|
473
414
|
state: ZLinkActorRuntimeState,
|
|
474
|
-
|
|
415
|
+
deferredJoin = false
|
|
475
416
|
): Promise<void> {
|
|
476
|
-
if (
|
|
477
|
-
|
|
478
|
-
this.options.actorHandoff.isProvisional(actor.context.actorId)
|
|
479
|
-
) {
|
|
480
|
-
this.promoteDeferredActorHandoff(actor, state, deferredOperationId);
|
|
417
|
+
if (deferredJoin && this.options.actorHandoff.isProvisional(actor.context.actorId)) {
|
|
418
|
+
this.promoteDeferredActorHandoff(actor, state);
|
|
481
419
|
}
|
|
482
420
|
state.beginMove();
|
|
483
421
|
if (!this.options.actorHandoff.isActive(actor.context.actorId)) {
|
|
@@ -488,21 +426,25 @@ export class ZLinkActorTransferRuntime {
|
|
|
488
426
|
}
|
|
489
427
|
try {
|
|
490
428
|
if (state.spotId !== undefined) {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
429
|
+
if (isRelocationDebugEnabled()) {
|
|
430
|
+
relocationDebug('source_actor_move.await_spot_transfer', {
|
|
431
|
+
actorId: actor.context.actorId,
|
|
432
|
+
spotId: String(state.spotId)
|
|
433
|
+
});
|
|
434
|
+
}
|
|
495
435
|
await this.options.spotManager()?.beginActorTransfer(state.spotId, actor.context.actorId);
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
436
|
+
if (isRelocationDebugEnabled()) {
|
|
437
|
+
relocationDebug('source_actor_move.spot_transfer_complete', {
|
|
438
|
+
actorId: actor.context.actorId,
|
|
439
|
+
spotId: String(state.spotId)
|
|
440
|
+
});
|
|
441
|
+
}
|
|
500
442
|
}
|
|
501
443
|
} catch (error) {
|
|
502
|
-
if (
|
|
444
|
+
if (!deferredJoin) {
|
|
503
445
|
this.options.actorHandoff.cancel(actor.context.actorId);
|
|
504
446
|
} else {
|
|
505
|
-
const admitted = this.admitDeferredSourcePrefix(actor, state
|
|
447
|
+
const admitted = this.admitDeferredSourcePrefix(actor, state);
|
|
506
448
|
void this.observeHandoffReplay(admitted.terminal);
|
|
507
449
|
}
|
|
508
450
|
state.endMove();
|
|
@@ -513,7 +455,7 @@ export class ZLinkActorTransferRuntime {
|
|
|
513
455
|
private async cancelSourceActorMove(
|
|
514
456
|
actor: ZLinkActor,
|
|
515
457
|
state: ZLinkActorRuntimeState,
|
|
516
|
-
|
|
458
|
+
deferredJoin = false,
|
|
517
459
|
replayStart: Promise<void> = Promise.resolve()
|
|
518
460
|
): Promise<void> {
|
|
519
461
|
try {
|
|
@@ -522,16 +464,11 @@ export class ZLinkActorTransferRuntime {
|
|
|
522
464
|
}
|
|
523
465
|
} finally {
|
|
524
466
|
try {
|
|
525
|
-
if (
|
|
467
|
+
if (!deferredJoin) {
|
|
526
468
|
const admitted = this.admitCanceledSourcePrefix(actor, state, replayStart);
|
|
527
469
|
void this.observeHandoffReplay(admitted.terminal);
|
|
528
470
|
} else {
|
|
529
|
-
const admitted = this.admitDeferredSourcePrefix(
|
|
530
|
-
actor,
|
|
531
|
-
state,
|
|
532
|
-
deferredOperationId,
|
|
533
|
-
replayStart
|
|
534
|
-
);
|
|
471
|
+
const admitted = this.admitDeferredSourcePrefix(actor, state, replayStart);
|
|
535
472
|
void this.observeHandoffReplay(admitted.terminal);
|
|
536
473
|
}
|
|
537
474
|
} finally {
|
|
@@ -564,7 +501,6 @@ export class ZLinkActorTransferRuntime {
|
|
|
564
501
|
private admitDeferredSourcePrefix(
|
|
565
502
|
actor: ZLinkActor,
|
|
566
503
|
state: ZLinkActorRuntimeState,
|
|
567
|
-
operationId: string,
|
|
568
504
|
replayStart: Promise<void> = Promise.resolve()
|
|
569
505
|
): ZLinkActorHandoffPrefixAdmission {
|
|
570
506
|
const queue = this.sourceHandoffPrefixQueue(actor, state);
|
|
@@ -574,7 +510,6 @@ export class ZLinkActorTransferRuntime {
|
|
|
574
510
|
}
|
|
575
511
|
return this.options.actorHandoff.admitDeferredPrefix(
|
|
576
512
|
actor.context.actorId,
|
|
577
|
-
operationId,
|
|
578
513
|
queue,
|
|
579
514
|
this.options.prepareApplicationJob,
|
|
580
515
|
replayStart
|
|
@@ -614,10 +549,10 @@ export class ZLinkActorTransferRuntime {
|
|
|
614
549
|
state: ZLinkActorRuntimeState,
|
|
615
550
|
signal?: AbortSignal,
|
|
616
551
|
lifecycleAuthority: 'framework' | 'core' = 'framework',
|
|
617
|
-
|
|
552
|
+
deferredJoin = false,
|
|
618
553
|
relocation?: ServiceWireOperationId
|
|
619
554
|
) {
|
|
620
|
-
await this.beginSourceActorMove(actor, state,
|
|
555
|
+
await this.beginSourceActorMove(actor, state, deferredJoin);
|
|
621
556
|
const relocationMetric =
|
|
622
557
|
state.meshName === undefined
|
|
623
558
|
? undefined
|
|
@@ -628,12 +563,12 @@ export class ZLinkActorTransferRuntime {
|
|
|
628
563
|
);
|
|
629
564
|
const sourceSpotId = state.spotId;
|
|
630
565
|
let sourceLeaveStarted = false;
|
|
631
|
-
|
|
566
|
+
// The relocation operation owns its Session seal; the Actor keeps only
|
|
567
|
+
// its current binding (Session–Actor binding §8.1).
|
|
568
|
+
let sealedSession: ZLinkRemoteBoundSessionTarget | undefined;
|
|
632
569
|
try {
|
|
633
|
-
if (state.
|
|
634
|
-
|
|
635
|
-
const sealedTarget = await this.sealBoundSessionRoute(actor, state, signal, relocation);
|
|
636
|
-
state.setRemoteBoundSessionTarget(sealedTarget);
|
|
570
|
+
if (state.boundSession !== undefined) {
|
|
571
|
+
sealedSession = await this.sealBoundSessionRoute(actor, state, signal, relocation);
|
|
637
572
|
this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
|
|
638
573
|
}
|
|
639
574
|
const transfer = await this.options.actorTransferRegistry.transferOut(
|
|
@@ -746,8 +681,7 @@ export class ZLinkActorTransferRuntime {
|
|
|
746
681
|
void sourceLeaveCompletion.then(
|
|
747
682
|
() => this.scheduleSourceDeparture(actor, sourceSpotId, true),
|
|
748
683
|
(error) => {
|
|
749
|
-
this.
|
|
750
|
-
this.scheduleSourceDeparture(actor, sourceSpotId, true);
|
|
684
|
+
this.scheduleSourceDeparture(actor, sourceSpotId, true, [error]);
|
|
751
685
|
}
|
|
752
686
|
);
|
|
753
687
|
} else {
|
|
@@ -762,10 +696,10 @@ export class ZLinkActorTransferRuntime {
|
|
|
762
696
|
this.coreSourceLeaves.delete(actor.context.actorId);
|
|
763
697
|
const replayGate = createHandoffReplayGate();
|
|
764
698
|
try {
|
|
765
|
-
await this.cancelSourceActorMove(actor, state,
|
|
699
|
+
await this.cancelSourceActorMove(actor, state, deferredJoin, replayGate.start);
|
|
766
700
|
await this.restoreSourceActor(actor, sourceSpotId);
|
|
767
|
-
if (
|
|
768
|
-
await this.observeBoundSessionSealAbort(actor, state);
|
|
701
|
+
if (sealedSession !== undefined) {
|
|
702
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
769
703
|
}
|
|
770
704
|
} finally {
|
|
771
705
|
replayGate.open();
|
|
@@ -776,10 +710,10 @@ export class ZLinkActorTransferRuntime {
|
|
|
776
710
|
relocationMetric?.complete('failed');
|
|
777
711
|
const replayGate = createHandoffReplayGate();
|
|
778
712
|
try {
|
|
779
|
-
await this.cancelSourceActorMove(actor, state,
|
|
713
|
+
await this.cancelSourceActorMove(actor, state, deferredJoin, replayGate.start);
|
|
780
714
|
if (sourceLeaveStarted) await this.restoreSourceActor(actor, sourceSpotId);
|
|
781
|
-
if (
|
|
782
|
-
await this.observeBoundSessionSealAbort(actor, state);
|
|
715
|
+
if (sealedSession !== undefined) {
|
|
716
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
783
717
|
}
|
|
784
718
|
} catch (rollbackError) {
|
|
785
719
|
throw new AggregateError(
|
|
@@ -810,11 +744,14 @@ export class ZLinkActorTransferRuntime {
|
|
|
810
744
|
targetOwnerFence: ZLinkActorMessageFollowOwnerFence
|
|
811
745
|
): Promise<void>;
|
|
812
746
|
rollback(): Promise<void>;
|
|
747
|
+
discard(reason: unknown): void;
|
|
813
748
|
}> {
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
749
|
+
if (isRelocationDebugEnabled()) {
|
|
750
|
+
relocationDebug('maintenance_session.begin', {
|
|
751
|
+
actorId: actor.context.actorId,
|
|
752
|
+
spotId: state.spotId === undefined ? undefined : String(state.spotId)
|
|
753
|
+
});
|
|
754
|
+
}
|
|
818
755
|
if (manageMembership) {
|
|
819
756
|
await this.beginSourceActorMove(actor, state);
|
|
820
757
|
} else {
|
|
@@ -824,23 +761,22 @@ export class ZLinkActorTransferRuntime {
|
|
|
824
761
|
requireSourceObjectGeneration(actor.context.actorId, state)
|
|
825
762
|
);
|
|
826
763
|
}
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
764
|
+
if (isRelocationDebugEnabled()) {
|
|
765
|
+
relocationDebug('maintenance_session.source_move_complete', {
|
|
766
|
+
actorId: actor.context.actorId
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
let sealedSession: ZLinkRemoteBoundSessionTarget | undefined;
|
|
831
770
|
try {
|
|
832
|
-
if (state.
|
|
833
|
-
|
|
834
|
-
state.setRemoteBoundSessionTarget(
|
|
835
|
-
await this.sealBoundSessionRoute(actor, state, signal, relocation)
|
|
836
|
-
);
|
|
771
|
+
if (state.boundSession !== undefined) {
|
|
772
|
+
sealedSession = await this.sealBoundSessionRoute(actor, state, signal, relocation);
|
|
837
773
|
this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
|
|
838
774
|
}
|
|
839
775
|
const handoffBacklog = this.options.actorHandoff.snapshot(actor.context.actorId);
|
|
840
776
|
let terminal: 'prepared' | 'committed' | 'rolledBack' = 'prepared';
|
|
841
777
|
let replayResults: readonly import('../actors').ZLinkActorHandoffResult[] = [];
|
|
842
778
|
return {
|
|
843
|
-
target:
|
|
779
|
+
target: sealedSession,
|
|
844
780
|
handoffBacklog,
|
|
845
781
|
takeRelocationRelay: () =>
|
|
846
782
|
this.options.actorHandoff.takeRelocationRelay(actor.context.actorId),
|
|
@@ -848,8 +784,10 @@ export class ZLinkActorTransferRuntime {
|
|
|
848
784
|
if (terminal === 'prepared') replayResults = [...results];
|
|
849
785
|
},
|
|
850
786
|
commit: async (target, targetActorRef, targetOwnerFence) => {
|
|
851
|
-
if (terminal
|
|
852
|
-
|
|
787
|
+
if (terminal !== 'prepared') return;
|
|
788
|
+
terminal = 'committed';
|
|
789
|
+
const failures: unknown[] = [];
|
|
790
|
+
try {
|
|
853
791
|
this.options.actorHandoff.complete(
|
|
854
792
|
actor.context.actorId,
|
|
855
793
|
target,
|
|
@@ -857,15 +795,34 @@ export class ZLinkActorTransferRuntime {
|
|
|
857
795
|
replayResults,
|
|
858
796
|
targetOwnerFence
|
|
859
797
|
);
|
|
798
|
+
} catch (error) {
|
|
799
|
+
failures.push(error);
|
|
800
|
+
}
|
|
801
|
+
try {
|
|
860
802
|
if (manageMembership && state.spotId !== undefined) {
|
|
861
803
|
await this.options
|
|
862
804
|
.spotManager()
|
|
863
805
|
?.commitActorLeaveAfterTransfer(state.spotId, actor.context.actorId);
|
|
864
806
|
}
|
|
807
|
+
} catch (error) {
|
|
808
|
+
failures.push(error);
|
|
809
|
+
}
|
|
810
|
+
try {
|
|
865
811
|
state.endMove();
|
|
866
|
-
|
|
812
|
+
} catch (error) {
|
|
813
|
+
failures.push(error);
|
|
814
|
+
}
|
|
815
|
+
if (failures.length > 0) {
|
|
816
|
+
throw failures.length === 1
|
|
817
|
+
? failures[0]
|
|
818
|
+
: new AggregateError(failures, 'Actor source retirement failed.');
|
|
867
819
|
}
|
|
868
820
|
},
|
|
821
|
+
discard: (reason) => {
|
|
822
|
+
if (terminal !== 'prepared') return;
|
|
823
|
+
terminal = 'rolledBack';
|
|
824
|
+
this.options.actorHandoff.failPending(actor.context.actorId, reason);
|
|
825
|
+
},
|
|
869
826
|
rollback: async () => {
|
|
870
827
|
if (terminal !== 'prepared') return;
|
|
871
828
|
terminal = 'rolledBack';
|
|
@@ -881,8 +838,8 @@ export class ZLinkActorTransferRuntime {
|
|
|
881
838
|
state.endMove();
|
|
882
839
|
}
|
|
883
840
|
}
|
|
884
|
-
if (
|
|
885
|
-
await this.observeBoundSessionSealAbort(actor, state);
|
|
841
|
+
if (sealedSession !== undefined) {
|
|
842
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
886
843
|
}
|
|
887
844
|
} finally {
|
|
888
845
|
replayGate.open();
|
|
@@ -910,8 +867,8 @@ export class ZLinkActorTransferRuntime {
|
|
|
910
867
|
state.endMove();
|
|
911
868
|
}
|
|
912
869
|
}
|
|
913
|
-
if (sourceRestored &&
|
|
914
|
-
await this.observeBoundSessionSealAbort(actor, state);
|
|
870
|
+
if (sourceRestored && sealedSession !== undefined) {
|
|
871
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
915
872
|
}
|
|
916
873
|
} finally {
|
|
917
874
|
replayGate.open();
|
|
@@ -1000,7 +957,7 @@ export class ZLinkActorTransferRuntime {
|
|
|
1000
957
|
signal?: AbortSignal,
|
|
1001
958
|
relocation?: ServiceWireOperationId
|
|
1002
959
|
): Promise<ZLinkRemoteBoundSessionTarget> {
|
|
1003
|
-
const target = state.
|
|
960
|
+
const target = state.boundSession;
|
|
1004
961
|
const actorRef = state.nativeActorRef;
|
|
1005
962
|
if (
|
|
1006
963
|
target === undefined ||
|
|
@@ -1101,17 +1058,10 @@ export class ZLinkActorTransferRuntime {
|
|
|
1101
1058
|
private async abortBoundSessionRouteSeal(
|
|
1102
1059
|
actor: ZLinkActor,
|
|
1103
1060
|
state: ZLinkActorRuntimeState,
|
|
1104
|
-
|
|
1061
|
+
target: ZLinkRemoteBoundSessionTarget
|
|
1105
1062
|
): Promise<void> {
|
|
1106
|
-
const target =
|
|
1107
|
-
targetOverride ??
|
|
1108
|
-
preferredRemoteBoundSessionTarget(
|
|
1109
|
-
state.remoteBoundSessionTarget,
|
|
1110
|
-
state.boundSessionTransferTarget
|
|
1111
|
-
);
|
|
1112
1063
|
const actorRef = state.nativeActorRef;
|
|
1113
1064
|
if (
|
|
1114
|
-
target === undefined ||
|
|
1115
1065
|
actorRef === undefined ||
|
|
1116
1066
|
target.bindingGeneration === undefined ||
|
|
1117
1067
|
target.previousAuthorityOwnerGeneration === undefined ||
|
|
@@ -1158,10 +1108,11 @@ export class ZLinkActorTransferRuntime {
|
|
|
1158
1108
|
|
|
1159
1109
|
private async observeBoundSessionSealAbort(
|
|
1160
1110
|
actor: ZLinkActor,
|
|
1161
|
-
state: ZLinkActorRuntimeState
|
|
1111
|
+
state: ZLinkActorRuntimeState,
|
|
1112
|
+
sealedSession: ZLinkRemoteBoundSessionTarget
|
|
1162
1113
|
): Promise<void> {
|
|
1163
1114
|
try {
|
|
1164
|
-
await this.abortBoundSessionRouteSeal(actor, state);
|
|
1115
|
+
await this.abortBoundSessionRouteSeal(actor, state, sealedSession);
|
|
1165
1116
|
} catch (error) {
|
|
1166
1117
|
try {
|
|
1167
1118
|
this.options.reportPostCommitError?.(error);
|
|
@@ -1203,49 +1154,58 @@ export class ZLinkActorTransferRuntime {
|
|
|
1203
1154
|
private scheduleSourceDeparture(
|
|
1204
1155
|
actor: ZLinkActor,
|
|
1205
1156
|
sourceSpotId: RoutingId | undefined,
|
|
1206
|
-
releaseLocation: boolean
|
|
1157
|
+
releaseLocation: boolean,
|
|
1158
|
+
failures: unknown[] = []
|
|
1207
1159
|
): void {
|
|
1208
|
-
|
|
1209
|
-
const task = this.finishSourceDeparture(actor, sourceSpotId, releaseLocation).finally(() =>
|
|
1210
|
-
this.sourceDepartureTasks.delete(actor.context.actorId)
|
|
1211
|
-
);
|
|
1212
|
-
this.sourceDepartureTasks.set(actor.context.actorId, task);
|
|
1160
|
+
void this.finishSourceDeparture(actor, sourceSpotId, releaseLocation, failures);
|
|
1213
1161
|
}
|
|
1214
1162
|
|
|
1215
1163
|
private async finishSourceDeparture(
|
|
1216
1164
|
actor: ZLinkActor,
|
|
1217
1165
|
sourceSpotId: RoutingId | undefined,
|
|
1218
|
-
releaseLocation: boolean
|
|
1166
|
+
releaseLocation: boolean,
|
|
1167
|
+
failures: unknown[]
|
|
1219
1168
|
): Promise<void> {
|
|
1220
|
-
|
|
1221
|
-
|
|
1169
|
+
if (sourceSpotId !== undefined) {
|
|
1170
|
+
try {
|
|
1171
|
+
await this.options
|
|
1172
|
+
.spotManager()
|
|
1173
|
+
?.commitActorLeaveAfterTransfer(sourceSpotId, actor.context.actorId);
|
|
1174
|
+
} catch (error) {
|
|
1175
|
+
failures.push(error);
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
if (releaseLocation) {
|
|
1222
1179
|
try {
|
|
1223
|
-
|
|
1180
|
+
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
1181
|
+
if (state?.actorType !== undefined && state.ownsLocation) {
|
|
1224
1182
|
await this.options
|
|
1225
|
-
.
|
|
1226
|
-
?.
|
|
1183
|
+
.locationLifecycle()
|
|
1184
|
+
?.releaseActor(state.actorType, actor.context.actorId);
|
|
1185
|
+
state.markLocationReleased();
|
|
1227
1186
|
}
|
|
1228
|
-
if (releaseLocation) {
|
|
1229
|
-
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
1230
|
-
if (state?.actorType !== undefined && state.ownsLocation) {
|
|
1231
|
-
await this.options
|
|
1232
|
-
.locationLifecycle()
|
|
1233
|
-
?.releaseActor(state.actorType, actor.context.actorId);
|
|
1234
|
-
state.markLocationReleased();
|
|
1235
|
-
}
|
|
1236
|
-
// Message Follow owns the bounded stale route after the native leave.
|
|
1237
|
-
// The source Actor shell must therefore be removed from the process
|
|
1238
|
-
// registry so a later relocation can materialize the same Actor ID on
|
|
1239
|
-
// this node without colliding with its previous incarnation.
|
|
1240
|
-
await this.options.actorManager()?.completeCoreRelocationSource(actor.context.actorId);
|
|
1241
|
-
}
|
|
1242
|
-
this.options.onSourceDepartureCompleted?.(actor.context.actorId);
|
|
1243
|
-
return;
|
|
1244
1187
|
} catch (error) {
|
|
1245
|
-
|
|
1246
|
-
if (!(await retry.wait(this.options.shutdownSignal?.()))) return;
|
|
1188
|
+
failures.push(error);
|
|
1247
1189
|
}
|
|
1248
1190
|
}
|
|
1191
|
+
try {
|
|
1192
|
+
// Message Follow keeps its route separately from the retired application instance.
|
|
1193
|
+
await this.options.actorManager()?.completeCoreRelocationSource(actor.context.actorId);
|
|
1194
|
+
} catch (error) {
|
|
1195
|
+
failures.push(error);
|
|
1196
|
+
}
|
|
1197
|
+
try {
|
|
1198
|
+
this.options.onSourceDepartureCompleted?.(actor.context.actorId);
|
|
1199
|
+
} catch (error) {
|
|
1200
|
+
failures.push(error);
|
|
1201
|
+
}
|
|
1202
|
+
if (failures.length > 0) {
|
|
1203
|
+
this.options.reportPostCommitError?.(
|
|
1204
|
+
failures.length === 1
|
|
1205
|
+
? failures[0]
|
|
1206
|
+
: new AggregateError(failures, 'Actor source retirement failed.')
|
|
1207
|
+
);
|
|
1208
|
+
}
|
|
1249
1209
|
}
|
|
1250
1210
|
|
|
1251
1211
|
async getOrCreateRoutedActor(
|
|
@@ -1277,7 +1237,9 @@ export class ZLinkActorTransferRuntime {
|
|
|
1277
1237
|
}
|
|
1278
1238
|
if (actorRef !== undefined) {
|
|
1279
1239
|
state.setNativeActorRef(actorRef as unknown as ZLinkBackendActorRef);
|
|
1280
|
-
|
|
1240
|
+
if (remoteBoundSessionTarget !== undefined) {
|
|
1241
|
+
state.installBoundSessionBinding(remoteBoundSessionTarget);
|
|
1242
|
+
}
|
|
1281
1243
|
return { actor, actorRef: actorRef as unknown as ZLinkBackendActorRef };
|
|
1282
1244
|
}
|
|
1283
1245
|
return { actor, actorRef: state.ensureNativeActorRef(this.options.primaryMeshNode()) };
|
|
@@ -1307,14 +1269,10 @@ export class ZLinkActorTransferRuntime {
|
|
|
1307
1269
|
throw new Error(`Actor '${actorId}' transfer state was not created.`);
|
|
1308
1270
|
}
|
|
1309
1271
|
if (actorEntryNodeRid !== undefined) state.setEntryNodeRid(actorEntryNodeRid);
|
|
1310
|
-
|
|
1272
|
+
// The relocation delivers the binding it carried; the target installs it
|
|
1273
|
+
// through the one install rule (Session–Actor binding §6, §8).
|
|
1311
1274
|
if (remoteBoundSessionTarget !== undefined) {
|
|
1312
|
-
state.
|
|
1313
|
-
mergeRemoteBoundSessionTarget(remoteBoundSessionTarget, state.remoteBoundSessionTarget)
|
|
1314
|
-
);
|
|
1315
|
-
}
|
|
1316
|
-
if (remoteBoundSessionTarget?.bindingGeneration !== undefined) {
|
|
1317
|
-
state.setBoundSessionBindingGeneration(remoteBoundSessionTarget.bindingGeneration);
|
|
1275
|
+
state.installBoundSessionBinding(remoteBoundSessionTarget);
|
|
1318
1276
|
}
|
|
1319
1277
|
return {
|
|
1320
1278
|
actor: materialized.actor,
|
|
@@ -1492,29 +1450,11 @@ export class ZLinkActorTransferRuntime {
|
|
|
1492
1450
|
}
|
|
1493
1451
|
}
|
|
1494
1452
|
|
|
1495
|
-
rememberRoutedActorTransferTarget(
|
|
1496
|
-
actorId: string,
|
|
1497
|
-
target: ZLinkRemoteBoundSessionTarget | undefined
|
|
1498
|
-
): void {
|
|
1499
|
-
if (target === undefined) return;
|
|
1500
|
-
const state = this.options.actorManager()?.getState(actorId);
|
|
1501
|
-
if (state === undefined) {
|
|
1502
|
-
return;
|
|
1503
|
-
}
|
|
1504
|
-
state.setBoundSessionTransferTarget(target);
|
|
1505
|
-
state.setRemoteBoundSessionTarget(
|
|
1506
|
-
mergeRemoteBoundSessionTarget(target, state.remoteBoundSessionTarget)
|
|
1507
|
-
);
|
|
1508
|
-
if (target.bindingGeneration !== undefined) {
|
|
1509
|
-
state.setBoundSessionBindingGeneration(target.bindingGeneration);
|
|
1510
|
-
}
|
|
1511
|
-
}
|
|
1512
|
-
|
|
1513
1453
|
commitRoutedActor(actor: ZLinkActor, spotId: RoutingId, spot: ZLinkSpot): void {
|
|
1514
1454
|
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
1515
1455
|
state?.setJoinedSpot(spotId, spot);
|
|
1516
1456
|
const actorRef = state?.nativeActorRef;
|
|
1517
|
-
const binding = state?.
|
|
1457
|
+
const binding = state?.boundSession;
|
|
1518
1458
|
if (
|
|
1519
1459
|
actorRef !== undefined &&
|
|
1520
1460
|
binding?.sessionNodeRid !== undefined &&
|
|
@@ -1582,7 +1522,7 @@ export class ZLinkActorTransferRuntime {
|
|
|
1582
1522
|
`Actor '${actor.context.actorId}' Core location does not match the committed target SPOT.`
|
|
1583
1523
|
);
|
|
1584
1524
|
}
|
|
1585
|
-
const deadline = performance.now() +
|
|
1525
|
+
const deadline = performance.now() + TRANSFER_RESOLUTION_TIMEOUT_MS;
|
|
1586
1526
|
const ownerNodeGeneration = node.status().lifecycleGeneration;
|
|
1587
1527
|
if (ownerNodeGeneration <= 0n) {
|
|
1588
1528
|
throw new Error(
|
|
@@ -1620,7 +1560,7 @@ export class ZLinkActorTransferRuntime {
|
|
|
1620
1560
|
if (claim.status !== 'conflict' || performance.now() >= deadline) {
|
|
1621
1561
|
break;
|
|
1622
1562
|
}
|
|
1623
|
-
await new Promise<void>((resolve) => setTimeout(resolve,
|
|
1563
|
+
await new Promise<void>((resolve) => setTimeout(resolve, TRANSFER_POLL_INTERVAL_MS));
|
|
1624
1564
|
}
|
|
1625
1565
|
if (claim.status === 'conflict') {
|
|
1626
1566
|
throw new Error(`Actor '${actor.context.actorId}' target location takeover was rejected.`);
|
|
@@ -1654,44 +1594,24 @@ export class ZLinkActorTransferRuntime {
|
|
|
1654
1594
|
state.setRemoteActorPacketTarget(target);
|
|
1655
1595
|
}
|
|
1656
1596
|
|
|
1657
|
-
|
|
1597
|
+
/**
|
|
1598
|
+
* Publishes the committed route of the Session seal that the relocation
|
|
1599
|
+
* operation carried to this target (command 44, Session–Actor binding §8.2).
|
|
1600
|
+
*/
|
|
1601
|
+
async publishRoutedActorOwnership(
|
|
1658
1602
|
actor: ZLinkActor,
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
): Promise<ZLinkNativeActorJoinSnapshot> {
|
|
1662
|
-
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
1663
|
-
const previousLocation = this.options
|
|
1664
|
-
.locationLifecycle()
|
|
1665
|
-
?.actorLocationSnapshot(actor.context.actorId);
|
|
1666
|
-
const snapshot = {
|
|
1667
|
-
spotId: state?.spotId,
|
|
1668
|
-
spot: state?.spot,
|
|
1669
|
-
locationSpotId: previousLocation?.spotId,
|
|
1670
|
-
spotMeshName: previousLocation?.meshName,
|
|
1671
|
-
actorRef: previousLocation?.actorRef,
|
|
1672
|
-
spotGeneration: previousLocation?.spotGeneration,
|
|
1673
|
-
membershipEpoch: previousLocation?.membershipEpoch,
|
|
1674
|
-
ownerNodeGeneration: previousLocation?.ownerNodeGeneration
|
|
1675
|
-
};
|
|
1676
|
-
await this.claimRoutedActorLocation(actor, spotId, spotMeshName);
|
|
1677
|
-
return snapshot;
|
|
1678
|
-
}
|
|
1679
|
-
|
|
1680
|
-
async publishRoutedActorOwnership(actor: ZLinkActor): Promise<void> {
|
|
1603
|
+
sealedSession: ZLinkRemoteBoundSessionTarget | undefined
|
|
1604
|
+
): Promise<void> {
|
|
1681
1605
|
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
1682
1606
|
const actorRef = state?.nativeActorRef;
|
|
1683
1607
|
const generation = state?.locationGeneration;
|
|
1684
1608
|
if (state === undefined || actorRef === undefined || generation === undefined) return;
|
|
1685
|
-
|
|
1686
|
-
state.remoteBoundSessionTarget,
|
|
1687
|
-
state.boundSessionTransferTarget
|
|
1688
|
-
);
|
|
1689
|
-
if (boundSessionTarget?.serviceWireRelocation === undefined) return;
|
|
1609
|
+
if (sealedSession?.serviceWireRelocation === undefined) return;
|
|
1690
1610
|
await this.publishBoundSessionOwnership(
|
|
1691
1611
|
actor.context.actorId,
|
|
1692
1612
|
actorRef,
|
|
1693
1613
|
generation,
|
|
1694
|
-
|
|
1614
|
+
sealedSession,
|
|
1695
1615
|
state.ownerLeaseGeneration
|
|
1696
1616
|
);
|
|
1697
1617
|
}
|
|
@@ -1703,73 +1623,6 @@ export class ZLinkActorTransferRuntime {
|
|
|
1703
1623
|
this.options.clearRemoteActorPacketTarget(actor.context.actorId);
|
|
1704
1624
|
}
|
|
1705
1625
|
|
|
1706
|
-
async rollbackNativeActorJoin(
|
|
1707
|
-
actor: ZLinkActor,
|
|
1708
|
-
snapshot: ZLinkNativeActorJoinSnapshot
|
|
1709
|
-
): Promise<void> {
|
|
1710
|
-
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
1711
|
-
const actorType = state?.actorType;
|
|
1712
|
-
const lifecycle = this.options.locationLifecycle();
|
|
1713
|
-
if (snapshot.spotId === undefined) state?.clearJoinedSpot();
|
|
1714
|
-
else state?.setJoinedSpot(snapshot.spotId, snapshot.spot);
|
|
1715
|
-
if (state?.ownsLocation !== true || actorType === undefined || lifecycle === undefined) return;
|
|
1716
|
-
if (snapshot.spotId === undefined) {
|
|
1717
|
-
if (
|
|
1718
|
-
snapshot.locationSpotId === undefined ||
|
|
1719
|
-
snapshot.spotGeneration === undefined ||
|
|
1720
|
-
snapshot.membershipEpoch === undefined ||
|
|
1721
|
-
snapshot.ownerNodeGeneration === undefined
|
|
1722
|
-
) {
|
|
1723
|
-
throw new Error(
|
|
1724
|
-
`Actor '${actor.context.actorId}' cannot restore its Entry SPOT location without its exact generation fields.`
|
|
1725
|
-
);
|
|
1726
|
-
}
|
|
1727
|
-
await lifecycle.notifyActorLeftSpot(
|
|
1728
|
-
actorType,
|
|
1729
|
-
actor.context.actorId,
|
|
1730
|
-
snapshot.locationSpotId,
|
|
1731
|
-
snapshot.spotGeneration,
|
|
1732
|
-
snapshot.membershipEpoch,
|
|
1733
|
-
snapshot.ownerNodeGeneration
|
|
1734
|
-
);
|
|
1735
|
-
return;
|
|
1736
|
-
}
|
|
1737
|
-
if (snapshot.actorRef === undefined) {
|
|
1738
|
-
throw new Error(
|
|
1739
|
-
`Actor '${actor.context.actorId}' cannot restore its previous SPOT location without a native ref.`
|
|
1740
|
-
);
|
|
1741
|
-
}
|
|
1742
|
-
if (
|
|
1743
|
-
snapshot.spotMeshName === undefined ||
|
|
1744
|
-
snapshot.spotGeneration === undefined ||
|
|
1745
|
-
snapshot.membershipEpoch === undefined ||
|
|
1746
|
-
snapshot.ownerNodeGeneration === undefined
|
|
1747
|
-
) {
|
|
1748
|
-
throw new Error(
|
|
1749
|
-
`Actor '${actor.context.actorId}' cannot restore its previous SPOT location without its exact generation fields.`
|
|
1750
|
-
);
|
|
1751
|
-
}
|
|
1752
|
-
const restored = await lifecycle.takeoverActorJoinedSpot(
|
|
1753
|
-
actorType,
|
|
1754
|
-
actor.context.actorId,
|
|
1755
|
-
snapshot.actorRef,
|
|
1756
|
-
snapshot.spotMeshName,
|
|
1757
|
-
snapshot.spotId,
|
|
1758
|
-
snapshot.spotGeneration,
|
|
1759
|
-
snapshot.membershipEpoch,
|
|
1760
|
-
snapshot.ownerNodeGeneration,
|
|
1761
|
-
async () => state.clearAfterDestroy()
|
|
1762
|
-
);
|
|
1763
|
-
if (restored.status === 'conflict') {
|
|
1764
|
-
throw new Error(
|
|
1765
|
-
`Actor '${actor.context.actorId}' previous SPOT location could not be restored.`
|
|
1766
|
-
);
|
|
1767
|
-
}
|
|
1768
|
-
if (restored.generation !== undefined) state.setLocationGeneration(restored.generation);
|
|
1769
|
-
if (restored.claimed !== undefined)
|
|
1770
|
-
state.setOwnerLeaseGeneration(restored.claimed.leaseGeneration);
|
|
1771
|
-
}
|
|
1772
|
-
|
|
1773
1626
|
async rollbackRoutedActor(actor: ZLinkActor, signal?: AbortSignal): Promise<void> {
|
|
1774
1627
|
const manager = this.options.actorManager();
|
|
1775
1628
|
const state = manager?.getState(actor.context.actorId);
|
|
@@ -1782,7 +1635,6 @@ export class ZLinkActorTransferRuntime {
|
|
|
1782
1635
|
state.markLocationReleased();
|
|
1783
1636
|
} catch (error) {
|
|
1784
1637
|
locationError = error;
|
|
1785
|
-
void lifecycle.releaseActorEventually(actorType, actor.context.actorId);
|
|
1786
1638
|
}
|
|
1787
1639
|
}
|
|
1788
1640
|
try {
|
|
@@ -1870,7 +1722,8 @@ export class ZLinkActorTransferRuntime {
|
|
|
1870
1722
|
previousAuthorityOwnerGeneration: target.previousAuthorityOwnerGeneration,
|
|
1871
1723
|
targetAuthorityOwnerGeneration: ownershipGeneration,
|
|
1872
1724
|
targetNodeRid: String(actorRef.nodeRid),
|
|
1873
|
-
targetNodeGeneration: authority.allocation.descriptorLifecycleGeneration
|
|
1725
|
+
targetNodeGeneration: authority.allocation.descriptorLifecycleGeneration,
|
|
1726
|
+
targetOwnerLeaseGeneration: authority.ownerLeaseGeneration
|
|
1874
1727
|
}
|
|
1875
1728
|
},
|
|
1876
1729
|
this.options.shutdownSignal?.()
|
|
@@ -1880,15 +1733,10 @@ export class ZLinkActorTransferRuntime {
|
|
|
1880
1733
|
}
|
|
1881
1734
|
}
|
|
1882
1735
|
|
|
1883
|
-
function
|
|
1884
|
-
if (process.env.ZLINK_DEBUG_FRAMEWORK_RELOCATION !== '1') return;
|
|
1885
|
-
console.error('[zlink.runtime.relocation]', marker, detail);
|
|
1886
|
-
}
|
|
1887
|
-
|
|
1888
|
-
function deferredJoinTerminalKey(root: ZLinkDeferredJoinAcceptedRoot): string {
|
|
1736
|
+
function deferredJoinTerminalKey(completion: ZLinkDeferredJoinCompletion): string {
|
|
1889
1737
|
return (
|
|
1890
|
-
`${
|
|
1891
|
-
operationIdentityKey(
|
|
1738
|
+
`${completion.actor.actorId}:${completion.actor.objectGeneration.toString()}:` +
|
|
1739
|
+
operationIdentityKey(completion.operationId)
|
|
1892
1740
|
);
|
|
1893
1741
|
}
|
|
1894
1742
|
|
|
@@ -1942,7 +1790,7 @@ async function waitForActorAuthorityRetry(
|
|
|
1942
1790
|
throw new Error('Actor target authority deadline expired.', { cause });
|
|
1943
1791
|
}
|
|
1944
1792
|
await new Promise<void>((resolve, reject) => {
|
|
1945
|
-
const timer = setTimeout(resolve, Math.min(
|
|
1793
|
+
const timer = setTimeout(resolve, Math.min(TRANSFER_POLL_INTERVAL_MS, remaining));
|
|
1946
1794
|
timer.unref();
|
|
1947
1795
|
const abort = () => {
|
|
1948
1796
|
clearTimeout(timer);
|