@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
|
@@ -4,15 +4,18 @@ exports.ZLinkActorTransferRuntime = void 0;
|
|
|
4
4
|
exports.committedActorOwnerFence = committedActorOwnerFence;
|
|
5
5
|
const node_crypto_1 = require("node:crypto");
|
|
6
6
|
const contracts_1 = require("../../contracts");
|
|
7
|
-
const authority_key_codec_1 = require("../locations/authority-key-codec");
|
|
8
7
|
const actors_1 = require("../actors");
|
|
9
|
-
const actor_retry_delay_1 = require("../actors/actor-retry-delay");
|
|
10
|
-
const routing_id_1 = require("../routing-id");
|
|
11
|
-
const payload_codec_1 = require("../messaging/payload-codec");
|
|
12
8
|
const actor_message_follow_context_1 = require("../actors/actor-message-follow-context");
|
|
13
|
-
const
|
|
9
|
+
const runtime_message_1 = require("../backend/runtime-message");
|
|
10
|
+
const diagnostics_1 = require("../diagnostics");
|
|
14
11
|
const operation_identity_1 = require("../foundation/operation-identity");
|
|
12
|
+
const service_stateful_wire_codec_1 = require("../foundation/service-stateful-wire-codec");
|
|
13
|
+
const authority_key_codec_1 = require("../locations/authority-key-codec");
|
|
14
|
+
const payload_codec_1 = require("../messaging/payload-codec");
|
|
15
|
+
const routing_id_1 = require("../routing-id");
|
|
15
16
|
const bounded_replay_map_1 = require("./bounded-replay-map");
|
|
17
|
+
const TRANSFER_RESOLUTION_TIMEOUT_MS = 5_000;
|
|
18
|
+
const TRANSFER_POLL_INTERVAL_MS = 10;
|
|
16
19
|
const DEFERRED_JOIN_TERMINAL_CAPACITY = 4096;
|
|
17
20
|
/** Converts only committed actor authority evidence into a Message Follow fence. */
|
|
18
21
|
function committedActorOwnerFence(actorId, targetActorRef, authority) {
|
|
@@ -54,21 +57,22 @@ function createHandoffReplayGate() {
|
|
|
54
57
|
}
|
|
55
58
|
class ZLinkActorTransferRuntime {
|
|
56
59
|
options;
|
|
57
|
-
sourceDepartureTasks = new Map();
|
|
58
60
|
coreSourceLeaves = new Map();
|
|
61
|
+
// Spot Actor membership sections 4-5: Join completion idempotency is
|
|
62
|
+
// process-local. These maps end with the process; nothing is replayed.
|
|
59
63
|
activeDeferredJoinTerminals = new Map();
|
|
60
64
|
deferredJoinTerminals = new bounded_replay_map_1.BoundedReplayMap(DEFERRED_JOIN_TERMINAL_CAPACITY);
|
|
61
65
|
constructor(options) {
|
|
62
66
|
this.options = options;
|
|
63
67
|
}
|
|
64
|
-
beginDeferredActorHandoff(actor, state
|
|
68
|
+
beginDeferredActorHandoff(actor, state) {
|
|
65
69
|
const actorId = actor.context.actorId;
|
|
66
|
-
this.options.actorHandoff.beginProvisional(actorId,
|
|
70
|
+
this.options.actorHandoff.beginProvisional(actorId, requireSourceObjectGeneration(actorId, state));
|
|
67
71
|
}
|
|
68
|
-
promoteDeferredActorHandoff(actor, _state
|
|
69
|
-
this.options.actorHandoff.promoteProvisional(actor.context.actorId
|
|
72
|
+
promoteDeferredActorHandoff(actor, _state) {
|
|
73
|
+
this.options.actorHandoff.promoteProvisional(actor.context.actorId);
|
|
70
74
|
}
|
|
71
|
-
async completeDeferredActorHandoff(actor, target, _targetActorRef
|
|
75
|
+
async completeDeferredActorHandoff(actor, target, _targetActorRef) {
|
|
72
76
|
const actorId = actor.context.actorId;
|
|
73
77
|
if (!this.options.actorHandoff.isProvisional(actorId))
|
|
74
78
|
return;
|
|
@@ -76,91 +80,77 @@ class ZLinkActorTransferRuntime {
|
|
|
76
80
|
if (manager === undefined) {
|
|
77
81
|
throw new Error(`Actor '${actorId}' same-node Join has no local Spot manager.`);
|
|
78
82
|
}
|
|
79
|
-
const admitted = this.options.actorHandoff.admitDeferredPrefix(actorId,
|
|
83
|
+
const admitted = this.options.actorHandoff.admitDeferredPrefix(actorId, (drain) => manager.admitRoutedActorPacketPrefix(target.spotId, actorId, drain), this.options.prepareApplicationJob);
|
|
80
84
|
void this.observeHandoffReplay(admitted.terminal);
|
|
81
85
|
}
|
|
82
|
-
async cancelDeferredActorHandoff(actor,
|
|
83
|
-
const admitted = this.admitDeferredSourcePrefix(actor,
|
|
86
|
+
async cancelDeferredActorHandoff(actor, state) {
|
|
87
|
+
const admitted = this.admitDeferredSourcePrefix(actor, state);
|
|
84
88
|
void this.observeHandoffReplay(admitted.terminal);
|
|
85
89
|
}
|
|
86
|
-
|
|
87
|
-
return
|
|
88
|
-
}
|
|
89
|
-
async isDeferredJoinAcceptedRootPublication(reference, checksumCrc32c, expected, signal) {
|
|
90
|
-
const relocation = this.options.relocationStore();
|
|
91
|
-
return relocation === undefined
|
|
92
|
-
? false
|
|
93
|
-
: await (0, actors_1.isDeferredJoinAcceptedRootPublication)(relocation, reference, checksumCrc32c, expected, signal);
|
|
94
|
-
}
|
|
95
|
-
async discardDeferredJoinAccepted(root, signal) {
|
|
96
|
-
await this.requireDeferredJoinJournal().discardPrepared(root, signal);
|
|
90
|
+
prepareDeferredJoinAccepted(actorId, operationId, actorRef, rawReply, replyContentType) {
|
|
91
|
+
return (0, actors_1.createDeferredJoinCompletion)(actorId, operationId, actorRef, rawReply, replyContentType);
|
|
97
92
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Runs the completion callback once in the target Actor mailbox.
|
|
95
|
+
* A repeated delivery of the same OperationId in this process observes the
|
|
96
|
+
* first terminal (completion idempotency only).
|
|
97
|
+
*/
|
|
98
|
+
async deliverDeferredJoinCompletion(completion, actor, actorRef, submitMailbox, signal) {
|
|
99
|
+
const terminalKey = deferredJoinTerminalKey(completion);
|
|
100
|
+
if (this.deferredJoinTerminals.get(terminalKey) !== undefined) {
|
|
105
101
|
this.deferredJoinTerminals.touch(terminalKey);
|
|
106
|
-
return
|
|
102
|
+
return;
|
|
107
103
|
}
|
|
108
104
|
const active = this.activeDeferredJoinTerminals.get(terminalKey);
|
|
109
105
|
if (active !== undefined)
|
|
110
106
|
return await waitForOperation(active, signal);
|
|
111
|
-
const
|
|
112
|
-
this.activeDeferredJoinTerminals.set(terminalKey,
|
|
113
|
-
void
|
|
114
|
-
this.deferredJoinTerminals.remember(terminalKey,
|
|
115
|
-
if (this.activeDeferredJoinTerminals.get(terminalKey) ===
|
|
107
|
+
const delivery = this.deliverDeferredJoinCompletionCore(completion, actor, actorRef, submitMailbox);
|
|
108
|
+
this.activeDeferredJoinTerminals.set(terminalKey, delivery);
|
|
109
|
+
void delivery.then(() => {
|
|
110
|
+
this.deferredJoinTerminals.remember(terminalKey, true);
|
|
111
|
+
if (this.activeDeferredJoinTerminals.get(terminalKey) === delivery) {
|
|
116
112
|
this.activeDeferredJoinTerminals.delete(terminalKey);
|
|
117
113
|
}
|
|
118
114
|
}, () => {
|
|
119
|
-
if (this.activeDeferredJoinTerminals.get(terminalKey) ===
|
|
115
|
+
if (this.activeDeferredJoinTerminals.get(terminalKey) === delivery) {
|
|
120
116
|
this.activeDeferredJoinTerminals.delete(terminalKey);
|
|
121
117
|
}
|
|
122
118
|
});
|
|
123
|
-
return await waitForOperation(
|
|
119
|
+
return await waitForOperation(delivery, signal);
|
|
124
120
|
}
|
|
125
|
-
async
|
|
121
|
+
async deliverDeferredJoinCompletionCore(completion, actor, actorRef, submitMailbox) {
|
|
126
122
|
const targetActorRef = this.options
|
|
127
123
|
.actorManager()
|
|
128
124
|
?.getState(actor.context.actorId)?.nativeActorRef;
|
|
129
125
|
const currentActorRef = targetActorRef === undefined
|
|
130
126
|
? actorRef
|
|
131
127
|
: (0, actors_1.toFrameworkActorRef)(targetActorRef, actor.context.meshName);
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
await new Promise((resolve) => {
|
|
147
|
-
const timer = setTimeout(resolve, 10 << attempt);
|
|
148
|
-
timer.unref();
|
|
149
|
-
});
|
|
150
|
-
current =
|
|
151
|
-
(await this.requireDeferredJoinJournal().recover(currentActorRef.actorId)) ?? current;
|
|
152
|
-
}
|
|
128
|
+
if (completion.actor.actorId !== currentActorRef.actorId ||
|
|
129
|
+
completion.actor.objectGeneration !== currentActorRef.objectGeneration) {
|
|
130
|
+
throw new Error('Deferred Join completion generation fence is stale ' +
|
|
131
|
+
`(completion ${completion.actor.actorId}/${completion.actor.objectGeneration}, ` +
|
|
132
|
+
`actor ${currentActorRef.actorId}/${currentActorRef.objectGeneration}).`);
|
|
133
|
+
}
|
|
134
|
+
await submitMailbox(async () => {
|
|
135
|
+
if (completion.status === 'failed') {
|
|
136
|
+
await actor.onJoinCompleted?.({
|
|
137
|
+
status: 'failed',
|
|
138
|
+
operationId: completion.operationId,
|
|
139
|
+
kind: completion.kind
|
|
140
|
+
});
|
|
141
|
+
return;
|
|
153
142
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
143
|
+
await actor.onJoinCompleted?.({
|
|
144
|
+
status: 'accepted',
|
|
145
|
+
operationId: completion.operationId,
|
|
146
|
+
actor: currentActorRef,
|
|
147
|
+
reply: completion.rawReply.byteLength === 0
|
|
148
|
+
? undefined
|
|
149
|
+
: completion.replyContentType === undefined
|
|
150
|
+
? contracts_1.ZLinkMessage.fromEncoded(contracts_1.ZLinkEncodedPayload.from(completion.rawReply))
|
|
151
|
+
: (0, payload_codec_1.wrapFrameworkPayloadMessage)(runtime_message_1.ZLinkBufferMessage.from(completion.rawReply), this.options.messageSerializers, completion.replyContentType, undefined, 'reply')
|
|
152
|
+
});
|
|
153
|
+
});
|
|
164
154
|
}
|
|
165
155
|
async prepareSourceActorLeave(actor, sourceSpotId, signal) {
|
|
166
156
|
if (sourceSpotId !== undefined) {
|
|
@@ -182,10 +172,9 @@ class ZLinkActorTransferRuntime {
|
|
|
182
172
|
}
|
|
183
173
|
await this.options.restoreEntrySpotActorJoined(actor, signal);
|
|
184
174
|
}
|
|
185
|
-
async beginSourceActorMove(actor, state,
|
|
186
|
-
if (
|
|
187
|
-
this.
|
|
188
|
-
this.promoteDeferredActorHandoff(actor, state, deferredOperationId);
|
|
175
|
+
async beginSourceActorMove(actor, state, deferredJoin = false) {
|
|
176
|
+
if (deferredJoin && this.options.actorHandoff.isProvisional(actor.context.actorId)) {
|
|
177
|
+
this.promoteDeferredActorHandoff(actor, state);
|
|
189
178
|
}
|
|
190
179
|
state.beginMove();
|
|
191
180
|
if (!this.options.actorHandoff.isActive(actor.context.actorId)) {
|
|
@@ -193,30 +182,34 @@ class ZLinkActorTransferRuntime {
|
|
|
193
182
|
}
|
|
194
183
|
try {
|
|
195
184
|
if (state.spotId !== undefined) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
185
|
+
if ((0, diagnostics_1.isRelocationDebugEnabled)()) {
|
|
186
|
+
(0, diagnostics_1.relocationDebug)('source_actor_move.await_spot_transfer', {
|
|
187
|
+
actorId: actor.context.actorId,
|
|
188
|
+
spotId: String(state.spotId)
|
|
189
|
+
});
|
|
190
|
+
}
|
|
200
191
|
await this.options.spotManager()?.beginActorTransfer(state.spotId, actor.context.actorId);
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
192
|
+
if ((0, diagnostics_1.isRelocationDebugEnabled)()) {
|
|
193
|
+
(0, diagnostics_1.relocationDebug)('source_actor_move.spot_transfer_complete', {
|
|
194
|
+
actorId: actor.context.actorId,
|
|
195
|
+
spotId: String(state.spotId)
|
|
196
|
+
});
|
|
197
|
+
}
|
|
205
198
|
}
|
|
206
199
|
}
|
|
207
200
|
catch (error) {
|
|
208
|
-
if (
|
|
201
|
+
if (!deferredJoin) {
|
|
209
202
|
this.options.actorHandoff.cancel(actor.context.actorId);
|
|
210
203
|
}
|
|
211
204
|
else {
|
|
212
|
-
const admitted = this.admitDeferredSourcePrefix(actor, state
|
|
205
|
+
const admitted = this.admitDeferredSourcePrefix(actor, state);
|
|
213
206
|
void this.observeHandoffReplay(admitted.terminal);
|
|
214
207
|
}
|
|
215
208
|
state.endMove();
|
|
216
209
|
throw error;
|
|
217
210
|
}
|
|
218
211
|
}
|
|
219
|
-
async cancelSourceActorMove(actor, state,
|
|
212
|
+
async cancelSourceActorMove(actor, state, deferredJoin = false, replayStart = Promise.resolve()) {
|
|
220
213
|
try {
|
|
221
214
|
if (state.spotId !== undefined) {
|
|
222
215
|
await this.options.spotManager()?.cancelActorTransfer(state.spotId, actor.context.actorId);
|
|
@@ -224,12 +217,12 @@ class ZLinkActorTransferRuntime {
|
|
|
224
217
|
}
|
|
225
218
|
finally {
|
|
226
219
|
try {
|
|
227
|
-
if (
|
|
220
|
+
if (!deferredJoin) {
|
|
228
221
|
const admitted = this.admitCanceledSourcePrefix(actor, state, replayStart);
|
|
229
222
|
void this.observeHandoffReplay(admitted.terminal);
|
|
230
223
|
}
|
|
231
224
|
else {
|
|
232
|
-
const admitted = this.admitDeferredSourcePrefix(actor, state,
|
|
225
|
+
const admitted = this.admitDeferredSourcePrefix(actor, state, replayStart);
|
|
233
226
|
void this.observeHandoffReplay(admitted.terminal);
|
|
234
227
|
}
|
|
235
228
|
}
|
|
@@ -249,13 +242,13 @@ class ZLinkActorTransferRuntime {
|
|
|
249
242
|
}
|
|
250
243
|
return this.options.actorHandoff.admitCanceledPrefix(actor.context.actorId, queue, this.options.prepareApplicationJob, replayStart);
|
|
251
244
|
}
|
|
252
|
-
admitDeferredSourcePrefix(actor, state,
|
|
245
|
+
admitDeferredSourcePrefix(actor, state, replayStart = Promise.resolve()) {
|
|
253
246
|
const queue = this.sourceHandoffPrefixQueue(actor, state);
|
|
254
247
|
if (queue === undefined) {
|
|
255
248
|
this.options.actorHandoff.cancel(actor.context.actorId);
|
|
256
249
|
return { terminal: Promise.resolve() };
|
|
257
250
|
}
|
|
258
|
-
return this.options.actorHandoff.admitDeferredPrefix(actor.context.actorId,
|
|
251
|
+
return this.options.actorHandoff.admitDeferredPrefix(actor.context.actorId, queue, this.options.prepareApplicationJob, replayStart);
|
|
259
252
|
}
|
|
260
253
|
async observeHandoffReplay(release) {
|
|
261
254
|
try {
|
|
@@ -281,19 +274,19 @@ class ZLinkActorTransferRuntime {
|
|
|
281
274
|
}
|
|
282
275
|
return (drain) => manager.admitRoutedActorPacketPrefix(sourceSpotId, actor.context.actorId, drain);
|
|
283
276
|
}
|
|
284
|
-
async prepareSource(actor, state, signal, lifecycleAuthority = 'framework',
|
|
285
|
-
await this.beginSourceActorMove(actor, state,
|
|
277
|
+
async prepareSource(actor, state, signal, lifecycleAuthority = 'framework', deferredJoin = false, relocation) {
|
|
278
|
+
await this.beginSourceActorMove(actor, state, deferredJoin);
|
|
286
279
|
const relocationMetric = state.meshName === undefined
|
|
287
280
|
? undefined
|
|
288
281
|
: this.options.metrics?.startRelocation(state.meshName, 'actor', this.options.actorTransferRegistry.policy(state.actorType));
|
|
289
282
|
const sourceSpotId = state.spotId;
|
|
290
283
|
let sourceLeaveStarted = false;
|
|
291
|
-
|
|
284
|
+
// The relocation operation owns its Session seal; the Actor keeps only
|
|
285
|
+
// its current binding (Session–Actor binding §8.1).
|
|
286
|
+
let sealedSession;
|
|
292
287
|
try {
|
|
293
|
-
if (state.
|
|
294
|
-
|
|
295
|
-
const sealedTarget = await this.sealBoundSessionRoute(actor, state, signal, relocation);
|
|
296
|
-
state.setRemoteBoundSessionTarget(sealedTarget);
|
|
288
|
+
if (state.boundSession !== undefined) {
|
|
289
|
+
sealedSession = await this.sealBoundSessionRoute(actor, state, signal, relocation);
|
|
297
290
|
this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
|
|
298
291
|
}
|
|
299
292
|
const transfer = await this.options.actorTransferRegistry.transferOut(actor, state.actorType, signal);
|
|
@@ -369,8 +362,7 @@ class ZLinkActorTransferRuntime {
|
|
|
369
362
|
// transition. Keep the source shell available for that
|
|
370
363
|
// callback, then release the old location and registry entry.
|
|
371
364
|
void sourceLeaveCompletion.then(() => this.scheduleSourceDeparture(actor, sourceSpotId, true), (error) => {
|
|
372
|
-
this.
|
|
373
|
-
this.scheduleSourceDeparture(actor, sourceSpotId, true);
|
|
365
|
+
this.scheduleSourceDeparture(actor, sourceSpotId, true, [error]);
|
|
374
366
|
});
|
|
375
367
|
}
|
|
376
368
|
else {
|
|
@@ -386,10 +378,10 @@ class ZLinkActorTransferRuntime {
|
|
|
386
378
|
this.coreSourceLeaves.delete(actor.context.actorId);
|
|
387
379
|
const replayGate = createHandoffReplayGate();
|
|
388
380
|
try {
|
|
389
|
-
await this.cancelSourceActorMove(actor, state,
|
|
381
|
+
await this.cancelSourceActorMove(actor, state, deferredJoin, replayGate.start);
|
|
390
382
|
await this.restoreSourceActor(actor, sourceSpotId);
|
|
391
|
-
if (
|
|
392
|
-
await this.observeBoundSessionSealAbort(actor, state);
|
|
383
|
+
if (sealedSession !== undefined) {
|
|
384
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
393
385
|
}
|
|
394
386
|
}
|
|
395
387
|
finally {
|
|
@@ -402,11 +394,11 @@ class ZLinkActorTransferRuntime {
|
|
|
402
394
|
relocationMetric?.complete('failed');
|
|
403
395
|
const replayGate = createHandoffReplayGate();
|
|
404
396
|
try {
|
|
405
|
-
await this.cancelSourceActorMove(actor, state,
|
|
397
|
+
await this.cancelSourceActorMove(actor, state, deferredJoin, replayGate.start);
|
|
406
398
|
if (sourceLeaveStarted)
|
|
407
399
|
await this.restoreSourceActor(actor, sourceSpotId);
|
|
408
|
-
if (
|
|
409
|
-
await this.observeBoundSessionSealAbort(actor, state);
|
|
400
|
+
if (sealedSession !== undefined) {
|
|
401
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
410
402
|
}
|
|
411
403
|
}
|
|
412
404
|
catch (rollbackError) {
|
|
@@ -419,10 +411,12 @@ class ZLinkActorTransferRuntime {
|
|
|
419
411
|
}
|
|
420
412
|
}
|
|
421
413
|
async prepareMaintenanceSession(actor, state, signal, manageMembership = true, relocation) {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
414
|
+
if ((0, diagnostics_1.isRelocationDebugEnabled)()) {
|
|
415
|
+
(0, diagnostics_1.relocationDebug)('maintenance_session.begin', {
|
|
416
|
+
actorId: actor.context.actorId,
|
|
417
|
+
spotId: state.spotId === undefined ? undefined : String(state.spotId)
|
|
418
|
+
});
|
|
419
|
+
}
|
|
426
420
|
if (manageMembership) {
|
|
427
421
|
await this.beginSourceActorMove(actor, state);
|
|
428
422
|
}
|
|
@@ -430,21 +424,22 @@ class ZLinkActorTransferRuntime {
|
|
|
430
424
|
state.beginMove();
|
|
431
425
|
this.options.actorHandoff.begin(actor.context.actorId, requireSourceObjectGeneration(actor.context.actorId, state));
|
|
432
426
|
}
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
427
|
+
if ((0, diagnostics_1.isRelocationDebugEnabled)()) {
|
|
428
|
+
(0, diagnostics_1.relocationDebug)('maintenance_session.source_move_complete', {
|
|
429
|
+
actorId: actor.context.actorId
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
let sealedSession;
|
|
437
433
|
try {
|
|
438
|
-
if (state.
|
|
439
|
-
|
|
440
|
-
state.setRemoteBoundSessionTarget(await this.sealBoundSessionRoute(actor, state, signal, relocation));
|
|
434
|
+
if (state.boundSession !== undefined) {
|
|
435
|
+
sealedSession = await this.sealBoundSessionRoute(actor, state, signal, relocation);
|
|
441
436
|
this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
|
|
442
437
|
}
|
|
443
438
|
const handoffBacklog = this.options.actorHandoff.snapshot(actor.context.actorId);
|
|
444
439
|
let terminal = 'prepared';
|
|
445
440
|
let replayResults = [];
|
|
446
441
|
return {
|
|
447
|
-
target:
|
|
442
|
+
target: sealedSession,
|
|
448
443
|
handoffBacklog,
|
|
449
444
|
takeRelocationRelay: () => this.options.actorHandoff.takeRelocationRelay(actor.context.actorId),
|
|
450
445
|
setReplayResults: (results) => {
|
|
@@ -452,19 +447,44 @@ class ZLinkActorTransferRuntime {
|
|
|
452
447
|
replayResults = [...results];
|
|
453
448
|
},
|
|
454
449
|
commit: async (target, targetActorRef, targetOwnerFence) => {
|
|
455
|
-
if (terminal
|
|
450
|
+
if (terminal !== 'prepared')
|
|
456
451
|
return;
|
|
457
|
-
|
|
452
|
+
terminal = 'committed';
|
|
453
|
+
const failures = [];
|
|
454
|
+
try {
|
|
458
455
|
this.options.actorHandoff.complete(actor.context.actorId, target, targetActorRef, replayResults, targetOwnerFence);
|
|
456
|
+
}
|
|
457
|
+
catch (error) {
|
|
458
|
+
failures.push(error);
|
|
459
|
+
}
|
|
460
|
+
try {
|
|
459
461
|
if (manageMembership && state.spotId !== undefined) {
|
|
460
462
|
await this.options
|
|
461
463
|
.spotManager()
|
|
462
464
|
?.commitActorLeaveAfterTransfer(state.spotId, actor.context.actorId);
|
|
463
465
|
}
|
|
466
|
+
}
|
|
467
|
+
catch (error) {
|
|
468
|
+
failures.push(error);
|
|
469
|
+
}
|
|
470
|
+
try {
|
|
464
471
|
state.endMove();
|
|
465
|
-
|
|
472
|
+
}
|
|
473
|
+
catch (error) {
|
|
474
|
+
failures.push(error);
|
|
475
|
+
}
|
|
476
|
+
if (failures.length > 0) {
|
|
477
|
+
throw failures.length === 1
|
|
478
|
+
? failures[0]
|
|
479
|
+
: new AggregateError(failures, 'Actor source retirement failed.');
|
|
466
480
|
}
|
|
467
481
|
},
|
|
482
|
+
discard: (reason) => {
|
|
483
|
+
if (terminal !== 'prepared')
|
|
484
|
+
return;
|
|
485
|
+
terminal = 'rolledBack';
|
|
486
|
+
this.options.actorHandoff.failPending(actor.context.actorId, reason);
|
|
487
|
+
},
|
|
468
488
|
rollback: async () => {
|
|
469
489
|
if (terminal !== 'prepared')
|
|
470
490
|
return;
|
|
@@ -483,8 +503,8 @@ class ZLinkActorTransferRuntime {
|
|
|
483
503
|
state.endMove();
|
|
484
504
|
}
|
|
485
505
|
}
|
|
486
|
-
if (
|
|
487
|
-
await this.observeBoundSessionSealAbort(actor, state);
|
|
506
|
+
if (sealedSession !== undefined) {
|
|
507
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
488
508
|
}
|
|
489
509
|
}
|
|
490
510
|
finally {
|
|
@@ -518,8 +538,8 @@ class ZLinkActorTransferRuntime {
|
|
|
518
538
|
state.endMove();
|
|
519
539
|
}
|
|
520
540
|
}
|
|
521
|
-
if (sourceRestored &&
|
|
522
|
-
await this.observeBoundSessionSealAbort(actor, state);
|
|
541
|
+
if (sourceRestored && sealedSession !== undefined) {
|
|
542
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
523
543
|
}
|
|
524
544
|
}
|
|
525
545
|
finally {
|
|
@@ -571,7 +591,7 @@ class ZLinkActorTransferRuntime {
|
|
|
571
591
|
return this.options.actorHandoff.acceptRelocatedTerminalRelay(operationId, replyRouteId, undefined, result, sourceNodeRid, targetAuthorityOwnerGeneration);
|
|
572
592
|
}
|
|
573
593
|
async sealBoundSessionRoute(actor, state, signal, relocation) {
|
|
574
|
-
const target = state.
|
|
594
|
+
const target = state.boundSession;
|
|
575
595
|
const actorRef = state.nativeActorRef;
|
|
576
596
|
if (target === undefined ||
|
|
577
597
|
actorRef === undefined ||
|
|
@@ -651,12 +671,9 @@ class ZLinkActorTransferRuntime {
|
|
|
651
671
|
serviceWireRelocation: { relocation, coordinator, session }
|
|
652
672
|
};
|
|
653
673
|
}
|
|
654
|
-
async abortBoundSessionRouteSeal(actor, state,
|
|
655
|
-
const target = targetOverride ??
|
|
656
|
-
(0, actors_1.preferredRemoteBoundSessionTarget)(state.remoteBoundSessionTarget, state.boundSessionTransferTarget);
|
|
674
|
+
async abortBoundSessionRouteSeal(actor, state, target) {
|
|
657
675
|
const actorRef = state.nativeActorRef;
|
|
658
|
-
if (
|
|
659
|
-
actorRef === undefined ||
|
|
676
|
+
if (actorRef === undefined ||
|
|
660
677
|
target.bindingGeneration === undefined ||
|
|
661
678
|
target.previousAuthorityOwnerGeneration === undefined ||
|
|
662
679
|
target.previousOwnerLeaseGeneration === undefined) {
|
|
@@ -687,9 +704,9 @@ class ZLinkActorTransferRuntime {
|
|
|
687
704
|
}
|
|
688
705
|
await serviceWire.sendSessionRelocationRoute(target.routerChannelId, target.targetNodeRid, route, this.options.shutdownSignal?.());
|
|
689
706
|
}
|
|
690
|
-
async observeBoundSessionSealAbort(actor, state) {
|
|
707
|
+
async observeBoundSessionSealAbort(actor, state, sealedSession) {
|
|
691
708
|
try {
|
|
692
|
-
await this.abortBoundSessionRouteSeal(actor, state);
|
|
709
|
+
await this.abortBoundSessionRouteSeal(actor, state, sealedSession);
|
|
693
710
|
}
|
|
694
711
|
catch (error) {
|
|
695
712
|
try {
|
|
@@ -725,44 +742,52 @@ class ZLinkActorTransferRuntime {
|
|
|
725
742
|
});
|
|
726
743
|
return { completion: promise, submitted };
|
|
727
744
|
}
|
|
728
|
-
scheduleSourceDeparture(actor, sourceSpotId, releaseLocation) {
|
|
729
|
-
|
|
730
|
-
return;
|
|
731
|
-
const task = this.finishSourceDeparture(actor, sourceSpotId, releaseLocation).finally(() => this.sourceDepartureTasks.delete(actor.context.actorId));
|
|
732
|
-
this.sourceDepartureTasks.set(actor.context.actorId, task);
|
|
745
|
+
scheduleSourceDeparture(actor, sourceSpotId, releaseLocation, failures = []) {
|
|
746
|
+
void this.finishSourceDeparture(actor, sourceSpotId, releaseLocation, failures);
|
|
733
747
|
}
|
|
734
|
-
async finishSourceDeparture(actor, sourceSpotId, releaseLocation) {
|
|
735
|
-
|
|
736
|
-
|
|
748
|
+
async finishSourceDeparture(actor, sourceSpotId, releaseLocation, failures) {
|
|
749
|
+
if (sourceSpotId !== undefined) {
|
|
750
|
+
try {
|
|
751
|
+
await this.options
|
|
752
|
+
.spotManager()
|
|
753
|
+
?.commitActorLeaveAfterTransfer(sourceSpotId, actor.context.actorId);
|
|
754
|
+
}
|
|
755
|
+
catch (error) {
|
|
756
|
+
failures.push(error);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
if (releaseLocation) {
|
|
737
760
|
try {
|
|
738
|
-
|
|
761
|
+
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
762
|
+
if (state?.actorType !== undefined && state.ownsLocation) {
|
|
739
763
|
await this.options
|
|
740
|
-
.
|
|
741
|
-
?.
|
|
764
|
+
.locationLifecycle()
|
|
765
|
+
?.releaseActor(state.actorType, actor.context.actorId);
|
|
766
|
+
state.markLocationReleased();
|
|
742
767
|
}
|
|
743
|
-
if (releaseLocation) {
|
|
744
|
-
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
745
|
-
if (state?.actorType !== undefined && state.ownsLocation) {
|
|
746
|
-
await this.options
|
|
747
|
-
.locationLifecycle()
|
|
748
|
-
?.releaseActor(state.actorType, actor.context.actorId);
|
|
749
|
-
state.markLocationReleased();
|
|
750
|
-
}
|
|
751
|
-
// Message Follow owns the bounded stale route after the native leave.
|
|
752
|
-
// The source Actor shell must therefore be removed from the process
|
|
753
|
-
// registry so a later relocation can materialize the same Actor ID on
|
|
754
|
-
// this node without colliding with its previous incarnation.
|
|
755
|
-
await this.options.actorManager()?.completeCoreRelocationSource(actor.context.actorId);
|
|
756
|
-
}
|
|
757
|
-
this.options.onSourceDepartureCompleted?.(actor.context.actorId);
|
|
758
|
-
return;
|
|
759
768
|
}
|
|
760
769
|
catch (error) {
|
|
761
|
-
|
|
762
|
-
if (!(await retry.wait(this.options.shutdownSignal?.())))
|
|
763
|
-
return;
|
|
770
|
+
failures.push(error);
|
|
764
771
|
}
|
|
765
772
|
}
|
|
773
|
+
try {
|
|
774
|
+
// Message Follow keeps its route separately from the retired application instance.
|
|
775
|
+
await this.options.actorManager()?.completeCoreRelocationSource(actor.context.actorId);
|
|
776
|
+
}
|
|
777
|
+
catch (error) {
|
|
778
|
+
failures.push(error);
|
|
779
|
+
}
|
|
780
|
+
try {
|
|
781
|
+
this.options.onSourceDepartureCompleted?.(actor.context.actorId);
|
|
782
|
+
}
|
|
783
|
+
catch (error) {
|
|
784
|
+
failures.push(error);
|
|
785
|
+
}
|
|
786
|
+
if (failures.length > 0) {
|
|
787
|
+
this.options.reportPostCommitError?.(failures.length === 1
|
|
788
|
+
? failures[0]
|
|
789
|
+
: new AggregateError(failures, 'Actor source retirement failed.'));
|
|
790
|
+
}
|
|
766
791
|
}
|
|
767
792
|
async getOrCreateRoutedActor(actorId, actorType, actorRef, remoteBoundSessionTarget, actorCreateRequest, signal) {
|
|
768
793
|
const actorManager = this.requireActorManager('Routed actor join requires ZLINK_ACTOR_MANAGER.');
|
|
@@ -777,7 +802,9 @@ class ZLinkActorTransferRuntime {
|
|
|
777
802
|
}
|
|
778
803
|
if (actorRef !== undefined) {
|
|
779
804
|
state.setNativeActorRef(actorRef);
|
|
780
|
-
|
|
805
|
+
if (remoteBoundSessionTarget !== undefined) {
|
|
806
|
+
state.installBoundSessionBinding(remoteBoundSessionTarget);
|
|
807
|
+
}
|
|
781
808
|
return { actor, actorRef: actorRef };
|
|
782
809
|
}
|
|
783
810
|
return { actor, actorRef: state.ensureNativeActorRef(this.options.primaryMeshNode()) };
|
|
@@ -791,12 +818,10 @@ class ZLinkActorTransferRuntime {
|
|
|
791
818
|
}
|
|
792
819
|
if (actorEntryNodeRid !== undefined)
|
|
793
820
|
state.setEntryNodeRid(actorEntryNodeRid);
|
|
794
|
-
|
|
821
|
+
// The relocation delivers the binding it carried; the target installs it
|
|
822
|
+
// through the one install rule (Session–Actor binding §6, §8).
|
|
795
823
|
if (remoteBoundSessionTarget !== undefined) {
|
|
796
|
-
state.
|
|
797
|
-
}
|
|
798
|
-
if (remoteBoundSessionTarget?.bindingGeneration !== undefined) {
|
|
799
|
-
state.setBoundSessionBindingGeneration(remoteBoundSessionTarget.bindingGeneration);
|
|
824
|
+
state.installBoundSessionBinding(remoteBoundSessionTarget);
|
|
800
825
|
}
|
|
801
826
|
return {
|
|
802
827
|
actor: materialized.actor,
|
|
@@ -935,24 +960,11 @@ class ZLinkActorTransferRuntime {
|
|
|
935
960
|
return undefined;
|
|
936
961
|
}
|
|
937
962
|
}
|
|
938
|
-
rememberRoutedActorTransferTarget(actorId, target) {
|
|
939
|
-
if (target === undefined)
|
|
940
|
-
return;
|
|
941
|
-
const state = this.options.actorManager()?.getState(actorId);
|
|
942
|
-
if (state === undefined) {
|
|
943
|
-
return;
|
|
944
|
-
}
|
|
945
|
-
state.setBoundSessionTransferTarget(target);
|
|
946
|
-
state.setRemoteBoundSessionTarget((0, actors_1.mergeRemoteBoundSessionTarget)(target, state.remoteBoundSessionTarget));
|
|
947
|
-
if (target.bindingGeneration !== undefined) {
|
|
948
|
-
state.setBoundSessionBindingGeneration(target.bindingGeneration);
|
|
949
|
-
}
|
|
950
|
-
}
|
|
951
963
|
commitRoutedActor(actor, spotId, spot) {
|
|
952
964
|
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
953
965
|
state?.setJoinedSpot(spotId, spot);
|
|
954
966
|
const actorRef = state?.nativeActorRef;
|
|
955
|
-
const binding = state?.
|
|
967
|
+
const binding = state?.boundSession;
|
|
956
968
|
if (actorRef !== undefined &&
|
|
957
969
|
binding?.sessionNodeRid !== undefined &&
|
|
958
970
|
binding.sessionRid !== undefined &&
|
|
@@ -996,7 +1008,7 @@ class ZLinkActorTransferRuntime {
|
|
|
996
1008
|
(0, routing_id_1.encodeRoutingIdStorageHex)(spotId))) {
|
|
997
1009
|
throw new Error(`Actor '${actor.context.actorId}' Core location does not match the committed target SPOT.`);
|
|
998
1010
|
}
|
|
999
|
-
const deadline = performance.now() +
|
|
1011
|
+
const deadline = performance.now() + TRANSFER_RESOLUTION_TIMEOUT_MS;
|
|
1000
1012
|
const ownerNodeGeneration = node.status().lifecycleGeneration;
|
|
1001
1013
|
if (ownerNodeGeneration <= 0n) {
|
|
1002
1014
|
throw new Error(`Actor '${actor.context.actorId}' owner MeshNode has no valid lifecycle generation.`);
|
|
@@ -1020,7 +1032,7 @@ class ZLinkActorTransferRuntime {
|
|
|
1020
1032
|
if (claim.status !== 'conflict' || performance.now() >= deadline) {
|
|
1021
1033
|
break;
|
|
1022
1034
|
}
|
|
1023
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
1035
|
+
await new Promise((resolve) => setTimeout(resolve, TRANSFER_POLL_INTERVAL_MS));
|
|
1024
1036
|
}
|
|
1025
1037
|
if (claim.status === 'conflict') {
|
|
1026
1038
|
throw new Error(`Actor '${actor.context.actorId}' target location takeover was rejected.`);
|
|
@@ -1046,78 +1058,25 @@ class ZLinkActorTransferRuntime {
|
|
|
1046
1058
|
}
|
|
1047
1059
|
state.setRemoteActorPacketTarget(target);
|
|
1048
1060
|
}
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
const snapshot = {
|
|
1055
|
-
spotId: state?.spotId,
|
|
1056
|
-
spot: state?.spot,
|
|
1057
|
-
locationSpotId: previousLocation?.spotId,
|
|
1058
|
-
spotMeshName: previousLocation?.meshName,
|
|
1059
|
-
actorRef: previousLocation?.actorRef,
|
|
1060
|
-
spotGeneration: previousLocation?.spotGeneration,
|
|
1061
|
-
membershipEpoch: previousLocation?.membershipEpoch,
|
|
1062
|
-
ownerNodeGeneration: previousLocation?.ownerNodeGeneration
|
|
1063
|
-
};
|
|
1064
|
-
await this.claimRoutedActorLocation(actor, spotId, spotMeshName);
|
|
1065
|
-
return snapshot;
|
|
1066
|
-
}
|
|
1067
|
-
async publishRoutedActorOwnership(actor) {
|
|
1061
|
+
/**
|
|
1062
|
+
* Publishes the committed route of the Session seal that the relocation
|
|
1063
|
+
* operation carried to this target (command 44, Session–Actor binding §8.2).
|
|
1064
|
+
*/
|
|
1065
|
+
async publishRoutedActorOwnership(actor, sealedSession) {
|
|
1068
1066
|
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
1069
1067
|
const actorRef = state?.nativeActorRef;
|
|
1070
1068
|
const generation = state?.locationGeneration;
|
|
1071
1069
|
if (state === undefined || actorRef === undefined || generation === undefined)
|
|
1072
1070
|
return;
|
|
1073
|
-
|
|
1074
|
-
if (boundSessionTarget?.serviceWireRelocation === undefined)
|
|
1071
|
+
if (sealedSession?.serviceWireRelocation === undefined)
|
|
1075
1072
|
return;
|
|
1076
|
-
await this.publishBoundSessionOwnership(actor.context.actorId, actorRef, generation,
|
|
1073
|
+
await this.publishBoundSessionOwnership(actor.context.actorId, actorRef, generation, sealedSession, state.ownerLeaseGeneration);
|
|
1077
1074
|
}
|
|
1078
1075
|
async openRoutedActorSession(_actor) { }
|
|
1079
1076
|
clearRoutedActor(actor) {
|
|
1080
1077
|
this.options.actorManager()?.getState(actor.context.actorId)?.clearJoinedSpot();
|
|
1081
1078
|
this.options.clearRemoteActorPacketTarget(actor.context.actorId);
|
|
1082
1079
|
}
|
|
1083
|
-
async rollbackNativeActorJoin(actor, snapshot) {
|
|
1084
|
-
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
1085
|
-
const actorType = state?.actorType;
|
|
1086
|
-
const lifecycle = this.options.locationLifecycle();
|
|
1087
|
-
if (snapshot.spotId === undefined)
|
|
1088
|
-
state?.clearJoinedSpot();
|
|
1089
|
-
else
|
|
1090
|
-
state?.setJoinedSpot(snapshot.spotId, snapshot.spot);
|
|
1091
|
-
if (state?.ownsLocation !== true || actorType === undefined || lifecycle === undefined)
|
|
1092
|
-
return;
|
|
1093
|
-
if (snapshot.spotId === undefined) {
|
|
1094
|
-
if (snapshot.locationSpotId === undefined ||
|
|
1095
|
-
snapshot.spotGeneration === undefined ||
|
|
1096
|
-
snapshot.membershipEpoch === undefined ||
|
|
1097
|
-
snapshot.ownerNodeGeneration === undefined) {
|
|
1098
|
-
throw new Error(`Actor '${actor.context.actorId}' cannot restore its Entry SPOT location without its exact generation fields.`);
|
|
1099
|
-
}
|
|
1100
|
-
await lifecycle.notifyActorLeftSpot(actorType, actor.context.actorId, snapshot.locationSpotId, snapshot.spotGeneration, snapshot.membershipEpoch, snapshot.ownerNodeGeneration);
|
|
1101
|
-
return;
|
|
1102
|
-
}
|
|
1103
|
-
if (snapshot.actorRef === undefined) {
|
|
1104
|
-
throw new Error(`Actor '${actor.context.actorId}' cannot restore its previous SPOT location without a native ref.`);
|
|
1105
|
-
}
|
|
1106
|
-
if (snapshot.spotMeshName === undefined ||
|
|
1107
|
-
snapshot.spotGeneration === undefined ||
|
|
1108
|
-
snapshot.membershipEpoch === undefined ||
|
|
1109
|
-
snapshot.ownerNodeGeneration === undefined) {
|
|
1110
|
-
throw new Error(`Actor '${actor.context.actorId}' cannot restore its previous SPOT location without its exact generation fields.`);
|
|
1111
|
-
}
|
|
1112
|
-
const restored = await lifecycle.takeoverActorJoinedSpot(actorType, actor.context.actorId, snapshot.actorRef, snapshot.spotMeshName, snapshot.spotId, snapshot.spotGeneration, snapshot.membershipEpoch, snapshot.ownerNodeGeneration, async () => state.clearAfterDestroy());
|
|
1113
|
-
if (restored.status === 'conflict') {
|
|
1114
|
-
throw new Error(`Actor '${actor.context.actorId}' previous SPOT location could not be restored.`);
|
|
1115
|
-
}
|
|
1116
|
-
if (restored.generation !== undefined)
|
|
1117
|
-
state.setLocationGeneration(restored.generation);
|
|
1118
|
-
if (restored.claimed !== undefined)
|
|
1119
|
-
state.setOwnerLeaseGeneration(restored.claimed.leaseGeneration);
|
|
1120
|
-
}
|
|
1121
1080
|
async rollbackRoutedActor(actor, signal) {
|
|
1122
1081
|
const manager = this.options.actorManager();
|
|
1123
1082
|
const state = manager?.getState(actor.context.actorId);
|
|
@@ -1131,7 +1090,6 @@ class ZLinkActorTransferRuntime {
|
|
|
1131
1090
|
}
|
|
1132
1091
|
catch (error) {
|
|
1133
1092
|
locationError = error;
|
|
1134
|
-
void lifecycle.releaseActorEventually(actorType, actor.context.actorId);
|
|
1135
1093
|
}
|
|
1136
1094
|
}
|
|
1137
1095
|
try {
|
|
@@ -1201,7 +1159,8 @@ class ZLinkActorTransferRuntime {
|
|
|
1201
1159
|
previousAuthorityOwnerGeneration: target.previousAuthorityOwnerGeneration,
|
|
1202
1160
|
targetAuthorityOwnerGeneration: ownershipGeneration,
|
|
1203
1161
|
targetNodeRid: String(actorRef.nodeRid),
|
|
1204
|
-
targetNodeGeneration: authority.allocation.descriptorLifecycleGeneration
|
|
1162
|
+
targetNodeGeneration: authority.allocation.descriptorLifecycleGeneration,
|
|
1163
|
+
targetOwnerLeaseGeneration: authority.ownerLeaseGeneration
|
|
1205
1164
|
}
|
|
1206
1165
|
}, this.options.shutdownSignal?.());
|
|
1207
1166
|
return;
|
|
@@ -1209,14 +1168,9 @@ class ZLinkActorTransferRuntime {
|
|
|
1209
1168
|
}
|
|
1210
1169
|
}
|
|
1211
1170
|
exports.ZLinkActorTransferRuntime = ZLinkActorTransferRuntime;
|
|
1212
|
-
function
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
console.error('[zlink.runtime.relocation]', marker, detail);
|
|
1216
|
-
}
|
|
1217
|
-
function deferredJoinTerminalKey(root) {
|
|
1218
|
-
return (`${root.actor.actorId}:${root.actor.objectGeneration.toString()}:` +
|
|
1219
|
-
(0, operation_identity_1.operationIdentityKey)(root.operationId));
|
|
1171
|
+
function deferredJoinTerminalKey(completion) {
|
|
1172
|
+
return (`${completion.actor.actorId}:${completion.actor.objectGeneration.toString()}:` +
|
|
1173
|
+
(0, operation_identity_1.operationIdentityKey)(completion.operationId));
|
|
1220
1174
|
}
|
|
1221
1175
|
function waitForOperation(operation, signal) {
|
|
1222
1176
|
if (signal === undefined)
|
|
@@ -1256,7 +1210,7 @@ async function waitForActorAuthorityRetry(deadlineAtMs, signal, cause) {
|
|
|
1256
1210
|
throw new Error('Actor target authority deadline expired.', { cause });
|
|
1257
1211
|
}
|
|
1258
1212
|
await new Promise((resolve, reject) => {
|
|
1259
|
-
const timer = setTimeout(resolve, Math.min(
|
|
1213
|
+
const timer = setTimeout(resolve, Math.min(TRANSFER_POLL_INTERVAL_MS, remaining));
|
|
1260
1214
|
timer.unref();
|
|
1261
1215
|
const abort = () => {
|
|
1262
1216
|
clearTimeout(timer);
|