@zlink-systems/framework 0.21.0 → 0.23.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/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -0
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -1
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +28 -22
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-join-deferred-scope.d.ts +0 -1
- package/dist/runtime/actors/actor-join-deferred-scope.js +0 -18
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +160 -130
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/contracts/index.d.ts +1 -0
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +3 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +134 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +12 -20
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +46 -42
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -0
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -39
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +6 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +55 -0
- package/dist/runtime/diagnostics/flow-context.d.ts +2 -1
- package/dist/runtime/diagnostics/flow-context.js +2 -2
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +58 -42
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -27
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +4 -2
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +169 -144
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +1 -0
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +4 -0
- package/dist/runtime/foundation/service-stateful-runtime.js +461 -439
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -0
- package/dist/runtime/foundation/service-topology-registry.js +105 -96
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +245 -228
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +20 -18
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +209 -220
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +2 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +29 -21
- package/dist/runtime/spots/spot-actor-packet-drain.js +14 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +79 -86
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +17 -15
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +2 -3
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +6 -6
- package/dist/runtime/spots/spot-timer.js +26 -30
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +21 -8
- package/dist/runtime/streams/actor-session-binding-registry.js +168 -148
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +20 -17
- package/dist/runtime/streams/bound-session-response-target.js +8 -1
- package/dist/runtime/streams/bound-session-service.d.ts +1 -0
- package/dist/runtime/streams/bound-session-service.js +14 -12
- package/dist/runtime/streams/index.js +28 -20
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +52 -31
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.d.ts +5 -1
- package/dist/runtime/streams/protocol.js +68 -20
- package/dist/runtime/streams/session-actor-coordinator.js +37 -41
- package/dist/runtime/streams/session-context.d.ts +9 -2
- package/dist/runtime/streams/session-context.js +50 -32
- package/dist/runtime/streams/session-local-actors.d.ts +3 -1
- package/dist/runtime/streams/session-local-actors.js +17 -2
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.d.ts +1 -1
- package/dist/runtime/streams/stream-frame-factory.js +14 -7
- package/dist/runtime/streams/stream-session-runtime.js +112 -78
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +3 -3
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +2 -2
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +142 -134
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +1 -32
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +353 -326
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +77 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +370 -390
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +44 -44
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +218 -206
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +12 -47
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/dispatch-error-details.ts +62 -0
- package/src/runtime/diagnostics/flow-context.ts +18 -7
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +107 -79
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -55
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +364 -396
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1233 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +170 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +19 -18
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +595 -564
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +196 -148
- package/src/runtime/spots/spot-actor-packet-drain.ts +56 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +235 -222
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +129 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +13 -18
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +58 -47
- package/src/runtime/spots/spot-timer.ts +103 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +421 -292
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +8 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +60 -50
- package/src/runtime/streams/bound-session-response-target.ts +39 -9
- package/src/runtime/streams/bound-session-service.ts +52 -42
- package/src/runtime/streams/index.ts +183 -100
- package/src/runtime/streams/managed-stream.ts +123 -90
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +115 -46
- package/src/runtime/streams/session-actor-coordinator.ts +109 -93
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +96 -51
- package/src/runtime/streams/session-local-actors.ts +19 -3
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +59 -40
- package/src/runtime/streams/stream-session-runtime.ts +317 -214
- package/src/runtime/workers/index.ts +68 -29
|
@@ -12,6 +12,7 @@ const actor_lifecycle_snapshot_1 = require("./actor-lifecycle-snapshot");
|
|
|
12
12
|
const operation_identity_1 = require("../foundation/operation-identity");
|
|
13
13
|
const actor_join_deferred_scope_1 = require("./actor-join-deferred-scope");
|
|
14
14
|
const execution_1 = require("../execution");
|
|
15
|
+
const dispatch_error_details_1 = require("../diagnostics/dispatch-error-details");
|
|
15
16
|
exports.ZLINK_ACTOR_JOIN_ENTRY_SPOT_RUNTIME = Symbol('zlink.actor.join-entry-spot-runtime');
|
|
16
17
|
class DefaultZLinkActorContext {
|
|
17
18
|
state;
|
|
@@ -154,7 +155,6 @@ class DefaultZLinkActorJoinSpotCall {
|
|
|
154
155
|
};
|
|
155
156
|
try {
|
|
156
157
|
(0, actor_join_deferred_scope_1.deferActorJoin)({
|
|
157
|
-
requestBytes: requestMessage.data().byteLength,
|
|
158
158
|
prepare: async () => {
|
|
159
159
|
if (prepared)
|
|
160
160
|
return;
|
|
@@ -179,14 +179,17 @@ class DefaultZLinkActorJoinSpotCall {
|
|
|
179
179
|
execute: async () => {
|
|
180
180
|
let result;
|
|
181
181
|
try {
|
|
182
|
-
const pending = pendingJoin ??
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
182
|
+
const pending = pendingJoin ??
|
|
183
|
+
this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
|
|
184
|
+
result =
|
|
185
|
+
this.turn === undefined
|
|
186
|
+
? await pending
|
|
187
|
+
: await this.turn.yieldFrameworkPromise(pending);
|
|
186
188
|
}
|
|
187
189
|
catch (error) {
|
|
188
190
|
this.state.endDeferredJoin();
|
|
189
|
-
await this.coordinator
|
|
191
|
+
await this.coordinator
|
|
192
|
+
.abortDeferredJoin?.(this.actor, this.state, operationId)
|
|
190
193
|
.catch(() => undefined);
|
|
191
194
|
await notifyJoinFailure(this.actor, operationId, error, this.coordinator);
|
|
192
195
|
return;
|
|
@@ -195,10 +198,10 @@ class DefaultZLinkActorJoinSpotCall {
|
|
|
195
198
|
deadline.close();
|
|
196
199
|
requestMessage.close();
|
|
197
200
|
}
|
|
198
|
-
if (!result.accepted
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
if (!result.accepted ||
|
|
202
|
+
sourceNodeRid === undefined ||
|
|
203
|
+
result.actor === undefined ||
|
|
204
|
+
String(sourceNodeRid) === String(result.actor.nodeRid)) {
|
|
202
205
|
await notifyJoinCompletion(this.actor, operationId, result, this.messageSerializers);
|
|
203
206
|
}
|
|
204
207
|
else {
|
|
@@ -277,7 +280,6 @@ class DefaultZLinkActorJoinEntrySpotCall {
|
|
|
277
280
|
};
|
|
278
281
|
try {
|
|
279
282
|
(0, actor_join_deferred_scope_1.deferActorJoin)({
|
|
280
|
-
requestBytes: requestMessage.data().byteLength,
|
|
281
283
|
prepare: async () => {
|
|
282
284
|
if (prepared)
|
|
283
285
|
return;
|
|
@@ -299,14 +301,17 @@ class DefaultZLinkActorJoinEntrySpotCall {
|
|
|
299
301
|
execute: async () => {
|
|
300
302
|
let result;
|
|
301
303
|
try {
|
|
302
|
-
const pending = pendingJoin ??
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
304
|
+
const pending = pendingJoin ??
|
|
305
|
+
this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
|
|
306
|
+
result =
|
|
307
|
+
this.turn === undefined
|
|
308
|
+
? await pending
|
|
309
|
+
: await this.turn.yieldFrameworkPromise(pending);
|
|
306
310
|
}
|
|
307
311
|
catch (error) {
|
|
308
312
|
this.state.endDeferredJoin();
|
|
309
|
-
await this.coordinator
|
|
313
|
+
await this.coordinator
|
|
314
|
+
.abortDeferredJoin?.(this.actor, this.state, operationId)
|
|
310
315
|
.catch(() => undefined);
|
|
311
316
|
await notifyJoinFailure(this.actor, operationId, error, this.coordinator);
|
|
312
317
|
return;
|
|
@@ -315,10 +320,10 @@ class DefaultZLinkActorJoinEntrySpotCall {
|
|
|
315
320
|
deadline.close();
|
|
316
321
|
requestMessage.close();
|
|
317
322
|
}
|
|
318
|
-
if (!result.accepted
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
323
|
+
if (!result.accepted ||
|
|
324
|
+
sourceNodeRid === undefined ||
|
|
325
|
+
result.actor === undefined ||
|
|
326
|
+
String(sourceNodeRid) === String(result.actor.nodeRid)) {
|
|
322
327
|
await notifyJoinCompletion(this.actor, operationId, result, this.messageSerializers);
|
|
323
328
|
}
|
|
324
329
|
else {
|
|
@@ -430,6 +435,7 @@ async function notifyJoinFailure(actor, operationId, error, coordinator) {
|
|
|
430
435
|
// The completion carries only an error kind, so trace the cause on the
|
|
431
436
|
// message flow under the same flow id as the Join that produced it.
|
|
432
437
|
const tracePoint = coordinator?.messageFlow?.()?.begin(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Error);
|
|
438
|
+
const errorDetails = tracePoint === undefined ? undefined : (0, dispatch_error_details_1.dispatchErrorDetails)(error);
|
|
433
439
|
tracePoint?.trace({
|
|
434
440
|
outcome: ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Error,
|
|
435
441
|
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.SpotActor,
|
|
@@ -438,8 +444,8 @@ async function notifyJoinFailure(actor, operationId, error, coordinator) {
|
|
|
438
444
|
actorId: actor.context.actorId,
|
|
439
445
|
errorReason: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerException,
|
|
440
446
|
errorAction: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError,
|
|
441
|
-
errorType:
|
|
442
|
-
errorMessage:
|
|
447
|
+
errorType: errorDetails?.errorType,
|
|
448
|
+
errorMessage: errorDetails?.errorMessage
|
|
443
449
|
});
|
|
444
450
|
await actor.onJoinCompleted?.({
|
|
445
451
|
status: 'failed',
|
|
@@ -93,9 +93,10 @@ class ZLinkActorCreationCoordinator {
|
|
|
93
93
|
}
|
|
94
94
|
let response;
|
|
95
95
|
try {
|
|
96
|
-
response =
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
response =
|
|
97
|
+
nodeRid === undefined
|
|
98
|
+
? { accepted: true }
|
|
99
|
+
: ((await this.options.actorCreatedNotifier?.(nodeRid, actor, createRequest.callbackRequest, signal)) ?? { accepted: true });
|
|
99
100
|
}
|
|
100
101
|
catch (error) {
|
|
101
102
|
await this.discardStagingActor(state, nativeActorNode);
|
|
@@ -46,7 +46,8 @@ class ZLinkActorHandoffCoordinator {
|
|
|
46
46
|
replyRoutes = new Map();
|
|
47
47
|
constructor(options) {
|
|
48
48
|
this.options = options;
|
|
49
|
-
this.messageFollowDurationMs =
|
|
49
|
+
this.messageFollowDurationMs =
|
|
50
|
+
options.messageFollowDurationMs ?? exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS;
|
|
50
51
|
}
|
|
51
52
|
begin(actorId, oldGeneration) {
|
|
52
53
|
this.startHandoff(actorId, oldGeneration, { phase: 'relocating' });
|
|
@@ -62,10 +63,12 @@ class ZLinkActorHandoffCoordinator {
|
|
|
62
63
|
throw new Error(`Actor '${actorId}' handoff requires a positive source ObjectGeneration.`);
|
|
63
64
|
}
|
|
64
65
|
const source = this.options.requestSource(actorId);
|
|
65
|
-
if (source.meshName.length === 0 ||
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
if (source.meshName.length === 0 ||
|
|
67
|
+
source.ownerId.length === 0 ||
|
|
68
|
+
source.ownerLeaseGeneration <= 0n ||
|
|
69
|
+
source.nodeRid.length === 0 ||
|
|
70
|
+
source.nodeGeneration <= 0n ||
|
|
71
|
+
source.authorityOwnerGeneration <= 0n) {
|
|
69
72
|
throw new Error(`Actor '${actorId}' handoff requires an exact source owner fence.`);
|
|
70
73
|
}
|
|
71
74
|
if (source.objectGeneration !== oldGeneration) {
|
|
@@ -85,8 +88,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
85
88
|
ownerId: source.ownerId,
|
|
86
89
|
ownerLeaseGeneration: source.ownerLeaseGeneration,
|
|
87
90
|
nodeRid: sourceOwner.nodeRid,
|
|
88
|
-
nodeRidHex: sourceOwner.nodeRidHex
|
|
89
|
-
?? (0, routing_id_1.encodeRoutingIdStorageHex)(sourceOwner.nodeRid),
|
|
91
|
+
nodeRidHex: sourceOwner.nodeRidHex ?? (0, routing_id_1.encodeRoutingIdStorageHex)(sourceOwner.nodeRid),
|
|
90
92
|
nodeGeneration: source.nodeGeneration,
|
|
91
93
|
authorityOwnerGeneration: source.authorityOwnerGeneration
|
|
92
94
|
});
|
|
@@ -195,7 +197,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
195
197
|
void start.then(() => {
|
|
196
198
|
release.startOpen = true;
|
|
197
199
|
this.finishPrefixReleaseIfIdle(actorId, handoff, release);
|
|
198
|
-
}, error => {
|
|
200
|
+
}, (error) => {
|
|
199
201
|
release.startOpen = true;
|
|
200
202
|
if (handoff.pending.length === 0)
|
|
201
203
|
release.errors.push(error);
|
|
@@ -222,7 +224,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
222
224
|
const pending = handoff.pending.slice(begin, end);
|
|
223
225
|
let admitted;
|
|
224
226
|
try {
|
|
225
|
-
admitted = release.queue(pending.map(record => this.createPrefixRecord(record, release)));
|
|
227
|
+
admitted = release.queue(pending.map((record) => this.createPrefixRecord(record, release)));
|
|
226
228
|
}
|
|
227
229
|
catch (error) {
|
|
228
230
|
this.failUnqueuedPrefix(handoff, release, error);
|
|
@@ -230,7 +232,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
230
232
|
}
|
|
231
233
|
release.cursor = end;
|
|
232
234
|
release.inFlight += 1;
|
|
233
|
-
void admitted.terminal.then(() => this.completePrefixBatch(actorId, handoff, release), error => {
|
|
235
|
+
void admitted.terminal.then(() => this.completePrefixBatch(actorId, handoff, release), (error) => {
|
|
234
236
|
release.errors.push(error);
|
|
235
237
|
this.completePrefixBatch(actorId, handoff, release);
|
|
236
238
|
});
|
|
@@ -291,9 +293,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
291
293
|
this.finishPrefixReleaseIfIdle(actorId, handoff, release);
|
|
292
294
|
}
|
|
293
295
|
finishPrefixReleaseIfIdle(actorId, handoff, release) {
|
|
294
|
-
if (!release.startOpen
|
|
295
|
-
|| release.inFlight !== 0
|
|
296
|
-
|| release.cursor !== handoff.pending.length)
|
|
296
|
+
if (!release.startOpen || release.inFlight !== 0 || release.cursor !== handoff.pending.length)
|
|
297
297
|
return;
|
|
298
298
|
if (handoff.prefixRelease === release)
|
|
299
299
|
handoff.prefixRelease = undefined;
|
|
@@ -413,14 +413,14 @@ class ZLinkActorHandoffCoordinator {
|
|
|
413
413
|
}
|
|
414
414
|
capture(actorId, parts, returnResponse = false, remoteBoundSessionTarget, fallbackActorRef, deadlineUnixMs, messageFollowOrigin, provisionalReplay) {
|
|
415
415
|
const incomingContext = (0, actor_message_follow_context_1.actorMessageFollowContext)(fallbackActorRef);
|
|
416
|
-
const originalDeadlineUnixMs = deadlineUnixMs
|
|
417
|
-
?? incomingContext?.deadlineUnixMs
|
|
418
|
-
?? packetDeadlineUnixMs(parts);
|
|
416
|
+
const originalDeadlineUnixMs = deadlineUnixMs ?? incomingContext?.deadlineUnixMs ?? packetDeadlineUnixMs(parts);
|
|
419
417
|
const handoff = this.active.get(actorId);
|
|
420
418
|
if (handoff !== undefined) {
|
|
421
419
|
if (parts.length < 2)
|
|
422
420
|
return Promise.resolve(undefined);
|
|
423
|
-
if (handoff.connectionBoundSealed &&
|
|
421
|
+
if (handoff.connectionBoundSealed &&
|
|
422
|
+
!returnResponse &&
|
|
423
|
+
remoteBoundSessionTarget !== undefined) {
|
|
424
424
|
// The Session route seal already fixed the accepted high water. A
|
|
425
425
|
// send whose lifetime is only the Session connection can no longer
|
|
426
426
|
// drain here and must never enter the durable frozen journal, so the
|
|
@@ -430,7 +430,8 @@ class ZLinkActorHandoffCoordinator {
|
|
|
430
430
|
if (handoff.phase === 'provisional' && handoff.replay === undefined) {
|
|
431
431
|
handoff.replay = provisionalReplay;
|
|
432
432
|
}
|
|
433
|
-
const context = incomingContext ??
|
|
433
|
+
const context = incomingContext ??
|
|
434
|
+
this.createInitialIngressContext(handoff.sourceOwner, handoff.oldGeneration, parts, returnResponse, originalDeadlineUnixMs);
|
|
434
435
|
try {
|
|
435
436
|
this.validateContext(actorId, context, parts, returnResponse, fallbackActorRef);
|
|
436
437
|
}
|
|
@@ -499,13 +500,13 @@ class ZLinkActorHandoffCoordinator {
|
|
|
499
500
|
}
|
|
500
501
|
const followRoute = this.findMessageFollowRoute(actorId, incomingContext);
|
|
501
502
|
const staleGeneration = fallbackActorRef?.objectGeneration;
|
|
502
|
-
if (fallbackActorRef !== undefined
|
|
503
|
-
|
|
503
|
+
if (fallbackActorRef !== undefined &&
|
|
504
|
+
this.options.isCurrentActorRef?.(actorId, fallbackActorRef) === true) {
|
|
504
505
|
if (incomingContext !== undefined) {
|
|
505
506
|
this.validateContext(actorId, incomingContext, parts, returnResponse, fallbackActorRef);
|
|
506
507
|
const currentFence = this.options.currentOwnerFence?.(actorId);
|
|
507
|
-
if (currentFence !== undefined
|
|
508
|
-
|
|
508
|
+
if (currentFence !== undefined &&
|
|
509
|
+
!(0, actor_message_follow_context_1.messageFollowOwnerFencesEqual)(incomingContext.targetOwner, currentFence)) {
|
|
509
510
|
// A relocation round trip (A→B→A) keeps the ObjectGeneration, so a
|
|
510
511
|
// context resolved against a departed tenure still addresses this
|
|
511
512
|
// node while the current tenure holds strictly newer authority
|
|
@@ -526,18 +527,17 @@ class ZLinkActorHandoffCoordinator {
|
|
|
526
527
|
}
|
|
527
528
|
return undefined;
|
|
528
529
|
}
|
|
529
|
-
if (incomingContext === undefined
|
|
530
|
-
|
|
531
|
-
|
|
530
|
+
if (incomingContext === undefined &&
|
|
531
|
+
fallbackActorRef !== undefined &&
|
|
532
|
+
this.hasMessageFollowRouteForStaleRef(actorId, fallbackActorRef)) {
|
|
532
533
|
this.options.onMarker?.('message_follow_rejected', actorId);
|
|
533
534
|
return Promise.reject(actorLocationStale(actorId));
|
|
534
535
|
}
|
|
535
|
-
if (followRoute === undefined
|
|
536
|
-
&&
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
&& this.isKnownStaleRef(actorId, fallbackActorRef)) {
|
|
536
|
+
if (followRoute === undefined &&
|
|
537
|
+
staleGeneration !== undefined &&
|
|
538
|
+
this.staleGenerations.get(actorId)?.has(staleGeneration) === true &&
|
|
539
|
+
fallbackActorRef !== undefined &&
|
|
540
|
+
this.isKnownStaleRef(actorId, fallbackActorRef)) {
|
|
541
541
|
this.options.onMarker?.('message_follow_expired', actorId);
|
|
542
542
|
return Promise.reject(actorLocationStale(actorId));
|
|
543
543
|
}
|
|
@@ -575,8 +575,8 @@ class ZLinkActorHandoffCoordinator {
|
|
|
575
575
|
snapshotCoreBacklog(actorId) {
|
|
576
576
|
const handoff = this.requireActive(actorId);
|
|
577
577
|
let snapshotIndex = -1;
|
|
578
|
-
while (snapshotIndex + 1 < handoff.pending.length
|
|
579
|
-
|
|
578
|
+
while (snapshotIndex + 1 < handoff.pending.length &&
|
|
579
|
+
handoff.pending[snapshotIndex + 1].packet.returnResponse === false) {
|
|
580
580
|
snapshotIndex++;
|
|
581
581
|
}
|
|
582
582
|
handoff.snapshotIndex = snapshotIndex;
|
|
@@ -592,7 +592,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
592
592
|
const handoff = this.requireActive(actorId);
|
|
593
593
|
const first = handoff.snapshotIndex + 1;
|
|
594
594
|
handoff.snapshotIndex = handoff.pending.length - 1;
|
|
595
|
-
return handoff.pending.slice(first).map(entry => entry.packet);
|
|
595
|
+
return handoff.pending.slice(first).map((entry) => entry.packet);
|
|
596
596
|
}
|
|
597
597
|
complete(actorId, target, targetActorRef, results, targetOwnerFence) {
|
|
598
598
|
const handoff = this.requireActive(actorId);
|
|
@@ -630,10 +630,9 @@ class ZLinkActorHandoffCoordinator {
|
|
|
630
630
|
if (pending.packet.source !== undefined) {
|
|
631
631
|
this.removeReplyRoute(pending.packet.source.replyRouteId);
|
|
632
632
|
}
|
|
633
|
-
void this.enqueueMessageFollow(followRoute, actorId, pending.packet)
|
|
634
|
-
.then(value => {
|
|
633
|
+
void this.enqueueMessageFollow(followRoute, actorId, pending.packet).then((value) => {
|
|
635
634
|
pending.resolve?.(value);
|
|
636
|
-
}, error => {
|
|
635
|
+
}, (error) => {
|
|
637
636
|
pending.reject?.(error);
|
|
638
637
|
});
|
|
639
638
|
}
|
|
@@ -641,16 +640,15 @@ class ZLinkActorHandoffCoordinator {
|
|
|
641
640
|
messageFollowCount(actorId) {
|
|
642
641
|
return actorId === undefined
|
|
643
642
|
? this.messageFollowRoutes.size
|
|
644
|
-
: [...this.messageFollowRoutes.values()]
|
|
645
|
-
.filter(route => route.targetActorRef.actorId === actorId).length;
|
|
643
|
+
: [...this.messageFollowRoutes.values()].filter((route) => route.targetActorRef.actorId === actorId).length;
|
|
646
644
|
}
|
|
647
645
|
pendingCount(actorId) {
|
|
648
646
|
return this.active.get(actorId)?.pending.length ?? 0;
|
|
649
647
|
}
|
|
650
648
|
isKnownStale(actor) {
|
|
651
|
-
return this.messageFollowCount(actor.actorId) === 0
|
|
652
|
-
|
|
653
|
-
|
|
649
|
+
return (this.messageFollowCount(actor.actorId) === 0 &&
|
|
650
|
+
this.options.isCurrentActorRef?.(actor.actorId, actor) !== true &&
|
|
651
|
+
this.isKnownStaleRef(actor.actorId, actor));
|
|
654
652
|
}
|
|
655
653
|
recordStaleFailure(actorId) {
|
|
656
654
|
this.options.onMarker?.('message_follow_rejected', actorId);
|
|
@@ -660,10 +658,10 @@ class ZLinkActorHandoffCoordinator {
|
|
|
660
658
|
if (source === undefined || source.replyRouteId.length === 0)
|
|
661
659
|
return 'notAcknowledged';
|
|
662
660
|
const route = this.replyRoutes.get(source.replyRouteId);
|
|
663
|
-
if (route === undefined
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
661
|
+
if (route === undefined ||
|
|
662
|
+
packet.messageFollowContext.objectGeneration !==
|
|
663
|
+
route.sourceEvidence.objectGeneration.toString() ||
|
|
664
|
+
!(0, actor_message_follow_context_1.messageFollowOwnerFencesEqual)(packet.messageFollowContext.targetOwner, route.sourceOwner)) {
|
|
667
665
|
return 'notAcknowledged';
|
|
668
666
|
}
|
|
669
667
|
return this.acceptRelocatedTerminalRelay(packet.messageFollowContext.operationId, source.replyRouteId, source, result, sourceNodeRid, targetAuthorityOwnerGeneration, actorId).status;
|
|
@@ -675,14 +673,14 @@ class ZLinkActorHandoffCoordinator {
|
|
|
675
673
|
if (route === undefined)
|
|
676
674
|
return { status: 'notAcknowledged' };
|
|
677
675
|
const exactSource = source ?? route.source;
|
|
678
|
-
if (!requestSourcesEqual(route.source, exactSource)
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
676
|
+
if (!requestSourcesEqual(route.source, exactSource) ||
|
|
677
|
+
(actorId !== undefined && route.actorId !== actorId) ||
|
|
678
|
+
route.operationId !== operationId ||
|
|
679
|
+
route.targetNodeRid === undefined ||
|
|
680
|
+
!(0, routing_id_1.routingIdsEqual)(route.targetNodeRid, sourceNodeRid) ||
|
|
681
|
+
route.targetAuthorityOwnerGeneration === undefined ||
|
|
682
|
+
(targetAuthorityOwnerGeneration !== undefined &&
|
|
683
|
+
route.targetAuthorityOwnerGeneration !== targetAuthorityOwnerGeneration)) {
|
|
686
684
|
return { status: 'notAcknowledged' };
|
|
687
685
|
}
|
|
688
686
|
try {
|
|
@@ -823,8 +821,8 @@ class ZLinkActorHandoffCoordinator {
|
|
|
823
821
|
const stale = this.staleGenerations.get(actorId);
|
|
824
822
|
if (stale !== undefined) {
|
|
825
823
|
const recordedGeneration = stale.get(entry.oldGeneration);
|
|
826
|
-
if (recordedGeneration !== undefined
|
|
827
|
-
|
|
824
|
+
if (recordedGeneration !== undefined &&
|
|
825
|
+
recordedGeneration <= departedAuthorityOwnerGeneration) {
|
|
828
826
|
stale.delete(entry.oldGeneration);
|
|
829
827
|
}
|
|
830
828
|
if (stale.size === 0)
|
|
@@ -849,10 +847,10 @@ class ZLinkActorHandoffCoordinator {
|
|
|
849
847
|
return this.messageFollowRoutes.get(messageFollowRouteKey(actorId, BigInt(context.objectGeneration), context.targetOwner));
|
|
850
848
|
}
|
|
851
849
|
hasMessageFollowRouteForStaleRef(actorId, actorRef) {
|
|
852
|
-
return [...this.messageFollowRoutes.values()].some(route => route.targetActorRef.actorId === actorId
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
850
|
+
return [...this.messageFollowRoutes.values()].some((route) => route.targetActorRef.actorId === actorId &&
|
|
851
|
+
actorRef.objectGeneration === route.oldGeneration &&
|
|
852
|
+
(route.oldNodeRid === undefined ||
|
|
853
|
+
(0, routing_id_1.routingIdsEqual)(actorRef.nodeRid, (0, actor_message_follow_context_1.messageFollowOwnerNodeRid)(route.sourceOwner))));
|
|
856
854
|
}
|
|
857
855
|
createInitialIngressContext(sourceOwner, generation, parts, request, deadlineUnixMs) {
|
|
858
856
|
const operationId = (0, actor_message_follow_context_1.createMessageFollowId)();
|
|
@@ -871,15 +869,14 @@ class ZLinkActorHandoffCoordinator {
|
|
|
871
869
|
});
|
|
872
870
|
}
|
|
873
871
|
validateContext(actorId, context, parts, request, actorRef) {
|
|
874
|
-
if (actorRef !== undefined
|
|
875
|
-
|
|
872
|
+
if (actorRef !== undefined &&
|
|
873
|
+
context.objectGeneration !== actorRef.objectGeneration.toString()) {
|
|
876
874
|
throw actorGenerationStale(actorId);
|
|
877
875
|
}
|
|
878
876
|
if (context.objectGeneration === '0' || context.request !== request) {
|
|
879
877
|
throw actorLocationStale(actorId);
|
|
880
878
|
}
|
|
881
|
-
if (context.deadlineUnixMs !== undefined
|
|
882
|
-
&& Date.now() >= context.deadlineUnixMs) {
|
|
879
|
+
if (context.deadlineUnixMs !== undefined && Date.now() >= context.deadlineUnixMs) {
|
|
883
880
|
throw actorDeadlineExceeded(actorId);
|
|
884
881
|
}
|
|
885
882
|
(0, actor_message_follow_context_1.verifyActorMessageFollowPayload)(context, parts);
|
|
@@ -888,13 +885,15 @@ class ZLinkActorHandoffCoordinator {
|
|
|
888
885
|
const physicalRefs = this.staleActorRefs.get(actorId);
|
|
889
886
|
if (physicalRefs !== undefined) {
|
|
890
887
|
const departedAuthorityOwnerGeneration = physicalRefs.get(actorRefKey(actor.nodeRid, actor.objectGeneration));
|
|
891
|
-
return departedAuthorityOwnerGeneration !== undefined
|
|
892
|
-
|
|
893
|
-
}
|
|
894
|
-
const departedAuthorityOwnerGeneration = this.staleGenerations
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
888
|
+
return (departedAuthorityOwnerGeneration !== undefined &&
|
|
889
|
+
!this.isNewerTenureRef(actorId, actor, departedAuthorityOwnerGeneration));
|
|
890
|
+
}
|
|
891
|
+
const departedAuthorityOwnerGeneration = this.staleGenerations
|
|
892
|
+
.get(actorId)
|
|
893
|
+
?.get(actor.objectGeneration);
|
|
894
|
+
return (departedAuthorityOwnerGeneration !== undefined &&
|
|
895
|
+
!this.isNewerTenureRef(actorId, actor, departedAuthorityOwnerGeneration) &&
|
|
896
|
+
this.options.isStaleActorRef?.(actorId, actor) === true);
|
|
898
897
|
}
|
|
899
898
|
/**
|
|
900
899
|
* The stale record captures the departing tenure's full fence. A ref whose
|
|
@@ -921,9 +920,9 @@ class ZLinkActorHandoffCoordinator {
|
|
|
921
920
|
const context = packet.messageFollowContext;
|
|
922
921
|
const duplicate = entry.operations.get(context.operationId);
|
|
923
922
|
if (duplicate !== undefined) {
|
|
924
|
-
if (duplicate.checksum !== context.payloadChecksumSha256
|
|
925
|
-
|
|
926
|
-
|
|
923
|
+
if (duplicate.checksum !== context.payloadChecksumSha256 ||
|
|
924
|
+
duplicate.request !== context.request ||
|
|
925
|
+
duplicate.replyRouteId !== context.replyRouteId) {
|
|
927
926
|
this.options.onMarker?.('message_follow_rejected', actorId);
|
|
928
927
|
return Promise.reject(actorLocationStale(actorId));
|
|
929
928
|
}
|
|
@@ -1026,7 +1025,8 @@ class ZLinkActorHandoffCoordinator {
|
|
|
1026
1025
|
return;
|
|
1027
1026
|
let accepted = false;
|
|
1028
1027
|
try {
|
|
1029
|
-
accepted =
|
|
1028
|
+
accepted =
|
|
1029
|
+
(await this.options.onMessageFollowRelayed?.(actorId, entry.targetActorRef, context, packet.messageFollowOrigin, entry.queuedMessages, entry.queuedBytes)) === true;
|
|
1030
1030
|
}
|
|
1031
1031
|
catch {
|
|
1032
1032
|
accepted = false;
|
|
@@ -1090,9 +1090,9 @@ async function replayActorHandoffBacklog(backlog, dispatch, onEnqueued) {
|
|
|
1090
1090
|
for (const packet of backlog) {
|
|
1091
1091
|
const decoded = decodeHandoffPacket(packet);
|
|
1092
1092
|
try {
|
|
1093
|
-
if (packet.returnResponse
|
|
1094
|
-
|
|
1095
|
-
|
|
1093
|
+
if (packet.returnResponse &&
|
|
1094
|
+
packet.messageFollowContext.deadlineUnixMs !== undefined &&
|
|
1095
|
+
Date.now() >= packet.messageFollowContext.deadlineUnixMs) {
|
|
1096
1096
|
throw actorDeadlineExceeded(packet.fallbackActorRef?.actorId ?? 'accepted-handoff');
|
|
1097
1097
|
}
|
|
1098
1098
|
await onEnqueued?.(packet.index);
|
|
@@ -1104,9 +1104,7 @@ async function replayActorHandoffBacklog(backlog, dispatch, onEnqueued) {
|
|
|
1104
1104
|
index: packet.index,
|
|
1105
1105
|
ok: false,
|
|
1106
1106
|
error: error instanceof Error ? error.message : String(error),
|
|
1107
|
-
errorKind: error instanceof contracts_1.ZLinkFrameworkException
|
|
1108
|
-
? (0, framework_errors_internal_1.internalFrameworkErrorKind)(error)
|
|
1109
|
-
: undefined
|
|
1107
|
+
errorKind: error instanceof contracts_1.ZLinkFrameworkException ? (0, framework_errors_internal_1.internalFrameworkErrorKind)(error) : undefined
|
|
1110
1108
|
});
|
|
1111
1109
|
}
|
|
1112
1110
|
finally {
|
|
@@ -1213,13 +1211,13 @@ function actorRefEvidenceKey(nodeRid, nodeRidHex, generation) {
|
|
|
1213
1211
|
return `${nodeRidHex ?? (0, routing_id_1.encodeRoutingIdStorageHex)(nodeRid)}\u0000${generation}`;
|
|
1214
1212
|
}
|
|
1215
1213
|
function requestSourcesEqual(expected, actual) {
|
|
1216
|
-
return expected.replyRouteId === actual.replyRouteId
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1214
|
+
return (expected.replyRouteId === actual.replyRouteId &&
|
|
1215
|
+
expected.ownerId === actual.ownerId &&
|
|
1216
|
+
expected.ownerLeaseGeneration === actual.ownerLeaseGeneration &&
|
|
1217
|
+
expected.nodeRid === actual.nodeRid &&
|
|
1218
|
+
expected.nodeGeneration === actual.nodeGeneration &&
|
|
1219
|
+
/^[1-9][0-9]*$/.test(actual.ownerLeaseGeneration) &&
|
|
1220
|
+
/^[1-9][0-9]*$/.test(actual.nodeGeneration));
|
|
1223
1221
|
}
|
|
1224
1222
|
function terminalRequestSource(route) {
|
|
1225
1223
|
return Object.freeze({
|
|
@@ -1243,10 +1241,9 @@ function actorMoving(actorId) {
|
|
|
1243
1241
|
return (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorMoving, `Actor '${actorId}' bound-session send arrived after its Session route seal.`, true);
|
|
1244
1242
|
}
|
|
1245
1243
|
function actorRelayError(actorId, errorKind, error) {
|
|
1246
|
-
const kind = Object.values(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind)
|
|
1247
|
-
.includes(errorKind)
|
|
1244
|
+
const kind = Object.values(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind).includes(errorKind)
|
|
1248
1245
|
? errorKind
|
|
1249
1246
|
: framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed;
|
|
1250
|
-
return (0, framework_errors_internal_1.createInternalFrameworkException)(kind, String(error ?? `Actor Message Follow relay failed for '${actorId}'.`), kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorMoving
|
|
1251
|
-
|
|
1247
|
+
return (0, framework_errors_internal_1.createInternalFrameworkException)(kind, String(error ?? `Actor Message Follow relay failed for '${actorId}'.`), kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorMoving ||
|
|
1248
|
+
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected);
|
|
1252
1249
|
}
|
|
@@ -2,15 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.deferActorJoin = deferActorJoin;
|
|
4
4
|
exports.runActorHandlerWithDeferredJoins = runActorHandlerWithDeferredJoins;
|
|
5
|
-
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
6
5
|
const node_async_hooks_1 = require("node:async_hooks");
|
|
7
6
|
const configuration_1 = require("../configuration");
|
|
8
|
-
const MAX_DEFERRED_JOINS = 64;
|
|
9
|
-
const MAX_DEFERRED_JOIN_REQUEST_BYTES = 1024 * 1024;
|
|
10
|
-
const MAX_DEFERRED_JOIN_BYTES = 8 * 1024 * 1024;
|
|
11
7
|
class ActorJoinRegistrationScope {
|
|
12
8
|
intents = [];
|
|
13
|
-
totalBytes = 0;
|
|
14
9
|
open = true;
|
|
15
10
|
prepared = false;
|
|
16
11
|
// Ledger 2.3: a deferred join runs in registration order right after the
|
|
@@ -21,20 +16,7 @@ class ActorJoinRegistrationScope {
|
|
|
21
16
|
discardWithoutWaiting(intent);
|
|
22
17
|
throw new configuration_1.ZLinkConfigurationException('Actor join defer requires an open Framework actor handler scope.');
|
|
23
18
|
}
|
|
24
|
-
if (this.intents.length >= MAX_DEFERRED_JOINS) {
|
|
25
|
-
discardWithoutWaiting(intent);
|
|
26
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidConfiguration, `An actor handler may defer at most ${MAX_DEFERRED_JOINS} joins.`);
|
|
27
|
-
}
|
|
28
|
-
if (intent.requestBytes > MAX_DEFERRED_JOIN_REQUEST_BYTES) {
|
|
29
|
-
discardWithoutWaiting(intent);
|
|
30
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidConfiguration, `A deferred actor join request may use at most ${MAX_DEFERRED_JOIN_REQUEST_BYTES} bytes.`);
|
|
31
|
-
}
|
|
32
|
-
if (this.totalBytes + intent.requestBytes > MAX_DEFERRED_JOIN_BYTES) {
|
|
33
|
-
discardWithoutWaiting(intent);
|
|
34
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidConfiguration, `Deferred actor join requests may use at most ${MAX_DEFERRED_JOIN_BYTES} bytes per handler.`);
|
|
35
|
-
}
|
|
36
19
|
this.intents.push(intent);
|
|
37
|
-
this.totalBytes += intent.requestBytes;
|
|
38
20
|
}
|
|
39
21
|
sealAfterHandlerTerminal() {
|
|
40
22
|
this.open = false;
|
|
@@ -31,8 +31,7 @@ class ZLinkLocalNativeActorJoin {
|
|
|
31
31
|
}
|
|
32
32
|
const completion = await this.waitForJoinCompletion(() => node.joinActorSpot(actorRef, (0, routing_id_1.toBackendRoutingId)(target.targetNodeRid), (0, routing_id_1.toBackendRoutingId)(target.spotId), target.targetSpotGeneration, actorJoinApplicationPayload(request), timeoutMs), completions, timeoutMs, signal);
|
|
33
33
|
const control = completion.kindData;
|
|
34
|
-
if (control?.kind !== 'actorJoinCompletion' ||
|
|
35
|
-
control.actor === null) {
|
|
34
|
+
if (control?.kind !== 'actorJoinCompletion' || control.actor === null) {
|
|
36
35
|
(0, mesh_completion_table_1.closeMeshCompletion)(completion);
|
|
37
36
|
const message = `Actor join failed for '${actor.context.actorId}' with result '${completion.terminalResult}' and errno '${completion.failureErrno}'.`;
|
|
38
37
|
// Classify the (terminal, fine) pair instead of collapsing every non-OK
|
|
@@ -85,14 +84,15 @@ class ZLinkLocalNativeActorJoin {
|
|
|
85
84
|
const completions = this.requireCompletions();
|
|
86
85
|
const actorMeshName = runtimeActorMeshName(actor, state, '');
|
|
87
86
|
const targetNodeRid = spotRouteTarget?.targetNodeRid ?? nodeRid;
|
|
88
|
-
const remote = spotRouteTarget !== undefined &&
|
|
87
|
+
const remote = spotRouteTarget !== undefined &&
|
|
88
|
+
(!(0, routing_id_2.routingIdsEqual)((0, actor_runtime_state_1.toFrameworkRoutingId)(node.status().routingId), spotRouteTarget.targetNodeRid) ||
|
|
89
|
+
!(0, routing_id_2.routingIdsEqual)((0, actor_runtime_state_1.toFrameworkRoutingId)(actorRef.nodeRid), spotRouteTarget.targetNodeRid));
|
|
89
90
|
if (remote) {
|
|
90
91
|
return await this.relocateRemoteActorJoin(node, actor, state, actorRef, spotRouteTarget, request, timeoutMs, signal, completionOperationId, true);
|
|
91
92
|
}
|
|
92
93
|
const completion = await this.waitForJoinCompletion(() => node.joinActorEntrySpot(actorRef, (0, routing_id_1.toBackendRoutingId)(targetNodeRid), actorJoinApplicationPayload(request), timeoutMs), completions, timeoutMs, signal);
|
|
93
94
|
const control = completion.kindData;
|
|
94
|
-
if (control?.kind !== 'actorJoinCompletion' ||
|
|
95
|
-
control.actor === null) {
|
|
95
|
+
if (control?.kind !== 'actorJoinCompletion' || control.actor === null) {
|
|
96
96
|
(0, mesh_completion_table_1.closeMeshCompletion)(completion);
|
|
97
97
|
const message = `Actor entry SPOT join failed for '${actor.context.actorId}' with result '${completion.terminalResult}' and errno '${completion.failureErrno}'.`;
|
|
98
98
|
// Classify the (terminal, fine) pair instead of collapsing to NotFound
|
|
@@ -149,9 +149,7 @@ class ZLinkLocalNativeActorJoin {
|
|
|
149
149
|
}
|
|
150
150
|
const completions = this.requireCompletions();
|
|
151
151
|
let relocationId = (0, node_crypto_1.randomUUID)();
|
|
152
|
-
const completionOperationKey = completionOperationId === undefined
|
|
153
|
-
? undefined
|
|
154
|
-
: (0, operation_identity_1.operationIdentityKey)(completionOperationId);
|
|
152
|
+
const completionOperationKey = completionOperationId === undefined ? undefined : (0, operation_identity_1.operationIdentityKey)(completionOperationId);
|
|
155
153
|
if (completionOperationKey === relocationId) {
|
|
156
154
|
throw new Error('Actor Join OperationId must be distinct from RelocationId.');
|
|
157
155
|
}
|
|
@@ -161,8 +159,7 @@ class ZLinkLocalNativeActorJoin {
|
|
|
161
159
|
// the existing internal admission route (wire protocol §10); fabricating
|
|
162
160
|
// an Actor fence from the destination Spot would let a stale source pass
|
|
163
161
|
// receiver-side Authority-row equality.
|
|
164
|
-
const canonicalAdmission = actorAuthorityFence === undefined
|
|
165
|
-
|| !supportsCanonicalActorJoin(node, entrySpot)
|
|
162
|
+
const canonicalAdmission = actorAuthorityFence === undefined || !supportsCanonicalActorJoin(node, entrySpot)
|
|
166
163
|
? undefined
|
|
167
164
|
: {
|
|
168
165
|
request: actorJoinApplicationPayload(request),
|
|
@@ -359,19 +356,21 @@ function canonicalHandoffRelocationId(handoffId) {
|
|
|
359
356
|
if (!/^[0-9a-f]{32}$/u.test(hex) || /^0+$/u.test(hex)) {
|
|
360
357
|
throw new TypeError('Canonical Actor Join handoff id is not a non-zero 128-bit identity.');
|
|
361
358
|
}
|
|
362
|
-
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}`
|
|
363
|
-
|
|
359
|
+
return (`${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}` +
|
|
360
|
+
`-${hex.slice(16, 20)}-${hex.slice(20)}`);
|
|
364
361
|
}
|
|
365
362
|
function remoteActorJoinFailureException(node, target, terminalResult, failureErrno, message) {
|
|
366
363
|
const failure = (0, framework_errors_internal_1.wireReplyFailureException)(terminalResult, failureErrno, message);
|
|
367
364
|
const targetGeneration = target.targetNodeGeneration;
|
|
368
|
-
if (failure.kind === contracts_1.ZLinkFrameworkErrorKind.DeadlineExceeded
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
365
|
+
if (failure.kind === contracts_1.ZLinkFrameworkErrorKind.DeadlineExceeded &&
|
|
366
|
+
targetGeneration !== undefined &&
|
|
367
|
+
targetGeneration !== 0n &&
|
|
368
|
+
!node
|
|
369
|
+
.peers()
|
|
370
|
+
.some((peer) => peer.state === 3 &&
|
|
371
|
+
peer.routingId !== null &&
|
|
372
|
+
(0, routing_id_2.routingIdsEqual)(peer.routingId, target.targetNodeRid) &&
|
|
373
|
+
peer.lifecycleGeneration === targetGeneration)) {
|
|
375
374
|
return (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, 'wire Actor join target RouteMesh peer became unavailable');
|
|
376
375
|
}
|
|
377
376
|
return failure;
|