@zlink-systems/framework 0.21.0 → 0.22.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/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- 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 +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- 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 +158 -124
- 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/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.js +116 -113
- 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 +10 -18
- 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 +43 -33
- 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.js +9 -7
- 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/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- 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 -23
- 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.js +136 -136
- 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-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- 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 +244 -227
- 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/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 +208 -219
- 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.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -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 +74 -85
- 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 +16 -14
- 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 +1 -2
- 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 +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- 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.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- 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 +1 -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 +0 -1
- 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 +138 -130
- 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 +5 -4
- 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 +351 -320
- 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 +73 -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 +335 -383
- 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 +40 -42
- 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 +215 -197
- 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 +11 -8
- 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/flow-context.ts +12 -3
- 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 +95 -76
- 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 -51
- 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 +312 -385
- 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 +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -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 +1 -1
- 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 +593 -563
- 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 +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -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 +230 -221
- 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 +128 -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 +11 -17
- 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 +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- 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 +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- package/src/runtime/workers/index.ts +68 -29
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ZLinkFrameworkInternalErrorKind,
|
|
3
|
+
createInternalFrameworkException,
|
|
4
|
+
internalFrameworkErrorKind
|
|
5
|
+
} from '../framework-errors-internal';
|
|
2
6
|
import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
|
|
3
7
|
import type {
|
|
4
8
|
ActorRef,
|
|
@@ -6,10 +10,7 @@ import type {
|
|
|
6
10
|
ZLinkRouteMessageContext,
|
|
7
11
|
ZLinkSessionActor
|
|
8
12
|
} from '../../contracts';
|
|
9
|
-
import {
|
|
10
|
-
ZLinkFrameworkException,
|
|
11
|
-
ZLinkSpotKind
|
|
12
|
-
} from '../../contracts';
|
|
13
|
+
import { ZLinkFrameworkException, ZLinkSpotKind } from '../../contracts';
|
|
13
14
|
import { ZLinkConfigurationException } from '../../contracts/Configuration/ConfigurationException';
|
|
14
15
|
import type { Message } from '../../contracts/Common/Message';
|
|
15
16
|
import {
|
|
@@ -108,12 +109,15 @@ export class ZLinkActorPacketRelay {
|
|
|
108
109
|
const node = options.spotNodeRuntime()?.primaryMeshNode;
|
|
109
110
|
return node === undefined ? undefined : String(node.status().routingId);
|
|
110
111
|
},
|
|
111
|
-
spotRouterChannelIdForMesh:
|
|
112
|
-
?? ((meshName) => meshName)
|
|
112
|
+
spotRouterChannelIdForMesh:
|
|
113
|
+
spotRouterChannelIdByMesh?.call(options.meshRouters) ?? ((meshName) => meshName)
|
|
113
114
|
});
|
|
114
115
|
}
|
|
115
116
|
|
|
116
|
-
async notifyBoundActorDisconnected(
|
|
117
|
+
async notifyBoundActorDisconnected(
|
|
118
|
+
actor: ZLinkSessionActor,
|
|
119
|
+
signal?: AbortSignal
|
|
120
|
+
): Promise<void> {
|
|
117
121
|
const state = this.options.actorManager()?.getState(actor.actorId);
|
|
118
122
|
const currentRemoteBoundSessionTarget =
|
|
119
123
|
state?.spotId === undefined
|
|
@@ -124,9 +128,10 @@ export class ZLinkActorPacketRelay {
|
|
|
124
128
|
);
|
|
125
129
|
const currentRemoteActorPacketTarget =
|
|
126
130
|
state?.spotId === undefined ? undefined : state.remoteActorPacketTarget;
|
|
127
|
-
const remoteTarget =
|
|
128
|
-
??
|
|
129
|
-
??
|
|
131
|
+
const remoteTarget =
|
|
132
|
+
currentRemoteBoundSessionTarget ??
|
|
133
|
+
currentRemoteActorPacketTarget ??
|
|
134
|
+
(state?.spotId === undefined ? undefined : this.targets.cachedTargetForActor(actor));
|
|
130
135
|
if (remoteTarget !== undefined) {
|
|
131
136
|
await this.notifyRemoteActorDisconnected(actor.actorId, remoteTarget, signal, actor.ref);
|
|
132
137
|
return;
|
|
@@ -166,12 +171,13 @@ export class ZLinkActorPacketRelay {
|
|
|
166
171
|
|
|
167
172
|
async notifyActorDisconnectedById(actorId: string, signal?: AbortSignal): Promise<void> {
|
|
168
173
|
const state = this.options.actorManager()?.getState(actorId);
|
|
169
|
-
const remoteTarget =
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
174
|
+
const remoteTarget =
|
|
175
|
+
state === undefined
|
|
176
|
+
? undefined
|
|
177
|
+
: (preferredRemoteBoundSessionTarget(
|
|
178
|
+
state.remoteBoundSessionTarget,
|
|
179
|
+
state.boundSessionTransferTarget
|
|
180
|
+
) ?? state.remoteActorPacketTarget);
|
|
175
181
|
if (remoteTarget !== undefined) {
|
|
176
182
|
await this.notifyRemoteActorDisconnected(actorId, remoteTarget, signal);
|
|
177
183
|
return;
|
|
@@ -238,8 +244,10 @@ export class ZLinkActorPacketRelay {
|
|
|
238
244
|
);
|
|
239
245
|
const messageFollowContext = relay.messageFollowContext;
|
|
240
246
|
if (messageFollowContext !== undefined) {
|
|
241
|
-
if (
|
|
242
|
-
|
|
247
|
+
if (
|
|
248
|
+
messageFollowContext.deadlineUnixMs !== undefined &&
|
|
249
|
+
Date.now() >= messageFollowContext.deadlineUnixMs
|
|
250
|
+
) {
|
|
243
251
|
throw createInternalFrameworkException(
|
|
244
252
|
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
245
253
|
`Actor request '${relay.actorId}' exceeded its Message Follow deadline.`
|
|
@@ -248,39 +256,45 @@ export class ZLinkActorPacketRelay {
|
|
|
248
256
|
verifyActorMessageFollowPayload(messageFollowContext, [header, body]);
|
|
249
257
|
}
|
|
250
258
|
const relayNodeRid = relay.actorNodeRid ?? relay.bindingActorNodeRid;
|
|
251
|
-
const relayNodeRidHex =
|
|
252
|
-
? relay.bindingActorNodeRidHex
|
|
253
|
-
: relay.actorNodeRidHex;
|
|
259
|
+
const relayNodeRidHex =
|
|
260
|
+
relay.actorNodeRid === undefined ? relay.bindingActorNodeRidHex : relay.actorNodeRidHex;
|
|
254
261
|
const relayGeneration = relay.actorGeneration ?? relay.bindingActorGeneration;
|
|
255
|
-
const fallbackActorRef =
|
|
256
|
-
|| relayGeneration === undefined
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
262
|
+
const fallbackActorRef =
|
|
263
|
+
relayNodeRid === undefined || relayGeneration === undefined
|
|
264
|
+
? undefined
|
|
265
|
+
: messageFollowContext === undefined
|
|
266
|
+
? {
|
|
267
|
+
actorId: relay.actorId,
|
|
268
|
+
objectGeneration: BigInt(relayGeneration),
|
|
269
|
+
meshName: _routeContext.meshName,
|
|
270
|
+
nodeRid: decodeRoutingId(relayNodeRid, relayNodeRidHex),
|
|
271
|
+
...(relay.bindingGeneration === undefined
|
|
272
|
+
? {}
|
|
273
|
+
: { bindingGeneration: BigInt(relay.bindingGeneration) })
|
|
274
|
+
}
|
|
275
|
+
: attachActorMessageFollowContext(
|
|
276
|
+
{
|
|
277
|
+
actorId: relay.actorId,
|
|
278
|
+
objectGeneration: BigInt(relayGeneration),
|
|
279
|
+
meshName: _routeContext.meshName,
|
|
280
|
+
nodeRid: decodeRoutingId(relayNodeRid, relayNodeRidHex),
|
|
281
|
+
...(relay.bindingGeneration === undefined
|
|
282
|
+
? {}
|
|
283
|
+
: { bindingGeneration: BigInt(relay.bindingGeneration) })
|
|
284
|
+
},
|
|
285
|
+
messageFollowContext
|
|
286
|
+
);
|
|
277
287
|
if (frameHeader.name === ZLINK_REMOTE_ACTOR_SESSION_BIND_PACKET) {
|
|
278
288
|
if (frameHeader.kind !== ZLinkStreamMessageKind.Send) {
|
|
279
289
|
throw new Error('Remote actor session binding requires a send frame.');
|
|
280
290
|
}
|
|
281
|
-
const { sessionNodeRid, sessionRid } = decodeRemoteActorSessionBinding(
|
|
291
|
+
const { sessionNodeRid, sessionRid } = decodeRemoteActorSessionBinding(
|
|
292
|
+
messageToBytes(body)
|
|
293
|
+
);
|
|
282
294
|
if (!routingIdsEqual(sessionNodeRid, _routeContext.sourceNodeRid)) {
|
|
283
|
-
throw new Error(
|
|
295
|
+
throw new Error(
|
|
296
|
+
'Remote actor session binding source did not match the declared session node.'
|
|
297
|
+
);
|
|
284
298
|
}
|
|
285
299
|
const state = this.options.actorManager()?.getState(relay.actorId);
|
|
286
300
|
const actorRef = state?.nativeActorRef;
|
|
@@ -290,34 +304,45 @@ export class ZLinkActorPacketRelay {
|
|
|
290
304
|
if (this.requireSpotNodeRuntime().primaryMeshNode === undefined) {
|
|
291
305
|
throw new Error('MeshNode actor runtime is not started.');
|
|
292
306
|
}
|
|
293
|
-
const target =
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
307
|
+
const target =
|
|
308
|
+
relay.routerChannelId === undefined
|
|
309
|
+
? this.options.meshRouters.remoteBoundSessionTargetForSource(sessionNodeRid)
|
|
310
|
+
: {
|
|
311
|
+
routerChannelId: relay.routerChannelId,
|
|
312
|
+
targetNodeRid: sessionNodeRid,
|
|
313
|
+
spotId: sessionNodeRid
|
|
314
|
+
};
|
|
300
315
|
if (target === undefined) {
|
|
301
316
|
throw new Error('Remote actor session binding did not declare a return router.');
|
|
302
317
|
}
|
|
303
|
-
const bindingGeneration = (
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
318
|
+
const bindingGeneration = (
|
|
319
|
+
fallbackActorRef as
|
|
320
|
+
| (ActorRef & {
|
|
321
|
+
readonly bindingGeneration?: bigint;
|
|
322
|
+
})
|
|
323
|
+
| undefined
|
|
324
|
+
)?.bindingGeneration;
|
|
325
|
+
const refreshedTarget = mergeRemoteBoundSessionTarget(
|
|
326
|
+
{
|
|
327
|
+
...target,
|
|
328
|
+
sessionNodeRid,
|
|
329
|
+
sessionRid,
|
|
330
|
+
...(bindingGeneration === undefined ? {} : { bindingGeneration })
|
|
331
|
+
},
|
|
332
|
+
preferredRemoteBoundSessionTarget(
|
|
333
|
+
state.remoteBoundSessionTarget,
|
|
334
|
+
state.boundSessionTransferTarget
|
|
335
|
+
)
|
|
336
|
+
);
|
|
315
337
|
state.setRemoteBoundSessionTarget(refreshedTarget);
|
|
316
338
|
return { ok: true, response: { acknowledged: true } };
|
|
317
339
|
}
|
|
318
340
|
if (frameHeader.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET) {
|
|
319
341
|
this.requireCurrentRemoteBinding(relay, _routeContext);
|
|
320
|
-
this.options
|
|
342
|
+
this.options
|
|
343
|
+
.actorManager()
|
|
344
|
+
?.getState(relay.actorId)
|
|
345
|
+
?.setRemoteBoundSessionTarget(undefined);
|
|
321
346
|
await this.notifyLocalActorDisconnectedById(relay.actorId);
|
|
322
347
|
return {
|
|
323
348
|
ok: true,
|
|
@@ -331,22 +356,23 @@ export class ZLinkActorPacketRelay {
|
|
|
331
356
|
}
|
|
332
357
|
const state = this.options.actorManager()?.getState(relay.actorId);
|
|
333
358
|
if (frameHeader.kind === ZLinkStreamMessageKind.Send) {
|
|
334
|
-
const dispatch =
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
359
|
+
const dispatch =
|
|
360
|
+
state?.spotId === undefined
|
|
361
|
+
? this.requireSpotNodeRuntime().dispatchEntryActorPacket(
|
|
362
|
+
relay.actorId,
|
|
363
|
+
[header, body],
|
|
364
|
+
false,
|
|
365
|
+
remoteBoundSessionTarget,
|
|
366
|
+
fallbackActorRef
|
|
367
|
+
)
|
|
368
|
+
: this.requireSpotManager().dispatchRoutedActorPacket(
|
|
369
|
+
state.spotId,
|
|
370
|
+
relay.actorId,
|
|
371
|
+
[header, body],
|
|
372
|
+
false,
|
|
373
|
+
remoteBoundSessionTarget,
|
|
374
|
+
fallbackActorRef
|
|
375
|
+
);
|
|
350
376
|
// Spec 05 §1.3: a one-way Session Actor relay completes at relay
|
|
351
377
|
// queue admission, not after the remote application turn. In
|
|
352
378
|
// particular, a handler may register a deferred Join whose relocation
|
|
@@ -362,10 +388,9 @@ export class ZLinkActorPacketRelay {
|
|
|
362
388
|
try {
|
|
363
389
|
await dispatch;
|
|
364
390
|
} catch (error) {
|
|
365
|
-
this.options
|
|
366
|
-
|
|
367
|
-
error
|
|
368
|
-
);
|
|
391
|
+
this.options
|
|
392
|
+
.errorSink()
|
|
393
|
+
.reportRuntimeTaskException('remote actor packet relay', error);
|
|
369
394
|
} finally {
|
|
370
395
|
header.close();
|
|
371
396
|
body.close();
|
|
@@ -380,67 +405,69 @@ export class ZLinkActorPacketRelay {
|
|
|
380
405
|
};
|
|
381
406
|
}
|
|
382
407
|
if (
|
|
383
|
-
frameHeader.kind === ZLinkStreamMessageKind.Request
|
|
384
|
-
|
|
385
|
-
|
|
408
|
+
frameHeader.kind === ZLinkStreamMessageKind.Request &&
|
|
409
|
+
frameHeader.requestSeq !== undefined &&
|
|
410
|
+
relay.returnResponse !== true
|
|
386
411
|
) {
|
|
387
|
-
const dispatch =
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
[header, body],
|
|
391
|
-
false,
|
|
392
|
-
remoteBoundSessionTarget,
|
|
393
|
-
fallbackActorRef
|
|
394
|
-
)
|
|
395
|
-
: this.requireSpotManager().dispatchRoutedActorPacket(
|
|
396
|
-
state.spotId,
|
|
397
|
-
relay.actorId,
|
|
398
|
-
[header, body],
|
|
399
|
-
false,
|
|
400
|
-
remoteBoundSessionTarget,
|
|
401
|
-
fallbackActorRef
|
|
402
|
-
);
|
|
403
|
-
closeFrameMessages = false;
|
|
404
|
-
const deferredPacketName = frameHeader.name;
|
|
405
|
-
const deferredRequestSeq = frameHeader.requestSeq;
|
|
406
|
-
const deferredMetadata = frameHeader.metadata;
|
|
407
|
-
void dispatch.catch(async (error) => {
|
|
408
|
-
// Spec 32 §5 — an accepted Request must end in exactly one
|
|
409
|
-
// terminal completion. deferredResponse already told the source
|
|
410
|
-
// the reply will arrive on the bound-session route, so a routed
|
|
411
|
-
// dispatch REJECTED BEFORE DISPATCH (a closing/missing Spot
|
|
412
|
-
// throws ZLinkConfigurationException from activation resolution)
|
|
413
|
-
// must send its error there instead of only sinking it. Failures
|
|
414
|
-
// past that boundary already produce their own terminal through
|
|
415
|
-
// the inner actorErrorSender path — also sending here would emit
|
|
416
|
-
// a duplicate terminal for the same requestSeq.
|
|
417
|
-
if (
|
|
418
|
-
error instanceof ZLinkConfigurationException
|
|
419
|
-
&& this.options.actorErrorSender !== undefined
|
|
420
|
-
) {
|
|
421
|
-
try {
|
|
422
|
-
await this.options.actorErrorSender(
|
|
412
|
+
const dispatch =
|
|
413
|
+
state?.spotId === undefined
|
|
414
|
+
? this.requireSpotNodeRuntime().dispatchEntryActorPacket(
|
|
423
415
|
relay.actorId,
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
416
|
+
[header, body],
|
|
417
|
+
false,
|
|
418
|
+
remoteBoundSessionTarget,
|
|
419
|
+
fallbackActorRef
|
|
420
|
+
)
|
|
421
|
+
: this.requireSpotManager().dispatchRoutedActorPacket(
|
|
422
|
+
state.spotId,
|
|
423
|
+
relay.actorId,
|
|
424
|
+
[header, body],
|
|
425
|
+
false,
|
|
428
426
|
remoteBoundSessionTarget,
|
|
429
427
|
fallbackActorRef
|
|
430
428
|
);
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
429
|
+
closeFrameMessages = false;
|
|
430
|
+
const deferredPacketName = frameHeader.name;
|
|
431
|
+
const deferredRequestSeq = frameHeader.requestSeq;
|
|
432
|
+
const deferredMetadata = frameHeader.metadata;
|
|
433
|
+
void dispatch
|
|
434
|
+
.catch(async (error) => {
|
|
435
|
+
// Spec 32 §5 — an accepted Request must end in exactly one
|
|
436
|
+
// terminal completion. deferredResponse already told the source
|
|
437
|
+
// the reply will arrive on the bound-session route, so a routed
|
|
438
|
+
// dispatch REJECTED BEFORE DISPATCH (a closing/missing Spot
|
|
439
|
+
// throws ZLinkConfigurationException from activation resolution)
|
|
440
|
+
// must send its error there instead of only sinking it. Failures
|
|
441
|
+
// past that boundary already produce their own terminal through
|
|
442
|
+
// the inner actorErrorSender path — also sending here would emit
|
|
443
|
+
// a duplicate terminal for the same requestSeq.
|
|
444
|
+
if (
|
|
445
|
+
error instanceof ZLinkConfigurationException &&
|
|
446
|
+
this.options.actorErrorSender !== undefined
|
|
447
|
+
) {
|
|
448
|
+
try {
|
|
449
|
+
await this.options.actorErrorSender(
|
|
450
|
+
relay.actorId,
|
|
451
|
+
deferredPacketName,
|
|
452
|
+
deferredRequestSeq,
|
|
453
|
+
error,
|
|
454
|
+
deferredMetadata,
|
|
455
|
+
remoteBoundSessionTarget,
|
|
456
|
+
fallbackActorRef
|
|
457
|
+
);
|
|
458
|
+
return;
|
|
459
|
+
} catch (sendFailure) {
|
|
460
|
+
this.options
|
|
461
|
+
.errorSink()
|
|
462
|
+
.reportRuntimeTaskException('remote actor packet relay error reply', sendFailure);
|
|
463
|
+
}
|
|
437
464
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
465
|
+
this.options.errorSink().reportRuntimeTaskException('remote actor packet relay', error);
|
|
466
|
+
})
|
|
467
|
+
.finally(() => {
|
|
468
|
+
header.close();
|
|
469
|
+
body.close();
|
|
470
|
+
});
|
|
444
471
|
return {
|
|
445
472
|
ok: true,
|
|
446
473
|
deferredResponse: true,
|
|
@@ -449,22 +476,23 @@ export class ZLinkActorPacketRelay {
|
|
|
449
476
|
)
|
|
450
477
|
};
|
|
451
478
|
}
|
|
452
|
-
const response =
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
479
|
+
const response =
|
|
480
|
+
state?.spotId === undefined
|
|
481
|
+
? await this.requireSpotNodeRuntime().dispatchEntryActorPacket(
|
|
482
|
+
relay.actorId,
|
|
483
|
+
[header, body],
|
|
484
|
+
relay.returnResponse === true,
|
|
485
|
+
remoteBoundSessionTarget,
|
|
486
|
+
fallbackActorRef
|
|
487
|
+
)
|
|
488
|
+
: await this.requireSpotManager().dispatchRoutedActorPacket(
|
|
489
|
+
state.spotId,
|
|
490
|
+
relay.actorId,
|
|
491
|
+
[header, body],
|
|
492
|
+
relay.returnResponse === true,
|
|
493
|
+
remoteBoundSessionTarget,
|
|
494
|
+
fallbackActorRef
|
|
495
|
+
);
|
|
468
496
|
return {
|
|
469
497
|
ok: true,
|
|
470
498
|
response,
|
|
@@ -476,9 +504,10 @@ export class ZLinkActorPacketRelay {
|
|
|
476
504
|
return {
|
|
477
505
|
ok: false,
|
|
478
506
|
error: error instanceof Error ? error.message : String(error),
|
|
479
|
-
errorKind:
|
|
480
|
-
|
|
481
|
-
|
|
507
|
+
errorKind:
|
|
508
|
+
error instanceof ZLinkFrameworkException
|
|
509
|
+
? internalFrameworkErrorKind(error)
|
|
510
|
+
: ZLinkFrameworkInternalErrorKind.RequestFailed
|
|
482
511
|
};
|
|
483
512
|
} finally {
|
|
484
513
|
if (closeFrameMessages) {
|
|
@@ -510,15 +539,15 @@ export class ZLinkActorPacketRelay {
|
|
|
510
539
|
return await this.relayLocalActorPacket(actor, frameHeader, payload, signal);
|
|
511
540
|
} catch (error) {
|
|
512
541
|
if (
|
|
513
|
-
!(
|
|
514
|
-
&& error.message.includes('no complete Ready authority fence')
|
|
515
|
-
|
|
542
|
+
!(
|
|
543
|
+
error instanceof Error && error.message.includes('no complete Ready authority fence')
|
|
544
|
+
) ||
|
|
545
|
+
performance.now() >= fenceRetryDeadlineMs
|
|
516
546
|
) {
|
|
517
547
|
throw error;
|
|
518
548
|
}
|
|
519
549
|
this.targets.clear(actor.actorId);
|
|
520
|
-
this.options.actorManager()?.getState(actor.actorId)
|
|
521
|
-
?.setRemoteActorPacketTarget(undefined);
|
|
550
|
+
this.options.actorManager()?.getState(actor.actorId)?.setRemoteActorPacketTarget(undefined);
|
|
522
551
|
await new Promise<void>((resolve) => setTimeout(resolve, 25));
|
|
523
552
|
}
|
|
524
553
|
}
|
|
@@ -571,7 +600,10 @@ export class ZLinkActorPacketRelay {
|
|
|
571
600
|
(parts) => JSON.parse(parts[0]?.getString('utf8') ?? '{}'),
|
|
572
601
|
signal
|
|
573
602
|
);
|
|
574
|
-
if (
|
|
603
|
+
if (
|
|
604
|
+
reply.ok === false ||
|
|
605
|
+
(reply.response?.acknowledged !== true && reply.acknowledged !== true)
|
|
606
|
+
) {
|
|
575
607
|
// An {ok:false} (or unacknowledged) reply here is an immediate remote
|
|
576
608
|
// rejection — the transport wait itself throws on timeout — so spec 32
|
|
577
609
|
// reserves DeadlineExceeded for the deadline path and this reply
|
|
@@ -579,9 +611,10 @@ export class ZLinkActorPacketRelay {
|
|
|
579
611
|
// reply's errorKind when it carries a valid framework kind, else
|
|
580
612
|
// RequestFailed, matching how other acknowledged relay replies map
|
|
581
613
|
// {ok:false} (actorRelayError / remoteRelayErrorKind).
|
|
582
|
-
const remoteKind = Object.values(ZLinkFrameworkInternalErrorKind)
|
|
583
|
-
|
|
584
|
-
|
|
614
|
+
const remoteKind = Object.values(ZLinkFrameworkInternalErrorKind).includes(
|
|
615
|
+
reply.errorKind as ZLinkFrameworkInternalErrorKind
|
|
616
|
+
)
|
|
617
|
+
? (reply.errorKind as ZLinkFrameworkInternalErrorKind)
|
|
585
618
|
: ZLinkFrameworkInternalErrorKind.RequestFailed;
|
|
586
619
|
throw createInternalFrameworkException(
|
|
587
620
|
remoteKind,
|
|
@@ -598,25 +631,25 @@ export class ZLinkActorPacketRelay {
|
|
|
598
631
|
delayMs: number
|
|
599
632
|
): Promise<void> {
|
|
600
633
|
try {
|
|
601
|
-
await this.options.routeTransport.sendToSpot(
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
{ packetName: ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET }
|
|
605
|
-
);
|
|
634
|
+
await this.options.routeTransport.sendToSpot(target, request, {
|
|
635
|
+
packetName: ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
|
|
636
|
+
});
|
|
606
637
|
} catch (error) {
|
|
607
638
|
if (performance.now() >= deadline) {
|
|
608
639
|
// Spec 32-framework-error-model: DeadlineExceeded(7). Retry
|
|
609
640
|
// exhaustion on the one-way bind send remains diagnostics-only but
|
|
610
641
|
// the caller waits for its bounded submission terminal so later
|
|
611
642
|
// application relay cannot overtake it.
|
|
612
|
-
this.options
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
643
|
+
this.options
|
|
644
|
+
.errorSink()
|
|
645
|
+
.reportRuntimeTaskException(
|
|
646
|
+
'remote session binding send',
|
|
647
|
+
createInternalFrameworkException(
|
|
648
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
649
|
+
'Remote actor session binding send retries exceeded their deadline.',
|
|
650
|
+
error
|
|
651
|
+
)
|
|
652
|
+
);
|
|
620
653
|
return;
|
|
621
654
|
}
|
|
622
655
|
await new Promise<void>((resolve) => setTimeout(resolve, delayMs));
|
|
@@ -641,20 +674,20 @@ export class ZLinkActorPacketRelay {
|
|
|
641
674
|
const localNodeRid = localNode === undefined ? undefined : String(localNode.status().routingId);
|
|
642
675
|
const storedRoute = await streamRuntime.sessionRouteFence(actor.actorId);
|
|
643
676
|
const aggregateOwner = actorSessionBindingRuntimeOwnerIfRegistered(streamRuntime);
|
|
644
|
-
const aggregateRoute =
|
|
645
|
-
? undefined
|
|
646
|
-
: await aggregateOwner.committedRoute(actor.actorId);
|
|
677
|
+
const aggregateRoute =
|
|
678
|
+
aggregateOwner === undefined ? undefined : await aggregateOwner.committedRoute(actor.actorId);
|
|
647
679
|
const storedActorRef = aggregateRoute?.actor ?? storedRoute?.actor ?? actor.ref;
|
|
648
680
|
const capturedTenureKey = this.targets.tenureKeyForActorRef(actor.actorId, storedActorRef);
|
|
649
681
|
if (
|
|
650
|
-
localNodeRid !== undefined
|
|
651
|
-
|
|
652
|
-
|
|
682
|
+
localNodeRid !== undefined &&
|
|
683
|
+
routingIdsEqual(storedActorRef.nodeRid, localNodeRid) &&
|
|
684
|
+
this.options.actorManager()?.getState(actor.actorId)?.actor !== undefined
|
|
653
685
|
) {
|
|
654
686
|
return false;
|
|
655
687
|
}
|
|
656
|
-
const remoteTarget =
|
|
657
|
-
|
|
688
|
+
const remoteTarget =
|
|
689
|
+
this.options.actorManager()?.getState(actor.actorId)?.remoteActorPacketTarget ??
|
|
690
|
+
this.targets.cachedTargetForActor(actor);
|
|
658
691
|
if (remoteTarget === undefined) {
|
|
659
692
|
return false;
|
|
660
693
|
}
|
|
@@ -670,27 +703,27 @@ export class ZLinkActorPacketRelay {
|
|
|
670
703
|
let request: Record<string, unknown>;
|
|
671
704
|
try {
|
|
672
705
|
const authority = aggregateRoute?.authorityFence;
|
|
673
|
-
const messageFollowContext =
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
706
|
+
const messageFollowContext =
|
|
707
|
+
authority?.ownerId === undefined || authority.ownerNodeGeneration === undefined
|
|
708
|
+
? undefined
|
|
709
|
+
: createInitialActorMessageFollowContext(
|
|
710
|
+
{
|
|
711
|
+
meshName: storedActorRef.meshName,
|
|
712
|
+
actorRef: storedActorRef,
|
|
713
|
+
actorType: authority.actorType ?? '',
|
|
714
|
+
ownerNodeGeneration: authority.ownerNodeGeneration,
|
|
715
|
+
ownerId: authority.ownerId,
|
|
716
|
+
ownerLeaseGeneration: authority.ownerLeaseGeneration,
|
|
717
|
+
authorityOwnerGeneration: authority.authorityOwnerGeneration,
|
|
718
|
+
authorityStoreVersion: authority.authorityStoreVersion ?? ''
|
|
719
|
+
},
|
|
720
|
+
[header, payload],
|
|
721
|
+
returnResponse,
|
|
722
|
+
undefined,
|
|
723
|
+
isValidMessageFollowId(frameHeader.correlationId)
|
|
724
|
+
? frameHeader.correlationId
|
|
725
|
+
: createMessageFollowId()
|
|
726
|
+
);
|
|
694
727
|
request = encodeRemoteActorPacketRelayPayload({
|
|
695
728
|
actorId: actor.actorId,
|
|
696
729
|
routerChannelId: remoteTarget.routerChannelId,
|
|
@@ -714,9 +747,9 @@ export class ZLinkActorPacketRelay {
|
|
|
714
747
|
spotKind: remoteTarget.spotKind ?? ZLinkSpotKind.User
|
|
715
748
|
};
|
|
716
749
|
if (
|
|
717
|
-
(frameHeader.kind === ZLinkStreamMessageKind.Send || frameHeader.requestSeq === undefined)
|
|
718
|
-
|
|
719
|
-
|
|
750
|
+
(frameHeader.kind === ZLinkStreamMessageKind.Send || frameHeader.requestSeq === undefined) &&
|
|
751
|
+
remoteAddress.spotKind === ZLinkSpotKind.Entry &&
|
|
752
|
+
this.options.routeTransport.submit !== undefined
|
|
720
753
|
) {
|
|
721
754
|
const result = await this.options.routeTransport.submit(
|
|
722
755
|
remoteAddress.routerChannelId,
|
|
@@ -758,18 +791,17 @@ export class ZLinkActorPacketRelay {
|
|
|
758
791
|
);
|
|
759
792
|
const actorPacketTarget = this.targets.decodeFromWire(reply.actorPacketTarget);
|
|
760
793
|
const currentStoredRoute = await streamRuntime.sessionRouteFence(actor.actorId);
|
|
761
|
-
const currentAggregateRoute =
|
|
762
|
-
? undefined
|
|
763
|
-
: await aggregateOwner.committedRoute(actor.actorId);
|
|
794
|
+
const currentAggregateRoute =
|
|
795
|
+
aggregateOwner === undefined ? undefined : await aggregateOwner.committedRoute(actor.actorId);
|
|
764
796
|
const currentActorRef = currentAggregateRoute?.actor ?? currentStoredRoute?.actor ?? actor.ref;
|
|
765
|
-
const currentTenure =
|
|
766
|
-
=== capturedTenureKey;
|
|
797
|
+
const currentTenure =
|
|
798
|
+
this.targets.tenureKeyForActorRef(actor.actorId, currentActorRef) === capturedTenureKey;
|
|
767
799
|
if (
|
|
768
|
-
currentTenure
|
|
769
|
-
|
|
770
|
-
&&
|
|
800
|
+
currentTenure &&
|
|
801
|
+
this.targets.tenureKeyForActor(actor) === capturedTenureKey &&
|
|
771
802
|
actorPacketTarget !== undefined &&
|
|
772
|
-
(localNodeRid === undefined ||
|
|
803
|
+
(localNodeRid === undefined ||
|
|
804
|
+
!routingIdsEqual(actorPacketTarget.targetNodeRid, localNodeRid))
|
|
773
805
|
) {
|
|
774
806
|
this.targets.rememberActorTarget(actor, actorPacketTarget, capturedTenureKey);
|
|
775
807
|
} else if (currentTenure && reply.ok !== false) {
|
|
@@ -788,7 +820,9 @@ export class ZLinkActorPacketRelay {
|
|
|
788
820
|
streamMetadataMap(frameHeader.metadata)
|
|
789
821
|
);
|
|
790
822
|
if (!sent) {
|
|
791
|
-
throw new Error(
|
|
823
|
+
throw new Error(
|
|
824
|
+
`Actor '${actor.actorId}' local bound session error response route is not ready.`
|
|
825
|
+
);
|
|
792
826
|
}
|
|
793
827
|
return true;
|
|
794
828
|
}
|
|
@@ -813,7 +847,7 @@ export class ZLinkActorPacketRelay {
|
|
|
813
847
|
bindingActorRef?: ActorRef
|
|
814
848
|
): Promise<void> {
|
|
815
849
|
const spotKind: ZLinkSpotKind | undefined =
|
|
816
|
-
'spotKind' in remoteTarget ? remoteTarget.spotKind as ZLinkSpotKind | undefined : undefined;
|
|
850
|
+
'spotKind' in remoteTarget ? (remoteTarget.spotKind as ZLinkSpotKind | undefined) : undefined;
|
|
817
851
|
const header: ZLinkStreamFrameHeader = {
|
|
818
852
|
kind: ZLinkStreamMessageKind.Send,
|
|
819
853
|
codec: ZLinkStreamCodec.Raw,
|
|
@@ -860,19 +894,20 @@ export class ZLinkActorPacketRelay {
|
|
|
860
894
|
routeContext: ZLinkRouteMessageContext
|
|
861
895
|
): void {
|
|
862
896
|
const state = this.options.actorManager()?.getState(relay.actorId);
|
|
863
|
-
const current =
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
897
|
+
const current =
|
|
898
|
+
state === undefined
|
|
899
|
+
? undefined
|
|
900
|
+
: preferredRemoteBoundSessionTarget(
|
|
901
|
+
state.remoteBoundSessionTarget,
|
|
902
|
+
state.boundSessionTransferTarget
|
|
903
|
+
);
|
|
869
904
|
if (
|
|
870
|
-
current === undefined
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
905
|
+
current === undefined ||
|
|
906
|
+
current.sessionNodeRid === undefined ||
|
|
907
|
+
!routingIdsEqual(current.sessionNodeRid, routeContext.sourceNodeRid) ||
|
|
908
|
+
current.bindingGeneration === undefined ||
|
|
909
|
+
relay.bindingGeneration === undefined ||
|
|
910
|
+
current.bindingGeneration !== BigInt(relay.bindingGeneration)
|
|
876
911
|
) {
|
|
877
912
|
throw createInternalFrameworkException(
|
|
878
913
|
ZLinkFrameworkInternalErrorKind.ActorSessionNotBound,
|
|
@@ -924,7 +959,8 @@ export class ZLinkActorPacketRelay {
|
|
|
924
959
|
void signal;
|
|
925
960
|
const state = this.options.actorManager()?.getState(actor.actorId);
|
|
926
961
|
const spotId = state?.spotId as RoutingId | undefined;
|
|
927
|
-
const hasActiveSpot =
|
|
962
|
+
const hasActiveSpot =
|
|
963
|
+
spotId !== undefined && this.options.spotManager()?.hasActiveSpot(spotId) === true;
|
|
928
964
|
if (!hasActiveSpot) {
|
|
929
965
|
return false;
|
|
930
966
|
}
|
|
@@ -938,15 +974,17 @@ export class ZLinkActorPacketRelay {
|
|
|
938
974
|
) {
|
|
939
975
|
return false;
|
|
940
976
|
}
|
|
941
|
-
const responseTarget = await this.options
|
|
977
|
+
const responseTarget = await this.options
|
|
978
|
+
.streamBindingRuntime()
|
|
979
|
+
.captureBoundSessionResponseTarget(actor);
|
|
942
980
|
const encodedHeader = encodeStreamHeader(frameHeader);
|
|
943
981
|
// encodeStreamHeader returns a fresh, unaliased array; view it without re-copying.
|
|
944
982
|
const header = RuntimeMessage.fromOwned(
|
|
945
983
|
Buffer.from(encodedHeader.buffer, encodedHeader.byteOffset, encodedHeader.byteLength)
|
|
946
984
|
);
|
|
947
985
|
const body = RuntimeMessage.fromOwned(Buffer.from(messageToBytes(payload)));
|
|
948
|
-
const returnResponse =
|
|
949
|
-
&& frameHeader.requestSeq !== undefined;
|
|
986
|
+
const returnResponse =
|
|
987
|
+
frameHeader.kind === ZLinkStreamMessageKind.Request && frameHeader.requestSeq !== undefined;
|
|
950
988
|
try {
|
|
951
989
|
this.options.detachedTaskRunner.runDetached('local actor packet relay', async () => {
|
|
952
990
|
try {
|
|
@@ -968,7 +1006,9 @@ export class ZLinkActorPacketRelay {
|
|
|
968
1006
|
streamMetadataMap(frameHeader.metadata)
|
|
969
1007
|
);
|
|
970
1008
|
if (!sent) {
|
|
971
|
-
throw new Error(
|
|
1009
|
+
throw new Error(
|
|
1010
|
+
`Actor '${actor.actorId}' local bound session response route is not ready.`
|
|
1011
|
+
);
|
|
972
1012
|
}
|
|
973
1013
|
} catch (error) {
|
|
974
1014
|
if (!returnResponse) {
|
|
@@ -1007,14 +1047,9 @@ export class ZLinkActorPacketRelay {
|
|
|
1007
1047
|
metadata: ReadonlyMap<string, string>
|
|
1008
1048
|
): Promise<boolean> {
|
|
1009
1049
|
return target === undefined
|
|
1010
|
-
? await this.options
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
requestSeq,
|
|
1014
|
-
response,
|
|
1015
|
-
metadata,
|
|
1016
|
-
false
|
|
1017
|
-
)
|
|
1050
|
+
? await this.options
|
|
1051
|
+
.streamBindingRuntime()
|
|
1052
|
+
.sendLocalBoundSessionResponse(actorId, packetName, requestSeq, response, metadata, false)
|
|
1018
1053
|
: await target.sendResponse(packetName, requestSeq, response, metadata);
|
|
1019
1054
|
}
|
|
1020
1055
|
|
|
@@ -1027,13 +1062,9 @@ export class ZLinkActorPacketRelay {
|
|
|
1027
1062
|
metadata: ReadonlyMap<string, string>
|
|
1028
1063
|
): Promise<boolean> {
|
|
1029
1064
|
return target === undefined
|
|
1030
|
-
? await this.options
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
requestSeq,
|
|
1034
|
-
error,
|
|
1035
|
-
metadata
|
|
1036
|
-
)
|
|
1065
|
+
? await this.options
|
|
1066
|
+
.streamBindingRuntime()
|
|
1067
|
+
.sendLocalBoundSessionError(actorId, packetName, requestSeq, error, metadata)
|
|
1037
1068
|
: await target.sendError(packetName, requestSeq, error, metadata);
|
|
1038
1069
|
}
|
|
1039
1070
|
|
|
@@ -1055,9 +1086,7 @@ export class ZLinkActorPacketRelay {
|
|
|
1055
1086
|
}
|
|
1056
1087
|
|
|
1057
1088
|
function isValidMessageFollowId(value: string | undefined): value is string {
|
|
1058
|
-
return value !== undefined
|
|
1059
|
-
&& /^[0-9a-f]{32}$/.test(value)
|
|
1060
|
-
&& !/^0+$/.test(value);
|
|
1089
|
+
return value !== undefined && /^[0-9a-f]{32}$/.test(value) && !/^0+$/.test(value);
|
|
1061
1090
|
}
|
|
1062
1091
|
|
|
1063
1092
|
/** Reuses the target when it already carries a spot kind instead of spreading a copy per call. */
|
|
@@ -1066,5 +1095,5 @@ function withDefaultSpotKind(
|
|
|
1066
1095
|
): ZLinkRemoteActorPacketTarget & { readonly spotKind: ZLinkSpotKind } {
|
|
1067
1096
|
return target.spotKind === undefined
|
|
1068
1097
|
? { ...target, spotKind: ZLinkSpotKind.Entry }
|
|
1069
|
-
: target as ZLinkRemoteActorPacketTarget & { readonly spotKind: ZLinkSpotKind };
|
|
1098
|
+
: (target as ZLinkRemoteActorPacketTarget & { readonly spotKind: ZLinkSpotKind });
|
|
1070
1099
|
}
|