@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
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkHostSpotAddressTransport = void 0;
|
|
4
4
|
exports.hasObjectClientCapability = hasObjectClientCapability;
|
|
5
|
+
const request_runtime_1 = require("../foundation/request-runtime");
|
|
6
|
+
const request_deadline_1 = require("../messaging/request-deadline");
|
|
7
|
+
const request_result_1 = require("../messaging/request-result");
|
|
5
8
|
const contracts_1 = require("../../contracts");
|
|
6
9
|
const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
|
|
7
10
|
const abort_1 = require("../abort");
|
|
@@ -19,8 +22,10 @@ function hasObjectClientCapability(role) {
|
|
|
19
22
|
/** Owns global Spot authority lookup and Missing Instance placement. */
|
|
20
23
|
class ZLinkHostSpotAddressTransport {
|
|
21
24
|
options;
|
|
25
|
+
requests;
|
|
22
26
|
constructor(options) {
|
|
23
27
|
this.options = options;
|
|
28
|
+
this.requests = options.requests ?? new request_runtime_1.RequestRuntime();
|
|
24
29
|
}
|
|
25
30
|
sendToSpotAddress(spotId, message, call) {
|
|
26
31
|
// Call-scoped flow (spec 27 §4): the envelope encoders and the
|
|
@@ -92,61 +97,71 @@ class ZLinkHostSpotAddressTransport {
|
|
|
92
97
|
}
|
|
93
98
|
async requestToSpotAddressScoped(spotId, request, call) {
|
|
94
99
|
const timeoutMs = call.timeoutMs ?? this.options.defaultRequestTimeoutMs;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const resolution = await this.resolveExisting(spotId, deadline.signal, call);
|
|
98
|
-
const existing = resolution !== undefined && !('kind' in resolution) ? resolution : undefined;
|
|
99
|
-
if (resolution !== undefined && 'kind' in resolution)
|
|
100
|
-
call = this.reactivationCall(resolution, call);
|
|
101
|
-
deadline.requireRemaining();
|
|
102
|
-
if (existing === undefined) {
|
|
103
|
-
return await this.requestToMissingInstance(spotId, request, call, deadline, resolution);
|
|
104
|
-
}
|
|
105
|
-
this.validateExisting(existing, call);
|
|
100
|
+
return this.requests.request(timeoutMs, call.signal, async (requestOperation) => {
|
|
101
|
+
const deadline = createSpotAddressDeadline(requestOperation, call.signal);
|
|
106
102
|
try {
|
|
107
|
-
|
|
103
|
+
for (;;) {
|
|
104
|
+
deadline.requireRemaining();
|
|
105
|
+
const resolution = await (0, request_deadline_1.waitRequestReply)(this.resolveExisting(spotId, deadline.signal, call), 'Spot address resolve', requestOperation, () => deadline.close());
|
|
106
|
+
const existing = resolution !== undefined && !('kind' in resolution) ? resolution : undefined;
|
|
107
|
+
if (resolution !== undefined && 'kind' in resolution)
|
|
108
|
+
call = this.reactivationCall(resolution, call);
|
|
109
|
+
deadline.requireRemaining();
|
|
110
|
+
try {
|
|
111
|
+
if (existing === undefined) {
|
|
112
|
+
return await this.requestToMissingInstance(spotId, request, call, deadline, resolution);
|
|
113
|
+
}
|
|
114
|
+
this.validateExisting(existing, call);
|
|
115
|
+
return await this.requestToExistingSpot(spotId, request, call, existing, deadline);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if ((existing !== undefined || isPreAdmissionStaleRoute(error)) &&
|
|
119
|
+
isSpotRouteRefreshError(error)) {
|
|
120
|
+
this.options.resolver()?.invalidate?.(spotId);
|
|
121
|
+
}
|
|
122
|
+
// §9 keeps admission-before-stale-route handling in this logical request.
|
|
123
|
+
if (call.instanceSpot && isPreAdmissionStaleRoute(error))
|
|
124
|
+
continue;
|
|
125
|
+
if (existing !== undefined) {
|
|
126
|
+
this.reportInstanceRequestError(spotId, request, error, existing.routerChannelId, existing.targetNodeRid, existing.stableType, addressedInstanceErrorReason(error));
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
108
131
|
}
|
|
109
132
|
catch (error) {
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
// Failover policy §4.4: SpotMoving is the owner's Ready owner-fence
|
|
114
|
-
// refusal, made before admission. With Instance intent, one authority
|
|
115
|
-
// read under the same deadline decides: Missing means Close released
|
|
116
|
-
// the incarnation, so the request activates a new one. Any other
|
|
117
|
-
// answer, and any message the owner admitted, keeps this terminal.
|
|
118
|
-
if (call.instanceSpot &&
|
|
119
|
-
isOwnerFenceRefusal(error) &&
|
|
120
|
-
(await this.resolveExisting(spotId, deadline.signal)) === undefined) {
|
|
121
|
-
deadline.requireRemaining();
|
|
122
|
-
return await this.requestToMissingInstance(spotId, request, call, deadline);
|
|
133
|
+
if (error instanceof contracts_1.ZLinkFrameworkException &&
|
|
134
|
+
(0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded) {
|
|
135
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded, `Spot request for '${String(spotId)}' exceeded its end-to-end deadline.`, true, error);
|
|
123
136
|
}
|
|
124
|
-
this.reportInstanceRequestError(spotId, request, error, existing.routerChannelId, existing.targetNodeRid, existing.stableType, addressedInstanceErrorReason(error));
|
|
125
137
|
throw error;
|
|
126
138
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (deadline.expired() &&
|
|
130
|
-
!(error instanceof contracts_1.ZLinkFrameworkException &&
|
|
131
|
-
(0, framework_errors_internal_1.internalFrameworkErrorKind)(error) ===
|
|
132
|
-
framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound)) {
|
|
133
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded, `Spot request for '${String(spotId)}' exceeded its end-to-end deadline.`, true, error);
|
|
139
|
+
finally {
|
|
140
|
+
deadline.close();
|
|
134
141
|
}
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
finally {
|
|
138
|
-
deadline.close();
|
|
139
|
-
}
|
|
142
|
+
});
|
|
140
143
|
}
|
|
141
144
|
async requestToExistingSpot(spotId, request, call, existing, deadline) {
|
|
142
145
|
this.traceInstanceAddress(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Sent, ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Request, spotId, request, existing.routerChannelId, existing.stableType, existing.targetNodeRid);
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
146
|
+
// The address request owns the terminal entry. Observe the wire stage so
|
|
147
|
+
// a pre-admission refusal can reach the authority decision in §9.
|
|
148
|
+
const stage = new Promise((resolve, reject) => {
|
|
149
|
+
const result = this.options.routed.requestToSpot(existing, request, {
|
|
150
|
+
instanceSpot: call.instanceSpot,
|
|
151
|
+
timeoutMs: deadline.requireRemaining(),
|
|
152
|
+
deadlineMs: deadline.deadlineMs,
|
|
153
|
+
signal: deadline.signal,
|
|
154
|
+
metadata: call.metadata,
|
|
155
|
+
onAdmitted: call.onAdmitted,
|
|
156
|
+
requestOperation: deadline.operation
|
|
157
|
+
}, {
|
|
158
|
+
operationCompleted: (_id, value) => resolve(value),
|
|
159
|
+
operationFailed: (_id, error) => reject(error)
|
|
160
|
+
});
|
|
161
|
+
if (result.operation === undefined)
|
|
162
|
+
void (0, request_result_1.mapZLinkRequestReply)(result).then(resolve, reject);
|
|
163
|
+
});
|
|
164
|
+
const reply = await (0, request_deadline_1.waitRequestReply)(stage, 'Spot request', deadline.operation);
|
|
150
165
|
this.traceInstanceAddress(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.ReplyReceived, ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Request, spotId, request, existing.routerChannelId, existing.stableType, existing.targetNodeRid);
|
|
151
166
|
return reply;
|
|
152
167
|
}
|
|
@@ -174,9 +189,9 @@ class ZLinkHostSpotAddressTransport {
|
|
|
174
189
|
const table = this.options.completions(selected.meshName);
|
|
175
190
|
if (table === undefined)
|
|
176
191
|
throw new Error(`MeshNode '${selected.meshName}' completion table is not started.`);
|
|
177
|
-
const completionPromise = table.submit(() => selected.node.requestToMissingInstanceSpot(selected.target, encoded, deadlineUnixMs, call.sourceSpot === undefined ? undefined : String(call.sourceSpot.routingId), call.metadata, call.onAdmitted), deadline.signal);
|
|
192
|
+
const completionPromise = table.submit(() => selected.node.requestToMissingInstanceSpot(selected.target, encoded, deadlineUnixMs, call.sourceSpot === undefined ? undefined : String(call.sourceSpot.routingId), call.metadata, call.onAdmitted, deadline.operation), deadline.signal, deadline.operation);
|
|
178
193
|
this.traceInstanceAddress(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Sent, ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Request, spotId, request, selected.meshName, selected.target.stableType, selected.target.targetNodeRid);
|
|
179
|
-
const completion = await
|
|
194
|
+
const completion = await completionPromise;
|
|
180
195
|
try {
|
|
181
196
|
if (completion.terminalResult !== 0 || completion.failureErrno !== 0) {
|
|
182
197
|
const error = missingInstanceRequestFailure(completion.terminalResult, completion.failureErrno);
|
|
@@ -360,16 +375,16 @@ function isSpotRouteRefreshError(error) {
|
|
|
360
375
|
if (!(error instanceof contracts_1.ZLinkFrameworkException))
|
|
361
376
|
return false;
|
|
362
377
|
const kind = (0, framework_errors_internal_1.internalFrameworkErrorKind)(error);
|
|
363
|
-
return (
|
|
364
|
-
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.
|
|
365
|
-
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving ||
|
|
378
|
+
return (isPreAdmissionStaleRoute(error) ||
|
|
379
|
+
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotRouteNotFound ||
|
|
366
380
|
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound ||
|
|
367
|
-
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale ||
|
|
368
381
|
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected);
|
|
369
382
|
}
|
|
370
|
-
function
|
|
383
|
+
function isPreAdmissionStaleRoute(error) {
|
|
371
384
|
return (error instanceof contracts_1.ZLinkFrameworkException &&
|
|
372
|
-
(0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving
|
|
385
|
+
((0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving ||
|
|
386
|
+
(0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale ||
|
|
387
|
+
(0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale));
|
|
373
388
|
}
|
|
374
389
|
function submitResultReason(status) {
|
|
375
390
|
switch (status) {
|
|
@@ -421,34 +436,19 @@ function addressedInstanceErrorReason(error) {
|
|
|
421
436
|
}
|
|
422
437
|
return ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerException;
|
|
423
438
|
}
|
|
424
|
-
function createSpotAddressDeadline(
|
|
439
|
+
function createSpotAddressDeadline(operation, parent) {
|
|
425
440
|
const startedAtMs = performance.now();
|
|
426
441
|
const startedAtUnixMs = Date.now();
|
|
427
|
-
const deadlineMs =
|
|
442
|
+
const deadlineMs = operation.deadlineMs ?? Number.POSITIVE_INFINITY;
|
|
428
443
|
const controller = new AbortController();
|
|
429
|
-
let expired = false;
|
|
430
|
-
let timeout;
|
|
431
|
-
const expire = () => {
|
|
432
|
-
expired = true;
|
|
433
|
-
controller.abort();
|
|
434
|
-
};
|
|
435
|
-
const arm = () => {
|
|
436
|
-
if (timeout !== undefined)
|
|
437
|
-
clearTimeout(timeout);
|
|
438
|
-
const remainingMs = deadlineMs - performance.now();
|
|
439
|
-
if (remainingMs <= 0) {
|
|
440
|
-
expire();
|
|
441
|
-
return;
|
|
442
|
-
}
|
|
443
|
-
timeout = setTimeout(expire, remainingMs);
|
|
444
|
-
};
|
|
445
|
-
arm();
|
|
446
444
|
const abort = () => controller.abort(parent?.reason);
|
|
447
445
|
if (parent?.aborted === true)
|
|
448
446
|
abort();
|
|
449
447
|
else
|
|
450
448
|
parent?.addEventListener('abort', abort, { once: true });
|
|
451
449
|
return {
|
|
450
|
+
operation,
|
|
451
|
+
deadlineMs,
|
|
452
452
|
get deadlineUnixMs() {
|
|
453
453
|
return Math.round(startedAtUnixMs + (deadlineMs - startedAtMs));
|
|
454
454
|
},
|
|
@@ -456,15 +456,12 @@ function createSpotAddressDeadline(timeoutMs, parent) {
|
|
|
456
456
|
requireRemaining() {
|
|
457
457
|
const remainingMs = deadlineMs - performance.now();
|
|
458
458
|
if (remainingMs <= 0) {
|
|
459
|
-
expired = true;
|
|
460
459
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded, 'Spot address operation exceeded its end-to-end deadline.', true);
|
|
461
460
|
}
|
|
462
461
|
return Math.max(1, Math.ceil(remainingMs));
|
|
463
462
|
},
|
|
464
|
-
expired: () => expired,
|
|
465
463
|
close() {
|
|
466
|
-
|
|
467
|
-
clearTimeout(timeout);
|
|
464
|
+
controller.abort();
|
|
468
465
|
parent?.removeEventListener('abort', abort);
|
|
469
466
|
}
|
|
470
467
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkSpotRuntimeOptionsFactory = void 0;
|
|
4
|
+
const Registration_1 = require("../../contracts/Configuration/Registration");
|
|
4
5
|
const routing_id_1 = require("../routing-id");
|
|
5
6
|
const contracts_1 = require("../../contracts");
|
|
6
7
|
const actors_1 = require("../actors");
|
|
@@ -14,6 +15,7 @@ class ZLinkSpotRuntimeOptionsFactory {
|
|
|
14
15
|
create(actorTransferRuntime) {
|
|
15
16
|
const spotRouterChannelIdForMesh = this.options.meshRouters.spotRouterChannelIdByMesh();
|
|
16
17
|
return {
|
|
18
|
+
defaultRequestTimeoutMs: this.options.registration.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS,
|
|
17
19
|
nodeRid: undefined,
|
|
18
20
|
nodeRidProvider: (meshName) => this.meshNodeRoutingId(meshName),
|
|
19
21
|
nodeGenerationProvider: (meshName) => this.options.spotNodeRuntime()?.meshNode(meshName)?.status().lifecycleGeneration,
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type RoutingId, type SpotRef, type ZLinkSpotCreateResult } from '../../contracts';
|
|
2
2
|
import type { ServiceUserSpotOperationResult } from '../foundation/service-stateful-runtime';
|
|
3
3
|
import type { ServiceDirectSpotRouteFence, ServiceUserSpotCloseRecord, ServiceUserSpotCreateRecord } from '../foundation/service-stateful-wire-codec';
|
|
4
|
+
import type { ZLinkOwnerLeaseTracker } from '../locations/lease-tracker';
|
|
4
5
|
import type { ZLinkAuthoritySnapshot, ZLinkLocationOwnerToken } from '../locations/internal-location-contracts';
|
|
5
6
|
import type { ZLinkAuthorityStore, ZLinkObjectCreationStore } from '../locations/internal-store-contracts';
|
|
6
7
|
import type { ZLinkLocalSpotCreateResult } from '../spots/spot-manager-internal-contracts';
|
|
7
8
|
export interface ZLinkUserSpotCreationCoordinatorOptions {
|
|
8
|
-
readonly relocationPolicy?: (meshName: string, stableType: string) => import('../locations/internal-location-contracts').ZLinkObjectReserveRequest['actorRelocationPolicy'];
|
|
9
|
+
readonly relocationPolicy?: (meshName: string | undefined, stableType: string) => import('../locations/internal-location-contracts').ZLinkObjectReserveRequest['actorRelocationPolicy'];
|
|
9
10
|
readonly store: ZLinkObjectCreationStore & ZLinkAuthorityStore;
|
|
11
|
+
readonly leaseTracker: Pick<ZLinkOwnerLeaseTracker, 'isOwnerTokenLive'>;
|
|
10
12
|
readonly target: (request: Pick<ZLinkUserSpotCreationRequest, 'meshName' | 'stableType'>, signal?: AbortSignal, excludedNodeRids?: ReadonlySet<string>) => Promise<{
|
|
11
13
|
readonly meshName: string;
|
|
12
14
|
readonly nodeRid: RoutingId;
|
|
@@ -35,6 +35,17 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
35
35
|
let target;
|
|
36
36
|
let reserved;
|
|
37
37
|
for (;;) {
|
|
38
|
+
try {
|
|
39
|
+
const spot = await this.awaitReady(request, signal);
|
|
40
|
+
if (spot !== undefined) {
|
|
41
|
+
deadline.close();
|
|
42
|
+
return { result: { spot, state: contracts_1.ZLinkSpotCreateState.Existing }, spot };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
deadline.close();
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
38
49
|
try {
|
|
39
50
|
target = await this.options.target(request, signal, excludedNodeRids);
|
|
40
51
|
}
|
|
@@ -45,6 +56,15 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
45
56
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed, 'User Spot placement provider failed.', false, error);
|
|
46
57
|
}
|
|
47
58
|
if (target === undefined) {
|
|
59
|
+
try {
|
|
60
|
+
const current = await this.options.store.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('user_spot', String(request.spotId)), signal);
|
|
61
|
+
if (current.kind !== 'missing')
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
deadline.close();
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
48
68
|
deadline.close();
|
|
49
69
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.PlacementCapacityExhausted, 'No eligible User Spot placement target is ready.', true);
|
|
50
70
|
}
|
|
@@ -98,28 +118,11 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
98
118
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed, 'User Spot reservation Store operation failed.', false, error);
|
|
99
119
|
}
|
|
100
120
|
if (reserved.kind === 'alreadyExists' ||
|
|
101
|
-
(reserved.kind === 'conflict' &&
|
|
102
|
-
reserved.current.kind === 'snapshot' &&
|
|
103
|
-
reserved.current.allocation.objectKind === 'user_spot' &&
|
|
104
|
-
reserved.current.allocation.stableType === request.stableType)) {
|
|
105
|
-
if (request.generatedIdentity === true) {
|
|
106
|
-
deadline.close();
|
|
107
|
-
throw spotIdConflict(request.spotId);
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
const spot = await this.awaitReady(request, signal);
|
|
111
|
-
if (spot !== undefined) {
|
|
112
|
-
deadline.close();
|
|
113
|
-
return { result: { spot, state: contracts_1.ZLinkSpotCreateState.Existing }, spot };
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
catch (error) {
|
|
117
|
-
deadline.close();
|
|
118
|
-
throw error;
|
|
119
|
-
}
|
|
121
|
+
(reserved.kind === 'conflict' && reserved.current.kind === 'snapshot'))
|
|
120
122
|
continue;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
+
if (reserved.kind === 'placementCapacityExhausted')
|
|
124
|
+
continue;
|
|
125
|
+
if (!(reserved.kind === 'conflict' && reserved.current.kind === 'missing'))
|
|
123
126
|
break;
|
|
124
127
|
excludedNodeRids.add((0, routing_id_1.encodeRoutingIdStorageHex)(target.nodeRid));
|
|
125
128
|
}
|
|
@@ -426,10 +429,35 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
426
429
|
const current = await this.options.store.readAuthority(key, signal);
|
|
427
430
|
if (current.kind === 'missing')
|
|
428
431
|
return undefined;
|
|
432
|
+
if (request.generatedIdentity === true)
|
|
433
|
+
throw spotIdConflict(request.spotId);
|
|
429
434
|
if (current.allocation.objectKind !== 'user_spot' ||
|
|
430
435
|
current.allocation.stableType !== request.stableType) {
|
|
431
436
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotTypeMismatch, `User Spot '${String(request.spotId)}' has another stable type.`);
|
|
432
437
|
}
|
|
438
|
+
const ownerLive = await this.options.leaseTracker.isOwnerTokenLive({
|
|
439
|
+
ownerId: current.ownerId,
|
|
440
|
+
leaseGeneration: current.ownerLeaseGeneration
|
|
441
|
+
}, signal);
|
|
442
|
+
if (!ownerLive || current.allocation.state !== 'active') {
|
|
443
|
+
const release = this.options.store.releaseEndedReservation;
|
|
444
|
+
if (release === undefined) {
|
|
445
|
+
throw new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.NotConfigured, 'User Spot creation requires repository ended-owner release support.');
|
|
446
|
+
}
|
|
447
|
+
if (await release.call(this.options.store, key, current.storeVersion.value, signal, {
|
|
448
|
+
key: { kind: 'user_spot', globalId: String(request.spotId) },
|
|
449
|
+
intent: { stableType: request.stableType },
|
|
450
|
+
actorRelocationPolicy: this.options.relocationPolicy?.(request.meshName, request.stableType)
|
|
451
|
+
}))
|
|
452
|
+
continue;
|
|
453
|
+
const confirmed = await this.options.store.readAuthority(key, signal);
|
|
454
|
+
if (confirmed.kind === 'missing' ||
|
|
455
|
+
confirmed.storeVersion.value !== current.storeVersion.value)
|
|
456
|
+
continue;
|
|
457
|
+
if (!ownerLive) {
|
|
458
|
+
throw new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.Unavailable, 'User Spot authority owner lease is unavailable.');
|
|
459
|
+
}
|
|
460
|
+
}
|
|
433
461
|
if (current.allocation.state === 'active' &&
|
|
434
462
|
(0, service_authority_payload_codec_1.decodeServiceClosingSpotAuthority)(current.payload) === undefined) {
|
|
435
463
|
return spotRef(current, request);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const inspectRuntime: unique symbol;
|
|
@@ -32,7 +32,7 @@ export declare class ZLinkActorLocationClaims {
|
|
|
32
32
|
claim(actorType: string, actorId: string, nodeRid: RoutingId, deactivate?: () => Promise<void>): Promise<ZLinkActorClaimResult>;
|
|
33
33
|
setRef(actorType: string, actorId: string, actorRef: ActorRef, ownerNodeGeneration: bigint): Promise<void>;
|
|
34
34
|
takeoverJoinedSpot(actorType: string, actorId: string, actorRef: ActorRef, spotMeshName: string, spotId: RoutingId, spotGeneration: bigint, membershipEpoch: bigint, ownerNodeGeneration: bigint, deactivate?: () => Promise<void>): Promise<ZLinkActorClaimResult>;
|
|
35
|
-
commitMembership(actorType: string, actorRef: ActorRef, authorityOwnerGeneration: bigint, spotId: RoutingId, spotGeneration: bigint, spotKind: ZLinkSpotKind.Entry | ZLinkSpotKind.User, ownerNodeGeneration: bigint): Promise<void>;
|
|
35
|
+
commitMembership(actorType: string, actorRef: ActorRef, authorityOwnerGeneration: bigint, spotId: RoutingId, spotGeneration: bigint, spotKind: ZLinkSpotKind.Entry | ZLinkSpotKind.User, ownerNodeGeneration: bigint, signal?: AbortSignal): Promise<void>;
|
|
36
36
|
release(_actorType: string, actorId: string, actorRef?: ActorRef): Promise<void>;
|
|
37
37
|
owns(_actorType: string, actorId: string): boolean;
|
|
38
38
|
snapshot(actorId: string): ZLinkActorLocation | undefined;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkActorLocationClaims = exports.ZLinkActorClaimStatus = void 0;
|
|
4
|
+
const Errors_1 = require("../../contracts/Errors");
|
|
4
5
|
const internal_location_contracts_1 = require("./internal-location-contracts");
|
|
5
6
|
const Spots_1 = require("../../contracts/Spots");
|
|
6
7
|
const key_codec_1 = require("./key-codec");
|
|
@@ -150,7 +151,7 @@ class ZLinkActorLocationClaims {
|
|
|
150
151
|
});
|
|
151
152
|
return { status: ZLinkActorClaimStatus.Claimed, claimed, generation: result.generation };
|
|
152
153
|
}
|
|
153
|
-
async commitMembership(actorType, actorRef, authorityOwnerGeneration, spotId, spotGeneration, spotKind, ownerNodeGeneration) {
|
|
154
|
+
async commitMembership(actorType, actorRef, authorityOwnerGeneration, spotId, spotGeneration, spotKind, ownerNodeGeneration, signal) {
|
|
154
155
|
const actorId = actorRef.actorId;
|
|
155
156
|
const store = this.authorityStore;
|
|
156
157
|
const owner = this.runtime.currentOwnerToken;
|
|
@@ -158,12 +159,12 @@ class ZLinkActorLocationClaims {
|
|
|
158
159
|
throw new Error('Actor membership commit requires Location Store authority and owner.');
|
|
159
160
|
}
|
|
160
161
|
const key = (0, authority_key_codec_1.encodeAuthorityKey)('actor', actorId);
|
|
161
|
-
const current = await store.readAuthority(key);
|
|
162
|
+
const current = await store.readAuthority(key, signal);
|
|
162
163
|
if (!matchesActorAuthority(current, actorRef, owner) ||
|
|
163
164
|
current.allocation.stableType !== actorType ||
|
|
164
165
|
current.authorityOwnerGeneration !== authorityOwnerGeneration ||
|
|
165
166
|
current.allocation.descriptorLifecycleGeneration !== ownerNodeGeneration) {
|
|
166
|
-
throw new
|
|
167
|
+
throw new Errors_1.ZLinkFrameworkException(classifyMembershipAuthorityFailure(current, actorRef), `Actor '${actorId}' membership authority fence does not match.`);
|
|
167
168
|
}
|
|
168
169
|
const identity = (0, actor_authority_publication_1.decodeActorAuthorityIdentity)(current.payload, current.objectGeneration);
|
|
169
170
|
if (identity === undefined ||
|
|
@@ -173,15 +174,18 @@ class ZLinkActorLocationClaims {
|
|
|
173
174
|
identity.owner.leaseGeneration !== owner.leaseGeneration ||
|
|
174
175
|
!(0, routing_id_1.routingIdsEqual)(identity.actor.nodeRid, actorRef.nodeRid) ||
|
|
175
176
|
identity.meshName !== actorRef.meshName) {
|
|
176
|
-
throw new
|
|
177
|
+
throw new Errors_1.ZLinkFrameworkException(Errors_1.ZLinkFrameworkErrorKind.Unavailable, `Actor '${actorId}' membership authority identity does not match.`);
|
|
177
178
|
}
|
|
178
179
|
const result = await store.compareExchangeAuthority(key, current.storeVersion, {
|
|
179
180
|
kind: 'put',
|
|
180
181
|
generationTransition: 'preserve',
|
|
181
182
|
payload: (0, actor_authority_publication_1.rewriteActorAuthorityRoute)(current.payload, actorRef, String(spotId), spotGeneration, spotKind)
|
|
182
|
-
});
|
|
183
|
+
}, signal);
|
|
183
184
|
if (result.kind !== 'stored') {
|
|
184
|
-
throw new
|
|
185
|
+
throw new Errors_1.ZLinkFrameworkException(result.kind === 'conflict'
|
|
186
|
+
? (result.membershipFailure ??
|
|
187
|
+
classifyMembershipAuthorityFailure(result.current, actorRef))
|
|
188
|
+
: Errors_1.ZLinkFrameworkErrorKind.InternalFailure, `Actor '${actorId}' membership commit was rejected with status ${result.kind}.`);
|
|
185
189
|
}
|
|
186
190
|
}
|
|
187
191
|
async release(_actorType, actorId, actorRef) {
|
|
@@ -328,6 +332,11 @@ class ZLinkActorLocationClaims {
|
|
|
328
332
|
}
|
|
329
333
|
}
|
|
330
334
|
exports.ZLinkActorLocationClaims = ZLinkActorLocationClaims;
|
|
335
|
+
function classifyMembershipAuthorityFailure(current, actorRef) {
|
|
336
|
+
return current.kind === 'snapshot' && current.objectGeneration !== actorRef.objectGeneration
|
|
337
|
+
? Errors_1.ZLinkFrameworkErrorKind.InvalidOperation
|
|
338
|
+
: Errors_1.ZLinkFrameworkErrorKind.Unavailable;
|
|
339
|
+
}
|
|
331
340
|
function matchesActorAuthority(current, actorRef, ownerToken) {
|
|
332
341
|
return (current.kind === 'snapshot' &&
|
|
333
342
|
current.ownerId === ownerToken.ownerId &&
|
|
@@ -13,7 +13,6 @@ export interface ZLinkAutoConnectLoopOptions {
|
|
|
13
13
|
readonly clearTimer?: (handle: unknown) => void;
|
|
14
14
|
}
|
|
15
15
|
export declare class ZLinkAutoConnectLoop {
|
|
16
|
-
private readonly lane;
|
|
17
16
|
private readonly reconciler;
|
|
18
17
|
private readonly options;
|
|
19
18
|
private readonly meshName;
|
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkAutoConnectLoop = void 0;
|
|
4
4
|
const Options_1 = require("../../contracts/Locations/Options");
|
|
5
|
-
const state_lane_1 = require("../execution/state-lane");
|
|
6
5
|
class ZLinkAutoConnectLoop {
|
|
7
|
-
lane = new state_lane_1.ZLinkStateLane();
|
|
8
6
|
reconciler;
|
|
9
7
|
options;
|
|
10
8
|
meshName;
|
|
@@ -29,18 +27,21 @@ class ZLinkAutoConnectLoop {
|
|
|
29
27
|
this.clearTimer = options.clearTimer ?? ((handle) => clearTimeout(handle));
|
|
30
28
|
}
|
|
31
29
|
async start(signal) {
|
|
32
|
-
if (
|
|
30
|
+
if (this.controller !== undefined)
|
|
33
31
|
return;
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
// Reserve the lifecycle before yielding so stop also owns the first publication.
|
|
33
|
+
const controller = new AbortController();
|
|
34
|
+
this.controller = controller;
|
|
35
|
+
try {
|
|
36
|
+
await this.tick(signal);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (this.controller === controller) {
|
|
40
|
+
await this.prepareTransportShutdown();
|
|
41
|
+
}
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
this.scheduleNext(controller);
|
|
44
45
|
}
|
|
45
46
|
async requestPeerReconcile(meshName, _peerRid) {
|
|
46
47
|
const controller = this.controller;
|
|
@@ -74,9 +75,14 @@ class ZLinkAutoConnectLoop {
|
|
|
74
75
|
}
|
|
75
76
|
async tick(signal) {
|
|
76
77
|
const controller = this.controller;
|
|
78
|
+
const tickSignal = controller === undefined
|
|
79
|
+
? signal
|
|
80
|
+
: signal === undefined
|
|
81
|
+
? controller.signal
|
|
82
|
+
: AbortSignal.any([signal, controller.signal]);
|
|
77
83
|
await this.enqueueTick(async () => {
|
|
78
|
-
if (
|
|
79
|
-
await this.tickCore(
|
|
84
|
+
if (tickSignal?.aborted !== true)
|
|
85
|
+
await this.tickCore(tickSignal);
|
|
80
86
|
});
|
|
81
87
|
}
|
|
82
88
|
enqueueTick(operation) {
|
|
@@ -118,15 +124,15 @@ class ZLinkAutoConnectLoop {
|
|
|
118
124
|
this.lastTickFailed = this.reconciler.storeFailed;
|
|
119
125
|
return this.lastTickFailed;
|
|
120
126
|
}
|
|
121
|
-
scheduleNext() {
|
|
122
|
-
if (this.controller
|
|
127
|
+
scheduleNext(controller) {
|
|
128
|
+
if (this.controller !== controller || controller.signal.aborted) {
|
|
123
129
|
return;
|
|
124
130
|
}
|
|
125
131
|
this.timer = this.setTimer(() => {
|
|
126
132
|
this.timer = undefined;
|
|
127
|
-
void this.tick(
|
|
133
|
+
void this.tick(controller.signal)
|
|
128
134
|
.catch(() => undefined)
|
|
129
|
-
.finally(() => this.scheduleNext());
|
|
135
|
+
.finally(() => this.scheduleNext(controller));
|
|
130
136
|
}, this.options.pollingIntervalMs);
|
|
131
137
|
}
|
|
132
138
|
}
|
|
@@ -94,12 +94,9 @@ function targetOf(peer) {
|
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
96
|
function isAutoConnectSelf(local, peer) {
|
|
97
|
-
|
|
97
|
+
return (local.nodeRid !== undefined &&
|
|
98
98
|
peer.nodeRid !== undefined &&
|
|
99
|
-
(0, routing_id_1.routingIdsEqual)(local.nodeRid, peer.nodeRid))
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
return peer.endpoint === local.endpoint;
|
|
99
|
+
(0, routing_id_1.routingIdsEqual)(local.nodeRid, peer.nodeRid));
|
|
103
100
|
}
|
|
104
101
|
function shouldDialAutoConnectPeer(local, peer) {
|
|
105
102
|
switch (local.autoConnectType) {
|
|
@@ -47,6 +47,7 @@ export declare class ZLinkAutoConnectReconciler {
|
|
|
47
47
|
disconnectPeers(): void;
|
|
48
48
|
unpublishLocal(signal?: AbortSignal): Promise<void>;
|
|
49
49
|
private disconnectIfNeeded;
|
|
50
|
+
private publishLocalForTick;
|
|
50
51
|
private publishLocal;
|
|
51
52
|
private prepareUnpublishLocalCore;
|
|
52
53
|
private preparePublishLocalCore;
|