@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
|
@@ -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
|
}
|
|
@@ -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;
|
|
@@ -29,7 +29,7 @@ class ZLinkActorSerialExecutor {
|
|
|
29
29
|
admitDurablePrefix(records) {
|
|
30
30
|
// No await occurs in this map: the whole durable prefix is appended in
|
|
31
31
|
// one event-loop turn before later ingress can observe the released hold.
|
|
32
|
-
return records.map(record => this.scheduler.admitDurablePrefix(() => record.operation(child => (0, actor_execution_context_1.runZLinkActorExecution)(this.actorId, this.sourceSpotId, child)), record.workOptions, undefined, record.preparation));
|
|
32
|
+
return records.map((record) => this.scheduler.admitDurablePrefix(() => record.operation((child) => (0, actor_execution_context_1.runZLinkActorExecution)(this.actorId, this.sourceSpotId, child)), record.workOptions, undefined, record.preparation));
|
|
33
33
|
}
|
|
34
34
|
close() {
|
|
35
35
|
return this.scheduler.close();
|
|
@@ -58,8 +58,9 @@ function decodeActorMessageFollowContext(value) {
|
|
|
58
58
|
const checksum = input.payloadChecksumSha256;
|
|
59
59
|
if (typeof request !== 'boolean')
|
|
60
60
|
throw invalidContext('request must be boolean');
|
|
61
|
-
if (!Number.isSafeInteger(hopCount) ||
|
|
62
|
-
|
|
61
|
+
if (!Number.isSafeInteger(hopCount) ||
|
|
62
|
+
hopCount < 0 ||
|
|
63
|
+
hopCount > exports.ZLINK_MESSAGE_FOLLOW_MAX_HOPS) {
|
|
63
64
|
throw invalidContext('hopCount is outside 0..8');
|
|
64
65
|
}
|
|
65
66
|
if (typeof checksum !== 'string' || !/^[0-9a-f]{64}$/.test(checksum)) {
|
|
@@ -74,16 +75,16 @@ function decodeActorMessageFollowContext(value) {
|
|
|
74
75
|
if (!request && replyRouteId !== undefined) {
|
|
75
76
|
throw invalidContext('one-way context must not contain replyRouteId');
|
|
76
77
|
}
|
|
77
|
-
if (!Array.isArray(input.visitedOwners)
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
if (!Array.isArray(input.visitedOwners) ||
|
|
79
|
+
input.visitedOwners.some((item) => typeof item !== 'string' || item.length === 0) ||
|
|
80
|
+
input.visitedOwners.length !== hopCount + 1) {
|
|
80
81
|
throw invalidContext('visitedOwners does not match hopCount');
|
|
81
82
|
}
|
|
82
83
|
const visitedOwners = [...input.visitedOwners];
|
|
83
84
|
const targetOwnerKeys = messageFollowOwnerFenceCompatibleKeys(targetOwner);
|
|
84
|
-
if (new Set(visitedOwners).size !== visitedOwners.length
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
if (new Set(visitedOwners).size !== visitedOwners.length ||
|
|
86
|
+
!targetOwnerKeys.includes(visitedOwners[visitedOwners.length - 1]) ||
|
|
87
|
+
visitedOwners.slice(0, -1).some((key) => targetOwnerKeys.includes(key))) {
|
|
87
88
|
throw invalidContext('visited owner fence chain is invalid');
|
|
88
89
|
}
|
|
89
90
|
return freezeContext({
|
|
@@ -108,8 +109,7 @@ function advanceActorMessageFollowContext(context, sourceOwner, targetOwner) {
|
|
|
108
109
|
throw invalidContext('Message Follow reached the 8-hop limit');
|
|
109
110
|
}
|
|
110
111
|
const targetKey = messageFollowOwnerFenceKey(targetOwner);
|
|
111
|
-
if (messageFollowOwnerFenceCompatibleKeys(targetOwner)
|
|
112
|
-
.some(key => context.visitedOwners.includes(key))) {
|
|
112
|
+
if (messageFollowOwnerFenceCompatibleKeys(targetOwner).some((key) => context.visitedOwners.includes(key))) {
|
|
113
113
|
throw invalidContext('Message Follow owner loop was detected');
|
|
114
114
|
}
|
|
115
115
|
return freezeContext({
|
|
@@ -127,8 +127,7 @@ function attachActorMessageFollowContext(actorRef, context) {
|
|
|
127
127
|
});
|
|
128
128
|
}
|
|
129
129
|
function actorMessageFollowContext(actorRef) {
|
|
130
|
-
return actorRef
|
|
131
|
-
?.__zlinkMessageFollowContext;
|
|
130
|
+
return actorRef?.__zlinkMessageFollowContext;
|
|
132
131
|
}
|
|
133
132
|
function actorMessageFollowPayloadChecksum(parts) {
|
|
134
133
|
const hash = (0, node_crypto_1.createHash)('sha256');
|
|
@@ -198,8 +197,7 @@ function freezeContext(context) {
|
|
|
198
197
|
});
|
|
199
198
|
}
|
|
200
199
|
function requireId(value, name) {
|
|
201
|
-
if (typeof value !== 'string' || !/^[0-9a-f]{32}$/.test(value)
|
|
202
|
-
|| /^0+$/.test(value)) {
|
|
200
|
+
if (typeof value !== 'string' || !/^[0-9a-f]{32}$/.test(value) || /^0+$/.test(value)) {
|
|
203
201
|
throw invalidContext(`${name} must be a nonzero 128-bit lowercase hex value`);
|
|
204
202
|
}
|
|
205
203
|
return value;
|
|
@@ -222,8 +220,10 @@ function requirePositiveBigInt(value, name) {
|
|
|
222
220
|
function optionalNodeRidHex(value, name) {
|
|
223
221
|
if (value === undefined)
|
|
224
222
|
return undefined;
|
|
225
|
-
if (typeof value !== 'string' ||
|
|
226
|
-
|
|
223
|
+
if (typeof value !== 'string' ||
|
|
224
|
+
value.length === 0 ||
|
|
225
|
+
value.length % 2 !== 0 ||
|
|
226
|
+
!/^[0-9a-f]+$/.test(value)) {
|
|
227
227
|
throw invalidContext(`${name} must be non-empty lowercase hexadecimal bytes`);
|
|
228
228
|
}
|
|
229
229
|
return value;
|
|
@@ -231,18 +231,21 @@ function optionalNodeRidHex(value, name) {
|
|
|
231
231
|
function messageFollowOwnerFenceCompatibleKeys(fence) {
|
|
232
232
|
const canonical = messageFollowOwnerFenceKey(fence);
|
|
233
233
|
const textHex = (0, routing_id_1.encodeRoutingIdStorageHex)(fence.nodeRid);
|
|
234
|
-
if (fence.nodeRid.includes('\u0000')
|
|
235
|
-
|
|
236
|
-
|
|
234
|
+
if (fence.nodeRid.includes('\u0000') ||
|
|
235
|
+
fence.ownerId.includes('\u0000') ||
|
|
236
|
+
(fence.nodeRidHex !== undefined && fence.nodeRidHex !== textHex)) {
|
|
237
237
|
return [canonical];
|
|
238
238
|
}
|
|
239
|
-
return [
|
|
239
|
+
return [
|
|
240
|
+
canonical,
|
|
241
|
+
[
|
|
240
242
|
fence.nodeRid,
|
|
241
243
|
fence.nodeGeneration,
|
|
242
244
|
fence.ownerId,
|
|
243
245
|
fence.ownerLeaseGeneration,
|
|
244
246
|
fence.authorityOwnerGeneration
|
|
245
|
-
].join('\u0000')
|
|
247
|
+
].join('\u0000')
|
|
248
|
+
];
|
|
246
249
|
}
|
|
247
250
|
function optionalPositiveSafeInteger(value, name) {
|
|
248
251
|
if (value === undefined)
|
|
@@ -40,9 +40,7 @@ function encodeRemoteActorPacketRelayPayload(input) {
|
|
|
40
40
|
boundSessionTargetNodeRid: input.boundSessionTargetNodeRid,
|
|
41
41
|
boundSessionSpotId: input.boundSessionSpotId,
|
|
42
42
|
actorNodeRid: input.actorRef === undefined ? undefined : String(input.actorRef.nodeRid),
|
|
43
|
-
actorNodeRidHex: input.actorRef === undefined
|
|
44
|
-
? undefined
|
|
45
|
-
: (0, routing_id_1.routingIdWireHex)(input.actorRef.nodeRid),
|
|
43
|
+
actorNodeRidHex: input.actorRef === undefined ? undefined : (0, routing_id_1.routingIdWireHex)(input.actorRef.nodeRid),
|
|
46
44
|
actorGeneration: input.actorRef?.objectGeneration.toString(),
|
|
47
45
|
bindingActorNodeRid: input.bindingActorRef === undefined ? undefined : String(input.bindingActorRef.nodeRid),
|
|
48
46
|
bindingActorNodeRidHex: input.bindingActorRef === undefined
|