@zlink-systems/framework 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +15 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +1 -2
- package/dist/runtime/activation-admission.js +2 -6
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +13 -11
- package/dist/runtime/actors/actor-handoff.d.ts +4 -4
- package/dist/runtime/actors/actor-handoff.js +8 -8
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +83 -105
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.js +5 -9
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
- package/dist/runtime/actors/deferred-join-completion.js +1 -0
- package/dist/runtime/actors/index.d.ts +9 -7
- package/dist/runtime/actors/index.js +87 -69
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +2 -0
- package/dist/runtime/admission.js +7 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +6 -23
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
- package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -8
- package/dist/runtime/channels/channel-clients.js +68 -52
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -10
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.js +5 -2
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +248 -174
- package/dist/runtime/channels/channel-transports.d.ts +11 -17
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +130 -72
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +12 -9
- package/dist/runtime/execution/index.js +58 -14
- package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
- package/dist/runtime/execution/serial-execution-queue.js +54 -15
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
- package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
- package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
- package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
- package/dist/runtime/foundation/service-topology-registry.js +17 -32
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
- package/dist/runtime/host/actor-transfer-runtime.js +143 -176
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +14 -13
- package/dist/runtime/host/index.js +190 -157
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +7 -20
- package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
- package/dist/runtime/host/route-mesh-runtime.js +171 -252
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
- package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
- package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
- package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +4 -9
- package/dist/runtime/locations/lifecycle.js +2 -31
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +37 -28
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
- package/dist/runtime/locations/spot-location-claims.js +42 -1
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
- package/dist/runtime/spots/index.d.ts +14 -20
- package/dist/runtime/spots/index.js +302 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
- package/dist/runtime/spots/spot-activation-registry.js +14 -50
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +2 -2
- package/dist/runtime/spots/spot-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-activation.js +49 -32
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
- package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
- package/dist/runtime/spots/spot-actor-membership.js +22 -45
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +9 -20
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +5 -4
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +9 -8
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
- package/dist/runtime/spots/spot-serial-executor.js +2 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
- package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +11 -1
- package/dist/runtime/streams/index.d.ts +14 -15
- package/dist/runtime/streams/index.js +20 -21
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +14 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +2 -8
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +39 -33
- package/src/runtime/actors/actor-handoff.ts +24 -22
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +172 -174
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +9 -11
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +10 -6
- package/src/runtime/actors/index.ts +100 -79
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +8 -1
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +13 -29
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
- package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
- package/src/runtime/backend/raw-binding-port.ts +1 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -85
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -23
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +6 -2
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +301 -192
- package/src/runtime/channels/channel-transports.ts +161 -112
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +172 -91
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +60 -20
- package/src/runtime/execution/serial-execution-queue.ts +131 -18
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
- package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
- package/src/runtime/foundation/service-topology-registry.ts +23 -32
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +180 -260
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +327 -296
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +8 -41
- package/src/runtime/host/route-mesh-runtime.ts +228 -271
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
- package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +13 -43
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +75 -49
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +58 -1
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
- package/src/runtime/spots/index.ts +433 -229
- package/src/runtime/spots/spot-activation-registry.ts +30 -69
- package/src/runtime/spots/spot-activation-state.ts +2 -2
- package/src/runtime/spots/spot-activation.ts +67 -37
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
- package/src/runtime/spots/spot-actor-membership.ts +40 -72
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -30
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +21 -17
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
- package/src/runtime/spots/spot-outbound.ts +45 -23
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +5 -27
- package/src/runtime/spots/spot-serial-executor.ts +2 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +21 -1
- package/src/runtime/streams/index.ts +76 -64
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ConfigError, ConfigResult } from '@zlink-systems/zlink';
|
|
1
2
|
import type {
|
|
2
3
|
ZLinkBackendActorRef,
|
|
3
4
|
ZLinkBackendMeshNode,
|
|
@@ -22,17 +23,9 @@ export function lookupNativeActorRef(
|
|
|
22
23
|
generation: actor.generation
|
|
23
24
|
};
|
|
24
25
|
} catch (error) {
|
|
25
|
-
if (
|
|
26
|
+
if (error instanceof ConfigError && error.result === ConfigResult.NotFound) {
|
|
26
27
|
return undefined;
|
|
27
28
|
}
|
|
28
29
|
throw error;
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
function nativeErrno(error: unknown): number | undefined {
|
|
33
|
-
if (typeof error !== 'object' || error === null || !('nativeErrno' in error)) {
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
36
|
-
const value = error.nativeErrno;
|
|
37
|
-
return typeof value === 'number' ? value : undefined;
|
|
38
|
-
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
1
|
+
import { type ActorRef, type RoutingId, ZLinkSpotKind } from '../../contracts';
|
|
2
|
+
|
|
3
|
+
import { ZLINK_MAX_SPOT_ID_BYTES } from '../../contracts/Common/CoreTypes';
|
|
3
4
|
import { decodeRoutingId, routingIdWireHex } from '../routing-id';
|
|
4
|
-
import type { ZLinkRemoteActorPacketTarget } from './actor-runtime-state';
|
|
5
5
|
import {
|
|
6
6
|
decodeActorMessageFollowContext,
|
|
7
7
|
type ZLinkActorMessageFollowContext
|
|
8
8
|
} from './actor-message-follow-context';
|
|
9
|
+
import type { ZLinkRemoteActorPacketTarget } from './actor-runtime-state';
|
|
9
10
|
|
|
10
11
|
export const ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET = '__zlink.actor.packet.relay';
|
|
11
12
|
export const ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET =
|
|
@@ -48,6 +49,7 @@ export function encodeRemoteActorPacketRelayPayload(input: {
|
|
|
48
49
|
readonly header: Uint8Array;
|
|
49
50
|
readonly payload: Uint8Array;
|
|
50
51
|
readonly bindingActorRef?: ActorRef;
|
|
52
|
+
readonly bindingGeneration?: bigint;
|
|
51
53
|
/** The actor reference used to preserve relocation context at the target Spot. */
|
|
52
54
|
readonly actorRef?: ActorRef;
|
|
53
55
|
readonly returnResponse?: boolean;
|
|
@@ -70,13 +72,15 @@ export function encodeRemoteActorPacketRelayPayload(input: {
|
|
|
70
72
|
? undefined
|
|
71
73
|
: routingIdWireHex(input.bindingActorRef.nodeRid),
|
|
72
74
|
bindingActorGeneration: input.bindingActorRef?.objectGeneration.toString(),
|
|
73
|
-
bindingGeneration:
|
|
74
|
-
input.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
75
|
+
bindingGeneration:
|
|
76
|
+
input.bindingGeneration?.toString() ??
|
|
77
|
+
(
|
|
78
|
+
input.bindingActorRef as
|
|
79
|
+
| (ActorRef & {
|
|
80
|
+
readonly bindingGeneration?: bigint;
|
|
81
|
+
})
|
|
82
|
+
| undefined
|
|
83
|
+
)?.bindingGeneration?.toString(),
|
|
80
84
|
returnResponse: input.returnResponse,
|
|
81
85
|
messageFollowContext: input.messageFollowContext,
|
|
82
86
|
header: Buffer.from(input.header).toString('base64'),
|
|
@@ -169,8 +173,10 @@ export function decodeRemoteActorPacketTarget(
|
|
|
169
173
|
|
|
170
174
|
function requireSpotId(value: string): string {
|
|
171
175
|
const bytes = Buffer.byteLength(value, 'utf8');
|
|
172
|
-
if (bytes < 1 || bytes >
|
|
173
|
-
throw new Error(
|
|
176
|
+
if (bytes < 1 || bytes > ZLINK_MAX_SPOT_ID_BYTES) {
|
|
177
|
+
throw new Error(
|
|
178
|
+
`Actor packet target SpotId must contain 1..${ZLINK_MAX_SPOT_ID_BYTES} UTF-8 bytes.`
|
|
179
|
+
);
|
|
174
180
|
}
|
|
175
181
|
return value;
|
|
176
182
|
}
|
|
@@ -11,12 +11,14 @@ import type {
|
|
|
11
11
|
import type { ZLinkActorSourceTransfer } from './actor-source-transfer';
|
|
12
12
|
import { ZLinkActorRuntimeState, toFrameworkRoutingId } from './actor-runtime-state';
|
|
13
13
|
import { lookupNativeActorRef } from './actor-native-lookup';
|
|
14
|
-
import { ZLinkPostCommitActorLocation } from './post-commit-actor-location';
|
|
15
14
|
import { ZLinkLocalNativeActorJoin } from './actor-local-native-join';
|
|
16
15
|
import { ZLinkPostCommitActorBinder } from './post-commit-actor-binder';
|
|
17
16
|
import type { ZLinkActorJoinRelocation } from './actor-join-relocation';
|
|
18
17
|
|
|
19
|
-
export interface ZLinkActorNativeJoinCoordinatorOptions
|
|
18
|
+
export interface ZLinkActorNativeJoinCoordinatorOptions extends Pick<
|
|
19
|
+
import('./actor-local-native-join').ZLinkLocalNativeActorJoinOptions,
|
|
20
|
+
'localSpotJoin' | 'localEntryJoin' | 'localSourceLeave' | 'reportSourceLeaveError'
|
|
21
|
+
> {
|
|
20
22
|
readonly messageFlow?: () =>
|
|
21
23
|
import('../diagnostics/message-flow').ZLinkMessageFlowTracer | undefined;
|
|
22
24
|
readonly node: ZLinkBackendMeshNode | (() => ZLinkBackendMeshNode);
|
|
@@ -46,16 +48,12 @@ export class ZLinkActorNativeJoinCoordinator implements ZLinkActorJoinCoordinato
|
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
constructor(private readonly options: ZLinkActorNativeJoinCoordinatorOptions) {
|
|
49
|
-
const postCommitLocation =
|
|
50
|
-
options.locationLifecycle === undefined
|
|
51
|
-
? undefined
|
|
52
|
-
: new ZLinkPostCommitActorLocation({
|
|
53
|
-
lifecycle: options.locationLifecycle,
|
|
54
|
-
reportError: options.postCommitErrorReporter,
|
|
55
|
-
signal: options.shutdownSignal
|
|
56
|
-
});
|
|
57
51
|
this.localJoin = new ZLinkLocalNativeActorJoin({
|
|
58
|
-
|
|
52
|
+
locationLifecycle: options.locationLifecycle,
|
|
53
|
+
localSpotJoin: options.localSpotJoin,
|
|
54
|
+
localEntryJoin: options.localEntryJoin,
|
|
55
|
+
localSourceLeave: options.localSourceLeave,
|
|
56
|
+
reportSourceLeaveError: options.reportSourceLeaveError,
|
|
59
57
|
postCommitBinder:
|
|
60
58
|
options.remoteActorBinder === undefined
|
|
61
59
|
? undefined
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ZLINK_MAX_SPOT_ID_BYTES } from '../../contracts/Common/CoreTypes';
|
|
2
|
+
import { ZlinkStreamContentType } from '@zlink-systems/stream-wire';
|
|
1
3
|
import type { RoutingId, SpotId } from '../../contracts';
|
|
2
4
|
import { decodeRoutingId } from '../routing-id';
|
|
3
5
|
|
|
@@ -133,7 +135,7 @@ export function decodeRemoteActorJoinPayload(payload: unknown): {
|
|
|
133
135
|
),
|
|
134
136
|
boundSessionSpotId: optionalSpotId(payload, 'boundSessionSpotId'),
|
|
135
137
|
request: (payload as { request: string }).request,
|
|
136
|
-
requestContentType: optionalString(payload, 'requestContentType') ??
|
|
138
|
+
requestContentType: optionalString(payload, 'requestContentType') ?? ZlinkStreamContentType.Json
|
|
137
139
|
};
|
|
138
140
|
}
|
|
139
141
|
|
|
@@ -158,8 +160,8 @@ function optionalSpotId(value: object, key: string): SpotId | undefined {
|
|
|
158
160
|
|
|
159
161
|
function requireSpotId(value: string): SpotId {
|
|
160
162
|
const bytes = Buffer.byteLength(value, 'utf8');
|
|
161
|
-
if (bytes < 1 || bytes >
|
|
162
|
-
throw new Error(
|
|
163
|
+
if (bytes < 1 || bytes > ZLINK_MAX_SPOT_ID_BYTES) {
|
|
164
|
+
throw new Error(`Remote actor SpotId must contain 1..${ZLINK_MAX_SPOT_ID_BYTES} UTF-8 bytes.`);
|
|
163
165
|
}
|
|
164
166
|
return value;
|
|
165
167
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { awaitWithAbort } from '../abort';
|
|
2
|
+
import {
|
|
3
|
+
createInternalFrameworkException,
|
|
4
|
+
ZLinkFrameworkInternalErrorKind
|
|
5
|
+
} from '../framework-errors-internal';
|
|
6
|
+
|
|
7
|
+
export function remainingActorRequestTimeout(
|
|
8
|
+
actorId: string,
|
|
9
|
+
deadlineMs: number | undefined
|
|
10
|
+
): number | undefined {
|
|
11
|
+
if (deadlineMs === undefined) return undefined;
|
|
12
|
+
const remaining = deadlineMs - performance.now();
|
|
13
|
+
if (remaining <= 0) {
|
|
14
|
+
throw createInternalFrameworkException(
|
|
15
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
16
|
+
`Actor request '${actorId}' exceeded its deadline.`
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
return Math.max(1, Math.ceil(remaining));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Only actual Store, delivery-gate, and handoff waits acquire a deadline handle. */
|
|
23
|
+
export async function waitActorReply<T>(
|
|
24
|
+
reply: Promise<T>,
|
|
25
|
+
actorId: string,
|
|
26
|
+
deadlineMs: number | undefined,
|
|
27
|
+
signal?: AbortSignal
|
|
28
|
+
): Promise<T> {
|
|
29
|
+
if (deadlineMs === undefined) return await awaitWithAbort(reply, signal);
|
|
30
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
31
|
+
const timeout = new Promise<never>((_resolve, reject) => {
|
|
32
|
+
const remaining = remainingActorRequestTimeout(actorId, deadlineMs);
|
|
33
|
+
timer = setTimeout(
|
|
34
|
+
() =>
|
|
35
|
+
reject(
|
|
36
|
+
createInternalFrameworkException(
|
|
37
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
38
|
+
`Actor request '${actorId}' exceeded its deadline.`
|
|
39
|
+
)
|
|
40
|
+
),
|
|
41
|
+
remaining
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
try {
|
|
45
|
+
return await awaitWithAbort(Promise.race([reply, timeout]), signal);
|
|
46
|
+
} finally {
|
|
47
|
+
clearTimeout(timer);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const INITIAL_RETRY_DELAY_MS = 25;
|
|
2
2
|
const MAX_RETRY_DELAY_MS = 1_000;
|
|
3
|
+
const RETRY_BACKOFF_MULTIPLIER = 2;
|
|
3
4
|
|
|
4
5
|
export class ZLinkActorRetryDelay {
|
|
5
6
|
private delayMs = INITIAL_RETRY_DELAY_MS;
|
|
@@ -11,7 +12,7 @@ export class ZLinkActorRetryDelay {
|
|
|
11
12
|
async wait(signal: AbortSignal | undefined): Promise<boolean> {
|
|
12
13
|
const completed = await delayUnlessAborted(this.delayMs, signal);
|
|
13
14
|
if (completed) {
|
|
14
|
-
this.delayMs = Math.min(this.delayMs *
|
|
15
|
+
this.delayMs = Math.min(this.delayMs * RETRY_BACKOFF_MULTIPLIER, MAX_RETRY_DELAY_MS);
|
|
15
16
|
}
|
|
16
17
|
return completed;
|
|
17
18
|
}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
ZLinkActor,
|
|
9
|
-
ZLinkActorContext,
|
|
10
|
-
ZLinkSpot
|
|
2
|
+
type ActorRef,
|
|
3
|
+
type RoutingId,
|
|
4
|
+
type ZLinkActor,
|
|
5
|
+
type ZLinkActorContext,
|
|
6
|
+
type ZLinkSpot,
|
|
7
|
+
ZLinkSpotKind
|
|
11
8
|
} from '../../contracts';
|
|
12
|
-
|
|
9
|
+
|
|
13
10
|
import type { Message } from '../../contracts/Common/Message';
|
|
14
11
|
import type { ZLinkBackendActorRef, ZLinkBackendMeshNode } from '../backend/contracts';
|
|
12
|
+
import { isStructuralGuardEnabled } from '../execution/state-lane';
|
|
13
|
+
import {
|
|
14
|
+
ZLinkFrameworkInternalErrorKind,
|
|
15
|
+
createInternalFrameworkException
|
|
16
|
+
} from '../framework-errors-internal';
|
|
15
17
|
import { routingIdsEqual } from '../routing-id';
|
|
16
18
|
import { lookupNativeActorRef } from './actor-native-lookup';
|
|
17
19
|
|
|
@@ -52,85 +54,24 @@ export interface ZLinkRemoteBoundSessionTarget {
|
|
|
52
54
|
}
|
|
53
55
|
|
|
54
56
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* service-wire relocation identity until command 44 releases the owner seal.
|
|
57
|
+
* Session–Actor binding §5·§6: the Actor owner keeps one current binding. The
|
|
58
|
+
* stored value is the binding identity and the route to its Session owner; a
|
|
59
|
+
* relocation fence belongs to the relocation operation that created it.
|
|
59
60
|
*/
|
|
60
|
-
|
|
61
|
-
target: ZLinkRemoteBoundSessionTarget
|
|
62
|
-
fallback: ZLinkRemoteBoundSessionTarget | undefined
|
|
61
|
+
function boundSessionIdentity(
|
|
62
|
+
target: ZLinkRemoteBoundSessionTarget
|
|
63
63
|
): ZLinkRemoteBoundSessionTarget {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const merged = {
|
|
75
|
-
...fallback,
|
|
76
|
-
...target,
|
|
77
|
-
sessionNodeRid: target.sessionNodeRid ?? fallback.sessionNodeRid,
|
|
78
|
-
sessionRid: target.sessionRid ?? fallback.sessionRid,
|
|
79
|
-
sessionOwnerNodeGeneration:
|
|
80
|
-
target.sessionOwnerNodeGeneration ?? fallback.sessionOwnerNodeGeneration,
|
|
81
|
-
sessionOwnerId: target.sessionOwnerId ?? fallback.sessionOwnerId,
|
|
82
|
-
sessionOwnerLeaseGeneration:
|
|
83
|
-
target.sessionOwnerLeaseGeneration ?? fallback.sessionOwnerLeaseGeneration,
|
|
84
|
-
bindingGeneration: target.bindingGeneration ?? fallback.bindingGeneration,
|
|
85
|
-
previousAuthorityOwnerGeneration:
|
|
86
|
-
target.previousAuthorityOwnerGeneration ?? fallback.previousAuthorityOwnerGeneration,
|
|
87
|
-
previousOwnerLeaseGeneration:
|
|
88
|
-
target.previousOwnerLeaseGeneration ?? fallback.previousOwnerLeaseGeneration,
|
|
89
|
-
relocationSealId: target.relocationSealId ?? fallback.relocationSealId,
|
|
90
|
-
serviceWireRelocation: target.serviceWireRelocation ?? fallback.serviceWireRelocation
|
|
64
|
+
return {
|
|
65
|
+
routerChannelId: target.routerChannelId,
|
|
66
|
+
targetNodeRid: target.targetNodeRid,
|
|
67
|
+
spotId: target.spotId,
|
|
68
|
+
sessionNodeRid: target.sessionNodeRid,
|
|
69
|
+
sessionRid: target.sessionRid,
|
|
70
|
+
sessionOwnerNodeGeneration: target.sessionOwnerNodeGeneration,
|
|
71
|
+
sessionOwnerId: target.sessionOwnerId,
|
|
72
|
+
sessionOwnerLeaseGeneration: target.sessionOwnerLeaseGeneration,
|
|
73
|
+
bindingGeneration: target.bindingGeneration
|
|
91
74
|
};
|
|
92
|
-
return merged;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Spec 48 §125: reconnection creates a new Session; the previous Session's
|
|
97
|
-
* binding — and its staged relocation fence — is never inherited by a
|
|
98
|
-
* successor. A Core bind refresh only omits routing coordinates it did not
|
|
99
|
-
* recompute, so an explicit Session identity on both sides that disagrees
|
|
100
|
-
* marks the refresh as belonging to a different Session binding, not a
|
|
101
|
-
* same-Session coordinate/generation-only refresh (a bindingGeneration bump
|
|
102
|
-
* with the same sessionNodeRid/sessionRid is a legitimate same-Session
|
|
103
|
-
* refresh and must keep the fence — see the transfer-target generation test
|
|
104
|
-
* below).
|
|
105
|
-
*
|
|
106
|
-
* NOTE: this identity check is a no-op on the path exercised by
|
|
107
|
-
* `remoteBoundSessionTargetForSource` (mesh-router-resolver.ts), which never
|
|
108
|
-
* populates sessionNodeRid/sessionRid on the refresh it emits. Confirmed via
|
|
109
|
-
* TTT reproduction (2026-08-22, run-dir preserved) that a rejected successor
|
|
110
|
-
* bound-session send still occurs through that path after this change; see
|
|
111
|
-
* session report for the STOP writeup.
|
|
112
|
-
*/
|
|
113
|
-
function isSuccessorSessionBinding(
|
|
114
|
-
fallback: ZLinkRemoteBoundSessionTarget,
|
|
115
|
-
target: ZLinkRemoteBoundSessionTarget
|
|
116
|
-
): boolean {
|
|
117
|
-
return (
|
|
118
|
-
(fallback.sessionNodeRid !== undefined &&
|
|
119
|
-
target.sessionNodeRid !== undefined &&
|
|
120
|
-
!routingIdsEqual(fallback.sessionNodeRid, target.sessionNodeRid)) ||
|
|
121
|
-
(fallback.sessionRid !== undefined &&
|
|
122
|
-
target.sessionRid !== undefined &&
|
|
123
|
-
!routingIdsEqual(fallback.sessionRid, target.sessionRid)) ||
|
|
124
|
-
(fallback.sessionOwnerNodeGeneration !== undefined &&
|
|
125
|
-
target.sessionOwnerNodeGeneration !== undefined &&
|
|
126
|
-
fallback.sessionOwnerNodeGeneration !== target.sessionOwnerNodeGeneration) ||
|
|
127
|
-
(fallback.sessionOwnerId !== undefined &&
|
|
128
|
-
target.sessionOwnerId !== undefined &&
|
|
129
|
-
fallback.sessionOwnerId !== target.sessionOwnerId) ||
|
|
130
|
-
(fallback.sessionOwnerLeaseGeneration !== undefined &&
|
|
131
|
-
target.sessionOwnerLeaseGeneration !== undefined &&
|
|
132
|
-
fallback.sessionOwnerLeaseGeneration !== target.sessionOwnerLeaseGeneration)
|
|
133
|
-
);
|
|
134
75
|
}
|
|
135
76
|
|
|
136
77
|
type ZLinkRemoteSessionOwnerIdentity = Pick<
|
|
@@ -144,20 +85,6 @@ type ZLinkRemoteSessionOwnerIdentity = Pick<
|
|
|
144
85
|
|
|
145
86
|
type ZLinkRemoteSessionOwnerLifecycle = Omit<ZLinkRemoteSessionOwnerIdentity, 'sessionRid'>;
|
|
146
87
|
|
|
147
|
-
function samePhysicalRemoteSession(
|
|
148
|
-
left: ZLinkRemoteBoundSessionTarget,
|
|
149
|
-
right: Pick<ZLinkRemoteBoundSessionTarget, 'sessionNodeRid' | 'sessionRid'>
|
|
150
|
-
): boolean {
|
|
151
|
-
return (
|
|
152
|
-
left.sessionNodeRid !== undefined &&
|
|
153
|
-
right.sessionNodeRid !== undefined &&
|
|
154
|
-
left.sessionRid !== undefined &&
|
|
155
|
-
right.sessionRid !== undefined &&
|
|
156
|
-
routingIdsEqual(left.sessionNodeRid, right.sessionNodeRid) &&
|
|
157
|
-
routingIdsEqual(left.sessionRid, right.sessionRid)
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
88
|
function sameRemoteSessionOwnerLifecycle(
|
|
162
89
|
left: ZLinkRemoteBoundSessionTarget,
|
|
163
90
|
right: ZLinkRemoteSessionOwnerLifecycle
|
|
@@ -207,23 +134,6 @@ function sameRemoteSessionBinding(
|
|
|
207
134
|
);
|
|
208
135
|
}
|
|
209
136
|
|
|
210
|
-
/**
|
|
211
|
-
* Selects the route that still carries the relocation fence when a Core
|
|
212
|
-
* binding refresh and a formal transfer target temporarily coexist.
|
|
213
|
-
*/
|
|
214
|
-
export function preferredRemoteBoundSessionTarget(
|
|
215
|
-
remote: ZLinkRemoteBoundSessionTarget | undefined,
|
|
216
|
-
transfer: ZLinkRemoteBoundSessionTarget | undefined
|
|
217
|
-
): ZLinkRemoteBoundSessionTarget | undefined {
|
|
218
|
-
if (remote === undefined) return transfer;
|
|
219
|
-
if (hasRelocationFence(remote) || transfer === undefined) return remote;
|
|
220
|
-
return transfer;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
function hasRelocationFence(target: ZLinkRemoteBoundSessionTarget): boolean {
|
|
224
|
-
return target.relocationSealId !== undefined || target.serviceWireRelocation !== undefined;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
137
|
export interface ZLinkRemoteActorPacketTarget {
|
|
228
138
|
readonly routerChannelId: string;
|
|
229
139
|
readonly targetNodeRid: RoutingId;
|
|
@@ -269,10 +179,8 @@ export class ZLinkActorRuntimeState {
|
|
|
269
179
|
private spotGenerationValue: bigint | undefined;
|
|
270
180
|
private spotMembershipEpochValue = 0n;
|
|
271
181
|
private nativeActorRefValue: ZLinkBackendActorRef | undefined;
|
|
272
|
-
private boundSessionBindingGenerationValue = 0n;
|
|
273
182
|
private entryNodeRidValue: RoutingId | undefined;
|
|
274
|
-
private
|
|
275
|
-
private boundSessionTransferTargetValue: ZLinkRemoteBoundSessionTarget | undefined;
|
|
183
|
+
private boundSessionValue: ZLinkRemoteBoundSessionTarget | undefined;
|
|
276
184
|
private remoteActorPacketTargetValue: ZLinkRemoteActorPacketTarget | undefined;
|
|
277
185
|
private createRequestPayloadValue: Buffer | undefined;
|
|
278
186
|
private ownsLocationValue = false;
|
|
@@ -282,7 +190,11 @@ export class ZLinkActorRuntimeState {
|
|
|
282
190
|
private deferredJoinPendingValue = false;
|
|
283
191
|
private destroyTask: Promise<void> | undefined;
|
|
284
192
|
|
|
285
|
-
constructor(readonly actorId: string) {
|
|
193
|
+
constructor(readonly actorId: string) {
|
|
194
|
+
if (isStructuralGuardEnabled()) {
|
|
195
|
+
guardBoundSessionTargetWrites(this);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
286
198
|
|
|
287
199
|
get actorType(): string | undefined {
|
|
288
200
|
return this.actorTypeValue;
|
|
@@ -323,19 +235,31 @@ export class ZLinkActorRuntimeState {
|
|
|
323
235
|
}
|
|
324
236
|
|
|
325
237
|
get boundSessionBindingGeneration(): bigint {
|
|
326
|
-
return this.
|
|
238
|
+
return this.boundSessionValue?.bindingGeneration ?? 0n;
|
|
327
239
|
}
|
|
328
240
|
|
|
329
241
|
get entryNodeRid(): RoutingId | undefined {
|
|
330
242
|
return this.entryNodeRidValue;
|
|
331
243
|
}
|
|
332
244
|
|
|
333
|
-
|
|
334
|
-
|
|
245
|
+
/** The one current Session binding of this Actor (Session–Actor binding §6). */
|
|
246
|
+
get boundSession(): ZLinkRemoteBoundSessionTarget | undefined {
|
|
247
|
+
return this.boundSessionValue;
|
|
335
248
|
}
|
|
336
249
|
|
|
337
|
-
|
|
338
|
-
|
|
250
|
+
/**
|
|
251
|
+
* The current binding when its Session owner is another node. A same-node
|
|
252
|
+
* binding is served by the local Session registry, so remote routing sees
|
|
253
|
+
* no target for it.
|
|
254
|
+
*/
|
|
255
|
+
get remoteBoundSessionTarget(): ZLinkRemoteBoundSessionTarget | undefined {
|
|
256
|
+
const binding = this.boundSessionValue;
|
|
257
|
+
const actorNodeRid = this.nativeActorRefValue?.nodeRid;
|
|
258
|
+
return binding?.sessionNodeRid !== undefined &&
|
|
259
|
+
actorNodeRid !== undefined &&
|
|
260
|
+
routingIdsEqual(binding.sessionNodeRid, toFrameworkRoutingId(actorNodeRid))
|
|
261
|
+
? undefined
|
|
262
|
+
: binding;
|
|
339
263
|
}
|
|
340
264
|
|
|
341
265
|
get remoteActorPacketTarget(): ZLinkRemoteActorPacketTarget | undefined {
|
|
@@ -559,24 +483,6 @@ export class ZLinkActorRuntimeState {
|
|
|
559
483
|
this.entryNodeRidValue ??= toFrameworkRoutingId(actorRef.nodeRid);
|
|
560
484
|
}
|
|
561
485
|
|
|
562
|
-
setBoundSessionBindingGeneration(generation: bigint): void {
|
|
563
|
-
if (generation > this.boundSessionBindingGenerationValue) {
|
|
564
|
-
this.boundSessionBindingGenerationValue = generation;
|
|
565
|
-
if (this.remoteBoundSessionTargetValue !== undefined) {
|
|
566
|
-
this.remoteBoundSessionTargetValue = {
|
|
567
|
-
...this.remoteBoundSessionTargetValue,
|
|
568
|
-
bindingGeneration: generation
|
|
569
|
-
};
|
|
570
|
-
}
|
|
571
|
-
if (this.boundSessionTransferTargetValue !== undefined) {
|
|
572
|
-
this.boundSessionTransferTargetValue = {
|
|
573
|
-
...this.boundSessionTransferTargetValue,
|
|
574
|
-
bindingGeneration: generation
|
|
575
|
-
};
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
486
|
/** @internal Installs one authority-confirmed binding inside its Actor owner turn. */
|
|
581
487
|
installBoundSessionBinding(target: ZLinkRemoteBoundSessionTarget): boolean {
|
|
582
488
|
if (
|
|
@@ -587,34 +493,22 @@ export class ZLinkActorRuntimeState {
|
|
|
587
493
|
target.sessionOwnerLeaseGeneration === undefined ||
|
|
588
494
|
target.bindingGeneration === undefined
|
|
589
495
|
) {
|
|
590
|
-
throw new TypeError(
|
|
591
|
-
'An installed bound Session target requires its complete binding identity.'
|
|
592
|
-
);
|
|
496
|
+
throw new TypeError('An installed bound Session target requires its binding identity.');
|
|
593
497
|
}
|
|
594
|
-
const current =
|
|
595
|
-
this.remoteBoundSessionTargetValue,
|
|
596
|
-
this.boundSessionTransferTargetValue
|
|
597
|
-
);
|
|
498
|
+
const current = this.boundSessionValue;
|
|
598
499
|
if (current !== undefined && sameRemoteSessionOwnerLifecycle(current, target)) {
|
|
599
|
-
// A duplicate command for the exact physical Session
|
|
600
|
-
//
|
|
601
|
-
//
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
current.bindingGeneration
|
|
605
|
-
|
|
606
|
-
)
|
|
607
|
-
return false;
|
|
500
|
+
// A duplicate or late older command for the exact physical Session
|
|
501
|
+
// leaves the current binding; a newer generation of the same Session
|
|
502
|
+
// replaces it. A different Session in the same owner lifecycle must
|
|
503
|
+
// advance that lifecycle's generation; a late equal/lower one is stale.
|
|
504
|
+
const advances =
|
|
505
|
+
current.bindingGeneration === undefined ||
|
|
506
|
+
target.bindingGeneration > current.bindingGeneration;
|
|
507
|
+
if (!advances) return sameRemoteSessionOwner(current, target);
|
|
608
508
|
}
|
|
609
|
-
const installed = mergeRemoteBoundSessionTarget(target, current);
|
|
610
509
|
// Binding generations are scoped to a Session-owner lifecycle. A restarted
|
|
611
510
|
// owner can legitimately reset its counter below the predecessor value.
|
|
612
|
-
this.
|
|
613
|
-
this.remoteBoundSessionTargetValue = undefined;
|
|
614
|
-
this.boundSessionTransferTargetValue = {
|
|
615
|
-
...installed,
|
|
616
|
-
bindingGeneration: target.bindingGeneration
|
|
617
|
-
};
|
|
511
|
+
this.boundSessionValue = boundSessionIdentity(target);
|
|
618
512
|
return true;
|
|
619
513
|
}
|
|
620
514
|
|
|
@@ -628,75 +522,18 @@ export class ZLinkActorRuntimeState {
|
|
|
628
522
|
target.sessionOwnerLeaseGeneration === undefined ||
|
|
629
523
|
target.bindingGeneration === undefined
|
|
630
524
|
) {
|
|
631
|
-
throw new TypeError('A retired bound Session target requires its
|
|
525
|
+
throw new TypeError('A retired bound Session target requires its binding identity.');
|
|
632
526
|
}
|
|
633
|
-
|
|
634
|
-
if (
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
) {
|
|
638
|
-
this.remoteBoundSessionTargetValue = undefined;
|
|
639
|
-
retired = true;
|
|
640
|
-
}
|
|
641
|
-
if (
|
|
642
|
-
this.boundSessionTransferTargetValue !== undefined &&
|
|
643
|
-
sameRemoteSessionBinding(this.boundSessionTransferTargetValue, target)
|
|
644
|
-
) {
|
|
645
|
-
this.boundSessionTransferTargetValue = undefined;
|
|
646
|
-
retired = true;
|
|
647
|
-
}
|
|
648
|
-
if (retired) {
|
|
649
|
-
this.boundSessionBindingGenerationValue =
|
|
650
|
-
preferredRemoteBoundSessionTarget(
|
|
651
|
-
this.remoteBoundSessionTargetValue,
|
|
652
|
-
this.boundSessionTransferTargetValue
|
|
653
|
-
)?.bindingGeneration ?? 0n;
|
|
654
|
-
}
|
|
655
|
-
return retired;
|
|
527
|
+
const current = this.boundSessionValue;
|
|
528
|
+
if (current === undefined || !sameRemoteSessionBinding(current, target)) return false;
|
|
529
|
+
this.boundSessionValue = undefined;
|
|
530
|
+
return true;
|
|
656
531
|
}
|
|
657
532
|
|
|
658
533
|
setEntryNodeRid(entryNodeRid: RoutingId): void {
|
|
659
534
|
this.entryNodeRidValue = entryNodeRid;
|
|
660
535
|
}
|
|
661
536
|
|
|
662
|
-
setRemoteBoundSessionTarget(target: ZLinkRemoteBoundSessionTarget | undefined): void {
|
|
663
|
-
const current = preferredRemoteBoundSessionTarget(
|
|
664
|
-
this.remoteBoundSessionTargetValue,
|
|
665
|
-
this.boundSessionTransferTargetValue
|
|
666
|
-
);
|
|
667
|
-
const merged =
|
|
668
|
-
target === undefined ? undefined : mergeRemoteBoundSessionTarget(target, current);
|
|
669
|
-
const bindingGeneration = maxBindingGeneration(
|
|
670
|
-
merged?.bindingGeneration,
|
|
671
|
-
this.remoteBoundSessionTargetValue?.bindingGeneration,
|
|
672
|
-
this.boundSessionBindingGenerationValue
|
|
673
|
-
);
|
|
674
|
-
this.remoteBoundSessionTargetValue =
|
|
675
|
-
merged === undefined
|
|
676
|
-
? undefined
|
|
677
|
-
: bindingGeneration === undefined
|
|
678
|
-
? merged
|
|
679
|
-
: { ...merged, bindingGeneration };
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
setBoundSessionTransferTarget(target: ZLinkRemoteBoundSessionTarget | undefined): void {
|
|
683
|
-
const merged =
|
|
684
|
-
target === undefined
|
|
685
|
-
? undefined
|
|
686
|
-
: mergeRemoteBoundSessionTarget(target, this.boundSessionTransferTargetValue);
|
|
687
|
-
const bindingGeneration = maxBindingGeneration(
|
|
688
|
-
merged?.bindingGeneration,
|
|
689
|
-
this.boundSessionTransferTargetValue?.bindingGeneration,
|
|
690
|
-
this.boundSessionBindingGenerationValue
|
|
691
|
-
);
|
|
692
|
-
this.boundSessionTransferTargetValue =
|
|
693
|
-
merged === undefined
|
|
694
|
-
? undefined
|
|
695
|
-
: bindingGeneration === undefined
|
|
696
|
-
? merged
|
|
697
|
-
: { ...merged, bindingGeneration };
|
|
698
|
-
}
|
|
699
|
-
|
|
700
537
|
setRemoteActorPacketTarget(target: ZLinkRemoteActorPacketTarget | undefined): void {
|
|
701
538
|
this.remoteActorPacketTargetValue = target;
|
|
702
539
|
}
|
|
@@ -737,10 +574,8 @@ export class ZLinkActorRuntimeState {
|
|
|
737
574
|
this.spotGenerationValue = undefined;
|
|
738
575
|
this.spotMembershipEpochValue = 0n;
|
|
739
576
|
this.nativeActorRefValue = undefined;
|
|
740
|
-
this.boundSessionBindingGenerationValue = 0n;
|
|
741
577
|
this.entryNodeRidValue = undefined;
|
|
742
|
-
this.
|
|
743
|
-
this.boundSessionTransferTargetValue = undefined;
|
|
578
|
+
this.boundSessionValue = undefined;
|
|
744
579
|
this.remoteActorPacketTargetValue = undefined;
|
|
745
580
|
this.createRequestPayloadValue = undefined;
|
|
746
581
|
this.ownsLocationValue = false;
|
|
@@ -753,11 +588,6 @@ export class ZLinkActorRuntimeState {
|
|
|
753
588
|
|
|
754
589
|
prepareForRemoteReentry(): void {
|
|
755
590
|
if (this.remoteActorPacketTargetValue === undefined) return;
|
|
756
|
-
const relocationTransferTarget =
|
|
757
|
-
this.boundSessionTransferTargetValue !== undefined &&
|
|
758
|
-
hasRelocationFence(this.boundSessionTransferTargetValue)
|
|
759
|
-
? this.boundSessionTransferTargetValue
|
|
760
|
-
: undefined;
|
|
761
591
|
this.creationTask = undefined;
|
|
762
592
|
this.configured = false;
|
|
763
593
|
this.context = undefined;
|
|
@@ -766,9 +596,8 @@ export class ZLinkActorRuntimeState {
|
|
|
766
596
|
this.spotValue = undefined;
|
|
767
597
|
this.spotIdValue = undefined;
|
|
768
598
|
this.nativeActorRefValue = undefined;
|
|
769
|
-
|
|
770
|
-
this.
|
|
771
|
-
this.boundSessionTransferTargetValue = relocationTransferTarget;
|
|
599
|
+
// The arriving relocation installs the binding it carries.
|
|
600
|
+
this.boundSessionValue = undefined;
|
|
772
601
|
this.remoteActorPacketTargetValue = undefined;
|
|
773
602
|
this.createRequestPayloadValue = undefined;
|
|
774
603
|
this.ownsLocationValue = false;
|
|
@@ -780,13 +609,22 @@ export class ZLinkActorRuntimeState {
|
|
|
780
609
|
}
|
|
781
610
|
}
|
|
782
611
|
|
|
783
|
-
function
|
|
784
|
-
let
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
612
|
+
function guardBoundSessionTargetWrites(actor: ZLinkActorRuntimeState): void {
|
|
613
|
+
let current: ZLinkRemoteBoundSessionTarget | undefined;
|
|
614
|
+
Object.defineProperty(actor, 'boundSessionValue', {
|
|
615
|
+
configurable: true,
|
|
616
|
+
enumerable: true,
|
|
617
|
+
get: () => current,
|
|
618
|
+
set: (target: ZLinkRemoteBoundSessionTarget | undefined) => {
|
|
619
|
+
if (
|
|
620
|
+
target !== undefined &&
|
|
621
|
+
new Error().stack?.includes('installBoundSessionBinding') !== true
|
|
622
|
+
) {
|
|
623
|
+
throw new Error('Bound Session target must be installed by installBoundSessionBinding.');
|
|
624
|
+
}
|
|
625
|
+
current = target;
|
|
626
|
+
}
|
|
627
|
+
});
|
|
790
628
|
}
|
|
791
629
|
|
|
792
630
|
export function toFrameworkRoutingId(routingId: unknown): RoutingId {
|