@zlink-systems/framework 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +16 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +28 -0
- package/dist/runtime/activation-admission.js +57 -0
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +19 -17
- package/dist/runtime/actors/actor-handoff.d.ts +13 -7
- package/dist/runtime/actors/actor-handoff.js +36 -25
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +85 -123
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
- package/dist/runtime/actors/actor-remote-joiner.js +11 -17
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
- package/dist/runtime/actors/deferred-join-completion.js +21 -0
- package/dist/runtime/actors/index.d.ts +10 -8
- package/dist/runtime/actors/index.js +101 -73
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +7 -1
- package/dist/runtime/admission.js +11 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +8 -33
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
- package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
- package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -9
- package/dist/runtime/channels/channel-clients.js +68 -60
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -18
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
- package/dist/runtime/channels/channel-runtime-manager.js +4 -12
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
- package/dist/runtime/channels/channel-socket-registry.js +296 -235
- package/dist/runtime/channels/channel-transports.d.ts +11 -20
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +133 -81
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +22 -9
- package/dist/runtime/execution/index.js +107 -37
- package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
- package/dist/runtime/execution/serial-execution-queue.js +99 -26
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/listener-records.d.ts +11 -0
- package/dist/runtime/foundation/listener-records.js +20 -0
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
- package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
- package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
- package/dist/runtime/foundation/service-topology-registry.js +22 -61
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
- package/dist/runtime/host/actor-transfer-runtime.js +210 -256
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +19 -14
- package/dist/runtime/host/index.js +234 -175
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +11 -23
- package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
- package/dist/runtime/host/route-mesh-runtime.js +178 -257
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
- package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
- package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
- package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
- package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +5 -10
- package/dist/runtime/locations/lifecycle.js +4 -33
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +44 -30
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
- package/dist/runtime/locations/spot-location-claims.js +40 -23
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
- package/dist/runtime/spots/index.d.ts +29 -29
- package/dist/runtime/spots/index.js +441 -313
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
- package/dist/runtime/spots/spot-activation-registry.js +27 -60
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
- package/dist/runtime/spots/spot-activation-state.js +4 -17
- package/dist/runtime/spots/spot-activation.d.ts +10 -9
- package/dist/runtime/spots/spot-activation.js +103 -81
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
- package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
- package/dist/runtime/spots/spot-actor-membership.js +44 -53
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-entry-activation.js +9 -21
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +6 -5
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
- package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +10 -37
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
- package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
- package/dist/runtime/spots/spot-serial-executor.js +9 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
- package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
- package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +12 -19
- package/dist/runtime/streams/index.d.ts +15 -14
- package/dist/runtime/streams/index.js +38 -39
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/session-serial-executor.js +2 -2
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +15 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +72 -0
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +45 -39
- package/src/runtime/actors/actor-handoff.ts +55 -45
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +174 -215
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +15 -36
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/actor-source-transfer.ts +5 -18
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +44 -0
- package/src/runtime/actors/index.ts +122 -88
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +13 -2
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +15 -42
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
- package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
- package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
- package/src/runtime/backend/raw-binding-port.ts +14 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -31
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +8 -15
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +369 -262
- package/src/runtime/channels/channel-transports.ts +161 -115
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +175 -106
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +116 -38
- package/src/runtime/execution/serial-execution-queue.ts +179 -34
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/listener-records.ts +21 -0
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
- package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
- package/src/runtime/foundation/service-topology-registry.ts +30 -79
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +266 -418
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +408 -312
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +12 -44
- package/src/runtime/host/route-mesh-runtime.ts +236 -275
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
- package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
- package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +16 -45
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +90 -58
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +54 -26
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
- package/src/runtime/spots/index.ts +687 -437
- package/src/runtime/spots/spot-activation-registry.ts +42 -71
- package/src/runtime/spots/spot-activation-state.ts +4 -16
- package/src/runtime/spots/spot-activation.ts +167 -115
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
- package/src/runtime/spots/spot-actor-membership.ts +107 -75
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -33
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +29 -21
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
- package/src/runtime/spots/spot-outbound.ts +47 -68
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +10 -43
- package/src/runtime/spots/spot-serial-executor.ts +10 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +23 -37
- package/src/runtime/streams/index.ts +102 -88
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/session-serial-executor.ts +2 -2
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
- package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AsyncLocalStorage, AsyncResource } from 'node:async_hooks';
|
|
2
2
|
import type { Type, ZLinkMessageContext } from '../../contracts';
|
|
3
3
|
import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
|
|
4
|
-
import {
|
|
4
|
+
import type { ZLinkDetachedTaskRunner } from '../spots/spot-actor-join-dispatch';
|
|
5
5
|
|
|
6
6
|
export interface ZLinkHandlerInstanceScope {
|
|
7
7
|
resolve<T>(type: Type<T>): Promise<T>;
|
|
@@ -22,16 +22,6 @@ interface Deferred<T> {
|
|
|
22
22
|
readonly reject: (error: unknown) => void;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
interface HandlerResolution<T> {
|
|
26
|
-
readonly promise: Promise<T>;
|
|
27
|
-
readonly activation?: Deferred<unknown>;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
interface HandlerScopeDisposal {
|
|
31
|
-
readonly pending: readonly Promise<unknown>[];
|
|
32
|
-
readonly owned: readonly unknown[];
|
|
33
|
-
}
|
|
34
|
-
|
|
35
25
|
interface LifecycleScopeDisposal {
|
|
36
26
|
readonly completion: Promise<void>;
|
|
37
27
|
readonly deferred?: Deferred<void>;
|
|
@@ -41,9 +31,9 @@ interface LifecycleScopeDisposal {
|
|
|
41
31
|
const HANDLER_SCOPE_FACTORY = Symbol.for('@zlink-systems/framework.handler-instance-scope-factory');
|
|
42
32
|
const activeHandlerScope = new AsyncLocalStorage<ActiveHandlerScope>();
|
|
43
33
|
const activeLifecycleScope = new AsyncLocalStorage<LifecycleHandlerInstanceScope>();
|
|
44
|
-
const
|
|
34
|
+
const detachedLifecycleResource = new AsyncResource('zlink:handler-instance-scope');
|
|
45
35
|
const dispatchScopes = new WeakMap<object, ZLinkHandlerInstanceScope>();
|
|
46
|
-
const lifecycleScopes = new WeakMap<object,
|
|
36
|
+
const lifecycleScopes = new WeakMap<object, LifecycleHandlerInstanceScope>();
|
|
47
37
|
|
|
48
38
|
export async function runInHandlerInstanceScope<T>(
|
|
49
39
|
providerResolver: ZLinkProviderResolver | undefined,
|
|
@@ -80,14 +70,7 @@ export async function resolveLifecycleHandler<T>(
|
|
|
80
70
|
type: Type<T>,
|
|
81
71
|
providerResolver?: ZLinkProviderResolver
|
|
82
72
|
): Promise<T> {
|
|
83
|
-
|
|
84
|
-
if (scope === undefined) {
|
|
85
|
-
scope = Promise.resolve(
|
|
86
|
-
new LifecycleHandlerInstanceScope(createHandlerInstanceScope(providerResolver))
|
|
87
|
-
);
|
|
88
|
-
lifecycleScopes.set(owner, scope);
|
|
89
|
-
}
|
|
90
|
-
return (await scope).resolve(type);
|
|
73
|
+
return lifecycleHandlerScope(owner, providerResolver).resolve(type);
|
|
91
74
|
}
|
|
92
75
|
|
|
93
76
|
export async function runWithLifecycleHandler<THandler, TResult>(
|
|
@@ -96,25 +79,34 @@ export async function runWithLifecycleHandler<THandler, TResult>(
|
|
|
96
79
|
providerResolver: ZLinkProviderResolver | undefined,
|
|
97
80
|
callback: (handler: THandler) => Promise<TResult>
|
|
98
81
|
): Promise<TResult> {
|
|
82
|
+
return lifecycleHandlerScope(owner, providerResolver).run(type, callback);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function lifecycleHandlerScope(
|
|
86
|
+
owner: object,
|
|
87
|
+
providerResolver?: ZLinkProviderResolver
|
|
88
|
+
): LifecycleHandlerInstanceScope {
|
|
99
89
|
let scope = lifecycleScopes.get(owner);
|
|
100
90
|
if (scope === undefined) {
|
|
101
|
-
scope =
|
|
102
|
-
new LifecycleHandlerInstanceScope(createHandlerInstanceScope(providerResolver))
|
|
103
|
-
);
|
|
91
|
+
scope = new LifecycleHandlerInstanceScope(createHandlerInstanceScope(providerResolver));
|
|
104
92
|
lifecycleScopes.set(owner, scope);
|
|
105
93
|
}
|
|
106
|
-
return
|
|
94
|
+
return scope;
|
|
107
95
|
}
|
|
108
96
|
|
|
109
|
-
export async function disposeLifecycleHandlers(
|
|
97
|
+
export async function disposeLifecycleHandlers(
|
|
98
|
+
owner: object,
|
|
99
|
+
detachedTaskRunner: ZLinkDetachedTaskRunner
|
|
100
|
+
): Promise<void> {
|
|
101
|
+
if ((detachedTaskRunner as unknown) === undefined) {
|
|
102
|
+
throw new Error('Lifecycle handler disposal requires a detached task runner.');
|
|
103
|
+
}
|
|
110
104
|
const scope = lifecycleScopes.get(owner);
|
|
111
105
|
if (scope === undefined) return;
|
|
112
|
-
|
|
113
|
-
await resolved.dispose();
|
|
106
|
+
await scope.dispose(detachedTaskRunner);
|
|
114
107
|
// Keep the closed scope as a tombstone for the lifetime of the owner object.
|
|
115
108
|
// A late dispatch must fail instead of creating a second activation.
|
|
116
109
|
}
|
|
117
|
-
|
|
118
110
|
function createHandlerInstanceScope(
|
|
119
111
|
providerResolver?: ZLinkProviderResolver,
|
|
120
112
|
context?: ZLinkMessageContext
|
|
@@ -138,72 +130,47 @@ function isHandlerInstanceScopeFactory(value: unknown): value is ZLinkHandlerIns
|
|
|
138
130
|
}
|
|
139
131
|
|
|
140
132
|
class DefaultHandlerInstanceScope implements ZLinkHandlerInstanceScope {
|
|
141
|
-
private readonly lane = new ZLinkStateLane();
|
|
142
133
|
private readonly instances = new Map<Type, Promise<unknown>>();
|
|
143
134
|
private readonly owned: unknown[] = [];
|
|
144
135
|
private disposed = false;
|
|
145
136
|
|
|
146
137
|
constructor(private readonly providerResolver?: ZLinkProviderResolver) {}
|
|
147
138
|
|
|
148
|
-
|
|
149
|
-
const resolution = await this.lane.run(() => this.resolveCore(type));
|
|
150
|
-
if (resolution.activation !== undefined) {
|
|
151
|
-
startOutsideStateLane(() => {
|
|
152
|
-
void this.activate(type, resolution.activation!);
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
return await resolution.promise;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
async dispose(): Promise<void> {
|
|
159
|
-
const disposal = await this.lane.run(() => this.beginDisposeCore());
|
|
160
|
-
if (disposal === undefined) return;
|
|
161
|
-
|
|
162
|
-
await Promise.allSettled(disposal.pending);
|
|
163
|
-
for (const instance of disposal.owned) {
|
|
164
|
-
await disposeOwnedInstance(instance);
|
|
165
|
-
}
|
|
166
|
-
await this.lane.run(() => this.completeDisposeCore());
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
private resolveCore<T>(type: Type<T>): HandlerResolution<T> {
|
|
139
|
+
resolve<T>(type: Type<T>): Promise<T> {
|
|
170
140
|
if (this.disposed) {
|
|
171
|
-
|
|
141
|
+
return Promise.reject(new Error('Handler instance scope is already disposed.'));
|
|
172
142
|
}
|
|
173
|
-
|
|
174
|
-
if (
|
|
175
|
-
|
|
143
|
+
const existing = this.instances.get(type) as Promise<T> | undefined;
|
|
144
|
+
if (existing !== undefined) return existing;
|
|
176
145
|
const activation = createDeferred<unknown>();
|
|
177
|
-
instance = activation.promise as Promise<T>;
|
|
178
146
|
this.instances.set(type, activation.promise);
|
|
179
|
-
|
|
147
|
+
void this.activate(type, activation);
|
|
148
|
+
return activation.promise as Promise<T>;
|
|
180
149
|
}
|
|
181
150
|
|
|
182
|
-
|
|
183
|
-
if (this.disposed) return
|
|
151
|
+
async dispose(): Promise<void> {
|
|
152
|
+
if (this.disposed) return;
|
|
184
153
|
this.disposed = true;
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
this.owned.length = 0;
|
|
193
|
-
this.instances.clear();
|
|
154
|
+
await Promise.allSettled(this.instances.values());
|
|
155
|
+
try {
|
|
156
|
+
await disposeOwnedInstances(this.owned);
|
|
157
|
+
} finally {
|
|
158
|
+
this.owned.length = 0;
|
|
159
|
+
this.instances.clear();
|
|
160
|
+
}
|
|
194
161
|
}
|
|
195
|
-
|
|
196
162
|
private async activate<T>(type: Type<T>, activation: Deferred<unknown>): Promise<void> {
|
|
197
163
|
let instance: T;
|
|
198
164
|
try {
|
|
199
|
-
|
|
165
|
+
const created = this.providerResolver?.create?.(type);
|
|
166
|
+
instance = created === undefined ? new type() : await created;
|
|
200
167
|
} catch (error) {
|
|
201
168
|
activation.reject(error);
|
|
202
169
|
return;
|
|
203
170
|
}
|
|
204
171
|
|
|
205
|
-
|
|
206
|
-
|
|
172
|
+
if (!this.disposed) {
|
|
173
|
+
this.owned.push(instance);
|
|
207
174
|
activation.resolve(instance);
|
|
208
175
|
return;
|
|
209
176
|
}
|
|
@@ -214,16 +181,9 @@ class DefaultHandlerInstanceScope implements ZLinkHandlerInstanceScope {
|
|
|
214
181
|
activation.reject(error);
|
|
215
182
|
}
|
|
216
183
|
}
|
|
217
|
-
|
|
218
|
-
private acceptActivationCore(instance: unknown): boolean {
|
|
219
|
-
if (this.disposed) return false;
|
|
220
|
-
this.owned.push(instance);
|
|
221
|
-
return true;
|
|
222
|
-
}
|
|
223
184
|
}
|
|
224
185
|
|
|
225
186
|
class LifecycleHandlerInstanceScope {
|
|
226
|
-
private readonly lane = new ZLinkStateLane();
|
|
227
187
|
private activeInvocations = 0;
|
|
228
188
|
private closing = false;
|
|
229
189
|
private idle?: Promise<void>;
|
|
@@ -232,12 +192,7 @@ class LifecycleHandlerInstanceScope {
|
|
|
232
192
|
|
|
233
193
|
constructor(private readonly instances: ZLinkHandlerInstanceScope) {}
|
|
234
194
|
|
|
235
|
-
|
|
236
|
-
const resolution = await this.lane.run(() => ({ promise: this.resolveCore(type) }));
|
|
237
|
-
return await resolution.promise;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
private resolveCore<T>(type: Type<T>): Promise<T> {
|
|
195
|
+
resolve<T>(type: Type<T>): Promise<T> {
|
|
241
196
|
this.throwIfClosingCore();
|
|
242
197
|
return this.instances.resolve(type);
|
|
243
198
|
}
|
|
@@ -246,29 +201,34 @@ class LifecycleHandlerInstanceScope {
|
|
|
246
201
|
type: Type<THandler>,
|
|
247
202
|
callback: (handler: THandler) => Promise<TResult>
|
|
248
203
|
): Promise<TResult> {
|
|
249
|
-
|
|
204
|
+
this.beginInvocationCore();
|
|
250
205
|
try {
|
|
251
206
|
return await activeLifecycleScope.run(this, async () =>
|
|
252
207
|
callback(await this.instances.resolve(type))
|
|
253
208
|
);
|
|
254
209
|
} finally {
|
|
255
|
-
|
|
210
|
+
this.completeInvocationCore();
|
|
256
211
|
}
|
|
257
212
|
}
|
|
258
213
|
|
|
259
|
-
async dispose(): Promise<void> {
|
|
214
|
+
async dispose(detachedTaskRunner: ZLinkDetachedTaskRunner): Promise<void> {
|
|
260
215
|
const disposeFromActiveInvocation = activeLifecycleScope.getStore() === this;
|
|
261
|
-
const disposal =
|
|
216
|
+
const disposal = this.beginDisposeCore();
|
|
262
217
|
if (disposal.deferred !== undefined) {
|
|
263
|
-
|
|
218
|
+
startOutsideLifecycleInvocation(() => {
|
|
264
219
|
void this.disposeWhenIdle(disposal);
|
|
220
|
+
if (disposeFromActiveInvocation) {
|
|
221
|
+
detachedTaskRunner.runDetached(
|
|
222
|
+
LifecycleHandlerInstanceScope.name,
|
|
223
|
+
() => disposal.completion
|
|
224
|
+
);
|
|
225
|
+
}
|
|
265
226
|
});
|
|
266
227
|
}
|
|
267
228
|
if (disposeFromActiveInvocation) {
|
|
268
229
|
// Waiting here would make the current handler wait for its own terminal
|
|
269
230
|
// completion. The same disposal promise continues after run() releases
|
|
270
231
|
// the final active invocation.
|
|
271
|
-
void disposal.completion.catch(() => undefined);
|
|
272
232
|
return;
|
|
273
233
|
}
|
|
274
234
|
await disposal.completion;
|
|
@@ -318,7 +278,7 @@ class LifecycleHandlerInstanceScope {
|
|
|
318
278
|
await this.instances.dispose();
|
|
319
279
|
deferred.resolve();
|
|
320
280
|
} catch (error) {
|
|
321
|
-
|
|
281
|
+
this.failDisposalCore(deferred.promise);
|
|
322
282
|
deferred.reject(error);
|
|
323
283
|
}
|
|
324
284
|
}
|
|
@@ -340,8 +300,8 @@ function createDeferred<T>(): Deferred<T> {
|
|
|
340
300
|
return { promise, resolve, reject };
|
|
341
301
|
}
|
|
342
302
|
|
|
343
|
-
function
|
|
344
|
-
return
|
|
303
|
+
function startOutsideLifecycleInvocation<T>(work: () => T): T {
|
|
304
|
+
return detachedLifecycleResource.runInAsyncScope(work);
|
|
345
305
|
}
|
|
346
306
|
|
|
347
307
|
export async function disposeOwnedInstance(instance: unknown): Promise<void> {
|
|
@@ -359,3 +319,16 @@ export async function disposeOwnedInstance(instance: unknown): Promise<void> {
|
|
|
359
319
|
await value.onModuleDestroy();
|
|
360
320
|
}
|
|
361
321
|
}
|
|
322
|
+
|
|
323
|
+
export async function disposeOwnedInstances(instances: readonly unknown[]): Promise<void> {
|
|
324
|
+
const failures: unknown[] = [];
|
|
325
|
+
for (let index = instances.length - 1; index >= 0; index -= 1) {
|
|
326
|
+
try {
|
|
327
|
+
await disposeOwnedInstance(instances[index]);
|
|
328
|
+
} catch (error) {
|
|
329
|
+
failures.push(error);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (failures.length === 1) throw failures[0];
|
|
333
|
+
if (failures.length > 1) throw new AggregateError(failures, 'Handler scope cleanup failed.');
|
|
334
|
+
}
|
|
@@ -20,10 +20,6 @@ import {
|
|
|
20
20
|
type ZLinkRemoteActorPacketTarget,
|
|
21
21
|
type ZLinkRemoteBoundSessionTarget
|
|
22
22
|
} from '../actors';
|
|
23
|
-
import {
|
|
24
|
-
mergeRemoteBoundSessionTarget,
|
|
25
|
-
preferredRemoteBoundSessionTarget
|
|
26
|
-
} from '../actors/actor-runtime-state';
|
|
27
23
|
import type { DefaultZLinkActorManager } from '../actors';
|
|
28
24
|
import {
|
|
29
25
|
decodeRemoteActorSessionBinding,
|
|
@@ -44,13 +40,14 @@ import { streamMetadataMap } from '../actors/bound-session-wire';
|
|
|
44
40
|
import { decodeRoutingId, normalizeRoutingId, routingIdsEqual } from '../routing-id';
|
|
45
41
|
import { ZLinkSubmitStatus } from '../messaging/submission-result';
|
|
46
42
|
import type { DefaultZLinkSpotManager, ZLinkSpotNodeRuntimeManager } from '../spots';
|
|
47
|
-
import type { ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
|
|
48
43
|
import type { ZLinkDetachedTaskRunner } from '../spots/spot-actor-join-dispatch';
|
|
49
44
|
import type { ZLinkBoundSessionResponseTarget } from '../streams';
|
|
50
45
|
import type {
|
|
51
46
|
ZLinkBoundSessionResponsePort,
|
|
47
|
+
ZLinkSessionBindingConfirmationOptions,
|
|
52
48
|
ZLinkStreamActorLookupPort
|
|
53
49
|
} from '../streams/stream-binding-runtime-ports';
|
|
50
|
+
import type { ServiceStreamSessionBinding } from '../foundation/service-runtime-contracts';
|
|
54
51
|
import { actorSessionBindingRuntimeOwnerIfRegistered } from '../streams/actor-session-binding-runtime-owner';
|
|
55
52
|
import {
|
|
56
53
|
decodeStreamHeader,
|
|
@@ -65,10 +62,6 @@ import type { MeshRouterResolver } from './mesh-router-resolver';
|
|
|
65
62
|
import { ZLinkRemoteActorPacketTargetStore } from './remote-actor-packet-target-store';
|
|
66
63
|
import type { ZLinkStoreLocationResolvers } from '../locations';
|
|
67
64
|
|
|
68
|
-
const REMOTE_SESSION_BIND_RETRY_DEADLINE_MS = 30_000;
|
|
69
|
-
const REMOTE_SESSION_BIND_RETRY_INITIAL_DELAY_MS = 25;
|
|
70
|
-
const REMOTE_SESSION_BIND_RETRY_MAX_DELAY_MS = 1_000;
|
|
71
|
-
|
|
72
65
|
export interface ZLinkActorPacketRelayOptions {
|
|
73
66
|
readonly requestTimeoutMs?: number;
|
|
74
67
|
readonly routeTransport: ZLinkActorRoutedJoinTransport;
|
|
@@ -120,12 +113,7 @@ export class ZLinkActorPacketRelay {
|
|
|
120
113
|
): Promise<void> {
|
|
121
114
|
const state = this.options.actorManager()?.getState(actor.actorId);
|
|
122
115
|
const currentRemoteBoundSessionTarget =
|
|
123
|
-
state?.spotId === undefined
|
|
124
|
-
? undefined
|
|
125
|
-
: preferredRemoteBoundSessionTarget(
|
|
126
|
-
state.remoteBoundSessionTarget,
|
|
127
|
-
state.boundSessionTransferTarget
|
|
128
|
-
);
|
|
116
|
+
state?.spotId === undefined ? undefined : state.remoteBoundSessionTarget;
|
|
129
117
|
const currentRemoteActorPacketTarget =
|
|
130
118
|
state?.spotId === undefined ? undefined : state.remoteActorPacketTarget;
|
|
131
119
|
const remoteTarget =
|
|
@@ -162,11 +150,8 @@ export class ZLinkActorPacketRelay {
|
|
|
162
150
|
await this.targets.updateFromWire(actorId, value);
|
|
163
151
|
}
|
|
164
152
|
|
|
165
|
-
actorPacketTargetForState(
|
|
166
|
-
actorId
|
|
167
|
-
routerChannelIdHint?: string
|
|
168
|
-
): ZLinkRemoteActorPacketTarget | undefined {
|
|
169
|
-
return this.targets.targetForState(actorId, routerChannelIdHint);
|
|
153
|
+
actorPacketTargetForState(actorId: string): ZLinkRemoteActorPacketTarget | undefined {
|
|
154
|
+
return this.targets.targetForState(actorId);
|
|
170
155
|
}
|
|
171
156
|
|
|
172
157
|
async notifyActorDisconnectedById(actorId: string, signal?: AbortSignal): Promise<void> {
|
|
@@ -174,10 +159,7 @@ export class ZLinkActorPacketRelay {
|
|
|
174
159
|
const remoteTarget =
|
|
175
160
|
state === undefined
|
|
176
161
|
? undefined
|
|
177
|
-
: (
|
|
178
|
-
state.remoteBoundSessionTarget,
|
|
179
|
-
state.boundSessionTransferTarget
|
|
180
|
-
) ?? state.remoteActorPacketTarget);
|
|
162
|
+
: (state.remoteBoundSessionTarget ?? state.remoteActorPacketTarget);
|
|
181
163
|
if (remoteTarget !== undefined) {
|
|
182
164
|
await this.notifyRemoteActorDisconnected(actorId, remoteTarget, signal);
|
|
183
165
|
return;
|
|
@@ -288,66 +270,28 @@ export class ZLinkActorPacketRelay {
|
|
|
288
270
|
if (frameHeader.kind !== ZLinkStreamMessageKind.Send) {
|
|
289
271
|
throw new Error('Remote actor session binding requires a send frame.');
|
|
290
272
|
}
|
|
291
|
-
const { sessionNodeRid
|
|
292
|
-
messageToBytes(body)
|
|
293
|
-
);
|
|
273
|
+
const { sessionNodeRid } = decodeRemoteActorSessionBinding(messageToBytes(body));
|
|
294
274
|
if (!routingIdsEqual(sessionNodeRid, _routeContext.sourceNodeRid)) {
|
|
295
275
|
throw new Error(
|
|
296
276
|
'Remote actor session binding source did not match the declared session node.'
|
|
297
277
|
);
|
|
298
278
|
}
|
|
279
|
+
// The Actor owner installs the binding from the Session owner's
|
|
280
|
+
// command 38 (Session–Actor binding §5); this relay confirmation only
|
|
281
|
+
// acknowledges that the Actor is still owned here.
|
|
299
282
|
const state = this.options.actorManager()?.getState(relay.actorId);
|
|
300
|
-
|
|
301
|
-
if (state === undefined || actorRef === undefined) {
|
|
283
|
+
if (state?.nativeActorRef === undefined) {
|
|
302
284
|
throw new Error(`Actor '${relay.actorId}' does not have a concrete actor ref.`);
|
|
303
285
|
}
|
|
304
|
-
if (this.requireSpotNodeRuntime().primaryMeshNode === undefined) {
|
|
305
|
-
throw new Error('MeshNode actor runtime is not started.');
|
|
306
|
-
}
|
|
307
|
-
const target =
|
|
308
|
-
relay.routerChannelId === undefined
|
|
309
|
-
? this.options.meshRouters.remoteBoundSessionTargetForSource(sessionNodeRid)
|
|
310
|
-
: {
|
|
311
|
-
routerChannelId: relay.routerChannelId,
|
|
312
|
-
targetNodeRid: sessionNodeRid,
|
|
313
|
-
spotId: sessionNodeRid
|
|
314
|
-
};
|
|
315
|
-
if (target === undefined) {
|
|
316
|
-
throw new Error('Remote actor session binding did not declare a return router.');
|
|
317
|
-
}
|
|
318
|
-
const bindingGeneration = (
|
|
319
|
-
fallbackActorRef as
|
|
320
|
-
| (ActorRef & {
|
|
321
|
-
readonly bindingGeneration?: bigint;
|
|
322
|
-
})
|
|
323
|
-
| undefined
|
|
324
|
-
)?.bindingGeneration;
|
|
325
|
-
const refreshedTarget = mergeRemoteBoundSessionTarget(
|
|
326
|
-
{
|
|
327
|
-
...target,
|
|
328
|
-
sessionNodeRid,
|
|
329
|
-
sessionRid,
|
|
330
|
-
...(bindingGeneration === undefined ? {} : { bindingGeneration })
|
|
331
|
-
},
|
|
332
|
-
preferredRemoteBoundSessionTarget(
|
|
333
|
-
state.remoteBoundSessionTarget,
|
|
334
|
-
state.boundSessionTransferTarget
|
|
335
|
-
)
|
|
336
|
-
);
|
|
337
|
-
state.setRemoteBoundSessionTarget(refreshedTarget);
|
|
338
286
|
return { ok: true, response: { acknowledged: true } };
|
|
339
287
|
}
|
|
340
288
|
if (frameHeader.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET) {
|
|
341
289
|
this.requireCurrentRemoteBinding(relay, _routeContext);
|
|
342
|
-
this.options
|
|
343
|
-
.actorManager()
|
|
344
|
-
?.getState(relay.actorId)
|
|
345
|
-
?.setRemoteBoundSessionTarget(undefined);
|
|
346
290
|
await this.notifyLocalActorDisconnectedById(relay.actorId);
|
|
347
291
|
return {
|
|
348
292
|
ok: true,
|
|
349
293
|
actorPacketTarget: encodeRemoteActorPacketTarget(
|
|
350
|
-
this.actorPacketTargetForState(relay.actorId
|
|
294
|
+
this.actorPacketTargetForState(relay.actorId)
|
|
351
295
|
)
|
|
352
296
|
};
|
|
353
297
|
}
|
|
@@ -400,7 +344,7 @@ export class ZLinkActorPacketRelay {
|
|
|
400
344
|
return {
|
|
401
345
|
ok: true,
|
|
402
346
|
actorPacketTarget: encodeRemoteActorPacketTarget(
|
|
403
|
-
this.actorPacketTargetForState(relay.actorId
|
|
347
|
+
this.actorPacketTargetForState(relay.actorId)
|
|
404
348
|
)
|
|
405
349
|
};
|
|
406
350
|
}
|
|
@@ -472,7 +416,7 @@ export class ZLinkActorPacketRelay {
|
|
|
472
416
|
ok: true,
|
|
473
417
|
deferredResponse: true,
|
|
474
418
|
actorPacketTarget: encodeRemoteActorPacketTarget(
|
|
475
|
-
this.actorPacketTargetForState(relay.actorId
|
|
419
|
+
this.actorPacketTargetForState(relay.actorId)
|
|
476
420
|
)
|
|
477
421
|
};
|
|
478
422
|
}
|
|
@@ -497,7 +441,7 @@ export class ZLinkActorPacketRelay {
|
|
|
497
441
|
ok: true,
|
|
498
442
|
response,
|
|
499
443
|
actorPacketTarget: encodeRemoteActorPacketTarget(
|
|
500
|
-
this.actorPacketTargetForState(relay.actorId
|
|
444
|
+
this.actorPacketTargetForState(relay.actorId)
|
|
501
445
|
)
|
|
502
446
|
};
|
|
503
447
|
} catch (error) {
|
|
@@ -523,34 +467,10 @@ export class ZLinkActorPacketRelay {
|
|
|
523
467
|
payload: Message,
|
|
524
468
|
signal?: AbortSignal
|
|
525
469
|
): Promise<boolean> {
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
// relocation the cached packet target can carry a transiently
|
|
529
|
-
// incomplete Ready authority fence (route publication still
|
|
530
|
-
// converging); failing the request on the fence check would surface a
|
|
531
|
-
// NotFound for a Spot that exists and is Ready on its owner. Clear the
|
|
532
|
-
// stale hint and re-resolve with a short bound instead.
|
|
533
|
-
const fenceRetryDeadlineMs = performance.now() + 1_000;
|
|
534
|
-
for (;;) {
|
|
535
|
-
try {
|
|
536
|
-
if (await this.relayRemoteActorPacket(actor, frameHeader, payload, signal)) {
|
|
537
|
-
return true;
|
|
538
|
-
}
|
|
539
|
-
return await this.relayLocalActorPacket(actor, frameHeader, payload, signal);
|
|
540
|
-
} catch (error) {
|
|
541
|
-
if (
|
|
542
|
-
!(
|
|
543
|
-
error instanceof Error && error.message.includes('no complete Ready authority fence')
|
|
544
|
-
) ||
|
|
545
|
-
performance.now() >= fenceRetryDeadlineMs
|
|
546
|
-
) {
|
|
547
|
-
throw error;
|
|
548
|
-
}
|
|
549
|
-
this.targets.clear(actor.actorId);
|
|
550
|
-
this.options.actorManager()?.getState(actor.actorId)?.setRemoteActorPacketTarget(undefined);
|
|
551
|
-
await new Promise<void>((resolve) => setTimeout(resolve, 25));
|
|
552
|
-
}
|
|
470
|
+
if (await this.relayRemoteActorPacket(actor, frameHeader, payload, signal)) {
|
|
471
|
+
return true;
|
|
553
472
|
}
|
|
473
|
+
return this.relayLocalActorPacket(actor, frameHeader, payload, signal);
|
|
554
474
|
}
|
|
555
475
|
|
|
556
476
|
async confirmRemoteSessionBinding(
|
|
@@ -558,10 +478,13 @@ export class ZLinkActorPacketRelay {
|
|
|
558
478
|
sessionNodeRid: RoutingId,
|
|
559
479
|
sessionRid: RoutingId,
|
|
560
480
|
signal?: AbortSignal,
|
|
561
|
-
options?:
|
|
481
|
+
options?: ZLinkSessionBindingConfirmationOptions
|
|
562
482
|
): Promise<void> {
|
|
563
483
|
const target = this.targets.targetForActorRef(actor);
|
|
564
|
-
if (target === undefined)
|
|
484
|
+
if (target === undefined) {
|
|
485
|
+
this.installSameNodeSessionBinding(actor.actorId, options?.binding);
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
565
488
|
const header = encodeStreamHeader({
|
|
566
489
|
kind: ZLinkStreamMessageKind.Send,
|
|
567
490
|
codec: ZLinkStreamCodec.Json,
|
|
@@ -579,12 +502,9 @@ export class ZLinkActorPacketRelay {
|
|
|
579
502
|
payload: encodeRemoteActorSessionBinding({ sessionNodeRid, sessionRid })
|
|
580
503
|
});
|
|
581
504
|
if (options?.waitForAcknowledgement === false) {
|
|
582
|
-
await this.
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
performance.now() + REMOTE_SESSION_BIND_RETRY_DEADLINE_MS,
|
|
586
|
-
REMOTE_SESSION_BIND_RETRY_INITIAL_DELAY_MS
|
|
587
|
-
);
|
|
505
|
+
await this.options.routeTransport.sendToSpot(withDefaultSpotKind(target), request, {
|
|
506
|
+
packetName: ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
|
|
507
|
+
});
|
|
588
508
|
return;
|
|
589
509
|
}
|
|
590
510
|
const reply = await this.requestRemoteTarget<{
|
|
@@ -624,42 +544,38 @@ export class ZLinkActorPacketRelay {
|
|
|
624
544
|
}
|
|
625
545
|
}
|
|
626
546
|
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
649
|
-
'Remote actor session binding send retries exceeded their deadline.',
|
|
650
|
-
error
|
|
651
|
-
)
|
|
652
|
-
);
|
|
653
|
-
return;
|
|
654
|
-
}
|
|
655
|
-
await new Promise<void>((resolve) => setTimeout(resolve, delayMs));
|
|
656
|
-
await this.retryRemoteSessionBindingSend(
|
|
657
|
-
target,
|
|
658
|
-
request,
|
|
659
|
-
deadline,
|
|
660
|
-
Math.min(delayMs * 2, REMOTE_SESSION_BIND_RETRY_MAX_DELAY_MS)
|
|
547
|
+
/**
|
|
548
|
+
* Session–Actor binding §5·§6 (.NET ZLinkSessionActorCoordinator rule): a
|
|
549
|
+
* same-node bind installs the Session owner's registry identity through the
|
|
550
|
+
* same install a remote command 38 uses, so relocation seals and carries it.
|
|
551
|
+
*/
|
|
552
|
+
private installSameNodeSessionBinding(
|
|
553
|
+
actorId: string,
|
|
554
|
+
binding: ServiceStreamSessionBinding | undefined
|
|
555
|
+
): void {
|
|
556
|
+
// The Actor is gone (destroyed or relocated away): nothing to record.
|
|
557
|
+
const state = this.options.actorManager()?.getState(actorId);
|
|
558
|
+
// No registry binding exists only for a native-fallback bind, which has no
|
|
559
|
+
// Session owner registry (managed-stream.ts `bindActor` fallback).
|
|
560
|
+
if (state === undefined || binding === undefined) return;
|
|
561
|
+
const route = this.options.meshRouters.remoteBoundSessionTargetForSource(
|
|
562
|
+
binding.sessionOwnerNodeRid
|
|
563
|
+
);
|
|
564
|
+
if (route === undefined) {
|
|
565
|
+
throw createInternalFrameworkException(
|
|
566
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
567
|
+
`Actor '${actorId}' Session route is unavailable.`
|
|
661
568
|
);
|
|
662
569
|
}
|
|
570
|
+
state.installBoundSessionBinding({
|
|
571
|
+
...route,
|
|
572
|
+
sessionNodeRid: binding.sessionOwnerNodeRid,
|
|
573
|
+
sessionRid: binding.sessionRid,
|
|
574
|
+
sessionOwnerNodeGeneration: binding.sessionOwnerNodeGeneration,
|
|
575
|
+
sessionOwnerId: binding.sessionOwnerId,
|
|
576
|
+
sessionOwnerLeaseGeneration: binding.sessionOwnerLeaseGeneration,
|
|
577
|
+
bindingGeneration: binding.bindingGeneration
|
|
578
|
+
});
|
|
663
579
|
}
|
|
664
580
|
|
|
665
581
|
async relayRemoteActorPacket(
|
|
@@ -894,13 +810,7 @@ export class ZLinkActorPacketRelay {
|
|
|
894
810
|
routeContext: ZLinkRouteMessageContext
|
|
895
811
|
): void {
|
|
896
812
|
const state = this.options.actorManager()?.getState(relay.actorId);
|
|
897
|
-
const current =
|
|
898
|
-
state === undefined
|
|
899
|
-
? undefined
|
|
900
|
-
: preferredRemoteBoundSessionTarget(
|
|
901
|
-
state.remoteBoundSessionTarget,
|
|
902
|
-
state.boundSessionTransferTarget
|
|
903
|
-
);
|
|
813
|
+
const current = state?.boundSession;
|
|
904
814
|
if (
|
|
905
815
|
current === undefined ||
|
|
906
816
|
current.sessionNodeRid === undefined ||
|
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
} from '../locations/internal-store-contracts';
|
|
20
20
|
import { encodeAuthorityKey } from '../locations/authority-key-codec';
|
|
21
21
|
import { randomOperationId } from '../locations/creation-operation-id';
|
|
22
|
+
import { diagnosticTextOrAbsent } from '../diagnostics/diagnostic-text';
|
|
22
23
|
import type {
|
|
23
24
|
ServiceActorCreateRecord,
|
|
24
25
|
ServiceUserSpotReservationFence
|
|
@@ -84,9 +85,10 @@ export class ZLinkActorPlacementCoordinator {
|
|
|
84
85
|
timeoutMs: number,
|
|
85
86
|
signal?: AbortSignal
|
|
86
87
|
): Promise<ZLinkActorCreateResult> {
|
|
87
|
-
const deadline = createDeadline(timeoutMs, signal);
|
|
88
|
-
const deadlineMs = performance.now() + timeoutMs;
|
|
89
88
|
const deadlineUnixMs = Date.now() + timeoutMs;
|
|
89
|
+
const remainingMs = Math.max(0, deadlineUnixMs - Date.now());
|
|
90
|
+
const deadline = createDeadline(remainingMs, signal);
|
|
91
|
+
const deadlineMs = performance.now() + remainingMs;
|
|
90
92
|
const contentReference = encodeLocationCreationContent(requestPayload);
|
|
91
93
|
const requestSha256 = createHash('sha256').update(requestPayload).digest();
|
|
92
94
|
const excluded = new Set<string>();
|
|
@@ -130,7 +132,8 @@ export class ZLinkActorPlacementCoordinator {
|
|
|
130
132
|
creatingPayload,
|
|
131
133
|
capacity: { actors: 1, spots: 0 }
|
|
132
134
|
},
|
|
133
|
-
deadline.signal
|
|
135
|
+
deadline.signal,
|
|
136
|
+
BigInt(deadlineUnixMs)
|
|
134
137
|
);
|
|
135
138
|
const existing = existingActor(reserved, actorId, stableType);
|
|
136
139
|
if (existing !== undefined) {
|
|
@@ -204,7 +207,7 @@ export class ZLinkActorPlacementCoordinator {
|
|
|
204
207
|
remote.terminalResult,
|
|
205
208
|
remote.failureCode,
|
|
206
209
|
`Remote Actor '${actorId}' creation failed with result ${remote.terminalResult}, ` +
|
|
207
|
-
`failure code ${remote.failureCode}, and tail ${remote.tail?.kind
|
|
210
|
+
`failure code ${remote.failureCode}, and tail ${diagnosticTextOrAbsent(remote.tail?.kind)}.`
|
|
208
211
|
);
|
|
209
212
|
}
|
|
210
213
|
if (remote.tail?.kind !== 'actorCreate') {
|
|
@@ -213,7 +216,7 @@ export class ZLinkActorPlacementCoordinator {
|
|
|
213
216
|
throw createInternalFrameworkException(
|
|
214
217
|
ZLinkFrameworkInternalErrorKind.RequestProtocolError,
|
|
215
218
|
`Remote Actor '${actorId}' create reply carried tail ` +
|
|
216
|
-
`${remote.tail?.kind
|
|
219
|
+
`${diagnosticTextOrAbsent(remote.tail?.kind)} on an OK terminal.`
|
|
217
220
|
);
|
|
218
221
|
}
|
|
219
222
|
if (remote.tail.createResult === 'rejected') {
|