@zlink-systems/framework 0.30.3 → 0.32.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/Actors/ZLinkActor.d.ts +2 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
- package/dist/contracts/Actors/index.d.ts +1 -0
- package/dist/contracts/Actors/index.js +1 -0
- package/dist/contracts/Common/CoreTypes.d.ts +1 -0
- package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
- package/dist/contracts/Common/HandlerMessageType.js +41 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
- package/dist/contracts/Common/ZLinkMessage.js +11 -7
- package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
- package/dist/contracts/Common/encoded-payload-storage.js +4 -16
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/payload-slab.d.ts +4 -0
- package/dist/contracts/Common/payload-slab.js +30 -0
- package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
- package/dist/contracts/Handlers/Contexts.d.ts +1 -0
- package/dist/contracts/Locations/Authority.d.ts +2 -0
- package/dist/internal.d.ts +9 -0
- package/dist/internal.js +23 -1
- package/dist/nest-integration.d.ts +1 -0
- package/dist/nest-integration.js +3 -1
- package/dist/runtime/actors/actor-client.d.ts +6 -2
- package/dist/runtime/actors/actor-client.js +120 -82
- package/dist/runtime/actors/actor-context.js +16 -5
- package/dist/runtime/actors/actor-execution-context.js +2 -2
- package/dist/runtime/actors/actor-handoff.d.ts +12 -1
- package/dist/runtime/actors/actor-handoff.js +79 -34
- package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
- package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
- package/dist/runtime/actors/actor-local-native-join.js +19 -17
- package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
- package/dist/runtime/actors/actor-remote-joiner.js +4 -4
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
- package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
- package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
- package/dist/runtime/admission.d.ts +6 -4
- package/dist/runtime/admission.js +21 -10
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
- package/dist/runtime/backend/contracts/index.d.ts +26 -10
- package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
- package/dist/runtime/backend/mesh-completion-table.js +84 -20
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
- package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
- package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
- package/dist/runtime/channels/channel-clients.js +3 -3
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
- package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
- package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
- package/dist/runtime/channels/channel-dispatch-services.js +7 -6
- package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
- package/dist/runtime/channels/channel-dispatchers.js +57 -36
- package/dist/runtime/channels/channel-envelope.d.ts +2 -2
- package/dist/runtime/channels/channel-envelope.js +609 -83
- package/dist/runtime/channels/channel-multipart.d.ts +1 -0
- package/dist/runtime/channels/channel-multipart.js +10 -6
- package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
- package/dist/runtime/channels/channel-outbound-operations.js +107 -105
- package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
- package/dist/runtime/channels/channel-receive-loops.js +126 -90
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
- package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
- package/dist/runtime/channels/channel-runtime-manager.js +32 -14
- package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
- package/dist/runtime/channels/channel-socket-registry.js +9 -1
- package/dist/runtime/channels/channel-transports.d.ts +23 -16
- package/dist/runtime/channels/channel-transports.js +139 -119
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
- package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
- package/dist/runtime/channels/local-spot-route-transport.js +15 -18
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
- package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
- package/dist/runtime/channels/source-spot-router.d.ts +6 -3
- package/dist/runtime/channels/source-spot-router.js +34 -23
- package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-node-route-transport.js +23 -17
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
- package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
- package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
- package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
- package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
- package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
- package/dist/runtime/diagnostics/message-flow-record.js +228 -0
- package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
- package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
- package/dist/runtime/diagnostics/message-flow.js +42 -290
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
- package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
- package/dist/runtime/execution/index.d.ts +1 -0
- package/dist/runtime/execution/index.js +6 -3
- package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
- package/dist/runtime/execution/serial-execution-queue.js +75 -71
- package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
- package/dist/runtime/foundation/durable-service-request.js +158 -73
- package/dist/runtime/foundation/operation-registry.d.ts +33 -3
- package/dist/runtime/foundation/operation-registry.js +272 -33
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
- package/dist/runtime/foundation/request-runtime.d.ts +17 -0
- package/dist/runtime/foundation/request-runtime.js +163 -0
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +6 -0
- package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
- package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
- package/dist/runtime/foundation/service-mailbox.js +4 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
- package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
- package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
- package/dist/runtime/foundation/service-stateful-registry.js +38 -17
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
- package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
- package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
- package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-topology-registry.js +13 -3
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
- package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
- package/dist/runtime/host/actor-packet-relay.js +58 -57
- package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
- package/dist/runtime/host/application-job-queue.d.ts +7 -5
- package/dist/runtime/host/application-job-queue.js +33 -21
- package/dist/runtime/host/bound-session-relay.js +0 -1
- package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
- package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
- package/dist/runtime/host/entry-actor-runtime.js +2 -2
- package/dist/runtime/host/index.d.ts +106 -37
- package/dist/runtime/host/index.js +303 -151
- package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
- package/dist/runtime/host/location-runtime-owner.js +1 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
- package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
- package/dist/runtime/host/spot-address-transport.d.ts +3 -0
- package/dist/runtime/host/spot-address-transport.js +73 -76
- package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
- package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
- package/dist/runtime/internal-observation.d.ts +1 -0
- package/dist/runtime/internal-observation.js +5 -0
- package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
- package/dist/runtime/locations/actor-location-claims.js +15 -6
- package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
- package/dist/runtime/locations/auto-connect-loop.js +25 -19
- package/dist/runtime/locations/auto-connect-planner.js +2 -5
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
- package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.js +15 -5
- package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
- package/dist/runtime/locations/in-memory-location-store.js +1 -38
- package/dist/runtime/locations/lifecycle.d.ts +1 -1
- package/dist/runtime/locations/lifecycle.js +2 -2
- package/dist/runtime/locations/location-store-repository.d.ts +0 -1
- package/dist/runtime/locations/location-store-repository.js +163 -246
- package/dist/runtime/locations/resolvers.d.ts +8 -1
- package/dist/runtime/locations/resolvers.js +16 -2
- package/dist/runtime/locations/runtime.d.ts +3 -3
- package/dist/runtime/locations/runtime.js +12 -16
- package/dist/runtime/messaging/creation-payload-codec.js +8 -7
- package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
- package/dist/runtime/messaging/framework-json-v1.js +6 -2
- package/dist/runtime/messaging/payload-codec.js +21 -35
- package/dist/runtime/messaging/request-deadline.d.ts +4 -2
- package/dist/runtime/messaging/request-deadline.js +40 -25
- package/dist/runtime/messaging/request-result.d.ts +14 -1
- package/dist/runtime/messaging/request-result.js +74 -13
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
- package/dist/runtime/spots/index.d.ts +28 -7
- package/dist/runtime/spots/index.js +31 -6
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
- package/dist/runtime/spots/spot-activation-registry.js +13 -8
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
- package/dist/runtime/spots/spot-activation-state.js +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
- package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
- package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
- package/dist/runtime/spots/spot-actor-membership.js +3 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
- package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
- package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
- package/dist/runtime/spots/spot-entry-activation.js +7 -12
- package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
- package/dist/runtime/spots/spot-handler-registry.js +31 -15
- package/dist/runtime/spots/spot-manager-public.js +3 -2
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
- package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
- package/dist/runtime/spots/spot-outbound.d.ts +8 -2
- package/dist/runtime/spots/spot-outbound.js +5 -5
- package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
- package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
- package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
- package/dist/runtime/spots/spot-timer.d.ts +1 -1
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
- package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
- package/dist/runtime/streams/bound-session-service.js +6 -7
- package/dist/runtime/streams/index.d.ts +3 -3
- package/dist/runtime/streams/index.js +22 -2
- package/dist/runtime/streams/managed-stream.js +2 -1
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +3 -9
- package/dist/runtime/streams/session-context.d.ts +2 -2
- package/dist/runtime/streams/session-context.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
- package/dist/runtime/streams/stream-session-runtime.js +64 -33
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActor.ts +6 -0
- package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
- package/src/contracts/Actors/index.ts +1 -0
- package/src/contracts/Common/CoreTypes.ts +1 -0
- package/src/contracts/Common/HandlerMessageType.ts +50 -0
- package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
- package/src/contracts/Common/ZLinkMessage.ts +11 -7
- package/src/contracts/Common/encoded-payload-storage.ts +4 -16
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Common/payload-slab.ts +29 -0
- package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
- package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
- package/src/contracts/Handlers/Contexts.ts +1 -0
- package/src/contracts/Locations/Authority.ts +7 -1
- package/src/internal.ts +17 -0
- package/src/nest-integration.ts +1 -0
- package/src/runtime/actors/actor-client.ts +257 -163
- package/src/runtime/actors/actor-context.ts +26 -14
- package/src/runtime/actors/actor-execution-context.ts +2 -2
- package/src/runtime/actors/actor-handoff.ts +86 -51
- package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
- package/src/runtime/actors/actor-local-native-join.ts +38 -17
- package/src/runtime/actors/actor-mailbox.ts +1 -1
- package/src/runtime/actors/actor-remote-joiner.ts +8 -4
- package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
- package/src/runtime/actors/actor-routed-json-request.ts +3 -0
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
- package/src/runtime/actors/actor-runtime-state.ts +1 -1
- package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
- package/src/runtime/admission.ts +42 -15
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
- package/src/runtime/backend/contracts/index.ts +77 -10
- package/src/runtime/backend/mesh-completion-table.ts +106 -15
- package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
- package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
- package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
- package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
- package/src/runtime/backend/raw-binding-port.ts +13 -5
- package/src/runtime/channels/channel-clients.ts +26 -11
- package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
- package/src/runtime/channels/channel-dispatch-services.ts +7 -12
- package/src/runtime/channels/channel-dispatchers.ts +93 -39
- package/src/runtime/channels/channel-envelope.ts +680 -144
- package/src/runtime/channels/channel-multipart.ts +17 -13
- package/src/runtime/channels/channel-outbound-operations.ts +204 -178
- package/src/runtime/channels/channel-receive-loops.ts +160 -107
- package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
- package/src/runtime/channels/channel-runtime-manager.ts +74 -27
- package/src/runtime/channels/channel-socket-registry.ts +20 -5
- package/src/runtime/channels/channel-transports.ts +414 -287
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
- package/src/runtime/channels/local-spot-route-transport.ts +27 -29
- package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
- package/src/runtime/channels/source-spot-router.ts +75 -38
- package/src/runtime/channels/spot-node-route-transport.ts +67 -37
- package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
- package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
- package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
- package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
- package/src/runtime/diagnostics/message-flow-record.ts +295 -0
- package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
- package/src/runtime/diagnostics/message-flow.ts +49 -362
- package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
- package/src/runtime/execution/index.ts +6 -0
- package/src/runtime/execution/serial-execution-queue.ts +94 -96
- package/src/runtime/foundation/durable-service-request.ts +212 -89
- package/src/runtime/foundation/operation-registry.ts +287 -38
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
- package/src/runtime/foundation/request-runtime.ts +227 -0
- package/src/runtime/foundation/service-discovery-registry.ts +7 -0
- package/src/runtime/foundation/service-liveness-registry.ts +1 -1
- package/src/runtime/foundation/service-mailbox.ts +7 -2
- package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
- package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
- package/src/runtime/foundation/service-stateful-registry.ts +52 -19
- package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
- package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
- package/src/runtime/foundation/service-topology-registry.ts +21 -3
- package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
- package/src/runtime/host/actor-packet-relay.ts +160 -156
- package/src/runtime/host/actor-placement-coordinator.ts +1 -1
- package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
- package/src/runtime/host/actor-transfer-runtime.ts +3 -3
- package/src/runtime/host/application-job-queue.ts +56 -27
- package/src/runtime/host/bound-session-relay.ts +0 -1
- package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
- package/src/runtime/host/entry-actor-runtime.ts +14 -6
- package/src/runtime/host/index.ts +388 -113
- package/src/runtime/host/location-runtime-owner.ts +3 -3
- package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
- package/src/runtime/host/spot-address-transport.ts +110 -95
- package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
- package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
- package/src/runtime/internal-observation.ts +2 -0
- package/src/runtime/locations/actor-location-claims.ts +42 -16
- package/src/runtime/locations/auto-connect-loop.ts +24 -16
- package/src/runtime/locations/auto-connect-planner.ts +2 -5
- package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
- package/src/runtime/locations/in-memory-authority-store.ts +27 -7
- package/src/runtime/locations/in-memory-location-store.ts +1 -74
- package/src/runtime/locations/lifecycle.ts +4 -2
- package/src/runtime/locations/location-store-repository.ts +228 -308
- package/src/runtime/locations/resolvers.ts +20 -8
- package/src/runtime/locations/runtime.ts +16 -28
- package/src/runtime/messaging/creation-payload-codec.ts +12 -10
- package/src/runtime/messaging/framework-json-v1.ts +10 -1
- package/src/runtime/messaging/payload-codec.ts +50 -75
- package/src/runtime/messaging/request-deadline.ts +47 -39
- package/src/runtime/messaging/request-result.ts +88 -17
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/index.ts +57 -10
- package/src/runtime/spots/spot-activation-registry.ts +12 -8
- package/src/runtime/spots/spot-activation-state.ts +2 -0
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
- package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
- package/src/runtime/spots/spot-actor-membership.ts +8 -5
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
- package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
- package/src/runtime/spots/spot-entry-activation.ts +25 -35
- package/src/runtime/spots/spot-handler-registry.ts +72 -15
- package/src/runtime/spots/spot-manager-public.ts +4 -2
- package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
- package/src/runtime/spots/spot-outbound.ts +26 -10
- package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
- package/src/runtime/spots/spot-runtime-ports.ts +5 -2
- package/src/runtime/spots/spot-serial-executor.ts +1 -1
- package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
- package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
- package/src/runtime/spots/spot-timer.ts +1 -1
- package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
- package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
- package/src/runtime/streams/bound-session-service.ts +10 -7
- package/src/runtime/streams/index.ts +30 -4
- package/src/runtime/streams/managed-stream.ts +2 -1
- package/src/runtime/streams/session-calls.ts +9 -14
- package/src/runtime/streams/session-context.ts +6 -11
- package/src/runtime/streams/stream-session-runtime.ts +79 -40
- package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
- package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
- package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { RequestRuntime } from '../foundation/request-runtime';
|
|
2
|
+
import type { PendingOperation } from '../foundation/operation-registry';
|
|
3
|
+
import { waitRequestReply } from '../messaging/request-deadline';
|
|
4
|
+
import { mapZLinkRequestReply } from '../messaging/request-result';
|
|
1
5
|
import type { ServiceInstanceColdActivationTarget } from '../foundation/service-stateful-wire-codec';
|
|
2
6
|
import { ZLinkFrameworkException, ZLinkSpotKind, type RoutingId } from '../../contracts';
|
|
3
7
|
import {
|
|
@@ -52,6 +56,7 @@ import type {
|
|
|
52
56
|
} from '../spots/spot-routing-internal';
|
|
53
57
|
|
|
54
58
|
export interface ZLinkHostSpotAddressTransportOptions {
|
|
59
|
+
readonly requests?: RequestRuntime;
|
|
55
60
|
readonly resolver: () => ZLinkSpotRouteResolver | undefined;
|
|
56
61
|
readonly routed: ZLinkSpotRoutedTransport;
|
|
57
62
|
readonly meshNames: () => readonly string[];
|
|
@@ -81,7 +86,10 @@ type MissingTargetSelection =
|
|
|
81
86
|
|
|
82
87
|
/** Owns global Spot authority lookup and Missing Instance placement. */
|
|
83
88
|
export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport {
|
|
84
|
-
|
|
89
|
+
private readonly requests: RequestRuntime;
|
|
90
|
+
constructor(private readonly options: ZLinkHostSpotAddressTransportOptions) {
|
|
91
|
+
this.requests = options.requests ?? new RequestRuntime();
|
|
92
|
+
}
|
|
85
93
|
|
|
86
94
|
sendToSpotAddress(
|
|
87
95
|
spotId: RoutingId,
|
|
@@ -252,67 +260,74 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
|
|
|
252
260
|
call: ZLinkSpotAddressCallOptions
|
|
253
261
|
): Promise<TReply> {
|
|
254
262
|
const timeoutMs = call.timeoutMs ?? this.options.defaultRequestTimeoutMs;
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
const resolution = await this.resolveExisting(spotId, deadline.signal, call);
|
|
258
|
-
const existing = resolution !== undefined && !('kind' in resolution) ? resolution : undefined;
|
|
259
|
-
if (resolution !== undefined && 'kind' in resolution)
|
|
260
|
-
call = this.reactivationCall(resolution, call);
|
|
261
|
-
deadline.requireRemaining();
|
|
262
|
-
if (existing === undefined) {
|
|
263
|
-
return await this.requestToMissingInstance(spotId, request, call, deadline, resolution);
|
|
264
|
-
}
|
|
265
|
-
this.validateExisting(existing, call);
|
|
263
|
+
return this.requests.request(timeoutMs, call.signal, async (requestOperation) => {
|
|
264
|
+
const deadline = createSpotAddressDeadline(requestOperation, call.signal);
|
|
266
265
|
try {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
266
|
+
for (;;) {
|
|
267
|
+
deadline.requireRemaining();
|
|
268
|
+
const resolution = await waitRequestReply(
|
|
269
|
+
this.resolveExisting(spotId, deadline.signal, call),
|
|
270
|
+
'Spot address resolve',
|
|
271
|
+
requestOperation,
|
|
272
|
+
() => deadline.close()
|
|
273
|
+
);
|
|
274
|
+
const existing =
|
|
275
|
+
resolution !== undefined && !('kind' in resolution) ? resolution : undefined;
|
|
276
|
+
if (resolution !== undefined && 'kind' in resolution)
|
|
277
|
+
call = this.reactivationCall(resolution, call);
|
|
278
|
+
deadline.requireRemaining();
|
|
279
|
+
try {
|
|
280
|
+
if (existing === undefined) {
|
|
281
|
+
return await this.requestToMissingInstance(
|
|
282
|
+
spotId,
|
|
283
|
+
request,
|
|
284
|
+
call,
|
|
285
|
+
deadline,
|
|
286
|
+
resolution
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
this.validateExisting(existing, call);
|
|
290
|
+
return await this.requestToExistingSpot(spotId, request, call, existing, deadline);
|
|
291
|
+
} catch (error) {
|
|
292
|
+
if (
|
|
293
|
+
(existing !== undefined || isPreAdmissionStaleRoute(error)) &&
|
|
294
|
+
isSpotRouteRefreshError(error)
|
|
295
|
+
) {
|
|
296
|
+
this.options.resolver()?.invalidate?.(spotId);
|
|
297
|
+
}
|
|
298
|
+
// §9 keeps admission-before-stale-route handling in this logical request.
|
|
299
|
+
if (call.instanceSpot && isPreAdmissionStaleRoute(error)) continue;
|
|
300
|
+
if (existing !== undefined) {
|
|
301
|
+
this.reportInstanceRequestError(
|
|
302
|
+
spotId,
|
|
303
|
+
request,
|
|
304
|
+
error,
|
|
305
|
+
existing.routerChannelId,
|
|
306
|
+
existing.targetNodeRid,
|
|
307
|
+
existing.stableType,
|
|
308
|
+
addressedInstanceErrorReason(error)
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
throw error;
|
|
312
|
+
}
|
|
271
313
|
}
|
|
272
|
-
|
|
273
|
-
// refusal, made before admission. With Instance intent, one authority
|
|
274
|
-
// read under the same deadline decides: Missing means Close released
|
|
275
|
-
// the incarnation, so the request activates a new one. Any other
|
|
276
|
-
// answer, and any message the owner admitted, keeps this terminal.
|
|
314
|
+
} catch (error) {
|
|
277
315
|
if (
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
(await this.resolveExisting(spotId, deadline.signal)) === undefined
|
|
316
|
+
error instanceof ZLinkFrameworkException &&
|
|
317
|
+
internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.DeadlineExceeded
|
|
281
318
|
) {
|
|
282
|
-
|
|
283
|
-
|
|
319
|
+
throw createInternalFrameworkException(
|
|
320
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
321
|
+
`Spot request for '${String(spotId)}' exceeded its end-to-end deadline.`,
|
|
322
|
+
true,
|
|
323
|
+
error
|
|
324
|
+
);
|
|
284
325
|
}
|
|
285
|
-
this.reportInstanceRequestError(
|
|
286
|
-
spotId,
|
|
287
|
-
request,
|
|
288
|
-
error,
|
|
289
|
-
existing.routerChannelId,
|
|
290
|
-
existing.targetNodeRid,
|
|
291
|
-
existing.stableType,
|
|
292
|
-
addressedInstanceErrorReason(error)
|
|
293
|
-
);
|
|
294
326
|
throw error;
|
|
327
|
+
} finally {
|
|
328
|
+
deadline.close();
|
|
295
329
|
}
|
|
296
|
-
}
|
|
297
|
-
if (
|
|
298
|
-
deadline.expired() &&
|
|
299
|
-
!(
|
|
300
|
-
error instanceof ZLinkFrameworkException &&
|
|
301
|
-
internalFrameworkErrorKind(error) ===
|
|
302
|
-
ZLinkFrameworkInternalErrorKind.RequestTargetNotFound
|
|
303
|
-
)
|
|
304
|
-
) {
|
|
305
|
-
throw createInternalFrameworkException(
|
|
306
|
-
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
307
|
-
`Spot request for '${String(spotId)}' exceeded its end-to-end deadline.`,
|
|
308
|
-
true,
|
|
309
|
-
error
|
|
310
|
-
);
|
|
311
|
-
}
|
|
312
|
-
throw error;
|
|
313
|
-
} finally {
|
|
314
|
-
deadline.close();
|
|
315
|
-
}
|
|
330
|
+
});
|
|
316
331
|
}
|
|
317
332
|
|
|
318
333
|
private async requestToExistingSpot<TReply>(
|
|
@@ -331,16 +346,29 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
|
|
|
331
346
|
existing.stableType,
|
|
332
347
|
existing.targetNodeRid
|
|
333
348
|
);
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
349
|
+
// The address request owns the terminal entry. Observe the wire stage so
|
|
350
|
+
// a pre-admission refusal can reach the authority decision in §9.
|
|
351
|
+
const stage = new Promise<TReply>((resolve, reject) => {
|
|
352
|
+
const result = this.options.routed.requestToSpot<TReply>(
|
|
353
|
+
existing,
|
|
354
|
+
request,
|
|
355
|
+
{
|
|
356
|
+
instanceSpot: call.instanceSpot,
|
|
357
|
+
timeoutMs: deadline.requireRemaining(),
|
|
358
|
+
deadlineMs: deadline.deadlineMs,
|
|
359
|
+
signal: deadline.signal,
|
|
360
|
+
metadata: call.metadata,
|
|
361
|
+
onAdmitted: call.onAdmitted,
|
|
362
|
+
requestOperation: deadline.operation
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
operationCompleted: (_id, value) => resolve(value as TReply),
|
|
366
|
+
operationFailed: (_id, error) => reject(error)
|
|
367
|
+
}
|
|
368
|
+
);
|
|
369
|
+
if (result.operation === undefined) void mapZLinkRequestReply(result).then(resolve, reject);
|
|
370
|
+
});
|
|
371
|
+
const reply = await waitRequestReply(stage, 'Spot request', deadline.operation);
|
|
344
372
|
this.traceInstanceAddress(
|
|
345
373
|
ZLinkMessageFlowOutcome.ReplyReceived,
|
|
346
374
|
ZLinkDispatchMessageKind.Request,
|
|
@@ -418,9 +446,11 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
|
|
|
418
446
|
deadlineUnixMs,
|
|
419
447
|
call.sourceSpot === undefined ? undefined : String(call.sourceSpot.routingId),
|
|
420
448
|
call.metadata,
|
|
421
|
-
call.onAdmitted
|
|
449
|
+
call.onAdmitted,
|
|
450
|
+
deadline.operation
|
|
422
451
|
),
|
|
423
|
-
deadline.signal
|
|
452
|
+
deadline.signal,
|
|
453
|
+
deadline.operation
|
|
424
454
|
);
|
|
425
455
|
this.traceInstanceAddress(
|
|
426
456
|
ZLinkMessageFlowOutcome.Sent,
|
|
@@ -431,7 +461,7 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
|
|
|
431
461
|
selected.target.stableType,
|
|
432
462
|
selected.target.targetNodeRid
|
|
433
463
|
);
|
|
434
|
-
const completion = await
|
|
464
|
+
const completion = await completionPromise;
|
|
435
465
|
try {
|
|
436
466
|
if (completion.terminalResult !== 0 || completion.failureErrno !== 0) {
|
|
437
467
|
const error = missingInstanceRequestFailure(
|
|
@@ -754,19 +784,19 @@ function isSpotRouteRefreshError(error: unknown): error is ZLinkFrameworkExcepti
|
|
|
754
784
|
if (!(error instanceof ZLinkFrameworkException)) return false;
|
|
755
785
|
const kind = internalFrameworkErrorKind(error);
|
|
756
786
|
return (
|
|
787
|
+
isPreAdmissionStaleRoute(error) ||
|
|
757
788
|
kind === ZLinkFrameworkInternalErrorKind.SpotRouteNotFound ||
|
|
758
|
-
kind === ZLinkFrameworkInternalErrorKind.SpotGenerationStale ||
|
|
759
|
-
kind === ZLinkFrameworkInternalErrorKind.SpotMoving ||
|
|
760
789
|
kind === ZLinkFrameworkInternalErrorKind.RequestTargetNotFound ||
|
|
761
|
-
kind === ZLinkFrameworkInternalErrorKind.ActorLocationStale ||
|
|
762
790
|
kind === ZLinkFrameworkInternalErrorKind.RouteNotConnected
|
|
763
791
|
);
|
|
764
792
|
}
|
|
765
793
|
|
|
766
|
-
function
|
|
794
|
+
function isPreAdmissionStaleRoute(error: unknown): boolean {
|
|
767
795
|
return (
|
|
768
796
|
error instanceof ZLinkFrameworkException &&
|
|
769
|
-
internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.SpotMoving
|
|
797
|
+
(internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.SpotMoving ||
|
|
798
|
+
internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.ActorLocationStale ||
|
|
799
|
+
internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.SpotGenerationStale)
|
|
770
800
|
);
|
|
771
801
|
}
|
|
772
802
|
|
|
@@ -828,41 +858,28 @@ function addressedInstanceErrorReason(error: unknown): ZLinkDispatchErrorReason
|
|
|
828
858
|
}
|
|
829
859
|
|
|
830
860
|
interface ZLinkSpotAddressDeadline {
|
|
861
|
+
readonly operation: PendingOperation<unknown>;
|
|
831
862
|
readonly deadlineUnixMs: number;
|
|
863
|
+
readonly deadlineMs: number;
|
|
832
864
|
readonly signal: AbortSignal;
|
|
833
865
|
requireRemaining(): number;
|
|
834
|
-
expired(): boolean;
|
|
835
866
|
close(): void;
|
|
836
867
|
}
|
|
837
868
|
|
|
838
869
|
function createSpotAddressDeadline(
|
|
839
|
-
|
|
870
|
+
operation: PendingOperation<unknown>,
|
|
840
871
|
parent?: AbortSignal
|
|
841
872
|
): ZLinkSpotAddressDeadline {
|
|
842
873
|
const startedAtMs = performance.now();
|
|
843
874
|
const startedAtUnixMs = Date.now();
|
|
844
|
-
const deadlineMs =
|
|
875
|
+
const deadlineMs = operation.deadlineMs ?? Number.POSITIVE_INFINITY;
|
|
845
876
|
const controller = new AbortController();
|
|
846
|
-
let expired = false;
|
|
847
|
-
let timeout: ReturnType<typeof setTimeout> | undefined;
|
|
848
|
-
const expire = () => {
|
|
849
|
-
expired = true;
|
|
850
|
-
controller.abort();
|
|
851
|
-
};
|
|
852
|
-
const arm = () => {
|
|
853
|
-
if (timeout !== undefined) clearTimeout(timeout);
|
|
854
|
-
const remainingMs = deadlineMs - performance.now();
|
|
855
|
-
if (remainingMs <= 0) {
|
|
856
|
-
expire();
|
|
857
|
-
return;
|
|
858
|
-
}
|
|
859
|
-
timeout = setTimeout(expire, remainingMs);
|
|
860
|
-
};
|
|
861
|
-
arm();
|
|
862
877
|
const abort = () => controller.abort(parent?.reason);
|
|
863
878
|
if (parent?.aborted === true) abort();
|
|
864
879
|
else parent?.addEventListener('abort', abort, { once: true });
|
|
865
880
|
return {
|
|
881
|
+
operation,
|
|
882
|
+
deadlineMs,
|
|
866
883
|
get deadlineUnixMs() {
|
|
867
884
|
return Math.round(startedAtUnixMs + (deadlineMs - startedAtMs));
|
|
868
885
|
},
|
|
@@ -870,7 +887,6 @@ function createSpotAddressDeadline(
|
|
|
870
887
|
requireRemaining() {
|
|
871
888
|
const remainingMs = deadlineMs - performance.now();
|
|
872
889
|
if (remainingMs <= 0) {
|
|
873
|
-
expired = true;
|
|
874
890
|
throw createInternalFrameworkException(
|
|
875
891
|
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
876
892
|
'Spot address operation exceeded its end-to-end deadline.',
|
|
@@ -879,9 +895,8 @@ function createSpotAddressDeadline(
|
|
|
879
895
|
}
|
|
880
896
|
return Math.max(1, Math.ceil(remainingMs));
|
|
881
897
|
},
|
|
882
|
-
expired: () => expired,
|
|
883
898
|
close() {
|
|
884
|
-
|
|
899
|
+
controller.abort();
|
|
885
900
|
parent?.removeEventListener('abort', abort);
|
|
886
901
|
}
|
|
887
902
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
|
|
1
2
|
import { routingIdsEqual } from '../routing-id';
|
|
2
3
|
import type { ZLinkRuntimeEventPublisher } from '../diagnostics';
|
|
3
4
|
import { ZLinkSpotRelocationCoordinationMode, ZLinkUserSpotExecutionMode } from '../../contracts';
|
|
@@ -87,6 +88,8 @@ export class ZLinkSpotRuntimeOptionsFactory {
|
|
|
87
88
|
create(actorTransferRuntime: ZLinkActorTransferRuntime): Partial<ZLinkSpotManagerOptions> {
|
|
88
89
|
const spotRouterChannelIdForMesh = this.options.meshRouters.spotRouterChannelIdByMesh();
|
|
89
90
|
return {
|
|
91
|
+
defaultRequestTimeoutMs:
|
|
92
|
+
this.options.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
|
|
90
93
|
nodeRid: undefined,
|
|
91
94
|
nodeRidProvider: (meshName) => this.meshNodeRoutingId(meshName),
|
|
92
95
|
nodeGenerationProvider: (meshName) =>
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
type SpotRef,
|
|
6
6
|
type ZLinkSpotCreateResult,
|
|
7
7
|
ZLinkFrameworkException,
|
|
8
|
+
ZLinkFrameworkErrorKind,
|
|
8
9
|
ZLinkSpotCreateState
|
|
9
10
|
} from '../../contracts';
|
|
10
11
|
|
|
@@ -25,6 +26,7 @@ import {
|
|
|
25
26
|
wireReplyFailureException
|
|
26
27
|
} from '../framework-errors-internal';
|
|
27
28
|
import { encodeAuthorityKey } from '../locations/authority-key-codec';
|
|
29
|
+
import type { ZLinkOwnerLeaseTracker } from '../locations/lease-tracker';
|
|
28
30
|
import type {
|
|
29
31
|
ZLinkAuthoritySnapshot,
|
|
30
32
|
ZLinkLocationOwnerToken,
|
|
@@ -40,10 +42,11 @@ const DEFAULT_USER_SPOT_POLL_INTERVAL_MS = 10;
|
|
|
40
42
|
|
|
41
43
|
export interface ZLinkUserSpotCreationCoordinatorOptions {
|
|
42
44
|
readonly relocationPolicy?: (
|
|
43
|
-
meshName: string,
|
|
45
|
+
meshName: string | undefined,
|
|
44
46
|
stableType: string
|
|
45
47
|
) => import('../locations/internal-location-contracts').ZLinkObjectReserveRequest['actorRelocationPolicy'];
|
|
46
48
|
readonly store: ZLinkObjectCreationStore & ZLinkAuthorityStore;
|
|
49
|
+
readonly leaseTracker: Pick<ZLinkOwnerLeaseTracker, 'isOwnerTokenLive'>;
|
|
47
50
|
readonly target: (
|
|
48
51
|
request: Pick<ZLinkUserSpotCreationRequest, 'meshName' | 'stableType'>,
|
|
49
52
|
signal?: AbortSignal,
|
|
@@ -134,6 +137,16 @@ export class ZLinkUserSpotCreationCoordinator {
|
|
|
134
137
|
let target: Awaited<ReturnType<ZLinkUserSpotCreationCoordinatorOptions['target']>>;
|
|
135
138
|
let reserved: ZLinkObjectReserveResult;
|
|
136
139
|
for (;;) {
|
|
140
|
+
try {
|
|
141
|
+
const spot = await this.awaitReady(request, signal);
|
|
142
|
+
if (spot !== undefined) {
|
|
143
|
+
deadline.close();
|
|
144
|
+
return { result: { spot, state: ZLinkSpotCreateState.Existing }, spot };
|
|
145
|
+
}
|
|
146
|
+
} catch (error) {
|
|
147
|
+
deadline.close();
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
137
150
|
try {
|
|
138
151
|
target = await this.options.target(request, signal, excludedNodeRids);
|
|
139
152
|
} catch (error) {
|
|
@@ -147,6 +160,16 @@ export class ZLinkUserSpotCreationCoordinator {
|
|
|
147
160
|
);
|
|
148
161
|
}
|
|
149
162
|
if (target === undefined) {
|
|
163
|
+
try {
|
|
164
|
+
const current = await this.options.store.readAuthority(
|
|
165
|
+
encodeAuthorityKey('user_spot', String(request.spotId)),
|
|
166
|
+
signal
|
|
167
|
+
);
|
|
168
|
+
if (current.kind !== 'missing') continue;
|
|
169
|
+
} catch (error) {
|
|
170
|
+
deadline.close();
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
150
173
|
deadline.close();
|
|
151
174
|
throw createInternalFrameworkException(
|
|
152
175
|
ZLinkFrameworkInternalErrorKind.PlacementCapacityExhausted,
|
|
@@ -219,30 +242,14 @@ export class ZLinkUserSpotCreationCoordinator {
|
|
|
219
242
|
}
|
|
220
243
|
if (
|
|
221
244
|
reserved.kind === 'alreadyExists' ||
|
|
222
|
-
(reserved.kind === 'conflict' &&
|
|
223
|
-
|
|
224
|
-
reserved.current.allocation.objectKind === 'user_spot' &&
|
|
225
|
-
reserved.current.allocation.stableType === request.stableType)
|
|
226
|
-
) {
|
|
227
|
-
if (request.generatedIdentity === true) {
|
|
228
|
-
deadline.close();
|
|
229
|
-
throw spotIdConflict(request.spotId);
|
|
230
|
-
}
|
|
231
|
-
try {
|
|
232
|
-
const spot = await this.awaitReady(request, signal);
|
|
233
|
-
if (spot !== undefined) {
|
|
234
|
-
deadline.close();
|
|
235
|
-
return { result: { spot, state: ZLinkSpotCreateState.Existing }, spot };
|
|
236
|
-
}
|
|
237
|
-
} catch (error) {
|
|
238
|
-
deadline.close();
|
|
239
|
-
throw error;
|
|
240
|
-
}
|
|
245
|
+
(reserved.kind === 'conflict' && reserved.current.kind === 'snapshot')
|
|
246
|
+
)
|
|
241
247
|
continue;
|
|
242
|
-
|
|
243
|
-
if (reserved.kind
|
|
248
|
+
if (reserved.kind === 'placementCapacityExhausted') continue;
|
|
249
|
+
if (!(reserved.kind === 'conflict' && reserved.current.kind === 'missing')) break;
|
|
244
250
|
excludedNodeRids.add(encodeRoutingIdStorageHex(target.nodeRid));
|
|
245
251
|
}
|
|
252
|
+
|
|
246
253
|
if (reserved.kind === 'typeMismatch') {
|
|
247
254
|
deadline.close();
|
|
248
255
|
if (request.generatedIdentity === true) {
|
|
@@ -721,6 +728,7 @@ export class ZLinkUserSpotCreationCoordinator {
|
|
|
721
728
|
signal.throwIfAborted();
|
|
722
729
|
const current = await this.options.store.readAuthority(key, signal);
|
|
723
730
|
if (current.kind === 'missing') return undefined;
|
|
731
|
+
if (request.generatedIdentity === true) throw spotIdConflict(request.spotId);
|
|
724
732
|
if (
|
|
725
733
|
current.allocation.objectKind !== 'user_spot' ||
|
|
726
734
|
current.allocation.stableType !== request.stableType
|
|
@@ -730,6 +738,45 @@ export class ZLinkUserSpotCreationCoordinator {
|
|
|
730
738
|
`User Spot '${String(request.spotId)}' has another stable type.`
|
|
731
739
|
);
|
|
732
740
|
}
|
|
741
|
+
const ownerLive = await this.options.leaseTracker.isOwnerTokenLive(
|
|
742
|
+
{
|
|
743
|
+
ownerId: current.ownerId,
|
|
744
|
+
leaseGeneration: current.ownerLeaseGeneration
|
|
745
|
+
},
|
|
746
|
+
signal
|
|
747
|
+
);
|
|
748
|
+
if (!ownerLive || current.allocation.state !== 'active') {
|
|
749
|
+
const release = this.options.store.releaseEndedReservation;
|
|
750
|
+
if (release === undefined) {
|
|
751
|
+
throw new ZLinkFrameworkException(
|
|
752
|
+
ZLinkFrameworkErrorKind.NotConfigured,
|
|
753
|
+
'User Spot creation requires repository ended-owner release support.'
|
|
754
|
+
);
|
|
755
|
+
}
|
|
756
|
+
if (
|
|
757
|
+
await release.call(this.options.store, key, current.storeVersion.value, signal, {
|
|
758
|
+
key: { kind: 'user_spot', globalId: String(request.spotId) },
|
|
759
|
+
intent: { stableType: request.stableType },
|
|
760
|
+
actorRelocationPolicy: this.options.relocationPolicy?.(
|
|
761
|
+
request.meshName,
|
|
762
|
+
request.stableType
|
|
763
|
+
)
|
|
764
|
+
})
|
|
765
|
+
)
|
|
766
|
+
continue;
|
|
767
|
+
const confirmed = await this.options.store.readAuthority(key, signal);
|
|
768
|
+
if (
|
|
769
|
+
confirmed.kind === 'missing' ||
|
|
770
|
+
confirmed.storeVersion.value !== current.storeVersion.value
|
|
771
|
+
)
|
|
772
|
+
continue;
|
|
773
|
+
if (!ownerLive) {
|
|
774
|
+
throw new ZLinkFrameworkException(
|
|
775
|
+
ZLinkFrameworkErrorKind.Unavailable,
|
|
776
|
+
'User Spot authority owner lease is unavailable.'
|
|
777
|
+
);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
733
780
|
if (
|
|
734
781
|
current.allocation.state === 'active' &&
|
|
735
782
|
decodeServiceClosingSpotAuthority(current.payload) === undefined
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ZLinkFrameworkException, ZLinkFrameworkErrorKind } from '../../contracts/Errors';
|
|
1
2
|
import type { ActorRef, RoutingId } from '../../contracts/Common';
|
|
2
3
|
import {
|
|
3
4
|
ZLinkLocationKind,
|
|
@@ -214,7 +215,8 @@ export class ZLinkActorLocationClaims {
|
|
|
214
215
|
spotId: RoutingId,
|
|
215
216
|
spotGeneration: bigint,
|
|
216
217
|
spotKind: ZLinkSpotKind.Entry | ZLinkSpotKind.User,
|
|
217
|
-
ownerNodeGeneration: bigint
|
|
218
|
+
ownerNodeGeneration: bigint,
|
|
219
|
+
signal?: AbortSignal
|
|
218
220
|
): Promise<void> {
|
|
219
221
|
const actorId = actorRef.actorId;
|
|
220
222
|
const store = this.authorityStore;
|
|
@@ -223,14 +225,17 @@ export class ZLinkActorLocationClaims {
|
|
|
223
225
|
throw new Error('Actor membership commit requires Location Store authority and owner.');
|
|
224
226
|
}
|
|
225
227
|
const key = encodeAuthorityKey('actor', actorId);
|
|
226
|
-
const current = await store.readAuthority(key);
|
|
228
|
+
const current = await store.readAuthority(key, signal);
|
|
227
229
|
if (
|
|
228
230
|
!matchesActorAuthority(current, actorRef, owner) ||
|
|
229
231
|
current.allocation.stableType !== actorType ||
|
|
230
232
|
current.authorityOwnerGeneration !== authorityOwnerGeneration ||
|
|
231
233
|
current.allocation.descriptorLifecycleGeneration !== ownerNodeGeneration
|
|
232
234
|
) {
|
|
233
|
-
throw new
|
|
235
|
+
throw new ZLinkFrameworkException(
|
|
236
|
+
classifyMembershipAuthorityFailure(current, actorRef),
|
|
237
|
+
`Actor '${actorId}' membership authority fence does not match.`
|
|
238
|
+
);
|
|
234
239
|
}
|
|
235
240
|
const identity = decodeActorAuthorityIdentity(current.payload, current.objectGeneration);
|
|
236
241
|
if (
|
|
@@ -242,21 +247,33 @@ export class ZLinkActorLocationClaims {
|
|
|
242
247
|
!routingIdsEqual(identity.actor.nodeRid, actorRef.nodeRid) ||
|
|
243
248
|
identity.meshName !== actorRef.meshName
|
|
244
249
|
) {
|
|
245
|
-
throw new
|
|
250
|
+
throw new ZLinkFrameworkException(
|
|
251
|
+
ZLinkFrameworkErrorKind.Unavailable,
|
|
252
|
+
`Actor '${actorId}' membership authority identity does not match.`
|
|
253
|
+
);
|
|
246
254
|
}
|
|
247
|
-
const result = await store.compareExchangeAuthority(
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
255
|
+
const result = await store.compareExchangeAuthority(
|
|
256
|
+
key,
|
|
257
|
+
current.storeVersion,
|
|
258
|
+
{
|
|
259
|
+
kind: 'put',
|
|
260
|
+
generationTransition: 'preserve',
|
|
261
|
+
payload: rewriteActorAuthorityRoute(
|
|
262
|
+
current.payload,
|
|
263
|
+
actorRef,
|
|
264
|
+
String(spotId),
|
|
265
|
+
spotGeneration,
|
|
266
|
+
spotKind
|
|
267
|
+
)
|
|
268
|
+
},
|
|
269
|
+
signal
|
|
270
|
+
);
|
|
258
271
|
if (result.kind !== 'stored') {
|
|
259
|
-
throw new
|
|
272
|
+
throw new ZLinkFrameworkException(
|
|
273
|
+
result.kind === 'conflict'
|
|
274
|
+
? (result.membershipFailure ??
|
|
275
|
+
classifyMembershipAuthorityFailure(result.current, actorRef))
|
|
276
|
+
: ZLinkFrameworkErrorKind.InternalFailure,
|
|
260
277
|
`Actor '${actorId}' membership commit was rejected with status ${result.kind}.`
|
|
261
278
|
);
|
|
262
279
|
}
|
|
@@ -442,6 +459,15 @@ interface TrackedActor {
|
|
|
442
459
|
readonly deactivate?: () => Promise<void>;
|
|
443
460
|
}
|
|
444
461
|
|
|
462
|
+
function classifyMembershipAuthorityFailure(
|
|
463
|
+
current: { readonly kind: 'missing' } | ZLinkAuthoritySnapshot,
|
|
464
|
+
actorRef: ActorRef
|
|
465
|
+
): ZLinkFrameworkErrorKind {
|
|
466
|
+
return current.kind === 'snapshot' && current.objectGeneration !== actorRef.objectGeneration
|
|
467
|
+
? ZLinkFrameworkErrorKind.InvalidOperation
|
|
468
|
+
: ZLinkFrameworkErrorKind.Unavailable;
|
|
469
|
+
}
|
|
470
|
+
|
|
445
471
|
function matchesActorAuthority(
|
|
446
472
|
current: { readonly kind: 'missing' } | ZLinkAuthoritySnapshot,
|
|
447
473
|
actorRef: ActorRef,
|
|
@@ -6,7 +6,6 @@ import type { ZLinkDomainLocationStore as ZLinkLocationStore } from './domain-st
|
|
|
6
6
|
import type { ZLinkOwnerLeaseTracker } from './lease-tracker';
|
|
7
7
|
import type { ZLinkAutoConnectLocal } from './auto-connect-types';
|
|
8
8
|
import type { ZLinkAutoConnectReconciler } from './auto-connect-reconciler';
|
|
9
|
-
import { ZLinkStateLane } from '../execution/state-lane';
|
|
10
9
|
|
|
11
10
|
export interface ZLinkAutoConnectLoopOptions {
|
|
12
11
|
readonly reconciler: ZLinkAutoConnectReconciler;
|
|
@@ -19,7 +18,6 @@ export interface ZLinkAutoConnectLoopOptions {
|
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
export class ZLinkAutoConnectLoop {
|
|
22
|
-
private readonly lane = new ZLinkStateLane();
|
|
23
21
|
private readonly reconciler: ZLinkAutoConnectReconciler;
|
|
24
22
|
private readonly options: Required<ZLinkLocationOptionOverrides>;
|
|
25
23
|
private readonly meshName: string;
|
|
@@ -46,15 +44,19 @@ export class ZLinkAutoConnectLoop {
|
|
|
46
44
|
}
|
|
47
45
|
|
|
48
46
|
async start(signal?: AbortSignal): Promise<void> {
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
if (this.controller !== undefined) return;
|
|
48
|
+
// Reserve the lifecycle before yielding so stop also owns the first publication.
|
|
49
|
+
const controller = new AbortController();
|
|
50
|
+
this.controller = controller;
|
|
51
|
+
try {
|
|
52
|
+
await this.tick(signal);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
if (this.controller === controller) {
|
|
55
|
+
await this.prepareTransportShutdown();
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
this.scheduleNext(controller);
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
async requestPeerReconcile(meshName: string, _peerRid: string): Promise<void> {
|
|
@@ -91,8 +93,14 @@ export class ZLinkAutoConnectLoop {
|
|
|
91
93
|
|
|
92
94
|
async tick(signal?: AbortSignal): Promise<void> {
|
|
93
95
|
const controller = this.controller;
|
|
96
|
+
const tickSignal =
|
|
97
|
+
controller === undefined
|
|
98
|
+
? signal
|
|
99
|
+
: signal === undefined
|
|
100
|
+
? controller.signal
|
|
101
|
+
: AbortSignal.any([signal, controller.signal]);
|
|
94
102
|
await this.enqueueTick(async () => {
|
|
95
|
-
if (
|
|
103
|
+
if (tickSignal?.aborted !== true) await this.tickCore(tickSignal);
|
|
96
104
|
});
|
|
97
105
|
}
|
|
98
106
|
|
|
@@ -144,15 +152,15 @@ export class ZLinkAutoConnectLoop {
|
|
|
144
152
|
return this.lastTickFailed;
|
|
145
153
|
}
|
|
146
154
|
|
|
147
|
-
private scheduleNext(): void {
|
|
148
|
-
if (this.controller
|
|
155
|
+
private scheduleNext(controller: AbortController): void {
|
|
156
|
+
if (this.controller !== controller || controller.signal.aborted) {
|
|
149
157
|
return;
|
|
150
158
|
}
|
|
151
159
|
this.timer = this.setTimer(() => {
|
|
152
160
|
this.timer = undefined;
|
|
153
|
-
void this.tick(
|
|
161
|
+
void this.tick(controller.signal)
|
|
154
162
|
.catch(() => undefined)
|
|
155
|
-
.finally(() => this.scheduleNext());
|
|
163
|
+
.finally(() => this.scheduleNext(controller));
|
|
156
164
|
}, this.options.pollingIntervalMs);
|
|
157
165
|
}
|
|
158
166
|
}
|
|
@@ -130,14 +130,11 @@ function targetOf(peer: ZLinkPeerLocation): ZLinkAutoConnectTarget {
|
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
function isAutoConnectSelf(local: ZLinkAutoConnectLocal, peer: ZLinkPeerLocation): boolean {
|
|
133
|
-
|
|
133
|
+
return (
|
|
134
134
|
local.nodeRid !== undefined &&
|
|
135
135
|
peer.nodeRid !== undefined &&
|
|
136
136
|
routingIdsEqual(local.nodeRid, peer.nodeRid)
|
|
137
|
-
)
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
return peer.endpoint === local.endpoint;
|
|
137
|
+
);
|
|
141
138
|
}
|
|
142
139
|
|
|
143
140
|
function shouldDialAutoConnectPeer(local: ZLinkAutoConnectLocal, peer: ZLinkPeerLocation): boolean {
|