@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,9 +1,8 @@
|
|
|
1
|
-
import { ZLinkFrameworkInternalErrorKind, createInternalFrameworkException } from '../framework-errors-internal';
|
|
2
1
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '../../contracts';
|
|
2
|
+
ZLinkFrameworkInternalErrorKind,
|
|
3
|
+
createInternalFrameworkException
|
|
4
|
+
} from '../framework-errors-internal';
|
|
5
|
+
import { ActorRef, ZLinkActor, ZLinkFrameworkException } from '../../contracts';
|
|
7
6
|
import { throwIfAborted } from '../abort';
|
|
8
7
|
import { routingIdsEqual } from '../routing-id';
|
|
9
8
|
import type { ZLinkRuntimeMetrics } from '../diagnostics';
|
|
@@ -12,13 +11,8 @@ import {
|
|
|
12
11
|
type ZLinkActorSessionAuthorityFence
|
|
13
12
|
} from './actor-session-binding-registry';
|
|
14
13
|
import { ZLinkActorSessionLifecycleCoordinator } from './actor-session-lifecycle-coordinator';
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
} from './managed-stream';
|
|
18
|
-
import {
|
|
19
|
-
DefaultZLinkSessionActor,
|
|
20
|
-
DefaultZLinkSessionContext
|
|
21
|
-
} from './session-context';
|
|
14
|
+
import { ZLinkManagedStream } from './managed-stream';
|
|
15
|
+
import { DefaultZLinkSessionActor, DefaultZLinkSessionContext } from './session-context';
|
|
22
16
|
|
|
23
17
|
export interface ZLinkSessionActorCoordinatorOptions {
|
|
24
18
|
readonly actorBindTimeoutMs?: number;
|
|
@@ -27,9 +21,11 @@ export interface ZLinkSessionActorCoordinatorOptions {
|
|
|
27
21
|
actorId: string,
|
|
28
22
|
signal?: AbortSignal
|
|
29
23
|
) => Promise<ZLinkActorSessionAuthorityFence | undefined>;
|
|
30
|
-
readonly nativeActorNodeProvider?: () =>
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
readonly nativeActorNodeProvider?: () =>
|
|
25
|
+
| {
|
|
26
|
+
status(): { readonly routingId: unknown };
|
|
27
|
+
}
|
|
28
|
+
| undefined;
|
|
33
29
|
readonly nativeActorMeshNameProvider?: () => string | undefined;
|
|
34
30
|
readonly confirmRemoteActorSessionBinding?: (
|
|
35
31
|
actor: ActorRef,
|
|
@@ -37,15 +33,20 @@ export interface ZLinkSessionActorCoordinatorOptions {
|
|
|
37
33
|
signal?: AbortSignal,
|
|
38
34
|
options?: { readonly waitForAcknowledgement?: boolean }
|
|
39
35
|
) => Promise<void>;
|
|
40
|
-
readonly errorSink?: () =>
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
readonly errorSink?: () =>
|
|
37
|
+
| {
|
|
38
|
+
reportRuntimeTaskException(taskName: string, error: unknown): void;
|
|
39
|
+
}
|
|
40
|
+
| undefined;
|
|
43
41
|
readonly metrics?: ZLinkRuntimeMetrics;
|
|
44
42
|
}
|
|
45
43
|
|
|
46
44
|
export class ZLinkSessionActorCoordinator {
|
|
47
45
|
constructor(
|
|
48
|
-
private readonly routes: ZLinkActorSessionBindingRegistry<
|
|
46
|
+
private readonly routes: ZLinkActorSessionBindingRegistry<
|
|
47
|
+
DefaultZLinkSessionContext,
|
|
48
|
+
DefaultZLinkSessionActor
|
|
49
|
+
>,
|
|
49
50
|
private readonly sessionActorRuntime: ConstructorParameters<typeof DefaultZLinkSessionActor>[0],
|
|
50
51
|
private readonly options: ZLinkSessionActorCoordinatorOptions = {},
|
|
51
52
|
private readonly lifecycle = new ZLinkActorSessionLifecycleCoordinator()
|
|
@@ -59,7 +60,9 @@ export class ZLinkSessionActorCoordinator {
|
|
|
59
60
|
const actorRef = isActorRefLike(actorOrRef)
|
|
60
61
|
? normalizeActorRef(actorOrRef, this.options.nativeActorMeshNameProvider?.())
|
|
61
62
|
: this.resolveActorRef(actorOrRef as ZLinkActor);
|
|
62
|
-
return await this.lifecycle.run(actorRef.actorId, async () =>
|
|
63
|
+
return await this.lifecycle.run(actorRef.actorId, async () =>
|
|
64
|
+
this.replaceBinding(context, actorRef, signal)
|
|
65
|
+
);
|
|
63
66
|
}
|
|
64
67
|
|
|
65
68
|
private async replaceBinding(
|
|
@@ -101,13 +104,12 @@ export class ZLinkSessionActorCoordinator {
|
|
|
101
104
|
|
|
102
105
|
const previous = await this.routes.route(actorRef.actorId);
|
|
103
106
|
const sameIncarnation =
|
|
104
|
-
previous !== undefined
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
previous !== undefined &&
|
|
108
|
+
previous.context === context &&
|
|
109
|
+
previous.actor.ref.actorId === actorRef.actorId &&
|
|
110
|
+
BigInt(previous.actor.ref.objectGeneration) === BigInt(actorRef.objectGeneration);
|
|
108
111
|
const samePhysicalBinding = sameIncarnation && sameActorRef(previous!.actor.ref, actorRef);
|
|
109
|
-
const reuseActor =
|
|
110
|
-
sameIncarnation ? previous!.actor : undefined;
|
|
112
|
+
const reuseActor = sameIncarnation ? previous!.actor : undefined;
|
|
111
113
|
if (reuseActor !== undefined) {
|
|
112
114
|
// A repeated bind from the same physical session is idempotent. A route
|
|
113
115
|
// refresh for the same actor incarnation still submits the native bind,
|
|
@@ -127,8 +129,9 @@ export class ZLinkSessionActorCoordinator {
|
|
|
127
129
|
: undefined,
|
|
128
130
|
previous?.actor.ref
|
|
129
131
|
);
|
|
130
|
-
const sessionActor =
|
|
131
|
-
??
|
|
132
|
+
const sessionActor =
|
|
133
|
+
reuseActor ??
|
|
134
|
+
new DefaultZLinkSessionActor(this.sessionActorRuntime, boundActorRef, bindingToken);
|
|
132
135
|
const sessionIdentity = String(this.actorBindingRoutingId(context));
|
|
133
136
|
sessionActor.updateRef(boundActorRef);
|
|
134
137
|
if (previous === undefined) {
|
|
@@ -160,9 +163,12 @@ export class ZLinkSessionActorCoordinator {
|
|
|
160
163
|
sessionIdentity
|
|
161
164
|
);
|
|
162
165
|
}
|
|
163
|
-
if (
|
|
164
|
-
|
|
165
|
-
|
|
166
|
+
if (
|
|
167
|
+
confirmRemoteSessionBinding !== false &&
|
|
168
|
+
this.options.confirmRemoteActorSessionBinding !== undefined
|
|
169
|
+
) {
|
|
170
|
+
const waitForAcknowledgement =
|
|
171
|
+
previous === undefined && confirmRemoteSessionBinding !== 'send';
|
|
166
172
|
const confirmation = this.options.confirmRemoteActorSessionBinding(
|
|
167
173
|
boundActorRef,
|
|
168
174
|
this.actorBindingRoutingId(context),
|
|
@@ -174,10 +180,9 @@ export class ZLinkSessionActorCoordinator {
|
|
|
174
180
|
// its failure is bounded diagnostics rather than a rollback. The
|
|
175
181
|
// relay retries independently and reports the typed failure through
|
|
176
182
|
// the runtime error sink instead of silently discarding it.
|
|
177
|
-
this.options
|
|
178
|
-
|
|
179
|
-
error
|
|
180
|
-
);
|
|
183
|
+
this.options
|
|
184
|
+
.errorSink?.()
|
|
185
|
+
?.reportRuntimeTaskException('remote session binding confirmation', error);
|
|
181
186
|
};
|
|
182
187
|
if (waitForAcknowledgement) {
|
|
183
188
|
try {
|
|
@@ -227,11 +232,11 @@ export class ZLinkSessionActorCoordinator {
|
|
|
227
232
|
readonly ownerLeaseGeneration?: bigint;
|
|
228
233
|
readonly ownerNodeGeneration?: bigint;
|
|
229
234
|
};
|
|
230
|
-
if (internal.ownershipGeneration !== undefined
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
+
if (internal.ownershipGeneration !== undefined && internal.ownerLeaseGeneration !== undefined) {
|
|
236
|
+
const resolved =
|
|
237
|
+
internal.ownerNodeGeneration === undefined
|
|
238
|
+
? await this.options.actorAuthorityFenceResolver?.(actorRef.actorId, signal)
|
|
239
|
+
: undefined;
|
|
235
240
|
return {
|
|
236
241
|
authorityOwnerGeneration: internal.ownershipGeneration,
|
|
237
242
|
ownerLeaseGeneration: internal.ownerLeaseGeneration,
|
|
@@ -331,11 +336,10 @@ export class ZLinkSessionActorCoordinator {
|
|
|
331
336
|
requireSameIncarnation(route.actor.ref, normalizedActorRef);
|
|
332
337
|
if (routingIdsEqual(route.actor.ref.nodeRid, normalizedActorRef.nodeRid)) {
|
|
333
338
|
const authorityFence = await this.resolveAuthorityFence(normalizedActorRef, signal);
|
|
334
|
-
if (
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
)) {
|
|
339
|
+
if (
|
|
340
|
+
options.releaseSeal !== undefined &&
|
|
341
|
+
!(await this.routes.validateSeal(normalizedActorRef.actorId, options.releaseSeal.sealId))
|
|
342
|
+
) {
|
|
339
343
|
throw createInternalFrameworkException(
|
|
340
344
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
341
345
|
`Actor '${normalizedActorRef.actorId}' route switch did not match its relocation seal.`,
|
|
@@ -346,11 +350,10 @@ export class ZLinkSessionActorCoordinator {
|
|
|
346
350
|
if (authorityFence !== undefined) {
|
|
347
351
|
await this.routes.updateAuthorityFence(normalizedActorRef.actorId, authorityFence);
|
|
348
352
|
}
|
|
349
|
-
if (
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
)) {
|
|
353
|
+
if (
|
|
354
|
+
options.releaseSeal !== undefined &&
|
|
355
|
+
!(await this.routes.abortSeal(normalizedActorRef.actorId, options.releaseSeal.sealId))
|
|
356
|
+
) {
|
|
354
357
|
throw createInternalFrameworkException(
|
|
355
358
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
356
359
|
`Actor '${normalizedActorRef.actorId}' route switch lost its relocation seal.`,
|
|
@@ -379,10 +382,10 @@ export class ZLinkSessionActorCoordinator {
|
|
|
379
382
|
throwIfAborted(signal);
|
|
380
383
|
const route = await this.routes.route(actorRef.actorId);
|
|
381
384
|
if (
|
|
382
|
-
route === undefined
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
385
|
+
route === undefined ||
|
|
386
|
+
!sameActorRef(route.actor.ref, actorRef) ||
|
|
387
|
+
!routingIdsEqual(route.sessionIdentity, sessionRid) ||
|
|
388
|
+
bindingGenerationOf(route.actor.ref) !== bindingGeneration
|
|
386
389
|
) {
|
|
387
390
|
return false;
|
|
388
391
|
}
|
|
@@ -394,26 +397,29 @@ export class ZLinkSessionActorCoordinator {
|
|
|
394
397
|
});
|
|
395
398
|
}
|
|
396
399
|
|
|
397
|
-
async authorityFence(actorId: string): Promise<
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
400
|
+
async authorityFence(actorId: string): Promise<
|
|
401
|
+
| {
|
|
402
|
+
readonly authorityOwnerGeneration: bigint;
|
|
403
|
+
readonly ownerLeaseGeneration: bigint;
|
|
404
|
+
}
|
|
405
|
+
| undefined
|
|
406
|
+
> {
|
|
401
407
|
return (await this.routes.route(actorId))?.authorityFence;
|
|
402
408
|
}
|
|
403
409
|
|
|
404
|
-
async sessionRouteFence(actorId: string): Promise<
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
410
|
+
async sessionRouteFence(actorId: string): Promise<
|
|
411
|
+
| {
|
|
412
|
+
readonly actor: ActorRef;
|
|
413
|
+
readonly sessionRid: ActorRef['nodeRid'];
|
|
414
|
+
readonly bindingGeneration: bigint;
|
|
415
|
+
}
|
|
416
|
+
| undefined
|
|
417
|
+
> {
|
|
409
418
|
const route = await this.routes.route(actorId);
|
|
410
419
|
const sessionRid = route?.sessionIdentity;
|
|
411
|
-
const actor = route?.actor.ref as
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|| sessionRid === undefined
|
|
415
|
-
|| actor?.bindingGeneration === undefined
|
|
416
|
-
) {
|
|
420
|
+
const actor = route?.actor.ref as
|
|
421
|
+
(ActorRef & { readonly bindingGeneration?: bigint }) | undefined;
|
|
422
|
+
if (route === undefined || sessionRid === undefined || actor?.bindingGeneration === undefined) {
|
|
417
423
|
return undefined;
|
|
418
424
|
}
|
|
419
425
|
return {
|
|
@@ -468,9 +474,8 @@ export class ZLinkSessionActorCoordinator {
|
|
|
468
474
|
private actorBindingRoutingId(context: DefaultZLinkSessionContext): ActorRef['nodeRid'] {
|
|
469
475
|
return context.stream instanceof ZLinkManagedStream
|
|
470
476
|
? context.stream.actorBindingRoutingId
|
|
471
|
-
: context.routingId as ActorRef['nodeRid'];
|
|
477
|
+
: (context.routingId as ActorRef['nodeRid']);
|
|
472
478
|
}
|
|
473
|
-
|
|
474
479
|
}
|
|
475
480
|
|
|
476
481
|
function withBindingGeneration(
|
|
@@ -480,9 +485,8 @@ function withBindingGeneration(
|
|
|
480
485
|
): ActorRef {
|
|
481
486
|
const input = actorRef as ActorRef & { readonly bindingGeneration?: bigint };
|
|
482
487
|
const previous = previousRef as (ActorRef & { readonly bindingGeneration?: bigint }) | undefined;
|
|
483
|
-
const bindingGeneration =
|
|
484
|
-
?? input.bindingGeneration
|
|
485
|
-
?? previous?.bindingGeneration;
|
|
488
|
+
const bindingGeneration =
|
|
489
|
+
nativeBindingGeneration ?? input.bindingGeneration ?? previous?.bindingGeneration;
|
|
486
490
|
if (bindingGeneration === undefined) {
|
|
487
491
|
return actorRef;
|
|
488
492
|
}
|
|
@@ -518,10 +522,12 @@ function preserveInternalActorRefField(
|
|
|
518
522
|
source: ActorRef,
|
|
519
523
|
field: 'ownershipGeneration' | 'ownerLeaseGeneration'
|
|
520
524
|
): void {
|
|
521
|
-
const value = (
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
+
const value = (
|
|
526
|
+
source as ActorRef & {
|
|
527
|
+
readonly ownershipGeneration?: bigint;
|
|
528
|
+
readonly ownerLeaseGeneration?: bigint;
|
|
529
|
+
}
|
|
530
|
+
)[field];
|
|
525
531
|
if (value === undefined) return;
|
|
526
532
|
Object.defineProperty(target, field, {
|
|
527
533
|
configurable: false,
|
|
@@ -540,10 +546,10 @@ function isActorRefLike(
|
|
|
540
546
|
value: ZLinkActor | ActorRef | CompatibleActorRef
|
|
541
547
|
): value is CompatibleActorRef {
|
|
542
548
|
return (
|
|
543
|
-
typeof value === 'object'
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
549
|
+
typeof value === 'object' &&
|
|
550
|
+
'nodeRid' in value &&
|
|
551
|
+
'actorId' in value &&
|
|
552
|
+
('objectGeneration' in value || 'generation' in value)
|
|
547
553
|
);
|
|
548
554
|
}
|
|
549
555
|
|
|
@@ -584,22 +590,24 @@ function createBindingToken(): string {
|
|
|
584
590
|
}
|
|
585
591
|
|
|
586
592
|
function sameActorRef(left: ActorRef, right: ActorRef): boolean {
|
|
587
|
-
return
|
|
588
|
-
|
|
589
|
-
|
|
593
|
+
return (
|
|
594
|
+
routingIdsEqual(left.nodeRid, right.nodeRid) &&
|
|
595
|
+
left.actorId === right.actorId &&
|
|
596
|
+
BigInt(left.objectGeneration) === BigInt(right.objectGeneration)
|
|
597
|
+
);
|
|
590
598
|
}
|
|
591
599
|
|
|
592
600
|
function requireSameIncarnation(current: ActorRef, updated: ActorRef): void {
|
|
593
601
|
if (
|
|
594
|
-
current.actorId === updated.actorId
|
|
595
|
-
|
|
602
|
+
current.actorId === updated.actorId &&
|
|
603
|
+
BigInt(current.objectGeneration) === BigInt(updated.objectGeneration)
|
|
596
604
|
) {
|
|
597
605
|
return;
|
|
598
606
|
}
|
|
599
607
|
throw createInternalFrameworkException(
|
|
600
608
|
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
601
|
-
`Actor '${updated.actorId}' route update cannot replace object generation `
|
|
602
|
-
|
|
609
|
+
`Actor '${updated.actorId}' route update cannot replace object generation ` +
|
|
610
|
+
`${String(current.objectGeneration)} with ${String(updated.objectGeneration)}.`,
|
|
603
611
|
true
|
|
604
612
|
);
|
|
605
613
|
}
|
|
@@ -5,9 +5,7 @@ import type {
|
|
|
5
5
|
ZLinkSessionSendCall
|
|
6
6
|
} from '../../contracts';
|
|
7
7
|
import type { ZLinkSubmitResult } from '../messaging/submission-result';
|
|
8
|
-
import {
|
|
9
|
-
requireOneWayCompletion
|
|
10
|
-
} from '../messaging/submission-result';
|
|
8
|
+
import { requireOneWayCompletion } from '../messaging/submission-result';
|
|
11
9
|
import type { Message } from '../../contracts/Common/Message';
|
|
12
10
|
import { throwIfAborted } from '../abort';
|
|
13
11
|
import { ZLinkConfigurationException } from '../configuration';
|
|
@@ -160,11 +158,7 @@ export class DefaultZLinkSessionSendCall implements ZLinkSessionSendCall {
|
|
|
160
158
|
this.message
|
|
161
159
|
);
|
|
162
160
|
try {
|
|
163
|
-
const result = await this.context.stream.submitRaw(
|
|
164
|
-
message,
|
|
165
|
-
signal,
|
|
166
|
-
this.selectedTimeoutMs
|
|
167
|
-
);
|
|
161
|
+
const result = await this.context.stream.submitRaw(message, signal, this.selectedTimeoutMs);
|
|
168
162
|
requireOneWayCompletion(result, 'STREAM session send');
|
|
169
163
|
this.context.traceFrameWritten?.(ZLinkStreamMessageKind.Send, packetName, undefined);
|
|
170
164
|
} finally {
|
|
@@ -36,10 +36,7 @@ import {
|
|
|
36
36
|
DefaultZLinkSessionReplyCall,
|
|
37
37
|
DefaultZLinkSessionSendCall
|
|
38
38
|
} from './session-calls';
|
|
39
|
-
import {
|
|
40
|
-
ZLinkSessionRequestTracker,
|
|
41
|
-
type ZLinkPendingSessionRequest
|
|
42
|
-
} from './session-requests';
|
|
39
|
+
import { ZLinkSessionRequestTracker, type ZLinkPendingSessionRequest } from './session-requests';
|
|
43
40
|
import { ZLinkSessionLocalActorBindings } from './session-local-actors';
|
|
44
41
|
import type { ServiceActorRef } from '../foundation/service-stateful-registry';
|
|
45
42
|
import type { ServiceRetiredBoundSessionRouteFence } from '../foundation/service-stateful-wire-codec';
|
|
@@ -126,10 +123,13 @@ export class DefaultZLinkSessionContext implements ZLinkSessionContext {
|
|
|
126
123
|
correlationId: string | undefined
|
|
127
124
|
) => void;
|
|
128
125
|
private closingForActorReplacement = false;
|
|
129
|
-
private readonly retiredActorBindings = new Map<
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
126
|
+
private readonly retiredActorBindings = new Map<
|
|
127
|
+
string,
|
|
128
|
+
{
|
|
129
|
+
readonly actorGeneration: bigint;
|
|
130
|
+
readonly retiredSession: ServiceRetiredBoundSessionRouteFence;
|
|
131
|
+
}
|
|
132
|
+
>();
|
|
133
133
|
|
|
134
134
|
constructor(
|
|
135
135
|
private readonly runtime: ZLinkSessionContextRuntime,
|
|
@@ -173,11 +173,13 @@ export class DefaultZLinkSessionContext implements ZLinkSessionContext {
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
/** Wired by the owning session runtime; see ZLinkSessionCallContext.traceFrameWritten. */
|
|
176
|
-
setFrameWrittenObserver(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
176
|
+
setFrameWrittenObserver(
|
|
177
|
+
observer: (
|
|
178
|
+
kind: ZLinkStreamMessageKind,
|
|
179
|
+
packetName: string,
|
|
180
|
+
correlationId: string | undefined
|
|
181
|
+
) => void
|
|
182
|
+
): void {
|
|
181
183
|
this.frameWrittenObserver = observer;
|
|
182
184
|
}
|
|
183
185
|
|
|
@@ -199,9 +201,9 @@ export class DefaultZLinkSessionContext implements ZLinkSessionContext {
|
|
|
199
201
|
): boolean {
|
|
200
202
|
const previous = this.retiredActorBindings.get(actor.actorId);
|
|
201
203
|
if (
|
|
202
|
-
previous !== undefined
|
|
203
|
-
|
|
204
|
-
|
|
204
|
+
previous !== undefined &&
|
|
205
|
+
previous.actorGeneration === actor.generation &&
|
|
206
|
+
sameRetiredSession(previous.retiredSession, retiredSession)
|
|
205
207
|
) {
|
|
206
208
|
return false;
|
|
207
209
|
}
|
|
@@ -219,17 +221,19 @@ export class DefaultZLinkSessionContext implements ZLinkSessionContext {
|
|
|
219
221
|
): boolean {
|
|
220
222
|
const expected = this.retiredActorBindings.get(actor.actorId);
|
|
221
223
|
if (
|
|
222
|
-
expected === undefined
|
|
223
|
-
|
|
224
|
-
|
|
224
|
+
expected === undefined ||
|
|
225
|
+
expected.actorGeneration !== actor.generation ||
|
|
226
|
+
!sameRetiredSession(expected.retiredSession, retiredSession)
|
|
225
227
|
) {
|
|
226
228
|
return false;
|
|
227
229
|
}
|
|
228
230
|
const current = this.findBoundActor(actor.actorId);
|
|
229
231
|
if (current === undefined) return true;
|
|
230
232
|
const currentRef = current.ref as ActorRef & { readonly bindingGeneration?: bigint };
|
|
231
|
-
return
|
|
232
|
-
|
|
233
|
+
return (
|
|
234
|
+
BigInt(currentRef.objectGeneration) === actor.generation &&
|
|
235
|
+
currentRef.bindingGeneration === retiredSession.retiredBindingGeneration
|
|
236
|
+
);
|
|
233
237
|
}
|
|
234
238
|
|
|
235
239
|
createTextMessage(payload: string): Message {
|
|
@@ -372,13 +376,14 @@ class DefaultZLinkSessionHandlerRegistry implements ZLinkSessionHandlerRegistry
|
|
|
372
376
|
`Session packet '${packetName}' is already registered.`
|
|
373
377
|
);
|
|
374
378
|
}
|
|
375
|
-
if (
|
|
379
|
+
if (
|
|
380
|
+
typeof (handlerType as { prototype?: { handle?: unknown } }).prototype?.handle !== 'function'
|
|
381
|
+
) {
|
|
376
382
|
throw new TypeError(`Session handler '${handlerType.name}' must implement handle(...).`);
|
|
377
383
|
}
|
|
378
|
-
this.handlersByPacket.set(
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
);
|
|
384
|
+
this.handlersByPacket.set(packetName, {
|
|
385
|
+
handlerType: handlerType as Type<ZLinkSessionPacketHandler<ZLinkSessionContext>>
|
|
386
|
+
});
|
|
382
387
|
return this;
|
|
383
388
|
}
|
|
384
389
|
|
|
@@ -386,7 +391,10 @@ class DefaultZLinkSessionHandlerRegistry implements ZLinkSessionHandlerRegistry
|
|
|
386
391
|
this.registrationOpen = false;
|
|
387
392
|
}
|
|
388
393
|
|
|
389
|
-
async tryHandle(
|
|
394
|
+
async tryHandle(
|
|
395
|
+
dispatch: import('../../contracts').ZLinkSessionDispatchContext,
|
|
396
|
+
payload: ZLinkMessage
|
|
397
|
+
): Promise<boolean> {
|
|
390
398
|
const registration = this.handlersByPacket.get(dispatch.packetName);
|
|
391
399
|
if (registration === undefined) {
|
|
392
400
|
return false;
|
|
@@ -407,9 +415,11 @@ class DefaultZLinkSessionHandlerRegistry implements ZLinkSessionHandlerRegistry
|
|
|
407
415
|
private async createHandler(
|
|
408
416
|
handlerType: Type<ZLinkSessionPacketHandler<ZLinkSessionContext>>
|
|
409
417
|
): Promise<ZLinkSessionPacketHandler<ZLinkSessionContext>> {
|
|
410
|
-
return
|
|
411
|
-
|
|
412
|
-
|
|
418
|
+
return (
|
|
419
|
+
this.providerResolver?.get?.(handlerType) ??
|
|
420
|
+
(await this.providerResolver?.create?.(handlerType)) ??
|
|
421
|
+
new handlerType()
|
|
422
|
+
);
|
|
413
423
|
}
|
|
414
424
|
}
|
|
415
425
|
|
|
@@ -420,7 +430,8 @@ interface SessionHandlerRegistration {
|
|
|
420
430
|
|
|
421
431
|
function sessionHandlerPacketName(handlerType: new (...args: never[]) => unknown): string {
|
|
422
432
|
const declared = readZLinkDecoratorMetadata(handlerType)
|
|
423
|
-
.find((metadata) => metadata.kind === 'packet')
|
|
433
|
+
.find((metadata) => metadata.kind === 'packet')
|
|
434
|
+
?.packetName?.trim();
|
|
424
435
|
if (declared === undefined || declared.length === 0) {
|
|
425
436
|
throw new ZLinkConfigurationException(
|
|
426
437
|
`Session handler '${handlerType.name}' must declare a packet name with @ZLinkPacket(...).`
|
|
@@ -489,9 +500,9 @@ export class DefaultZLinkSessionActor implements ZLinkSessionActor {
|
|
|
489
500
|
}
|
|
490
501
|
if (BigInt(ref.objectGeneration) !== BigInt(this.currentRef.objectGeneration)) {
|
|
491
502
|
throw new Error(
|
|
492
|
-
`Cannot change session actor '${this.actorId}' object generation `
|
|
493
|
-
|
|
494
|
-
|
|
503
|
+
`Cannot change session actor '${this.actorId}' object generation ` +
|
|
504
|
+
`from ${String(this.currentRef.objectGeneration)} ` +
|
|
505
|
+
`to ${String(ref.objectGeneration)}.`
|
|
495
506
|
);
|
|
496
507
|
}
|
|
497
508
|
this.currentRef = ref;
|
|
@@ -508,9 +519,7 @@ export class DefaultZLinkSessionActor implements ZLinkSessionActor {
|
|
|
508
519
|
payloadOrSignal?: ZLinkMessage | AbortSignal,
|
|
509
520
|
signal?: AbortSignal
|
|
510
521
|
): Promise<void> {
|
|
511
|
-
const dispatch = isSessionDispatchContext(dispatchOrPayload)
|
|
512
|
-
? dispatchOrPayload
|
|
513
|
-
: undefined;
|
|
522
|
+
const dispatch = isSessionDispatchContext(dispatchOrPayload) ? dispatchOrPayload : undefined;
|
|
514
523
|
let payload: ZLinkMessage;
|
|
515
524
|
let relaySignal: AbortSignal | undefined;
|
|
516
525
|
let header: ZLinkStreamFrameHeader | undefined;
|
|
@@ -537,7 +546,9 @@ export class DefaultZLinkSessionActor implements ZLinkSessionActor {
|
|
|
537
546
|
|
|
538
547
|
const SESSION_DISPATCH_HEADERS = new WeakMap<ZLinkSessionDispatchContext, ZLinkStreamFrameHeader>();
|
|
539
548
|
|
|
540
|
-
export function createSessionDispatchContext(
|
|
549
|
+
export function createSessionDispatchContext(
|
|
550
|
+
header: ZLinkStreamFrameHeader
|
|
551
|
+
): ZLinkSessionDispatchContext {
|
|
541
552
|
const dispatch: ZLinkSessionDispatchContext = {
|
|
542
553
|
packetName: header.name,
|
|
543
554
|
metadata: header.metadata,
|
|
@@ -548,15 +559,20 @@ export function createSessionDispatchContext(header: ZLinkStreamFrameHeader): ZL
|
|
|
548
559
|
}
|
|
549
560
|
|
|
550
561
|
function isSessionDispatchContext(value: unknown): value is ZLinkSessionDispatchContext {
|
|
551
|
-
return
|
|
552
|
-
|
|
553
|
-
|
|
562
|
+
return (
|
|
563
|
+
value !== null &&
|
|
564
|
+
typeof value === 'object' &&
|
|
565
|
+
typeof (value as ZLinkSessionDispatchContext).packetName === 'string' &&
|
|
566
|
+
'canReply' in value
|
|
567
|
+
);
|
|
554
568
|
}
|
|
555
569
|
|
|
556
570
|
function sessionDispatchHeader(dispatch: ZLinkSessionDispatchContext): ZLinkStreamFrameHeader {
|
|
557
571
|
const header = SESSION_DISPATCH_HEADERS.get(dispatch);
|
|
558
572
|
if (header === undefined) {
|
|
559
|
-
throw new Error(
|
|
573
|
+
throw new Error(
|
|
574
|
+
'Session actor relay dispatch must be the context supplied to the active session handler.'
|
|
575
|
+
);
|
|
560
576
|
}
|
|
561
577
|
return header;
|
|
562
578
|
}
|
|
@@ -600,10 +616,12 @@ function sameRetiredSession(
|
|
|
600
616
|
left: ServiceRetiredBoundSessionRouteFence,
|
|
601
617
|
right: ServiceRetiredBoundSessionRouteFence
|
|
602
618
|
): boolean {
|
|
603
|
-
return
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
619
|
+
return (
|
|
620
|
+
left.sessionOwnerNodeRid === right.sessionOwnerNodeRid &&
|
|
621
|
+
left.sessionOwnerNodeGeneration === right.sessionOwnerNodeGeneration &&
|
|
622
|
+
left.sessionOwnerId === right.sessionOwnerId &&
|
|
623
|
+
left.sessionOwnerLeaseGeneration === right.sessionOwnerLeaseGeneration &&
|
|
624
|
+
left.sessionRid === right.sessionRid &&
|
|
625
|
+
left.retiredBindingGeneration === right.retiredBindingGeneration
|
|
626
|
+
);
|
|
609
627
|
}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
Type,
|
|
3
|
-
ZLinkSession,
|
|
4
|
-
ZLinkSessionFactory
|
|
5
|
-
} from '../../contracts';
|
|
1
|
+
import type { Type, ZLinkSession, ZLinkSessionFactory } from '../../contracts';
|
|
6
2
|
import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
|
|
7
3
|
import type { DefaultZLinkSessionContext } from './session-context';
|
|
8
4
|
|
|
@@ -45,6 +41,8 @@ async function createProviderInstance<T>(
|
|
|
45
41
|
}
|
|
46
42
|
|
|
47
43
|
function isSessionFactory(value: unknown): value is ZLinkSessionFactory {
|
|
48
|
-
return
|
|
49
|
-
|
|
44
|
+
return (
|
|
45
|
+
typeof (value as { create?: unknown }).create === 'function' &&
|
|
46
|
+
(value as { context?: unknown }).context === undefined
|
|
47
|
+
);
|
|
50
48
|
}
|
|
@@ -46,10 +46,12 @@ export class ZLinkSessionSerialExecutor {
|
|
|
46
46
|
|
|
47
47
|
executeFinal(work: () => Promise<void>): Promise<void> {
|
|
48
48
|
if (this.closed) {
|
|
49
|
-
return Promise.reject(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
return Promise.reject(
|
|
50
|
+
createInternalFrameworkException(
|
|
51
|
+
ZLinkFrameworkInternalErrorKind.RuntimeShutdown,
|
|
52
|
+
'Session execution queue is closed.'
|
|
53
|
+
)
|
|
54
|
+
);
|
|
53
55
|
}
|
|
54
56
|
const boundWork = bindApplicationJobPermit(work);
|
|
55
57
|
return hasApplicationJobPermit()
|
|
@@ -69,8 +71,7 @@ export class ZLinkSessionSerialExecutor {
|
|
|
69
71
|
const submitted = hasApplicationJobPermit()
|
|
70
72
|
? this.scheduler.submitPreAdmitted(boundWork, serialOptions)
|
|
71
73
|
: this.scheduler.submit(boundWork, serialOptions);
|
|
72
|
-
void submitted
|
|
73
|
-
.catch(error => onRejected?.(error));
|
|
74
|
+
void submitted.catch((error) => onRejected?.(error));
|
|
74
75
|
return true;
|
|
75
76
|
}
|
|
76
77
|
|