@zlink-systems/framework 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +15 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +1 -2
- package/dist/runtime/activation-admission.js +2 -6
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +13 -11
- package/dist/runtime/actors/actor-handoff.d.ts +4 -4
- package/dist/runtime/actors/actor-handoff.js +8 -8
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +83 -105
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.js +5 -9
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
- package/dist/runtime/actors/deferred-join-completion.js +1 -0
- package/dist/runtime/actors/index.d.ts +9 -7
- package/dist/runtime/actors/index.js +87 -69
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +2 -0
- package/dist/runtime/admission.js +7 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +6 -23
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
- package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -8
- package/dist/runtime/channels/channel-clients.js +68 -52
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -10
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.js +5 -2
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +248 -174
- package/dist/runtime/channels/channel-transports.d.ts +11 -17
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +130 -72
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +12 -9
- package/dist/runtime/execution/index.js +58 -14
- package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
- package/dist/runtime/execution/serial-execution-queue.js +54 -15
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
- package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
- package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
- package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
- package/dist/runtime/foundation/service-topology-registry.js +17 -32
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
- package/dist/runtime/host/actor-transfer-runtime.js +143 -176
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +14 -13
- package/dist/runtime/host/index.js +190 -157
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +7 -20
- package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
- package/dist/runtime/host/route-mesh-runtime.js +171 -252
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
- package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
- package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
- package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +4 -9
- package/dist/runtime/locations/lifecycle.js +2 -31
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +37 -28
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
- package/dist/runtime/locations/spot-location-claims.js +42 -1
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
- package/dist/runtime/spots/index.d.ts +14 -20
- package/dist/runtime/spots/index.js +302 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
- package/dist/runtime/spots/spot-activation-registry.js +14 -50
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +2 -2
- package/dist/runtime/spots/spot-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-activation.js +49 -32
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
- package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
- package/dist/runtime/spots/spot-actor-membership.js +22 -45
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +9 -20
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +5 -4
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +9 -8
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
- package/dist/runtime/spots/spot-serial-executor.js +2 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
- package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +11 -1
- package/dist/runtime/streams/index.d.ts +14 -15
- package/dist/runtime/streams/index.js +20 -21
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +14 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +2 -8
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +39 -33
- package/src/runtime/actors/actor-handoff.ts +24 -22
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +172 -174
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +9 -11
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +10 -6
- package/src/runtime/actors/index.ts +100 -79
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +8 -1
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +13 -29
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
- package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
- package/src/runtime/backend/raw-binding-port.ts +1 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -85
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -23
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +6 -2
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +301 -192
- package/src/runtime/channels/channel-transports.ts +161 -112
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +172 -91
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +60 -20
- package/src/runtime/execution/serial-execution-queue.ts +131 -18
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
- package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
- package/src/runtime/foundation/service-topology-registry.ts +23 -32
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +180 -260
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +327 -296
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +8 -41
- package/src/runtime/host/route-mesh-runtime.ts +228 -271
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
- package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +13 -43
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +75 -49
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +58 -1
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
- package/src/runtime/spots/index.ts +433 -229
- package/src/runtime/spots/spot-activation-registry.ts +30 -69
- package/src/runtime/spots/spot-activation-state.ts +2 -2
- package/src/runtime/spots/spot-activation.ts +67 -37
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
- package/src/runtime/spots/spot-actor-membership.ts +40 -72
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -30
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +21 -17
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
- package/src/runtime/spots/spot-outbound.ts +45 -23
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +5 -27
- package/src/runtime/spots/spot-serial-executor.ts +2 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +21 -1
- package/src/runtime/streams/index.ts +76 -64
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -21,21 +21,151 @@ import {
|
|
|
21
21
|
} from './runtime-observation-queue';
|
|
22
22
|
import {
|
|
23
23
|
runtimeStateIsReady,
|
|
24
|
-
topologyRuntimeIsReady
|
|
24
|
+
topologyRuntimeIsReady,
|
|
25
|
+
topologyObservationIsTerminal
|
|
25
26
|
} from '../foundation/runtime-state-projections';
|
|
27
|
+
import type {
|
|
28
|
+
ClientServerDescriptor,
|
|
29
|
+
FanoutPublisherDescriptor
|
|
30
|
+
} from '../foundation/service-discovery-registry';
|
|
26
31
|
|
|
27
32
|
export { RuntimeEventQueue } from './runtime-observation-queue';
|
|
28
33
|
|
|
29
34
|
type RuntimeAccessor = () => ZLinkChannelRuntimeManager | undefined;
|
|
30
35
|
type HostStateAccessor = () => ZLinkFrameworkRuntimeState;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
type TopologyStatus = ZLinkClientServerStatus | ZLinkFanoutStatus;
|
|
37
|
+
interface TopologySource<T extends TopologyStatus> {
|
|
38
|
+
lastSnapshot?: T;
|
|
39
|
+
readonly observers: Set<RuntimeEventQueue<T>>;
|
|
40
|
+
stop?: () => void;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
class TopologyStatusSources<T extends TopologyStatus> {
|
|
44
|
+
private readonly sources = new Map<string, TopologySource<T>>();
|
|
45
|
+
|
|
46
|
+
constructor(
|
|
47
|
+
private readonly read: (channelName: string, sequence: bigint) => T,
|
|
48
|
+
private readonly subscribe: (channelName: string, changed: () => void) => () => void,
|
|
49
|
+
private readonly equivalent: (left: T, right: T) => boolean
|
|
50
|
+
) {}
|
|
51
|
+
|
|
52
|
+
snapshot(channelName: string): T {
|
|
53
|
+
let source = this.sources.get(channelName);
|
|
54
|
+
const current = source?.lastSnapshot;
|
|
55
|
+
if (current !== undefined && topologyObservationIsTerminal(current.state)) return current;
|
|
56
|
+
const snapshot = this.read(channelName, current?.sequence ?? 0n);
|
|
57
|
+
if (source === undefined) {
|
|
58
|
+
source = { observers: new Set() };
|
|
59
|
+
this.sources.set(channelName, source);
|
|
60
|
+
}
|
|
61
|
+
const published = this.publish(channelName, source, snapshot);
|
|
62
|
+
if (source.stop === undefined && !topologyObservationIsTerminal(published.state)) {
|
|
63
|
+
source.stop = this.subscribe(channelName, () => this.snapshot(channelName));
|
|
64
|
+
}
|
|
65
|
+
return published;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
observe(
|
|
69
|
+
channelName: string,
|
|
70
|
+
capacity: number,
|
|
71
|
+
signal?: AbortSignal
|
|
72
|
+
): AsyncIterable<ZLinkObservedStatus<T>> {
|
|
73
|
+
const queue = new RuntimeEventQueue<T>(capacity, signal);
|
|
74
|
+
const snapshot = this.snapshot(channelName);
|
|
75
|
+
const current = this.sources.get(channelName)!;
|
|
76
|
+
current.observers.add(queue);
|
|
77
|
+
queue.onClose(() => {
|
|
78
|
+
current.observers.delete(queue);
|
|
79
|
+
});
|
|
80
|
+
this.deliver(queue, snapshot, channelName);
|
|
81
|
+
return queue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
hostStateChanged(): void {
|
|
85
|
+
for (const channelName of this.sources.keys()) this.snapshot(channelName);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
stopObservers(): void {
|
|
89
|
+
for (const [channelName, source] of this.sources) {
|
|
90
|
+
if (
|
|
91
|
+
source.lastSnapshot === undefined ||
|
|
92
|
+
topologyObservationIsTerminal(source.lastSnapshot.state)
|
|
93
|
+
)
|
|
94
|
+
continue;
|
|
95
|
+
this.publish(channelName, source, {
|
|
96
|
+
...source.lastSnapshot,
|
|
97
|
+
state: ZLinkTopologyState.Stopped,
|
|
98
|
+
isReady: false
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private publish(channelName: string, source: TopologySource<T>, snapshot: T): T {
|
|
104
|
+
const previous = source.lastSnapshot;
|
|
105
|
+
if (previous !== undefined && this.equivalent(previous, snapshot)) return previous;
|
|
106
|
+
source.lastSnapshot = {
|
|
107
|
+
...snapshot,
|
|
108
|
+
sequence: (previous?.sequence ?? 0n) + 1n,
|
|
109
|
+
observedAt: new Date()
|
|
110
|
+
};
|
|
111
|
+
for (const queue of source.observers) this.deliver(queue, source.lastSnapshot, channelName);
|
|
112
|
+
if (topologyObservationIsTerminal(source.lastSnapshot.state)) {
|
|
113
|
+
source.stop?.();
|
|
114
|
+
source.stop = undefined;
|
|
115
|
+
}
|
|
116
|
+
return source.lastSnapshot;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private deliver(queue: RuntimeEventQueue<T>, snapshot: T, channelName: string): void {
|
|
120
|
+
if (topologyObservationIsTerminal(snapshot.state)) queue.seal(snapshot, channelName);
|
|
121
|
+
else queue.push(snapshot, channelName);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function sameTopologyState(left: TopologyStatus, right: TopologyStatus): boolean {
|
|
126
|
+
return left.state === right.state && left.isReady === right.isReady;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function samePeer(left: ZLinkPeerStatus, right: ZLinkPeerStatus): boolean {
|
|
130
|
+
return (
|
|
131
|
+
left.nodeRid === right.nodeRid &&
|
|
132
|
+
left.state === right.state &&
|
|
133
|
+
left.unavailableReason === right.unavailableReason
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function sameClientServerStatus(
|
|
138
|
+
left: ZLinkClientServerStatus,
|
|
139
|
+
right: ZLinkClientServerStatus
|
|
140
|
+
): boolean {
|
|
141
|
+
return (
|
|
142
|
+
sameTopologyState(left, right) &&
|
|
143
|
+
left.localRole === right.localRole &&
|
|
144
|
+
left.readyTargetCount === right.readyTargetCount &&
|
|
145
|
+
left.targets.length === right.targets.length &&
|
|
146
|
+
left.targets.every(
|
|
147
|
+
(target, index) =>
|
|
148
|
+
samePeer(target, right.targets[index]!) && target.weight === right.targets[index]!.weight
|
|
149
|
+
)
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function sameFanoutStatus(left: ZLinkFanoutStatus, right: ZLinkFanoutStatus): boolean {
|
|
154
|
+
return (
|
|
155
|
+
sameTopologyState(left, right) &&
|
|
156
|
+
left.readyPublisherCount === right.readyPublisherCount &&
|
|
157
|
+
left.publishers.length === right.publishers.length &&
|
|
158
|
+
left.publishers.every((publisher, index) => samePeer(publisher, right.publishers[index]!))
|
|
159
|
+
);
|
|
34
160
|
}
|
|
35
161
|
|
|
36
162
|
export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRuntime {
|
|
37
|
-
private
|
|
38
|
-
|
|
163
|
+
private readonly sources = new TopologyStatusSources<ZLinkClientServerStatus>(
|
|
164
|
+
(channelName, sequence) => this.snapshotCore(channelName, sequence),
|
|
165
|
+
(channelName, changed) =>
|
|
166
|
+
this.requireRuntime().observeClientServerTopology(channelName, changed),
|
|
167
|
+
sameClientServerStatus
|
|
168
|
+
);
|
|
39
169
|
|
|
40
170
|
constructor(
|
|
41
171
|
private readonly runtime: RuntimeAccessor,
|
|
@@ -43,34 +173,19 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
|
|
|
43
173
|
) {}
|
|
44
174
|
|
|
45
175
|
snapshot(channelName: string): ZLinkClientServerStatus {
|
|
46
|
-
return this.
|
|
176
|
+
return this.sources.snapshot(channelName);
|
|
47
177
|
}
|
|
48
178
|
|
|
49
|
-
private snapshotCore(channelName: string): ZLinkClientServerStatus {
|
|
179
|
+
private snapshotCore(channelName: string, sequence: bigint): ZLinkClientServerStatus {
|
|
50
180
|
const topology = this.requireRuntime().clientServerTopology(channelName);
|
|
51
181
|
if (topology.localRole === undefined) {
|
|
52
182
|
throw new ZLinkConfigurationException(
|
|
53
183
|
`ClientServer channel '${channelName}' is not registered.`
|
|
54
184
|
);
|
|
55
185
|
}
|
|
56
|
-
const targets = topology.descriptors.map((descriptor)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
state:
|
|
60
|
-
descriptor.state === 'serving'
|
|
61
|
-
? ZLinkPeerState.Ready
|
|
62
|
-
: descriptor.state === 'retiring'
|
|
63
|
-
? ZLinkPeerState.Draining
|
|
64
|
-
: descriptor.state === 'preparing'
|
|
65
|
-
? ZLinkPeerState.Connecting
|
|
66
|
-
: ZLinkPeerState.NotConnected,
|
|
67
|
-
unavailableReason:
|
|
68
|
-
descriptor.state === 'serving' && descriptor.weight > 0
|
|
69
|
-
? undefined
|
|
70
|
-
: descriptor.state === 'retiring'
|
|
71
|
-
? ZLinkTopologyReason.Draining
|
|
72
|
-
: ZLinkTopologyReason.NoReadyTarget
|
|
73
|
-
}));
|
|
186
|
+
const targets = topology.descriptors.map((descriptor) =>
|
|
187
|
+
peerStatusForAvailability(descriptor, ZLinkTopologyReason.NoReadyTarget)
|
|
188
|
+
);
|
|
74
189
|
const readyTargetCount = targets.filter(
|
|
75
190
|
(target) => target.state === ZLinkPeerState.Ready && target.weight > 0
|
|
76
191
|
).length;
|
|
@@ -83,7 +198,7 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
|
|
|
83
198
|
isReady,
|
|
84
199
|
readyTargetCount,
|
|
85
200
|
targets,
|
|
86
|
-
sequence
|
|
201
|
+
sequence,
|
|
87
202
|
observedAt: new Date()
|
|
88
203
|
};
|
|
89
204
|
}
|
|
@@ -93,72 +208,19 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
|
|
|
93
208
|
capacity = ZLINK_DEFAULT_TERMINAL_OBSERVATION_CAPACITY,
|
|
94
209
|
signal?: AbortSignal
|
|
95
210
|
): AsyncIterable<ZLinkObservedStatus<ZLinkClientServerStatus>> {
|
|
96
|
-
|
|
97
|
-
const queue = new RuntimeEventQueue<ZLinkClientServerStatus>(capacity, signal);
|
|
98
|
-
let lastSnapshot = this.snapshotCore(channelName);
|
|
99
|
-
const stop = runtime.observeClientServerTopology(channelName, () => {
|
|
100
|
-
this.sequence += 1n;
|
|
101
|
-
lastSnapshot = this.snapshotCore(channelName);
|
|
102
|
-
queue.push(lastSnapshot, channelName);
|
|
103
|
-
});
|
|
104
|
-
const hostObserver: HostObserver = {
|
|
105
|
-
changed: () => {
|
|
106
|
-
this.sequence += 1n;
|
|
107
|
-
lastSnapshot = this.snapshotCore(channelName);
|
|
108
|
-
queue.push(lastSnapshot, channelName);
|
|
109
|
-
},
|
|
110
|
-
stop: () => {
|
|
111
|
-
this.sequence += 1n;
|
|
112
|
-
let current = lastSnapshot;
|
|
113
|
-
try {
|
|
114
|
-
current = this.snapshotCore(channelName);
|
|
115
|
-
lastSnapshot = current;
|
|
116
|
-
} catch {
|
|
117
|
-
// The last complete projection remains valid after native teardown.
|
|
118
|
-
}
|
|
119
|
-
queue.seal(
|
|
120
|
-
{
|
|
121
|
-
...current,
|
|
122
|
-
state: ZLinkTopologyState.Stopped,
|
|
123
|
-
isReady: false,
|
|
124
|
-
sequence: this.sequence,
|
|
125
|
-
observedAt: new Date()
|
|
126
|
-
},
|
|
127
|
-
channelName
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
this.hostObservers.add(hostObserver);
|
|
132
|
-
queue.onClose(() => {
|
|
133
|
-
stop();
|
|
134
|
-
this.hostObservers.delete(hostObserver);
|
|
135
|
-
});
|
|
136
|
-
return queue;
|
|
211
|
+
return this.sources.observe(channelName, capacity, signal);
|
|
137
212
|
}
|
|
138
213
|
|
|
139
214
|
hostStateChanged(): void {
|
|
140
|
-
|
|
141
|
-
try {
|
|
142
|
-
observer.changed();
|
|
143
|
-
} catch {
|
|
144
|
-
// Monitoring projection failures do not change host lifecycle results.
|
|
145
|
-
}
|
|
146
|
-
}
|
|
215
|
+
this.sources.hostStateChanged();
|
|
147
216
|
}
|
|
148
217
|
|
|
149
218
|
stopObservers(): void {
|
|
150
|
-
|
|
151
|
-
try {
|
|
152
|
-
observer.stop();
|
|
153
|
-
} catch {
|
|
154
|
-
// The observer is still removed when its terminal snapshot fails.
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
this.hostObservers.clear();
|
|
219
|
+
this.sources.stopObservers();
|
|
158
220
|
}
|
|
159
221
|
|
|
160
222
|
isReady(channelName: string): boolean {
|
|
161
|
-
return this.
|
|
223
|
+
return this.snapshot(channelName).isReady;
|
|
162
224
|
}
|
|
163
225
|
|
|
164
226
|
private requireRuntime(): ZLinkChannelRuntimeManager {
|
|
@@ -170,8 +232,11 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
|
|
|
170
232
|
}
|
|
171
233
|
|
|
172
234
|
export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
173
|
-
private
|
|
174
|
-
|
|
235
|
+
private readonly sources = new TopologyStatusSources<ZLinkFanoutStatus>(
|
|
236
|
+
(channelName, sequence) => this.snapshotCore(channelName, sequence),
|
|
237
|
+
(channelName, changed) => this.requireRuntime().observeFanoutTopology(channelName, changed),
|
|
238
|
+
sameFanoutStatus
|
|
239
|
+
);
|
|
175
240
|
|
|
176
241
|
constructor(
|
|
177
242
|
private readonly runtime: RuntimeAccessor,
|
|
@@ -179,29 +244,15 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
|
179
244
|
) {}
|
|
180
245
|
|
|
181
246
|
snapshot(channelName: string): ZLinkFanoutStatus {
|
|
182
|
-
return this.
|
|
247
|
+
return this.sources.snapshot(channelName);
|
|
183
248
|
}
|
|
184
249
|
|
|
185
|
-
private snapshotCore(channelName: string): ZLinkFanoutStatus {
|
|
250
|
+
private snapshotCore(channelName: string, sequence: bigint): ZLinkFanoutStatus {
|
|
186
251
|
const publishers = this.requireRuntime()
|
|
187
252
|
.fanoutTopology(channelName)
|
|
188
|
-
.descriptors.map((descriptor)
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
descriptor.state === 'serving'
|
|
192
|
-
? ZLinkPeerState.Ready
|
|
193
|
-
: descriptor.state === 'retiring'
|
|
194
|
-
? ZLinkPeerState.Draining
|
|
195
|
-
: descriptor.state === 'preparing'
|
|
196
|
-
? ZLinkPeerState.Connecting
|
|
197
|
-
: ZLinkPeerState.NotConnected,
|
|
198
|
-
unavailableReason:
|
|
199
|
-
descriptor.state === 'serving'
|
|
200
|
-
? undefined
|
|
201
|
-
: descriptor.state === 'retiring'
|
|
202
|
-
? ZLinkTopologyReason.Draining
|
|
203
|
-
: ZLinkTopologyReason.NoReadyTarget
|
|
204
|
-
}));
|
|
253
|
+
.descriptors.map((descriptor) =>
|
|
254
|
+
peerStatusForAvailability(descriptor, ZLinkTopologyReason.NoReadyPeer)
|
|
255
|
+
);
|
|
205
256
|
const readyPublisherCount = publishers.filter(
|
|
206
257
|
(publisher) => publisher.state === ZLinkPeerState.Ready
|
|
207
258
|
).length;
|
|
@@ -217,7 +268,7 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
|
217
268
|
isReady: topologyRuntimeIsReady(hostState, readyPublisherCount),
|
|
218
269
|
readyPublisherCount,
|
|
219
270
|
publishers,
|
|
220
|
-
sequence
|
|
271
|
+
sequence,
|
|
221
272
|
observedAt: new Date()
|
|
222
273
|
};
|
|
223
274
|
}
|
|
@@ -227,68 +278,15 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
|
227
278
|
capacity = ZLINK_DEFAULT_TERMINAL_OBSERVATION_CAPACITY,
|
|
228
279
|
signal?: AbortSignal
|
|
229
280
|
): AsyncIterable<ZLinkObservedStatus<ZLinkFanoutStatus>> {
|
|
230
|
-
|
|
231
|
-
const queue = new RuntimeEventQueue<ZLinkFanoutStatus>(capacity, signal);
|
|
232
|
-
let lastSnapshot = this.snapshotCore(channelName);
|
|
233
|
-
const stop = runtime.observeFanoutTopology(channelName, () => {
|
|
234
|
-
this.sequence += 1n;
|
|
235
|
-
lastSnapshot = this.snapshotCore(channelName);
|
|
236
|
-
queue.push(lastSnapshot, channelName);
|
|
237
|
-
});
|
|
238
|
-
const hostObserver: HostObserver = {
|
|
239
|
-
changed: () => {
|
|
240
|
-
this.sequence += 1n;
|
|
241
|
-
lastSnapshot = this.snapshotCore(channelName);
|
|
242
|
-
queue.push(lastSnapshot, channelName);
|
|
243
|
-
},
|
|
244
|
-
stop: () => {
|
|
245
|
-
this.sequence += 1n;
|
|
246
|
-
let current = lastSnapshot;
|
|
247
|
-
try {
|
|
248
|
-
current = this.snapshotCore(channelName);
|
|
249
|
-
lastSnapshot = current;
|
|
250
|
-
} catch {
|
|
251
|
-
// The last complete projection remains valid after native teardown.
|
|
252
|
-
}
|
|
253
|
-
queue.seal(
|
|
254
|
-
{
|
|
255
|
-
...current,
|
|
256
|
-
state: ZLinkTopologyState.Stopped,
|
|
257
|
-
isReady: false,
|
|
258
|
-
sequence: this.sequence,
|
|
259
|
-
observedAt: new Date()
|
|
260
|
-
},
|
|
261
|
-
channelName
|
|
262
|
-
);
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
this.hostObservers.add(hostObserver);
|
|
266
|
-
queue.onClose(() => {
|
|
267
|
-
stop();
|
|
268
|
-
this.hostObservers.delete(hostObserver);
|
|
269
|
-
});
|
|
270
|
-
return queue;
|
|
281
|
+
return this.sources.observe(channelName, capacity, signal);
|
|
271
282
|
}
|
|
272
283
|
|
|
273
284
|
hostStateChanged(): void {
|
|
274
|
-
|
|
275
|
-
try {
|
|
276
|
-
observer.changed();
|
|
277
|
-
} catch {
|
|
278
|
-
// Monitoring projection failures do not change host lifecycle results.
|
|
279
|
-
}
|
|
280
|
-
}
|
|
285
|
+
this.sources.hostStateChanged();
|
|
281
286
|
}
|
|
282
287
|
|
|
283
288
|
stopObservers(): void {
|
|
284
|
-
|
|
285
|
-
try {
|
|
286
|
-
observer.stop();
|
|
287
|
-
} catch {
|
|
288
|
-
// The observer is still removed when its terminal snapshot fails.
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
this.hostObservers.clear();
|
|
289
|
+
this.sources.stopObservers();
|
|
292
290
|
}
|
|
293
291
|
|
|
294
292
|
private requireRuntime(): ZLinkChannelRuntimeManager {
|
|
@@ -299,6 +297,40 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
|
299
297
|
}
|
|
300
298
|
}
|
|
301
299
|
|
|
300
|
+
function peerStatusForAvailability(
|
|
301
|
+
descriptor: Pick<ClientServerDescriptor, 'serverRoutingId' | 'weight' | 'state'>,
|
|
302
|
+
unavailableReason: ZLinkTopologyReason.NoReadyTarget
|
|
303
|
+
): ZLinkClientServerTargetStatus;
|
|
304
|
+
function peerStatusForAvailability(
|
|
305
|
+
descriptor: Pick<FanoutPublisherDescriptor, 'publisherRoutingId' | 'state'>,
|
|
306
|
+
unavailableReason: ZLinkTopologyReason.NoReadyPeer
|
|
307
|
+
): ZLinkPeerStatus;
|
|
308
|
+
function peerStatusForAvailability(
|
|
309
|
+
descriptor:
|
|
310
|
+
| Pick<ClientServerDescriptor, 'serverRoutingId' | 'weight' | 'state'>
|
|
311
|
+
| Pick<FanoutPublisherDescriptor, 'publisherRoutingId' | 'state'>,
|
|
312
|
+
noReadyReason: ZLinkTopologyReason.NoReadyTarget | ZLinkTopologyReason.NoReadyPeer
|
|
313
|
+
): ZLinkClientServerTargetStatus | ZLinkPeerStatus {
|
|
314
|
+
let state = ZLinkPeerState.NotConnected;
|
|
315
|
+
let unavailableReason: ZLinkTopologyReason | undefined = noReadyReason;
|
|
316
|
+
switch (descriptor.state) {
|
|
317
|
+
case 'retiring':
|
|
318
|
+
state = ZLinkPeerState.Draining;
|
|
319
|
+
unavailableReason = ZLinkTopologyReason.Draining;
|
|
320
|
+
break;
|
|
321
|
+
case 'serving':
|
|
322
|
+
state = ZLinkPeerState.Ready;
|
|
323
|
+
unavailableReason = undefined;
|
|
324
|
+
break;
|
|
325
|
+
case 'preparing':
|
|
326
|
+
state = ZLinkPeerState.Connecting;
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
return 'serverRoutingId' in descriptor
|
|
330
|
+
? { nodeRid: descriptor.serverRoutingId, weight: descriptor.weight, state, unavailableReason }
|
|
331
|
+
: { nodeRid: descriptor.publisherRoutingId, state, unavailableReason };
|
|
332
|
+
}
|
|
333
|
+
|
|
302
334
|
function topologyStateForHost(state: ZLinkFrameworkRuntimeState): ZLinkTopologyState {
|
|
303
335
|
switch (state) {
|
|
304
336
|
case ZLinkFrameworkRuntimeState.Preparing:
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class RuntimeDisposal {
|
|
2
|
+
private task?: Promise<void> | null;
|
|
3
|
+
|
|
4
|
+
get started(): boolean {
|
|
5
|
+
return this.task !== undefined;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
run(close: () => Promise<void>): Promise<void> {
|
|
9
|
+
if (this.task != null) return this.task;
|
|
10
|
+
const task = Promise.resolve()
|
|
11
|
+
.then(close)
|
|
12
|
+
.catch((error: unknown) => {
|
|
13
|
+
this.task = null;
|
|
14
|
+
throw error;
|
|
15
|
+
});
|
|
16
|
+
this.task = task;
|
|
17
|
+
return task;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -241,12 +241,7 @@ export function isCurrentZLinkSpotSerialTurn(executor: ZLinkSpotSerialTurnExecut
|
|
|
241
241
|
|
|
242
242
|
export interface ZLinkExecutionBarrierSeal {
|
|
243
243
|
readonly generation: bigint;
|
|
244
|
-
|
|
245
|
-
* A Spot Close seal waits for yielded turns accepted before it and lets them
|
|
246
|
-
* resume (Spot address messaging §7 step 2); a relocation seal does not, and
|
|
247
|
-
* their continuation fails (execution gate §4).
|
|
248
|
-
*/
|
|
249
|
-
readonly drainsYieldedTurns: boolean;
|
|
244
|
+
readonly kind: 'close' | 'relocation';
|
|
250
245
|
}
|
|
251
246
|
|
|
252
247
|
export interface ZLinkExecutionBarrierClaim {
|
|
@@ -270,32 +265,46 @@ export class ZLinkExecutionBarrier {
|
|
|
270
265
|
private generation = 0n;
|
|
271
266
|
private activeClaims = 0;
|
|
272
267
|
private suspendedClaims = 0;
|
|
268
|
+
/** Claims whose turn has started and yielded at least once, until released. */
|
|
269
|
+
private yieldedTurnClaims = 0;
|
|
273
270
|
private currentSeal: ZLinkExecutionBarrierSeal | undefined;
|
|
274
271
|
private readonly admissionWaiters: ZLinkExecutionBarrierWaiter[] = [];
|
|
275
272
|
private readonly quiescenceWaiters = new Set<() => void>();
|
|
276
|
-
private
|
|
273
|
+
private committedSeal?: ZLinkExecutionBarrierSeal;
|
|
277
274
|
|
|
278
275
|
get isSealed(): boolean {
|
|
279
|
-
return this.currentSeal !== undefined || this.
|
|
276
|
+
return this.currentSeal !== undefined || this.committedSeal !== undefined;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
get isCloseSealed(): boolean {
|
|
280
|
+
return (this.currentSeal ?? this.committedSeal)?.kind === 'close';
|
|
280
281
|
}
|
|
281
282
|
|
|
282
|
-
|
|
283
|
-
if (this.
|
|
283
|
+
enter(): ZLinkExecutionBarrierClaim | Promise<ZLinkExecutionBarrierClaim> {
|
|
284
|
+
if (this.committedSeal !== undefined) {
|
|
284
285
|
throw createInternalFrameworkException(
|
|
285
|
-
|
|
286
|
+
this.committedSeal.kind === 'close'
|
|
287
|
+
? ZLinkFrameworkInternalErrorKind.RequestRejected
|
|
288
|
+
: ZLinkFrameworkInternalErrorKind.SpotMoving,
|
|
286
289
|
'ZLink execution barrier is committed.'
|
|
287
290
|
);
|
|
288
291
|
}
|
|
289
292
|
if (this.currentSeal !== undefined) {
|
|
290
|
-
|
|
293
|
+
if (this.currentSeal.kind === 'close') {
|
|
294
|
+
throw createInternalFrameworkException(
|
|
295
|
+
ZLinkFrameworkInternalErrorKind.RequestRejected,
|
|
296
|
+
'ZLink execution barrier is sealed for Close.'
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
return new Promise<ZLinkExecutionBarrierClaim>((resolve, reject) => {
|
|
291
300
|
this.admissionWaiters.push({ resolve, reject });
|
|
292
301
|
});
|
|
293
302
|
}
|
|
294
303
|
return this.createClaim();
|
|
295
304
|
}
|
|
296
305
|
|
|
297
|
-
seal(
|
|
298
|
-
if (this.
|
|
306
|
+
seal(kind: ZLinkExecutionBarrierSeal['kind'] = 'relocation'): ZLinkExecutionBarrierSeal {
|
|
307
|
+
if (this.committedSeal !== undefined) {
|
|
299
308
|
throw createInternalFrameworkException(
|
|
300
309
|
ZLinkFrameworkInternalErrorKind.SpotMoving,
|
|
301
310
|
'ZLink execution barrier is committed.'
|
|
@@ -304,7 +313,7 @@ export class ZLinkExecutionBarrier {
|
|
|
304
313
|
if (this.currentSeal !== undefined) {
|
|
305
314
|
throw new Error('ZLink execution barrier is already sealed.');
|
|
306
315
|
}
|
|
307
|
-
const seal = Object.freeze({ generation: ++this.generation,
|
|
316
|
+
const seal = Object.freeze({ generation: ++this.generation, kind });
|
|
308
317
|
this.currentSeal = seal;
|
|
309
318
|
return seal;
|
|
310
319
|
}
|
|
@@ -330,6 +339,29 @@ export class ZLinkExecutionBarrier {
|
|
|
330
339
|
this.requireCurrent(seal);
|
|
331
340
|
}
|
|
332
341
|
|
|
342
|
+
/**
|
|
343
|
+
* Spot messaging §7 step 1: a Close that keeps admission open still lets every
|
|
344
|
+
* already-started (yielded) turn finish in its generation before cleanup.
|
|
345
|
+
*/
|
|
346
|
+
async waitForStartedTurns(signal?: AbortSignal): Promise<void> {
|
|
347
|
+
if (this.yieldedTurnClaims === 0) return;
|
|
348
|
+
if (signal?.aborted === true) throw signal.reason;
|
|
349
|
+
await new Promise<void>((resolve, reject) => {
|
|
350
|
+
const complete = () => {
|
|
351
|
+
if (this.yieldedTurnClaims !== 0) return;
|
|
352
|
+
this.quiescenceWaiters.delete(complete);
|
|
353
|
+
signal?.removeEventListener('abort', abort);
|
|
354
|
+
resolve();
|
|
355
|
+
};
|
|
356
|
+
const abort = () => {
|
|
357
|
+
this.quiescenceWaiters.delete(complete);
|
|
358
|
+
reject(signal?.reason);
|
|
359
|
+
};
|
|
360
|
+
this.quiescenceWaiters.add(complete);
|
|
361
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
|
|
333
365
|
abort(seal: ZLinkExecutionBarrierSeal): boolean {
|
|
334
366
|
if (!this.isCurrent(seal)) return false;
|
|
335
367
|
this.currentSeal = undefined;
|
|
@@ -341,9 +373,11 @@ export class ZLinkExecutionBarrier {
|
|
|
341
373
|
commit(seal: ZLinkExecutionBarrierSeal): boolean {
|
|
342
374
|
if (!this.isCurrent(seal)) return false;
|
|
343
375
|
this.currentSeal = undefined;
|
|
344
|
-
this.
|
|
376
|
+
this.committedSeal = seal;
|
|
345
377
|
const error = createInternalFrameworkException(
|
|
346
|
-
|
|
378
|
+
seal.kind === 'close'
|
|
379
|
+
? ZLinkFrameworkInternalErrorKind.RequestRejected
|
|
380
|
+
: ZLinkFrameworkInternalErrorKind.SpotMoving,
|
|
347
381
|
'ZLink execution barrier is committed.'
|
|
348
382
|
);
|
|
349
383
|
for (const waiter of this.admissionWaiters) waiter.reject(error);
|
|
@@ -356,7 +390,7 @@ export class ZLinkExecutionBarrier {
|
|
|
356
390
|
}
|
|
357
391
|
|
|
358
392
|
private isQuiescent(seal: ZLinkExecutionBarrierSeal): boolean {
|
|
359
|
-
return this.activeClaims === 0 && (
|
|
393
|
+
return this.activeClaims === 0 && (seal.kind !== 'close' || this.suspendedClaims === 0);
|
|
360
394
|
}
|
|
361
395
|
|
|
362
396
|
private notifyQuiescence(): void {
|
|
@@ -366,10 +400,12 @@ export class ZLinkExecutionBarrier {
|
|
|
366
400
|
private createClaim(): ZLinkExecutionBarrierClaim {
|
|
367
401
|
this.activeClaims++;
|
|
368
402
|
let state: 'active' | 'suspended' | 'released' = 'active';
|
|
403
|
+
let yielded = false;
|
|
369
404
|
const release = () => {
|
|
370
405
|
if (state === 'released') return;
|
|
371
406
|
if (state === 'active') this.activeClaims--;
|
|
372
407
|
else this.suspendedClaims--;
|
|
408
|
+
if (yielded) this.yieldedTurnClaims--;
|
|
373
409
|
state = 'released';
|
|
374
410
|
this.notifyQuiescence();
|
|
375
411
|
};
|
|
@@ -378,6 +414,10 @@ export class ZLinkExecutionBarrier {
|
|
|
378
414
|
suspend: () => {
|
|
379
415
|
if (state !== 'active') return;
|
|
380
416
|
state = 'suspended';
|
|
417
|
+
if (!yielded) {
|
|
418
|
+
yielded = true;
|
|
419
|
+
this.yieldedTurnClaims++;
|
|
420
|
+
}
|
|
381
421
|
this.activeClaims--;
|
|
382
422
|
this.suspendedClaims++;
|
|
383
423
|
this.notifyQuiescence();
|
|
@@ -385,8 +425,8 @@ export class ZLinkExecutionBarrier {
|
|
|
385
425
|
resume: () => {
|
|
386
426
|
if (state !== 'suspended') return state === 'active';
|
|
387
427
|
if (
|
|
388
|
-
this.
|
|
389
|
-
(this.currentSeal !== undefined &&
|
|
428
|
+
this.committedSeal !== undefined ||
|
|
429
|
+
(this.currentSeal !== undefined && this.currentSeal.kind !== 'close')
|
|
390
430
|
) {
|
|
391
431
|
release();
|
|
392
432
|
return false;
|